From 777a52afda0e2446ec4a07e15b13ba2e4901c13d Mon Sep 17 00:00:00 2001 From: alaskowski <alaskowski@ethz.ch> Date: Thu, 19 Jan 2023 10:26:12 +0100 Subject: [PATCH] SSDM-13329 Removed rtd_phosphonetx project --- .../datastore_server/etc/service.properties | 169 +- .../datastore_server2/etc/service.properties | 173 +- openbis_all/build/build.xml | 7 - openbis_all/source/bash/build/branch.sh | 1 - rtd_phosphonetx/.gitignore | 11 - rtd_phosphonetx/.pydevproject | 7 - rtd_phosphonetx/.shredder | Bin 12 -> 0 bytes rtd_phosphonetx/build.gradle | 58 - rtd_phosphonetx/etc/log.xml | 19 - rtd_phosphonetx/etc/passwd | 4 - rtd_phosphonetx/etc/passwd.sv | 0 rtd_phosphonetx/etc/passwd.tmp | 0 rtd_phosphonetx/etc/service.properties | 115 - rtd_phosphonetx/etc/web-client.properties | 12 - .../gradle/wrapper/gradle-wrapper.jar | Bin 54783 -> 0 bytes .../gradle/wrapper/gradle-wrapper.properties | 5 - rtd_phosphonetx/gradlew | 172 - rtd_phosphonetx/gradlew.bat | 84 - rtd_phosphonetx/gwtdev.gradle | 95 - .../resource/dependency-structure.ddf | 50 - .../Gradle Proteomics compile GWT.launch | 6 - ...Gradle Proteomics openBIS GWT Shell.launch | 37 - .../Gradle Proteomics prepare GWT.launch | 6 - .../Proteomics openBIS GWT Shell.launch | 22 - .../phosphonetx Data Store Server.launch | 13 - .../resource/server/spring-servlet.xml | 38 - rtd_phosphonetx/resource/server/web.xml | 30 - rtd_phosphonetx/settings.gradle | 1 - .../core-plugins/core-plugins.properties | 16 - .../plugin.properties | 3 - .../demo-proteomics-aggregation/script.py | 122 - .../1/as/initialize-master-data.py | 81 - .../proteomics-optional/package-to-dist | 0 .../dss-data-sources/DSS1/plugin.properties | 17 - .../proteomics/1/as/initialize-master-data.py | 42 - .../proteomics-application/plugin.properties | 1 - .../proteomics-db/plugin.properties | 25 - .../drop-boxes/ms-injection/plugin.properties | 18 - .../drop-boxes/ms-search/plugin.properties | 29 - .../proteomics-db-clean-up/plugin.properties | 8 - .../core-plugins/proteomics/package-to-dist | 0 .../source/html/demoapp/body-style.css | 14 - .../source/html/demoapp/button.css | 52 - rtd_phosphonetx/source/html/demoapp/d3.js | 4013 --- .../source/html/demoapp/d3.layout.js | 1865 -- .../source/html/demoapp/d3.time.js | 692 - .../html/demoapp/images/openBIS_Logo.png | Bin 7229 -> 0 bytes .../html/demoapp/images/openBIS_Logo.svg | 68 - .../source/html/demoapp/openbis-demo-app.html | 94 - .../source/html/demoapp/proteomics-demo.js | 225 - rtd_phosphonetx/source/html/demoapp/tree.css | 36 - .../proteomics/server/plugins/APMSReport.java | 559 - .../server/plugins/DataSetCopier.java | 60 - .../server/plugins/LocalAndRemoteCopier.java | 191 - ...stractDataSetInfoExtractorWithService.java | 35 - .../etlserver/proteomics/AbstractHandler.java | 33 - .../proteomics/AbstractSampleHandler.java | 146 - .../proteomics/AbundanceHandler.java | 91 - .../etlserver/proteomics/Constants.java | 27 - .../DataSetInfoExtractorForMSInjection.java | 237 - ...DataSetInfoExtractorForProteinResults.java | 241 - .../proteomics/DatabaseVersionHolder.java | 33 - .../etlserver/proteomics/IProtDAO.java | 105 - .../proteomics/ModificationFraction.java | 86 - .../ModificationFractionHandler.java | 71 - .../etlserver/proteomics/ProtXMLLoader.java | 93 - .../etlserver/proteomics/ProtXMLUploader.java | 189 - .../proteomics/ProteinDescription.java | 132 - ...ProteinResultDataSetParentLinkingTask.java | 181 - .../proteomics/ResultDataSetUploader.java | 477 - ...ageProcessorWithResultDataSetUploader.java | 41 - .../TypeExtractorForMSInjection.java | 80 - .../openbis/etlserver/proteomics/Util.java | 128 - .../proteomics/dto/ASAPRatioPValue.java | 117 - .../proteomics/dto/AbstractDTOWithID.java | 39 - .../dto/AbstractDTOWithIDAndPermID.java | 39 - .../proteomics/dto/AminoAcidMass.java | 78 - .../proteomics/dto/AnnotatedProtein.java | 63 - .../etlserver/proteomics/dto/DataSet.java | 64 - .../etlserver/proteomics/dto/Database.java | 39 - .../etlserver/proteomics/dto/Experiment.java | 25 - .../proteomics/dto/ModificationType.java | 95 - .../etlserver/proteomics/dto/Parameter.java | 67 - .../proteomics/dto/ParentDataSetCodes.java | 49 - .../etlserver/proteomics/dto/Peptide.java | 132 - .../proteomics/dto/PeptideModification.java | 109 - .../proteomics/dto/ProgramDetails.java | 83 - .../etlserver/proteomics/dto/Protein.java | 232 - .../proteomics/dto/ProteinAnnotation.java | 145 - .../proteomics/dto/ProteinGroup.java | 105 - .../proteomics/dto/ProteinProphetDetails.java | 66 - .../proteomics/dto/ProteinReference.java | 51 - .../proteomics/dto/ProteinSummary.java | 74 - .../dto/ProteinSummaryDataFilter.java | 68 - .../proteomics/dto/ProteinSummaryHeader.java | 267 - .../etlserver/proteomics/dto/Sample.java | 38 - .../etlserver/proteomics/dto/Sequence.java | 124 - .../etlserver/proteomics/protXML_v3.xsd | 816 - .../etlserver/proteomics/protXML_v4.xsd | 820 - .../etlserver/proteomics/protXML_v5.xsd | 934 - .../proteomics/BuildAndEnvironmentInfo.java | 45 - .../openbis/plugin/proteomics/OpenBIS.gwt.xml | 14 - .../plugin/proteomics/OpenBISFirefox.gwt.xml | 13 - .../plugin/proteomics/OpenBISSafari.gwt.xml | 13 - .../client/api/v1/FacadeFactory.java | 103 - .../api/v1/IProteomicsDataApiFacade.java | 117 - .../api/v1/ProteomicsDataApiFacade.java | 168 - .../client/api/v1/ProteomicsDataApiTest.java | 130 - .../proteomics/client/api/v1/package.html | 5 - .../client/web/client/Constants.java | 29 - .../web/client/IPhosphoNetXClientService.java | 119 - .../IPhosphoNetXClientServiceAsync.java | 137 - .../AccessionNumberURLCreator.java | 62 - .../application/ClientPluginFactory.java | 244 - .../application/DataSetProteinGrid.java | 118 - .../client/web/client/application/Dict.java | 114 - .../application/DisplayTypeIDGenerator.java | 50 - .../client/application/ExperimentViewer.java | 188 - .../client/application/PhosphoNetXClient.java | 56 - .../PhosphoNetXDisplayTypeIDGenerator.java | 59 - .../client/application/PhosphoNetXModule.java | 141 - .../ProteinByExperimentBrowerToolBar.java | 391 - .../ProteinByExperimentBrowserGrid.java | 240 - .../application/ProteinRelatedSampleGrid.java | 133 - .../client/application/ProteinRenderers.java | 265 - .../application/ProteinSamplesSection.java | 81 - .../application/ProteinSequenceGrid.java | 109 - .../application/ProteinSummaryGrid.java | 112 - .../ProteinViewLocatorResolver.java | 100 - .../web/client/application/ProteinViewer.java | 454 - .../application/RawDataProcessingMenu.java | 175 - .../client/application/RawDataSampleGrid.java | 157 - .../web/client/application/ViewContext.java | 60 - .../web/client/application/columns/.gitignore | 0 .../web/client/application/model/.gitignore | 0 .../wizard/BiologicalSampleChoosingPage.java | 97 - .../wizard/BiologicalSampleCreatingPage.java | 183 - .../wizard/BiologicalSampleGrid.java | 87 - .../MsInjectionAnnotationWizardState.java | 29 - .../MsInjectionSampleAnnotationModel.java | 120 - .../MsInjectionSampleAnnotationWizard.java | 41 - .../wizard/MsInjectionSampleChoosingPage.java | 98 - .../ParentlessMsInjectionSampleGrid.java | 90 - .../application/wizard/QuestionPage.java | 67 - .../dto/BiologicalSampleGridColumnIDs.java | 31 - .../dto/DataSetProteinGridColumnIDs.java | 33 - ...oteinByExperimentAndReferenceCriteria.java | 56 - .../dto/ListProteinByExperimentCriteria.java | 94 - .../dto/ListProteinSequenceCriteria.java | 59 - ...istProteinSummaryByExperimentCriteria.java | 45 - .../ListSampleAbundanceByProteinCriteria.java | 55 - ...entlessMsInjectionSampleGridColumnIDs.java | 31 - .../client/dto/ProteinBrowserColumnIDs.java | 29 - .../ProteinRelatedSampleGridColumnIDs.java | 37 - .../dto/ProteinSequenceGridColumnIDs.java | 33 - .../dto/ProteinSummaryGridColumnIDs.java | 35 - .../proteomics/client/web/public/index.html | 61 - .../web/public/proteomics-dictionary.js | 101 - .../web/server/PhosphoNetXClientService.java | 405 - .../PhosphoNetXClientServiceServlet.java | 55 - .../web/server/RawDataSampleProvider.java | 79 - .../resultset/BiologicalSampleProvider.java | 78 - .../resultset/DataSetProteinProvider.java | 82 - .../ParentlessMsInjectionSampleProvider.java | 83 - .../web/server/resultset/ProteinProvider.java | 160 - .../ProteinRelatedSampleProvider.java | 112 - .../resultset/ProteinSequenceProvider.java | 77 - .../resultset/ProteinSummaryProvider.java | 77 - .../proteomics/server/PhosphoNetXServer.java | 262 - .../server/PhosphoNetXServerLogger.java | 124 - .../server/ProteomicsDataServiceInternal.java | 368 - .../ProteomicsDataServiceInternalLogger.java | 100 - .../proteomics/server/api/v1/Constants.java | 29 - .../server/api/v1/ProteomicsDataService.java | 413 - .../api/v1/ProteomicsDataServiceLogger.java | 142 - .../api/v1/ProteomicsDataServiceServer.java | 60 - .../validator/ParentSampleValidator.java | 60 - .../validator/RawDataSampleValidator.java | 27 - .../business/AbstractBusinessObject.java | 58 - .../AbundanceColumnDefinitionTable.java | 142 - .../server/business/AbundanceManager.java | 84 - .../business/AccessionNumberBuilder.java | 80 - .../business/BusinessObjectFactory.java | 120 - .../server/business/DataSetProteinTable.java | 76 - .../server/business/ErrorModel.java | 85 - .../server/business/ExperimentLoader.java | 84 - .../IAbundanceColumnDefinitionTable.java | 34 - .../business/IBusinessObjectFactory.java | 51 - .../server/business/IDataSetProteinTable.java | 34 - .../server/business/IProteinDetailsBO.java | 32 - .../server/business/IProteinInfoTable.java | 43 - .../business/IProteinRelatedSampleTable.java | 35 - .../business/IProteinSequenceTable.java | 35 - .../server/business/IProteinSummaryTable.java | 34 - .../server/business/ISampleIDProvider.java | 38 - .../server/business/ISampleLoader.java | 31 - .../server/business/ISampleProvider.java | 42 - .../server/business/ISampleTable.java | 35 - .../server/business/ProteinDetailsBO.java | 177 - .../server/business/ProteinInfoTable.java | 217 - .../business/ProteinRelatedSampleTable.java | 219 - .../server/business/ProteinSequenceTable.java | 111 - .../server/business/ProteinSummaryTable.java | 150 - .../server/business/SampleIDProvider.java | 69 - .../server/business/SampleLoader.java | 131 - .../server/business/SampleProvider.java | 93 - .../server/business/SampleTable.java | 117 - .../server/business/TreatmentFinder.java | 147 - .../dataaccess/IPhosphoNetXDAOFactory.java | 31 - .../server/dataaccess/IProteinQueryDAO.java | 139 - .../dataaccess/db/PhosphoNetXDAOFactory.java | 130 - .../migration/MigrationStepFrom002To003.java | 145 - .../plugin/proteomics/shared/CacheData.java | 36 - .../proteomics/shared/IPhosphoNetXServer.java | 76 - .../IProteomicsDataServiceInternal.java | 65 - .../shared/ProbabilityToFDRCalculator.java | 83 - .../proteomics/shared/ResourceNames.java | 38 - .../shared/api/v1/IProteomicsDataService.java | 133 - .../proteomics/shared/api/v1/dto/DataSet.java | 114 - .../DataStoreServerProcessingPluginInfo.java | 73 - .../shared/api/v1/dto/Experiment.java | 104 - .../api/v1/dto/MsInjectionDataInfo.java | 172 - .../shared/api/v1/dto/PropertyKey.java | 90 - .../proteomics/shared/api/v1/dto/package.html | 5 - .../shared/basic/CommonConstants.java | 35 - .../basic/dto/AbundanceColumnDefinition.java | 111 - .../basic/dto/AccessionNumberProvider.java | 54 - .../shared/basic/dto/AggregateFunction.java | 114 - .../shared/basic/dto/AminoAcid.java | 67 - .../shared/basic/dto/DataSetProtein.java | 103 - .../shared/basic/dto/IBasicProteinInfo.java | 35 - .../dto/IndistinguishableProteinInfo.java | 63 - .../shared/basic/dto/Occurrence.java | 65 - .../shared/basic/dto/OccurrenceUtil.java | 91 - .../proteomics/shared/basic/dto/Peptide.java | 53 - .../shared/basic/dto/PeptideModification.java | 56 - .../shared/basic/dto/ProteinByExperiment.java | 67 - .../shared/basic/dto/ProteinDetails.java | 164 - .../shared/basic/dto/ProteinInfo.java | 119 - .../basic/dto/ProteinRelatedSample.java | 181 - .../shared/basic/dto/ProteinSequence.java | 91 - .../shared/basic/dto/ProteinSummary.java | 90 - .../basic/dto/RawDataSampleGridIDs.java | 32 - .../dto/SampleWithPropertiesAndAbundance.java | 138 - .../shared/basic/dto/Treatment.java | 117 - .../shared/dto/AbstractDTOWithID.java | 43 - .../proteomics/shared/dto/AbstractSample.java | 43 - .../shared/dto/IdentifiedProtein.java | 157 - .../shared/dto/IndistinguishableProtein.java | 54 - .../shared/dto/MsInjectionSample.java | 91 - .../shared/dto/PeptideWithModification.java | 67 - .../shared/dto/ProbabilityFDRMapping.java | 51 - .../shared/dto/ProteinAbundance.java | 55 - .../shared/dto/ProteinReference.java | 56 - .../dto/ProteinReferenceWithProbability.java | 95 - ...einReferenceWithProbabilityAndPeptide.java | 41 - .../dto/ProteinReferenceWithProtein.java | 82 - .../shared/dto/ProteinWithAbundances.java | 69 - .../shared/dto/SampleAbundance.java | 41 - .../shared/dto/SamplePeptideModification.java | 80 - .../proteomics/shared/dto/Sequence.java | 67 - .../java/proteomics-applicationContext.xml | 13 - .../proteomics-plugin-applicationContext.xml | 64 - .../source/java/service.properties | 67 - .../proteomics/postgresql/001/schema-001.dez | 26083 --------------- .../proteomics/postgresql/001/schema-001.png | Bin 199097 -> 0 bytes .../proteomics/postgresql/001/schema-001.sql | 284 - .../proteomics/postgresql/002/schema-002.png | Bin 199097 -> 0 bytes .../proteomics/postgresql/002/schema-002.sql | 292 - .../proteomics/postgresql/003/grant-003.sql | 18 - .../proteomics/postgresql/003/schema-003.png | Bin 65092 -> 0 bytes .../proteomics/postgresql/003/schema-003.sql | 293 - .../proteomics/postgresql/004/grant-004.sql | 18 - .../proteomics/postgresql/004/schema-004.png | Bin 66176 -> 0 bytes .../proteomics/postgresql/004/schema-004.sql | 296 - .../proteomics/postgresql/005/grant-005.sql | 18 - .../proteomics/postgresql/005/schema-005.png | Bin 66176 -> 0 bytes .../proteomics/postgresql/005/schema-005.sql | 310 - .../migration/migration-001-002.sql | 41 - .../migration/migration-002-003.sql | 4 - .../migration/migration-003-004.sql | 5 - .../migration/migration-004-005.sql | 14 - .../sql/proteomics/postgresql/schema.dez | 26376 ---------------- .../core-plugins/core-plugins.properties | 0 .../server/plugins/APMSReportTest.java | 297 - .../plugins/LocalAndRemoteCopierTest.java | 392 - .../proteomics/AbundanceHandlerTest.java | 405 - ...ataSetInfoExtractorForMSInjectionTest.java | 722 - ...SetInfoExtractorForProteinResultsTest.java | 479 - .../proteomics/ProtXMLLoaderTest.java | 113 - .../etlserver/proteomics/ProtXMLTestCase.java | 97 - .../proteomics/ProtXMLUploaderTest.java | 155 - .../proteomics/ProteinDescriptionTest.java | 182 - ...einResultDataSetParentLinkingTaskTest.java | 178 - .../proteomics/ResultDataSetUploaderTest.java | 705 - .../TypeExtractorForMSInjectionTest.java | 84 - .../etlserver/proteomics/UtilTest.java | 84 - .../proteomics/DependencyCheckingTest.java | 27 - .../api/v1/ProteomicsDataApiFacadeTest.java | 223 - .../application/ProteinRenderersTest.java | 83 - .../client/web/client/dto/.gitignore | 0 .../server/PhosphoNetXClientServiceTest.java | 302 - .../web/server/RawDataSampleProviderTest.java | 231 - .../ProteinSequenceProviderTest.java | 65 - .../resultset/ProteinSummaryProviderTest.java | 70 - .../server/PhosphoNetXServerTest.java | 188 - .../ProteomicsDataServiceInternalTest.java | 449 - .../server/ServerInterfaceRegressionTest.java | 43 - .../api/v1/ProteomicsDataServiceTest.java | 426 - .../api/v1/ServerInterfaceRegressionTest.java | 35 - .../validator/RawDataSampleValidatorTest.java | 182 - .../server/business/AbstractBOTestCase.java | 43 - .../business/AbstractLoaderTestCase.java | 58 - .../AbundanceColumnDefinitionTableTest.java | 169 - .../server/business/AbundanceManagerTest.java | 170 - .../business/AccessionNumberBuilderTest.java | 57 - .../server/business/ErrorModelTest.java | 159 - .../server/business/ExperimentLoaderTest.java | 78 - .../server/business/ProteinInfoTableTest.java | 302 - .../ProteinRelatedSampleTableTest.java | 182 - .../business/ProteinSummaryTableTest.java | 206 - .../server/business/SampleIDProviderTest.java | 122 - .../server/business/SampleLoaderTest.java | 74 - .../server/business/SampleProviderTest.java | 180 - .../server/business/TreatmentFinderTest.java | 196 - .../dto/AbundanceColumnDefinitionTest.java | 120 - .../basic/dto/AggregateFunctionTest.java | 74 - .../shared/basic/dto/OccurrenceUtilTest.java | 61 - .../AbstractProteomicsSystemTestCase.java | 112 - .../ProteomicsDataServiceTest.java | 201 - .../systemtests/ServerAuthorizationTest.java | 108 - .../CommonValidatorProteomicsSystemTest.java | 33 - .../ParentSampleValidatorSystemTest.java | 61 - .../RawDataSampleValidatorSystemTest.java | 62 - .../SampleValidatorProteomicsTestService.java | 54 - rtd_phosphonetx/sourceTest/java/tests.xml | 14 - .../java/tests_project_authorization.xml | 12 - .../sourceTest/java/tests_system.xml | 7 - 338 files changed, 128 insertions(+), 95214 deletions(-) delete mode 100644 rtd_phosphonetx/.gitignore delete mode 100644 rtd_phosphonetx/.pydevproject delete mode 100644 rtd_phosphonetx/.shredder delete mode 100644 rtd_phosphonetx/build.gradle delete mode 100644 rtd_phosphonetx/etc/log.xml delete mode 100644 rtd_phosphonetx/etc/passwd delete mode 100644 rtd_phosphonetx/etc/passwd.sv delete mode 100644 rtd_phosphonetx/etc/passwd.tmp delete mode 100644 rtd_phosphonetx/etc/service.properties delete mode 100644 rtd_phosphonetx/etc/web-client.properties delete mode 100644 rtd_phosphonetx/gradle/wrapper/gradle-wrapper.jar delete mode 100644 rtd_phosphonetx/gradle/wrapper/gradle-wrapper.properties delete mode 100755 rtd_phosphonetx/gradlew delete mode 100644 rtd_phosphonetx/gradlew.bat delete mode 100644 rtd_phosphonetx/gwtdev.gradle delete mode 100644 rtd_phosphonetx/resource/dependency-structure.ddf delete mode 100644 rtd_phosphonetx/resource/eclipse/Gradle Proteomics compile GWT.launch delete mode 100644 rtd_phosphonetx/resource/eclipse/Gradle Proteomics openBIS GWT Shell.launch delete mode 100644 rtd_phosphonetx/resource/eclipse/Gradle Proteomics prepare GWT.launch delete mode 100644 rtd_phosphonetx/resource/eclipse/Proteomics openBIS GWT Shell.launch delete mode 100644 rtd_phosphonetx/resource/eclipse/phosphonetx Data Store Server.launch delete mode 100644 rtd_phosphonetx/resource/server/spring-servlet.xml delete mode 100644 rtd_phosphonetx/resource/server/web.xml delete mode 100644 rtd_phosphonetx/settings.gradle delete mode 100644 rtd_phosphonetx/source/core-plugins/core-plugins.properties delete mode 100644 rtd_phosphonetx/source/core-plugins/dev-demo/1/dss/reporting-plugins/demo-proteomics-aggregation/plugin.properties delete mode 100644 rtd_phosphonetx/source/core-plugins/dev-demo/1/dss/reporting-plugins/demo-proteomics-aggregation/script.py delete mode 100644 rtd_phosphonetx/source/core-plugins/proteomics-optional/1/as/initialize-master-data.py delete mode 100644 rtd_phosphonetx/source/core-plugins/proteomics-optional/package-to-dist delete mode 100644 rtd_phosphonetx/source/core-plugins/proteomics/1/as/dss-data-sources/DSS1/plugin.properties delete mode 100644 rtd_phosphonetx/source/core-plugins/proteomics/1/as/initialize-master-data.py delete mode 100644 rtd_phosphonetx/source/core-plugins/proteomics/1/as/miscellaneous/proteomics-application/plugin.properties delete mode 100644 rtd_phosphonetx/source/core-plugins/proteomics/1/dss/data-sources/proteomics-db/plugin.properties delete mode 100644 rtd_phosphonetx/source/core-plugins/proteomics/1/dss/drop-boxes/ms-injection/plugin.properties delete mode 100644 rtd_phosphonetx/source/core-plugins/proteomics/1/dss/drop-boxes/ms-search/plugin.properties delete mode 100644 rtd_phosphonetx/source/core-plugins/proteomics/1/dss/maintenance-tasks/proteomics-db-clean-up/plugin.properties delete mode 100644 rtd_phosphonetx/source/core-plugins/proteomics/package-to-dist delete mode 100644 rtd_phosphonetx/source/html/demoapp/body-style.css delete mode 100644 rtd_phosphonetx/source/html/demoapp/button.css delete mode 100755 rtd_phosphonetx/source/html/demoapp/d3.js delete mode 100755 rtd_phosphonetx/source/html/demoapp/d3.layout.js delete mode 100644 rtd_phosphonetx/source/html/demoapp/d3.time.js delete mode 100644 rtd_phosphonetx/source/html/demoapp/images/openBIS_Logo.png delete mode 100644 rtd_phosphonetx/source/html/demoapp/images/openBIS_Logo.svg delete mode 100644 rtd_phosphonetx/source/html/demoapp/openbis-demo-app.html delete mode 100644 rtd_phosphonetx/source/html/demoapp/proteomics-demo.js delete mode 100644 rtd_phosphonetx/source/html/demoapp/tree.css delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/dss/proteomics/server/plugins/APMSReport.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/dss/proteomics/server/plugins/DataSetCopier.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/dss/proteomics/server/plugins/LocalAndRemoteCopier.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/AbstractDataSetInfoExtractorWithService.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/AbstractHandler.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/AbstractSampleHandler.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/AbundanceHandler.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/Constants.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/DataSetInfoExtractorForMSInjection.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/DataSetInfoExtractorForProteinResults.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/DatabaseVersionHolder.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/IProtDAO.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/ModificationFraction.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/ModificationFractionHandler.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/ProtXMLLoader.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/ProtXMLUploader.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/ProteinDescription.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/ProteinResultDataSetParentLinkingTask.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/ResultDataSetUploader.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/StorageProcessorWithResultDataSetUploader.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/TypeExtractorForMSInjection.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/Util.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/dto/ASAPRatioPValue.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/dto/AbstractDTOWithID.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/dto/AbstractDTOWithIDAndPermID.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/dto/AminoAcidMass.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/dto/AnnotatedProtein.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/dto/DataSet.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/dto/Database.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/dto/Experiment.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/dto/ModificationType.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/dto/Parameter.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/dto/ParentDataSetCodes.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/dto/Peptide.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/dto/PeptideModification.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/dto/ProgramDetails.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/dto/Protein.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/dto/ProteinAnnotation.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/dto/ProteinGroup.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/dto/ProteinProphetDetails.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/dto/ProteinReference.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/dto/ProteinSummary.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/dto/ProteinSummaryDataFilter.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/dto/ProteinSummaryHeader.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/dto/Sample.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/dto/Sequence.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/protXML_v3.xsd delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/protXML_v4.xsd delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/protXML_v5.xsd delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/BuildAndEnvironmentInfo.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/OpenBIS.gwt.xml delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/OpenBISFirefox.gwt.xml delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/OpenBISSafari.gwt.xml delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/api/v1/FacadeFactory.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/api/v1/IProteomicsDataApiFacade.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/api/v1/ProteomicsDataApiFacade.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/api/v1/ProteomicsDataApiTest.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/api/v1/package.html delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/Constants.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/IPhosphoNetXClientService.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/IPhosphoNetXClientServiceAsync.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/AccessionNumberURLCreator.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/ClientPluginFactory.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/DataSetProteinGrid.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/Dict.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/DisplayTypeIDGenerator.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/ExperimentViewer.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/PhosphoNetXClient.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/PhosphoNetXDisplayTypeIDGenerator.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/PhosphoNetXModule.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/ProteinByExperimentBrowerToolBar.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/ProteinByExperimentBrowserGrid.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/ProteinRelatedSampleGrid.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/ProteinRenderers.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/ProteinSamplesSection.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/ProteinSequenceGrid.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/ProteinSummaryGrid.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/ProteinViewLocatorResolver.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/ProteinViewer.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/RawDataProcessingMenu.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/RawDataSampleGrid.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/ViewContext.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/columns/.gitignore delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/model/.gitignore delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/wizard/BiologicalSampleChoosingPage.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/wizard/BiologicalSampleCreatingPage.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/wizard/BiologicalSampleGrid.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/wizard/MsInjectionAnnotationWizardState.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/wizard/MsInjectionSampleAnnotationModel.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/wizard/MsInjectionSampleAnnotationWizard.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/wizard/MsInjectionSampleChoosingPage.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/wizard/ParentlessMsInjectionSampleGrid.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/wizard/QuestionPage.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/dto/BiologicalSampleGridColumnIDs.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/dto/DataSetProteinGridColumnIDs.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/dto/ListProteinByExperimentAndReferenceCriteria.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/dto/ListProteinByExperimentCriteria.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/dto/ListProteinSequenceCriteria.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/dto/ListProteinSummaryByExperimentCriteria.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/dto/ListSampleAbundanceByProteinCriteria.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/dto/ParentlessMsInjectionSampleGridColumnIDs.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/dto/ProteinBrowserColumnIDs.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/dto/ProteinRelatedSampleGridColumnIDs.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/dto/ProteinSequenceGridColumnIDs.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/dto/ProteinSummaryGridColumnIDs.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/public/index.html delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/public/proteomics-dictionary.js delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/server/PhosphoNetXClientService.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/server/PhosphoNetXClientServiceServlet.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/server/RawDataSampleProvider.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/server/resultset/BiologicalSampleProvider.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/server/resultset/DataSetProteinProvider.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/server/resultset/ParentlessMsInjectionSampleProvider.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/server/resultset/ProteinProvider.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/server/resultset/ProteinRelatedSampleProvider.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/server/resultset/ProteinSequenceProvider.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/server/resultset/ProteinSummaryProvider.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/PhosphoNetXServer.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/PhosphoNetXServerLogger.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/ProteomicsDataServiceInternal.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/ProteomicsDataServiceInternalLogger.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/api/v1/Constants.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/api/v1/ProteomicsDataService.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/api/v1/ProteomicsDataServiceLogger.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/api/v1/ProteomicsDataServiceServer.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/authorization/validator/ParentSampleValidator.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/authorization/validator/RawDataSampleValidator.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/AbstractBusinessObject.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/AbundanceColumnDefinitionTable.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/AbundanceManager.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/AccessionNumberBuilder.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/BusinessObjectFactory.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/DataSetProteinTable.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/ErrorModel.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/ExperimentLoader.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/IAbundanceColumnDefinitionTable.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/IBusinessObjectFactory.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/IDataSetProteinTable.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/IProteinDetailsBO.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/IProteinInfoTable.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/IProteinRelatedSampleTable.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/IProteinSequenceTable.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/IProteinSummaryTable.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/ISampleIDProvider.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/ISampleLoader.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/ISampleProvider.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/ISampleTable.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/ProteinDetailsBO.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/ProteinInfoTable.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/ProteinRelatedSampleTable.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/ProteinSequenceTable.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/ProteinSummaryTable.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/SampleIDProvider.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/SampleLoader.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/SampleProvider.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/SampleTable.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/TreatmentFinder.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/dataaccess/IPhosphoNetXDAOFactory.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/dataaccess/IProteinQueryDAO.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/dataaccess/db/PhosphoNetXDAOFactory.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/dataaccess/db/migration/MigrationStepFrom002To003.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/CacheData.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/IPhosphoNetXServer.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/IProteomicsDataServiceInternal.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/ProbabilityToFDRCalculator.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/ResourceNames.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/api/v1/IProteomicsDataService.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/api/v1/dto/DataSet.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/api/v1/dto/DataStoreServerProcessingPluginInfo.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/api/v1/dto/Experiment.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/api/v1/dto/MsInjectionDataInfo.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/api/v1/dto/PropertyKey.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/api/v1/dto/package.html delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/basic/CommonConstants.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/basic/dto/AbundanceColumnDefinition.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/basic/dto/AccessionNumberProvider.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/basic/dto/AggregateFunction.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/basic/dto/AminoAcid.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/basic/dto/DataSetProtein.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/basic/dto/IBasicProteinInfo.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/basic/dto/IndistinguishableProteinInfo.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/basic/dto/Occurrence.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/basic/dto/OccurrenceUtil.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/basic/dto/Peptide.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/basic/dto/PeptideModification.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/basic/dto/ProteinByExperiment.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/basic/dto/ProteinDetails.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/basic/dto/ProteinInfo.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/basic/dto/ProteinRelatedSample.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/basic/dto/ProteinSequence.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/basic/dto/ProteinSummary.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/basic/dto/RawDataSampleGridIDs.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/basic/dto/SampleWithPropertiesAndAbundance.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/basic/dto/Treatment.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/dto/AbstractDTOWithID.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/dto/AbstractSample.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/dto/IdentifiedProtein.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/dto/IndistinguishableProtein.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/dto/MsInjectionSample.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/dto/PeptideWithModification.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/dto/ProbabilityFDRMapping.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/dto/ProteinAbundance.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/dto/ProteinReference.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/dto/ProteinReferenceWithProbability.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/dto/ProteinReferenceWithProbabilityAndPeptide.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/dto/ProteinReferenceWithProtein.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/dto/ProteinWithAbundances.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/dto/SampleAbundance.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/dto/SamplePeptideModification.java delete mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/dto/Sequence.java delete mode 100644 rtd_phosphonetx/source/java/proteomics-applicationContext.xml delete mode 100644 rtd_phosphonetx/source/java/proteomics-plugin-applicationContext.xml delete mode 100644 rtd_phosphonetx/source/java/service.properties delete mode 100644 rtd_phosphonetx/source/sql/proteomics/postgresql/001/schema-001.dez delete mode 100644 rtd_phosphonetx/source/sql/proteomics/postgresql/001/schema-001.png delete mode 100644 rtd_phosphonetx/source/sql/proteomics/postgresql/001/schema-001.sql delete mode 100755 rtd_phosphonetx/source/sql/proteomics/postgresql/002/schema-002.png delete mode 100755 rtd_phosphonetx/source/sql/proteomics/postgresql/002/schema-002.sql delete mode 100644 rtd_phosphonetx/source/sql/proteomics/postgresql/003/grant-003.sql delete mode 100755 rtd_phosphonetx/source/sql/proteomics/postgresql/003/schema-003.png delete mode 100755 rtd_phosphonetx/source/sql/proteomics/postgresql/003/schema-003.sql delete mode 100644 rtd_phosphonetx/source/sql/proteomics/postgresql/004/grant-004.sql delete mode 100755 rtd_phosphonetx/source/sql/proteomics/postgresql/004/schema-004.png delete mode 100755 rtd_phosphonetx/source/sql/proteomics/postgresql/004/schema-004.sql delete mode 100644 rtd_phosphonetx/source/sql/proteomics/postgresql/005/grant-005.sql delete mode 100755 rtd_phosphonetx/source/sql/proteomics/postgresql/005/schema-005.png delete mode 100755 rtd_phosphonetx/source/sql/proteomics/postgresql/005/schema-005.sql delete mode 100644 rtd_phosphonetx/source/sql/proteomics/postgresql/migration/migration-001-002.sql delete mode 100644 rtd_phosphonetx/source/sql/proteomics/postgresql/migration/migration-002-003.sql delete mode 100644 rtd_phosphonetx/source/sql/proteomics/postgresql/migration/migration-003-004.sql delete mode 100644 rtd_phosphonetx/source/sql/proteomics/postgresql/migration/migration-004-005.sql delete mode 100755 rtd_phosphonetx/source/sql/proteomics/postgresql/schema.dez delete mode 100644 rtd_phosphonetx/sourceTest/core-plugins/core-plugins.properties delete mode 100644 rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/dss/proteomics/server/plugins/APMSReportTest.java delete mode 100644 rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/dss/proteomics/server/plugins/LocalAndRemoteCopierTest.java delete mode 100644 rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/etlserver/proteomics/AbundanceHandlerTest.java delete mode 100644 rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/etlserver/proteomics/DataSetInfoExtractorForMSInjectionTest.java delete mode 100644 rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/etlserver/proteomics/DataSetInfoExtractorForProteinResultsTest.java delete mode 100644 rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/etlserver/proteomics/ProtXMLLoaderTest.java delete mode 100644 rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/etlserver/proteomics/ProtXMLTestCase.java delete mode 100644 rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/etlserver/proteomics/ProtXMLUploaderTest.java delete mode 100644 rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/etlserver/proteomics/ProteinDescriptionTest.java delete mode 100644 rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/etlserver/proteomics/ProteinResultDataSetParentLinkingTaskTest.java delete mode 100644 rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/etlserver/proteomics/ResultDataSetUploaderTest.java delete mode 100644 rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/etlserver/proteomics/TypeExtractorForMSInjectionTest.java delete mode 100644 rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/etlserver/proteomics/UtilTest.java delete mode 100644 rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/DependencyCheckingTest.java delete mode 100644 rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/api/v1/ProteomicsDataApiFacadeTest.java delete mode 100644 rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/ProteinRenderersTest.java delete mode 100644 rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/dto/.gitignore delete mode 100644 rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/server/PhosphoNetXClientServiceTest.java delete mode 100644 rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/server/RawDataSampleProviderTest.java delete mode 100644 rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/server/resultset/ProteinSequenceProviderTest.java delete mode 100644 rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/server/resultset/ProteinSummaryProviderTest.java delete mode 100644 rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/PhosphoNetXServerTest.java delete mode 100644 rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/ProteomicsDataServiceInternalTest.java delete mode 100644 rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/ServerInterfaceRegressionTest.java delete mode 100644 rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/api/v1/ProteomicsDataServiceTest.java delete mode 100644 rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/api/v1/ServerInterfaceRegressionTest.java delete mode 100644 rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/authorization/validator/RawDataSampleValidatorTest.java delete mode 100644 rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/AbstractBOTestCase.java delete mode 100644 rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/AbstractLoaderTestCase.java delete mode 100644 rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/AbundanceColumnDefinitionTableTest.java delete mode 100644 rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/AbundanceManagerTest.java delete mode 100644 rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/AccessionNumberBuilderTest.java delete mode 100644 rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/ErrorModelTest.java delete mode 100644 rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/ExperimentLoaderTest.java delete mode 100644 rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/ProteinInfoTableTest.java delete mode 100644 rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/ProteinRelatedSampleTableTest.java delete mode 100644 rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/ProteinSummaryTableTest.java delete mode 100644 rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/SampleIDProviderTest.java delete mode 100644 rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/SampleLoaderTest.java delete mode 100644 rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/SampleProviderTest.java delete mode 100644 rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/TreatmentFinderTest.java delete mode 100644 rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/basic/dto/AbundanceColumnDefinitionTest.java delete mode 100644 rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/basic/dto/AggregateFunctionTest.java delete mode 100644 rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/basic/dto/OccurrenceUtilTest.java delete mode 100644 rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/proteomics/systemtests/AbstractProteomicsSystemTestCase.java delete mode 100644 rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/proteomics/systemtests/ProteomicsDataServiceTest.java delete mode 100644 rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/proteomics/systemtests/ServerAuthorizationTest.java delete mode 100644 rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/proteomics/systemtests/authorization/validator/CommonValidatorProteomicsSystemTest.java delete mode 100644 rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/proteomics/systemtests/authorization/validator/sample/ParentSampleValidatorSystemTest.java delete mode 100644 rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/proteomics/systemtests/authorization/validator/sample/RawDataSampleValidatorSystemTest.java delete mode 100644 rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/proteomics/systemtests/authorization/validator/sample/SampleValidatorProteomicsTestService.java delete mode 100644 rtd_phosphonetx/sourceTest/java/tests.xml delete mode 100644 rtd_phosphonetx/sourceTest/java/tests_project_authorization.xml delete mode 100644 rtd_phosphonetx/sourceTest/java/tests_system.xml diff --git a/js-test/servers/common/datastore_server/etc/service.properties b/js-test/servers/common/datastore_server/etc/service.properties index 1ce6fcea983..12f6613e96f 100644 --- a/js-test/servers/common/datastore_server/etc/service.properties +++ b/js-test/servers/common/datastore_server/etc/service.properties @@ -1,181 +1,138 @@ # Unique code of this Data Store Server. Not more than 40 characters. -data-store-server-code = DSS1 - +data-store-server-code=DSS1 # host name of the machine on which the datastore server is running -host-address = http://localhost - +host-address=http://localhost # parent directory of the store directory and all the dropboxes -root-dir = data - +root-dir=data # The root directory of the data store -storeroot-dir = ${root-dir}/store - -incoming-root-dir = ${root-dir} - +storeroot-dir=${root-dir}/store +incoming-root-dir=${root-dir} # Cache for data set files from other Data Store Servers cache-workspace-folder ${root-dir}/dss-cache - -# The directory where the command queue file is located; defaults to storeroot-dir -commandqueue-dir = - +# The directory where the command queue file is located; defaults to storeroot-dir +commandqueue-dir= # Port -port = 20001 -use-ssl = false - +port=20001 +use-ssl=false # Session timeout in minutes -session-timeout = 720 - +session-timeout=720 # Path to the keystore -keystore.path = etc/openBIS.keystore +keystore.path=etc/openBIS.keystore # Password of the keystore -keystore.password = changeit +keystore.password=changeit # Key password of the keystore -keystore.key-password = changeit - +keystore.key-password=changeit # The check interval (in seconds) -check-interval = 5 - -quiet-period = 10 - -data-set-locking-timeout = 1 - +check-interval=5 +quiet-period=10 +data-set-locking-timeout=1 # The time-out for clean up work in the shutdown sequence (in seconds). # Note that that the maximal time for the shutdown sequence to complete can be as large # as twice this time. # Remark: On a network file system, it is not recommended to turn this value to something # lower than 180. -shutdown-timeout = 180 - +shutdown-timeout=180 # The minimum time (in seconds) of availability of the data stream since moment when user requested # for the data stream url. If not specified default value (20 seconds) will be used. # minimum-time-to-keep-streams-in-sec = 20 - #�If free disk space goes below value defined here, a notification email will be sent. # Value must be specified in kilobytes (1048576 = 1024 * 1024 = 1GB). If no high water mark is # specified or if value is negative, the system will not be watching. There are 2 different kinds # of highwater mark supported: the one that is checking the space on the store, and one that is # checking the amount of free space for recovery state (on the local filesystem). -highwater-mark = -1 -recovery-highwater-mark = -1 - -# If a data set is successfully registered it sends out an email to the registrator. +highwater-mark=-1 +recovery-highwater-mark=-1 +# If a data set is successfully registered it sends out an email to the registrator. # If this property is not specified, no email is sent to the registrator. This property # does not affect the mails which are sent, when the data set could not be registered. -notify-successful-registration = false - +notify-successful-registration=false # The URL of the openBIS server -server-url = ${host-address}:20000 - +server-url=${host-address}:20000 # The username to use when contacting the openBIS server -username = etlserver - +username=etlserver # The password for the etlserver user who contacts the openBIS server password=e1AWO4f0ro - # The base URL for Web client access to the data store server. -download-url = ${host-address}:${port} - +download-url=${host-address}:${port} # SMTP properties (must start with 'mail' to be considered). # The current configuration saves the emails in the file system in the root directory -mail.smtp.host = file://${root-dir}/email +mail.smtp.host=file://${root-dir}/email # mail.smtp.host = localhost # mail.from = openbis-dss@localhost # mail.smtp.user = # mail.smtp.password = - - # Data sources -data-sources = path-info-db - +data-sources=path-info-db # Data source for pathinfo database -path-info-db.version-holder-class = ch.systemsx.cisd.openbis.dss.generic.shared.PathInfoDatabaseVersionHolder -path-info-db.databaseEngineCode = postgresql -path-info-db.basicDatabaseName = pathinfo +path-info-db.version-holder-class=ch.systemsx.cisd.openbis.dss.generic.shared.PathInfoDatabaseVersionHolder +path-info-db.databaseEngineCode=postgresql +path-info-db.basicDatabaseName=pathinfo # The host and optionally port. Default is 'localhost'. # path-info-db.urlHostPart = -path-info-db.databaseKind = test_js_common -path-info-db.scriptFolder = ../../../../datastore_server/source/sql - +path-info-db.databaseKind=test_js_common +path-info-db.scriptFolder=../../../../datastore_server/source/sql # --------------------------------------------------------------------------- # maintenance plugins configuration # --------------------------------------------------------------------------- - # Comma separated names of maintenance plugins. Each plugin should have configuration properties prefixed with its name. -maintenance-plugins = post-registration, path-info-deletion - -# Maintenance task for post registration of all paths of a freshly registered data set to be fed into pathinfo database -post-registration.class = ch.systemsx.cisd.etlserver.postregistration.PostRegistrationMaintenanceTask -post-registration.interval = 30 -post-registration.cleanup-tasks-folder = ${root-dir}/post-registration/cleanup-tasks -post-registration.last-seen-data-set-file = ${root-dir}/post-registration/last-seen-data-set.txt -post-registration.post-registration-tasks = pathinfo-feeding, notifying -post-registration.pathinfo-feeding.class = ch.systemsx.cisd.etlserver.path.PathInfoDatabaseFeedingTask -post-registration.pathinfo-feeding.compute-checksum = true +maintenance-plugins=post-registration, path-info-deletion +# Maintenance task for post registration of all paths of a freshly registered data set to be fed into pathinfo database +post-registration.class=ch.systemsx.cisd.etlserver.postregistration.PostRegistrationMaintenanceTask +post-registration.interval=30 +post-registration.cleanup-tasks-folder=${root-dir}/post-registration/cleanup-tasks +post-registration.last-seen-data-set-file=${root-dir}/post-registration/last-seen-data-set.txt +post-registration.post-registration-tasks=pathinfo-feeding, notifying +post-registration.pathinfo-feeding.class=ch.systemsx.cisd.etlserver.path.PathInfoDatabaseFeedingTask +post-registration.pathinfo-feeding.compute-checksum=true # The NotifyingTask throws an exception. Thus, post-registration will always fail. # This is needed to have an example of a data set which isn't post-registered. -post-registration.notifying.class = ch.systemsx.cisd.etlserver.postregistration.NotifyingTask -post-registration.notifying.destination-path-template = targets/${unknown-placeholder-preventing-post-registration} -post-registration.notifying.message-template = hello - +post-registration.notifying.class=ch.systemsx.cisd.etlserver.postregistration.NotifyingTask +post-registration.notifying.destination-path-template=targets/${unknown-placeholder-preventing-post-registration} +post-registration.notifying.message-template=hello # Maintenance task for deleting entries from pathinfo database after deletion of a data set -path-info-deletion.class = ch.systemsx.cisd.etlserver.plugins.DeleteFromExternalDBMaintenanceTask -path-info-deletion.interval = 120 -path-info-deletion.data-source = path-info-db -path-info-deletion.data-set-table-name = data_sets -path-info-deletion.data-set-perm-id = CODE - +path-info-deletion.class=ch.systemsx.cisd.etlserver.plugins.DeleteFromExternalDBMaintenanceTask +path-info-deletion.interval=120 +path-info-deletion.data-source=path-info-db +path-info-deletion.data-set-table-name=data_sets +path-info-deletion.data-set-perm-id=CODE # --------------------------------------------------------------------------- # processing plugins configuration # --------------------------------------------------------------------------- - # Comma separated names of processing plugins. Each plugin should have configuration properties prefixed with its name. -processing-plugins = path-info-db-consistency-check - +processing-plugins=path-info-db-consistency-check # Processing task that checks the consistency between the data store and the meta information stored in the PathInfoDB. # It sends out an email which contains all differences found. -path-info-db-consistency-check.label = Path Info DB consistency check -path-info-db-consistency-check.dataset-types = .* -path-info-db-consistency-check.class = ch.systemsx.cisd.openbis.dss.generic.server.plugins.standard.DataSetAndPathInfoDBConsistencyCheckProcessingPlugin - +path-info-db-consistency-check.label=Path Info DB consistency check +path-info-db-consistency-check.dataset-types=.* +path-info-db-consistency-check.class=ch.systemsx.cisd.openbis.dss.generic.server.plugins.standard.DataSetAndPathInfoDBConsistencyCheckProcessingPlugin # --------------------------------------------------------------------------- # dropbox configurations # --------------------------------------------------------------------------- -inputs = default-dropbox -dss-rpc.put-default = default-dropbox - -default-dropbox.incoming-dir = ${incoming-root-dir}/incoming-default -default-dropbox.incoming-data-completeness-condition = auto-detection -default-dropbox.top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JavaTopLevelDataSetHandlerV2 -default-dropbox.program-class = ch.systemsx.cisd.etlserver.registrator.DefaultDropbox -default-dropbox.storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor +inputs=default-dropbox +dss-rpc.put-default=default-dropbox +default-dropbox.incoming-dir=${incoming-root-dir}/incoming-default +default-dropbox.incoming-data-completeness-condition=auto-detection +default-dropbox.top-level-data-set-handler=ch.systemsx.cisd.etlserver.registrator.api.v2.JavaTopLevelDataSetHandlerV2 +default-dropbox.program-class=ch.systemsx.cisd.etlserver.registrator.DefaultDropbox +default-dropbox.storage-processor=ch.systemsx.cisd.etlserver.DefaultStorageProcessor #default-dropbox.validation-script-path = ../core-plugins/default/default-validation-script.py - # --------------------------------------------------------------------------- # Archiver configuration (optional) # --------------------------------------------------------------------------- - # Configuration of an archiver task. All properties are prefixed with 'archiver.'. - # Archiver class specification (together with the list of packages this class belongs to). -archiver.class = ch.systemsx.cisd.openbis.dss.generic.server.plugins.demo.DemoArchiver - +archiver.class=ch.systemsx.cisd.openbis.dss.generic.server.plugins.demo.DemoArchiver # --------------------------------------------------------------------------- # Imaging database for screening (optional, only used if screening technology switched on) # --------------------------------------------------------------------------- # Format: <host>[:<port>]. Default: localhost # imaging-database.url-host-part = # Default: prod. - -imaging-database.kind = test_js_common -proteomics-database-kind = test_js_common - -screening-sql-root-folder = ../../../../screening/source/ -proteomics-sql-root-folder = ../../../../rtd_phosphonetx/source/ - +imaging-database.kind=test_js_common +proteomics-database-kind=test_js_common +screening-sql-root-folder=../../../../screening/source/ # --------------------------------------------------------------------------- # INTERNAL CONFIGURATION, # Do not change this part unless you are developing openBIS extensions. # --------------------------------------------------------------------------- - - jython-version=2.7 diff --git a/js-test/servers/common/datastore_server2/etc/service.properties b/js-test/servers/common/datastore_server2/etc/service.properties index 7bc4758e4fb..646ee8ef193 100644 --- a/js-test/servers/common/datastore_server2/etc/service.properties +++ b/js-test/servers/common/datastore_server2/etc/service.properties @@ -1,181 +1,138 @@ # Unique code of this Data Store Server. Not more than 40 characters. -data-store-server-code = DSS2 - +data-store-server-code=DSS2 # host name of the machine on which the datastore server is running -host-address = http://localhost - +host-address=http://localhost # parent directory of the store directory and all the dropboxes -root-dir = data - +root-dir=data # The root directory of the data store -storeroot-dir = ${root-dir}/store - -incoming-root-dir = ${root-dir} - +storeroot-dir=${root-dir}/store +incoming-root-dir=${root-dir} # Cache for data set files from other Data Store Servers -cache-workspace-folder = ${root-dir}/dss-cache - -# The directory where the command queue file is located; defaults to storeroot-dir -commandqueue-dir = - +cache-workspace-folder=${root-dir}/dss-cache +# The directory where the command queue file is located; defaults to storeroot-dir +commandqueue-dir= # Port -port = 20002 -use-ssl = false - +port=20002 +use-ssl=false # Session timeout in minutes -session-timeout = 720 - +session-timeout=720 # Path to the keystore -keystore.path = etc/openBIS.keystore +keystore.path=etc/openBIS.keystore # Password of the keystore -keystore.password = changeit +keystore.password=changeit # Key password of the keystore -keystore.key-password = changeit - +keystore.key-password=changeit # The check interval (in seconds) -check-interval = 5 - -quiet-period = 10 - -data-set-locking-timeout = 1 - +check-interval=5 +quiet-period=10 +data-set-locking-timeout=1 # The time-out for clean up work in the shutdown sequence (in seconds). # Note that that the maximal time for the shutdown sequence to complete can be as large # as twice this time. # Remark: On a network file system, it is not recommended to turn this value to something # lower than 180. -shutdown-timeout = 180 - +shutdown-timeout=180 # The minimum time (in seconds) of availability of the data stream since moment when user requested # for the data stream url. If not specified default value (20 seconds) will be used. # minimum-time-to-keep-streams-in-sec = 20 - #�If free disk space goes below value defined here, a notification email will be sent. # Value must be specified in kilobytes (1048576 = 1024 * 1024 = 1GB). If no high water mark is # specified or if value is negative, the system will not be watching. There are 2 different kinds # of highwater mark supported: the one that is checking the space on the store, and one that is # checking the amount of free space for recovery state (on the local filesystem). -highwater-mark = -1 -recovery-highwater-mark = -1 - -# If a data set is successfully registered it sends out an email to the registrator. +highwater-mark=-1 +recovery-highwater-mark=-1 +# If a data set is successfully registered it sends out an email to the registrator. # If this property is not specified, no email is sent to the registrator. This property # does not affect the mails which are sent, when the data set could not be registered. -notify-successful-registration = false - +notify-successful-registration=false # The URL of the openBIS server -server-url = ${host-address}:20000 - +server-url=${host-address}:20000 # The username to use when contacting the openBIS server -username = etlserver - +username=etlserver # The password for the etlserver user who contacts the openBIS server password=e1AWO4f0ro - # The base URL for Web client access to the data store server. -download-url = ${host-address}:${port} - +download-url=${host-address}:${port} # SMTP properties (must start with 'mail' to be considered). # The current configuration saves the emails in the file system in the root directory -mail.smtp.host = file://${root-dir}/email +mail.smtp.host=file://${root-dir}/email # mail.smtp.host = localhost # mail.from = openbis-dss@localhost # mail.smtp.user = # mail.smtp.password = - - # Data sources -data-sources = path-info-db - +data-sources=path-info-db # Data source for pathinfo database -path-info-db.version-holder-class = ch.systemsx.cisd.openbis.dss.generic.shared.PathInfoDatabaseVersionHolder -path-info-db.databaseEngineCode = postgresql -path-info-db.basicDatabaseName = pathinfo +path-info-db.version-holder-class=ch.systemsx.cisd.openbis.dss.generic.shared.PathInfoDatabaseVersionHolder +path-info-db.databaseEngineCode=postgresql +path-info-db.basicDatabaseName=pathinfo # The host and optionally port. Default is 'localhost'. # path-info-db.urlHostPart = -path-info-db.databaseKind = test_js_common2 -path-info-db.scriptFolder = ../../../../datastore_server/source/sql - +path-info-db.databaseKind=test_js_common2 +path-info-db.scriptFolder=../../../../datastore_server/source/sql # --------------------------------------------------------------------------- # maintenance plugins configuration # --------------------------------------------------------------------------- - # Comma separated names of maintenance plugins. Each plugin should have configuration properties prefixed with its name. -maintenance-plugins = post-registration, path-info-deletion - -# Maintenance task for post registration of all paths of a freshly registered data set to be fed into pathinfo database -post-registration.class = ch.systemsx.cisd.etlserver.postregistration.PostRegistrationMaintenanceTask -post-registration.interval = 30 -post-registration.cleanup-tasks-folder = ${root-dir}/post-registration/cleanup-tasks -post-registration.last-seen-data-set-file = ${root-dir}/post-registration/last-seen-data-set.txt -post-registration.post-registration-tasks = pathinfo-feeding, notifying -post-registration.pathinfo-feeding.class = ch.systemsx.cisd.etlserver.path.PathInfoDatabaseFeedingTask -post-registration.pathinfo-feeding.compute-checksum = true +maintenance-plugins=post-registration, path-info-deletion +# Maintenance task for post registration of all paths of a freshly registered data set to be fed into pathinfo database +post-registration.class=ch.systemsx.cisd.etlserver.postregistration.PostRegistrationMaintenanceTask +post-registration.interval=30 +post-registration.cleanup-tasks-folder=${root-dir}/post-registration/cleanup-tasks +post-registration.last-seen-data-set-file=${root-dir}/post-registration/last-seen-data-set.txt +post-registration.post-registration-tasks=pathinfo-feeding, notifying +post-registration.pathinfo-feeding.class=ch.systemsx.cisd.etlserver.path.PathInfoDatabaseFeedingTask +post-registration.pathinfo-feeding.compute-checksum=true # The NotifyingTask throws an exception. Thus, post-registration will always fail. # This is needed to have an example of a data set which isn't post-registered. -post-registration.notifying.class = ch.systemsx.cisd.etlserver.postregistration.NotifyingTask -post-registration.notifying.destination-path-template = targets/${unknown-placeholder-preventing-post-registration} -post-registration.notifying.message-template = hello - +post-registration.notifying.class=ch.systemsx.cisd.etlserver.postregistration.NotifyingTask +post-registration.notifying.destination-path-template=targets/${unknown-placeholder-preventing-post-registration} +post-registration.notifying.message-template=hello # Maintenance task for deleting entries from pathinfo database after deletion of a data set -path-info-deletion.class = ch.systemsx.cisd.etlserver.plugins.DeleteFromExternalDBMaintenanceTask -path-info-deletion.interval = 120 -path-info-deletion.data-source = path-info-db -path-info-deletion.data-set-table-name = data_sets -path-info-deletion.data-set-perm-id = CODE - +path-info-deletion.class=ch.systemsx.cisd.etlserver.plugins.DeleteFromExternalDBMaintenanceTask +path-info-deletion.interval=120 +path-info-deletion.data-source=path-info-db +path-info-deletion.data-set-table-name=data_sets +path-info-deletion.data-set-perm-id=CODE # --------------------------------------------------------------------------- # processing plugins configuration # --------------------------------------------------------------------------- - # Comma separated names of processing plugins. Each plugin should have configuration properties prefixed with its name. -processing-plugins = path-info-db-consistency-check - +processing-plugins=path-info-db-consistency-check # Processing task that checks the consistency between the data store and the meta information stored in the PathInfoDB. # It sends out an email which contains all differences found. -path-info-db-consistency-check.label = Path Info DB consistency check -path-info-db-consistency-check.dataset-types = .* -path-info-db-consistency-check.class = ch.systemsx.cisd.openbis.dss.generic.server.plugins.standard.DataSetAndPathInfoDBConsistencyCheckProcessingPlugin - +path-info-db-consistency-check.label=Path Info DB consistency check +path-info-db-consistency-check.dataset-types=.* +path-info-db-consistency-check.class=ch.systemsx.cisd.openbis.dss.generic.server.plugins.standard.DataSetAndPathInfoDBConsistencyCheckProcessingPlugin # --------------------------------------------------------------------------- # dropbox configurations # --------------------------------------------------------------------------- -inputs = default-dropbox -dss-rpc.put-default = default-dropbox - -default-dropbox.incoming-dir = ${incoming-root-dir}/incoming-default -default-dropbox.incoming-data-completeness-condition = auto-detection -default-dropbox.top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JavaTopLevelDataSetHandlerV2 -default-dropbox.program-class = ch.systemsx.cisd.etlserver.registrator.DefaultDropbox -default-dropbox.storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor -default-dropbox.validation-script-path = ../core-plugins/default/default-validation-script.py - +inputs=default-dropbox +dss-rpc.put-default=default-dropbox +default-dropbox.incoming-dir=${incoming-root-dir}/incoming-default +default-dropbox.incoming-data-completeness-condition=auto-detection +default-dropbox.top-level-data-set-handler=ch.systemsx.cisd.etlserver.registrator.api.v2.JavaTopLevelDataSetHandlerV2 +default-dropbox.program-class=ch.systemsx.cisd.etlserver.registrator.DefaultDropbox +default-dropbox.storage-processor=ch.systemsx.cisd.etlserver.DefaultStorageProcessor +default-dropbox.validation-script-path=../core-plugins/default/default-validation-script.py # --------------------------------------------------------------------------- # Archiver configuration (optional) # --------------------------------------------------------------------------- - # Configuration of an archiver task. All properties are prefixed with 'archiver.'. - # Archiver class specification (together with the list of packages this class belongs to). -archiver.class = ch.systemsx.cisd.openbis.dss.generic.server.plugins.demo.DemoArchiver - +archiver.class=ch.systemsx.cisd.openbis.dss.generic.server.plugins.demo.DemoArchiver # --------------------------------------------------------------------------- # Imaging database for screening (optional, only used if screening technology switched on) # --------------------------------------------------------------------------- # Format: <host>[:<port>]. Default: localhost # imaging-database.url-host-part = # Default: prod. - -imaging-database.kind = test_js_common2 -proteomics-database-kind = test_js_common2 - -screening-sql-root-folder = ../../../../screening/source/ -proteomics-sql-root-folder = ../../../../rtd_phosphonetx/source/ - +imaging-database.kind=test_js_common2 +proteomics-database-kind=test_js_common2 +screening-sql-root-folder=../../../../screening/source/ # --------------------------------------------------------------------------- # INTERNAL CONFIGURATION, # Do not change this part unless you are developing openBIS extensions. # --------------------------------------------------------------------------- - - jython-version=2.7 diff --git a/openbis_all/build/build.xml b/openbis_all/build/build.xml index 42907f391a0..c1b51dec44c 100644 --- a/openbis_all/build/build.xml +++ b/openbis_all/build/build.xml @@ -20,10 +20,6 @@ <param name="project" value="deep_sequencing_unit" /> <param name="pattern" value="*"/> </antcall> - <antcall target="_dist"> - <param name="project" value="rtd_phosphonetx" /> - <param name="pattern" value="*"/> - </antcall> <antcall target="_dist"> <param name="project" value="rtd_yeastx" /> <param name="pattern" value="*"/> @@ -91,9 +87,6 @@ <antcall target="_clean"> <param name="project" value="deep_sequencing_unit"/> </antcall> - <antcall target="_clean"> - <param name="project" value="rtd_phosphonetx"/> - </antcall> <antcall target="_clean"> <param name="project" value="rtd_yeastx"/> </antcall> diff --git a/openbis_all/source/bash/build/branch.sh b/openbis_all/source/bash/build/branch.sh index 0541401e60c..e046ba9c880 100755 --- a/openbis_all/source/bash/build/branch.sh +++ b/openbis_all/source/bash/build/branch.sh @@ -39,7 +39,6 @@ openbis-common \ openbis_standard_technologies \ openbis_api \ plasmid \ -rtd_phosphonetx \ rtd_yeastx \ screening \ ui-test\ diff --git a/rtd_phosphonetx/.gitignore b/rtd_phosphonetx/.gitignore deleted file mode 100644 index 8186f94570a..00000000000 --- a/rtd_phosphonetx/.gitignore +++ /dev/null @@ -1,11 +0,0 @@ -/etc -/tomcat -/targets -/test-output -/.updater -/.dynamic_property_evaluator_queue -/bin -/build/ -/.idea/ -*.iml -*.eml \ No newline at end of file diff --git a/rtd_phosphonetx/.pydevproject b/rtd_phosphonetx/.pydevproject deleted file mode 100644 index a9cca037b33..00000000000 --- a/rtd_phosphonetx/.pydevproject +++ /dev/null @@ -1,7 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<?eclipse-pydev version="1.0"?> - -<pydev_project> -<pydev_property name="org.python.pydev.PYTHON_PROJECT_INTERPRETER">Default</pydev_property> -<pydev_property name="org.python.pydev.PYTHON_PROJECT_VERSION">python 2.7</pydev_property> -</pydev_project> diff --git a/rtd_phosphonetx/.shredder b/rtd_phosphonetx/.shredder deleted file mode 100644 index 2e08dce276e43c677d121d627a250d1710fed824..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12 Rcmeyd#OO5x0|O5T0{|U20@45g diff --git a/rtd_phosphonetx/build.gradle b/rtd_phosphonetx/build.gradle deleted file mode 100644 index a53a350ca62..00000000000 --- a/rtd_phosphonetx/build.gradle +++ /dev/null @@ -1,58 +0,0 @@ -evaluationDependsOn(':commonbase') -evaluationDependsOn(':common') -evaluationDependsOn(':openbis_api') -evaluationDependsOn(':openbis-common') -evaluationDependsOn(':authentication') -evaluationDependsOn(':dbmigration') -evaluationDependsOn(':openbis') -evaluationDependsOn(':datastore_server') - -apply from: '../gradle/javaproject.gradle' - -dependencies { - compile project(':common'), - project(':datastore_server') - - testCompile project(path: ':datastore_server', configuration: 'tests') - -} - -sourceSets { - test { - resources { - srcDirs = ['source/java'] - } - } -} - -jar { - from('../rtd_phosphonetx/source/sql'){ - into("/sql") - include "proteomics/**/*.sql" - } -} - -task systemTestSuite(type: Test) { - useTestNG() - options.suites('sourceTest/java/tests_system.xml') - jvmArgs '-Xmx2048m', '-XX:MaxPermSize=256m' - reports.html.destination = file("${project.buildDir}/reports/tests-system") -} - -test.dependsOn(systemTestSuite) - -task zip(type: Zip) { - includeEmptyDirs false - from (jar.archivePath) { - into 'datastore_server/lib/' - rename 'datastore_server_plugin-proteomics(.*)\\.jar', 'datastore_server_plugin-proteomics.jar' - } - - from (fileTree(dir: 'source/core-plugins', includes:['proteomics/**', 'proteomics-optional/**'], excludes:['**/as/**', '**/package-to-dist'])) { - into 'core-plugins' - } -} -zip.dependsOn jar -build.dependsOn zip - -apply from: 'gwtdev.gradle' diff --git a/rtd_phosphonetx/etc/log.xml b/rtd_phosphonetx/etc/log.xml deleted file mode 100644 index 5cee0a68436..00000000000 --- a/rtd_phosphonetx/etc/log.xml +++ /dev/null @@ -1,19 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" ?> -<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> - -<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'> - - <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender"> - <layout class="org.apache.log4j.PatternLayout"> - <param name="ConversionPattern" value="%d %-5p [%t] %c - %m%n"/> - </layout> - </appender> - - <appender name="NULL" class="org.apache.log4j.varia.NullAppender" /> - - <root> - <priority value ="info" /> - <appender-ref ref="STDOUT" /> - </root> - -</log4j:configuration> diff --git a/rtd_phosphonetx/etc/passwd b/rtd_phosphonetx/etc/passwd deleted file mode 100644 index 6ead36251a5..00000000000 --- a/rtd_phosphonetx/etc/passwd +++ /dev/null @@ -1,4 +0,0 @@ -test:a@admins.com:A:The Admin:J3fII6Pex7jnCBwF+uXz2mFuB1QVhPUi -u:u@users.com:U:The User:dmbGKaGRmbX8YKfslMxUHObmYfjywkuT -o:o@observers.com:O:The Observer:t53ADCnFnEFhBvHB7FPoHhbHeW2O1KJc -etlserver::::SHGHSPawL/B3NKXD5nsu4fSrj5LwR2MX diff --git a/rtd_phosphonetx/etc/passwd.sv b/rtd_phosphonetx/etc/passwd.sv deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/rtd_phosphonetx/etc/passwd.tmp b/rtd_phosphonetx/etc/passwd.tmp deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/rtd_phosphonetx/etc/service.properties b/rtd_phosphonetx/etc/service.properties deleted file mode 100644 index 3db2ce8d811..00000000000 --- a/rtd_phosphonetx/etc/service.properties +++ /dev/null @@ -1,115 +0,0 @@ -# Unique code of this Data Store Server. Not more than 40 characters. -data-store-server-code = DSS1 - -root-dir = targets/playground - -# The root directory of the data store -storeroot-dir = ${root-dir}/data/store - -incoming-root-dir = ${root-dir}/data - -core-plugins-folder = source/core-plugins - -proteomics-database-kind = dev -proteomics-sql-root-folder = source/ - -session-workspace-root-dir = ${incoming-root-dir}/session-workspace - -dss-rpc.put-default = default-dropbox - -# The directory where the command queue file is located; defaults to storeroot-dir -commandqueue-dir = - -# Port -port = 8889 - -# Session timeout in minutes -session-timeout = 720 - -# Path to the keystore -keystore.path = ../datastore_server/dist/etc/openBIS.keystore - -# Password of the keystore -keystore.password = changeit - -# Key password of the keystore -keystore.key-password = changeit - -# The check interval (in seconds) -check-interval = 5 - -# The time-out for clean up work in the shutdown sequence (in seconds). -# Note that that the maximal time for the shutdown sequence to complete can be as large -# as twice this time. -# Remark: On a network file system, it is not recommended to turn this value to something -# lower than 180. -shutdown-timeout = 2 - -# If free disk space goes below value defined here, a notification email will be sent. -# Value must be specified in kilobytes (1048576 = 1024 * 1024 = 1GB). If no high water mark is -# specified or if value is negative, the system will not be watching. -highwater-mark = -1 - -# If a data set is successfully registered it sends out an email to the registrator. -# If this property is not specified, no email is sent to the registrator. This property -# does not affect the mails which are sent, when the data set could not be registered. -notify-successful-registration = false - -dss-temp-dir = ${root-dir}/dss-temp -dss-registration-log-dir = ${root-dir}/dss-registration-logs -dss-recovery-state-dir = ${root-dir}/recovery-state - -use-ssl = false - -# The URL of the openBIS server -server-url = http://localhost:8888/openbis -server-timeout-in-minutes = 10 - -# The username to use when contacting the openBIS server -username = etlserver - -# The password to use when contacting the openBIS server -password = etlserver - -# The base URL for Web client access. -download-url = http://localhost:8889 - -# SMTP properties (must start with 'mail' to be considered). -mail.smtp.host = file://targets/email -mail.from = datastore_server@localhost - -# ---------------- Timing parameters for file system operations on remote shares. - -# Time (in seconds) to wait for any file system operation to finish. Operations exceeding this -# timeout will be terminated. -timeout = 60 -# Number of times that a timed out operation will be tried again (0 means: every file system -# operation will only ever be performed once). -max-retries = 11 -# Time (in seconds) to wait after an operation has been timed out before re-trying. -failure-interval = 10 - -# The period of no write access that needs to pass before an incoming data item is considered -# complete and ready to be processed (in seconds) [default: 300]. -# Valid only when auto-detection method is used to determine if an incoming data are ready to be processed. -quiet-period = 10 - -# --------------------------------------------------------------------------- - -# Globally used separator character which separates entities in a data set file name -data-set-file-name-entity-separator = _ - -# --------------------------------------------------------------------------- -# dropbox configurations -# --------------------------------------------------------------------------- -inputs = default-dropbox -dss-rpc.put-default = default-dropbox - -default-dropbox.incoming-dir = ${incoming-root-dir}/incoming-default -default-dropbox.incoming-data-completeness-condition = auto-detection -default-dropbox.top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JavaTopLevelDataSetHandlerV2 -default-dropbox.program-class = ch.systemsx.cisd.etlserver.registrator.DefaultDropbox -default-dropbox.storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor - - -jython-version=2.7 diff --git a/rtd_phosphonetx/etc/web-client.properties b/rtd_phosphonetx/etc/web-client.properties deleted file mode 100644 index dc67a8589bc..00000000000 --- a/rtd_phosphonetx/etc/web-client.properties +++ /dev/null @@ -1,12 +0,0 @@ -# Maximal number of visible columns in tables. Default: 50. -max-visible-columns = 15 -enable-trash = true - -technologies = proteomics - -# Relative path of cache. Default value is 'cache'. -proteomics.cache-folder = targets/cache -# Minimum free disk space needed for the cache. Default value is 1 GB. -#proteomics.minimum-free-disk-space-in-MB = 1024 -# Maximum retention time. Data older than this time will be removed from cache. Default value is a week. -#proteomics.maximum-retention-time-in-days = 7 diff --git a/rtd_phosphonetx/gradle/wrapper/gradle-wrapper.jar b/rtd_phosphonetx/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index 05a89ea194c2a29cec5f0bd3df21c3e8e1a81b78..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 54783 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 C9{8sK diff --git a/rtd_phosphonetx/gradle/wrapper/gradle-wrapper.properties b/rtd_phosphonetx/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 3cf832e831f..00000000000 --- a/rtd_phosphonetx/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,5 +0,0 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -distributionUrl=http\://svnsis.ethz.ch/repos/cisd/ivy-repository/trunk/gradle/distribution/5.6.4/gradle-5.6.4-all.zip -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists diff --git a/rtd_phosphonetx/gradlew b/rtd_phosphonetx/gradlew deleted file mode 100755 index 4453ccea33d..00000000000 --- a/rtd_phosphonetx/gradlew +++ /dev/null @@ -1,172 +0,0 @@ -#!/usr/bin/env sh - -############################################################################## -## -## Gradle start up script for UN*X -## -############################################################################## - -# Attempt to set APP_HOME -# Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi -done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null - -APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS="" - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" - -warn ( ) { - echo "$*" -} - -die ( ) { - echo - echo "$*" - echo - exit 1 -} - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -nonstop=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; - NONSTOP* ) - nonstop=true - ;; -esac - -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar - -# Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" - else - JAVACMD="$JAVA_HOME/bin/java" - fi - if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -else - JAVACMD="java" - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." -fi - -# Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi -fi - -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi - -# For Cygwin, switch paths to Windows format before running java -if $cygwin ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - JAVACMD=`cygpath --unix "$JAVACMD"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi - # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" - fi - i=$((i+1)) - done - case $i in - (0) set -- ;; - (1) set -- "$args0" ;; - (2) set -- "$args0" "$args1" ;; - (3) set -- "$args0" "$args1" "$args2" ;; - (4) set -- "$args0" "$args1" "$args2" "$args3" ;; - (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; - esac -fi - -# Escape application args -save ( ) { - for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done - echo " " -} -APP_ARGS=$(save "$@") - -# Collect all arguments for the java command, following the shell quoting and substitution rules -eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" - -# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong -if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then - cd "$(dirname "$0")" -fi - -exec "$JAVACMD" "$@" diff --git a/rtd_phosphonetx/gradlew.bat b/rtd_phosphonetx/gradlew.bat deleted file mode 100644 index e95643d6a2c..00000000000 --- a/rtd_phosphonetx/gradlew.bat +++ /dev/null @@ -1,84 +0,0 @@ -@if "%DEBUG%" == "" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS= - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto init - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto init - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:init -@rem Get command-line arguments, handling Windows variants - -if not "%OS%" == "Windows_NT" goto win9xME_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega diff --git a/rtd_phosphonetx/gwtdev.gradle b/rtd_phosphonetx/gwtdev.gradle deleted file mode 100644 index 072841cf7be..00000000000 --- a/rtd_phosphonetx/gwtdev.gradle +++ /dev/null @@ -1,95 +0,0 @@ -configurations.create('gwt') -if (System.getProperty("openbis.development-build") != null) { - configurations.gwt { - transitive = false - } - - dependencies { - gwt 'reveregroup:gwt-image-loader:1.1.4', - 'google:gwt-dev:2.4', - 'google:gwt-user:2.4', - 'google:gwt-debug-panel:1.0', - 'sencha:gxt:2.2.5', - 'sis:sis-base:18.09.0', - 'fasterxml:jackson-annotations:2.9.10', - project(':common'), - project(path:':common', configuration: 'archives'), - project(path:':openbis_api'), - project(path:':openbis_api', configuration: 'archives'), - project(path:':openbis-common'), - project(path:':openbis-common', configuration: 'archives'), - project(path:':openbis'), - project(path:':openbis', configuration: 'archives'), - project(path:':rtd_phosphonetx', configuration: 'archives') - } -} - -task deleteGWT(type: Exec) { - executable "rm" - args "-rf", "${project.projectDir.absolutePath}/.gwt-cache", "${project.projectDir.absolutePath}/targets/www" -} - -task prepareGWT(type:Copy, dependsOn: [deleteGWT, compileJava]) { - from 'resource/server' - from files('../common/resource/server') { - exclude 'gwt.xml' - } - from file('../openbis/resource/server/bis-common.xml') - into 'targets/www/WEB-INF' - - from (project.configurations.runtime.files) { - into 'lib' - exclude 'cisd-cifex*' - exclude 'common-*' - exclude 'authentication-*' - exclude 'dbmigration-*' - exclude 'openbis-common-*' - exclude 'openbis_api-*' - exclude 'openbis-*' - exclude 'datastore_server-*' - } - - from ('source/java/service.properties') { - into 'classes' - } - - doLast { - file("targets/www/WEB-INF/gwt.xml").createNewFile() - } -} - -task compileGWTToTemp(type: JavaExec, dependsOn: prepareGWT) { - //inputs.source - sourceSets.main.java.srcDirs - inputs.dir sourceSets.main.output.resourcesDir - outputs.dir 'targets/www/gwt-temp' - - main = 'com.google.gwt.dev.Compiler' - maxHeapSize = '1024m' - classpath { - [ - sourceSets.main.java.srcDirs, - project(":openbis").sourceSets.main.java.srcDirs, - project(":openbis").sourceSets.main.output.resourcesDir, - project(":openbis").sourceSets.main.output.classesDirs, - project(":openbis").sourceSets.main.compileClasspath, - project(":common").sourceSets.main.java.srcDirs, - project(":openbis_api").sourceSets.main.java.srcDirs, - project(":rtd_phosphonetx").sourceSets.main.java.srcDirs, - project(":rtd_phosphonetx").sourceSets.main.output.resourcesDir, - configurations.gwt - ] - } - args = [ '-war', - 'targets/www/gwt-temp', - "ch.systemsx.cisd.openbis.plugin.proteomics.OpenBISSafari", - '-draftCompile', - '-style', 'PRETTY', - '-logLevel', 'INFO'] -} - -task compileGWT(type: Copy, dependsOn: compileGWTToTemp) { - from "targets/www/gwt-temp/ch.systemsx.cisd.openbis.plugin.proteomics.OpenBIS" - into "targets/www/openbis-test-proteomics" -} - diff --git a/rtd_phosphonetx/resource/dependency-structure.ddf b/rtd_phosphonetx/resource/dependency-structure.ddf deleted file mode 100644 index 5597c17019c..00000000000 --- a/rtd_phosphonetx/resource/dependency-structure.ddf +++ /dev/null @@ -1,50 +0,0 @@ -# -# -# -#show allResults - -{root} = ch.systemsx.cisd.openbis -{generic} = ${root}.generic -{proteomics} = ${root}.plugin.proteomics - -###################################################################### -# Check dependencies to openbis - -[etlserver] = ${root}.etlserver.proteomics.* -[private_openbis] = ${root}.* excluding [etlserver] ${root}.dss.generic.shared.* ${root}.generic.shared.* ${proteomics}.shared.* ${root}.common.* - -check sets [etlserver] - -check [etlserver] independentOf [private_openbis] - -###################################################################### -# Check plugin dependencies -# -[proteomics.client] = ${proteomics}.client.* -[proteomics.server] = ${proteomics}.server.* -[proteomics.shared] = ${proteomics}.shared.* -[other.client] = ${generic}.client.* ${root}.plugin.*.client excluding [proteomics.client] -[other.server] = ${generic}.server.* ${root}.plugin.*.server excluding [proteomics.server] - -check sets [proteomics.client] [proteomics.server] [proteomics.shared] - -layer proteomics.client-server = [proteomics.client] [proteomics.server] -layer proteomics.shared = [proteomics.shared] -check layeringOf proteomics.shared proteomics.client-server - -check [proteomics.client] independentOf [other.server] -check [proteomics.server] independentOf [other.client] - -###################################################################### -# Check API -# - -[api-shared] = ${root}.generic.shared.api.* ${proteomics}.shared.api.* -[api-client] = ${proteomics}.client.api.* -[everything-except-java] = * excluding java* *.annotation.* ch.systemsx.cisd.common.api.IRpcService -[everything-except-java-and-api-shared] = [everything-except-java] excluding [api-shared] ${root}.common.api.client.* ch.systemsx.cisd.common.api.retry.* - -check sets [api-shared] [api-client] - -check [api-shared] independentOf [everything-except-java] -check [api-client] independentOf [everything-except-java-and-api-shared] diff --git a/rtd_phosphonetx/resource/eclipse/Gradle Proteomics compile GWT.launch b/rtd_phosphonetx/resource/eclipse/Gradle Proteomics compile GWT.launch deleted file mode 100644 index 5be10595461..00000000000 --- a/rtd_phosphonetx/resource/eclipse/Gradle Proteomics compile GWT.launch +++ /dev/null @@ -1,6 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<launchConfiguration type="org.springsource.ide.eclipse.gradle.launch"> -<stringAttribute key="org.springsource.ide.eclipse.gradle.launch.PGM_ARGS" value="-Dopenbis.development-build=true"/> -<stringAttribute key="org.springsource.ide.eclipse.gradle.launch.PROJECT" value="gradle"/> -<stringAttribute key="org.springsource.ide.eclipse.gradle.launch.TASKTEXT" value=":rtd_phosphonetx:compileGWT "/> -</launchConfiguration> diff --git a/rtd_phosphonetx/resource/eclipse/Gradle Proteomics openBIS GWT Shell.launch b/rtd_phosphonetx/resource/eclipse/Gradle Proteomics openBIS GWT Shell.launch deleted file mode 100644 index 45a3c674d3d..00000000000 --- a/rtd_phosphonetx/resource/eclipse/Gradle Proteomics openBIS GWT Shell.launch +++ /dev/null @@ -1,37 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<launchConfiguration type="org.eclipse.jdt.launching.localJavaApplication"> -<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS"> -<listEntry value="/rtd_phosphonetx"/> -</listAttribute> -<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES"> -<listEntry value="4"/> -</listAttribute> -<booleanAttribute key="org.eclipse.debug.core.appendEnvironmentVariables" value="true"/> -<booleanAttribute key="org.eclipse.jdt.launching.ATTR_USE_START_ON_FIRST_THREAD" value="true"/> -<listAttribute key="org.eclipse.jdt.launching.CLASSPATH"> -<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry containerPath="org.eclipse.jdt.launching.JRE_CONTAINER" javaProject="rtd_phosphonetx" path="1" type="4"/> "/> -<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/libraries/gwt2.4/gwt-dev.jar" path="3" type="2"/> "/> -<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/authentication/targets/classes" path="3" type="2"/> "/> -<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/common/targets/classes" path="3" type="2"/> "/> -<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/datastore_server/targets/classes" path="3" type="2"/> "/> -<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/dbmigration/targets/classes" path="3" type="2"/> "/> -<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/openbis/targets/classes" path="3" type="2"/> "/> -<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/openbis_api/targets/classes" path="3" type="2"/> "/> -<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/openbis-common/targets/classes" path="3" type="2"/> "/> -<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/rtd_phosphonetx/targets/classes" path="3" type="2"/> "/> -<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/authentication/source/java" path="3" type="2"/> "/> -<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/common/source/java" path="3" type="2"/> "/> -<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/datastore_server/source/java" path="3" type="2"/> "/> -<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/dbmigration/source/java" path="3" type="2"/> "/> -<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/openbis/source/java" path="3" type="2"/> "/> -<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/openbis_api/source/java" path="3" type="2"/> "/> -<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/openbis-common/source/java" path="3" type="2"/> "/> -<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/rtd_phosphonetx/source/java" path="3" type="2"/> "/> -<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry id="org.eclipse.jdt.launching.classpathentry.defaultClasspath"> <memento exportedEntriesOnly="false" project="rtd_phosphonetx"/> </runtimeClasspathEntry> "/> -</listAttribute> -<booleanAttribute key="org.eclipse.jdt.launching.DEFAULT_CLASSPATH" value="false"/> -<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="com.google.gwt.dev.DevMode"/> -<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-startupUrl ch.systemsx.cisd.openbis.plugin.proteomics.OpenBIS/index.html ch.systemsx.cisd.openbis.plugin.proteomics.OpenBIS -war targets/www -logLevel WARN"/> -<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="rtd_phosphonetx"/> -<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Dpython.path=../libraries/jython/jython-lib -Dlog4j.configuration=../openbis/etc/log.xml -Djavax.net.ssl.trustStore=../openbis/dist/server/openBIS.keystore -Dorg.mortbay.util.FileResource.checkAliases=false -Xmx2048m -XX:MaxPermSize=512m -ea"/> -</launchConfiguration> diff --git a/rtd_phosphonetx/resource/eclipse/Gradle Proteomics prepare GWT.launch b/rtd_phosphonetx/resource/eclipse/Gradle Proteomics prepare GWT.launch deleted file mode 100644 index 52ab66e7968..00000000000 --- a/rtd_phosphonetx/resource/eclipse/Gradle Proteomics prepare GWT.launch +++ /dev/null @@ -1,6 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<launchConfiguration type="org.springsource.ide.eclipse.gradle.launch"> -<stringAttribute key="org.springsource.ide.eclipse.gradle.launch.PGM_ARGS" value="-Dopenbis.development-build=true"/> -<stringAttribute key="org.springsource.ide.eclipse.gradle.launch.PROJECT" value="gradle"/> -<stringAttribute key="org.springsource.ide.eclipse.gradle.launch.TASKTEXT" value=":rtd_phosphonetx:prepareGWT "/> -</launchConfiguration> diff --git a/rtd_phosphonetx/resource/eclipse/Proteomics openBIS GWT Shell.launch b/rtd_phosphonetx/resource/eclipse/Proteomics openBIS GWT Shell.launch deleted file mode 100644 index 047a0d656b2..00000000000 --- a/rtd_phosphonetx/resource/eclipse/Proteomics openBIS GWT Shell.launch +++ /dev/null @@ -1,22 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<launchConfiguration type="org.eclipse.jdt.launching.localJavaApplication"> -<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS"> -<listEntry value="/rtd_phosphonetx"/> -</listAttribute> -<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES"> -<listEntry value="4"/> -</listAttribute> -<booleanAttribute key="org.eclipse.debug.core.appendEnvironmentVariables" value="true"/> -<listAttribute key="org.eclipse.jdt.launching.CLASSPATH"> -<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry containerPath="org.eclipse.jdt.launching.JRE_CONTAINER" javaProject="rtd_phosphonetx" path="1" type="4"/> "/> -<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/libraries/gwt2.4/gwt-dev.jar" path="3" type="2"/> "/> -<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry id="org.eclipse.jdt.launching.classpathentry.defaultClasspath"> <memento exportedEntriesOnly="false" project="rtd_phosphonetx"/> </runtimeClasspathEntry> "/> -<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/rtd_phosphonetx/source/java" path="3" type="2"/> "/> -<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/openbis/source/java" path="3" type="2"/> "/> -</listAttribute> -<booleanAttribute key="org.eclipse.jdt.launching.DEFAULT_CLASSPATH" value="false"/> -<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="com.google.gwt.dev.DevMode"/> -<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-startupUrl ch.systemsx.cisd.openbis.plugin.proteomics.OpenBIS/index.html ch.systemsx.cisd.openbis.plugin.proteomics.OpenBIS -war targets/www -logLevel WARN"/> -<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="rtd_phosphonetx"/> -<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Dpython.path=../libraries/jython/jython-lib -Dlog4j.configuration=../openbis/etc/log.xml -Djavax.net.ssl.trustStore=../openbis/dist/server/openBIS.keystore -Dorg.mortbay.util.FileResource.checkAliases=false -Xmx2048m -XX:MaxPermSize=512m -ea"/> -</launchConfiguration> diff --git a/rtd_phosphonetx/resource/eclipse/phosphonetx Data Store Server.launch b/rtd_phosphonetx/resource/eclipse/phosphonetx Data Store Server.launch deleted file mode 100644 index 258a7dbb822..00000000000 --- a/rtd_phosphonetx/resource/eclipse/phosphonetx Data Store Server.launch +++ /dev/null @@ -1,13 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<launchConfiguration type="org.eclipse.jdt.launching.localJavaApplication"> -<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS"> -<listEntry value="/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/DataStoreServer.java"/> -</listAttribute> -<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES"> -<listEntry value="1"/> -</listAttribute> -<booleanAttribute key="org.eclipse.debug.core.appendEnvironmentVariables" value="true"/> -<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="ch.systemsx.cisd.openbis.dss.generic.DataStoreServer"/> -<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="rtd_phosphonetx"/> -<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-ea"/> -</launchConfiguration> diff --git a/rtd_phosphonetx/resource/server/spring-servlet.xml b/rtd_phosphonetx/resource/server/spring-servlet.xml deleted file mode 100644 index c209198e6c1..00000000000 --- a/rtd_phosphonetx/resource/server/spring-servlet.xml +++ /dev/null @@ -1,38 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<beans xmlns="http://www.springframework.org/schema/beans" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xmlns:tx="http://www.springframework.org/schema/tx" - xmlns:context="http://www.springframework.org/schema/context" - xsi:schemaLocation=" - http://www.springframework.org/schema/beans - http://www.springframework.org/schema/beans/spring-beans-2.5.xsd - http://www.springframework.org/schema/tx - http://www.springframework.org/schema/tx/spring-tx-2.5.xsd - http://www.springframework.org/schema/context - http://www.springframework.org/schema/context/spring-context-2.5.xsd"> - - <!-- - // Note: obviously it is not possible to have a mix of 'urlMappings' and annotated configuration. - --> - <context:annotation-config /> - - <context:component-scan base-package="ch.systemsx.cisd.openbis" use-default-filters="false"> - <context:include-filter type="annotation" - expression="org.springframework.stereotype.Controller" /> - </context:component-scan> - - <context:component-scan base-package="ch.ethz.sis.openbis" use-default-filters="false"> - <context:include-filter type="annotation" - expression="org.springframework.stereotype.Controller" /> - </context:component-scan> - - <!-- - // Commons-based implementation of the MultipartResolver interface. - // Needs 'commons-fileupload' library. - --> - <bean id="multipartResolver" - class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> - <!-- Default is 10240 (10kB). Set to 1MB (1048576). --> - <property name="maxInMemorySize" value="1048576" /> - </bean> -</beans> diff --git a/rtd_phosphonetx/resource/server/web.xml b/rtd_phosphonetx/resource/server/web.xml deleted file mode 100644 index 89daa03c6f5..00000000000 --- a/rtd_phosphonetx/resource/server/web.xml +++ /dev/null @@ -1,30 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE web-app [ - <!ENTITY common SYSTEM "web-common.xml"> - <!ENTITY biscommon SYSTEM "bis-common.xml"> -]> -<web-app> - - <display-name>openBIS</display-name> - <description>openBIS server</description> - - &common; - - <context-param> - <param-name>contextConfigLocation</param-name> - <param-value>classpath:proteomics-applicationContext.xml</param-value> - <description>File for Spring beans.</description> - </context-param> - - <context-param> - <param-name>infoClass</param-name> - <param-value>ch.systemsx.cisd.openbis.plugin.proteomics.BuildAndEnvironmentInfo</param-value> - </context-param> - - &biscommon; - - <!-- - // Additional servlets - --> - -</web-app> diff --git a/rtd_phosphonetx/settings.gradle b/rtd_phosphonetx/settings.gradle deleted file mode 100644 index 33440dae995..00000000000 --- a/rtd_phosphonetx/settings.gradle +++ /dev/null @@ -1 +0,0 @@ -includeFlat 'commonbase', 'common', 'openbis_api', 'openbis-common', 'authentication', 'dbmigration', 'openbis', 'datastore_server' diff --git a/rtd_phosphonetx/source/core-plugins/core-plugins.properties b/rtd_phosphonetx/source/core-plugins/core-plugins.properties deleted file mode 100644 index 5da5ded3e0b..00000000000 --- a/rtd_phosphonetx/source/core-plugins/core-plugins.properties +++ /dev/null @@ -1,16 +0,0 @@ -# -# Properties for enabling/disabling core plugins -# - -# -# List of comma-separated regular expressions. If a technology (i.e. module) from the core plugins -# folder is matching one of these regular expressions it is enabled. -# By default all technologies are disabled. -# -enabled-modules = proteomics, dev-.* - -# -# List of comma-separated full core plugin names (or prefixes) of core plugins to be disabled -# even though they are in an enabled technology. -# -#disabled-core-plugins = \ No newline at end of file diff --git a/rtd_phosphonetx/source/core-plugins/dev-demo/1/dss/reporting-plugins/demo-proteomics-aggregation/plugin.properties b/rtd_phosphonetx/source/core-plugins/dev-demo/1/dss/reporting-plugins/demo-proteomics-aggregation/plugin.properties deleted file mode 100644 index ca456755976..00000000000 --- a/rtd_phosphonetx/source/core-plugins/dev-demo/1/dss/reporting-plugins/demo-proteomics-aggregation/plugin.properties +++ /dev/null @@ -1,3 +0,0 @@ -label = Demo Proteomics Aggregation -class = ch.systemsx.cisd.openbis.dss.generic.server.plugins.jython.JythonAggregationService -script-path = script.py \ No newline at end of file diff --git a/rtd_phosphonetx/source/core-plugins/dev-demo/1/dss/reporting-plugins/demo-proteomics-aggregation/script.py b/rtd_phosphonetx/source/core-plugins/dev-demo/1/dss/reporting-plugins/demo-proteomics-aggregation/script.py deleted file mode 100644 index d9b0b260950..00000000000 --- a/rtd_phosphonetx/source/core-plugins/dev-demo/1/dss/reporting-plugins/demo-proteomics-aggregation/script.py +++ /dev/null @@ -1,122 +0,0 @@ -from java.util import ArrayList -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchSubCriteria -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria import MatchClause -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria import MatchClauseAttribute -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria import SearchOperator - -BIO_EXPERIMENT = "Biological Experiment" -BIO_SAMPLE = "Biological Sample" -MS_SAMPLE = "MS Injection Sample" -SEARCH_EXPERIMENT = "Search Experiment" -SEARCH_EXPERIMENT_PERM_ID = "Search Experiment Perm ID" -ACCESION_NUMBER = "Accession Number" -DESCRIPTION = "Protein Description" - -def countFiles(node): - sum = 1 - if node.isDirectory(): - for child in node.getChildNodes(): - sum = sum + countFiles(child) - return sum - - -def gatherExperimentsAndSamples(space): - bioSample2ExperimentDict = {} - msInjectionSample2bioSamplesDict = {} - searchExperiment2msInjectionSamplesDict = {} - searchExperimentsByPermIdDict = {} - searchCriteria = SearchCriteria() - subCriteria = SearchCriteria() - subCriteria.addMatchClause(MatchClause.createAttributeMatch(MatchClauseAttribute.TYPE, "BIO*")) - searchCriteria.addSubCriteria(SearchSubCriteria.createExperimentCriteria(subCriteria)) - bioSamples = searchService.searchForSamples(searchCriteria) - searchCriteria = SearchCriteria() - searchCriteria.addMatchClause(MatchClause.createAttributeMatch(MatchClauseAttribute.TYPE, "MS_INJECTION")) - subCriteria = SearchCriteria() - subCriteria.operator = SearchOperator.MATCH_ANY_CLAUSES - for sample in bioSamples: - if space == sample.space: - bioSample2ExperimentDict[sample.sampleIdentifier] = sample.experiment.experimentIdentifier - subCriteria.addMatchClause(MatchClause.createAttributeMatch(MatchClauseAttribute.CODE, sample.code)) - - if len(bioSample2ExperimentDict) > 0: - searchCriteria.addSubCriteria(SearchSubCriteria.createSampleParentCriteria(subCriteria)) - msInjectionSamples = searchService.searchForSamples(searchCriteria) - if len(msInjectionSamples) > 0: - searchCriteria = SearchCriteria() - searchCriteria.addMatchClause(MatchClause.createAttributeMatch(MatchClauseAttribute.TYPE, "SEARCH")) - subCriteria = SearchCriteria() - subCriteria.operator = SearchOperator.MATCH_ANY_CLAUSES - for sample in msInjectionSamples: - msInjectionSample2bioSamplesDict[sample.sampleIdentifier] = sample.parentSampleIdentifiers - subCriteria.addMatchClause(MatchClause.createAttributeMatch(MatchClauseAttribute.CODE, sample.code)) - searchCriteria.addSubCriteria(SearchSubCriteria.createSampleParentCriteria(subCriteria)) - searchSamples = searchService.searchForSamples(searchCriteria) - for sample in searchSamples: - experiment = sample.experiment - searchExperimentsByPermIdDict[experiment.permId] = experiment - expId = experiment.experimentIdentifier - for msInjectionSample in sample.parentSampleIdentifiers: - if expId in searchExperiment2msInjectionSamplesDict: - searchExperiment2msInjectionSamplesDict[expId].append(msInjectionSample) - else: - searchExperiment2msInjectionSamplesDict[expId] = [msInjectionSample] - return bioSample2ExperimentDict, msInjectionSample2bioSamplesDict, \ - searchExperiment2msInjectionSamplesDict, searchExperimentsByPermIdDict - -def createPermIdList(searchExperimentsByPermIdDict): - permIds = "" - for exp in searchExperimentsByPermIdDict.values(): - if len(permIds) > 0: - permIds = permIds + ", " - permIds = permIds + "'" + exp.permId + "'" - return permIds - -def aggregate(parameters, tableBuilder): - space = parameters.get('space').upper() - bioSample2ExperimentDict, msInjectionSample2bioSamplesDict, \ - searchExperiment2msInjectionSamplesDict, searchExperimentsByPermIdDict \ - = gatherExperimentsAndSamples(space) - - tableBuilder.addHeader(BIO_EXPERIMENT) - tableBuilder.addHeader(BIO_SAMPLE) - tableBuilder.addHeader(MS_SAMPLE) - tableBuilder.addHeader(SEARCH_EXPERIMENT) - tableBuilder.addHeader(SEARCH_EXPERIMENT_PERM_ID) - tableBuilder.addHeader(ACCESION_NUMBER) - tableBuilder.addHeader(DESCRIPTION) - if len(searchExperimentsByPermIdDict) == 0: - return - protein = '%' + parameters.get('protein') + '%' - permIds = createPermIdList(searchExperimentsByPermIdDict) - result = queryService.select("proteomics-db", - """select e.perm_id, accession_number, description - from experiments as e join data_sets as d on d.expe_id = e.id - join proteins as p on p.dase_id = d.id - join identified_proteins as ip on ip.prot_id = p.id - join sequences as s on ip.sequ_id = s.id - join protein_references as pr on s.prre_id = pr.id - where e.perm_id in (""" - + permIds + - """) and (accession_number like ?{1} or description like ?{1}) - order by perm_id""", - [protein]) - for resultRow in result: - permId = resultRow.get('perm_id') - if (permId in searchExperimentsByPermIdDict): - experiment = searchExperimentsByPermIdDict[permId] - expId = experiment.experimentIdentifier - msInjectionSamples = searchExperiment2msInjectionSamplesDict[expId] - for msInjectionSample in msInjectionSamples: - bioSamples = msInjectionSample2bioSamplesDict[msInjectionSample] - for bioSample in bioSamples: - bioExperiment = bioSample2ExperimentDict[bioSample] - row = tableBuilder.addRow() - row.setCell(BIO_EXPERIMENT, bioExperiment) - row.setCell(BIO_SAMPLE, bioSample) - row.setCell(MS_SAMPLE, msInjectionSample) - row.setCell(SEARCH_EXPERIMENT, expId) - row.setCell(SEARCH_EXPERIMENT_PERM_ID, permId) - row.setCell(ACCESION_NUMBER, resultRow.get('accession_number')) - row.setCell(DESCRIPTION, resultRow.get('description')) diff --git a/rtd_phosphonetx/source/core-plugins/proteomics-optional/1/as/initialize-master-data.py b/rtd_phosphonetx/source/core-plugins/proteomics-optional/1/as/initialize-master-data.py deleted file mode 100644 index 0b4de321b86..00000000000 --- a/rtd_phosphonetx/source/core-plugins/proteomics-optional/1/as/initialize-master-data.py +++ /dev/null @@ -1,81 +0,0 @@ -import ch.systemsx.cisd.openbis.generic.server.jython.api.v1.DataType as DataType - -tr = service.transaction() - -file_type_HTML = tr.getOrCreateNewFileFormatType('HTML') -file_type_HTML.setDescription('HTML File') - -file_type_MZDATA = tr.getOrCreateNewFileFormatType('MZDATA') -file_type_MZDATA.setDescription('Mass spectrometry data format.') - -file_type_MZML = tr.getOrCreateNewFileFormatType('MZML') -file_type_MZML.setDescription('Mass spectrometry data format. \ -Unifiying mzXML and mzData formats, as released at the \ -2008 American Society for Mass Spectrometry Meeting.') - -file_type_MZXML = tr.getOrCreateNewFileFormatType('MZXML') -file_type_MZXML.setDescription('Mass spectrometry data format.') - -file_type_RAW = tr.getOrCreateNewFileFormatType('RAW') -file_type_RAW.setDescription('Proprietary file format for Thermo mass sepectrometry data.') - -file_type_TGZ = tr.getOrCreateNewFileFormatType('TGZ') -file_type_TGZ.setDescription('gzipped tar') - -file_type_WIFF = tr.getOrCreateNewFileFormatType('WIFF') -file_type_WIFF.setDescription('Proprieatry file format for Sciex and Agilent mass spectrometry data.') - -file_type_ZIP = tr.getOrCreateNewFileFormatType('ZIP') -file_type_ZIP.setDescription('A zipped package') - -vocabulary_TREATMENT_TYPE = tr.getOrCreateNewVocabulary('TREATMENT_TYPE') - -vocabulary_term_TREATMENT_TYPE_PH = tr.createNewVocabularyTerm('PH') -vocabulary_term_TREATMENT_TYPE_PH.setDescription(None) -vocabulary_term_TREATMENT_TYPE_PH.setUrl(None) -vocabulary_term_TREATMENT_TYPE_PH.setLabel('ph') -vocabulary_term_TREATMENT_TYPE_PH.setOrdinal(1) -vocabulary_TREATMENT_TYPE.addTerm(vocabulary_term_TREATMENT_TYPE_PH) - -exp_type_BIOLOGICAL_EXPERIMENT = tr.getOrCreateNewExperimentType('BIOLOGICAL_EXPERIMENT') -exp_type_BIOLOGICAL_EXPERIMENT.setDescription('A biological experiment') - -exp_type_MS_INJECT = tr.getOrCreateNewExperimentType('MS_INJECT') -exp_type_MS_INJECT.setDescription('MS injection experiment') - -exp_type_MS_QUANTIFICATION = tr.getOrCreateNewExperimentType('MS_QUANTIFICATION') -exp_type_MS_QUANTIFICATION.setDescription('Quantification of LC-MS data') - -data_set_type_MZXML_DATA = tr.getOrCreateNewDataSetType('MZXML_DATA') -data_set_type_MZXML_DATA.setDescription('standardized format for ms data') - -data_set_type_RAW_DATA = tr.getOrCreateNewDataSetType('RAW_DATA') -data_set_type_RAW_DATA.setDescription(None) - -prop_type_PARENTDATASETCODES = tr.getOrCreateNewPropertyType('PARENT-DATA-SET-CODES', DataType.VARCHAR) -prop_type_PARENTDATASETCODES.setLabel('Parent Dataset Codes') -prop_type_PARENTDATASETCODES.setManagedInternally(False) -prop_type_PARENTDATASETCODES.setInternalNamespace(False) - -prop_type_TREATMENT_TYPE1 = tr.getOrCreateNewPropertyType('TREATMENT_TYPE1', DataType.CONTROLLEDVOCABULARY) -prop_type_TREATMENT_TYPE1.setLabel('Treatment Type 1') -prop_type_TREATMENT_TYPE1.setManagedInternally(False) -prop_type_TREATMENT_TYPE1.setInternalNamespace(False) - -prop_type_TREATMENT_TYPE1.setVocabulary(vocabulary_TREATMENT_TYPE) - -prop_type_TREATMENT_TYPE2 = tr.getOrCreateNewPropertyType('TREATMENT_TYPE2', DataType.CONTROLLEDVOCABULARY) -prop_type_TREATMENT_TYPE2.setLabel('Treatment Type 2') -prop_type_TREATMENT_TYPE2.setManagedInternally(False) -prop_type_TREATMENT_TYPE2.setInternalNamespace(False) - -prop_type_TREATMENT_TYPE2.setVocabulary(vocabulary_TREATMENT_TYPE) - -prop_type_TREATMENT_TYPE3 = tr.getOrCreateNewPropertyType('TREATMENT_TYPE3', DataType.CONTROLLEDVOCABULARY) -prop_type_TREATMENT_TYPE3.setLabel('Treatment Type 3') -prop_type_TREATMENT_TYPE3.setManagedInternally(False) -prop_type_TREATMENT_TYPE3.setInternalNamespace(False) - -prop_type_TREATMENT_TYPE3.setVocabulary(vocabulary_TREATMENT_TYPE) - - diff --git a/rtd_phosphonetx/source/core-plugins/proteomics-optional/package-to-dist b/rtd_phosphonetx/source/core-plugins/proteomics-optional/package-to-dist deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/rtd_phosphonetx/source/core-plugins/proteomics/1/as/dss-data-sources/DSS1/plugin.properties b/rtd_phosphonetx/source/core-plugins/proteomics/1/as/dss-data-sources/DSS1/plugin.properties deleted file mode 100644 index eb43003949a..00000000000 --- a/rtd_phosphonetx/source/core-plugins/proteomics/1/as/dss-data-sources/DSS1/plugin.properties +++ /dev/null @@ -1,17 +0,0 @@ -# -# Data Store Server data source for the database storing protein identification and quantification results. -# -# Variables: -# proteomics-basic-database-name -# First part of the database name. Default value is 'proteomics'. -# proteomics-database-kind -# Second part of the database name. Default value is 'productive'. -# proteomics-database-owner -# Owner of the proteomics database. Default value is an empty string (i.e. the user starting up DSS). -# proteomics-database-password -# Password of the owner of the proteomics database. Default value is an empty string. -# -database-driver = org.postgresql.Driver -database-url = jdbc:postgresql://localhost/${proteomics-basic-database-name:proteomics}_${proteomics-database-kind:productive} -atabase-username = ${proteomics-database-owner:} -database-password = ${proteomics-database-password:} diff --git a/rtd_phosphonetx/source/core-plugins/proteomics/1/as/initialize-master-data.py b/rtd_phosphonetx/source/core-plugins/proteomics/1/as/initialize-master-data.py deleted file mode 100644 index 1825b0950e3..00000000000 --- a/rtd_phosphonetx/source/core-plugins/proteomics/1/as/initialize-master-data.py +++ /dev/null @@ -1,42 +0,0 @@ -import ch.systemsx.cisd.openbis.generic.server.jython.api.v1.DataType as DataType - -tr = service.transaction() - -vocabulary_TREATMENT_TYPE = tr.getOrCreateNewVocabulary('TREATMENT_TYPE') -vocabulary_TREATMENT_TYPE.setDescription('Type of treatment of a biological sample.') -vocabulary_TREATMENT_TYPE.setUrlTemplate(None) -vocabulary_TREATMENT_TYPE.setManagedInternally(False) -vocabulary_TREATMENT_TYPE.setInternalNamespace(False) -vocabulary_TREATMENT_TYPE.setChosenFromList(True) - -prop_type_NOT_PROCESSED = tr.getOrCreateNewPropertyType('NOT_PROCESSED', DataType.VARCHAR) -prop_type_NOT_PROCESSED.setLabel('Not Processed') -prop_type_NOT_PROCESSED.setDescription('Reason why prot.xml file has not been processed.') -prop_type_NOT_PROCESSED.setManagedInternally(False) -prop_type_NOT_PROCESSED.setInternalNamespace(False) - -exp_type_MS_SEARCH = tr.getOrCreateNewExperimentType('MS_SEARCH') -exp_type_MS_SEARCH.setDescription('MS_SEARCH experiment') - -assignment_MS_SEARCH_NOT_PROCESSED = tr.assignPropertyType(exp_type_MS_SEARCH, prop_type_NOT_PROCESSED) -assignment_MS_SEARCH_NOT_PROCESSED.setMandatory(False) -assignment_MS_SEARCH_NOT_PROCESSED.setSection(None) -assignment_MS_SEARCH_NOT_PROCESSED.setPositionInForms(1) - -samp_type_MS_INJECTION = tr.getOrCreateNewSampleType('MS_INJECTION') -samp_type_MS_INJECTION.setDescription('injection of a biological sample into a MS') -samp_type_MS_INJECTION.setListable(True) -samp_type_MS_INJECTION.setSubcodeUnique(False) -samp_type_MS_INJECTION.setAutoGeneratedCode(False) -samp_type_MS_INJECTION.setGeneratedCodePrefix('S') - -samp_type_SEARCH = tr.getOrCreateNewSampleType('SEARCH') -samp_type_SEARCH.setDescription('pointer to an MS_INJECTION sample used as placeholder for searches') -samp_type_SEARCH.setListable(True) -samp_type_SEARCH.setSubcodeUnique(False) -samp_type_SEARCH.setAutoGeneratedCode(False) -samp_type_SEARCH.setGeneratedCodePrefix('S') - -data_set_type_PROT_RESULT = tr.getOrCreateNewDataSetType('PROT_RESULT') -data_set_type_PROT_RESULT.setDescription('protXML file') - diff --git a/rtd_phosphonetx/source/core-plugins/proteomics/1/as/miscellaneous/proteomics-application/plugin.properties b/rtd_phosphonetx/source/core-plugins/proteomics/1/as/miscellaneous/proteomics-application/plugin.properties deleted file mode 100644 index 6d34ded45d3..00000000000 --- a/rtd_phosphonetx/source/core-plugins/proteomics/1/as/miscellaneous/proteomics-application/plugin.properties +++ /dev/null @@ -1 +0,0 @@ -proteomics-application-context-required = true diff --git a/rtd_phosphonetx/source/core-plugins/proteomics/1/dss/data-sources/proteomics-db/plugin.properties b/rtd_phosphonetx/source/core-plugins/proteomics/1/dss/data-sources/proteomics-db/plugin.properties deleted file mode 100644 index 664b20a45a8..00000000000 --- a/rtd_phosphonetx/source/core-plugins/proteomics/1/dss/data-sources/proteomics-db/plugin.properties +++ /dev/null @@ -1,25 +0,0 @@ -# -# Data source for the database storing protein identification and quantification results. -# -# Variables: -# proteomics-database.url-host-part -# The host and optionally port. Default is 'localhost'. -# proteomics-basic-database-name -# First part of the database name. Default value is 'proteomics'. -# proteomics-database-kind -# Second part of the database name. Default value is 'productive'. -# proteomics-sql-root-folder -# Path to root folder of SQL scripts. Default value is an empty string. -# proteomics-database-owner -# Owner of the proteomics database. Default value is an empty string (i.e. the user starting up DSS). -# proteomics-database-password -# Password of the owner of the proteomics database. Default value is an empty string. -# -version-holder-class = ch.systemsx.cisd.openbis.etlserver.proteomics.DatabaseVersionHolder -databaseEngineCode = postgresql -urlHostPart = ${proteomics-database.url-host-part:localhost} -basicDatabaseName = ${proteomics-basic-database-name:proteomics} -databaseKind = ${proteomics-database-kind:productive} -scriptFolder = ${proteomics-sql-root-folder:}sql/proteomics -owner = ${proteomics-database-owner:} -password = ${proteomics-database-password:} \ No newline at end of file diff --git a/rtd_phosphonetx/source/core-plugins/proteomics/1/dss/drop-boxes/ms-injection/plugin.properties b/rtd_phosphonetx/source/core-plugins/proteomics/1/dss/drop-boxes/ms-injection/plugin.properties deleted file mode 100644 index bff82ed31c5..00000000000 --- a/rtd_phosphonetx/source/core-plugins/proteomics/1/dss/drop-boxes/ms-injection/plugin.properties +++ /dev/null @@ -1,18 +0,0 @@ -# -# Drop box for MS spectra data. -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/incoming-ms-injection - -# Determines when the incoming data should be considered complete and ready to be processed. -# Allowed values: -# - auto-detection - when no write access will be detected for a specified 'quite-period' -# - marker-file - when an appropriate marker file for the data exists. -# The default value is 'marker-file'. -incoming-data-completeness-condition = auto-detection - -data-set-info-extractor = ch.systemsx.cisd.openbis.etlserver.proteomics.DataSetInfoExtractorForMSInjection -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor -type-extractor = ch.systemsx.cisd.openbis.etlserver.proteomics.TypeExtractorForMSInjection diff --git a/rtd_phosphonetx/source/core-plugins/proteomics/1/dss/drop-boxes/ms-search/plugin.properties b/rtd_phosphonetx/source/core-plugins/proteomics/1/dss/drop-boxes/ms-search/plugin.properties deleted file mode 100644 index da2bca2bce8..00000000000 --- a/rtd_phosphonetx/source/core-plugins/proteomics/1/dss/drop-boxes/ms-search/plugin.properties +++ /dev/null @@ -1,29 +0,0 @@ -# -# Drop box for protein identification and quantification data. -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -# -# This drop box assumes that data source 'proteomics-db' has been defined. -# -incoming-dir = ${incoming-root-dir}/incoming-ms-search - -incoming-data-completeness-condition = auto-detection - -data-set-info-extractor = ch.systemsx.cisd.openbis.etlserver.proteomics.DataSetInfoExtractorForProteinResults -data-set-info-extractor.separator = + - -type-extractor = ch.systemsx.cisd.etlserver.SimpleTypeExtractor -type-extractor.file-format-type = XML -type-extractor.locator-type = RELATIVE_LOCATION -type-extractor.data-set-type = PROT_RESULT -type-extractor.is-measured = false - -storage-processor = ch.systemsx.cisd.openbis.etlserver.proteomics.StorageProcessorWithResultDataSetUploader -storage-processor.processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor -storage-processor.assuming-extended-prot-xml = false -storage-processor.database.basic-name = ${proteomics-db.basicDatabaseName} -storage-processor.database.kind = ${proteomics-db.databaseKind} -storage-processor.database.owner = ${proteomics-db.owner} -storage-processor.database.password = ${proteomics-db.password} diff --git a/rtd_phosphonetx/source/core-plugins/proteomics/1/dss/maintenance-tasks/proteomics-db-clean-up/plugin.properties b/rtd_phosphonetx/source/core-plugins/proteomics/1/dss/maintenance-tasks/proteomics-db-clean-up/plugin.properties deleted file mode 100644 index 36cd4bae6c2..00000000000 --- a/rtd_phosphonetx/source/core-plugins/proteomics/1/dss/maintenance-tasks/proteomics-db-clean-up/plugin.properties +++ /dev/null @@ -1,8 +0,0 @@ -# -# Maintenance task which does a database clean up by deleting all data sets deleted in application server. -# This task assumes that data source 'proteomics-db' has been defined. -# -class = ch.systemsx.cisd.etlserver.plugins.DeleteFromExternalDBMaintenanceTask -interval = 300 -data-source = proteomics-db -data-set-table-name = data_sets diff --git a/rtd_phosphonetx/source/core-plugins/proteomics/package-to-dist b/rtd_phosphonetx/source/core-plugins/proteomics/package-to-dist deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/rtd_phosphonetx/source/html/demoapp/body-style.css b/rtd_phosphonetx/source/html/demoapp/body-style.css deleted file mode 100644 index 7a5324bef86..00000000000 --- a/rtd_phosphonetx/source/html/demoapp/body-style.css +++ /dev/null @@ -1,14 +0,0 @@ -body { font: 12px "Verdana", sans-serif; } - -h1 { font: 16px; } -h3 { font: 12px; } - -div#vis { padding-top: 10px;} -div#vis div { padding-top: 2px;} - -.headers { background-color: #eee; } - -div#vis tr:nth-child(even) { background-color: #EEE; } -div#vis tr:nth-child(odd) { background-color: white; } - -#main form { padding-top: 10px;} diff --git a/rtd_phosphonetx/source/html/demoapp/button.css b/rtd_phosphonetx/source/html/demoapp/button.css deleted file mode 100644 index b0c9944b189..00000000000 --- a/rtd_phosphonetx/source/html/demoapp/button.css +++ /dev/null @@ -1,52 +0,0 @@ -button { - font: 14px "Trebuchet MS"; - background-color: #222; - background-image: -moz-linear-gradient(top, rgba(255,255,255,.25), rgba(255,255,255,.11)); - background-image: -webkit-gradient(linear,left top,left bottom,color-stop(0, rgba(255,255,255,.25)),color-stop(1, rgba(255,255,255,.11))); - background-image: -webkit-linear-gradient(rgba(255,255,255,.25), rgba(255,255,255,.11)); - color: #fff; - text-rendering: optimizeLegibility; - text-shadow: 0 -1px 1px #222; - padding: 3px 5px 3px 5px; - border: 0; - border-radius: 0; - border-bottom: 1px solid #222; - margin: 0; - -moz-box-shadow: 0 1px 3px #999; - -webkit-box-shadow: 0 1px 3px #999; - box-shadow: 0 1px 3px #999; -} - -button.first { - border-top-left-radius: 5px; - border-bottom-left-radius: 5px; -} - -button.last { - border-top-right-radius: 5px; - border-bottom-right-radius: 5px; -} - -button.active { - background-color: rgb(65,102,133); -} - -button:hover { - background-color: steelblue; -} - -input { - font: 14px "Trebuchet MS"; - background-image: -moz-linear-gradient(top, rgba(255,255,255,.25), rgba(255,255,255,.11)); - background-image: -webkit-gradient(linear,left top,left bottom,color-stop(0, rgba(255,255,255,.25)),color-stop(1, rgba(255,255,255,.11))); - background-image: -webkit-linear-gradient(rgba(255,255,255,.5), rgba(255,255,255,.1)); - color: #000; - text-rendering: optimizeLegibility; - padding: 3px 5px 3px 5px; - border: 0; - border-radius: 0; - margin: 0; - -moz-box-shadow: 0 1px 3px #999; - -webkit-box-shadow: 0 1px 3px #999; - box-shadow: 0 1px 3px #999; -} \ No newline at end of file diff --git a/rtd_phosphonetx/source/html/demoapp/d3.js b/rtd_phosphonetx/source/html/demoapp/d3.js deleted file mode 100755 index 13abb6dbc6f..00000000000 --- a/rtd_phosphonetx/source/html/demoapp/d3.js +++ /dev/null @@ -1,4013 +0,0 @@ -(function(){if (!Date.now) Date.now = function() { - return +new Date; -}; -try { - document.createElement("div").style.setProperty("opacity", 0, ""); -} catch (error) { - var d3_style_prototype = CSSStyleDeclaration.prototype, - d3_style_setProperty = d3_style_prototype.setProperty; - d3_style_prototype.setProperty = function(name, value, priority) { - d3_style_setProperty.call(this, name, value + "", priority); - }; -} -d3 = {version: "2.1.3"}; // semver -var d3_arraySubclass = [].__proto__? - -// Until ECMAScript supports array subclassing, prototype injection works well. -function(array, prototype) { - array.__proto__ = prototype; -}: - -// And if your browser doesn't support __proto__, we'll use direct extension. -function(array, prototype) { - for (var property in prototype) array[property] = prototype[property]; -}; -function d3_this() { - return this; -} -d3.functor = function(v) { - return typeof v === "function" ? v : function() { return v; }; -}; -// A getter-setter method that preserves the appropriate `this` context. -d3.rebind = function(object, method) { - return function() { - var x = method.apply(object, arguments); - return arguments.length ? object : x; - }; -}; -d3.ascending = function(a, b) { - return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN; -}; -d3.descending = function(a, b) { - return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN; -}; -d3.min = function(array, f) { - var i = -1, - n = array.length, - a, - b; - if (arguments.length === 1) { - while (++i < n && ((a = array[i]) == null || a != a)) a = undefined; - while (++i < n) if ((b = array[i]) != null && a > b) a = b; - } else { - while (++i < n && ((a = f.call(array, array[i], i)) == null || a != a)) a = undefined; - while (++i < n) if ((b = f.call(array, array[i], i)) != null && a > b) a = b; - } - return a; -}; -d3.max = function(array, f) { - var i = -1, - n = array.length, - a, - b; - if (arguments.length === 1) { - while (++i < n && ((a = array[i]) == null || a != a)) a = undefined; - while (++i < n) if ((b = array[i]) != null && b > a) a = b; - } else { - while (++i < n && ((a = f.call(array, array[i], i)) == null || a != a)) a = undefined; - while (++i < n) if ((b = f.call(array, array[i], i)) != null && b > a) a = b; - } - return a; -}; -d3.sum = function(array, f) { - var s = 0, - n = array.length, - a, - i = -1; - - if (arguments.length === 1) { - while (++i < n) if (!isNaN(a = +array[i])) s += a; - } else { - while (++i < n) if (!isNaN(a = +f.call(array, array[i], i))) s += a; - } - - return s; -}; -// R-7 per <http://en.wikipedia.org/wiki/Quantile> -d3.quantile = function(values, p) { - var H = (values.length - 1) * p + 1, - h = Math.floor(H), - v = values[h - 1], - e = H - h; - return e ? v + e * (values[h] - v) : v; -}; -d3.zip = function() { - if (!(n = arguments.length)) return []; - for (var i = -1, m = d3.min(arguments, d3_zipLength), zips = new Array(m); ++i < m;) { - for (var j = -1, n, zip = zips[i] = new Array(n); ++j < n;) { - zip[j] = arguments[j][i]; - } - } - return zips; -}; - -function d3_zipLength(d) { - return d.length; -} -// Locate the insertion point for x in a to maintain sorted order. The -// arguments lo and hi may be used to specify a subset of the array which should -// be considered; by default the entire array is used. If x is already present -// in a, the insertion point will be before (to the left of) any existing -// entries. The return value is suitable for use as the first argument to -// `array.splice` assuming that a is already sorted. -// -// The returned insertion point i partitions the array a into two halves so that -// all v < x for v in a[lo:i] for the left side and all v >= x for v in a[i:hi] -// for the right side. -d3.bisectLeft = function(a, x, lo, hi) { - if (arguments.length < 3) lo = 0; - if (arguments.length < 4) hi = a.length; - while (lo < hi) { - var mid = (lo + hi) >> 1; - if (a[mid] < x) lo = mid + 1; - else hi = mid; - } - return lo; -}; - -// Similar to bisectLeft, but returns an insertion point which comes after (to -// the right of) any existing entries of x in a. -// -// The returned insertion point i partitions the array into two halves so that -// all v <= x for v in a[lo:i] for the left side and all v > x for v in a[i:hi] -// for the right side. -d3.bisect = -d3.bisectRight = function(a, x, lo, hi) { - if (arguments.length < 3) lo = 0; - if (arguments.length < 4) hi = a.length; - while (lo < hi) { - var mid = (lo + hi) >> 1; - if (x < a[mid]) hi = mid; - else lo = mid + 1; - } - return lo; -}; -d3.first = function(array, f) { - var i = 0, - n = array.length, - a = array[0], - b; - if (arguments.length === 1) f = d3.ascending; - while (++i < n) { - if (f.call(array, a, b = array[i]) > 0) { - a = b; - } - } - return a; -}; -d3.last = function(array, f) { - var i = 0, - n = array.length, - a = array[0], - b; - if (arguments.length === 1) f = d3.ascending; - while (++i < n) { - if (f.call(array, a, b = array[i]) <= 0) { - a = b; - } - } - return a; -}; -d3.nest = function() { - var nest = {}, - keys = [], - sortKeys = [], - sortValues, - rollup; - - function map(array, depth) { - if (depth >= keys.length) return rollup - ? rollup.call(nest, array) : (sortValues - ? array.sort(sortValues) - : array); - - var i = -1, - n = array.length, - key = keys[depth++], - keyValue, - object, - o = {}; - - while (++i < n) { - if ((keyValue = key(object = array[i])) in o) { - o[keyValue].push(object); - } else { - o[keyValue] = [object]; - } - } - - for (keyValue in o) { - o[keyValue] = map(o[keyValue], depth); - } - - return o; - } - - function entries(map, depth) { - if (depth >= keys.length) return map; - - var a = [], - sortKey = sortKeys[depth++], - key; - - for (key in map) { - a.push({key: key, values: entries(map[key], depth)}); - } - - if (sortKey) a.sort(function(a, b) { - return sortKey(a.key, b.key); - }); - - return a; - } - - nest.map = function(array) { - return map(array, 0); - }; - - nest.entries = function(array) { - return entries(map(array, 0), 0); - }; - - nest.key = function(d) { - keys.push(d); - return nest; - }; - - // Specifies the order for the most-recently specified key. - // Note: only applies to entries. Map keys are unordered! - nest.sortKeys = function(order) { - sortKeys[keys.length - 1] = order; - return nest; - }; - - // Specifies the order for leaf values. - // Applies to both maps and entries array. - nest.sortValues = function(order) { - sortValues = order; - return nest; - }; - - nest.rollup = function(f) { - rollup = f; - return nest; - }; - - return nest; -}; -d3.keys = function(map) { - var keys = []; - for (var key in map) keys.push(key); - return keys; -}; -d3.values = function(map) { - var values = []; - for (var key in map) values.push(map[key]); - return values; -}; -d3.entries = function(map) { - var entries = []; - for (var key in map) entries.push({key: key, value: map[key]}); - return entries; -}; -d3.permute = function(array, indexes) { - var permutes = [], - i = -1, - n = indexes.length; - while (++i < n) permutes[i] = array[indexes[i]]; - return permutes; -}; -d3.merge = function(arrays) { - return Array.prototype.concat.apply([], arrays); -}; -d3.split = function(array, f) { - var arrays = [], - values = [], - value, - i = -1, - n = array.length; - if (arguments.length < 2) f = d3_splitter; - while (++i < n) { - if (f.call(values, value = array[i], i)) { - values = []; - } else { - if (!values.length) arrays.push(values); - values.push(value); - } - } - return arrays; -}; - -function d3_splitter(d) { - return d == null; -} -function d3_collapse(s) { - return s.replace(/(^\s+)|(\s+$)/g, "").replace(/\s+/g, " "); -} -/** - * @param {number} start - * @param {number=} stop - * @param {number=} step - */ -d3.range = function(start, stop, step) { - if (arguments.length < 3) { - step = 1; - if (arguments.length < 2) { - stop = start; - start = 0; - } - } - if ((stop - start) / step == Infinity) throw new Error("infinite range"); - var range = [], - i = -1, - j; - if (step < 0) while ((j = start + step * ++i) > stop) range.push(j); - else while ((j = start + step * ++i) < stop) range.push(j); - return range; -}; -d3.requote = function(s) { - return s.replace(d3_requote_re, "\\$&"); -}; - -var d3_requote_re = /[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g; -d3.round = function(x, n) { - return n - ? Math.round(x * Math.pow(10, n)) * Math.pow(10, -n) - : Math.round(x); -}; -d3.xhr = function(url, mime, callback) { - var req = new XMLHttpRequest; - if (arguments.length < 3) callback = mime; - else if (mime && req.overrideMimeType) req.overrideMimeType(mime); - req.open("GET", url, true); - req.onreadystatechange = function() { - if (req.readyState === 4) callback(req.status < 300 ? req : null); - }; - req.send(null); -}; -d3.text = function(url, mime, callback) { - function ready(req) { - callback(req && req.responseText); - } - if (arguments.length < 3) { - callback = mime; - mime = null; - } - d3.xhr(url, mime, ready); -}; -d3.json = function(url, callback) { - d3.text(url, "application/json", function(text) { - callback(text ? JSON.parse(text) : null); - }); -}; -d3.html = function(url, callback) { - d3.text(url, "text/html", function(text) { - if (text != null) { // Treat empty string as valid HTML. - var range = document.createRange(); - range.selectNode(document.body); - text = range.createContextualFragment(text); - } - callback(text); - }); -}; -d3.xml = function(url, mime, callback) { - function ready(req) { - callback(req && req.responseXML); - } - if (arguments.length < 3) { - callback = mime; - mime = null; - } - d3.xhr(url, mime, ready); -}; -d3.ns = { - - prefix: { - svg: "http://www.w3.org/2000/svg", - xhtml: "http://www.w3.org/1999/xhtml", - xlink: "http://www.w3.org/1999/xlink", - xml: "http://www.w3.org/XML/1998/namespace", - xmlns: "http://www.w3.org/2000/xmlns/" - }, - - qualify: function(name) { - var i = name.indexOf(":"); - return i < 0 ? name : { - space: d3.ns.prefix[name.substring(0, i)], - local: name.substring(i + 1) - }; - } - -}; -/** @param {...string} types */ -d3.dispatch = function(types) { - var dispatch = {}, - type; - for (var i = 0, n = arguments.length; i < n; i++) { - type = arguments[i]; - dispatch[type] = d3_dispatch(type); - } - return dispatch; -}; - -function d3_dispatch(type) { - var dispatch = {}, - listeners = []; - - dispatch.add = function(listener) { - for (var i = 0; i < listeners.length; i++) { - if (listeners[i].listener == listener) return dispatch; // already registered - } - listeners.push({listener: listener, on: true}); - return dispatch; - }; - - dispatch.remove = function(listener) { - for (var i = 0; i < listeners.length; i++) { - var l = listeners[i]; - if (l.listener == listener) { - l.on = false; - listeners = listeners.slice(0, i).concat(listeners.slice(i + 1)); - break; - } - } - return dispatch; - }; - - dispatch.dispatch = function() { - var ls = listeners; // defensive reference - for (var i = 0, n = ls.length; i < n; i++) { - var l = ls[i]; - if (l.on) l.listener.apply(this, arguments); - } - }; - - return dispatch; -}; -// TODO align -d3.format = function(specifier) { - var match = d3_format_re.exec(specifier), - fill = match[1] || " ", - sign = match[3] || "", - zfill = match[5], - width = +match[6], - comma = match[7], - precision = match[8], - type = match[9], - percentage = false, - integer = false; - - if (precision) precision = precision.substring(1); - - if (zfill) { - fill = "0"; // TODO align = "="; - if (comma) width -= Math.floor((width - 1) / 4); - } - - switch (type) { - case "n": comma = true; type = "g"; break; - case "%": percentage = true; type = "f"; break; - case "p": percentage = true; type = "r"; break; - case "d": integer = true; precision = "0"; break; - } - - type = d3_format_types[type] || d3_format_typeDefault; - - return function(value) { - var number = percentage ? value * 100 : +value, - negative = (number < 0) && (number = -number) ? "\u2212" : sign; - - // Return the empty string for floats formatted as ints. - if (integer && (number % 1)) return ""; - - // Convert the input value to the desired precision. - value = type(number, precision); - - // If the fill character is 0, the sign and group is applied after the fill. - if (zfill) { - var length = value.length + negative.length; - if (length < width) value = new Array(width - length + 1).join(fill) + value; - if (comma) value = d3_format_group(value); - value = negative + value; - } - - // Otherwise (e.g., space-filling), the sign and group is applied before. - else { - if (comma) value = d3_format_group(value); - value = negative + value; - var length = value.length; - if (length < width) value = new Array(width - length + 1).join(fill) + value; - } - if (percentage) value += "%"; - - return value; - }; -}; - -// [[fill]align][sign][#][0][width][,][.precision][type] -var d3_format_re = /(?:([^{])?([<>=^]))?([+\- ])?(#)?(0)?([0-9]+)?(,)?(\.[0-9]+)?([a-zA-Z%])?/; - -var d3_format_types = { - g: function(x, p) { return x.toPrecision(p); }, - e: function(x, p) { return x.toExponential(p); }, - f: function(x, p) { return x.toFixed(p); }, - r: function(x, p) { - var n = 1 + Math.floor(1e-15 + Math.log(x) / Math.LN10); - return d3.round(x, p - n).toFixed(Math.max(0, Math.min(20, p - n))); - } -}; - -function d3_format_typeDefault(x) { - return x + ""; -} - -// Apply comma grouping for thousands. -function d3_format_group(value) { - var i = value.lastIndexOf("."), - f = i >= 0 ? value.substring(i) : (i = value.length, ""), - t = []; - while (i > 0) t.push(value.substring(i -= 3, i + 3)); - return t.reverse().join(",") + f; -} -/* - * TERMS OF USE - EASING EQUATIONS - * - * Open source under the BSD License. - * - * Copyright 2001 Robert Penner - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * - Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * - Neither the name of the author nor the names of contributors may be used to - * endorse or promote products derived from this software without specific - * prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -var d3_ease_quad = d3_ease_poly(2), - d3_ease_cubic = d3_ease_poly(3); - -var d3_ease = { - linear: function() { return d3_ease_linear; }, - poly: d3_ease_poly, - quad: function() { return d3_ease_quad; }, - cubic: function() { return d3_ease_cubic; }, - sin: function() { return d3_ease_sin; }, - exp: function() { return d3_ease_exp; }, - circle: function() { return d3_ease_circle; }, - elastic: d3_ease_elastic, - back: d3_ease_back, - bounce: function() { return d3_ease_bounce; } -}; - -var d3_ease_mode = { - "in": function(f) { return f; }, - "out": d3_ease_reverse, - "in-out": d3_ease_reflect, - "out-in": function(f) { return d3_ease_reflect(d3_ease_reverse(f)); } -}; - -d3.ease = function(name) { - var i = name.indexOf("-"), - t = i >= 0 ? name.substring(0, i) : name, - m = i >= 0 ? name.substring(i + 1) : "in"; - return d3_ease_clamp(d3_ease_mode[m](d3_ease[t].apply(null, Array.prototype.slice.call(arguments, 1)))); -}; - -function d3_ease_clamp(f) { - return function(t) { - return t <= 0 ? 0 : t >= 1 ? 1 : f(t); - }; -} - -function d3_ease_reverse(f) { - return function(t) { - return 1 - f(1 - t); - }; -} - -function d3_ease_reflect(f) { - return function(t) { - return .5 * (t < .5 ? f(2 * t) : (2 - f(2 - 2 * t))); - }; -} - -function d3_ease_linear(t) { - return t; -} - -function d3_ease_poly(e) { - return function(t) { - return Math.pow(t, e); - } -} - -function d3_ease_sin(t) { - return 1 - Math.cos(t * Math.PI / 2); -} - -function d3_ease_exp(t) { - return Math.pow(2, 10 * (t - 1)); -} - -function d3_ease_circle(t) { - return 1 - Math.sqrt(1 - t * t); -} - -function d3_ease_elastic(a, p) { - var s; - if (arguments.length < 2) p = 0.45; - if (arguments.length < 1) { a = 1; s = p / 4; } - else s = p / (2 * Math.PI) * Math.asin(1 / a); - return function(t) { - return 1 + a * Math.pow(2, 10 * -t) * Math.sin((t - s) * 2 * Math.PI / p); - }; -} - -function d3_ease_back(s) { - if (!s) s = 1.70158; - return function(t) { - return t * t * ((s + 1) * t - s); - }; -} - -function d3_ease_bounce(t) { - return t < 1 / 2.75 ? 7.5625 * t * t - : t < 2 / 2.75 ? 7.5625 * (t -= 1.5 / 2.75) * t + .75 - : t < 2.5 / 2.75 ? 7.5625 * (t -= 2.25 / 2.75) * t + .9375 - : 7.5625 * (t -= 2.625 / 2.75) * t + .984375; -} -d3.event = null; -d3.interpolate = function(a, b) { - var i = d3.interpolators.length, f; - while (--i >= 0 && !(f = d3.interpolators[i](a, b))); - return f; -}; - -d3.interpolateNumber = function(a, b) { - b -= a; - return function(t) { return a + b * t; }; -}; - -d3.interpolateRound = function(a, b) { - b -= a; - return function(t) { return Math.round(a + b * t); }; -}; - -d3.interpolateString = function(a, b) { - var m, // current match - i, // current index - j, // current index (for coallescing) - s0 = 0, // start index of current string prefix - s1 = 0, // end index of current string prefix - s = [], // string constants and placeholders - q = [], // number interpolators - n, // q.length - o; - - // Reset our regular expression! - d3_interpolate_number.lastIndex = 0; - - // Find all numbers in b. - for (i = 0; m = d3_interpolate_number.exec(b); ++i) { - if (m.index) s.push(b.substring(s0, s1 = m.index)); - q.push({i: s.length, x: m[0]}); - s.push(null); - s0 = d3_interpolate_number.lastIndex; - } - if (s0 < b.length) s.push(b.substring(s0)); - - // Find all numbers in a. - for (i = 0, n = q.length; (m = d3_interpolate_number.exec(a)) && i < n; ++i) { - o = q[i]; - if (o.x == m[0]) { // The numbers match, so coallesce. - if (o.i) { - if (s[o.i + 1] == null) { // This match is followed by another number. - s[o.i - 1] += o.x; - s.splice(o.i, 1); - for (j = i + 1; j < n; ++j) q[j].i--; - } else { // This match is followed by a string, so coallesce twice. - s[o.i - 1] += o.x + s[o.i + 1]; - s.splice(o.i, 2); - for (j = i + 1; j < n; ++j) q[j].i -= 2; - } - } else { - if (s[o.i + 1] == null) { // This match is followed by another number. - s[o.i] = o.x; - } else { // This match is followed by a string, so coallesce twice. - s[o.i] = o.x + s[o.i + 1]; - s.splice(o.i + 1, 1); - for (j = i + 1; j < n; ++j) q[j].i--; - } - } - q.splice(i, 1); - n--; - i--; - } else { - o.x = d3.interpolateNumber(parseFloat(m[0]), parseFloat(o.x)); - } - } - - // Remove any numbers in b not found in a. - while (i < n) { - o = q.pop(); - if (s[o.i + 1] == null) { // This match is followed by another number. - s[o.i] = o.x; - } else { // This match is followed by a string, so coallesce twice. - s[o.i] = o.x + s[o.i + 1]; - s.splice(o.i + 1, 1); - } - n--; - } - - // Special optimization for only a single match. - if (s.length === 1) { - return s[0] == null ? q[0].x : function() { return b; }; - } - - // Otherwise, interpolate each of the numbers and rejoin the string. - return function(t) { - for (i = 0; i < n; ++i) s[(o = q[i]).i] = o.x(t); - return s.join(""); - }; -}; - -d3.interpolateRgb = function(a, b) { - a = d3.rgb(a); - b = d3.rgb(b); - var ar = a.r, - ag = a.g, - ab = a.b, - br = b.r - ar, - bg = b.g - ag, - bb = b.b - ab; - return function(t) { - return "rgb(" + Math.round(ar + br * t) - + "," + Math.round(ag + bg * t) - + "," + Math.round(ab + bb * t) - + ")"; - }; -}; - -// interpolates HSL space, but outputs RGB string (for compatibility) -d3.interpolateHsl = function(a, b) { - a = d3.hsl(a); - b = d3.hsl(b); - var h0 = a.h, - s0 = a.s, - l0 = a.l, - h1 = b.h - h0, - s1 = b.s - s0, - l1 = b.l - l0; - return function(t) { - return d3_hsl_rgb(h0 + h1 * t, s0 + s1 * t, l0 + l1 * t).toString(); - }; -}; - -d3.interpolateArray = function(a, b) { - var x = [], - c = [], - na = a.length, - nb = b.length, - n0 = Math.min(a.length, b.length), - i; - for (i = 0; i < n0; ++i) x.push(d3.interpolate(a[i], b[i])); - for (; i < na; ++i) c[i] = a[i]; - for (; i < nb; ++i) c[i] = b[i]; - return function(t) { - for (i = 0; i < n0; ++i) c[i] = x[i](t); - return c; - }; -}; - -d3.interpolateObject = function(a, b) { - var i = {}, - c = {}, - k; - for (k in a) { - if (k in b) { - i[k] = d3_interpolateByName(k)(a[k], b[k]); - } else { - c[k] = a[k]; - } - } - for (k in b) { - if (!(k in a)) { - c[k] = b[k]; - } - } - return function(t) { - for (k in i) c[k] = i[k](t); - return c; - }; -} - -var d3_interpolate_number = /[-+]?(?:\d+\.\d+|\d+\.|\.\d+|\d+)(?:[eE][-]?\d+)?/g, - d3_interpolate_rgb = {background: 1, fill: 1, stroke: 1}; - -function d3_interpolateByName(n) { - return n in d3_interpolate_rgb || /\bcolor\b/.test(n) - ? d3.interpolateRgb - : d3.interpolate; -} - -d3.interpolators = [ - d3.interpolateObject, - function(a, b) { return (b instanceof Array) && d3.interpolateArray(a, b); }, - function(a, b) { return (typeof b === "string") && d3.interpolateString(String(a), b); }, - function(a, b) { return (typeof b === "string" ? b in d3_rgb_names || /^(#|rgb\(|hsl\()/.test(b) : b instanceof d3_Rgb || b instanceof d3_Hsl) && d3.interpolateRgb(String(a), b); }, - function(a, b) { return (typeof b === "number") && d3.interpolateNumber(+a, b); } -]; -function d3_uninterpolateNumber(a, b) { - b = b - (a = +a) ? 1 / (b - a) : 0; - return function(x) { return (x - a) * b; }; -} - -function d3_uninterpolateClamp(a, b) { - b = b - (a = +a) ? 1 / (b - a) : 0; - return function(x) { return Math.max(0, Math.min(1, (x - a) * b)); }; -} -d3.rgb = function(r, g, b) { - return arguments.length === 1 - ? d3_rgb_parse("" + r, d3_rgb, d3_hsl_rgb) - : d3_rgb(~~r, ~~g, ~~b); -}; - -function d3_rgb(r, g, b) { - return new d3_Rgb(r, g, b); -} - -function d3_Rgb(r, g, b) { - this.r = r; - this.g = g; - this.b = b; -} - -d3_Rgb.prototype.brighter = function(k) { - k = Math.pow(0.7, arguments.length ? k : 1); - var r = this.r, - g = this.g, - b = this.b, - i = 30; - if (!r && !g && !b) return d3_rgb(i, i, i); - if (r && r < i) r = i; - if (g && g < i) g = i; - if (b && b < i) b = i; - return d3_rgb( - Math.min(255, Math.floor(r / k)), - Math.min(255, Math.floor(g / k)), - Math.min(255, Math.floor(b / k))); -}; - -d3_Rgb.prototype.darker = function(k) { - k = Math.pow(0.7, arguments.length ? k : 1); - return d3_rgb( - Math.max(0, Math.floor(k * this.r)), - Math.max(0, Math.floor(k * this.g)), - Math.max(0, Math.floor(k * this.b))); -}; - -d3_Rgb.prototype.hsl = function() { - return d3_rgb_hsl(this.r, this.g, this.b); -}; - -d3_Rgb.prototype.toString = function() { - return "#" + d3_rgb_hex(this.r) + d3_rgb_hex(this.g) + d3_rgb_hex(this.b); -}; - -function d3_rgb_hex(v) { - return v < 0x10 ? "0" + v.toString(16) : v.toString(16); -} - -function d3_rgb_parse(format, rgb, hsl) { - var r = 0, // red channel; int in [0, 255] - g = 0, // green channel; int in [0, 255] - b = 0, // blue channel; int in [0, 255] - m1, // CSS color specification match - m2, // CSS color specification type (e.g., rgb) - name; - - /* Handle hsl, rgb. */ - m1 = /([a-z]+)\((.*)\)/i.exec(format); - if (m1) { - m2 = m1[2].split(","); - switch (m1[1]) { - case "hsl": { - return hsl( - parseFloat(m2[0]), // degrees - parseFloat(m2[1]) / 100, // percentage - parseFloat(m2[2]) / 100 // percentage - ); - } - case "rgb": { - return rgb( - d3_rgb_parseNumber(m2[0]), - d3_rgb_parseNumber(m2[1]), - d3_rgb_parseNumber(m2[2]) - ); - } - } - } - - /* Named colors. */ - if (name = d3_rgb_names[format]) return rgb(name.r, name.g, name.b); - - /* Hexadecimal colors: #rgb and #rrggbb. */ - if (format != null && format.charAt(0) === "#") { - if (format.length === 4) { - r = format.charAt(1); r += r; - g = format.charAt(2); g += g; - b = format.charAt(3); b += b; - } else if (format.length === 7) { - r = format.substring(1, 3); - g = format.substring(3, 5); - b = format.substring(5, 7); - } - r = parseInt(r, 16); - g = parseInt(g, 16); - b = parseInt(b, 16); - } - - return rgb(r, g, b); -} - -function d3_rgb_hsl(r, g, b) { - var min = Math.min(r /= 255, g /= 255, b /= 255), - max = Math.max(r, g, b), - d = max - min, - h, - s, - l = (max + min) / 2; - if (d) { - s = l < .5 ? d / (max + min) : d / (2 - max - min); - if (r == max) h = (g - b) / d + (g < b ? 6 : 0); - else if (g == max) h = (b - r) / d + 2; - else h = (r - g) / d + 4; - h *= 60; - } else { - s = h = 0; - } - return d3_hsl(h, s, l); -} - -function d3_rgb_parseNumber(c) { // either integer or percentage - var f = parseFloat(c); - return c.charAt(c.length - 1) === "%" ? Math.round(f * 2.55) : f; -} - -var d3_rgb_names = { - aliceblue: "#f0f8ff", - antiquewhite: "#faebd7", - aqua: "#00ffff", - aquamarine: "#7fffd4", - azure: "#f0ffff", - beige: "#f5f5dc", - bisque: "#ffe4c4", - black: "#000000", - blanchedalmond: "#ffebcd", - blue: "#0000ff", - blueviolet: "#8a2be2", - brown: "#a52a2a", - burlywood: "#deb887", - cadetblue: "#5f9ea0", - chartreuse: "#7fff00", - chocolate: "#d2691e", - coral: "#ff7f50", - cornflowerblue: "#6495ed", - cornsilk: "#fff8dc", - crimson: "#dc143c", - cyan: "#00ffff", - darkblue: "#00008b", - darkcyan: "#008b8b", - darkgoldenrod: "#b8860b", - darkgray: "#a9a9a9", - darkgreen: "#006400", - darkgrey: "#a9a9a9", - darkkhaki: "#bdb76b", - darkmagenta: "#8b008b", - darkolivegreen: "#556b2f", - darkorange: "#ff8c00", - darkorchid: "#9932cc", - darkred: "#8b0000", - darksalmon: "#e9967a", - darkseagreen: "#8fbc8f", - darkslateblue: "#483d8b", - darkslategray: "#2f4f4f", - darkslategrey: "#2f4f4f", - darkturquoise: "#00ced1", - darkviolet: "#9400d3", - deeppink: "#ff1493", - deepskyblue: "#00bfff", - dimgray: "#696969", - dimgrey: "#696969", - dodgerblue: "#1e90ff", - firebrick: "#b22222", - floralwhite: "#fffaf0", - forestgreen: "#228b22", - fuchsia: "#ff00ff", - gainsboro: "#dcdcdc", - ghostwhite: "#f8f8ff", - gold: "#ffd700", - goldenrod: "#daa520", - gray: "#808080", - green: "#008000", - greenyellow: "#adff2f", - grey: "#808080", - honeydew: "#f0fff0", - hotpink: "#ff69b4", - indianred: "#cd5c5c", - indigo: "#4b0082", - ivory: "#fffff0", - khaki: "#f0e68c", - lavender: "#e6e6fa", - lavenderblush: "#fff0f5", - lawngreen: "#7cfc00", - lemonchiffon: "#fffacd", - lightblue: "#add8e6", - lightcoral: "#f08080", - lightcyan: "#e0ffff", - lightgoldenrodyellow: "#fafad2", - lightgray: "#d3d3d3", - lightgreen: "#90ee90", - lightgrey: "#d3d3d3", - lightpink: "#ffb6c1", - lightsalmon: "#ffa07a", - lightseagreen: "#20b2aa", - lightskyblue: "#87cefa", - lightslategray: "#778899", - lightslategrey: "#778899", - lightsteelblue: "#b0c4de", - lightyellow: "#ffffe0", - lime: "#00ff00", - limegreen: "#32cd32", - linen: "#faf0e6", - magenta: "#ff00ff", - maroon: "#800000", - mediumaquamarine: "#66cdaa", - mediumblue: "#0000cd", - mediumorchid: "#ba55d3", - mediumpurple: "#9370db", - mediumseagreen: "#3cb371", - mediumslateblue: "#7b68ee", - mediumspringgreen: "#00fa9a", - mediumturquoise: "#48d1cc", - mediumvioletred: "#c71585", - midnightblue: "#191970", - mintcream: "#f5fffa", - mistyrose: "#ffe4e1", - moccasin: "#ffe4b5", - navajowhite: "#ffdead", - navy: "#000080", - oldlace: "#fdf5e6", - olive: "#808000", - olivedrab: "#6b8e23", - orange: "#ffa500", - orangered: "#ff4500", - orchid: "#da70d6", - palegoldenrod: "#eee8aa", - palegreen: "#98fb98", - paleturquoise: "#afeeee", - palevioletred: "#db7093", - papayawhip: "#ffefd5", - peachpuff: "#ffdab9", - peru: "#cd853f", - pink: "#ffc0cb", - plum: "#dda0dd", - powderblue: "#b0e0e6", - purple: "#800080", - red: "#ff0000", - rosybrown: "#bc8f8f", - royalblue: "#4169e1", - saddlebrown: "#8b4513", - salmon: "#fa8072", - sandybrown: "#f4a460", - seagreen: "#2e8b57", - seashell: "#fff5ee", - sienna: "#a0522d", - silver: "#c0c0c0", - skyblue: "#87ceeb", - slateblue: "#6a5acd", - slategray: "#708090", - slategrey: "#708090", - snow: "#fffafa", - springgreen: "#00ff7f", - steelblue: "#4682b4", - tan: "#d2b48c", - teal: "#008080", - thistle: "#d8bfd8", - tomato: "#ff6347", - turquoise: "#40e0d0", - violet: "#ee82ee", - wheat: "#f5deb3", - white: "#ffffff", - whitesmoke: "#f5f5f5", - yellow: "#ffff00", - yellowgreen: "#9acd32" -}; - -for (var d3_rgb_name in d3_rgb_names) { - d3_rgb_names[d3_rgb_name] = d3_rgb_parse( - d3_rgb_names[d3_rgb_name], - d3_rgb, - d3_hsl_rgb); -} -d3.hsl = function(h, s, l) { - return arguments.length === 1 - ? d3_rgb_parse("" + h, d3_rgb_hsl, d3_hsl) - : d3_hsl(+h, +s, +l); -}; - -function d3_hsl(h, s, l) { - return new d3_Hsl(h, s, l); -} - -function d3_Hsl(h, s, l) { - this.h = h; - this.s = s; - this.l = l; -} - -d3_Hsl.prototype.brighter = function(k) { - k = Math.pow(0.7, arguments.length ? k : 1); - return d3_hsl(this.h, this.s, this.l / k); -}; - -d3_Hsl.prototype.darker = function(k) { - k = Math.pow(0.7, arguments.length ? k : 1); - return d3_hsl(this.h, this.s, k * this.l); -}; - -d3_Hsl.prototype.rgb = function() { - return d3_hsl_rgb(this.h, this.s, this.l); -}; - -d3_Hsl.prototype.toString = function() { - return "hsl(" + this.h + "," + this.s * 100 + "%," + this.l * 100 + "%)"; -}; - -function d3_hsl_rgb(h, s, l) { - var m1, - m2; - - /* Some simple corrections for h, s and l. */ - h = h % 360; if (h < 0) h += 360; - s = s < 0 ? 0 : s > 1 ? 1 : s; - l = l < 0 ? 0 : l > 1 ? 1 : l; - - /* From FvD 13.37, CSS Color Module Level 3 */ - m2 = l <= .5 ? l * (1 + s) : l + s - l * s; - m1 = 2 * l - m2; - - function v(h) { - if (h > 360) h -= 360; - else if (h < 0) h += 360; - if (h < 60) return m1 + (m2 - m1) * h / 60; - if (h < 180) return m2; - if (h < 240) return m1 + (m2 - m1) * (240 - h) / 60; - return m1; - } - - function vv(h) { - return Math.round(v(h) * 255); - } - - return d3_rgb(vv(h + 120), vv(h), vv(h - 120)); -} -function d3_selection(groups) { - d3_arraySubclass(groups, d3_selectionPrototype); - return groups; -} - -var d3_select = function(s, n) { return n.querySelector(s); }, - d3_selectAll = function(s, n) { return n.querySelectorAll(s); }; - -// Prefer Sizzle, if available. -if (typeof Sizzle === "function") { - d3_select = function(s, n) { return Sizzle(s, n)[0]; }; - d3_selectAll = function(s, n) { return Sizzle.uniqueSort(Sizzle(s, n)); }; -} - -var d3_selectionPrototype = []; - -d3.selection = function() { - return d3_selectionRoot; -}; - -d3.selection.prototype = d3_selectionPrototype; -d3_selectionPrototype.select = function(selector) { - var subgroups = [], - subgroup, - subnode, - group, - node; - - if (typeof selector !== "function") selector = d3_selection_selector(selector); - - for (var j = -1, m = this.length; ++j < m;) { - subgroups.push(subgroup = []); - subgroup.parentNode = (group = this[j]).parentNode; - for (var i = -1, n = group.length; ++i < n;) { - if (node = group[i]) { - subgroup.push(subnode = selector.call(node, node.__data__, i)); - if (subnode && "__data__" in node) subnode.__data__ = node.__data__; - } else { - subgroup.push(null); - } - } - } - - return d3_selection(subgroups); -}; - -function d3_selection_selector(selector) { - return function() { - return d3_select(selector, this); - }; -} -d3_selectionPrototype.selectAll = function(selector) { - var subgroups = [], - subgroup, - node; - - if (typeof selector !== "function") selector = d3_selection_selectorAll(selector); - - for (var j = -1, m = this.length; ++j < m;) { - for (var group = this[j], i = -1, n = group.length; ++i < n;) { - if (node = group[i]) { - subgroups.push(subgroup = selector.call(node, node.__data__, i)); - subgroup.parentNode = node; - } - } - } - - return d3_selection(subgroups); -}; - -function d3_selection_selectorAll(selector) { - return function() { - return d3_selectAll(selector, this); - }; -} -d3_selectionPrototype.attr = function(name, value) { - name = d3.ns.qualify(name); - - // If no value is specified, return the first value. - if (arguments.length < 2) { - var node = this.node(); - return name.local - ? node.getAttributeNS(name.space, name.local) - : node.getAttribute(name); - } - - function attrNull() { - this.removeAttribute(name); - } - - function attrNullNS() { - this.removeAttributeNS(name.space, name.local); - } - - function attrConstant() { - this.setAttribute(name, value); - } - - function attrConstantNS() { - this.setAttributeNS(name.space, name.local, value); - } - - function attrFunction() { - var x = value.apply(this, arguments); - if (x == null) this.removeAttribute(name); - else this.setAttribute(name, x); - } - - function attrFunctionNS() { - var x = value.apply(this, arguments); - if (x == null) this.removeAttributeNS(name.space, name.local); - else this.setAttributeNS(name.space, name.local, x); - } - - return this.each(value == null - ? (name.local ? attrNullNS : attrNull) : (typeof value === "function" - ? (name.local ? attrFunctionNS : attrFunction) - : (name.local ? attrConstantNS : attrConstant))); -}; -d3_selectionPrototype.classed = function(name, value) { - var re = new RegExp("(^|\\s+)" + d3.requote(name) + "(\\s+|$)", "g"); - - // If no value is specified, return the first value. - if (arguments.length < 2) { - var node = this.node(); - if (c = node.classList) return c.contains(name); - var c = node.className; - re.lastIndex = 0; - return re.test(c.baseVal != null ? c.baseVal : c); - } - - function classedAdd() { - if (c = this.classList) return c.add(name); - var c = this.className, - cb = c.baseVal != null, - cv = cb ? c.baseVal : c; - re.lastIndex = 0; - if (!re.test(cv)) { - cv = d3_collapse(cv + " " + name); - if (cb) c.baseVal = cv; - else this.className = cv; - } - } - - function classedRemove() { - if (c = this.classList) return c.remove(name); - var c = this.className, - cb = c.baseVal != null, - cv = cb ? c.baseVal : c; - cv = d3_collapse(cv.replace(re, " ")); - if (cb) c.baseVal = cv; - else this.className = cv; - } - - function classedFunction() { - (value.apply(this, arguments) - ? classedAdd - : classedRemove).call(this); - } - - return this.each(typeof value === "function" - ? classedFunction : value - ? classedAdd - : classedRemove); -}; -d3_selectionPrototype.style = function(name, value, priority) { - if (arguments.length < 3) priority = ""; - - // If no value is specified, return the first value. - if (arguments.length < 2) return window - .getComputedStyle(this.node(), null) - .getPropertyValue(name); - - function styleNull() { - this.style.removeProperty(name); - } - - function styleConstant() { - this.style.setProperty(name, value, priority); - } - - function styleFunction() { - var x = value.apply(this, arguments); - if (x == null) this.style.removeProperty(name); - else this.style.setProperty(name, x, priority); - } - - return this.each(value == null - ? styleNull : (typeof value === "function" - ? styleFunction : styleConstant)); -}; -d3_selectionPrototype.property = function(name, value) { - - // If no value is specified, return the first value. - if (arguments.length < 2) return this.node()[name]; - - function propertyNull() { - delete this[name]; - } - - function propertyConstant() { - this[name] = value; - } - - function propertyFunction() { - var x = value.apply(this, arguments); - if (x == null) delete this[name]; - else this[name] = x; - } - - return this.each(value == null - ? propertyNull : (typeof value === "function" - ? propertyFunction : propertyConstant)); -}; -d3_selectionPrototype.text = function(value) { - return arguments.length < 1 ? this.node().textContent - : (this.each(typeof value === "function" - ? function() { this.textContent = value.apply(this, arguments); } - : function() { this.textContent = value; })); -}; -d3_selectionPrototype.html = function(value) { - return arguments.length < 1 ? this.node().innerHTML - : (this.each(typeof value === "function" - ? function() { this.innerHTML = value.apply(this, arguments); } - : function() { this.innerHTML = value; })); -}; -// TODO append(node)? -// TODO append(function)? -d3_selectionPrototype.append = function(name) { - name = d3.ns.qualify(name); - - function append() { - return this.appendChild(document.createElement(name)); - } - - function appendNS() { - return this.appendChild(document.createElementNS(name.space, name.local)); - } - - return this.select(name.local ? appendNS : append); -}; -// TODO insert(node, function)? -// TODO insert(function, string)? -// TODO insert(function, function)? -d3_selectionPrototype.insert = function(name, before) { - name = d3.ns.qualify(name); - - function insert() { - return this.insertBefore( - document.createElement(name), - d3_select(before, this)); - } - - function insertNS() { - return this.insertBefore( - document.createElementNS(name.space, name.local), - d3_select(before, this)); - } - - return this.select(name.local ? insertNS : insert); -}; -// TODO remove(selector)? -// TODO remove(node)? -// TODO remove(function)? -d3_selectionPrototype.remove = function() { - return this.each(function() { - var parent = this.parentNode; - if (parent) parent.removeChild(this); - }); -}; -// TODO data(null) for clearing data? -d3_selectionPrototype.data = function(data, join) { - var enter = [], - update = [], - exit = []; - - function bind(group, groupData) { - var i, - n = group.length, - m = groupData.length, - n0 = Math.min(n, m), - n1 = Math.max(n, m), - updateNodes = [], - enterNodes = [], - exitNodes = [], - node, - nodeData; - - if (join) { - var nodeByKey = {}, - keys = [], - key, - j = groupData.length; - - for (i = -1; ++i < n;) { - key = join.call(node = group[i], node.__data__, i); - if (key in nodeByKey) { - exitNodes[j++] = node; // duplicate key - } else { - nodeByKey[key] = node; - } - keys.push(key); - } - - for (i = -1; ++i < m;) { - node = nodeByKey[key = join.call(groupData, nodeData = groupData[i], i)]; - if (node) { - node.__data__ = nodeData; - updateNodes[i] = node; - enterNodes[i] = exitNodes[i] = null; - } else { - enterNodes[i] = d3_selection_dataNode(nodeData); - updateNodes[i] = exitNodes[i] = null; - } - delete nodeByKey[key]; - } - - for (i = -1; ++i < n;) { - if (keys[i] in nodeByKey) { - exitNodes[i] = group[i]; - } - } - } else { - for (i = -1; ++i < n0;) { - node = group[i]; - nodeData = groupData[i]; - if (node) { - node.__data__ = nodeData; - updateNodes[i] = node; - enterNodes[i] = exitNodes[i] = null; - } else { - enterNodes[i] = d3_selection_dataNode(nodeData); - updateNodes[i] = exitNodes[i] = null; - } - } - for (; i < m; ++i) { - enterNodes[i] = d3_selection_dataNode(groupData[i]); - updateNodes[i] = exitNodes[i] = null; - } - for (; i < n1; ++i) { - exitNodes[i] = group[i]; - enterNodes[i] = updateNodes[i] = null; - } - } - - enterNodes.update - = updateNodes; - - enterNodes.parentNode - = updateNodes.parentNode - = exitNodes.parentNode - = group.parentNode; - - enter.push(enterNodes); - update.push(updateNodes); - exit.push(exitNodes); - } - - var i = -1, - n = this.length, - group; - if (typeof data === "function") { - while (++i < n) { - bind(group = this[i], data.call(group, group.parentNode.__data__, i)); - } - } else { - while (++i < n) { - bind(group = this[i], data); - } - } - - var selection = d3_selection(update); - selection.enter = function() { return d3_selection_enter(enter); }; - selection.exit = function() { return d3_selection(exit); }; - return selection; -}; - -function d3_selection_dataNode(data) { - return {__data__: data}; -} -function d3_selection_enter(selection) { - d3_arraySubclass(selection, d3_selection_enterPrototype); - return selection; -} - -var d3_selection_enterPrototype = []; - -d3_selection_enterPrototype.append = d3_selectionPrototype.append; -d3_selection_enterPrototype.insert = d3_selectionPrototype.insert; -d3_selection_enterPrototype.empty = d3_selectionPrototype.empty; -d3_selection_enterPrototype.select = function(selector) { - var subgroups = [], - subgroup, - subnode, - upgroup, - group, - node; - - for (var j = -1, m = this.length; ++j < m;) { - upgroup = (group = this[j]).update; - subgroups.push(subgroup = []); - subgroup.parentNode = group.parentNode; - for (var i = -1, n = group.length; ++i < n;) { - if (node = group[i]) { - subgroup.push(upgroup[i] = subnode = selector.call(group.parentNode, node.__data__, i)); - subnode.__data__ = node.__data__; - } else { - subgroup.push(null); - } - } - } - - return d3_selection(subgroups); -}; -// TODO preserve null elements to maintain index? -d3_selectionPrototype.filter = function(filter) { - var subgroups = [], - subgroup, - group, - node; - - for (var j = 0, m = this.length; j < m; j++) { - subgroups.push(subgroup = []); - subgroup.parentNode = (group = this[j]).parentNode; - for (var i = 0, n = group.length; i < n; i++) { - if ((node = group[i]) && filter.call(node, node.__data__, i)) { - subgroup.push(node); - } - } - } - - return d3_selection(subgroups); -}; -d3_selectionPrototype.map = function(map) { - return this.each(function() { - this.__data__ = map.apply(this, arguments); - }); -}; -d3_selectionPrototype.sort = function(comparator) { - comparator = d3_selection_sortComparator.apply(this, arguments); - for (var j = 0, m = this.length; j < m; j++) { - for (var group = this[j].sort(comparator), i = 1, n = group.length, prev = group[0]; i < n; i++) { - var node = group[i]; - if (node) { - if (prev) prev.parentNode.insertBefore(node, prev.nextSibling); - prev = node; - } - } - } - return this; -}; - -function d3_selection_sortComparator(comparator) { - if (!arguments.length) comparator = d3.ascending; - return function(a, b) { - return comparator(a && a.__data__, b && b.__data__); - }; -} -// type can be namespaced, e.g., "click.foo" -// listener can be null for removal -d3_selectionPrototype.on = function(type, listener, capture) { - if (arguments.length < 3) capture = false; - - // parse the type specifier - var name = "__on" + type, i = type.indexOf("."); - if (i > 0) type = type.substring(0, i); - - // if called with only one argument, return the current listener - if (arguments.length < 2) return (i = this.node()[name]) && i._; - - // remove the old event listener, and add the new event listener - return this.each(function(d, i) { - var node = this; - - if (node[name]) node.removeEventListener(type, node[name], capture); - if (listener) node.addEventListener(type, node[name] = l, capture); - - // wrapped event listener that preserves i - function l(e) { - var o = d3.event; // Events can be reentrant (e.g., focus). - d3.event = e; - try { - listener.call(node, node.__data__, i); - } finally { - d3.event = o; - } - } - - // stash the unwrapped listener for retrieval - l._ = listener; - }); -}; -d3_selectionPrototype.each = function(callback) { - for (var j = -1, m = this.length; ++j < m;) { - for (var group = this[j], i = -1, n = group.length; ++i < n;) { - var node = group[i]; - if (node) callback.call(node, node.__data__, i, j); - } - } - return this; -}; -// -// Note: assigning to the arguments array simultaneously changes the value of -// the corresponding argument! -// -// TODO The `this` argument probably shouldn't be the first argument to the -// callback, anyway, since it's redundant. However, that will require a major -// version bump due to backwards compatibility, so I'm not changing it right -// away. -// -d3_selectionPrototype.call = function(callback) { - callback.apply(this, (arguments[0] = this, arguments)); - return this; -}; -d3_selectionPrototype.empty = function() { - return !this.node(); -}; -d3_selectionPrototype.node = function(callback) { - for (var j = 0, m = this.length; j < m; j++) { - for (var group = this[j], i = 0, n = group.length; i < n; i++) { - var node = group[i]; - if (node) return node; - } - } - return null; -}; -d3_selectionPrototype.transition = function() { - var subgroups = [], - subgroup, - node; - - for (var j = -1, m = this.length; ++j < m;) { - subgroups.push(subgroup = []); - for (var group = this[j], i = -1, n = group.length; ++i < n;) { - subgroup.push((node = group[i]) ? {node: node, delay: 0, duration: 250} : null); - } - } - - return d3_transition(subgroups, d3_transitionInheritId || ++d3_transitionId); -}; -var d3_selectionRoot = d3_selection([[document]]); - -d3_selectionRoot[0].parentNode = document.documentElement; - -// TODO fast singleton implementation! -d3.select = function(selector) { - return typeof selector === "string" - ? d3_selectionRoot.select(selector) - : d3_selection([[selector]]); // assume node -}; - -d3.selectAll = function(selector) { - return typeof selector === "string" - ? d3_selectionRoot.selectAll(selector) - : d3_selection([selector]); // assume node[] -}; -function d3_transition(groups, id) { - d3_arraySubclass(groups, d3_transitionPrototype); - - var tweens = {}, - event = d3.dispatch("start", "end"), - ease = d3_transitionEase, - then = Date.now(); - - groups.id = id; - - groups.tween = function(name, tween) { - if (arguments.length < 2) return tweens[name]; - if (tween == null) delete tweens[name]; - else tweens[name] = tween; - return groups; - }; - - groups.ease = function(value) { - if (!arguments.length) return ease; - ease = typeof value === "function" ? value : d3.ease.apply(d3, arguments); - return groups; - }; - - groups.each = function(type, listener) { - if (arguments.length < 2) return d3_transition_each.call(groups, type); - event[type].add(listener); - return groups; - }; - - d3.timer(function(elapsed) { - groups.each(function(d, i, j) { - var tweened = [], - node = this, - delay = groups[j][i].delay, - duration = groups[j][i].duration, - lock = node.__transition__ || (node.__transition__ = {active: 0, count: 0}); - - ++lock.count; - - delay <= elapsed ? start(elapsed) : d3.timer(start, delay, then); - - function start(elapsed) { - if (lock.active > id) return stop(); - lock.active = id; - - for (var tween in tweens) { - if (tween = tweens[tween].call(node, d, i)) { - tweened.push(tween); - } - } - - event.start.dispatch.call(node, d, i); - if (!tick(elapsed)) d3.timer(tick, 0, then); - return 1; - } - - function tick(elapsed) { - if (lock.active !== id) return stop(); - - var t = (elapsed - delay) / duration, - e = ease(t), - n = tweened.length; - - while (n > 0) { - tweened[--n].call(node, e); - } - - if (t >= 1) { - stop(); - d3_transitionInheritId = id; - event.end.dispatch.call(node, d, i); - d3_transitionInheritId = 0; - return 1; - } - } - - function stop() { - if (!--lock.count) delete node.__transition__; - return 1; - } - }); - return 1; - }, 0, then); - - return groups; -} - -function d3_transitionTween(b) { - return typeof b === "function" - ? function(d, i, a) { var v = b.call(this, d, i) + ""; return a != v && d3.interpolate(a, v); } - : (b = b + "", function(d, i, a) { return a != b && d3.interpolate(a, b); }); -} - -var d3_transitionPrototype = [], - d3_transitionId = 0, - d3_transitionInheritId = 0, - d3_transitionEase = d3.ease("cubic-in-out"); - -d3_transitionPrototype.call = d3_selectionPrototype.call; - -d3.transition = function() { - return d3_selectionRoot.transition(); -}; - -d3.transition.prototype = d3_transitionPrototype; -d3_transitionPrototype.select = function(selector) { - var subgroups = [], - subgroup, - subnode, - node; - - if (typeof selector !== "function") selector = d3_selection_selector(selector); - - for (var j = -1, m = this.length; ++j < m;) { - subgroups.push(subgroup = []); - for (var group = this[j], i = -1, n = group.length; ++i < n;) { - if ((node = group[i]) && (subnode = selector.call(node.node, node.node.__data__, i))) { - if ("__data__" in node.node) subnode.__data__ = node.node.__data__; - subgroup.push({node: subnode, delay: node.delay, duration: node.duration}); - } else { - subgroup.push(null); - } - } - } - - return d3_transition(subgroups, this.id).ease(this.ease()); -}; -d3_transitionPrototype.selectAll = function(selector) { - var subgroups = [], - subgroup, - node; - - if (typeof selector !== "function") selector = d3_selection_selectorAll(selector); - - for (var j = -1, m = this.length; ++j < m;) { - for (var group = this[j], i = -1, n = group.length; ++i < n;) { - if (node = group[i]) { - subgroups.push(subgroup = selector.call(node.node, node.node.__data__, i)); - for (var k = -1, o = subgroup.length; ++k < o;) { - subgroup[k] = {node: subgroup[k], delay: node.delay, duration: node.duration}; - } - } - } - } - - return d3_transition(subgroups, this.id).ease(this.ease()); -}; -d3_transitionPrototype.attr = function(name, value) { - return this.attrTween(name, d3_transitionTween(value)); -}; - -d3_transitionPrototype.attrTween = function(name, tween) { - name = d3.ns.qualify(name); - - function attrTween(d, i) { - var f = tween.call(this, d, i, this.getAttribute(name)); - return f && function(t) { - this.setAttribute(name, f(t)); - }; - } - - function attrTweenNS(d, i) { - var f = tween.call(this, d, i, this.getAttributeNS(name.space, name.local)); - return f && function(t) { - this.setAttributeNS(name.space, name.local, f(t)); - }; - } - - return this.tween("attr." + name, name.local ? attrTweenNS : attrTween); -}; -d3_transitionPrototype.style = function(name, value, priority) { - if (arguments.length < 3) priority = ""; - return this.styleTween(name, d3_transitionTween(value), priority); -}; - -d3_transitionPrototype.styleTween = function(name, tween, priority) { - if (arguments.length < 3) priority = ""; - return this.tween("style." + name, function(d, i) { - var f = tween.call(this, d, i, window.getComputedStyle(this, null).getPropertyValue(name)); - return f && function(t) { - this.style.setProperty(name, f(t), priority); - }; - }); -}; -d3_transitionPrototype.text = function(value) { - return this.tween("text", function(d, i) { - this.textContent = typeof value === "function" - ? value.call(this, d, i) - : value; - }); -}; -d3_transitionPrototype.remove = function() { - return this.each("end", function() { - var p; - if (!this.__transition__ && (p = this.parentNode)) p.removeChild(this); - }); -}; -d3_transitionPrototype.delay = function(value) { - var groups = this; - return groups.each(typeof value === "function" - ? function(d, i, j) { groups[j][i].delay = +value.apply(this, arguments); } - : (value = +value, function(d, i, j) { groups[j][i].delay = value; })); -}; -d3_transitionPrototype.duration = function(value) { - var groups = this; - return groups.each(typeof value === "function" - ? function(d, i, j) { groups[j][i].duration = +value.apply(this, arguments); } - : (value = +value, function(d, i, j) { groups[j][i].duration = value; })); -}; -function d3_transition_each(callback) { - for (var j = 0, m = this.length; j < m; j++) { - for (var group = this[j], i = 0, n = group.length; i < n; i++) { - var node = group[i]; - if (node) callback.call(node = node.node, node.__data__, i, j); - } - } - return this; -} -d3_transitionPrototype.transition = function() { - return this.select(d3_this); -}; -var d3_timer_queue = null, - d3_timer_interval, // is an interval (or frame) active? - d3_timer_timeout; // is a timeout active? - -// The timer will continue to fire until callback returns true. -d3.timer = function(callback, delay, then) { - var found = false, - t0, - t1 = d3_timer_queue; - - if (arguments.length < 3) { - if (arguments.length < 2) delay = 0; - else if (!isFinite(delay)) return; - then = Date.now(); - } - - // See if the callback's already in the queue. - while (t1) { - if (t1.callback === callback) { - t1.then = then; - t1.delay = delay; - found = true; - break; - } - t0 = t1; - t1 = t1.next; - } - - // Otherwise, add the callback to the queue. - if (!found) d3_timer_queue = { - callback: callback, - then: then, - delay: delay, - next: d3_timer_queue - }; - - // Start animatin'! - if (!d3_timer_interval) { - d3_timer_timeout = clearTimeout(d3_timer_timeout); - d3_timer_interval = 1; - d3_timer_frame(d3_timer_step); - } -} - -function d3_timer_step() { - var elapsed, - now = Date.now(), - t1 = d3_timer_queue; - - while (t1) { - elapsed = now - t1.then; - if (elapsed >= t1.delay) t1.flush = t1.callback(elapsed); - t1 = t1.next; - } - - var delay = d3_timer_flush() - now; - if (delay > 24) { - if (isFinite(delay)) { - clearTimeout(d3_timer_timeout); - d3_timer_timeout = setTimeout(d3_timer_step, delay); - } - d3_timer_interval = 0; - } else { - d3_timer_interval = 1; - d3_timer_frame(d3_timer_step); - } -} - -d3.timer.flush = function() { - var elapsed, - now = Date.now(), - t1 = d3_timer_queue; - - while (t1) { - elapsed = now - t1.then; - if (!t1.delay) t1.flush = t1.callback(elapsed); - t1 = t1.next; - } - - d3_timer_flush(); -}; - -// Flush after callbacks, to avoid concurrent queue modification. -function d3_timer_flush() { - var t0 = null, - t1 = d3_timer_queue, - then = Infinity; - while (t1) { - if (t1.flush) { - t1 = t0 ? t0.next = t1.next : d3_timer_queue = t1.next; - } else { - then = Math.min(then, t1.then + t1.delay); - t1 = (t0 = t1).next; - } - } - return then; -} - -var d3_timer_frame = window.requestAnimationFrame - || window.webkitRequestAnimationFrame - || window.mozRequestAnimationFrame - || window.oRequestAnimationFrame - || window.msRequestAnimationFrame - || function(callback) { setTimeout(callback, 17); }; -function d3_noop() {} -d3.scale = {}; - -function d3_scaleExtent(domain) { - var start = domain[0], stop = domain[domain.length - 1]; - return start < stop ? [start, stop] : [stop, start]; -} -function d3_scale_nice(domain, nice) { - var i0 = 0, - i1 = domain.length - 1, - x0 = domain[i0], - x1 = domain[i1], - dx; - - if (x1 < x0) { - dx = i0; i0 = i1; i1 = dx; - dx = x0; x0 = x1; x1 = dx; - } - - nice = nice(x1 - x0); - domain[i0] = nice.floor(x0); - domain[i1] = nice.ceil(x1); - return domain; -} - -function d3_scale_niceDefault() { - return Math; -} -d3.scale.linear = function() { - return d3_scale_linear([0, 1], [0, 1], d3.interpolate, false); -}; - -function d3_scale_linear(domain, range, interpolate, clamp) { - var output, - input; - - function rescale() { - var linear = domain.length == 2 ? d3_scale_bilinear : d3_scale_polylinear, - uninterpolate = clamp ? d3_uninterpolateClamp : d3_uninterpolateNumber; - output = linear(domain, range, uninterpolate, interpolate); - input = linear(range, domain, uninterpolate, d3.interpolate); - return scale; - } - - function scale(x) { - return output(x); - } - - // Note: requires range is coercible to number! - scale.invert = function(y) { - return input(y); - }; - - scale.domain = function(x) { - if (!arguments.length) return domain; - domain = x.map(Number); - return rescale(); - }; - - scale.range = function(x) { - if (!arguments.length) return range; - range = x; - return rescale(); - }; - - scale.rangeRound = function(x) { - return scale.range(x).interpolate(d3.interpolateRound); - }; - - scale.clamp = function(x) { - if (!arguments.length) return clamp; - clamp = x; - return rescale(); - }; - - scale.interpolate = function(x) { - if (!arguments.length) return interpolate; - interpolate = x; - return rescale(); - }; - - scale.ticks = function(m) { - return d3_scale_linearTicks(domain, m); - }; - - scale.tickFormat = function(m) { - return d3_scale_linearTickFormat(domain, m); - }; - - scale.nice = function() { - d3_scale_nice(domain, d3_scale_linearNice); - return rescale(); - }; - - scale.copy = function() { - return d3_scale_linear(domain, range, interpolate, clamp); - }; - - return rescale(); -}; - -function d3_scale_linearRebind(scale, linear) { - scale.range = d3.rebind(scale, linear.range); - scale.rangeRound = d3.rebind(scale, linear.rangeRound); - scale.interpolate = d3.rebind(scale, linear.interpolate); - scale.clamp = d3.rebind(scale, linear.clamp); - return scale; -} - -function d3_scale_linearNice(dx) { - dx = Math.pow(10, Math.round(Math.log(dx) / Math.LN10) - 1); - return { - floor: function(x) { return Math.floor(x / dx) * dx; }, - ceil: function(x) { return Math.ceil(x / dx) * dx; } - }; -} - -// TODO Dates? Ugh. -function d3_scale_linearTickRange(domain, m) { - var extent = d3_scaleExtent(domain), - span = extent[1] - extent[0], - step = Math.pow(10, Math.floor(Math.log(span / m) / Math.LN10)), - err = m / span * step; - - // Filter ticks to get closer to the desired count. - if (err <= .15) step *= 10; - else if (err <= .35) step *= 5; - else if (err <= .75) step *= 2; - - // Round start and stop values to step interval. - extent[0] = Math.ceil(extent[0] / step) * step; - extent[1] = Math.floor(extent[1] / step) * step + step * .5; // inclusive - extent[2] = step; - return extent; -} - -function d3_scale_linearTicks(domain, m) { - return d3.range.apply(d3, d3_scale_linearTickRange(domain, m)); -} - -function d3_scale_linearTickFormat(domain, m) { - return d3.format(",." + Math.max(0, -Math.floor(Math.log(d3_scale_linearTickRange(domain, m)[2]) / Math.LN10 + .01)) + "f"); -} -function d3_scale_bilinear(domain, range, uninterpolate, interpolate) { - var u = uninterpolate(domain[0], domain[1]), - i = interpolate(range[0], range[1]); - return function(x) { - return i(u(x)); - }; -} -function d3_scale_polylinear(domain, range, uninterpolate, interpolate) { - var u = [], - i = [], - j = 0, - n = domain.length; - - while (++j < n) { - u.push(uninterpolate(domain[j - 1], domain[j])); - i.push(interpolate(range[j - 1], range[j])); - } - - return function(x) { - var j = d3.bisect(domain, x, 1, domain.length - 1) - 1; - return i[j](u[j](x)); - }; -} -d3.scale.log = function() { - return d3_scale_log(d3.scale.linear(), d3_scale_logp); -}; - -function d3_scale_log(linear, log) { - var pow = log.pow; - - function scale(x) { - return linear(log(x)); - } - - scale.invert = function(x) { - return pow(linear.invert(x)); - }; - - scale.domain = function(x) { - if (!arguments.length) return linear.domain().map(pow); - log = x[0] < 0 ? d3_scale_logn : d3_scale_logp; - pow = log.pow; - linear.domain(x.map(log)); - return scale; - }; - - scale.nice = function() { - linear.domain(d3_scale_nice(linear.domain(), d3_scale_niceDefault)); - return scale; - }; - - scale.ticks = function() { - var extent = d3_scaleExtent(linear.domain()), - ticks = []; - if (extent.every(isFinite)) { - var i = Math.floor(extent[0]), - j = Math.ceil(extent[1]), - u = pow(extent[0]), - v = pow(extent[1]); - if (log === d3_scale_logn) { - ticks.push(pow(i)); - for (; i++ < j;) for (var k = 9; k > 0; k--) ticks.push(pow(i) * k); - } else { - for (; i < j; i++) for (var k = 1; k < 10; k++) ticks.push(pow(i) * k); - ticks.push(pow(i)); - } - for (i = 0; ticks[i] < u; i++) {} // strip small values - for (j = ticks.length; ticks[j - 1] > v; j--) {} // strip big values - ticks = ticks.slice(i, j); - } - return ticks; - }; - - scale.tickFormat = function() { - return d3_scale_logTickFormat; - }; - - scale.copy = function() { - return d3_scale_log(linear.copy(), log); - }; - - return d3_scale_linearRebind(scale, linear); -}; - -function d3_scale_logp(x) { - return Math.log(x) / Math.LN10; -} - -function d3_scale_logn(x) { - return -Math.log(-x) / Math.LN10; -} - -d3_scale_logp.pow = function(x) { - return Math.pow(10, x); -}; - -d3_scale_logn.pow = function(x) { - return -Math.pow(10, -x); -}; - -function d3_scale_logTickFormat(d) { - return d.toPrecision(1); -} -d3.scale.pow = function() { - return d3_scale_pow(d3.scale.linear(), 1); -}; - -function d3_scale_pow(linear, exponent) { - var powp = d3_scale_powPow(exponent), - powb = d3_scale_powPow(1 / exponent); - - function scale(x) { - return linear(powp(x)); - } - - scale.invert = function(x) { - return powb(linear.invert(x)); - }; - - scale.domain = function(x) { - if (!arguments.length) return linear.domain().map(powb); - linear.domain(x.map(powp)); - return scale; - }; - - scale.ticks = function(m) { - return d3_scale_linearTicks(scale.domain(), m); - }; - - scale.tickFormat = function(m) { - return d3_scale_linearTickFormat(scale.domain(), m); - }; - - scale.nice = function() { - return scale.domain(d3_scale_nice(scale.domain(), d3_scale_linearNice)); - }; - - scale.exponent = function(x) { - if (!arguments.length) return exponent; - var domain = scale.domain(); - powp = d3_scale_powPow(exponent = x); - powb = d3_scale_powPow(1 / exponent); - return scale.domain(domain); - }; - - scale.copy = function() { - return d3_scale_pow(linear.copy(), exponent); - }; - - return d3_scale_linearRebind(scale, linear); -}; - -function d3_scale_powPow(e) { - return function(x) { - return x < 0 ? -Math.pow(-x, e) : Math.pow(x, e); - }; -} -d3.scale.sqrt = function() { - return d3.scale.pow().exponent(.5); -}; -d3.scale.ordinal = function() { - return d3_scale_ordinal([], {t: "range", x: []}); -}; - -function d3_scale_ordinal(domain, ranger) { - var index, - range, - rangeBand; - - function scale(x) { - return range[((index[x] || (index[x] = domain.push(x))) - 1) % range.length]; - } - - scale.domain = function(x) { - if (!arguments.length) return domain; - domain = []; - index = {}; - var i = -1, n = x.length, xi; - while (++i < n) if (!index[xi = x[i]]) index[xi] = domain.push(xi); - return scale[ranger.t](ranger.x, ranger.p); - }; - - scale.range = function(x) { - if (!arguments.length) return range; - range = x; - rangeBand = 0; - ranger = {t: "range", x: x}; - return scale; - }; - - scale.rangePoints = function(x, padding) { - if (arguments.length < 2) padding = 0; - var start = x[0], - stop = x[1], - step = (stop - start) / (domain.length - 1 + padding); - range = domain.length < 2 ? [(start + stop) / 2] : d3.range(start + step * padding / 2, stop + step / 2, step); - rangeBand = 0; - ranger = {t: "rangePoints", x: x, p: padding}; - return scale; - }; - - scale.rangeBands = function(x, padding) { - if (arguments.length < 2) padding = 0; - var start = x[0], - stop = x[1], - step = (stop - start) / (domain.length + padding); - range = d3.range(start + step * padding, stop, step); - rangeBand = step * (1 - padding); - ranger = {t: "rangeBands", x: x, p: padding}; - return scale; - }; - - scale.rangeRoundBands = function(x, padding) { - if (arguments.length < 2) padding = 0; - var start = x[0], - stop = x[1], - step = Math.floor((stop - start) / (domain.length + padding)), - err = stop - start - (domain.length - padding) * step; - range = d3.range(start + Math.round(err / 2), stop, step); - rangeBand = Math.round(step * (1 - padding)); - ranger = {t: "rangeRoundBands", x: x, p: padding}; - return scale; - }; - - scale.rangeBand = function() { - return rangeBand; - }; - - scale.copy = function() { - return d3_scale_ordinal(domain, ranger); - }; - - return scale.domain(domain); -}; -/* - * This product includes color specifications and designs developed by Cynthia - * Brewer (http://colorbrewer.org/). See lib/colorbrewer for more information. - */ - -d3.scale.category10 = function() { - return d3.scale.ordinal().range(d3_category10); -}; - -d3.scale.category20 = function() { - return d3.scale.ordinal().range(d3_category20); -}; - -d3.scale.category20b = function() { - return d3.scale.ordinal().range(d3_category20b); -}; - -d3.scale.category20c = function() { - return d3.scale.ordinal().range(d3_category20c); -}; - -var d3_category10 = [ - "#1f77b4", "#ff7f0e", "#2ca02c", "#d62728", "#9467bd", - "#8c564b", "#e377c2", "#7f7f7f", "#bcbd22", "#17becf" -]; - -var d3_category20 = [ - "#1f77b4", "#aec7e8", - "#ff7f0e", "#ffbb78", - "#2ca02c", "#98df8a", - "#d62728", "#ff9896", - "#9467bd", "#c5b0d5", - "#8c564b", "#c49c94", - "#e377c2", "#f7b6d2", - "#7f7f7f", "#c7c7c7", - "#bcbd22", "#dbdb8d", - "#17becf", "#9edae5" -]; - -var d3_category20b = [ - "#393b79", "#5254a3", "#6b6ecf", "#9c9ede", - "#637939", "#8ca252", "#b5cf6b", "#cedb9c", - "#8c6d31", "#bd9e39", "#e7ba52", "#e7cb94", - "#843c39", "#ad494a", "#d6616b", "#e7969c", - "#7b4173", "#a55194", "#ce6dbd", "#de9ed6" -]; - -var d3_category20c = [ - "#3182bd", "#6baed6", "#9ecae1", "#c6dbef", - "#e6550d", "#fd8d3c", "#fdae6b", "#fdd0a2", - "#31a354", "#74c476", "#a1d99b", "#c7e9c0", - "#756bb1", "#9e9ac8", "#bcbddc", "#dadaeb", - "#636363", "#969696", "#bdbdbd", "#d9d9d9" -]; -d3.scale.quantile = function() { - return d3_scale_quantile([], []); -}; - -function d3_scale_quantile(domain, range) { - var thresholds; - - function rescale() { - var k = 0, - n = domain.length, - q = range.length; - thresholds = []; - while (++k < q) thresholds[k - 1] = d3.quantile(domain, k / q); - return scale; - } - - function scale(x) { - if (isNaN(x = +x)) return NaN; - return range[d3.bisect(thresholds, x)]; - } - - scale.domain = function(x) { - if (!arguments.length) return domain; - domain = x.filter(function(d) { return !isNaN(d); }).sort(d3.ascending); - return rescale(); - }; - - scale.range = function(x) { - if (!arguments.length) return range; - range = x; - return rescale(); - }; - - scale.quantiles = function() { - return thresholds; - }; - - scale.copy = function() { - return d3_scale_quantile(domain, range); // copy on write! - }; - - return rescale(); -}; -d3.scale.quantize = function() { - return d3_scale_quantize(0, 1, [0, 1]); -}; - -function d3_scale_quantize(x0, x1, range) { - var kx, i; - - function scale(x) { - return range[Math.max(0, Math.min(i, Math.floor(kx * (x - x0))))]; - } - - function rescale() { - kx = range.length / (x1 - x0); - i = range.length - 1; - return scale; - } - - scale.domain = function(x) { - if (!arguments.length) return [x0, x1]; - x0 = +x[0]; - x1 = +x[x.length - 1]; - return rescale(); - }; - - scale.range = function(x) { - if (!arguments.length) return range; - range = x; - return rescale(); - }; - - scale.copy = function() { - return d3_scale_quantize(x0, x1, range); // copy on write - }; - - return rescale(); -}; -d3.svg = {}; -d3.svg.arc = function() { - var innerRadius = d3_svg_arcInnerRadius, - outerRadius = d3_svg_arcOuterRadius, - startAngle = d3_svg_arcStartAngle, - endAngle = d3_svg_arcEndAngle; - - function arc() { - var r0 = innerRadius.apply(this, arguments), - r1 = outerRadius.apply(this, arguments), - a0 = startAngle.apply(this, arguments) + d3_svg_arcOffset, - a1 = endAngle.apply(this, arguments) + d3_svg_arcOffset, - da = (a1 < a0 && (da = a0, a0 = a1, a1 = da), a1 - a0), - df = da < Math.PI ? "0" : "1", - c0 = Math.cos(a0), - s0 = Math.sin(a0), - c1 = Math.cos(a1), - s1 = Math.sin(a1); - return da >= d3_svg_arcMax - ? (r0 - ? "M0," + r1 - + "A" + r1 + "," + r1 + " 0 1,1 0," + (-r1) - + "A" + r1 + "," + r1 + " 0 1,1 0," + r1 - + "M0," + r0 - + "A" + r0 + "," + r0 + " 0 1,0 0," + (-r0) - + "A" + r0 + "," + r0 + " 0 1,0 0," + r0 - + "Z" - : "M0," + r1 - + "A" + r1 + "," + r1 + " 0 1,1 0," + (-r1) - + "A" + r1 + "," + r1 + " 0 1,1 0," + r1 - + "Z") - : (r0 - ? "M" + r1 * c0 + "," + r1 * s0 - + "A" + r1 + "," + r1 + " 0 " + df + ",1 " + r1 * c1 + "," + r1 * s1 - + "L" + r0 * c1 + "," + r0 * s1 - + "A" + r0 + "," + r0 + " 0 " + df + ",0 " + r0 * c0 + "," + r0 * s0 - + "Z" - : "M" + r1 * c0 + "," + r1 * s0 - + "A" + r1 + "," + r1 + " 0 " + df + ",1 " + r1 * c1 + "," + r1 * s1 - + "L0,0" - + "Z"); - } - - arc.innerRadius = function(v) { - if (!arguments.length) return innerRadius; - innerRadius = d3.functor(v); - return arc; - }; - - arc.outerRadius = function(v) { - if (!arguments.length) return outerRadius; - outerRadius = d3.functor(v); - return arc; - }; - - arc.startAngle = function(v) { - if (!arguments.length) return startAngle; - startAngle = d3.functor(v); - return arc; - }; - - arc.endAngle = function(v) { - if (!arguments.length) return endAngle; - endAngle = d3.functor(v); - return arc; - }; - - arc.centroid = function() { - var r = (innerRadius.apply(this, arguments) - + outerRadius.apply(this, arguments)) / 2, - a = (startAngle.apply(this, arguments) - + endAngle.apply(this, arguments)) / 2 + d3_svg_arcOffset; - return [Math.cos(a) * r, Math.sin(a) * r]; - }; - - return arc; -}; - -var d3_svg_arcOffset = -Math.PI / 2, - d3_svg_arcMax = 2 * Math.PI - 1e-6; - -function d3_svg_arcInnerRadius(d) { - return d.innerRadius; -} - -function d3_svg_arcOuterRadius(d) { - return d.outerRadius; -} - -function d3_svg_arcStartAngle(d) { - return d.startAngle; -} - -function d3_svg_arcEndAngle(d) { - return d.endAngle; -} -function d3_svg_line(projection) { - var x = d3_svg_lineX, - y = d3_svg_lineY, - interpolate = "linear", - interpolator = d3_svg_lineInterpolators[interpolate], - tension = .7; - - function line(d) { - return d.length < 1 ? null : "M" + interpolator(projection(d3_svg_linePoints(this, d, x, y)), tension); - } - - line.x = function(v) { - if (!arguments.length) return x; - x = v; - return line; - }; - - line.y = function(v) { - if (!arguments.length) return y; - y = v; - return line; - }; - - line.interpolate = function(v) { - if (!arguments.length) return interpolate; - interpolator = d3_svg_lineInterpolators[interpolate = v]; - return line; - }; - - line.tension = function(v) { - if (!arguments.length) return tension; - tension = v; - return line; - }; - - return line; -} - -d3.svg.line = function() { - return d3_svg_line(Object); -}; - -// Converts the specified array of data into an array of points -// (x-y tuples), by evaluating the specified `x` and `y` functions on each -// data point. The `this` context of the evaluated functions is the specified -// "self" object; each function is passed the current datum and index. -function d3_svg_linePoints(self, d, x, y) { - var points = [], - i = -1, - n = d.length, - fx = typeof x === "function", - fy = typeof y === "function", - value; - if (fx && fy) { - while (++i < n) points.push([ - x.call(self, value = d[i], i), - y.call(self, value, i) - ]); - } else if (fx) { - while (++i < n) points.push([x.call(self, d[i], i), y]); - } else if (fy) { - while (++i < n) points.push([x, y.call(self, d[i], i)]); - } else { - while (++i < n) points.push([x, y]); - } - return points; -} - -// The default `x` property, which references d[0]. -function d3_svg_lineX(d) { - return d[0]; -} - -// The default `y` property, which references d[1]. -function d3_svg_lineY(d) { - return d[1]; -} - -// The various interpolators supported by the `line` class. -var d3_svg_lineInterpolators = { - "linear": d3_svg_lineLinear, - "step-before": d3_svg_lineStepBefore, - "step-after": d3_svg_lineStepAfter, - "basis": d3_svg_lineBasis, - "basis-open": d3_svg_lineBasisOpen, - "basis-closed": d3_svg_lineBasisClosed, - "bundle": d3_svg_lineBundle, - "cardinal": d3_svg_lineCardinal, - "cardinal-open": d3_svg_lineCardinalOpen, - "cardinal-closed": d3_svg_lineCardinalClosed, - "monotone": d3_svg_lineMonotone -}; - -// Linear interpolation; generates "L" commands. -function d3_svg_lineLinear(points) { - var path = [], - i = 0, - n = points.length, - p = points[0]; - path.push(p[0], ",", p[1]); - while (++i < n) path.push("L", (p = points[i])[0], ",", p[1]); - return path.join(""); -} - -// Step interpolation; generates "H" and "V" commands. -function d3_svg_lineStepBefore(points) { - var path = [], - i = 0, - n = points.length, - p = points[0]; - path.push(p[0], ",", p[1]); - while (++i < n) path.push("V", (p = points[i])[1], "H", p[0]); - return path.join(""); -} - -// Step interpolation; generates "H" and "V" commands. -function d3_svg_lineStepAfter(points) { - var path = [], - i = 0, - n = points.length, - p = points[0]; - path.push(p[0], ",", p[1]); - while (++i < n) path.push("H", (p = points[i])[0], "V", p[1]); - return path.join(""); -} - -// Open cardinal spline interpolation; generates "C" commands. -function d3_svg_lineCardinalOpen(points, tension) { - return points.length < 4 - ? d3_svg_lineLinear(points) - : points[1] + d3_svg_lineHermite(points.slice(1, points.length - 1), - d3_svg_lineCardinalTangents(points, tension)); -} - -// Closed cardinal spline interpolation; generates "C" commands. -function d3_svg_lineCardinalClosed(points, tension) { - return points.length < 3 - ? d3_svg_lineLinear(points) - : points[0] + d3_svg_lineHermite((points.push(points[0]), points), - d3_svg_lineCardinalTangents([points[points.length - 2]] - .concat(points, [points[1]]), tension)); -} - -// Cardinal spline interpolation; generates "C" commands. -function d3_svg_lineCardinal(points, tension, closed) { - return points.length < 3 - ? d3_svg_lineLinear(points) - : points[0] + d3_svg_lineHermite(points, - d3_svg_lineCardinalTangents(points, tension)); -} - -// Hermite spline construction; generates "C" commands. -function d3_svg_lineHermite(points, tangents) { - if (tangents.length < 1 - || (points.length != tangents.length - && points.length != tangents.length + 2)) { - return d3_svg_lineLinear(points); - } - - var quad = points.length != tangents.length, - path = "", - p0 = points[0], - p = points[1], - t0 = tangents[0], - t = t0, - pi = 1; - - if (quad) { - path += "Q" + (p[0] - t0[0] * 2 / 3) + "," + (p[1] - t0[1] * 2 / 3) - + "," + p[0] + "," + p[1]; - p0 = points[1]; - pi = 2; - } - - if (tangents.length > 1) { - t = tangents[1]; - p = points[pi]; - pi++; - path += "C" + (p0[0] + t0[0]) + "," + (p0[1] + t0[1]) - + "," + (p[0] - t[0]) + "," + (p[1] - t[1]) - + "," + p[0] + "," + p[1]; - for (var i = 2; i < tangents.length; i++, pi++) { - p = points[pi]; - t = tangents[i]; - path += "S" + (p[0] - t[0]) + "," + (p[1] - t[1]) - + "," + p[0] + "," + p[1]; - } - } - - if (quad) { - var lp = points[pi]; - path += "Q" + (p[0] + t[0] * 2 / 3) + "," + (p[1] + t[1] * 2 / 3) - + "," + lp[0] + "," + lp[1]; - } - - return path; -} - -// Generates tangents for a cardinal spline. -function d3_svg_lineCardinalTangents(points, tension) { - var tangents = [], - a = (1 - tension) / 2, - p0, - p1 = points[0], - p2 = points[1], - i = 1, - n = points.length; - while (++i < n) { - p0 = p1; - p1 = p2; - p2 = points[i]; - tangents.push([a * (p2[0] - p0[0]), a * (p2[1] - p0[1])]); - } - return tangents; -} - -// B-spline interpolation; generates "C" commands. -function d3_svg_lineBasis(points) { - if (points.length < 3) return d3_svg_lineLinear(points); - var path = [], - i = 1, - n = points.length, - pi = points[0], - x0 = pi[0], - y0 = pi[1], - px = [x0, x0, x0, (pi = points[1])[0]], - py = [y0, y0, y0, pi[1]]; - path.push(x0, ",", y0); - d3_svg_lineBasisBezier(path, px, py); - while (++i < n) { - pi = points[i]; - px.shift(); px.push(pi[0]); - py.shift(); py.push(pi[1]); - d3_svg_lineBasisBezier(path, px, py); - } - i = -1; - while (++i < 2) { - px.shift(); px.push(pi[0]); - py.shift(); py.push(pi[1]); - d3_svg_lineBasisBezier(path, px, py); - } - return path.join(""); -} - -// Open B-spline interpolation; generates "C" commands. -function d3_svg_lineBasisOpen(points) { - if (points.length < 4) return d3_svg_lineLinear(points); - var path = [], - i = -1, - n = points.length, - pi, - px = [0], - py = [0]; - while (++i < 3) { - pi = points[i]; - px.push(pi[0]); - py.push(pi[1]); - } - path.push(d3_svg_lineDot4(d3_svg_lineBasisBezier3, px) - + "," + d3_svg_lineDot4(d3_svg_lineBasisBezier3, py)); - --i; while (++i < n) { - pi = points[i]; - px.shift(); px.push(pi[0]); - py.shift(); py.push(pi[1]); - d3_svg_lineBasisBezier(path, px, py); - } - return path.join(""); -} - -// Closed B-spline interpolation; generates "C" commands. -function d3_svg_lineBasisClosed(points) { - var path, - i = -1, - n = points.length, - m = n + 4, - pi, - px = [], - py = []; - while (++i < 4) { - pi = points[i % n]; - px.push(pi[0]); - py.push(pi[1]); - } - path = [ - d3_svg_lineDot4(d3_svg_lineBasisBezier3, px), ",", - d3_svg_lineDot4(d3_svg_lineBasisBezier3, py) - ]; - --i; while (++i < m) { - pi = points[i % n]; - px.shift(); px.push(pi[0]); - py.shift(); py.push(pi[1]); - d3_svg_lineBasisBezier(path, px, py); - } - return path.join(""); -} - -function d3_svg_lineBundle(points, tension) { - var n = points.length - 1, - x0 = points[0][0], - y0 = points[0][1], - dx = points[n][0] - x0, - dy = points[n][1] - y0, - i = -1, - p, - t; - while (++i <= n) { - p = points[i]; - t = i / n; - p[0] = tension * p[0] + (1 - tension) * (x0 + t * dx); - p[1] = tension * p[1] + (1 - tension) * (y0 + t * dy); - } - return d3_svg_lineBasis(points); -} - -// Returns the dot product of the given four-element vectors. -function d3_svg_lineDot4(a, b) { - return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3]; -} - -// Matrix to transform basis (b-spline) control points to bezier -// control points. Derived from FvD 11.2.8. -var d3_svg_lineBasisBezier1 = [0, 2/3, 1/3, 0], - d3_svg_lineBasisBezier2 = [0, 1/3, 2/3, 0], - d3_svg_lineBasisBezier3 = [0, 1/6, 2/3, 1/6]; - -// Pushes a "C" Bézier curve onto the specified path array, given the -// two specified four-element arrays which define the control points. -function d3_svg_lineBasisBezier(path, x, y) { - path.push( - "C", d3_svg_lineDot4(d3_svg_lineBasisBezier1, x), - ",", d3_svg_lineDot4(d3_svg_lineBasisBezier1, y), - ",", d3_svg_lineDot4(d3_svg_lineBasisBezier2, x), - ",", d3_svg_lineDot4(d3_svg_lineBasisBezier2, y), - ",", d3_svg_lineDot4(d3_svg_lineBasisBezier3, x), - ",", d3_svg_lineDot4(d3_svg_lineBasisBezier3, y)); -} - -// Computes the slope from points p0 to p1. -function d3_svg_lineSlope(p0, p1) { - return (p1[1] - p0[1]) / (p1[0] - p0[0]); -} - -// Compute three-point differences for the given points. -// http://en.wikipedia.org/wiki/Cubic_Hermite_spline#Finite_difference -function d3_svg_lineFiniteDifferences(points) { - var i = 0, - j = points.length - 1, - m = [], - p0 = points[0], - p1 = points[1], - d = m[0] = d3_svg_lineSlope(p0, p1); - while (++i < j) { - m[i] = d + (d = d3_svg_lineSlope(p0 = p1, p1 = points[i + 1])); - } - m[i] = d; - return m; -} - -// Interpolates the given points using Fritsch-Carlson Monotone cubic Hermite -// interpolation. Returns an array of tangent vectors. For details, see -// http://en.wikipedia.org/wiki/Monotone_cubic_interpolation -function d3_svg_lineMonotoneTangents(points) { - var tangents = [], - d, - a, - b, - s, - m = d3_svg_lineFiniteDifferences(points), - i = -1, - j = points.length - 1; - - // The first two steps are done by computing finite-differences: - // 1. Compute the slopes of the secant lines between successive points. - // 2. Initialize the tangents at every point as the average of the secants. - - // Then, for each segment… - while (++i < j) { - d = d3_svg_lineSlope(points[i], points[i + 1]); - - // 3. If two successive yk = y{k + 1} are equal (i.e., d is zero), then set - // mk = m{k + 1} = 0 as the spline connecting these points must be flat to - // preserve monotonicity. Ignore step 4 and 5 for those k. - - if (Math.abs(d) < 1e-6) { - m[i] = m[i + 1] = 0; - } else { - // 4. Let ak = mk / dk and bk = m{k + 1} / dk. - a = m[i] / d; - b = m[i + 1] / d; - - // 5. Prevent overshoot and ensure monotonicity by restricting the - // magnitude of vector <ak, bk> to a circle of radius 3. - s = a * a + b * b; - if (s > 9) { - s = d * 3 / Math.sqrt(s); - m[i] = s * a; - m[i + 1] = s * b; - } - } - } - - // Compute the normalized tangent vector from the slopes. Note that if x is - // not monotonic, it's possible that the slope will be infinite, so we protect - // against NaN by setting the coordinate to zero. - i = -1; while (++i <= j) { - s = (points[Math.min(j, i + 1)][0] - points[Math.max(0, i - 1)][0]) - / (6 * (1 + m[i] * m[i])); - tangents.push([s || 0, m[i] * s || 0]); - } - - return tangents; -} - -function d3_svg_lineMonotone(points) { - return points.length < 3 - ? d3_svg_lineLinear(points) - : points[0] + - d3_svg_lineHermite(points, d3_svg_lineMonotoneTangents(points)); -} -d3.svg.line.radial = function() { - var line = d3_svg_line(d3_svg_lineRadial); - line.radius = line.x, delete line.x; - line.angle = line.y, delete line.y; - return line; -}; - -function d3_svg_lineRadial(points) { - var point, - i = -1, - n = points.length, - r, - a; - while (++i < n) { - point = points[i]; - r = point[0]; - a = point[1] + d3_svg_arcOffset; - point[0] = r * Math.cos(a); - point[1] = r * Math.sin(a); - } - return points; -} -function d3_svg_area(projection) { - var x0 = d3_svg_lineX, - x1 = d3_svg_lineX, - y0 = 0, - y1 = d3_svg_lineY, - interpolate = "linear", - interpolator = d3_svg_lineInterpolators[interpolate], - tension = .7; - - function area(d) { - if (d.length < 1) return null; - var points0 = d3_svg_linePoints(this, d, x0, y0), - points1 = d3_svg_linePoints(this, d, x0 === x1 ? d3_svg_areaX(points0) : x1, y0 === y1 ? d3_svg_areaY(points0) : y1); - return "M" + interpolator(projection(points1), tension) - + "L" + interpolator(projection(points0.reverse()), tension) - + "Z"; - } - - area.x = function(x) { - if (!arguments.length) return x1; - x0 = x1 = x; - return area; - }; - - area.x0 = function(x) { - if (!arguments.length) return x0; - x0 = x; - return area; - }; - - area.x1 = function(x) { - if (!arguments.length) return x1; - x1 = x; - return area; - }; - - area.y = function(y) { - if (!arguments.length) return y1; - y0 = y1 = y; - return area; - }; - - area.y0 = function(y) { - if (!arguments.length) return y0; - y0 = y; - return area; - }; - - area.y1 = function(y) { - if (!arguments.length) return y1; - y1 = y; - return area; - }; - - area.interpolate = function(x) { - if (!arguments.length) return interpolate; - interpolator = d3_svg_lineInterpolators[interpolate = x]; - return area; - }; - - area.tension = function(x) { - if (!arguments.length) return tension; - tension = x; - return area; - }; - - return area; -} - -d3.svg.area = function() { - return d3_svg_area(Object); -}; - -function d3_svg_areaX(points) { - return function(d, i) { - return points[i][0]; - }; -} - -function d3_svg_areaY(points) { - return function(d, i) { - return points[i][1]; - }; -} -d3.svg.area.radial = function() { - var area = d3_svg_area(d3_svg_lineRadial); - area.radius = area.x, delete area.x; - area.innerRadius = area.x0, delete area.x0; - area.outerRadius = area.x1, delete area.x1; - area.angle = area.y, delete area.y; - area.startAngle = area.y0, delete area.y0; - area.endAngle = area.y1, delete area.y1; - return area; -}; -d3.svg.chord = function() { - var source = d3_svg_chordSource, - target = d3_svg_chordTarget, - radius = d3_svg_chordRadius, - startAngle = d3_svg_arcStartAngle, - endAngle = d3_svg_arcEndAngle; - - // TODO Allow control point to be customized. - - function chord(d, i) { - var s = subgroup(this, source, d, i), - t = subgroup(this, target, d, i); - return "M" + s.p0 - + arc(s.r, s.p1) + (equals(s, t) - ? curve(s.r, s.p1, s.r, s.p0) - : curve(s.r, s.p1, t.r, t.p0) - + arc(t.r, t.p1) - + curve(t.r, t.p1, s.r, s.p0)) - + "Z"; - } - - function subgroup(self, f, d, i) { - var subgroup = f.call(self, d, i), - r = radius.call(self, subgroup, i), - a0 = startAngle.call(self, subgroup, i) + d3_svg_arcOffset, - a1 = endAngle.call(self, subgroup, i) + d3_svg_arcOffset; - return { - r: r, - a0: a0, - a1: a1, - p0: [r * Math.cos(a0), r * Math.sin(a0)], - p1: [r * Math.cos(a1), r * Math.sin(a1)] - }; - } - - function equals(a, b) { - return a.a0 == b.a0 && a.a1 == b.a1; - } - - function arc(r, p) { - return "A" + r + "," + r + " 0 0,1 " + p; - } - - function curve(r0, p0, r1, p1) { - return "Q 0,0 " + p1; - } - - chord.radius = function(v) { - if (!arguments.length) return radius; - radius = d3.functor(v); - return chord; - }; - - chord.source = function(v) { - if (!arguments.length) return source; - source = d3.functor(v); - return chord; - }; - - chord.target = function(v) { - if (!arguments.length) return target; - target = d3.functor(v); - return chord; - }; - - chord.startAngle = function(v) { - if (!arguments.length) return startAngle; - startAngle = d3.functor(v); - return chord; - }; - - chord.endAngle = function(v) { - if (!arguments.length) return endAngle; - endAngle = d3.functor(v); - return chord; - }; - - return chord; -}; - -function d3_svg_chordSource(d) { - return d.source; -} - -function d3_svg_chordTarget(d) { - return d.target; -} - -function d3_svg_chordRadius(d) { - return d.radius; -} - -function d3_svg_chordStartAngle(d) { - return d.startAngle; -} - -function d3_svg_chordEndAngle(d) { - return d.endAngle; -} -d3.svg.diagonal = function() { - var source = d3_svg_chordSource, - target = d3_svg_chordTarget, - projection = d3_svg_diagonalProjection; - - function diagonal(d, i) { - var p0 = source.call(this, d, i), - p3 = target.call(this, d, i), - m = (p0.y + p3.y) / 2, - p = [p0, {x: p0.x, y: m}, {x: p3.x, y: m}, p3]; - p = p.map(projection); - return "M" + p[0] + "C" + p[1] + " " + p[2] + " " + p[3]; - } - - diagonal.source = function(x) { - if (!arguments.length) return source; - source = d3.functor(x); - return diagonal; - }; - - diagonal.target = function(x) { - if (!arguments.length) return target; - target = d3.functor(x); - return diagonal; - }; - - diagonal.projection = function(x) { - if (!arguments.length) return projection; - projection = x; - return diagonal; - }; - - return diagonal; -}; - -function d3_svg_diagonalProjection(d) { - return [d.x, d.y]; -} -d3.svg.diagonal.radial = function() { - var diagonal = d3.svg.diagonal(), - projection = d3_svg_diagonalProjection, - projection_ = diagonal.projection; - - diagonal.projection = function(x) { - return arguments.length - ? projection_(d3_svg_diagonalRadialProjection(projection = x)) - : projection; - }; - - return diagonal; -}; - -function d3_svg_diagonalRadialProjection(projection) { - return function() { - var d = projection.apply(this, arguments), - r = d[0], - a = d[1] + d3_svg_arcOffset; - return [r * Math.cos(a), r * Math.sin(a)]; - }; -} -d3.svg.mouse = function(container) { - return d3_svg_mousePoint(container, d3.event); -}; - -// https://bugs.webkit.org/show_bug.cgi?id=44083 -var d3_mouse_bug44083 = /WebKit/.test(navigator.userAgent) ? -1 : 0; - -function d3_svg_mousePoint(container, e) { - var point = (container.ownerSVGElement || container).createSVGPoint(); - if ((d3_mouse_bug44083 < 0) && (window.scrollX || window.scrollY)) { - var svg = d3.select(document.body) - .append("svg:svg") - .style("position", "absolute") - .style("top", 0) - .style("left", 0); - var ctm = svg[0][0].getScreenCTM(); - d3_mouse_bug44083 = !(ctm.f || ctm.e); - svg.remove(); - } - if (d3_mouse_bug44083) { - point.x = e.pageX; - point.y = e.pageY; - } else { - point.x = e.clientX; - point.y = e.clientY; - } - point = point.matrixTransform(container.getScreenCTM().inverse()); - return [point.x, point.y]; -}; -d3.svg.touches = function(container) { - var touches = d3.event.touches; - return touches ? Array.prototype.map.call(touches, function(touch) { - var point = d3_svg_mousePoint(container, touch); - point.identifier = touch.identifier; - return point; - }) : []; -}; -d3.svg.symbol = function() { - var type = d3_svg_symbolType, - size = d3_svg_symbolSize; - - function symbol(d, i) { - return (d3_svg_symbols[type.call(this, d, i)] - || d3_svg_symbols.circle) - (size.call(this, d, i)); - } - - symbol.type = function(x) { - if (!arguments.length) return type; - type = d3.functor(x); - return symbol; - }; - - // size of symbol in square pixels - symbol.size = function(x) { - if (!arguments.length) return size; - size = d3.functor(x); - return symbol; - }; - - return symbol; -}; - -function d3_svg_symbolSize() { - return 64; -} - -function d3_svg_symbolType() { - return "circle"; -} - -// TODO cross-diagonal? -var d3_svg_symbols = { - "circle": function(size) { - var r = Math.sqrt(size / Math.PI); - return "M0," + r - + "A" + r + "," + r + " 0 1,1 0," + (-r) - + "A" + r + "," + r + " 0 1,1 0," + r - + "Z"; - }, - "cross": function(size) { - var r = Math.sqrt(size / 5) / 2; - return "M" + -3 * r + "," + -r - + "H" + -r - + "V" + -3 * r - + "H" + r - + "V" + -r - + "H" + 3 * r - + "V" + r - + "H" + r - + "V" + 3 * r - + "H" + -r - + "V" + r - + "H" + -3 * r - + "Z"; - }, - "diamond": function(size) { - var ry = Math.sqrt(size / (2 * d3_svg_symbolTan30)), - rx = ry * d3_svg_symbolTan30; - return "M0," + -ry - + "L" + rx + ",0" - + " 0," + ry - + " " + -rx + ",0" - + "Z"; - }, - "square": function(size) { - var r = Math.sqrt(size) / 2; - return "M" + -r + "," + -r - + "L" + r + "," + -r - + " " + r + "," + r - + " " + -r + "," + r - + "Z"; - }, - "triangle-down": function(size) { - var rx = Math.sqrt(size / d3_svg_symbolSqrt3), - ry = rx * d3_svg_symbolSqrt3 / 2; - return "M0," + ry - + "L" + rx +"," + -ry - + " " + -rx + "," + -ry - + "Z"; - }, - "triangle-up": function(size) { - var rx = Math.sqrt(size / d3_svg_symbolSqrt3), - ry = rx * d3_svg_symbolSqrt3 / 2; - return "M0," + -ry - + "L" + rx +"," + ry - + " " + -rx + "," + ry - + "Z"; - } -}; - -d3.svg.symbolTypes = d3.keys(d3_svg_symbols); - -var d3_svg_symbolSqrt3 = Math.sqrt(3), - d3_svg_symbolTan30 = Math.tan(30 * Math.PI / 180); -d3.svg.axis = function() { - var scale = d3.scale.linear(), - orient = "bottom", - tickMajorSize = 6, - tickMinorSize = 6, - tickEndSize = 6, - tickPadding = 3, - tickArguments_ = [10], - tickFormat_, - tickSubdivide = 0; - - function axis(selection) { - selection.each(function(d, i, j) { - var g = d3.select(this); - - // Ticks. - var ticks = scale.ticks.apply(scale, tickArguments_), - tickFormat = tickFormat_ == null ? scale.tickFormat.apply(scale, tickArguments_) : tickFormat_; - - // Minor ticks. - var subticks = d3_svg_axisSubdivide(scale, ticks, tickSubdivide), - subtick = g.selectAll(".minor").data(subticks, String), - subtickEnter = subtick.enter().insert("svg:line", "g").attr("class", "tick minor").style("opacity", 1e-6), - subtickExit = transition(subtick.exit()).style("opacity", 1e-6).remove(), - subtickUpdate = transition(subtick).style("opacity", 1); - - // Major ticks. - var tick = g.selectAll("g").data(ticks, String), - tickEnter = tick.enter().insert("svg:g", "path").style("opacity", 1e-6), - tickExit = transition(tick.exit()).style("opacity", 1e-6).remove(), - tickUpdate = transition(tick).style("opacity", 1), - tickTransform; - - // Domain. - var range = d3_scaleExtent(scale.range()), - path = g.selectAll(".domain").data([0]), - pathEnter = path.enter().append("svg:path").attr("class", "domain"), - pathUpdate = transition(path); - - // Stash the new scale and grab the old scale. - var scale0 = this.__chart__ || scale; - this.__chart__ = scale.copy(); - - tickEnter.append("svg:line").attr("class", "tick"); - tickEnter.append("svg:text"); - tickUpdate.select("text").text(tickFormat); - - switch (orient) { - case "bottom": { - tickTransform = d3_svg_axisX; - subtickUpdate.attr("y2", tickMinorSize); - tickEnter.select("text").attr("dy", ".71em").attr("text-anchor", "middle"); - tickUpdate.select("line").attr("y2", tickMajorSize); - tickUpdate.select("text").attr("y", Math.max(tickMajorSize, 0) + tickPadding); - pathUpdate.attr("d", "M" + range[0] + "," + tickEndSize + "V0H" + range[1] + "V" + tickEndSize); - break; - } - case "top": { - tickTransform = d3_svg_axisX; - subtickUpdate.attr("y2", -tickMinorSize); - tickEnter.select("text").attr("text-anchor", "middle"); - tickUpdate.select("line").attr("y2", -tickMajorSize); - tickUpdate.select("text").attr("y", -(Math.max(tickMajorSize, 0) + tickPadding)); - pathUpdate.attr("d", "M" + range[0] + "," + -tickEndSize + "V0H" + range[1] + "V" + -tickEndSize); - break; - } - case "left": { - tickTransform = d3_svg_axisY; - subtickUpdate.attr("x2", -tickMinorSize); - tickEnter.select("text").attr("dy", ".32em").attr("text-anchor", "end"); - tickUpdate.select("line").attr("x2", -tickMajorSize); - tickUpdate.select("text").attr("x", -(Math.max(tickMajorSize, 0) + tickPadding)); - pathUpdate.attr("d", "M" + -tickEndSize + "," + range[0] + "H0V" + range[1] + "H" + -tickEndSize); - break; - } - case "right": { - tickTransform = d3_svg_axisY; - subtickUpdate.attr("x2", tickMinorSize); - tickEnter.select("text").attr("dy", ".32em"); - tickUpdate.select("line").attr("x2", tickMajorSize); - tickUpdate.select("text").attr("x", Math.max(tickMajorSize, 0) + tickPadding); - pathUpdate.attr("d", "M" + tickEndSize + "," + range[0] + "H0V" + range[1] + "H" + tickEndSize); - break; - } - } - - tickEnter.call(tickTransform, scale0); - tickUpdate.call(tickTransform, scale); - tickExit.call(tickTransform, scale); - - subtickEnter.call(tickTransform, scale0); - subtickUpdate.call(tickTransform, scale); - subtickExit.call(tickTransform, scale); - - function transition(o) { - return selection.delay ? o.transition() - .delay(selection[j][i].delay) - .duration(selection[j][i].duration) - .ease(selection.ease()) : o; - } - }); - } - - axis.scale = function(x) { - if (!arguments.length) return scale; - scale = x; - return axis; - }; - - axis.orient = function(x) { - if (!arguments.length) return orient; - orient = x; - return axis; - }; - - axis.ticks = function() { - if (!arguments.length) return tickArguments_; - tickArguments_ = arguments; - return axis; - }; - - axis.tickFormat = function(x) { - if (!arguments.length) return tickFormat_; - tickFormat_ = x; - return axis; - }; - - axis.tickSize = function(x, y, z) { - if (!arguments.length) return tickMajorSize; - var n = arguments.length - 1; - tickMajorSize = +x; - tickMinorSize = n > 1 ? +y : tickMajorSize; - tickEndSize = n > 0 ? +arguments[n] : tickMajorSize; - return axis; - }; - - axis.tickPadding = function(x) { - if (!arguments.length) return tickPadding; - tickPadding = +x; - return axis; - }; - - axis.tickSubdivide = function(x) { - if (!arguments.length) return tickSubdivide; - tickSubdivide = +x; - return axis; - }; - - return axis; -}; - -function d3_svg_axisX(selection, x) { - selection.attr("transform", function(d) { return "translate(" + x(d) + ",0)"; }); -} - -function d3_svg_axisY(selection, y) { - selection.attr("transform", function(d) { return "translate(0," + y(d) + ")"; }); -} - -function d3_svg_axisSubdivide(scale, ticks, m) { - subticks = []; - if (m && ticks.length > 1) { - var extent = d3_scaleExtent(scale.domain()), - subticks, - i = -1, - n = ticks.length, - d = (ticks[1] - ticks[0]) / ++m, - j, - v; - while (++i < n) { - for (j = m; --j > 0;) { - if ((v = +ticks[i] - j * d) >= extent[0]) { - subticks.push(v); - } - } - } - for (--i, j = 0; ++j < m && (v = +ticks[i] + j * d) < extent[1];) { - subticks.push(v); - } - } - return subticks; -} -d3.behavior = {}; -d3.behavior.drag = function() { - var event = d3.dispatch("drag", "dragstart", "dragend"); - - function drag() { - this - .on("mousedown.drag", mousedown) - .on("touchstart.drag", mousedown); - - d3.select(window) - .on("mousemove.drag", d3_behavior_dragMove) - .on("touchmove.drag", d3_behavior_dragMove) - .on("mouseup.drag", d3_behavior_dragUp, true) - .on("touchend.drag", d3_behavior_dragUp, true) - .on("click.drag", d3_behavior_dragClick, true); - } - - // snapshot the local context for subsequent dispatch - function start() { - d3_behavior_dragEvent = event; - d3_behavior_dragOffset = d3_behavior_dragPoint((d3_behavior_dragTarget = this).parentNode); - d3_behavior_dragMoved = 0; - d3_behavior_dragArguments = arguments; - } - - function mousedown() { - start.apply(this, arguments); - d3_behavior_dragDispatch("dragstart"); - } - - drag.on = function(type, listener) { - event[type].add(listener); - return drag; - }; - - return drag; -}; - -var d3_behavior_dragEvent, - d3_behavior_dragTarget, - d3_behavior_dragArguments, - d3_behavior_dragOffset, - d3_behavior_dragMoved, - d3_behavior_dragStopClick; - -function d3_behavior_dragDispatch(type) { - var o = d3.event, p = d3_behavior_dragTarget.parentNode, dx = 0, dy = 0; - - if (p) { - p = d3_behavior_dragPoint(p); - dx = p[0] - d3_behavior_dragOffset[0]; - dy = p[1] - d3_behavior_dragOffset[1]; - d3_behavior_dragOffset = p; - d3_behavior_dragMoved |= dx | dy; - } - - try { - d3.event = {dx: dx, dy: dy}; - d3_behavior_dragEvent[type].dispatch.apply(d3_behavior_dragTarget, d3_behavior_dragArguments); - } finally { - d3.event = o; - } - - o.preventDefault(); -} - -function d3_behavior_dragPoint(container) { - return d3.event.touches - ? d3.svg.touches(container)[0] - : d3.svg.mouse(container); -} - -function d3_behavior_dragMove() { - if (!d3_behavior_dragTarget) return; - var parent = d3_behavior_dragTarget.parentNode; - - // O NOES! The drag element was removed from the DOM. - if (!parent) return d3_behavior_dragUp(); - - d3_behavior_dragDispatch("drag"); - d3_behavior_dragCancel(); -} - -function d3_behavior_dragUp() { - if (!d3_behavior_dragTarget) return; - d3_behavior_dragDispatch("dragend"); - d3_behavior_dragTarget = null; - - // If the node was moved, prevent the mouseup from propagating. - // Also prevent the subsequent click from propagating (e.g., for anchors). - if (d3_behavior_dragMoved) { - d3_behavior_dragStopClick = true; - d3_behavior_dragCancel(); - } -} - -function d3_behavior_dragClick() { - if (d3_behavior_dragStopClick) { - d3_behavior_dragCancel(); - d3_behavior_dragStopClick = false; - } -} - -function d3_behavior_dragCancel() { - d3.event.stopPropagation(); - d3.event.preventDefault(); -} -// TODO unbind zoom behavior? -// TODO unbind listener? -d3.behavior.zoom = function() { - var xyz = [0, 0, 0], - event = d3.dispatch("zoom"); - - function zoom() { - this - .on("mousedown.zoom", mousedown) - .on("mousewheel.zoom", mousewheel) - .on("DOMMouseScroll.zoom", mousewheel) - .on("dblclick.zoom", dblclick) - .on("touchstart.zoom", touchstart); - - d3.select(window) - .on("mousemove.zoom", d3_behavior_zoomMousemove) - .on("mouseup.zoom", d3_behavior_zoomMouseup) - .on("touchmove.zoom", d3_behavior_zoomTouchmove) - .on("touchend.zoom", d3_behavior_zoomTouchup) - .on("click.zoom", d3_behavior_zoomClick, true); - } - - // snapshot the local context for subsequent dispatch - function start() { - d3_behavior_zoomXyz = xyz; - d3_behavior_zoomDispatch = event.zoom.dispatch; - d3_behavior_zoomTarget = this; - d3_behavior_zoomArguments = arguments; - } - - function mousedown() { - start.apply(this, arguments); - d3_behavior_zoomPanning = d3_behavior_zoomLocation(d3.svg.mouse(d3_behavior_zoomTarget)); - d3_behavior_zoomMoved = false; - d3.event.preventDefault(); - window.focus(); - } - - // store starting mouse location - function mousewheel() { - start.apply(this, arguments); - if (!d3_behavior_zoomZooming) d3_behavior_zoomZooming = d3_behavior_zoomLocation(d3.svg.mouse(d3_behavior_zoomTarget)); - d3_behavior_zoomTo(d3_behavior_zoomDelta() + xyz[2], d3.svg.mouse(d3_behavior_zoomTarget), d3_behavior_zoomZooming); - } - - function dblclick() { - start.apply(this, arguments); - var mouse = d3.svg.mouse(d3_behavior_zoomTarget); - d3_behavior_zoomTo(d3.event.shiftKey ? Math.ceil(xyz[2] - 1) : Math.floor(xyz[2] + 1), mouse, d3_behavior_zoomLocation(mouse)); - } - - // doubletap detection - function touchstart() { - start.apply(this, arguments); - var touches = d3_behavior_zoomTouchup(), - touch, - now = Date.now(); - if ((touches.length === 1) && (now - d3_behavior_zoomLast < 300)) { - d3_behavior_zoomTo(1 + Math.floor(xyz[2]), touch = touches[0], d3_behavior_zoomLocations[touch.identifier]); - } - d3_behavior_zoomLast = now; - } - - zoom.on = function(type, listener) { - event[type].add(listener); - return zoom; - }; - - return zoom; -}; - -var d3_behavior_zoomDiv, - d3_behavior_zoomPanning, - d3_behavior_zoomZooming, - d3_behavior_zoomLocations = {}, // identifier -> location - d3_behavior_zoomLast = 0, - d3_behavior_zoomXyz, - d3_behavior_zoomDispatch, - d3_behavior_zoomTarget, - d3_behavior_zoomArguments, - d3_behavior_zoomMoved, - d3_behavior_zoomStopClick; - -function d3_behavior_zoomLocation(point) { - return [ - point[0] - d3_behavior_zoomXyz[0], - point[1] - d3_behavior_zoomXyz[1], - d3_behavior_zoomXyz[2] - ]; -} - -// detect the pixels that would be scrolled by this wheel event -function d3_behavior_zoomDelta() { - - // mousewheel events are totally broken! - // https://bugs.webkit.org/show_bug.cgi?id=40441 - // not only that, but Chrome and Safari differ in re. to acceleration! - if (!d3_behavior_zoomDiv) { - d3_behavior_zoomDiv = d3.select("body").append("div") - .style("visibility", "hidden") - .style("top", 0) - .style("height", 0) - .style("width", 0) - .style("overflow-y", "scroll") - .append("div") - .style("height", "2000px") - .node().parentNode; - } - - var e = d3.event, delta; - try { - d3_behavior_zoomDiv.scrollTop = 1000; - d3_behavior_zoomDiv.dispatchEvent(e); - delta = 1000 - d3_behavior_zoomDiv.scrollTop; - } catch (error) { - delta = e.wheelDelta || (-e.detail * 5); - } - - return delta * .005; -} - -// Note: Since we don't rotate, it's possible for the touches to become -// slightly detached from their original positions. Thus, we recompute the -// touch points on touchend as well as touchstart! -function d3_behavior_zoomTouchup() { - var touches = d3.svg.touches(d3_behavior_zoomTarget), - i = -1, - n = touches.length, - touch; - while (++i < n) d3_behavior_zoomLocations[(touch = touches[i]).identifier] = d3_behavior_zoomLocation(touch); - return touches; -} - -function d3_behavior_zoomTouchmove() { - var touches = d3.svg.touches(d3_behavior_zoomTarget); - switch (touches.length) { - - // single-touch pan - case 1: { - var touch = touches[0]; - d3_behavior_zoomTo(d3_behavior_zoomXyz[2], touch, d3_behavior_zoomLocations[touch.identifier]); - break; - } - - // double-touch pan + zoom - case 2: { - var p0 = touches[0], - p1 = touches[1], - p2 = [(p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2], - l0 = d3_behavior_zoomLocations[p0.identifier], - l1 = d3_behavior_zoomLocations[p1.identifier], - l2 = [(l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2, l0[2]]; - d3_behavior_zoomTo(Math.log(d3.event.scale) / Math.LN2 + l0[2], p2, l2); - break; - } - } -} - -function d3_behavior_zoomMousemove() { - d3_behavior_zoomZooming = null; - if (d3_behavior_zoomPanning) { - d3_behavior_zoomMoved = true; - d3_behavior_zoomTo(d3_behavior_zoomXyz[2], d3.svg.mouse(d3_behavior_zoomTarget), d3_behavior_zoomPanning); - } -} - -function d3_behavior_zoomMouseup() { - if (d3_behavior_zoomPanning) { - if (d3_behavior_zoomMoved) d3_behavior_zoomStopClick = true; - d3_behavior_zoomMousemove(); - d3_behavior_zoomPanning = null; - } -} - -function d3_behavior_zoomClick() { - if (d3_behavior_zoomStopClick) { - d3.event.stopPropagation(); - d3.event.preventDefault(); - d3_behavior_zoomStopClick = false; - } -} - -function d3_behavior_zoomTo(z, x0, x1) { - var K = Math.pow(2, (d3_behavior_zoomXyz[2] = z) - x1[2]), - x = d3_behavior_zoomXyz[0] = x0[0] - K * x1[0], - y = d3_behavior_zoomXyz[1] = x0[1] - K * x1[1], - o = d3.event, // Events can be reentrant (e.g., focus). - k = Math.pow(2, z); - - d3.event = { - scale: k, - translate: [x, y], - transform: function(sx, sy) { - if (sx) transform(sx, x); - if (sy) transform(sy, y); - } - }; - - function transform(scale, o) { - var domain = scale.__domain || (scale.__domain = scale.domain()), - range = scale.range().map(function(v) { return (v - o) / k; }); - scale.domain(domain).domain(range.map(scale.invert)); - } - - try { - d3_behavior_zoomDispatch.apply(d3_behavior_zoomTarget, d3_behavior_zoomArguments); - } finally { - d3.event = o; - } - - o.preventDefault(); -} -})(); diff --git a/rtd_phosphonetx/source/html/demoapp/d3.layout.js b/rtd_phosphonetx/source/html/demoapp/d3.layout.js deleted file mode 100755 index 6cc1d716167..00000000000 --- a/rtd_phosphonetx/source/html/demoapp/d3.layout.js +++ /dev/null @@ -1,1865 +0,0 @@ -(function(){d3.layout = {}; -// Implements hierarchical edge bundling using Holten's algorithm. For each -// input link, a path is computed that travels through the tree, up the parent -// hierarchy to the least common ancestor, and then back down to the destination -// node. Each path is simply an array of nodes. -d3.layout.bundle = function() { - return function(links) { - var paths = [], - i = -1, - n = links.length; - while (++i < n) paths.push(d3_layout_bundlePath(links[i])); - return paths; - }; -}; - -function d3_layout_bundlePath(link) { - var start = link.source, - end = link.target, - lca = d3_layout_bundleLeastCommonAncestor(start, end), - points = [start]; - while (start !== lca) { - start = start.parent; - points.push(start); - } - var k = points.length; - while (end !== lca) { - points.splice(k, 0, end); - end = end.parent; - } - return points; -} - -function d3_layout_bundleAncestors(node) { - var ancestors = [], - parent = node.parent; - while (parent != null) { - ancestors.push(node); - node = parent; - parent = parent.parent; - } - ancestors.push(node); - return ancestors; -} - -function d3_layout_bundleLeastCommonAncestor(a, b) { - if (a === b) return a; - var aNodes = d3_layout_bundleAncestors(a), - bNodes = d3_layout_bundleAncestors(b), - aNode = aNodes.pop(), - bNode = bNodes.pop(), - sharedNode = null; - while (aNode === bNode) { - sharedNode = aNode; - aNode = aNodes.pop(); - bNode = bNodes.pop(); - } - return sharedNode; -} -d3.layout.chord = function() { - var chord = {}, - chords, - groups, - matrix, - n, - padding = 0, - sortGroups, - sortSubgroups, - sortChords; - - function relayout() { - var subgroups = {}, - groupSums = [], - groupIndex = d3.range(n), - subgroupIndex = [], - k, - x, - x0, - i, - j; - - chords = []; - groups = []; - - // Compute the sum. - k = 0, i = -1; while (++i < n) { - x = 0, j = -1; while (++j < n) { - x += matrix[i][j]; - } - groupSums.push(x); - subgroupIndex.push(d3.range(n)); - k += x; - } - - // Sort groups… - if (sortGroups) { - groupIndex.sort(function(a, b) { - return sortGroups(groupSums[a], groupSums[b]); - }); - } - - // Sort subgroups… - if (sortSubgroups) { - subgroupIndex.forEach(function(d, i) { - d.sort(function(a, b) { - return sortSubgroups(matrix[i][a], matrix[i][b]); - }); - }); - } - - // Convert the sum to scaling factor for [0, 2pi]. - // TODO Allow start and end angle to be specified. - // TODO Allow padding to be specified as percentage? - k = (2 * Math.PI - padding * n) / k; - - // Compute the start and end angle for each group and subgroup. - x = 0, i = -1; while (++i < n) { - x0 = x, j = -1; while (++j < n) { - var di = groupIndex[i], - dj = subgroupIndex[i][j], - v = matrix[di][dj]; - subgroups[di + "-" + dj] = { - index: di, - subindex: dj, - startAngle: x, - endAngle: x += v * k, - value: v - }; - } - groups.push({ - index: di, - startAngle: x0, - endAngle: x, - value: (x - x0) / k - }); - x += padding; - } - - // Generate chords for each (non-empty) subgroup-subgroup link. - i = -1; while (++i < n) { - j = i - 1; while (++j < n) { - var source = subgroups[i + "-" + j], - target = subgroups[j + "-" + i]; - if (source.value || target.value) { - chords.push(source.value < target.value - ? {source: target, target: source} - : {source: source, target: target}); - } - } - } - - if (sortChords) resort(); - } - - function resort() { - chords.sort(function(a, b) { - return sortChords(a.target.value, b.target.value); - }); - } - - chord.matrix = function(x) { - if (!arguments.length) return matrix; - n = (matrix = x) && matrix.length; - chords = groups = null; - return chord; - }; - - chord.padding = function(x) { - if (!arguments.length) return padding; - padding = x; - chords = groups = null; - return chord; - }; - - chord.sortGroups = function(x) { - if (!arguments.length) return sortGroups; - sortGroups = x; - chords = groups = null; - return chord; - }; - - chord.sortSubgroups = function(x) { - if (!arguments.length) return sortSubgroups; - sortSubgroups = x; - chords = null; - return chord; - }; - - chord.sortChords = function(x) { - if (!arguments.length) return sortChords; - sortChords = x; - if (chords) resort(); - return chord; - }; - - chord.chords = function() { - if (!chords) relayout(); - return chords; - }; - - chord.groups = function() { - if (!groups) relayout(); - return groups; - }; - - return chord; -}; -// A rudimentary force layout using Gauss-Seidel. -d3.layout.force = function() { - var force = {}, - event = d3.dispatch("tick"), - size = [1, 1], - drag, - alpha, - friction = .9, - linkDistance = d3_layout_forceLinkDistance, - linkStrength = d3_layout_forceLinkStrength, - charge = -30, - gravity = .1, - theta = .8, - interval, - nodes = [], - links = [], - distances, - strengths; - - function repulse(node, kc) { - return function(quad, x1, y1, x2, y2) { - if (quad.point !== node) { - var dx = quad.cx - node.x, - dy = quad.cy - node.y, - dn = 1 / Math.sqrt(dx * dx + dy * dy); - - /* Barnes-Hut criterion. */ - if ((x2 - x1) * dn < theta) { - var k = kc * quad.count * dn * dn; - node.px -= dx * k; - node.py -= dy * k; - return true; - } - - if (quad.point && isFinite(dn)) { - var k = kc * dn * dn; - node.px -= dx * k; - node.py -= dy * k; - } - } - }; - } - - function tick() { - var n = nodes.length, - m = links.length, - q, - i, // current index - o, // current object - s, // current source - t, // current target - l, // current distance - k, // current force - x, // x-distance - y; // y-distance - - // gauss-seidel relaxation for links - for (i = 0; i < m; ++i) { - o = links[i]; - s = o.source; - t = o.target; - x = t.x - s.x; - y = t.y - s.y; - if (l = (x * x + y * y)) { - l = alpha * strengths[i] * ((l = Math.sqrt(l)) - distances[i]) / l; - x *= l; - y *= l; - t.x -= x * (k = s.weight / (t.weight + s.weight)); - t.y -= y * k; - s.x += x * (k = 1 - k); - s.y += y * k; - } - } - - // apply gravity forces - if (k = alpha * gravity) { - x = size[0] / 2; - y = size[1] / 2; - i = -1; if (k) while (++i < n) { - o = nodes[i]; - o.x += (x - o.x) * k; - o.y += (y - o.y) * k; - } - } - - // compute quadtree center of mass and apply charge forces - if (k = alpha * charge) { - d3_layout_forceAccumulate(q = d3.geom.quadtree(nodes)); - i = -1; while (++i < n) { - if (!(o = nodes[i]).fixed) { - q.visit(repulse(o, k)); - } - } - } - - // position verlet integration - i = -1; while (++i < n) { - o = nodes[i]; - if (o.fixed) { - o.x = o.px; - o.y = o.py; - } else { - o.x -= (o.px - (o.px = o.x)) * friction; - o.y -= (o.py - (o.py = o.y)) * friction; - } - } - - event.tick.dispatch({type: "tick", alpha: alpha}); - - // simulated annealing, basically - return (alpha *= .99) < .005; - } - - force.on = function(type, listener) { - event[type].add(listener); - return force; - }; - - force.nodes = function(x) { - if (!arguments.length) return nodes; - nodes = x; - return force; - }; - - force.links = function(x) { - if (!arguments.length) return links; - links = x; - return force; - }; - - force.size = function(x) { - if (!arguments.length) return size; - size = x; - return force; - }; - - force.linkDistance = function(x) { - if (!arguments.length) return linkDistance; - linkDistance = d3.functor(x); - return force; - }; - - // For backwards-compatibility. - force.distance = force.linkDistance; - - force.linkStrength = function(x) { - if (!arguments.length) return linkStrength; - linkStrength = d3.functor(x); - return force; - }; - - force.friction = function(x) { - if (!arguments.length) return friction; - friction = x; - return force; - }; - - force.charge = function(x) { - if (!arguments.length) return charge; - charge = x; - return force; - }; - - force.gravity = function(x) { - if (!arguments.length) return gravity; - gravity = x; - return force; - }; - - force.theta = function(x) { - if (!arguments.length) return theta; - theta = x; - return force; - }; - - force.start = function() { - var i, - j, - n = nodes.length, - m = links.length, - w = size[0], - h = size[1], - neighbors, - o; - - for (i = 0; i < n; ++i) { - (o = nodes[i]).index = i; - o.weight = 0; - } - - distances = []; - strengths = []; - for (i = 0; i < m; ++i) { - o = links[i]; - if (typeof o.source == "number") o.source = nodes[o.source]; - if (typeof o.target == "number") o.target = nodes[o.target]; - distances[i] = linkDistance.call(this, o, i); - strengths[i] = linkStrength.call(this, o, i); - ++o.source.weight; - ++o.target.weight; - } - - for (i = 0; i < n; ++i) { - o = nodes[i]; - if (isNaN(o.x)) o.x = position("x", w); - if (isNaN(o.y)) o.y = position("y", h); - if (isNaN(o.px)) o.px = o.x; - if (isNaN(o.py)) o.py = o.y; - } - - // initialize node position based on first neighbor - function position(dimension, size) { - var neighbors = neighbor(i), - j = -1, - m = neighbors.length, - x; - while (++j < m) if (!isNaN(x = neighbors[j][dimension])) return x; - return Math.random() * size; - } - - // initialize neighbors lazily - function neighbor() { - if (!neighbors) { - neighbors = []; - for (j = 0; j < n; ++j) { - neighbors[j] = []; - } - for (j = 0; j < m; ++j) { - var o = links[j]; - neighbors[o.source.index].push(o.target); - neighbors[o.target.index].push(o.source); - } - } - return neighbors[i]; - } - - return force.resume(); - }; - - force.resume = function() { - alpha = .1; - d3.timer(tick); - return force; - }; - - force.stop = function() { - alpha = 0; - return force; - }; - - // use `node.call(force.drag)` to make nodes draggable - force.drag = function() { - if (!drag) drag = d3.behavior.drag() - .on("dragstart", dragstart) - .on("drag", d3_layout_forceDrag) - .on("dragend", d3_layout_forceDragEnd); - - this.on("mouseover.force", d3_layout_forceDragOver) - .on("mouseout.force", d3_layout_forceDragOut) - .call(drag); - }; - - function dragstart(d) { - d3_layout_forceDragOver(d3_layout_forceDragNode = d); - d3_layout_forceDragForce = force; - } - - return force; -}; - -var d3_layout_forceDragForce, - d3_layout_forceDragNode; - -function d3_layout_forceDragOver(d) { - d.fixed |= 2; -} - -function d3_layout_forceDragOut(d) { - if (d !== d3_layout_forceDragNode) d.fixed &= 1; -} - -function d3_layout_forceDragEnd() { - d3_layout_forceDrag(); - d3_layout_forceDragNode.fixed &= 1; - d3_layout_forceDragForce = d3_layout_forceDragNode = null; -} - -function d3_layout_forceDrag() { - d3_layout_forceDragNode.px += d3.event.dx; - d3_layout_forceDragNode.py += d3.event.dy; - d3_layout_forceDragForce.resume(); // restart annealing -} - -function d3_layout_forceAccumulate(quad) { - var cx = 0, - cy = 0; - quad.count = 0; - if (!quad.leaf) { - var nodes = quad.nodes, - n = nodes.length, - i = -1, - c; - while (++i < n) { - c = nodes[i]; - if (c == null) continue; - d3_layout_forceAccumulate(c); - quad.count += c.count; - cx += c.count * c.cx; - cy += c.count * c.cy; - } - } - if (quad.point) { - // jitter internal nodes that are coincident - if (!quad.leaf) { - quad.point.x += Math.random() - .5; - quad.point.y += Math.random() - .5; - } - quad.count++; - cx += quad.point.x; - cy += quad.point.y; - } - quad.cx = cx / quad.count; - quad.cy = cy / quad.count; -} - -function d3_layout_forceLinkDistance(link) { - return 20; -} - -function d3_layout_forceLinkStrength(link) { - return 1; -} -d3.layout.partition = function() { - var hierarchy = d3.layout.hierarchy(), - size = [1, 1]; // width, height - - function position(node, x, dx, dy) { - var children = node.children; - node.x = x; - node.y = node.depth * dy; - node.dx = dx; - node.dy = dy; - if (children) { - var i = -1, - n = children.length, - c, - d; - dx = node.value ? dx / node.value : 0; - while (++i < n) { - position(c = children[i], x, d = c.value * dx, dy); - x += d; - } - } - } - - function depth(node) { - var children = node.children, - d = 0; - if (children) { - var i = -1, - n = children.length; - while (++i < n) d = Math.max(d, depth(children[i])); - } - return 1 + d; - } - - function partition(d, i) { - var nodes = hierarchy.call(this, d, i); - position(nodes[0], 0, size[0], size[1] / depth(nodes[0])); - return nodes; - } - - partition.size = function(x) { - if (!arguments.length) return size; - size = x; - return partition; - }; - - return d3_layout_hierarchyRebind(partition, hierarchy); -}; -d3.layout.pie = function() { - var value = Number, - sort = null, - startAngle = 0, - endAngle = 2 * Math.PI; - - function pie(data, i) { - - // Compute the start angle. - var a = +(typeof startAngle === "function" - ? startAngle.apply(this, arguments) - : startAngle); - - // Compute the angular range (end - start). - var k = (typeof endAngle === "function" - ? endAngle.apply(this, arguments) - : endAngle) - startAngle; - - // Optionally sort the data. - var index = d3.range(data.length); - if (sort != null) index.sort(function(i, j) { - return sort(data[i], data[j]); - }); - - // Compute the numeric values for each data element. - var values = data.map(value); - - // Convert k into a scale factor from value to angle, using the sum. - k /= values.reduce(function(p, d) { return p + d; }, 0); - - // Compute the arcs! - var arcs = index.map(function(i) { - return { - data: data[i], - value: d = values[i], - startAngle: a, - endAngle: a += d * k - }; - }); - - // Return the arcs in the original data's order. - return data.map(function(d, i) { - return arcs[index[i]]; - }); - } - - /** - * Specifies the value function *x*, which returns a nonnegative numeric value - * for each datum. The default value function is `Number`. The value function - * is passed two arguments: the current datum and the current index. - */ - pie.value = function(x) { - if (!arguments.length) return value; - value = x; - return pie; - }; - - /** - * Specifies a sort comparison operator *x*. The comparator is passed two data - * elements from the data array, a and b; it returns a negative value if a is - * less than b, a positive value if a is greater than b, and zero if a equals - * b. - */ - pie.sort = function(x) { - if (!arguments.length) return sort; - sort = x; - return pie; - }; - - /** - * Specifies the overall start angle of the pie chart. Defaults to 0. The - * start angle can be specified either as a constant or as a function; in the - * case of a function, it is evaluated once per array (as opposed to per - * element). - */ - pie.startAngle = function(x) { - if (!arguments.length) return startAngle; - startAngle = x; - return pie; - }; - - /** - * Specifies the overall end angle of the pie chart. Defaults to 2π. The - * end angle can be specified either as a constant or as a function; in the - * case of a function, it is evaluated once per array (as opposed to per - * element). - */ - pie.endAngle = function(x) { - if (!arguments.length) return endAngle; - endAngle = x; - return pie; - }; - - return pie; -}; -// data is two-dimensional array of x,y; we populate y0 -d3.layout.stack = function() { - var values = Object, - order = d3_layout_stackOrders["default"], - offset = d3_layout_stackOffsets["zero"], - out = d3_layout_stackOut, - x = d3_layout_stackX, - y = d3_layout_stackY; - - function stack(data, index) { - - // Convert series to canonical two-dimensional representation. - var series = data.map(function(d, i) { - return values.call(stack, d, i); - }); - - // Convert each series to canonical [[x,y]] representation. - var points = series.map(function(d, i) { - return d.map(function(v, i) { - return [x.call(stack, v, i), y.call(stack, v, i)]; - }); - }); - - // Compute the order of series, and permute them. - var orders = order.call(stack, points, index); - series = d3.permute(series, orders); - points = d3.permute(points, orders); - - // Compute the baseline… - var offsets = offset.call(stack, points, index); - - // And propagate it to other series. - var n = series.length, - m = series[0].length, - i, - j, - o; - for (j = 0; j < m; ++j) { - out.call(stack, series[0][j], o = offsets[j], points[0][j][1]); - for (i = 1; i < n; ++i) { - out.call(stack, series[i][j], o += points[i - 1][j][1], points[i][j][1]); - } - } - - return data; - } - - stack.values = function(x) { - if (!arguments.length) return values; - values = x; - return stack; - }; - - stack.order = function(x) { - if (!arguments.length) return order; - order = typeof x === "function" ? x : d3_layout_stackOrders[x]; - return stack; - }; - - stack.offset = function(x) { - if (!arguments.length) return offset; - offset = typeof x === "function" ? x : d3_layout_stackOffsets[x]; - return stack; - }; - - stack.x = function(z) { - if (!arguments.length) return x; - x = z; - return stack; - }; - - stack.y = function(z) { - if (!arguments.length) return y; - y = z; - return stack; - }; - - stack.out = function(z) { - if (!arguments.length) return out; - out = z; - return stack; - }; - - return stack; -} - -function d3_layout_stackX(d) { - return d.x; -} - -function d3_layout_stackY(d) { - return d.y; -} - -function d3_layout_stackOut(d, y0, y) { - d.y0 = y0; - d.y = y; -} - -var d3_layout_stackOrders = { - - "inside-out": function(data) { - var n = data.length, - i, - j, - max = data.map(d3_layout_stackMaxIndex), - sums = data.map(d3_layout_stackReduceSum), - index = d3.range(n).sort(function(a, b) { return max[a] - max[b]; }), - top = 0, - bottom = 0, - tops = [], - bottoms = []; - for (i = 0; i < n; ++i) { - j = index[i]; - if (top < bottom) { - top += sums[j]; - tops.push(j); - } else { - bottom += sums[j]; - bottoms.push(j); - } - } - return bottoms.reverse().concat(tops); - }, - - "reverse": function(data) { - return d3.range(data.length).reverse(); - }, - - "default": function(data) { - return d3.range(data.length); - } - -}; - -var d3_layout_stackOffsets = { - - "silhouette": function(data) { - var n = data.length, - m = data[0].length, - sums = [], - max = 0, - i, - j, - o, - y0 = []; - for (j = 0; j < m; ++j) { - for (i = 0, o = 0; i < n; i++) o += data[i][j][1]; - if (o > max) max = o; - sums.push(o); - } - for (j = 0; j < m; ++j) { - y0[j] = (max - sums[j]) / 2; - } - return y0; - }, - - "wiggle": function(data) { - var n = data.length, - x = data[0], - m = x.length, - max = 0, - i, - j, - k, - s1, - s2, - s3, - dx, - o, - o0, - y0 = []; - y0[0] = o = o0 = 0; - for (j = 1; j < m; ++j) { - for (i = 0, s1 = 0; i < n; ++i) s1 += data[i][j][1]; - for (i = 0, s2 = 0, dx = x[j][0] - x[j - 1][0]; i < n; ++i) { - for (k = 0, s3 = (data[i][j][1] - data[i][j - 1][1]) / (2 * dx); k < i; ++k) { - s3 += (data[k][j][1] - data[k][j - 1][1]) / dx; - } - s2 += s3 * data[i][j][1]; - } - y0[j] = o -= s1 ? s2 / s1 * dx : 0; - if (o < o0) o0 = o; - } - for (j = 0; j < m; ++j) y0[j] -= o0; - return y0; - }, - - "expand": function(data) { - var n = data.length, - m = data[0].length, - k = 1 / n, - i, - j, - o, - y0 = []; - for (j = 0; j < m; ++j) { - for (i = 0, o = 0; i < n; i++) o += data[i][j][1]; - if (o) for (i = 0; i < n; i++) data[i][j][1] /= o; - else for (i = 0; i < n; i++) data[i][j][1] = k; - } - for (j = 0; j < m; ++j) y0[j] = 0; - return y0; - }, - - "zero": function(data) { - var j = -1, - m = data[0].length, - y0 = []; - while (++j < m) y0[j] = 0; - return y0; - } - -}; - -function d3_layout_stackMaxIndex(array) { - var i = 1, - j = 0, - v = array[0][1], - k, - n = array.length; - for (; i < n; ++i) { - if ((k = array[i][1]) > v) { - j = i; - v = k; - } - } - return j; -} - -function d3_layout_stackReduceSum(d) { - return d.reduce(d3_layout_stackSum, 0); -} - -function d3_layout_stackSum(p, d) { - return p + d[1]; -} -d3.layout.histogram = function() { - var frequency = true, - valuer = Number, - ranger = d3_layout_histogramRange, - binner = d3_layout_histogramBinSturges; - - function histogram(data, i) { - var bins = [], - values = data.map(valuer, this), - range = ranger.call(this, values, i), - thresholds = binner.call(this, range, values, i), - bin, - i = -1, - n = values.length, - m = thresholds.length - 1, - k = frequency ? 1 : 1 / n, - x; - - // Initialize the bins. - while (++i < m) { - bin = bins[i] = []; - bin.dx = thresholds[i + 1] - (bin.x = thresholds[i]); - bin.y = 0; - } - - // Fill the bins, ignoring values outside the range. - i = -1; while(++i < n) { - x = values[i]; - if ((x >= range[0]) && (x <= range[1])) { - bin = bins[d3.bisect(thresholds, x, 1, m) - 1]; - bin.y += k; - bin.push(data[i]); - } - } - - return bins; - } - - // Specifies how to extract a value from the associated data. The default - // value function is `Number`, which is equivalent to the identity function. - histogram.value = function(x) { - if (!arguments.length) return valuer; - valuer = x; - return histogram; - }; - - // Specifies the range of the histogram. Values outside the specified range - // will be ignored. The argument `x` may be specified either as a two-element - // array representing the minimum and maximum value of the range, or as a - // function that returns the range given the array of values and the current - // index `i`. The default range is the extent (minimum and maximum) of the - // values. - histogram.range = function(x) { - if (!arguments.length) return ranger; - ranger = d3.functor(x); - return histogram; - }; - - // Specifies how to bin values in the histogram. The argument `x` may be - // specified as a number, in which case the range of values will be split - // uniformly into the given number of bins. Or, `x` may be an array of - // threshold values, defining the bins; the specified array must contain the - // rightmost (upper) value, thus specifying n + 1 values for n bins. Or, `x` - // may be a function which is evaluated, being passed the range, the array of - // values, and the current index `i`, returning an array of thresholds. The - // default bin function will divide the values into uniform bins using - // Sturges' formula. - histogram.bins = function(x) { - if (!arguments.length) return binner; - binner = typeof x === "number" - ? function(range) { return d3_layout_histogramBinFixed(range, x); } - : d3.functor(x); - return histogram; - }; - - // Specifies whether the histogram's `y` value is a count (frequency) or a - // probability (density). The default value is true. - histogram.frequency = function(x) { - if (!arguments.length) return frequency; - frequency = !!x; - return histogram; - }; - - return histogram; -}; - -function d3_layout_histogramBinSturges(range, values) { - return d3_layout_histogramBinFixed(range, Math.ceil(Math.log(values.length) / Math.LN2 + 1)); -} - -function d3_layout_histogramBinFixed(range, n) { - var x = -1, - b = +range[0], - m = (range[1] - b) / n, - f = []; - while (++x <= n) f[x] = m * x + b; - return f; -} - -function d3_layout_histogramRange(values) { - return [d3.min(values), d3.max(values)]; -} -d3.layout.hierarchy = function() { - var sort = d3_layout_hierarchySort, - children = d3_layout_hierarchyChildren, - value = d3_layout_hierarchyValue; - - // Recursively compute the node depth and value. - // Also converts the data representation into a standard hierarchy structure. - function recurse(data, depth, nodes) { - var childs = children.call(hierarchy, data, depth), - node = d3_layout_hierarchyInline ? data : {data: data}; - node.depth = depth; - nodes.push(node); - if (childs) { - var i = -1, - n = childs.length, - c = node.children = [], - v = 0, - j = depth + 1; - while (++i < n) { - d = recurse(childs[i], j, nodes); - d.parent = node; - c.push(d); - v += d.value; - } - if (sort) c.sort(sort); - if (value) node.value = v; - } else if (value) { - node.value = +value.call(hierarchy, data, depth) || 0; - } - return node; - } - - // Recursively re-evaluates the node value. - function revalue(node, depth) { - var children = node.children, - v = 0; - if (children) { - var i = -1, - n = children.length, - j = depth + 1; - while (++i < n) v += revalue(children[i], j); - } else if (value) { - v = +value.call(hierarchy, d3_layout_hierarchyInline ? node : node.data, depth) || 0; - } - if (value) node.value = v; - return v; - } - - function hierarchy(d) { - var nodes = []; - recurse(d, 0, nodes); - return nodes; - } - - hierarchy.sort = function(x) { - if (!arguments.length) return sort; - sort = x; - return hierarchy; - }; - - hierarchy.children = function(x) { - if (!arguments.length) return children; - children = x; - return hierarchy; - }; - - hierarchy.value = function(x) { - if (!arguments.length) return value; - value = x; - return hierarchy; - }; - - // Re-evaluates the `value` property for the specified hierarchy. - hierarchy.revalue = function(root) { - revalue(root, 0); - return root; - }; - - return hierarchy; -}; - -// A method assignment helper for hierarchy subclasses. -function d3_layout_hierarchyRebind(object, hierarchy) { - object.sort = d3.rebind(object, hierarchy.sort); - object.children = d3.rebind(object, hierarchy.children); - object.links = d3_layout_hierarchyLinks; - object.value = d3.rebind(object, hierarchy.value); - - // If the new API is used, enabling inlining. - object.nodes = function(d) { - d3_layout_hierarchyInline = true; - return (object.nodes = object)(d); - }; - - return object; -} - -function d3_layout_hierarchyChildren(d) { - return d.children; -} - -function d3_layout_hierarchyValue(d) { - return d.value; -} - -function d3_layout_hierarchySort(a, b) { - return b.value - a.value; -} - -// Returns an array source+target objects for the specified nodes. -function d3_layout_hierarchyLinks(nodes) { - return d3.merge(nodes.map(function(parent) { - return (parent.children || []).map(function(child) { - return {source: parent, target: child}; - }); - })); -} - -// For backwards-compatibility, don't enable inlining by default. -var d3_layout_hierarchyInline = false; -d3.layout.pack = function() { - var hierarchy = d3.layout.hierarchy().sort(d3_layout_packSort), - size = [1, 1]; - - function pack(d, i) { - var nodes = hierarchy.call(this, d, i), - root = nodes[0]; - - // Recursively compute the layout. - root.x = 0; - root.y = 0; - d3_layout_packTree(root); - - // Scale the layout to fit the requested size. - var w = size[0], - h = size[1], - k = 1 / Math.max(2 * root.r / w, 2 * root.r / h); - d3_layout_packTransform(root, w / 2, h / 2, k); - - return nodes; - } - - pack.size = function(x) { - if (!arguments.length) return size; - size = x; - return pack; - }; - - return d3_layout_hierarchyRebind(pack, hierarchy); -}; - -function d3_layout_packSort(a, b) { - return a.value - b.value; -} - -function d3_layout_packInsert(a, b) { - var c = a._pack_next; - a._pack_next = b; - b._pack_prev = a; - b._pack_next = c; - c._pack_prev = b; -} - -function d3_layout_packSplice(a, b) { - a._pack_next = b; - b._pack_prev = a; -} - -function d3_layout_packIntersects(a, b) { - var dx = b.x - a.x, - dy = b.y - a.y, - dr = a.r + b.r; - return (dr * dr - dx * dx - dy * dy) > .001; // within epsilon -} - -function d3_layout_packCircle(nodes) { - var xMin = Infinity, - xMax = -Infinity, - yMin = Infinity, - yMax = -Infinity, - n = nodes.length, - a, b, c, j, k; - - function bound(node) { - xMin = Math.min(node.x - node.r, xMin); - xMax = Math.max(node.x + node.r, xMax); - yMin = Math.min(node.y - node.r, yMin); - yMax = Math.max(node.y + node.r, yMax); - } - - // Create node links. - nodes.forEach(d3_layout_packLink); - - // Create first node. - a = nodes[0]; - a.x = -a.r; - a.y = 0; - bound(a); - - // Create second node. - if (n > 1) { - b = nodes[1]; - b.x = b.r; - b.y = 0; - bound(b); - - // Create third node and build chain. - if (n > 2) { - c = nodes[2]; - d3_layout_packPlace(a, b, c); - bound(c); - d3_layout_packInsert(a, c); - a._pack_prev = c; - d3_layout_packInsert(c, b); - b = a._pack_next; - - // Now iterate through the rest. - for (var i = 3; i < n; i++) { - d3_layout_packPlace(a, b, c = nodes[i]); - - // Search for the closest intersection. - var isect = 0, s1 = 1, s2 = 1; - for (j = b._pack_next; j !== b; j = j._pack_next, s1++) { - if (d3_layout_packIntersects(j, c)) { - isect = 1; - break; - } - } - if (isect == 1) { - for (k = a._pack_prev; k !== j._pack_prev; k = k._pack_prev, s2++) { - if (d3_layout_packIntersects(k, c)) { - if (s2 < s1) { - isect = -1; - j = k; - } - break; - } - } - } - - // Update node chain. - if (isect == 0) { - d3_layout_packInsert(a, c); - b = c; - bound(c); - } else if (isect > 0) { - d3_layout_packSplice(a, j); - b = j; - i--; - } else { // isect < 0 - d3_layout_packSplice(j, b); - a = j; - i--; - } - } - } - } - - // Re-center the circles and return the encompassing radius. - var cx = (xMin + xMax) / 2, - cy = (yMin + yMax) / 2, - cr = 0; - for (var i = 0; i < n; i++) { - var node = nodes[i]; - node.x -= cx; - node.y -= cy; - cr = Math.max(cr, node.r + Math.sqrt(node.x * node.x + node.y * node.y)); - } - - // Remove node links. - nodes.forEach(d3_layout_packUnlink); - - return cr; -} - -function d3_layout_packLink(node) { - node._pack_next = node._pack_prev = node; -} - -function d3_layout_packUnlink(node) { - delete node._pack_next; - delete node._pack_prev; -} - -function d3_layout_packTree(node) { - var children = node.children; - if (children) { - children.forEach(d3_layout_packTree); - node.r = d3_layout_packCircle(children); - } else { - node.r = Math.sqrt(node.value); - } -} - -function d3_layout_packTransform(node, x, y, k) { - var children = node.children; - node.x = (x += k * node.x); - node.y = (y += k * node.y); - node.r *= k; - if (children) { - var i = -1, n = children.length; - while (++i < n) d3_layout_packTransform(children[i], x, y, k); - } -} - -function d3_layout_packPlace(a, b, c) { - var da = b.r + c.r, - db = a.r + c.r, - dx = b.x - a.x, - dy = b.y - a.y, - dc = Math.sqrt(dx * dx + dy * dy), - cos = (db * db + dc * dc - da * da) / (2 * db * dc), - theta = Math.acos(cos), - x = cos * db, - h = Math.sin(theta) * db; - dx /= dc; - dy /= dc; - c.x = a.x + x * dx + h * dy; - c.y = a.y + x * dy - h * dx; -} -// Implements a hierarchical layout using the cluster (or dendogram) algorithm. -d3.layout.cluster = function() { - var hierarchy = d3.layout.hierarchy().sort(null).value(null), - separation = d3_layout_treeSeparation, - size = [1, 1]; // width, height - - function cluster(d, i) { - var nodes = hierarchy.call(this, d, i), - root = nodes[0], - previousNode, - x = 0, - kx, - ky; - - // First walk, computing the initial x & y values. - d3_layout_treeVisitAfter(root, function(node) { - if (node.children) { - node.x = d3_layout_clusterX(node.children); - node.y = d3_layout_clusterY(node.children); - } else { - node.x = previousNode ? x += separation(node, previousNode) : 0; - node.y = 0; - previousNode = node; - } - }); - - // Compute the left-most, right-most, and depth-most nodes for extents. - var left = d3_layout_clusterLeft(root), - right = d3_layout_clusterRight(root), - x0 = left.x - separation(left, right) / 2, - x1 = right.x + separation(right, left) / 2; - - // Second walk, normalizing x & y to the desired size. - d3_layout_treeVisitAfter(root, function(node) { - node.x = (node.x - x0) / (x1 - x0) * size[0]; - node.y = (1 - node.y / root.y) * size[1]; - }); - - return nodes; - } - - cluster.separation = function(x) { - if (!arguments.length) return separation; - separation = x; - return cluster; - }; - - cluster.size = function(x) { - if (!arguments.length) return size; - size = x; - return cluster; - }; - - return d3_layout_hierarchyRebind(cluster, hierarchy); -}; - -function d3_layout_clusterY(children) { - return 1 + d3.max(children, function(child) { - return child.y; - }); -} - -function d3_layout_clusterX(children) { - return children.reduce(function(x, child) { - return x + child.x; - }, 0) / children.length; -} - -function d3_layout_clusterLeft(node) { - var children = node.children; - return children ? d3_layout_clusterLeft(children[0]) : node; -} - -function d3_layout_clusterRight(node) { - var children = node.children; - return children ? d3_layout_clusterRight(children[children.length - 1]) : node; -} -// Node-link tree diagram using the Reingold-Tilford "tidy" algorithm -d3.layout.tree = function() { - var hierarchy = d3.layout.hierarchy().sort(null).value(null), - separation = d3_layout_treeSeparation, - size = [1, 1]; // width, height - - function tree(d, i) { - var nodes = hierarchy.call(this, d, i), - root = nodes[0]; - - function firstWalk(node, previousSibling) { - var children = node.children, - layout = node._tree; - if (children && (n = children.length)) { - var n, - firstChild = children[0], - previousChild, - ancestor = firstChild, - child, - i = -1; - while (++i < n) { - child = children[i]; - firstWalk(child, previousChild); - ancestor = apportion(child, previousChild, ancestor); - previousChild = child; - } - d3_layout_treeShift(node); - var midpoint = .5 * (firstChild._tree.prelim + child._tree.prelim); - if (previousSibling) { - layout.prelim = previousSibling._tree.prelim + separation(node, previousSibling); - layout.mod = layout.prelim - midpoint; - } else { - layout.prelim = midpoint; - } - } else { - if (previousSibling) { - layout.prelim = previousSibling._tree.prelim + separation(node, previousSibling); - } - } - } - - function secondWalk(node, x) { - node.x = node._tree.prelim + x; - var children = node.children; - if (children) { - var i = -1, - n = children.length; - x += node._tree.mod; - while (++i < n) { - secondWalk(children[i], x); - } - } - } - - function apportion(node, previousSibling, ancestor) { - if (previousSibling) { - var vip = node, - vop = node, - vim = previousSibling, - vom = node.parent.children[0], - sip = vip._tree.mod, - sop = vop._tree.mod, - sim = vim._tree.mod, - som = vom._tree.mod, - shift; - while (vim = d3_layout_treeRight(vim), vip = d3_layout_treeLeft(vip), vim && vip) { - vom = d3_layout_treeLeft(vom); - vop = d3_layout_treeRight(vop); - vop._tree.ancestor = node; - shift = vim._tree.prelim + sim - vip._tree.prelim - sip + separation(vim, vip); - if (shift > 0) { - d3_layout_treeMove(d3_layout_treeAncestor(vim, node, ancestor), node, shift); - sip += shift; - sop += shift; - } - sim += vim._tree.mod; - sip += vip._tree.mod; - som += vom._tree.mod; - sop += vop._tree.mod; - } - if (vim && !d3_layout_treeRight(vop)) { - vop._tree.thread = vim; - vop._tree.mod += sim - sop; - } - if (vip && !d3_layout_treeLeft(vom)) { - vom._tree.thread = vip; - vom._tree.mod += sip - som; - ancestor = node; - } - } - return ancestor; - } - - // Initialize temporary layout variables. - d3_layout_treeVisitAfter(root, function(node, previousSibling) { - node._tree = { - ancestor: node, - prelim: 0, - mod: 0, - change: 0, - shift: 0, - number: previousSibling ? previousSibling._tree.number + 1 : 0 - }; - }); - - // Compute the layout using Buchheim et al.'s algorithm. - firstWalk(root); - secondWalk(root, -root._tree.prelim); - - // Compute the left-most, right-most, and depth-most nodes for extents. - var left = d3_layout_treeSearch(root, d3_layout_treeLeftmost), - right = d3_layout_treeSearch(root, d3_layout_treeRightmost), - deep = d3_layout_treeSearch(root, d3_layout_treeDeepest), - x0 = left.x - separation(left, right) / 2, - x1 = right.x + separation(right, left) / 2, - y1 = deep.depth || 1; - - // Clear temporary layout variables; transform x and y. - d3_layout_treeVisitAfter(root, function(node) { - node.x = (node.x - x0) / (x1 - x0) * size[0]; - node.y = node.depth / y1 * size[1]; - delete node._tree; - }); - - return nodes; - } - - tree.separation = function(x) { - if (!arguments.length) return separation; - separation = x; - return tree; - }; - - tree.size = function(x) { - if (!arguments.length) return size; - size = x; - return tree; - }; - - return d3_layout_hierarchyRebind(tree, hierarchy); -}; - -function d3_layout_treeSeparation(a, b) { - return a.parent == b.parent ? 1 : 2; -} - -// function d3_layout_treeSeparationRadial(a, b) { -// return (a.parent == b.parent ? 1 : 2) / a.depth; -// } - -function d3_layout_treeLeft(node) { - return node.children ? node.children[0] : node._tree.thread; -} - -function d3_layout_treeRight(node) { - return node.children ? node.children[node.children.length - 1] : node._tree.thread; -} - -function d3_layout_treeSearch(node, compare) { - var children = node.children; - if (children) { - var child, - n = children.length, - i = -1; - while (++i < n) { - if (compare(child = d3_layout_treeSearch(children[i], compare), node) > 0) { - node = child; - } - } - } - return node; -} - -function d3_layout_treeRightmost(a, b) { - return a.x - b.x; -} - -function d3_layout_treeLeftmost(a, b) { - return b.x - a.x; -} - -function d3_layout_treeDeepest(a, b) { - return a.depth - b.depth; -} - -function d3_layout_treeVisitAfter(node, callback) { - function visit(node, previousSibling) { - var children = node.children; - if (children) { - var child, - previousChild = null, - i = -1, - n = children.length; - while (++i < n) { - child = children[i]; - visit(child, previousChild); - previousChild = child; - } - } - callback(node, previousSibling); - } - visit(node, null); -} - -function d3_layout_treeShift(node) { - var shift = 0, - change = 0, - children = node.children, - i = children.length, - child; - while (--i >= 0) { - child = children[i]._tree; - child.prelim += shift; - child.mod += shift; - shift += child.shift + (change += child.change); - } -} - -function d3_layout_treeMove(ancestor, node, shift) { - ancestor = ancestor._tree; - node = node._tree; - var change = shift / (node.number - ancestor.number); - ancestor.change += change; - node.change -= change; - node.shift += shift; - node.prelim += shift; - node.mod += shift; -} - -function d3_layout_treeAncestor(vim, node, ancestor) { - return vim._tree.ancestor.parent == node.parent - ? vim._tree.ancestor - : ancestor; -} -// Squarified Treemaps by Mark Bruls, Kees Huizing, and Jarke J. van Wijk -// Modified to support a target aspect ratio by Jeff Heer -d3.layout.treemap = function() { - var hierarchy = d3.layout.hierarchy(), - round = Math.round, - size = [1, 1], // width, height - padding = null, - pad = d3_layout_treemapPadNull, - sticky = false, - stickies, - ratio = 0.5 * (1 + Math.sqrt(5)); // golden ratio - - // Compute the area for each child based on value & scale. - function scale(children, k) { - var i = -1, - n = children.length, - child, - area; - while (++i < n) { - area = (child = children[i]).value * (k < 0 ? 0 : k); - child.area = isNaN(area) || area <= 0 ? 0 : area; - } - } - - // Recursively arranges the specified node's children into squarified rows. - function squarify(node) { - if (!node.children) return; - var rect = pad(node), - row = [], - children = node.children.slice(), // copy-on-write - child, - best = Infinity, // the best row score so far - score, // the current row score - u = Math.min(rect.dx, rect.dy), // initial orientation - n; - scale(children, rect.dx * rect.dy / node.value); - row.area = 0; - while ((n = children.length) > 0) { - row.push(child = children[n - 1]); - row.area += child.area; - if ((score = worst(row, u)) <= best) { // continue with this orientation - children.pop(); - best = score; - } else { // abort, and try a different orientation - row.area -= row.pop().area; - position(row, u, rect, false); - u = Math.min(rect.dx, rect.dy); - row.length = row.area = 0; - best = Infinity; - } - } - if (row.length) { - position(row, u, rect, true); - row.length = row.area = 0; - } - node.children.forEach(squarify); - } - - // Recursively resizes the specified node's children into existing rows. - // Preserves the existing layout! - function stickify(node) { - if (!node.children) return; - var rect = pad(node), - children = node.children.slice(), // copy-on-write - child, - row = []; - scale(children, rect.dx * rect.dy / node.value); - row.area = 0; - while (child = children.pop()) { - row.push(child); - row.area += child.area; - if (child.z != null) { - position(row, child.z ? rect.dx : rect.dy, rect, !children.length); - row.length = row.area = 0; - } - } - node.children.forEach(stickify); - } - - // Computes the score for the specified row, as the worst aspect ratio. - function worst(row, u) { - var s = row.area, - r, - rmax = 0, - rmin = Infinity, - i = -1, - n = row.length; - while (++i < n) { - if (!(r = row[i].area)) continue; - if (r < rmin) rmin = r; - if (r > rmax) rmax = r; - } - s *= s; - u *= u; - return s - ? Math.max((u * rmax * ratio) / s, s / (u * rmin * ratio)) - : Infinity; - } - - // Positions the specified row of nodes. Modifies `rect`. - function position(row, u, rect, flush) { - var i = -1, - n = row.length, - x = rect.x, - y = rect.y, - v = u ? round(row.area / u) : 0, - o; - if (u == rect.dx) { // horizontal subdivision - if (flush || v > rect.dy) v = v ? rect.dy : 0; // over+underflow - while (++i < n) { - o = row[i]; - o.x = x; - o.y = y; - o.dy = v; - x += o.dx = v ? round(o.area / v) : 0; - } - o.z = true; - o.dx += rect.x + rect.dx - x; // rounding error - rect.y += v; - rect.dy -= v; - } else { // vertical subdivision - if (flush || v > rect.dx) v = v ? rect.dx : 0; // over+underflow - while (++i < n) { - o = row[i]; - o.x = x; - o.y = y; - o.dx = v; - y += o.dy = v ? round(o.area / v) : 0; - } - o.z = false; - o.dy += rect.y + rect.dy - y; // rounding error - rect.x += v; - rect.dx -= v; - } - } - - function treemap(d) { - var nodes = stickies || hierarchy(d), - root = nodes[0]; - root.x = 0; - root.y = 0; - root.dx = size[0]; - root.dy = size[1]; - if (stickies) hierarchy.revalue(root); - scale([root], root.dx * root.dy / root.value); - (stickies ? stickify : squarify)(root); - if (sticky) stickies = nodes; - return nodes; - } - - treemap.size = function(x) { - if (!arguments.length) return size; - size = x; - return treemap; - }; - - treemap.padding = function(x) { - if (!arguments.length) return padding; - - function padFunction(node) { - var p = x.call(treemap, node, node.depth); - return p == null - ? d3_layout_treemapPadNull(node) - : d3_layout_treemapPad(node, typeof p === "number" ? [p, p, p, p] : p); - } - - function padConstant(node) { - return d3_layout_treemapPad(node, x); - } - - var type; - pad = (padding = x) == null ? d3_layout_treemapPadNull - : (type = typeof x) === "function" ? padFunction - : type === "number" ? (x = [x, x, x, x], padConstant) - : padConstant; - return treemap; - }; - - treemap.round = function(x) { - if (!arguments.length) return round != Number; - round = x ? Math.round : Number; - return treemap; - }; - - treemap.sticky = function(x) { - if (!arguments.length) return sticky; - sticky = x; - stickies = null; - return treemap; - }; - - treemap.ratio = function(x) { - if (!arguments.length) return ratio; - ratio = x; - return treemap; - }; - - return d3_layout_hierarchyRebind(treemap, hierarchy); -}; - -function d3_layout_treemapPadNull(node) { - return {x: node.x, y: node.y, dx: node.dx, dy: node.dy}; -} - -function d3_layout_treemapPad(node, padding) { - var x = node.x + padding[3], - y = node.y + padding[0], - dx = node.dx - padding[1] - padding[3], - dy = node.dy - padding[0] - padding[2]; - if (dx < 0) { x += dx / 2; dx = 0; } - if (dy < 0) { y += dy / 2; dy = 0; } - return {x: x, y: y, dx: dx, dy: dy}; -} -})(); diff --git a/rtd_phosphonetx/source/html/demoapp/d3.time.js b/rtd_phosphonetx/source/html/demoapp/d3.time.js deleted file mode 100644 index e1c0831c88e..00000000000 --- a/rtd_phosphonetx/source/html/demoapp/d3.time.js +++ /dev/null @@ -1,692 +0,0 @@ -(function(){d3.time = {}; - -var d3_time = Date; -d3.time.format = function(template) { - var n = template.length; - - function format(date) { - var string = [], - i = -1, - j = 0, - c, - f; - while (++i < n) { - if (template.charCodeAt(i) == 37) { - string.push( - template.substring(j, i), - (f = d3_time_formats[c = template.charAt(++i)]) - ? f(date) : c); - j = i + 1; - } - } - string.push(template.substring(j, i)); - return string.join(""); - } - - format.parse = function(string) { - var date = new d3_time(1900, 0, 1), - i = d3_time_parse(date, template, string, 0); - if (i != string.length) return null; - if (date.hour12) { - var hours = date.getHours() % 12; - date.setHours(date.hour12pm ? hours + 12 : hours); - } - delete date.hour12; - delete date.hour12pm; - return date; - }; - - format.toString = function() { - return template; - }; - - return format; -}; - -function d3_time_parse(date, template, string, j) { - var c, - p, - i = 0, - n = template.length, - m = string.length; - while (i < n) { - if (j >= m) return -1; - c = template.charCodeAt(i++); - if (c == 37) { - p = d3_time_parsers[template.charAt(i++)]; - if (!p || ((j = p(date, string, j)) < 0)) return -1; - } else if (c != string.charCodeAt(j++)) { - return -1; - } - } - return j; -} - -var d3_time_zfill2 = d3.format("02d"), - d3_time_zfill3 = d3.format("03d"), - d3_time_zfill4 = d3.format("04d"), - d3_time_sfill2 = d3.format("2d"); - -var d3_time_formats = { - a: function(d) { return d3_time_weekdays[d.getDay()].substring(0, 3); }, - A: function(d) { return d3_time_weekdays[d.getDay()]; }, - b: function(d) { return d3_time_months[d.getMonth()].substring(0, 3); }, - B: function(d) { return d3_time_months[d.getMonth()]; }, - c: d3.time.format("%a %b %e %H:%M:%S %Y"), - d: function(d) { return d3_time_zfill2(d.getDate()); }, - e: function(d) { return d3_time_sfill2(d.getDate()); }, - H: function(d) { return d3_time_zfill2(d.getHours()); }, - I: function(d) { return d3_time_zfill2(d.getHours() % 12 || 12); }, - j: d3_time_dayOfYear, - L: function(d) { return d3_time_zfill3(d.getMilliseconds()); }, - m: function(d) { return d3_time_zfill2(d.getMonth() + 1); }, - M: function(d) { return d3_time_zfill2(d.getMinutes()); }, - p: function(d) { return d.getHours() >= 12 ? "PM" : "AM"; }, - S: function(d) { return d3_time_zfill2(d.getSeconds()); }, - U: d3_time_weekNumberSunday, - w: function(d) { return d.getDay(); }, - W: d3_time_weekNumberMonday, - x: d3.time.format("%m/%d/%y"), - X: d3.time.format("%H:%M:%S"), - y: function(d) { return d3_time_zfill2(d.getFullYear() % 100); }, - Y: function(d) { return d3_time_zfill4(d.getFullYear() % 10000); }, - Z: d3_time_zone, - "%": function(d) { return "%"; } -}; - -var d3_time_parsers = { - a: d3_time_parseWeekdayAbbrev, - A: d3_time_parseWeekday, - b: d3_time_parseMonthAbbrev, - B: d3_time_parseMonth, - c: d3_time_parseLocaleFull, - d: d3_time_parseDay, - e: d3_time_parseDay, - H: d3_time_parseHour24, - I: d3_time_parseHour12, - // j: function(d, s, i) { /*TODO day of year [001,366] */ return i; }, - L: d3_time_parseMilliseconds, - m: d3_time_parseMonthNumber, - M: d3_time_parseMinutes, - p: d3_time_parseAmPm, - S: d3_time_parseSeconds, - // U: function(d, s, i) { /*TODO week number (sunday) [00,53] */ return i; }, - // w: function(d, s, i) { /*TODO weekday [0,6] */ return i; }, - // W: function(d, s, i) { /*TODO week number (monday) [00,53] */ return i; }, - x: d3_time_parseLocaleDate, - X: d3_time_parseLocaleTime, - y: d3_time_parseYear, - Y: d3_time_parseFullYear - // , - // Z: function(d, s, i) { /*TODO time zone */ return i; }, - // "%": function(d, s, i) { /*TODO literal % */ return i; } -}; - -// Note: weekday is validated, but does not set the date. -function d3_time_parseWeekdayAbbrev(date, string, i) { - return string.substring(i, i += 3).toLowerCase() in d3_time_weekdayAbbrevLookup ? i : -1; -} - -var d3_time_weekdayAbbrevLookup = { - sun: 3, - mon: 3, - tue: 3, - wed: 3, - thu: 3, - fri: 3, - sat: 3 -}; - -// Note: weekday is validated, but does not set the date. -function d3_time_parseWeekday(date, string, i) { - d3_time_weekdayRe.lastIndex = 0; - var n = d3_time_weekdayRe.exec(string.substring(i, i + 10)); - return n ? i += n[0].length : -1; -} - -var d3_time_weekdayRe = /^(?:Sunday|Monday|Tuesday|Wednesday|Thursday|Friday|Saturday)/ig; - -var d3_time_weekdays = [ - "Sunday", - "Monday", - "Tuesday", - "Wednesday", - "Thursday", - "Friday", - "Saturday" -]; - -function d3_time_parseMonthAbbrev(date, string, i) { - var n = d3_time_monthAbbrevLookup[string.substring(i, i += 3).toLowerCase()]; - return n == null ? -1 : (date.setMonth(n), i); -} - -var d3_time_monthAbbrevLookup = { - jan: 0, - feb: 1, - mar: 2, - apr: 3, - may: 4, - jun: 5, - jul: 6, - aug: 7, - sep: 8, - oct: 9, - nov: 10, - dec: 11 -}; - -function d3_time_parseMonth(date, string, i) { - d3_time_monthRe.lastIndex = 0; - var n = d3_time_monthRe.exec(string.substring(i, i + 12)); - return n ? (date.setMonth(d3_time_monthLookup[n[0].toLowerCase()]), i += n[0].length) : -1; -} - -var d3_time_monthRe = /^(?:January|February|March|April|May|June|July|August|September|October|November|December)/ig; - -var d3_time_monthLookup = { - january: 0, - february: 1, - march: 2, - april: 3, - may: 4, - june: 5, - july: 6, - august: 7, - september: 8, - october: 9, - november: 10, - december: 11 -}; - -var d3_time_months = [ - "January", - "February", - "March", - "April", - "May", - "June", - "July", - "August", - "September", - "October", - "November", - "December" -]; - -function d3_time_parseLocaleFull(date, string, i) { - return d3_time_parse(date, d3_time_formats.c.toString(), string, i); -} - -function d3_time_parseLocaleDate(date, string, i) { - return d3_time_parse(date, d3_time_formats.x.toString(), string, i); -} - -function d3_time_parseLocaleTime(date, string, i) { - return d3_time_parse(date, d3_time_formats.X.toString(), string, i); -} - -function d3_time_parseFullYear(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.substring(i, i + 4)); - return n ? (date.setFullYear(n[0]), i += n[0].length) : -1; -} - -function d3_time_parseYear(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.substring(i, i + 2)); - return n ? (date.setFullYear(d3_time_century() + +n[0]), i += n[0].length) : -1; -} - -function d3_time_century() { - return ~~(new Date().getFullYear() / 1000) * 1000; -} - -function d3_time_parseMonthNumber(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.substring(i, i + 2)); - return n ? (date.setMonth(n[0] - 1), i += n[0].length) : -1; -} - -function d3_time_parseDay(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.substring(i, i + 2)); - return n ? (date.setDate(+n[0]), i += n[0].length) : -1; -} - -// Note: we don't validate that the hour is in the range [0,23]. -function d3_time_parseHour24(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.substring(i, i + 2)); - return n ? (date.setHours(+n[0]), i += n[0].length) : -1; -} - -// Note: we don't validate that the hour is in the range [1,12]. -function d3_time_parseHour12(date, string, i) { - date.hour12 = true; - return d3_time_parseHour24(date, string, i); -} - -function d3_time_parseMinutes(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.substring(i, i + 2)); - return n ? (date.setMinutes(+n[0]), i += n[0].length) : -1; -} - -function d3_time_parseSeconds(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.substring(i, i + 2)); - return n ? (date.setSeconds(+n[0]), i += n[0].length) : -1; -} - -function d3_time_parseMilliseconds(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.substring(i, i + 3)); - return n ? (date.setMilliseconds(+n[0]), i += n[0].length) : -1; -} - -// Note: we don't look at the next directive. -var d3_time_numberRe = /\s*\d+/; - -function d3_time_parseAmPm(date, string, i) { - var n = d3_time_amPmLookup[string.substring(i, i += 2).toLowerCase()]; - return n == null ? -1 : (date.hour12pm = n, i); -} - -var d3_time_amPmLookup = { - am: 0, - pm: 1 -}; - -function d3_time_year(d) { - return new d3_time(d.getFullYear(), 0, 1); -} - -function d3_time_daysElapsed(d0, d1) { - return ~~((d1 - d0) / 864e5 - (d1.getTimezoneOffset() - d0.getTimezoneOffset()) / 1440); -} - -function d3_time_dayOfYear(d) { - return d3_time_zfill3(1 + d3_time_daysElapsed(d3_time_year(d), d)); -} - -function d3_time_weekNumberSunday(d) { - var d0 = d3_time_year(d); - return d3_time_zfill2(~~((d3_time_daysElapsed(d0, d) + d0.getDay()) / 7)); -} - -function d3_time_weekNumberMonday(d) { - var d0 = d3_time_year(d); - return d3_time_zfill2(~~((d3_time_daysElapsed(d0, d) + (d0.getDay() + 6) % 7) / 7)); -} - -// TODO table of time zone offset names? -function d3_time_zone(d) { - var z = d.getTimezoneOffset(), - zs = z > 0 ? "-" : "+", - zh = ~~(Math.abs(z) / 60), - zm = Math.abs(z) % 60; - return zs + d3_time_zfill2(zh) + d3_time_zfill2(zm); -} -d3.time.format.utc = function(template) { - var local = d3.time.format(template); - - function format(date) { - try { - d3_time = d3_time_format_utc; - var utc = new d3_time(); - utc._ = date; - return local(utc); - } finally { - d3_time = Date; - } - } - - format.parse = function(string) { - try { - d3_time = d3_time_format_utc; - var date = local.parse(string); - return date && date._; - } finally { - d3_time = Date; - } - }; - - format.toString = local.toString; - - return format; -}; - -function d3_time_format_utc() { - this._ = new Date(Date.UTC.apply(this, arguments)); -} - -d3_time_format_utc.prototype = { - getDate: function() { return this._.getUTCDate(); }, - getDay: function() { return this._.getUTCDay(); }, - getFullYear: function() { return this._.getUTCFullYear(); }, - getHours: function() { return this._.getUTCHours(); }, - getMilliseconds: function() { return this._.getUTCMilliseconds(); }, - getMinutes: function() { return this._.getUTCMinutes(); }, - getMonth: function() { return this._.getUTCMonth(); }, - getSeconds: function() { return this._.getUTCSeconds(); }, - getTimezoneOffset: function() { return 0; }, - valueOf: function() { return this._.getTime(); }, - setDate: function(x) { this._.setUTCDate(x); }, - setDay: function(x) { this._.setUTCDay(x); }, - setFullYear: function(x) { this._.setUTCFullYear(x); }, - setHours: function(x) { this._.setUTCHours(x); }, - setMilliseconds: function(x) { this._.setUTCMilliseconds(x); }, - setMinutes: function(x) { this._.setUTCMinutes(x); }, - setMonth: function(x) { this._.setUTCMonth(x); }, - setSeconds: function(x) { this._.setUTCSeconds(x); } -}; -var d3_time_formatIso = d3.time.format.utc("%Y-%m-%dT%H:%M:%S.%LZ"); - -d3.time.format.iso = Date.prototype.toISOString ? d3_time_formatIsoNative : d3_time_formatIso; - -function d3_time_formatIsoNative(date) { - return date.toISOString(); -} - -d3_time_formatIsoNative.parse = function(string) { - return new Date(string); -}; - -d3_time_formatIsoNative.toString = d3_time_formatIso.toString; -function d3_time_range(floor, step, number) { - return function(t0, t1, dt) { - var time = floor(t0), times = []; - if (time < t0) step(time); - if (dt > 1) { - while (time < t1) { - var date = new Date(+time); - if (!(number(date) % dt)) times.push(date); - step(time); - } - } else { - while (time < t1) times.push(new Date(+time)), step(time); - } - return times; - }; -} -d3.time.second = function(date) { - return new Date(~~(date / 1e3) * 1e3); -}; - -d3.time.second.utc = d3.time.second; -d3.time.seconds = d3_time_range(d3.time.second, function(date) { - date.setTime(date.getTime() + 1e3); -}, function(date) { - return date.getSeconds(); -}); - -d3.time.seconds.utc = d3.time.seconds; -d3.time.minute = function(date) { - return new Date(~~(date / 6e4) * 6e4); -}; - -d3.time.minute.utc = d3.time.minute;d3.time.minutes = d3_time_range(d3.time.minute, d3_time_minutesStep, function(date) { - return date.getMinutes(); -}); - -d3.time.minutes.utc = d3_time_range(d3.time.minute, d3_time_minutesStep, function(date) { - return date.getUTCMinutes(); -}); - -function d3_time_minutesStep(date) { - date.setTime(date.getTime() + 6e4); // assumes no leap seconds -} -d3.time.hour = function(date) { - var offset = date.getTimezoneOffset() / 60; - return new Date((~~(date / 36e5 - offset) + offset) * 36e5); -}; - -d3.time.hour.utc = function(date) { - return new Date(~~(date / 36e5) * 36e5); -}; -d3.time.hours = d3_time_range(d3.time.hour, d3_time_hoursStep, function(date) { - return date.getHours(); -}); - -d3.time.hours.utc = d3_time_range(d3.time.hour.utc, d3_time_hoursStep, function(date) { - return date.getUTCHours(); -}); - -function d3_time_hoursStep(date) { - date.setTime(date.getTime() + 36e5); -} -d3.time.day = function(date) { - return new Date(date.getFullYear(), date.getMonth(), date.getDate()); -}; - -d3.time.day.utc = function(date) { - return new Date(~~(date / 864e5) * 864e5); -}; -d3.time.days = d3_time_range(d3.time.day, function(date) { - date.setDate(date.getDate() + 1); -}, function(date) { - return date.getDate() - 1; -}); - -d3.time.days.utc = d3_time_range(d3.time.day.utc, function(date) { - date.setUTCDate(date.getUTCDate() + 1); -}, function(date) { - return date.getUTCDate() - 1; -}); -d3.time.week = function(date) { - (date = d3.time.day(date)).setDate(date.getDate() - date.getDay()); - return date; -}; - -d3.time.week.utc = function(date) { - (date = d3.time.day.utc(date)).setUTCDate(date.getUTCDate() - date.getUTCDay()); - return date; -}; -d3.time.weeks = d3_time_range(d3.time.week, function(date) { - date.setDate(date.getDate() + 7); -}, function(date) { - return ~~((date - new Date(date.getFullYear(), 0, 1)) / 6048e5); -}); - -d3.time.weeks.utc = d3_time_range(d3.time.week.utc, function(date) { - date.setUTCDate(date.getUTCDate() + 7); -}, function(date) { - return ~~((date - Date.UTC(date.getUTCFullYear(), 0, 1)) / 6048e5); -}); -d3.time.month = function(date) { - return new Date(date.getFullYear(), date.getMonth(), 1); -}; - -d3.time.month.utc = function(date) { - return new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), 1)); -}; -d3.time.months = d3_time_range(d3.time.month, function(date) { - date.setMonth(date.getMonth() + 1); -}, function(date) { - return date.getMonth(); -}); - -d3.time.months.utc = d3_time_range(d3.time.month.utc, function(date) { - date.setUTCMonth(date.getUTCMonth() + 1); -}, function(date) { - return date.getUTCMonth(); -}); -d3.time.year = function(date) { - return new Date(date.getFullYear(), 0, 1); -}; - -d3.time.year.utc = function(date) { - return new Date(Date.UTC(date.getUTCFullYear(), 0, 1)); -}; -d3.time.years = d3_time_range(d3.time.year, function(date) { - date.setFullYear(date.getFullYear() + 1); -}, function(date) { - return date.getFullYear(); -}); - -d3.time.years.utc = d3_time_range(d3.time.year.utc, function(date) { - date.setUTCFullYear(date.getUTCFullYear() + 1); -}, function(date) { - return date.getUTCFullYear(); -}); -// TODO nice -function d3_time_scale(linear, methods, format) { - - function scale(x) { - return linear(x); - } - - scale.invert = function(x) { - return d3_time_scaleDate(linear.invert(x)); - }; - - scale.domain = function(x) { - if (!arguments.length) return linear.domain().map(d3_time_scaleDate); - linear.domain(x); - return scale; - }; - - scale.ticks = function(m, k) { - var extent = d3_time_scaleExtent(scale.domain()); - if (typeof m !== "function") { - var span = extent[1] - extent[0], - target = span / m, - i = d3.bisect(d3_time_scaleSteps, target, 1, d3_time_scaleSteps.length - 1); - if (Math.log(target / d3_time_scaleSteps[i - 1]) < Math.log(d3_time_scaleSteps[i] / target)) --i; - m = methods[i]; - k = m[1]; - m = m[0]; - } - return m(extent[0], extent[1], k); - }; - - scale.tickFormat = function() { - return format; - }; - - scale.copy = function() { - return d3_time_scale(linear.copy(), methods, format); - }; - - // TOOD expose d3_scale_linear_rebind? - scale.range = d3.rebind(scale, linear.range); - scale.rangeRound = d3.rebind(scale, linear.rangeRound); - scale.interpolate = d3.rebind(scale, linear.interpolate); - scale.clamp = d3.rebind(scale, linear.clamp); - - return scale; -} - -// TODO expose d3_scaleExtent? -function d3_time_scaleExtent(domain) { - var start = domain[0], stop = domain[domain.length - 1]; - return start < stop ? [start, stop] : [stop, start]; -} - -function d3_time_scaleDate(t) { - return new Date(t); -} - -function d3_time_scaleFormat(formats) { - return function(date) { - var i = formats.length - 1, f = formats[i]; - while (!f[1](date)) f = formats[--i]; - return f[0](date); - }; -} - -var d3_time_scaleSteps = [ - 1e3, // 1-second - 5e3, // 5-second - 15e3, // 15-second - 3e4, // 30-second - 6e4, // 1-minute - 3e5, // 5-minute - 9e5, // 15-minute - 18e5, // 30-minute - 36e5, // 1-hour - 108e5, // 3-hour - 216e5, // 6-hour - 432e5, // 12-hour - 864e5, // 1-day - 1728e5, // 2-day - 6048e5, // 1-week - 1728e6, // 1-month - 7776e6, // 3-month - 31536e6 // 1-year -]; - -var d3_time_scaleLocalMethods = [ - [d3.time.seconds, 1], - [d3.time.seconds, 5], - [d3.time.seconds, 15], - [d3.time.seconds, 30], - [d3.time.minutes, 1], - [d3.time.minutes, 5], - [d3.time.minutes, 15], - [d3.time.minutes, 30], - [d3.time.hours, 1], - [d3.time.hours, 3], - [d3.time.hours, 6], - [d3.time.hours, 12], - [d3.time.days, 1], - [d3.time.days, 2], - [d3.time.weeks, 1], - [d3.time.months, 1], - [d3.time.months, 3], - [d3.time.years, 1] -]; - -var d3_time_scaleLocalFormats = [ - [d3.time.format("%Y"), function(d) { return true; }], - [d3.time.format("%B"), function(d) { return d.getMonth(); }], - [d3.time.format("%b %d"), function(d) { return d.getDate() != 1; }], - [d3.time.format("%a %d"), function(d) { return d.getDay() && d.getDate() != 1; }], - [d3.time.format("%I %p"), function(d) { return d.getHours(); }], - [d3.time.format("%I:%M"), function(d) { return d.getMinutes(); }], - [d3.time.format(":%S"), function(d) { return d.getSeconds() || d.getMilliseconds(); }] -]; - -var d3_time_scaleLocalFormat = d3_time_scaleFormat(d3_time_scaleLocalFormats); - -d3.time.scale = function() { - return d3_time_scale(d3.scale.linear(), d3_time_scaleLocalMethods, d3_time_scaleLocalFormat); -}; -var d3_time_scaleUTCMethods = [ - [d3.time.seconds.utc, 1], - [d3.time.seconds.utc, 5], - [d3.time.seconds.utc, 15], - [d3.time.seconds.utc, 30], - [d3.time.minutes.utc, 1], - [d3.time.minutes.utc, 5], - [d3.time.minutes.utc, 15], - [d3.time.minutes.utc, 30], - [d3.time.hours.utc, 1], - [d3.time.hours.utc, 3], - [d3.time.hours.utc, 6], - [d3.time.hours.utc, 12], - [d3.time.days.utc, 1], - [d3.time.days.utc, 2], - [d3.time.weeks.utc, 1], - [d3.time.months.utc, 1], - [d3.time.months.utc, 3], - [d3.time.years.utc, 1] -]; - -var d3_time_scaleUTCFormats = [ - [d3.time.format.utc("%Y"), function(d) { return true; }], - [d3.time.format.utc("%B"), function(d) { return d.getUTCMonth(); }], - [d3.time.format.utc("%b %d"), function(d) { return d.getUTCDate() != 1; }], - [d3.time.format.utc("%a %d"), function(d) { return d.getUTCDay() && d.getUTCDate() != 1; }], - [d3.time.format.utc("%I %p"), function(d) { return d.getUTCHours(); }], - [d3.time.format.utc("%I:%M"), function(d) { return d.getUTCMinutes(); }], - [d3.time.format.utc(":%S"), function(d) { return d.getUTCSeconds() || d.getUTCMilliseconds(); }] -]; - -var d3_time_scaleUTCFormat = d3_time_scaleFormat(d3_time_scaleUTCFormats); - -d3.time.scale.utc = function() { - return d3_time_scale(d3.scale.linear(), d3_time_scaleUTCMethods, d3_time_scaleUTCFormat); -}; -})(); diff --git a/rtd_phosphonetx/source/html/demoapp/images/openBIS_Logo.png b/rtd_phosphonetx/source/html/demoapp/images/openBIS_Logo.png deleted file mode 100644 index 87ae5e81899908f3968ea230205322dc19ff4ee5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7229 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 diff --git a/rtd_phosphonetx/source/html/demoapp/images/openBIS_Logo.svg b/rtd_phosphonetx/source/html/demoapp/images/openBIS_Logo.svg deleted file mode 100644 index 70ac6c77f27..00000000000 --- a/rtd_phosphonetx/source/html/demoapp/images/openBIS_Logo.svg +++ /dev/null @@ -1,68 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Generator: Adobe Illustrator 15.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> -<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> -<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" - width="400.023px" height="174.566px" viewBox="0 0 400.023 174.566" enable-background="new 0 0 400.023 174.566" - xml:space="preserve"> -<g id="Layer_1"> - <g> - <text transform="matrix(1 0 0 1 46.4854 154.2764)"><tspan x="0" y="0" fill="#010101" font-family="'HelveticaNeue-Bold'" font-size="93.505" letter-spacing="-4">open</tspan><tspan x="204.679" y="0" fill="#231F20" font-family="'HelveticaNeue'" font-size="93.505">BIS</tspan></text> - <rect x="204.234" y="158.748" fill="none" width="192.64" height="14.936"/> - <text transform="matrix(1 0 0 1 204.2329 169.876)" fill="#010101" font-family="'HelveticaNeue'" font-size="15.5842">Biology Information System</text> - <g> - <g> - <g> - <g> - <polygon fill="#068172" points="125.213,81.967 141.416,98.167 147.252,92.333 131.053,76.132 125.213,76.132 "/> - </g> - <g> - <g> - <polygon fill="#068172" points="120.206,81.967 104.005,98.167 98.168,92.333 114.368,76.132 120.206,76.132 "/> - </g> - <g> - <polygon fill="#068172" points="120.206,65.286 104.005,49.084 98.168,54.92 114.368,71.12 120.206,71.12 "/> - </g> - </g> - </g> - <g> - <polygon fill="#068172" points="125.213,65.286 141.416,49.084 147.252,54.92 131.053,71.12 125.213,71.12 "/> - </g> - </g> - <g> - <g> - <polygon fill="#A4A4A4" points="76.131,16.201 92.331,0 98.168,5.836 81.969,22.036 76.13,22.036 "/> - </g> - <g> - <g> - <polygon fill="#ADACAF" points="76.131,32.882 92.331,49.084 98.168,43.247 81.969,27.048 76.13,27.048 "/> - </g> - <g> - <g> - <polygon fill="#ADACAF" points="71.122,32.882 54.921,49.084 49.084,43.247 65.283,27.048 71.123,27.048 "/> - </g> - <g> - <polygon fill="#ADACAF" points="71.122,16.201 54.921,0 49.084,5.836 65.283,22.036 71.123,22.036 "/> - </g> - </g> - </g> - </g> - <g> - <g> - <polygon fill="#ADACAF" points="27.046,65.286 43.247,49.084 49.083,54.92 32.884,71.12 27.045,71.12 "/> - </g> - <g> - <polygon fill="#ADACAF" points="27.046,81.967 43.247,98.167 49.083,92.333 32.884,76.132 27.045,76.132 "/> - </g> - <g> - <polygon fill="#ADACAF" points="22.038,81.967 5.837,98.167 0,92.333 16.199,76.132 22.038,76.132 "/> - </g> - <g> - <polygon fill="#ADACAF" points="22.038,65.286 5.837,49.084 0,54.92 16.199,71.12 22.038,71.12 "/> - </g> - </g> - </g> - </g> -</g> -<g id="Layer_2"> -</g> -</svg> diff --git a/rtd_phosphonetx/source/html/demoapp/openbis-demo-app.html b/rtd_phosphonetx/source/html/demoapp/openbis-demo-app.html deleted file mode 100644 index fde4a9f6ce2..00000000000 --- a/rtd_phosphonetx/source/html/demoapp/openbis-demo-app.html +++ /dev/null @@ -1,94 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"> -<html> -<head> - <title>openBIS Proteomics Demo Web App</title> - <link type="text/css" rel="stylesheet" href="body-style.css" /> - <link type="text/css" rel="stylesheet" href="button.css" /> - <link type="text/css" rel="stylesheet" href="tree.css" /> - <script type="text/javascript" src="d3.js"></script> - <script type="text/javascript" src="d3.layout.js"></script> - <script type="text/javascript" src="d3.time.js"></script> - <script type="text/javascript" src="/openbis/resources/js/jquery.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis.js"></script> - <script type="text/javascript" src="proteomics-demo.js"></script> - <!-- To speed development, cache the requests --> - <!-- <script type="text/javascript" src="/openbis/resources/js/openbis-request-cache.js"></script> --> -<script> - -/// The openbisServer we use for our data -//var baseURL = 'https://openbis-phosphonetx.ethz.ch' -var baseURL = 'http://localhost:8888' -var openbisUrl = baseURL + '/openbis-test-proteomics'; -openbisServer = new openbis(baseURL + '/openbis/openbis', baseURL + '/datastore_server'); - - - -$(document).ready(function() { - $('#main').hide(); - - var username = $("#username").value; - if(username == null || username.length==0) { - $("#username").focus(); - } else { - $("#login-button").focus(); - } - - $('#logout-button').click(function() { - openbisServer.logout(function(data) { - $("#login-form-div").show(); - $("#main").hide(); - $("#username").focus(); - }); - clearTable(); - }); - - $('#query-button').click(function() { - var parameters = { "protein" : $.trim($('#protein').val()), - "space" : $.trim($('#space').val())}; - queryForResults(parameters); - }); - - $('#login-form').submit(function() { - openbisServer.login( $.trim($('#username').val()), $.trim($('#password').val()), function(data) { enterApp(data) }) - }); - - openbisServer.ifRestoredSessionActive(function(data) { enterApp(data) }); - - // Make the ENTER key the default button - $("login-form input").keypress(function (e) { - if ((e.which && e.which == 13) || (e.keyCode && e.keyCode == 13)) { - $('button[type=submit].default').click(); - return false; - } else { - return true; - } - }); -}); - -</script> - -</head> -<body> - <img id="openbis-logo" src="images/openBIS_Logo.png" alt="openBIS" style="position: absolute; right: 10px; height: 100px;"/> - <div id="login-form-div"> - <h1>openBIS Proteomics Demo Web App</h1> - <form id="login-form" action="javascript:"> - <input id="username" type="text" required="required"> - <input id="password" type="password" required="required"> - <button class="login-button" id="login-button" type="submit">Login</button> - </form> - </div> - - <div id="main"> - <button id="logout-button">Logout</button> - <form id="query-form" action="javascript:"> - <table> - <tr><td>Space</td><td><input id="space" type="text" required="required"></td></tr> - <tr><td>Protein</td><td><input id="protein" type="text" required="required"></td></tr> - <tr><td></td><td style="text-align: right"><button class="query-button" id="query-button" type="submit">Search</button></td></tr> - </table> - </form> - <div id="waiting" style="display: none;">Please, wait while loading data.</div> - </div> -</body> -</html> diff --git a/rtd_phosphonetx/source/html/demoapp/proteomics-demo.js b/rtd_phosphonetx/source/html/demoapp/proteomics-demo.js deleted file mode 100644 index abda7882c1b..00000000000 --- a/rtd_phosphonetx/source/html/demoapp/proteomics-demo.js +++ /dev/null @@ -1,225 +0,0 @@ -/// How much horizontal space do the inspectors take -var inspectorsWidth = 100; - -/// A helper function for drawing the lines between nodes -var diagonal = d3.svg.diagonal().projection(function(d) { return [d.y, d.x] }); - -/// The model for the visualization -var model = null; - -/// The visualization, referenced by functions that display content -var vis; - -var didCreateVis = false; - -var indexOfLinkedColumn = 3; - -/** - * Create the DOM elements to store the visualization (tree + inspectors) - */ -function createVis() -{ - if (didCreateVis) return; - - // Create a div to house the tree visualization and the inspectors - vis = d3.select("#main").append("div").attr("id", "vis"); - - didCreateVis = true; -} - -function displayReturnedResults(data) -{ - $("#waiting").hide(); - - if (data.error) { - console.log(data.error); - vis.append("p").text("Could not retrieve data."); - return; - } - - displayResultsAsGraph(createDataModel(data)); -} - -function displayResultsAsGraph(data) -{ - clearVis(); - if (data.length == 0) - { - vis.append("p").text("Nothing found."); - return; - } - - var delayStep = 20, - xOffset = 70, - yOffset = 40, - xStep = 200, - yStep = 30, - xLabel = -30, - yLabel = 18, - columnNames = ['Biological Experiment', 'Biological Sample', 'MS Injection Sample', 'Search Experiment', 'Protein']; - - var graph = vis.selectAll("svg").data([data]).enter().append("svg:svg") - .attr("width", $(window).width() - 50) - .attr("height", $(window).height() - 50); - - var g = graph.selectAll("g").data(function(d) { return d; }) - .enter().append("svg:g") - .attr("transform", function(d,i) { return "translate(" + (xOffset + i * xStep) + ", " - + yOffset + ")"; }); - - g.append("svg:text") - .text(function(d,i) { return columnNames[i]; }) - .attr("class", "columnHeader") - .attr("text-anchor", "middle") - .attr("x", 0) - .attr("y", -10); - - g.selectAll("path").data(function(d) { return d[1]; }) - .enter().append("svg:path") - .attr("class", "line") - .transition().delay(function(d,i) { return i * delayStep; }) - .attr("d", function(d,i) { - var y0 = d[0] * yStep; - var y1 = d[1] * yStep; - return "M0," + y0 - + "Q" + xStep/4 + "," + y0 + "," + xStep/2 + "," + (y0+y1)/2 - + "L" + xStep/2 + "," + (y0+y1)/2 - + "Q" + 3*xStep/4 + "," + y1 + "," + xStep + "," + y1 - + "L" + xStep + "," + y1; - }) - - var node = g.selectAll("g").data(function(d) { return d[0]; }) - .enter().append("svg:g") - .attr("class", "node") - .attr("transform", function(d,i) { return "translate(0, " + (i * yStep) + ")"; }); - - node.append("svg:circle") - .transition().delay(function(d,i) { return i * delayStep; }) - .attr("r", 5); - - node.append("svg:text") - .on("click", function(d) { if (d.level == indexOfLinkedColumn) { - window.open(openbisUrl + "/?#entity=EXPERIMENT&permId=" + d.permId, '_blank'); - } - }) - .transition().delay(function(d,i) { return i * delayStep; }) - .text(function(d) { return d.label; }) - .attr("class", function(d) { return d.level == indexOfLinkedColumn ? "linked" : "notLinked";}) - .attr("text-anchor", "left") - .attr("x", xLabel) - .attr("y", yLabel) -} - - -function Node(level, label, permId) { - this.level = level; - this.label = label; - this.permId = permId; -} - - -function createDataModel(tableModel) -{ - var rows = tableModel.result.rows - var maps = []; - var permIds = {}; - - for (n = 0; n < rows.length; n++) - { - row = rows[n]; - permIds[row[indexOfLinkedColumn].value] = row[4].value; - var accessionNumber = row[5].value; - var splitted = accessionNumber.split("|"); - if (splitted.length > 1) - { - accessionNumber = splitted[1]; - } - row[5].value = accessionNumber + ": " + row[6].value; // concatenate accession number with description - row.splice(6, 1); // remove description - row.splice(4, 1); // remove search experiment perm id - for (i = 0; i < row.length; i++) { - map = maps[i]; - if (map == null) { - map = {}; - maps[i] = map; - } - cell = row[i].value; - links = map[cell]; - if (links == null) { - links = {}; - map[cell] = links; - } - if (i < row.length - 1) { - links[row[i + 1].value] = 0; - } - } - } - var data = []; - for (i = 0; i < maps.length; i++) { - var map = maps[i]; - var elements = []; - for (element in map) { - var permId = null; - if (i == indexOfLinkedColumn) - { - permId = permIds[element]; - } - elements.push(new Node(i, element, permId)); - } - elements.sort(); - var indexMap = {}; - for (j = 0; j < elements.length; j++) { - indexMap[elements[j].label] = j; - } - data.push([elements, [], indexMap]); - } - - for (i = 0; i < maps.length - 1; i++) { - var map = maps[i]; - var from = data[i][0]; - var links = data[i][1]; - var indexMap = data[i + 1][2]; - for (j = 0; j < from.length; j++) { - element = from[j]; - linkedElements = map[element.label]; - for (linkedElement in linkedElements) { - links.push([j, indexMap[linkedElement]]); - } - } - } - - return data; -} - -function clearVis() -{ - $('#vis > *').remove(); -} - -/** - * Request samples matching some criteria from the server and show them in the Page. - */ -function queryForResults(parameters) -{ - $("#waiting").show(); - openbisServer.createReportFromAggregationService("DSS1", "demo-proteomics-aggregation", parameters, displayReturnedResults); -// openbisServer.createReportFromAggregationService("STANDARD", "demo-proteomics-aggregation", parameters, displayReturnedResults); -} - - -function enterApp(data) -{ - if(data.result == null) - { - alert("Login or password incorrect"); - $("#username").focus(); - return; - } - - $("#login-form-div").hide(); - $("#main").show(); - - $('#openbis-logo').height(30); - - createVis(); -} \ No newline at end of file diff --git a/rtd_phosphonetx/source/html/demoapp/tree.css b/rtd_phosphonetx/source/html/demoapp/tree.css deleted file mode 100644 index 2d8808b86a6..00000000000 --- a/rtd_phosphonetx/source/html/demoapp/tree.css +++ /dev/null @@ -1,36 +0,0 @@ -.node circle { - fill: #fff; - stroke: #444444; - stroke-width: 1.5px; -} - -.columnHeader { - font: 16px; - font-weight: bold; -} - -.link { - fill: none; - stroke: #ccc; - stroke-width: 1.5px; - z-index: -1; -} - -.line { - fill: none; - stroke: steelblue; - stroke-width: 1px; -} - -.node { - font: 12px "Verdana", sans-serif; - z-index: 1; - cursor: pointer; - position: relative; - left: -15px; -} - - -.linked:hover { - font-weight: bold; -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/dss/proteomics/server/plugins/APMSReport.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/dss/proteomics/server/plugins/APMSReport.java deleted file mode 100644 index 48e9d481b71..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/dss/proteomics/server/plugins/APMSReport.java +++ /dev/null @@ -1,559 +0,0 @@ -/* - * Copyright 2011 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.dss.proteomics.server.plugins; - -import java.io.File; -import java.io.FileReader; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.Comparator; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Properties; -import java.util.Set; - -import javax.activation.DataHandler; -import javax.mail.util.ByteArrayDataSource; - -import org.apache.commons.io.IOUtils; - -import com.csvreader.CsvReader; - -import ch.rinn.restrictions.Private; -import ch.systemsx.cisd.base.exceptions.CheckedExceptionTunnel; -import ch.systemsx.cisd.common.exceptions.EnvironmentFailureException; -import ch.systemsx.cisd.common.exceptions.Status; -import ch.systemsx.cisd.common.exceptions.UserFailureException; -import ch.systemsx.cisd.common.mail.EMailAddress; -import ch.systemsx.cisd.common.string.Template; -import ch.systemsx.cisd.openbis.dss.generic.server.plugins.standard.AbstractTableModelReportingPlugin; -import ch.systemsx.cisd.openbis.dss.generic.shared.DataSetProcessingContext; -import ch.systemsx.cisd.openbis.dss.generic.shared.IDataSetDirectoryProvider; -import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService; -import ch.systemsx.cisd.openbis.dss.generic.shared.IProcessingPluginTask; -import ch.systemsx.cisd.openbis.dss.generic.shared.ProcessingStatus; -import ch.systemsx.cisd.openbis.dss.generic.shared.ServiceProvider; -import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DoubleTableCell; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ISerializableComparable; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ListSampleCriteria; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Material; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.StringTableCell; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModel; -import ch.systemsx.cisd.openbis.generic.shared.dto.DatasetDescription; -import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifier; -import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifierFactory; -import ch.systemsx.cisd.openbis.generic.shared.util.SimpleTableModelBuilder; - -/** - * Creates an APMS report from proteins.csv - * - * @author Franz-Josef Elmer - */ -public class APMSReport extends AbstractTableModelReportingPlugin implements IProcessingPluginTask -{ - private static final class Header - { - private final boolean abundanceHeader; - - private final String header; - - private String biologicalSample; - - private String protein; - - Header(String header, String newHeader) - { - abundanceHeader = newHeader != null; - this.header = abundanceHeader ? newHeader : header; - } - - public final String getBiologicalSample() - { - return biologicalSample; - } - - public final void setBiologicalSample(String biologicalSample) - { - this.biologicalSample = biologicalSample; - } - - public final String getProtein() - { - return protein; - } - - public final void setProtein(String protein) - { - this.protein = protein; - } - - public final String getHeader() - { - return header; - } - - public final boolean isAbundanceHeader() - { - return abundanceHeader; - } - - @Override - public String toString() - { - return abundanceHeader ? header + " [" + biologicalSample + ", " + protein + ']' - : header; - } - } - - private static final class Row - { - private final String[] values; - - private final Map<String, Integer> columnIndexMap; - - Row(String[] values, Map<String, Integer> columnIndexMap) - { - this.values = values; - this.columnIndexMap = columnIndexMap; - } - - public String getValue(String column) - { - Integer index = columnIndexMap.get(column); - return index == null ? "" : values[index]; - } - - @Override - public String toString() - { - return Arrays.asList(values).toString(); - } - } - - private static final class Table - { - private final List<Header> headers; - - private final Map<String, Integer> columnIndexMap = new HashMap<String, Integer>(); - - private final List<Row> rows = new ArrayList<Row>(); - - Table(List<Header> headers) - { - this.headers = headers; - for (int i = 0; i < headers.size(); i++) - { - columnIndexMap.put(headers.get(i).getHeader(), i); - } - } - - void add(String[] row) - { - rows.add(new Row(row, columnIndexMap)); - } - - public final List<Header> getHeaders() - { - return headers; - } - - public final List<Row> getRows() - { - return rows; - } - } - - private static final long serialVersionUID = 1L; - - @Private - static final String PROTEIN_FILE_NAME = "proteins.csv"; - - private static final String PROTEIN_PROPERTY_CODE_KEY = "protein-property-code"; - - @Private - static final String DEFAULT_PROTEIN_PROPERTY_CODE = "PROTEIN"; - - private static final Template E_MAIL_CONTENT_TEMPLATE = - new Template( - "Dear User\n\n" - + "Enclosed you will find the Protein APMS report file for experiment ${experiment-identifier}.\n" - + "Data Set: ${data-set}"); - - private final String proteinPropertyCode; - - private IEncapsulatedOpenBISService service; - - public APMSReport(Properties properties, File storeRoot) - { - super(properties, storeRoot); - proteinPropertyCode = - properties.getProperty(PROTEIN_PROPERTY_CODE_KEY, DEFAULT_PROTEIN_PROPERTY_CODE); - } - - @Override - public TableModel createReport(List<DatasetDescription> datasets, - DataSetProcessingContext context) - { - if (datasets.size() != 1) - { - throw new UserFailureException("Chosen plugin works with exactly one data set. " - + datasets.size() + " data sets selected."); - } - return createTableModel(datasets.get(0), context.getDirectoryProvider()); - } - - @Override - public ProcessingStatus process(List<DatasetDescription> datasets, - DataSetProcessingContext context) - { - ProcessingStatus status = new ProcessingStatus(); - for (DatasetDescription datasetDescription : datasets) - { - try - { - process(datasetDescription, context); - status.addDatasetStatus(datasetDescription, Status.OK); - } catch (Exception ex) - { - status.addDatasetStatus(datasetDescription, - Status.createError("Exception occured: " + ex)); - operationLog.error("Exception occured while processing " + datasetDescription, ex); - } - } - return status; - } - - private void process(DatasetDescription datasetDescription, DataSetProcessingContext context) - { - try - { - TableModel table = - createTableModel(datasetDescription, context.getDirectoryProvider()); - String tableAsString = convertTableToCsvString(table); - String experimentIdentifier = - datasetDescription.getSpaceCode() + '/' + datasetDescription.getProjectCode() - + '/' + datasetDescription.getExperimentCode(); - Template template = E_MAIL_CONTENT_TEMPLATE.createFreshCopy(); - template.bind("experiment-identifier", experimentIdentifier); - template.bind("data-set", datasetDescription.getDataSetCode()); - ByteArrayDataSource dataSource = new ByteArrayDataSource(tableAsString, "text/plain"); - context.getMailClient().sendEmailMessageWithAttachment("Protein APMS Report", - template.createText(), - datasetDescription.getExperimentCode() + "-APMS-report.txt", - new DataHandler(dataSource), null, null, - new EMailAddress(context.getUserEmailOrNull())); - - } catch (IOException ex) - { - throw CheckedExceptionTunnel.wrapIfNecessary(ex); - } - } - - private TableModel createTableModel(DatasetDescription datasetDescription, - IDataSetDirectoryProvider directoryProvider) - { - File proteinFile = getProteinFile(datasetDescription, directoryProvider); - Table table = readTable(proteinFile); - addHeaderMetaData(table); - SimpleTableModelBuilder builder = new SimpleTableModelBuilder(); - builder.addHeader("Sample ID"); - builder.addHeader("Bait"); - builder.addHeader("Prey"); - builder.addHeader("freq of obs"); - builder.addHeader("avg MS1 intensities (normalized for the bait)"); - builder.addHeader("STDV MS1 intensity"); - List<Entry<String, List<Header>>> groups = calculateAbundanceColumnGroups(table); - List<Row> rows = table.getRows(); - for (int i = 0; i < rows.size(); i++) - { - Row row = rows.get(i); - addRowsTo(builder, row, i, groups); - } - return builder.getTableModel(); - } - - private List<Entry<String, List<Header>>> calculateAbundanceColumnGroups(Table table) - { - List<Header> headers = table.getHeaders(); - Map<String, List<Header>> abundanceColumnHeaders = new HashMap<String, List<Header>>(); - for (Header header : headers) - { - if (header.isAbundanceHeader()) - { - String biologicalSample = header.getBiologicalSample(); - List<Header> list = abundanceColumnHeaders.get(biologicalSample); - if (list == null) - { - list = new ArrayList<Header>(); - abundanceColumnHeaders.put(biologicalSample, list); - } - list.add(header); - } - } - Set<Entry<String, List<Header>>> entrySet = abundanceColumnHeaders.entrySet(); - List<Entry<String, List<Header>>> entryList = - new ArrayList<Map.Entry<String, List<Header>>>(entrySet); - Collections.sort(entryList, new Comparator<Entry<String, List<Header>>>() - { - @Override - public int compare(Entry<String, List<Header>> e1, Entry<String, List<Header>> e2) - { - String key1 = e1.getKey(); - String key2 = e2.getKey(); - if (key1 != null && key2 != null) - { - return key1.compareTo(key2); - } - return key1 == null ? (key2 == null ? 0 : 1) : -1; - } - }); - return entryList; - } - - private void addRowsTo(SimpleTableModelBuilder builder, Row row, int i, - List<Entry<String, List<Header>>> groups) - { - String identifiedProtein = row.getValue("protein"); - for (Entry<String, List<Header>> group : groups) - { - String biologicalSample = group.getKey(); - List<Header> headers = group.getValue(); - String protein = null; - double countNonZeroAbundances = 0; - double sum = 0; - double sum2 = 0; - for (Header header : headers) - { - if (biologicalSample != null && protein == null) - { - protein = header.getProtein(); - } - String value = row.getValue(header.getHeader()); - try - { - double abundance = Double.parseDouble(value); - sum += abundance; - sum2 += abundance * abundance; - if (abundance > 0) - { - countNonZeroAbundances++; - } - } catch (NumberFormatException ex) - { - throw new UserFailureException((i + 5) + ". row has an invalid value (" + value - + ") for column " + header.getHeader() + ": " + row); - } - } - double averagedAbundance = sum / headers.size(); - double abundanceStandardDeviation = - Math.sqrt(Math.max(0, sum2 / headers.size() - averagedAbundance - * averagedAbundance)); - double frequencyOfObservation = countNonZeroAbundances / headers.size(); - StringTableCell biologicalSampleCell = StringTableCell.wrap(biologicalSample); - StringTableCell proteinCell = StringTableCell.wrap(protein); - StringTableCell identifiedProteinCell = new StringTableCell(identifiedProtein); - DoubleTableCell freqOfObsvCell = new DoubleTableCell(frequencyOfObservation); - DoubleTableCell abundanceCell = new DoubleTableCell(averagedAbundance); - DoubleTableCell abundanceStdvCell = new DoubleTableCell(abundanceStandardDeviation); - builder.addRow(Arrays.<ISerializableComparable> asList(biologicalSampleCell, - proteinCell, identifiedProteinCell, freqOfObsvCell, abundanceCell, - abundanceStdvCell)); - } - } - - private void addHeaderMetaData(Table table) - { - List<Header> headers = table.getHeaders(); - for (Header header : headers) - { - if (header.isAbundanceHeader()) - { - SampleIdentifier sampleIdentifier = - SampleIdentifierFactory.parse("/MS_DATA/" - + header.getHeader().toUpperCase()); - Sample sample = getService().tryGetSampleWithExperiment(sampleIdentifier); - if (sample == null) - { - throw new UserFailureException("Unknown sample: " + sampleIdentifier); - } - List<Sample> parents = - getService().listSamples( - ListSampleCriteria.createForChild(new TechId(sample.getId()))); - if (parents.size() != 1) - { - throw new UserFailureException("Exactly one parent sample expected for " - + sample.getIdentifier() + " instead of " + parents.size()); - } - Sample biologicalSample = parents.get(0); - header.setBiologicalSample(biologicalSample.getCode()); - String protein = tryToFindProteinProperty(biologicalSample); - if (protein != null) - { - header.setProtein(protein); - } - } - } - } - - private String tryToFindProteinProperty(Sample sample) - { - List<IEntityProperty> sampleProperties = sample.getProperties(); - for (IEntityProperty property : sampleProperties) - { - if (property.getPropertyType().getCode().equalsIgnoreCase(proteinPropertyCode)) - { - Material material = property.getMaterial(); - if (material != null) - { - return material.getCode(); - } - return property.tryGetAsString(); - } - } - List<Sample> parents = - getService().listSamples( - ListSampleCriteria.createForChild(new TechId(sample.getId()))); - for (Sample parent : parents) - { - String proteinProperty = tryToFindProteinProperty(parent); - if (proteinProperty != null) - { - return proteinProperty; - } - } - return null; - } - - private Table readTable(File file) - { - FileReader reader = null; - try - { - reader = new FileReader(file); - CsvReader csvReader = new CsvReader(reader); - csvReader.readRecord(); - csvReader.readRecord(); - csvReader.readRecord(); - Map<String, String> map = createAbundanceColumnMap(csvReader.getRawRecord()); - csvReader.readRecord(); - String[] columnHeaders = csvReader.getValues(); - List<Header> headers = new ArrayList<Header>(); - for (int i = 0; i < columnHeaders.length; i++) - { - String header = columnHeaders[i]; - String newHeader = map.get(header); - headers.add(new Header(header, newHeader)); - } - Table table = new Table(headers); - while (csvReader.readRecord()) - { - table.add(csvReader.getValues()); - } - return table; - } catch (IOException ex) - { - throw CheckedExceptionTunnel.wrapIfNecessary(ex); - } finally - { - IOUtils.closeQuietly(reader); - } - } - - private Map<String, String> createAbundanceColumnMap(String abundanceColumnMappingDescription) - { - int indexOfFirstColon = abundanceColumnMappingDescription.indexOf(':'); - if (indexOfFirstColon < 0) - { - throw new UserFailureException("Missing ':' in third line: " - + abundanceColumnMappingDescription); - } - String[] terms = - abundanceColumnMappingDescription.substring(indexOfFirstColon + 1).split(","); - Map<String, String> map = new HashMap<String, String>(); - for (String term : terms) - { - int indexOfColon = term.indexOf(':'); - if (indexOfColon < 0) - { - throw new UserFailureException("Missing ':' in mapping definition: " + term); - } - String abundanceColumn = "abundance_" + term.substring(0, indexOfColon).trim(); - String fileName = term.substring(indexOfColon + 1).trim(); - int lastIndexOfSlash = fileName.lastIndexOf('/'); - if (lastIndexOfSlash >= 0) - { - fileName = fileName.substring(lastIndexOfSlash + 1); - } - int lastIndexOfDot = fileName.lastIndexOf('.'); - if (lastIndexOfDot >= 0) - { - fileName = fileName.substring(0, lastIndexOfDot); - } - map.put(abundanceColumn, fileName); - } - return map; - } - - private File getProteinFile(DatasetDescription datasetDescription, - IDataSetDirectoryProvider directoryProvider) - { - @SuppressWarnings("deprecation") - File dataSetDir = getDataSubDir(directoryProvider, datasetDescription); - if (dataSetDir.isDirectory() == false) - { - throw new EnvironmentFailureException("Data set folder is not a directory: " - + dataSetDir); - } - File[] files = dataSetDir.listFiles(); - if (files.length == 0) - { - throw new EnvironmentFailureException("Empty data set folder: " + dataSetDir); - } - File proteinFile = new File(files[0], PROTEIN_FILE_NAME); - if (proteinFile.exists() == false) - { - throw new UserFailureException("File " + PROTEIN_FILE_NAME + " missing."); - } - if (proteinFile.isFile() == false) - { - throw new UserFailureException("File " + PROTEIN_FILE_NAME + " is a directory."); - } - return proteinFile; - } - - private IEncapsulatedOpenBISService getService() - { - if (service == null) - { - service = ServiceProvider.getOpenBISService(); - } - return service; - } - - // for tests - void setService(IEncapsulatedOpenBISService service) - { - this.service = service; - } -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/dss/proteomics/server/plugins/DataSetCopier.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/dss/proteomics/server/plugins/DataSetCopier.java deleted file mode 100644 index 35ea9750c05..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/dss/proteomics/server/plugins/DataSetCopier.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.dss.proteomics.server.plugins; - -import static ch.systemsx.cisd.openbis.dss.generic.server.plugins.standard.DataSetCopier.DESTINATION_KEY; - -import java.io.File; -import java.util.Properties; - -import ch.rinn.restrictions.Private; -import ch.systemsx.cisd.openbis.dss.generic.server.plugins.standard.AbstractDropboxProcessingPlugin; -import ch.systemsx.cisd.openbis.dss.generic.server.plugins.standard.IPathCopierFactory; -import ch.systemsx.cisd.openbis.dss.generic.server.plugins.standard.ISshCommandExecutorFactory; -import ch.systemsx.cisd.openbis.dss.generic.server.plugins.standard.RsyncCopierFactory; -import ch.systemsx.cisd.openbis.dss.generic.server.plugins.standard.SshCommandExecutorFactory; -import ch.systemsx.cisd.openbis.dss.generic.shared.DataSetProcessingContext; -import ch.systemsx.cisd.openbis.generic.shared.dto.DatasetDescription; - -/** - * @author Franz-Josef Elmer - */ -public class DataSetCopier extends AbstractDropboxProcessingPlugin -{ - private static final long serialVersionUID = 1L; - - public DataSetCopier(Properties properties, File storeRoot) - { - this(properties, storeRoot, new RsyncCopierFactory(), new SshCommandExecutorFactory()); - } - - @Private - DataSetCopier(Properties properties, File storeRoot, IPathCopierFactory pathCopierFactory, - ISshCommandExecutorFactory sshCommandExecutorFactory) - { - super(properties, storeRoot, new LocalAndRemoteCopier(properties, pathCopierFactory, - sshCommandExecutorFactory)); - } - - @Override - protected String getProcessingDescription(DatasetDescription dataset, - DataSetProcessingContext context) - { - return "Copy to " + properties.getProperty(DESTINATION_KEY); - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/dss/proteomics/server/plugins/LocalAndRemoteCopier.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/dss/proteomics/server/plugins/LocalAndRemoteCopier.java deleted file mode 100644 index 6bdf9380721..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/dss/proteomics/server/plugins/LocalAndRemoteCopier.java +++ /dev/null @@ -1,191 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.dss.proteomics.server.plugins; - -import java.io.File; -import java.io.Serializable; -import java.util.Map; -import java.util.Properties; - -import org.apache.log4j.Logger; - -import ch.rinn.restrictions.Private; -import ch.systemsx.cisd.common.exceptions.ConfigurationFailureException; -import ch.systemsx.cisd.common.exceptions.ExceptionWithStatus; -import ch.systemsx.cisd.common.exceptions.Status; -import ch.systemsx.cisd.common.filesystem.BooleanStatus; -import ch.systemsx.cisd.common.filesystem.FileOperations; -import ch.systemsx.cisd.common.filesystem.FileUtilities; -import ch.systemsx.cisd.common.filesystem.HostAwareFile; -import ch.systemsx.cisd.common.filesystem.IPathCopier; -import ch.systemsx.cisd.common.filesystem.highwatermark.HostAwareFileWithHighwaterMark; -import ch.systemsx.cisd.common.filesystem.ssh.ISshCommandExecutor; -import ch.systemsx.cisd.common.logging.LogCategory; -import ch.systemsx.cisd.common.logging.LogFactory; -import ch.systemsx.cisd.common.properties.PropertyUtils; -import ch.systemsx.cisd.openbis.dss.generic.server.IDataSetFileOperationsExecutor; -import ch.systemsx.cisd.openbis.dss.generic.server.LocalDataSetFileOperationsExcecutor; -import ch.systemsx.cisd.openbis.dss.generic.server.RemoteDataSetFileOperationsExecutor; -import ch.systemsx.cisd.openbis.dss.generic.server.plugins.standard.Copier; -import ch.systemsx.cisd.openbis.dss.generic.server.plugins.standard.DataSetCopier; -import ch.systemsx.cisd.openbis.dss.generic.server.plugins.standard.IPathCopierFactory; -import ch.systemsx.cisd.openbis.dss.generic.server.plugins.standard.ISshCommandExecutorFactory; -import ch.systemsx.cisd.openbis.dss.generic.shared.IPostRegistrationDatasetHandler; -import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetInformation; -import ch.systemsx.cisd.openbis.dss.generic.shared.utils.RSyncConfig; - -/** - * @author Franz-Josef Elmer - */ -class LocalAndRemoteCopier implements Serializable, IPostRegistrationDatasetHandler -{ - - @Private - static final String MARKER_FILE_PREFIX = "marker-file-prefix"; - - @Private - static final String SAMPLE_UNKNOWN = "sample-unknown"; - - private static final long serialVersionUID = 1L; - - final static Logger operationLog = LogFactory.getLogger(LogCategory.OPERATION, - LocalAndRemoteCopier.class); - - private final Properties properties; - - private final IPathCopierFactory pathCopierFactory; - - private final ISshCommandExecutorFactory sshCommandExecutorFactory; - - private transient IDataSetFileOperationsExecutor executor; - - private transient String destination; - - private String markerFilePrefix; - - LocalAndRemoteCopier(Properties properties, IPathCopierFactory pathCopierFactory, - ISshCommandExecutorFactory sshCommandExecutorFactory) - { - this.properties = properties; - this.pathCopierFactory = pathCopierFactory; - this.sshCommandExecutorFactory = sshCommandExecutorFactory; - markerFilePrefix = properties.getProperty(MARKER_FILE_PREFIX); - if (markerFilePrefix != null && markerFilePrefix.length() == 0) - { - throw new ConfigurationFailureException("marker-file-prefix is an empty string."); - } - init(); - } - - private void init() - { - String hostFile = - PropertyUtils.getMandatoryProperty(properties, DataSetCopier.DESTINATION_KEY); - HostAwareFile hostAwareFile = HostAwareFileWithHighwaterMark.create(hostFile, -1); - String hostOrNull = hostAwareFile.tryGetHost(); - destination = hostAwareFile.getPath(); - if (hostOrNull == null) - { - File sshExecutable = null; // don't use ssh locally - File rsyncExecutable = Copier.getExecutable(properties, DataSetCopier.RSYNC_EXEC); - IPathCopier copier = - pathCopierFactory.create(rsyncExecutable, sshExecutable, - DataSetCopier.SSH_TIMEOUT_MILLIS, RSyncConfig.getInstance().getAdditionalCommandLineOptions()); - copier.check(); - String rsyncModule = hostAwareFile.tryGetRsyncModule(); - String rsyncPasswordFile = - properties.getProperty(DataSetCopier.RSYNC_PASSWORD_FILE_KEY); - executor = - new LocalDataSetFileOperationsExcecutor( - FileOperations.getMonitoredInstanceForCurrentThread(), copier, - rsyncModule, rsyncPasswordFile); - } else - { - File sshExecutable = Copier.getExecutable(properties, DataSetCopier.SSH_EXEC); - File rsyncExecutable = Copier.getExecutable(properties, DataSetCopier.RSYNC_EXEC); - File gfindExecutable = Copier.getExecutable(properties, DataSetCopier.GFIND_EXEC); - IPathCopier copier = - pathCopierFactory.create(rsyncExecutable, sshExecutable, - DataSetCopier.SSH_TIMEOUT_MILLIS, RSyncConfig.getInstance().getAdditionalCommandLineOptions()); - copier.check(); - String rsyncModule = hostAwareFile.tryGetRsyncModule(); - String rsyncPasswordFile = - properties.getProperty(DataSetCopier.RSYNC_PASSWORD_FILE_KEY); - FileUtilities.checkPathCopier(copier, hostOrNull, null, rsyncModule, rsyncPasswordFile, - DataSetCopier.SSH_TIMEOUT_MILLIS); - ISshCommandExecutor sshCommandExecutor = - sshCommandExecutorFactory.create(sshExecutable, hostOrNull); - executor = - new RemoteDataSetFileOperationsExecutor(sshCommandExecutor, copier, - gfindExecutable, hostOrNull, rsyncModule, rsyncPasswordFile, - DataSetCopier.SSH_TIMEOUT_MILLIS); - } - } - - @Override - public void undoLastOperation() - { - } - - /** - * Copies specified data file/folder to destination specified in constructor. The name of the file/folder at the destination is defined by the - * data set code. - */ - @Override - public Status handle(File originalData, DataSetInformation dataSetInformation, - Map<String, String> parameterBindings) - { - if (destination == null) - { - init(); - } - try - { - final File destinationLocalFile = new File(destination); - String target = dataSetInformation.getDataSetCode(); - File targetFolder = new File(destinationLocalFile, target); - deleteTargetFolder(targetFolder); - executor.copyDataSetToDestination(originalData, destinationLocalFile); - executor.renameTo(targetFolder, new File(destination, originalData.getName())); - if (markerFilePrefix != null) - { - executor.createMarkerFile(new File(destination, markerFilePrefix + target)); - } - return Status.OK; - - } catch (ExceptionWithStatus ex) - { - return ex.getStatus(); - } - } - - private void deleteTargetFolder(File targetFolder) - { - BooleanStatus targetExists = executor.exists(targetFolder); - if (targetExists.isError()) - { - operationLog.error("Could not check existence of '" + targetFolder + "': " - + targetExists.tryGetMessage()); - throw new ExceptionWithStatus(Status.createError("couldn't check existence")); - } - if (targetExists.isSuccess()) - { - executor.deleteFolder(targetFolder); - } - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/AbstractDataSetInfoExtractorWithService.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/AbstractDataSetInfoExtractorWithService.java deleted file mode 100644 index 07158f3b170..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/AbstractDataSetInfoExtractorWithService.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.etlserver.proteomics; - -import ch.systemsx.cisd.etlserver.IDataSetInfoExtractor; -import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService; - -/** - * @author Franz-Josef Elmer - */ -abstract class AbstractDataSetInfoExtractorWithService implements IDataSetInfoExtractor -{ - protected final IEncapsulatedOpenBISService service; - - protected AbstractDataSetInfoExtractorWithService(IEncapsulatedOpenBISService service) - { - this.service = service; - - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/AbstractHandler.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/AbstractHandler.java deleted file mode 100644 index fdf05fc0585..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/AbstractHandler.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.etlserver.proteomics; - -/** - * Abstract super class of classes using {@link IProtDAO}. - * - * @author Franz-Josef Elmer - */ -abstract class AbstractHandler -{ - protected final IProtDAO dao; - - AbstractHandler(IProtDAO dao) - { - this.dao = dao; - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/AbstractSampleHandler.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/AbstractSampleHandler.java deleted file mode 100644 index 9f102974f9a..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/AbstractSampleHandler.java +++ /dev/null @@ -1,146 +0,0 @@ -/* - * Copyright 2011 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.etlserver.proteomics; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import ch.rinn.restrictions.Private; -import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService; -import ch.systemsx.cisd.openbis.etlserver.proteomics.dto.Experiment; -import ch.systemsx.cisd.openbis.etlserver.proteomics.dto.Sample; -import ch.systemsx.cisd.openbis.generic.shared.dto.ListSamplesByPropertyCriteria; -import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ExperimentIdentifier; -import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifier; -import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifierFactory; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.CommonConstants; - -/** - * Abstract super class of classes getting or creating {@link Sample} instances. - * - * @author Franz-Josef Elmer - */ -abstract class AbstractSampleHandler extends AbstractHandler -{ - @Private - static final String MZXML_FILENAME = "MZXML_FILENAME"; - - protected static final class SampleOrError - { - Sample sample; - - String error; - } - - protected final IEncapsulatedOpenBISService openbisService; - - protected final ExperimentIdentifier experimentIdentifier; - - private final Experiment experiment; - - private final Map<String, SampleOrError> samplesOrErrors = new HashMap<String, SampleOrError>(); - - private final String delimiter; - - private final boolean restrictedSampleResolving; - - AbstractSampleHandler(IEncapsulatedOpenBISService openbisService, IProtDAO dao, - ExperimentIdentifier experimentIdentifier, Experiment experiment, String delimiter, - boolean restrictedSampleResolving) - { - super(dao); - this.openbisService = openbisService; - this.experimentIdentifier = experimentIdentifier; - this.experiment = experiment; - this.delimiter = delimiter; - this.restrictedSampleResolving = restrictedSampleResolving; - } - - protected SampleOrError getOrCreateSampleOrError(String sampleNameAndMore) - { - int indexOfDelimiter = sampleNameAndMore.indexOf(delimiter); - String sampleName; - if (indexOfDelimiter < 0) - { - sampleName = sampleNameAndMore; - } else - { - sampleName = sampleNameAndMore.substring(0, indexOfDelimiter); - } - SampleOrError sampleOrError = samplesOrErrors.get(sampleName); - if (sampleOrError == null) - { - // first we look for a sample in space MS_DATA - SampleIdentifier sampleIdentifier = - SampleIdentifierFactory.parse(sampleName, "/" + CommonConstants.MS_DATA_SPACE); - String sampleCode = sampleIdentifier.getSampleCode(); - ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample sample = - openbisService.tryGetSampleWithExperiment(sampleIdentifier); - sampleOrError = new SampleOrError(); - if (sample != null) - { - sampleOrError.sample = getOrCreateSample(sample.getPermId()); - } else if (restrictedSampleResolving == false) - { - // second we look for a sample in same space as search experiment with - // a property specified by 'sampleName' - String spaceCode = experimentIdentifier.getSpaceCode(); - List<ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample> list = - openbisService.listSamplesByCriteria(new ListSamplesByPropertyCriteria( - MZXML_FILENAME, sampleName, spaceCode, null)); - if (list == null || list.size() == 0) - { - sampleOrError.error = "an unidentified sample: " + sampleName; - } else if (list.size() > 1) - { - sampleOrError.error = - "a not uniquely specified sample (" + list.size() - + " samples are found): " + sampleName; - } else - { - sample = list.get(0); - sampleOrError.sample = getOrCreateSample(sample.getPermId()); - } - } else - { - sampleOrError.error = "Couldn't resolve sample: " + sampleIdentifier; - } - if (sample != null) - { - handleSample(sampleCode, sample); - } - samplesOrErrors.put(sampleName, sampleOrError); - } - return sampleOrError; - } - - private Sample getOrCreateSample(String samplePermID) - { - Sample sample = dao.tryToGetSampleByPermID(samplePermID); - if (sample == null) - { - sample = new Sample(); - sample.setPermID(samplePermID); - sample.setId(dao.createSample(experiment.getId(), samplePermID)); - } - return sample; - } - - protected abstract void handleSample(String parameterName, - ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample sample); -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/AbundanceHandler.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/AbundanceHandler.java deleted file mode 100644 index 38b3223a0ae..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/AbundanceHandler.java +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.etlserver.proteomics; - -import ch.systemsx.cisd.common.exceptions.UserFailureException; -import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService; -import ch.systemsx.cisd.openbis.etlserver.proteomics.dto.Experiment; -import ch.systemsx.cisd.openbis.etlserver.proteomics.dto.Parameter; -import ch.systemsx.cisd.openbis.etlserver.proteomics.dto.Sample; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewSample; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleType; -import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ExperimentIdentifier; -import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifier; -import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SpaceIdentifier; - -/** - * Handler of {@link Parameter} objects of type 'abundance'. - * - * @author Franz-Josef Elmer - */ -class AbundanceHandler extends AbstractSampleHandler -{ - private final SampleType sampleType; - - AbundanceHandler(IEncapsulatedOpenBISService openbisService, IProtDAO dao, - ExperimentIdentifier experimentIdentifier, Experiment experiment, String delimiter, - boolean restrictedSampleResolving) - { - super(openbisService, dao, experimentIdentifier, experiment, delimiter, - restrictedSampleResolving); - sampleType = new SampleType(); - sampleType.setCode(Constants.SEARCH_SAMPLE_TYPE); - } - - void addAbundancesToDatabase(Parameter parameter, long proteinID, String proteinName) - { - Sample sample = getOrCreateSample(parameter.getName(), proteinName); - try - { - double abundance = Double.parseDouble(parameter.getValue()); - dao.createAbundance(proteinID, sample.getId(), abundance); - } catch (NumberFormatException ex) - { - throw new UserFailureException("Abundance of sample '" + parameter.getName() - + "' of protein '" + proteinName + "' is not a number: " + parameter.getValue()); - } - } - - private Sample getOrCreateSample(String parameterName, String proteinName) - { - SampleOrError sampleOrError = getOrCreateSampleOrError(parameterName); - if (sampleOrError.error != null) - { - throw new UserFailureException("Protein '" + proteinName - + "' has an abundance value for " + sampleOrError.error); - } - return sampleOrError.sample; - } - - @Override - @SuppressWarnings("deprecation") - protected void handleSample(String parameterName, - ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample sample) - { - NewSample searchSample = new NewSample(); - searchSample.setSampleType(sampleType); - SpaceIdentifier spaceIdentifier = - new SpaceIdentifier(experimentIdentifier.getSpaceCode()); - SampleIdentifier identifier = - new SampleIdentifier(spaceIdentifier, parameterName + "_" - + experimentIdentifier.getExperimentCode()); - searchSample.setIdentifier(identifier.toString()); - searchSample.setExperimentIdentifier(experimentIdentifier.toString()); - searchSample.setParentIdentifier(sample.getIdentifier()); - openbisService.registerSample(searchSample, null); - } -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/Constants.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/Constants.java deleted file mode 100644 index b41a7e31782..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/Constants.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.etlserver.proteomics; - -/** - * @author Franz-Josef Elmer - */ -public class Constants -{ - public static final String NAMESPACE = "http://regis-web.systemsbiology.net/protXML"; - - public static final String SEARCH_SAMPLE_TYPE = "SEARCH"; -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/DataSetInfoExtractorForMSInjection.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/DataSetInfoExtractorForMSInjection.java deleted file mode 100644 index a593abbdd80..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/DataSetInfoExtractorForMSInjection.java +++ /dev/null @@ -1,237 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.etlserver.proteomics; - -import java.io.File; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; -import java.util.Properties; -import java.util.Set; - -import org.apache.log4j.Logger; - -import ch.systemsx.cisd.common.exceptions.EnvironmentFailureException; -import ch.systemsx.cisd.common.exceptions.UserFailureException; -import ch.systemsx.cisd.common.logging.LogCategory; -import ch.systemsx.cisd.common.logging.LogFactory; -import ch.systemsx.cisd.common.properties.PropertyUtils; -import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService; -import ch.systemsx.cisd.openbis.dss.generic.shared.ServiceProvider; -import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetInformation; -import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetType; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewAttachment; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewExperiment; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewSample; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleType; -import ch.systemsx.cisd.openbis.generic.shared.dto.NewProperty; -import ch.systemsx.cisd.openbis.generic.shared.dto.SampleUpdatesDTO; -import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ExperimentIdentifier; -import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifier; -import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifierFactory; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.CommonConstants; - -/** - * Data set info extractor for MS injection data sets. Information is extracted from a properties file (ms-injection.properties) which is expected t - * be a part of the data set. As a side effect a corresponding sample of type MS_INJECTION is created with the properties of this file. - * - * @author Franz-Josef Elmer - */ -public class DataSetInfoExtractorForMSInjection extends AbstractDataSetInfoExtractorWithService -{ - private final static Logger operationLog = LogFactory.getLogger(LogCategory.OPERATION, - DataSetInfoExtractorForMSInjection.class); - - static final String MS_INJECTION_PROPERTIES_FILE = "ms-injection.properties"; - - static final String DATA_SET_PROPERTIES_FILE = "data-set.properties"; - - static final String PROJECT_CODE_KEY = "PROJECT_CODE"; - - static final String EXPERIMENT_CODE_KEY = "EXPERIMENT_CODE"; - - static final String SAMPLE_CODE_KEY = "SAMPLE_CODE"; - - static final String BIOLOGICAL_SAMPLE_IDENTIFIER_KEY = "BIOLOGICAL_SAMPLE_IDENTIFIER"; - - static final String USER_KEY = "USER"; - - static final String DATA_SET_TYPE_KEY = "DATA_SET_TYPE"; - - static final String FILE_TYPE_KEY = "FILE_TYPE"; - - static final String PARENT_TYPE_KEY = "PARENT_TYPE"; - - static final String EXPERIMENT_TYPE_CODE = "MS_INJECT"; - - public DataSetInfoExtractorForMSInjection(Properties properties) - { - this(ServiceProvider.getOpenBISService()); - } - - DataSetInfoExtractorForMSInjection(IEncapsulatedOpenBISService service) - { - super(service); - } - - @Override - public DataSetInformation getDataSetInformation(File incomingDataSetPath, - IEncapsulatedOpenBISService openbisService) throws UserFailureException, - EnvironmentFailureException - { - Properties sampleProperties = - Util.loadPropertiesFile(incomingDataSetPath, MS_INJECTION_PROPERTIES_FILE); - DataSetInformation info = new DataSetInformation(); - info.setSpaceCode(CommonConstants.MS_DATA_SPACE); - info.setSampleCode(PropertyUtils.getMandatoryProperty(sampleProperties, SAMPLE_CODE_KEY)); - SampleIdentifier sampleIdentifier = info.getSampleIdentifier(); - ExperimentIdentifier experimentIdentifier = getExperimentIdentifier(sampleProperties); - getOrCreateExperiment(experimentIdentifier); - info.setExperimentIdentifier(experimentIdentifier); - long sampleID = - registerOrUpdateSample(sampleIdentifier, experimentIdentifier, sampleProperties); - - Properties dataSetProperties = - Util.loadPropertiesFile(incomingDataSetPath, DATA_SET_PROPERTIES_FILE); - String dataSetTypeCode = - PropertyUtils.getMandatoryProperty(dataSetProperties, DATA_SET_TYPE_KEY); - String parentTypeOrNull = dataSetProperties.getProperty(PARENT_TYPE_KEY); - dataSetProperties.remove(DATA_SET_TYPE_KEY); - dataSetProperties.remove(FILE_TYPE_KEY); - dataSetProperties.remove(PARENT_TYPE_KEY); - setDataSetPropertiesFor(info, dataSetProperties, dataSetTypeCode); - if (parentTypeOrNull != null) - { - List<AbstractExternalData> dataSets = service.listDataSetsBySampleID(sampleID, false); - AbstractExternalData youngestDataSet = null; - for (AbstractExternalData dataSet : dataSets) - { - if (dataSet.getDataSetType().getCode().equals(parentTypeOrNull)) - { - if (youngestDataSet == null || timeStamp(youngestDataSet) < timeStamp(dataSet)) - { - youngestDataSet = dataSet; - } - } - } - if (youngestDataSet != null) - { - info.setParentDataSetCodes(Arrays.asList(youngestDataSet.getCode())); - } - } - return info; - } - - private long registerOrUpdateSample(SampleIdentifier sampleIdentifier, - ExperimentIdentifier experimentIdentifier, Properties properties) - { - SampleType sampleType = service.getSampleType(CommonConstants.MS_INJECTION_SAMPLE_TYPE_CODE); - Sample sample = service.tryGetSampleWithExperiment(sampleIdentifier); - String biologicalSampleIdentifier = tryToGetBiologicalSampleIdentifier(properties); - if (sample == null) - { - NewSample newSample = new NewSample(); - newSample.setSampleType(sampleType); - newSample.setExperimentIdentifier(experimentIdentifier.toString()); - newSample.setIdentifier(sampleIdentifier.toString()); - if (biologicalSampleIdentifier != null) - { - newSample.setParents(biologicalSampleIdentifier); - } - IEntityProperty[] sampleProperties = Util.getAndCheckProperties(properties, sampleType); - newSample.setProperties(sampleProperties); - return service.registerSample(newSample, properties.getProperty(USER_KEY)); - } else - { - TechId sampleID = new TechId(sample.getId()); - List<IEntityProperty> propertiesList = - Util.getProperties(properties, sampleType, new ArrayList<String>()); - Set<NewAttachment> emptySet = Collections.<NewAttachment> emptySet(); - int version = sample.getVersion(); - service.updateSample(new SampleUpdatesDTO(sampleID, propertiesList, - experimentIdentifier, null, emptySet, version, sampleIdentifier, null, - biologicalSampleIdentifier == null ? null : new String[] - { biologicalSampleIdentifier })); - return sample.getId(); - } - } - - private String tryToGetBiologicalSampleIdentifier(Properties properties) - { - String biologicalSampleIdentifier = - properties.getProperty(BIOLOGICAL_SAMPLE_IDENTIFIER_KEY); - if (biologicalSampleIdentifier != null) - { - Sample bioSample = - service.tryGetSampleWithExperiment(SampleIdentifierFactory - .parse(biologicalSampleIdentifier)); - if (bioSample == null) - { - // ignore biological sample if it does not exist. - biologicalSampleIdentifier = null; - operationLog.warn("Property " + BIOLOGICAL_SAMPLE_IDENTIFIER_KEY - + " will be ignored because the specified biological sample " - + biologicalSampleIdentifier + " does not exist."); - } - } - return biologicalSampleIdentifier; - } - - private long timeStamp(AbstractExternalData dataSet) - { - return dataSet.getRegistrationDate().getTime(); - } - - private void setDataSetPropertiesFor(DataSetInformation info, Properties dataSetProperties, - String dataSetTypeCode) - { - DataSetType dataSetType = service.getDataSetType(dataSetTypeCode).getDataSetType(); - IEntityProperty[] props = Util.getAndCheckProperties(dataSetProperties, dataSetType); - List<NewProperty> properties = new ArrayList<NewProperty>(); - for (IEntityProperty p : props) - { - properties.add(new NewProperty(p.getPropertyType().getCode(), p.tryGetAsString())); - } - info.setDataSetProperties(properties); - } - - private long getOrCreateExperiment(ExperimentIdentifier identifier) - { - Experiment experiment = service.tryGetExperiment(identifier); - if (experiment == null) - { - return service.registerExperiment(new NewExperiment(identifier.toString(), - EXPERIMENT_TYPE_CODE)); - } - return experiment.getId(); - } - - private ExperimentIdentifier getExperimentIdentifier(Properties msInjectionProperties) - { - String projectCode = - PropertyUtils.getMandatoryProperty(msInjectionProperties, PROJECT_CODE_KEY); - String experimentCode = - PropertyUtils.getMandatoryProperty(msInjectionProperties, EXPERIMENT_CODE_KEY); - return new ExperimentIdentifier(CommonConstants.MS_DATA_SPACE, projectCode, experimentCode); - } -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/DataSetInfoExtractorForProteinResults.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/DataSetInfoExtractorForProteinResults.java deleted file mode 100644 index 4e0c8e6a8fc..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/DataSetInfoExtractorForProteinResults.java +++ /dev/null @@ -1,241 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.etlserver.proteomics; - -import java.io.File; -import java.util.ArrayList; -import java.util.List; -import java.util.Properties; - -import org.apache.commons.io.FileUtils; -import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Logger; - -import ch.rinn.restrictions.Private; -import ch.systemsx.cisd.common.exceptions.EnvironmentFailureException; -import ch.systemsx.cisd.common.exceptions.UserFailureException; -import ch.systemsx.cisd.common.filesystem.FileUtilities; -import ch.systemsx.cisd.common.io.PropertyIOUtils; -import ch.systemsx.cisd.common.logging.LogCategory; -import ch.systemsx.cisd.common.logging.LogFactory; -import ch.systemsx.cisd.common.properties.PropertyUtils; -import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService; -import ch.systemsx.cisd.openbis.dss.generic.shared.ServiceProvider; -import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetInformation; -import ch.systemsx.cisd.openbis.etlserver.proteomics.dto.ParentDataSetCodes; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentType; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewExperiment; -import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ExperimentIdentifier; -import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ExperimentIdentifierFactory; -import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ProjectIdentifier; - -/** - * @author Franz-Josef Elmer - */ -public class DataSetInfoExtractorForProteinResults extends AbstractDataSetInfoExtractorWithService -{ - private static final Logger operationLog = - LogFactory.getLogger(LogCategory.OPERATION, DataSetInfoExtractorForProteinResults.class); - - static final String NOT_PROCESSED_PROPERTY = "NOT_PROCESSED"; - - @Private - static final String PROT_XML_SIZE_THRESHOLD = "prot-xml-size-threshold-in-MB"; - - private static final int DEFAULT_PROT_XML_SIZE_THRESHOLD = 256; - - @Private - static final String EXPERIMENT_TYPE_CODE_KEY = "experiment-type-code"; - - @Private - static final String EXPERIMENT_CODE_KEY = "experiment-code"; - - @Private - static final String EXPERIMENT_PROPERTIES_FILE_NAME_KEY = "experiment-properties-file-name"; - - @Private - static final String DEFAULT_EXPERIMENT_TYPE_CODE = "MS_SEARCH"; - - @Private - static final String SEPARATOR_KEY = "separator"; - - @Private - static final String DEFAULT_SEPARATOR = "&"; - - @Private - static final String DEFAULT_EXPERIMENT_PROPERTIES_FILE_NAME = "search.properties"; - - static final String PARENT_DATA_SET_CODES = "parent-data-set-codes"; - - static final String EXPERIMENT_IDENTIFIER_KEY = "base-experiment"; - - private final String separator; - - private final String experimentPropertiesFileName; - - private final String experimentTypeCode; - - private final long protXmlSizeThreshold; - - public DataSetInfoExtractorForProteinResults(Properties properties) - { - this(properties, ServiceProvider.getOpenBISService()); - } - - DataSetInfoExtractorForProteinResults(Properties properties, IEncapsulatedOpenBISService service) - { - super(service); - separator = properties.getProperty(SEPARATOR_KEY, DEFAULT_SEPARATOR); - experimentPropertiesFileName = - properties.getProperty(EXPERIMENT_PROPERTIES_FILE_NAME_KEY, - DEFAULT_EXPERIMENT_PROPERTIES_FILE_NAME); - experimentTypeCode = - properties.getProperty(EXPERIMENT_TYPE_CODE_KEY, DEFAULT_EXPERIMENT_TYPE_CODE); - protXmlSizeThreshold = PropertyUtils.getInt(properties, PROT_XML_SIZE_THRESHOLD, - DEFAULT_PROT_XML_SIZE_THRESHOLD) * FileUtils.ONE_MB; - } - - @Override - public DataSetInformation getDataSetInformation(File incomingDataSetPath, - IEncapsulatedOpenBISService openbisService) throws UserFailureException, - EnvironmentFailureException - { - String name = incomingDataSetPath.getName(); - String[] items = StringUtils.splitByWholeSeparator(name, separator); - if (items.length < 2) - { - throw new UserFailureException( - "The name of the data set should have at least two parts separated by '" - + separator + "': " + name); - } - ProjectIdentifier projectIdentifier = new ProjectIdentifier(items[0], items[1]); - Properties properties = - loadSearchProperties(new File(incomingDataSetPath, experimentPropertiesFileName)); - String experimentCode = properties.getProperty(EXPERIMENT_CODE_KEY); - if (experimentCode == null) - { - experimentCode = service.generateCodes("E", EntityKind.EXPERIMENT, 1).get(0); - } - ExperimentIdentifier experimentIdentifier = - new ExperimentIdentifier(projectIdentifier, experimentCode); - NewExperiment experiment = - new NewExperiment(experimentIdentifier.toString(), experimentTypeCode); - ExperimentType experimentType = service.getExperimentType(experimentTypeCode); - File protXMLFile = Util.tryGetProtXMLFile(incomingDataSetPath); - if (protXMLFile == null) - { - throw new UserFailureException("No *prot.xml file found in data set '" + incomingDataSetPath + "'."); - } - long fileSize = protXMLFile.length(); - if (fileSize > protXmlSizeThreshold) - { - String reason = "Size of prot.xml file " + protXMLFile.getName() + " is with " - + FileUtilities.byteCountToDisplaySize(fileSize) + " too large. Maximum size is " - + FileUtilities.byteCountToDisplaySize(protXmlSizeThreshold); - operationLog.warn(reason); - properties.setProperty(NOT_PROCESSED_PROPERTY, reason); - } - - experiment.setProperties(Util.getAndCheckProperties(properties, experimentType)); - DataSetInformation info = new DataSetInformation(); - info.setExperimentIdentifier(experimentIdentifier); - String parentDataSetCodesOrNull = getProperty(properties, PARENT_DATA_SET_CODES); - String baseExperimentIdentifier = getProperty(properties, EXPERIMENT_IDENTIFIER_KEY); - ParentDataSetCodes parentDataSetCodes = - getParentDataSetCodes(parentDataSetCodesOrNull, baseExperimentIdentifier, service); - if (parentDataSetCodes.getErrorMessage() == null) - { - info.setParentDataSetCodes(parentDataSetCodes.getDataSetCodes()); - } else - { - throw new UserFailureException(parentDataSetCodes.getErrorMessage()); - } - service.registerExperiment(experiment); - return info; - } - - /** - * Returns data set codes either from the first argument or if <code>null</code> from the data sets of the specified experiment. - */ - static ParentDataSetCodes getParentDataSetCodes(String parentDataSetCodesOrNull, - String baseExperimentIdentifier, IEncapsulatedOpenBISService service) - { - List<AbstractExternalData> parentDataSets = new ArrayList<AbstractExternalData>(); - StringBuilder builder = new StringBuilder(); - if (parentDataSetCodesOrNull != null) - { - for (String code : StringUtils.split(parentDataSetCodesOrNull, ", ")) - { - AbstractExternalData dataSet = service.tryGetDataSet(code); - if (dataSet != null) - { - parentDataSets.add(dataSet); - } else - { - builder.append(builder.length() == 0 ? "Unknown data sets: " : ", "); - builder.append(code); - } - } - } else if (baseExperimentIdentifier != null) - { - ExperimentIdentifier identifier = - new ExperimentIdentifierFactory(baseExperimentIdentifier).createIdentifier(); - Experiment baseExperiment = service.tryGetExperiment(identifier); - if (baseExperiment != null) - { - parentDataSets.addAll(service.listDataSetsByExperimentID(baseExperiment.getId())); - } else - { - builder.append("Unkown experiment ").append(baseExperimentIdentifier); - } - } - List<String> parentDataSetCodes = new ArrayList<String>(); - for (AbstractExternalData dataSet : parentDataSets) - { - parentDataSetCodes.add(dataSet.getCode()); - } - String errorMessage = builder.length() > 0 ? builder.toString() : null; - return new ParentDataSetCodes(parentDataSetCodes, errorMessage); - } - - private String getProperty(Properties properties, String key) - { - String property = properties.getProperty(key); - if (property == null) - { - property = properties.getProperty(key.toUpperCase()); - } - return property; - } - - private Properties loadSearchProperties(File propertiesFile) - { - Properties properties; - if (propertiesFile.exists() == false) - { - properties = new Properties(); - } else - { - properties = PropertyIOUtils.loadProperties(propertiesFile); - } - return properties; - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/DatabaseVersionHolder.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/DatabaseVersionHolder.java deleted file mode 100644 index b4499699df4..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/DatabaseVersionHolder.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright 2012 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.etlserver.proteomics; - -import ch.systemsx.cisd.openbis.dss.generic.shared.IDatabaseVersionHolder; - -/** - * Holds the version of the proteomics database. - * - * @author Franz-Josef Elmer - */ -public class DatabaseVersionHolder implements IDatabaseVersionHolder -{ - @Override - public String getDatabaseVersion() - { - return "005"; // changed in S124 - } -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/IProtDAO.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/IProtDAO.java deleted file mode 100644 index 6b5a3982f5b..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/IProtDAO.java +++ /dev/null @@ -1,105 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.etlserver.proteomics; - -import java.util.List; - -import net.lemnik.eodsql.BaseQuery; -import net.lemnik.eodsql.Select; -import net.lemnik.eodsql.Update; - -import ch.systemsx.cisd.openbis.etlserver.proteomics.dto.Database; -import ch.systemsx.cisd.openbis.etlserver.proteomics.dto.Experiment; -import ch.systemsx.cisd.openbis.etlserver.proteomics.dto.ProteinReference; -import ch.systemsx.cisd.openbis.etlserver.proteomics.dto.Sample; -import ch.systemsx.cisd.openbis.etlserver.proteomics.dto.Sequence; - -/** - * @author Franz-Josef Elmer - */ -public interface IProtDAO extends BaseQuery -{ - @Select("select * from experiments where perm_id = ?{1}") - public Experiment tryToGetExperimentByPermID(String permID); - - @Select("insert into experiments (perm_id) values (?{1}) returning id") - public long createExperiment(String experimentPermID); - - @Select("select * from samples where perm_id = ?{1}") - public Sample tryToGetSampleByPermID(String permID); - - @Select("insert into samples (expe_id, perm_id) values (?{1}, ?{2}) returning id") - public long createSample(long experimentID, String samplePermID); - - @Select("select * from databases where name_and_version = ?{1}") - public Database tryToGetDatabaseByName(String name); - - @Select("insert into databases (name_and_version) values (?{1}) returning id") - public long createDatabase(String databaseName); - - @Select("select * from data_sets where perm_id = ?{1}") - public ch.systemsx.cisd.openbis.etlserver.proteomics.dto.DataSet tryToGetDataSetByPermID( - String permID); - - @Select("insert into data_sets (expe_id, perm_id, db_id) values (?{1}, ?{2}, ?{3}) returning id") - public long createDataSet(long experimentID, String dataSetPermID, - long databaseID); - - @Update("insert into probability_fdr_mappings (dase_id, probability, false_discovery_rate) " - + "values (?{1}, ?{2}, ?{3})") - public void createProbabilityToFDRMapping(long dataSetID, double probability, - double falseDiscoveryRate); - - @Select("insert into proteins (dase_id, probability) values (?{1}, ?{2}) returning id") - public long createProtein(long dataSetID, double probability); - - @Select("insert into peptides (prot_id, sequence, charge) values (?{1}, ?{2}, ?{3}) returning id") - public long createPeptide(long proteinID, String sequence, int charge); - - @Select("insert into modified_peptides (pept_id, nterm_mass, cterm_mass) values (?{1}, ?{2}, ?{3}) returning id") - public long createModifiedPeptide(long peptideID, double nTermMass, double cTermMass); - - @Select("insert into modifications (mope_id, pos, mass) values (?{1}, ?{2}, ?{3}) returning id") - public long createModification(long modPeptideID, int position, double mass); - - @Select("select * from protein_references where accession_number = ?{1}") - public ProteinReference tryToGetProteinReference(String accessionNumber); - - @Select("insert into protein_references (accession_number, description) values (?{1}, ?{2}) returning id") - public long createProteinReference(String accessionNumber, String description); - - @Update("update protein_references set description = ?{2} where id = ?{1}") - public void updateProteinReferenceDescription(long proteinReferenceID, String description); - - @Select("select * from sequences where prre_id = ?{1} and db_id = ?{2}") - public List<Sequence> tryToGetSequencesByReferenceAndDatabase(long referenceID, long databaseID); - - @Select("insert into sequences (db_id, prre_id, amino_acid_sequence, checksum) " - + "values (?{1.databaseID}, ?{1.proteinReferenceID}, ?{1.sequence}, ?{1.checksum}) " - + "returning id") - public long createSequence(Sequence sequence); - - @Update("insert into identified_proteins (prot_id, sequ_id, coverage, is_primary) values (?{1}, ?{2}, ?{3}, ?{4})") - public void createIdentifiedProtein(long proteinID, long sequenceID, double coverage, boolean primary); - - @Update("insert into abundances (prot_id, samp_id, value) values (?{1}, ?{2}, ?{3})") - public void createAbundance(long proteinID, long sampleID, double value); - - @Update("insert into modification_fractions (modi_id, samp_id, fraction) values (?{1}, ?{2}, ?{3})") - public void createModificationFraction(long modID, long sampleID, double fraction); - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/ModificationFraction.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/ModificationFraction.java deleted file mode 100644 index ac20660201b..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/ModificationFraction.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright 2011 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.etlserver.proteomics; - -import ch.systemsx.cisd.openbis.etlserver.proteomics.dto.AminoAcidMass; - -/** - * Data class keeping data extracted from a peptide <parameter> element of type 'modification'. - * - * @author Franz-Josef Elmer - */ -final class ModificationFraction -{ - private final String sample; - - private final double fraction; - - private final AminoAcidMass aminoAcidMass; - - ModificationFraction(String sample, String value) - { - this.sample = sample; - String[] parts = value.split(":"); - if (parts.length != 3) - { - throw exception(value, "Three parts separated by ':' expected."); - } - aminoAcidMass = new AminoAcidMass(); - try - { - aminoAcidMass.setPosition(Integer.parseInt(parts[0])); - } catch (NumberFormatException ex) - { - throw exception(value, "Position part isn't an integer number: " + parts[0]); - } - try - { - aminoAcidMass.setMass(Double.parseDouble(parts[1])); - } catch (NumberFormatException ex) - { - throw exception(value, "Mass part isn't a floating-point number: " + parts[1]); - } - try - { - fraction = Double.parseDouble(parts[2]); - } catch (NumberFormatException ex) - { - throw exception(value, "Fraction part isn't a floating-point number: " + parts[2]); - } - } - - private IllegalArgumentException exception(String value, String message) - { - return new IllegalArgumentException("Peptide parameter value [" + value - + "] for sample '" + sample + "' is invalid: " + message); - } - - public String getSample() - { - return sample; - } - - public AminoAcidMass getAminoAcidMass() - { - return aminoAcidMass; - } - - public double getFraction() - { - return fraction; - } -} \ No newline at end of file diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/ModificationFractionHandler.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/ModificationFractionHandler.java deleted file mode 100644 index 4927baaebda..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/ModificationFractionHandler.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright 2011 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.etlserver.proteomics; - -import java.util.List; - -import ch.systemsx.cisd.common.exceptions.UserFailureException; -import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService; -import ch.systemsx.cisd.openbis.etlserver.proteomics.dto.Experiment; -import ch.systemsx.cisd.openbis.etlserver.proteomics.dto.Sample; -import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ExperimentIdentifier; - -/** - * Handler of modification fractions. - * - * @author Franz-Josef Elmer - */ -class ModificationFractionHandler extends AbstractSampleHandler -{ - public ModificationFractionHandler(IEncapsulatedOpenBISService openbisService, IProtDAO dao, - ExperimentIdentifier experimentIdentifier, Experiment experiment, String delimiter, - boolean restrictedSampleResolving) - { - super(openbisService, dao, experimentIdentifier, experiment, delimiter, - restrictedSampleResolving); - } - - @Override - protected void handleSample(String parameterName, - ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample sample) - { - // Do nothing - } - - public void addModificationFractions(String peptideSequence, long modID, - List<ModificationFraction> modificationFractions) - { - for (ModificationFraction modificationFraction : modificationFractions) - { - Sample sample = getOrCreateSample(modificationFraction.getSample(), peptideSequence); - double fraction = modificationFraction.getFraction(); - dao.createModificationFraction(modID, sample.getId(), fraction); - } - } - - private Sample getOrCreateSample(String sampleName, String peptideSequence) - { - SampleOrError sampleOrError = getOrCreateSampleOrError(sampleName); - if (sampleOrError.error != null) - { - throw new UserFailureException("Protein '" + peptideSequence - + "' has modification for " + sampleOrError.error); - } - return sampleOrError.sample; - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/ProtXMLLoader.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/ProtXMLLoader.java deleted file mode 100644 index 91ea63764a7..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/ProtXMLLoader.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.etlserver.proteomics; - -import java.io.File; -import java.io.FileReader; -import java.io.IOException; -import java.io.InputStream; - -import javax.xml.bind.JAXBContext; -import javax.xml.bind.Unmarshaller; -import javax.xml.bind.UnmarshallerHandler; - -import org.xml.sax.EntityResolver; -import org.xml.sax.InputSource; -import org.xml.sax.SAXException; - -import ch.systemsx.cisd.base.exceptions.CheckedExceptionTunnel; -import ch.systemsx.cisd.common.xml.XMLInfraStructure; -import ch.systemsx.cisd.openbis.etlserver.proteomics.dto.ProteinProphetDetails; -import ch.systemsx.cisd.openbis.etlserver.proteomics.dto.ProteinSummary; - -/** - * Loader of protXML file. - * - * @author Franz-Josef Elmer - */ -class ProtXMLLoader -{ - private final Unmarshaller unmarshaller; - - private final XMLInfraStructure xmlInfraStructure; - - ProtXMLLoader(boolean validating) - { - try - { - JAXBContext context = - JAXBContext.newInstance(ProteinSummary.class, ProteinProphetDetails.class); - unmarshaller = context.createUnmarshaller(); - xmlInfraStructure = new XMLInfraStructure(validating); - xmlInfraStructure.setEntityResolver(new EntityResolver() - { - @Override - public InputSource resolveEntity(String publicId, String systemId) throws SAXException, - IOException - { - String schemaVersion = systemId.substring(systemId.lastIndexOf('/')); - String resource = "/" + ProtXMLLoader.class.getPackage().getName().replace('.', '/') + schemaVersion; - InputStream inputStream = ProtXMLLoader.class.getResourceAsStream(resource); - return inputStream == null ? null : new InputSource(inputStream); - } - }); - - } catch (Exception ex) - { - throw CheckedExceptionTunnel.wrapIfNecessary(ex); - } - } - - ProteinSummary readProtXML(File dataSet) - { - try - { - UnmarshallerHandler unmarshallerHandler = unmarshaller.getUnmarshallerHandler(); - xmlInfraStructure.parse(new FileReader(dataSet), unmarshallerHandler); - Object object = unmarshallerHandler.getResult(); - if (object instanceof ProteinSummary == false) - { - throw new IllegalArgumentException("Wrong type: " + object); - } - return (ProteinSummary) object; - } catch (Exception ex) - { - throw CheckedExceptionTunnel.wrapIfNecessary(ex); - } - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/ProtXMLUploader.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/ProtXMLUploader.java deleted file mode 100644 index ae8432153ce..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/ProtXMLUploader.java +++ /dev/null @@ -1,189 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.etlserver.proteomics; - -import java.io.File; -import java.sql.Connection; -import java.sql.SQLException; -import java.util.List; -import java.util.Properties; - -import javax.sql.DataSource; - -import org.apache.log4j.Logger; - -import ch.systemsx.cisd.base.exceptions.CheckedExceptionTunnel; -import ch.systemsx.cisd.common.logging.LogCategory; -import ch.systemsx.cisd.common.logging.LogFactory; -import ch.systemsx.cisd.common.properties.PropertyUtils; -import ch.systemsx.cisd.dbmigration.DatabaseConfigurationContext; -import ch.systemsx.cisd.etlserver.IDataSetUploader; -import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService; -import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetInformation; -import ch.systemsx.cisd.openbis.etlserver.proteomics.dto.ProteinSummary; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty; - -/** - * @author Franz-Josef Elmer - */ -public class ProtXMLUploader implements IDataSetUploader -{ - private static final String VALIDATING_XML = "validating-xml"; - - private static final String ASSUMING_EXTENDED_PROT_XML = "assuming-extended-prot-xml"; - - private static final String MS_INJECTION_SAMPLE_DELIMITER = "delimiter_for_sample_resolving"; - - private static final String RESTRICTED_SAMPLE_RESOLVING = "restricted_sample_resolving"; - - private static final String DATABASE_ENGINE = "database.engine"; - - private static final String DATABASE_URL_HOST_PART = "database.url-host-part"; - - private static final String DATABASE_BASIC_NAME = "database.basic-name"; - - private static final String DATABASE_KIND = "database.kind"; - - private static final String DATABASE_OWNER = "database.owner"; - - private static final String DATABASE_PASSWORD = "database.password"; - - private static final Logger operationLog = - LogFactory.getLogger(LogCategory.OPERATION, ProtXMLUploader.class); - - private static DataSource createDataSource(Properties properties) - { - DatabaseConfigurationContext context = new DatabaseConfigurationContext(); - context.setDatabaseEngineCode(properties.getProperty(DATABASE_ENGINE, "postgresql")); - context.setUrlHostPart(properties.getProperty(DATABASE_URL_HOST_PART, "")); - context.setBasicDatabaseName(properties.getProperty(DATABASE_BASIC_NAME, "proteomics")); - context.setDatabaseKind(PropertyUtils.getMandatoryProperty(properties, DATABASE_KIND)); - context.setOwner(properties.getProperty(DATABASE_OWNER, "")); - context.setPassword(properties.getProperty(DATABASE_PASSWORD, "")); - return context.getDataSource(); - } - - private final ProtXMLLoader loader; - - private final IEncapsulatedOpenBISService openbisService; - - private final DataSource dataSource; - - private final boolean assumingExtendedProtXML; - - private final String msInjectionSampleDelimiter; - - private final boolean restrictedSampleResolving; - - private ResultDataSetUploader currentResultDataSetUploader; - - public ProtXMLUploader(Properties properties, IEncapsulatedOpenBISService openbisService) - { - dataSource = createDataSource(properties); - this.openbisService = openbisService; - assumingExtendedProtXML = PropertyUtils.getBoolean(properties, ASSUMING_EXTENDED_PROT_XML, false); - msInjectionSampleDelimiter = properties.getProperty(MS_INJECTION_SAMPLE_DELIMITER, "~"); - restrictedSampleResolving = PropertyUtils.getBoolean(properties, RESTRICTED_SAMPLE_RESOLVING, true); - loader = new ProtXMLLoader(PropertyUtils.getBoolean(properties, VALIDATING_XML, false)); - } - - @Override - public void upload(File dataSet, DataSetInformation dataSetInformation) - { - Experiment experiment = dataSetInformation.tryToGetExperiment(); - if (experiment != null) - { - List<IEntityProperty> properties = experiment.getProperties(); - for (IEntityProperty property : properties) - { - if (property.getPropertyType().getCode().equals(DataSetInfoExtractorForProteinResults.NOT_PROCESSED_PROPERTY)) - { - return; - } - } - } - long time = System.currentTimeMillis(); - File protXMLFile = Util.tryGetProtXMLFile(dataSet); - ProteinSummary summary = loader.readProtXML(protXMLFile); - if (operationLog.isInfoEnabled()) - { - operationLog.info(summary.getProteinGroups().size() - + " protein groups are successfully read from '" + protXMLFile + "' in " - + (System.currentTimeMillis() - time) + " msec"); - } - time = System.currentTimeMillis(); - if (currentResultDataSetUploader != null) - { - throw new IllegalStateException( - "The previous transaction has been neither commited nor rollbacked."); - } - currentResultDataSetUploader = createUploader(); - currentResultDataSetUploader.upload(dataSetInformation, summary); - if (operationLog.isInfoEnabled()) - { - operationLog.info("Feeding result database took " + (System.currentTimeMillis() - time) - + " msec."); - } - } - - @Override - public void commit() - { - try - { - if (currentResultDataSetUploader != null) - { - currentResultDataSetUploader.commit(); - } - } finally - { - currentResultDataSetUploader = null; - } - } - - @Override - public void rollback() - { - try - { - if (currentResultDataSetUploader != null) - { - currentResultDataSetUploader.rollback(); - } - } finally - { - currentResultDataSetUploader = null; - } - } - - protected ResultDataSetUploader createUploader() - { - Connection connection; - try - { - connection = dataSource.getConnection(); - connection.setAutoCommit(false); - } catch (SQLException ex) - { - throw CheckedExceptionTunnel.wrapIfNecessary(ex); - } - return new ResultDataSetUploader(connection, openbisService, assumingExtendedProtXML, - msInjectionSampleDelimiter, restrictedSampleResolving); - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/ProteinDescription.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/ProteinDescription.java deleted file mode 100644 index 3b7db8761f1..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/ProteinDescription.java +++ /dev/null @@ -1,132 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.etlserver.proteomics; - -import ch.systemsx.cisd.common.exceptions.UserFailureException; -import ch.systemsx.cisd.openbis.etlserver.proteomics.dto.ProteinAnnotation; - -final class ProteinDescription -{ - static final String DESCRIPTION_KEY = "DE"; - - static final String SEQUENCE_KEY = "SEQ"; - - static String createKeyValuePair(String key, String value) - { - return "\\" + key + "=" + value; - } - - private String accessionNumber; - - private String description; - - private String sequence; - - public ProteinDescription(ProteinAnnotation annotation, long proteinID, - boolean assumingExtendedProtXML) - { - String proteinDescription = annotation.getDescription(); - String[] items = proteinDescription.split("\\\\"); - accessionNumber = tryToGetAccessionNumber(items); - description = tryToGetValue(items, DESCRIPTION_KEY); - sequence = tryToGetValue(items, SEQUENCE_KEY); - if (sequence == null) - { - if (assumingExtendedProtXML) - { - throw new UserFailureException( - "Can not find a amino-acid sequence in following protein description: " - + proteinDescription); - } else - { - sequence = ""; - accessionNumber = getAccessionNumber(annotation, proteinID); - } - } - if (description == null && assumingExtendedProtXML == false) - { - description = proteinDescription; - } - } - - private String getAccessionNumber(ProteinAnnotation annotation, long proteinID) - { - if (annotation.getSwissprotName() != null) - { - return "sp|" + annotation.getSwissprotName(); - } - if (annotation.getTremblName() != null) - { - return "tr|" + annotation.getTremblName(); - } - if (annotation.getIpiName() != null) - { - return "ipi|" + annotation.getIpiName(); - } - if (annotation.getEnsemblName() != null) - { - return "ens|" + annotation.getEnsemblName(); - } - if (annotation.getRefseqName() != null) - { - return "rs|" + annotation.getRefseqName(); - } - if (annotation.getLocusLinkName() != null) - { - return "ll|" + annotation.getLocusLinkName(); - } - if (annotation.getFlybase() != null) - { - return "fb|" + annotation.getFlybase(); - } - return "unknown|" + proteinID; - } - - public final String getAccessionNumber() - { - return accessionNumber; - } - - public final String getDescription() - { - return description; - } - - public final String getSequence() - { - return sequence; - } - - private String tryToGetAccessionNumber(String[] items) - { - return items == null || items.length == 0 ? null : items[0].trim(); - } - - private String tryToGetValue(String[] items, String key) - { - for (String item : items) - { - int indexOfEqualSign = item.indexOf('='); - if (indexOfEqualSign > 0 - && item.substring(0, indexOfEqualSign).trim().equalsIgnoreCase(key)) - { - return item.substring(indexOfEqualSign + 1).trim(); - } - } - return null; - } -} \ No newline at end of file diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/ProteinResultDataSetParentLinkingTask.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/ProteinResultDataSetParentLinkingTask.java deleted file mode 100644 index eca1c23c62f..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/ProteinResultDataSetParentLinkingTask.java +++ /dev/null @@ -1,181 +0,0 @@ -/* - * Copyright 2011 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.etlserver.proteomics; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Properties; - -import org.apache.log4j.Logger; - -import ch.systemsx.cisd.common.logging.LogCategory; -import ch.systemsx.cisd.common.logging.LogFactory; -import ch.systemsx.cisd.common.maintenance.IMaintenanceTask; -import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService; -import ch.systemsx.cisd.openbis.dss.generic.shared.ServiceProvider; -import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PhysicalDataSet; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetBatchUpdateDetails; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewExperiment; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewMaterial; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewMetaproject; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewProject; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewSample; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewSpace; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Project; -import ch.systemsx.cisd.openbis.generic.shared.dto.AtomicEntityOperationDetails; -import ch.systemsx.cisd.openbis.generic.shared.dto.DataSetBatchUpdatesDTO; -import ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentUpdatesDTO; -import ch.systemsx.cisd.openbis.generic.shared.dto.MaterialUpdateDTO; -import ch.systemsx.cisd.openbis.generic.shared.dto.MetaprojectUpdatesDTO; -import ch.systemsx.cisd.openbis.generic.shared.dto.NewExternalData; -import ch.systemsx.cisd.openbis.generic.shared.dto.ProjectUpdatesDTO; -import ch.systemsx.cisd.openbis.generic.shared.dto.SampleUpdatesDTO; -import ch.systemsx.cisd.openbis.generic.shared.dto.VocabularyUpdatesDTO; -import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ExperimentIdentifierFactory; -import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ProjectIdentifier; - -/** - * @author Franz-Josef Elmer - */ -public class ProteinResultDataSetParentLinkingTask implements IMaintenanceTask -{ - private static final String PARENT_DATA_SET_CODES_KEY = - DataSetInfoExtractorForProteinResults.PARENT_DATA_SET_CODES.toUpperCase(); - - private static final String BASE_EXPERIMENT_KEY = - DataSetInfoExtractorForProteinResults.EXPERIMENT_IDENTIFIER_KEY.toUpperCase(); - - private static final Logger operationLog = LogFactory.getLogger(LogCategory.OPERATION, - ProteinResultDataSetParentLinkingTask.class); - - private final IEncapsulatedOpenBISService service; - - public ProteinResultDataSetParentLinkingTask() - { - this(ServiceProvider.getOpenBISService()); - } - - ProteinResultDataSetParentLinkingTask(IEncapsulatedOpenBISService service) - { - this.service = service; - - } - - @Override - public void setUp(String pluginName, Properties properties) - { - } - - @Override - public void execute() - { - List<DataSetBatchUpdatesDTO> dataSetUpdates = new ArrayList<DataSetBatchUpdatesDTO>(); - List<Project> projects = service.listProjects(); - for (Project project : projects) - { - List<Experiment> experiments = - service.listExperiments(new ProjectIdentifier(project.getSpace().getCode(), - project.getCode())); - for (Experiment experiment : experiments) - { - Map<String, IEntityProperty> propertiesMap = getPropertiesMap(experiment); - String baseExperimentIdentifier = - tryGetProperty(propertiesMap, BASE_EXPERIMENT_KEY); - String parentDataSetCodes = - tryGetProperty(propertiesMap, PARENT_DATA_SET_CODES_KEY); - List<String> codes = - DataSetInfoExtractorForProteinResults.getParentDataSetCodes( - parentDataSetCodes, baseExperimentIdentifier, service) - .getDataSetCodes(); - if (codes.isEmpty()) - { - continue; - } - List<AbstractExternalData> dataSets = - service.listDataSetsByExperimentID(experiment.getId()); - if (dataSets.isEmpty()) - { - continue; - } - for (AbstractExternalData ds : dataSets) - { - if (ds instanceof PhysicalDataSet == false) - { - continue; - } - PhysicalDataSet dataSet = (PhysicalDataSet) ds; - DataSetBatchUpdatesDTO update = new DataSetBatchUpdatesDTO(); - update.setDatasetId(new TechId(dataSet.getId())); - update.setVersion(dataSet.getVersion()); - update.setExperimentIdentifierOrNull(ExperimentIdentifierFactory.parse(dataSet - .getExperiment().getIdentifier())); - update.setFileFormatTypeCode(dataSet.getFileFormatType().getCode()); - update.setProperties(dataSet.getProperties()); - - // All we want to do is update the parents - update.setDatasetCode(dataSet.getCode()); - update.setModifiedParentDatasetCodesOrNull(codes.toArray(new String[0])); - DataSetBatchUpdateDetails details = new DataSetBatchUpdateDetails(); - details.setParentsUpdateRequested(true); - - operationLog.info("Parent data set links of data set " + dataSet.getCode() - + " from experiment " + experiment.getIdentifier() - + " will be updated."); - dataSetUpdates.add(update); - } - } - } - service.performEntityOperations(new AtomicEntityOperationDetails(null, null, Collections - .<NewSpace> emptyList(), Collections.<NewProject> emptyList(), Collections - .<ProjectUpdatesDTO> emptyList(), Collections.<NewExperiment> emptyList(), - Collections.<ExperimentUpdatesDTO> emptyList(), - Collections.<SampleUpdatesDTO> emptyList(), Collections.<NewSample> emptyList(), - Collections.<String, List<NewMaterial>> emptyMap(), Collections - .<MaterialUpdateDTO> emptyList(), - Collections.<NewExternalData> emptyList(), dataSetUpdates, Collections - .<NewMetaproject> emptyList(), Collections - .<MetaprojectUpdatesDTO> emptyList(), Collections - .<VocabularyUpdatesDTO> emptyList())); - operationLog.info("Parent data set links for " + dataSetUpdates.size() - + " data sets have been updated."); - } - - private Map<String, IEntityProperty> getPropertiesMap(Experiment experiment) - { - List<IEntityProperty> properties = experiment.getProperties(); - Map<String, IEntityProperty> propertiesMap = new HashMap<String, IEntityProperty>(); - for (IEntityProperty property : properties) - { - propertiesMap.put(property.getPropertyType().getCode(), property); - } - return propertiesMap; - } - - private String tryGetProperty(Map<String, IEntityProperty> propertiesMap, String key) - { - IEntityProperty property = propertiesMap.get(key); - return property == null ? null : property.tryGetAsString(); - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/ResultDataSetUploader.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/ResultDataSetUploader.java deleted file mode 100644 index 06bec5bded0..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/ResultDataSetUploader.java +++ /dev/null @@ -1,477 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.etlserver.proteomics; - -import java.sql.Connection; -import java.sql.SQLException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; - -import org.apache.commons.lang3.StringUtils; - -import ch.systemsx.cisd.base.exceptions.CheckedExceptionTunnel; -import ch.systemsx.cisd.common.exceptions.UserFailureException; -import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService; -import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetInformation; -import ch.systemsx.cisd.openbis.etlserver.proteomics.dto.AminoAcidMass; -import ch.systemsx.cisd.openbis.etlserver.proteomics.dto.AnnotatedProtein; -import ch.systemsx.cisd.openbis.etlserver.proteomics.dto.DataSet; -import ch.systemsx.cisd.openbis.etlserver.proteomics.dto.Database; -import ch.systemsx.cisd.openbis.etlserver.proteomics.dto.Experiment; -import ch.systemsx.cisd.openbis.etlserver.proteomics.dto.Parameter; -import ch.systemsx.cisd.openbis.etlserver.proteomics.dto.Peptide; -import ch.systemsx.cisd.openbis.etlserver.proteomics.dto.PeptideModification; -import ch.systemsx.cisd.openbis.etlserver.proteomics.dto.Protein; -import ch.systemsx.cisd.openbis.etlserver.proteomics.dto.ProteinAnnotation; -import ch.systemsx.cisd.openbis.etlserver.proteomics.dto.ProteinGroup; -import ch.systemsx.cisd.openbis.etlserver.proteomics.dto.ProteinProphetDetails; -import ch.systemsx.cisd.openbis.etlserver.proteomics.dto.ProteinReference; -import ch.systemsx.cisd.openbis.etlserver.proteomics.dto.ProteinSummary; -import ch.systemsx.cisd.openbis.etlserver.proteomics.dto.ProteinSummaryDataFilter; -import ch.systemsx.cisd.openbis.etlserver.proteomics.dto.Sample; -import ch.systemsx.cisd.openbis.etlserver.proteomics.dto.Sequence; -import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ExperimentIdentifier; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.ProbabilityToFDRCalculator; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.Occurrence; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.OccurrenceUtil; -import net.lemnik.eodsql.QueryTool; - -/** - * @author Franz-Josef Elmer - */ -class ResultDataSetUploader extends AbstractHandler -{ - private static final double MAX_FALSE_DISCOVERY_RATE = 0.1; - - static final String PARAMETER_TYPE_ABUNDANCE = "abundance"; - - static final String PARAMETER_TYPE_MODIFICATION = "modification"; - - private final Connection connection; - - private final IEncapsulatedOpenBISService openbisService; - - private final StringBuffer errorMessages; - - private final boolean assumingExtendedProtXML; - - private final String delimiter; - - private final boolean restrictedSampleResolving; - - ResultDataSetUploader(Connection connection, IEncapsulatedOpenBISService openbisService, - boolean assumingExtendedProtXML, String delimiter, - boolean restrictedSampleResolving) - { - this(QueryTool.getQuery(connection, IProtDAO.class), connection, openbisService, - assumingExtendedProtXML, delimiter, restrictedSampleResolving); - } - - ResultDataSetUploader(IProtDAO dao, Connection connection, - IEncapsulatedOpenBISService openbisService, boolean assumingExtendedProtXML, - String delimiter, boolean restrictedSampleResolving) - { - super(dao); - this.connection = connection; - this.openbisService = openbisService; - this.assumingExtendedProtXML = assumingExtendedProtXML; - this.delimiter = delimiter; - this.restrictedSampleResolving = restrictedSampleResolving; - this.errorMessages = new StringBuffer(); - } - - void upload(DataSetInformation dataSetInfo, ProteinSummary summary) - { - try - { - Experiment experiment = - getOrCreateExperiment(dataSetInfo.tryToGetExperiment().getPermId()); - ExperimentIdentifier experimentIdentifier = dataSetInfo.getExperimentIdentifier(); - String referenceDatabase = summary.getSummaryHeader().getReferenceDatabase(); - Database database = getOrGreateDatabase(referenceDatabase); - DataSet ds = - getOrCreateDataSet(experiment, database, dataSetInfo.getDataSetCode()); - addToDatabase(ds, experiment, experimentIdentifier, summary); - } catch (Throwable throwable) - { - try - { - connection.rollback(); - } catch (SQLException ex) - { - } - throw CheckedExceptionTunnel.wrapIfNecessary(throwable); - } - if (errorMessages.length() != 0) - { - rollback(); - throw UserFailureException.fromTemplate( - "Following errors occurred while uploading protein information" - + " to the dataset database from the dataset '%s': %s" + " ", - dataSetInfo.getDataSetCode(), errorMessages.toString()); - } - } - - /** the uploader should not be used after calling this method */ - public void rollback() - { - try - { - if (connection.isClosed() == false) - { - connection.rollback(); - connection.close(); - } - } catch (SQLException ex) - { - throw CheckedExceptionTunnel.wrapIfNecessary(ex); - } - } - - /** the uploader should not be used after calling this method */ - public void commit() - { - try - { - connection.commit(); - connection.close(); - } catch (SQLException ex) - { - throw CheckedExceptionTunnel.wrapIfNecessary(ex); - } - } - - private Database getOrGreateDatabase(String databaseNameAndVersion) - { - int indexOfLastSlash = databaseNameAndVersion.lastIndexOf('/'); - String nameOrVersion; - if (indexOfLastSlash < 0) - { - nameOrVersion = databaseNameAndVersion; - } else - { - nameOrVersion = databaseNameAndVersion.substring(indexOfLastSlash + 1); - } - Database database = dao.tryToGetDatabaseByName(nameOrVersion); - if (database == null) - { - database = new Database(); - database.setNameAndVersion(nameOrVersion); - database.setId(dao.createDatabase(database.getNameAndVersion())); - } - return database; - } - - private DataSet getOrCreateDataSet(Experiment experiment, Database database, - String dataSetPermID) - { - DataSet dataSet = dao.tryToGetDataSetByPermID(dataSetPermID); - if (dataSet == null) - { - dataSet = new DataSet(); - dataSet.setPermID(dataSetPermID); - long experimentID = experiment.getId(); - dataSet.setExperimentID(experimentID); - long databaseID = database.getId(); - dataSet.setDatabaseID(databaseID); - dataSet.setId(dao.createDataSet(experimentID, dataSetPermID, databaseID)); - } - return dataSet; - } - - private Experiment getOrCreateExperiment(String experimentPermID) - { - Experiment experiment = dao.tryToGetExperimentByPermID(experimentPermID); - if (experiment == null) - { - experiment = new Experiment(); - experiment.setPermID(experimentPermID); - experiment.setId(dao.createExperiment(experimentPermID)); - } - return experiment; - } - - private void addToDatabase(DataSet dataSet, Experiment experiment, - ExperimentIdentifier experimentIdentifier, ProteinSummary summary) - { - long dataSetID = dataSet.getId(); - Long databaseID = dataSet.getDatabaseID(); - AbundanceHandler abundanceHandler = - new AbundanceHandler(openbisService, dao, experimentIdentifier, experiment, - delimiter, restrictedSampleResolving); - ModificationFractionHandler modificationFractionHandler = - new ModificationFractionHandler(openbisService, dao, experimentIdentifier, - experiment, delimiter, restrictedSampleResolving); - ProbabilityToFDRCalculator calculator = createProbabilityToFDRMapping(dataSetID, summary); - List<ProteinGroup> proteinGroups = summary.getProteinGroups(); - for (ProteinGroup proteinGroup : proteinGroups) - { - for (Protein protein : proteinGroup.getProteins()) - { - try - { - double fdr = calculator.calculateFDR(protein.getProbability()); - if (Double.isNaN(fdr) || fdr <= MAX_FALSE_DISCOVERY_RATE) - { - addProtein(protein, dataSetID, databaseID, abundanceHandler, - modificationFractionHandler); - } - } catch (Exception e) - { - logException(e, "protein", protein.getName()); - } - } - } - } - - private void logException(Exception e, String objectType, String instanceDescription) - { - StringBuffer sb = new StringBuffer(); - sb.append("Cannot load following '"); - sb.append(objectType); - sb.append("': "); - sb.append(instanceDescription); - sb.append(" because of the following exception: "); - String message = e.getMessage(); - sb.append(message == null ? e.toString() : message); - sb.append("\n"); - errorMessages.append(sb.toString()); - } - - private void addProtein(Protein protein, long dataSetID, Long databaseID, - AbundanceHandler abundanceHandler, - ModificationFractionHandler modificationFractionHandler) - { - long proteinID = dao.createProtein(dataSetID, protein.getProbability()); - for (Parameter parameter : protein.getParameters()) - { - if (PARAMETER_TYPE_ABUNDANCE.equals(parameter.getType())) - { - abundanceHandler.addAbundancesToDatabase(parameter, proteinID, protein.getName()); - } - } - List<Peptide> peptides = protein.getPeptides(); - Set<String> peptideSequences = new HashSet<String>(); - for (Peptide peptide : peptides) - { - try - { - addPeptide(proteinID, peptide, modificationFractionHandler); - peptideSequences.add(peptide.getSequence()); - } catch (Exception e) - { - logException(e, "peptide", peptide.getSequence().toString()); - } - } - createIdentifiedProtein(proteinID, peptideSequences, databaseID, protein.getAnnotation(), true); - for (AnnotatedProtein annotatedProtein : protein.getIndistinguishableProteins()) - { - createIdentifiedProtein(proteinID, peptideSequences, databaseID, annotatedProtein.getAnnotation(), false); - } - } - - private void addPeptide(long proteinID, Peptide peptide, - ModificationFractionHandler modificationFractionHandler) - { - String peptideSequence = peptide.getSequence(); - int charge = peptide.getCharge(); - long peptideID = dao.createPeptide(proteinID, peptideSequence, charge); - List<PeptideModification> modifications = peptide.getModifications(); - for (PeptideModification modification : modifications) - { - try - { - addPeptideModification(peptideID, modification); - } catch (Exception e) - { - logException(e, "modification", modification.toString()); - } - } - List<ModificationFraction> modificationFractions = extractModificationFractions(peptide); - if (modificationFractions.isEmpty()) - { - return; - } - long modPeptideID = dao.createModifiedPeptide(peptideID, 0, 0); - Map<AminoAcidMass, List<ModificationFraction>> map = - groupByPositionAndMass(modificationFractions); - Set<Entry<AminoAcidMass, List<ModificationFraction>>> entrySet = map.entrySet(); - for (Entry<AminoAcidMass, List<ModificationFraction>> entry : entrySet) - { - AminoAcidMass positionAndMass = entry.getKey(); - long modID = createModification(modPeptideID, positionAndMass); - List<ModificationFraction> list = entry.getValue(); - modificationFractionHandler.addModificationFractions(peptideSequence, modID, list); - } - } - - private Map<AminoAcidMass, List<ModificationFraction>> groupByPositionAndMass( - List<ModificationFraction> modificationFractions) - { - Map<AminoAcidMass, List<ModificationFraction>> result = - new HashMap<AminoAcidMass, List<ModificationFraction>>(); - for (ModificationFraction modificationFraction : modificationFractions) - { - AminoAcidMass positionAndMass = modificationFraction.getAminoAcidMass(); - List<ModificationFraction> list = result.get(positionAndMass); - if (list == null) - { - list = new ArrayList<ModificationFraction>(); - result.put(positionAndMass, list); - } - list.add(modificationFraction); - } - return result; - } - - private List<ModificationFraction> extractModificationFractions(Peptide peptide) - { - List<ModificationFraction> result = new ArrayList<ModificationFraction>(); - for (Parameter parameter : peptide.getParameters()) - { - if (PARAMETER_TYPE_MODIFICATION.equals(parameter.getType())) - { - result.add(new ModificationFraction(parameter.getName(), parameter.getValue())); - } - } - return result; - } - - private void addPeptideModification(long peptideID, PeptideModification modification) - { - double ntermMass = modification.getNTermMass(); - double ctermMass = modification.getCTermMass(); - long modPeptideID = dao.createModifiedPeptide(peptideID, ntermMass, ctermMass); - List<AminoAcidMass> aminoAcidMasses = modification.getAminoAcidMasses(); - for (AminoAcidMass aminoAcidMass : aminoAcidMasses) - { - createModification(modPeptideID, aminoAcidMass); - } - } - - private long createModification(long modPeptideID, AminoAcidMass aminoAcidMass) - { - return dao.createModification(modPeptideID, aminoAcidMass.getPosition(), - aminoAcidMass.getMass()); - } - - private void createIdentifiedProtein(long proteinID, Set<String> peptideSequences, - Long databaseID, ProteinAnnotation annotation, boolean primary) - { - ProteinDescription protDesc = - new ProteinDescription(annotation, proteinID, assumingExtendedProtXML); - String accessionNumber = protDesc.getAccessionNumber(); - String description = protDesc.getDescription(); - ProteinReference proteinReference = dao.tryToGetProteinReference(accessionNumber); - if (proteinReference == null) - { - proteinReference = new ProteinReference(); - proteinReference.setId(dao.createProteinReference(accessionNumber, description)); - } else if (StringUtils.equals(description, proteinReference.getDescription()) == false) - { - dao.updateProteinReferenceDescription(proteinReference.getId(), description); - } - Sequence sequence = - tryFindSequence(proteinReference.getId(), databaseID, protDesc.getSequence()); - if (sequence == null) - { - sequence = new Sequence(protDesc.getSequence()); - sequence.setDatabaseID(databaseID); - sequence.setProteinReferenceID(proteinReference.getId()); - sequence.setId(dao.createSequence(sequence)); - } - double coverage = calculateCoverage(sequence.getSequence(), peptideSequences); - dao.createIdentifiedProtein(proteinID, sequence.getId(), coverage, primary); - } - - private double calculateCoverage(String aminoAcidSequence, Set<String> peptideSequences) - { - List<Occurrence> list = OccurrenceUtil.getCoverage(aminoAcidSequence, peptideSequences); - int sumPeptides = 0; - for (Occurrence occurrence : list) - { - sumPeptides += occurrence.getWord().length(); - } - return sumPeptides / (double) aminoAcidSequence.length(); - } - - private Sequence tryFindSequence(long referenceID, Long databaseID, String sequence) - { - List<Sequence> sequences = - dao.tryToGetSequencesByReferenceAndDatabase(referenceID, databaseID); - if (sequences == null || sequences.isEmpty()) - { - return null; - } - for (Sequence foundSequence : sequences) - { - if (sequence.equals(foundSequence.getSequence())) - { - return foundSequence; - } - } - return null; - } - - private ProbabilityToFDRCalculator createProbabilityToFDRMapping(long dataSetID, ProteinSummary summary) - { - ProbabilityToFDRCalculator calculator = new ProbabilityToFDRCalculator(); - Object[] s = summary.getSummaryHeader().getProgramDetails().getSummary(); - if (s != null) - { - for (Object object : s) - { - if (object instanceof ProteinProphetDetails) - { - ProteinProphetDetails details = (ProteinProphetDetails) object; - List<ProteinSummaryDataFilter> filters = details.getDataFilters(); - for (ProteinSummaryDataFilter proteinSummaryDataFilter : filters) - { - double probability = proteinSummaryDataFilter.getMinProbability(); - double fdr = proteinSummaryDataFilter.getFalsePositiveErrorRate(); - calculator.add(probability, fdr); - calculator.init(); - dao.createProbabilityToFDRMapping(dataSetID, probability, fdr); - } - return calculator; - } - } - } - if (assumingExtendedProtXML == false) - { - return calculator; - } - throw new UserFailureException("Missing Protein Prophet details."); - } - - protected Sample getOrCreateSample(Experiment experiment, String samplePermID) - { - Sample sample = dao.tryToGetSampleByPermID(samplePermID); - if (sample == null) - { - sample = new Sample(); - sample.setPermID(samplePermID); - sample.setId(dao.createSample(experiment.getId(), samplePermID)); - } - return sample; - } -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/StorageProcessorWithResultDataSetUploader.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/StorageProcessorWithResultDataSetUploader.java deleted file mode 100644 index 876f138a525..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/StorageProcessorWithResultDataSetUploader.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.etlserver.proteomics; - -import java.io.File; -import java.util.Properties; - -import ch.systemsx.cisd.etlserver.AbstractStrorageProcessorWithUploader; -import ch.systemsx.cisd.openbis.dss.generic.shared.ServiceProvider; - -/** - * @author Franz-Josef Elmer - */ -public class StorageProcessorWithResultDataSetUploader extends AbstractStrorageProcessorWithUploader -{ - - public StorageProcessorWithResultDataSetUploader(Properties properties) - { - super(properties, new ProtXMLUploader(properties, ServiceProvider.getOpenBISService())); - } - - @Override - protected void logDataSetFileError(File incomingDataSetDirectory, Throwable exception) - { - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/TypeExtractorForMSInjection.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/TypeExtractorForMSInjection.java deleted file mode 100644 index 25cc23e08ac..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/TypeExtractorForMSInjection.java +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.etlserver.proteomics; - -import static ch.systemsx.cisd.openbis.etlserver.proteomics.DataSetInfoExtractorForMSInjection.DATA_SET_PROPERTIES_FILE; -import static ch.systemsx.cisd.openbis.etlserver.proteomics.DataSetInfoExtractorForMSInjection.DATA_SET_TYPE_KEY; -import static ch.systemsx.cisd.openbis.etlserver.proteomics.DataSetInfoExtractorForMSInjection.FILE_TYPE_KEY; - -import java.io.File; -import java.util.Properties; - -import ch.systemsx.cisd.common.properties.PropertyUtils; -import ch.systemsx.cisd.etlserver.ITypeExtractor; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetType; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.FileFormatType; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.LocatorType; - -/** - * @author Franz-Josef Elmer - */ -public class TypeExtractorForMSInjection implements ITypeExtractor -{ - private static final LocatorType LOCATOR_TYPE = new LocatorType(LocatorType.DEFAULT_LOCATOR_TYPE_CODE); - - public TypeExtractorForMSInjection(Properties properties) - { - } - - @Override - public DataSetType getDataSetType(File incomingDataSetPath) - { - Properties properties = loadProperties(incomingDataSetPath); - return new DataSetType(PropertyUtils.getMandatoryProperty(properties, DATA_SET_TYPE_KEY)); - } - - @Override - public FileFormatType getFileFormatType(File incomingDataSetPath) - { - Properties properties = loadProperties(incomingDataSetPath); - return new FileFormatType(PropertyUtils.getMandatoryProperty(properties, FILE_TYPE_KEY)); - } - - @Override - public LocatorType getLocatorType(File incomingDataSetPath) - { - return LOCATOR_TYPE; - } - - @Override - public String getProcessorType(File incomingDataSetPath) - { - return null; - } - - @Override - public boolean isMeasuredData(File incomingDataSetPath) - { - return true; - } - - private Properties loadProperties(File incomingDataSetPath) - { - return Util.loadPropertiesFile(incomingDataSetPath, DATA_SET_PROPERTIES_FILE); - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/Util.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/Util.java deleted file mode 100644 index 564c0196f4d..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/Util.java +++ /dev/null @@ -1,128 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.etlserver.proteomics; - -import java.io.File; -import java.util.ArrayList; -import java.util.List; -import java.util.Properties; - -import ch.systemsx.cisd.common.exceptions.UserFailureException; -import ch.systemsx.cisd.common.io.PropertyIOUtils; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityProperty; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityType; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityTypePropertyType; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PropertyType; - -/** - * @author Franz-Josef Elmer - */ -class Util -{ - private Util() - { - } - - /** - * Tries to return the prot.xml file in the specified data set. - * - * @return <code>null</code> if non found. - */ - static File tryGetProtXMLFile(File dataSet) - { - if (dataSet.isDirectory() == false) - { - return dataSet; - } - File[] files = dataSet.listFiles(); - for (File file : files) - { - if (file.getName().endsWith("prot.xml")) - { - return file; - } - } - return null; - } - - /** - * Returns an array of all entity properties defined by the specified entity type for which values are found in the specified {@link Properties} - * object. - * - * @throws UserFailureException if at least one mandatory property were missed. - */ - static IEntityProperty[] getAndCheckProperties(Properties properties, EntityType entityType) - { - List<String> missingMandatoryProperties = new ArrayList<String>(); - List<IEntityProperty> sampleProperties = - getProperties(properties, entityType, missingMandatoryProperties); - if (missingMandatoryProperties.isEmpty() == false) - { - throw new UserFailureException("The following mandatory properties are missed: " - + missingMandatoryProperties); - } - return sampleProperties.toArray(new IEntityProperty[sampleProperties.size()]); - } - - /** - * Turns specified properties into a list of {@link IEntityProperty} instances in accordance to the property types assigned to the specified - * entity type. Keys of missing mandatory properties are added to the specified list. - */ - static List<IEntityProperty> getProperties(Properties properties, - EntityType entityType, List<String> missingMandatoryProperties) - { - List<IEntityProperty> sampleProperties = new ArrayList<IEntityProperty>(); - List<? extends EntityTypePropertyType<?>> sampleTypePropertyTypes = entityType.getAssignedPropertyTypes(); - for (EntityTypePropertyType<?> entityTypePropertyType : sampleTypePropertyTypes) - { - boolean mandatory = entityTypePropertyType.isMandatory(); - PropertyType propertyType = entityTypePropertyType.getPropertyType(); - String key = propertyType.getCode(); - String value = properties.getProperty(key); - if (value == null) - { - if (mandatory) - { - missingMandatoryProperties.add(key); - } - } else - { - EntityProperty property = new EntityProperty(); - property.setPropertyType(propertyType); - property.setValue(value); - sampleProperties.add(property); - } - } - return sampleProperties; - } - - static Properties loadPropertiesFile(File incomingDataSetDirectory, String propertiesFileName) - { - File propertiesFile = new File(incomingDataSetDirectory, propertiesFileName); - if (propertiesFile.exists() == false) - { - throw new UserFailureException("Missing properties file '" + propertiesFileName + "'."); - } - if (propertiesFile.isFile() == false) - { - throw new UserFailureException("Properties file '" + propertiesFileName - + "' is a folder."); - } - return PropertyIOUtils.loadProperties(propertiesFile); - } -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/dto/ASAPRatioPValue.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/dto/ASAPRatioPValue.java deleted file mode 100644 index 6c7181a9a23..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/dto/ASAPRatioPValue.java +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.etlserver.proteomics.dto; - -import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.XmlType; - -import ch.systemsx.cisd.openbis.etlserver.proteomics.Constants; - -/** - * @author Franz-Josef Elmer - */ -@XmlRootElement(name = "ASAPRatio_pvalue", namespace = Constants.NAMESPACE) -@XmlType -public class ASAPRatioPValue -{ - private double adjustedRatioMean; - - private double adjustedRatioStandardDeviation; - - private double adjustedHeavyToLisghtRatioMean; - - private double adjustedHeavyToLisghtRatioStandardDeviation; - - private double pValue; - - private double decimalPValue; - - public ASAPRatioPValue() - { - System.out.println("ASAPRatioPValue.ASAPRatioPValue()"); - } - - @XmlAttribute(name = "adj_ratio_mean", required = true) - public final double getAdjustedRatioMean() - { - return adjustedRatioMean; - } - - public final void setAdjustedRatioMean(double adjustedRatioMean) - { - System.out.println("ASAPRatioPValue.setAdjustedRatioMean(" + adjustedRatioMean + ")"); - this.adjustedRatioMean = adjustedRatioMean; - } - - @XmlAttribute(name = "adj_ratio_standard_dev", required = true) - public final double getAdjustedRatioStandardDeviation() - { - return adjustedRatioStandardDeviation; - } - - public final void setAdjustedRatioStandardDeviation(double adjustedRatioStandardDeviation) - { - this.adjustedRatioStandardDeviation = adjustedRatioStandardDeviation; - } - - @XmlAttribute(name = "heavy2light_adj_ratio_mean") - public final double getAdjustedHeavyToLisghtRatioMean() - { - return adjustedHeavyToLisghtRatioMean; - } - - public final void setAdjustedHeavyToLisghtRatioMean(double adjustedHeavyToLisghtRatioMean) - { - this.adjustedHeavyToLisghtRatioMean = adjustedHeavyToLisghtRatioMean; - } - - @XmlAttribute(name = "heavy2light_adj_ratio_standard_dev") - public final double getAdjustedHeavyToLisghtRatioStandardDeviation() - { - return adjustedHeavyToLisghtRatioStandardDeviation; - } - - public final void setAdjustedHeavyToLisghtRatioStandardDeviation( - double adjustedHeavyToLisghtRatioStandardDeviation) - { - this.adjustedHeavyToLisghtRatioStandardDeviation = adjustedHeavyToLisghtRatioStandardDeviation; - } - - @XmlAttribute(name = "pvalue") - public final double getPValue() - { - return pValue; - } - - public final void setPValue(double value) - { - pValue = value; - } - - @XmlAttribute(name = "decimal_pvalue") - public final double getDecimalPValue() - { - return decimalPValue; - } - - public final void setDecimalPValue(double decimalPValue) - { - this.decimalPValue = decimalPValue; - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/dto/AbstractDTOWithID.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/dto/AbstractDTOWithID.java deleted file mode 100644 index a1d9fbf02e3..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/dto/AbstractDTOWithID.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.etlserver.proteomics.dto; - -import net.lemnik.eodsql.AutoGeneratedKeys; - -/** - * @author Franz-Josef Elmer - */ -abstract class AbstractDTOWithID -{ - @AutoGeneratedKeys - private long id; - - public final long getId() - { - return id; - } - - public final void setId(long id) - { - this.id = id; - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/dto/AbstractDTOWithIDAndPermID.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/dto/AbstractDTOWithIDAndPermID.java deleted file mode 100644 index 206520bd52a..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/dto/AbstractDTOWithIDAndPermID.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.etlserver.proteomics.dto; - -import net.lemnik.eodsql.ResultColumn; - -/** - * @author Franz-Josef Elmer - */ -abstract class AbstractDTOWithIDAndPermID extends AbstractDTOWithID -{ - @ResultColumn("perm_id") - private String permID; - - public final String getPermID() - { - return permID; - } - - public final void setPermID(String permID) - { - this.permID = permID; - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/dto/AminoAcidMass.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/dto/AminoAcidMass.java deleted file mode 100644 index b2ab23450f4..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/dto/AminoAcidMass.java +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.etlserver.proteomics.dto; - -import javax.xml.bind.annotation.XmlAttribute; - -/** - * @author Franz-Josef Elmer - */ -public class AminoAcidMass -{ - private int position; - - private double mass; - - @XmlAttribute(name = "position", required = true) - public final int getPosition() - { - return position; - } - - public final void setPosition(int position) - { - this.position = position; - } - - @XmlAttribute(name = "mass", required = true) - public final double getMass() - { - return mass; - } - - public final void setMass(double mass) - { - this.mass = mass; - } - - @Override - public boolean equals(Object obj) - { - if (obj == this) - { - return true; - } - if (obj instanceof AminoAcidMass == false) - { - return false; - } - AminoAcidMass that = (AminoAcidMass) obj; - return this.position == that.position && this.mass == that.mass; - } - - @Override - public int hashCode() - { - return (int) (37 * position + mass); - } - - @Override - public String toString() - { - return mass + "@" + position; - } -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/dto/AnnotatedProtein.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/dto/AnnotatedProtein.java deleted file mode 100644 index 2266b73c965..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/dto/AnnotatedProtein.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.etlserver.proteomics.dto; - -import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlType; - -import ch.systemsx.cisd.openbis.etlserver.proteomics.Constants; - -/** - * @author Franz-Josef Elmer - */ -@XmlType -public class AnnotatedProtein -{ - protected String name; - - protected ProteinAnnotation annotation; - - @XmlAttribute(name = "protein_name", required = true) - public final String getName() - { - return name; - } - - public final void setName(String name) - { - this.name = name; - } - - @XmlElement(name = "annotation", namespace = Constants.NAMESPACE) - public final ProteinAnnotation getAnnotation() - { - return annotation; - } - - public final void setAnnotation(ProteinAnnotation annotation) - { - this.annotation = annotation; - } - - @Override - public String toString() - { - return annotation == null ? name : name + "[" + annotation.getDescription() + "]"; - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/dto/DataSet.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/dto/DataSet.java deleted file mode 100644 index 778efdb293b..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/dto/DataSet.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.etlserver.proteomics.dto; - -import net.lemnik.eodsql.ResultColumn; - -/** - * @author Franz-Josef Elmer - */ -public class DataSet extends AbstractDTOWithIDAndPermID -{ - @ResultColumn("samp_id") - private Long sampleID; - - @ResultColumn("expe_id") - private Long experimentID; - - @ResultColumn("db_id") - private Long databaseID; - - public final Long getSampleID() - { - return sampleID; - } - - public final void setSampleID(Long sampleID) - { - this.sampleID = sampleID; - } - - public final Long getExperimentID() - { - return experimentID; - } - - public final void setExperimentID(Long experimentID) - { - this.experimentID = experimentID; - } - - public final Long getDatabaseID() - { - return databaseID; - } - - public final void setDatabaseID(Long databaseID) - { - this.databaseID = databaseID; - } -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/dto/Database.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/dto/Database.java deleted file mode 100644 index 1b16ff40284..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/dto/Database.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.etlserver.proteomics.dto; - -import net.lemnik.eodsql.ResultColumn; - -/** - * @author Franz-Josef Elmer - */ -public class Database extends AbstractDTOWithID -{ - @ResultColumn("name_and_version") - private String nameAndVersion; - - public final String getNameAndVersion() - { - return nameAndVersion; - } - - public final void setNameAndVersion(String nameAndVersion) - { - this.nameAndVersion = nameAndVersion; - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/dto/Experiment.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/dto/Experiment.java deleted file mode 100644 index 0959e186f88..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/dto/Experiment.java +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.etlserver.proteomics.dto; - -/** - * @author Franz-Josef Elmer - */ -public class Experiment extends AbstractDTOWithIDAndPermID -{ - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/dto/ModificationType.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/dto/ModificationType.java deleted file mode 100644 index b78ea4b8916..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/dto/ModificationType.java +++ /dev/null @@ -1,95 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.etlserver.proteomics.dto; - -import net.lemnik.eodsql.ResultColumn; - -/** - * @author Franz-Josef Elmer - */ -public class ModificationType extends AbstractDTOWithID -{ - private String code; - - @ResultColumn("amino_acid") - private String aminoAcid; - - private double mass; - - @ResultColumn("mass_tolerance") - private double massTolerance; - - public final String getCode() - { - return code; - } - - public final void setCode(String code) - { - this.code = code; - } - - public final String getAminoAcid() - { - return aminoAcid; - } - - public final void setAminoAcid(String aminoAcid) - { - this.aminoAcid = aminoAcid; - } - - public final double getMass() - { - return mass; - } - - public final void setMass(double mass) - { - this.mass = mass; - } - - public final double getMassTolerance() - { - return massTolerance; - } - - public final void setMassTolerance(double deltaMass) - { - this.massTolerance = deltaMass; - } - - public boolean matches(char aminoAcidSymbol, double m) - { - if (m < mass - massTolerance) - { - return false; - } - if (m > mass + massTolerance) - { - return false; - } - return aminoAcid == null || (aminoAcid.length() == 1 && aminoAcid.charAt(0) == aminoAcidSymbol); - } - - @Override - public String toString() - { - return code + "=(" + aminoAcid + ":" + mass + "\u00b1" + massTolerance + ")"; - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/dto/Parameter.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/dto/Parameter.java deleted file mode 100644 index 92187d45081..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/dto/Parameter.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.etlserver.proteomics.dto; - -import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlType; - -/** - * @author Franz-Josef Elmer - */ -@XmlType -public class Parameter -{ - private String name; - - private String value; - - private String type; - - @XmlAttribute(name = "name", required = true) - public final String getName() - { - return name; - } - - public final void setName(String name) - { - this.name = name; - } - - @XmlAttribute(name = "value", required = true) - public final String getValue() - { - return value; - } - - public final void setValue(String value) - { - this.value = value; - } - - @XmlAttribute(name = "type") - public final String getType() - { - return type; - } - - public final void setType(String type) - { - this.type = type; - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/dto/ParentDataSetCodes.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/dto/ParentDataSetCodes.java deleted file mode 100644 index 5e013d48f5f..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/dto/ParentDataSetCodes.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright 2011 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.etlserver.proteomics.dto; - -import java.util.List; - -/** - * Data transfer object which contains a list of data set codes and an optional error message. - * - * @author Franz-Josef Elmer - */ -public class ParentDataSetCodes -{ - private final List<String> dataSetCodes; - - private final String errorMessage; - - public ParentDataSetCodes(List<String> dataSetCodes, String errorMessage) - { - super(); - this.dataSetCodes = dataSetCodes; - this.errorMessage = errorMessage; - } - - public List<String> getDataSetCodes() - { - return dataSetCodes; - } - - public String getErrorMessage() - { - return errorMessage; - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/dto/Peptide.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/dto/Peptide.java deleted file mode 100644 index cea00ffdf20..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/dto/Peptide.java +++ /dev/null @@ -1,132 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.etlserver.proteomics.dto; - -import java.util.ArrayList; -import java.util.List; - -import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlType; - -import ch.systemsx.cisd.openbis.etlserver.proteomics.Constants; - -/** - * @author Franz-Josef Elmer - */ -@XmlType -public class Peptide -{ - private String sequence; - - private int charge; - - private double initialProbability; - - private double weight; - - private List<Parameter> parameters = new ArrayList<Parameter>(); - - private List<PeptideModification> modifications = new ArrayList<PeptideModification>(); - - @XmlAttribute(name = "peptide_sequence", required = true) - public final String getSequence() - { - return sequence; - } - - public final void setSequence(String sequence) - { - this.sequence = sequence; - } - - @XmlAttribute(name = "charge", required = true) - public final int getCharge() - { - return charge; - } - - public final void setCharge(int charge) - { - this.charge = charge; - } - - @XmlAttribute(name = "initial_probability", required = true) - public final double getInitialProbability() - { - return initialProbability; - } - - public final void setInitialProbability(double initialProbability) - { - this.initialProbability = initialProbability; - } - - @XmlAttribute(name = "weight") - public final double getWeight() - { - return weight; - } - - public final void setWeight(double weight) - { - this.weight = weight; - } - - @XmlElement(name = "modification_info", namespace = Constants.NAMESPACE) - public final List<PeptideModification> getModifications() - { - return modifications; - } - - public final void setModifications(List<PeptideModification> modifications) - { - this.modifications = modifications; - } - - @XmlElement(name = "parameter", namespace = Constants.NAMESPACE) - public final List<Parameter> getParameters() - { - return parameters; - } - - public final void setParameters(List<Parameter> parameters) - { - this.parameters = parameters; - } - - @Override - public String toString() - { - StringBuilder builder = new StringBuilder(); - builder.append(sequence); - if (charge > 0) - { - builder.append("("); - for (int i = 0; i < charge; i++) - { - builder.append('+'); - } - builder.append(")"); - } - builder.append("[initialProbability=").append(initialProbability); - builder.append(", weight=").append(weight); - builder.append("]"); - return builder.toString(); - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/dto/PeptideModification.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/dto/PeptideModification.java deleted file mode 100644 index 6f7f414d3b8..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/dto/PeptideModification.java +++ /dev/null @@ -1,109 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.etlserver.proteomics.dto; - -import java.util.List; - -import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlType; - -import ch.systemsx.cisd.openbis.etlserver.proteomics.Constants; - -/** - * @author Franz-Josef Elmer - */ -@XmlType -public class PeptideModification -{ - private String modifiedPeptide; - - private double nTermMass; - - private double cTermMass; - - private List<AminoAcidMass> aminoAcidMasses; - - @XmlAttribute(name = "modified_peptide") - public final String getModifiedPeptide() - { - return modifiedPeptide; - } - - public final void setModifiedPeptide(String modifiedPeptide) - { - this.modifiedPeptide = modifiedPeptide; - } - - @XmlAttribute(name = "mod_nterm_mass") - public final double getNTermMass() - { - return nTermMass; - } - - public final void setNTermMass(double termMass) - { - nTermMass = termMass; - } - - @XmlAttribute(name = "mod_cterm_mass") - public final double getCTermMass() - { - return cTermMass; - } - - public final void setCTermMass(double termMass) - { - cTermMass = termMass; - } - - @XmlElement(name = "mod_aminoacid_mass", namespace = Constants.NAMESPACE) - public final List<AminoAcidMass> getAminoAcidMasses() - { - return aminoAcidMasses; - } - - public final void setAminoAcidMasses(List<AminoAcidMass> aminoAcidMasses) - { - this.aminoAcidMasses = aminoAcidMasses; - } - - @Override - public String toString() - { - StringBuilder builder = new StringBuilder(); - builder.append("Modification[modifiedPeptide=").append(modifiedPeptide); - builder.append(", nTermMass=").append(nTermMass); - builder.append(", cTermMass=").append(cTermMass); - builder.append("]"); - if (aminoAcidMasses != null && aminoAcidMasses.isEmpty() == false) - { - builder.append("("); - for (int i = 0; i < aminoAcidMasses.size(); i++) - { - if (i > 0) - { - builder.append(", "); - } - builder.append(aminoAcidMasses.get(i)); - } - builder.append(")"); - } - return builder.toString(); - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/dto/ProgramDetails.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/dto/ProgramDetails.java deleted file mode 100644 index 0832a9bd9f5..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/dto/ProgramDetails.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.etlserver.proteomics.dto; - -import java.util.Date; - -import javax.xml.bind.annotation.XmlAnyElement; -import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlType; - -/** - * @author Franz-Josef Elmer - */ -@XmlType -public class ProgramDetails -{ - private String analysis; - - private Date timestamp; - - private String version; - - private Object[] summary; - - @XmlAttribute(name = "analysis", required = true) - public final String getAnalysis() - { - return analysis; - } - - public final void setAnalysis(String analysis) - { - this.analysis = analysis; - } - - // @XmlAttribute(name = "time", required = true) - public final Date getTimestamp() - { - return timestamp; - } - - public final void setTimestamp(Date timestamp) - { - this.timestamp = timestamp; - } - - @XmlAttribute(name = "version") - public final String getVersion() - { - return version; - } - - public final void setVersion(String version) - { - this.version = version; - } - - @XmlAnyElement(lax = true) - public final Object[] getSummary() - { - return summary; - } - - public final void setSummary(Object[] summary) - { - this.summary = summary; - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/dto/Protein.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/dto/Protein.java deleted file mode 100644 index 436f04e0586..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/dto/Protein.java +++ /dev/null @@ -1,232 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.etlserver.proteomics.dto; - -import java.util.ArrayList; -import java.util.List; - -import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlType; - -import ch.systemsx.cisd.openbis.etlserver.proteomics.Constants; - -/** - * @author Franz-Josef Elmer - */ -@XmlType -public class Protein extends AnnotatedProtein -{ - private double probability; - - private double coverage; - - private int numberOfIndistinguishableProteins; - - private String uniqueStrippedPeptides; - - private String groupSiblingID; - - private int totalNumberOfPeptides; - - private String subsumingProtein; - - private String fractionOfCorrectPeptideIdentifications; - - private List<Parameter> parameters = new ArrayList<Parameter>(); - - private List<AnnotatedProtein> indistinguishableProteins = new ArrayList<AnnotatedProtein>(); - - private List<Peptide> peptides; - - @XmlAttribute(name = "probability", required = true) - public final double getProbability() - { - return probability; - } - - public final void setProbability(double probability) - { - this.probability = probability; - } - - @XmlAttribute(name = "percent_coverage") - public final double getCoverage() - { - return coverage; - } - - public final void setCoverage(double coverage) - { - this.coverage = coverage; - } - - @XmlAttribute(name = "n_indistinguishable_proteins", required = true) - public final int getNumberOfIndistinguishableProteins() - { - return numberOfIndistinguishableProteins; - } - - public final void setNumberOfIndistinguishableProteins(int numberOfIndistinguishableProteins) - { - this.numberOfIndistinguishableProteins = numberOfIndistinguishableProteins; - } - - @XmlAttribute(name = "unique_stripped_peptides") - public final String getUniqueStrippedPeptides() - { - return uniqueStrippedPeptides; - } - - public final void setUniqueStrippedPeptides(String uniqueStrippedPeptides) - { - this.uniqueStrippedPeptides = uniqueStrippedPeptides; - } - - @XmlAttribute(name = "group_sibling_id", required = true) - public final String getGroupSiblingID() - { - return groupSiblingID; - } - - public final void setGroupSiblingID(String groupSiblingID) - { - this.groupSiblingID = groupSiblingID; - } - - @XmlAttribute(name = "total_number_peptides") - public final int getTotalNumberOfPeptides() - { - return totalNumberOfPeptides; - } - - public final void setTotalNumberOfPeptides(int totalNumberOfPeptides) - { - this.totalNumberOfPeptides = totalNumberOfPeptides; - } - - @XmlAttribute(name = "subsuming_protein_entry") - public final String getSubsumingProtein() - { - return subsumingProtein; - } - - public final void setSubsumingProtein(String subsumingProtein) - { - this.subsumingProtein = subsumingProtein; - } - - @XmlAttribute(name = "pct_spectrum_ids") - public final String getFractionOfCorrectPeptideIdentifications() - { - return fractionOfCorrectPeptideIdentifications; - } - - public final void setFractionOfCorrectPeptideIdentifications(String fractionOfCorrectPeptideIdentifications) - { - this.fractionOfCorrectPeptideIdentifications = fractionOfCorrectPeptideIdentifications; - } - - @XmlElement(name = "parameter", namespace = Constants.NAMESPACE) - public final List<Parameter> getParameters() - { - return parameters; - } - - public final void setParameters(List<Parameter> parameters) - { - this.parameters = parameters; - } - - @XmlElement(name = "indistinguishable_protein", namespace = Constants.NAMESPACE) - public final List<AnnotatedProtein> getIndistinguishableProteins() - { - return indistinguishableProteins; - } - - public final void setIndistinguishableProteins(List<AnnotatedProtein> indistinguishableProteins) - { - this.indistinguishableProteins = indistinguishableProteins; - } - - @XmlElement(name = "peptide", namespace = Constants.NAMESPACE) - public final List<Peptide> getPeptides() - { - return peptides; - } - - public final void setPeptides(List<Peptide> peptides) - { - this.peptides = peptides; - } - - @Override - public String toString() - { - StringBuilder builder = new StringBuilder(); - builder.append(name).append("[probability=").append(probability); - builder.append(", coverage=").append(coverage); - builder.append(", indistinguishableProteins=").append(numberOfIndistinguishableProteins); - if (uniqueStrippedPeptides != null) - { - builder.append(", uniqueStrippedPeptides=").append(uniqueStrippedPeptides); - } - builder.append(", groupSiblingID=").append(groupSiblingID); - if (totalNumberOfPeptides > 0) - { - builder.append(", totalNumberOfPeptides=").append(totalNumberOfPeptides); - } - if (subsumingProtein != null) - { - builder.append(", subsumingProtein=").append(subsumingProtein); - } - if (fractionOfCorrectPeptideIdentifications != null) - { - builder.append(", fractionOfCorrectPeptideIdentifications=").append(fractionOfCorrectPeptideIdentifications); - } - builder.append("]"); - if (annotation != null) - { - builder.append("\n ").append(annotation); - } - if (indistinguishableProteins != null && indistinguishableProteins.isEmpty() == false) - { - builder.append("\n indistinguishable proteins:"); - for (AnnotatedProtein protein : indistinguishableProteins) - { - builder.append("\n ").append(protein); - } - } - if (peptides != null && peptides.isEmpty() == false) - { - builder.append("\n peptides:"); - for (Peptide peptide : peptides) - { - builder.append("\n ").append(peptide); - List<PeptideModification> modifications = peptide.getModifications(); - if (modifications != null && modifications.isEmpty() == false) - { - for (PeptideModification modification : modifications) - { - builder.append("\n ").append(modification); - } - } - } - } - return builder.toString(); - } -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/dto/ProteinAnnotation.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/dto/ProteinAnnotation.java deleted file mode 100644 index 06c1344ae69..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/dto/ProteinAnnotation.java +++ /dev/null @@ -1,145 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.etlserver.proteomics.dto; - -import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlType; - -/** - * @author Franz-Josef Elmer - */ -@XmlType -public class ProteinAnnotation -{ - private String description; - - private String ipiName; - - private String refseqName; - - private String swissprotName; - - private String ensemblName; - - private String tremblName; - - private String locusLinkName; - - private String flybase; - - @XmlAttribute(name = "protein_description", required = true) - public final String getDescription() - { - return description; - } - - public final void setDescription(String description) - { - this.description = description; - } - - @XmlAttribute(name = "ipi_name") - public final String getIpiName() - { - return ipiName; - } - - public final void setIpiName(String ipiName) - { - this.ipiName = ipiName; - } - - @XmlAttribute(name = "refseq_name") - public final String getRefseqName() - { - return refseqName; - } - - public final void setRefseqName(String refseqName) - { - this.refseqName = refseqName; - } - - @XmlAttribute(name = "swissprot_name") - public final String getSwissprotName() - { - return swissprotName; - } - - public final void setSwissprotName(String swissprotName) - { - this.swissprotName = swissprotName; - } - - @XmlAttribute(name = "ensembl_name") - public final String getEnsemblName() - { - return ensemblName; - } - - public final void setEnsemblName(String ensembleName) - { - this.ensemblName = ensembleName; - } - - @XmlAttribute(name = "trembl_name") - public final String getTremblName() - { - return tremblName; - } - - public final void setTremblName(String tremblName) - { - this.tremblName = tremblName; - } - - @XmlAttribute(name = "locus_link_name") - public final String getLocusLinkName() - { - return locusLinkName; - } - - public final void setLocusLinkName(String locusLinkName) - { - this.locusLinkName = locusLinkName; - } - - @XmlAttribute(name = "flybase") - public final String getFlybase() - { - return flybase; - } - - public final void setFlybase(String flybase) - { - this.flybase = flybase; - } - - @Override - public String toString() - { - StringBuilder builder = new StringBuilder(); - builder.append("Annotation[description=").append(description); - if (ipiName != null) - { - builder.append(", ipiName=").append(ipiName); - } - builder.append("]"); - return builder.toString(); - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/dto/ProteinGroup.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/dto/ProteinGroup.java deleted file mode 100644 index 24e0e05ea9a..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/dto/ProteinGroup.java +++ /dev/null @@ -1,105 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.etlserver.proteomics.dto; - -import java.util.List; - -import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlType; - -import ch.systemsx.cisd.openbis.etlserver.proteomics.Constants; - -/** - * @author Franz-Josef Elmer - */ -@XmlType -public class ProteinGroup -{ - private String groupNumber; - - private String pseudoName; - - private double probability; - - private List<Protein> proteins; - - @XmlAttribute(name = "group_number", required = true) - public final String getGroupNumber() - { - return groupNumber; - } - - public final void setGroupNumber(String groupNumber) - { - this.groupNumber = groupNumber; - } - - @XmlAttribute(name = "pseudo_name") - public final String getPseudoName() - { - return pseudoName; - } - - public final void setPseudoName(String pseudoName) - { - this.pseudoName = pseudoName; - } - - @XmlAttribute(name = "probability", required = true) - public final double getProbability() - { - return probability; - } - - public final void setProbability(double probability) - { - this.probability = probability; - } - - @XmlElement(name = "protein", namespace = Constants.NAMESPACE) - public final List<Protein> getProteins() - { - return proteins; - } - - public final void setProteins(List<Protein> proteins) - { - this.proteins = proteins; - } - - @Override - public String toString() - { - StringBuilder builder = new StringBuilder(); - builder.append("PG[number=").append(groupNumber); - if (pseudoName != null) - { - builder.append(", pseudoName=").append(pseudoName); - } - builder.append(", probability=").append(probability).append("]"); - if (proteins != null && proteins.size() > 0) - { - for (Protein protein : proteins) - { - builder.append("\n ").append(protein); - } - } - return builder.toString(); - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/dto/ProteinProphetDetails.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/dto/ProteinProphetDetails.java deleted file mode 100644 index cc8727dc7f8..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/dto/ProteinProphetDetails.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.etlserver.proteomics.dto; - -import java.util.List; - -import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.XmlType; - -import ch.systemsx.cisd.openbis.etlserver.proteomics.Constants; - -/** - * @author Franz-Josef Elmer - */ -@XmlRootElement(name = "proteinprophet_details", namespace = Constants.NAMESPACE) -@XmlType -public class ProteinProphetDetails -{ - private String occamFlag; - - private List<ProteinSummaryDataFilter> dataFilters; - - @XmlAttribute(name = "occam_flag", required = true) - public final String getOccamFlag() - { - return occamFlag; - } - - public final void setOccamFlag(String occamFlag) - { - this.occamFlag = occamFlag; - } - - @XmlElement(name = "protein_summary_data_filter", namespace = Constants.NAMESPACE) - public final List<ProteinSummaryDataFilter> getDataFilters() - { - return dataFilters; - } - - public final void setDataFilters(List<ProteinSummaryDataFilter> dataFilters) - { - this.dataFilters = dataFilters; - } - - @Override - public String toString() - { - return "ProteinProphet[occamFlag=" + occamFlag + "]"; - } -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/dto/ProteinReference.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/dto/ProteinReference.java deleted file mode 100644 index 9a3f56fe1bf..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/dto/ProteinReference.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.etlserver.proteomics.dto; - -import net.lemnik.eodsql.ResultColumn; - -/** - * @author Franz-Josef Elmer - */ -public class ProteinReference extends AbstractDTOWithID -{ - @ResultColumn("accession_number") - private String accessionNumber; - - @ResultColumn("description") - private String description; - - public final String getAccessionNumber() - { - return accessionNumber; - } - - public final void setAccessionNumber(String accessionNumber) - { - this.accessionNumber = accessionNumber; - } - - public final String getDescription() - { - return description; - } - - public final void setDescription(String description) - { - this.description = description; - } -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/dto/ProteinSummary.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/dto/ProteinSummary.java deleted file mode 100644 index 55a8526b0e6..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/dto/ProteinSummary.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.etlserver.proteomics.dto; - -import java.util.List; - -import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.XmlType; - -import ch.systemsx.cisd.openbis.etlserver.proteomics.Constants; - -/** - * @author Franz-Josef Elmer - */ -@XmlRootElement(name = "protein_summary", namespace = Constants.NAMESPACE) -@XmlType -public class ProteinSummary -{ - private String summaryXML; - - private ProteinSummaryHeader summaryHeader; - - private List<ProteinGroup> proteinGroups; - - @XmlAttribute(name = "summary_xml") - public final String getSummaryXML() - { - return summaryXML; - } - - public final void setSummaryXML(String summaryXML) - { - this.summaryXML = summaryXML; - } - - @XmlElement(name = "protein_summary_header", namespace = Constants.NAMESPACE) - public final ProteinSummaryHeader getSummaryHeader() - { - return summaryHeader; - } - - public final void setSummaryHeader(ProteinSummaryHeader summaryHeader) - { - this.summaryHeader = summaryHeader; - } - - @XmlElement(name = "protein_group", namespace = Constants.NAMESPACE) - public final List<ProteinGroup> getProteinGroups() - { - return proteinGroups; - } - - public final void setProteinGroups(List<ProteinGroup> proteinGroups) - { - this.proteinGroups = proteinGroups; - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/dto/ProteinSummaryDataFilter.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/dto/ProteinSummaryDataFilter.java deleted file mode 100644 index db809b28390..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/dto/ProteinSummaryDataFilter.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.etlserver.proteomics.dto; - -import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlType; - -/** - * Protein Phrophet section with the mapping between probability and FDR (False Discovery Rate). - * - * @author Franz-Josef Elmer - */ -@XmlType -public class ProteinSummaryDataFilter -{ - private double minProbability; - - private double sensitivity; - - private double falsePositiveErrorRate; - - @XmlAttribute(name = "min_probability", required = true) - public final double getMinProbability() - { - return minProbability; - } - - public final void setMinProbability(double minProbability) - { - this.minProbability = minProbability; - } - - @XmlAttribute(name = "sensitivity", required = true) - public final double getSensitivity() - { - return sensitivity; - } - - public final void setSensitivity(double sensitivity) - { - this.sensitivity = sensitivity; - } - - @XmlAttribute(name = "false_positive_error_rate", required = true) - public final double getFalsePositiveErrorRate() - { - return falsePositiveErrorRate; - } - - public final void setFalsePositiveErrorRate(double falsePositiveErrorRate) - { - this.falsePositiveErrorRate = falsePositiveErrorRate; - } -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/dto/ProteinSummaryHeader.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/dto/ProteinSummaryHeader.java deleted file mode 100644 index 216543fd617..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/dto/ProteinSummaryHeader.java +++ /dev/null @@ -1,267 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.etlserver.proteomics.dto; - -import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlType; - -import ch.systemsx.cisd.openbis.etlserver.proteomics.Constants; - -/** - * @author Franz-Josef Elmer - */ -@XmlType -public class ProteinSummaryHeader -{ - private String referenceDatabase; - - private String winReferenceDatabase; - - private String residueSubstitutions; - - private String organism; - - private String sourceFiles; - - private String sourceFilesAlternative; - - private String winSourceFiles; - - private String sourceFileType; - - private double minimumPeptideProbability; - - private double minimumPeptideWeight; - - private double numberOfPredictedCorrectProteins; - - private int numberOfInput1Spectra; - - private int numberOfInput2Spectra; - - private int numberOfInput3Spectra; - - private double minimumInitialPeptideProbability; - - private double totalEstimatedNumberOfCorrectPeptideAssignments; - - private String sampleEnzyme; - - private ProgramDetails programDetails; - - @XmlAttribute(name = "reference_database", required = true) - public final String getReferenceDatabase() - { - return referenceDatabase; - } - - public final void setReferenceDatabase(String referenceDatabase) - { - this.referenceDatabase = referenceDatabase; - } - - @XmlAttribute(name = "win-cyg_reference_database") - public final String getWinReferenceDatabase() - { - return winReferenceDatabase; - } - - public final void setWinReferenceDatabase(String winReferenceDatabase) - { - this.winReferenceDatabase = winReferenceDatabase; - } - - @XmlAttribute(name = "residue_substitution_list") - public final String getResidueSubstitutions() - { - return residueSubstitutions; - } - - public final void setResidueSubstitutions(String residueSubstitutions) - { - this.residueSubstitutions = residueSubstitutions; - } - - @XmlAttribute(name = "organism") - public final String getOrganism() - { - return organism; - } - - public final void setOrganism(String organism) - { - this.organism = organism; - } - - @XmlAttribute(name = "source_files", required = true) - public final String getSourceFiles() - { - return sourceFiles; - } - - public final void setSourceFiles(String sourceFiles) - { - this.sourceFiles = sourceFiles; - } - - @XmlAttribute(name = "win-cyg_source_files") - public final String getWinSourceFiles() - { - return winSourceFiles; - } - - public final void setWinSourceFiles(String winSourceFiles) - { - this.winSourceFiles = winSourceFiles; - } - - @XmlAttribute(name = "source_files_alt", required = true) - public final String getSourceFilesAlternative() - { - return sourceFilesAlternative; - } - - public final void setSourceFilesAlternative(String sourceFilesAlternative) - { - this.sourceFilesAlternative = sourceFilesAlternative; - } - - @XmlAttribute(name = "source_file_xtn") - public final String getSourceFileType() - { - return sourceFileType; - } - - public final void setSourceFileType(String sourceFileType) - { - this.sourceFileType = sourceFileType; - } - - @XmlAttribute(name = "min_peptide_probability", required = true) - public final double getMinimumPeptideProbability() - { - return minimumPeptideProbability; - } - - public final void setMinimumPeptideProbability(double minimumPeptideProbability) - { - this.minimumPeptideProbability = minimumPeptideProbability; - } - - @XmlAttribute(name = "min_peptide_weight", required = true) - public final double getMinimumPeptideWeight() - { - return minimumPeptideWeight; - } - - public final void setMinimumPeptideWeight(double minimumPeptideWeight) - { - this.minimumPeptideWeight = minimumPeptideWeight; - } - - @XmlAttribute(name = "num_predicted_correct_prots", required = true) - public final double getNumberOfPredictedCorrectProteins() - { - return numberOfPredictedCorrectProteins; - } - - public final void setNumberOfPredictedCorrectProteins(double numberOfPredictedCorrectProteins) - { - this.numberOfPredictedCorrectProteins = numberOfPredictedCorrectProteins; - } - - @XmlAttribute(name = "num_input_1_spectra", required = true) - public final int getNumberOfInput1Spectra() - { - return numberOfInput1Spectra; - } - - public final void setNumberOfInput1Spectra(int numberOfInput1Spectra) - { - this.numberOfInput1Spectra = numberOfInput1Spectra; - } - - @XmlAttribute(name = "num_input_2_spectra", required = true) - public final int getNumberOfInput2Spectra() - { - return numberOfInput2Spectra; - } - - public final void setNumberOfInput2Spectra(int numberOfInput2Spectra) - { - this.numberOfInput2Spectra = numberOfInput2Spectra; - } - - @XmlAttribute(name = "num_input_3_spectra", required = true) - public final int getNumberOfInput3Spectra() - { - return numberOfInput3Spectra; - } - - public final void setNumberOfInput3Spectra(int numberOfInput3Spectra) - { - this.numberOfInput3Spectra = numberOfInput3Spectra; - } - - @XmlAttribute(name = "initial_min_peptide_prob", required = true) - public final double getMinimumInitialPeptideProbability() - { - return minimumInitialPeptideProbability; - } - - public final void setMinimumInitialPeptideProbability(double minimumInitialPeptideProbability) - { - this.minimumInitialPeptideProbability = minimumInitialPeptideProbability; - } - - @XmlAttribute(name = "total_no_spectrum_ids") - public final double getTotalEstimatedNumberOfCorrectPeptideAssignments() - { - return totalEstimatedNumberOfCorrectPeptideAssignments; - } - - public final void setTotalEstimatedNumberOfCorrectPeptideAssignments( - double totalEstimatedNumberOfCorrectPeptideAssignments) - { - this.totalEstimatedNumberOfCorrectPeptideAssignments = - totalEstimatedNumberOfCorrectPeptideAssignments; - } - - @XmlAttribute(name = "sample_enzyme", required = true) - public final String getSampleEnzyme() - { - return sampleEnzyme; - } - - public final void setSampleEnzyme(String sampleEnzyme) - { - this.sampleEnzyme = sampleEnzyme; - } - - @XmlElement(name = "program_details", namespace = Constants.NAMESPACE) - public final ProgramDetails getProgramDetails() - { - return programDetails; - } - - public final void setProgramDetails(ProgramDetails programDetails) - { - this.programDetails = programDetails; - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/dto/Sample.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/dto/Sample.java deleted file mode 100644 index debe7356ee5..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/dto/Sample.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.etlserver.proteomics.dto; - -import net.lemnik.eodsql.ResultColumn; - -/** - * @author Franz-Josef Elmer - */ -public class Sample extends AbstractDTOWithIDAndPermID -{ - @ResultColumn("expe_id") - private Long experimentID; - - public final Long getExperimentID() - { - return experimentID; - } - - public final void setExperimentID(Long experimentID) - { - this.experimentID = experimentID; - } -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/dto/Sequence.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/dto/Sequence.java deleted file mode 100644 index 0be82ad08a6..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/dto/Sequence.java +++ /dev/null @@ -1,124 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.etlserver.proteomics.dto; - -import net.lemnik.eodsql.ResultColumn; - -/** - * @author Franz-Josef Elmer - */ -public class Sequence extends AbstractDTOWithID -{ - @ResultColumn("database_id") - private long databaseID; - - @ResultColumn("protein_reference_id") - private long proteinReferenceID; - - @ResultColumn("amino_acid_sequence") - private String sequence; - - private String checksum; - - // Used by eodsql - @SuppressWarnings("unused") - private Sequence() - { - } - - public Sequence(String sequence) - { - setSequence(sequence); - calculateChecksum(); - } - - public final long getDatabaseID() - { - return databaseID; - } - - public final void setDatabaseID(long databaseID) - { - this.databaseID = databaseID; - } - - public final long getProteinReferenceID() - { - return proteinReferenceID; - } - - public final void setProteinReferenceID(long proteinDescriptionID) - { - this.proteinReferenceID = proteinDescriptionID; - } - - public final String getSequence() - { - return sequence; - } - - public final void setSequence(String sequence) - { - this.sequence = sequence; - } - - public void calculateChecksum() - { - if (sequence != null) - { - setChecksum(Integer.toHexString(sequence.hashCode())); - } - } - - public final String getChecksum() - { - return checksum; - } - - public final void setChecksum(String checksum) - { - this.checksum = checksum; - } - - @Override - public boolean equals(Object obj) - { - if (obj == this) - { - return true; - } - if (obj instanceof Sequence == false) - { - return false; - } - return ((Sequence) obj).toString().equals(toString()); - } - - @Override - public int hashCode() - { - return toString().hashCode(); - } - - @Override - public String toString() - { - return getDatabaseID() + "-" + getProteinReferenceID() + ":" + sequence - + "[" + checksum + "]"; - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/protXML_v3.xsd b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/protXML_v3.xsd deleted file mode 100644 index 06037477473..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/protXML_v3.xsd +++ /dev/null @@ -1,816 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- edited with XMLSPY v2004 rel. 4 U (http://www.xmlspy.com) by Wei Yan (Institute for Systems Biology) --> -<!--W3C Schema generated by XMLSPY v2004 rel. 4 U (http://www.xmlspy.com)--> -<xs:schema targetNamespace="http://regis-web.systemsbiology.net/protXML" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://regis-web.systemsbiology.net/protXML" xmlns:protx="http://regis-web.systemsbiology.net/protXML" elementFormDefault="qualified"> - <xs:element name="ASAPRatio_pvalue"> - <xs:annotation> - <xs:documentation>Results of ASAPRatio pvalue analysis (adjusting ASAPRatio ratios for offset of dataset, and determining whether ratios are significantly different from chance values originating from 1:1 proteins)</xs:documentation> - </xs:annotation> - <xs:complexType> - <xs:attribute name="adj_ratio_mean" type="xs:double" use="required"> - <xs:annotation> - <xs:documentation>Ratio adjusted for dataset mean value</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="adj_ratio_standard_dev" type="xs:double" use="required"> - <xs:annotation> - <xs:documentation>Error adjusted for dataset mean value</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="heavy2light_adj_ratio_mean" type="xs:double"> - <xs:annotation> - <xs:documentation>Heavy2light ratio adjusted for dataset mean value</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="heavy2light_adj_ratio_standard_dev" type="xs:double"> - <xs:annotation> - <xs:documentation>Heavy2light error adjusted for dataset mean value</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="pvalue" type="xs:double"> - <xs:annotation> - <xs:documentation>pvalue (probability of ratio due by chance to 1:1 protein)</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="decimal_pvalue" type="xs:double"> - <xs:annotation> - <xs:documentation>decimal representation of pvalue</xs:documentation> - </xs:annotation> - </xs:attribute> - </xs:complexType> - </xs:element> - <xs:element name="ASAPRatio"> - <xs:annotation> - <xs:documentation>Results of ASAPRatio quantitation of protein</xs:documentation> - </xs:annotation> - <xs:complexType> - <xs:sequence> - <xs:element name="ASAP_Seq" minOccurs="0" maxOccurs="unbounded"> - <xs:complexType> - <xs:sequence> - <xs:element name="ASAP_Peak" maxOccurs="unbounded"> - <xs:complexType> - <xs:sequence> - <xs:element name="ASAP_Dta" maxOccurs="unbounded"> - <xs:complexType> - <xs:attribute name="peptide_index" type="xs:string" use="required"/> - <xs:attribute name="include" type="xs:string" use="required"/> - </xs:complexType> - </xs:element> - </xs:sequence> - <xs:attribute name="status" type="xs:string" use="required"/> - <xs:attribute name="include" type="xs:string" use="required"/> - <xs:attribute name="datanum" type="xs:nonNegativeInteger" use="required"/> - <xs:attribute name="ratio_mean" type="xs:double" use="required"/> - <xs:attribute name="ratio_standard_dev" type="xs:double" use="required"/> - <xs:attribute name="weight" type="xs:double" use="required"/> - <xs:attribute name="peptide_binary_ind" type="xs:string" use="required"/> - </xs:complexType> - </xs:element> - </xs:sequence> - <xs:attribute name="status" type="xs:string" use="required"/> - <xs:attribute name="include" type="xs:string" use="required"/> - <xs:attribute name="datanum" type="xs:nonNegativeInteger" use="required"/> - <xs:attribute name="ratio_mean" type="xs:double" use="required"/> - <xs:attribute name="ratio_standard_dev" type="xs:double" use="required"/> - <xs:attribute name="weight" type="xs:double" use="required"/> - <xs:attribute name="light_sequence" type="xs:string" use="required"/> - </xs:complexType> - </xs:element> - </xs:sequence> - <xs:attribute name="ratio_mean" type="xs:double" use="required"/> - <xs:attribute name="ratio_standard_dev" type="xs:double" use="required"/> - <xs:attribute name="ratio_number_peptides" type="xs:nonNegativeInteger" use="required"/> - <xs:attribute name="heavy2light_ratio_mean" type="xs:double"/> - <xs:attribute name="heavy2light_ratio_standard_dev" type="xs:double"/> - <xs:attribute name="description" type="xs:string"/> - <xs:attribute name="status" type="xs:string"/> - <xs:attribute name="peptide_inds" type="xs:string"/> - </xs:complexType> - </xs:element> - <xs:element name="protein_summary"> - <xs:complexType> - <xs:sequence> - <xs:element name="protein_summary_header"> - <xs:complexType> - <xs:sequence> - <xs:element name="program_details"> - <xs:complexType> - <xs:sequence> - <xs:any namespace="##any" processContents="lax" minOccurs="0"> - <xs:annotation> - <xs:documentation>Wildcard for summary info customized for a particular analysis used to infer protein identifications</xs:documentation> - </xs:annotation> - </xs:any> - </xs:sequence> - <xs:attribute name="analysis" type="xs:string" use="required"> - <xs:annotation> - <xs:documentation>Name of analysis used for protein identifications</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="time" type="xs:dateTime" use="required"> - <xs:annotation> - <xs:documentation>Time of analysis</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="version" type="xs:string"/> - </xs:complexType> - </xs:element> - </xs:sequence> - <xs:attribute name="reference_database" type="xs:string" use="required"> - <xs:annotation> - <xs:documentation>full path database name</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="win-cyg_reference_database" type="xs:string"> - <xs:annotation> - <xs:documentation>windows full path database</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="residue_substitution_list" type="xs:string"> - <xs:annotation> - <xs:documentation>residues considered equivalent when comparing peptides</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="organism" type="xs:string"> - <xs:annotation> - <xs:documentation>sample organism (used for annotation purposes)</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="source_files" type="xs:string" use="required"> - <xs:annotation> - <xs:documentation>input pepXML files</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="source_files_alt" type="xs:string" use="required"/> - <xs:attribute name="win-cyg_source_files" type="xs:string"> - <xs:annotation> - <xs:documentation>windows pepXML file names</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="source_file_xtn" type="xs:string"> - <xs:annotation> - <xs:documentation>file type (if not pepXML)</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="min_peptide_probability" type="xs:double" use="required"> - <xs:annotation> - <xs:documentation>minimum adjusted peptide probability contributing to protein probability</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="min_peptide_weight" type="xs:double" use="required"> - <xs:annotation> - <xs:documentation>minimum peptide weight contributing to protein probability</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="num_predicted_correct_prots" type="xs:double" use="required"> - <xs:annotation> - <xs:documentation>total number of predicted correct protein ids (sum of probabilities)</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="num_input_1_spectra" type="xs:integer" use="required"> - <xs:annotation> - <xs:documentation>number of spectra from 1+ precursor ions</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="num_input_2_spectra" type="xs:integer" use="required"> - <xs:annotation> - <xs:documentation>number of spectra from 2+ precursor ions</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="num_input_3_spectra" type="xs:integer" use="required"> - <xs:annotation> - <xs:documentation>number of spectra from 3+ precursor ions</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="initial_min_peptide_prob" type="xs:double" use="required"> - <xs:annotation> - <xs:documentation>minimum initial peptide probability to contribute to analysis</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="total_no_spectrum_ids" type="xs:double"> - <xs:annotation> - <xs:documentation>total estimated number of correct peptide assignments in dataset</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="sample_enzyme" type="xs:string" use="required"> - <xs:annotation> - <xs:documentation>enzyme applied to sample prior to MS/MS</xs:documentation> - </xs:annotation> - </xs:attribute> - </xs:complexType> - </xs:element> - <xs:element name="analysis_summary" minOccurs="0" maxOccurs="unbounded"> - <xs:complexType> - <xs:sequence> - <xs:any namespace="##any" processContents="lax" minOccurs="0"> - <xs:annotation> - <xs:documentation>time of analysis</xs:documentation> - </xs:annotation> - </xs:any> - </xs:sequence> - <xs:attribute name="analysis" type="xs:string" use="required"> - <xs:annotation> - <xs:documentation>name of protein-level analysis</xs:documentation> - </xs:annotation> - </xs:attribute> - - <xs:attribute name="time" type="xs:dateTime" use="required"> - <xs:annotation> - <xs:documentation>time of analysis</xs:documentation> - </xs:annotation> - </xs:attribute> - - <xs:attribute name="id" type="xs:nonNegativeInteger" use="required"> - <xs:annotation> - <xs:documentation>unique id corresponding with analysis_result elements</xs:documentation> - </xs:annotation> - </xs:attribute> - - - </xs:complexType> - </xs:element> - <xs:element name="dataset_derivation"> - <xs:annotation> - <xs:documentation>Source and filtering criteria used to generate dataset</xs:documentation> - </xs:annotation> - <xs:complexType> - <xs:sequence minOccurs="0" maxOccurs="unbounded"> - <xs:element name="data_filter"> - <xs:complexType> - <xs:attribute name="number" type="xs:string" use="required"> - <xs:annotation> - <xs:documentation>generation number (0 is root)</xs:documentation> - </xs:annotation> - </xs:attribute> - - <xs:attribute name="parent_file" type="xs:string" use="required"> - <xs:annotation> - <xs:documentation>File from which derived</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="windows_parent" type="xs:string"/> - <xs:attribute name="description" type="xs:string" use="required"> - <xs:annotation> - <xs:documentation>filtering criteria applied to data</xs:documentation> - </xs:annotation> - </xs:attribute> - </xs:complexType> - </xs:element> - </xs:sequence> - <xs:attribute name="generation_no" type="xs:string" use="required"> - <xs:annotation> - <xs:documentation>number preceding filter generations</xs:documentation> - </xs:annotation> - </xs:attribute> - </xs:complexType> - </xs:element> - <xs:element name="protein_group" maxOccurs="unbounded"> - <xs:complexType> - <xs:sequence> - <xs:element name="protein" maxOccurs="unbounded"> - <xs:complexType> - <xs:sequence> - <xs:element name="parameter" minOccurs="0" maxOccurs="unbounded"> - <xs:complexType> - <xs:simpleContent> - <xs:extension base="xs:anySimpleType"> - <xs:attribute name="name" type="xs:string" use="required"/> - <xs:attribute name="value" type="xs:anySimpleType" use="required"/> - <xs:attribute name="type" type="xs:anySimpleType"/> - </xs:extension> - </xs:simpleContent> - </xs:complexType> - </xs:element> - <xs:element name="analysis_result" minOccurs="0" maxOccurs="unbounded"> - <xs:complexType> - <xs:sequence> - <xs:any namespace="##any" processContents="lax"> - <xs:annotation> - <xs:documentation>wildcard to be substituted with element storing analysis-specific result info</xs:documentation> - </xs:annotation> - </xs:any> - - </xs:sequence> - <xs:attribute name="analysis" type="xs:string" use="required"> - <xs:annotation> - <xs:documentation>name of protein level analysis</xs:documentation> - </xs:annotation> - </xs:attribute> - - <xs:attribute name="id" type="xs:nonNegativeInteger" default="1"> - <xs:annotation> - <xs:documentation>unique identifier to analysis_summary element</xs:documentation> - </xs:annotation> - </xs:attribute> - - </xs:complexType> - </xs:element> - <xs:element name="annotation" minOccurs="0"> - <xs:complexType> - <xs:attribute name="protein_description" type="xs:string" use="required"/> - <xs:attribute name="ipi_name" type="xs:string"/> - <xs:attribute name="refseq_name" type="xs:string"/> - <xs:attribute name="swissprot_name" type="xs:string"/> - <xs:attribute name="ensembl_name" type="xs:string"/> - <xs:attribute name="trembl_name" type="xs:string"/> - <xs:attribute name="locus_link_name" type="xs:string"/> - <xs:attribute name="flybase" type="xs:string"/> - </xs:complexType> - </xs:element> - <xs:element name="indistinguishable_protein" minOccurs="0" maxOccurs="unbounded"> - <xs:annotation> - <xs:documentation>other protein sharing corresponding peptides</xs:documentation> - </xs:annotation> - <xs:complexType> - <xs:sequence> - <xs:element name="annotation" minOccurs="0"> - <xs:annotation> - <xs:documentation>protein description</xs:documentation> - </xs:annotation> - - <xs:complexType> - <xs:attribute name="protein_description" type="xs:string" use="required"> - <xs:annotation> - <xs:documentation>description</xs:documentation> - </xs:annotation> - </xs:attribute> - - <xs:attribute name="ipi_name" type="xs:string"/> - <xs:attribute name="refseq_name" type="xs:string"/> - <xs:attribute name="swissprot_name" type="xs:string"/> - <xs:attribute name="ensembl_name" type="xs:string"/> - <xs:attribute name="trembl_name" type="xs:string"/> - <xs:attribute name="locus_link_name" type="xs:string"/> - <xs:attribute name="flybase" type="xs:string"/> - </xs:complexType> - </xs:element> - </xs:sequence> - <xs:attribute name="protein_name" type="xs:string" use="required"/> - </xs:complexType> - </xs:element> - <xs:element name="peptide" maxOccurs="unbounded"> - <xs:complexType> - <xs:sequence> - <xs:element name="parameter" minOccurs="0" maxOccurs="unbounded"> - <xs:complexType> - <xs:simpleContent> - <xs:extension base="xs:anySimpleType"> - <xs:attribute name="name" type="xs:string" use="required"/> - <xs:attribute name="value" type="xs:anySimpleType" use="required"/> - <xs:attribute name="type" type="xs:anySimpleType"/> - </xs:extension> - </xs:simpleContent> - </xs:complexType> - </xs:element> - <xs:element name="modification_info" minOccurs="0" maxOccurs="unbounded"> - <xs:complexType> - <xs:sequence> - <xs:element name="mod_aminoacid_mass" minOccurs="0" maxOccurs="unbounded"> - <xs:complexType> - <xs:attribute name="position" type="xs:string" use="required"/> - <xs:attribute name="mass" type="xs:string" use="required"/> - </xs:complexType> - </xs:element> - </xs:sequence> - <xs:attribute name="mod_nterm_mass" type="xs:string"/> - <xs:attribute name="mod_cterm_mass" type="xs:string"/> - <xs:attribute name="modified_peptide" type="xs:string"/> - </xs:complexType> - </xs:element> - <xs:element name="peptide_parent_protein" minOccurs="0" maxOccurs="unbounded"> - <xs:complexType> - <xs:attribute name="protein_name" type="xs:string" use="required"/> - </xs:complexType> - </xs:element> - <xs:element name="indistinguishable_peptide" minOccurs="0" maxOccurs="unbounded"> - <xs:complexType> - <xs:sequence> - <xs:element name="modification_info" minOccurs="0" maxOccurs="unbounded"> - <xs:complexType> - <xs:sequence> - <xs:element name="mod_aminoacid_mass" minOccurs="0" maxOccurs="unbounded"> - <xs:complexType> - <xs:attribute name="position" type="xs:string" use="required"/> - <xs:attribute name="mass" type="xs:string" use="required"/> - </xs:complexType> - </xs:element> - </xs:sequence> - <xs:attribute name="mod_nterm_mass" type="xs:string"/> - <xs:attribute name="mod_cterm_mass" type="xs:string"/> - <xs:attribute name="modified_peptide" type="xs:string"/> - </xs:complexType> - </xs:element> - </xs:sequence> - <xs:attribute name="peptide_sequence" type="xs:string" use="required"/> - </xs:complexType> - </xs:element> - </xs:sequence> - <xs:attribute name="peptide_sequence" type="xs:string" use="required"> - <xs:annotation> - <xs:documentation>unmodified aa sequence</xs:documentation> - </xs:annotation> - </xs:attribute> - - <xs:attribute name="charge" type="xs:positiveInteger" use="required"> - <xs:annotation> - <xs:documentation>precursor ion charge</xs:documentation> - </xs:annotation> - </xs:attribute> - - <xs:attribute name="initial_probability" type="xs:double" use="required"> - <xs:annotation> - <xs:documentation>prior to nsp adjustment</xs:documentation> - </xs:annotation> - </xs:attribute> - - <xs:attribute name="nsp_adjusted_probability" type="xs:double" use="optional"> - <xs:annotation> - <xs:documentation>after nsp adjustment</xs:documentation> - </xs:annotation> - </xs:attribute> - - <xs:attribute name="peptide_group_designator" type="xs:string"> - <xs:annotation> - <xs:documentation>link to spectra with other precursor ion charges assigned to same peptide</xs:documentation> - </xs:annotation> - </xs:attribute> - - <xs:attribute name="weight" type="xs:double" default="1.0"/> - <xs:attribute name="is_nondegenerate_evidence" type="xs:string" use="required"> - <xs:annotation> - <xs:documentation>confidence that peptide corresponds with this protein (rather than others in which it occurs)</xs:documentation> - </xs:annotation> - </xs:attribute> - - <xs:attribute name="n_enzymatic_termini" type="xs:nonNegativeInteger" use="required"> - <xs:annotation> - <xs:documentation>number of termini consistent with proteolytic cleavage</xs:documentation> - </xs:annotation> - </xs:attribute> - - <xs:attribute name="n_sibling_peptides" type="xs:double"> - <xs:annotation> - <xs:documentation>estimated number of sibling peptides (other identified peptides corresponding to same protein)</xs:documentation> - </xs:annotation> - </xs:attribute> - - <xs:attribute name="n_sibling_peptides_bin" type="xs:integer" default="0"> - <xs:annotation> - <xs:documentation>discretized nsp value</xs:documentation> - </xs:annotation> - </xs:attribute> - - <xs:attribute name="n_instances" type="xs:integer" use="required"> - <xs:annotation> - <xs:documentation>number of times peptide assigned to spectrum of precursor ion charge in dataset</xs:documentation> - </xs:annotation> - </xs:attribute> - - <xs:attribute name="calc_neutral_pep_mass" type="xs:double"/> - <xs:attribute name="is_contributing_evidence" type="xs:string" use="required"/> - </xs:complexType> - </xs:element> - </xs:sequence> - <xs:attribute name="protein_name" type="xs:string" use="required"> - <xs:annotation> - <xs:documentation>database protein name</xs:documentation> - </xs:annotation> - </xs:attribute> - - <xs:attribute name="probability" type="xs:double" use="required"> - <xs:annotation> - <xs:documentation>confidence of protein id</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="percent_coverage" type="xs:double"> - <xs:annotation> - <xs:documentation>percent of protein sequence covered by corresponding peptides</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="n_indistinguishable_proteins" type="xs:integer" use="required"> - <xs:annotation> - <xs:documentation>number of proteins with identical corresponding peptides</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="unique_stripped_peptides" type="xs:string"/> - <xs:attribute name="group_sibling_id" type="xs:string" use="required"> - <xs:annotation> - <xs:documentation>protein group id</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="total_number_peptides" type="xs:integer"> - <xs:annotation> - <xs:documentation>total number of corresponding peptides that contributed to protein probability</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="subsuming_protein_entry" type="xs:string"> - <xs:annotation> - <xs:documentation>name of portein containing all corresponding peptides, and more</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="pct_spectrum_ids" type="xs:string"> - <xs:annotation> - <xs:documentation>fraction of correct dataset peptide identifications corresponding to protein</xs:documentation> - </xs:annotation> - </xs:attribute> - </xs:complexType> - <xs:unique name="unique_result_analysis_id"> - <xs:annotation> - <xs:documentation>can only have one analysis/id combination within each protein element</xs:documentation> - </xs:annotation> - - <xs:selector xpath="./protx:analysis_result"/> - <xs:field xpath="@analysis"/> - <xs:field xpath="@id"/> - </xs:unique> - </xs:element> - </xs:sequence> - <xs:attribute name="group_number" type="xs:string" use="required"> - <xs:annotation> - <xs:documentation>index</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="pseudo_name" type="xs:string"/> - <xs:attribute name="probability" type="xs:double" use="required"> - <xs:annotation> - <xs:documentation>group probability (taking contributions from all group member proteins)</xs:documentation> - </xs:annotation> - </xs:attribute> - </xs:complexType> - <xs:unique name="unique_group_sibling_id"> - <xs:annotation> - <xs:documentation>Each group_sibling_id must be unique within a protein group</xs:documentation> - </xs:annotation> - <xs:selector xpath="./protx:protein"/> - <xs:field xpath="@group_sibling_id"/> - </xs:unique> - - </xs:element> - </xs:sequence> - <xs:attribute name="summary_xml" type="xs:string"/> - </xs:complexType> - <xs:key name="summary_analysis_id"> - <xs:selector xpath="./protx:analysis_summary"/> - <xs:field xpath="@analysis"/> - <xs:field xpath="@id"/> - </xs:key> - <xs:keyref name="result_analysis_id" refer="summary_analysis_id"> - <xs:annotation> - <xs:documentation>analysis and id must correspond with those fields in an analysis_summary element</xs:documentation> - </xs:annotation> - <xs:selector xpath="./protx:protein_group/protx:protein/protx:analysis_result"/> - <xs:field xpath="@analysis"/> - <xs:field xpath="@id"/> - </xs:keyref> - <xs:unique name="unique_group_number"> - <xs:annotation> - <xs:documentation>Requires group numbers be unique for entire dataset</xs:documentation> - </xs:annotation> - <xs:selector xpath="./protx:protein_group"/> - <xs:field xpath="@group_number"/> - </xs:unique> - </xs:element> - <xs:element name="proteinprophet_details"> - <xs:annotation> - <xs:documentation>ProteinProphet analysis details</xs:documentation> - </xs:annotation> - <xs:complexType> - <xs:sequence> - <xs:element name="nsp_information"> - <xs:annotation> - <xs:documentation>learned distributions of estimated number of sibling peptides</xs:documentation> - </xs:annotation> - <xs:complexType> - <xs:sequence> - <xs:element name="nsp_distribution" maxOccurs="unbounded"> - <xs:annotation> - <xs:documentation>histogram slice of estimated number of sibling peptides</xs:documentation> - </xs:annotation> - <xs:complexType> - <xs:attribute name="bin_no" type="xs:integer" use="required"> - <xs:annotation> - <xs:documentation>discretized bin number</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="nsp_lower_bound_incl" type="xs:double" use="required"> - <xs:annotation> - <xs:documentation>lower bound nsp value (inclusive)</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="nsp_upper_bound_excl" type="xs:string" use="required"> - <xs:annotation> - <xs:documentation>upper bound nsp value (exclusive)</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="pos_freq" type="xs:double" use="required"> - <xs:annotation> - <xs:documentation>fraction of correct peptides in bin</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="neg_freq" type="xs:double" use="required"> - <xs:annotation> - <xs:documentation>fraction of incorrect peptides in bin</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="pos_to_neg_ratio" type="xs:double" use="required"> - <xs:annotation> - <xs:documentation>fraction of correct / fraction of incorrect</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="alt_pos_to_neg_ratio" type="xs:double"> - <xs:annotation> - <xs:documentation>pos_to_neg_ratio of preceding bin (if greater than that of current bin)</xs:documentation> - </xs:annotation> - </xs:attribute> - </xs:complexType> - </xs:element> - </xs:sequence> - <xs:attribute name="neighboring_bin_smoothing" type="xs:string" use="required"/> - </xs:complexType> - </xs:element> - <xs:element name="protein_summary_data_filter" maxOccurs="unbounded"> - <xs:annotation> - <xs:documentation>predicted error/sensitivity for filtering at minimum probability</xs:documentation> - </xs:annotation> - <xs:complexType> - <xs:attribute name="min_probability" type="xs:double" use="required"> - <xs:annotation> - <xs:documentation>filter setting</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="sensitivity" type="xs:double" use="required"> - <xs:annotation> - <xs:documentation>predicted sensitivity (fraction of correct results passing filter)</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="false_positive_error_rate" type="xs:double" use="required"> - <xs:annotation> - <xs:documentation>predicted error rate (fraction of results passing filter than are incorrect)</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="predicted_num_correct" type="xs:double"> - <xs:annotation> - <xs:documentation>predicted number of correct results passing filter</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="predicted_num_incorrect" type="xs:double"> - <xs:annotation> - <xs:documentation>predicted number of incorrect results passing filter</xs:documentation> - </xs:annotation> - </xs:attribute> - </xs:complexType> - </xs:element> - </xs:sequence> - <xs:attribute name="occam_flag" type="xs:string" use="required"> - <xs:annotation> - <xs:documentation>whether or not occams razor was used to apportion peptides corresponding to multiple proteins</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="groups_flag" type="xs:string" use="required"> - <xs:annotation> - <xs:documentation>whether or not related proteins are organized together in common protein groups</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="degen_flag" type="xs:string" use="required"> - <xs:annotation> - <xs:documentation>whether or not all proteins corresponding to each identified peptide were used in analysis</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="nsp_flag" type="xs:string" use="required"> - <xs:annotation> - <xs:documentation>whether or not peptide probabilities were adjusted for estimated number of sibling peptides</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="initial_peptide_wt_iters" type="xs:string" use="required"> - <xs:annotation> - <xs:documentation>proteinprophet number of initial iterations to compute peptide weights</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="nsp_distribution_iters" type="xs:string" use="required"> - <xs:annotation> - <xs:documentation>proteinprophet number of interations used to compute nsp distributions</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="final_peptide_wt_iters" type="xs:string" use="required"> - <xs:annotation> - <xs:documentation>proteinprophet number of final interations used to compute final peptide weights</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="run_options" type="xs:string"> - <xs:annotation> - <xs:documentation>special run options</xs:documentation> - </xs:annotation> - </xs:attribute> - </xs:complexType> - </xs:element> - <xs:element name="XPress_analysis_summary"> - <xs:complexType> - <xs:attribute name="min_peptide_probability" type="xs:double" use="required"/> - <xs:attribute name="min_peptide_weight" type="xs:double" use="required"/> - <xs:attribute name="min_protein_probability" type="xs:double" use="required"/> - <xs:attribute name="reference_isotope" type="xs:string"/> - </xs:complexType> - </xs:element> - <xs:element name="ASAP_prot_analysis_summary"> - <xs:complexType> - <xs:attribute name="version" type="xs:string"/> - <xs:attribute name="binary_ref_files" type="xs:string"/> - <xs:attribute name="min_peptide_probability" type="xs:double" use="required"/> - <xs:attribute name="min_peptide_weight" type="xs:double" use="required"/> - <xs:attribute name="min_protein_probability" type="xs:double" use="required"/> - <xs:attribute name="reference_isotope" type="xs:string"/> - </xs:complexType> - </xs:element> - <xs:element name="ASAP_pvalue_analysis_summary"> - <xs:complexType> - <xs:attribute name="asapratio_id" type="xs:nonNegativeInteger" default="1"/> - <xs:attribute name="background_ratio_mean" type="xs:double" use="required"/> - <xs:attribute name="background_ratio_stdev" type="xs:double" use="required"/> - <xs:attribute name="background_fitting_error" type="xs:double" use="required"/> - <xs:attribute name="analysis_distribution_file" type="xs:string" use="required"/> - <xs:attribute name="full_analysis_distr_file" type="xs:string"/> - <xs:attribute name="asap_prot_id" type="xs:nonNegativeInteger" default="1"/> - </xs:complexType> - </xs:element> - - - <xs:simpleType name="positiveInt"> - <xs:restriction base="xs:unsignedInt"> - <xs:minInclusive value="1"/> - </xs:restriction> - </xs:simpleType> - <xs:element name="libra_result"> - <xs:complexType> - <xs:sequence> - <xs:element name="intensity" maxOccurs="unbounded"> - <xs:complexType> - <xs:attribute name="mz" type="xs:float" use="required"/> - <xs:attribute name="ratio" type="xs:float" use="required"/> - <xs:attribute name="error" type="xs:float" use="required"/> - </xs:complexType> - </xs:element> - </xs:sequence> - <xs:attribute name="number" type="xs:nonNegativeInteger" use="required"/> - </xs:complexType> - <xs:unique name="libra_result_channel_index"> - <xs:selector xpath="."/> - <xs:field xpath="@channel"/> - </xs:unique> - - - </xs:element> - <xs:element name="libra_summary"> - <xs:complexType> - <xs:sequence> - <xs:element name="fragment_masses" maxOccurs="unbounded"> - <xs:complexType> - <xs:attribute name="channel" type="positiveInt" use="required"/> - <xs:attribute name="mz" type="xs:float" use="required"/> - </xs:complexType> - </xs:element> - <xs:element name="isotopic_contributions" minOccurs="0"> - <xs:complexType> - <xs:sequence> - <xs:element name="contributing_channel" maxOccurs="unbounded"> - <xs:complexType> - <xs:sequence> - <xs:element name="affected_channel" maxOccurs="unbounded"> - <xs:complexType> - <xs:attribute name="channel" type="positiveInt" use="required"/> - <xs:attribute name="correction" type="xs:float" use="required"/> - </xs:complexType> - </xs:element> - </xs:sequence> - <xs:attribute name="channel" type="positiveInt" use="required"/> - </xs:complexType> - </xs:element> - </xs:sequence> - </xs:complexType> - </xs:element> - </xs:sequence> - <xs:attribute name="mass_tolerance" type="xs:float" use="required"/> - <xs:attribute name="centroiding_preference" type="xs:int" use="required"/> - <xs:attribute name="normalization" type="xs:int" use="required"/> - <xs:attribute name="output_type" type="xs:int" use="required"/> - <xs:attribute name="channel_code" type="xs:string"/> - <xs:attribute name="min_pep_prob" type="xs:float" use="required"/> - <xs:attribute name="min_pep_wt" type="xs:float" use="required"/> - <xs:attribute name="min_prot_prob" type="xs:float" use="required"/> - </xs:complexType> - - <xs:key name="libra_channel_index"> - <xs:selector xpath="./protx:fragment_masses"/> - <xs:field xpath="@channel"/> - </xs:key> - <xs:keyref name="libra_contr_channel_index_ref" refer="libra_channel_index"> - <xs:selector xpath="./protx:isotopic_contributions/protx:contributing_channel"/> - <xs:field xpath="@channel"/> - </xs:keyref> - <xs:keyref name="libra_aff_channel_index_ref" refer="libra_channel_index"> - <xs:selector xpath="./protx:isotopic_contributions/protx:contributing_channel/protx:affected_channel"/> - <xs:field xpath="@channel"/> - </xs:keyref> - - </xs:element> -</xs:schema> \ No newline at end of file diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/protXML_v4.xsd b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/protXML_v4.xsd deleted file mode 100644 index 26809f124c2..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/protXML_v4.xsd +++ /dev/null @@ -1,820 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- edited with XMLSPY v2004 rel. 4 U (http://www.xmlspy.com) by Wei Yan (Institute for Systems Biology) --> -<!--W3C Schema generated by XMLSPY v2004 rel. 4 U (http://www.xmlspy.com)--> -<xs:schema targetNamespace="http://regis-web.systemsbiology.net/protXML" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://regis-web.systemsbiology.net/protXML" xmlns:protx="http://regis-web.systemsbiology.net/protXML" elementFormDefault="qualified"> - <xs:element name="ASAPRatio_pvalue"> - <xs:annotation> - <xs:documentation>Results of ASAPRatio pvalue analysis (adjusting ASAPRatio ratios for offset of dataset, and determining whether ratios are significantly different from chance values originating from 1:1 proteins)</xs:documentation> - </xs:annotation> - <xs:complexType> - <xs:attribute name="adj_ratio_mean" type="xs:double" use="required"> - <xs:annotation> - <xs:documentation>Ratio adjusted for dataset mean value</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="adj_ratio_standard_dev" type="xs:double" use="required"> - <xs:annotation> - <xs:documentation>Error adjusted for dataset mean value</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="heavy2light_adj_ratio_mean" type="xs:double"> - <xs:annotation> - <xs:documentation>Heavy2light ratio adjusted for dataset mean value</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="heavy2light_adj_ratio_standard_dev" type="xs:double"> - <xs:annotation> - <xs:documentation>Heavy2light error adjusted for dataset mean value</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="pvalue" type="xs:double"> - <xs:annotation> - <xs:documentation>pvalue (probability of ratio due by chance to 1:1 protein)</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="decimal_pvalue" type="xs:double"> - <xs:annotation> - <xs:documentation>decimal representation of pvalue</xs:documentation> - </xs:annotation> - </xs:attribute> - </xs:complexType> - </xs:element> - <xs:element name="ASAPRatio"> - <xs:annotation> - <xs:documentation>Results of ASAPRatio quantitation of protein</xs:documentation> - </xs:annotation> - <xs:complexType> - <xs:sequence> - <xs:element name="ASAP_Seq" minOccurs="0" maxOccurs="unbounded"> - <xs:complexType> - <xs:sequence> - <xs:element name="ASAP_Peak" maxOccurs="unbounded"> - <xs:complexType> - <xs:sequence> - <xs:element name="ASAP_Dta" maxOccurs="unbounded"> - <xs:complexType> - <xs:attribute name="peptide_index" type="xs:string" use="required"/> - <xs:attribute name="include" type="xs:string" use="required"/> - </xs:complexType> - </xs:element> - </xs:sequence> - <xs:attribute name="status" type="xs:string" use="required"/> - <xs:attribute name="include" type="xs:string" use="required"/> - <xs:attribute name="datanum" type="xs:nonNegativeInteger" use="required"/> - <xs:attribute name="ratio_mean" type="xs:double" use="required"/> - <xs:attribute name="ratio_standard_dev" type="xs:double" use="required"/> - <xs:attribute name="heavy2light_ratio_mean" type="xs:double" use="required"/> - <xs:attribute name="heavy2light_ratio_standard_dev" type="xs:double" use="required"/> - <xs:attribute name="weight" type="xs:double" use="required"/> - <xs:attribute name="peptide_binary_ind" type="xs:string" use="required"/> - </xs:complexType> - </xs:element> - </xs:sequence> - <xs:attribute name="status" type="xs:string" use="required"/> - <xs:attribute name="include" type="xs:string" use="required"/> - <xs:attribute name="datanum" type="xs:nonNegativeInteger" use="required"/> - <xs:attribute name="ratio_mean" type="xs:double" use="required"/> - <xs:attribute name="ratio_standard_dev" type="xs:double" use="required"/> - <xs:attribute name="heavy2light_ratio_mean" type="xs:double" use="required"/> - <xs:attribute name="heavy2light_ratio_standard_dev" type="xs:double" use="required"/> - <xs:attribute name="weight" type="xs:double" use="required"/> - <xs:attribute name="light_sequence" type="xs:string" use="required"/> - </xs:complexType> - </xs:element> - </xs:sequence> - <xs:attribute name="ratio_mean" type="xs:double" use="required"/> - <xs:attribute name="ratio_standard_dev" type="xs:double" use="required"/> - <xs:attribute name="ratio_number_peptides" type="xs:nonNegativeInteger" use="required"/> - <xs:attribute name="heavy2light_ratio_mean" type="xs:double"/> - <xs:attribute name="heavy2light_ratio_standard_dev" type="xs:double"/> - <xs:attribute name="description" type="xs:string"/> - <xs:attribute name="status" type="xs:string"/> - <xs:attribute name="peptide_inds" type="xs:string"/> - </xs:complexType> - </xs:element> - <xs:element name="protein_summary"> - <xs:complexType> - <xs:sequence> - <xs:element name="protein_summary_header"> - <xs:complexType> - <xs:sequence> - <xs:element name="program_details"> - <xs:complexType> - <xs:sequence> - <xs:any namespace="##any" processContents="lax" minOccurs="0"> - <xs:annotation> - <xs:documentation>Wildcard for summary info customized for a particular analysis used to infer protein identifications</xs:documentation> - </xs:annotation> - </xs:any> - </xs:sequence> - <xs:attribute name="analysis" type="xs:string" use="required"> - <xs:annotation> - <xs:documentation>Name of analysis used for protein identifications</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="time" type="xs:dateTime" use="required"> - <xs:annotation> - <xs:documentation>Time of analysis</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="version" type="xs:string"/> - </xs:complexType> - </xs:element> - </xs:sequence> - <xs:attribute name="reference_database" type="xs:string" use="required"> - <xs:annotation> - <xs:documentation>full path database name</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="win-cyg_reference_database" type="xs:string"> - <xs:annotation> - <xs:documentation>windows full path database</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="residue_substitution_list" type="xs:string"> - <xs:annotation> - <xs:documentation>residues considered equivalent when comparing peptides</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="organism" type="xs:string"> - <xs:annotation> - <xs:documentation>sample organism (used for annotation purposes)</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="source_files" type="xs:string" use="required"> - <xs:annotation> - <xs:documentation>input pepXML files</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="source_files_alt" type="xs:string" use="required"/> - <xs:attribute name="win-cyg_source_files" type="xs:string"> - <xs:annotation> - <xs:documentation>windows pepXML file names</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="source_file_xtn" type="xs:string"> - <xs:annotation> - <xs:documentation>file type (if not pepXML)</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="min_peptide_probability" type="xs:double" use="required"> - <xs:annotation> - <xs:documentation>minimum adjusted peptide probability contributing to protein probability</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="min_peptide_weight" type="xs:double" use="required"> - <xs:annotation> - <xs:documentation>minimum peptide weight contributing to protein probability</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="num_predicted_correct_prots" type="xs:double" use="required"> - <xs:annotation> - <xs:documentation>total number of predicted correct protein ids (sum of probabilities)</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="num_input_1_spectra" type="xs:integer" use="required"> - <xs:annotation> - <xs:documentation>number of spectra from 1+ precursor ions</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="num_input_2_spectra" type="xs:integer" use="required"> - <xs:annotation> - <xs:documentation>number of spectra from 2+ precursor ions</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="num_input_3_spectra" type="xs:integer" use="required"> - <xs:annotation> - <xs:documentation>number of spectra from 3+ precursor ions</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="initial_min_peptide_prob" type="xs:double" use="required"> - <xs:annotation> - <xs:documentation>minimum initial peptide probability to contribute to analysis</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="total_no_spectrum_ids" type="xs:double"> - <xs:annotation> - <xs:documentation>total estimated number of correct peptide assignments in dataset</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="sample_enzyme" type="xs:string" use="required"> - <xs:annotation> - <xs:documentation>enzyme applied to sample prior to MS/MS</xs:documentation> - </xs:annotation> - </xs:attribute> - </xs:complexType> - </xs:element> - <xs:element name="analysis_summary" minOccurs="0" maxOccurs="unbounded"> - <xs:complexType> - <xs:sequence> - <xs:any namespace="##any" processContents="lax" minOccurs="0"> - <xs:annotation> - <xs:documentation>time of analysis</xs:documentation> - </xs:annotation> - </xs:any> - </xs:sequence> - <xs:attribute name="analysis" type="xs:string" use="required"> - <xs:annotation> - <xs:documentation>name of protein-level analysis</xs:documentation> - </xs:annotation> - </xs:attribute> - - <xs:attribute name="time" type="xs:dateTime" use="required"> - <xs:annotation> - <xs:documentation>time of analysis</xs:documentation> - </xs:annotation> - </xs:attribute> - - <xs:attribute name="id" type="xs:nonNegativeInteger" use="required"> - <xs:annotation> - <xs:documentation>unique id corresponding with analysis_result elements</xs:documentation> - </xs:annotation> - </xs:attribute> - - - </xs:complexType> - </xs:element> - <xs:element name="dataset_derivation"> - <xs:annotation> - <xs:documentation>Source and filtering criteria used to generate dataset</xs:documentation> - </xs:annotation> - <xs:complexType> - <xs:sequence minOccurs="0" maxOccurs="unbounded"> - <xs:element name="data_filter"> - <xs:complexType> - <xs:attribute name="number" type="xs:string" use="required"> - <xs:annotation> - <xs:documentation>generation number (0 is root)</xs:documentation> - </xs:annotation> - </xs:attribute> - - <xs:attribute name="parent_file" type="xs:string" use="required"> - <xs:annotation> - <xs:documentation>File from which derived</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="windows_parent" type="xs:string"/> - <xs:attribute name="description" type="xs:string" use="required"> - <xs:annotation> - <xs:documentation>filtering criteria applied to data</xs:documentation> - </xs:annotation> - </xs:attribute> - </xs:complexType> - </xs:element> - </xs:sequence> - <xs:attribute name="generation_no" type="xs:string" use="required"> - <xs:annotation> - <xs:documentation>number preceding filter generations</xs:documentation> - </xs:annotation> - </xs:attribute> - </xs:complexType> - </xs:element> - <xs:element name="protein_group" maxOccurs="unbounded"> - <xs:complexType> - <xs:sequence> - <xs:element name="protein" maxOccurs="unbounded"> - <xs:complexType> - <xs:sequence> - <xs:element name="parameter" minOccurs="0" maxOccurs="unbounded"> - <xs:complexType> - <xs:simpleContent> - <xs:extension base="xs:anySimpleType"> - <xs:attribute name="name" type="xs:string" use="required"/> - <xs:attribute name="value" type="xs:anySimpleType" use="required"/> - <xs:attribute name="type" type="xs:anySimpleType"/> - </xs:extension> - </xs:simpleContent> - </xs:complexType> - </xs:element> - <xs:element name="analysis_result" minOccurs="0" maxOccurs="unbounded"> - <xs:complexType> - <xs:sequence> - <xs:any namespace="##any" processContents="lax"> - <xs:annotation> - <xs:documentation>wildcard to be substituted with element storing analysis-specific result info</xs:documentation> - </xs:annotation> - </xs:any> - - </xs:sequence> - <xs:attribute name="analysis" type="xs:string" use="required"> - <xs:annotation> - <xs:documentation>name of protein level analysis</xs:documentation> - </xs:annotation> - </xs:attribute> - - <xs:attribute name="id" type="xs:nonNegativeInteger" default="1"> - <xs:annotation> - <xs:documentation>unique identifier to analysis_summary element</xs:documentation> - </xs:annotation> - </xs:attribute> - - </xs:complexType> - </xs:element> - <xs:element name="annotation" minOccurs="0"> - <xs:complexType> - <xs:attribute name="protein_description" type="xs:string" use="required"/> - <xs:attribute name="ipi_name" type="xs:string"/> - <xs:attribute name="refseq_name" type="xs:string"/> - <xs:attribute name="swissprot_name" type="xs:string"/> - <xs:attribute name="ensembl_name" type="xs:string"/> - <xs:attribute name="trembl_name" type="xs:string"/> - <xs:attribute name="locus_link_name" type="xs:string"/> - <xs:attribute name="flybase" type="xs:string"/> - </xs:complexType> - </xs:element> - <xs:element name="indistinguishable_protein" minOccurs="0" maxOccurs="unbounded"> - <xs:annotation> - <xs:documentation>other protein sharing corresponding peptides</xs:documentation> - </xs:annotation> - <xs:complexType> - <xs:sequence> - <xs:element name="annotation" minOccurs="0"> - <xs:annotation> - <xs:documentation>protein description</xs:documentation> - </xs:annotation> - - <xs:complexType> - <xs:attribute name="protein_description" type="xs:string" use="required"> - <xs:annotation> - <xs:documentation>description</xs:documentation> - </xs:annotation> - </xs:attribute> - - <xs:attribute name="ipi_name" type="xs:string"/> - <xs:attribute name="refseq_name" type="xs:string"/> - <xs:attribute name="swissprot_name" type="xs:string"/> - <xs:attribute name="ensembl_name" type="xs:string"/> - <xs:attribute name="trembl_name" type="xs:string"/> - <xs:attribute name="locus_link_name" type="xs:string"/> - <xs:attribute name="flybase" type="xs:string"/> - </xs:complexType> - </xs:element> - </xs:sequence> - <xs:attribute name="protein_name" type="xs:string" use="required"/> - </xs:complexType> - </xs:element> - <xs:element name="peptide" maxOccurs="unbounded"> - <xs:complexType> - <xs:sequence> - <xs:element name="parameter" minOccurs="0" maxOccurs="unbounded"> - <xs:complexType> - <xs:simpleContent> - <xs:extension base="xs:anySimpleType"> - <xs:attribute name="name" type="xs:string" use="required"/> - <xs:attribute name="value" type="xs:anySimpleType" use="required"/> - <xs:attribute name="type" type="xs:anySimpleType"/> - </xs:extension> - </xs:simpleContent> - </xs:complexType> - </xs:element> - <xs:element name="modification_info" minOccurs="0" maxOccurs="unbounded"> - <xs:complexType> - <xs:sequence> - <xs:element name="mod_aminoacid_mass" minOccurs="0" maxOccurs="unbounded"> - <xs:complexType> - <xs:attribute name="position" type="xs:string" use="required"/> - <xs:attribute name="mass" type="xs:string" use="required"/> - </xs:complexType> - </xs:element> - </xs:sequence> - <xs:attribute name="mod_nterm_mass" type="xs:string"/> - <xs:attribute name="mod_cterm_mass" type="xs:string"/> - <xs:attribute name="modified_peptide" type="xs:string"/> - </xs:complexType> - </xs:element> - <xs:element name="peptide_parent_protein" minOccurs="0" maxOccurs="unbounded"> - <xs:complexType> - <xs:attribute name="protein_name" type="xs:string" use="required"/> - </xs:complexType> - </xs:element> - <xs:element name="indistinguishable_peptide" minOccurs="0" maxOccurs="unbounded"> - <xs:complexType> - <xs:sequence> - <xs:element name="modification_info" minOccurs="0" maxOccurs="unbounded"> - <xs:complexType> - <xs:sequence> - <xs:element name="mod_aminoacid_mass" minOccurs="0" maxOccurs="unbounded"> - <xs:complexType> - <xs:attribute name="position" type="xs:string" use="required"/> - <xs:attribute name="mass" type="xs:string" use="required"/> - </xs:complexType> - </xs:element> - </xs:sequence> - <xs:attribute name="mod_nterm_mass" type="xs:string"/> - <xs:attribute name="mod_cterm_mass" type="xs:string"/> - <xs:attribute name="modified_peptide" type="xs:string"/> - </xs:complexType> - </xs:element> - </xs:sequence> - <xs:attribute name="peptide_sequence" type="xs:string" use="required"/> - </xs:complexType> - </xs:element> - </xs:sequence> - <xs:attribute name="peptide_sequence" type="xs:string" use="required"> - <xs:annotation> - <xs:documentation>unmodified aa sequence</xs:documentation> - </xs:annotation> - </xs:attribute> - - <xs:attribute name="charge" type="xs:positiveInteger" use="required"> - <xs:annotation> - <xs:documentation>precursor ion charge</xs:documentation> - </xs:annotation> - </xs:attribute> - - <xs:attribute name="initial_probability" type="xs:double" use="required"> - <xs:annotation> - <xs:documentation>prior to nsp adjustment</xs:documentation> - </xs:annotation> - </xs:attribute> - - <xs:attribute name="nsp_adjusted_probability" type="xs:double" use="optional"> - <xs:annotation> - <xs:documentation>after nsp adjustment</xs:documentation> - </xs:annotation> - </xs:attribute> - - <xs:attribute name="peptide_group_designator" type="xs:string"> - <xs:annotation> - <xs:documentation>link to spectra with other precursor ion charges assigned to same peptide</xs:documentation> - </xs:annotation> - </xs:attribute> - - <xs:attribute name="weight" type="xs:double" default="1.0"/> - <xs:attribute name="is_nondegenerate_evidence" type="xs:string" use="required"> - <xs:annotation> - <xs:documentation>confidence that peptide corresponds with this protein (rather than others in which it occurs)</xs:documentation> - </xs:annotation> - </xs:attribute> - - <xs:attribute name="n_enzymatic_termini" type="xs:nonNegativeInteger" use="required"> - <xs:annotation> - <xs:documentation>number of termini consistent with proteolytic cleavage</xs:documentation> - </xs:annotation> - </xs:attribute> - - <xs:attribute name="n_sibling_peptides" type="xs:double"> - <xs:annotation> - <xs:documentation>estimated number of sibling peptides (other identified peptides corresponding to same protein)</xs:documentation> - </xs:annotation> - </xs:attribute> - - <xs:attribute name="n_sibling_peptides_bin" type="xs:integer" default="0"> - <xs:annotation> - <xs:documentation>discretized nsp value</xs:documentation> - </xs:annotation> - </xs:attribute> - - <xs:attribute name="n_instances" type="xs:integer" use="required"> - <xs:annotation> - <xs:documentation>number of times peptide assigned to spectrum of precursor ion charge in dataset</xs:documentation> - </xs:annotation> - </xs:attribute> - - <xs:attribute name="calc_neutral_pep_mass" type="xs:double"/> - <xs:attribute name="is_contributing_evidence" type="xs:string" use="required"/> - </xs:complexType> - </xs:element> - </xs:sequence> - <xs:attribute name="protein_name" type="xs:string" use="required"> - <xs:annotation> - <xs:documentation>database protein name</xs:documentation> - </xs:annotation> - </xs:attribute> - - <xs:attribute name="probability" type="xs:double" use="required"> - <xs:annotation> - <xs:documentation>confidence of protein id</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="percent_coverage" type="xs:double"> - <xs:annotation> - <xs:documentation>percent of protein sequence covered by corresponding peptides</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="n_indistinguishable_proteins" type="xs:integer" use="required"> - <xs:annotation> - <xs:documentation>number of proteins with identical corresponding peptides</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="unique_stripped_peptides" type="xs:string"/> - <xs:attribute name="group_sibling_id" type="xs:string" use="required"> - <xs:annotation> - <xs:documentation>protein group id</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="total_number_peptides" type="xs:integer"> - <xs:annotation> - <xs:documentation>total number of corresponding peptides that contributed to protein probability</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="subsuming_protein_entry" type="xs:string"> - <xs:annotation> - <xs:documentation>name of portein containing all corresponding peptides, and more</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="pct_spectrum_ids" type="xs:string"> - <xs:annotation> - <xs:documentation>fraction of correct dataset peptide identifications corresponding to protein</xs:documentation> - </xs:annotation> - </xs:attribute> - </xs:complexType> - <xs:unique name="unique_result_analysis_id"> - <xs:annotation> - <xs:documentation>can only have one analysis/id combination within each protein element</xs:documentation> - </xs:annotation> - - <xs:selector xpath="./protx:analysis_result"/> - <xs:field xpath="@analysis"/> - <xs:field xpath="@id"/> - </xs:unique> - </xs:element> - </xs:sequence> - <xs:attribute name="group_number" type="xs:string" use="required"> - <xs:annotation> - <xs:documentation>index</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="pseudo_name" type="xs:string"/> - <xs:attribute name="probability" type="xs:double" use="required"> - <xs:annotation> - <xs:documentation>group probability (taking contributions from all group member proteins)</xs:documentation> - </xs:annotation> - </xs:attribute> - </xs:complexType> - <xs:unique name="unique_group_sibling_id"> - <xs:annotation> - <xs:documentation>Each group_sibling_id must be unique within a protein group</xs:documentation> - </xs:annotation> - <xs:selector xpath="./protx:protein"/> - <xs:field xpath="@group_sibling_id"/> - </xs:unique> - - </xs:element> - </xs:sequence> - <xs:attribute name="summary_xml" type="xs:string"/> - </xs:complexType> - <xs:key name="summary_analysis_id"> - <xs:selector xpath="./protx:analysis_summary"/> - <xs:field xpath="@analysis"/> - <xs:field xpath="@id"/> - </xs:key> - <xs:keyref name="result_analysis_id" refer="summary_analysis_id"> - <xs:annotation> - <xs:documentation>analysis and id must correspond with those fields in an analysis_summary element</xs:documentation> - </xs:annotation> - <xs:selector xpath="./protx:protein_group/protx:protein/protx:analysis_result"/> - <xs:field xpath="@analysis"/> - <xs:field xpath="@id"/> - </xs:keyref> - <xs:unique name="unique_group_number"> - <xs:annotation> - <xs:documentation>Requires group numbers be unique for entire dataset</xs:documentation> - </xs:annotation> - <xs:selector xpath="./protx:protein_group"/> - <xs:field xpath="@group_number"/> - </xs:unique> - </xs:element> - <xs:element name="proteinprophet_details"> - <xs:annotation> - <xs:documentation>ProteinProphet analysis details</xs:documentation> - </xs:annotation> - <xs:complexType> - <xs:sequence> - <xs:element name="nsp_information"> - <xs:annotation> - <xs:documentation>learned distributions of estimated number of sibling peptides</xs:documentation> - </xs:annotation> - <xs:complexType> - <xs:sequence> - <xs:element name="nsp_distribution" maxOccurs="unbounded"> - <xs:annotation> - <xs:documentation>histogram slice of estimated number of sibling peptides</xs:documentation> - </xs:annotation> - <xs:complexType> - <xs:attribute name="bin_no" type="xs:integer" use="required"> - <xs:annotation> - <xs:documentation>discretized bin number</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="nsp_lower_bound_incl" type="xs:double" use="required"> - <xs:annotation> - <xs:documentation>lower bound nsp value (inclusive)</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="nsp_upper_bound_excl" type="xs:string" use="required"> - <xs:annotation> - <xs:documentation>upper bound nsp value (exclusive)</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="pos_freq" type="xs:double" use="required"> - <xs:annotation> - <xs:documentation>fraction of correct peptides in bin</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="neg_freq" type="xs:double" use="required"> - <xs:annotation> - <xs:documentation>fraction of incorrect peptides in bin</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="pos_to_neg_ratio" type="xs:double" use="required"> - <xs:annotation> - <xs:documentation>fraction of correct / fraction of incorrect</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="alt_pos_to_neg_ratio" type="xs:double"> - <xs:annotation> - <xs:documentation>pos_to_neg_ratio of preceding bin (if greater than that of current bin)</xs:documentation> - </xs:annotation> - </xs:attribute> - </xs:complexType> - </xs:element> - </xs:sequence> - <xs:attribute name="neighboring_bin_smoothing" type="xs:string" use="required"/> - </xs:complexType> - </xs:element> - <xs:element name="protein_summary_data_filter" maxOccurs="unbounded"> - <xs:annotation> - <xs:documentation>predicted error/sensitivity for filtering at minimum probability</xs:documentation> - </xs:annotation> - <xs:complexType> - <xs:attribute name="min_probability" type="xs:double" use="required"> - <xs:annotation> - <xs:documentation>filter setting</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="sensitivity" type="xs:double" use="required"> - <xs:annotation> - <xs:documentation>predicted sensitivity (fraction of correct results passing filter)</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="false_positive_error_rate" type="xs:double" use="required"> - <xs:annotation> - <xs:documentation>predicted error rate (fraction of results passing filter than are incorrect)</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="predicted_num_correct" type="xs:double"> - <xs:annotation> - <xs:documentation>predicted number of correct results passing filter</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="predicted_num_incorrect" type="xs:double"> - <xs:annotation> - <xs:documentation>predicted number of incorrect results passing filter</xs:documentation> - </xs:annotation> - </xs:attribute> - </xs:complexType> - </xs:element> - </xs:sequence> - <xs:attribute name="occam_flag" type="xs:string" use="required"> - <xs:annotation> - <xs:documentation>whether or not occams razor was used to apportion peptides corresponding to multiple proteins</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="groups_flag" type="xs:string" use="required"> - <xs:annotation> - <xs:documentation>whether or not related proteins are organized together in common protein groups</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="degen_flag" type="xs:string" use="required"> - <xs:annotation> - <xs:documentation>whether or not all proteins corresponding to each identified peptide were used in analysis</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="nsp_flag" type="xs:string" use="required"> - <xs:annotation> - <xs:documentation>whether or not peptide probabilities were adjusted for estimated number of sibling peptides</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="initial_peptide_wt_iters" type="xs:string" use="required"> - <xs:annotation> - <xs:documentation>proteinprophet number of initial iterations to compute peptide weights</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="nsp_distribution_iters" type="xs:string" use="required"> - <xs:annotation> - <xs:documentation>proteinprophet number of interations used to compute nsp distributions</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="final_peptide_wt_iters" type="xs:string" use="required"> - <xs:annotation> - <xs:documentation>proteinprophet number of final interations used to compute final peptide weights</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="run_options" type="xs:string"> - <xs:annotation> - <xs:documentation>special run options</xs:documentation> - </xs:annotation> - </xs:attribute> - </xs:complexType> - </xs:element> - <xs:element name="XPress_analysis_summary"> - <xs:complexType> - <xs:attribute name="min_peptide_probability" type="xs:double" use="required"/> - <xs:attribute name="min_peptide_weight" type="xs:double" use="required"/> - <xs:attribute name="min_protein_probability" type="xs:double" use="required"/> - <xs:attribute name="reference_isotope" type="xs:string"/> - </xs:complexType> - </xs:element> - <xs:element name="ASAP_prot_analysis_summary"> - <xs:complexType> - <xs:attribute name="version" type="xs:string"/> - <xs:attribute name="binary_ref_files" type="xs:string"/> - <xs:attribute name="min_peptide_probability" type="xs:double" use="required"/> - <xs:attribute name="min_peptide_weight" type="xs:double" use="required"/> - <xs:attribute name="min_protein_probability" type="xs:double" use="required"/> - <xs:attribute name="reference_isotope" type="xs:string"/> - </xs:complexType> - </xs:element> - <xs:element name="ASAP_pvalue_analysis_summary"> - <xs:complexType> - <xs:attribute name="asapratio_id" type="xs:nonNegativeInteger" default="1"/> - <xs:attribute name="background_ratio_mean" type="xs:double" use="required"/> - <xs:attribute name="background_ratio_stdev" type="xs:double" use="required"/> - <xs:attribute name="background_fitting_error" type="xs:double" use="required"/> - <xs:attribute name="analysis_distribution_file" type="xs:string" use="required"/> - <xs:attribute name="full_analysis_distr_file" type="xs:string"/> - <xs:attribute name="asap_prot_id" type="xs:nonNegativeInteger" default="1"/> - </xs:complexType> - </xs:element> - - - <xs:simpleType name="positiveInt"> - <xs:restriction base="xs:unsignedInt"> - <xs:minInclusive value="1"/> - </xs:restriction> - </xs:simpleType> - <xs:element name="libra_result"> - <xs:complexType> - <xs:sequence> - <xs:element name="intensity" maxOccurs="unbounded"> - <xs:complexType> - <xs:attribute name="mz" type="xs:float" use="required"/> - <xs:attribute name="ratio" type="xs:float" use="required"/> - <xs:attribute name="error" type="xs:float" use="required"/> - </xs:complexType> - </xs:element> - </xs:sequence> - <xs:attribute name="number" type="xs:nonNegativeInteger" use="required"/> - </xs:complexType> - <xs:unique name="libra_result_channel_index"> - <xs:selector xpath="."/> - <xs:field xpath="@channel"/> - </xs:unique> - - - </xs:element> - <xs:element name="libra_summary"> - <xs:complexType> - <xs:sequence> - <xs:element name="fragment_masses" maxOccurs="unbounded"> - <xs:complexType> - <xs:attribute name="channel" type="positiveInt" use="required"/> - <xs:attribute name="mz" type="xs:float" use="required"/> - </xs:complexType> - </xs:element> - <xs:element name="isotopic_contributions" minOccurs="0"> - <xs:complexType> - <xs:sequence> - <xs:element name="contributing_channel" maxOccurs="unbounded"> - <xs:complexType> - <xs:sequence> - <xs:element name="affected_channel" maxOccurs="unbounded"> - <xs:complexType> - <xs:attribute name="channel" type="positiveInt" use="required"/> - <xs:attribute name="correction" type="xs:float" use="required"/> - </xs:complexType> - </xs:element> - </xs:sequence> - <xs:attribute name="channel" type="positiveInt" use="required"/> - </xs:complexType> - </xs:element> - </xs:sequence> - </xs:complexType> - </xs:element> - </xs:sequence> - <xs:attribute name="mass_tolerance" type="xs:float" use="required"/> - <xs:attribute name="centroiding_preference" type="xs:int" use="required"/> - <xs:attribute name="normalization" type="xs:int" use="required"/> - <xs:attribute name="output_type" type="xs:int" use="required"/> - <xs:attribute name="channel_code" type="xs:string"/> - <xs:attribute name="min_pep_prob" type="xs:float" use="required"/> - <xs:attribute name="min_pep_wt" type="xs:float" use="required"/> - <xs:attribute name="min_prot_prob" type="xs:float" use="required"/> - </xs:complexType> - - <xs:key name="libra_channel_index"> - <xs:selector xpath="./protx:fragment_masses"/> - <xs:field xpath="@channel"/> - </xs:key> - <xs:keyref name="libra_contr_channel_index_ref" refer="libra_channel_index"> - <xs:selector xpath="./protx:isotopic_contributions/protx:contributing_channel"/> - <xs:field xpath="@channel"/> - </xs:keyref> - <xs:keyref name="libra_aff_channel_index_ref" refer="libra_channel_index"> - <xs:selector xpath="./protx:isotopic_contributions/protx:contributing_channel/protx:affected_channel"/> - <xs:field xpath="@channel"/> - </xs:keyref> - - </xs:element> -</xs:schema> \ No newline at end of file diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/protXML_v5.xsd b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/protXML_v5.xsd deleted file mode 100644 index 28d1a5eaaf3..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/protXML_v5.xsd +++ /dev/null @@ -1,934 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- edited with XMLSPY v2004 rel. 4 U (http://www.xmlspy.com) by Wei Yan (Institute for Systems Biology) --> -<!--W3C Schema generated by XMLSPY v2004 rel. 4 U (http://www.xmlspy.com)--> -<xs:schema targetNamespace="http://regis-web.systemsbiology.net/protXML" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://regis-web.systemsbiology.net/protXML" xmlns:protx="http://regis-web.systemsbiology.net/protXML" elementFormDefault="qualified"> - <xs:element name="ASAPRatio_pvalue"> - <xs:annotation> - <xs:documentation>Results of ASAPRatio pvalue analysis (adjusting ASAPRatio ratios for offset of dataset, and determining whether ratios are significantly different from chance values originating from 1:1 proteins)</xs:documentation> - </xs:annotation> - <xs:complexType> - <xs:attribute name="adj_ratio_mean" type="xs:double" use="required"> - <xs:annotation> - <xs:documentation>Ratio adjusted for dataset mean value</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="adj_ratio_standard_dev" type="xs:double" use="required"> - <xs:annotation> - <xs:documentation>Error adjusted for dataset mean value</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="heavy2light_adj_ratio_mean" type="xs:double"> - <xs:annotation> - <xs:documentation>Heavy2light ratio adjusted for dataset mean value</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="heavy2light_adj_ratio_standard_dev" type="xs:double"> - <xs:annotation> - <xs:documentation>Heavy2light error adjusted for dataset mean value</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="pvalue" type="xs:double"> - <xs:annotation> - <xs:documentation>pvalue (probability of ratio due by chance to 1:1 protein)</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="decimal_pvalue" type="xs:double"> - <xs:annotation> - <xs:documentation>decimal representation of pvalue</xs:documentation> - </xs:annotation> - </xs:attribute> - </xs:complexType> - </xs:element> - <xs:element name="ASAPRatio"> - <xs:annotation> - <xs:documentation>Results of ASAPRatio quantitation of protein</xs:documentation> - </xs:annotation> - <xs:complexType> - <xs:sequence> - <xs:element name="ASAP_Seq" minOccurs="0" maxOccurs="unbounded"> - <xs:complexType> - <xs:sequence> - <xs:element name="ASAP_Peak" maxOccurs="unbounded"> - <xs:complexType> - <xs:sequence> - <xs:element name="ASAP_Dta" maxOccurs="unbounded"> - <xs:complexType> - <xs:attribute name="peptide_index" type="xs:string" use="required"/> - <xs:attribute name="include" type="xs:string" use="required"/> - </xs:complexType> - </xs:element> - </xs:sequence> - <xs:attribute name="status" type="xs:string" use="required"/> - <xs:attribute name="include" type="xs:string" use="required"/> - <xs:attribute name="datanum" type="xs:nonNegativeInteger" use="required"/> - <xs:attribute name="ratio_mean" type="xs:double" use="required"/> - <xs:attribute name="ratio_standard_dev" type="xs:double" use="required"/> - <xs:attribute name="heavy2light_ratio_mean" type="xs:double" use="required"/> - <xs:attribute name="heavy2light_ratio_standard_dev" type="xs:double" use="required"/> - <xs:attribute name="weight" type="xs:double" use="required"/> - <xs:attribute name="peptide_binary_ind" type="xs:string" use="required"/> - </xs:complexType> - </xs:element> - </xs:sequence> - <xs:attribute name="status" type="xs:string" use="required"/> - <xs:attribute name="include" type="xs:string" use="required"/> - <xs:attribute name="datanum" type="xs:nonNegativeInteger" use="required"/> - <xs:attribute name="ratio_mean" type="xs:double" use="required"/> - <xs:attribute name="ratio_standard_dev" type="xs:double" use="required"/> - <xs:attribute name="heavy2light_ratio_mean" type="xs:double" use="required"/> - <xs:attribute name="heavy2light_ratio_standard_dev" type="xs:double" use="required"/> - <xs:attribute name="weight" type="xs:double" use="required"/> - <xs:attribute name="light_sequence" type="xs:string" use="required"/> - </xs:complexType> - </xs:element> - </xs:sequence> - <xs:attribute name="ratio_mean" type="xs:double" use="required"/> - <xs:attribute name="ratio_standard_dev" type="xs:double" use="required"/> - <xs:attribute name="ratio_number_peptides" type="xs:nonNegativeInteger" use="required"/> - <xs:attribute name="heavy2light_ratio_mean" type="xs:double"/> - <xs:attribute name="heavy2light_ratio_standard_dev" type="xs:double"/> - <xs:attribute name="description" type="xs:string"/> - <xs:attribute name="status" type="xs:string"/> - <xs:attribute name="peptide_inds" type="xs:string"/> - </xs:complexType> - </xs:element> - <xs:element name="protein_summary"> - <xs:complexType> - <xs:sequence> - <xs:element name="protein_summary_header"> - <xs:complexType> - <xs:sequence> - <xs:element name="program_details"> - <xs:complexType> - <xs:sequence> - <xs:any namespace="##any" processContents="lax" minOccurs="0"> - <xs:annotation> - <xs:documentation>Wildcard for summary info customized for a particular analysis used to infer protein identifications</xs:documentation> - </xs:annotation> - </xs:any> - </xs:sequence> - <xs:attribute name="analysis" type="xs:string" use="required"> - <xs:annotation> - <xs:documentation>Name of analysis used for protein identifications</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="time" type="xs:dateTime" use="required"> - <xs:annotation> - <xs:documentation>Time of analysis</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="version" type="xs:string"/> - </xs:complexType> - </xs:element> - </xs:sequence> - <xs:attribute name="reference_database" type="xs:string" use="required"> - <xs:annotation> - <xs:documentation>full path database name</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="win-cyg_reference_database" type="xs:string"> - <xs:annotation> - <xs:documentation>windows full path database</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="residue_substitution_list" type="xs:string"> - <xs:annotation> - <xs:documentation>residues considered equivalent when comparing peptides</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="organism" type="xs:string"> - <xs:annotation> - <xs:documentation>sample organism (used for annotation purposes)</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="source_files" type="xs:string" use="required"> - <xs:annotation> - <xs:documentation>input pepXML files</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="source_files_alt" type="xs:string" use="required"/> - <xs:attribute name="win-cyg_source_files" type="xs:string"> - <xs:annotation> - <xs:documentation>windows pepXML file names</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="source_file_xtn" type="xs:string"> - <xs:annotation> - <xs:documentation>file type (if not pepXML)</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="min_peptide_probability" type="xs:double" use="required"> - <xs:annotation> - <xs:documentation>minimum adjusted peptide probability contributing to protein probability</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="min_peptide_weight" type="xs:double" use="required"> - <xs:annotation> - <xs:documentation>minimum peptide weight contributing to protein probability</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="num_predicted_correct_prots" type="xs:double" use="required"> - <xs:annotation> - <xs:documentation>total number of predicted correct protein ids (sum of probabilities)</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="num_input_1_spectra" type="xs:integer" use="required"> - <xs:annotation> - <xs:documentation>number of spectra from 1+ precursor ions</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="num_input_2_spectra" type="xs:integer" use="required"> - <xs:annotation> - <xs:documentation>number of spectra from 2+ precursor ions</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="num_input_3_spectra" type="xs:integer" use="required"> - <xs:annotation> - <xs:documentation>number of spectra from 3+ precursor ions</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="num_input_4_spectra" type="xs:integer" use="required"> - <xs:annotation> - <xs:documentation>number of spectra from 4+ precursor ions</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="num_input_5_spectra" type="xs:integer" use="required"> - <xs:annotation> - <xs:documentation>number of spectra from 5+ precursor ions</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="initial_min_peptide_prob" type="xs:double" use="required"> - <xs:annotation> - <xs:documentation>minimum initial peptide probability to contribute to analysis</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="total_no_spectrum_ids" type="xs:double"> - <xs:annotation> - <xs:documentation>total estimated number of correct peptide assignments in dataset</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="sample_enzyme" type="xs:string" use="required"> - <xs:annotation> - <xs:documentation>enzyme applied to sample prior to MS/MS</xs:documentation> - </xs:annotation> - </xs:attribute> - </xs:complexType> - </xs:element> - <xs:element name="analysis_summary" minOccurs="0" maxOccurs="unbounded"> - <xs:complexType> - <xs:sequence> - <xs:any namespace="##any" processContents="lax" minOccurs="0"> - <xs:annotation> - <xs:documentation>time of analysis</xs:documentation> - </xs:annotation> - </xs:any> - </xs:sequence> - <xs:attribute name="analysis" type="xs:string" use="required"> - <xs:annotation> - <xs:documentation>name of protein-level analysis</xs:documentation> - </xs:annotation> - </xs:attribute> - - <xs:attribute name="time" type="xs:dateTime" use="required"> - <xs:annotation> - <xs:documentation>time of analysis</xs:documentation> - </xs:annotation> - </xs:attribute> - - <xs:attribute name="id" type="xs:nonNegativeInteger" use="required"> - <xs:annotation> - <xs:documentation>unique id corresponding with analysis_result elements</xs:documentation> - </xs:annotation> - </xs:attribute> - - - </xs:complexType> - </xs:element> - <xs:element name="dataset_derivation"> - <xs:annotation> - <xs:documentation>Source and filtering criteria used to generate dataset</xs:documentation> - </xs:annotation> - <xs:complexType> - <xs:sequence minOccurs="0" maxOccurs="unbounded"> - <xs:element name="data_filter"> - <xs:complexType> - <xs:attribute name="number" type="xs:string" use="required"> - <xs:annotation> - <xs:documentation>generation number (0 is root)</xs:documentation> - </xs:annotation> - </xs:attribute> - - <xs:attribute name="parent_file" type="xs:string" use="required"> - <xs:annotation> - <xs:documentation>File from which derived</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="windows_parent" type="xs:string"/> - <xs:attribute name="description" type="xs:string" use="required"> - <xs:annotation> - <xs:documentation>filtering criteria applied to data</xs:documentation> - </xs:annotation> - </xs:attribute> - </xs:complexType> - </xs:element> - </xs:sequence> - <xs:attribute name="generation_no" type="xs:string" use="required"> - <xs:annotation> - <xs:documentation>number preceding filter generations</xs:documentation> - </xs:annotation> - </xs:attribute> - </xs:complexType> - </xs:element> - <xs:element name="protein_group" maxOccurs="unbounded"> - <xs:complexType> - <xs:sequence> - <xs:element name="protein" maxOccurs="unbounded"> - <xs:complexType> - <xs:sequence> - <!-- note: nameValueType defined below --> - <xs:element name="parameter" type="nameValueType" minOccurs="0" maxOccurs="unbounded"/> - <xs:element name="analysis_result" minOccurs="0" maxOccurs="unbounded"> - <xs:complexType> - <xs:sequence> - <xs:any namespace="##any" processContents="lax"> - <xs:annotation> - <xs:documentation>wildcard to be substituted with element storing analysis-specific result info</xs:documentation> - </xs:annotation> - </xs:any> - - </xs:sequence> - <xs:attribute name="analysis" type="xs:string" use="required"> - <xs:annotation> - <xs:documentation>name of protein level analysis</xs:documentation> - </xs:annotation> - </xs:attribute> - - <xs:attribute name="id" type="xs:nonNegativeInteger" default="1"> - <xs:annotation> - <xs:documentation>unique identifier to analysis_summary element</xs:documentation> - </xs:annotation> - </xs:attribute> - - </xs:complexType> - </xs:element> - <xs:element name="annotation" minOccurs="0"> - <xs:complexType> - <xs:attribute name="protein_description" type="xs:string" use="required"/> - <xs:attribute name="ipi_name" type="xs:string"/> - <xs:attribute name="refseq_name" type="xs:string"/> - <xs:attribute name="swissprot_name" type="xs:string"/> - <xs:attribute name="ensembl_name" type="xs:string"/> - <xs:attribute name="trembl_name" type="xs:string"/> - <xs:attribute name="locus_link_name" type="xs:string"/> - <xs:attribute name="flybase" type="xs:string"/> - </xs:complexType> - </xs:element> - <xs:element name="indistinguishable_protein" minOccurs="0" maxOccurs="unbounded"> - <xs:annotation> - <xs:documentation>other protein sharing corresponding peptides</xs:documentation> - </xs:annotation> - <xs:complexType> - <xs:sequence> - <!-- note: nameValueType defined below --> - <xs:element name="parameter" type="nameValueType" minOccurs="0" maxOccurs="unbounded"/> - <xs:element name="annotation" minOccurs="0"> - <xs:annotation> - <xs:documentation>protein description</xs:documentation> - </xs:annotation> - - <xs:complexType> - <xs:attribute name="protein_description" type="xs:string" use="required"> - <xs:annotation> - <xs:documentation>description</xs:documentation> - </xs:annotation> - </xs:attribute> - - <xs:attribute name="ipi_name" type="xs:string"/> - <xs:attribute name="refseq_name" type="xs:string"/> - <xs:attribute name="swissprot_name" type="xs:string"/> - <xs:attribute name="ensembl_name" type="xs:string"/> - <xs:attribute name="trembl_name" type="xs:string"/> - <xs:attribute name="locus_link_name" type="xs:string"/> - <xs:attribute name="flybase" type="xs:string"/> - </xs:complexType> - </xs:element> - </xs:sequence> - <xs:attribute name="protein_name" type="xs:string" use="required"/> - </xs:complexType> - </xs:element> - <xs:element name="peptide" maxOccurs="unbounded"> - <xs:complexType> - <xs:sequence> - <xs:element name="parameter" minOccurs="0" maxOccurs="unbounded"> - <xs:complexType> - <xs:simpleContent> - <xs:extension base="xs:anySimpleType"> - <xs:attribute name="name" type="xs:string" use="required"/> - <xs:attribute name="value" type="xs:anySimpleType" use="required"/> - <xs:attribute name="type" type="xs:anySimpleType"/> - </xs:extension> - </xs:simpleContent> - </xs:complexType> - </xs:element> - <xs:element name="modification_info" minOccurs="0" maxOccurs="unbounded"> - <xs:complexType> - <xs:sequence> - <xs:element name="mod_aminoacid_mass" minOccurs="0" maxOccurs="unbounded"> - <xs:complexType> - <xs:attribute name="position" type="xs:string" use="required"/> - <xs:attribute name="mass" type="xs:string" use="required"/> - </xs:complexType> - </xs:element> - </xs:sequence> - <xs:attribute name="mod_nterm_mass" type="xs:string"/> - <xs:attribute name="mod_cterm_mass" type="xs:string"/> - <xs:attribute name="modified_peptide" type="xs:string"/> - </xs:complexType> - </xs:element> - <xs:element name="peptide_parent_protein" minOccurs="0" maxOccurs="unbounded"> - <xs:complexType> - <xs:attribute name="protein_name" type="xs:string" use="required"/> - </xs:complexType> - </xs:element> - <xs:element name="indistinguishable_peptide" minOccurs="0" maxOccurs="unbounded"> - <xs:complexType> - <xs:sequence> - <xs:element name="modification_info" minOccurs="0" maxOccurs="unbounded"> - <xs:complexType> - <xs:sequence> - <xs:element name="mod_aminoacid_mass" minOccurs="0" maxOccurs="unbounded"> - <xs:complexType> - <xs:attribute name="position" type="xs:string" use="required"/> - <xs:attribute name="mass" type="xs:string" use="required"/> - </xs:complexType> - </xs:element> - </xs:sequence> - <xs:attribute name="mod_nterm_mass" type="xs:string"/> - <xs:attribute name="mod_cterm_mass" type="xs:string"/> - <xs:attribute name="modified_peptide" type="xs:string"/> - </xs:complexType> - </xs:element> - </xs:sequence> - <xs:attribute name="peptide_sequence" type="xs:string" use="required"/> - </xs:complexType> - </xs:element> - </xs:sequence> - <xs:attribute name="peptide_sequence" type="xs:string" use="required"> - <xs:annotation> - <xs:documentation>unmodified aa sequence</xs:documentation> - </xs:annotation> - </xs:attribute> - - <xs:attribute name="charge" type="xs:positiveInteger" use="required"> - <xs:annotation> - <xs:documentation>precursor ion charge</xs:documentation> - </xs:annotation> - </xs:attribute> - - <xs:attribute name="initial_probability" type="xs:double" use="required"> - <xs:annotation> - <xs:documentation>prior to nsp adjustment</xs:documentation> - </xs:annotation> - </xs:attribute> - - <xs:attribute name="nsp_adjusted_probability" type="xs:double" use="optional"> - <xs:annotation> - <xs:documentation>after nsp adjustment</xs:documentation> - </xs:annotation> - </xs:attribute> - - <xs:attribute name="ni_adjusted_probability" type="xs:double" use="optional"> - <xs:annotation> - <xs:documentation>after ni adjustment</xs:documentation> - </xs:annotation> - </xs:attribute> - - <xs:attribute name="exp_sibling_ion_instances" type="xs:double" use="optional"> - <xs:annotation> - <xs:documentation>expected sibling ion instances</xs:documentation> - </xs:annotation> - </xs:attribute> - - <xs:attribute name="exp_sibling_ion_bin" type="xs:double" use="optional"> - <xs:annotation> - <xs:documentation>expected sibling ion bin</xs:documentation> - </xs:annotation> - </xs:attribute> - - <xs:attribute name="exp_tot_instances" type="xs:double" use="optional"> - <xs:annotation> - <xs:documentation>expected total instances</xs:documentation> - </xs:annotation> - </xs:attribute> - - <xs:attribute name="peptide_group_designator" type="xs:string"> - <xs:annotation> - <xs:documentation>link to spectra with other precursor ion charges assigned to same peptide</xs:documentation> - </xs:annotation> - </xs:attribute> - - <xs:attribute name="weight" type="xs:double" default="1.0"/> - <xs:attribute name="is_nondegenerate_evidence" type="xs:string" use="required"> - <xs:annotation> - <xs:documentation>confidence that peptide corresponds with this protein (rather than others in which it occurs)</xs:documentation> - </xs:annotation> - </xs:attribute> - - <xs:attribute name="n_enzymatic_termini" type="xs:nonNegativeInteger" use="required"> - <xs:annotation> - <xs:documentation>number of termini consistent with proteolytic cleavage</xs:documentation> - </xs:annotation> - </xs:attribute> - - <xs:attribute name="n_sibling_peptides" type="xs:double"> - <xs:annotation> - <xs:documentation>estimated number of sibling peptides (other identified peptides corresponding to same protein)</xs:documentation> - </xs:annotation> - </xs:attribute> - - <xs:attribute name="n_sibling_peptides_bin" type="xs:integer" default="0"> - <xs:annotation> - <xs:documentation>discretized nsp value</xs:documentation> - </xs:annotation> - </xs:attribute> - - <xs:attribute name="n_instances" type="xs:integer" use="required"> - <xs:annotation> - <xs:documentation>number of times peptide assigned to spectrum of precursor ion charge in dataset</xs:documentation> - </xs:annotation> - </xs:attribute> - - <xs:attribute name="calc_neutral_pep_mass" type="xs:double"/> - <xs:attribute name="is_contributing_evidence" type="xs:string" use="required"/> - </xs:complexType> - </xs:element> - </xs:sequence> - <xs:attribute name="protein_name" type="xs:string" use="required"> - <xs:annotation> - <xs:documentation>database protein name</xs:documentation> - </xs:annotation> - </xs:attribute> - - <xs:attribute name="probability" type="xs:double" use="required"> - <xs:annotation> - <xs:documentation>confidence of protein id</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="percent_coverage" type="xs:double"> - <xs:annotation> - <xs:documentation>percent of protein sequence covered by corresponding peptides</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="n_indistinguishable_proteins" type="xs:integer" use="required"> - <xs:annotation> - <xs:documentation>number of proteins with identical corresponding peptides</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="unique_stripped_peptides" type="xs:string"/> - <xs:attribute name="group_sibling_id" type="xs:string" use="required"> - <xs:annotation> - <xs:documentation>protein group id</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="total_number_peptides" type="xs:integer"> - <xs:annotation> - <xs:documentation>total number of corresponding peptides that contributed to protein probability</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="subsuming_protein_entry" type="xs:string"> - <xs:annotation> - <xs:documentation>name of portein containing all corresponding peptides, and more</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="pct_spectrum_ids" type="xs:string"> - <xs:annotation> - <xs:documentation>fraction of correct dataset peptide identifications corresponding to protein</xs:documentation> - </xs:annotation> - </xs:attribute> - </xs:complexType> - <xs:unique name="unique_result_analysis_id"> - <xs:annotation> - <xs:documentation>can only have one analysis/id combination within each protein element</xs:documentation> - </xs:annotation> - - <xs:selector xpath="./protx:analysis_result"/> - <xs:field xpath="@analysis"/> - <xs:field xpath="@id"/> - </xs:unique> - </xs:element> - </xs:sequence> - <xs:attribute name="group_number" type="xs:string" use="required"> - <xs:annotation> - <xs:documentation>index</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="pseudo_name" type="xs:string"/> - <xs:attribute name="probability" type="xs:double" use="required"> - <xs:annotation> - <xs:documentation>group probability (taking contributions from all group member proteins)</xs:documentation> - </xs:annotation> - </xs:attribute> - </xs:complexType> - <xs:unique name="unique_group_sibling_id"> - <xs:annotation> - <xs:documentation>Each group_sibling_id must be unique within a protein group</xs:documentation> - </xs:annotation> - <xs:selector xpath="./protx:protein"/> - <xs:field xpath="@group_sibling_id"/> - </xs:unique> - - </xs:element> - </xs:sequence> - <xs:attribute name="summary_xml" type="xs:string"/> - </xs:complexType> - <xs:key name="summary_analysis_id"> - <xs:selector xpath="./protx:analysis_summary"/> - <xs:field xpath="@analysis"/> - <xs:field xpath="@id"/> - </xs:key> - <xs:keyref name="result_analysis_id" refer="summary_analysis_id"> - <xs:annotation> - <xs:documentation>analysis and id must correspond with those fields in an analysis_summary element</xs:documentation> - </xs:annotation> - <xs:selector xpath="./protx:protein_group/protx:protein/protx:analysis_result"/> - <xs:field xpath="@analysis"/> - <xs:field xpath="@id"/> - </xs:keyref> - <xs:unique name="unique_group_number"> - <xs:annotation> - <xs:documentation>Requires group numbers be unique for entire dataset</xs:documentation> - </xs:annotation> - <xs:selector xpath="./protx:protein_group"/> - <xs:field xpath="@group_number"/> - </xs:unique> - </xs:element> - <xs:element name="proteinprophet_details"> - <xs:annotation> - <xs:documentation>ProteinProphet analysis details</xs:documentation> - </xs:annotation> - <xs:complexType> - <xs:sequence> - <xs:element name="nsp_information"> - <xs:annotation> - <xs:documentation>learned distributions of estimated number of sibling peptides</xs:documentation> - </xs:annotation> - <xs:complexType> - <xs:sequence> - <xs:element name="nsp_distribution" maxOccurs="unbounded"> - <xs:annotation> - <xs:documentation>histogram slice of estimated number of sibling peptides</xs:documentation> - </xs:annotation> - <xs:complexType> - <xs:attribute name="bin_no" type="xs:integer" use="required"> - <xs:annotation> - <xs:documentation>discretized bin number</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="nsp_lower_bound_incl" type="xs:double" use="optional"> - <xs:annotation> - <xs:documentation>lower bound nsp value (inclusive)</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="nsp_upper_bound_excl" type="xs:string" use="optional"> - <xs:annotation> - <xs:documentation>upper bound nsp value (exclusive)</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="nsp_lower_bound_excl" type="xs:double" use="optional"> - <xs:annotation> - <xs:documentation>lower bound nsp value (exclusive)</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="nsp_upper_bound_incl" type="xs:string" use="optional"> - <xs:annotation> - <xs:documentation>upper bound nsp value (inclusive)</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="pos_freq" type="xs:double" use="required"> - <xs:annotation> - <xs:documentation>fraction of correct peptides in bin</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="neg_freq" type="xs:double" use="required"> - <xs:annotation> - <xs:documentation>fraction of incorrect peptides in bin</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="pos_to_neg_ratio" type="xs:double" use="required"> - <xs:annotation> - <xs:documentation>fraction of correct / fraction of incorrect</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="alt_pos_to_neg_ratio" type="xs:double"> - <xs:annotation> - <xs:documentation>pos_to_neg_ratio of preceding bin (if greater than that of current bin)</xs:documentation> - </xs:annotation> - </xs:attribute> - </xs:complexType> - </xs:element> - </xs:sequence> - <xs:attribute name="neighboring_bin_smoothing" type="xs:string" use="required"/> - </xs:complexType> - </xs:element> - <xs:element name="ni_information"> - <xs:annotation> - <xs:documentation>learned distributions of estimated number of peptide instances ("number of instances")</xs:documentation> - </xs:annotation> - <xs:complexType> - <xs:sequence> - <xs:element name="ni_distribution" maxOccurs="unbounded"> - <xs:annotation> - <xs:documentation>histogram slice of estimated number of sibling peptides</xs:documentation> - </xs:annotation> - <xs:complexType> - <xs:attribute name="bin_no" type="xs:integer" use="required"> - <xs:annotation> - <xs:documentation>discretized bin number</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="ni_lower_bound_incl" type="xs:double" use="optional"> - <xs:annotation> - <xs:documentation>lower bound nsp value (inclusive)</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="ni_upper_bound_excl" type="xs:string" use="optional"> - <xs:annotation> - <xs:documentation>upper bound nsp value (exclusive)</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="ni_lower_bound_excl" type="xs:double" use="optional"> - <xs:annotation> - <xs:documentation>lower bound nsp value (exclusive)</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="ni_upper_bound_incl" type="xs:string" use="optional"> - <xs:annotation> - <xs:documentation>upper bound nsp value (inclusive)</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="pos_freq" type="xs:double" use="required"> - <xs:annotation> - <xs:documentation>fraction of correct peptides in bin</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="neg_freq" type="xs:double" use="required"> - <xs:annotation> - <xs:documentation>fraction of incorrect peptides in bin</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="pos_to_neg_ratio" type="xs:double" use="required"> - <xs:annotation> - <xs:documentation>fraction of correct / fraction of incorrect</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="alt_pos_to_neg_ratio" type="xs:double"> - <xs:annotation> - <xs:documentation>pos_to_neg_ratio of preceding bin (if greater than that of current bin)</xs:documentation> - </xs:annotation> - </xs:attribute> - </xs:complexType> - </xs:element> - </xs:sequence> - <!-- - <xs:attribute name="neighboring_bin_smoothing" type="xs:string" use="required"/> - --> - </xs:complexType> - </xs:element> - <xs:element name="protein_summary_data_filter" maxOccurs="unbounded"> - <xs:annotation> - <xs:documentation>predicted error/sensitivity for filtering at minimum probability</xs:documentation> - </xs:annotation> - <xs:complexType> - <xs:attribute name="min_probability" type="xs:double" use="required"> - <xs:annotation> - <xs:documentation>filter setting</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="sensitivity" type="xs:double" use="required"> - <xs:annotation> - <xs:documentation>predicted sensitivity (fraction of correct results passing filter)</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="false_positive_error_rate" type="xs:double" use="required"> - <xs:annotation> - <xs:documentation>predicted error rate (fraction of results passing filter than are incorrect)</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="predicted_num_correct" type="xs:double"> - <xs:annotation> - <xs:documentation>predicted number of correct results passing filter</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="predicted_num_incorrect" type="xs:double"> - <xs:annotation> - <xs:documentation>predicted number of incorrect results passing filter</xs:documentation> - </xs:annotation> - </xs:attribute> - </xs:complexType> - </xs:element> - </xs:sequence> - <xs:attribute name="occam_flag" type="xs:string" use="required"> - <xs:annotation> - <xs:documentation>whether or not occams razor was used to apportion peptides corresponding to multiple proteins</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="groups_flag" type="xs:string" use="required"> - <xs:annotation> - <xs:documentation>whether or not related proteins are organized together in common protein groups</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="degen_flag" type="xs:string" use="required"> - <xs:annotation> - <xs:documentation>whether or not all proteins corresponding to each identified peptide were used in analysis</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="nsp_flag" type="xs:string" use="required"> - <xs:annotation> - <xs:documentation>whether or not peptide probabilities were adjusted for estimated number of sibling peptides</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="initial_peptide_wt_iters" type="xs:string" use="required"> - <xs:annotation> - <xs:documentation>proteinprophet number of initial iterations to compute peptide weights</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="nsp_distribution_iters" type="xs:string" use="required"> - <xs:annotation> - <xs:documentation>proteinprophet number of interations used to compute nsp distributions</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="final_peptide_wt_iters" type="xs:string" use="required"> - <xs:annotation> - <xs:documentation>proteinprophet number of final interations used to compute final peptide weights</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="run_options" type="xs:string"> - <xs:annotation> - <xs:documentation>special run options</xs:documentation> - </xs:annotation> - </xs:attribute> - </xs:complexType> - </xs:element> - <xs:element name="XPress_analysis_summary"> - <xs:complexType> - <xs:attribute name="min_peptide_probability" type="xs:double" use="required"/> - <xs:attribute name="min_peptide_weight" type="xs:double" use="required"/> - <xs:attribute name="min_protein_probability" type="xs:double" use="required"/> - <xs:attribute name="reference_isotope" type="xs:string"/> - </xs:complexType> - </xs:element> - <xs:element name="ASAP_prot_analysis_summary"> - <xs:complexType> - <xs:attribute name="version" type="xs:string"/> - <xs:attribute name="binary_ref_files" type="xs:string"/> - <xs:attribute name="min_peptide_probability" type="xs:double" use="required"/> - <xs:attribute name="min_peptide_weight" type="xs:double" use="required"/> - <xs:attribute name="min_protein_probability" type="xs:double" use="required"/> - <xs:attribute name="reference_isotope" type="xs:string"/> - </xs:complexType> - </xs:element> - <xs:element name="ASAP_pvalue_analysis_summary"> - <xs:complexType> - <xs:attribute name="asapratio_id" type="xs:nonNegativeInteger" default="1"/> - <xs:attribute name="background_ratio_mean" type="xs:double" use="required"/> - <xs:attribute name="background_ratio_stdev" type="xs:double" use="required"/> - <xs:attribute name="background_fitting_error" type="xs:double" use="required"/> - <xs:attribute name="analysis_distribution_file" type="xs:string" use="required"/> - <xs:attribute name="full_analysis_distr_file" type="xs:string"/> - <xs:attribute name="asap_prot_id" type="xs:nonNegativeInteger" default="1"/> - </xs:complexType> - </xs:element> - - - <xs:simpleType name="positiveInt"> - <xs:restriction base="xs:unsignedInt"> - <xs:minInclusive value="1"/> - </xs:restriction> - </xs:simpleType> - <xs:element name="libra_result"> - <xs:complexType> - <xs:sequence> - <xs:element name="intensity" maxOccurs="unbounded"> - <xs:complexType> - <xs:attribute name="mz" type="xs:float" use="required"/> - <xs:attribute name="ratio" type="xs:float" use="required"/> - <xs:attribute name="error" type="xs:float" use="required"/> - </xs:complexType> - </xs:element> - </xs:sequence> - <xs:attribute name="number" type="xs:nonNegativeInteger" use="required"/> - </xs:complexType> - <xs:unique name="libra_result_channel_index"> - <xs:selector xpath="."/> - <xs:field xpath="@channel"/> - </xs:unique> - - - </xs:element> - <xs:element name="libra_summary"> - <xs:complexType> - <xs:sequence> - <xs:element name="fragment_masses" maxOccurs="unbounded"> - <xs:complexType> - <xs:attribute name="channel" type="positiveInt" use="required"/> - <xs:attribute name="mz" type="xs:float" use="required"/> - </xs:complexType> - </xs:element> - <xs:element name="isotopic_contributions" minOccurs="0"> - <xs:complexType> - <xs:sequence> - <xs:element name="contributing_channel" maxOccurs="unbounded"> - <xs:complexType> - <xs:sequence> - <xs:element name="affected_channel" maxOccurs="unbounded"> - <xs:complexType> - <xs:attribute name="channel" type="positiveInt" use="required"/> - <xs:attribute name="correction" type="xs:float" use="required"/> - </xs:complexType> - </xs:element> - </xs:sequence> - <xs:attribute name="channel" type="positiveInt" use="required"/> - </xs:complexType> - </xs:element> - </xs:sequence> - </xs:complexType> - </xs:element> - </xs:sequence> - <xs:attribute name="mass_tolerance" type="xs:float" use="required"/> - <xs:attribute name="centroiding_preference" type="xs:int" use="required"/> - <xs:attribute name="normalization" type="xs:int" use="required"/> - <xs:attribute name="output_type" type="xs:int" use="required"/> - <xs:attribute name="channel_code" type="xs:string"/> - <xs:attribute name="min_pep_prob" type="xs:float" use="required"/> - <xs:attribute name="min_pep_wt" type="xs:float" use="required"/> - <xs:attribute name="min_prot_prob" type="xs:float" use="required"/> - </xs:complexType> - - <xs:key name="libra_channel_index"> - <xs:selector xpath="./protx:fragment_masses"/> - <xs:field xpath="@channel"/> - </xs:key> - <xs:keyref name="libra_contr_channel_index_ref" refer="libra_channel_index"> - <xs:selector xpath="./protx:isotopic_contributions/protx:contributing_channel"/> - <xs:field xpath="@channel"/> - </xs:keyref> - <xs:keyref name="libra_aff_channel_index_ref" refer="libra_channel_index"> - <xs:selector xpath="./protx:isotopic_contributions/protx:contributing_channel/protx:affected_channel"/> - <xs:field xpath="@channel"/> - </xs:keyref> - - </xs:element> - - <!-- a loosely-defined, general-purpose type used in the "parameter" element, defined above --> - <xs:complexType name="nameValueType"> - <xs:simpleContent> - <xs:extension base="xs:anySimpleType"> - <xs:attribute name="name" type="xs:string" use="required"/> - <xs:attribute name="value" type="xs:anySimpleType" use="required"/> - <xs:attribute name="type" type="xs:anySimpleType"/> - </xs:extension> - </xs:simpleContent> - </xs:complexType> - - -</xs:schema> \ No newline at end of file diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/BuildAndEnvironmentInfo.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/BuildAndEnvironmentInfo.java deleted file mode 100644 index 816e57b8fd7..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/BuildAndEnvironmentInfo.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics; - -import ch.systemsx.cisd.base.utilities.AbstractBuildAndEnvironmentInfo; - -/** - * The build and environment information for PhosphoNetX. - * - * @author Franz-Josef Elmer - */ -public class BuildAndEnvironmentInfo extends AbstractBuildAndEnvironmentInfo -{ - private final static String BASE = "rtd_phosphonetx"; - - public final static BuildAndEnvironmentInfo INSTANCE = new BuildAndEnvironmentInfo(); - - private BuildAndEnvironmentInfo() - { - super(BASE); - } - - /** - * Shows build and environment information on the console. - */ - public static void main(String[] args) - { - System.out.println(INSTANCE); - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/OpenBIS.gwt.xml b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/OpenBIS.gwt.xml deleted file mode 100644 index 338a32080d0..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/OpenBIS.gwt.xml +++ /dev/null @@ -1,14 +0,0 @@ -<module> - <inherits name='ch.systemsx.cisd.openbis.OpenBIS-without-entry-point'/> - - <!-- - // Application entry point - --> - <entry-point class='ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.application.PhosphoNetXClient' /> - - <script src="proteomics-dictionary.js"/> - <public path="client/web/public"/> - <source path="client/web/client"/> - <source path="shared/basic" /> - -</module> \ No newline at end of file diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/OpenBISFirefox.gwt.xml b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/OpenBISFirefox.gwt.xml deleted file mode 100644 index 28984f69c44..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/OpenBISFirefox.gwt.xml +++ /dev/null @@ -1,13 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit 1.7.1//EN" "http://google-web-toolkit.googlecode.com/svn/tags/1.7.1/distro-source/core/src/gwt-module.dtd"> -<module rename-to="ch.systemsx.cisd.openbis.plugin.proteomics.OpenBIS"> - <inherits name='ch.systemsx.cisd.openbis.OpenBIS-without-entry-point' /> - <set-property name="user.agent" value="gecko1_8" /> - - <entry-point class='ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.application.PhosphoNetXClient' /> - - <script src="proteomics-dictionary.js" /> - <public path="client/web/public" /> - <source path="client/web/client" /> - <source path="shared/basic" /> -</module> diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/OpenBISSafari.gwt.xml b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/OpenBISSafari.gwt.xml deleted file mode 100644 index 4f39114f92a..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/OpenBISSafari.gwt.xml +++ /dev/null @@ -1,13 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit 1.7.1//EN" "http://google-web-toolkit.googlecode.com/svn/tags/1.7.1/distro-source/core/src/gwt-module.dtd"> -<module rename-to="ch.systemsx.cisd.openbis.plugin.proteomics.OpenBIS"> - <inherits name='ch.systemsx.cisd.openbis.OpenBIS-without-entry-point' /> - <set-property name="user.agent" value="safari" /> - - <entry-point class='ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.application.PhosphoNetXClient' /> - - <script src="proteomics-dictionary.js" /> - <public path="client/web/public" /> - <source path="client/web/client" /> - <source path="shared/basic" /> -</module> diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/api/v1/FacadeFactory.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/api/v1/FacadeFactory.java deleted file mode 100644 index 686fe98b785..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/api/v1/FacadeFactory.java +++ /dev/null @@ -1,103 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.client.api.v1; - -import ch.systemsx.cisd.openbis.common.api.client.ServiceFinder; -import ch.systemsx.cisd.common.api.retry.RetryCaller; -import ch.systemsx.cisd.common.api.retry.RetryProxyFactory; -import ch.systemsx.cisd.openbis.generic.shared.api.v1.IGeneralInformationService; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.api.v1.IProteomicsDataService; - -/** - * Factory of {@link IProteomicsDataApiFacade}. - * - * @author Franz-Josef Elmer - */ -public class FacadeFactory -{ - private static final ServiceFinder SERVICE_FINDER = new ServiceFinder("openbis", - IProteomicsDataService.SERVER_URL); - - private static final ServiceFinder GENERIC_INFO_SERVICE_FINDER = new ServiceFinder("openbis", - IGeneralInformationService.SERVICE_URL); - - /** - * Creates a facade for specified server URL, user Id, and password. - */ - public static IProteomicsDataApiFacade create(final String serverURL, final String userID, - final String password) - { - RetryCaller<IProteomicsDataApiFacade, RuntimeException> caller = - new RetryCaller<IProteomicsDataApiFacade, RuntimeException>() - { - @Override - protected IProteomicsDataApiFacade call() - { - IGeneralInformationService infoService = - createGenericInfoService(serverURL); - IProteomicsDataService service = createService(serverURL); - String sessionToken = - infoService.tryToAuthenticateForAllServices(userID, password); - if (sessionToken == null) - { - throw new IllegalArgumentException("User " + userID - + " couldn't be authenticated"); - } - - IProteomicsDataApiFacade facade = - new ProteomicsDataApiFacade(service, infoService, sessionToken); - return RetryProxyFactory.createProxy(facade); - } - }; - return caller.callWithRetry(); - } - - /** - * Creates a facade for specified url and sessionToken. - */ - public static IProteomicsDataApiFacade create(final String serverURL, final String sessionToken) - { - RetryCaller<IProteomicsDataApiFacade, RuntimeException> caller = - new RetryCaller<IProteomicsDataApiFacade, RuntimeException>() - { - @Override - protected IProteomicsDataApiFacade call() - { - IProteomicsDataService service = createService(serverURL); - IGeneralInformationService infoService = - createGenericInfoService(serverURL); - - IProteomicsDataApiFacade facade = - new ProteomicsDataApiFacade(service, infoService, sessionToken); - return RetryProxyFactory.createProxy(facade); - } - }; - return caller.callWithRetry(); - } - - private static IProteomicsDataService createService(String serverURL) - { - return SERVICE_FINDER.createService(IProteomicsDataService.class, serverURL); - } - - private static IGeneralInformationService createGenericInfoService(String serverURL) - { - return GENERIC_INFO_SERVICE_FINDER.createService(IGeneralInformationService.class, - serverURL); - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/api/v1/IProteomicsDataApiFacade.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/api/v1/IProteomicsDataApiFacade.java deleted file mode 100644 index 3a2e13a77e1..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/api/v1/IProteomicsDataApiFacade.java +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.client.api.v1; - -import java.util.List; - -import ch.systemsx.cisd.common.api.retry.Retry; -import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.Project; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.api.v1.dto.DataSet; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.api.v1.dto.DataStoreServerProcessingPluginInfo; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.api.v1.dto.Experiment; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.api.v1.dto.MsInjectionDataInfo; - -/** - * Facade for openBIS proteomics data service to be used by a proteomics pipeline server like p-grade. - * - * @author Franz-Josef Elmer - */ -public interface IProteomicsDataApiFacade -{ - /** - * Return the session token for the logged-in user. - */ - @Retry - public String getSessionToken(); - - /** - * Returns all samples of type MS_INJECTION in space MS_DATA which have a parent sample which the specified user is allow to read. - */ - @Retry - public List<MsInjectionDataInfo> listRawDataSamples(String userID); - - /** - * Returns all samples of type MS_INJECTION in space MS_DATA which have a parent sample. - */ - @Retry - public List<MsInjectionDataInfo> listAllRawDataSamples(String userID); - - /** - * Lists all processing plugins on DSS. - */ - @Retry - public List<DataStoreServerProcessingPluginInfo> listDataStoreServerProcessingPluginInfos(); - - /** - * Processes the data sets of specified samples by the DSS processing plug-in of specified key for the specified user. Only the most recent data - * sets of specified type are processed. - */ - @Deprecated - public void processingRawData(String userID, String dataSetProcessingKey, - long[] rawDataSampleIDs, String dataSetType); - - /** - * Processes the specified data sets by the DSS processing plug-in of specified key for the specified user. Implementations should check that the - * specified user is allowed to read specified data sets. - */ - public void processDataSets(String userID, String dataSetProcessingKey, List<String> dataSetCodes); - - /** - * Returns all projects where the specified user has USER access rights. - */ - @Retry - public List<Project> listProjects(String userID); - - /** - * Returns all experiments of type <tt>MS_SEARCH</tt> which the specified user is allowed to read. - */ - @Retry - public List<Experiment> listSearchExperiments(String userID); - - /** - * Returns all experiments of specified type which the specified user is allowed to read. - */ - @Retry - public List<Experiment> listExperiments(String sessionToken, String userID, String experimentTypeCode); - - /** - * Returns all data sets of specified experiment which the specified user is allowed to read. - */ - @Retry - public List<DataSet> listDataSetsByExperiment(String userID, long experimentID); - - /** - * Processes the data sets of specified experiments of type <tt>MS_SEARCH</tt> by the DSS processing plug-in of specified key for the specified - * user. It will be checked if the experiments are of search experiments and if the user has USER access rights. - */ - @Deprecated - public void processSearchData(String userID, String dataSetProcessingKey, - long[] searchExperimentIDs); - - /** - * Processes the data sets of specified experiments by the DSS processing plug-in of specified key for the specified user. It will be checked if - * the experiments are of specified type and if the user has USER access rights. - */ - public void processProteinResultDataSets(String sessionToken, String userID, - String dataSetProcessingKey, String experimentTypeCode, long[] experimentIDs); - - /** - * Logs current user out. - */ - public void logout(); - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/api/v1/ProteomicsDataApiFacade.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/api/v1/ProteomicsDataApiFacade.java deleted file mode 100644 index f80f1569685..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/api/v1/ProteomicsDataApiFacade.java +++ /dev/null @@ -1,168 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.client.api.v1; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import ch.systemsx.cisd.openbis.generic.shared.api.v1.IGeneralInformationService; -import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.Project; -import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.Role; -import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SpaceWithProjectsAndRoleAssignments; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.api.v1.IProteomicsDataService; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.api.v1.dto.DataSet; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.api.v1.dto.DataStoreServerProcessingPluginInfo; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.api.v1.dto.Experiment; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.api.v1.dto.MsInjectionDataInfo; - -/** - * @author Franz-Josef Elmer - */ -class ProteomicsDataApiFacade implements IProteomicsDataApiFacade -{ - private static final String USER_ROLE_SET = "SPACE_USER"; - - private final IProteomicsDataService service; - - private final IGeneralInformationService generalInfoService; - - private final String sessionToken; - - ProteomicsDataApiFacade(IProteomicsDataService service, - IGeneralInformationService generalInfoService, String sessionToken) - { - this.service = service; - this.generalInfoService = generalInfoService; - this.sessionToken = sessionToken; - } - - @Override - public String getSessionToken() - { - return sessionToken; - } - - @Override - public List<DataStoreServerProcessingPluginInfo> listDataStoreServerProcessingPluginInfos() - { - return service.listDataStoreServerProcessingPluginInfos(sessionToken); - } - - @Override - public List<MsInjectionDataInfo> listRawDataSamples(String userID) - { - return service.listRawDataSamples(sessionToken, userID); - } - - @Override - public List<MsInjectionDataInfo> listAllRawDataSamples(String userID) - { - return service.listAllRawDataSamples(sessionToken, userID); - } - - @Override - @SuppressWarnings("deprecation") - public void processingRawData(String userID, String dataSetProcessingKey, - long[] rawDataSampleIDs, String dataSetType) - { - service.processingRawData(sessionToken, userID, dataSetProcessingKey, rawDataSampleIDs, - dataSetType); - } - - @Override - public void processDataSets(String userID, String dataSetProcessingKey, - List<String> dataSetCodes) - { - service.processDataSets(sessionToken, userID, dataSetProcessingKey, dataSetCodes); - } - - @Override - public List<Project> listProjects(String userID) - { - Map<String, Set<Role>> namedRoleSets = generalInfoService.listNamedRoleSets(sessionToken); - Set<Role> allowedRoles = namedRoleSets.get(USER_ROLE_SET); - if (allowedRoles == null) - { - throw new IllegalStateException("Role set " + USER_ROLE_SET + " not known."); - } - - List<SpaceWithProjectsAndRoleAssignments> spaces = - generalInfoService.listSpacesWithProjectsAndRoleAssignments(sessionToken, null); - List<Project> projects = new ArrayList<Project>(); - for (SpaceWithProjectsAndRoleAssignments space : spaces) - { - Set<Role> roles = space.getRoles(userID); - roles.retainAll(allowedRoles); - if (roles.isEmpty() == false) - { - for (ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.Project project : space - .getProjects()) - { - projects.add(new Project(project.getId(), project.getPermId(), space.getCode(), - project.getCode(), project.getDescription())); - } - } - } - return projects; - } - - @Override - @SuppressWarnings("deprecation") - public List<Experiment> listSearchExperiments(String userID) - { - return service.listSearchExperiments(sessionToken, userID); - } - - @Override - public List<Experiment> listExperiments(@SuppressWarnings("hiding") String sessionToken, - String userID, String experimentTypeCode) - { - return service.listExperiments(sessionToken, userID, experimentTypeCode); - } - - @Override - public List<DataSet> listDataSetsByExperiment(String userID, long experimentID) - { - return service.listDataSetsByExperiment(sessionToken, userID, experimentID); - } - - @Override - @SuppressWarnings("deprecation") - public void processSearchData(String userID, String dataSetProcessingKey, - long[] searchExperimentIDs) - { - service.processSearchData(sessionToken, userID, dataSetProcessingKey, searchExperimentIDs); - } - - @Override - public void processProteinResultDataSets(@SuppressWarnings("hiding") String sessionToken, - String userID, String dataSetProcessingKey, String experimentTypeCode, - long[] experimentIDs) - { - service.processProteinResultDataSets(sessionToken, userID, dataSetProcessingKey, - experimentTypeCode, experimentIDs); - } - - @Override - public void logout() - { - generalInfoService.logout(sessionToken); - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/api/v1/ProteomicsDataApiTest.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/api/v1/ProteomicsDataApiTest.java deleted file mode 100644 index 548725f59cc..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/api/v1/ProteomicsDataApiTest.java +++ /dev/null @@ -1,130 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.client.api.v1; - -import java.util.Date; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.Project; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.api.v1.dto.DataSet; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.api.v1.dto.DataStoreServerProcessingPluginInfo; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.api.v1.dto.Experiment; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.api.v1.dto.MsInjectionDataInfo; - -/** - * Example of usage of Proteomics Data API. - * - * @author Franz-Josef Elmer - */ -public class ProteomicsDataApiTest -{ - @SuppressWarnings("deprecation") - public static void main(String[] args) - { - if (args.length != 4) - { - System.err.println("Usage: <openbis-server-url> <login id> <password> <user id>"); - return; - } - - String serverURL = args[0]; - String loginID = args[1]; - String password = args[2]; - String userID = args[3]; - IProteomicsDataApiFacade facade = FacadeFactory.create(serverURL, loginID, password); - - System.out.println("MS_INJECTION samples:"); - List<MsInjectionDataInfo> rawDataSamples = facade.listRawDataSamples(userID); - for (MsInjectionDataInfo info : rawDataSamples) - { - Map<String, Date> latestDataSets = info.getLatestDataSetRegistrationDates(); - if (latestDataSets.isEmpty() == false) - { - System.out.println(" " + info.getMsInjectionSampleCode() + " -> " - + info.getBiologicalSampleIdentifier() + " -> " - + info.getBiologicalExperimentIdentifier()); - Experiment experiment = info.getBiologicalExperiment(); - if (experiment != null) - { - System.out.println(" biological experiment: " + experiment.getCode() + " " - + experiment.getProperties()); - } - System.out.println(" latest data sets: " - + info.getLatestDataSetRegistrationDates()); - Set<DataSet> dataSets = info.getDataSets(); - for (DataSet dataSet : dataSets) - { - print(dataSet, " "); - } - } - } - - System.out.println("DSS processing plugins:"); - List<DataStoreServerProcessingPluginInfo> infos = - facade.listDataStoreServerProcessingPluginInfos(); - String dataSetProcessingKey = null; - for (DataStoreServerProcessingPluginInfo info : infos) - { - System.out.println(" key:" + info.getKey() + ", label:'" + info.getLabel() - + "', data set types:" + info.getDatasetTypeCodes()); - if (info.getDatasetTypeCodes().contains("PROT_RESULT")) - { - dataSetProcessingKey = info.getKey(); - } - } - - System.out.println("Projects:"); - List<Project> projects = facade.listProjects(userID); - for (Project project : projects) - { - System.out.println(project); - } - - System.out.println("Search Experiments:"); - List<Experiment> experiments = facade.listSearchExperiments(userID); - long[] ids = new long[experiments.size()]; - for (int i = 0; i < experiments.size(); i++) - { - Experiment experiment = experiments.get(i); - System.out.println(experiment.getSpaceCode() + "/" + experiment.getProjectCode() + "/" - + experiment.getCode() + " [" + experiment.getId() + ", " - + experiment.getRegistrationDate() + "] " + experiment.getProperties()); - ids[i] = experiment.getId(); - } - - if (dataSetProcessingKey != null) - { - System.out.println("Process search data of " + ids.length + " experiments"); - facade.processSearchData(userID, dataSetProcessingKey, ids); - } - - facade.logout(); - } - - private static void print(DataSet dataSet, String indentation) - { - System.out.println(indentation + dataSet.getCode() + " " + dataSet.getType() + " " - + dataSet.getRegistrationDate() + " " + dataSet.getProperties()); - Set<DataSet> children = dataSet.getChildren(); - for (DataSet child : children) - { - print(child, indentation + " "); - } - } -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/api/v1/package.html b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/api/v1/package.html deleted file mode 100644 index 4dd85ccc624..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/api/v1/package.html +++ /dev/null @@ -1,5 +0,0 @@ -<html> -<body> -Proteomics Data API Facade -</body> -</html> \ No newline at end of file diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/Constants.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/Constants.java deleted file mode 100644 index e547f038f5e..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/Constants.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client; - -/** - * Constants used by client and server of Web presentation layer. - * - * @author Franz-Josef Elmer - */ -public class Constants -{ - - public static final String TECHNOLOGY_NAME = "proteomics"; - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/IPhosphoNetXClientService.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/IPhosphoNetXClientService.java deleted file mode 100644 index aeba0b11e81..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/IPhosphoNetXClientService.java +++ /dev/null @@ -1,119 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client; - -import java.util.List; - -import ch.systemsx.cisd.openbis.generic.client.web.client.IClientService; -import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DefaultResultSetConfig; -import ch.systemsx.cisd.openbis.generic.client.web.client.dto.IResultSetConfig; -import ch.systemsx.cisd.openbis.generic.client.web.client.dto.TableExportCriteria; -import ch.systemsx.cisd.openbis.generic.client.web.client.dto.TypedTableResultSet; -import ch.systemsx.cisd.openbis.generic.client.web.client.exception.UserFailureException; -import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewSample; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRowWithObject; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Vocabulary; -import ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.dto.ListProteinByExperimentAndReferenceCriteria; -import ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.dto.ListProteinByExperimentCriteria; -import ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.dto.ListProteinSequenceCriteria; -import ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.dto.ListProteinSummaryByExperimentCriteria; -import ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.dto.ListSampleAbundanceByProteinCriteria; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.AbundanceColumnDefinition; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.DataSetProtein; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.ProteinByExperiment; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.ProteinInfo; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.ProteinRelatedSample; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.ProteinSequence; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.ProteinSummary; - -/** - * * Service interface for the PhosphoNetX GWT client. - * <p> - * Each method should declare throwing {@link UserFailureException}. The authorization framework can throw it when the user has insufficient - * privileges. If it is not marked, the GWT client will report unexpected exception. - * </p> - * - * @author Franz-Josef Elmer - */ -public interface IPhosphoNetXClientService extends IClientService -{ - public TypedTableResultSet<Sample> listParentlessMsInjectionSamples( - DefaultResultSetConfig<String, TableModelRowWithObject<Sample>> criteria) - throws UserFailureException; - - public TypedTableResultSet<Sample> listBiologicalSamples( - DefaultResultSetConfig<String, TableModelRowWithObject<Sample>> criteria) - throws UserFailureException; - - public void linkSamples(Sample parentSample, List<Sample> childSamples) throws UserFailureException; - - public void createAndLinkSamples(NewSample newBiologicalSample, - List<Sample> msInjectionSamples) throws UserFailureException; - - public Vocabulary getTreatmentTypeVocabulary() throws UserFailureException; - - public List<AbundanceColumnDefinition> getAbundanceColumnDefinitionsForProteinByExperiment( - TechId experimentID, String treatmentTypeOrNull) throws UserFailureException; - - public TypedTableResultSet<ProteinInfo> listProteinsByExperiment(ListProteinByExperimentCriteria criteria) - throws UserFailureException; - - public String prepareExportProteins(TableExportCriteria<TableModelRowWithObject<ProteinInfo>> exportCriteria) - throws UserFailureException; - - public TypedTableResultSet<ProteinSummary> listProteinSummariesByExperiment( - ListProteinSummaryByExperimentCriteria criteria) throws UserFailureException; - - public String prepareExportProteinSummary(TableExportCriteria<TableModelRowWithObject<ProteinSummary>> exportCriteria) - throws UserFailureException; - - public ProteinByExperiment getProteinByExperiment(TechId experimentID, TechId proteinReferenceID) - throws UserFailureException; - - public TypedTableResultSet<ProteinSequence> listSequencesByProteinReference( - ListProteinSequenceCriteria criteria) throws UserFailureException; - - public String prepareExportProteinSequences( - TableExportCriteria<TableModelRowWithObject<ProteinSequence>> exportCriteria) - throws UserFailureException; - - public TypedTableResultSet<DataSetProtein> listProteinsByExperimentAndReference( - ListProteinByExperimentAndReferenceCriteria criteria) throws UserFailureException; - - public String prepareExportDataSetProteins( - TableExportCriteria<TableModelRowWithObject<DataSetProtein>> exportCriteria) - throws UserFailureException; - - public TypedTableResultSet<ProteinRelatedSample> listProteinRelatedSamplesByProtein( - ListSampleAbundanceByProteinCriteria criteria) throws UserFailureException; - - public String prepareExportProteinRelatedSamples( - TableExportCriteria<TableModelRowWithObject<ProteinRelatedSample>> exportCriteria) - throws UserFailureException; - - public TypedTableResultSet<Sample> listRawDataSamples( - IResultSetConfig<String, TableModelRowWithObject<Sample>> criteria) throws UserFailureException; - - public String prepareExportRawDataSamples(TableExportCriteria<TableModelRowWithObject<Sample>> exportCriteria) - throws UserFailureException; - - public void processRawData(String dataSetProcessingKey, long[] rawDataSampleIDs, - String dataSetType) throws UserFailureException; - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/IPhosphoNetXClientServiceAsync.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/IPhosphoNetXClientServiceAsync.java deleted file mode 100644 index 7640def96df..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/IPhosphoNetXClientServiceAsync.java +++ /dev/null @@ -1,137 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client; - -import java.util.List; - -import com.google.gwt.user.client.rpc.AsyncCallback; - -import ch.systemsx.cisd.openbis.generic.client.web.client.IClientServiceAsync; -import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DefaultResultSetConfig; -import ch.systemsx.cisd.openbis.generic.client.web.client.dto.IResultSetConfig; -import ch.systemsx.cisd.openbis.generic.client.web.client.dto.TableExportCriteria; -import ch.systemsx.cisd.openbis.generic.client.web.client.dto.TypedTableResultSet; -import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewSample; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRowWithObject; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Vocabulary; -import ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.dto.ListProteinByExperimentAndReferenceCriteria; -import ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.dto.ListProteinByExperimentCriteria; -import ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.dto.ListProteinSequenceCriteria; -import ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.dto.ListProteinSummaryByExperimentCriteria; -import ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.dto.ListSampleAbundanceByProteinCriteria; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.AbundanceColumnDefinition; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.DataSetProtein; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.ProteinByExperiment; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.ProteinInfo; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.ProteinRelatedSample; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.ProteinSequence; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.ProteinSummary; - -/** - * @author Franz-Josef Elmer - */ -public interface IPhosphoNetXClientServiceAsync extends IClientServiceAsync -{ - /** @see IPhosphoNetXClientService#listParentlessMsInjectionSamples(DefaultResultSetConfig) */ - public void listParentlessMsInjectionSamples( - DefaultResultSetConfig<String, TableModelRowWithObject<Sample>> criteria, - AsyncCallback<TypedTableResultSet<Sample>> callback); - - /** @see IPhosphoNetXClientService#listBiologicalSamples(DefaultResultSetConfig) */ - public void listBiologicalSamples( - DefaultResultSetConfig<String, TableModelRowWithObject<Sample>> criteria, - AsyncCallback<TypedTableResultSet<Sample>> callback); - - /** @see IPhosphoNetXClientService#linkSamples(Sample, List) */ - public void linkSamples(Sample parentSample, List<Sample> childSamples, AsyncCallback<Void> callback); - - /** @see IPhosphoNetXClientService#createAndLinkSamples(NewSample, List) */ - public void createAndLinkSamples(NewSample newBiologicalSample, - List<Sample> msInjectionSamples, AsyncCallback<Void> callback); - - /** @see IPhosphoNetXClientService#getTreatmentTypeVocabulary() */ - public void getTreatmentTypeVocabulary(AsyncCallback<Vocabulary> callback); - - /** - * @see IPhosphoNetXClientService#getAbundanceColumnDefinitionsForProteinByExperiment(TechId, String) - */ - public void getAbundanceColumnDefinitionsForProteinByExperiment(TechId experimentID, - String treatmentTypeOrNull, - AsyncCallback<List<AbundanceColumnDefinition>> callback); - - /** @see IPhosphoNetXClientService#listProteinsByExperiment(ListProteinByExperimentCriteria) */ - public void listProteinsByExperiment(ListProteinByExperimentCriteria criteria, - AsyncCallback<TypedTableResultSet<ProteinInfo>> callback); - - /** @see IPhosphoNetXClientService#prepareExportProteins(TableExportCriteria) */ - public void prepareExportProteins( - TableExportCriteria<TableModelRowWithObject<ProteinInfo>> exportCriteria, - AsyncCallback<String> callback); - - /** @see IPhosphoNetXClientService#listProteinSummariesByExperiment(ListProteinSummaryByExperimentCriteria) */ - public void listProteinSummariesByExperiment(ListProteinSummaryByExperimentCriteria criteria, - AsyncCallback<TypedTableResultSet<ProteinSummary>> callback); - - /** @see IPhosphoNetXClientService#prepareExportProteinSummary(TableExportCriteria) */ - public void prepareExportProteinSummary( - TableExportCriteria<TableModelRowWithObject<ProteinSummary>> exportCriteria, - AsyncCallback<String> callback); - - /** @see IPhosphoNetXClientService#getProteinByExperiment(TechId, TechId) */ - public void getProteinByExperiment(TechId experimentID, TechId proteinReferenceID, - AsyncCallback<ProteinByExperiment> callback); - - /** @see IPhosphoNetXClientService#listSequencesByProteinReference(ListProteinSequenceCriteria) */ - public void listSequencesByProteinReference(ListProteinSequenceCriteria criteria, - AsyncCallback<TypedTableResultSet<ProteinSequence>> callback); - - /** @see IPhosphoNetXClientService#prepareExportProteinSequences(TableExportCriteria) */ - public void prepareExportProteinSequences( - TableExportCriteria<TableModelRowWithObject<ProteinSequence>> exportCriteria, - AsyncCallback<String> callback); - - /** @see IPhosphoNetXClientService#listProteinsByExperimentAndReference(ListProteinByExperimentAndReferenceCriteria) */ - public void listProteinsByExperimentAndReference( - ListProteinByExperimentAndReferenceCriteria criteria, - AsyncCallback<TypedTableResultSet<DataSetProtein>> callback); - - /** @see IPhosphoNetXClientService#prepareExportDataSetProteins(TableExportCriteria) */ - public void prepareExportDataSetProteins(TableExportCriteria<TableModelRowWithObject<DataSetProtein>> exportCriteria, - AsyncCallback<String> callback); - - /** @see IPhosphoNetXClientService#listProteinRelatedSamplesByProtein(ListSampleAbundanceByProteinCriteria) */ - public void listProteinRelatedSamplesByProtein(ListSampleAbundanceByProteinCriteria criteria, - AsyncCallback<TypedTableResultSet<ProteinRelatedSample>> callback); - - /** @see IPhosphoNetXClientService#prepareExportProteinRelatedSamples(TableExportCriteria) */ - public void prepareExportProteinRelatedSamples( - TableExportCriteria<TableModelRowWithObject<ProteinRelatedSample>> exportCriteria, - AsyncCallback<String> callback); - - /** @see IPhosphoNetXClientService#listRawDataSamples(IResultSetConfig) */ - public void listRawDataSamples(IResultSetConfig<String, TableModelRowWithObject<Sample>> criteria, - AsyncCallback<TypedTableResultSet<Sample>> callback); - - /** @see IPhosphoNetXClientService#prepareExportRawDataSamples(TableExportCriteria) */ - public void prepareExportRawDataSamples(TableExportCriteria<TableModelRowWithObject<Sample>> exportCriteria, - AsyncCallback<String> callback); - - /** @see IPhosphoNetXClientService#processRawData(String, long[], String) */ - public void processRawData(String dataSetProcessingKey, long[] rawDataSampleIDs, String dataSetType, AsyncCallback<Void> callback); -} \ No newline at end of file diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/AccessionNumberURLCreator.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/AccessionNumberURLCreator.java deleted file mode 100644 index 9b4caaffd0a..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/AccessionNumberURLCreator.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.application; - -import java.util.HashMap; -import java.util.Map; - -/** - * @author Franz-Josef Elmer - */ -class AccessionNumberURLCreator -{ - private static final String UNIPROT_URL_TEMPLATE = "http://www.uniprot.org/uniprot/$id"; - - private static final String UNIPROT_QUERY_URL_TEMPLATE = "http://www.uniprot.org/uniprot/?query=$id"; - - private static final Map<String, String> URL_TEMPLATES = createURLTemplates(); - - private static final Map<String, String> createURLTemplates() - { - HashMap<String, String> map = new HashMap<String, String>(); - map.put("sp", UNIPROT_URL_TEMPLATE); - map.put("tr", UNIPROT_URL_TEMPLATE); - map.put("ipi", UNIPROT_QUERY_URL_TEMPLATE); - map.put("ens", UNIPROT_QUERY_URL_TEMPLATE); - map.put("rs", UNIPROT_QUERY_URL_TEMPLATE); - map.put("ll", UNIPROT_QUERY_URL_TEMPLATE); - map.put("fb", UNIPROT_QUERY_URL_TEMPLATE); - map.put("gi", "http://www.ncbi.nlm.nih.gov/protein/$id"); - map.put("isb", "http://www.ebi.ac.uk/ebisearch/search.ebi?db=proteinSequences&t=$id"); - return map; - } - - static String tryToCreateURL(String typeOrNull, String accessionNumber) - { - if (typeOrNull == null) - { - return eval(UNIPROT_URL_TEMPLATE, accessionNumber); - } - String template = URL_TEMPLATES.get(typeOrNull); - return template == null ? null : eval(template, accessionNumber); - } - - private static String eval(String template, String value) - { - return template.replaceAll("\\$id", value); - } -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/ClientPluginFactory.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/ClientPluginFactory.java deleted file mode 100644 index cfd0dacffd1..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/ClientPluginFactory.java +++ /dev/null @@ -1,244 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.application; - -import java.util.Arrays; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import ch.systemsx.cisd.openbis.generic.client.web.client.ICommonClientServiceAsync; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.AbstractClientPluginFactory; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.ActionContext; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.Dict; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.AbstractTabItemFactory; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.DatabaseModificationAwareComponent; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.DatabaseModificationAwareWidget; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.DefaultTabItem; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.ITabItem; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.help.HelpPageIdentifier; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.help.HelpPageIdentifier.HelpPageAction; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.help.HelpPageIdentifier.HelpPageDomain; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.plugin.IClientPlugin; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.plugin.IModule; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.AbstractRegistrationForm; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.AbstractViewer; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.columns.framework.LinkExtractor; -import ch.systemsx.cisd.openbis.generic.shared.basic.IEntityInformationHolderWithPermId; -import ch.systemsx.cisd.openbis.generic.shared.basic.IIdAndCodeHolder; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.BasicEntityType; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentType; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.api.IManagedInputWidgetDescription; -import ch.systemsx.cisd.openbis.plugin.generic.client.web.client.IGenericClientServiceAsync; -import ch.systemsx.cisd.openbis.plugin.generic.client.web.client.application.AbstractGenericEntityRegistrationForm; -import ch.systemsx.cisd.openbis.plugin.generic.client.web.client.application.DelegatedClientPlugin; -import ch.systemsx.cisd.openbis.plugin.generic.client.web.client.application.GenericViewContext; -import ch.systemsx.cisd.openbis.plugin.generic.client.web.client.application.experiment.GenericExperimentEditForm; -import ch.systemsx.cisd.openbis.plugin.generic.client.web.client.application.experiment.GenericExperimentRegistrationForm; -import ch.systemsx.cisd.openbis.plugin.generic.client.web.client.application.experiment.GenericExperimentViewer; -import ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.IPhosphoNetXClientServiceAsync; - -/** - * @author Franz-Josef Elmer - */ -public class ClientPluginFactory extends AbstractClientPluginFactory<ViewContext> -{ - - public ClientPluginFactory(IViewContext<ICommonClientServiceAsync> originalViewContext) - { - super(originalViewContext); - } - - @Override - protected ViewContext createViewContext( - IViewContext<ICommonClientServiceAsync> originalViewContext) - { - return new ViewContext(originalViewContext); - } - - @Override - public boolean isEnabled() - { - return checkEnabledProperty("proteomics"); - } - - @Override - public IModule maybeCreateModule() - { - return new PhosphoNetXModule(getViewContext()); - } - - @Override - public Set<String> getEntityTypeCodes(EntityKind entityKind) - { - if (entityKind == EntityKind.EXPERIMENT) - { - return new HashSet<String>(Arrays.asList("MS_SEARCH", "MS_QUANTIFICATION")); - } - return Collections.emptySet(); - } - - @Override - @SuppressWarnings("unchecked") - public <T extends BasicEntityType, I extends IIdAndCodeHolder> IClientPlugin<T, I> createClientPlugin( - EntityKind entityKind) - { - if (EntityKind.EXPERIMENT.equals(entityKind)) - { - return (IClientPlugin<T, I>) new ExperimentClientPlugin(getViewContext()); - } - throw new UnsupportedOperationException("IClientPlugin for entity kind '" + entityKind - + "' not implemented yet."); - } - - // - // Helper classes - // - - private final class ExperimentClientPlugin extends DelegatedClientPlugin<ExperimentType> - { - private ExperimentClientPlugin(IViewContext<IPhosphoNetXClientServiceAsync> viewContext) - { - super(viewContext, EntityKind.EXPERIMENT); - } - - // - // IViewClientPlugin - // - - @Override - public final AbstractTabItemFactory createEntityViewer( - final IEntityInformationHolderWithPermId entity) - { - return new AbstractTabItemFactory() - { - @Override - public ITabItem create() - { - final DatabaseModificationAwareComponent experimentViewer = - ExperimentViewer.createComponent(getViewContext(), entity.getEntityType(), - entity); - return DefaultTabItem.create(getTabTitle(), experimentViewer, - getViewContext(), false); - } - - @Override - public String getId() - { - return GenericExperimentViewer.createId(entity); - } - - @Override - public HelpPageIdentifier getHelpPageIdentifier() - { - return new HelpPageIdentifier(HelpPageDomain.EXPERIMENT, - HelpPageAction.VIEW); - } - - @Override - public String getTabTitle() - { - return getViewerTitle(Dict.EXPERIMENT, entity); - } - - @Override - public String tryGetLink() - { - return LinkExtractor.tryExtract(entity); - } - }; - } - - @Override - public DatabaseModificationAwareWidget createRegistrationForEntityType( - ExperimentType entityType, - Map<String, List<IManagedInputWidgetDescription>> inputWidgetDescriptions, - ActionContext context) - { - GenericExperimentRegistrationForm form = - new GenericExperimentRegistrationForm(getGenericViewContext(), - inputWidgetDescriptions, context, entityType); - return new DatabaseModificationAwareWidget(form, form); - } - - @Override - public AbstractTabItemFactory createEntityEditor(final IIdAndCodeHolder identifiable) - { - return new AbstractTabItemFactory() - { - @Override - public ITabItem create() - { - DatabaseModificationAwareComponent component = - GenericExperimentEditForm.create(getGenericViewContext(), - identifiable); - return DefaultTabItem.create(getTabTitle(), component, getViewContext(), - true); - } - - @Override - public String getId() - { - return AbstractGenericEntityRegistrationForm.createId(identifiable, - EntityKind.EXPERIMENT); - } - - @Override - public HelpPageIdentifier getHelpPageIdentifier() - { - return new HelpPageIdentifier(HelpPageDomain.EXPERIMENT, - HelpPageAction.EDIT); - } - - @Override - public String getTabTitle() - { - return getEditorTitle(Dict.EXPERIMENT, identifiable); - } - - @Override - public String tryGetLink() - { - return null; - } - }; - } - - private String getViewerTitle(final String entityKindDictKey, - final IIdAndCodeHolder identifiable) - { - return AbstractViewer.getTitle(getViewContext(), entityKindDictKey, identifiable); - } - - private String getEditorTitle(final String entityKindDictKey, - final IIdAndCodeHolder identifiable) - { - return AbstractRegistrationForm.getEditTitle(getViewContext(), entityKindDictKey, - identifiable); - } - - private IViewContext<IGenericClientServiceAsync> getGenericViewContext() - { - return new GenericViewContext(getViewContext().getCommonViewContext()); - } - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/DataSetProteinGrid.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/DataSetProteinGrid.java deleted file mode 100644 index 107f6cbbba4..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/DataSetProteinGrid.java +++ /dev/null @@ -1,118 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.application; - -import java.util.Arrays; -import java.util.List; - -import ch.systemsx.cisd.openbis.generic.client.web.client.application.AbstractAsyncCallback; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.TypedTableGrid; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.IDisposableComponent; -import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DefaultResultSetConfig; -import ch.systemsx.cisd.openbis.generic.client.web.client.dto.GenericConstants; -import ch.systemsx.cisd.openbis.generic.client.web.client.dto.TableExportCriteria; -import ch.systemsx.cisd.openbis.generic.client.web.client.dto.TypedTableResultSet; -import ch.systemsx.cisd.openbis.generic.shared.basic.IIdAndCodeHolder; -import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseModificationKind; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRowWithObject; -import ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.IPhosphoNetXClientServiceAsync; -import ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.dto.DataSetProteinGridColumnIDs; -import ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.dto.ListProteinByExperimentAndReferenceCriteria; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.DataSetProtein; - -/** - * @author Franz-Josef Elmer - */ -class DataSetProteinGrid extends TypedTableGrid<DataSetProtein> -{ - private static final String PREFIX = GenericConstants.ID_PREFIX + "data-set-protein-browser"; - - public static final String BROWSER_ID = PREFIX + "_main"; - - public static final String GRID_ID = PREFIX + TypedTableGrid.GRID_POSTFIX; - - static IDisposableComponent create(IViewContext<IPhosphoNetXClientServiceAsync> viewContext, - IIdAndCodeHolder experimentIdOrNull, TechId proteinReferenceID) - { - return new DataSetProteinGrid(viewContext, experimentIdOrNull, proteinReferenceID) - .asDisposableWithoutToolbar(); - } - - private static String createWidgetID(IIdAndCodeHolder experimentIdOrNull, TechId proteinReferenceID) - { - return "-" + (experimentIdOrNull == null ? "" : experimentIdOrNull.getId() + "-") - + proteinReferenceID; - } - - private final IViewContext<IPhosphoNetXClientServiceAsync> specificViewContext; - - private ListProteinByExperimentAndReferenceCriteria criteria; - - private DataSetProteinGrid(IViewContext<IPhosphoNetXClientServiceAsync> viewContext, - IIdAndCodeHolder experimentIdOrNull, TechId proteinReferenceID) - { - super(viewContext.getCommonViewContext(), BROWSER_ID - + createWidgetID(experimentIdOrNull, proteinReferenceID), true, - PhosphoNetXDisplayTypeIDGenerator.DATA_SET_PROTEIN_BROWSER_GRID); - specificViewContext = viewContext; - criteria = new ListProteinByExperimentAndReferenceCriteria(); - if (experimentIdOrNull != null) - { - criteria.setExperimentID(new TechId(experimentIdOrNull)); - } - criteria.setProteinReferenceID(proteinReferenceID); - } - - @Override - protected String translateColumnIdToDictionaryKey(String columnID) - { - return DataSetProteinGridColumnIDs.FDR.equals(columnID) ? "false_discovery_rate_column" - : columnID.toLowerCase(); - } - - @Override - protected List<String> getColumnIdsOfFilters() - { - return Arrays.asList(); - } - - @Override - protected void listTableRows( - DefaultResultSetConfig<String, TableModelRowWithObject<DataSetProtein>> resultSetConfig, - AbstractAsyncCallback<TypedTableResultSet<DataSetProtein>> callback) - { - criteria.copyPagingConfig(resultSetConfig); - specificViewContext.getService().listProteinsByExperimentAndReference(criteria, callback); - } - - @Override - protected void prepareExportEntities( - TableExportCriteria<TableModelRowWithObject<DataSetProtein>> exportCriteria, - AbstractAsyncCallback<String> callback) - { - specificViewContext.getService().prepareExportDataSetProteins(exportCriteria, callback); - } - - @Override - public DatabaseModificationKind[] getRelevantModifications() - { - return new DatabaseModificationKind[0]; - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/Dict.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/Dict.java deleted file mode 100644 index 1609b15b473..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/Dict.java +++ /dev/null @@ -1,114 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.application; - -/** - * @author Franz-Josef Elmer - */ -public class Dict -{ - public static final String QUERY_MENU_TITLE = "query_menu_title"; - - public static final String SELECTED_EXPERIMENT_LABEL = "selected_experiment_label"; - - public static final String FDR_FILTER_LABEL = "false_discovery_rate_filter_label"; - - public static final String AGGREGATE_FUNCTION_LABEL = "aggregate_function_label"; - - public static final String AGGREGATE_ON_TREATMENT_TYPE_LABEL = "aggregate_on_treatment_type_label"; - - public static final String AGGREGATE_ORIGINAL_LABEL = "aggregate_original_label"; - - public static final String ACCESSION_NUMBER = "accession_number"; - - public static final String PROTEIN_DESCRIPTION = "protein_description"; - - public static final String COVERAGE = "coverage"; - - public static final String FALSE_DISCOVERY_RATE = "false_discovery_rate"; - - public static final String FDR_COMBO_INFO = "fdr_combo_info"; - - public static final String DATA_SET = "data_set"; - - public static final String PROTEIN_BROWSER = "protein_browser"; - - public static final String PROTEIN_SUMMARY = "protein_summary"; - - // Experiment Viewer - - public static final String DATA_SET_PROCESSING_SECTION_TITLE = "data_set_processing_section_title"; - - // Protein Viewer - public static final String PROTEIN_DETAILS_WAITING_MESSAGE = "loading_protein_details_waiting_message"; - - public static final String PROTEINS_SECTION = "proteins_section"; - - public static final String PRIMARY_PROTEIN = "primary_protein"; - - public static final String PROTEIN_IN_EXPERIMENT_TAB_LABEL = "protein_in_experiment_tab_label"; - - public static final String EXPERIMENT_LABEL = "experiment_label"; - - public static final String SEQUENCE_SHORT_NAME = "sequence_short_name"; - - public static final String DATABASE_NAME_AND_VERSION = "database_name_and_version"; - - public static final String INDISTINGUISHABLE_PROTEINS = "indistinguishable_proteins"; - - public static final String SEQUENCE = "sequence"; - - public static final String SEQUENCES = "sequences"; - - public static final String DATA_SET_PROTEINS = "data_set_proteins"; - - public static final String DATA_SET_PERM_ID = "data_set_perm_id"; - - public static final String PROTEIN_COUNT = "protein_count"; - - public static final String PEPTIDE_COUNT = "peptide_count"; - - public static final String PEPTIDES = "peptides"; - - public static final String SEQUENCE_NAME = "sequence_name"; - - public static final String FDR = "false_discovery_rate_column"; - - // Protein Detail View - public static final String PROBABILITY = "protein_probability"; - - public static final String BUTTON_DELETE_PROTEIN = "button_delete_protein"; - - // SampleAbundance Browser - - public static final String ABUNDANCE = "abundance"; - - // RawDataSample Browser - - public static final String BIOLOGICAL_SAMPLE_IDENTIFIER = "biological_sample_identifier"; - - public static final String MS_INJECTION_SAMPLE_CODE = "ms_injection_sample_code"; - - public static final String COPY_DATA_SETS_BUTTON_LABEL = "copy_data_sets_button_label"; - - public static final String COPY_DATA_SETS_TITLE = "copy_data_sets_title"; - - public static final String COPY_DATA_SETS_MESSAGE = "copy_data_sets_message"; - - public static final String COPY_DATA_SETS_DATA_SET_TYPE_FIELD = "copy_data_sets_data_set_type_field"; - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/DisplayTypeIDGenerator.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/DisplayTypeIDGenerator.java deleted file mode 100644 index 27246608c0e..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/DisplayTypeIDGenerator.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.application; - -import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.IDisplayTypeIDGenerator; - -/** - * Enum for all generic {@link IDisplayTypeIDGenerator}s. - * - * @author Franz-Josef Elmer - */ -public enum DisplayTypeIDGenerator implements IDisplayTypeIDGenerator -{ - PROTEIN_SECTION("protein-section"), - - ; - - private final String genericNameOrPrefix; - - private DisplayTypeIDGenerator(String genericNameOrPrefix) - { - this.genericNameOrPrefix = genericNameOrPrefix; - } - - @Override - public String createID() - { - return genericNameOrPrefix; - } - - @Override - public String createID(String suffix) - { - return genericNameOrPrefix + suffix; - } -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/ExperimentViewer.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/ExperimentViewer.java deleted file mode 100644 index 58501159bfb..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/ExperimentViewer.java +++ /dev/null @@ -1,188 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.application; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -import ch.systemsx.cisd.openbis.generic.client.web.client.application.AbstractAsyncCallback; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.DisposableTabContent; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.VoidAsyncCallback; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.DatabaseModificationAwareComponent; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.renderer.LinkRenderer; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.data.ProcessingDisplayCallback; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.IDisposableComponent; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.lang.StringEscapeUtils; -import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DefaultResultSetConfig; -import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DisplayedOrSelectedDatasetCriteria; -import ch.systemsx.cisd.openbis.generic.client.web.client.dto.ResultSet; -import ch.systemsx.cisd.openbis.generic.client.web.client.dto.TypedTableResultSet; -import ch.systemsx.cisd.openbis.generic.shared.basic.GridRowModel; -import ch.systemsx.cisd.openbis.generic.shared.basic.IIdAndCodeHolder; -import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.BasicEntityType; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataStoreServiceKind; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatastoreServiceDescription; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRowWithObject; -import ch.systemsx.cisd.openbis.plugin.generic.client.web.client.IGenericClientServiceAsync; -import ch.systemsx.cisd.openbis.plugin.generic.client.web.client.application.GenericViewContext; -import ch.systemsx.cisd.openbis.plugin.generic.client.web.client.application.experiment.GenericExperimentViewer; -import ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.IPhosphoNetXClientServiceAsync; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.CommonConstants; - -import com.extjs.gxt.ui.client.util.Margins; -import com.extjs.gxt.ui.client.widget.Component; -import com.extjs.gxt.ui.client.widget.ContentPanel; -import com.extjs.gxt.ui.client.widget.LayoutContainer; -import com.extjs.gxt.ui.client.widget.layout.FitLayout; -import com.extjs.gxt.ui.client.widget.layout.RowData; -import com.extjs.gxt.ui.client.widget.layout.RowLayout; -import com.google.gwt.event.dom.client.ClickEvent; -import com.google.gwt.event.dom.client.ClickHandler; -import com.google.gwt.user.client.rpc.AsyncCallback; -import com.google.gwt.user.client.ui.Widget; - -/** - * @author Franz-Josef Elmer - */ -public class ExperimentViewer extends GenericExperimentViewer -{ - public static DatabaseModificationAwareComponent createComponent( - IViewContext<IPhosphoNetXClientServiceAsync> viewContext, - BasicEntityType experimentType, IIdAndCodeHolder experimentId) - { - ExperimentViewer viewer = - new ExperimentViewer(new GenericViewContext(viewContext.getCommonViewContext()), - viewContext, experimentType, experimentId); - return new DatabaseModificationAwareComponent(viewer, viewer); - } - - private final IViewContext<IPhosphoNetXClientServiceAsync> specificViewContext; - - protected ExperimentViewer(IViewContext<IGenericClientServiceAsync> viewContext, - IViewContext<IPhosphoNetXClientServiceAsync> specificViewContext, - BasicEntityType experimentType, IIdAndCodeHolder experimentId) - { - super(viewContext, experimentType, experimentId); - this.specificViewContext = specificViewContext; - } - - @Override - protected List<DisposableTabContent> createAdditionalBrowserSectionPanels() - { - DisposableTabContent section = - new DisposableTabContent(specificViewContext.getMessage(Dict.PROTEINS_SECTION), - specificViewContext, experiment) - { - @Override - protected IDisposableComponent createDisposableContent() - { - return ProteinByExperimentBrowserGrid.create(specificViewContext, - experimentType, experiment); - } - }; - section.setIds(DisplayTypeIDGenerator.PROTEIN_SECTION); - return Collections.<DisposableTabContent> singletonList(section); - } - - @Override - protected Component tryCreateLowerLeftComponent() - { - if (viewContext.isSimpleOrEmbeddedMode()) - { - return null; // no processing in simple view mode - } - final ContentPanel contentPanel = new ContentPanel(new RowLayout()); - contentPanel.setHeading(viewContext.getMessage(Dict.DATA_SET_PROCESSING_SECTION_TITLE)); - viewContext.getCommonService().listExperimentDataSets( - new TechId(experimentId), - DefaultResultSetConfig - .<String, TableModelRowWithObject<AbstractExternalData>> createFetchAll(), true, - new AbstractAsyncCallback<TypedTableResultSet<AbstractExternalData>>(viewContext) - { - @Override - protected void process(TypedTableResultSet<AbstractExternalData> result) - { - AsyncCallback<List<DatastoreServiceDescription>> callBack = - createCallback(contentPanel, result); - viewContext.getCommonService().listDataStoreServices( - DataStoreServiceKind.PROCESSING, callBack); - - } - }); - return contentPanel; - } - - private AsyncCallback<List<DatastoreServiceDescription>> createCallback( - final ContentPanel contentPanel, TypedTableResultSet<AbstractExternalData> result) - { - ResultSet<TableModelRowWithObject<AbstractExternalData>> resultSet = result.getResultSet(); - String resultSetKey = resultSet.getResultSetKey(); - viewContext.getCommonService().removeResultSet(resultSetKey, - new VoidAsyncCallback<Void>(viewContext)); - final List<String> dataSetCodes = new ArrayList<String>(); - for (GridRowModel<TableModelRowWithObject<AbstractExternalData>> gridRowModel : resultSet.getList()) - { - dataSetCodes.add(gridRowModel.getOriginalObject().getObjectOrNull().getCode()); - } - final DisplayedOrSelectedDatasetCriteria criteria = - DisplayedOrSelectedDatasetCriteria.createSelectedItems(dataSetCodes); - return new AbstractAsyncCallback<List<DatastoreServiceDescription>>(viewContext) - { - @Override - protected void process(List<DatastoreServiceDescription> descriptions) - { - for (final DatastoreServiceDescription description : descriptions) - { - String[] dataSetTypes = description.getDatasetTypeCodes(); - for (String dataSetType : dataSetTypes) - { - if (dataSetType.equals(CommonConstants.PROT_RESULT_DATA_SET_TYPE)) - { - Widget link = createLink(description, criteria); - LayoutContainer wrapper = new LayoutContainer(new FitLayout()); - wrapper.add(link); - contentPanel.add(wrapper, new RowData(1, -1, new Margins(5))); - } - } - } - contentPanel.layout(); - } - }; - } - - private Widget createLink(final DatastoreServiceDescription description, - final DisplayedOrSelectedDatasetCriteria criteria) - { - String href = ""; - ClickHandler listener = new ClickHandler() - { - @Override - public void onClick(ClickEvent event) - { - viewContext.getCommonService().processDatasets(description, criteria, - new ProcessingDisplayCallback(viewContext)); - } - }; - String label = StringEscapeUtils.unescapeHtml(description.getLabel()); - return LinkRenderer.getLinkWidget(label, listener, href); - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/PhosphoNetXClient.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/PhosphoNetXClient.java deleted file mode 100644 index 5bad10fedb9..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/PhosphoNetXClient.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.application; - -import ch.systemsx.cisd.openbis.generic.client.web.client.IClientServiceAsync; -import ch.systemsx.cisd.openbis.generic.client.web.client.ICommonClientServiceAsync; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.Client; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.plugin.DefaultClientPluginFactoryProvider; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.plugin.IClientPluginFactoryProvider; - -/** - * @author Franz-Josef Elmer - */ -public class PhosphoNetXClient extends Client -{ - private static final class ClientPluginFactoryProvider extends - DefaultClientPluginFactoryProvider - { - ClientPluginFactoryProvider(IViewContext<ICommonClientServiceAsync> originalViewContext) - { - super(originalViewContext); - registerPluginFactory(new ClientPluginFactory(originalViewContext)); - } - - } - - @Override - protected IClientPluginFactoryProvider createPluginFactoryProvider( - final IViewContext<ICommonClientServiceAsync> commonContext) - { - return new ClientPluginFactoryProvider(commonContext); - } - - @Override - protected IClientServiceAsync getServiceForRetrievingApplicationInfo( - IViewContext<ICommonClientServiceAsync> context) - { - return new ViewContext(context).getService(); - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/PhosphoNetXDisplayTypeIDGenerator.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/PhosphoNetXDisplayTypeIDGenerator.java deleted file mode 100644 index 6561a789ec1..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/PhosphoNetXDisplayTypeIDGenerator.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.application; - -import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.IDisplayTypeIDGenerator; - -/** - * @author Franz-Josef Elmer - */ -public enum PhosphoNetXDisplayTypeIDGenerator implements IDisplayTypeIDGenerator -{ - PROTEIN_BY_EXPERIMENT_BROWSER_GRID("protein-by-experiment-browser-grid"), - - PROTEIN_SEQUENCE_BROWSER_GRID("protein-sequence-browser-grid"), - - PROTEIN_SUMMARY_BROWSER_GRID("protein-summary-browser-grid"), - - DATA_SET_PROTEIN_BROWSER_GRID("data-set-protein-browser-grid"), - - RAW_DATA_SAMPLE_BROWSER_GRID("raw-data-sample-browser-grid"), - - PARENT_LESS_MS_INJECTION_SAMPLE_BROWSER_GRID("parent-less-ms-injection-sample-browser-grid"), - - BIOLOGICAL_SAMPLE_BROWSER_GRID("biological-sample-browser-grid"), ; - - private final String genericNameOrPrefix; - - private PhosphoNetXDisplayTypeIDGenerator(String genericNameOrPrefix) - { - this.genericNameOrPrefix = genericNameOrPrefix; - } - - @Override - public String createID() - { - return genericNameOrPrefix; - } - - @Override - public String createID(String suffix) - { - return genericNameOrPrefix + suffix; - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/PhosphoNetXModule.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/PhosphoNetXModule.java deleted file mode 100644 index c736783747d..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/PhosphoNetXModule.java +++ /dev/null @@ -1,141 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.application; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.List; - -import com.extjs.gxt.ui.client.widget.menu.MenuItem; -import com.google.gwt.user.client.rpc.AsyncCallback; - -import ch.systemsx.cisd.openbis.generic.client.web.client.application.DisposableTabContent; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.DatabaseModificationAwareComponent; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.menu.ActionMenu; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.menu.ITabActionMenuItemDefinition; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.menu.TabActionMenuItemFactory; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.plugin.IModule; -import ch.systemsx.cisd.openbis.generic.client.web.client.dto.GenericConstants; -import ch.systemsx.cisd.openbis.generic.shared.basic.BasicConstant; -import ch.systemsx.cisd.openbis.generic.shared.basic.IEntityInformationHolderWithIdentifier; -import ch.systemsx.cisd.openbis.generic.shared.basic.URLMethodWithParameters; -import ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.IPhosphoNetXClientServiceAsync; -import ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.application.wizard.MsInjectionSampleAnnotationWizard; - -/** - * @author Franz-Josef Elmer - */ -public class PhosphoNetXModule implements IModule -{ - public static final String ID = GenericConstants.ID_PREFIX + "-proteomics-"; - - private final IViewContext<IPhosphoNetXClientServiceAsync> viewContext; - - public PhosphoNetXModule(IViewContext<IPhosphoNetXClientServiceAsync> viewContext) - { - this.viewContext = viewContext; - } - - @Override - public List<? extends MenuItem> getMenuItems() - { - ActionMenu msInjectionSampleAnnotatingMenuItem = TabActionMenuItemFactory.createActionMenu(viewContext, ID, - new ITabActionMenuItemDefinition<IPhosphoNetXClientServiceAsync>() - { - - @Override - public String getName() - { - return "ANNOTATE_MS_INJECTION_SAMPLES"; - } - - @Override - public String getHelpPageTitle() - { - return "Wizard for annotation MS INJECTION " + viewContext.getMessage( - ch.systemsx.cisd.openbis.generic.client.web.client.application.Dict.SAMPLES).toLowerCase(); - } - - @Override - public DatabaseModificationAwareComponent createComponent( - IViewContext<IPhosphoNetXClientServiceAsync> context) - { - return DatabaseModificationAwareComponent.create(new MsInjectionSampleAnnotationWizard(context)); - } - - @Override - public String tryGetLink() - { - URLMethodWithParameters url = new URLMethodWithParameters(""); - url.addParameter((String) BasicConstant.LOCATOR_ACTION_PARAMETER, getName()); - return url.toString().substring(1); - } - }); - ActionMenu msInjectionSampleBrowserMenuItem = TabActionMenuItemFactory.createActionMenu(viewContext, ID, - new ITabActionMenuItemDefinition<IPhosphoNetXClientServiceAsync>() - { - - @Override - public String getName() - { - return "ALL_RAW_DATA_SAMPLES"; - } - - @Override - public String getHelpPageTitle() - { - return "MS INJECTION Data Overview"; - } - - @Override - public DatabaseModificationAwareComponent createComponent( - IViewContext<IPhosphoNetXClientServiceAsync> context) - { - return RawDataSampleGrid.create(context); - } - - @Override - public String tryGetLink() - { - return null; - } - }); - return Arrays.asList(msInjectionSampleAnnotatingMenuItem, msInjectionSampleBrowserMenuItem); - } - - @Override - public String getName() - { - return viewContext.getMessage(Dict.QUERY_MENU_TITLE); - } - - @Override - public void initialize(AsyncCallback<Void> callback) - { - callback.onSuccess(null); - } - - @Override - public Collection<? extends DisposableTabContent> getSections( - IEntityInformationHolderWithIdentifier entity) - { - return new ArrayList<DisposableTabContent>(); - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/ProteinByExperimentBrowerToolBar.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/ProteinByExperimentBrowerToolBar.java deleted file mode 100644 index d58e10da11f..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/ProteinByExperimentBrowerToolBar.java +++ /dev/null @@ -1,391 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.application; - -import java.util.List; - -import com.extjs.gxt.ui.client.event.BaseEvent; -import com.extjs.gxt.ui.client.event.Events; -import com.extjs.gxt.ui.client.event.Listener; -import com.extjs.gxt.ui.client.event.SelectionChangedEvent; -import com.extjs.gxt.ui.client.event.SelectionChangedListener; -import com.extjs.gxt.ui.client.store.ListStore; -import com.extjs.gxt.ui.client.widget.Label; -import com.extjs.gxt.ui.client.widget.form.CheckBox; -import com.extjs.gxt.ui.client.widget.form.ComboBox; -import com.extjs.gxt.ui.client.widget.form.ComboBox.TriggerAction; -import com.extjs.gxt.ui.client.widget.toolbar.LabelToolItem; -import com.extjs.gxt.ui.client.widget.toolbar.ToolBar; -import com.google.gwt.user.client.rpc.AsyncCallback; -import com.google.gwt.user.client.ui.AbstractImagePrototype; - -import ch.systemsx.cisd.openbis.generic.client.web.client.application.AbstractAsyncCallback; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.model.SimplifiedBaseModelData; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.model.VocabularyTermModel; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.field.VocabularyTermSelectionWidget; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.widget.FieldUtil; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.widget.IDataRefreshCallback; -import ch.systemsx.cisd.openbis.generic.client.web.client.dto.GenericConstants; -import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Vocabulary; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.VocabularyTerm; -import ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.IPhosphoNetXClientServiceAsync; -import ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.dto.ListProteinByExperimentCriteria; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.AbundanceColumnDefinition; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.AggregateFunction; - -/** - * @author Franz-Josef Elmer - */ -class ProteinByExperimentBrowerToolBar extends ToolBar -{ - private static final AggregateFunction DEFAULT_AGGREGATE_FUNCTION = AggregateFunction.MEAN; - - private static final class AggregateOnTreatmentTypeSelectionWidget extends - VocabularyTermSelectionWidget - { - - private final VocabularyTermModel nothingTermModel; - - AggregateOnTreatmentTypeSelectionWidget( - IViewContext<IPhosphoNetXClientServiceAsync> viewContext) - { - super("treatmentType", "treatmentType", false, null, viewContext, null, null); - setAllowBlank(false); - setForceSelection(true); - VocabularyTerm nothingTerm = new VocabularyTerm(); - nothingTerm.setLabel("(nothing)"); - nothingTermModel = new VocabularyTermModel(nothingTerm); - setValue(nothingTermModel); - viewContext.getService().getTreatmentTypeVocabulary( - new AbstractAsyncCallback<Vocabulary>(viewContext) - { - @Override - protected void process(Vocabulary vocabulary) - { - setVocabulary(vocabulary); - } - }); - - } - - @Override - protected List<VocabularyTermModel> convertItems(List<VocabularyTerm> result) - { - List<VocabularyTermModel> terms = super.convertItems(result); - terms.add(0, nothingTermModel); - return terms; - } - - } - - private abstract static class SimpleModel<T> extends SimplifiedBaseModelData - { - private static final long serialVersionUID = 1L; - - private static final String PROPERTY = "property"; - - private final T object; - - SimpleModel(T object) - { - this.object = object; - set(PROPERTY, render(object)); - } - - public final T getObject() - { - return object; - } - - protected abstract String render(T modelObject); - } - - private static final class FalseDiscoveryRateModel extends SimpleModel<Double> - { - private static final long serialVersionUID = 1L; - - FalseDiscoveryRateModel(Double falseDiscoveryRate) - { - super(falseDiscoveryRate); - } - - @Override - protected String render(Double modelObject) - { - int percent = (int) (100 * modelObject); - int percentFraction = (int) (1000 * modelObject + 0.5) - 10 * percent; - return Integer.toString(percent) - + (percentFraction == 0 ? "" : "." + Integer.toString(percentFraction)) + "%"; - } - } - - private static final class AggregateFunctionModel extends SimpleModel<AggregateFunction> - { - private static final long serialVersionUID = 1L; - - AggregateFunctionModel(AggregateFunction aggregateFunction) - { - super(aggregateFunction); - } - - @Override - protected String render(AggregateFunction modelObject) - { - return modelObject.getLabel(); - } - } - - private final IViewContext<IPhosphoNetXClientServiceAsync> viewContext; - - private final ComboBox<FalseDiscoveryRateModel> fdrComboBox; - - private final ComboBox<AggregateFunctionModel> aggregateFunctionComboBox; - - private final VocabularyTermSelectionWidget treatmentTypeComboBox; - - private final CheckBox aggregateOriginalCheckBox; - - private ProteinByExperimentBrowserGrid browserGrid; - - private Experiment experiment; - - private ProteinSummaryGrid summaryGrid; - - ProteinByExperimentBrowerToolBar(IViewContext<IPhosphoNetXClientServiceAsync> viewContext, - Experiment experiment) - { - this.viewContext = viewContext; - this.experiment = experiment; - setBorders(true); - // WORKAROUND to get all elements in the toolbar present independent of the original width - // of the parent - setWidth(3000); - add(new LabelToolItem(viewContext.getMessage(Dict.FDR_FILTER_LABEL) - + GenericConstants.LABEL_SEPARATOR)); - fdrComboBox = createFDRComboBox(new SelectionChangedListener<FalseDiscoveryRateModel>() - { - - @Override - public void selectionChanged(SelectionChangedEvent<FalseDiscoveryRateModel> se) - { - update(); - } - }); - add(fdrComboBox); - add(new Label(" ")); - add(new LabelToolItem(viewContext.getMessage(Dict.AGGREGATE_FUNCTION_LABEL) - + GenericConstants.LABEL_SEPARATOR)); - aggregateFunctionComboBox = - createAggregateFunctionComboBox(new SelectionChangedListener<AggregateFunctionModel>() - { - - @Override - public void selectionChanged( - SelectionChangedEvent<AggregateFunctionModel> se) - { - update(); - } - - }); - add(aggregateFunctionComboBox); - add(new LabelToolItem(viewContext.getMessage(Dict.AGGREGATE_ON_TREATMENT_TYPE_LABEL) - + GenericConstants.LABEL_SEPARATOR)); - treatmentTypeComboBox = new AggregateOnTreatmentTypeSelectionWidget(viewContext); - treatmentTypeComboBox - .addSelectionChangedListener(new SelectionChangedListener<VocabularyTermModel>() - { - - @Override - public void selectionChanged(SelectionChangedEvent<VocabularyTermModel> se) - { - update(); - - } - }); - add(treatmentTypeComboBox); - add(new LabelToolItem(viewContext.getMessage(Dict.AGGREGATE_ORIGINAL_LABEL) - + GenericConstants.LABEL_SEPARATOR)); - aggregateOriginalCheckBox = new CheckBox(); - aggregateOriginalCheckBox.addListener(Events.Change, new Listener<BaseEvent>() - { - - @Override - public void handleEvent(BaseEvent be) - { - update(); - } - }); - add(aggregateOriginalCheckBox); - } - - private ComboBox<FalseDiscoveryRateModel> createFDRComboBox( - SelectionChangedListener<FalseDiscoveryRateModel> changedListener) - { - ComboBox<FalseDiscoveryRateModel> comboBox = new ComboBox<FalseDiscoveryRateModel>(); - ListStore<FalseDiscoveryRateModel> listStore = new ListStore<FalseDiscoveryRateModel>(); - FalseDiscoveryRateModel fdr0 = new FalseDiscoveryRateModel(0.0); - listStore.add(fdr0); - listStore.add(new FalseDiscoveryRateModel(0.01)); - listStore.add(new FalseDiscoveryRateModel(0.025)); - listStore.add(new FalseDiscoveryRateModel(0.05)); - listStore.add(new FalseDiscoveryRateModel(0.1)); - comboBox.setStore(listStore); - comboBox.setDisplayField(SimpleModel.PROPERTY); - comboBox.setValue(fdr0); - comboBox.addSelectionChangedListener(changedListener); - comboBox.setEnabled(true); - comboBox.setWidth(70); - comboBox.setTriggerAction(TriggerAction.ALL); - AbstractImagePrototype infoIcon = - AbstractImagePrototype.create(viewContext.getImageBundle().getInfoIcon()); - FieldUtil.addInfoIcon(comboBox, viewContext.getMessage(Dict.FDR_COMBO_INFO), - infoIcon.createImage(), 3, 3); - return comboBox; - } - - private ComboBox<AggregateFunctionModel> createAggregateFunctionComboBox( - SelectionChangedListener<AggregateFunctionModel> changedListener) - { - ComboBox<AggregateFunctionModel> comboBox = new ComboBox<AggregateFunctionModel>(); - ListStore<AggregateFunctionModel> store = new ListStore<AggregateFunctionModel>(); - AggregateFunctionModel defaultModel = null; - for (AggregateFunction aggregateFunction : AggregateFunction.values()) - { - AggregateFunctionModel model = new AggregateFunctionModel(aggregateFunction); - store.add(model); - if (aggregateFunction == DEFAULT_AGGREGATE_FUNCTION) - { - defaultModel = model; - } - } - comboBox.setStore(store); - comboBox.setDisplayField(SimpleModel.PROPERTY); - comboBox.setValue(defaultModel); - comboBox.addSelectionChangedListener(changedListener); - comboBox.setWidth(100); - comboBox.setEnabled(true); - comboBox.setTriggerAction(TriggerAction.ALL); - return comboBox; - } - - Experiment getExperimentOrNull() - { - return experiment; - } - - void setBrowserGrid(ProteinByExperimentBrowserGrid browserGrid) - { - this.browserGrid = browserGrid; - } - - void setSummaryGrid(ProteinSummaryGrid summaryGrid) - { - this.summaryGrid = summaryGrid; - } - - void update() - { - if (experiment != null) - { - final TechId experimentID = TechId.create(experiment); - browserGrid.setLoadMaskImmediately(true); - browserGrid.setPostRefreshCallback(new IDataRefreshCallback() - { - @Override - public void postRefresh(boolean wasSuccessful) - { - if (summaryGrid != null) - { - summaryGrid.setLoadMaskImmediately(true); - summaryGrid.update(experimentID); - } - } - }); - double falseDiscoveryRate = getSelection(fdrComboBox, 0.0); - AggregateFunction aggregateFunction = - getSelection(aggregateFunctionComboBox, DEFAULT_AGGREGATE_FUNCTION); - VocabularyTermModel value = treatmentTypeComboBox.getValue(); - String treatmentTypeCode = value == null ? null : value.getTerm().getCode(); - AsyncCallback<List<AbundanceColumnDefinition>> callback = - new AbundanceColumnDefinitionsCallback(viewContext, browserGrid, experimentID, - falseDiscoveryRate, aggregateFunction, treatmentTypeCode, - aggregateOriginalCheckBox.getValue()); - viewContext.getService().getAbundanceColumnDefinitionsForProteinByExperiment( - experimentID, treatmentTypeCode, callback); - } - } - - ListProteinByExperimentCriteria getCriteria() - { - ListProteinByExperimentCriteria criteria = new ListProteinByExperimentCriteria(); - criteria.setExperimentID(TechId.create(experiment)); - criteria.setFalseDiscoveryRate(getSelection(fdrComboBox, 0.0)); - criteria.setAggregateFunction(getSelection(aggregateFunctionComboBox, DEFAULT_AGGREGATE_FUNCTION)); - VocabularyTermModel value = treatmentTypeComboBox.getValue(); - String treatmentTypeCode = value == null ? null : value.getTerm().getCode(); - criteria.setTreatmentTypeCode(treatmentTypeCode); - criteria.setAggregateOriginal(aggregateOriginalCheckBox.getValue()); - return criteria; - } - - private <T> T getSelection(ComboBox<? extends SimpleModel<T>> comboBox, T defaultValue) - { - List<? extends SimpleModel<T>> selection = comboBox.getSelection(); - return selection.isEmpty() ? defaultValue : selection.get(0).getObject(); - } - - private static final class AbundanceColumnDefinitionsCallback extends - AbstractAsyncCallback<List<AbundanceColumnDefinition>> - { - private final ProteinByExperimentBrowserGrid browserGrid; - - private final TechId experimentID; - - private final double falseDiscoveryRate; - - private final AggregateFunction aggregateFunction; - - private final String treatmentTypeCode; - - private final boolean aggregateOriginal; - - public AbundanceColumnDefinitionsCallback(IViewContext<?> viewContext, - ProteinByExperimentBrowserGrid browserGrid, TechId experimentID, double falseDiscoveryRate, - AggregateFunction aggregateFunction, String treatmentTypeCode, - boolean aggregateOriginal) - { - super(viewContext); - this.browserGrid = browserGrid; - this.experimentID = experimentID; - this.falseDiscoveryRate = falseDiscoveryRate; - this.aggregateFunction = aggregateFunction; - this.treatmentTypeCode = treatmentTypeCode; - this.aggregateOriginal = aggregateOriginal; - } - - @Override - protected void process(List<AbundanceColumnDefinition> result) - { - browserGrid.update(experimentID, falseDiscoveryRate, aggregateFunction, - treatmentTypeCode, aggregateOriginal, result); - } - - } -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/ProteinByExperimentBrowserGrid.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/ProteinByExperimentBrowserGrid.java deleted file mode 100644 index 0667f7b297b..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/ProteinByExperimentBrowserGrid.java +++ /dev/null @@ -1,240 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.application; - -import java.util.Arrays; -import java.util.List; -import java.util.Set; - -import com.extjs.gxt.ui.client.widget.Component; -import com.extjs.gxt.ui.client.widget.LayoutContainer; -import com.extjs.gxt.ui.client.widget.TabItem; -import com.extjs.gxt.ui.client.widget.TabPanel; -import com.extjs.gxt.ui.client.widget.layout.FitLayout; -import com.extjs.gxt.ui.client.widget.layout.RowData; -import com.extjs.gxt.ui.client.widget.layout.RowLayout; - -import ch.systemsx.cisd.openbis.generic.client.web.client.application.AbstractAsyncCallback; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.AbstractTabItemFactory; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.DispatcherHelper; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.TypedTableGrid; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.ICellListenerAndLinkGenerator; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.IDisposableComponent; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.widget.IDataRefreshCallback; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.IMessageProvider; -import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DefaultResultSetConfig; -import ch.systemsx.cisd.openbis.generic.client.web.client.dto.GenericConstants; -import ch.systemsx.cisd.openbis.generic.client.web.client.dto.TableExportCriteria; -import ch.systemsx.cisd.openbis.generic.client.web.client.dto.TypedTableResultSet; -import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.BasicEntityType; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseModificationKind; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseModificationKind.ObjectKind; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ISerializableComparable; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRowWithObject; -import ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.IPhosphoNetXClientServiceAsync; -import ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.dto.ListProteinByExperimentCriteria; -import ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.dto.ProteinBrowserColumnIDs; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.AbundanceColumnDefinition; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.AggregateFunction; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.ProteinInfo; - -/** - * @author Franz-Josef Elmer - */ -class ProteinByExperimentBrowserGrid extends TypedTableGrid<ProteinInfo> -{ - private static final String PREFIX = GenericConstants.ID_PREFIX - + "protein-by-experiment-browser"; - - // browser consists of the grid and additional toolbars (paging, filtering) - public static final String BROWSER_ID = PREFIX + "_main"; - - public static final String GRID_ID = PREFIX + TypedTableGrid.GRID_POSTFIX; - - private final IViewContext<IPhosphoNetXClientServiceAsync> specificViewContext; - - private final ProteinByExperimentBrowerToolBar toolbar; - - private ListProteinByExperimentCriteria criteria; - - private IDataRefreshCallback postRefreshCallback = new IDataRefreshCallback() - { - @Override - public void postRefresh(boolean wasSuccessful) - { - } - }; - - static IDisposableComponent create( - final IViewContext<IPhosphoNetXClientServiceAsync> viewContext, - BasicEntityType experimentType, Experiment experiment) - { - final IDisposableComponent summaryGrid = ProteinSummaryGrid.create(viewContext); - ProteinByExperimentBrowserGrid browserGrid = - new ProteinByExperimentBrowserGrid(viewContext, experiment); - final IDisposableComponent disposableBrowerGrid = browserGrid.asDisposableWithoutToolbar(); - final ProteinByExperimentBrowerToolBar toolBar = browserGrid.toolbar; - toolBar.setSummaryGrid((ProteinSummaryGrid) summaryGrid.getComponent()); - final LayoutContainer container = new LayoutContainer(); - container.setLayout(new RowLayout()); - container.add(toolBar); - TabPanel tabPanel = new TabPanel(); - tabPanel.add(createTab(disposableBrowerGrid, viewContext, Dict.PROTEIN_BROWSER)); - tabPanel.add(createTab(summaryGrid, viewContext, Dict.PROTEIN_SUMMARY)); - container.add(tabPanel, new RowData(1, 1)); - toolBar.update(); - return new IDisposableComponent() - { - @Override - public void update(Set<DatabaseModificationKind> observedModifications) - { - disposableBrowerGrid.update(observedModifications); - summaryGrid.update(observedModifications); - } - - @Override - public DatabaseModificationKind[] getRelevantModifications() - { - return disposableBrowerGrid.getRelevantModifications(); - } - - @Override - public Component getComponent() - { - return container; - } - - @Override - public void dispose() - { - disposableBrowerGrid.dispose(); - summaryGrid.dispose(); - } - }; - } - - private static TabItem createTab(IDisposableComponent disposableComponent, - IMessageProvider messageProvider, String titleKey) - { - TabItem tabItem = new TabItem(messageProvider.getMessage(titleKey)); - tabItem.setLayout(new FitLayout()); - Component component = disposableComponent.getComponent(); - component.setHeight("100%"); - tabItem.add(component); - return tabItem; - } - - private ProteinByExperimentBrowserGrid( - final IViewContext<IPhosphoNetXClientServiceAsync> viewContext, final Experiment experiment) - { - super(viewContext.getCommonViewContext(), BROWSER_ID, true, - PhosphoNetXDisplayTypeIDGenerator.PROTEIN_BY_EXPERIMENT_BROWSER_GRID); - specificViewContext = viewContext; - toolbar = new ProteinByExperimentBrowerToolBar(viewContext, experiment); - toolbar.setBrowserGrid(this); - registerListenerAndLinkGenerator(ProteinBrowserColumnIDs.ACCESSION_NUMBER, - new ICellListenerAndLinkGenerator<ProteinInfo>() - { - @Override - public void handle(TableModelRowWithObject<ProteinInfo> rowItem, - boolean keyPressed) - { - AbstractTabItemFactory tabItemFactory = - ProteinViewer.createTabItemFactory(viewContext, - toolbar.getExperimentOrNull(), - rowItem.getObjectOrNull()); - tabItemFactory.setInBackground(keyPressed); - DispatcherHelper.dispatchNaviEvent(tabItemFactory); - } - - @Override - public String tryGetLink(ProteinInfo entity, - ISerializableComparable comparableValue) - { - return ProteinViewLocatorResolver.createLink(experiment, entity); - } - }); - } - - void update(TechId experimentID, double falseDiscoveryRate, - AggregateFunction aggregateFunction, String treatmentTypeCode, - boolean aggregateOriginal, List<AbundanceColumnDefinition> definitions) - { - criteria = new ListProteinByExperimentCriteria(); - criteria.setExperimentID(experimentID); - criteria.setFalseDiscoveryRate(falseDiscoveryRate); - criteria.setAggregateFunction(aggregateFunction); - criteria.setTreatmentTypeCode(treatmentTypeCode); - criteria.setAggregateOriginal(aggregateOriginal); - refresh(postRefreshCallback, true); - } - - void setPostRefreshCallback(IDataRefreshCallback postRefreshCallback) - { - this.postRefreshCallback = postRefreshCallback; - } - - @Override - protected String translateColumnIdToDictionaryKey(String columnID) - { - return columnID.toLowerCase(); - } - - @Override - protected List<String> getColumnIdsOfFilters() - { - return Arrays.asList(ProteinBrowserColumnIDs.PROTEIN_DESCRIPTION); - } - - @Override - protected void listTableRows( - DefaultResultSetConfig<String, TableModelRowWithObject<ProteinInfo>> resultSetConfig, - AbstractAsyncCallback<TypedTableResultSet<ProteinInfo>> callback) - { - if (criteria == null) - { - criteria = toolbar.getCriteria(); - } - criteria.copyPagingConfig(resultSetConfig); - specificViewContext.getService().listProteinsByExperiment(criteria, callback); - } - - @Override - protected void prepareExportEntities(TableExportCriteria<TableModelRowWithObject<ProteinInfo>> exportCriteria, - AbstractAsyncCallback<String> callback) - { - specificViewContext.getService().prepareExportProteins(exportCriteria, callback); - } - - @Override - public void update(Set<DatabaseModificationKind> observedModifications) - { - toolbar.update(); - } - - @Override - public DatabaseModificationKind[] getRelevantModifications() - { - return new DatabaseModificationKind[] - { DatabaseModificationKind.createOrDelete(ObjectKind.DATA_SET), - DatabaseModificationKind.edit(ObjectKind.SAMPLE) }; - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/ProteinRelatedSampleGrid.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/ProteinRelatedSampleGrid.java deleted file mode 100644 index 0c430904fc7..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/ProteinRelatedSampleGrid.java +++ /dev/null @@ -1,133 +0,0 @@ -/* - * Copyright 2008 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.application; - -import java.util.Arrays; -import java.util.List; - -import com.extjs.gxt.ui.client.widget.LayoutContainer; - -import ch.systemsx.cisd.openbis.generic.client.web.client.application.AbstractAsyncCallback; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.DisplayTypeIDGenerator; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.TypedTableGrid; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.columns.framework.LinkExtractor; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.ICellListenerAndLinkGenerator; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.IDisposableComponent; -import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DefaultResultSetConfig; -import ch.systemsx.cisd.openbis.generic.client.web.client.dto.GenericConstants; -import ch.systemsx.cisd.openbis.generic.client.web.client.dto.TableExportCriteria; -import ch.systemsx.cisd.openbis.generic.client.web.client.dto.TypedTableResultSet; -import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ISerializableComparable; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRowWithObject; -import ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.IPhosphoNetXClientServiceAsync; -import ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.dto.ListSampleAbundanceByProteinCriteria; -import ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.dto.ProteinRelatedSampleGridColumnIDs; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.ProteinRelatedSample; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.SampleWithPropertiesAndAbundance; - -/** - * A {@link LayoutContainer} which contains the grid where {@link SampleWithPropertiesAndAbundance}s of specified Protein are displayed. - * - * @author Piotr Buczek - */ -public class ProteinRelatedSampleGrid extends TypedTableGrid<ProteinRelatedSample> -{ - private static final String PREFIX = GenericConstants.ID_PREFIX + "protein_related_sample_grid"; - - // browser consists of the grid and additional toolbars (paging, filtering) - public static final String BROWSER_ID = PREFIX + "_main"; - - public static final String GRID_ID = PREFIX + TypedTableGrid.GRID_POSTFIX; - - public static final String EDIT_BUTTON_ID = BROWSER_ID + "_edit-button"; - - public static final String SHOW_DETAILS_BUTTON_ID = BROWSER_ID + "_show-details-button"; - - private final IViewContext<IPhosphoNetXClientServiceAsync> phosphoViewContext; - - public static IDisposableComponent createGridForProteinSamples( - final IViewContext<IPhosphoNetXClientServiceAsync> viewContext, - final TechId proteinReferenceID, Long experimentIDOrNull, final String gridId) - { - final ListSampleAbundanceByProteinCriteria criteria = - new ListSampleAbundanceByProteinCriteria(); - criteria.setProteinReferenceID(proteinReferenceID); - criteria.setExperimentID(experimentIDOrNull); - final ProteinRelatedSampleGrid browserGrid = - new ProteinRelatedSampleGrid(viewContext, criteria, gridId); - return browserGrid.asDisposableWithoutToolbar(); - } - - private ListSampleAbundanceByProteinCriteria criteria; - - private ProteinRelatedSampleGrid( - final IViewContext<IPhosphoNetXClientServiceAsync> viewContext, - ListSampleAbundanceByProteinCriteria criteria, String gridId) - { - super(viewContext.getCommonViewContext(), gridId, true, - DisplayTypeIDGenerator.SAMPLE_DETAILS_GRID); - this.phosphoViewContext = viewContext; - setId(BROWSER_ID); - this.criteria = criteria; - registerListenerAndLinkGenerator(ProteinRelatedSampleGridColumnIDs.SAMPLE_IDENTIFIER, - new ICellListenerAndLinkGenerator<ProteinRelatedSample>() - { - - @Override - public void handle(TableModelRowWithObject<ProteinRelatedSample> rowItem, - boolean specialKeyPressed) - { - showEntityInformationHolderViewer(rowItem.getObjectOrNull(), false, - specialKeyPressed); - } - - @Override - public String tryGetLink(ProteinRelatedSample entity, - ISerializableComparable comparableValue) - { - return LinkExtractor.tryExtract(entity); - } - }); - } - - @Override - protected void listTableRows( - DefaultResultSetConfig<String, TableModelRowWithObject<ProteinRelatedSample>> resultSetConfig, - AbstractAsyncCallback<TypedTableResultSet<ProteinRelatedSample>> callback) - { - criteria.copyPagingConfig(resultSetConfig); - phosphoViewContext.getService().listProteinRelatedSamplesByProtein(criteria, callback); - } - - @Override - protected List<String> getColumnIdsOfFilters() - { - return Arrays.asList(ProteinRelatedSampleGridColumnIDs.SAMPLE_IDENTIFIER, - ProteinRelatedSampleGridColumnIDs.ABUNDANCE); - } - - @Override - protected void prepareExportEntities( - TableExportCriteria<TableModelRowWithObject<ProteinRelatedSample>> exportCriteria, - AbstractAsyncCallback<String> callback) - { - phosphoViewContext.getService().prepareExportProteinRelatedSamples(exportCriteria, callback); - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/ProteinRenderers.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/ProteinRenderers.java deleted file mode 100644 index ce30c2960cf..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/ProteinRenderers.java +++ /dev/null @@ -1,265 +0,0 @@ -/* - * Copyright 2007 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.application; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import com.extjs.gxt.ui.client.widget.Text; -import com.google.gwt.user.client.ui.FlowPanel; -import com.google.gwt.user.client.ui.InlineHTML; -import com.google.gwt.user.client.ui.Widget; - -import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.PropertyValueRenderers.EntityInformationHolderPropertyValueRenderer; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.property.AbstractPropertyValueRenderer; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.property.IPropertyValueRenderer; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.widget.ExternalHyperlink; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.IMessageProvider; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment; -import ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.application.ProteinViewer.DatasetInformationHolder; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.AccessionNumberProvider; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.Occurrence; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.OccurrenceUtil; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.Peptide; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.PeptideModification; - -/** - * Utility method for creating {@link IPropertyValueRenderer} instances or directly rendering stuff in {@link ProteinViewer}. - * - * @author Tomasz Pylak - * @author Franz-Josef Elmer - */ -public final class ProteinRenderers -{ - private static final class Symbol - { - private final char character; - - private boolean inPeptide; - - private Double mass; - - Symbol(char character) - { - this.character = character; - } - - public char getCharacter() - { - return character; - } - - public boolean isInPeptide() - { - return inPeptide; - } - - public void inPeptide() - { - this.inPeptide = true; - } - - public Double getMass() - { - return mass; - } - - public void setMass(Double mass) - { - this.mass = mass; - } - } - - private ProteinRenderers() - { - // Can not be instantiated - } - - /** - * Allows to render a property identifier which is a link to an external page with a description. - */ - public final static IPropertyValueRenderer<AccessionNumberProvider> createProteinIdentLinkRenderer( - final IViewContext<?> viewContext) - { - return new AccessionNumberRenderer(viewContext); - } - - public final static IPropertyValueRenderer<Peptide> createPeptideRenderer( - final IViewContext<?> viewContext) - { - return new PeptideRenderer(viewContext); - } - - public final static IPropertyValueRenderer<Experiment> createExperimentPropertyValueRenderer( - final IViewContext<?> viewContext) - { - return ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.PropertyValueRenderers - .createExperimentPropertyValueRenderer(viewContext); - } - - public final static IPropertyValueRenderer<DatasetInformationHolder> createEntityInformationPropertyValueRenderer( - final IViewContext<?> viewContext) - { - return new EntityInformationHolderPropertyValueRenderer<DatasetInformationHolder>( - viewContext); - } - - public static String getFixedWidthHTMLString(String text) - { - return "<font style='font-family:monospace'>" + text + "</font>"; - } - - /** Produces an HTML code with all occurrences properly marked */ - public static String markOccurrencesWithHtml(String proteinSequence, List<Peptide> peptides, - int blockLength) - { - List<Symbol> symbols = createSymbols(proteinSequence, peptides); - StringBuilder builder = new StringBuilder(); - boolean inPeptide = false; - for (int i = 0, n = symbols.size(); i < n; i++) - { - if (i > 0) - { - if (i % blockLength == 0) - { - builder.append(" "); - } - } - Symbol symbol = symbols.get(i); - boolean nextInPeptide = symbol.isInPeptide(); - if (inPeptide != nextInPeptide) - { - builder.append(nextInPeptide ? "<font color='red'>" : "</font>"); - } - inPeptide = nextInPeptide; - Double mass = symbol.getMass(); - char character = symbol.getCharacter(); - if (mass == null) - { - builder.append(character); - } else - { - builder.append(renderAminoAcidSymbol(character, i + 1, mass)); - } - - } - return builder.toString(); - } - - public static String renderAminoAcidSymbol(char character, Integer positionOrNull, double mass) - { - String tooltip = positionOrNull == null ? "" : "position=" + positionOrNull + ", "; - tooltip += "mass=" + mass; - - return "<font style='text-decoration:underline; cursor:pointer' color='blue' title='" - + tooltip + "'>" + character + "</font>"; - } - - private static List<Symbol> createSymbols(String proteinSequence, List<Peptide> peptides) - { - List<Symbol> symbols = new ArrayList<Symbol>(); - for (int i = 0, n = proteinSequence.length(); i < n; i++) - { - symbols.add(new Symbol(proteinSequence.charAt(i))); - } - - for (Peptide peptide : peptides) - { - List<Occurrence> occurances = - OccurrenceUtil.findAllOccurrences(proteinSequence, peptide.getSequence()); - List<PeptideModification> modifications = peptide.getModifications(); - for (Occurrence occurrence : occurances) - { - int startIndex = occurrence.getStartIndex(); - for (int i = startIndex, n = occurrence.getEndIndex(); i <= n; i++) - { - symbols.get(i).inPeptide(); - } - for (PeptideModification peptideModification : modifications) - { - Symbol symbol = symbols.get(startIndex + peptideModification.getPosition() - 1); - symbol.setMass(peptideModification.getMass()); - } - } - } - return symbols; - } - - private final static class AccessionNumberRenderer extends - AbstractPropertyValueRenderer<AccessionNumberProvider> - { - - AccessionNumberRenderer(final IMessageProvider messageProvider) - { - super(messageProvider); - } - - @Override - public Widget getAsWidget(AccessionNumberProvider object) - { - String accessionNumber = object.getAccessionNumber(); - String type = object.getAccessionNumberType(); - String url = AccessionNumberURLCreator.tryToCreateURL(type, accessionNumber); - if (url == null) - { - return new Text(accessionNumber); - } - return new ExternalHyperlink(accessionNumber, url); - } - } - - private final static class PeptideRenderer extends AbstractPropertyValueRenderer<Peptide> - { - - PeptideRenderer(final IMessageProvider messageProvider) - { - super(messageProvider); - } - - @Override - public Widget getAsWidget(Peptide peptide) - { - StringBuilder builder = new StringBuilder(); - String sequence = peptide.getSequence(); - List<PeptideModification> modifications = peptide.getModifications(); - Map<Integer, PeptideModification> modificationsMap = new HashMap<Integer, PeptideModification>(); - for (PeptideModification modification : modifications) - { - modificationsMap.put(modification.getPosition(), modification); - } - for (int i = 0, n = sequence.length(); i < n; i++) - { - char c = sequence.charAt(i); - PeptideModification peptideModification = modificationsMap.get(i + 1); - if (peptideModification != null) - { - builder.append(renderAminoAcidSymbol(c, null, peptideModification.getMass())); - } else - { - builder.append(c); - } - } - final FlowPanel panel = new FlowPanel(); - panel.add(new InlineHTML(getFixedWidthHTMLString(builder.toString()))); - return panel; - } - - } -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/ProteinSamplesSection.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/ProteinSamplesSection.java deleted file mode 100644 index 365c2d64c71..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/ProteinSamplesSection.java +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright 2008 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.application; - -import com.extjs.gxt.ui.client.widget.ContentPanel; -import com.extjs.gxt.ui.client.widget.layout.FitLayout; - -import ch.systemsx.cisd.openbis.generic.client.web.client.application.Dict; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.TabContent; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.IDatabaseModificationObserver; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.IDisposableComponent; -import ch.systemsx.cisd.openbis.generic.client.web.client.dto.GenericConstants; -import ch.systemsx.cisd.openbis.generic.shared.basic.IIdAndCodeHolder; -import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; -import ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.IPhosphoNetXClientServiceAsync; - -/** - * {@link TabContent} containing specified protein samples. - * - * @author Piotr Buczek - */ -public class ProteinSamplesSection extends ContentPanel -{ - private static final String PREFIX = "protein-samples-section_"; - - public static final String ID_PREFIX = GenericConstants.ID_PREFIX + PREFIX; - - private IDisposableComponent disposableComponent; - - public ProteinSamplesSection(final IViewContext<IPhosphoNetXClientServiceAsync> viewContext, - final TechId proteinReferenceID, IIdAndCodeHolder experimentOrNull) - { - setHeading(viewContext.getMessage(Dict.SAMPLES)); - setHeaderVisible(true); - setCollapsible(true); - setAnimCollapse(false); - setBodyBorder(true); - setLayout(new FitLayout()); - Long experimentID = experimentOrNull == null ? null : experimentOrNull.getId(); - disposableComponent = ProteinRelatedSampleGrid.createGridForProteinSamples(viewContext, - proteinReferenceID, experimentID, createGridId(proteinReferenceID)); - add(disposableComponent.getComponent()); - } - - // @Private - static String createGridId(TechId containerId) - { - return ID_PREFIX + containerId + "-grid"; - } - - @Override - protected void onDetach() - { - if (disposableComponent != null) - { - disposableComponent.dispose(); - } - super.onDetach(); - } - - IDatabaseModificationObserver tryGetDatabaseModificationObserver() - { - return disposableComponent; - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/ProteinSequenceGrid.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/ProteinSequenceGrid.java deleted file mode 100644 index 05f9e20152d..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/ProteinSequenceGrid.java +++ /dev/null @@ -1,109 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.application; - -import java.util.Arrays; -import java.util.List; - -import ch.systemsx.cisd.openbis.generic.client.web.client.application.AbstractAsyncCallback; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.TypedTableGrid; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.IDisposableComponent; -import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DefaultResultSetConfig; -import ch.systemsx.cisd.openbis.generic.client.web.client.dto.GenericConstants; -import ch.systemsx.cisd.openbis.generic.client.web.client.dto.TableExportCriteria; -import ch.systemsx.cisd.openbis.generic.client.web.client.dto.TypedTableResultSet; -import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseModificationKind; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRowWithObject; -import ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.IPhosphoNetXClientServiceAsync; -import ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.dto.ListProteinSequenceCriteria; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.ProteinSequence; - -/** - * @author Franz-Josef Elmer - */ -public class ProteinSequenceGrid extends TypedTableGrid<ProteinSequence> -{ - private static final String PREFIX = GenericConstants.ID_PREFIX + "protein-sequence-browser"; - - public static final String BROWSER_ID = PREFIX + "_main"; - - public static final String GRID_ID = PREFIX + TypedTableGrid.GRID_POSTFIX; - - static IDisposableComponent create(IViewContext<IPhosphoNetXClientServiceAsync> viewContext, - Experiment experimentOrNull, TechId proteinReferenceID) - { - return new ProteinSequenceGrid(viewContext, experimentOrNull, proteinReferenceID) - .asDisposableWithoutToolbar(); - } - - private final IViewContext<IPhosphoNetXClientServiceAsync> specificViewContext; - - private ListProteinSequenceCriteria criteria; - - private ProteinSequenceGrid(IViewContext<IPhosphoNetXClientServiceAsync> viewContext, - Experiment experimentOrNull, TechId proteinReferenceID) - { - super(viewContext.getCommonViewContext(), BROWSER_ID + proteinReferenceID, true, - PhosphoNetXDisplayTypeIDGenerator.PROTEIN_SEQUENCE_BROWSER_GRID); - specificViewContext = viewContext; - criteria = new ListProteinSequenceCriteria(); - if (experimentOrNull != null) - { - criteria.setExperimentID(new TechId(experimentOrNull.getId())); - } - criteria.setProteinReferenceID(proteinReferenceID); - } - - @Override - protected String translateColumnIdToDictionaryKey(String columnID) - { - return columnID.toLowerCase(); - } - - @Override - protected List<String> getColumnIdsOfFilters() - { - return Arrays.asList(); - } - - @Override - protected void listTableRows( - DefaultResultSetConfig<String, TableModelRowWithObject<ProteinSequence>> resultSetConfig, - AbstractAsyncCallback<TypedTableResultSet<ProteinSequence>> callback) - { - criteria.copyPagingConfig(resultSetConfig); - specificViewContext.getService().listSequencesByProteinReference(criteria, callback); - } - - @Override - protected void prepareExportEntities( - TableExportCriteria<TableModelRowWithObject<ProteinSequence>> exportCriteria, - AbstractAsyncCallback<String> callback) - { - specificViewContext.getService().prepareExportProteinSequences(exportCriteria, callback); - } - - @Override - public DatabaseModificationKind[] getRelevantModifications() - { - return new DatabaseModificationKind[0]; - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/ProteinSummaryGrid.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/ProteinSummaryGrid.java deleted file mode 100644 index 6dc527a0d59..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/ProteinSummaryGrid.java +++ /dev/null @@ -1,112 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.application; - -import java.util.Arrays; -import java.util.List; - -import ch.systemsx.cisd.openbis.generic.client.web.client.application.AbstractAsyncCallback; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.TypedTableGrid; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.IDisposableComponent; -import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DefaultResultSetConfig; -import ch.systemsx.cisd.openbis.generic.client.web.client.dto.GenericConstants; -import ch.systemsx.cisd.openbis.generic.client.web.client.dto.TableExportCriteria; -import ch.systemsx.cisd.openbis.generic.client.web.client.dto.TypedTableResultSet; -import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseModificationKind; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRowWithObject; -import ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.IPhosphoNetXClientServiceAsync; -import ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.dto.ListProteinSummaryByExperimentCriteria; -import ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.dto.ProteinSummaryGridColumnIDs; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.ProteinSummary; - -/** - * @author Franz-Josef Elmer - */ -class ProteinSummaryGrid extends TypedTableGrid<ProteinSummary> -{ - private static final String PREFIX = - GenericConstants.ID_PREFIX + "protein-summary"; - - // browser consists of the grid and additional toolbars (paging, filtering) - public static final String BROWSER_ID = PREFIX + "_main"; - - public static final String GRID_ID = PREFIX + TypedTableGrid.GRID_POSTFIX; - - static IDisposableComponent create(IViewContext<IPhosphoNetXClientServiceAsync> viewContext) - { - return new ProteinSummaryGrid(viewContext).asDisposableWithoutToolbar(); - } - - private final IViewContext<IPhosphoNetXClientServiceAsync> specificViewContext; - - private ListProteinSummaryByExperimentCriteria criteria; - - ProteinSummaryGrid(IViewContext<IPhosphoNetXClientServiceAsync> viewContext) - { - super(viewContext.getCommonViewContext(), BROWSER_ID, true, - PhosphoNetXDisplayTypeIDGenerator.PROTEIN_SUMMARY_BROWSER_GRID); - specificViewContext = viewContext; - } - - void update(TechId experimentID) - { - criteria = new ListProteinSummaryByExperimentCriteria(); - criteria.setExperimentID(experimentID); - refresh(true); - } - - @Override - protected String translateColumnIdToDictionaryKey(String columnID) - { - return ProteinSummaryGridColumnIDs.FDR.equals(columnID) ? "false_discovery_rate_column" - : columnID.toLowerCase(); - } - - @Override - protected List<String> getColumnIdsOfFilters() - { - return Arrays.asList(ProteinSummaryGridColumnIDs.FDR); - } - - @Override - protected void listTableRows( - DefaultResultSetConfig<String, TableModelRowWithObject<ProteinSummary>> resultSetConfig, - AbstractAsyncCallback<TypedTableResultSet<ProteinSummary>> callback) - { - if (criteria != null) - { - criteria.copyPagingConfig(resultSetConfig); - specificViewContext.getService().listProteinSummariesByExperiment(criteria, callback); - } - } - - @Override - protected void prepareExportEntities(TableExportCriteria<TableModelRowWithObject<ProteinSummary>> exportCriteria, - AbstractAsyncCallback<String> callback) - { - specificViewContext.getService().prepareExportProteinSummary(exportCriteria, callback); - } - - @Override - public DatabaseModificationKind[] getRelevantModifications() - { - return new DatabaseModificationKind[0]; - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/ProteinViewLocatorResolver.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/ProteinViewLocatorResolver.java deleted file mode 100644 index f6d7f3eea2d..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/ProteinViewLocatorResolver.java +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright 2011 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.application; - -import ch.systemsx.cisd.openbis.generic.client.web.client.application.AbstractAsyncCallback; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.AbstractTabItemFactory; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.DispatcherHelper; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.locator.AbstractViewLocatorResolver; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.locator.ViewLocator; -import ch.systemsx.cisd.openbis.generic.client.web.client.exception.UserFailureException; -import ch.systemsx.cisd.openbis.generic.shared.basic.BasicConstant; -import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; -import ch.systemsx.cisd.openbis.generic.shared.basic.URLMethodWithParameters; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment; -import ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.IPhosphoNetXClientServiceAsync; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.ProteinByExperiment; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.ProteinInfo; - -/** - * Locator resolver for protein details view. - * - * @author Franz-Josef Elmer - */ -public class ProteinViewLocatorResolver extends AbstractViewLocatorResolver -{ - private static final String ACTION = "PROTEIN"; - - private static final String EXPERIMENT_PERM_ID = "experimentPermId"; - - private static final String PROTEIN_ID = "id"; - - private final IViewContext<IPhosphoNetXClientServiceAsync> viewContext; - - public ProteinViewLocatorResolver(IViewContext<IPhosphoNetXClientServiceAsync> viewContext) - { - super(ACTION); - this.viewContext = viewContext; - } - - @Override - public void resolve(ViewLocator locator) throws UserFailureException - { - String experimentPermID = getMandatoryParameter(locator, EXPERIMENT_PERM_ID); - final TechId proteinID = new TechId(new Long(getMandatoryParameter(locator, PROTEIN_ID))); - viewContext.log("resolve protein " + proteinID + " for experiment " + experimentPermID); - viewContext.getCommonService().getExperimentInfoByPermId(experimentPermID, - new AbstractAsyncCallback<Experiment>(viewContext) - { - @Override - protected void process(final Experiment experiment) - { - IPhosphoNetXClientServiceAsync service = - ProteinViewLocatorResolver.this.viewContext.getService(); - service.getProteinByExperiment(new TechId(experiment.getId()), - proteinID, new AbstractAsyncCallback<ProteinByExperiment>( - viewContext) - { - @Override - protected void process(final ProteinByExperiment protein) - { - AbstractTabItemFactory tabItemFactory = - ProteinViewer - .createTabItemFactory( - ProteinViewLocatorResolver.this.viewContext, - experiment, protein); - DispatcherHelper.dispatchNaviEvent(tabItemFactory); - } - - }); - } - }); - } - - static String createLink(final Experiment experiment, ProteinInfo entity) - { - URLMethodWithParameters url = new URLMethodWithParameters(""); - url.addParameter((String) BasicConstant.LOCATOR_ACTION_PARAMETER, ACTION); - url.addParameter(ProteinViewLocatorResolver.EXPERIMENT_PERM_ID, - experiment.getPermId()); - url.addParameter(ProteinViewLocatorResolver.PROTEIN_ID, - Long.toString(entity.getId().getId())); - return url.toStringWithoutDelimiterPrefix(); - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/ProteinViewer.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/ProteinViewer.java deleted file mode 100644 index d061ad1f615..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/ProteinViewer.java +++ /dev/null @@ -1,454 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.application; - -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import com.extjs.gxt.ui.client.Style.LayoutRegion; -import com.extjs.gxt.ui.client.Style.Scroll; -import com.extjs.gxt.ui.client.widget.ContentPanel; -import com.extjs.gxt.ui.client.widget.LayoutContainer; -import com.extjs.gxt.ui.client.widget.TabItem; -import com.extjs.gxt.ui.client.widget.TabPanel; -import com.extjs.gxt.ui.client.widget.layout.BorderLayout; -import com.extjs.gxt.ui.client.widget.layout.BorderLayoutData; -import com.extjs.gxt.ui.client.widget.layout.FitLayout; -import com.extjs.gxt.ui.client.widget.layout.RowData; -import com.extjs.gxt.ui.client.widget.layout.RowLayout; - -import ch.systemsx.cisd.common.shared.basic.string.StringUtils; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.AbstractAsyncCallback; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.AsyncCallbackWithProgressBar; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.DisposableTabContent; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.AbstractTabItemFactory; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.CompositeDatabaseModificationObserver; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.DatabaseModificationAwareComponent; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.DefaultTabItem; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.IDatabaseModificationObserver; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.ITabItem; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.help.HelpPageIdentifier; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.AbstractViewerWithVerticalSplit; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.RowLayoutManager; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.IDisposableComponent; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.property.PropertyGrid; -import ch.systemsx.cisd.openbis.generic.client.web.client.dto.GenericConstants; -import ch.systemsx.cisd.openbis.generic.shared.basic.IEntityInformationHolder; -import ch.systemsx.cisd.openbis.generic.shared.basic.IEntityInformationHolderWithIdentifier; -import ch.systemsx.cisd.openbis.generic.shared.basic.IIdAndCodeHolder; -import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetType; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseModificationKind; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityType; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ServiceVersionHolder; -import ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.IPhosphoNetXClientServiceAsync; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.IBasicProteinInfo; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.IndistinguishableProteinInfo; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.Peptide; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.ProteinByExperiment; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.ProteinDetails; - -/** - * @author Franz-Josef Elmer - */ -public class ProteinViewer extends AbstractViewerWithVerticalSplit<IEntityInformationHolder> - implements IDatabaseModificationObserver -{ - private static final int AMINOACIDS_IN_ONE_BLOCK = 10; - - private static final String PREFIX = "protein-viewer_"; - - public static final String ID_PREFIX = GenericConstants.ID_PREFIX + PREFIX; - - static AbstractTabItemFactory createTabItemFactory( - final IViewContext<IPhosphoNetXClientServiceAsync> viewContext, - final Experiment experiment, final IBasicProteinInfo proteinInfo) - { - return new AbstractTabItemFactory() - { - @Override - public String getId() - { - return createWidgetID(experiment, proteinInfo.getId()); - } - - @Override - public ITabItem create() - { - ProteinViewer viewer = new ProteinViewer(viewContext, experiment, proteinInfo); - DatabaseModificationAwareComponent c = - new DatabaseModificationAwareComponent(viewer, viewer); - return DefaultTabItem.create(getTabTitle(), c, viewContext, false); - } - - @Override - public HelpPageIdentifier getHelpPageIdentifier() - { - return HelpPageIdentifier.createSpecific("Protein Viewer"); - } - - @Override - public String getTabTitle() - { - String description = getAbbreviatedDescription(proteinInfo); - String identifier = experiment == null ? "?" : experiment.getCode(); - return viewContext.getMessage(Dict.PROTEIN_IN_EXPERIMENT_TAB_LABEL, - description, identifier); - } - - @Override - public String tryGetLink() - { - return null; - } - }; - } - - private static String getAbbreviatedDescription(final IBasicProteinInfo proteinInfo) - { - String info = proteinInfo.getDescription(); - if (info == null) - { - info = proteinInfo.getAccessionNumber(); - } - return StringUtils.abbreviate(info, 30); - } - - static String createWidgetID(IIdAndCodeHolder experimentIdOrNull, TechId proteinReferenceID) - { - Long experimentID = experimentIdOrNull == null ? null : experimentIdOrNull.getId(); - return ID_PREFIX + experimentID + "_" + proteinReferenceID.getId(); - } - - private final Experiment experimentOrNull; - - private final IBasicProteinInfo proteinInfo; - - private final TechId proteinReferenceID; - - private ProteinSamplesSection proteinSamplesSection; - - private ProteinViewer(IViewContext<IPhosphoNetXClientServiceAsync> viewContext, - Experiment experiment, IBasicProteinInfo proteinInfo) - { - super(viewContext, "", createWidgetID(experiment, proteinInfo.getId()), false); - this.experimentOrNull = experiment; - this.proteinInfo = proteinInfo; - this.proteinReferenceID = proteinInfo.getId(); - reloadAllData(); - } - - @Override - @SuppressWarnings("unchecked") - protected final IViewContext<IPhosphoNetXClientServiceAsync> getViewContext() - { - return (IViewContext<IPhosphoNetXClientServiceAsync>) viewContext; - } - - @Override - protected void reloadAllData() - { - if (experimentOrNull != null) - { - final IViewContext<IPhosphoNetXClientServiceAsync> context = getViewContext(); - ProteinByExperimentCallback callback = new ProteinByExperimentCallback(context, this); - String message = - context.getMessage(Dict.PROTEIN_DETAILS_WAITING_MESSAGE, - proteinInfo.getAccessionNumber()); - context.getService().getProteinByExperiment(new TechId(experimentOrNull.getId()), - proteinReferenceID, AsyncCallbackWithProgressBar.decorate(callback, message)); - } - } - - private void recreateUI(ProteinByExperiment protein) - { - setLayout(new BorderLayout()); - removeAll(); - setScrollMode(Scroll.AUTO); - ContentPanel propertyPanel = createPropertyPanel(protein); - - ProteinDetails details = protein.getDetails(); - if (details == null) - { - recreateUIWithDatasetTable(protein, propertyPanel); - } else - { - LayoutContainer centerPanel = new LayoutContainer(); - RowLayoutManager rowDataManager = new RowLayoutManager(centerPanel, new RowLayout()); - add(centerPanel, createBorderLayoutData(LayoutRegion.CENTER)); - rowDataManager.addToContainer(propertyPanel, new RowData(1, 0.5f)); - List<IndistinguishableProteinInfo> indistinguishableProteins = - details.getIndistinguishableProteinInfos(); - if (indistinguishableProteins.isEmpty() == false) - { - List<Peptide> peptides = details.getPeptides(); - ContentPanel panel = - createIndistinguishableProteinsSection(indistinguishableProteins, peptides); - rowDataManager.addToContainer(panel, new RowData(1, 0.3f)); - } - proteinSamplesSection = - new ProteinSamplesSection(getViewContext(), proteinReferenceID, - experimentOrNull); - rowDataManager.addToContainer(proteinSamplesSection, new RowData(1, 0.2f)); - layout(); - } - } - - private ContentPanel createIndistinguishableProteinsSection( - List<IndistinguishableProteinInfo> indistinguishableProteins, List<Peptide> peptides) - { - ContentPanel panel = new ContentPanel(new RowLayout()); - panel.setHeading(viewContext.getMessage(Dict.INDISTINGUISHABLE_PROTEINS)); - panel.setCollapsible(true); - panel.setHeight("100%"); - TabPanel tabPanel = new TabPanel(); - tabPanel.setTabScroll(true); - for (IndistinguishableProteinInfo info : indistinguishableProteins) - { - String accessionNumber = info.getAccessionNumber(); - TabItem item = new TabItem(accessionNumber); - item.setLayout(new FitLayout()); - PropertyGrid propertyGrid = new PropertyGrid(viewContext, 4, "200"); - final Map<String, Object> properties = new LinkedHashMap<String, Object>(); - properties.put(viewContext.getMessage(Dict.ACCESSION_NUMBER), info); - propertyGrid.registerPropertyValueRenderer(IndistinguishableProteinInfo.class, - ProteinRenderers.createProteinIdentLinkRenderer(viewContext)); - properties.put(viewContext.getMessage(Dict.PROTEIN_DESCRIPTION), info.getDescription()); - String markedSequence = markPeptides(info.getSequence(), peptides); - properties.put(viewContext.getMessage(Dict.SEQUENCE_NAME), markedSequence); - properties.put(viewContext.getMessage(Dict.COVERAGE), info.getCoverage()); - propertyGrid.setProperties(properties); - ContentPanel contentPanel = new ContentPanel(); - contentPanel.setHeight("100%"); - contentPanel.setScrollMode(Scroll.AUTO); - contentPanel.add(propertyGrid); - item.add(contentPanel); - tabPanel.add(item); - } - panel.add(tabPanel, new RowData(1, 1)); - return panel; - } - - private void recreateUIWithDatasetTable(ProteinByExperiment protein, ContentPanel propertyPanel) - { - BorderLayoutData layoutData = createBorderLayoutData(LayoutRegion.WEST); - layoutData.setSize(400); - add(propertyPanel, layoutData); - DisposableTabContent sequencesSection = - new DisposableTabContent(viewContext.getMessage(Dict.SEQUENCES), viewContext, - proteinReferenceID) - { - @Override - protected IDisposableComponent createDisposableContent() - { - return ProteinSequenceGrid.create(ProteinViewer.this.getViewContext(), - experimentOrNull, proteinReferenceID); - } - }; - add(sequencesSection, createRightBorderLayoutData()); - DisposableTabContent proteinsSection = - new DisposableTabContent(viewContext.getMessage(Dict.DATA_SET_PROTEINS), - viewContext, proteinReferenceID) - { - @Override - protected IDisposableComponent createDisposableContent() - { - return DataSetProteinGrid.create(ProteinViewer.this.getViewContext(), - experimentOrNull, proteinReferenceID); - } - }; - add(proteinsSection, createBorderLayoutData(LayoutRegion.SOUTH)); - layout(); - sequencesSection.setContentVisible(true); - proteinsSection.setContentVisible(true); - } - - private ContentPanel createPropertyPanel(ProteinByExperiment protein) - { - PropertyGrid propertyGrid = createPropertyGrid(protein); - ContentPanel contentPanel = new ContentPanel(); - contentPanel.setHeading(viewContext.getMessage(Dict.PRIMARY_PROTEIN)); - contentPanel.setScrollMode(Scroll.AUTO); - contentPanel.setCollapsible(true); - contentPanel.add(propertyGrid); - return contentPanel; - } - - private PropertyGrid createPropertyGrid(ProteinByExperiment protein) - { - final Map<String, Object> properties = new LinkedHashMap<String, Object>(); - PropertyGrid propertyGrid = new PropertyGrid(viewContext, 0, "200"); - if (experimentOrNull != null) - { - properties.put(viewContext.getMessage(Dict.EXPERIMENT_LABEL), experimentOrNull); - } - properties.put(viewContext.getMessage(Dict.ACCESSION_NUMBER), protein); - propertyGrid.registerPropertyValueRenderer(ProteinByExperiment.class, - ProteinRenderers.createProteinIdentLinkRenderer(viewContext)); - - properties.put(viewContext.getMessage(Dict.PROTEIN_DESCRIPTION), protein.getDescription()); - if (protein.getDetails() != null) - { - addProteinDetails(properties, propertyGrid, protein.getDetails()); - } - - propertyGrid.resizeRows(properties.size()); - propertyGrid.setProperties(properties); - return propertyGrid; - } - - private void addProteinDetails(Map<String, Object> properties, PropertyGrid propertyGrid, - ProteinDetails proteinDetails) - { - properties.put(viewContext.getMessage(Dict.DATABASE_NAME_AND_VERSION), - proteinDetails.getDatabaseNameAndVersion()); - String markedSequence = - markPeptides(proteinDetails.getSequence(), proteinDetails.getPeptides()); - properties.put(viewContext.getMessage(Dict.SEQUENCE_NAME), markedSequence); - - properties.put(viewContext.getMessage(Dict.COVERAGE), proteinDetails.getCoverage()); - - propertyGrid.registerPropertyValueRenderer(Peptide.class, - ProteinRenderers.createPeptideRenderer(viewContext)); - properties.put(viewContext.getMessage(Dict.PEPTIDES, proteinDetails.getPeptides().size()), - proteinDetails.getPeptides().toArray()); - - properties.put(viewContext.getMessage(Dict.PROBABILITY), proteinDetails.getProbability()); - properties.put(viewContext.getMessage(Dict.FDR), proteinDetails.getFalseDiscoveryRate()); - - DatasetInformationHolder dataset = new DatasetInformationHolder(proteinDetails); - properties.put(viewContext.getMessage(Dict.DATA_SET_PERM_ID), dataset); - propertyGrid.registerPropertyValueRenderer(DatasetInformationHolder.class, - ProteinRenderers.createEntityInformationPropertyValueRenderer(viewContext)); - } - - private static String markPeptides(String sequence, List<Peptide> peptides) - { - String markedSequence = - ProteinRenderers.markOccurrencesWithHtml(sequence, peptides, - AMINOACIDS_IN_ONE_BLOCK); - // the letters should have fixed width - return ProteinRenderers.getFixedWidthHTMLString(markedSequence); - } - - public static class DatasetInformationHolder implements IEntityInformationHolderWithIdentifier - { - private static final long serialVersionUID = ServiceVersionHolder.VERSION; - - private final ProteinDetails proteinDetails; - - public DatasetInformationHolder(ProteinDetails proteinDetails) - { - this.proteinDetails = proteinDetails; - } - - @Override - public EntityKind getEntityKind() - { - return EntityKind.DATA_SET; - } - - @Override - public EntityType getEntityType() - { - DataSetType dataSetType = new DataSetType(); - dataSetType.setCode(proteinDetails.getDataSetTypeCode()); - return dataSetType; - } - - @Override - public String getIdentifier() - { - return proteinDetails.getDataSetPermID(); - } - - @Override - public Long getId() - { - return proteinDetails.getDataSetTechID(); - } - - @Override - public String getCode() - { - return proteinDetails.getDataSetPermID(); - } - - @Override - public String getPermId() - { - return getIdentifier(); - } - } - - @Override - public DatabaseModificationKind[] getRelevantModifications() - { - return createDatabaseModificationObserver().getRelevantModifications(); - } - - @Override - public void update(Set<DatabaseModificationKind> observedModifications) - { - createDatabaseModificationObserver().update(observedModifications); - } - - private CompositeDatabaseModificationObserver createDatabaseModificationObserver() - { - CompositeDatabaseModificationObserver observer = - new CompositeDatabaseModificationObserver(); - if (proteinSamplesSection != null) - { - observer.addObserver(proteinSamplesSection.tryGetDatabaseModificationObserver()); - } - // TODO 2009-07-31, Piotr Buczek: refresh properties panel? - return observer; - } - - private static final class ProteinByExperimentCallback extends - AbstractAsyncCallback<ProteinByExperiment> - { - private final ProteinViewer viewer; - - private ProteinByExperimentCallback( - final IViewContext<IPhosphoNetXClientServiceAsync> viewContext, - final ProteinViewer viewer) - { - super(viewContext); - this.viewer = viewer; - } - - @Override - protected final void process(final ProteinByExperiment result) - { - viewer.recreateUI(result); - } - - } - - @Override - protected String getDeleteButtonLabel() - { - return viewContext.getMessage(Dict.BUTTON_DELETE_PROTEIN); - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/RawDataProcessingMenu.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/RawDataProcessingMenu.java deleted file mode 100644 index 4ceb310e652..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/RawDataProcessingMenu.java +++ /dev/null @@ -1,175 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.application; - -import static ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.application.Dict.COPY_DATA_SETS_MESSAGE; -import static ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.application.Dict.COPY_DATA_SETS_TITLE; - -import java.util.List; - -import com.extjs.gxt.ui.client.widget.form.TextField; -import com.extjs.gxt.ui.client.widget.menu.Menu; - -import ch.systemsx.cisd.openbis.generic.client.web.client.ICommonClientServiceAsync; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.AbstractAsyncCallback; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.VoidAsyncCallback; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.menu.ActionMenu; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.menu.IActionMenuItem; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.widget.AbstractDataConfirmationDialog; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.IDelegatedAction; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.IDelegatedActionWithResult; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.IMessageProvider; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.TextToolItem; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataStoreServiceKind; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatastoreServiceDescription; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRow; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRowWithObject; -import ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.IPhosphoNetXClientServiceAsync; - -/** - * @author Franz-Josef Elmer - */ -public class RawDataProcessingMenu extends TextToolItem -{ - private static final class CopyConfirmationDialog extends - AbstractDataConfirmationDialog<List<TableModelRowWithObject<Sample>>> - { - private final IViewContext<IPhosphoNetXClientServiceAsync> specificViewContext; - - private final List<TableModelRowWithObject<Sample>> samples; - - private final DatastoreServiceDescription datastoreServiceDescription; - - private TextField<String> dataSetTypeField; - - private CopyConfirmationDialog( - IViewContext<IPhosphoNetXClientServiceAsync> specificViewContext, - DatastoreServiceDescription datastoreServiceDescription, - List<TableModelRowWithObject<Sample>> samples, String title) - { - super(specificViewContext, samples, title); - this.specificViewContext = specificViewContext; - this.datastoreServiceDescription = datastoreServiceDescription; - this.samples = samples; - setWidth(400); - } - - @Override - protected String createMessage() - { - String list = "["; - String delim = ""; - for (TableModelRow sample : samples) - { - list += delim + sample.getValues().get(0); - delim = ", "; - } - list += "]"; - String label = datastoreServiceDescription.getLabel(); - return specificViewContext.getMessage(COPY_DATA_SETS_MESSAGE, label, list); - } - - @Override - protected void executeConfirmedAction() - { - long[] rawDataSampleIDs = new long[samples.size()]; - for (int i = 0; i < samples.size(); i++) - { - rawDataSampleIDs[i] = samples.get(i).getObjectOrNull().getId(); - } - specificViewContext.getService().processRawData(datastoreServiceDescription.getKey(), - rawDataSampleIDs, dataSetTypeField.getValue(), - new VoidAsyncCallback<Void>(specificViewContext)); - } - - @Override - protected void extendForm() - { - dataSetTypeField = new TextField<String>(); - dataSetTypeField.setFieldLabel(specificViewContext - .getMessage(Dict.COPY_DATA_SETS_DATA_SET_TYPE_FIELD)); - dataSetTypeField.setSelectOnFocus(true); - dataSetTypeField.setWidth(200); - formPanel.add(dataSetTypeField); - formPanel.setLabelWidth(100); - } - } - - private final IViewContext<IPhosphoNetXClientServiceAsync> viewContext; - - private final IDelegatedActionWithResult<List<TableModelRowWithObject<Sample>>> selectedDataProvider; - - public RawDataProcessingMenu(IViewContext<IPhosphoNetXClientServiceAsync> viewContext, - IDelegatedActionWithResult<List<TableModelRowWithObject<Sample>>> selectedDataProvider) - { - super(viewContext.getMessage(Dict.COPY_DATA_SETS_BUTTON_LABEL)); - this.viewContext = viewContext; - this.selectedDataProvider = selectedDataProvider; - IViewContext<ICommonClientServiceAsync> commonViewContext = - viewContext.getCommonViewContext(); - viewContext.getCommonService().listDataStoreServices(DataStoreServiceKind.PROCESSING, - new AbstractAsyncCallback<List<DatastoreServiceDescription>>(commonViewContext) - { - @Override - public final void process(List<DatastoreServiceDescription> plugins) - { - createMenu(plugins); - } - }); - } - - private void createMenu(List<DatastoreServiceDescription> plugins) - { - Menu subMenu = new Menu(); - - for (final DatastoreServiceDescription datastoreServiceDescription : plugins) - { - IActionMenuItem actionMenuItem = new IActionMenuItem() - { - - @Override - public String getMenuText(IMessageProvider messageProvider) - { - return datastoreServiceDescription.getLabel(); - } - - @Override - public String getMenuId() - { - return datastoreServiceDescription.getKey(); - } - }; - IDelegatedAction action = new IDelegatedAction() - { - - @Override - public void execute() - { - String title = viewContext.getMessage(COPY_DATA_SETS_TITLE); - List<TableModelRowWithObject<Sample>> selectedSamples = selectedDataProvider.execute(); - new CopyConfirmationDialog(viewContext, datastoreServiceDescription, - selectedSamples, title).show(); - } - }; - subMenu.add(new ActionMenu(actionMenuItem, viewContext, action)); - } - setMenu(subMenu); - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/RawDataSampleGrid.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/RawDataSampleGrid.java deleted file mode 100644 index 67d0e66e6f1..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/RawDataSampleGrid.java +++ /dev/null @@ -1,157 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.application; - -import static ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseModificationKind.createOrDelete; -import static ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseModificationKind.edit; - -import java.util.List; - -import ch.systemsx.cisd.openbis.generic.client.web.client.application.AbstractAsyncCallback; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.DatabaseModificationAwareComponent; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.TypedTableGrid; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.columns.framework.LinkExtractor; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.DisposableEntityChooser; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.ICellListenerAndLinkGenerator; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.IDelegatedActionWithResult; -import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DefaultResultSetConfig; -import ch.systemsx.cisd.openbis.generic.client.web.client.dto.GenericConstants; -import ch.systemsx.cisd.openbis.generic.client.web.client.dto.TableExportCriteria; -import ch.systemsx.cisd.openbis.generic.client.web.client.dto.TypedTableResultSet; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseModificationKind; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseModificationKind.ObjectKind; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ISerializableComparable; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRowWithObject; -import ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.IPhosphoNetXClientServiceAsync; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.RawDataSampleGridIDs; - -/** - * @author Franz-Josef Elmer - */ -class RawDataSampleGrid extends TypedTableGrid<Sample> -{ - public static final String BROWSER_ID = GenericConstants.ID_PREFIX + "raw_data_sample_browser"; - - public static DatabaseModificationAwareComponent create( - final IViewContext<IPhosphoNetXClientServiceAsync> viewContext) - { - RawDataSampleGrid grid = new RawDataSampleGrid(viewContext); - DisposableEntityChooser<TableModelRowWithObject<Sample>> disposable = - grid.asDisposableWithoutToolbar(); - return new DatabaseModificationAwareComponent(disposable.getComponent(), disposable); - } - - private final IViewContext<IPhosphoNetXClientServiceAsync> specificViewContext; - - RawDataSampleGrid(IViewContext<IPhosphoNetXClientServiceAsync> viewContext) - { - super(viewContext.getCommonViewContext(), BROWSER_ID, true, - PhosphoNetXDisplayTypeIDGenerator.RAW_DATA_SAMPLE_BROWSER_GRID); - specificViewContext = viewContext; - allowMultipleSelection(); - addEntityOperationsLabel(); - RawDataProcessingMenu button = - new RawDataProcessingMenu(viewContext, - new IDelegatedActionWithResult<List<TableModelRowWithObject<Sample>>>() - { - @Override - public List<TableModelRowWithObject<Sample>> execute() - { - return getSelectedBaseObjects(); - } - }); - enableButtonOnSelectedItems(button); - addButton(button); - linkMSInjectionSample(); - linkBiologicalSample(); - } - - private void linkMSInjectionSample() - { - registerListenerAndLinkGenerator(RawDataSampleGridIDs.CODE, - new ICellListenerAndLinkGenerator<Sample>() - { - - @Override - public void handle(TableModelRowWithObject<Sample> rowItem, - boolean specialKeyPressed) - { - showEntityInformationHolderViewer(rowItem.getObjectOrNull(), false, - specialKeyPressed); - } - - @Override - public String tryGetLink(Sample entity, ISerializableComparable value) - { - return LinkExtractor.tryExtract(entity); - } - - }); - } - - private void linkBiologicalSample() - { - registerListenerAndLinkGenerator(RawDataSampleGridIDs.PARENT, - new ICellListenerAndLinkGenerator<Sample>() - { - - @Override - public void handle(TableModelRowWithObject<Sample> rowItem, - boolean specialKeyPressed) - { - showEntityInformationHolderViewer(rowItem.getObjectOrNull() - .getGeneratedFrom(), false, specialKeyPressed); - } - - @Override - public String tryGetLink(Sample entity, - ISerializableComparable comparableValue) - { - return LinkExtractor.tryExtract(entity.getGeneratedFrom()); - } - }); - } - - @Override - protected void listTableRows( - DefaultResultSetConfig<String, TableModelRowWithObject<Sample>> resultSetConfig, - AbstractAsyncCallback<TypedTableResultSet<Sample>> callback) - { - specificViewContext.getService().listRawDataSamples(resultSetConfig, callback); - } - - @Override - protected void prepareExportEntities( - TableExportCriteria<TableModelRowWithObject<Sample>> exportCriteria, - AbstractAsyncCallback<String> callback) - { - specificViewContext.getService().prepareExportRawDataSamples(exportCriteria, callback); - } - - @Override - public DatabaseModificationKind[] getRelevantModifications() - { - return new DatabaseModificationKind[] - { createOrDelete(ObjectKind.SAMPLE_TYPE), edit(ObjectKind.SAMPLE_TYPE), - edit(ObjectKind.SAMPLE), createOrDelete(ObjectKind.SPACE), - createOrDelete(ObjectKind.PROPERTY_TYPE_ASSIGNMENT), - edit(ObjectKind.PROPERTY_TYPE_ASSIGNMENT) }; - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/ViewContext.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/ViewContext.java deleted file mode 100644 index 45e1ae9cd24..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/ViewContext.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.application; - -import com.google.gwt.core.client.GWT; - -import ch.systemsx.cisd.openbis.generic.client.web.client.ICommonClientServiceAsync; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.AbstractPluginViewContext; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.locator.ViewLocatorResolverRegistry; -import ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.Constants; -import ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.IPhosphoNetXClientService; -import ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.IPhosphoNetXClientServiceAsync; - -/** - * View context for technology 'proteomics'. - * - * @author Franz-Josef Elmer - */ -public class ViewContext extends AbstractPluginViewContext<IPhosphoNetXClientServiceAsync> -{ - public ViewContext(IViewContext<ICommonClientServiceAsync> commonViewContext) - { - super(commonViewContext); - } - - @Override - public String getTechnology() - { - return Constants.TECHNOLOGY_NAME; - } - - @Override - protected IPhosphoNetXClientServiceAsync createClientServiceAsync() - { - return GWT.create(IPhosphoNetXClientService.class); - } - - @Override - protected void initializeLocatorHandlerRegistry(ViewLocatorResolverRegistry handlerRegistry) - { - super.initializeLocatorHandlerRegistry(handlerRegistry); - handlerRegistry.registerHandler(new ProteinViewLocatorResolver(this)); - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/columns/.gitignore b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/columns/.gitignore deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/model/.gitignore b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/model/.gitignore deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/wizard/BiologicalSampleChoosingPage.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/wizard/BiologicalSampleChoosingPage.java deleted file mode 100644 index b945606005c..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/wizard/BiologicalSampleChoosingPage.java +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Copyright 2011 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.application.wizard; - -import java.util.List; - -import com.extjs.gxt.ui.client.data.ModelData; -import com.extjs.gxt.ui.client.event.Listener; -import com.extjs.gxt.ui.client.event.SelectionChangedEvent; -import com.extjs.gxt.ui.client.util.Margins; -import com.extjs.gxt.ui.client.widget.Label; -import com.extjs.gxt.ui.client.widget.layout.RowData; - -import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.model.BaseEntityModel; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.wizard.WizardPage; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRowWithObject; -import ch.systemsx.cisd.openbis.plugin.demo.client.web.client.application.Dict; -import ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.IPhosphoNetXClientServiceAsync; - -/** - * Wizard for guiding the user to annotate an MS_INJECTION sample. - * - * @author Franz-Josef Elmer - */ -public class BiologicalSampleChoosingPage extends WizardPage<MsInjectionSampleAnnotationModel> -{ - private final IViewContext<IPhosphoNetXClientServiceAsync> viewContext; - - private BiologicalSampleGrid sampleGrid; - - public BiologicalSampleChoosingPage(IViewContext<IPhosphoNetXClientServiceAsync> viewContext, - MsInjectionSampleAnnotationModel model) - { - super(viewContext, MsInjectionAnnotationWizardState.BIOLOGICAL_SAMPLE_CHOOSING, model); - this.viewContext = viewContext; - setLeftContentByDictionary(); - } - - @Override - public void init() - { - addToRightContent( - new Label( - "Please choose a biological " + viewContext.getMessage(Dict.SAMPLE).toLowerCase() - + " as annotation of the MS_INJECTION " + viewContext.getMessage(Dict.SAMPLES).toLowerCase() - + " selected previously:"), - new RowData(1, -1, new Margins(10))); - - sampleGrid = new BiologicalSampleGrid(viewContext); - sampleGrid.addGridSelectionChangeListener(new Listener<SelectionChangedEvent<ModelData>>() - { - @Override - public void handleEvent(SelectionChangedEvent<ModelData> se) - { - List<ModelData> selection = se.getSelection(); - boolean enabled = selection.size() == 1; - enableNextButton(enabled); - } - - }); - addToRightContent(sampleGrid, new RowData(1, 400, new Margins(20, 10, 10, 10))); - } - - @Override - public void deactivate() - { - List<BaseEntityModel<TableModelRowWithObject<Sample>>> selectedItems = - sampleGrid.getSelectedItems(); - if (selectedItems.isEmpty() == false) - { - model.setBiologicalSample(selectedItems.get(0).getBaseObject().getObjectOrNull()); - } - } - - @Override - public void destroy() - { - sampleGrid.dispose(); - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/wizard/BiologicalSampleCreatingPage.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/wizard/BiologicalSampleCreatingPage.java deleted file mode 100644 index 95c8589b386..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/wizard/BiologicalSampleCreatingPage.java +++ /dev/null @@ -1,183 +0,0 @@ -/* - * Copyright 2011 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.application.wizard; - -import java.util.Collections; -import java.util.Iterator; -import java.util.List; -import java.util.Map; - -import com.extjs.gxt.ui.client.event.SelectionChangedEvent; -import com.extjs.gxt.ui.client.event.SelectionChangedListener; -import com.extjs.gxt.ui.client.util.Margins; -import com.extjs.gxt.ui.client.widget.layout.RowData; -import com.google.gwt.event.dom.client.ClickEvent; -import com.google.gwt.event.dom.client.ClickHandler; - -import ch.systemsx.cisd.openbis.generic.client.web.client.application.Dict; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.SampleTypeDisplayID; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.model.SampleTypeModel; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.SpaceSelectionWidget; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.field.CodeFieldWithGenerator; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.field.ExperimentChooserField; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.field.ExperimentChooserField.ExperimentChooserFieldAdaptor; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.sample.SampleTypeSelectionWidget; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.widget.ClickableFormPanel; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.widget.FieldUtil; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.wizard.WizardPage; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleType; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleTypePropertyType; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.api.IManagedInputWidgetDescription; -import ch.systemsx.cisd.openbis.plugin.generic.client.web.client.application.sample.AbstractGenericSampleRegisterEditForm; -import ch.systemsx.cisd.openbis.plugin.generic.client.web.client.application.sample.SamplePropertyEditor; -import ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.IPhosphoNetXClientServiceAsync; - -/** - * Wizard for guiding the user to annotate an MS_INJECTION sample. - * - * @author Franz-Josef Elmer - */ -public class BiologicalSampleCreatingPage extends WizardPage<MsInjectionSampleAnnotationModel> -{ - - private final IViewContext<IPhosphoNetXClientServiceAsync> viewContext; - - private ClickableFormPanel formPanel; - - private SampleTypeSelectionWidget sampleTypeSelectionWidget; - - private SampleType sampleType; - - private CodeFieldWithGenerator codeField; - - private SpaceSelectionWidget spaceSelectionWidget; - - private SamplePropertyEditor samplePropertyEditor; - - private ExperimentChooserFieldAdaptor experimentField; - - private Map<String, List<IManagedInputWidgetDescription>> inputWidgetDescriptions = Collections - .<String, List<IManagedInputWidgetDescription>> emptyMap(); - - public BiologicalSampleCreatingPage(IViewContext<IPhosphoNetXClientServiceAsync> viewContext, - MsInjectionSampleAnnotationModel model) - { - super(viewContext, MsInjectionAnnotationWizardState.BIOLOGICAL_SAMPLE_CREATING, model); - this.viewContext = viewContext; - setLeftContentByDictionary(); - } - - @Override - public void init() - { - formPanel = new ClickableFormPanel(); - formPanel.setHeaderVisible(false); - sampleTypeSelectionWidget = new SampleTypeSelectionWidget(viewContext, "bio-samp", true, - SampleTypeDisplayID.SAMPLE_REGISTRATION, null) - { - - @Override - protected void filterTypes(List<SampleType> types) - { - for (Iterator<SampleType> iterator = types.iterator(); iterator.hasNext();) - { - SampleType type = iterator.next(); - if (type.getCode().startsWith("BIO") == false) - { - iterator.remove(); - } - } - } - }; - sampleTypeSelectionWidget.addSelectionChangedListener(new SelectionChangedListener<SampleTypeModel>() - { - - @Override - public void selectionChanged(SelectionChangedEvent<SampleTypeModel> se) - { - SampleType sampleTypeOrNull = sampleTypeSelectionWidget.tryGetSelectedSampleType(); - if (sampleTypeOrNull != null) - { - onSampleTypeChanged(sampleTypeOrNull); - } - } - }); - formPanel.add(sampleTypeSelectionWidget); - addToRightContent(formPanel, new RowData(1, 600, new Margins(10))); - } - - protected void onSampleTypeChanged(SampleType type) - { - this.sampleType = type; - formPanel.removeAll(); - formPanel.add(sampleTypeSelectionWidget); - codeField = - new CodeFieldWithGenerator(viewContext, viewContext.getMessage(Dict.CODE), - type.getGeneratedCodePrefix(), EntityKind.SAMPLE, - type.isAutoGeneratedCode()); - boolean codeReadonly = type.isAutoGeneratedCode(); - codeField.setReadOnly(codeReadonly); - codeField.setHideTrigger(codeReadonly); - formPanel.add(codeField); - List<SampleTypePropertyType> types = type.getAssignedPropertyTypes(); - spaceSelectionWidget = - new SpaceSelectionWidget(viewContext, getId(), true, false, viewContext.getModel() - .getSessionContext().getUser().getHomeGroupCode()); - FieldUtil.markAsMandatory(spaceSelectionWidget); - formPanel.add(spaceSelectionWidget); - String label = viewContext.getMessage(Dict.EXPERIMENT); - experimentField = ExperimentChooserField.create(label, false, null, - viewContext.getCommonViewContext()); - formPanel.add(experimentField.getChooserField()); - - samplePropertyEditor = - new SamplePropertyEditor("bio-s", inputWidgetDescriptions, - viewContext.getCommonViewContext()); - samplePropertyEditor.initWithoutProperties(types); - samplePropertyEditor.addPropertyFieldsWithFieldsetToPanel(formPanel); - formPanel.layout(); - formPanel.addClickListener(new ClickHandler() - { - @Override - public void onClick(ClickEvent event) - { - enableNextButton(formPanel.isValid()); - } - }); - } - - @Override - public void deactivate() - { - String identifier = - AbstractGenericSampleRegisterEditForm.createSampleIdentifier(spaceSelectionWidget, - codeField); - String experimentIdentifierOrNull = experimentField.getChooserField().getValue(); - List<IEntityProperty> properties = samplePropertyEditor.extractProperties(); - model.defineBiologicalSample(sampleType, identifier, experimentIdentifierOrNull, properties); - } - - @Override - public void destroy() - { - spaceSelectionWidget.dispose(); - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/wizard/BiologicalSampleGrid.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/wizard/BiologicalSampleGrid.java deleted file mode 100644 index 707918e0db2..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/wizard/BiologicalSampleGrid.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright 2011 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.application.wizard; - -import java.util.Arrays; -import java.util.List; - -import ch.systemsx.cisd.openbis.generic.client.web.client.application.AbstractAsyncCallback; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.TypedTableGrid; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.BrowserGridPagingToolBar.PagingToolBarButtonKind; -import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DefaultResultSetConfig; -import ch.systemsx.cisd.openbis.generic.client.web.client.dto.GenericConstants; -import ch.systemsx.cisd.openbis.generic.client.web.client.dto.TableExportCriteria; -import ch.systemsx.cisd.openbis.generic.client.web.client.dto.TypedTableResultSet; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRowWithObject; -import ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.IPhosphoNetXClientServiceAsync; -import ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.application.PhosphoNetXDisplayTypeIDGenerator; -import ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.dto.BiologicalSampleGridColumnIDs; - -/** - * @author Franz-Josef Elmer - */ -public class BiologicalSampleGrid extends TypedTableGrid<Sample> -{ - private static final String PREFIX = GenericConstants.ID_PREFIX + "biological_sample"; - - public static final String BROWSER_ID = PREFIX + "_main"; - - public static final String GRID_ID = PREFIX + TypedTableGrid.GRID_POSTFIX; - - private final IViewContext<IPhosphoNetXClientServiceAsync> specificViewContext; - - public BiologicalSampleGrid(IViewContext<IPhosphoNetXClientServiceAsync> viewContext) - { - super(viewContext.getCommonViewContext(), BROWSER_ID, true, - PhosphoNetXDisplayTypeIDGenerator.BIOLOGICAL_SAMPLE_BROWSER_GRID); - specificViewContext = viewContext; - removeButtons(PagingToolBarButtonKind.CONFIG, PagingToolBarButtonKind.EXPORT, - PagingToolBarButtonKind.FILTERS); - showFiltersBar(); - setBorders(true); - } - - @Override - protected void listTableRows( - DefaultResultSetConfig<String, TableModelRowWithObject<Sample>> resultSetConfig, - AbstractAsyncCallback<TypedTableResultSet<Sample>> callback) - { - specificViewContext.getService().listBiologicalSamples(resultSetConfig, callback); - } - - @Override - protected List<String> getColumnIdsOfFilters() - { - return Arrays.asList(BiologicalSampleGridColumnIDs.IDENTIFIER, - BiologicalSampleGridColumnIDs.REGISTRATION_DATE); - } - - @Override - protected void prepareExportEntities( - TableExportCriteria<TableModelRowWithObject<Sample>> exportCriteria, - AbstractAsyncCallback<String> callback) - { - } - - public void dispose() - { - asDisposableWithoutToolbar().dispose(); - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/wizard/MsInjectionAnnotationWizardState.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/wizard/MsInjectionAnnotationWizardState.java deleted file mode 100644 index aa545172f04..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/wizard/MsInjectionAnnotationWizardState.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright 2011 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.application.wizard; - -import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.wizard.IWizardState; - -/** - * States of wizard for annotating MS_INJECTION samples. - * - * @author Franz-Josef Elmer - */ -public enum MsInjectionAnnotationWizardState implements IWizardState -{ - MS_INJECTION_SAMPLE_CHOOSING, CHOOSE_OR_CREATE_QUESTION, BIOLOGICAL_SAMPLE_CHOOSING, BIOLOGICAL_SAMPLE_CREATING; -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/wizard/MsInjectionSampleAnnotationModel.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/wizard/MsInjectionSampleAnnotationModel.java deleted file mode 100644 index 8c9f7d2e410..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/wizard/MsInjectionSampleAnnotationModel.java +++ /dev/null @@ -1,120 +0,0 @@ -/* - * Copyright 2011 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.application.wizard; - -import static ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.application.wizard.MsInjectionAnnotationWizardState.BIOLOGICAL_SAMPLE_CHOOSING; -import static ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.application.wizard.MsInjectionAnnotationWizardState.BIOLOGICAL_SAMPLE_CREATING; -import static ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.application.wizard.MsInjectionAnnotationWizardState.CHOOSE_OR_CREATE_QUESTION; -import static ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.application.wizard.MsInjectionAnnotationWizardState.MS_INJECTION_SAMPLE_CHOOSING; - -import java.util.ArrayList; -import java.util.List; - -import ch.systemsx.cisd.openbis.generic.client.web.client.application.Dict; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.VoidAsyncCallback; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.wizard.IWizardDataModel; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.wizard.IWizardState; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.wizard.WizardWorkflowModel; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewSample; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleType; -import ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.IPhosphoNetXClientServiceAsync; - -/** - * @author Franz-Josef Elmer - */ -public class MsInjectionSampleAnnotationModel implements IWizardDataModel -{ - private final IViewContext<IPhosphoNetXClientServiceAsync> context; - - private final WizardWorkflowModel workflowModel; - - private List<Sample> msInjectionSamples = new ArrayList<Sample>(); - - private boolean chooseBiologicalSampleFlag; - - private Sample biologicalSample; - - private NewSample newBiologicalSample; - - public MsInjectionSampleAnnotationModel(IViewContext<IPhosphoNetXClientServiceAsync> context) - { - this.context = context; - workflowModel = new WizardWorkflowModel(this); - workflowModel.addTransition(MS_INJECTION_SAMPLE_CHOOSING, CHOOSE_OR_CREATE_QUESTION); - workflowModel.addTransition(CHOOSE_OR_CREATE_QUESTION, BIOLOGICAL_SAMPLE_CHOOSING); - workflowModel.addTransition(CHOOSE_OR_CREATE_QUESTION, BIOLOGICAL_SAMPLE_CREATING); - } - - @Override - public WizardWorkflowModel getWorkflow() - { - return workflowModel; - } - - @Override - public IWizardState determineNextState(IWizardState currentState) - { - return chooseBiologicalSampleFlag ? BIOLOGICAL_SAMPLE_CHOOSING : BIOLOGICAL_SAMPLE_CREATING; - } - - public void setSelectedMsInjectionSample(List<Sample> samples) - { - msInjectionSamples = samples; - } - - public List<Sample> getMsInjectionSamples() - { - return msInjectionSamples; - } - - public void setChooseBiologicalSampleFlag(boolean flag) - { - chooseBiologicalSampleFlag = flag; - } - - public void setBiologicalSample(Sample biologicalSample) - { - this.biologicalSample = biologicalSample; - } - - public void defineBiologicalSample(SampleType sampleType, String identifier, - String experimentIdentifierOrNull, List<IEntityProperty> properties) - { - newBiologicalSample = NewSample.createWithParents(identifier, sampleType, null, null); - newBiologicalSample.setProperties(properties.toArray(IEntityProperty.EMPTY_ARRAY)); - newBiologicalSample.setExperimentIdentifier(experimentIdentifierOrNull); - } - - @Override - public String finish() - { - VoidAsyncCallback<Void> callback = new VoidAsyncCallback<Void>(context); - if (chooseBiologicalSampleFlag) - { - context.getService().linkSamples(biologicalSample, msInjectionSamples, callback); - } else - { - context.getService().createAndLinkSamples(newBiologicalSample, msInjectionSamples, callback); - } - return msInjectionSamples.size() + " MS_INJECTION " + context.getMessage(Dict.SAMPLES).toLowerCase() - + " have been annotated."; - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/wizard/MsInjectionSampleAnnotationWizard.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/wizard/MsInjectionSampleAnnotationWizard.java deleted file mode 100644 index 42b6377eb3e..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/wizard/MsInjectionSampleAnnotationWizard.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright 2011 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.application.wizard; - -import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.wizard.Wizard; -import ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.IPhosphoNetXClientServiceAsync; - -/** - * Wizard for annotation MS_INJECTION samples. - * - * @author Franz-Josef Elmer - */ -public class MsInjectionSampleAnnotationWizard extends Wizard<MsInjectionSampleAnnotationModel> -{ - public MsInjectionSampleAnnotationWizard(IViewContext<IPhosphoNetXClientServiceAsync> context) - { - super(new MsInjectionSampleAnnotationModel(context)); - MsInjectionSampleAnnotationModel wizardDataModel = getWizardDataModel(); - register(new MsInjectionSampleChoosingPage(context, wizardDataModel)); - register(new QuestionPage(context, wizardDataModel)); - register(new BiologicalSampleChoosingPage(context, wizardDataModel)); - register(new BiologicalSampleCreatingPage(context, wizardDataModel)); - start(); - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/wizard/MsInjectionSampleChoosingPage.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/wizard/MsInjectionSampleChoosingPage.java deleted file mode 100644 index 8499af64677..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/wizard/MsInjectionSampleChoosingPage.java +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Copyright 2011 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.application.wizard; - -import java.util.ArrayList; -import java.util.List; - -import com.extjs.gxt.ui.client.data.ModelData; -import com.extjs.gxt.ui.client.event.Listener; -import com.extjs.gxt.ui.client.event.SelectionChangedEvent; -import com.extjs.gxt.ui.client.util.Margins; -import com.extjs.gxt.ui.client.widget.Label; -import com.extjs.gxt.ui.client.widget.layout.RowData; - -import ch.systemsx.cisd.openbis.generic.client.web.client.application.Dict; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.model.BaseEntityModel; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.wizard.WizardPage; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRowWithObject; -import ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.IPhosphoNetXClientServiceAsync; - -/** - * Wizard for guiding the user to annotate an MS_INJECTION sample. - * - * @author Franz-Josef Elmer - */ -public class MsInjectionSampleChoosingPage extends WizardPage<MsInjectionSampleAnnotationModel> -{ - private final IViewContext<IPhosphoNetXClientServiceAsync> viewContext; - - private ParentlessMsInjectionSampleGrid sampleGrid; - - public MsInjectionSampleChoosingPage(IViewContext<IPhosphoNetXClientServiceAsync> viewContext, - MsInjectionSampleAnnotationModel model) - { - super(viewContext, MsInjectionAnnotationWizardState.MS_INJECTION_SAMPLE_CHOOSING, model); - this.viewContext = viewContext; - setLeftContentByDictionary(); - } - - @Override - public void init() - { - addToRightContent(new Label( - "Please choose one or more MS_INJECTION " + viewContext.getMessage(Dict.SAMPLES).toLowerCase() - + " to be annotated:"), new RowData(1, - -1, new Margins(10))); - - sampleGrid = new ParentlessMsInjectionSampleGrid(viewContext); - sampleGrid.addGridSelectionChangeListener(new Listener<SelectionChangedEvent<ModelData>>() - { - @Override - public void handleEvent(SelectionChangedEvent<ModelData> se) - { - List<ModelData> selection = se.getSelection(); - boolean enabled = selection.size() > 0; - enableNextButton(enabled); - } - - }); - addToRightContent(sampleGrid, new RowData(1, 400, new Margins(20, 10, 10, 10))); - } - - @Override - public void deactivate() - { - List<BaseEntityModel<TableModelRowWithObject<Sample>>> selectedItems = - sampleGrid.getSelectedItems(); - ArrayList<Sample> samples = new ArrayList<Sample>(); - for (BaseEntityModel<TableModelRowWithObject<Sample>> item : selectedItems) - { - samples.add(item.getBaseObject().getObjectOrNull()); - } - model.setSelectedMsInjectionSample(samples); - } - - @Override - public void destroy() - { - sampleGrid.dispose(); - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/wizard/ParentlessMsInjectionSampleGrid.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/wizard/ParentlessMsInjectionSampleGrid.java deleted file mode 100644 index 9f61b5e643c..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/wizard/ParentlessMsInjectionSampleGrid.java +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Copyright 2011 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.application.wizard; - -import java.util.Arrays; -import java.util.List; - -import ch.systemsx.cisd.openbis.generic.client.web.client.application.AbstractAsyncCallback; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.TypedTableGrid; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.BrowserGridPagingToolBar.PagingToolBarButtonKind; -import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DefaultResultSetConfig; -import ch.systemsx.cisd.openbis.generic.client.web.client.dto.GenericConstants; -import ch.systemsx.cisd.openbis.generic.client.web.client.dto.TableExportCriteria; -import ch.systemsx.cisd.openbis.generic.client.web.client.dto.TypedTableResultSet; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRowWithObject; -import ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.IPhosphoNetXClientServiceAsync; -import ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.application.PhosphoNetXDisplayTypeIDGenerator; -import ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.dto.ParentlessMsInjectionSampleGridColumnIDs; - -/** - * @author Franz-Josef Elmer - */ -public class ParentlessMsInjectionSampleGrid extends TypedTableGrid<Sample> -{ - private static final String PREFIX = GenericConstants.ID_PREFIX - + "parentless_ms_injection_sample"; - - public static final String BROWSER_ID = PREFIX + "_main"; - - public static final String GRID_ID = PREFIX + TypedTableGrid.GRID_POSTFIX; - - private final IViewContext<IPhosphoNetXClientServiceAsync> specificViewContext; - - public ParentlessMsInjectionSampleGrid(IViewContext<IPhosphoNetXClientServiceAsync> viewContext) - { - super(viewContext.getCommonViewContext(), BROWSER_ID, true, - PhosphoNetXDisplayTypeIDGenerator.PARENT_LESS_MS_INJECTION_SAMPLE_BROWSER_GRID); - specificViewContext = viewContext; - removeButtons(PagingToolBarButtonKind.CONFIG, PagingToolBarButtonKind.EXPORT, - PagingToolBarButtonKind.FILTERS); - allowMultipleSelection(); - showFiltersBar(); - setBorders(true); - } - - @Override - protected void listTableRows( - DefaultResultSetConfig<String, TableModelRowWithObject<Sample>> resultSetConfig, - AbstractAsyncCallback<TypedTableResultSet<Sample>> callback) - { - specificViewContext.getService() - .listParentlessMsInjectionSamples(resultSetConfig, callback); - } - - @Override - protected List<String> getColumnIdsOfFilters() - { - return Arrays.asList(ParentlessMsInjectionSampleGridColumnIDs.IDENTIFIER, - ParentlessMsInjectionSampleGridColumnIDs.REGISTRATION_DATE); - } - - @Override - protected void prepareExportEntities( - TableExportCriteria<TableModelRowWithObject<Sample>> exportCriteria, - AbstractAsyncCallback<String> callback) - { - } - - public void dispose() - { - asDisposableWithoutToolbar().dispose(); - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/wizard/QuestionPage.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/wizard/QuestionPage.java deleted file mode 100644 index cd739d5702b..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/wizard/QuestionPage.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright 2011 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.application.wizard; - -import com.extjs.gxt.ui.client.util.Margins; -import com.extjs.gxt.ui.client.widget.Label; -import com.extjs.gxt.ui.client.widget.form.Radio; -import com.extjs.gxt.ui.client.widget.form.RadioGroup; -import com.extjs.gxt.ui.client.widget.layout.RowData; - -import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.wizard.WizardPage; -import ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.IPhosphoNetXClientServiceAsync; -import ch.systemsx.cisd.openbis.plugin.query.client.web.client.application.Dict; - -/** - * @author Franz-Josef Elmer - */ -public class QuestionPage extends WizardPage<MsInjectionSampleAnnotationModel> -{ - - private Radio chooseSampleRadioButton; - - private RadioGroup radioGroup; - - public QuestionPage(IViewContext<IPhosphoNetXClientServiceAsync> viewContext, - MsInjectionSampleAnnotationModel model) - { - super(viewContext, MsInjectionAnnotationWizardState.CHOOSE_OR_CREATE_QUESTION, model); - setLeftContentByDictionary(); - addToRightContent(new Label("How do you want to annotate your " - + viewContext.getMessage(Dict.SAMPLES).toLowerCase() + "?"), new RowData(1, -1, new Margins(10))); - radioGroup = new RadioGroup(); - radioGroup.setFieldLabel("choose"); - chooseSampleRadioButton = new Radio(); - String sampleText = viewContext.getMessage(Dict.SAMPLE).toLowerCase(); - chooseSampleRadioButton.setBoxLabel("I want to choose an existing biological " + sampleText + "."); - chooseSampleRadioButton.setValue(true); - radioGroup.add(chooseSampleRadioButton); - Radio createSampleRadioButton = new Radio(); - createSampleRadioButton.setBoxLabel("I want to create a new biological " + sampleText + "."); - radioGroup.add(createSampleRadioButton); - addToRightContent(radioGroup, new RowData(1, -1, new Margins(10))); - enableNextButton(true); - } - - @Override - public void deactivate() - { - model.setChooseBiologicalSampleFlag(radioGroup.getValue().equals(chooseSampleRadioButton)); - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/dto/BiologicalSampleGridColumnIDs.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/dto/BiologicalSampleGridColumnIDs.java deleted file mode 100644 index cce385f54cc..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/dto/BiologicalSampleGridColumnIDs.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright 2011 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.dto; - -import ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.application.wizard.ParentlessMsInjectionSampleGrid; - -/** - * IDs of columns of {@link ParentlessMsInjectionSampleGrid}. - * - * @author Franz-Josef Elmer - */ -public class BiologicalSampleGridColumnIDs -{ - public static final String IDENTIFIER = "IDENTIFIER"; - - public static final String REGISTRATION_DATE = "REGISTRATION_DATE"; -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/dto/DataSetProteinGridColumnIDs.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/dto/DataSetProteinGridColumnIDs.java deleted file mode 100644 index dd979dab263..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/dto/DataSetProteinGridColumnIDs.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright 2011 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.dto; - -/** - * Column IDs for data set protein grid. - * - * @author Franz-Josef Elmer - */ -public class DataSetProteinGridColumnIDs -{ - public static final String DATA_SET_PERM_ID = "DATA_SET_PERM_ID"; - - public static final String SEQUENCE_NAME = "SEQUENCE_NAME"; - - public static final String PEPTIDE_COUNT = "PEPTIDE_COUNT"; - - public static final String FDR = "FDR"; -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/dto/ListProteinByExperimentAndReferenceCriteria.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/dto/ListProteinByExperimentAndReferenceCriteria.java deleted file mode 100644 index 916a69fab85..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/dto/ListProteinByExperimentAndReferenceCriteria.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.dto; - -import com.google.gwt.user.client.rpc.IsSerializable; - -import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DefaultResultSetConfig; -import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRowWithObject; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.DataSetProtein; - -/** - * @author Franz-Josef Elmer - */ -public class ListProteinByExperimentAndReferenceCriteria extends - DefaultResultSetConfig<String, TableModelRowWithObject<DataSetProtein>> implements IsSerializable -{ - private TechId experimentID; - - private TechId proteinReferenceID; - - public final TechId getExperimentID() - { - return experimentID; - } - - public final void setExperimentID(TechId experimentID) - { - this.experimentID = experimentID; - } - - public final TechId getProteinReferenceID() - { - return proteinReferenceID; - } - - public final void setProteinReferenceID(TechId proteinReferenceID) - { - this.proteinReferenceID = proteinReferenceID; - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/dto/ListProteinByExperimentCriteria.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/dto/ListProteinByExperimentCriteria.java deleted file mode 100644 index ff65dae794d..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/dto/ListProteinByExperimentCriteria.java +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.dto; - -import com.google.gwt.user.client.rpc.IsSerializable; - -import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DefaultResultSetConfig; -import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRowWithObject; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.AggregateFunction; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.ProteinInfo; - -/** - * @author Franz-Josef Elmer - */ -public class ListProteinByExperimentCriteria extends - DefaultResultSetConfig<String, TableModelRowWithObject<ProteinInfo>> implements - IsSerializable -{ - private TechId experimentID; - - private double falseDiscoveryRate; - - private AggregateFunction aggregateFunction; - - private String treatmentTypeCode; - - private boolean aggregateOriginal; - - public final TechId getExperimentID() - { - return experimentID; - } - - public final void setExperimentID(TechId experimentID) - { - this.experimentID = experimentID; - } - - public final double getFalseDiscoveryRate() - { - return falseDiscoveryRate; - } - - public final void setFalseDiscoveryRate(double falseDiscoveryRate) - { - this.falseDiscoveryRate = falseDiscoveryRate; - } - - public final AggregateFunction getAggregateFunction() - { - return aggregateFunction; - } - - public void setAggregateFunction(AggregateFunction aggregateFunction) - { - this.aggregateFunction = aggregateFunction; - } - - public final String getTreatmentTypeCode() - { - return treatmentTypeCode; - } - - public final void setTreatmentTypeCode(String treatmentTypeCode) - { - this.treatmentTypeCode = treatmentTypeCode; - } - - public final boolean isAggregateOriginal() - { - return aggregateOriginal; - } - - public final void setAggregateOriginal(boolean aggregateOriginal) - { - this.aggregateOriginal = aggregateOriginal; - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/dto/ListProteinSequenceCriteria.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/dto/ListProteinSequenceCriteria.java deleted file mode 100644 index 8569e6efc3c..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/dto/ListProteinSequenceCriteria.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.dto; - -import com.google.gwt.user.client.rpc.IsSerializable; - -import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DefaultResultSetConfig; -import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRowWithObject; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.ProteinSequence; - -/** - * Criteria for listing {@link ProteinSequence} instances. - * - * @author Franz-Josef Elmer - */ -public class ListProteinSequenceCriteria extends - DefaultResultSetConfig<String, TableModelRowWithObject<ProteinSequence>> implements - IsSerializable -{ - private TechId proteinReferenceID; - - private TechId experimentID; - - public final TechId getProteinReferenceID() - { - return proteinReferenceID; - } - - public final void setProteinReferenceID(TechId proteinReferenceID) - { - this.proteinReferenceID = proteinReferenceID; - } - - public void setExperimentID(TechId experimentID) - { - this.experimentID = experimentID; - } - - public TechId getExperimentID() - { - return experimentID; - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/dto/ListProteinSummaryByExperimentCriteria.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/dto/ListProteinSummaryByExperimentCriteria.java deleted file mode 100644 index 3944a71acfb..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/dto/ListProteinSummaryByExperimentCriteria.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.dto; - -import com.google.gwt.user.client.rpc.IsSerializable; - -import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DefaultResultSetConfig; -import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRowWithObject; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.ProteinSummary; - -/** - * @author Franz-Josef Elmer - */ -public class ListProteinSummaryByExperimentCriteria extends - DefaultResultSetConfig<String, TableModelRowWithObject<ProteinSummary>> implements - IsSerializable -{ - private TechId experimentID; - - public final TechId getExperimentID() - { - return experimentID; - } - - public final void setExperimentID(TechId experimentID) - { - this.experimentID = experimentID; - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/dto/ListSampleAbundanceByProteinCriteria.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/dto/ListSampleAbundanceByProteinCriteria.java deleted file mode 100644 index f191657ee18..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/dto/ListSampleAbundanceByProteinCriteria.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.dto; - -import com.google.gwt.user.client.rpc.IsSerializable; - -import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DefaultResultSetConfig; -import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRowWithObject; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.ProteinRelatedSample; - -/** - * @author Franz-Josef Elmer - */ -public class ListSampleAbundanceByProteinCriteria extends - DefaultResultSetConfig<String, TableModelRowWithObject<ProteinRelatedSample>> implements IsSerializable -{ - private TechId experimentID; - - private TechId proteinReferenceID; - - public final TechId getExperimentID() - { - return experimentID; - } - - public final void setExperimentID(Long experimentID) - { - this.experimentID = experimentID == null ? null : new TechId(experimentID); - } - - public final TechId getProteinReferenceID() - { - return proteinReferenceID; - } - - public final void setProteinReferenceID(TechId proteinReferenceID) - { - this.proteinReferenceID = proteinReferenceID; - } -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/dto/ParentlessMsInjectionSampleGridColumnIDs.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/dto/ParentlessMsInjectionSampleGridColumnIDs.java deleted file mode 100644 index 5655e9f62f2..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/dto/ParentlessMsInjectionSampleGridColumnIDs.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright 2011 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.dto; - -import ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.application.wizard.ParentlessMsInjectionSampleGrid; - -/** - * IDs of columns of {@link ParentlessMsInjectionSampleGrid}. - * - * @author Franz-Josef Elmer - */ -public class ParentlessMsInjectionSampleGridColumnIDs -{ - public static final String IDENTIFIER = "IDENTIFIER"; - - public static final String REGISTRATION_DATE = "REGISTRATION_DATE"; -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/dto/ProteinBrowserColumnIDs.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/dto/ProteinBrowserColumnIDs.java deleted file mode 100644 index faadf66e0ec..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/dto/ProteinBrowserColumnIDs.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright 2011 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.dto; - -/** - * @author Franz-Josef Elmer - */ -public class ProteinBrowserColumnIDs -{ - public static final String ACCESSION_NUMBER = "ACCESSION_NUMBER"; - - public static final String PROTEIN_DESCRIPTION = "PROTEIN_DESCRIPTION"; - - public static final String COVERAGE = "COVERAGE"; -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/dto/ProteinRelatedSampleGridColumnIDs.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/dto/ProteinRelatedSampleGridColumnIDs.java deleted file mode 100644 index 34c9cff25fa..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/dto/ProteinRelatedSampleGridColumnIDs.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright 2011 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.dto; - -/** - * @author Franz-Josef Elmer - */ -public class ProteinRelatedSampleGridColumnIDs -{ - public static final String SAMPLE_IDENTIFIER = "SAMPLE_IDENTIFIER"; - - public static final String SAMPLE_TYPE = "SAMPLE_TYPE"; - - public static final String ABUNDANCE = "ABUNDANCE"; - - public static final String MODIFIED_AMINO_ACID = "MODIFIED_AMINO_ACID"; - - public static final String MODIFICATION_POSITION = "MODIFICATION_POSITION"; - - public static final String MODIFICATION_MASS = "MODIFICATION_MASS"; - - public static final String MODIFICATION_FRACTION = "MODIFICATION_FRACTION"; -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/dto/ProteinSequenceGridColumnIDs.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/dto/ProteinSequenceGridColumnIDs.java deleted file mode 100644 index 23a88159c15..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/dto/ProteinSequenceGridColumnIDs.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright 2011 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.dto; - -import ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.application.ProteinSequenceGrid; - -/** - * Column IDs of {@link ProteinSequenceGrid}. - * - * @author Franz-Josef Elmer - */ -public class ProteinSequenceGridColumnIDs -{ - public static final String SEQUENCE_SHORT_NAME = "SEQUENCE_SHORT_NAME"; - - public static final String DATABASE_NAME_AND_VERSION = "DATABASE_NAME_AND_VERSION"; - - public static final String SEQUENCE = "SEQUENCE"; -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/dto/ProteinSummaryGridColumnIDs.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/dto/ProteinSummaryGridColumnIDs.java deleted file mode 100644 index 2f94f198755..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/dto/ProteinSummaryGridColumnIDs.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright 2011 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.dto; - -/** - * Column IDs for protein summary grid. - * - * @author Franz-Josef Elmer - */ -public class ProteinSummaryGridColumnIDs -{ - public static final String FDR = "FDR"; - - public static final String PROTEIN_COUNT = "PROTEIN_COUNT"; - - public static final String PEPTIDE_COUNT = "PEPTIDE_COUNT"; - - public static final String DECOY_PROTEIN_COUNT = "DECOY_PROTEIN_COUNT"; - - public static final String DECOY_PEPTIDE_COUNT = "DECOY_PEPTIDE_COUNT"; -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/public/index.html b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/public/index.html deleted file mode 100644 index 0298c05ee9d..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/public/index.html +++ /dev/null @@ -1,61 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<title>openBIS - Biology Information System for Proteomics</title> - -<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> -<!-- force IE to go to document mode IE8 standards (and avoid the dreadful quirks-mode) --> -<meta http-equiv="X-UA-Compatible" content="IE=edge" > - -<link rel="shortcut icon" href="images/favicon.ico" /> -<link rel="icon" type="image/png" href="images/favicon.png" /> -<link rel="stylesheet" type="text/css" href="resources/css/gxt-all.css" /> -<!-- New Grey / White Style --> -<link rel="stylesheet" type="text/css" href="resources/css/gxt-gray.css" /> -<link rel="stylesheet" type="text/css" href="resources/css/debug-panel.css" /> - -<!-- -// This script loads your compiled module. If you add any GWT meta tags, they must be added before this line. ---> -<script language="javascript" - src="ch.systemsx.cisd.openbis.plugin.proteomics.OpenBIS.nocache.js"></script> - -<!-- This snippet should be automatically included in all the HTML that wishes to use the debug panel. --> -<script type="text/javascript" language="javascript"> - var stats = window.__stats = []; - window.__gwtStatsEvent = function(evt) { - stats[stats.length] = evt; - var listener = window.__stats_listener; - listener && listener(evt); - return true; - } -</script> - -</head> -<!-- -// The body can have arbitrary html, or you can leave the body empty if you want to create a completely dynamic ui. ---> -<body> -<!-- Required by IE (GWT 1.7) --> -<iframe id="__gwt_historyFrame" style="width: 0; height: 0; border: 0"></iframe> -<div id="openbis_login_div" style="visibility: hidden"> -<form id="openbis_login_form" method="post" action="javascript:;"> -<table cellspacing="5"> - <tbody> - <tr style="padding-bottom: 5px"> - <td><span>User:</span></td> - <td><input type="text" id="openbis_login_username" - name="openbis-username" style="width: 150px;"></td> - </tr> - <tr style="padding-bottom: 5px"> - <td><span>Password:</span></td> - <td><input type="password" id="openbis_login_password" - name="openbis-password" style="width: 150px;"></td> - </tr> - </tbody> -</table> -<input style="margin-left: 200px" type="submit" id="openbis_login_submit" value="Login"> -</form> -</div> -</body> -</html> diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/public/proteomics-dictionary.js b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/public/proteomics-dictionary.js deleted file mode 100644 index d530628ec0e..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/public/proteomics-dictionary.js +++ /dev/null @@ -1,101 +0,0 @@ -// Proteomics dictionary -var proteomics = { - ALL_PROTEINS_OF_AN_EXPERIMENT_menu_item: "All Proteins of an Experiment", - ALL_PROTEINS_OF_AN_EXPERIMENT_tab_label: "Proteins of an Experiment", - selected_experiment_label: "Experiment", - false_discovery_rate_filter_label: "False Discovery Rate", - aggregate_function_label: "Aggregate Function", - aggregate_on_treatment_type_label: "Aggregate on", - aggregate_original_label: "Aggregate original", - - // Experiment View - data_set_processing_section_title: "Available Data Set Processing Tasks", - - // Protein grid - accession_number: "Accession Number", - protein_description: "Protein", - coverage: "Protein Coverage (in %)", - false_discovery_rate: "FDR", - fdr_combo_info: "<html><div style='width:250px'>This False Discovery Rate determines which ProteinProphet probability " + - "cut-off is applied to the combined ProteinProphet output. Only proteins above this " + - "probability are displayed in the table.<br/><br/>" + - "Note, that the spectral counts are not affected by this threshold and values for individual " + - "samples stay unchanged as long as the protein is displayed at all.</div></html>", - - // Protein in experiment viewer - loading_protein_details_waiting_message: "Loading details for protein {0}", - proteins_section: "Proteins", - protein_in_experiment_tab_label: "{0} in {1}", - experiment_label: "Experiment", - sequence_short_name: "Sequence Reference", - protein_browser: "Proteins", - protein_summary: "Protein/Peptide Counts", - database_name_and_version: "Database", - primary_protein: "Primary Protein and Peptides", - indistinguishable_proteins: "Indistinguishable Proteins", - sequence: "Amino Acid Sequence", - sequences: "Amino Acid Sequences", - data_set_proteins: "Data Sets", - data_set_perm_id: "Data Set", - protein_count: "Proteins (no decoy)", - peptide_count: "Peptides (no decoy)", - decoy_protein_count: "Proteins (decoy)", - decoy_peptide_count: "Peptides (decoy)", - peptides: "Peptides ({0})", - sequence_name: "Sequence Reference", - false_discovery_rate_column: "FDR (Protein Prophet)", - protein_probability: "Probability (Protein Prophet)", - button_delete_protein: "Delete Protein", - - // ProteinRelatedSampleGrid - openbis_protein_related_sample_grid_main_SAMPLE_IDENTIFIER: "Identifier", - openbis_protein_related_sample_grid_main_SAMPLE_TYPE: "Sample Type", - openbis_protein_related_sample_grid_main_ABUNDANCE: "Abundance", - openbis_protein_related_sample_grid_main_MODIFIED_AMINO_ACID: "Modified Amino Acid", - openbis_protein_related_sample_grid_main_MODIFICATION_POSITION: "Modification Position", - openbis_protein_related_sample_grid_main_MODIFICATION_MASS: "Modification Mass", - openbis_protein_related_sample_grid_main_MODIFICATION_FRACTION: "Modification Fraction", - - // MS_INJECTION annotation wizard - - MS_INJECTION_SAMPLE_CHOOSING_left_content: "MS data are added to openBIS in an automated process. " - + "The corresponding data sets are associated with samples of type <tt>MS_INJECTION</tt>." - + "<p>Before MS data of such samples can be processed in a protein identification pipeline " - + "they have to be <b>annotated</b>. In the terminology of openBIS this means: " - + "An <tt>MS_INJECTION</tt> sample is linked to a biological sample where " - + "the biological sample is the parent and the <tt>MS_INJECTION</tt> sample is the child. " - + "The biological sample has all annotations (called properties in openBIS). " - + "They define the scientific context of proteins found and have to be created " - + "by the user before the MS_INJECTION sample can be linked to it. " - + "<p>This wizard helps you adding these important annotations to openBIS.", - openbis_parentless_ms_injection_sample_main_IDENTIFIER: "MS_INJECTION Sample", - openbis_parentless_ms_injection_sample_main_REGISTRATION_DATE: "Registration Date", - CHOOSE_OR_CREATE_QUESTION_left_content: "Annotating the <tt>MS_INJECTION</tt> samples you have chosen " - + "means to link them to a <b>biological sample</b>. " - + "You can choose an existing biological sample or you can create a new one.", - BIOLOGICAL_SAMPLE_CHOOSING_left_content: "Annotating <tt>MS_INJECTION</tt> sample by choosing one biological sample means " - + "that all properties of the biological sample is also for the <tt>MS_INJECTION</tt> to be annotated.", - openbis_biological_sample_main_IDENTIFIER: "Biological Sample", - openbis_biological_sample_main_REGISTRATION_DATE: "Registration Date", - BIOLOGICAL_SAMPLE_CREATING_left_content: "Annotating <tt>MS_INJECTION</tt> sample by creating a new biological sample means " - + "mainly specifying properties of a freshly created biological sample in openBIS.", - - - // RawDataSample Browser - - ANNOTATE_MS_INJECTION_SAMPLES_menu_item: "Annotate MS INJECTION Samples", - ANNOTATE_MS_INJECTION_SAMPLES_tab_label: "MS INJECTION Samples Annotation Wizard", - ALL_RAW_DATA_SAMPLES_menu_item: "All MS INJECTION Samples", - ALL_RAW_DATA_SAMPLES_tab_label: "MS INJECTION Samples and Related Biological Samples", - openbis_raw_data_sample_browser_CODE: "MS INJECTION Sample", - openbis_raw_data_sample_browser_REGISTRATION_DATE: "Registration Date", - openbis_raw_data_sample_browser_PARENT: "Biological Sample", - openbis_raw_data_sample_browser_EXPERIMENT: "Biological Experiment", - copy_data_sets_button_label: "Process Data Sets", - copy_data_sets_title: "Process Data Sets", - copy_data_sets_message: "Please, enter the data set type of the data sets of the samples {1} to be processed by '{0}'.", - copy_data_sets_data_set_type_field: "Data Set Type", - - // LAST LINE: KEEP IT AT THE END - lastline: "" // we need a line without a comma -}; \ No newline at end of file diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/server/PhosphoNetXClientService.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/server/PhosphoNetXClientService.java deleted file mode 100644 index 645c5dc68d3..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/server/PhosphoNetXClientService.java +++ /dev/null @@ -1,405 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.client.web.server; - -import static ch.systemsx.cisd.common.utilities.SystemTimeProvider.SYSTEM_TIME_PROVIDER; - -import java.io.Serializable; -import java.lang.reflect.Method; -import java.util.Collections; -import java.util.List; - -import javax.annotation.Resource; - -import org.aopalliance.intercept.MethodInterceptor; -import org.aopalliance.intercept.MethodInvocation; -import org.apache.commons.lang3.time.StopWatch; -import org.springframework.aop.framework.ProxyFactory; -import org.springframework.aop.support.DefaultPointcutAdvisor; -import org.springframework.aop.support.annotation.AnnotationMatchingPointcut; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.stereotype.Component; - -import ch.rinn.restrictions.Private; -import ch.systemsx.cisd.common.filesystem.IFreeSpaceProvider; -import ch.systemsx.cisd.common.filesystem.SimpleFreeSpaceProvider; -import ch.systemsx.cisd.common.servlet.IRequestContextProvider; -import ch.systemsx.cisd.common.utilities.ITimeProvider; -import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DefaultResultSetConfig; -import ch.systemsx.cisd.openbis.generic.client.web.client.dto.IResultSetConfig; -import ch.systemsx.cisd.openbis.generic.client.web.client.dto.ResultSet; -import ch.systemsx.cisd.openbis.generic.client.web.client.dto.TableExportCriteria; -import ch.systemsx.cisd.openbis.generic.client.web.client.dto.TypedTableResultSet; -import ch.systemsx.cisd.openbis.generic.client.web.server.AbstractClientService; -import ch.systemsx.cisd.openbis.generic.client.web.server.resultset.DataProviderAdapter; -import ch.systemsx.cisd.openbis.generic.shared.ICommonServer; -import ch.systemsx.cisd.openbis.generic.shared.IServer; -import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewAttachment; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewSample; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ServiceVersionHolder; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRowWithObject; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Vocabulary; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.WebClientConfiguration; -import ch.systemsx.cisd.openbis.generic.shared.dto.SampleUpdatesDTO; -import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifier; -import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifierFactory; -import ch.systemsx.cisd.openbis.generic.shared.util.CacheManager; -import ch.systemsx.cisd.openbis.generic.shared.util.ICacheManager; -import ch.systemsx.cisd.openbis.generic.shared.util.Key; -import ch.systemsx.cisd.openbis.plugin.generic.shared.IGenericServer; -import ch.systemsx.cisd.openbis.plugin.proteomics.BuildAndEnvironmentInfo; -import ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.Constants; -import ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.IPhosphoNetXClientService; -import ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.dto.ListProteinByExperimentAndReferenceCriteria; -import ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.dto.ListProteinByExperimentCriteria; -import ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.dto.ListProteinSequenceCriteria; -import ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.dto.ListProteinSummaryByExperimentCriteria; -import ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.dto.ListSampleAbundanceByProteinCriteria; -import ch.systemsx.cisd.openbis.plugin.proteomics.client.web.server.resultset.BiologicalSampleProvider; -import ch.systemsx.cisd.openbis.plugin.proteomics.client.web.server.resultset.DataSetProteinProvider; -import ch.systemsx.cisd.openbis.plugin.proteomics.client.web.server.resultset.ParentlessMsInjectionSampleProvider; -import ch.systemsx.cisd.openbis.plugin.proteomics.client.web.server.resultset.ProteinProvider; -import ch.systemsx.cisd.openbis.plugin.proteomics.client.web.server.resultset.ProteinRelatedSampleProvider; -import ch.systemsx.cisd.openbis.plugin.proteomics.client.web.server.resultset.ProteinSequenceProvider; -import ch.systemsx.cisd.openbis.plugin.proteomics.client.web.server.resultset.ProteinSummaryProvider; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.CacheData; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.IPhosphoNetXServer; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.IProteomicsDataServiceInternal; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.ResourceNames; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.AbundanceColumnDefinition; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.AggregateFunction; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.DataSetProtein; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.ProteinByExperiment; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.ProteinInfo; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.ProteinRelatedSample; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.ProteinSequence; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.ProteinSummary; - -/** - * @author Franz-Josef Elmer - */ -@Component(value = ResourceNames.PROTEOMICS_PLUGIN_SERVICE) -public class PhosphoNetXClientService extends AbstractClientService implements - IPhosphoNetXClientService, InitializingBean -{ - private static final String CACHE_VERSION = Integer.toString(ServiceVersionHolder.VERSION); - - @Resource(name = ch.systemsx.cisd.openbis.generic.shared.ResourceNames.COMMON_SERVER) - private ICommonServer commonServer; - - @Resource(name = ch.systemsx.cisd.openbis.plugin.generic.shared.ResourceNames.GENERIC_PLUGIN_SERVER) - private IGenericServer genericServer; - - @Resource(name = ResourceNames.PROTEOMICS_PLUGIN_SERVER) - @Private - IPhosphoNetXServer server; - - @Resource(name = ResourceNames.PROTEOMICS_RAW_DATA_SERVICE_WEB) - private IProteomicsDataServiceInternal proteomicsDataService; - - @Private - ITimeProvider timeProvider = SYSTEM_TIME_PROVIDER; - - public PhosphoNetXClientService() - { - super(); - } - - public PhosphoNetXClientService(IRequestContextProvider requestContextProvider) - { - super(requestContextProvider); - } - - @Override - public void afterPropertiesSet() throws Exception - { - WebClientConfiguration webClientConfiguration = getWebClientConfiguration(); - IFreeSpaceProvider freeSpaceProvider = new SimpleFreeSpaceProvider(); - final ICacheManager cacheManager = - new CacheManager(webClientConfiguration, Constants.TECHNOLOGY_NAME, - timeProvider, freeSpaceProvider, CACHE_VERSION); - ProxyFactory proxyFactory = new ProxyFactory(server); - proxyFactory.addInterface(IPhosphoNetXServer.class); - AnnotationMatchingPointcut pointcut = - AnnotationMatchingPointcut.forMethodAnnotation(CacheData.class); - proxyFactory.addAdvisor(new DefaultPointcutAdvisor(pointcut, new MethodInterceptor() - { - @Override - public Object invoke(MethodInvocation methodInvocation) throws Throwable - { - // assuming first argument is sessionToken which shouldn't be a part of the key - Object[] arguments = methodInvocation.getArguments(); - Object[] keyArguments = new Serializable[arguments.length]; - Method method = methodInvocation.getMethod(); - keyArguments[0] = method.getName(); - for (int i = 1; i < keyArguments.length; i++) - { - keyArguments[i] = arguments[i]; - } - Key key = new Key(keyArguments); - Object data = cacheManager.tryToGetData(key); - if (data == null) - { - Object serverObject = methodInvocation.getThis(); - data = method.invoke(serverObject, arguments); - cacheManager.storeData(key, data); - } - return data; - } - })); - server = (IPhosphoNetXServer) proxyFactory.getProxy(); - } - - @Override - protected IServer getServer() - { - return server; - } - - @Override - protected String getVersion() - { - return BuildAndEnvironmentInfo.INSTANCE.getFullVersion(); - } - - @Override - public TypedTableResultSet<Sample> listParentlessMsInjectionSamples( - DefaultResultSetConfig<String, TableModelRowWithObject<Sample>> criteria) - throws ch.systemsx.cisd.openbis.generic.client.web.client.exception.UserFailureException - { - String sessionToken = getSessionToken(); - return listEntities(new ParentlessMsInjectionSampleProvider(commonServer, sessionToken), - criteria); - } - - @Override - public TypedTableResultSet<Sample> listBiologicalSamples( - DefaultResultSetConfig<String, TableModelRowWithObject<Sample>> criteria) - throws ch.systemsx.cisd.openbis.generic.client.web.client.exception.UserFailureException - { - String sessionToken = getSessionToken(); - return listEntities(new BiologicalSampleProvider(commonServer, sessionToken), criteria); - } - - @Override - public void linkSamples(Sample parentSample, List<Sample> childSamples) - throws ch.systemsx.cisd.openbis.generic.client.web.client.exception.UserFailureException - { - String sessionToken = getSessionToken(); - linkSamples(sessionToken, parentSample.getIdentifier(), childSamples); - } - - @Override - public void createAndLinkSamples(NewSample newBiologicalSample, List<Sample> msInjectionSamples) - throws ch.systemsx.cisd.openbis.generic.client.web.client.exception.UserFailureException - { - String sessionToken = getSessionToken(); - List<NewAttachment> noAttachments = Collections.<NewAttachment> emptyList(); - genericServer.registerSample(sessionToken, newBiologicalSample, noAttachments); - linkSamples(sessionToken, newBiologicalSample.getIdentifier(), msInjectionSamples); - } - - private void linkSamples(String sessionToken, String identifier, List<Sample> childSamples) - { - String[] parents = new String[] - { identifier }; - for (Sample childSample : childSamples) - { - SampleIdentifier childSampleIdentifier = - SampleIdentifierFactory.parse(childSample.getIdentifier()); - SampleUpdatesDTO update = - new SampleUpdatesDTO(new TechId(childSample), - Collections.<IEntityProperty> emptyList(), null, null, - Collections.<NewAttachment> emptyList(), - childSample.getVersion(), childSampleIdentifier, null, parents); - update.setUpdateExperimentLink(false); - genericServer.updateSample(sessionToken, update); - } - } - - @Override - public Vocabulary getTreatmentTypeVocabulary() - { - final String sessionToken = getSessionToken(); - return server.getTreatmentTypeVocabulary(sessionToken); - } - - @Override - public List<AbundanceColumnDefinition> getAbundanceColumnDefinitionsForProteinByExperiment( - TechId experimentID, String treatmentTypeOrNull) - { - StopWatch stopWatch = new StopWatch(); - stopWatch.start(); - try - { - final String sessionToken = getSessionToken(); - return server.getAbundanceColumnDefinitionsForProteinByExperiment(sessionToken, - experimentID, treatmentTypeOrNull); - } finally - { - operationLog.info(stopWatch.getTime() - + " msec for getAbundanceColumnDefinitionsForProteinByExperiment"); - } - } - - @Override - public TypedTableResultSet<ProteinInfo> listProteinsByExperiment( - ListProteinByExperimentCriteria criteria) - { - StopWatch stopWatch = new StopWatch(); - stopWatch.start(); - try - { - final String sessionToken = getSessionToken(); - TechId experimentID = criteria.getExperimentID(); - double fdr = criteria.getFalseDiscoveryRate(); - AggregateFunction aggregateFunction = criteria.getAggregateFunction(); - String treatmentTypeCode = criteria.getTreatmentTypeCode(); - boolean aggregateOnOriginal = criteria.isAggregateOriginal(); - return listEntities(new ProteinProvider(server, sessionToken, experimentID, fdr, - aggregateFunction, treatmentTypeCode, aggregateOnOriginal), criteria); - } finally - { - operationLog.info(stopWatch.getTime() + " msec for listProteinsByExperiment"); - } - } - - @Override - public String prepareExportProteins(TableExportCriteria<TableModelRowWithObject<ProteinInfo>> exportCriteria) - { - return prepareExportEntities(exportCriteria); - } - - @Override - public TypedTableResultSet<ProteinSummary> listProteinSummariesByExperiment( - ListProteinSummaryByExperimentCriteria criteria) - { - StopWatch stopWatch = new StopWatch(); - stopWatch.start(); - try - { - final String sessionToken = getSessionToken(); - return listEntities( - new ProteinSummaryProvider(server, sessionToken, criteria.getExperimentID()), - criteria); - } finally - { - operationLog.info(stopWatch.getTime() + " msec for listProteinSummariesByExperiment"); - } - } - - @Override - public String prepareExportProteinSummary( - TableExportCriteria<TableModelRowWithObject<ProteinSummary>> exportCriteria) - { - return prepareExportEntities(exportCriteria); - } - - @Override - public ProteinByExperiment getProteinByExperiment(TechId experimentID, TechId proteinReferenceID) - { - final String sessionToken = getSessionToken(); - return server.getProteinByExperiment(sessionToken, experimentID, proteinReferenceID); - } - - @Override - public TypedTableResultSet<ProteinSequence> listSequencesByProteinReference( - ListProteinSequenceCriteria criteria) - { - final String sessionToken = getSessionToken(); - return listEntities( - new ProteinSequenceProvider(server, sessionToken, criteria.getExperimentID(), criteria.getProteinReferenceID()), - criteria); - } - - @Override - public String prepareExportProteinSequences( - TableExportCriteria<TableModelRowWithObject<ProteinSequence>> exportCriteria) - { - return prepareExportEntities(exportCriteria); - } - - @Override - public TypedTableResultSet<DataSetProtein> listProteinsByExperimentAndReference( - ListProteinByExperimentAndReferenceCriteria criteria) - { - final String sessionToken = getSessionToken(); - return listEntities( - new DataSetProteinProvider(server, sessionToken, criteria.getExperimentID(), - criteria.getProteinReferenceID()), criteria); - } - - @Override - public String prepareExportDataSetProteins( - TableExportCriteria<TableModelRowWithObject<DataSetProtein>> exportCriteria) - { - return prepareExportEntities(exportCriteria); - } - - @Override - public TypedTableResultSet<ProteinRelatedSample> listProteinRelatedSamplesByProtein( - ListSampleAbundanceByProteinCriteria criteria) - { - final String sessionToken = getSessionToken(); - ProteinRelatedSampleProvider provider = - new ProteinRelatedSampleProvider(server, sessionToken, criteria.getExperimentID(), - criteria.getProteinReferenceID()); - return listEntities(provider, criteria); - } - - @Override - public String prepareExportProteinRelatedSamples( - TableExportCriteria<TableModelRowWithObject<ProteinRelatedSample>> exportCriteria) - throws ch.systemsx.cisd.openbis.generic.client.web.client.exception.UserFailureException - { - return prepareExportEntities(exportCriteria); - } - - @Override - public TypedTableResultSet<Sample> listRawDataSamples( - IResultSetConfig<String, TableModelRowWithObject<Sample>> criteria) - throws ch.systemsx.cisd.openbis.generic.client.web.client.exception.UserFailureException - { - final String sessionToken = getSessionToken(); - RawDataSampleProvider rawDataSampleProvider = - new RawDataSampleProvider(proteomicsDataService, sessionToken); - DataProviderAdapter<Sample> dataProvider = - new DataProviderAdapter<Sample>(rawDataSampleProvider); - ResultSet<TableModelRowWithObject<Sample>> resultSet = listEntities(criteria, dataProvider); - return new TypedTableResultSet<Sample>(resultSet); - } - - @Override - public String prepareExportRawDataSamples( - TableExportCriteria<TableModelRowWithObject<Sample>> exportCriteria) - { - return prepareExportEntities(exportCriteria); - } - - @Override - @SuppressWarnings("deprecation") - public void processRawData(String dataSetProcessingKey, long[] rawDataSampleIDs, - String dataSetType) - { - proteomicsDataService.processRawData(getSessionToken(), dataSetProcessingKey, - rawDataSampleIDs, dataSetType); - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/server/PhosphoNetXClientServiceServlet.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/server/PhosphoNetXClientServiceServlet.java deleted file mode 100644 index ef4ee6191f3..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/server/PhosphoNetXClientServiceServlet.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.client.web.server; - -import javax.annotation.Resource; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.servlet.ModelAndView; - -import ch.systemsx.cisd.common.servlet.GWTRPCServiceExporter; -import ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.IPhosphoNetXClientService; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.ResourceNames; - -/** - * @author Franz-Josef Elmer - */ -@Controller -public class PhosphoNetXClientServiceServlet extends GWTRPCServiceExporter -{ - private static final long serialVersionUID = 1L; - - @Resource(name = ResourceNames.PROTEOMICS_PLUGIN_SERVICE) - private IPhosphoNetXClientService service; - - @RequestMapping({ "/proteomics", "/openbis/proteomics" }) - public final ModelAndView handleRequestExposed(final HttpServletRequest request, - final HttpServletResponse response) throws Exception - { - return super.handleRequest(request, response); - } - - @Override - protected Object getService() - { - return service; - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/server/RawDataSampleProvider.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/server/RawDataSampleProvider.java deleted file mode 100644 index 90fe409c4b9..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/server/RawDataSampleProvider.java +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.client.web.server; - -import static ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.RawDataSampleGridIDs.CODE; -import static ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.RawDataSampleGridIDs.EXPERIMENT; -import static ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.RawDataSampleGridIDs.PARENT; -import static ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.RawDataSampleGridIDs.REGISTRATION_DATE; - -import java.util.List; - -import ch.systemsx.cisd.openbis.generic.client.web.server.resultset.AbstractTableModelProvider; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataTypeCode; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TypedTableModel; -import ch.systemsx.cisd.openbis.generic.shared.util.TypedTableModelBuilder; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.IProteomicsDataServiceInternal; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.dto.MsInjectionSample; - -/** - * @author Franz-Josef Elmer - */ -class RawDataSampleProvider extends AbstractTableModelProvider<Sample> -{ - private final IProteomicsDataServiceInternal service; - - private final String sessionToken; - - RawDataSampleProvider(IProteomicsDataServiceInternal service, String sessionToken) - { - this.service = service; - this.sessionToken = sessionToken; - } - - @Override - public TypedTableModel<Sample> createTableModel() - { - List<MsInjectionSample> samples = service.listRawDataSamples(sessionToken); - TypedTableModelBuilder<Sample> builder = new TypedTableModelBuilder<Sample>(); - builder.addColumn(CODE).withDataType(DataTypeCode.VARCHAR); - builder.addColumn(REGISTRATION_DATE).withDataType(DataTypeCode.TIMESTAMP) - .withDefaultWidth(190); - builder.addColumn(PARENT).withDataType(DataTypeCode.VARCHAR); - builder.addColumn(EXPERIMENT).withDataType(DataTypeCode.VARCHAR); - for (MsInjectionSample msInjectionSample : samples) - { - Sample sample = msInjectionSample.getSample(); - builder.addRow(sample); - builder.column(CODE).addString(sample.getCode()); - builder.column(REGISTRATION_DATE).addDate(sample.getRegistrationDate()); - Sample parent = sample.getGeneratedFrom(); - builder.column(PARENT).addString(parent.getIdentifier()); - Experiment experiment = parent.getExperiment(); - if (experiment != null) - { - builder.column(EXPERIMENT).addString(experiment.getIdentifier()); - } - builder.columnGroup("MS").addProperties("", sample.getProperties()); - builder.columnGroup("BIO_").addProperties(parent.getProperties()); - } - return builder.getModel(); - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/server/resultset/BiologicalSampleProvider.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/server/resultset/BiologicalSampleProvider.java deleted file mode 100644 index 8cf8b0eb5d5..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/server/resultset/BiologicalSampleProvider.java +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright 2011 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.client.web.server.resultset; - -import static ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.dto.BiologicalSampleGridColumnIDs.IDENTIFIER; -import static ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.dto.BiologicalSampleGridColumnIDs.REGISTRATION_DATE; - -import java.util.Arrays; -import java.util.List; - -import ch.systemsx.cisd.openbis.generic.client.web.server.resultset.AbstractCommonTableModelProvider; -import ch.systemsx.cisd.openbis.generic.shared.ICommonServer; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DetailedSearchCriteria; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DetailedSearchCriterion; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DetailedSearchField; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleAttributeSearchFieldKind; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SearchCriteriaConnection; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TypedTableModel; -import ch.systemsx.cisd.openbis.generic.shared.util.TypedTableModelBuilder; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.CommonConstants; - -/** - * Provider of biological samples registered by the user. A biological sample is a sample with sample type code starting with BIO. - * - * @author Franz-Josef Elmer - */ -public class BiologicalSampleProvider extends AbstractCommonTableModelProvider<Sample> -{ - public BiologicalSampleProvider(ICommonServer commonServer, String sessionToken) - { - super(commonServer, sessionToken); - } - - @Override - protected TypedTableModel<Sample> createTableModel() - { - DetailedSearchCriteria criteria = new DetailedSearchCriteria(); - criteria.setConnection(SearchCriteriaConnection.MATCH_ALL); - DetailedSearchCriterion typeCriterion = new DetailedSearchCriterion(); - typeCriterion.setField(DetailedSearchField - .createAttributeField(SampleAttributeSearchFieldKind.SAMPLE_TYPE)); - typeCriterion.setValue(CommonConstants.BIOLOGICAL_SAMPLE_PREFIX + "*"); - DetailedSearchCriterion registratorCriterion = new DetailedSearchCriterion(); - String userName = commonServer.tryGetSession(sessionToken).getUserName(); - registratorCriterion.setField(DetailedSearchField.createRegistratorField()); - registratorCriterion.setValue(userName); - criteria.setCriteria(Arrays.asList(typeCriterion, registratorCriterion)); - List<Sample> samples = commonServer.searchForSamples(sessionToken, criteria); - TypedTableModelBuilder<Sample> builder = new TypedTableModelBuilder<Sample>(); - builder.addColumn(IDENTIFIER); - builder.addColumn(REGISTRATION_DATE); - for (Sample sample : samples) - { - builder.addRow(sample); - builder.column(IDENTIFIER).addString(sample.getIdentifier()); - builder.column(REGISTRATION_DATE).addDate(sample.getRegistrationDate()); - builder.columnGroup("PROPERTY").uneditablePropertyColumns() - .addProperties(sample.getProperties()); - } - return builder.getModel(); - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/server/resultset/DataSetProteinProvider.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/server/resultset/DataSetProteinProvider.java deleted file mode 100644 index 1624dc59835..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/server/resultset/DataSetProteinProvider.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright 2011 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.client.web.server.resultset; - -import static ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.dto.DataSetProteinGridColumnIDs.DATA_SET_PERM_ID; -import static ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.dto.DataSetProteinGridColumnIDs.FDR; -import static ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.dto.DataSetProteinGridColumnIDs.PEPTIDE_COUNT; -import static ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.dto.DataSetProteinGridColumnIDs.SEQUENCE_NAME; - -import java.util.List; - -import ch.systemsx.cisd.openbis.generic.client.web.server.resultset.AbstractTableModelProvider; -import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataTypeCode; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TypedTableModel; -import ch.systemsx.cisd.openbis.generic.shared.util.TypedTableModelBuilder; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.IPhosphoNetXServer; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.DataSetProtein; - -/** - * Provider of {@link DataSetProtein} instances. - * - * @author Franz-Josef Elmer - */ -public class DataSetProteinProvider extends AbstractTableModelProvider<DataSetProtein> -{ - private final IPhosphoNetXServer server; - - private final String sessionToken; - - private final TechId experimentID; - - private final TechId proteinReferenceID; - - public DataSetProteinProvider(IPhosphoNetXServer server, String sessionToken, - TechId experimentID, TechId proteinReferenceID) - { - this.server = server; - this.sessionToken = sessionToken; - this.experimentID = experimentID; - this.proteinReferenceID = proteinReferenceID; - } - - @Override - protected TypedTableModel<DataSetProtein> createTableModel() - { - List<DataSetProtein> proteins = - server.listProteinsByExperimentAndReference(sessionToken, experimentID, - proteinReferenceID); - TypedTableModelBuilder<DataSetProtein> builder = - new TypedTableModelBuilder<DataSetProtein>(); - builder.addColumn(DATA_SET_PERM_ID).withDefaultWidth(200); - builder.addColumn(SEQUENCE_NAME).withDefaultWidth(80); - builder.addColumn(PEPTIDE_COUNT).withDataType(DataTypeCode.INTEGER).withDefaultWidth(80); - builder.addColumn(FDR).withDefaultWidth(80); - for (DataSetProtein protein : proteins) - { - builder.addRow(protein); - builder.column(DATA_SET_PERM_ID).addString(protein.getDataSetPermID()); - builder.column(SEQUENCE_NAME).addString(protein.getSequenceName()); - builder.column(PEPTIDE_COUNT).addInteger((long) protein.getPeptideCount()); - int perMille = (int) (1000 * protein.getFalseDiscoveryRate() + 0.5); - builder.column(FDR).addString((perMille / 10) + "." + (perMille % 10) + " %"); - } - return builder.getModel(); - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/server/resultset/ParentlessMsInjectionSampleProvider.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/server/resultset/ParentlessMsInjectionSampleProvider.java deleted file mode 100644 index 3b9feeeef9e..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/server/resultset/ParentlessMsInjectionSampleProvider.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright 2011 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.client.web.server.resultset; - -import static ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.dto.ParentlessMsInjectionSampleGridColumnIDs.IDENTIFIER; -import static ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.dto.ParentlessMsInjectionSampleGridColumnIDs.REGISTRATION_DATE; - -import java.util.Arrays; -import java.util.List; - -import ch.systemsx.cisd.openbis.generic.client.web.server.resultset.AbstractCommonTableModelProvider; -import ch.systemsx.cisd.openbis.generic.shared.ICommonServer; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DetailedSearchCriteria; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DetailedSearchCriterion; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DetailedSearchField; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleAttributeSearchFieldKind; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SearchCriteriaConnection; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TypedTableModel; -import ch.systemsx.cisd.openbis.generic.shared.util.TypedTableModelBuilder; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.CommonConstants; - -/** - * Provider of MS_INJECTION samples registered for the user. - * - * @author Franz-Josef Elmer - */ -public class ParentlessMsInjectionSampleProvider extends AbstractCommonTableModelProvider<Sample> -{ - public ParentlessMsInjectionSampleProvider(ICommonServer commonServer, String sessionToken) - { - super(commonServer, sessionToken); - } - - @Override - protected TypedTableModel<Sample> createTableModel() - { - DetailedSearchCriteria criteria = new DetailedSearchCriteria(); - criteria.setConnection(SearchCriteriaConnection.MATCH_ALL); - DetailedSearchCriterion typeCriterion = new DetailedSearchCriterion(); - typeCriterion.setField(DetailedSearchField - .createAttributeField(SampleAttributeSearchFieldKind.SAMPLE_TYPE)); - typeCriterion.setValue(CommonConstants.MS_INJECTION_SAMPLE_TYPE_CODE); - DetailedSearchCriterion spaceCriterion = new DetailedSearchCriterion(); - spaceCriterion.setField(DetailedSearchField - .createAttributeField(SampleAttributeSearchFieldKind.SPACE)); - spaceCriterion.setValue(CommonConstants.MS_DATA_SPACE); - DetailedSearchCriterion registratorCriterion = new DetailedSearchCriterion(); - String userName = commonServer.tryGetSession(sessionToken).getUserName(); - registratorCriterion.setField(DetailedSearchField.createRegistratorField()); - registratorCriterion.setValue(userName); - criteria.setCriteria(Arrays.asList(typeCriterion, spaceCriterion, registratorCriterion)); - List<Sample> samples = commonServer.searchForSamples(sessionToken, criteria); - TypedTableModelBuilder<Sample> builder = new TypedTableModelBuilder<Sample>(); - builder.addColumn(IDENTIFIER).withDefaultWidth(300); - builder.addColumn(REGISTRATION_DATE).withDefaultWidth(300); - for (Sample sample : samples) - { - if (sample.getGeneratedFrom() == null) - { - builder.addRow(sample); - builder.column(IDENTIFIER).addString(sample.getIdentifier()); - builder.column(REGISTRATION_DATE).addDate(sample.getRegistrationDate()); - } - } - return builder.getModel(); - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/server/resultset/ProteinProvider.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/server/resultset/ProteinProvider.java deleted file mode 100644 index 38513cf59f0..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/server/resultset/ProteinProvider.java +++ /dev/null @@ -1,160 +0,0 @@ -/* - * Copyright 2011 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.client.web.server.resultset; - -import static ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.dto.ProteinBrowserColumnIDs.ACCESSION_NUMBER; -import static ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.dto.ProteinBrowserColumnIDs.COVERAGE; -import static ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.dto.ProteinBrowserColumnIDs.PROTEIN_DESCRIPTION; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; - -import ch.systemsx.cisd.base.exceptions.CheckedExceptionTunnel; -import ch.systemsx.cisd.common.exceptions.HighLevelException; -import ch.systemsx.cisd.openbis.generic.client.web.server.resultset.AbstractTableModelProvider; -import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TypedTableModel; -import ch.systemsx.cisd.openbis.generic.shared.util.IColumn; -import ch.systemsx.cisd.openbis.generic.shared.util.TypedTableModelBuilder; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.IPhosphoNetXServer; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.AbundanceColumnDefinition; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.AggregateFunction; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.ProteinInfo; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.Treatment; - -/** - * Provider of {@link ProteinInfo} instances. - * - * @author Franz-Josef Elmer - */ -public class ProteinProvider extends AbstractTableModelProvider<ProteinInfo> -{ - private static final String ABUNDANCE_PROPERTY_KEY = "ABUNDANCE"; - - private final IPhosphoNetXServer server; - - private final String sessionToken; - - private final TechId experimentID; - - private final double falseDiscoveryRate; - - private final AggregateFunction aggregateFunction; - - private final String treatmentTypeCode; - - private final boolean aggregateOnOriginal; - - public ProteinProvider(IPhosphoNetXServer server, String sessionToken, TechId experimentID, - double falseDiscoveryRate, AggregateFunction function, String treatmentTypeCode, - boolean aggregateOnOriginal) - { - this.server = server; - this.sessionToken = sessionToken; - this.experimentID = experimentID; - this.falseDiscoveryRate = falseDiscoveryRate; - this.aggregateFunction = function; - this.treatmentTypeCode = treatmentTypeCode; - this.aggregateOnOriginal = aggregateOnOriginal; - } - - @Override - protected TypedTableModel<ProteinInfo> createTableModel() - { - try - { - - List<AbundanceColumnDefinition> abundanceColumnDefinitions = - server.getAbundanceColumnDefinitionsForProteinByExperiment(sessionToken, - experimentID, treatmentTypeCode); - List<ProteinInfo> proteins = - server.listProteinsByExperiment(sessionToken, experimentID, falseDiscoveryRate, - aggregateFunction, treatmentTypeCode, aggregateOnOriginal); - TypedTableModelBuilder<ProteinInfo> builder = new TypedTableModelBuilder<ProteinInfo>(); - builder.addColumn(ACCESSION_NUMBER); - builder.addColumn(PROTEIN_DESCRIPTION); - builder.addColumn(COVERAGE).withDefaultWidth(100); - Map<Long, IColumn> sampleIdToAbundanceColumnMap = new HashMap<Long, IColumn>(); - for (AbundanceColumnDefinition abundanceColumnDefinition : abundanceColumnDefinitions) - { - long sampleID = abundanceColumnDefinition.getID(); - String columnID = "abundance-" + Long.toString(sampleID); - builder.addColumn(columnID).withDefaultWidth(100); - IColumn column = builder.column(columnID); - sampleIdToAbundanceColumnMap.put(sampleID, column); - String header = abundanceColumnDefinition.getSampleCode(); - Map<String, String> properties = new HashMap<String, String>(); - properties.put(ABUNDANCE_PROPERTY_KEY, header); - List<Treatment> treatments = abundanceColumnDefinition.getTreatments(); - if (treatments.isEmpty() == false) - { - String delim; - if (header == null) - { - header = ""; - delim = ""; - } else - { - delim = ": "; - } - for (Treatment treatment : treatments) - { - header += delim + treatment; - delim = ", "; - column.property(treatment.getTypeCode(), treatment.getValue()); - } - } - column.withTitle(header); - } - for (ProteinInfo protein : proteins) - { - builder.addRow(protein); - builder.column(ACCESSION_NUMBER).addString(protein.getAccessionNumber()); - builder.column(PROTEIN_DESCRIPTION).addString(protein.getDescription()); - builder.column(COVERAGE).addDouble(protein.getCoverage()); - Map<Long, Double> abundances = protein.getAbundances(); - Set<Entry<Long, Double>> entrySet = abundances.entrySet(); - for (Entry<Long, Double> entry : entrySet) - { - IColumn column = sampleIdToAbundanceColumnMap.get(entry.getKey()); - if (column != null) - { - column.addDouble(entry.getValue()); - } - } - } - return builder.getModel(); - } catch (Exception e) - { - Throwable t = e; - while (t != null) - { - if (t instanceof HighLevelException) - { - throw (HighLevelException) t; - } - t = t.getCause(); - } - throw CheckedExceptionTunnel.wrapIfNecessary(e); - } - - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/server/resultset/ProteinRelatedSampleProvider.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/server/resultset/ProteinRelatedSampleProvider.java deleted file mode 100644 index 5cec3d17095..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/server/resultset/ProteinRelatedSampleProvider.java +++ /dev/null @@ -1,112 +0,0 @@ -/* - * Copyright 2011 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.client.web.server.resultset; - -import static ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataTypeCode.INTEGER; -import static ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataTypeCode.REAL; -import static ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.dto.ProteinRelatedSampleGridColumnIDs.ABUNDANCE; -import static ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.dto.ProteinRelatedSampleGridColumnIDs.MODIFICATION_FRACTION; -import static ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.dto.ProteinRelatedSampleGridColumnIDs.MODIFICATION_MASS; -import static ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.dto.ProteinRelatedSampleGridColumnIDs.MODIFICATION_POSITION; -import static ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.dto.ProteinRelatedSampleGridColumnIDs.MODIFIED_AMINO_ACID; -import static ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.dto.ProteinRelatedSampleGridColumnIDs.SAMPLE_IDENTIFIER; -import static ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.dto.ProteinRelatedSampleGridColumnIDs.SAMPLE_TYPE; - -import java.util.List; - -import ch.systemsx.cisd.openbis.generic.client.web.server.resultset.AbstractTableModelProvider; -import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TypedTableModel; -import ch.systemsx.cisd.openbis.generic.shared.util.TypedTableModelBuilder; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.IPhosphoNetXServer; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.AminoAcid; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.ProteinRelatedSample; - -/** - * Provider of {@link ProteinRelatedSample}. - * - * @author Franz-Josef Elmer - */ -public class ProteinRelatedSampleProvider extends AbstractTableModelProvider<ProteinRelatedSample> -{ - private static final String PROPERTIES_GROUP = "property-"; - - private final IPhosphoNetXServer server; - - private final String sessionToken; - - private final TechId experimentID; - - private final TechId proteinReferenceID; - - public ProteinRelatedSampleProvider(IPhosphoNetXServer server, String sessionToken, - TechId experimentID, TechId proteinReferenceID) - { - this.server = server; - this.sessionToken = sessionToken; - this.experimentID = experimentID; - this.proteinReferenceID = proteinReferenceID; - } - - @Override - protected TypedTableModel<ProteinRelatedSample> createTableModel() - { - List<ProteinRelatedSample> samples = - server.listProteinRelatedSamplesByProtein(sessionToken, experimentID, - proteinReferenceID); - TypedTableModelBuilder<ProteinRelatedSample> builder = - new TypedTableModelBuilder<ProteinRelatedSample>(); - builder.column(SAMPLE_IDENTIFIER); - builder.column(SAMPLE_TYPE); - builder.column(ABUNDANCE).withDataType(REAL).withDefaultWidth(100); - builder.column(MODIFIED_AMINO_ACID); - builder.column(MODIFICATION_POSITION).withDataType(INTEGER).withDefaultWidth(100); - builder.column(MODIFICATION_MASS).withDataType(REAL).withDefaultWidth(100); - builder.column(MODIFICATION_FRACTION).withDataType(REAL).withDefaultWidth(100); - for (ProteinRelatedSample sample : samples) - { - builder.addRow(sample); - builder.column(SAMPLE_IDENTIFIER).addString(sample.getIdentifier()); - builder.column(SAMPLE_TYPE).addString(sample.getEntityType().getCode()); - builder.column(ABUNDANCE).addDouble(sample.getAbundance()); - builder.column(MODIFIED_AMINO_ACID).addString(getAminoAcidName(sample)); - builder.column(MODIFICATION_POSITION).addInteger(sample.getModificationPosition()); - builder.column(MODIFICATION_MASS).addDouble(sample.getModificationMass()); - builder.column(MODIFICATION_FRACTION).addDouble(sample.getModificationFraction()); - builder.columnGroup(PROPERTIES_GROUP).addProperties(sample.getProperties()); - } - return builder.getModel(); - } - - private String getAminoAcidName(ProteinRelatedSample sample) - { - char modifiedAminoAcid = sample.getModifiedAminoAcid(); - if (modifiedAminoAcid == 0) - { - return null; - } - try - { - char aminoAcidSymbol = Character.toUpperCase(modifiedAminoAcid); - return AminoAcid.valueOf(Character.toString(aminoAcidSymbol)).getName(); - } catch (IllegalArgumentException ex) - { - return "?"; - } - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/server/resultset/ProteinSequenceProvider.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/server/resultset/ProteinSequenceProvider.java deleted file mode 100644 index 12bab9a5210..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/server/resultset/ProteinSequenceProvider.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright 2011 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.client.web.server.resultset; - -import static ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.dto.ProteinSequenceGridColumnIDs.DATABASE_NAME_AND_VERSION; -import static ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.dto.ProteinSequenceGridColumnIDs.SEQUENCE; -import static ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.dto.ProteinSequenceGridColumnIDs.SEQUENCE_SHORT_NAME; - -import java.util.List; - -import ch.systemsx.cisd.openbis.generic.client.web.server.resultset.AbstractTableModelProvider; -import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TypedTableModel; -import ch.systemsx.cisd.openbis.generic.shared.util.TypedTableModelBuilder; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.IPhosphoNetXServer; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.ProteinSequence; - -/** - * Provider of {@link ProteinSequence} instances. - * - * @author Franz-Josef Elmer - */ -public class ProteinSequenceProvider extends AbstractTableModelProvider<ProteinSequence> -{ - private final IPhosphoNetXServer server; - - private final String sessionToken; - - private final TechId experimentID; - - private final TechId proteinReferenceID; - - public ProteinSequenceProvider(IPhosphoNetXServer server, String sessionToken, - TechId experimentID, TechId proteinReferenceID) - { - this.server = server; - this.sessionToken = sessionToken; - this.experimentID = experimentID; - this.proteinReferenceID = proteinReferenceID; - } - - @Override - protected TypedTableModel<ProteinSequence> createTableModel() - { - List<ProteinSequence> sequences = - server.listProteinSequencesByProteinReference(sessionToken, experimentID, proteinReferenceID); - TypedTableModelBuilder<ProteinSequence> builder = - new TypedTableModelBuilder<ProteinSequence>(); - builder.addColumn(SEQUENCE_SHORT_NAME).withDefaultWidth(20); - builder.addColumn(DATABASE_NAME_AND_VERSION); - builder.addColumn(SEQUENCE).withDefaultWidth(400); - for (ProteinSequence sequence : sequences) - { - builder.addRow(sequence); - builder.column(SEQUENCE_SHORT_NAME).addString(sequence.getShortName()); - builder.column(DATABASE_NAME_AND_VERSION).addString( - sequence.getDatabaseNameAndVersion()); - builder.column(SEQUENCE).addString(sequence.getSequence()); - } - return builder.getModel(); - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/server/resultset/ProteinSummaryProvider.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/server/resultset/ProteinSummaryProvider.java deleted file mode 100644 index 4f2b5a1093b..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/server/resultset/ProteinSummaryProvider.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright 2011 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.client.web.server.resultset; - -import static ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.dto.ProteinSummaryGridColumnIDs.DECOY_PEPTIDE_COUNT; -import static ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.dto.ProteinSummaryGridColumnIDs.DECOY_PROTEIN_COUNT; -import static ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.dto.ProteinSummaryGridColumnIDs.FDR; -import static ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.dto.ProteinSummaryGridColumnIDs.PEPTIDE_COUNT; -import static ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.dto.ProteinSummaryGridColumnIDs.PROTEIN_COUNT; - -import java.util.List; - -import ch.systemsx.cisd.openbis.generic.client.web.server.resultset.AbstractTableModelProvider; -import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TypedTableModel; -import ch.systemsx.cisd.openbis.generic.shared.util.TypedTableModelBuilder; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.IPhosphoNetXServer; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.ProteinSummary; - -/** - * Provider of {@link ProteinSummary} instances. - * - * @author Franz-Josef Elmer - */ -public class ProteinSummaryProvider extends AbstractTableModelProvider<ProteinSummary> -{ - private final IPhosphoNetXServer server; - - private final String sessionToken; - - private final TechId experimentID; - - public ProteinSummaryProvider(IPhosphoNetXServer server, String sessionToken, - TechId experimentID) - { - this.server = server; - this.sessionToken = sessionToken; - this.experimentID = experimentID; - } - - @Override - protected TypedTableModel<ProteinSummary> createTableModel() - { - List<ProteinSummary> sumaries = server.listProteinSummariesByExperiment(sessionToken, experimentID); - TypedTableModelBuilder<ProteinSummary> builder = new TypedTableModelBuilder<ProteinSummary>(); - builder.addColumn(FDR); - builder.addColumn(PROTEIN_COUNT).withDefaultWidth(100); - builder.addColumn(PEPTIDE_COUNT).withDefaultWidth(100); - builder.addColumn(DECOY_PROTEIN_COUNT).withDefaultWidth(100); - builder.addColumn(DECOY_PEPTIDE_COUNT).withDefaultWidth(100); - for (ProteinSummary summary : sumaries) - { - builder.addRow(summary); - builder.column(FDR).addDouble(summary.getFDR()); - builder.column(PROTEIN_COUNT).addInteger((long) summary.getProteinCount()); - builder.column(PEPTIDE_COUNT).addInteger((long) summary.getPeptideCount()); - builder.column(DECOY_PROTEIN_COUNT).addInteger((long) summary.getDecoyProteinCount()); - builder.column(DECOY_PEPTIDE_COUNT).addInteger((long) summary.getDecoyPeptideCount()); - } - return builder.getModel(); - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/PhosphoNetXServer.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/PhosphoNetXServer.java deleted file mode 100644 index 791c9d90ae5..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/PhosphoNetXServer.java +++ /dev/null @@ -1,262 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.server; - -import java.util.List; - -import javax.annotation.Resource; - -import net.lemnik.eodsql.DataSet; - -import org.springframework.stereotype.Component; - -import ch.rinn.restrictions.Private; -import ch.systemsx.cisd.common.exceptions.UserFailureException; -import ch.systemsx.cisd.openbis.common.spring.IInvocationLoggerContext; -import ch.systemsx.cisd.openbis.generic.server.AbstractServer; -import ch.systemsx.cisd.openbis.generic.server.authorization.annotation.AuthorizationGuard; -import ch.systemsx.cisd.openbis.generic.server.authorization.annotation.RolesAllowed; -import ch.systemsx.cisd.openbis.generic.server.authorization.predicate.AbstractTechIdPredicate.ExperimentTechIdPredicate; -import ch.systemsx.cisd.openbis.generic.server.business.IPropertiesBatchManager; -import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDAOFactory; -import ch.systemsx.cisd.openbis.generic.server.dataaccess.IVocabularyDAO; -import ch.systemsx.cisd.openbis.generic.server.plugin.IDataSetTypeSlaveServerPlugin; -import ch.systemsx.cisd.openbis.generic.server.plugin.ISampleTypeSlaveServerPlugin; -import ch.systemsx.cisd.openbis.generic.shared.IOpenBisSessionManager; -import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.RoleWithHierarchy; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Vocabulary; -import ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentPE; -import ch.systemsx.cisd.openbis.generic.shared.dto.Session; -import ch.systemsx.cisd.openbis.generic.shared.dto.VocabularyPE; -import ch.systemsx.cisd.openbis.generic.shared.translator.VocabularyTranslator; -import ch.systemsx.cisd.openbis.plugin.proteomics.server.business.AccessionNumberBuilder; -import ch.systemsx.cisd.openbis.plugin.proteomics.server.business.IAbundanceColumnDefinitionTable; -import ch.systemsx.cisd.openbis.plugin.proteomics.server.business.IBusinessObjectFactory; -import ch.systemsx.cisd.openbis.plugin.proteomics.server.business.IDataSetProteinTable; -import ch.systemsx.cisd.openbis.plugin.proteomics.server.business.IProteinDetailsBO; -import ch.systemsx.cisd.openbis.plugin.proteomics.server.business.IProteinInfoTable; -import ch.systemsx.cisd.openbis.plugin.proteomics.server.business.IProteinRelatedSampleTable; -import ch.systemsx.cisd.openbis.plugin.proteomics.server.business.IProteinSequenceTable; -import ch.systemsx.cisd.openbis.plugin.proteomics.server.business.IProteinSummaryTable; -import ch.systemsx.cisd.openbis.plugin.proteomics.server.business.ISampleProvider; -import ch.systemsx.cisd.openbis.plugin.proteomics.server.dataaccess.IPhosphoNetXDAOFactory; -import ch.systemsx.cisd.openbis.plugin.proteomics.server.dataaccess.IProteinQueryDAO; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.IPhosphoNetXServer; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.ResourceNames; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.AbundanceColumnDefinition; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.AggregateFunction; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.DataSetProtein; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.ProteinByExperiment; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.ProteinDetails; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.ProteinInfo; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.ProteinRelatedSample; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.ProteinSequence; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.ProteinSummary; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.dto.ProteinReference; - -/** - * @author Franz-Josef Elmer - */ -@Component(ResourceNames.PROTEOMICS_PLUGIN_SERVER) -public class PhosphoNetXServer extends AbstractServer<IPhosphoNetXServer> implements - IPhosphoNetXServer -{ - @Resource(name = ResourceNames.PROTEOMICS_DAO_FACTORY) - private IPhosphoNetXDAOFactory specificDAOFactory; - - @Resource(name = ResourceNames.PROTEOMICS_BO_FACTORY) - private IBusinessObjectFactory specificBOFactory; - - public PhosphoNetXServer() - { - super(); - } - - @Private - PhosphoNetXServer(IOpenBisSessionManager sessionManager, IDAOFactory daoFactory, - IPropertiesBatchManager propertiesBatchManager, - IPhosphoNetXDAOFactory specificDAOFactory, IBusinessObjectFactory specificBOFactory, - ISampleTypeSlaveServerPlugin sampleTypeSlaveServerPlugin, - IDataSetTypeSlaveServerPlugin dataSetTypeSlaveServerPlugin) - { - super(sessionManager, daoFactory, propertiesBatchManager, sampleTypeSlaveServerPlugin, - dataSetTypeSlaveServerPlugin); - this.specificDAOFactory = specificDAOFactory; - this.specificBOFactory = specificBOFactory; - } - - @Override - public IPhosphoNetXServer createLogger(IInvocationLoggerContext context) - { - return new PhosphoNetXServerLogger(getSessionManager(), context); - } - - @Override - @RolesAllowed(RoleWithHierarchy.PROJECT_OBSERVER) - public Vocabulary getTreatmentTypeVocabulary(String sessionToken) throws UserFailureException - { - IVocabularyDAO vocabularyDAO = getDAOFactory().getVocabularyDAO(); - VocabularyPE vocabulary = vocabularyDAO.tryFindVocabularyByCode("TREATMENT_TYPE"); - return VocabularyTranslator.translate(vocabulary); - } - - @Override - @RolesAllowed(RoleWithHierarchy.PROJECT_OBSERVER) - public List<AbundanceColumnDefinition> getAbundanceColumnDefinitionsForProteinByExperiment( - String sessionToken, @AuthorizationGuard(guardClass = ExperimentTechIdPredicate.class) TechId experimentID, String treatmentTypeOrNull) - throws UserFailureException - { - Session session = getSession(sessionToken); - ISampleProvider sampleProvider = specificBOFactory.createSampleProvider(session); - sampleProvider.loadByExperimentID(experimentID); - return getAbundanceColumnDefinitions(session, sampleProvider, experimentID, - treatmentTypeOrNull); - } - - private List<AbundanceColumnDefinition> getAbundanceColumnDefinitions(Session session, - ISampleProvider sampleProvider, TechId experimentID, String treatmentTypeOrNull) - { - String experimentPermID = getExperimentPermIDFor(experimentID); - IProteinQueryDAO dao = specificDAOFactory.getProteinQueryDAO(experimentID); - DataSet<String> samplePermIDs = - dao.listAbundanceRelatedSamplePermIDsByExperiment(experimentPermID); - try - { - IAbundanceColumnDefinitionTable table = - specificBOFactory.createAbundanceColumnDefinitionTable(session); - for (String samplePermID : samplePermIDs) - { - table.add(sampleProvider.getSample(samplePermID)); - } - return table.getSortedAndAggregatedDefinitions(treatmentTypeOrNull); - } finally - { - samplePermIDs.close(); - } - } - - @Override - @RolesAllowed(RoleWithHierarchy.PROJECT_OBSERVER) - public List<ProteinInfo> listProteinsByExperiment(String sessionToken, - @AuthorizationGuard(guardClass = ExperimentTechIdPredicate.class) TechId experimentId, double falseDiscoveryRate, - AggregateFunction function, - String treatmentTypeCode, boolean aggregateOnOriginal) throws UserFailureException - { - final Session session = getSession(sessionToken); - ISampleProvider sampleProvider = specificBOFactory.createSampleProvider(session); - sampleProvider.loadByExperimentID(experimentId); - List<AbundanceColumnDefinition> definitions = - getAbundanceColumnDefinitions(session, sampleProvider, experimentId, - treatmentTypeCode); - IProteinInfoTable table = specificBOFactory.createProteinInfoTable(session, sampleProvider); - table.load(definitions, experimentId, falseDiscoveryRate, function, aggregateOnOriginal); - return table.getProteinInfos(); - } - - @Override - @RolesAllowed(RoleWithHierarchy.PROJECT_OBSERVER) - public List<ProteinSummary> listProteinSummariesByExperiment(String sessionToken, - @AuthorizationGuard(guardClass = ExperimentTechIdPredicate.class) TechId experimentId) throws UserFailureException - { - final Session session = getSession(sessionToken); - IProteinSummaryTable summaryTable = specificBOFactory.createProteinSummaryTable(session); - summaryTable.load(experimentId); - return summaryTable.getProteinSummaries(); - } - - @Override - @RolesAllowed(RoleWithHierarchy.PROJECT_OBSERVER) - public ProteinByExperiment getProteinByExperiment(String sessionToken, - @AuthorizationGuard(guardClass = ExperimentTechIdPredicate.class) TechId experimentID, TechId proteinReferenceID) - throws UserFailureException - { - Session session = getSession(sessionToken); - IProteinQueryDAO proteinQueryDAO = specificDAOFactory.getProteinQueryDAO(experimentID); - ProteinByExperiment proteinByExperiment = new ProteinByExperiment(); - ProteinReference proteinReference = - proteinQueryDAO.tryToGetProteinReference(proteinReferenceID.getId()); - if (proteinReference == null) - { - throw new UserFailureException("No protein reference found for ID: " - + proteinReferenceID); - } - proteinByExperiment.setId(proteinReferenceID); - AccessionNumberBuilder builder = - new AccessionNumberBuilder(proteinReference.getAccessionNumber()); - proteinByExperiment.setAccessionNumber(builder.getAccessionNumber()); - proteinByExperiment.setAccessionNumberType(builder.getTypeOrNull()); - proteinByExperiment.setDescription(proteinReference.getDescription()); - IProteinDetailsBO proteinDetailsBO = specificBOFactory.createProteinDetailsBO(session); - proteinDetailsBO.loadByExperimentAndReference(experimentID, proteinReferenceID); - proteinByExperiment.setDetails(proteinDetailsBO.getDetailsOrNull()); - return proteinByExperiment; - } - - @Override - @RolesAllowed(RoleWithHierarchy.PROJECT_OBSERVER) - public List<ProteinSequence> listProteinSequencesByProteinReference(String sessionToken, - @AuthorizationGuard(guardClass = ExperimentTechIdPredicate.class) TechId experimentID, TechId proteinReferenceID) - throws UserFailureException - { - final Session session = getSession(sessionToken); - IProteinSequenceTable sequenceTable = specificBOFactory.createProteinSequenceTable(session); - sequenceTable.loadByReference(experimentID, proteinReferenceID); - return sequenceTable.getSequences(); - } - - @Override - @RolesAllowed(RoleWithHierarchy.PROJECT_OBSERVER) - public List<DataSetProtein> listProteinsByExperimentAndReference(String sessionToken, - @AuthorizationGuard(guardClass = ExperimentTechIdPredicate.class) TechId experimentId, TechId proteinReferenceID) - throws UserFailureException - { - final Session session = getSession(sessionToken); - IProteinSequenceTable sequenceTable = specificBOFactory.createProteinSequenceTable(session); - sequenceTable.loadByReference(experimentId, proteinReferenceID); - IDataSetProteinTable dataSetProteinTable = - specificBOFactory.createDataSetProteinTable(session); - dataSetProteinTable.load(getExperimentPermIDFor(experimentId), proteinReferenceID, - sequenceTable); - return dataSetProteinTable.getDataSetProteins(); - } - - @Override - @RolesAllowed(RoleWithHierarchy.PROJECT_OBSERVER) - public List<ProteinRelatedSample> listProteinRelatedSamplesByProtein(String sessionToken, - @AuthorizationGuard(guardClass = ExperimentTechIdPredicate.class) TechId experimentID, TechId proteinReferenceID) - throws UserFailureException - { - final Session session = getSession(sessionToken); - - IProteinDetailsBO proteinDetailsBO = specificBOFactory.createProteinDetailsBO(session); - proteinDetailsBO.loadByExperimentAndReference(experimentID, proteinReferenceID); - ProteinDetails detailsOrNull = proteinDetailsBO.getDetailsOrNull(); - String sequenceOrNull = detailsOrNull == null ? null : detailsOrNull.getSequence(); - IProteinRelatedSampleTable proteinRelatedSampleTable = - specificBOFactory.createProteinRelatedSampleTable(session); - proteinRelatedSampleTable.load(session, experimentID, proteinReferenceID, sequenceOrNull); - return proteinRelatedSampleTable.getSamples(); - } - - private String getExperimentPermIDFor(TechId experimentId) - { - ExperimentPE experiment = getDAOFactory().getExperimentDAO().getByTechId(experimentId); - return experiment.getPermId(); - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/PhosphoNetXServerLogger.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/PhosphoNetXServerLogger.java deleted file mode 100644 index 0a3dfe4c53b..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/PhosphoNetXServerLogger.java +++ /dev/null @@ -1,124 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.server; - -import java.util.List; - -import ch.systemsx.cisd.authentication.ISessionManager; -import ch.systemsx.cisd.common.exceptions.UserFailureException; -import ch.systemsx.cisd.openbis.common.spring.IInvocationLoggerContext; -import ch.systemsx.cisd.openbis.generic.shared.AbstractServerLogger; -import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Vocabulary; -import ch.systemsx.cisd.openbis.generic.shared.dto.Session; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.IPhosphoNetXServer; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.AbundanceColumnDefinition; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.AggregateFunction; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.DataSetProtein; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.ProteinByExperiment; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.ProteinInfo; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.ProteinRelatedSample; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.ProteinSequence; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.ProteinSummary; - -/** - * @author Franz-Josef Elmer - */ -public class PhosphoNetXServerLogger extends AbstractServerLogger implements IPhosphoNetXServer -{ - PhosphoNetXServerLogger(final ISessionManager<Session> sessionManager, - IInvocationLoggerContext context) - { - super(sessionManager, context); - } - - @Override - public Vocabulary getTreatmentTypeVocabulary(String sessionToken) throws UserFailureException - { - logAccess(sessionToken, "get_treatment_type_vocabulary"); - return null; - } - - @Override - public List<AbundanceColumnDefinition> getAbundanceColumnDefinitionsForProteinByExperiment( - String sessionToken, TechId experimentID, String treatmentTypeOrNull) - throws UserFailureException - { - logAccess(sessionToken, "get_abundance_colum_definitions", - "EXPERIMENT_ID(%s) TREATMENT_TYPE(%s)", experimentID, - treatmentTypeOrNull); - return null; - } - - @Override - public List<ProteinInfo> listProteinsByExperiment(String sessionToken, TechId experimentId, - double falseDiscoveryRate, AggregateFunction function, String treatmentTypeCode, - boolean aggregateOnOriginal) throws UserFailureException - { - logAccess(sessionToken, "list_proteins_by_experiment", - "ID(%s) FDR(%s) AGGREGATE_FUNCTION(%s) TREATMENT_TYPE(%s) " - + "AGGREGATE_ON_ORIGINAL(%s)", experimentId, falseDiscoveryRate, function - .getLabel(), treatmentTypeCode, aggregateOnOriginal); - return null; - } - - @Override - public List<ProteinSummary> listProteinSummariesByExperiment(String sessionToken, - TechId experimentId) throws UserFailureException - { - logAccess(sessionToken, "list_protein_summaries_by_experiment", "EXPERIMENT_ID(%s)", - experimentId); - return null; - } - - @Override - public ProteinByExperiment getProteinByExperiment(String sessionToken, TechId experimentId, - TechId proteinReferenceID) throws UserFailureException - { - logAccess(sessionToken, "get_protein_by_experiment", - "EXPERIMENT_ID(%s) PROTEIN_REFERENCE_ID(%s)", experimentId, proteinReferenceID); - return null; - } - - @Override - public List<ProteinSequence> listProteinSequencesByProteinReference(String sessionToken, - TechId experimentID, TechId proteinReferenceID) throws UserFailureException - { - logAccess(sessionToken, "list_protein_sequences_by_reference", - "EXPERIMENT_ID(%s) PROTEIN_REFERENCE_ID(%s)", experimentID, proteinReferenceID); - return null; - } - - @Override - public List<DataSetProtein> listProteinsByExperimentAndReference(String sessionToken, - TechId experimentId, TechId proteinReferenceID) throws UserFailureException - { - logAccess(sessionToken, "list_proteins_by_experiment_and_reference", - "EXPERIMENT_ID(%s) PROTEIN_REFERENCE_ID(%s)", experimentId, proteinReferenceID); - return null; - } - - @Override - public List<ProteinRelatedSample> listProteinRelatedSamplesByProtein(String sessionToken, - TechId experimentID, TechId proteinReferenceID) throws UserFailureException - { - logAccess(sessionToken, "list_protein_related_samples_by_protein", - "EXPERIMENT_ID(%s) PROTEIN_REFERENCE_ID(%s)", experimentID, proteinReferenceID); - return null; - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/ProteomicsDataServiceInternal.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/ProteomicsDataServiceInternal.java deleted file mode 100644 index f9d28fd536e..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/ProteomicsDataServiceInternal.java +++ /dev/null @@ -1,368 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.server; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; - -import ch.systemsx.cisd.common.collection.CollectionUtils; -import ch.systemsx.cisd.common.exceptions.EnvironmentFailureException; -import ch.systemsx.cisd.common.exceptions.UserFailureException; -import ch.systemsx.cisd.openbis.common.spring.IInvocationLoggerContext; -import ch.systemsx.cisd.openbis.generic.server.AbstractServer; -import ch.systemsx.cisd.openbis.generic.server.authorization.AuthorizationDataProvider; -import ch.systemsx.cisd.openbis.generic.server.authorization.annotation.AuthorizationGuard; -import ch.systemsx.cisd.openbis.generic.server.authorization.annotation.ReturnValueFilter; -import ch.systemsx.cisd.openbis.generic.server.authorization.annotation.RolesAllowed; -import ch.systemsx.cisd.openbis.generic.server.authorization.predicate.AbstractTechIdPredicate.ExperimentTechIdPredicate; -import ch.systemsx.cisd.openbis.generic.server.authorization.predicate.DataSetCodeCollectionPredicate; -import ch.systemsx.cisd.openbis.generic.server.authorization.validator.ExperimentValidator; -import ch.systemsx.cisd.openbis.generic.server.authorization.validator.SamplePropertyAccessValidator; -import ch.systemsx.cisd.openbis.generic.server.business.IPropertiesBatchManager; -import ch.systemsx.cisd.openbis.generic.server.business.bo.ICommonBusinessObjectFactory; -import ch.systemsx.cisd.openbis.generic.server.business.bo.IDataSetTable; -import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDAOFactory; -import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDataDAO; -import ch.systemsx.cisd.openbis.generic.server.dataaccess.IEntityTypeDAO; -import ch.systemsx.cisd.openbis.generic.server.dataaccess.IExperimentDAO; -import ch.systemsx.cisd.openbis.generic.shared.IOpenBisSessionManager; -import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Code; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataStoreServiceKind; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Metaproject; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.RoleWithHierarchy; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample; -import ch.systemsx.cisd.openbis.generic.shared.dto.DataPE; -import ch.systemsx.cisd.openbis.generic.shared.dto.DataStorePE; -import ch.systemsx.cisd.openbis.generic.shared.dto.DataStoreServicePE; -import ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentPE; -import ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentTypePE; -import ch.systemsx.cisd.openbis.generic.shared.dto.MetaprojectAssignmentPE; -import ch.systemsx.cisd.openbis.generic.shared.dto.PersonPE; -import ch.systemsx.cisd.openbis.generic.shared.dto.Session; -import ch.systemsx.cisd.openbis.generic.shared.dto.properties.EntityKind; -import ch.systemsx.cisd.openbis.generic.shared.managed_property.IManagedPropertyEvaluatorFactory; -import ch.systemsx.cisd.openbis.generic.shared.translator.DataSetTranslator; -import ch.systemsx.cisd.openbis.generic.shared.translator.ExperimentTranslator; -import ch.systemsx.cisd.openbis.generic.shared.translator.MetaprojectTranslator; -import ch.systemsx.cisd.openbis.plugin.proteomics.server.authorization.validator.ParentSampleValidator; -import ch.systemsx.cisd.openbis.plugin.proteomics.server.authorization.validator.RawDataSampleValidator; -import ch.systemsx.cisd.openbis.plugin.proteomics.server.business.ExperimentLoader; -import ch.systemsx.cisd.openbis.plugin.proteomics.server.business.IBusinessObjectFactory; -import ch.systemsx.cisd.openbis.plugin.proteomics.server.business.ISampleLoader; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.IProteomicsDataServiceInternal; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.CommonConstants; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.dto.MsInjectionSample; - -/** - * @author Franz-Josef Elmer - */ -public class ProteomicsDataServiceInternal extends AbstractServer<IProteomicsDataServiceInternal> - implements IProteomicsDataServiceInternal -{ - private ICommonBusinessObjectFactory commonBoFactory; - - private IOpenBisSessionManager sessionManagerFromConstructor; - - private ExperimentLoader experimentLoader; - - private IBusinessObjectFactory boFactory; - - private IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory; - - public ProteomicsDataServiceInternal() - { - } - - public ProteomicsDataServiceInternal(IOpenBisSessionManager sessionManager, - IDAOFactory daoFactory, ICommonBusinessObjectFactory businessObjectFactory, - IBusinessObjectFactory boFactory, - IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory) - { - this(sessionManager, daoFactory, null, businessObjectFactory, boFactory, - managedPropertyEvaluatorFactory); - } - - ProteomicsDataServiceInternal(IOpenBisSessionManager sessionManager, IDAOFactory daoFactory, - IPropertiesBatchManager propertiesBatchManager, - ICommonBusinessObjectFactory businessObjectFactory, IBusinessObjectFactory boFactory, - IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory) - { - super(sessionManager, daoFactory, propertiesBatchManager); - sessionManagerFromConstructor = sessionManager; - this.commonBoFactory = businessObjectFactory; - this.boFactory = boFactory; - experimentLoader = new ExperimentLoader(getDAOFactory(), managedPropertyEvaluatorFactory); - this.managedPropertyEvaluatorFactory = managedPropertyEvaluatorFactory; - } - - public void replaceAutoWiredSesseionManagerByConstructorSessionManager() - { - sessionManager = sessionManagerFromConstructor; - } - - @Override - public IProteomicsDataServiceInternal createLogger(IInvocationLoggerContext context) - { - return new ProteomicsDataServiceInternalLogger(getSessionManager(), context); - } - - @Override - @RolesAllowed(RoleWithHierarchy.PROJECT_USER) - @ReturnValueFilter(validatorClass = RawDataSampleValidator.class) - public List<MsInjectionSample> listRawDataSamples(String sessionToken) - { - return loadAllRawDataSamples(getSession(sessionToken), true); - } - - @Override - @RolesAllowed(RoleWithHierarchy.PROJECT_USER) - public List<MsInjectionSample> listAllRawDataSamples(String sessionToken) - { - return loadAllRawDataSamples(getSession(sessionToken), false); - } - - @Override - @RolesAllowed(RoleWithHierarchy.PROJECT_USER) - public void processRawData(String sessionToken, String dataSetProcessingKey, - long[] rawDataSampleIDs, String dataSetType) - { - Session session = getSession(sessionToken); - PersonPE person = session.tryGetPerson(); - - List<MsInjectionSample> samples = loadAllRawDataSamples(session, true); - Set<Long> sampleIDs = asSet(rawDataSampleIDs); - List<String> dataSetCodes = new ArrayList<String>(); - Map<String, String> parameterBindings = new HashMap<String, String>(); - - RawDataSampleValidator validator = new RawDataSampleValidator(); - validator.init(new AuthorizationDataProvider(getDAOFactory())); - - for (MsInjectionSample sample : samples) - { - if (validator.isValid(person, sample) - && sampleIDs.contains(sample.getSample().getId())) - { - Map<String, AbstractExternalData> latestDataSets = sample.getLatestDataSets(); - AbstractExternalData latestDataSet = latestDataSets.get(dataSetType); - if (latestDataSet != null) - { - String code = latestDataSet.getCode(); - dataSetCodes.add(code); - parameterBindings.put(code, sample.getSample().getCode()); - } - } - } - - processDataSets(session, dataSetProcessingKey, dataSetCodes, parameterBindings); - } - - @Override - @RolesAllowed(RoleWithHierarchy.PROJECT_USER) - public void processDataSets(String sessionToken, String dataSetProcessingKey, - @AuthorizationGuard(guardClass = DataSetCodeCollectionPredicate.class) List<String> dataSetCodes) - { - Session session = getSession(sessionToken); - processDataSets(session, dataSetProcessingKey, dataSetCodes, new HashMap<String, String>()); - } - - @Override - @RolesAllowed(RoleWithHierarchy.PROJECT_USER) - @ReturnValueFilter(validatorClass = ExperimentValidator.class) - public List<Experiment> listExperiments(String sessionToken, String experimentTypeCode) - { - Session session = getSession(sessionToken); - - IDAOFactory daoFactory = getDAOFactory(); - IEntityTypeDAO entityTypeDAO = daoFactory.getEntityTypeDAO(EntityKind.EXPERIMENT); - ExperimentTypePE type = - (ExperimentTypePE) entityTypeDAO.tryToFindEntityTypeByCode(experimentTypeCode); - List<ExperimentPE> experiments = - daoFactory.getExperimentDAO().listExperimentsWithProperties(type, null, null); - final Collection<MetaprojectAssignmentPE> assignmentPEs = - getDAOFactory().getMetaprojectDAO().listMetaprojectAssignmentsForEntities( - session.tryGetPerson(), experiments, EntityKind.EXPERIMENT); - Map<Long, Set<Metaproject>> assignments = - MetaprojectTranslator.translateMetaprojectAssignments(assignmentPEs); - return ExperimentTranslator.translate(experiments, "", assignments, - managedPropertyEvaluatorFactory, - new SamplePropertyAccessValidator(session, getDAOFactory())); - } - - @Override - @RolesAllowed(RoleWithHierarchy.PROJECT_USER) - public List<AbstractExternalData> listDataSetsByExperiment(String sessionToken, - @AuthorizationGuard(guardClass = ExperimentTechIdPredicate.class) TechId experimentID) - { - final Session session = getSession(sessionToken); - - IDataSetTable dataSetTable = commonBoFactory.createDataSetTable(session); - dataSetTable.loadByExperimentTechId(experimentID); - List<DataPE> dataSetPEs = dataSetTable.getDataSets(); - Collection<MetaprojectAssignmentPE> assignmentPEs = - getDAOFactory().getMetaprojectDAO().listMetaprojectAssignmentsForEntities( - session.tryGetPerson(), dataSetPEs, EntityKind.DATA_SET); - return DataSetTranslator.translate(dataSetPEs, "", "", - MetaprojectTranslator.translateMetaprojectAssignments(assignmentPEs), - managedPropertyEvaluatorFactory, - new SamplePropertyAccessValidator(session, getDAOFactory())); - } - - @Override - @RolesAllowed(RoleWithHierarchy.PROJECT_USER) - public void processProteinResultDataSets(String sessionToken, String dataSetProcessingKey, - String experimentType, long[] searchExperimentIDs) - { - Session session = getSession(sessionToken); - PersonPE person = session.tryGetPerson(); - - List<String> dataSetCodes = new ArrayList<String>(); - IExperimentDAO experimentDAO = getDAOFactory().getExperimentDAO(); - IDataDAO dataSetDAO = getDAOFactory().getDataDAO(); - ExperimentValidator validator = new ExperimentValidator(); - - validator.init(new AuthorizationDataProvider(getDAOFactory())); - - for (long experimentID : searchExperimentIDs) - { - ExperimentPE experiment = experimentDAO.tryGetByTechId(new TechId(experimentID)); - String actualExperimentTypeCode = experiment.getExperimentType().getCode(); - if (actualExperimentTypeCode.equals(experimentType) == false) - { - throw new UserFailureException("Experiment with technical id " + experimentID - + " [" + experiment.getIdentifier() + "] is not of type " + experimentType - + " but of type " + actualExperimentTypeCode + "."); - } - Experiment translatedExperiment = - ExperimentTranslator.translate(experiment, "", null, - managedPropertyEvaluatorFactory, - new SamplePropertyAccessValidator(session, getDAOFactory())); - if (validator.isValid(person, translatedExperiment)) - { - List<DataPE> dataSets = dataSetDAO.listDataSets(experiment); - dataSetCodes.addAll(Code.extractCodes(dataSets)); - } - } - - processDataSets(session, dataSetProcessingKey, dataSetCodes, new HashMap<String, String>()); - } - - private List<MsInjectionSample> loadAllRawDataSamples(Session session, boolean parentHasToBeValid) - { - List<Sample> samples = loadAccessableSamples(session, parentHasToBeValid); - List<Sample> parentSamples = new ArrayList<Sample>(); - for (Sample sample : samples) - { - Sample parent = sample.getGeneratedFrom(); - if (parent != null) - { - parentSamples.add(parent); - } - } - experimentLoader.enrichWithExperiments(session, parentSamples); - Map<Sample, List<AbstractExternalData>> dataSetsBySamples = - commonBoFactory.createDatasetLister(session).listAllDataSetsFor(samples); - List<MsInjectionSample> result = new ArrayList<MsInjectionSample>(); - for (Entry<Sample, List<AbstractExternalData>> entry : dataSetsBySamples.entrySet()) - { - result.add(new MsInjectionSample(entry.getKey(), entry.getValue())); - } - return result; - } - - protected List<Sample> loadAccessableSamples(Session session, boolean parentHasToBeValid) - { - ISampleLoader sampleLoader = boFactory.createSampleLoader(session); - List<Sample> samples = - sampleLoader.listSamplesWithParentsByTypeAndSpace( - CommonConstants.MS_INJECTION_SAMPLE_TYPE_CODE, - CommonConstants.MS_DATA_SPACE); - PersonPE person = session.tryGetPerson(); - List<Sample> validSamples = new ArrayList<Sample>(); - - ParentSampleValidator validator = new ParentSampleValidator(); - validator.init(new AuthorizationDataProvider(getDAOFactory())); - - for (Sample sample : samples) - { - if (validator.isValid(person, sample, parentHasToBeValid)) - { - if (validator.isValid(person, sample) == false) - { - sample.setParents(Collections.<Sample> emptySet()); - } - validSamples.add(sample); - } - } - return validSamples; - } - - private void processDataSets(Session session, String dataSetProcessingKey, - List<String> dataSetCodes, Map<String, String> parameterBindings) - { - try - { - String dataStoreServerCode = findDataStoreServer(dataSetProcessingKey); - IDataSetTable dataSetTable = commonBoFactory.createDataSetTable(session); - dataSetTable.processDatasets(dataSetProcessingKey, dataStoreServerCode, dataSetCodes, - parameterBindings); - } catch (EnvironmentFailureException ex) - { - throw new EnvironmentFailureException("Processing data sets " + - CollectionUtils.abbreviate(dataSetCodes, 20) + " with processing plugin '" - + dataSetProcessingKey + "' using bindings " + parameterBindings + " failed.", ex); - } - } - - private String findDataStoreServer(String dataSetProcessingKey) - { - List<DataStorePE> dataStores = getDAOFactory().getDataStoreDAO().listDataStores(); - for (DataStorePE dataStore : dataStores) - { - Set<DataStoreServicePE> services = dataStore.getServices(); - for (DataStoreServicePE dataStoreService : services) - { - if (DataStoreServiceKind.PROCESSING.equals(dataStoreService.getKind()) - && dataSetProcessingKey.equals(dataStoreService.getKey())) - { - return dataStore.getCode(); - } - } - } - throw new EnvironmentFailureException("No data store processing service with key '" - + dataSetProcessingKey + "' found."); - } - - private Set<Long> asSet(long[] ids) - { - Set<Long> result = new HashSet<Long>(); - for (long id : ids) - { - result.add(id); - } - return result; - } -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/ProteomicsDataServiceInternalLogger.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/ProteomicsDataServiceInternalLogger.java deleted file mode 100644 index 964f3b03c4d..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/ProteomicsDataServiceInternalLogger.java +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.server; - -import java.util.List; - -import ch.systemsx.cisd.authentication.ISessionManager; -import ch.systemsx.cisd.openbis.common.spring.IInvocationLoggerContext; -import ch.systemsx.cisd.openbis.generic.shared.AbstractServerLogger; -import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData; -import ch.systemsx.cisd.openbis.generic.shared.dto.Session; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.IProteomicsDataServiceInternal; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.dto.MsInjectionSample; - -/** - * @author Franz-Josef Elmer - */ -class ProteomicsDataServiceInternalLogger extends AbstractServerLogger implements - IProteomicsDataServiceInternal -{ - - ProteomicsDataServiceInternalLogger(ISessionManager<Session> sessionManager, - IInvocationLoggerContext context) - { - super(sessionManager, context); - } - - @Override - public List<MsInjectionSample> listRawDataSamples(String sessionToken) - { - logAccess(sessionToken, "list_raw_data_samples"); - return null; - } - - @Override - public List<MsInjectionSample> listAllRawDataSamples(String sessionToken) - { - logAccess(sessionToken, "list_all_raw_data_samples"); - return null; - } - - @Override - public void processRawData(String sessionToken, String dataSetProcessingKey, - long[] rawDataSampleIDs, String dataSetType) - { - int numberOfDataSets = rawDataSampleIDs == null ? 0 : rawDataSampleIDs.length; - logAccess(sessionToken, "copy_raw_data", "NUMBER_OF_DATA_SETS(%s), DATA_SET_TYPE(%s)", - numberOfDataSets, dataSetType); - } - - @Override - public void processDataSets(String sessionToken, String dataSetProcessingKey, - List<String> dataSetCodes) - { - logAccess(sessionToken, "process_data_sets", - "DSS_PROCESSING_PLUGIN(%s) NUMBER_OF_DATA_SETS(%s)", dataSetProcessingKey, - dataSetCodes.size()); - } - - @Override - public List<Experiment> listExperiments(String sessionToken, String experimentTypeCode) - { - logAccess(sessionToken, "list_search_experiments", "EXPERIMENT_TYPE(%s)", experimentTypeCode); - return null; - } - - @Override - public List<AbstractExternalData> listDataSetsByExperiment(String sessionToken, TechId experimentID) - { - logAccess(sessionToken, "list_data_sets_by_experiments", "EXPERIMENT_ID(%s)", experimentID); - return null; - } - - @Override - public void processProteinResultDataSets(String sessionToken, String dataSetProcessingKey, - String experimentTypeCode, long[] searchExperimentIDs) - { - int experimentCount = searchExperimentIDs == null ? 0 : searchExperimentIDs.length; - logAccess(sessionToken, "process_protein_result_data_sets", - "DSS_PROCESSING_PLUGIN(%s) EXPERIMENT_TYPE(%s) NUMBER_OF_EXPERIMENTS(%s)", - dataSetProcessingKey, experimentTypeCode, experimentCount); - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/api/v1/Constants.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/api/v1/Constants.java deleted file mode 100644 index e55625dd8f0..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/api/v1/Constants.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.server.api.v1; - -/** - * @author Franz-Josef Elmer - */ -public class Constants -{ - // Spring bean IDs - public final static String PROTEOMICS_DATA_SERVICE = "proteomics-data-service"; - - public final static String PROTEOMICS_DATA_SERVICE_INTERNAL = "proteomics-data-service-internal"; - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/api/v1/ProteomicsDataService.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/api/v1/ProteomicsDataService.java deleted file mode 100644 index bfabf505a04..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/api/v1/ProteomicsDataService.java +++ /dev/null @@ -1,413 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.server.api.v1; - -import java.io.Serializable; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Date; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; - -import javax.annotation.Resource; - -import org.springframework.stereotype.Component; - -import ch.systemsx.cisd.common.exceptions.UserFailureException; -import ch.systemsx.cisd.openbis.common.spring.IInvocationLoggerContext; -import ch.systemsx.cisd.openbis.generic.server.AbstractServer; -import ch.systemsx.cisd.openbis.generic.server.authorization.annotation.RolesAllowed; -import ch.systemsx.cisd.openbis.generic.server.business.IPropertiesBatchManager; -import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDAOFactory; -import ch.systemsx.cisd.openbis.generic.shared.IOpenBisSessionManager; -import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataStoreServiceKind; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataTypeCode; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PropertyType; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.RoleWithHierarchy; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample; -import ch.systemsx.cisd.openbis.generic.shared.dto.DataSetTypePE; -import ch.systemsx.cisd.openbis.generic.shared.dto.DataStorePE; -import ch.systemsx.cisd.openbis.generic.shared.dto.DataStoreServicePE; -import ch.systemsx.cisd.openbis.generic.shared.dto.SessionContextDTO; -import ch.systemsx.cisd.openbis.generic.shared.util.DataTypeUtils; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.IProteomicsDataServiceInternal; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.api.v1.IProteomicsDataService; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.api.v1.dto.DataSet; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.api.v1.dto.DataStoreServerProcessingPluginInfo; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.api.v1.dto.MsInjectionDataInfo; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.api.v1.dto.PropertyKey; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.dto.MsInjectionSample; - -/** - * Implementation of {@link IProteomicsDataService}. - * - * @author Franz-Josef Elmer - */ -@Component(Constants.PROTEOMICS_DATA_SERVICE) -public class ProteomicsDataService extends AbstractServer<IProteomicsDataService> implements - IProteomicsDataService -{ - private static final String MS_SEARCH = "MS_SEARCH"; - - @Resource(name = Constants.PROTEOMICS_DATA_SERVICE_INTERNAL) - private IProteomicsDataServiceInternal service; - - public ProteomicsDataService() - { - } - - public ProteomicsDataService(final IOpenBisSessionManager sessionManager, - final IDAOFactory daoFactory, IPropertiesBatchManager propertiesBatchManager, - IProteomicsDataServiceInternal service) - { - super(sessionManager, daoFactory, propertiesBatchManager); - this.service = service; - } - - @Override - public String tryToAuthenticateAtRawDataServer(String userID, String userPassword) - { - SessionContextDTO session = tryAuthenticate(userID, userPassword); - return session == null ? null : session.getSessionToken(); - } - - @Override - public IProteomicsDataService createLogger(IInvocationLoggerContext context) - { - return new ProteomicsDataServiceLogger(getSessionManager(), context); - } - - @Override - @RolesAllowed(RoleWithHierarchy.INSTANCE_OBSERVER) - public List<MsInjectionDataInfo> listRawDataSamples(String sessionToken, String userID) - { - checkSession(sessionToken); - SessionContextDTO session = login(userID); - try - { - return translateSamples(service.listRawDataSamples(session.getSessionToken())); - } finally - { - service.logout(session.getSessionToken()); - } - } - - @Override - @RolesAllowed(RoleWithHierarchy.INSTANCE_OBSERVER) - public List<MsInjectionDataInfo> listAllRawDataSamples(String sessionToken, String userID) - { - checkSession(sessionToken); - SessionContextDTO session = login(userID); - try - { - return translateSamples(service.listAllRawDataSamples(session.getSessionToken())); - } finally - { - service.logout(session.getSessionToken()); - } - } - - private List<MsInjectionDataInfo> translateSamples(List<MsInjectionSample> samples) - { - ArrayList<MsInjectionDataInfo> result = new ArrayList<MsInjectionDataInfo>(); - for (MsInjectionSample sample : samples) - { - result.add(translate(sample)); - } - return result; - } - - private MsInjectionDataInfo translate(MsInjectionSample sample) - { - MsInjectionDataInfo info = new MsInjectionDataInfo(); - Sample msiSample = sample.getSample(); - info.setMsInjectionSampleID(msiSample.getId()); - info.setMsInjectionSampleCode(msiSample.getCode()); - info.setMsInjectionSampleRegistrationDate(msiSample.getRegistrationDate()); - info.setMsInjectionSampleProperties(translate(msiSample.getProperties())); - Sample bioSample = msiSample.getGeneratedFrom(); - if (bioSample != null) - { - info.setBiologicalSampleID(bioSample.getId()); - info.setBiologicalSampleIdentifier(bioSample.getIdentifier()); - Experiment experiment = bioSample.getExperiment(); - if (experiment != null) - { - info.setBiologicalExperimentIdentifier(experiment.getIdentifier()); - info.setBiologicalExperiment(translate(experiment)); - } - info.setBiologicalSampleProperties(translate(bioSample.getProperties())); - } - List<AbstractExternalData> dataSets = sample.getDataSets(); - Set<DataSet> transformedDataSets = new HashSet<DataSet>(); - for (AbstractExternalData dataSet : dataSets) - { - DataSet transformedDataSet = transform(dataSet); - transformedDataSets.add(transformedDataSet); - } - info.setDataSets(transformedDataSets); - Map<String, Date> latestDataSetRegistrationDates = new HashMap<String, Date>(); - for (Entry<String, AbstractExternalData> entry : sample.getLatestDataSets().entrySet()) - { - latestDataSetRegistrationDates.put(entry.getKey(), entry.getValue() - .getRegistrationDate()); - } - info.setLatestDataSetRegistrationDates(latestDataSetRegistrationDates); - return info; - } - - private DataSet transform(AbstractExternalData dataSet) - { - DataSet transformedDataSet = new DataSet(); - transformedDataSet.setId(dataSet.getId()); - transformedDataSet.setCode(dataSet.getCode()); - transformedDataSet.setType(dataSet.getDataSetType().getCode()); - transformedDataSet.setRegistrationDate(dataSet.getRegistrationDate()); - transformedDataSet.setProperties(translate(dataSet.getProperties())); - Collection<AbstractExternalData> children = dataSet.getChildren(); - if (children != null && children.isEmpty() == false) - { - for (AbstractExternalData child : children) - { - transformedDataSet.addChild(transform(child)); - } - } - return transformedDataSet; - } - - @Override - @RolesAllowed(RoleWithHierarchy.INSTANCE_OBSERVER) - public List<DataStoreServerProcessingPluginInfo> listDataStoreServerProcessingPluginInfos( - String sessionToken) - { - checkSession(sessionToken); - - List<DataStoreServerProcessingPluginInfo> result = - new ArrayList<DataStoreServerProcessingPluginInfo>(); - List<DataStorePE> dataStores = getDAOFactory().getDataStoreDAO().listDataStores(); - for (DataStorePE dataStore : dataStores) - { - Set<DataStoreServicePE> services = dataStore.getServices(); - for (DataStoreServicePE dataStoreService : services) - { - if (dataStoreService.getKind() == DataStoreServiceKind.PROCESSING) - { - result.add(translate(dataStoreService)); - } - } - } - return result; - } - - private DataStoreServerProcessingPluginInfo translate(DataStoreServicePE dataStoreService) - { - String key = dataStoreService.getKey(); - String label = dataStoreService.getLabel(); - List<String> translatedCodes = new ArrayList<String>(); - Set<DataSetTypePE> datasetTypes = dataStoreService.getDatasetTypes(); - for (DataSetTypePE dataSetType : datasetTypes) - { - translatedCodes.add(dataSetType.getCode()); - } - return new DataStoreServerProcessingPluginInfo(key, label, translatedCodes); - } - - @Override - @SuppressWarnings("deprecation") - @RolesAllowed(RoleWithHierarchy.INSTANCE_OBSERVER) - public void processingRawData(String sessionToken, String userID, String dataSetProcessingKey, - long[] rawDataSampleIDs, String dataSetType) - { - checkSession(sessionToken); - SessionContextDTO session = login(userID); - try - { - service.processRawData(session.getSessionToken(), dataSetProcessingKey, - rawDataSampleIDs, dataSetType); - } finally - { - service.logout(session.getSessionToken()); - } - } - - @Override - @RolesAllowed(RoleWithHierarchy.INSTANCE_OBSERVER) - public void processDataSets(String sessionToken, String userID, String dataSetProcessingKey, - List<String> dataSetCodes) - { - checkSession(sessionToken); - SessionContextDTO session = login(userID); - try - { - service.processDataSets(session.getSessionToken(), dataSetProcessingKey, dataSetCodes); - } finally - { - service.logout(session.getSessionToken()); - } - } - - @Override - @RolesAllowed(RoleWithHierarchy.INSTANCE_OBSERVER) - public List<ch.systemsx.cisd.openbis.plugin.proteomics.shared.api.v1.dto.Experiment> listSearchExperiments( - String sessionToken, String userID) - { - return listExperiments(sessionToken, userID, MS_SEARCH); - } - - @Override - @RolesAllowed(RoleWithHierarchy.INSTANCE_OBSERVER) - public List<ch.systemsx.cisd.openbis.plugin.proteomics.shared.api.v1.dto.Experiment> listExperiments( - String sessionToken, String userID, String experimentTypeCode) - { - checkSession(sessionToken); - SessionContextDTO session = login(userID); - try - { - List<Experiment> experiments = - service.listExperiments(session.getSessionToken(), experimentTypeCode); - List<ch.systemsx.cisd.openbis.plugin.proteomics.shared.api.v1.dto.Experiment> result = - new ArrayList<ch.systemsx.cisd.openbis.plugin.proteomics.shared.api.v1.dto.Experiment>(); - for (Experiment experiment : experiments) - { - ch.systemsx.cisd.openbis.plugin.proteomics.shared.api.v1.dto.Experiment e = - translate(experiment); - result.add(e); - } - return result; - } finally - { - service.logout(session.getSessionToken()); - } - } - - private ch.systemsx.cisd.openbis.plugin.proteomics.shared.api.v1.dto.Experiment translate( - Experiment experiment) - { - ch.systemsx.cisd.openbis.plugin.proteomics.shared.api.v1.dto.Experiment e = - new ch.systemsx.cisd.openbis.plugin.proteomics.shared.api.v1.dto.Experiment(); - e.setId(experiment.getId()); - e.setCode(experiment.getCode()); - e.setProjectCode(experiment.getProject().getCode()); - e.setSpaceCode(experiment.getProject().getSpace().getCode()); - e.setRegistrationDate(experiment.getRegistrationDate()); - e.setProperties(translate(experiment.getProperties())); - return e; - } - - @Override - @RolesAllowed(RoleWithHierarchy.INSTANCE_OBSERVER) - public List<DataSet> listDataSetsByExperiment(String sessionToken, String userID, - long experimentID) - { - checkSession(sessionToken); - SessionContextDTO session = login(userID); - try - { - List<DataSet> result = new ArrayList<DataSet>(); - List<AbstractExternalData> dataSets = - service.listDataSetsByExperiment(session.getSessionToken(), new TechId( - experimentID)); - for (AbstractExternalData dataSet : dataSets) - { - DataSet ds = new DataSet(); - ds.setId(dataSet.getId()); - ds.setCode(dataSet.getCode()); - ds.setType(dataSet.getDataSetType().getCode()); - ds.setProperties(translate(dataSet.getProperties())); - result.add(ds); - } - return result; - } finally - { - service.logout(session.getSessionToken()); - } - } - - @Override - @RolesAllowed(RoleWithHierarchy.INSTANCE_OBSERVER) - public void processSearchData(String sessionToken, String userID, String dataSetProcessingKey, - long[] searchExperimentIDs) - { - processProteinResultDataSets(sessionToken, userID, dataSetProcessingKey, MS_SEARCH, - searchExperimentIDs); - } - - @Override - @RolesAllowed(RoleWithHierarchy.INSTANCE_OBSERVER) - public void processProteinResultDataSets(String sessionToken, String userID, - String dataSetProcessingKey, String experimentTypeCode, long[] experimentIDs) - { - checkSession(sessionToken); - SessionContextDTO session = login(userID); - try - { - service.processProteinResultDataSets(session.getSessionToken(), dataSetProcessingKey, - experimentTypeCode, experimentIDs); - } finally - { - service.logout(session.getSessionToken()); - } - } - - private Map<PropertyKey, Serializable> translate(List<IEntityProperty> properties) - { - if (properties == null) - { - return null; - } - HashMap<PropertyKey, Serializable> map = new HashMap<PropertyKey, Serializable>(); - for (IEntityProperty property : properties) - { - PropertyType propertyType = property.getPropertyType(); - PropertyKey key = new PropertyKey(propertyType.getCode(), propertyType.getLabel()); - DataTypeCode dataTypeCode = propertyType.getDataType().getCode(); - map.put(key, DataTypeUtils.convertValueTo(dataTypeCode, property.tryGetAsString())); - } - return map; - } - - private SessionContextDTO login(String userID) - { - SessionContextDTO session = service.tryAuthenticate(userID, "dummy-password"); - if (session == null) - { - throw new UserFailureException("Unknown user ID: " + userID); - } - return session; - } - - @Override - public int getMajorVersion() - { - return 1; - } - - @Override - public int getMinorVersion() - { - return 3; - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/api/v1/ProteomicsDataServiceLogger.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/api/v1/ProteomicsDataServiceLogger.java deleted file mode 100644 index a779ee526e0..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/api/v1/ProteomicsDataServiceLogger.java +++ /dev/null @@ -1,142 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.server.api.v1; - -import java.util.List; - -import ch.systemsx.cisd.authentication.ISessionManager; -import ch.systemsx.cisd.openbis.common.spring.IInvocationLoggerContext; -import ch.systemsx.cisd.openbis.generic.shared.AbstractServerLogger; -import ch.systemsx.cisd.openbis.generic.shared.dto.Session; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.api.v1.IProteomicsDataService; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.api.v1.dto.DataSet; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.api.v1.dto.DataStoreServerProcessingPluginInfo; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.api.v1.dto.Experiment; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.api.v1.dto.MsInjectionDataInfo; - -/** - * @author Franz-Josef Elmer - */ -class ProteomicsDataServiceLogger extends AbstractServerLogger implements IProteomicsDataService -{ - - ProteomicsDataServiceLogger(ISessionManager<Session> sessionManager, IInvocationLoggerContext context) - { - super(sessionManager, context); - } - - @Override - public String tryToAuthenticateAtRawDataServer(String userID, String userPassword) - { - return null; - } - - @Override - public List<MsInjectionDataInfo> listRawDataSamples(String sessionToken, String userID) - { - logAccess(sessionToken, "list_raw_data_samples", "USER_ID(%s)", userID); - return null; - } - - @Override - public List<MsInjectionDataInfo> listAllRawDataSamples(String sessionToken, String userID) - { - logAccess(sessionToken, "list_all_raw_data_samples", "USER_ID(%s)", userID); - return null; - } - - @Override - public List<DataStoreServerProcessingPluginInfo> listDataStoreServerProcessingPluginInfos( - String sessionToken) - { - logAccess(sessionToken, "list_data_store_services", ""); - return null; - } - - @Override - public void processingRawData(String sessionToken, String userID, String dataSetProcessingKey, - long[] rawDataSampleIDs, String dataSetType) - { - int numberOfDataSets = rawDataSampleIDs == null ? 0 : rawDataSampleIDs.length; - logAccess(sessionToken, "copy_raw_data", - "USER_ID(%s) DSS_PROCESSING_PLUGIN(%s) NUMBER_OF_DATA_SETS(%s) DATA_SET_TYPE(%s)", - userID, dataSetProcessingKey, numberOfDataSets, dataSetType); - } - - @Override - public void processDataSets(String sessionToken, String userID, String dataSetProcessingKey, - List<String> dataSetCodes) - { - logAccess(sessionToken, "process_data_sets", - "USER_ID(%s) DSS_PROCESSING_PLUGIN(%s) DATA_SETS(%s)", userID, - dataSetProcessingKey, dataSetCodes); - } - - @Override - public List<Experiment> listSearchExperiments(String sessionToken, String userID) - { - logAccess(sessionToken, "list_search_experiments"); - return null; - } - - @Override - public List<Experiment> listExperiments(String sessionToken, String userID, - String experimentTypeCode) - { - logAccess(sessionToken, "list_search_experiments", "EXPERIMENT_TYPE(%s)", experimentTypeCode); - return null; - } - - @Override - public List<DataSet> listDataSetsByExperiment(String sessionToken, String userID, - long experimentID) - { - logAccess(sessionToken, "list_data_sets_by_experiment", "EXPERIMENT_ID(%s)", experimentID); - return null; - } - - @Override - public void processSearchData(String sessionToken, String userID, String dataSetProcessingKey, - long[] searchExperimentIDs) - { - int numberOfDataSets = searchExperimentIDs == null ? 0 : searchExperimentIDs.length; - logAccess(sessionToken, "copy_search_data", "NUMBER_OF_DATA_SETS(%s)", numberOfDataSets); - } - - @Override - public void processProteinResultDataSets(String sessionToken, String userID, - String dataSetProcessingKey, String experimentTypeCode, long[] experimentIDs) - { - int experimentCount = experimentIDs == null ? 0 : experimentIDs.length; - logAccess(sessionToken, "process_protein_result_data_sets", - "DSS_PROCESSING_PLUGIN(%s) EXPERIMENT_TYPE(%s) NUMBER_OF_EXPERIMENTS(%s)", - dataSetProcessingKey, experimentTypeCode, experimentCount); - } - - @Override - public int getMajorVersion() - { - return 1; - } - - @Override - public int getMinorVersion() - { - return 0; - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/api/v1/ProteomicsDataServiceServer.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/api/v1/ProteomicsDataServiceServer.java deleted file mode 100644 index a5f5715dbde..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/api/v1/ProteomicsDataServiceServer.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.server.api.v1; - -import java.io.IOException; - -import javax.annotation.Resource; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestMapping; - -import ch.systemsx.cisd.openbis.common.api.server.AbstractApiServiceExporter; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.api.v1.IProteomicsDataService; - -/** - * Server wrapping {@link IProteomicsDataService}. - * - * @author Franz-Josef Elmer - */ -@Controller -public class ProteomicsDataServiceServer extends AbstractApiServiceExporter -{ - @Resource(name = Constants.PROTEOMICS_DATA_SERVICE) - private IProteomicsDataService service; - - @Override - public void afterPropertiesSet() - { - establishService(IProteomicsDataService.class, service, IProteomicsDataService.SERVICE_NAME, - IProteomicsDataService.SERVER_URL); - super.afterPropertiesSet(); - } - - @RequestMapping( - { IProteomicsDataService.SERVER_URL, "/openbis" + IProteomicsDataService.SERVER_URL }) - @Override - public void handleRequest(HttpServletRequest request, HttpServletResponse response) - throws ServletException, IOException - { - super.handleRequest(request, response); - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/authorization/validator/ParentSampleValidator.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/authorization/validator/ParentSampleValidator.java deleted file mode 100644 index 8d7ad5842d5..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/authorization/validator/ParentSampleValidator.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.server.authorization.validator; - -import ch.systemsx.cisd.openbis.generic.server.authorization.project.provider.project.ProjectProviderFromSample; -import ch.systemsx.cisd.openbis.generic.server.authorization.validator.AbstractValidator; -import ch.systemsx.cisd.openbis.generic.server.authorization.validator.IValidator; -import ch.systemsx.cisd.openbis.generic.server.authorization.validator.SpaceValidator; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Space; -import ch.systemsx.cisd.openbis.generic.shared.dto.PersonPE; - -/** - * @author Franz-Josef Elmer - */ -public class ParentSampleValidator extends AbstractValidator<Sample> -{ - private IValidator<Space> validator = new SpaceValidator(); - - @Override - public boolean doValidation(PersonPE person, Sample value) - { - return isValid(person, value, true); - } - - public boolean isValid(PersonPE person, Sample sample, boolean parentHasToBeValid) - { - Sample parent = sample.getGeneratedFrom(); - - if (parent != null) - { - Space space = parent.getSpace(); - - if (parentHasToBeValid == false || space == null || validator.isValid(person, space)) - { - return true; - } else - { - return isValidPA(person, new ProjectProviderFromSample(parent)); - } - } - - return false; - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/authorization/validator/RawDataSampleValidator.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/authorization/validator/RawDataSampleValidator.java deleted file mode 100644 index 1e280e19880..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/authorization/validator/RawDataSampleValidator.java +++ /dev/null @@ -1,27 +0,0 @@ -package ch.systemsx.cisd.openbis.plugin.proteomics.server.authorization.validator; - -import ch.systemsx.cisd.openbis.generic.server.authorization.IAuthorizationDataProvider; -import ch.systemsx.cisd.openbis.generic.server.authorization.validator.IValidator; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample; -import ch.systemsx.cisd.openbis.generic.shared.dto.PersonPE; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.dto.MsInjectionSample; - -/** - * @author Franz-Josef Elmer - */ -public final class RawDataSampleValidator implements IValidator<MsInjectionSample> -{ - private IValidator<Sample> validator = new ParentSampleValidator(); - - @Override - public boolean isValid(PersonPE person, MsInjectionSample sample) - { - return validator.isValid(person, sample.getSample()); - } - - @Override - public void init(IAuthorizationDataProvider authorizationDataProvider) - { - validator.init(authorizationDataProvider); - } -} \ No newline at end of file diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/AbstractBusinessObject.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/AbstractBusinessObject.java deleted file mode 100644 index e32a00999cb..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/AbstractBusinessObject.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.server.business; - -import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDAOFactory; -import ch.systemsx.cisd.openbis.generic.shared.dto.PersonPE; -import ch.systemsx.cisd.openbis.generic.shared.dto.Session; -import ch.systemsx.cisd.openbis.plugin.proteomics.server.dataaccess.IPhosphoNetXDAOFactory; - -/** - * @author Franz-Josef Elmer - */ -abstract class AbstractBusinessObject -{ - private final IDAOFactory daoFactory; - - private final IPhosphoNetXDAOFactory specificDAOFactory; - - private final Session session; - - AbstractBusinessObject(IDAOFactory daoFactory, IPhosphoNetXDAOFactory specificDAOFactory, Session session) - { - this.daoFactory = daoFactory; - this.specificDAOFactory = specificDAOFactory; - this.session = session; - } - - protected final PersonPE getRegistrator() - { - PersonPE registrator = session.tryGetPerson(); - assert registrator != null : "Session with unknown person: " + session; - return registrator; - } - - protected final IDAOFactory getDaoFactory() - { - return daoFactory; - } - - protected final IPhosphoNetXDAOFactory getSpecificDAOFactory() - { - return specificDAOFactory; - } -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/AbundanceColumnDefinitionTable.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/AbundanceColumnDefinitionTable.java deleted file mode 100644 index e8544ad2d3c..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/AbundanceColumnDefinitionTable.java +++ /dev/null @@ -1,142 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.server.business; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.TreeMap; - -import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDAOFactory; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample; -import ch.systemsx.cisd.openbis.generic.shared.dto.Session; -import ch.systemsx.cisd.openbis.plugin.proteomics.server.dataaccess.IPhosphoNetXDAOFactory; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.AbundanceColumnDefinition; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.Treatment; - -/** - * @author Franz-Josef Elmer - */ -class AbundanceColumnDefinitionTable extends AbstractBusinessObject implements IAbundanceColumnDefinitionTable -{ - private final TreatmentFinder treatmentFinder; - - private final Map<Long, AbundanceColumnDefinition> columnDefinitions; - - AbundanceColumnDefinitionTable(IDAOFactory daoFactory, - IPhosphoNetXDAOFactory specificDAOFactory, Session session) - { - super(daoFactory, specificDAOFactory, session); - treatmentFinder = new TreatmentFinder(); - columnDefinitions = new TreeMap<Long, AbundanceColumnDefinition>(); - } - - @Override - public void add(Sample sample) - { - Sample parent = sample.getGeneratedFrom(); - Sample sampleOrParent = parent == null ? sample : parent; - Long sampleID = sampleOrParent.getId(); - AbundanceColumnDefinition columnDefinition = columnDefinitions.get(sampleID); - if (columnDefinition == null) - { - columnDefinition = new AbundanceColumnDefinition(); - columnDefinition.addSampleID(sampleID); - columnDefinition.setSampleCode(sampleOrParent.getCode()); - columnDefinition.setTreatments(treatmentFinder.findTreatmentsOf(sampleOrParent)); - columnDefinitions.put(sampleID, columnDefinition); - } - } - - @Override - public List<AbundanceColumnDefinition> getSortedAndAggregatedDefinitions( - String treatmentTypeOrNull) - { - Collection<AbundanceColumnDefinition> values = columnDefinitions.values(); - List<AbundanceColumnDefinition> definitions = new ArrayList<AbundanceColumnDefinition>(); - if (treatmentTypeOrNull == null) - { - definitions.addAll(values); - } else - { - Collection<List<AbundanceColumnDefinition>> groupedDefinitions = - groupDefinitions(values, definitions, treatmentTypeOrNull); - for (List<AbundanceColumnDefinition> group : groupedDefinitions) - { - AbundanceColumnDefinition definition = new AbundanceColumnDefinition(); - AbundanceColumnDefinition firstDefinition = group.get(0); - Treatment treatment = - tryToFindTreatmentByTypeCode(firstDefinition, treatmentTypeOrNull); - definition.setTreatments(Arrays.asList(treatment)); - for (AbundanceColumnDefinition abundanceColumnDefinition : group) - { - definition.addSampleIDsOf(abundanceColumnDefinition); - } - definitions.add(definition); - } - } - - Collections.sort(definitions); - return definitions; - } - - private Collection<List<AbundanceColumnDefinition>> groupDefinitions( - Collection<AbundanceColumnDefinition> values, - List<AbundanceColumnDefinition> definitions, String treatmentType) - { - Map<String, List<AbundanceColumnDefinition>> groupedDefinitions = - new HashMap<String, List<AbundanceColumnDefinition>>(); - for (AbundanceColumnDefinition definition : values) - { - Treatment treatment = tryToFindTreatmentByTypeCode(definition, treatmentType); - if (treatment == null) - { - definitions.add(definition); - } else - { - String treatmentValue = treatment.getValue(); - List<AbundanceColumnDefinition> list = groupedDefinitions.get(treatmentValue); - if (list == null) - { - list = new ArrayList<AbundanceColumnDefinition>(); - groupedDefinitions.put(treatmentValue, list); - } - list.add(definition); - } - } - return groupedDefinitions.values(); - } - - private Treatment tryToFindTreatmentByTypeCode(AbundanceColumnDefinition definition, - String typeCode) - { - List<Treatment> treatments = definition.getTreatments(); - for (Treatment treatment : treatments) - { - if (treatment.getTypeCode().equals(typeCode)) - { - return treatment; - } - } - return null; - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/AbundanceManager.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/AbundanceManager.java deleted file mode 100644 index 63b8985b5e4..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/AbundanceManager.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.server.business; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Set; -import java.util.TreeSet; - -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.dto.ProteinAbundance; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.dto.ProteinReferenceWithProtein; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.dto.ProteinWithAbundances; - -/** - * @author Franz-Josef Elmer - */ -class AbundanceManager -{ - private final List<ProteinWithAbundances> proteins = new ArrayList<ProteinWithAbundances>(); - - private final ISampleProvider sampleProvider; - - private final Set<Long> sampleIDs = new TreeSet<Long>(); - - AbundanceManager(ISampleProvider sampleProvider) - { - this.sampleProvider = sampleProvider; - } - - public void handle(ProteinReferenceWithProtein proteinReference, List<ProteinAbundance> listOrNull) - { - String accessionNumber = proteinReference.getAccessionNumber(); - ProteinWithAbundances protein = new ProteinWithAbundances(); - protein.setCoverage(proteinReference.getCoverage()); - protein.setId(proteinReference.getId()); - protein.setDescription(proteinReference.getDescription()); - protein.setAccessionNumber(accessionNumber); - proteins.add(protein); - if (listOrNull != null) - { - for (ProteinAbundance proteinAbundance : listOrNull) - { - String samplePermID = proteinAbundance.getSamplePermID(); - Long sampleID = getSampleIDOrParentSampleID(samplePermID); - sampleIDs.add(sampleID); - protein.addAbundanceFor(sampleID, proteinAbundance.getAbundance()); - } - } - } - - private Long getSampleIDOrParentSampleID(String samplePermID) - { - Sample sample = sampleProvider.getSample(samplePermID); - Sample parent = sample.getGeneratedFrom(); - return parent == null ? sample.getId() : parent.getId(); - } - - public Collection<ProteinWithAbundances> getProteinsWithAbundances() - { - return proteins; - } - - public final Collection<Long> getSampleIDs() - { - return sampleIDs; - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/AccessionNumberBuilder.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/AccessionNumberBuilder.java deleted file mode 100644 index 2e0049c285c..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/AccessionNumberBuilder.java +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.server.business; - -/** - * Parses accession numbers of the form - * - * <pre> - * ['DECOY_'][<type>'|']<accession number>['|'<some string>] - * </pre> - * - * @author Franz-Josef Elmer - */ -public class AccessionNumberBuilder -{ - static final String DECOY_PREFIX = "DECOY_"; - - private static final char SEPARATOR = '|'; - - private final String typeOrNull; - - private final String accessionNumber; - - public AccessionNumberBuilder(String fullAccessionNumber) - { - int indexOfFirstSeparator = fullAccessionNumber.indexOf(SEPARATOR); - if (indexOfFirstSeparator < 0) - { - typeOrNull = null; - accessionNumber = fullAccessionNumber; - } else - { - String firstItem = fullAccessionNumber.substring(0, indexOfFirstSeparator); - int decoyPrefixIndex = firstItem.startsWith(DECOY_PREFIX) ? DECOY_PREFIX.length() : 0; - String prefix = firstItem.substring(0, decoyPrefixIndex); - typeOrNull = firstItem.substring(decoyPrefixIndex); - int startIndex = indexOfFirstSeparator + 1; - int indexOfSecondSeparator = fullAccessionNumber.indexOf(SEPARATOR, startIndex); - if (indexOfSecondSeparator < 0) - { - accessionNumber = - addPrefixIfNecessary(prefix, fullAccessionNumber.substring(startIndex)); - } else - { - accessionNumber = - addPrefixIfNecessary(prefix, - fullAccessionNumber.substring(startIndex, indexOfSecondSeparator)); - } - } - } - - private String addPrefixIfNecessary(String prefix, String string) - { - return string.startsWith(prefix) ? string : prefix + string; - } - - public final String getTypeOrNull() - { - return typeOrNull; - } - - public final String getAccessionNumber() - { - return accessionNumber; - } -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/BusinessObjectFactory.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/BusinessObjectFactory.java deleted file mode 100644 index c7b486a1e57..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/BusinessObjectFactory.java +++ /dev/null @@ -1,120 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.server.business; - -import ch.systemsx.cisd.openbis.generic.server.business.bo.ICommonBusinessObjectFactory; -import ch.systemsx.cisd.openbis.generic.server.business.bo.samplelister.ISampleLister; -import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDAOFactory; -import ch.systemsx.cisd.openbis.generic.shared.dto.Session; -import ch.systemsx.cisd.openbis.plugin.AbstractPluginBusinessObjectFactory; -import ch.systemsx.cisd.openbis.plugin.proteomics.server.dataaccess.IPhosphoNetXDAOFactory; - -/** - * @author Franz-Josef Elmer - */ -public class BusinessObjectFactory extends AbstractPluginBusinessObjectFactory implements - IBusinessObjectFactory -{ - private final IDAOFactory daoFactory; - - private final IPhosphoNetXDAOFactory specificDAOFactory; - - private final ICommonBusinessObjectFactory businessObjectFactory; - - public BusinessObjectFactory(IDAOFactory daoFactory, IPhosphoNetXDAOFactory specificDAOFactory, - ICommonBusinessObjectFactory businessObjectFactory) - { - this.daoFactory = daoFactory; - this.specificDAOFactory = specificDAOFactory; - this.businessObjectFactory = businessObjectFactory; - } - - @Override - public ISampleLister createSampleLister(Session session) - { - return getCommonBusinessObjectFactory().createSampleLister(session); - } - - @Override - public IAbundanceColumnDefinitionTable createAbundanceColumnDefinitionTable(Session session) - { - return new AbundanceColumnDefinitionTable(daoFactory, specificDAOFactory, session); - } - - @Override - public IProteinInfoTable createProteinInfoTable(Session session, ISampleProvider sampleProvider) - { - return new ProteinInfoTable(daoFactory, specificDAOFactory, session, sampleProvider); - } - - @Override - public IProteinSummaryTable createProteinSummaryTable(Session session) - { - return new ProteinSummaryTable(daoFactory, specificDAOFactory, session); - } - - @Override - public IProteinSequenceTable createProteinSequenceTable(Session session) - { - return new ProteinSequenceTable(daoFactory, specificDAOFactory, session); - } - - @Override - public IDataSetProteinTable createDataSetProteinTable(Session session) - { - return new DataSetProteinTable(daoFactory, specificDAOFactory, session); - } - - @Override - public IProteinDetailsBO createProteinDetailsBO(Session session) - { - return new ProteinDetailsBO(daoFactory, specificDAOFactory, session); - } - - @Override - public IProteinRelatedSampleTable createProteinRelatedSampleTable(Session session) - { - return new ProteinRelatedSampleTable(daoFactory, specificDAOFactory, - getManagedPropertyEvaluatorFactory()); - } - - @Override - public ISampleTable createSampleTable(Session session) - { - return new SampleTable(daoFactory, specificDAOFactory, session, - getManagedPropertyEvaluatorFactory()); - } - - @Override - public ISampleIDProvider createSampleIDProvider(Session session) - { - return new SampleIDProvider(daoFactory.getSampleDAO()); - } - - @Override - public ISampleProvider createSampleProvider(Session session) - { - return new SampleProvider(session, this); - } - - @Override - public ISampleLoader createSampleLoader(Session session) - { - return new SampleLoader(session, daoFactory, businessObjectFactory); - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/DataSetProteinTable.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/DataSetProteinTable.java deleted file mode 100644 index b1552715903..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/DataSetProteinTable.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.server.business; - -import java.util.ArrayList; -import java.util.List; - -import net.lemnik.eodsql.DataSet; - -import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDAOFactory; -import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; -import ch.systemsx.cisd.openbis.generic.shared.dto.Session; -import ch.systemsx.cisd.openbis.plugin.proteomics.server.dataaccess.IPhosphoNetXDAOFactory; -import ch.systemsx.cisd.openbis.plugin.proteomics.server.dataaccess.IProteinQueryDAO; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.DataSetProtein; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.dto.IdentifiedProtein; - -/** - * @author Franz-Josef Elmer - */ -class DataSetProteinTable extends AbstractBusinessObject implements IDataSetProteinTable -{ - private List<DataSetProtein> dataSetProteins; - - DataSetProteinTable(IDAOFactory daoFactory, IPhosphoNetXDAOFactory specificDAOFactory, - Session session) - { - super(daoFactory, specificDAOFactory, session); - } - - @Override - public List<DataSetProtein> getDataSetProteins() - { - return dataSetProteins; - } - - @Override - public void load(String experimentPermID, TechId proteinReferenceID, - IProteinSequenceTable sequenceTable) - { - IProteinQueryDAO proteinQueryDAO = getSpecificDAOFactory().getProteinQueryDAO(experimentPermID); - ErrorModel errorModel = new ErrorModel(proteinQueryDAO); - DataSet<IdentifiedProtein> proteins = - proteinQueryDAO.listProteinsByProteinReferenceAndExperiment(experimentPermID, - proteinReferenceID.getId()); - dataSetProteins = new ArrayList<DataSetProtein>(); - for (IdentifiedProtein protein : proteins) - { - errorModel.setFalseDiscoveryRateFor(protein); - DataSetProtein dataSetProtein = new DataSetProtein(); - dataSetProtein.setDataSetID(new TechId(protein.getDataSetID())); - dataSetProtein.setDataSetPermID(protein.getDataSetPermID()); - dataSetProtein.setFalseDiscoveryRate(protein.getFalseDiscoveryRate()); - dataSetProtein.setPeptideCount(protein.getPeptideCount()); - dataSetProtein.setProteinID(new TechId(protein.getProteinID())); - dataSetProtein.setSequenceName(sequenceTable.getShortName(protein.getDatabaseID())); - dataSetProteins.add(dataSetProtein); - } - proteins.close(); - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/ErrorModel.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/ErrorModel.java deleted file mode 100644 index fbeec454b95..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/ErrorModel.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.server.business; - -import java.util.HashMap; -import java.util.Map; - -import net.lemnik.eodsql.DataSet; - -import ch.systemsx.cisd.openbis.plugin.proteomics.server.dataaccess.IProteinQueryDAO; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.ProbabilityToFDRCalculator; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.dto.IdentifiedProtein; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.dto.ProbabilityFDRMapping; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.dto.ProteinReferenceWithProtein; - -/** - * @author Franz-Josef Elmer - */ -class ErrorModel -{ - private final Map<Long, ProbabilityToFDRCalculator> calculators = - new HashMap<Long, ProbabilityToFDRCalculator>(); - - private final IProteinQueryDAO dao; - - ErrorModel(IProteinQueryDAO dao) - { - this.dao = dao; - } - - boolean passProtein(ProteinReferenceWithProtein protein, double falseDiscoveryRate) - { - ProbabilityToFDRCalculator calculator = getCalculator(protein.getDataSetID()); - double fdr = calculator.calculateFDR(protein.getProbability()); - return Double.isNaN(fdr) || fdr <= falseDiscoveryRate; - } - - void setFalseDiscoveryRateFor(IdentifiedProtein protein) - { - long dataSetID = protein.getDataSetID(); - double probability = protein.getProbability(); - protein.setFalseDiscoveryRate(calculateFalsDiscoveryRate(dataSetID, probability)); - } - - double calculateFalsDiscoveryRate(long dataSetID, double probability) - { - ProbabilityToFDRCalculator calculator = getCalculator(dataSetID); - return calculator.calculateFDR(probability); - } - - private ProbabilityToFDRCalculator getCalculator(long dataSetID) - { - ProbabilityToFDRCalculator calculator = calculators.get(dataSetID); - if (calculator == null) - { - calculator = new ProbabilityToFDRCalculator(); - DataSet<ProbabilityFDRMapping> mappings = dao.getProbabilityFDRMapping(dataSetID); - for (ProbabilityFDRMapping probabilityFDRMapping : mappings) - { - double probability = probabilityFDRMapping.getProbability(); - double falseDiscoveryRate = probabilityFDRMapping.getFalseDiscoveryRate(); - calculator.add(probability, falseDiscoveryRate); - } - mappings.close(); - calculator.init(); - calculators.put(dataSetID, calculator); - } - return calculator; - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/ExperimentLoader.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/ExperimentLoader.java deleted file mode 100644 index 50c8f79d2c6..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/ExperimentLoader.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.server.business; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; - -import ch.systemsx.cisd.openbis.generic.server.authorization.validator.SamplePropertyAccessValidator; -import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDAOFactory; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample; -import ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentPE; -import ch.systemsx.cisd.openbis.generic.shared.dto.Session; -import ch.systemsx.cisd.openbis.generic.shared.managed_property.IManagedPropertyEvaluatorFactory; -import ch.systemsx.cisd.openbis.generic.shared.translator.ExperimentTranslator; -import ch.systemsx.cisd.openbis.generic.shared.translator.ExperimentTranslator.LoadableFields; - -/** - * @author Franz-Josef Elmer - */ -public class ExperimentLoader -{ - private final IDAOFactory daoFactory; - - private final IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory; - - public ExperimentLoader(IDAOFactory daoFactory, - IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory) - { - this.daoFactory = daoFactory; - this.managedPropertyEvaluatorFactory = managedPropertyEvaluatorFactory; - } - - public void enrichWithExperiments(Session session, Collection<Sample> samples) - { - Map<Long, List<Sample>> samplesByID = new LinkedHashMap<Long, List<Sample>>(); - for (Sample sample : samples) - { - Experiment experiment = sample.getExperiment(); - if (experiment != null) - { - Long id = experiment.getId(); - List<Sample> list = samplesByID.get(id); - if (list == null) - { - list = new ArrayList<Sample>(); - samplesByID.put(id, list); - } - list.add(sample); - } - } - List<ExperimentPE> experiments = - daoFactory.getExperimentDAO().listExperimentsWithProperties(samplesByID.keySet()); - for (ExperimentPE experiment : experiments) - { - Experiment e = - ExperimentTranslator.translate(experiment, "", null, - managedPropertyEvaluatorFactory, - new SamplePropertyAccessValidator(session, daoFactory), LoadableFields.PROPERTIES); - List<Sample> list = samplesByID.get(experiment.getId()); - for (Sample sample : list) - { - sample.setExperiment(e); - } - } - } -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/IAbundanceColumnDefinitionTable.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/IAbundanceColumnDefinitionTable.java deleted file mode 100644 index 8b1420e641c..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/IAbundanceColumnDefinitionTable.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.server.business; - -import java.util.List; - -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.AbundanceColumnDefinition; - -/** - * @author Franz-Josef Elmer - */ -public interface IAbundanceColumnDefinitionTable -{ - public void add(Sample sample); - - public List<AbundanceColumnDefinition> getSortedAndAggregatedDefinitions( - String treatmentTypeOrNull); - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/IBusinessObjectFactory.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/IBusinessObjectFactory.java deleted file mode 100644 index 2efc9007f38..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/IBusinessObjectFactory.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.server.business; - -import ch.systemsx.cisd.openbis.generic.server.business.bo.samplelister.ISampleLister; -import ch.systemsx.cisd.openbis.generic.shared.dto.Session; - -/** - * @author Franz-Josef Elmer - */ -public interface IBusinessObjectFactory -{ - public ISampleLister createSampleLister(Session session); - - public IAbundanceColumnDefinitionTable createAbundanceColumnDefinitionTable(Session session); - - public IProteinInfoTable createProteinInfoTable(Session session, - ISampleProvider sampleProvider); - - public IProteinSummaryTable createProteinSummaryTable(Session session); - - public IProteinSequenceTable createProteinSequenceTable(Session session); - - public IDataSetProteinTable createDataSetProteinTable(Session session); - - public IProteinDetailsBO createProteinDetailsBO(Session session); - - public IProteinRelatedSampleTable createProteinRelatedSampleTable(Session session); - - public ISampleTable createSampleTable(Session session); - - public ISampleIDProvider createSampleIDProvider(Session session); - - public ISampleProvider createSampleProvider(Session session); - - public ISampleLoader createSampleLoader(Session session); -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/IDataSetProteinTable.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/IDataSetProteinTable.java deleted file mode 100644 index 6785f2a998d..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/IDataSetProteinTable.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.server.business; - -import java.util.List; - -import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.DataSetProtein; - -/** - * @author Franz-Josef Elmer - */ -public interface IDataSetProteinTable -{ - public List<DataSetProtein> getDataSetProteins(); - - public void load(String experimentPermID, TechId proteinReferenceID, - IProteinSequenceTable sequenceTable); - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/IProteinDetailsBO.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/IProteinDetailsBO.java deleted file mode 100644 index 2aeefffc700..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/IProteinDetailsBO.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.server.business; - -import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.ProteinDetails; - -/** - * @author Franz-Josef Elmer - */ -public interface IProteinDetailsBO -{ - - public void loadByExperimentAndReference(TechId experimentID, TechId proteinReferenceID); - - public ProteinDetails getDetailsOrNull(); - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/IProteinInfoTable.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/IProteinInfoTable.java deleted file mode 100644 index 97ce2def459..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/IProteinInfoTable.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.server.business; - -import java.util.List; - -import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.AbundanceColumnDefinition; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.AggregateFunction; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.ProteinInfo; - -/** - * Business object for loading proteins together with their abundances. - * - * @author Franz-Josef Elmer - */ -public interface IProteinInfoTable -{ - /** - * Loads proteins of all data sets registered for the specified experiment. All proteins are filtered out if their false discovery rate is larger - * then the specified one. Abundance values are aggregated in accordance with <code>aggregateOnOriginal</code>, abundance column definitions, and - * aggregate function. - */ - public void load(List<AbundanceColumnDefinition> definitions, TechId experimentId, - double falseDiscoveryRate, AggregateFunction function, boolean aggregateOnOriginal); - - public List<ProteinInfo> getProteinInfos(); - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/IProteinRelatedSampleTable.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/IProteinRelatedSampleTable.java deleted file mode 100644 index 38f02ccfc28..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/IProteinRelatedSampleTable.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright 2011 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.server.business; - -import java.util.List; - -import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; -import ch.systemsx.cisd.openbis.generic.shared.dto.Session; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.ProteinRelatedSample; - -/** - * Interface to business object for collection of {@link ProteinRelatedSample} instances. - * - * @author Franz-Josef Elmer - */ -public interface IProteinRelatedSampleTable -{ - public void load(Session session, TechId experimentID, TechId proteinReferenceID, String sequenceOrNull); - - public List<ProteinRelatedSample> getSamples(); -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/IProteinSequenceTable.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/IProteinSequenceTable.java deleted file mode 100644 index f19c618ac72..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/IProteinSequenceTable.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.server.business; - -import java.util.List; - -import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.ProteinSequence; - -/** - * @author Franz-Josef Elmer - */ -public interface IProteinSequenceTable -{ - - public void loadByReference(TechId experimentID, TechId proteinReferenceID); - - public List<ProteinSequence> getSequences(); - - public String getShortName(long databaseID); -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/IProteinSummaryTable.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/IProteinSummaryTable.java deleted file mode 100644 index de570feda6c..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/IProteinSummaryTable.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.server.business; - -import java.util.List; - -import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.ProteinSummary; - -/** - * @author Franz-Josef Elmer - */ -public interface IProteinSummaryTable -{ - - public void load(TechId experimentID); - - public List<ProteinSummary> getProteinSummaries(); - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/ISampleIDProvider.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/ISampleIDProvider.java deleted file mode 100644 index e363ec393e7..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/ISampleIDProvider.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.server.business; - -import ch.systemsx.cisd.common.exceptions.UserFailureException; -import ch.systemsx.cisd.openbis.generic.shared.dto.SamplePE; - -/** - * Provides the ID of a sample or its parent. - * - * @author Franz-Josef Elmer - */ -public interface ISampleIDProvider -{ - /** - * Returns the ID of the specified sample or the ID of its parent if it exist. - * - * @throws UserFailureException if no sample could be found. - */ - public long getSampleIDOrParentSampleID(String samplePermID); - - public SamplePE getSampleOrParentSample(String samplePermID); - -} \ No newline at end of file diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/ISampleLoader.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/ISampleLoader.java deleted file mode 100644 index cfa34fdf1eb..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/ISampleLoader.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.server.business; - -import java.util.List; - -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample; - -/** - * Loader for sample having a parent. - * - * @author Franz-Josef Elmer - */ -public interface ISampleLoader -{ - public List<Sample> listSamplesWithParentsByTypeAndSpace(String sampleTypeCode, String spaceCode); -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/ISampleProvider.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/ISampleProvider.java deleted file mode 100644 index 47423c1036b..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/ISampleProvider.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.server.business; - -import ch.systemsx.cisd.common.exceptions.UserFailureException; -import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample; - -/** - * Provides samples of an experiments. - * - * @author Franz-Josef Elmer - */ -public interface ISampleProvider -{ - /** - * Loads all samples registered for the specified experiment. - */ - public void loadByExperimentID(TechId experimentID); - - /** - * Returns the sample for specified permID. - * - * @throws UserFailureException if sample not found. - */ - public Sample getSample(String permID); - -} \ No newline at end of file diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/ISampleTable.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/ISampleTable.java deleted file mode 100644 index 08fabca7b1f..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/ISampleTable.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.server.business; - -import java.util.List; - -import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; -import ch.systemsx.cisd.openbis.generic.shared.dto.Session; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.SampleWithPropertiesAndAbundance; - -/** - * @author Franz-Josef Elmer - */ -public interface ISampleTable -{ - - public void loadSamplesWithAbundance(Session session, TechId experimentID, TechId proteinReferenceID); - - public List<SampleWithPropertiesAndAbundance> getSamples(); - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/ProteinDetailsBO.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/ProteinDetailsBO.java deleted file mode 100644 index c7b94a9afcc..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/ProteinDetailsBO.java +++ /dev/null @@ -1,177 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.server.business; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import net.lemnik.eodsql.DataSet; - -import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDAOFactory; -import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; -import ch.systemsx.cisd.openbis.generic.shared.dto.DataPE; -import ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentPE; -import ch.systemsx.cisd.openbis.generic.shared.dto.Session; -import ch.systemsx.cisd.openbis.plugin.proteomics.server.dataaccess.IPhosphoNetXDAOFactory; -import ch.systemsx.cisd.openbis.plugin.proteomics.server.dataaccess.IProteinQueryDAO; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.IndistinguishableProteinInfo; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.Peptide; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.PeptideModification; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.ProteinDetails; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.dto.IdentifiedProtein; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.dto.IndistinguishableProtein; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.dto.PeptideWithModification; - -/** - * @author Franz-Josef Elmer - */ -class ProteinDetailsBO extends AbstractBusinessObject implements IProteinDetailsBO -{ - private ProteinDetails details; - - ProteinDetailsBO(IDAOFactory daoFactory, IPhosphoNetXDAOFactory specificDAOFactory, - Session session) - { - super(daoFactory, specificDAOFactory, session); - } - - @Override - public ProteinDetails getDetailsOrNull() - { - return details; - } - - @Override - public void loadByExperimentAndReference(TechId experimentID, TechId proteinReferenceID) - { - String experimentPermID = getExperimentPermIDFor(experimentID); - IProteinQueryDAO proteinQueryDAO = getSpecificDAOFactory().getProteinQueryDAO(experimentID); - DataSet<IdentifiedProtein> proteins = - proteinQueryDAO.listProteinsByProteinReferenceAndExperiment(experimentPermID, - proteinReferenceID.getId()); - try - { - if (proteins.size() == 1) - { - ErrorModel errorModel = new ErrorModel(proteinQueryDAO); - IdentifiedProtein protein = proteins.get(0); - errorModel.setFalseDiscoveryRateFor(protein); - details = new ProteinDetails(); - details.setSequence(protein.getSequence()); - details.setDatabaseNameAndVersion(protein.getDatabaseNameAndVersion()); - details.setProbability(protein.getProbability()); - details.setCoverage(100 * protein.getCoverage()); - details.setFalseDiscoveryRate(protein.getFalseDiscoveryRate()); - String dataSetPermID = protein.getDataSetPermID(); - details.setDataSetPermID(dataSetPermID); - DataPE ds = getDaoFactory().getDataDAO().tryToFindDataSetByCode(dataSetPermID); - if (ds != null) - { - details.setDataSetTechID(ds.getId()); - details.setDataSetTypeCode(ds.getDataSetType().getCode()); - } - details.setPeptides(loadPeptides(proteinQueryDAO, protein)); - long proteinID = protein.getProteinID(); - details.setProteinID(new TechId(proteinID)); - details.setIndistinguishableProteinInfos(loadIndistinguishableProteinInfos(proteinQueryDAO, proteinID)); - } - } finally - { - proteins.close(); - } - } - - private List<IndistinguishableProteinInfo> loadIndistinguishableProteinInfos(IProteinQueryDAO proteinQueryDAO, long proteinID) - { - DataSet<IndistinguishableProtein> proteins = - proteinQueryDAO.listIndistinguishableProteinsByProteinID(proteinID); - try - { - List<IndistinguishableProteinInfo> infos = - new ArrayList<IndistinguishableProteinInfo>(); - for (IndistinguishableProtein protein : proteins) - { - IndistinguishableProteinInfo info = new IndistinguishableProteinInfo(); - AccessionNumberBuilder builder = - new AccessionNumberBuilder(protein.getAccessionNumber()); - info.setAccessionNumber(builder.getAccessionNumber()); - info.setAccessionNumberType(builder.getTypeOrNull()); - info.setDescription(protein.getDescription()); - info.setSequence(protein.getSequence()); - info.setCoverage(100 * protein.getCoverage()); - infos.add(info); - } - return infos; - } finally - { - proteins.close(); - } - } - - private List<Peptide> loadPeptides(IProteinQueryDAO proteinQueryDAO, IdentifiedProtein protein) - { - DataSet<PeptideWithModification> identifiedPeptides = - proteinQueryDAO.listIdentifiedPeptidesByProtein(protein.getProteinID()); - try - { - Map<Long, Peptide> peps = new HashMap<Long, Peptide>(); - for (PeptideWithModification peptidWithModification : identifiedPeptides) - { - long id = peptidWithModification.getId(); - Peptide peptide = peps.get(id); - if (peptide == null) - { - peptide = new Peptide(); - peptide.setSequence(peptidWithModification.getSequence()); - peps.put(id, peptide); - } - Integer position = peptidWithModification.getPosition(); - Double mass = peptidWithModification.getMass(); - if (position != null && mass != null) - { - PeptideModification peptideModification = new PeptideModification(); - peptideModification.setPosition(position); - peptideModification.setMass(mass); - peptide.getModifications().add(peptideModification); - } - } - List<Peptide> result = new ArrayList<Peptide>(peps.values()); - Collections.sort(result, new Comparator<Peptide>() - { - @Override - public int compare(Peptide p1, Peptide p2) - { - return p1.getSequence().compareTo(p2.getSequence()); - } - }); - return result; - } finally - { - identifiedPeptides.close(); - } - } - - private String getExperimentPermIDFor(TechId experimentId) - { - ExperimentPE experiment = getDaoFactory().getExperimentDAO().getByTechId(experimentId); - return experiment.getPermId(); - } -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/ProteinInfoTable.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/ProteinInfoTable.java deleted file mode 100644 index 6e09f0cc8b3..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/ProteinInfoTable.java +++ /dev/null @@ -1,217 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.server.business; - -import it.unimi.dsi.fastutil.longs.LongOpenHashSet; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.Comparator; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import net.lemnik.eodsql.DataSet; - -import org.apache.log4j.Logger; - -import ch.systemsx.cisd.common.logging.LogCategory; -import ch.systemsx.cisd.common.logging.LogFactory; -import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDAOFactory; -import ch.systemsx.cisd.openbis.generic.server.dataaccess.IExperimentDAO; -import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; -import ch.systemsx.cisd.openbis.generic.shared.dto.Session; -import ch.systemsx.cisd.openbis.plugin.proteomics.server.dataaccess.IPhosphoNetXDAOFactory; -import ch.systemsx.cisd.openbis.plugin.proteomics.server.dataaccess.IProteinQueryDAO; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.AbundanceColumnDefinition; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.AggregateFunction; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.ProteinInfo; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.dto.ProteinAbundance; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.dto.ProteinReferenceWithProtein; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.dto.ProteinWithAbundances; - -/** - * Implementation based of {@link IDAOFactory} and {@link IPhosphoNetXDAOFactory}. - * - * @author Franz-Josef Elmer - */ -class ProteinInfoTable extends AbstractBusinessObject implements IProteinInfoTable -{ - protected static final Logger operationLog = - LogFactory.getLogger(LogCategory.OPERATION, ProteinInfoTable.class); - - private List<ProteinInfo> infos; - - private final ISampleProvider sampleProvider; - - ProteinInfoTable(IDAOFactory daoFactory, IPhosphoNetXDAOFactory specificDAOFactory, - Session session, ISampleProvider sampleProvider) - { - super(daoFactory, specificDAOFactory, session); - this.sampleProvider = sampleProvider; - } - - @Override - public List<ProteinInfo> getProteinInfos() - { - if (infos == null) - { - throw new IllegalStateException("No proteins loaded."); - } - return infos; - } - - @Override - public void load(List<AbundanceColumnDefinition> definitions, TechId experimentID, - double falseDiscoveryRate, AggregateFunction function, boolean aggregateOnOriginal) - { - IExperimentDAO experimentDAO = getDaoFactory().getExperimentDAO(); - String permID = experimentDAO.getByTechId(experimentID).getPermId(); - AbundanceManager abundanceManager = setUpAbundanceManager(permID, falseDiscoveryRate); - Collection<ProteinWithAbundances> proteins = abundanceManager.getProteinsWithAbundances(); - infos = new ArrayList<ProteinInfo>(proteins.size()); - for (ProteinWithAbundances protein : proteins) - { - ProteinInfo proteinInfo = new ProteinInfo(); - proteinInfo.setId(new TechId(protein.getId())); - AccessionNumberBuilder builder = new AccessionNumberBuilder(protein.getAccessionNumber()); - proteinInfo.setCoverage(100 * protein.getCoverage()); - proteinInfo.setAccessionNumber(builder.getAccessionNumber()); - proteinInfo.setDescription(protein.getDescription()); - proteinInfo.setExperimentID(experimentID); - Map<Long, Double> abundances = new HashMap<Long, Double>(); - for (AbundanceColumnDefinition abundanceColumnDefinition : definitions) - { - double[] abundanceValues = new double[0]; - List<Long> ids = abundanceColumnDefinition.getSampleIDs(); - for (Long sampleID : ids) - { - double[] values = protein.getAbundancesForSample(sampleID); - if (values != null && values.length > 0 && aggregateOnOriginal == false) - { - values = new double[] { function.aggregate(values) }; - } - abundanceValues = concatenate(abundanceValues, values); - } - if (abundanceValues.length > 0) - { - double aggregatedAbundance = function.aggregate(abundanceValues); - abundances.put(abundanceColumnDefinition.getID(), aggregatedAbundance); - } - } - proteinInfo.setAbundances(abundances); - infos.add(proteinInfo); - } - Collections.sort(infos, new Comparator<ProteinInfo>() - { - - @Override - public int compare(ProteinInfo p1, ProteinInfo p2) - { - String an1 = p1.getAccessionNumber(); - String an2 = p2.getAccessionNumber(); - return an1 == null ? -1 : (an2 == null ? 1 : an1.compareToIgnoreCase(an2)); - } - }); - } - - private AbundanceManager setUpAbundanceManager(String experimentPermID, - double falseDiscoveryRate) - { - AbundanceManager abundanceManager = new AbundanceManager(sampleProvider); - IPhosphoNetXDAOFactory specificDAOFactory = getSpecificDAOFactory(); - IProteinQueryDAO dao = specificDAOFactory.getProteinQueryDAO(experimentPermID); - long time = System.currentTimeMillis(); - DataSet<ProteinReferenceWithProtein> dataSet = - dao.listProteinReferencesByExperiment(experimentPermID); - List<ProteinReferenceWithProtein> proteins = new ArrayList<ProteinReferenceWithProtein>(); - LongOpenHashSet proteinIDs = new LongOpenHashSet(); - try - { - for (ProteinReferenceWithProtein protein : dataSet) - { - proteins.add(protein); - proteinIDs.add(protein.getProteinID()); - } - } finally - { - dataSet.close(); - } - operationLog.info("(" + (System.currentTimeMillis() - time) + "ms) for listProteinReferencesByExperiment"); - Map<Long, List<ProteinAbundance>> abundancesPerProtein = getAbudancesPerProtein(dao, proteinIDs); - ErrorModel errorModel = new ErrorModel(dao); - for (ProteinReferenceWithProtein protein : proteins) - { - if (errorModel.passProtein(protein, falseDiscoveryRate)) - { - List<ProteinAbundance> list = abundancesPerProtein.get(protein.getProteinID()); - abundanceManager.handle(protein, list); - } - } - return abundanceManager; - } - - private Map<Long, List<ProteinAbundance>> getAbudancesPerProtein(IProteinQueryDAO dao, LongOpenHashSet proteinIDs) - { - long time = System.currentTimeMillis(); - DataSet<ProteinAbundance> dataSet = dao.listProteinWithAbundanceByExperiment(proteinIDs); - List<ProteinAbundance> proteinAbundances = new ArrayList<ProteinAbundance>(); - try - { - for (ProteinAbundance proteinAbundance : dataSet) - { - proteinAbundances.add(proteinAbundance); - } - } finally - { - dataSet.close(); - } - operationLog.info("(" + (System.currentTimeMillis() - time) + "ms) for listProteinWithAbundanceByExperiment"); - Map<Long, List<ProteinAbundance>> abundancesPerProtein = - new HashMap<Long, List<ProteinAbundance>>(); - for (ProteinAbundance proteinAbundance : proteinAbundances) - { - long proteinID = proteinAbundance.getId(); - List<ProteinAbundance> list = abundancesPerProtein.get(proteinID); - if (list == null) - { - list = new ArrayList<ProteinAbundance>(); - abundancesPerProtein.put(proteinID, list); - } - list.add(proteinAbundance); - } - return abundancesPerProtein; - } - - private static double[] concatenate(double[] array1OrNull, double[] array2OrNull) - { - if (array1OrNull == null || array1OrNull.length == 0) - { - return array2OrNull; - } - if (array2OrNull == null || array2OrNull.length == 0) - { - return array1OrNull; - } - double[] newArray = new double[array1OrNull.length + array2OrNull.length]; - System.arraycopy(array1OrNull, 0, newArray, 0, array1OrNull.length); - System.arraycopy(array2OrNull, 0, newArray, array1OrNull.length, array2OrNull.length); - return newArray; - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/ProteinRelatedSampleTable.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/ProteinRelatedSampleTable.java deleted file mode 100644 index c884b253e98..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/ProteinRelatedSampleTable.java +++ /dev/null @@ -1,219 +0,0 @@ -/* - * Copyright 2011 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.server.business; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; - -import net.lemnik.eodsql.DataSet; -import ch.systemsx.cisd.openbis.generic.server.authorization.validator.SamplePropertyAccessValidator; -import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDAOFactory; -import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.MaterialType; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PropertyType; -import ch.systemsx.cisd.openbis.generic.shared.dto.MaterialTypePE; -import ch.systemsx.cisd.openbis.generic.shared.dto.PropertyTypePE; -import ch.systemsx.cisd.openbis.generic.shared.dto.SamplePE; -import ch.systemsx.cisd.openbis.generic.shared.dto.Session; -import ch.systemsx.cisd.openbis.generic.shared.managed_property.IManagedPropertyEvaluatorFactory; -import ch.systemsx.cisd.openbis.generic.shared.translator.EntityPropertyTranslator; -import ch.systemsx.cisd.openbis.generic.shared.translator.SampleTypeTranslator; -import ch.systemsx.cisd.openbis.plugin.proteomics.server.dataaccess.IPhosphoNetXDAOFactory; -import ch.systemsx.cisd.openbis.plugin.proteomics.server.dataaccess.IProteinQueryDAO; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.Occurrence; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.OccurrenceUtil; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.ProteinRelatedSample; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.dto.AbstractSample; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.dto.SampleAbundance; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.dto.SamplePeptideModification; - -/** - * Implementation of {@link IProteinRelatedSampleTable}. - * - * @author Franz-Josef Elmer - */ -class ProteinRelatedSampleTable implements IProteinRelatedSampleTable -{ - private final IDAOFactory daoFactory; - - private final IPhosphoNetXDAOFactory specificDAOFactory; - - private final IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory; - - private List<ProteinRelatedSample> result; - - ProteinRelatedSampleTable(IDAOFactory daoFactory, IPhosphoNetXDAOFactory specificDAOFactory, - IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory) - { - this.daoFactory = daoFactory; - this.specificDAOFactory = specificDAOFactory; - this.managedPropertyEvaluatorFactory = managedPropertyEvaluatorFactory; - } - - @Override - public List<ProteinRelatedSample> getSamples() - { - return result; - } - - @Override - public void load(Session session, TechId experimentID, TechId proteinReferenceID, String sequenceOrNull) - { - String experimentPermID = - daoFactory.getExperimentDAO().getByTechId(experimentID).getPermId(); - IProteinQueryDAO proteinQueryDAO = specificDAOFactory.getProteinQueryDAO(experimentID); - Map<String, List<SampleAbundance>> sampleAbundanceMap = - createSampleMap(proteinQueryDAO.listSampleAbundanceByProtein(experimentPermID, - proteinReferenceID.getId())); - Map<String, List<SamplePeptideModification>> samplePeptideModificationMap = - createSampleMap(proteinQueryDAO.listSamplePeptideModificatioByProtein( - experimentPermID, proteinReferenceID.getId())); - result = new ArrayList<ProteinRelatedSample>(); - SampleIDProvider sampleIDProvider = new SampleIDProvider(daoFactory.getSampleDAO()); - Map<PropertyTypePE, PropertyType> cache = new HashMap<PropertyTypePE, PropertyType>(); - Map<MaterialTypePE, MaterialType> materialTypeCache = new HashMap<MaterialTypePE, MaterialType>(); - for (Entry<String, List<SampleAbundance>> entry : sampleAbundanceMap.entrySet()) - { - String key = entry.getKey(); - SamplePE sample = sampleIDProvider.getSampleOrParentSample(key); - List<SampleAbundance> sampleAbundances = entry.getValue(); - List<SamplePeptideModification> samplePeptideModifications = - samplePeptideModificationMap.get(key); - if (samplePeptideModifications == null) - { - for (SampleAbundance sampleAbundance : sampleAbundances) - { - ProteinRelatedSample s = createFrom(sample, materialTypeCache, cache, session); - s.setAbundance(sampleAbundance.getAbundance()); - result.add(s); - } - } else - { - for (SampleAbundance sampleAbundance : sampleAbundances) - { - Double abundance = sampleAbundance.getAbundance(); - result.addAll(createSamplesForPeptideModifications(samplePeptideModifications, - sample, abundance, sequenceOrNull, materialTypeCache, cache, session)); - } - } - } - for (Entry<String, List<SamplePeptideModification>> entry : samplePeptideModificationMap - .entrySet()) - { - String key = entry.getKey(); - if (sampleAbundanceMap.containsKey(key) == false) - { - SamplePE sample = sampleIDProvider.getSampleOrParentSample(key); - List<SamplePeptideModification> samplePeptideModifications = entry.getValue(); - result.addAll(createSamplesForPeptideModifications(samplePeptideModifications, - sample, null, sequenceOrNull, materialTypeCache, cache, session)); - } - } - } - - private List<ProteinRelatedSample> createSamplesForPeptideModifications( - List<SamplePeptideModification> samplePeptideModifications, SamplePE sample, - Double abundanceOrNull, String sequenceOrNull, - Map<MaterialTypePE, MaterialType> materialTypeCache, Map<PropertyTypePE, PropertyType> cache - , Session session) - { - List<ProteinRelatedSample> samples = new ArrayList<ProteinRelatedSample>(); - for (SamplePeptideModification samplePeptideModification : samplePeptideModifications) - { - int position = samplePeptideModification.getPosition(); - if (sequenceOrNull != null) - { - List<Occurrence> occurances = - OccurrenceUtil.findAllOccurrences(sequenceOrNull, - samplePeptideModification.getSequence()); - for (Occurrence occurrence : occurances) - { - samples.add(createProteinRelatedSample(samplePeptideModification, sample, - abundanceOrNull, position + occurrence.getStartIndex(), materialTypeCache, cache, session)); - } - } else - { - samples.add(createProteinRelatedSample(samplePeptideModification, sample, - abundanceOrNull, position, materialTypeCache, cache, session)); - } - } - return samples; - } - - private ProteinRelatedSample createProteinRelatedSample( - SamplePeptideModification samplePeptideModification, SamplePE sample, - Double abundanceOrNull, int position, - Map<MaterialTypePE, MaterialType> materialTypeCache, Map<PropertyTypePE, PropertyType> cache - , Session session) - { - ProteinRelatedSample s = createFrom(sample, materialTypeCache, cache, session); - s.setAbundance(abundanceOrNull); - int index = samplePeptideModification.getPosition() - 1; - String sequence = samplePeptideModification.getSequence(); - if (index >= 0 && index < sequence.length()) - { - s.setModifiedAminoAcid(sequence.charAt(index)); - } - s.setModificationFraction(samplePeptideModification.getFraction()); - s.setModificationMass(samplePeptideModification.getMass()); - s.setModificationPosition((long) position); - return s; - } - - private ProteinRelatedSample createFrom(SamplePE sample, Map<MaterialTypePE, MaterialType> materialTypeCache, - Map<PropertyTypePE, PropertyType> cache, Session session) - { - ProteinRelatedSample s = new ProteinRelatedSample(); - s.setCode(sample.getCode()); - s.setEntityType(SampleTypeTranslator.translate(sample.getSampleType(), materialTypeCache, cache)); - s.setId(sample.getId()); - s.setIdentifier(sample.getIdentifier()); - s.setPermId(sample.getPermId()); - s.setProperties(EntityPropertyTranslator.translate(sample.getProperties(), materialTypeCache, cache, - managedPropertyEvaluatorFactory, - new SamplePropertyAccessValidator(session, daoFactory))); - return s; - } - - private <T extends AbstractSample> Map<String, List<T>> createSampleMap(DataSet<T> items) - { - Map<String, List<T>> map = new LinkedHashMap<String, List<T>>(); - try - { - for (T item : items) - { - String samplePermID = item.getSamplePermID(); - List<T> list = map.get(samplePermID); - if (list == null) - { - list = new ArrayList<T>(); - map.put(samplePermID, list); - } - list.add(item); - } - } finally - { - items.close(); - } - return map; - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/ProteinSequenceTable.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/ProteinSequenceTable.java deleted file mode 100644 index 46492166070..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/ProteinSequenceTable.java +++ /dev/null @@ -1,111 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.server.business; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import net.lemnik.eodsql.DataSet; - -import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDAOFactory; -import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; -import ch.systemsx.cisd.openbis.generic.shared.dto.Session; -import ch.systemsx.cisd.openbis.plugin.proteomics.server.dataaccess.IPhosphoNetXDAOFactory; -import ch.systemsx.cisd.openbis.plugin.proteomics.server.dataaccess.IProteinQueryDAO; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.ProteinSequence; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.dto.Sequence; - -/** - * @author Franz-Josef Elmer - */ -class ProteinSequenceTable extends AbstractBusinessObject implements IProteinSequenceTable -{ - private List<ProteinSequence> proteinSequences; - - private Map<Long, String> databaseIDToShortNameMap; - - ProteinSequenceTable(IDAOFactory daoFactory, IPhosphoNetXDAOFactory specificDAOFactory, - Session session) - { - super(daoFactory, specificDAOFactory, session); - } - - @Override - public List<ProteinSequence> getSequences() - { - if (proteinSequences == null) - { - throw new IllegalStateException("Sequences not loaded."); - } - return proteinSequences; - } - - @Override - public String getShortName(long databaseID) - { - if (databaseIDToShortNameMap == null) - { - throw new IllegalStateException("Sequences not loaded."); - } - String shortName = databaseIDToShortNameMap.get(databaseID); - if (shortName == null) - { - throw new IllegalArgumentException("No sequence found for databaseID " + databaseID); - } - return shortName; - } - - @Override - public void loadByReference(TechId experimentID, TechId proteinReferenceID) - { - IProteinQueryDAO proteinQueryDAO = getSpecificDAOFactory().getProteinQueryDAO(experimentID); - DataSet<Sequence> sequences = - proteinQueryDAO.listProteinSequencesByProteinReference(proteinReferenceID.getId()); - proteinSequences = new ArrayList<ProteinSequence>(sequences.size()); - databaseIDToShortNameMap = new HashMap<Long, String>(); - int number = 0; - for (Sequence sequence : sequences) - { - ProteinSequence proteinSequence = new ProteinSequence(); - proteinSequence.setId(new TechId(sequence.getId())); - String shortName = createShortName(number++); - proteinSequence.setShortName(shortName); - proteinSequence.setSequence(sequence.getSequence()); - long databaseID = sequence.getDatabaseID(); - proteinSequence.setDatabaseID(new TechId(databaseID)); - proteinSequence.setDatabaseNameAndVersion(sequence.getDatabaseNameAndVersion()); - proteinSequences.add(proteinSequence); - databaseIDToShortNameMap.put(databaseID, shortName); - } - sequences.close(); - } - - private String createShortName(int number) - { - StringBuilder builder = new StringBuilder(); - int n = number; - while (n > 0 || builder.length() == 0) - { - builder.insert(0, "ABCEDEFGHIJKLMNOPQRSTUVWXYZ".charAt(n % 26)); - n /= 26; - } - return builder.toString(); - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/ProteinSummaryTable.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/ProteinSummaryTable.java deleted file mode 100644 index 44e994ffdb0..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/ProteinSummaryTable.java +++ /dev/null @@ -1,150 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.server.business; - -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -import net.lemnik.eodsql.DataSet; - -import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDAOFactory; -import ch.systemsx.cisd.openbis.generic.server.dataaccess.IExperimentDAO; -import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; -import ch.systemsx.cisd.openbis.generic.shared.dto.Session; -import ch.systemsx.cisd.openbis.plugin.proteomics.server.dataaccess.IPhosphoNetXDAOFactory; -import ch.systemsx.cisd.openbis.plugin.proteomics.server.dataaccess.IProteinQueryDAO; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.ProteinSummary; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.dto.ProteinReferenceWithProbabilityAndPeptide; - -/** - * @author Franz-Josef Elmer - */ -class ProteinSummaryTable extends AbstractBusinessObject implements IProteinSummaryTable -{ - static final double[] FDR_LEVELS = new double[] - { 0, 0.01, 0.025, 0.05, 0.1 }; - - private static final class Counter - { - - private final double fdrLevel; - - private final Set<Long> proteins; - - private final Set<Long> decoyProteins; - - private final Set<String> peptides; - - private final Set<String> decoyPeptides; - - Counter(double fdrLevel) - { - this.fdrLevel = fdrLevel; - proteins = new HashSet<Long>(); - decoyProteins = new HashSet<Long>(); - peptides = new HashSet<String>(); - decoyPeptides = new HashSet<String>(); - } - - public ProteinSummary getProteinSummary() - { - ProteinSummary proteinSummary = new ProteinSummary(); - proteinSummary.setFDR(fdrLevel); - proteinSummary.setProteinCount(proteins.size()); - proteinSummary.setPeptideCount(peptides.size()); - proteinSummary.setDecoyProteinCount(decoyProteins.size()); - proteinSummary.setDecoyPeptideCount(decoyPeptides.size()); - return proteinSummary; - } - - public void handle(double fdr, ProteinReferenceWithProbabilityAndPeptide protein) - { - if (Double.isNaN(fdr) || fdr <= fdrLevel) - { - String accessionNumber = protein.getAccessionNumber(); - if (accessionNumber.startsWith(AccessionNumberBuilder.DECOY_PREFIX)) - { - decoyProteins.add(protein.getId()); - decoyPeptides.add(protein.getPeptideSequence()); - } else - { - proteins.add(protein.getId()); - peptides.add(protein.getPeptideSequence()); - } - } - } - } - - private List<ProteinSummary> summaries; - - ProteinSummaryTable(IDAOFactory daoFactory, IPhosphoNetXDAOFactory specificDAOFactory, - Session session) - { - super(daoFactory, specificDAOFactory, session); - } - - @Override - public List<ProteinSummary> getProteinSummaries() - { - return summaries; - } - - @Override - public void load(TechId experimentID) - { - IExperimentDAO experimentDAO = getDaoFactory().getExperimentDAO(); - String permID = experimentDAO.getByTechId(experimentID).getPermId(); - IProteinQueryDAO dao = getSpecificDAOFactory().getProteinQueryDAO(experimentID); - ErrorModel errorModel = new ErrorModel(dao); - DataSet<ProteinReferenceWithProbabilityAndPeptide> resultSet = - dao.listProteinsWithProbabilityAndPeptidesByExperiment(permID); - List<Counter> counters = new ArrayList<Counter>(FDR_LEVELS.length); - for (double fdrLevel : FDR_LEVELS) - { - counters.add(new Counter(fdrLevel)); - } - try - { - for (ProteinReferenceWithProbabilityAndPeptide protein : resultSet) - { - long dataSetID = protein.getDataSetID(); - double probability = protein.getProbability(); - double fdr = errorModel.calculateFalsDiscoveryRate(dataSetID, probability); - for (Counter counter : counters) - { - counter.handle(fdr, protein); - } - } - summaries = getSummaries(counters); - } finally - { - resultSet.close(); - } - } - - private List<ProteinSummary> getSummaries(List<Counter> counters) - { - List<ProteinSummary> list = new ArrayList<ProteinSummary>(counters.size()); - for (Counter counter : counters) - { - list.add(counter.getProteinSummary()); - } - return list; - } -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/SampleIDProvider.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/SampleIDProvider.java deleted file mode 100644 index 663533f5b4f..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/SampleIDProvider.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.server.business; - -import java.util.LinkedHashMap; -import java.util.Map; - -import ch.systemsx.cisd.common.exceptions.UserFailureException; -import ch.systemsx.cisd.openbis.generic.server.dataaccess.ISampleDAO; -import ch.systemsx.cisd.openbis.generic.shared.dto.SamplePE; -import ch.systemsx.cisd.openbis.generic.shared.util.HibernateUtils; - -/** - * Implementation based on {@link ISampleDAO}. - * - * @author Franz-Josef Elmer - */ -public class SampleIDProvider implements ISampleIDProvider -{ - private final ISampleDAO sampleDAO; - - private final Map<String, SamplePE> samples = new LinkedHashMap<String, SamplePE>(); - - public SampleIDProvider(ISampleDAO sampleDAO) - { - this.sampleDAO = sampleDAO; - } - - @Override - public long getSampleIDOrParentSampleID(String samplePermID) - { - return HibernateUtils.getId(getSampleOrParentSample(samplePermID)); - } - - @Override - public SamplePE getSampleOrParentSample(String samplePermID) - { - SamplePE sample = samples.get(samplePermID); - if (sample == null) - { - sample = sampleDAO.tryToFindByPermID(samplePermID); - if (sample == null) - { - throw new UserFailureException("No sample found for permID " + samplePermID); - } - SamplePE parentSample = sample.getGeneratedFrom(); - if (parentSample != null) - { - sample = parentSample; - } - samples.put(samplePermID, sample); - } - return sample; - } -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/SampleLoader.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/SampleLoader.java deleted file mode 100644 index cf40e60ebff..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/SampleLoader.java +++ /dev/null @@ -1,131 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.server.business; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -import ch.systemsx.cisd.common.collection.IValidator; -import ch.systemsx.cisd.openbis.generic.server.business.bo.ICommonBusinessObjectFactory; -import ch.systemsx.cisd.openbis.generic.server.business.bo.samplelister.ISampleLister; -import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDAOFactory; -import ch.systemsx.cisd.openbis.generic.shared.basic.BasicConstant; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ListOrSearchSampleCriteria; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample; -import ch.systemsx.cisd.openbis.generic.shared.dto.SpacePE; -import ch.systemsx.cisd.openbis.generic.shared.dto.SampleRelationshipSkeleton; -import ch.systemsx.cisd.openbis.generic.shared.dto.SampleSkeleton; -import ch.systemsx.cisd.openbis.generic.shared.dto.SampleTypePE; -import ch.systemsx.cisd.openbis.generic.shared.dto.Session; - -/** - * @author Franz-Josef Elmer - */ -public class SampleLoader implements ISampleLoader -{ - private final Session session; - - private final IDAOFactory daoFactory; - - private final ICommonBusinessObjectFactory businessObjectFactory; - - public SampleLoader(Session session, IDAOFactory daoFactory, - ICommonBusinessObjectFactory businessObjectFactory) - { - this.session = session; - this.daoFactory = daoFactory; - this.businessObjectFactory = businessObjectFactory; - - } - - @Override - public List<Sample> listSamplesWithParentsByTypeAndSpace(String sampleTypeCode, String spaceCode) - { - ISampleLister sampleLister = businessObjectFactory.createSampleLister(session); - Set<Long> filteredSampleIDs = getSampleIDs(sampleLister, sampleTypeCode, spaceCode); - ListOrSearchSampleCriteria criteria = new ListOrSearchSampleCriteria(filteredSampleIDs); - criteria.setEnrichDependentSamplesWithProperties(true); - List<Sample> samples = sampleLister.list(criteria); - ArrayList<Sample> samplesWithParent = new ArrayList<Sample>(); - for (Sample sample : samples) - { - if (sample.getParents().size() == 1) - { - samplesWithParent.add(sample); - } - } - return samplesWithParent; - } - - private Set<Long> getSampleIDs(ISampleLister sampleLister, String sampleTypeCode, - String spaceCode) - { - SampleTypePE sampleTypePE = - daoFactory.getSampleTypeDAO().tryFindSampleTypeByCode(sampleTypeCode); - if (sampleTypePE == null) - { - return Collections.emptySet(); - } - final Long sampleTypeID = sampleTypePE.getId(); - SpacePE space = - daoFactory.getSpaceDAO().tryFindSpaceByCode(spaceCode); - if (space == null) - { - return Collections.emptySet(); - } - final Long spaceID = space.getId(); - List<SampleSkeleton> sampleSkeletons = - sampleLister.listSampleBy(new IValidator<SampleSkeleton>() - { - @Override - public boolean isValid(SampleSkeleton sampleSkeleton) - { - return spaceID.equals(sampleSkeleton.getSpaceID()) - && sampleTypeID.equals(sampleSkeleton.getTypeID()); - } - }); - final Set<Long> sampleIDs = new HashSet<Long>(); - for (SampleSkeleton sampleSkeleton : sampleSkeletons) - { - sampleIDs.add(sampleSkeleton.getId()); - } - final long relationshipTypeID = - sampleLister - .getRelationshipTypeID(BasicConstant.PARENT_CHILD_INTERNAL_RELATIONSHIP); - @SuppressWarnings("deprecation") - List<SampleRelationshipSkeleton> relationshipSkeletons = - sampleLister.listSampleRelationshipsBy(new IValidator<SampleRelationshipSkeleton>() - { - @Override - public boolean isValid(SampleRelationshipSkeleton skeleton) - { - return skeleton.getRelationshipTypeID() == relationshipTypeID - && sampleIDs.contains(skeleton.getChildSampleID()); - } - }); - Set<Long> filteredSampleIDs = new HashSet<Long>(); - for (SampleRelationshipSkeleton sampleRelationShipSkeleton : relationshipSkeletons) - { - filteredSampleIDs.add(sampleRelationShipSkeleton.getChildSampleID()); - } - return filteredSampleIDs; - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/SampleProvider.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/SampleProvider.java deleted file mode 100644 index da9493facb0..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/SampleProvider.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.server.business; - -import java.util.HashMap; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import ch.systemsx.cisd.common.exceptions.UserFailureException; -import ch.systemsx.cisd.openbis.generic.server.business.bo.samplelister.ISampleLister; -import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ListOrSearchSampleCriteria; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ListSampleCriteria; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample; -import ch.systemsx.cisd.openbis.generic.shared.dto.Session; - -/** - * @author Franz-Josef Elmer - */ -class SampleProvider implements ISampleProvider -{ - private final Session session; - - private final IBusinessObjectFactory boFactory; - - private Map<String, Sample> samplesByPermIDs; - - SampleProvider(Session session, IBusinessObjectFactory boFactory) - { - this.session = session; - this.boFactory = boFactory; - } - - @Override - public void loadByExperimentID(TechId experimentID) - { - samplesByPermIDs = new HashMap<String, Sample>(); - ListSampleCriteria criteria = ListSampleCriteria.createForExperiment(experimentID); - ISampleLister lister = boFactory.createSampleLister(session); - ListOrSearchSampleCriteria criteria2 = new ListOrSearchSampleCriteria(criteria); - criteria2.setEnrichDependentSamplesWithProperties(true); - gatherSamplesAndAncestorsRecursively(lister, criteria2); - } - - private void gatherSamplesAndAncestorsRecursively(ISampleLister lister, - ListOrSearchSampleCriteria criteria) - { - List<Sample> list = lister.list(criteria); - Set<Long> sampleIDs = new LinkedHashSet<Long>(); - for (Sample sample : list) - { - samplesByPermIDs.put(sample.getPermId(), sample); - sampleIDs.add(sample.getId()); - } - if (sampleIDs.isEmpty()) - { - return; - } - ListSampleCriteria criteria2 = - ListSampleCriteria.createForChildren(sampleIDs); - ListOrSearchSampleCriteria criteria3 = new ListOrSearchSampleCriteria(criteria2); - criteria3.setEnrichDependentSamplesWithProperties(true); - gatherSamplesAndAncestorsRecursively(lister, criteria3); - } - - @Override - public Sample getSample(String permID) - { - Sample sample = samplesByPermIDs.get(permID); - if (sample == null) - { - throw new UserFailureException( - "No sample with following perm ID registered in openBIS: " + permID); - } - return sample; - } -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/SampleTable.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/SampleTable.java deleted file mode 100644 index 7bab99e446a..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/SampleTable.java +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.server.business; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - -import net.lemnik.eodsql.DataSet; -import ch.systemsx.cisd.common.collection.IValidator; -import ch.systemsx.cisd.openbis.generic.server.authorization.validator.SamplePropertyAccessValidator; -import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDAOFactory; -import ch.systemsx.cisd.openbis.generic.server.dataaccess.ISampleDAO; -import ch.systemsx.cisd.openbis.generic.shared.basic.IIdentifierHolder; -import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.MaterialType; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PropertyType; -import ch.systemsx.cisd.openbis.generic.shared.dto.MaterialTypePE; -import ch.systemsx.cisd.openbis.generic.shared.dto.PropertyTypePE; -import ch.systemsx.cisd.openbis.generic.shared.dto.SamplePE; -import ch.systemsx.cisd.openbis.generic.shared.dto.Session; -import ch.systemsx.cisd.openbis.generic.shared.managed_property.IManagedPropertyEvaluatorFactory; -import ch.systemsx.cisd.openbis.generic.shared.translator.EntityPropertyTranslator; -import ch.systemsx.cisd.openbis.generic.shared.translator.SampleTypeTranslator; -import ch.systemsx.cisd.openbis.generic.shared.util.HibernateUtils; -import ch.systemsx.cisd.openbis.plugin.proteomics.server.dataaccess.IPhosphoNetXDAOFactory; -import ch.systemsx.cisd.openbis.plugin.proteomics.server.dataaccess.IProteinQueryDAO; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.SampleWithPropertiesAndAbundance; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.dto.SampleAbundance; - -/** - * @author Franz-Josef Elmer - */ -class SampleTable extends AbstractBusinessObject implements ISampleTable -{ - private List<SampleWithPropertiesAndAbundance> samples = - new ArrayList<SampleWithPropertiesAndAbundance>(); - - private SampleIDProvider sampleIDProvider; - - private IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory; - - SampleTable(IDAOFactory daoFactory, IPhosphoNetXDAOFactory specificDAOFactory, Session session, - IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory) - { - super(daoFactory, specificDAOFactory, session); - sampleIDProvider = new SampleIDProvider(daoFactory.getSampleDAO()); - this.managedPropertyEvaluatorFactory = managedPropertyEvaluatorFactory; - } - - @Override - public List<SampleWithPropertiesAndAbundance> getSamples() - { - return samples; - } - - @Override - public void loadSamplesWithAbundance(Session session, TechId experimentID, TechId proteinReferenceID) - { - samples = new ArrayList<SampleWithPropertiesAndAbundance>(); - IProteinQueryDAO proteinQueryDAO = getSpecificDAOFactory().getProteinQueryDAO(experimentID); - IDAOFactory daoFactory = getDaoFactory(); - String experimentPermID = - daoFactory.getExperimentDAO().getByTechId(experimentID).getPermId(); - DataSet<SampleAbundance> sampleAbundances = - proteinQueryDAO.listSampleAbundanceByProtein(experimentPermID, - proteinReferenceID.getId()); - try - { - ISampleDAO sampleDAO = daoFactory.getSampleDAO(); - for (SampleAbundance sampleAbundance : sampleAbundances) - { - SampleWithPropertiesAndAbundance sample = new SampleWithPropertiesAndAbundance(); - sample.setAbundance(sampleAbundance.getAbundance()); - String samplePermID = sampleAbundance.getSamplePermID(); - long sampleID = sampleIDProvider.getSampleIDOrParentSampleID(samplePermID); - SamplePE samplePE = sampleDAO.getByTechId(new TechId(sampleID)); - fillSampleData(sample, samplePE, managedPropertyEvaluatorFactory, - new SamplePropertyAccessValidator(session, daoFactory)); - samples.add(sample); - } - } finally - { - sampleAbundances.close(); - } - } - - private final static void fillSampleData(final SampleWithPropertiesAndAbundance result, - final SamplePE samplePE, - IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory, - IValidator<IIdentifierHolder> samplePropertyAccessValidator) - { - result.setId(HibernateUtils.getId(samplePE)); - result.setPermId(samplePE.getPermId()); - result.setCode(samplePE.getCode()); - result.setIdentifier(samplePE.getIdentifier()); - result.setSampleType(SampleTypeTranslator.translate(samplePE.getSampleType(), - new HashMap<MaterialTypePE, MaterialType>(), new HashMap<PropertyTypePE, PropertyType>())); - result.setProperties(EntityPropertyTranslator.translate(samplePE.getProperties(), - new HashMap<MaterialTypePE, MaterialType>(), new HashMap<PropertyTypePE, PropertyType>(), - managedPropertyEvaluatorFactory, samplePropertyAccessValidator)); - } -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/TreatmentFinder.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/TreatmentFinder.java deleted file mode 100644 index 2aa35c622e4..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/TreatmentFinder.java +++ /dev/null @@ -1,147 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.server.business; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; - -import org.apache.commons.lang3.StringUtils; - -import ch.systemsx.cisd.common.exceptions.UserFailureException; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataTypeCode; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Material; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PropertyType; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.VocabularyTerm; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.Treatment; - -/** - * Helper class which gathers properties in a sample and its ancestor samples defining sample treatments. Treatments of the same type will be - * overridden by descendants. - * - * @author Franz-Josef Elmer - */ -public class TreatmentFinder -{ - public static final String TREATMENT_TYPE_CODE = "TREATMENT_TYPE"; - - public static final String TREATMENT_VALUE_CODE = "TREATMENT_VALUE"; - - /** - * Returns all treatments found for specified sample and its ancestors. - */ - public List<Treatment> findTreatmentsOf(Sample sample) - { - Map<String, Treatment> treatments = new LinkedHashMap<String, Treatment>(); - findAndAddTreatments(treatments, sample); - List<Treatment> treatmentList = new ArrayList<Treatment>(treatments.values()); - Collections.sort(treatmentList); - return treatmentList; - } - - private void findAndAddTreatments(Map<String, Treatment> treatments, Sample sampleOrNull) - { - if (sampleOrNull == null) - { - return; - } - findAndAddTreatments(treatments, sampleOrNull.getGeneratedFrom()); - List<IEntityProperty> properties = sampleOrNull.getProperties(); - Map<String, Treatment> codeTreatmentMap = new HashMap<String, Treatment>(); - for (IEntityProperty property : properties) - { - PropertyType propertyType = property.getPropertyType(); - String code = propertyType.getCode(); - if (code.startsWith(TREATMENT_TYPE_CODE)) - { - String treatmentCode = code.substring(TREATMENT_TYPE_CODE.length()); - VocabularyTerm vocabularyTerm = property.getVocabularyTerm(); - if (vocabularyTerm == null) - { - throw new UserFailureException("Data type of property type '" + code - + "' must be a vocabulary."); - } - Treatment treatment = getOrCreateTreatment(codeTreatmentMap, treatmentCode); - treatment.setType(getLabelOrCode(vocabularyTerm)); - treatment.setTypeCode(vocabularyTerm.getCode()); - } else if (code.startsWith(TREATMENT_VALUE_CODE)) - { - String treatmentCode = code.substring(TREATMENT_VALUE_CODE.length()); - Treatment treatment = getOrCreateTreatment(codeTreatmentMap, treatmentCode); - DataTypeCode dataType = propertyType.getDataType().getCode(); - treatment.setValueType(dataType.toString()); - String value = getValue(property); - treatment.setValue(value); - } - } - Collection<Treatment> treatmentsToBeAdded = codeTreatmentMap.values(); - for (Treatment treatment : treatmentsToBeAdded) - { - Treatment superTreatment = treatments.get(treatment.getType()); - if (superTreatment == null) - { - treatments.put(treatment.getType(), treatment); - } else - { - superTreatment.setValue(treatment.getValue()); - } - } - } - - private String getValue(IEntityProperty property) - { - Material material = property.getMaterial(); - if (material != null) - { - return material.getCode(); - } - VocabularyTerm vocabularyTerm = property.getVocabularyTerm(); - return vocabularyTerm == null ? property.getValue() : getLabelOrCode(vocabularyTerm); - } - - private String getLabelOrCode(VocabularyTerm vocabularyTerm) - { - String label = vocabularyTerm.getLabel(); - if (StringUtils.isBlank(label)) - { - label = vocabularyTerm.getCode(); - } - return label; - } - - private Treatment getOrCreateTreatment(Map<String, Treatment> codeTreatmentMap, - String treatmentCode) - { - Treatment treatment = codeTreatmentMap.get(treatmentCode); - if (treatment == null) - { - treatment = new Treatment(); - treatment.setType(""); - treatment.setTypeCode(""); - treatment.setValue(""); - treatment.setValueType(DataTypeCode.VARCHAR.toString()); - codeTreatmentMap.put(treatmentCode, treatment); - } - return treatment; - } -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/dataaccess/IPhosphoNetXDAOFactory.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/dataaccess/IPhosphoNetXDAOFactory.java deleted file mode 100644 index 22cf326c808..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/dataaccess/IPhosphoNetXDAOFactory.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.server.dataaccess; - -import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; - -/** - * A factory for PhosphoNetX specific DAOs. - * - * @author Franz-Josef Elmer - */ -public interface IPhosphoNetXDAOFactory -{ - public IProteinQueryDAO getProteinQueryDAO(TechId experimentID); - - public IProteinQueryDAO getProteinQueryDAO(String experimentPermID); -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/dataaccess/IProteinQueryDAO.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/dataaccess/IProteinQueryDAO.java deleted file mode 100644 index 861f24b02ce..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/dataaccess/IProteinQueryDAO.java +++ /dev/null @@ -1,139 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.server.dataaccess; - -import it.unimi.dsi.fastutil.longs.LongSet; -import net.lemnik.eodsql.BaseQuery; -import net.lemnik.eodsql.DataSet; -import net.lemnik.eodsql.Select; - -import ch.systemsx.cisd.common.db.mapper.LongSetMapper; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.dto.IdentifiedProtein; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.dto.IndistinguishableProtein; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.dto.PeptideWithModification; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.dto.ProbabilityFDRMapping; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.dto.ProteinAbundance; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.dto.ProteinReference; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.dto.ProteinReferenceWithProbabilityAndPeptide; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.dto.ProteinReferenceWithProtein; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.dto.SampleAbundance; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.dto.SamplePeptideModification; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.dto.Sequence; - -/** - * @author Franz-Josef Elmer - */ -public interface IProteinQueryDAO extends BaseQuery -{ - @Select(sql = "select * from probability_fdr_mappings where dase_id = ?{1}", disconnected = true) - public DataSet<ProbabilityFDRMapping> getProbabilityFDRMapping(long dataSetID); - - @Select("select d.id as data_set_id, p.id as protein_id, probability, coverage, " - + "pr.id, accession_number, description from protein_references as pr " - + "left join sequences as s on s.prre_id = pr.id " - + "left join identified_proteins as ip on ip.sequ_id = s.id " - + "left join proteins as p on ip.prot_id = p.id " - + "left join data_sets as d on p.dase_id = d.id " - + "left join experiments as e on d.expe_id = e.id where e.perm_id = ?{1} and ip.is_primary = 't'") - public DataSet<ProteinReferenceWithProtein> listProteinReferencesByExperiment( - String experimentPermID); - - @Select(sql = "select p.id, a.value, s.perm_id " - + "from proteins as p join abundances as a on p.id = a.prot_id " - + "left join samples as s on a.samp_id = s.id " - + "where p.id = any (?{1})", parameterBindings = { LongSetMapper.class }) - public DataSet<ProteinAbundance> listProteinWithAbundanceByExperiment(LongSet proteinIDs); - - @Select(sql = "select p.dase_id as data_set_id, p.probability, s.prre_id as id, pr.accession_number, pe.sequence " - + "from identified_proteins as ip left join sequences as s on ip.sequ_id = s.id " - + "left join protein_references as pr on s.prre_id = pr.id " - + "left join proteins as p on ip.prot_id = p.id " - + "left join peptides as pe on pe.prot_id = p.id " - + "left join data_sets as d on p.dase_id = d.id " - + "left join experiments as e on d.expe_id = e.id " - + "where e.perm_id = ?{1} and ip.is_primary = 't'") - public DataSet<ProteinReferenceWithProbabilityAndPeptide> listProteinsWithProbabilityAndPeptidesByExperiment( - String experimentPermID); - - @Select("select distinct s.perm_id " - + "from abundances as a left join proteins as p on a.prot_id = p.id " - + " left join data_sets as d on p.dase_id = d.id " - + " left join experiments as e on d.expe_id = e.id " - + " left join samples as s on a.samp_id = s.id " - + "where e.perm_id = ?{1} order by s.perm_id") - public DataSet<String> listAbundanceRelatedSamplePermIDsByExperiment(String experimentPermID); - - @Select("select * from protein_references where id = ?{1}") - public ProteinReference tryToGetProteinReference(long proteinReferenceID); - - @Select("select s.id, db_id, amino_acid_sequence, name_and_version " - + "from sequences as s join databases as d on s.db_id = d.id " - + "where s.prre_id = ?{1} order by name_and_version") - public DataSet<Sequence> listProteinSequencesByProteinReference(long proteinReferenceID); - - @Select("select ds.id as data_set_id, ds.perm_id as data_set_perm_id, p.id as protein_id, " - + "probability, coverage, count(pe.id) as peptide_count, amino_acid_sequence, s.db_id, name_and_version " - + "from data_sets as ds join experiments as e on ds.expe_id = e.id " - + " join proteins as p on p.dase_id = ds.id " - + " join identified_proteins as ip on ip.prot_id = p.id " - + " join sequences as s on ip.sequ_id = s.id " - + " join databases as db on s.db_id = db.id " - + " left join peptides as pe on pe.prot_id = p.id " - + "where s.prre_id = ?{2} and e.perm_id = ?{1} and ip.is_primary = 't' " - + "group by data_set_id, data_set_perm_id, protein_id, probability, coverage, " - + " amino_acid_sequence, s.db_id, name_and_version order by data_set_perm_id") - public DataSet<IdentifiedProtein> listProteinsByProteinReferenceAndExperiment( - String experimentPermID, long proteinReferenceID); - - @Select("select pe.id, sequence, pos, mass " - + "from peptides as pe left join modified_peptides as mp on mp.pept_id = pe.id " - + " left join modifications as m on m.mope_id = mp.id " - + "where prot_id = ?{1} order by pe.id") - public DataSet<PeptideWithModification> listIdentifiedPeptidesByProtein(long proteinID); - - @Select("select accession_number, description, amino_acid_sequence, coverage " - + "from identified_proteins as ip join sequences as s on ip.sequ_id = s.id " - + " join protein_references as pr on s.prre_id = pr.id " - + "where ip.prot_id = ?{1} and ip.is_primary = 'f'") - public DataSet<IndistinguishableProtein> listIndistinguishableProteinsByProteinID(long proteinID); - - @Select("select distinct a.id, samples.perm_id, value " - + "from abundances as a left join proteins as p on a.prot_id = p.id " - + " left join data_sets as d on p.dase_id = d.id " - + " left join experiments as e on d.expe_id = e.id " - + " left join identified_proteins as ip on ip.prot_id = p.id " - + " left join sequences as s on ip.sequ_id = s.id " - + " left join samples on a.samp_id = samples.id " - + "where e.perm_id = ?{1} and s.prre_id = ?{2} and ip.is_primary = 't'") - public DataSet<SampleAbundance> listSampleAbundanceByProtein(String experimentPermID, - long proteinReferenceID); - - @Select("select distinct mf.id, samples.perm_id, fraction, pos, mass, sequence " - + "from modification_fractions as mf left join modifications as m on mf.modi_id = m.id " - + " left join modified_peptides as mp on m.mope_id = mp.id " - + " left join peptides as pe on mp.pept_id = pe.id " - + " left join proteins as p on pe.prot_id = p.id " - + " left join data_sets as d on p.dase_id = d.id " - + " left join experiments as e on d.expe_id = e.id " - + " left join identified_proteins as ip on ip.prot_id = p.id " - + " left join sequences as s on ip.sequ_id = s.id " - + " left join samples on mf.samp_id = samples.id " - + "where e.perm_id = ?{1} and s.prre_id = ?{2} and ip.is_primary = 't'") - public DataSet<SamplePeptideModification> listSamplePeptideModificatioByProtein( - String experimentPermID, long proteinReferenceID); - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/dataaccess/db/PhosphoNetXDAOFactory.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/dataaccess/db/PhosphoNetXDAOFactory.java deleted file mode 100644 index a9823517b4b..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/dataaccess/db/PhosphoNetXDAOFactory.java +++ /dev/null @@ -1,130 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.server.dataaccess.db; - -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import javax.sql.DataSource; - -import net.lemnik.eodsql.QueryTool; - -import org.apache.log4j.Logger; - -import ch.systemsx.cisd.common.exceptions.UserFailureException; -import ch.systemsx.cisd.common.logging.LogCategory; -import ch.systemsx.cisd.common.logging.LogFactory; -import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDAOFactory; -import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDataDAO; -import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDataSourceProvider; -import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; -import ch.systemsx.cisd.openbis.generic.shared.dto.DataPE; -import ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentPE; -import ch.systemsx.cisd.openbis.plugin.proteomics.server.dataaccess.IPhosphoNetXDAOFactory; -import ch.systemsx.cisd.openbis.plugin.proteomics.server.dataaccess.IProteinQueryDAO; - -/** - * @author Franz-Josef Elmer - */ -public class PhosphoNetXDAOFactory implements IPhosphoNetXDAOFactory -{ - private static final Logger operationLog = - LogFactory.getLogger(LogCategory.OPERATION, PhosphoNetXDAOFactory.class); - - private final Map<DataSource, IProteinQueryDAO> daos = new HashMap<DataSource, IProteinQueryDAO>(); - - private final IDAOFactory daoFactory; - - private final IDataSourceProvider dataSourceProvider; - - public PhosphoNetXDAOFactory(IDataSourceProvider dataSourceProvider, IDAOFactory daoFactory) - { - this.dataSourceProvider = dataSourceProvider; - this.daoFactory = daoFactory; - if (operationLog.isInfoEnabled()) - { - operationLog.info("DAO factory for proteomics created."); - } - } - - @Override - public IProteinQueryDAO getProteinQueryDAO(String experimentPermID) - { - ExperimentPE experiment = daoFactory.getExperimentDAO().tryGetByPermID(experimentPermID); - if (experiment == null) - { - throw new UserFailureException("No experiment with following perm ID found: " - + experimentPermID); - } - return getProteinQueryDAO(experiment); - } - - @Override - public IProteinQueryDAO getProteinQueryDAO(TechId experimentID) - { - ExperimentPE experiment = daoFactory.getExperimentDAO().tryGetByTechId(experimentID); - if (experiment == null) - { - throw new UserFailureException("No experiment with following technical ID found: " - + experimentID); - } - return getProteinQueryDAO(experiment); - } - - public IProteinQueryDAO getProteinQueryDAO(ExperimentPE experiment) - { - DataSource dataSource = getDataSource(experiment); - IProteinQueryDAO dao = daos.get(dataSource); - if (dao == null) - { - dao = QueryTool.getQuery(dataSource, IProteinQueryDAO.class); - daos.put(dataSource, dao); - } - return dao; - } - - private DataSource getDataSource(ExperimentPE experiment) - { - IDataDAO dataDAO = daoFactory.getDataDAO(); - - List<DataPE> dataSets = dataDAO.listDataSets(experiment); - Set<String> dataStores = new HashSet<String>(); - for (DataPE data : dataSets) - { - dataStores.add(data.getDataStore().getCode()); - } - if (dataStores.isEmpty()) - { - throw new UserFailureException("Experiment with " + experiment.getIdentifier() - + " has no data sets."); - } - if (dataStores.size() > 1) - { - throw new UserFailureException("Experiment with " + experiment.getIdentifier() - + " has data sets from more than one store. The stores are the following: " - + dataStores); - } - DataSource dataSource = - dataSourceProvider.getDataSourceByDataStoreServerCode(dataStores.iterator() - .next(), "proteomics"); - return dataSource; - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/dataaccess/db/migration/MigrationStepFrom002To003.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/dataaccess/db/migration/MigrationStepFrom002To003.java deleted file mode 100644 index df1252a3761..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/dataaccess/db/migration/MigrationStepFrom002To003.java +++ /dev/null @@ -1,145 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.server.dataaccess.db.migration; - -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import javax.sql.DataSource; - -import org.apache.log4j.Logger; -import org.springframework.dao.DataAccessException; -import org.springframework.jdbc.core.JdbcOperations; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.jdbc.core.ResultSetExtractor; - -import ch.systemsx.cisd.common.logging.LogCategory; -import ch.systemsx.cisd.common.logging.LogFactory; -import ch.systemsx.cisd.dbmigration.java.MigrationStepAdapter; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.Occurrence; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.OccurrenceUtil; - -/** - * @author Franz-Josef Elmer - */ -public class MigrationStepFrom002To003 extends MigrationStepAdapter -{ - private static final long MB = 1024 * 1024; - - private static final Logger operationLog = - LogFactory.getLogger(LogCategory.OPERATION, MigrationStepFrom002To003.class); - - @Override - public void performPostMigration(JdbcTemplate simpleJdbcTemplate, DataSource dataSource) - throws DataAccessException - { - List<Object[]> coverageValues = calculateCoverageValues(simpleJdbcTemplate); - operationLog.info("update " + coverageValues.size() + " identified proteins"); - simpleJdbcTemplate.batchUpdate("update identified_proteins set coverage = ? where id = ?", - coverageValues); - } - - private List<Object[]> calculateCoverageValues(JdbcTemplate simpleJdbcTemplate) - { - logMemory(); - JdbcOperations jdbcOperations = simpleJdbcTemplate; - final Map<Long, List<String>> peptides = getPeptides(jdbcOperations); - logMemory(); - final List<Object[]> values = new ArrayList<Object[]>(); - jdbcOperations.query("select ip.id, ip.prot_id, s.amino_acid_sequence " - + "from identified_proteins as ip " - + "join sequences as s on ip.sequ_id = s.id where coverage is null", - new ResultSetExtractor() - { - @Override - public Object extractData(ResultSet rs) throws SQLException, - DataAccessException - { - while (rs.next()) - { - long id = rs.getLong(1); - long proteinID = rs.getLong(2); - String sequence = rs.getString(3); - List<String> peptideSequences = peptides.get(proteinID); - double coverage = calculateCoverage(sequence, peptideSequences); - values.add(new Object[] { coverage, id }); - } - return null; - } - }); - logMemory(); - return values; - } - - private Map<Long, List<String>> getPeptides(JdbcOperations jdbcOperations) - { - final Map<Long, List<String>> peptides = new HashMap<Long, List<String>>(); - jdbcOperations.query("select prot_id, sequence from peptides order by prot_id", - new ResultSetExtractor() - { - @Override - public Object extractData(ResultSet rs) throws SQLException, - DataAccessException - { - long currentProteinID = -1; - ArrayList<String> list = null; - while (rs.next()) - { - long proteinID = rs.getLong(1); - if (list == null || proteinID != currentProteinID) - { - if (list != null) - { - list.trimToSize(); - } - currentProteinID = proteinID; - list = new ArrayList<String>(); - peptides.put(proteinID, list); - } - list.add(rs.getString(2)); - } - return null; - } - }); - return peptides; - } - - private double calculateCoverage(String sequence, List<String> peptides) - { - Set<String> distinctPeptides = new HashSet<String>(peptides); - List<Occurrence> list = OccurrenceUtil.getCoverage(sequence, distinctPeptides); - int sumPeptides = 0; - for (Occurrence occurrence : list) - { - sumPeptides += occurrence.getWord().length(); - } - return sumPeptides / (double) sequence.length(); - } - - private void logMemory() - { - Runtime runtime = Runtime.getRuntime(); - long usedMemory = (runtime.totalMemory() - runtime.freeMemory()) / MB; - operationLog.info(usedMemory + " MB used, " + runtime.totalMemory() / MB + " MB total"); - } -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/CacheData.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/CacheData.java deleted file mode 100644 index ebaf25b670a..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/CacheData.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.shared; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Inherited; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * Annotation for methods to cache their return values. - * - * @author Franz-Josef Elmer - */ -@Retention(RetentionPolicy.RUNTIME) -@Target(ElementType.METHOD) -@Inherited -public @interface CacheData -{ - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/IPhosphoNetXServer.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/IPhosphoNetXServer.java deleted file mode 100644 index 10215981305..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/IPhosphoNetXServer.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.shared; - -import java.util.List; - -import org.springframework.transaction.annotation.Transactional; - -import ch.systemsx.cisd.common.exceptions.UserFailureException; -import ch.systemsx.cisd.openbis.generic.shared.IServer; -import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Vocabulary; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.AbundanceColumnDefinition; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.AggregateFunction; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.DataSetProtein; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.ProteinByExperiment; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.ProteinInfo; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.ProteinRelatedSample; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.ProteinSequence; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.ProteinSummary; - -/** - * @author Franz-Josef Elmer - */ -public interface IPhosphoNetXServer extends IServer -{ - @Transactional - public Vocabulary getTreatmentTypeVocabulary(String sessionToken) throws UserFailureException; - - @Transactional - @CacheData - public List<AbundanceColumnDefinition> getAbundanceColumnDefinitionsForProteinByExperiment( - String sessionToken, TechId experimentID, String treatmentTypeOrNull) - throws UserFailureException; - - @Transactional - @CacheData - public List<ProteinInfo> listProteinsByExperiment(String sessionToken, TechId experimentId, - double falseDiscoveryRate, AggregateFunction function, String treatmentTypeCode, - boolean aggregateOnOriginal) throws UserFailureException; - - @Transactional - @CacheData - public List<ProteinSummary> listProteinSummariesByExperiment(String sessionToken, - TechId experimentId) throws UserFailureException; - - @Transactional - public ProteinByExperiment getProteinByExperiment(String sessionToken, TechId experimentId, - TechId proteinReferenceID) throws UserFailureException; - - @Transactional - public List<ProteinSequence> listProteinSequencesByProteinReference(String sessionToken, - TechId experimentID, TechId proteinReferenceID) throws UserFailureException; - - @Transactional - public List<DataSetProtein> listProteinsByExperimentAndReference(String sessionToken, - TechId experimentId, TechId proteinReferenceID) throws UserFailureException; - - @Transactional - public List<ProteinRelatedSample> listProteinRelatedSamplesByProtein(String sessionToken, - TechId experimentID, TechId proteinReferenceID) throws UserFailureException; -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/IProteomicsDataServiceInternal.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/IProteomicsDataServiceInternal.java deleted file mode 100644 index 04e941dc98c..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/IProteomicsDataServiceInternal.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.shared; - -import java.util.List; - -import org.springframework.transaction.annotation.Transactional; - -import ch.systemsx.cisd.openbis.generic.shared.IServer; -import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.dto.MsInjectionSample; - -/** - * @author Franz-Josef Elmer - */ -public interface IProteomicsDataServiceInternal extends IServer -{ - /** - * Returns all samples of type MS_INJECTION in group MS_DATA which have a parent sample which the specified user is allow to read. - */ - @Transactional - public List<MsInjectionSample> listRawDataSamples(String sessionToken); - - /** - * Returns all samples of type MS_INJECTION in group MS_DATA which have a parent sample. - */ - @Transactional - public List<MsInjectionSample> listAllRawDataSamples(String sessionToken); - - @Deprecated - @Transactional - public void processRawData(String sessionToken, String dataSetProcessingKey, - long[] rawDataSampleIDs, String dataSetType); - - @Transactional - public void processDataSets(String sessionToken, String dataSetProcessingKey, - List<String> dataSetCodes); - - @Transactional - public List<Experiment> listExperiments(String sessionToken, String experimentTypeCode); - - @Transactional - public List<AbstractExternalData> listDataSetsByExperiment(String sessionToken, TechId experimentID); - - @Transactional - public void processProteinResultDataSets(String sessionToken, String dataSetProcessingKey, - String experimentTypeCode, long[] searchExperimentIDs); - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/ProbabilityToFDRCalculator.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/ProbabilityToFDRCalculator.java deleted file mode 100644 index ebb6dbd9dd2..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/ProbabilityToFDRCalculator.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.shared; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -public final class ProbabilityToFDRCalculator -{ - private static final class MappingEntry implements Comparable<ProbabilityToFDRCalculator.MappingEntry> - { - private final double probability; - - private final double fdr; - - MappingEntry(double probability, double fdr) - { - this.probability = probability; - this.fdr = fdr; - } - - @Override - public int compareTo(ProbabilityToFDRCalculator.MappingEntry that) - { - return probability < that.probability ? -1 : (probability > that.probability ? 1 - : 0); - } - - @Override - public String toString() - { - return probability + " = " + fdr; - } - } - - private final List<ProbabilityToFDRCalculator.MappingEntry> mappingEntries = new ArrayList<ProbabilityToFDRCalculator.MappingEntry>(); - - public void add(double probability, double falseDiscoveryRate) - { - mappingEntries.add(new MappingEntry(probability, falseDiscoveryRate)); - } - - public void init() - { - Collections.sort(mappingEntries); - } - - public double calculateFDR(double probability) - { - if (mappingEntries.isEmpty()) - { - return Double.NaN; - } - int index = Collections.binarySearch(mappingEntries, new MappingEntry(probability, 0)); - if (index >= 0) - { - return mappingEntries.get(index).fdr; - } - // calculate by linear interpolation - int index1 = -index - 1; - int index0 = index1 - 1; - assert index0 >= 0; - ProbabilityToFDRCalculator.MappingEntry m0 = mappingEntries.get(index0); - ProbabilityToFDRCalculator.MappingEntry m1 = mappingEntries.get(index1); - double scale = (m1.fdr - m0.fdr) / (m1.probability - m0.probability); - return m0.fdr + scale * (probability - m0.probability); - } -} \ No newline at end of file diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/ResourceNames.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/ResourceNames.java deleted file mode 100644 index e1d3f6edb57..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/ResourceNames.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.shared; - -/** - * @author Franz-Josef Elmer - */ -public class ResourceNames -{ - private ResourceNames() - { - } - - public final static String PROTEOMICS_PLUGIN_SERVICE = "proteomics-plugin-service"; - - public final static String PROTEOMICS_PLUGIN_SERVER = "proteomics-plugin-server"; - - public final static String PROTEOMICS_RAW_DATA_SERVICE_WEB = "proteomics-data-service-web"; - - public final static String PROTEOMICS_DAO_FACTORY = "proteomics-dao-factory"; - - public final static String PROTEOMICS_BO_FACTORY = "proteomics-bo-factory"; - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/api/v1/IProteomicsDataService.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/api/v1/IProteomicsDataService.java deleted file mode 100644 index ec18a32bb19..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/api/v1/IProteomicsDataService.java +++ /dev/null @@ -1,133 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.shared.api.v1; - -import java.util.List; - -import org.springframework.transaction.annotation.Transactional; - -import ch.systemsx.cisd.common.api.IRpcService; -import ch.systemsx.cisd.openbis.plugin.proteomics.client.api.v1.IProteomicsDataApiFacade; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.api.v1.dto.DataSet; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.api.v1.dto.DataStoreServerProcessingPluginInfo; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.api.v1.dto.Experiment; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.api.v1.dto.MsInjectionDataInfo; - -/** - * Interface used by {@link IProteomicsDataApiFacade}. - * - * @author Franz-Josef Elmer - */ -public interface IProteomicsDataService extends IRpcService -{ - /** - * Name of this service for which it is registered at the RPC name server. - */ - public static final String SERVICE_NAME = "proteomics-data"; - - /** - * Service part of the URL to access this service remotely. - */ - public static final String SERVER_URL = "/rmi-" + SERVICE_NAME + "-v1"; - - /** - * Tries to authenticate specified user with specified password. Returns session token if succeeded otherwise <code>null</code> is returned. - */ - @Transactional - public String tryToAuthenticateAtRawDataServer(String userID, String userPassword); - - /** - * Logout the session with the specified session token. - */ - @Transactional - public void logout(String sessionToken); - - /** - * Returns all samples of type MS_INJECTION in space MS_DATA which have a parent sample which the specified user is allowed to read. - */ - @Transactional - public List<MsInjectionDataInfo> listRawDataSamples(String sessionToken, String userID); - - /** - * Returns all samples of type MS_INJECTION in space MS_DATA which have a parent sample. - */ - @Transactional - public List<MsInjectionDataInfo> listAllRawDataSamples(String sessionToken, String userID); - - /** - * Lists all processing plugins on DSS. - */ - @Transactional - public List<DataStoreServerProcessingPluginInfo> listDataStoreServerProcessingPluginInfos( - String sessionToken); - - /** - * Processes the data sets of specified samples by the DSS processing plug-in of specified key for the specified user. Implementations should - * check that the specified user is allowed to read specified samples. - */ - @Deprecated - @Transactional - public void processingRawData(String sessionToken, String userID, String dataSetProcessingKey, - long[] rawDataSampleIDs, String dataSetType); - - /** - * Processes the specified data sets by the DSS processing plug-in of specified key for the specified user. Implementations should check that the - * specified user is allowed to read specified data sets. - */ - @Transactional - public void processDataSets(String sessionToken, String userID, String dataSetProcessingKey, - List<String> dataSetCodes); - - /** - * Returns all experiments of type <tt>MS_SEARCH</tt> which the specified user is allowed to read. - */ - @Deprecated - @Transactional - public List<Experiment> listSearchExperiments(String sessionToken, String userID); - - /** - * Returns all experiments of specified type which the specified user is allowed to read. - */ - @Transactional - public List<Experiment> listExperiments(String sessionToken, String userID, - String experimentTypeCode); - - /** - * Returns all data sets of specified experiment which the specified user is allowed to read. - */ - @Transactional - public List<DataSet> listDataSetsByExperiment(String sessionToken, String userID, - long experimentID); - - /** - * Processes the data sets of specified experiments of type <tt>MS_SEARCH</tt> by the DSS processing plug-in of specified key for the specified - * user. It will be checked if the experiments are of search experiments and if the user is allowed to read them. - */ - @Deprecated - @Transactional - public void processSearchData(String sessionToken, String userID, String dataSetProcessingKey, - long[] searchExperimentIDs); - - /** - * Processes the data sets of specified experiments by the DSS processing plug-in of specified key for the specified user. It will be checked if - * the experiments are of specified type and if the user is allowed to read them. - */ - @Transactional - public void processProteinResultDataSets(String sessionToken, String userID, - String dataSetProcessingKey, String experimentTypeCode, long[] experimentIDs); - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/api/v1/dto/DataSet.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/api/v1/dto/DataSet.java deleted file mode 100644 index c26386280c0..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/api/v1/dto/DataSet.java +++ /dev/null @@ -1,114 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.shared.api.v1.dto; - -import java.io.Serializable; -import java.util.Date; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; - -/** - * Date Set bean with properties, children and parents. - * - * @author Franz-Josef Elmer - */ -public class DataSet implements Serializable -{ - private static final long serialVersionUID = 1L; - - private long id; - - private String code; - - private String type; - - private Date registrationDate; - - private Map<PropertyKey, Serializable> properties; - - private Set<DataSet> parents = new HashSet<DataSet>(); - - private Set<DataSet> children = new HashSet<DataSet>(); - - public final long getId() - { - return id; - } - - public final void setId(long id) - { - this.id = id; - } - - public final String getCode() - { - return code; - } - - public final void setCode(String code) - { - this.code = code; - } - - public final String getType() - { - return type; - } - - public final void setType(String type) - { - this.type = type; - } - - public final Date getRegistrationDate() - { - return registrationDate; - } - - public final void setRegistrationDate(Date registrationDate) - { - this.registrationDate = registrationDate; - } - - public final Map<PropertyKey, Serializable> getProperties() - { - return properties; - } - - public final void setProperties(Map<PropertyKey, Serializable> properties) - { - this.properties = properties; - } - - public final Set<DataSet> getParents() - { - return parents; - } - - public final Set<DataSet> getChildren() - { - return children; - } - - public void addChild(DataSet child) - { - getChildren().add(child); - child.getParents().add(this); - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/api/v1/dto/DataStoreServerProcessingPluginInfo.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/api/v1/dto/DataStoreServerProcessingPluginInfo.java deleted file mode 100644 index 2f1ed5b2a11..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/api/v1/dto/DataStoreServerProcessingPluginInfo.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.shared.api.v1.dto; - -import java.io.Serializable; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -/** - * Information about a processing plugin on a Data Store Server (DSS). - * - * @author Franz-Josef Elmer - */ -public class DataStoreServerProcessingPluginInfo implements Serializable -{ - - private static final long serialVersionUID = 1L; - - private final String key; - - private final String label; - - private final List<String> datasetTypeCodes; - - /** - * Create a new instance for specified key, label and data set type codes. - */ - public DataStoreServerProcessingPluginInfo(String key, String label, List<String> datasetTypeCodes) - { - this.key = key; - this.label = label; - this.datasetTypeCodes = Collections.unmodifiableList(new ArrayList<String>(datasetTypeCodes)); - } - - /** - * Returns a unique key of the plugin. - */ - public String getKey() - { - return key; - } - - /** - * Returns a human readable name of the plugin. - */ - public String getLabel() - { - return label; - } - - /** - * Returns a list data set type codes for all data sets for which the plugin is available. - */ - public List<String> getDatasetTypeCodes() - { - return datasetTypeCodes; - } -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/api/v1/dto/Experiment.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/api/v1/dto/Experiment.java deleted file mode 100644 index 22280ab490f..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/api/v1/dto/Experiment.java +++ /dev/null @@ -1,104 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.shared.api.v1.dto; - -import java.io.Serializable; -import java.util.Date; -import java.util.Map; - -/** - * Experiment bean with properties. - * - * @author Franz-Josef Elmer - */ -public class Experiment implements Serializable -{ - private static final long serialVersionUID = 1L; - - private long id; - - private String spaceCode; - - private String projectCode; - - private String code; - - private Date registrationDate; - - private Map<PropertyKey, Serializable> properties; - - public final long getId() - { - return id; - } - - public final void setId(long id) - { - this.id = id; - } - - public final String getSpaceCode() - { - return spaceCode; - } - - public final void setSpaceCode(String spaceCode) - { - this.spaceCode = spaceCode; - } - - public final String getProjectCode() - { - return projectCode; - } - - public final void setProjectCode(String projectCode) - { - this.projectCode = projectCode; - } - - public final String getCode() - { - return code; - } - - public final void setCode(String code) - { - this.code = code; - } - - public final Date getRegistrationDate() - { - return registrationDate; - } - - public final void setRegistrationDate(Date registrationDate) - { - this.registrationDate = registrationDate; - } - - public final Map<PropertyKey, Serializable> getProperties() - { - return properties; - } - - public final void setProperties(Map<PropertyKey, Serializable> properties) - { - this.properties = properties; - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/api/v1/dto/MsInjectionDataInfo.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/api/v1/dto/MsInjectionDataInfo.java deleted file mode 100644 index 5ad6c9f5383..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/api/v1/dto/MsInjectionDataInfo.java +++ /dev/null @@ -1,172 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.shared.api.v1.dto; - -import java.io.Serializable; -import java.util.Date; -import java.util.Map; -import java.util.Set; - -/** - * Informations about an MS_INJECTION sample and its related biological sample. There are attributes for - * <ul> - * <li>MS_INJECTION sample: ID, properties, code and registration date - * <li>Biological sample: identifier and properties - * <li>Biological experiment (i.e. experiment of biological sample) if present: identifier and properties - * <li>Registration dates of the most recently registered data sets for each data set type - * <li>All data sets including the derived ones of the MS_INJECTION sample with their type, registration date, and properties. - * </ul> - * - * @author Franz-Josef Elmer - */ -public class MsInjectionDataInfo implements Serializable -{ - private static final long serialVersionUID = 1L; - - private long msInjectionSampleID; - - private String msInjectionSampleCode; - - private Date msInjectionSampleRegistrationDate; - - private Map<PropertyKey, Serializable> msInjectionSampleProperties; - - private long biologicalSampleID; - - private String biologicalSampleIdentifier; - - private String biologicalExperimentIdentifier; - - private Experiment biologicalExperiment; - - private Map<PropertyKey, Serializable> biologicalSampleProperties; - - private Set<DataSet> dataSets; - - private Map<String, Date> latestDataSetRegistrationDates; - - public long getMsInjectionSampleID() - { - return msInjectionSampleID; - } - - public void setMsInjectionSampleID(long msInjectionSampleID) - { - this.msInjectionSampleID = msInjectionSampleID; - } - - public String getMsInjectionSampleCode() - { - return msInjectionSampleCode; - } - - public void setMsInjectionSampleCode(String msInjectionSampleCode) - { - this.msInjectionSampleCode = msInjectionSampleCode; - } - - public Date getMsInjectionSampleRegistrationDate() - { - return msInjectionSampleRegistrationDate; - } - - public void setMsInjectionSampleRegistrationDate(Date msInjectionSampleRegistrationDate) - { - this.msInjectionSampleRegistrationDate = msInjectionSampleRegistrationDate; - } - - public Map<PropertyKey, Serializable> getMsInjectionSampleProperties() - { - return msInjectionSampleProperties; - } - - public void setMsInjectionSampleProperties( - Map<PropertyKey, Serializable> msInjectionSampleProperties) - { - this.msInjectionSampleProperties = msInjectionSampleProperties; - } - - public long getBiologicalSampleID() - { - return biologicalSampleID; - } - - public void setBiologicalSampleID(long biologicalSampleID) - { - this.biologicalSampleID = biologicalSampleID; - } - - public String getBiologicalSampleIdentifier() - { - return biologicalSampleIdentifier; - } - - public void setBiologicalSampleIdentifier(String biologicalSampleIdentifier) - { - this.biologicalSampleIdentifier = biologicalSampleIdentifier; - } - - public final String getBiologicalExperimentIdentifier() - { - return biologicalExperimentIdentifier; - } - - public final void setBiologicalExperimentIdentifier(String biologicalExperimentIdentifier) - { - this.biologicalExperimentIdentifier = biologicalExperimentIdentifier; - } - - public final Experiment getBiologicalExperiment() - { - return biologicalExperiment; - } - - public final void setBiologicalExperiment(Experiment biologicalExperiment) - { - this.biologicalExperiment = biologicalExperiment; - } - - public Map<PropertyKey, Serializable> getBiologicalSampleProperties() - { - return biologicalSampleProperties; - } - - public void setBiologicalSampleProperties(Map<PropertyKey, Serializable> biologicalSampleProperties) - { - this.biologicalSampleProperties = biologicalSampleProperties; - } - - public final Set<DataSet> getDataSets() - { - return dataSets; - } - - public final void setDataSets(Set<DataSet> dataSets) - { - this.dataSets = dataSets; - } - - public Map<String, Date> getLatestDataSetRegistrationDates() - { - return latestDataSetRegistrationDates; - } - - public void setLatestDataSetRegistrationDates(Map<String, Date> latestDataSetRegistrationDates) - { - this.latestDataSetRegistrationDates = latestDataSetRegistrationDates; - } -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/api/v1/dto/PropertyKey.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/api/v1/dto/PropertyKey.java deleted file mode 100644 index e38c444fc02..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/api/v1/dto/PropertyKey.java +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.shared.api.v1.dto; - -import java.io.Serializable; - -/** - * Immutable class of a property key. Two instances are equal if their IDs are equal. - * - * @author Franz-Josef Elmer - */ -public final class PropertyKey implements Serializable -{ - - private static final long serialVersionUID = 1L; - - private final String id; - - private final String label; - - /** - * Creates a new instance for specified ID and label. - */ - public PropertyKey(String id, String label) - { - this.id = id; - this.label = label; - } - - /** - * Returns the ID. - */ - public String getId() - { - return id; - } - - /** - * Returns the label. - */ - public String getLabel() - { - return label; - } - - @Override - public boolean equals(Object obj) - { - if (this == obj) - { - return true; - } - if (obj instanceof PropertyKey == false) - { - return false; - } - PropertyKey key = (PropertyKey) obj; - return key.id.equals(id); - } - - @Override - public int hashCode() - { - return id.hashCode(); - } - - /** - * Renders this key in the form <code><label>[<id>]</code>. - */ - @Override - public String toString() - { - return label + "[" + id + "]"; - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/api/v1/dto/package.html b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/api/v1/dto/package.html deleted file mode 100644 index 0bdd5dde03b..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/api/v1/dto/package.html +++ /dev/null @@ -1,5 +0,0 @@ -<html> -<body> -Data Transfer Objects -</body> -</html> \ No newline at end of file diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/basic/CommonConstants.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/basic/CommonConstants.java deleted file mode 100644 index bc01bc3b1d9..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/basic/CommonConstants.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright 2011 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic; - -/** - * Commons constants used in DSS and AS. - * - * @author Franz-Josef Elmer - */ -public class CommonConstants -{ - - public static final String MS_INJECTION_SAMPLE_TYPE_CODE = "MS_INJECTION"; - - public static final String BIOLOGICAL_SAMPLE_PREFIX = "BIO"; - - public static final String MS_DATA_SPACE = "MS_DATA"; - - public static final String PROT_RESULT_DATA_SET_TYPE = "PROT_RESULT"; - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/basic/dto/AbundanceColumnDefinition.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/basic/dto/AbundanceColumnDefinition.java deleted file mode 100644 index b5283af3139..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/basic/dto/AbundanceColumnDefinition.java +++ /dev/null @@ -1,111 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto; - -import java.io.Serializable; -import java.util.ArrayList; -import java.util.List; - -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ServiceVersionHolder; - -/** - * @author Franz-Josef Elmer - */ -public class AbundanceColumnDefinition implements Serializable, - Comparable<AbundanceColumnDefinition> -{ - private static final long serialVersionUID = ServiceVersionHolder.VERSION; - - private List<Long> sampleIDs = new ArrayList<Long>(1); - - private String sampleCode; - - private List<Treatment> treatments; - - public final long getID() - { - long id = 0; - for (Long sampleID : sampleIDs) - { - id = 37 * id + sampleID; - } - return id; - } - - public final List<Long> getSampleIDs() - { - return sampleIDs; - } - - public final void addSampleIDsOf(AbundanceColumnDefinition definition) - { - sampleIDs.addAll(definition.getSampleIDs()); - } - - public final void addSampleID(long sampleID) - { - sampleIDs.add(sampleID); - } - - public final String getSampleCode() - { - return sampleCode; - } - - public final void setSampleCode(String sampleCode) - { - this.sampleCode = sampleCode; - } - - public final List<Treatment> getTreatments() - { - return treatments; - } - - public final void setTreatments(List<Treatment> treatments) - { - this.treatments = treatments; - } - - @Override - public int compareTo(AbundanceColumnDefinition that) - { - if (this.treatments != null && that.treatments != null) - { - for (int i = 0, n = Math.min(this.treatments.size(), that.treatments.size()); i < n; i++) - { - Treatment thisTreatment = this.treatments.get(i); - Treatment thatTreatment = that.treatments.get(i); - int diff = thisTreatment.compareTo(thatTreatment); - if (diff != 0) - { - return diff; - } - } - int sizeDiff = this.treatments.size() - that.treatments.size(); - if (sizeDiff != 0) - { - return sizeDiff; - } - } - if (this.sampleCode != null && that.sampleCode != null) - { - return this.sampleCode.compareTo(that.sampleCode); - } - return 0; - } -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/basic/dto/AccessionNumberProvider.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/basic/dto/AccessionNumberProvider.java deleted file mode 100644 index 9b3c2dc7d97..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/basic/dto/AccessionNumberProvider.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto; - -import java.io.Serializable; - -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ServiceVersionHolder; - -/** - * @author Franz-Josef Elmer - */ -public class AccessionNumberProvider implements Serializable -{ - private static final long serialVersionUID = ServiceVersionHolder.VERSION; - - private String accessionNumberType; - - private String accessionNumber; - - public final String getAccessionNumberType() - { - return accessionNumberType; - } - - public final void setAccessionNumberType(String accessionNumberType) - { - this.accessionNumberType = accessionNumberType; - } - - public final String getAccessionNumber() - { - return accessionNumber; - } - - public final void setAccessionNumber(String accessionNumber) - { - this.accessionNumber = accessionNumber; - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/basic/dto/AggregateFunction.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/basic/dto/AggregateFunction.java deleted file mode 100644 index cf515ba4cbb..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/basic/dto/AggregateFunction.java +++ /dev/null @@ -1,114 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto; - -import java.io.Serializable; -import java.util.Arrays; - -/** - * Aggregate functions. - * - * @author Franz-Josef Elmer - */ -public enum AggregateFunction implements Serializable -{ - MEAN("mean") - { - @Override - public double aggregate(double[] values) - { - return SUM.aggregate(values) / values.length; - } - }, - MEDIAN("median") - { - @Override - public double aggregate(double[] values) - { - Arrays.sort(values); - int i = values.length / 2; - return values.length % 2 == 0 ? (values[i - 1] + values[i]) / 2 : values[i]; - } - }, - SUM("sum") - { - @Override - public double aggregate(double[] values) - { - double sum = 0; - for (double value : values) - { - sum += value; - } - return sum; - } - }, - MIN("minimum") - { - @Override - public double aggregate(double[] values) - { - double min = Double.MAX_VALUE; - for (double value : values) - { - min = Math.min(min, value); - } - return min; - } - }, - MAX("maximum") - { - @Override - public double aggregate(double[] values) - { - double max = -Double.MAX_VALUE; - for (double value : values) - { - max = Math.max(max, value); - } - return max; - } - }, - COUNT("count") - { - @Override - public double aggregate(double[] values) - { - return values.length; - } - }, - ; - - private final String label; - - private AggregateFunction(String label) - { - this.label = label; - } - - public final String getLabel() - { - return label; - } - - /** - * Aggregates the specified array of numbers to one number. - * - * @param values an array with at least one value. - */ - public abstract double aggregate(double[] values); -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/basic/dto/AminoAcid.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/basic/dto/AminoAcid.java deleted file mode 100644 index 65afabc07f7..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/basic/dto/AminoAcid.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright 2011 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto; - -/** - * Amino acid symbols and names. - * - * @author Franz-Josef Elmer - */ -public enum AminoAcid -{ - A("Alanine", "Ala"), - R("Arginine", "Arg"), - N("Asparagine", "Asn"), - D("Aspartic acid", "Asp"), - C("Cysteine", "Cys"), - E("Glutamic acid", "Glu"), - Q("Glutamine", "Gln"), - G("Glycine", "Gly"), - H("Histidine", "His"), - I("Isoleucine", "Ile"), - L("Leucine", "Leu"), - K("Lysine", "Lys"), - M("Methionine", "Met"), - F("Phenylalanine", "Phe"), - P("Proline", "Pro"), - S("Serine", "Ser"), - T("Threonine", "Thr"), - W("Tryptophan", "Trp"), - Y("Tyrosine", "Tyr"), - V("Valine", "Val"); - - private final String name; - - private final String longSymbol; - - private AminoAcid(String name, String longSymbol) - { - this.name = name; - this.longSymbol = longSymbol; - } - - public String getName() - { - return name; - } - - public String getLongSymbol() - { - return longSymbol; - } - -} \ No newline at end of file diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/basic/dto/DataSetProtein.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/basic/dto/DataSetProtein.java deleted file mode 100644 index 24bcfe9de56..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/basic/dto/DataSetProtein.java +++ /dev/null @@ -1,103 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto; - -import java.io.Serializable; - -import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ServiceVersionHolder; - -/** - * @author Franz-Josef Elmer - */ -public class DataSetProtein implements Serializable -{ - private static final long serialVersionUID = ServiceVersionHolder.VERSION; - - private String dataSetPermID; - - private TechId dataSetID; - - private TechId proteinID; - - private String sequenceName; - - private int peptideCount; - - private double falseDiscoveryRate; - - public final String getDataSetPermID() - { - return dataSetPermID; - } - - public final void setDataSetPermID(String dataSetPermID) - { - this.dataSetPermID = dataSetPermID; - } - - public final TechId getDataSetID() - { - return dataSetID; - } - - public final void setDataSetID(TechId dataSetID) - { - this.dataSetID = dataSetID; - } - - public final TechId getProteinID() - { - return proteinID; - } - - public final void setProteinID(TechId proteinID) - { - this.proteinID = proteinID; - } - - public final String getSequenceName() - { - return sequenceName; - } - - public final void setSequenceName(String sequenceName) - { - this.sequenceName = sequenceName; - } - - public final int getPeptideCount() - { - return peptideCount; - } - - public final void setPeptideCount(int peptideCount) - { - this.peptideCount = peptideCount; - } - - public final double getFalseDiscoveryRate() - { - return falseDiscoveryRate; - } - - public final void setFalseDiscoveryRate(double falseDiscoveryRate) - { - this.falseDiscoveryRate = falseDiscoveryRate; - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/basic/dto/IBasicProteinInfo.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/basic/dto/IBasicProteinInfo.java deleted file mode 100644 index 03174e43498..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/basic/dto/IBasicProteinInfo.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright 2011 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto; - -import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; - -/** - * Common interface of DTOs with protein informations. - * - * @author Franz-Josef Elmer - */ -public interface IBasicProteinInfo -{ - - public TechId getId(); - - public String getAccessionNumber(); - - public String getDescription(); - -} \ No newline at end of file diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/basic/dto/IndistinguishableProteinInfo.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/basic/dto/IndistinguishableProteinInfo.java deleted file mode 100644 index 2aa9840b46e..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/basic/dto/IndistinguishableProteinInfo.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto; - -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ServiceVersionHolder; - -/** - * @author Franz-Josef Elmer - */ -public class IndistinguishableProteinInfo extends AccessionNumberProvider -{ - private static final long serialVersionUID = ServiceVersionHolder.VERSION; - - private String sequence; - - private String description; - - private double coverage; - - public final String getSequence() - { - return sequence; - } - - public final void setSequence(String sequence) - { - this.sequence = sequence; - } - - public final String getDescription() - { - return description; - } - - public final void setDescription(String description) - { - this.description = description; - } - - public void setCoverage(double coverage) - { - this.coverage = coverage; - } - - public double getCoverage() - { - return coverage; - } -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/basic/dto/Occurrence.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/basic/dto/Occurrence.java deleted file mode 100644 index d6d48313e69..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/basic/dto/Occurrence.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto; - -/** - * The occurrence of a word in a text. Occurrences are comparable by their start indexes. - * - * @author Tomasz Pylak - */ -public class Occurrence implements Comparable<Occurrence> -{ - private final String word; - - private final int startIndex; - - /** - * Creates a new instance of the specified word which appears at the specified start index. - */ - public Occurrence(String word, int startIndex) - { - this.word = word; - this.startIndex = startIndex; - } - - public String getWord() - { - return word; - } - - public int getStartIndex() - { - return startIndex; - } - - public int getEndIndex() - { - return startIndex + word.length() - 1; - } - - @Override - public int compareTo(Occurrence o) - { - return getStartIndex() - o.getStartIndex(); - } - - @Override - public String toString() - { - return "[" + word + "@" + startIndex + "]"; - } -} \ No newline at end of file diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/basic/dto/OccurrenceUtil.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/basic/dto/OccurrenceUtil.java deleted file mode 100644 index 37ec915c463..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/basic/dto/OccurrenceUtil.java +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.List; - -/** - * Helper class for calculating peptide on protein coverage. - * - * @author Franz-Josef Elmer - */ -public class OccurrenceUtil -{ - /** - * Returns a list of non-overlapping sequences built by the specified peptides covering the specified protein. - */ - public static List<Occurrence> getCoverage(String protein, Collection<String> peptides) - { - ArrayList<Occurrence> list = new ArrayList<Occurrence>(); - List<Occurrence> sortedList = calcSortedOccurrences(protein, peptides); - if (sortedList.isEmpty() == false) - { - Occurrence current = sortedList.get(0); - for (int i = 1; i < sortedList.size(); i++) - { - String currentPeptide = current.getWord(); - Occurrence next = sortedList.get(i); - int diff = next.getStartIndex() - current.getStartIndex(); - if (current.getWord().length() < diff) - { - list.add(current); - current = next; - } else if (current.getEndIndex() < next.getEndIndex()) - { - String mergedPeptides = currentPeptide.substring(0, diff) + next.getWord(); - current = new Occurrence(mergedPeptides, current.getStartIndex()); - } - } - list.add(current); - } - return list; - } - - // calculates a list of all words occurences, sorts it be starting position - private static List<Occurrence> calcSortedOccurrences(String protein, Collection<String> peptides) - { - List<Occurrence> result = new ArrayList<Occurrence>(); - for (String word : peptides) - { - result.addAll(findAllOccurrences(protein, word)); - } - Collections.sort(result); - return result; - } - - public static List<Occurrence> findAllOccurrences(String protein, String peptide) - { - List<Occurrence> result = new ArrayList<Occurrence>(); - int startIndex = 0; - while (true) - { - int occurrenceIndex = protein.indexOf(peptide, startIndex); - if (occurrenceIndex == -1) - { - break; - } - result.add(new Occurrence(peptide, occurrenceIndex)); - startIndex = occurrenceIndex + 1; // maybe the word overlaps with itself? - } - Collections.sort(result); - return result; - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/basic/dto/Peptide.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/basic/dto/Peptide.java deleted file mode 100644 index d38fe54e9d7..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/basic/dto/Peptide.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto; - -import java.io.Serializable; -import java.util.ArrayList; -import java.util.List; - -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ServiceVersionHolder; - -/** - * Peptide sequence and optional modifications. - * - * @author Tomasz Pylak - */ -public class Peptide implements Serializable -{ - private static final long serialVersionUID = ServiceVersionHolder.VERSION; - - private String sequence; - - private List<PeptideModification> modifications = new ArrayList<PeptideModification>(); - - public String getSequence() - { - return sequence; - } - - public void setSequence(String sequence) - { - this.sequence = sequence; - } - - public List<PeptideModification> getModifications() - { - return modifications; - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/basic/dto/PeptideModification.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/basic/dto/PeptideModification.java deleted file mode 100644 index 4a16ac6928c..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/basic/dto/PeptideModification.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright 2011 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto; - -import java.io.Serializable; - -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ServiceVersionHolder; - -/** - * Position and mass of a modified amino acid in a peptide. - * - * @author Franz-Josef Elmer - */ -public class PeptideModification implements Serializable -{ - private static final long serialVersionUID = ServiceVersionHolder.VERSION; - - private int position; - - private double mass; - - public int getPosition() - { - return position; - } - - public void setPosition(int position) - { - this.position = position; - } - - public double getMass() - { - return mass; - } - - public void setMass(double mass) - { - this.mass = mass; - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/basic/dto/ProteinByExperiment.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/basic/dto/ProteinByExperiment.java deleted file mode 100644 index 842a9de87b6..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/basic/dto/ProteinByExperiment.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto; - -import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ServiceVersionHolder; - -/** - * @author Franz-Josef Elmer - */ -public class ProteinByExperiment extends AccessionNumberProvider implements IBasicProteinInfo -{ - private static final long serialVersionUID = ServiceVersionHolder.VERSION; - - private TechId id; - - private String description; - - private ProteinDetails details; - - @Override - public final String getDescription() - { - return description; - } - - public final void setDescription(String description) - { - this.description = description; - } - - public ProteinDetails getDetails() - { - return details; - } - - public void setDetails(ProteinDetails details) - { - this.details = details; - } - - @Override - public final TechId getId() - { - return id; - } - - public final void setId(TechId id) - { - this.id = id; - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/basic/dto/ProteinDetails.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/basic/dto/ProteinDetails.java deleted file mode 100644 index 2edd1672ba6..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/basic/dto/ProteinDetails.java +++ /dev/null @@ -1,164 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto; - -import java.io.Serializable; -import java.util.List; - -import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ServiceVersionHolder; - -/** - * @author Tomasz Pylak - */ -public class ProteinDetails implements Serializable -{ - private static final long serialVersionUID = ServiceVersionHolder.VERSION; - - private String sequence; - - private String databaseNameAndVersion; - - private double probability; - - private double coverage; - - private double falseDiscoveryRate; - - private String dataSetPermID; - - private Long dataSetTechID; - - private String dataSetTypeCode; - - private TechId proteinID; - - private List<Peptide> peptides; - - private List<IndistinguishableProteinInfo> indistinguishableProteinInfos; - - public String getSequence() - { - return sequence; - } - - public void setSequence(String sequence) - { - this.sequence = sequence; - } - - public String getDatabaseNameAndVersion() - { - return databaseNameAndVersion; - } - - public void setDatabaseNameAndVersion(String databaseNameAndVersion) - { - this.databaseNameAndVersion = databaseNameAndVersion; - } - - public double getFalseDiscoveryRate() - { - return falseDiscoveryRate; - } - - public double getProbability() - { - return probability; - } - - public void setProbability(double probability) - { - this.probability = probability; - } - - public void setCoverage(double coverage) - { - this.coverage = coverage; - } - - public double getCoverage() - { - return coverage; - } - - public void setFalseDiscoveryRate(double falseDiscoveryRate) - { - this.falseDiscoveryRate = falseDiscoveryRate; - } - - public String getDataSetPermID() - { - return dataSetPermID; - } - - public void setDataSetPermID(String dataSetPermID) - { - this.dataSetPermID = dataSetPermID; - } - - public final TechId getProteinID() - { - return proteinID; - } - - public final void setProteinID(TechId proteinID) - { - this.proteinID = proteinID; - } - - public List<Peptide> getPeptides() - { - return peptides; - } - - public void setPeptides(List<Peptide> peptides) - { - this.peptides = peptides; - } - - public Long getDataSetTechID() - { - return dataSetTechID; - } - - public void setDataSetTechID(Long dataSetTechID) - { - this.dataSetTechID = dataSetTechID; - } - - public String getDataSetTypeCode() - { - return dataSetTypeCode; - } - - public void setDataSetTypeCode(String dataSetTypeCode) - { - this.dataSetTypeCode = dataSetTypeCode; - } - - public void setIndistinguishableProteinInfos( - List<IndistinguishableProteinInfo> indistinguishableProteinInfos) - { - this.indistinguishableProteinInfos = indistinguishableProteinInfos; - } - - public List<IndistinguishableProteinInfo> getIndistinguishableProteinInfos() - { - return indistinguishableProteinInfos; - } -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/basic/dto/ProteinInfo.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/basic/dto/ProteinInfo.java deleted file mode 100644 index 10c4a395c4e..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/basic/dto/ProteinInfo.java +++ /dev/null @@ -1,119 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto; - -import java.io.Serializable; -import java.util.Map; - -import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ServiceVersionHolder; - -/** - * @author Franz-Josef Elmer - */ -public class ProteinInfo implements Serializable, IBasicProteinInfo -{ - private static final long serialVersionUID = ServiceVersionHolder.VERSION; - - private TechId id; - - private String accessionNumber; - - private TechId experimentID; - - private String dataSetPermID; - - private String description; - - private double coverage; - - private Map<Long, Double> abundances; - - @Override - public final TechId getId() - { - return id; - } - - public final void setId(TechId id) - { - this.id = id; - } - - public final TechId getExperimentID() - { - return experimentID; - } - - public final void setExperimentID(TechId experimentID) - { - this.experimentID = experimentID; - } - - public final String getDataSetPermID() - { - return dataSetPermID; - } - - public final void setDataSetPermID(String dataSetPermID) - { - this.dataSetPermID = dataSetPermID; - } - - @Override - public final String getAccessionNumber() - { - return accessionNumber; - } - - public final void setAccessionNumber(String accessionNumber) - { - this.accessionNumber = accessionNumber; - } - - @Override - public final String getDescription() - { - return description; - } - - public final void setDescription(String description) - { - this.description = description; - } - - public final Map<Long, Double> getAbundances() - { - return abundances; - } - - public final void setAbundances(Map<Long, Double> abundances) - { - this.abundances = abundances; - } - - public void setCoverage(double coverage) - { - this.coverage = coverage; - } - - public double getCoverage() - { - return coverage; - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/basic/dto/ProteinRelatedSample.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/basic/dto/ProteinRelatedSample.java deleted file mode 100644 index d1198c0e951..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/basic/dto/ProteinRelatedSample.java +++ /dev/null @@ -1,181 +0,0 @@ -/* - * Copyright 2011 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto; - -import java.io.Serializable; -import java.util.List; - -import ch.systemsx.cisd.openbis.generic.shared.basic.IEntityInformationHolderWithProperties; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.BasicEntityType; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ServiceVersionHolder; - -/** - * Sample related to a protein. Contains information about abundance and amino-acid modification. - * - * @author Franz-Josef Elmer - */ -public class ProteinRelatedSample implements Serializable, IEntityInformationHolderWithProperties -{ - private static final long serialVersionUID = ServiceVersionHolder.VERSION; - - private Long id; - - private String permId; - - private String code; - - private String identifier; - - private BasicEntityType entityType; - - private List<IEntityProperty> properties; - - private Double abundance; - - private char modifiedAminoAcid; - - private Long modificationPosition; - - private Double modificationMass; - - private Double modificationFraction; - - @Override - public Long getId() - { - return id; - } - - public void setId(Long id) - { - this.id = id; - } - - @Override - public String getPermId() - { - return permId; - } - - public void setPermId(String permId) - { - this.permId = permId; - } - - @Override - public String getCode() - { - return code; - } - - public void setCode(String code) - { - this.code = code; - } - - @Override - public BasicEntityType getEntityType() - { - return entityType; - } - - public void setEntityType(BasicEntityType entityType) - { - this.entityType = entityType; - } - - @Override - public String getIdentifier() - { - return identifier; - } - - public void setIdentifier(String identifier) - { - this.identifier = identifier; - } - - public Double getAbundance() - { - return abundance; - } - - public void setAbundance(Double abundance) - { - this.abundance = abundance; - } - - public char getModifiedAminoAcid() - { - return modifiedAminoAcid; - } - - public void setModifiedAminoAcid(char modifiedAminoAcid) - { - this.modifiedAminoAcid = modifiedAminoAcid; - } - - public Long getModificationPosition() - { - return modificationPosition; - } - - public void setModificationPosition(Long modificationPosition) - { - this.modificationPosition = modificationPosition; - } - - public Double getModificationMass() - { - return modificationMass; - } - - public void setModificationMass(Double modificationMass) - { - this.modificationMass = modificationMass; - } - - public Double getModificationFraction() - { - return modificationFraction; - } - - public void setModificationFraction(Double modificationFraction) - { - this.modificationFraction = modificationFraction; - } - - @Override - public EntityKind getEntityKind() - { - return EntityKind.SAMPLE; - } - - @Override - public List<IEntityProperty> getProperties() - { - return properties; - } - - public void setProperties(List<IEntityProperty> properties) - { - this.properties = properties; - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/basic/dto/ProteinSequence.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/basic/dto/ProteinSequence.java deleted file mode 100644 index 7f9a97bd494..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/basic/dto/ProteinSequence.java +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto; - -import java.io.Serializable; - -import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ServiceVersionHolder; - -/** - * @author Franz-Josef Elmer - */ -public class ProteinSequence implements Serializable -{ - private static final long serialVersionUID = ServiceVersionHolder.VERSION; - - private String shortName; - - private TechId id; - - private TechId databaseID; - - private String sequence; - - private String databaseNameAndVersion; - - public final String getShortName() - { - return shortName; - } - - public final void setShortName(String version) - { - this.shortName = version; - } - - public final TechId getId() - { - return id; - } - - public final void setId(TechId id) - { - this.id = id; - } - - public final TechId getDatabaseID() - { - return databaseID; - } - - public final void setDatabaseID(TechId databaseID) - { - this.databaseID = databaseID; - } - - public final String getSequence() - { - return sequence; - } - - public final void setSequence(String sequence) - { - this.sequence = sequence; - } - - public final String getDatabaseNameAndVersion() - { - return databaseNameAndVersion; - } - - public final void setDatabaseNameAndVersion(String databaseNameAndVersion) - { - this.databaseNameAndVersion = databaseNameAndVersion; - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/basic/dto/ProteinSummary.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/basic/dto/ProteinSummary.java deleted file mode 100644 index db708980a9f..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/basic/dto/ProteinSummary.java +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto; - -import java.io.Serializable; - -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ServiceVersionHolder; - -/** - * @author Franz-Josef Elmer - */ -public class ProteinSummary implements Serializable -{ - private static final long serialVersionUID = ServiceVersionHolder.VERSION; - - private double fdr; - - private int proteinCount; - - private int decoyProteinCount; - - private int peptideCount; - - private int decoyPeptideCount; - - public double getFDR() - { - return fdr; - } - - public void setFDR(double fdr) - { - this.fdr = fdr; - } - - public int getProteinCount() - { - return proteinCount; - } - - public void setProteinCount(int proteinCount) - { - this.proteinCount = proteinCount; - } - - public int getPeptideCount() - { - return peptideCount; - } - - public void setPeptideCount(int peptideCount) - { - this.peptideCount = peptideCount; - } - - public void setDecoyProteinCount(int decoyProteinCount) - { - this.decoyProteinCount = decoyProteinCount; - } - - public int getDecoyProteinCount() - { - return decoyProteinCount; - } - - public void setDecoyPeptideCount(int decoyPeptideCount) - { - this.decoyPeptideCount = decoyPeptideCount; - } - - public int getDecoyPeptideCount() - { - return decoyPeptideCount; - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/basic/dto/RawDataSampleGridIDs.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/basic/dto/RawDataSampleGridIDs.java deleted file mode 100644 index 35e9064d0fb..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/basic/dto/RawDataSampleGridIDs.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto; - -/** - * @author Franz-Josef Elmer - */ -public class RawDataSampleGridIDs -{ - public static final String EXPERIMENT = "EXPERIMENT"; - - public static final String PARENT = "PARENT"; - - public static final String REGISTRATION_DATE = "REGISTRATION_DATE"; - - public static final String CODE = "CODE"; - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/basic/dto/SampleWithPropertiesAndAbundance.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/basic/dto/SampleWithPropertiesAndAbundance.java deleted file mode 100644 index a91dfd0f786..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/basic/dto/SampleWithPropertiesAndAbundance.java +++ /dev/null @@ -1,138 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto; - -import java.io.Serializable; -import java.util.List; - -import ch.systemsx.cisd.openbis.generic.shared.basic.IEntityInformationHolderWithPermId; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityType; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityPropertiesHolder; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleType; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ServiceVersionHolder; - -/** - * @author Franz-Josef Elmer - */ -public class SampleWithPropertiesAndAbundance implements Serializable, - IEntityInformationHolderWithPermId, IEntityPropertiesHolder -{ - private static final long serialVersionUID = ServiceVersionHolder.VERSION; - - private Long id; - - private String permId; - - private String identifier; - - private String code; - - private SampleType sampleType; - - private List<IEntityProperty> properties; - - private double abundance; - - @Override - public final Long getId() - { - return id; - } - - public final void setId(Long id) - { - this.id = id; - } - - public final String getIdentifier() - { - return identifier; - } - - public final void setIdentifier(String identifier) - { - this.identifier = identifier; - } - - @Override - public final String getCode() - { - return code; - } - - public void setCode(final String code) - { - this.code = code; - } - - @Override - public EntityType getEntityType() - { - return getSampleType(); - } - - @Override - public EntityKind getEntityKind() - { - return EntityKind.SAMPLE; - } - - public SampleType getSampleType() - { - return sampleType; - } - - public void setSampleType(final SampleType sampleType) - { - this.sampleType = sampleType; - } - - @Override - public List<IEntityProperty> getProperties() - { - return properties; - } - - public final void setProperties(List<IEntityProperty> properties) - { - this.properties = properties; - } - - public final double getAbundance() - { - return abundance; - } - - public final void setAbundance(double abundance) - { - this.abundance = abundance; - } - - @Override - public String getPermId() - { - return permId; - } - - public void setPermId(String permId) - { - this.permId = permId; - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/basic/dto/Treatment.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/basic/dto/Treatment.java deleted file mode 100644 index 1b2e630e2b6..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/basic/dto/Treatment.java +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto; - -import java.io.Serializable; - -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ServiceVersionHolder; - -/** - * @author Franz-Josef Elmer - */ -public class Treatment implements Serializable, Comparable<Treatment> -{ - private static final long serialVersionUID = ServiceVersionHolder.VERSION; - - private String value; - - private String type; - - private String typeCode; - - private String valueType; - - public final String getValue() - { - return value; - } - - public final void setValue(String value) - { - this.value = value; - } - - public final String getValueType() - { - return valueType; - } - - public final void setValueType(String valueType) - { - this.valueType = valueType; - } - - public final String getType() - { - return type; - } - - public final void setType(String type) - { - this.type = type; - } - - public final String getTypeCode() - { - return typeCode; - } - - public final void setTypeCode(String typeCode) - { - this.typeCode = typeCode; - } - - public final String getLabel() - { - return value + " " + type; - } - - @Override - public int compareTo(Treatment that) - { - int typeComparisonResult = this.type.toLowerCase().compareTo(that.type.toLowerCase()); - if (typeComparisonResult != 0) - { - return typeComparisonResult; - } - double thisNumber = convert(this.value); - double thatNumber = convert(that.value); - if (Double.isNaN(thisNumber) || Double.isNaN(thatNumber)) - { - return this.value.compareTo(that.value); - } - return Double.compare(thisNumber, thatNumber); - } - - private double convert(String numberOrString) - { - try - { - return Double.parseDouble(numberOrString); - } catch (NumberFormatException e) - { - return Double.NaN; - } - } - - @Override - public String toString() - { - return getLabel(); - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/dto/AbstractDTOWithID.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/dto/AbstractDTOWithID.java deleted file mode 100644 index 1151a854d38..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/dto/AbstractDTOWithID.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.shared.dto; - -import java.io.Serializable; - -import net.lemnik.eodsql.ResultColumn; - -/** - * @author Franz-Josef Elmer - */ -abstract class AbstractDTOWithID implements Serializable -{ - private static final long serialVersionUID = 1L; - - @ResultColumn("id") - private long id; - - public final long getId() - { - return id; - } - - public final void setId(long id) - { - this.id = id; - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/dto/AbstractSample.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/dto/AbstractSample.java deleted file mode 100644 index e1759e519c6..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/dto/AbstractSample.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright 2011 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.shared.dto; - -import net.lemnik.eodsql.ResultColumn; - -/** - * Abstract super class of sample. - * - * @author Franz-Josef Elmer - */ -public abstract class AbstractSample extends AbstractDTOWithID -{ - private static final long serialVersionUID = 1L; - - @ResultColumn("perm_id") - private String samplePermID; - - public final String getSamplePermID() - { - return samplePermID; - } - - public final void setSamplePermID(String samplePermID) - { - this.samplePermID = samplePermID; - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/dto/IdentifiedProtein.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/dto/IdentifiedProtein.java deleted file mode 100644 index 8ad58fd5700..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/dto/IdentifiedProtein.java +++ /dev/null @@ -1,157 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.shared.dto; - -import net.lemnik.eodsql.ResultColumn; - -/** - * @author Franz-Josef Elmer - */ -public class IdentifiedProtein extends AbstractDTOWithID -{ - private static final long serialVersionUID = 1L; - - @ResultColumn("data_set_id") - private long dataSetID; - - @ResultColumn("data_set_perm_id") - private String dataSetPermID; - - @ResultColumn("protein_id") - private long proteinID; - - @ResultColumn("peptide_count") - private int peptideCount; - - @ResultColumn("amino_acid_sequence") - private String sequence; - - @ResultColumn("db_id") - private long databaseID; - - @ResultColumn("name_and_version") - private String databaseNameAndVersion; - - @ResultColumn("probability") - private double probability; - - @ResultColumn("coverage") - private double coverage; - - private double falseDiscoveryRate; - - public final String getDataSetPermID() - { - return dataSetPermID; - } - - public final void setDataSetPermID(String dataSetPermID) - { - this.dataSetPermID = dataSetPermID; - } - - public final int getPeptideCount() - { - return peptideCount; - } - - public final void setPeptideCount(int accessionNumber) - { - this.peptideCount = accessionNumber; - } - - public final String getSequence() - { - return sequence; - } - - public final void setSequence(String description) - { - this.sequence = description; - } - - public final long getDataSetID() - { - return dataSetID; - } - - public final void setDataSetID(long dataSetID) - { - this.dataSetID = dataSetID; - } - - public final long getProteinID() - { - return proteinID; - } - - public final void setProteinID(long proteinID) - { - this.proteinID = proteinID; - } - - public final double getProbability() - { - return probability; - } - - public final void setProbability(double probability) - { - this.probability = probability; - } - - public void setCoverage(double coverage) - { - this.coverage = coverage; - } - - public double getCoverage() - { - return coverage; - } - - public final double getFalseDiscoveryRate() - { - return falseDiscoveryRate; - } - - public final void setFalseDiscoveryRate(double falseDiscoveryRate) - { - this.falseDiscoveryRate = falseDiscoveryRate; - } - - public final long getDatabaseID() - { - return databaseID; - } - - public final void setDatabase(long databaseID) - { - this.databaseID = databaseID; - } - - public final String getDatabaseNameAndVersion() - { - return databaseNameAndVersion; - } - - public final void setDatabaseNameAndVersion(String databaseNameAndVersion) - { - this.databaseNameAndVersion = databaseNameAndVersion; - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/dto/IndistinguishableProtein.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/dto/IndistinguishableProtein.java deleted file mode 100644 index 874b525c03d..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/dto/IndistinguishableProtein.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.shared.dto; - -import net.lemnik.eodsql.ResultColumn; - -/** - * @author Franz-Josef Elmer - */ -public class IndistinguishableProtein extends ProteinReference -{ - private static final long serialVersionUID = 1L; - - @ResultColumn("amino_acid_sequence") - private String sequence; - - @ResultColumn("coverage") - private double coverage; - - public void setSequence(String sequence) - { - this.sequence = sequence; - } - - public String getSequence() - { - return sequence; - } - - public void setCoverage(double coverage) - { - this.coverage = coverage; - } - - public double getCoverage() - { - return coverage; - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/dto/MsInjectionSample.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/dto/MsInjectionSample.java deleted file mode 100644 index 5f3b22888cc..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/dto/MsInjectionSample.java +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.shared.dto; - -import java.util.Collection; -import java.util.Date; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; - -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample; - -/** - * @author Franz-Josef Elmer - */ -public class MsInjectionSample -{ - private final Sample sample; - - private final Map<String, AbstractExternalData> latestDataSets = new LinkedHashMap<String, AbstractExternalData>(); - - private final List<AbstractExternalData> dataSets; - - public MsInjectionSample(Sample sample, List<AbstractExternalData> dataSets) - { - this.sample = sample; - this.dataSets = dataSets; - add(dataSets); - } - - private void add(Collection<AbstractExternalData> datasets) - { - if (datasets != null) - { - for (AbstractExternalData dataSet : datasets) - { - addLatestDataSet(dataSet); - add(dataSet.getChildren()); - } - } - } - - public Sample getSample() - { - return sample; - } - - public final List<AbstractExternalData> getDataSets() - { - return dataSets; - } - - public Map<String, AbstractExternalData> getLatestDataSets() - { - return latestDataSets; - } - - private void addLatestDataSet(AbstractExternalData dataSet) - { - String dataSetTypeCode = dataSet.getDataSetType().getCode(); - Date registrationDate = dataSet.getRegistrationDate(); - AbstractExternalData latestDataSet = latestDataSets.get(dataSetTypeCode); - if (latestDataSet == null - || latestDataSet.getRegistrationDate().getTime() < registrationDate.getTime()) - { - latestDataSets.put(dataSetTypeCode, dataSet); - } - } - - @Override - public String toString() - { - return sample.getIdentifier() + ":" + latestDataSets; - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/dto/PeptideWithModification.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/dto/PeptideWithModification.java deleted file mode 100644 index 9258feb2f41..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/dto/PeptideWithModification.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.shared.dto; - -import net.lemnik.eodsql.ResultColumn; - -/** - * @author Franz-Josef Elmer - */ -public class PeptideWithModification extends AbstractDTOWithID -{ - private static final long serialVersionUID = 1L; - - @ResultColumn("sequence") - private String sequence; - - @ResultColumn("pos") - private Integer position; - - @ResultColumn("mass") - private Double mass; - - public final String getSequence() - { - return sequence; - } - - public final void setSequence(String sequence) - { - this.sequence = sequence; - } - - public Integer getPosition() - { - return position; - } - - public void setPosition(Integer position) - { - this.position = position; - } - - public Double getMass() - { - return mass; - } - - public void setMass(Double mass) - { - this.mass = mass; - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/dto/ProbabilityFDRMapping.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/dto/ProbabilityFDRMapping.java deleted file mode 100644 index f3f365e9495..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/dto/ProbabilityFDRMapping.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.shared.dto; - -import net.lemnik.eodsql.ResultColumn; - -/** - * @author Franz-Josef Elmer - */ -public class ProbabilityFDRMapping -{ - @ResultColumn("probability") - private double probability; - - @ResultColumn("false_discovery_rate") - private double falseDiscoveryRate; - - public final double getProbability() - { - return probability; - } - - public final void setProbability(double probability) - { - this.probability = probability; - } - - public final double getFalseDiscoveryRate() - { - return falseDiscoveryRate; - } - - public final void setFalseDiscoveryRate(double falseDiscoveryRate) - { - this.falseDiscoveryRate = falseDiscoveryRate; - } -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/dto/ProteinAbundance.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/dto/ProteinAbundance.java deleted file mode 100644 index 34875160517..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/dto/ProteinAbundance.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.shared.dto; - -import java.io.Serializable; - -import net.lemnik.eodsql.ResultColumn; - -/** - * @author Franz-Josef Elmer - */ -public class ProteinAbundance extends AbstractDTOWithID implements Serializable -{ - private static final long serialVersionUID = 1L; - - @ResultColumn("value") - private double abundance; - - @ResultColumn("perm_id") - private String samplePermID; - - public double getAbundance() - { - return abundance; - } - - public void setAbundance(double abundance) - { - this.abundance = abundance; - } - - public String getSamplePermID() - { - return samplePermID; - } - - public void setSampleID(String samplePermID) - { - this.samplePermID = samplePermID; - } -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/dto/ProteinReference.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/dto/ProteinReference.java deleted file mode 100644 index ef998e95d3c..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/dto/ProteinReference.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.shared.dto; - -import java.io.Serializable; - -import net.lemnik.eodsql.ResultColumn; - -/** - * @author Franz-Josef Elmer - */ -public class ProteinReference extends AbstractDTOWithID implements Serializable -{ - private static final long serialVersionUID = 1L; - - @ResultColumn("accession_number") - private String accessionNumber; - - @ResultColumn("description") - private String description; - - public final String getAccessionNumber() - { - return accessionNumber; - } - - public final void setAccessionNumber(String accessionNumber) - { - this.accessionNumber = accessionNumber; - } - - public final String getDescription() - { - return description; - } - - public final void setDescription(String description) - { - this.description = description; - } - -} \ No newline at end of file diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/dto/ProteinReferenceWithProbability.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/dto/ProteinReferenceWithProbability.java deleted file mode 100644 index 8d30c84c290..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/dto/ProteinReferenceWithProbability.java +++ /dev/null @@ -1,95 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.shared.dto; - -import java.io.Serializable; - -import net.lemnik.eodsql.ResultColumn; - -/** - * @author Franz-Josef Elmer - */ -public class ProteinReferenceWithProbability extends ProteinReference implements Serializable -{ - private static final long serialVersionUID = 1L; - - @ResultColumn("data_set_id") - private long dataSetID; - - @ResultColumn("probability") - private double probability; - - @ResultColumn("coverage") - private double coverage; - - @ResultColumn("abundance") - private Double abundance; - - @ResultColumn("sample_perm_id") - private String samplePermID; - - public final long getDataSetID() - { - return dataSetID; - } - - public final void setDataSetID(long dataSetID) - { - this.dataSetID = dataSetID; - } - - public final double getProbability() - { - return probability; - } - - public final void setProbability(double probability) - { - this.probability = probability; - } - - public final Double getAbundance() - { - return abundance; - } - - public final void setAbundance(Double abundance) - { - this.abundance = abundance; - } - - public final String getSamplePermID() - { - return samplePermID; - } - - public final void setSamplePermID(String samplePermID) - { - this.samplePermID = samplePermID; - } - - public void setCoverage(double coverage) - { - this.coverage = coverage; - } - - public double getCoverage() - { - return coverage; - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/dto/ProteinReferenceWithProbabilityAndPeptide.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/dto/ProteinReferenceWithProbabilityAndPeptide.java deleted file mode 100644 index 5f75d2fb2a1..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/dto/ProteinReferenceWithProbabilityAndPeptide.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.shared.dto; - -import net.lemnik.eodsql.ResultColumn; - -/** - * @author Franz-Josef Elmer - */ -public class ProteinReferenceWithProbabilityAndPeptide extends ProteinReferenceWithProbability -{ - private static final long serialVersionUID = 1L; - - @ResultColumn("sequence") - private String peptideSequence; - - public String getPeptideSequence() - { - return peptideSequence; - } - - public void setPeptideSequence(String peptideSequence) - { - this.peptideSequence = peptideSequence; - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/dto/ProteinReferenceWithProtein.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/dto/ProteinReferenceWithProtein.java deleted file mode 100644 index bf572eea798..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/dto/ProteinReferenceWithProtein.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.shared.dto; - -import java.io.Serializable; - -import net.lemnik.eodsql.ResultColumn; - -/** - * @author Franz-Josef Elmer - */ -public class ProteinReferenceWithProtein extends ProteinReference implements Serializable -{ - private static final long serialVersionUID = 1L; - - @ResultColumn("data_set_id") - private long dataSetID; - - @ResultColumn("protein_id") - private long proteinID; - - @ResultColumn("probability") - private double probability; - - @ResultColumn("coverage") - private double coverage; - - public final long getDataSetID() - { - return dataSetID; - } - - public final void setDataSetID(long dataSetID) - { - this.dataSetID = dataSetID; - } - - public long getProteinID() - { - return proteinID; - } - - public void setProteinID(long proteinID) - { - this.proteinID = proteinID; - } - - public final double getProbability() - { - return probability; - } - - public final void setProbability(double probability) - { - this.probability = probability; - } - - public void setCoverage(double coverage) - { - this.coverage = coverage; - } - - public double getCoverage() - { - return coverage; - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/dto/ProteinWithAbundances.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/dto/ProteinWithAbundances.java deleted file mode 100644 index 1d12fa3b75f..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/dto/ProteinWithAbundances.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.shared.dto; - -import it.unimi.dsi.fastutil.doubles.DoubleArrayList; - -import java.util.LinkedHashMap; -import java.util.Map; -import java.util.Set; - -/** - * @author Franz-Josef Elmer - */ -public class ProteinWithAbundances extends ProteinReference -{ - private static final long serialVersionUID = 1L; - - private static final double[] EMPTY_ARRAY = new double[0]; - - private double coverage; - - private final Map<Long, DoubleArrayList> abundances = new LinkedHashMap<Long, DoubleArrayList>(); - - public double getCoverage() - { - return coverage; - } - - public void setCoverage(double coverage) - { - this.coverage = coverage; - } - - public void addAbundanceFor(long sampleID, double abundance) - { - DoubleArrayList list = abundances.get(sampleID); - if (list == null) - { - list = new DoubleArrayList(); - abundances.put(sampleID, list); - } - list.add(abundance); - } - - public Set<Long> getSampleIDs() - { - return abundances.keySet(); - } - - public double[] getAbundancesForSample(long sampleID) - { - DoubleArrayList list = abundances.get(sampleID); - return list == null ? EMPTY_ARRAY : list.toDoubleArray(); - } -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/dto/SampleAbundance.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/dto/SampleAbundance.java deleted file mode 100644 index aa93de91f45..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/dto/SampleAbundance.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.shared.dto; - -import net.lemnik.eodsql.ResultColumn; - -/** - * @author Franz-Josef Elmer - */ -public class SampleAbundance extends AbstractSample -{ - private static final long serialVersionUID = 1L; - - @ResultColumn("value") - private double abundance; - - public final double getAbundance() - { - return abundance; - } - - public final void setAbundance(double abundance) - { - this.abundance = abundance; - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/dto/SamplePeptideModification.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/dto/SamplePeptideModification.java deleted file mode 100644 index 8a4de328d76..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/dto/SamplePeptideModification.java +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright 2011 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.shared.dto; - -import net.lemnik.eodsql.ResultColumn; - -/** - * @author Franz-Josef Elmer - */ -public class SamplePeptideModification extends AbstractSample -{ - private static final long serialVersionUID = 1L; - - @ResultColumn("fraction") - private double fraction; - - @ResultColumn("pos") - private int position; - - @ResultColumn("mass") - private double mass; - - @ResultColumn("sequence") - private String sequence; - - public double getFraction() - { - return fraction; - } - - public void setFraction(double fraction) - { - this.fraction = fraction; - } - - public int getPosition() - { - return position; - } - - public void setPosition(int position) - { - this.position = position; - } - - public double getMass() - { - return mass; - } - - public void setMass(double mass) - { - this.mass = mass; - } - - public String getSequence() - { - return sequence; - } - - public void setSequence(String sequence) - { - this.sequence = sequence; - } - -} diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/dto/Sequence.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/dto/Sequence.java deleted file mode 100644 index 69a91f93655..00000000000 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/dto/Sequence.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.shared.dto; - -import net.lemnik.eodsql.ResultColumn; - -/** - * @author Franz-Josef Elmer - */ -public class Sequence extends AbstractDTOWithID -{ - private static final long serialVersionUID = 1L; - - @ResultColumn("amino_acid_sequence") - private String sequence; - - @ResultColumn("db_id") - private long databaseID; - - @ResultColumn("name_and_version") - private String databaseNameAndVersion; - - public final String getSequence() - { - return sequence; - } - - public final void setSequence(String sequence) - { - this.sequence = sequence; - } - - public final long getDatabaseID() - { - return databaseID; - } - - public final void setDatabaseID(long databaseID) - { - this.databaseID = databaseID; - } - - public final String getDatabaseNameAndVersion() - { - return databaseNameAndVersion; - } - - public final void setDatabaseNameAndVersion(String databaseNameAndVersion) - { - this.databaseNameAndVersion = databaseNameAndVersion; - } - -} diff --git a/rtd_phosphonetx/source/java/proteomics-applicationContext.xml b/rtd_phosphonetx/source/java/proteomics-applicationContext.xml deleted file mode 100644 index a67901501d1..00000000000 --- a/rtd_phosphonetx/source/java/proteomics-applicationContext.xml +++ /dev/null @@ -1,13 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<beans xmlns="http://www.springframework.org/schema/beans" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xmlns:tx="http://www.springframework.org/schema/tx" - xsi:schemaLocation="http://www.springframework.org/schema/beans - http://www.springframework.org/schema/beans/spring-beans-2.5.xsd - http://www.springframework.org/schema/tx - http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"> - - <import resource="applicationContext.xml"/> - <import resource="proteomics-plugin-applicationContext.xml"/> - -</beans> \ No newline at end of file diff --git a/rtd_phosphonetx/source/java/proteomics-plugin-applicationContext.xml b/rtd_phosphonetx/source/java/proteomics-plugin-applicationContext.xml deleted file mode 100644 index ea3245ffbb5..00000000000 --- a/rtd_phosphonetx/source/java/proteomics-plugin-applicationContext.xml +++ /dev/null @@ -1,64 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<beans xmlns="http://www.springframework.org/schema/beans" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xmlns:tx="http://www.springframework.org/schema/tx" - xsi:schemaLocation="http://www.springframework.org/schema/beans - http://www.springframework.org/schema/beans/spring-beans-2.5.xsd - http://www.springframework.org/schema/tx - http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"> - - <bean id="proteomics-dao-factory" - class="ch.systemsx.cisd.openbis.plugin.proteomics.server.dataaccess.db.PhosphoNetXDAOFactory"> - <constructor-arg ref="dss-based-data-source-provider"/> - <constructor-arg ref="dao-factory"/> - </bean> - - <bean id="proteomics-bo-factory" - class="ch.systemsx.cisd.openbis.plugin.proteomics.server.business.BusinessObjectFactory"> - <constructor-arg ref="dao-factory"/> - <constructor-arg ref="proteomics-dao-factory"/> - <constructor-arg ref="common-business-object-factory" /> - </bean> - - <!-- - // Proteomics Data Server - --> - - <bean id="proteomics-data-service-internal" - class="ch.systemsx.cisd.openbis.plugin.proteomics.server.ProteomicsDataServiceInternal" - init-method="replaceAutoWiredSesseionManagerByConstructorSessionManager"> - <constructor-arg> - <bean class="ch.systemsx.cisd.openbis.generic.server.OpenBisSessionManager"> - <constructor-arg> - <bean class="ch.systemsx.cisd.openbis.generic.server.SessionFactory" /> - </constructor-arg> - <constructor-arg> - <bean class="ch.systemsx.cisd.openbis.generic.shared.LogMessagePrefixGenerator" /> - </constructor-arg> - <constructor-arg ref="dummy-authentication-service" /> - <constructor-arg> - <bean class="ch.systemsx.cisd.common.servlet.RequestContextProviderAdapter"> - <constructor-arg ref="request-context-provider" /> - </bean> - </constructor-arg> - <constructor-arg value="${session-timeout}" /> - <constructor-arg value="${session-timeout-no-login}" /> - <constructor-arg ref="dao-factory"/> - </bean> - </constructor-arg> - <constructor-arg ref="dao-factory"/> - <constructor-arg ref="common-business-object-factory" /> - <constructor-arg ref="proteomics-bo-factory" /> - <constructor-arg ref="managed-property-evaluator-factory" /> - </bean> - - <bean id="proteomics-data-service-web" - class="ch.systemsx.cisd.openbis.plugin.proteomics.server.ProteomicsDataServiceInternal"> - <constructor-arg ref="session-manager" /> - <constructor-arg ref="dao-factory"/> - <constructor-arg ref="common-business-object-factory" /> - <constructor-arg ref="proteomics-bo-factory" /> - <constructor-arg ref="managed-property-evaluator-factory" /> - </bean> - -</beans> \ No newline at end of file diff --git a/rtd_phosphonetx/source/java/service.properties b/rtd_phosphonetx/source/java/service.properties deleted file mode 100644 index ecb4704b892..00000000000 --- a/rtd_phosphonetx/source/java/service.properties +++ /dev/null @@ -1,67 +0,0 @@ -authentication-service = dummy-authentication-service - -# The time after which an inactive session is expired by the service (in minutes). -session-timeout = 720 - -# Authorization -# Supported: 'no-authorization' and 'active-authorization' -authorization-component-factory = active-authorization - -authorization.project-level.enabled = true -authorization.project-level.users = .*\\_pa\\_on - -dss-rpc.put.dss-code = DSS1 - -script-folder = ../openbis/source/ - -# Supported: currently only 'postgresql' is supported -database.engine = postgresql -database.create-from-scratch = false -# For debugging set this value to true. -database.script-single-step-mode = false -database.url-host-part = -database.kind = phosphonetx -# database.kind = system_test -# database.kind = system_test_strict -# database.kind = system_test_plates_on_demand -# database.kind = system_test_multi_groups -database.owner = -database.owner-password = -database.admin-user = -database.admin-password = - -crowd.service.host = crowd.systemsx.ch -crowd.service.port = 8443 -crowd.application.name = lims -crowd.application.password = - -# The database instance local unique identifier. Used when the new database is created. -database-instance = CISD - -# The URL of the CIFEX server -cifex-url = https://cifex.ethz.ch:443 - -trusted-cross-origin-domains= * - -# Hibernate Search -# The working directory. -hibernate.search.index-base = ./targets/indices_${database.kind} -# One of NO_INDEX, SKIP_IF_MARKER_FOUND, INDEX_FROM_SCRATCH. -# If not specified, default (SKIP_IF_MARKER_FOUND) is taken. -hibernate.search.index-mode = SKIP_IF_MARKER_FOUND -# Defines the maximum number of elements indexed before flushing the transaction-bound queue. -# Default is 1000. -hibernate.search.batch-size = 1000 -# Maximum number of search results -hibernate.search.maxResults = 100000 - -web-client-configuration-file = etc/web-client.properties - -proteomics-database-kind = dev - -core-plugins-folder = source/core-plugins - - - - -jython-version=2.7 diff --git a/rtd_phosphonetx/source/sql/proteomics/postgresql/001/schema-001.dez b/rtd_phosphonetx/source/sql/proteomics/postgresql/001/schema-001.dez deleted file mode 100644 index 8fb86063bc3..00000000000 --- a/rtd_phosphonetx/source/sql/proteomics/postgresql/001/schema-001.dez +++ /dev/null @@ -1,26083 +0,0 @@ -<?xml version="1.0" encoding="iso-8859-1"?><dezign> - -<FILEFORMATVERSION>51</FILEFORMATVERSION> -<VERSION> -<PROJECTSETTINGS> -<PROJECTFILENAME>D:\User\felmer\dev-workspace\rtd_phosphonetx\source\sql\postgresql\phosphonetx.dez</PROJECTFILENAME> -<MODIFIED>2009-09-28</MODIFIED> -<CREATED>2009-06-29</CREATED> -<CREATED2></CREATED2> -<PROJECTNAME></PROJECTNAME> -<DESCRIPTION></DESCRIPTION> -<AUTHOR></AUTHOR> -<COPYRIGHT></COPYRIGHT> -<LASTGENERATEDFILES>N:\user\cisd\felmer\phosphonetx\schema-001.sql;N:\user\cisd\felmer\phosphonetx\drop.sql;C:\Users\felmer\Documents\CreateDBLog_200909281.txt</LASTGENERATEDFILES> -</PROJECTSETTINGS> -<CONNECTIONSETTINGS> -<SQLFILE>D:\User\felmer\dev-workspace\rtd_phosphonetx\source\sql\postgresql\001\schema-001.sql</SQLFILE> -<CONNECTIONTYPE>SQLFILE</CONNECTIONTYPE> -<DBID>postgresql8</DBID> -</CONNECTIONSETTINGS> -<DATADICT> -<DBID>postgresql8</DBID> -<LASTID>175</LASTID> -<DDSETTINGS> -<PKCONNAMETEMPLATE>PK_%table%</PKCONNAMETEMPLATE> -<FKCONNAMETEMPLATE>%relname%</FKCONNAMETEMPLATE> -<CCONNAMETEMPLATE>CC_%table%_%column%</CCONNAMETEMPLATE> -<NOTNULLCONNAMETEMPLATE>NN_%column%</NOTNULLCONNAMETEMPLATE> -<DEFAULTCONNAMETEMPLATE>DEF_%table%_%column%</DEFAULTCONNAMETEMPLATE> -<TUCONNAMETEMPLATE>TUC_%table%_%counter%</TUCONNAMETEMPLATE> -<TCCONNAMETEMPLATE>TCC_%table%_%counter%</TCCONNAMETEMPLATE> -<RELNAMETEMPLATE>%parent%_%child%</RELNAMETEMPLATE> -<INDEXNAMETEMPLATE>IDX_%table%_%counter%</INDEXNAMETEMPLATE> -<DEFTABLEOPTIONS></DEFTABLEOPTIONS> -<DEFINDEXOPTIONS></DEFINDEXOPTIONS> -<BEGINDATABASESCRIPT></BEGINDATABASESCRIPT> -<ENDDATABASESCRIP></ENDDATABASESCRIP> -<BEGINALTERDATABASESCRIPT></BEGINALTERDATABASESCRIPT> -<ENDALTERDATABASESCRIP></ENDALTERDATABASESCRIP> -<BEGINDROPDATABASESCRIPT></BEGINDROPDATABASESCRIPT> -<ENDDROPDATABASESCRIP></ENDDROPDATABASESCRIP> -<GENDIALOGSELECTEDOBJECTS></GENDIALOGSELECTEDOBJECTS> -<GENTABLES>1</GENTABLES> -<GENTABLEOPTIONS>1</GENTABLEOPTIONS> -<GENCONSTRAINTS>1</GENCONSTRAINTS> -<GENINDEXES>1</GENINDEXES> -<GENTRIGGERS>1</GENTRIGGERS> -<GENVIEWS>1</GENVIEWS> -<GENPROCEDURES>1</GENPROCEDURES> -<GENSEQUENCES>1</GENSEQUENCES> -<GENRELATIONSHIPS>1</GENRELATIONSHIPS> -<GENBEGINENDTABLESCRIPTS>1</GENBEGINENDTABLESCRIPTS> -<GENBEGINENDDBSCRIPTS>1</GENBEGINENDDBSCRIPTS> -<GLOBALPREFIX></GLOBALPREFIX> -<AUTOCREATEINDEXESONKEYS>0</AUTOCREATEINDEXESONKEYS> -<CONVERTDOMAINS>0</CONVERTDOMAINS> -<IGNORECOMMENTS>0</IGNORECOMMENTS> -<USESCHEMANAMES>0</USESCHEMANAMES> -<UCONNAMETEMPLATE></UCONNAMETEMPLATE> -<SQLCREATEFILE>N:\user\cisd\felmer\phosphonetx\schema-001.sql</SQLCREATEFILE> -<SQLDROPFILE>N:\user\cisd\felmer\phosphonetx\drop.sql</SQLDROPFILE> -</DDSETTINGS> -<DOMAINS> -<DOMAIN> -<NAME>CHECKSUM</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>8</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>CODE</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>DESCRIPTION</NAME> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>2000</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>INTEGER_NUMBER</NAME> -<ID>7</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>INTEGER</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>REAL_NUMBER</NAME> -<ID>8</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>LONG_SEQUENCE</NAME> -<ID>9</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>TEXT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>SHORT_DESCRIPTION</NAME> -<ID>11</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>200</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>TECH_ID</NAME> -<ID>12</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>SHORT_SEQUENCE</NAME> -<ID>69</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>1000</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>ACCESSION_NUMBER</NAME> -<ID>109</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>256</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>SPECTRUM_REFERENCE</NAME> -<ID>171</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>100</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -</DOMAINS> -<ENTITIES> -<ENT> -<NAME>EXPERIMENTS</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>16</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>3</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_EXPERIMENTS</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PERM_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>5</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_EXPERIMENTS_1</NAME> -<NAMETEMPLATE>TUC_%table%_%counter%</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>DATA_SETS</NAME> -<NAMETEMPLATE>IX_FK_DATA_SETS_EXPERIMENTS</NAMETEMPLATE> -<ID>17</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>6</ATTRLASTID> -<IDXLASTID>3</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_DATA_SETS</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>EXPE_ID</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>SAMP_ID</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -<ATTR> -<NAME>DB_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>6</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PERM_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>5</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<INDEXES> -<INDEX> -<NAME>IX_FK_DATA_SETS_EXPERIMENTS</NAME> -<NAMETEMPLATE>IX_FK_DATA_SETS_EXPERIMENTS</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>EXPE_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>4</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -<INDEX> -<NAME>IX_FK_DATA_SETS_SAMPLES</NAME> -<NAMETEMPLATE>IX_FK_DATA_SETS_SAMPLES</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>SAMP_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>5</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -</INDEXES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_DATA_SETS_1</NAME> -<NAMETEMPLATE>TUC_%table%_%counter%</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>MODIFICATIONS</NAME> -<NAMETEMPLATE>IX_FK_MODIFICATIONS_PEPTIDES</NAMETEMPLATE> -<ID>19</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>7</ATTRLASTID> -<IDXLASTID>5</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_MODIFICATIONS</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>MOPE_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>7</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>7</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>POS</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>7</DOMAINID> -<DT> -<DTLISTNAME>INTEGER</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>MASS</NAME> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>6</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -</ENT> -<ENT> -<NAME>PEPTIDES</NAME> -<NAMETEMPLATE>IX_FK_PEPTIDES_ABUNDANCES</NAMETEMPLATE> -<ID>21</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>10</ATTRLASTID> -<IDXLASTID>5</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_PEPTIDES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PROT_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>SEQUENCE</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>10</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>69</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>1000</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>10</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>CHARGE</NAME> -<ID>7</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>7</DOMAINID> -<DT> -<DTLISTNAME>INTEGER</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>7</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<INDEXES> -<INDEX> -<NAME>IX_FK_PEPTIDES_PROTEINS</NAME> -<NAMETEMPLATE>IX_FK_PEPTIDES_PROTEINS</NAMETEMPLATE> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>PROT_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>3</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -</INDEXES> -</ENT> -<ENT> -<NAME>PROTEINS</NAME> -<NAMETEMPLATE>IX_FK_PROTEINS_DATA_SETS</NAMETEMPLATE> -<ID>23</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>11</ATTRLASTID> -<IDXLASTID>7</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_PROTEINS</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DASE_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>10</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>10</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PROBABILITY</NAME> -<ID>9</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>9</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<INDEXES> -<INDEX> -<NAME>IDX_PROTEINS_1</NAME> -<NAMETEMPLATE>IDX_%table%_%counter%</NAMETEMPLATE> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>DASE_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>10</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -</INDEXES> -</ENT> -<ENT> -<NAME>SAMPLES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>24</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>4</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_SAMPLES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PERM_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>5</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>EXPE_ID</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_SAMPLES_1</NAME> -<NAMETEMPLATE>TUC_%table%_%counter%</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>SEQUENCES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>25</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>6</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_SEQUENCES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DB_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PRRE_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>6</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>AMINO_ACID_SEQUENCE</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>9</DOMAINID> -<DT> -<DTLISTNAME>TEXT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>CHECKSUM</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>4</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>8</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -</ENT> -<ENT> -<NAME>IDENTIFIED_PROTEINS</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>47</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>5</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_IDENTIFIED_PROTEINS</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PROT_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>SEQU_ID</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -</ENT> -<ENT> -<NAME>ABUNDANCES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>91</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>6</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_ABUNDANCES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PROT_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>SAMP_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>VALUE</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>6</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -</ENT> -<ENT> -<NAME>PROBABILITY_FDR_MAPPINGS</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>96</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>5</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_PROBABILITY_FDR_MAPPINGS</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DASE_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PROBABILITY</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>FALSE_DISCOVERY_RATE</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -</ENT> -<ENT> -<NAME>PROTEIN_REFERENCES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>98</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>4</ATTRLASTID> -<IDXLASTID>2</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_PROTEIN_REFERENCES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>ACCESSION_NUMBER</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>109</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>256</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DESCRIPTION</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>6</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>2000</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -</ATTRIBUTES> -<INDEXES> -<INDEX> -<NAME>IDX_PROTEIN_REFERENCES_1</NAME> -<NAMETEMPLATE>IDX_%table%_%counter%</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>ACCESSION_NUMBER</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>3</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -</INDEXES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_PROTEIN_REFERENCES_1</NAME> -<NAMETEMPLATE>TUC_%table%_%counter%</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>DATABASES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>110</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>3</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_DATABASES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>NAME_AND_VERSION</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>11</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>200</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_DATABASES_1</NAME> -<NAMETEMPLATE>TUC_%table%_%counter%</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>MODIFIED_PEPTIDES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>136</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>5</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_MODIFIED_PEPTIDES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PEPT_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>NTERM_MASS</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>CTERM_MASS</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -</ENT> -<ENT> -<NAME>SPECTRUM_REFERENCES</NAME> -<ID>160</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>4</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_SPECTRUM_REFERENCES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PEPT_ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>REFERENCE</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>171</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>100</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -</ENT> -<ENT> -<NAME>MODIFICATION_FRACTIONS</NAME> -<ID>173</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>5</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_MODIFICATION_FRACTIONS</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>MODI_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>SAMP_ID</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -<ATTR> -<NAME>FRACTION</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -</ENT> -</ENTITIES> -<SUBCATEGORIES> -</SUBCATEGORIES> -<TEXTAREAS> -</TEXTAREAS> -<GROUPBOXES> -</GROUPBOXES> -<STAMPS> -</STAMPS> -<SEQUENCES> -</SEQUENCES> -<PROCEDURES> -</PROCEDURES> -<VIEWS> -</VIEWS> -<RELATIONSHIPS> -<REL> -<NAME>DA_EX_FK</NAME> -<NAMETEMPLATE>DA_EX_FK</NAMETEMPLATE> -<ID>29</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>16</PARENTOBJECTID> -<CHILDOBJECTID>17</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>DA_EX_FK</NAME> -<NAMETEMPLATE>DA_EX_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>4</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>DA_SA_FK</NAME> -<NAMETEMPLATE>DA_SA_FK</NAMETEMPLATE> -<ID>30</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>24</PARENTOBJECTID> -<CHILDOBJECTID>17</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>0</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>DA_SA_FK</NAME> -<NAMETEMPLATE>DA_SA_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>5</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>PE_PR_FK</NAME> -<NAMETEMPLATE>PE_PR_FK</NAMETEMPLATE> -<ID>36</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>23</PARENTOBJECTID> -<CHILDOBJECTID>21</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>PE_PR_FK</NAME> -<NAMETEMPLATE>PE_PR_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>3</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>DATA_SETS_PROTEINS</NAME> -<NAMETEMPLATE>%parent%_%child%</NAMETEMPLATE> -<ID>46</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>17</PARENTOBJECTID> -<CHILDOBJECTID>23</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>DATA_SETS_PROTEINS</NAME> -<NAMETEMPLATE>%relname%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>10</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>10</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>PROTEINS_IDENTIFIED_PROTEINS</NAME> -<NAMETEMPLATE>%parent%_%child%</NAMETEMPLATE> -<ID>48</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>23</PARENTOBJECTID> -<CHILDOBJECTID>47</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>PROTEINS_IDENTIFIED_PROTEINS</NAME> -<NAMETEMPLATE>%relname%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>3</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>SEQUENCES_IDENTIFIED_PROTEINS</NAME> -<NAMETEMPLATE>%parent%_%child%</NAMETEMPLATE> -<ID>50</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>25</PARENTOBJECTID> -<CHILDOBJECTID>47</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>SEQUENCES_IDENTIFIED_PROTEINS</NAME> -<NAMETEMPLATE>%relname%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>5</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>SAMPLES_ABUNDANCES</NAME> -<NAMETEMPLATE>%parent%_%child%</NAMETEMPLATE> -<ID>92</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>24</PARENTOBJECTID> -<CHILDOBJECTID>91</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>SAMPLES_ABUNDANCES</NAME> -<NAMETEMPLATE>%relname%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>4</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>PROTEINS_ABUNDANCES</NAME> -<NAMETEMPLATE>%parent%_%child%</NAMETEMPLATE> -<ID>94</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>23</PARENTOBJECTID> -<CHILDOBJECTID>91</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>PROTEINS_ABUNDANCES</NAME> -<NAMETEMPLATE>%relname%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>3</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>DATA_SETS_PROBABILITY_FDR_MAPPINGS</NAME> -<NAMETEMPLATE>%parent%_%child%</NAMETEMPLATE> -<ID>97</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>17</PARENTOBJECTID> -<CHILDOBJECTID>96</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>DATA_SETS_PROBABILITY_FDR_MAPPINGS</NAME> -<NAMETEMPLATE>%relname%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>5</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>DATABASES_SEQUENCES</NAME> -<NAMETEMPLATE>%parent%_%child%</NAMETEMPLATE> -<ID>111</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>110</PARENTOBJECTID> -<CHILDOBJECTID>25</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>DATABASES_SEQUENCES</NAME> -<NAMETEMPLATE>%relname%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>5</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>PROTEIN_REFERENCES_SEQUENCES</NAME> -<NAMETEMPLATE>%parent%_%child%</NAMETEMPLATE> -<ID>112</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>98</PARENTOBJECTID> -<CHILDOBJECTID>25</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>PROTEIN_REFERENCES_SEQUENCES</NAME> -<NAMETEMPLATE>%relname%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>6</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>6</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>DATABASES_DATA_SETS</NAME> -<NAMETEMPLATE>%parent%_%child%</NAMETEMPLATE> -<ID>125</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>110</PARENTOBJECTID> -<CHILDOBJECTID>17</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>DATABASES_DATA_SETS</NAME> -<NAMETEMPLATE>%relname%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>6</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>6</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>PEPTIDES_MODIFIED_PEPTIDES</NAME> -<NAMETEMPLATE>%parent%_%child%</NAMETEMPLATE> -<ID>138</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>21</PARENTOBJECTID> -<CHILDOBJECTID>136</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>PEPTIDES_MODIFIED_PEPTIDES</NAME> -<NAMETEMPLATE>%relname%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>3</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>MODIFIED_PEPTIDES_MODIFICATIONS</NAME> -<NAMETEMPLATE>%parent%_%child%</NAMETEMPLATE> -<ID>139</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>136</PARENTOBJECTID> -<CHILDOBJECTID>19</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>MODIFIED_PEPTIDES_MODIFICATIONS</NAME> -<NAMETEMPLATE>%relname%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>7</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>7</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>PEPTIDES_SPECTRUM_REFERENCES</NAME> -<NAMETEMPLATE>%parent%_%child%</NAMETEMPLATE> -<ID>172</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>21</PARENTOBJECTID> -<CHILDOBJECTID>160</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>PEPTIDES_SPECTRUM_REFERENCES</NAME> -<NAMETEMPLATE>%relname%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>2</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>MODIFICATIONS_MODIFICATION_FRACTIONS</NAME> -<NAMETEMPLATE>%parent%_%child%</NAMETEMPLATE> -<ID>174</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>19</PARENTOBJECTID> -<CHILDOBJECTID>173</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>MODIFICATIONS_MODIFICATION_FRACTIONS</NAME> -<NAMETEMPLATE>%relname%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>3</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>SAMPLES_MODIFICATION_FRACTIONS</NAME> -<NAMETEMPLATE>%parent%_%child%</NAMETEMPLATE> -<ID>175</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>24</PARENTOBJECTID> -<CHILDOBJECTID>173</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>0</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>SAMPLES_MODIFICATION_FRACTIONS</NAME> -<NAMETEMPLATE>%relname%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>4</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -</RELATIONSHIPS> -<SUBCATEGORYCONNECTIONS> -</SUBCATEGORYCONNECTIONS> -</DATADICT> -<DIAGRAMS> -<DisplayPreferences> -<USEINDICATORLINE>0</USEINDICATORLINE> -<INDICATORBITMAPS>0</INDICATORBITMAPS> -<PKINDICATOR>PK</PKINDICATOR> -<FKINDICATOR>FK</FKINDICATOR> -<PFINDICATOR>PF</PFINDICATOR> -<NOTNULLINDICATOR>*</NOTNULLINDICATOR> -<INDICATORPOSITION>0</INDICATORPOSITION> -<DEFTEXTAREACOLOR>16777215</DEFTEXTAREACOLOR> -<DEFENTCOLOR>16777215</DEFENTCOLOR> -<DEFSTAMPCOLOR>16777215</DEFSTAMPCOLOR> -<DEFGROUPBOXCOLOR>8421504</DEFGROUPBOXCOLOR> -<DEFTEXTAREALINECOLOR>0</DEFTEXTAREALINECOLOR> -<DEFENTLINECOLOR>0</DEFENTLINECOLOR> -<DEFSTAMPLINECOLOR>0</DEFSTAMPLINECOLOR> -<DEFSUBCATLINECOLOR>0</DEFSUBCATLINECOLOR> -<DEFCONLINECOLOR>0</DEFCONLINECOLOR> -<DEFGROUPBOXLINECOLOR>0</DEFGROUPBOXLINECOLOR> -<DEFTEXTAREATRANSPARENT>0</DEFTEXTAREATRANSPARENT> -<DEFSTAMPTRANSPARENT>0</DEFSTAMPTRANSPARENT> -<DEFTEXTAREALINEWIDTH>1</DEFTEXTAREALINEWIDTH> -<DEFSTAMPLINEWIDTH>1</DEFSTAMPLINEWIDTH> -<DEFGROUPBOXLINEWIDTH>0</DEFGROUPBOXLINEWIDTH> -<DEFTEXTAREALINESTYLE>0</DEFTEXTAREALINESTYLE> -<DEFSTAMPLINESTYLE>0</DEFSTAMPLINESTYLE> -<DEFGROUPBOXLINESTYLE>0</DEFGROUPBOXLINESTYLE> -<ENTNAMEFONT>Arial,9,B,0,clNavy,0</ENTNAMEFONT> -<ENTPKFONT>Arial,8,B,0,clWindowText,0</ENTPKFONT> -<ENTFKFONT>Arial,8,I,0,clWindowText,0</ENTFKFONT> -<ENTATTRFONT>Arial,8,,0,clWindowText,0</ENTATTRFONT> -<TEXTAREAFONT>Arial,8,,0,clWindowText,0</TEXTAREAFONT> -<GROUPBOXFONT>Arial,8,,0,clWindowText,0</GROUPBOXFONT> -<CAPTIONFONT>Arial,8,,0,clWindowText,0</CAPTIONFONT> -</DisplayPreferences> -<DIAGRAM> -<ID>1</ID> -<NAME>Main Diagram</NAME> -<DESC></DESC> -<TODO></TODO> -<ISMAINDIAGRAM>1</ISMAINDIAGRAM> -<BGCOLOR>16777215</BGCOLOR> -<DISPLAYLEVEL>0</DISPLAYLEVEL> -<VISIBLEATTR>2</VISIBLEATTR> -<CAPTIONSTYLE>0</CAPTIONSTYLE> -<SHOWPKINDICATOR>1</SHOWPKINDICATOR> -<SHOWFKINDICATOR>1</SHOWFKINDICATOR> -<SHOWNOTNULLINDICATOR>1</SHOWNOTNULLINDICATOR> -<NOTATION>0</NOTATION> -</DIAGRAM> -<CONTROLS> -<ENTITYCONTROLS> -<ENTC> -<ID>16</ID> -<DIAGRAMID>1</DIAGRAMID> -<W>136</W> -<H>63</H> -<L>544</L> -<T>11</T> -<BRUSH>0,16777215</BRUSH> -<PEN>0,1,4,0</PEN> -<FONT>Arial,8,,0,clWindowText,0</FONT> -<TR>0</TR> -<AS>1</AS> -</ENTC> -<ENTC> -<ID>17</ID> -<DIAGRAMID>1</DIAGRAMID> -<W>139</W> -<H>108</H> -<L>295</L> -<T>11</T> -<BRUSH>0,16777215</BRUSH> -<PEN>0,1,4,0</PEN> -<FONT>Arial,8,,0,clWindowText,0</FONT> -<TR>0</TR> -<AS>1</AS> -</ENTC> -<ENTC> -<ID>19</ID> -<DIAGRAMID>1</DIAGRAMID> -<W>177</W> -<H>93</H> -<L>12</L> -<T>628</T> -<BRUSH>0,16777215</BRUSH> -<PEN>0,1,4,0</PEN> -<FONT>Arial,8,,0,clWindowText,0</FONT> -<TR>0</TR> -<AS>1</AS> -</ENTC> -<ENTC> -<ID>21</ID> -<DIAGRAMID>1</DIAGRAMID> -<W>187</W> -<H>93</H> -<L>271</L> -<T>480</T> -<BRUSH>0,16777215</BRUSH> -<PEN>0,1,4,0</PEN> -<FONT>Arial,8,,0,clWindowText,0</FONT> -<TR>0</TR> -<AS>1</AS> -</ENTC> -<ENTC> -<ID>23</ID> -<DIAGRAMID>1</DIAGRAMID> -<W>180</W> -<H>78</H> -<L>274</L> -<T>328</T> -<BRUSH>0,16777215</BRUSH> -<PEN>0,1,4,0</PEN> -<FONT>Arial,8,,0,clWindowText,0</FONT> -<TR>0</TR> -<AS>1</AS> -</ENTC> -<ENTC> -<ID>24</ID> -<DIAGRAMID>1</DIAGRAMID> -<W>136</W> -<H>78</H> -<L>12</L> -<T>11</T> -<BRUSH>0,16777215</BRUSH> -<PEN>0,1,4,0</PEN> -<FONT>Arial,8,,0,clWindowText,0</FONT> -<TR>0</TR> -<AS>1</AS> -</ENTC> -<ENTC> -<ID>25</ID> -<DIAGRAMID>1</DIAGRAMID> -<W>250</W> -<H>108</H> -<L>736</L> -<T>328</T> -<BRUSH>0,16777215</BRUSH> -<PEN>0,1,4,0</PEN> -<FONT>Arial,8,,0,clWindowText,0</FONT> -<TR>0</TR> -<AS>1</AS> -</ENTC> -<ENTC> -<ID>47</ID> -<DIAGRAMID>1</DIAGRAMID> -<W>142</W> -<H>78</H> -<L>541</L> -<T>328</T> -<BRUSH>0,16777215</BRUSH> -<PEN>0,1,4,0</PEN> -<FONT>Arial,8,,0,clWindowText,0</FONT> -<TR>0</TR> -<AS>1</AS> -</ENTC> -<ENTC> -<ID>91</ID> -<DIAGRAMID>1</DIAGRAMID> -<W>161</W> -<H>93</H> -<L>114</L> -<T>182</T> -<BRUSH>0,16777215</BRUSH> -<PEN>0,1,4,0</PEN> -<FONT>Arial,8,,0,clWindowText,0</FONT> -<TR>0</TR> -<AS>1</AS> -</ENTC> -<ENTC> -<ID>96</ID> -<DIAGRAMID>1</DIAGRAMID> -<W>245</W> -<H>93</H> -<L>490</L> -<T>182</T> -<BRUSH>0,16777215</BRUSH> -<PEN>0,1,4,0</PEN> -<FONT>Arial,8,,0,clWindowText,0</FONT> -<TR>0</TR> -<AS>1</AS> -</ENTC> -<ENTC> -<ID>98</ID> -<DIAGRAMID>1</DIAGRAMID> -<W>252</W> -<H>78</H> -<L>734</L> -<T>480</T> -<BRUSH>0,16777215</BRUSH> -<PEN>0,1,4,0</PEN> -<FONT>Arial,8,,0,clWindowText,0</FONT> -<TR>0</TR> -<AS>1</AS> -</ENTC> -<ENTC> -<ID>110</ID> -<DIAGRAMID>1</DIAGRAMID> -<W>252</W> -<H>63</H> -<L>734</L> -<T>107</T> -<BRUSH>0,16777215</BRUSH> -<PEN>0,1,4,0</PEN> -<FONT>Arial,8,,0,clWindowText,0</FONT> -<TR>0</TR> -<AS>1</AS> -</ENTC> -<ENTC> -<ID>136</ID> -<DIAGRAMID>1</DIAGRAMID> -<W>183</W> -<H>93</H> -<L>273</L> -<T>628</T> -<BRUSH>0,16777215</BRUSH> -<PEN>0,1,4,0</PEN> -<FONT>Arial,8,,0,clWindowText,0</FONT> -<TR>0</TR> -<AS>1</AS> -</ENTC> -<ENTC> -<ID>160</ID> -<DIAGRAMID>1</DIAGRAMID> -<W>214</W> -<H>78</H> -<L>505</L> -<T>480</T> -<BRUSH>0,16777215</BRUSH> -<PEN>0,1,4,0</PEN> -<FONT>Arial,8,,0,clWindowText,0</FONT> -<TR>0</TR> -<AS>1</AS> -</ENTC> -<ENTC> -<ID>173</ID> -<DIAGRAMID>1</DIAGRAMID> -<W>164</W> -<H>93</H> -<L>12</L> -<T>480</T> -<BRUSH>0,16777215</BRUSH> -<PEN>0,1,4,0</PEN> -<FONT>Arial,8,,0,clWindowText,0</FONT> -<TR>0</TR> -<AS>1</AS> -</ENTC> -</ENTITYCONTROLS> -<SUBCATEGORYCONTROLS> -</SUBCATEGORYCONTROLS> -<TEXTAREACONTROLS> -</TEXTAREACONTROLS> -<STAMPCONTROLS> -</STAMPCONTROLS> -<GROUPBOXESCONTROLS> -</GROUPBOXESCONTROLS> -<RELATIONSHIPCONNECTORS> -<RELC> -<ID>29</ID> -<DIAGRAMID>1</DIAGRAMID> -<FONT>Arial,8,,0,clWindowText,0</FONT> -<PEN>1,1,4,0</PEN> -<FROMRELATIVEX>5000</FROMRELATIVEX> -<FROMRELATIVEY>4921</FROMRELATIVEY> -<TORELATIVEX>5000</TORELATIVEX> -<TORELATIVEY>2870</TORELATIVEY> -<POINTS> -<POINT> -<X>543</X> -<Y>42</Y> -</POINT> -<POINT> -<X>480</X> -<Y>42</Y> -</POINT> -<POINT> -<X>480</X> -<Y>42</Y> -</POINT> -<POINT> -<X>434</X> -<Y>42</Y> -</POINT> -</POINTS> -</RELC> -<RELC> -<ID>30</ID> -<DIAGRAMID>1</DIAGRAMID> -<FONT>Arial,8,,0,clWindowText,0</FONT> -<PEN>1,1,4,0</PEN> -<FROMRELATIVEX>5000</FROMRELATIVEX> -<FROMRELATIVEY>5000</FROMRELATIVEY> -<TORELATIVEX>5000</TORELATIVEX> -<TORELATIVEY>3611</TORELATIVEY> -<POINTS> -<POINT> -<X>148</X> -<Y>50</Y> -</POINT> -<POINT> -<X>219</X> -<Y>50</Y> -</POINT> -<POINT> -<X>219</X> -<Y>50</Y> -</POINT> -<POINT> -<X>294</X> -<Y>50</Y> -</POINT> -</POINTS> -</RELC> -<RELC> -<ID>36</ID> -<DIAGRAMID>1</DIAGRAMID> -<FONT>Arial,8,,0,clWindowText,0</FONT> -<PEN>1,1,4,0</PEN> -<FROMRELATIVEX>5000</FROMRELATIVEX> -<FROMRELATIVEY>5000</FROMRELATIVEY> -<TORELATIVEX>4973</TORELATIVEX> -<TORELATIVEY>5000</TORELATIVEY> -<POINTS> -<POINT> -<X>364</X> -<Y>406</Y> -</POINT> -<POINT> -<X>364</X> -<Y>428</Y> -</POINT> -<POINT> -<X>364</X> -<Y>428</Y> -</POINT> -<POINT> -<X>364</X> -<Y>479</Y> -</POINT> -</POINTS> -</RELC> -<RELC> -<ID>46</ID> -<DIAGRAMID>1</DIAGRAMID> -<FONT>Arial,8,,0,clWindowText,0</FONT> -<PEN>1,1,4,0</PEN> -<FROMRELATIVEX>4964</FROMRELATIVEX> -<FROMRELATIVEY>5000</FROMRELATIVEY> -<TORELATIVEX>5000</TORELATIVEX> -<TORELATIVEY>5000</TORELATIVEY> -<POINTS> -<POINT> -<X>364</X> -<Y>119</Y> -</POINT> -<POINT> -<X>364</X> -<Y>183</Y> -</POINT> -<POINT> -<X>364</X> -<Y>183</Y> -</POINT> -<POINT> -<X>364</X> -<Y>327</Y> -</POINT> -</POINTS> -</RELC> -<RELC> -<ID>48</ID> -<DIAGRAMID>1</DIAGRAMID> -<FONT>Arial,8,,0,clWindowText,0</FONT> -<PEN>1,1,4,0</PEN> -<FROMRELATIVEX>5000</FROMRELATIVEX> -<FROMRELATIVEY>5000</FROMRELATIVEY> -<TORELATIVEX>5000</TORELATIVEX> -<TORELATIVEY>5000</TORELATIVEY> -<POINTS> -<POINT> -<X>454</X> -<Y>367</Y> -</POINT> -<POINT> -<X>489</X> -<Y>367</Y> -</POINT> -<POINT> -<X>489</X> -<Y>367</Y> -</POINT> -<POINT> -<X>540</X> -<Y>367</Y> -</POINT> -</POINTS> -</RELC> -<RELC> -<ID>50</ID> -<DIAGRAMID>1</DIAGRAMID> -<FONT>Arial,8,,0,clWindowText,0</FONT> -<PEN>1,1,4,0</PEN> -<FROMRELATIVEX>2840</FROMRELATIVEX> -<FROMRELATIVEY>3611</FROMRELATIVEY> -<TORELATIVEX>5000</TORELATIVEX> -<TORELATIVEY>5000</TORELATIVEY> -<POINTS> -<POINT> -<X>735</X> -<Y>367</Y> -</POINT> -<POINT> -<X>705</X> -<Y>367</Y> -</POINT> -<POINT> -<X>705</X> -<Y>367</Y> -</POINT> -<POINT> -<X>683</X> -<Y>367</Y> -</POINT> -</POINTS> -</RELC> -<RELC> -<ID>92</ID> -<DIAGRAMID>1</DIAGRAMID> -<FONT>Arial,8,,0,clWindowText,0</FONT> -<PEN>1,1,4,0</PEN> -<FROMRELATIVEX>8750</FROMRELATIVEX> -<FROMRELATIVEY>5000</FROMRELATIVEY> -<TORELATIVEX>1056</TORELATIVEX> -<TORELATIVEY>5000</TORELATIVEY> -<POINTS> -<POINT> -<X>131</X> -<Y>89</Y> -</POINT> -<POINT> -<X>131</X> -<Y>143</Y> -</POINT> -<POINT> -<X>131</X> -<Y>143</Y> -</POINT> -<POINT> -<X>131</X> -<Y>181</Y> -</POINT> -</POINTS> -</RELC> -<RELC> -<ID>94</ID> -<DIAGRAMID>1</DIAGRAMID> -<FONT>Arial,8,,0,clWindowText,0</FONT> -<PEN>1,1,4,0</PEN> -<FROMRELATIVEX>0</FROMRELATIVEX> -<FROMRELATIVEY>5000</FROMRELATIVEY> -<TORELATIVEX>9938</TORELATIVEX> -<TORELATIVEY>4194</TORELATIVEY> -<POINTS> -<POINT> -<X>274</X> -<Y>327</Y> -</POINT> -<POINT> -<X>274</X> -<Y>299</Y> -</POINT> -<POINT> -<X>274</X> -<Y>299</Y> -</POINT> -<POINT> -<X>274</X> -<Y>275</Y> -</POINT> -</POINTS> -</RELC> -<RELC> -<ID>97</ID> -<DIAGRAMID>1</DIAGRAMID> -<FONT>Arial,8,,0,clWindowText,0</FONT> -<PEN>1,1,4,0</PEN> -<FROMRELATIVEX>8369</FROMRELATIVEX> -<FROMRELATIVEY>5000</FROMRELATIVEY> -<TORELATIVEX>5000</TORELATIVEX> -<TORELATIVEY>5000</TORELATIVEY> -<POINTS> -<POINT> -<X>411</X> -<Y>119</Y> -</POINT> -<POINT> -<X>411</X> -<Y>161</Y> -</POINT> -<POINT> -<X>612</X> -<Y>161</Y> -</POINT> -<POINT> -<X>612</X> -<Y>181</Y> -</POINT> -</POINTS> -</RELC> -<RELC> -<ID>111</ID> -<DIAGRAMID>1</DIAGRAMID> -<FONT>Arial,8,,0,clWindowText,0</FONT> -<PEN>1,1,4,0</PEN> -<FROMRELATIVEX>5040</FROMRELATIVEX> -<FROMRELATIVEY>7619</FROMRELATIVEY> -<TORELATIVEX>5000</TORELATIVEX> -<TORELATIVEY>1296</TORELATIVEY> -<POINTS> -<POINT> -<X>861</X> -<Y>170</Y> -</POINT> -<POINT> -<X>861</X> -<Y>235</Y> -</POINT> -<POINT> -<X>861</X> -<Y>235</Y> -</POINT> -<POINT> -<X>861</X> -<Y>327</Y> -</POINT> -</POINTS> -</RELC> -<RELC> -<ID>112</ID> -<DIAGRAMID>1</DIAGRAMID> -<FONT>Arial,8,,0,clWindowText,0</FONT> -<PEN>1,1,4,0</PEN> -<FROMRELATIVEX>5040</FROMRELATIVEX> -<FROMRELATIVEY>5000</FROMRELATIVEY> -<TORELATIVEX>5000</TORELATIVEX> -<TORELATIVEY>3611</TORELATIVEY> -<POINTS> -<POINT> -<X>861</X> -<Y>479</Y> -</POINT> -<POINT> -<X>861</X> -<Y>447</Y> -</POINT> -<POINT> -<X>861</X> -<Y>447</Y> -</POINT> -<POINT> -<X>861</X> -<Y>436</Y> -</POINT> -</POINTS> -</RELC> -<RELC> -<ID>125</ID> -<DIAGRAMID>1</DIAGRAMID> -<FONT>Arial,8,,0,clWindowText,0</FONT> -<PEN>1,1,4,0</PEN> -<FROMRELATIVEX>5000</FROMRELATIVEX> -<FROMRELATIVEY>952</FROMRELATIVEY> -<TORELATIVEX>5000</TORELATIVEX> -<TORELATIVEY>9444</TORELATIVEY> -<POINTS> -<POINT> -<X>733</X> -<Y>113</Y> -</POINT> -<POINT> -<X>578</X> -<Y>113</Y> -</POINT> -<POINT> -<X>578</X> -<Y>113</Y> -</POINT> -<POINT> -<X>434</X> -<Y>113</Y> -</POINT> -</POINTS> -</RELC> -<RELC> -<ID>138</ID> -<DIAGRAMID>1</DIAGRAMID> -<FONT>Arial,8,,0,clWindowText,0</FONT> -<PEN>1,1,4,0</PEN> -<FROMRELATIVEX>4973</FROMRELATIVEX> -<FROMRELATIVEY>5000</FROMRELATIVEY> -<TORELATIVEX>4973</TORELATIVEX> -<TORELATIVEY>5000</TORELATIVEY> -<POINTS> -<POINT> -<X>364</X> -<Y>573</Y> -</POINT> -<POINT> -<X>364</X> -<Y>585</Y> -</POINT> -<POINT> -<X>364</X> -<Y>585</Y> -</POINT> -<POINT> -<X>364</X> -<Y>627</Y> -</POINT> -</POINTS> -</RELC> -<RELC> -<ID>139</ID> -<DIAGRAMID>1</DIAGRAMID> -<FONT>Arial,8,,0,clWindowText,0</FONT> -<PEN>1,1,4,0</PEN> -<FROMRELATIVEX>929</FROMRELATIVEX> -<FROMRELATIVEY>4946</FROMRELATIVEY> -<TORELATIVEX>5000</TORELATIVEX> -<TORELATIVEY>4946</TORELATIVEY> -<POINTS> -<POINT> -<X>272</X> -<Y>674</Y> -</POINT> -<POINT> -<X>237</X> -<Y>674</Y> -</POINT> -<POINT> -<X>237</X> -<Y>674</Y> -</POINT> -<POINT> -<X>189</X> -<Y>674</Y> -</POINT> -</POINTS> -</RELC> -<RELC> -<ID>172</ID> -<DIAGRAMID>1</DIAGRAMID> -<FONT>Arial,8,,0,clWindowText,0</FONT> -<PEN>1,1,4,0</PEN> -<FROMRELATIVEX>5000</FROMRELATIVEX> -<FROMRELATIVEY>4194</FROMRELATIVEY> -<TORELATIVEX>5000</TORELATIVEX> -<TORELATIVEY>5000</TORELATIVEY> -<POINTS> -<POINT> -<X>458</X> -<Y>519</Y> -</POINT> -<POINT> -<X>469</X> -<Y>519</Y> -</POINT> -<POINT> -<X>469</X> -<Y>519</Y> -</POINT> -<POINT> -<X>504</X> -<Y>519</Y> -</POINT> -</POINTS> -</RELC> -<RELC> -<ID>174</ID> -<DIAGRAMID>1</DIAGRAMID> -<FONT>Arial,8,,0,clWindowText,0</FONT> -<PEN>1,1,4,0</PEN> -<FROMRELATIVEX>4633</FROMRELATIVEX> -<FROMRELATIVEY>5000</FROMRELATIVEY> -<TORELATIVEX>5000</TORELATIVEX> -<TORELATIVEY>5000</TORELATIVEY> -<POINTS> -<POINT> -<X>94</X> -<Y>627</Y> -</POINT> -<POINT> -<X>94</X> -<Y>585</Y> -</POINT> -<POINT> -<X>94</X> -<Y>585</Y> -</POINT> -<POINT> -<X>94</X> -<Y>573</Y> -</POINT> -</POINTS> -</RELC> -<RELC> -<ID>175</ID> -<DIAGRAMID>1</DIAGRAMID> -<FONT>Arial,8,,0,clWindowText,0</FONT> -<PEN>1,1,4,0</PEN> -<FROMRELATIVEX>5000</FROMRELATIVEX> -<FROMRELATIVEY>5000</FROMRELATIVEY> -<TORELATIVEX>4146</TORELATIVEX> -<TORELATIVEY>5000</TORELATIVEY> -<POINTS> -<POINT> -<X>80</X> -<Y>89</Y> -</POINT> -<POINT> -<X>80</X> -<Y>202</Y> -</POINT> -<POINT> -<X>80</X> -<Y>202</Y> -</POINT> -<POINT> -<X>80</X> -<Y>479</Y> -</POINT> -</POINTS> -</RELC> -</RELATIONSHIPCONNECTORS> -<SUBCATEGORYCONNECTORS> -</SUBCATEGORYCONNECTORS> -</CONTROLS> -</DIAGRAMS> -</VERSION><VERSION> -<VERSIONINFO> -<VERSIONNUMBER>1</VERSIONNUMBER> -<VERSIONLABEL>Version 2009-06-29</VERSIONLABEL> -<VERSIONDATE>2009-06-29 10:58</VERSIONDATE> -<VERSIONCOMMENTS></VERSIONCOMMENTS> -<VERSIONTYPE>DB</VERSIONTYPE> -<VERSIONTYPEDESC>Data dictionary only (no diagrams)</VERSIONTYPEDESC> -</VERSIONINFO> -<DATADICT> -<DBID>postgresql8</DBID> -<LASTID>46</LASTID> -<DDSETTINGS> -<PKCONNAMETEMPLATE>PK_%table%</PKCONNAMETEMPLATE> -<FKCONNAMETEMPLATE>%relname%</FKCONNAMETEMPLATE> -<CCONNAMETEMPLATE>CC_%table%_%column%</CCONNAMETEMPLATE> -<NOTNULLCONNAMETEMPLATE>NN_%column%</NOTNULLCONNAMETEMPLATE> -<DEFAULTCONNAMETEMPLATE>DEF_%table%_%column%</DEFAULTCONNAMETEMPLATE> -<TUCONNAMETEMPLATE>TUC_%table%_%counter%</TUCONNAMETEMPLATE> -<TCCONNAMETEMPLATE>TCC_%table%_%counter%</TCCONNAMETEMPLATE> -<RELNAMETEMPLATE>%parent%_%child%</RELNAMETEMPLATE> -<INDEXNAMETEMPLATE>IDX_%table%_%counter%</INDEXNAMETEMPLATE> -<DEFTABLEOPTIONS></DEFTABLEOPTIONS> -<DEFINDEXOPTIONS></DEFINDEXOPTIONS> -<BEGINDATABASESCRIPT></BEGINDATABASESCRIPT> -<ENDDATABASESCRIP></ENDDATABASESCRIP> -<BEGINALTERDATABASESCRIPT></BEGINALTERDATABASESCRIPT> -<ENDALTERDATABASESCRIP></ENDALTERDATABASESCRIP> -<BEGINDROPDATABASESCRIPT></BEGINDROPDATABASESCRIPT> -<ENDDROPDATABASESCRIP></ENDDROPDATABASESCRIP> -<GENDIALOGSELECTEDOBJECTS></GENDIALOGSELECTEDOBJECTS> -<GENTABLES>1</GENTABLES> -<GENTABLEOPTIONS>1</GENTABLEOPTIONS> -<GENCONSTRAINTS>1</GENCONSTRAINTS> -<GENINDEXES>1</GENINDEXES> -<GENTRIGGERS>1</GENTRIGGERS> -<GENVIEWS>1</GENVIEWS> -<GENPROCEDURES>1</GENPROCEDURES> -<GENSEQUENCES>1</GENSEQUENCES> -<GENRELATIONSHIPS>1</GENRELATIONSHIPS> -<GENBEGINENDTABLESCRIPTS>1</GENBEGINENDTABLESCRIPTS> -<GENBEGINENDDBSCRIPTS>1</GENBEGINENDDBSCRIPTS> -<GLOBALPREFIX></GLOBALPREFIX> -<AUTOCREATEINDEXESONKEYS>0</AUTOCREATEINDEXESONKEYS> -<CONVERTDOMAINS>0</CONVERTDOMAINS> -<IGNORECOMMENTS>0</IGNORECOMMENTS> -<USESCHEMANAMES>0</USESCHEMANAMES> -<UCONNAMETEMPLATE></UCONNAMETEMPLATE> -<SQLCREATEFILE>D:\User\felmer\dev-workspace\rtd_phosphonetx\source\sql\postgresql\001\schema-001.sql</SQLCREATEFILE> -<SQLDROPFILE>D:\User\felmer\dev-workspace\rtd_phosphonetx\targets\drop.sql</SQLDROPFILE> -</DDSETTINGS> -<DOMAINS> -<DOMAIN> -<NAME>BINARY_DATA</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>BYTEA</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>CHECKSUM</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>8</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>CODE</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>DESCRIPTION</NAME> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>2000</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>INTEGER_NUMBER</NAME> -<ID>7</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>INTEGER</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>REAL_NUMBER</NAME> -<ID>8</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>SEQUENCE</NAME> -<ID>9</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>TEXT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>SHORT_DESCRIPTION</NAME> -<ID>11</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>200</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>TECH_ID</NAME> -<ID>12</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -</DOMAINS> -<ENTITIES> -<ENT> -<NAME>ABUNDANCES_TYPES</NAME> -<ID>14</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>4</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_ABUNDANCES_TYPES</NAME> -<NAMETEMPLATE>PK_ABUNDANCES_TYPES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>CODE</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>5</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DESCRIPTION</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>11</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>200</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -</ATTRIBUTES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_ABUNDANCES_TYPES_1</NAME> -<NAMETEMPLATE>TUC_ABUNDANCES_TYPES_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>EXPERIMENTS</NAME> -<ID>16</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>3</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_EXPERIMENTS</NAME> -<NAMETEMPLATE>PK_EXPERIMENTS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PERM_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>5</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_EXPERIMENTS_1</NAME> -<NAMETEMPLATE>TUC_EXPERIMENTS_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>DATA_SETS</NAME> -<NAMETEMPLATE>IX_FK_DATA_SETS_EXPERIMENTS</NAMETEMPLATE> -<ID>17</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>5</ATTRLASTID> -<IDXLASTID>3</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_DATA_SETS</NAME> -<NAMETEMPLATE>PK_DATA_SETS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>EXPE_ID</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>SAMP_ID</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PERM_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>5</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<INDEXES> -<INDEX> -<NAME>IX_FK_DATA_SETS_EXPERIMENTS</NAME> -<NAMETEMPLATE>IX_FK_DATA_SETS_EXPERIMENTS</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>EXPE_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>4</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -<INDEX> -<NAME>IX_FK_DATA_SETS_SAMPLES</NAME> -<NAMETEMPLATE>IX_FK_DATA_SETS_SAMPLES</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>SAMP_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>5</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -</INDEXES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_DATA_SETS_1</NAME> -<NAMETEMPLATE>TUC_DATA_SETS_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>IDENTIFICATION_DATA</NAME> -<NAMETEMPLATE>IX_FK_IDENTIFICATION_DATA_SPECTRA</NAMETEMPLATE> -<ID>18</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>4</ATTRLASTID> -<IDXLASTID>2</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_IDENTIFICATION_DATA</NAME> -<NAMETEMPLATE>PK_IDENTIFICATION_DATA</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>SPEC_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -<ATTR> -<NAME>SPECTRA_COUNT</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>7</DOMAINID> -<DT> -<DTLISTNAME>INTEGER</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -</ATTRIBUTES> -<INDEXES> -<INDEX> -<NAME>IX_FK_IDENTIFICATION_DATA_SPECTRA</NAME> -<NAMETEMPLATE>IX_FK_IDENTIFICATION_DATA_SPECTRA</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>SPEC_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>3</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -</INDEXES> -</ENT> -<ENT> -<NAME>MODIFICATIONS</NAME> -<NAMETEMPLATE>IX_FK_MODIFICATIONS_PEPTIDES</NAMETEMPLATE> -<ID>19</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>6</ATTRLASTID> -<IDXLASTID>3</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_MODIFICATIONS</NAME> -<NAMETEMPLATE>PK_MODIFICATIONS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PEPT_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>MOTY_ID</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>POS</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>7</DOMAINID> -<DT> -<DTLISTNAME>INTEGER</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>MASS</NAME> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>6</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<INDEXES> -<INDEX> -<NAME>IX_FK_MODIFICATIONS_PEPTIDES</NAME> -<NAMETEMPLATE>IX_FK_MODIFICATIONS_PEPTIDES</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>PEPT_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>3</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -<INDEX> -<NAME>IX_FK_MODIFICATIONS_MODIFICATION_TYPES</NAME> -<NAMETEMPLATE>IX_FK_MODIFICATIONS_MODIFICATION_TYPES</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>MOTY_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>4</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -</INDEXES> -</ENT> -<ENT> -<NAME>MODIFICATION_TYPES</NAME> -<ID>20</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>6</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_MODIFICATION_TYPES</NAME> -<NAMETEMPLATE>PK_MODIFICATION_TYPES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>CODE</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>5</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DESCRIPTION</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>11</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>200</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -<ATTR> -<NAME>MASS</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -<ATTR> -<NAME>DELTA_MASS</NAME> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -</ATTRIBUTES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_MODIFICATION_TYPES_1</NAME> -<NAMETEMPLATE>TUC_MODIFICATION_TYPES_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>PEPTIDES</NAME> -<NAMETEMPLATE>IX_FK_PEPTIDES_ABUNDANCES</NAMETEMPLATE> -<ID>21</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>9</ATTRLASTID> -<IDXLASTID>5</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_PEPTIDES</NAME> -<NAMETEMPLATE>PK_PEPTIDES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PROT_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>SEQU_ID</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>ABTY_ID</NAME> -<ID>8</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -<ATTR> -<NAME>IDDA_ID</NAME> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -<ATTR> -<NAME>CHARGE</NAME> -<ID>7</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>7</DOMAINID> -<DT> -<DTLISTNAME>INTEGER</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>7</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>ABUNDANCE</NAME> -<ID>9</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -</ATTRIBUTES> -<INDEXES> -<INDEX> -<NAME>IX_FK_PEPTIDES_IDENTIFICATION_DATA</NAME> -<NAMETEMPLATE>IX_FK_PEPTIDES_IDENTIFICATION_DATA</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>IDDA_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>6</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -<INDEX> -<NAME>IX_FK_PEPTIDES_PROTEINS</NAME> -<NAMETEMPLATE>IX_FK_PEPTIDES_PROTEINS</NAMETEMPLATE> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>PROT_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>3</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -<INDEX> -<NAME>IX_FK_PEPTIDES_SEQUENCES</NAME> -<NAMETEMPLATE>IX_FK_PEPTIDES_SEQUENCES</NAMETEMPLATE> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>SEQU_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>4</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -</INDEXES> -</ENT> -<ENT> -<NAME>PROTEIN_STATISTICS</NAME> -<ID>22</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>2</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_PROTEIN_STATISTICS</NAME> -<NAMETEMPLATE>PK_PROTEIN_STATISTICS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -</ENT> -<ENT> -<NAME>PROTEINS</NAME> -<NAMETEMPLATE>IX_FK_PROTEINS_DATA_SETS</NAMETEMPLATE> -<ID>23</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>10</ATTRLASTID> -<IDXLASTID>5</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_PROTEINS</NAME> -<NAMETEMPLATE>PK_PROTEINS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DASE_ID</NAME> -<ID>10</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>10</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>SEQU_ID</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -<ATTR> -<NAME>ABTY_ID</NAME> -<ID>8</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -<ATTR> -<NAME>PRST_ID</NAME> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -<ATTR> -<NAME>DESCRIPTION</NAME> -<ID>7</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>6</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>2000</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>7</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>ABUNDANCE</NAME> -<ID>9</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -</ATTRIBUTES> -<INDEXES> -<INDEX> -<NAME>IX_FK_PROTEINS_SEQUENCES</NAME> -<NAMETEMPLATE>IX_FK_PROTEINS_SEQUENCES</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>SEQU_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>5</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -<INDEX> -<NAME>IX_FK_PROTEINS_PROTEIN_STATISTICS</NAME> -<NAMETEMPLATE>IX_FK_PROTEINS_PROTEIN_STATISTICS</NAMETEMPLATE> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>PRST_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>6</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -</INDEXES> -</ENT> -<ENT> -<NAME>SAMPLES</NAME> -<ID>24</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>4</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_SAMPLES</NAME> -<NAMETEMPLATE>PK_SAMPLES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PERM_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>5</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>EXPE_ID</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_SAMPLES_1</NAME> -<NAMETEMPLATE>TUC_SAMPLES_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>SEQUENCES</NAME> -<ID>25</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>4</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_SEQUENCES</NAME> -<NAMETEMPLATE>PK_SEQUENCES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>AMINO_ACID_SEQUENCE</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>9</DOMAINID> -<DT> -<DTLISTNAME>TEXT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>CHECKSUM</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>4</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>8</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -</ENT> -<ENT> -<NAME>SPECTRA</NAME> -<ID>26</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>3</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_SPECTRA</NAME> -<NAMETEMPLATE>PK_SPECTRA</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DATA</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>3</DOMAINID> -<DT> -<DTLISTNAME>BYTEA</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -</ENT> -</ENTITIES> -<SUBCATEGORIES> -</SUBCATEGORIES> -<TEXTAREAS> -</TEXTAREAS> -<GROUPBOXES> -</GROUPBOXES> -<STAMPS> -</STAMPS> -<SEQUENCES> -<SEQUENCE> -<NAME>SEQ</NAME> -<ID>10</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<INCREMENT>1</INCREMENT> -<SEED>0</SEED> -<MAX>NOMAXVALUE</MAX> -<MIN>NOMINVALUE</MIN> -<CACHE></CACHE> -<CACHECODE></CACHECODE> -<CYCLE></CYCLE> -<ORDER></ORDER> -</SEQUENCE> -</SEQUENCES> -<PROCEDURES> -</PROCEDURES> -<VIEWS> -</VIEWS> -<RELATIONSHIPS> -<REL> -<NAME>DA_EX_FK</NAME> -<NAMETEMPLATE>DA_EX_FK</NAMETEMPLATE> -<ID>29</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>16</PARENTOBJECTID> -<CHILDOBJECTID>17</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>DA_EX_FK</NAME> -<NAMETEMPLATE>DA_EX_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>4</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>DA_SA_FK</NAME> -<NAMETEMPLATE>DA_SA_FK</NAMETEMPLATE> -<ID>30</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>24</PARENTOBJECTID> -<CHILDOBJECTID>17</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>DA_SA_FK</NAME> -<NAMETEMPLATE>DA_SA_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>5</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>ID_SP_FK</NAME> -<NAMETEMPLATE>ID_SP_FK</NAMETEMPLATE> -<ID>31</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>26</PARENTOBJECTID> -<CHILDOBJECTID>18</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>0</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>ID_SP_FK</NAME> -<NAMETEMPLATE>ID_SP_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>3</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>MO_PE_FK</NAME> -<NAMETEMPLATE>MO_PE_FK</NAMETEMPLATE> -<ID>32</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>21</PARENTOBJECTID> -<CHILDOBJECTID>19</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>MO_PE_FK</NAME> -<NAMETEMPLATE>MO_PE_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>3</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>MO_MT_FK</NAME> -<NAMETEMPLATE>MO_MT_FK</NAMETEMPLATE> -<ID>33</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>20</PARENTOBJECTID> -<CHILDOBJECTID>19</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>MO_MT_FK</NAME> -<NAMETEMPLATE>MO_MT_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>4</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>PE_ID_FK</NAME> -<NAMETEMPLATE>PE_ID_FK</NAMETEMPLATE> -<ID>35</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>18</PARENTOBJECTID> -<CHILDOBJECTID>21</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>0</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>PE_ID_FK</NAME> -<NAMETEMPLATE>PE_ID_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>6</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>6</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>PE_PR_FK</NAME> -<NAMETEMPLATE>PE_PR_FK</NAMETEMPLATE> -<ID>36</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>23</PARENTOBJECTID> -<CHILDOBJECTID>21</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>PE_PR_FK</NAME> -<NAMETEMPLATE>PE_PR_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>3</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>PE_SE_FK</NAME> -<NAMETEMPLATE>PE_SE_FK</NAMETEMPLATE> -<ID>37</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>25</PARENTOBJECTID> -<CHILDOBJECTID>21</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>PE_SE_FK</NAME> -<NAMETEMPLATE>PE_SE_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>4</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>PR_SE_FK</NAME> -<NAMETEMPLATE>PR_SE_FK</NAMETEMPLATE> -<ID>39</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>25</PARENTOBJECTID> -<CHILDOBJECTID>23</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>0</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>PR_SE_FK</NAME> -<NAMETEMPLATE>PR_SE_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>5</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>PR_PS_FK</NAME> -<NAMETEMPLATE>PR_PS_FK</NAMETEMPLATE> -<ID>41</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>22</PARENTOBJECTID> -<CHILDOBJECTID>23</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>0</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>PR_PS_FK</NAME> -<NAMETEMPLATE>PR_PS_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>6</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>6</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>ABUNDANCES_TYPES_PROTEINS</NAME> -<NAMETEMPLATE>ABUNDANCES_TYPES_PROTEINS</NAMETEMPLATE> -<ID>43</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>14</PARENTOBJECTID> -<CHILDOBJECTID>23</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>0</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>ABUNDANCES_TYPES_PROTEINS</NAME> -<NAMETEMPLATE>ABUNDANCES_TYPES_PROTEINS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>8</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>8</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>ABUNDANCES_TYPES_PEPTIDES</NAME> -<NAMETEMPLATE>ABUNDANCES_TYPES_PEPTIDES</NAMETEMPLATE> -<ID>44</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>14</PARENTOBJECTID> -<CHILDOBJECTID>21</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>0</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>ABUNDANCES_TYPES_PEPTIDES</NAME> -<NAMETEMPLATE>ABUNDANCES_TYPES_PEPTIDES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>8</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>8</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>DATA_SETS_PROTEINS</NAME> -<NAMETEMPLATE>DATA_SETS_PROTEINS</NAMETEMPLATE> -<ID>46</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>17</PARENTOBJECTID> -<CHILDOBJECTID>23</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>DATA_SETS_PROTEINS</NAME> -<NAMETEMPLATE>DATA_SETS_PROTEINS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>10</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>10</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -</RELATIONSHIPS> -<SUBCATEGORYCONNECTIONS> -</SUBCATEGORYCONNECTIONS> -</DATADICT> -</VERSION> -<VERSION> -<VERSIONINFO> -<VERSIONNUMBER>2</VERSIONNUMBER> -<VERSIONLABEL>Version 2009-06-29 1</VERSIONLABEL> -<VERSIONDATE>2009-06-29 11:02</VERSIONDATE> -<VERSIONCOMMENTS></VERSIONCOMMENTS> -<VERSIONTYPE>DB</VERSIONTYPE> -<VERSIONTYPEDESC>Data dictionary only (no diagrams)</VERSIONTYPEDESC> -</VERSIONINFO> -<DATADICT> -<DBID>postgresql8</DBID> -<LASTID>46</LASTID> -<DDSETTINGS> -<PKCONNAMETEMPLATE>PK_%table%</PKCONNAMETEMPLATE> -<FKCONNAMETEMPLATE>%relname%</FKCONNAMETEMPLATE> -<CCONNAMETEMPLATE>CC_%table%_%column%</CCONNAMETEMPLATE> -<NOTNULLCONNAMETEMPLATE>NN_%column%</NOTNULLCONNAMETEMPLATE> -<DEFAULTCONNAMETEMPLATE>DEF_%table%_%column%</DEFAULTCONNAMETEMPLATE> -<TUCONNAMETEMPLATE>TUC_%table%_%counter%</TUCONNAMETEMPLATE> -<TCCONNAMETEMPLATE>TCC_%table%_%counter%</TCCONNAMETEMPLATE> -<RELNAMETEMPLATE>%parent%_%child%</RELNAMETEMPLATE> -<INDEXNAMETEMPLATE>IDX_%table%_%counter%</INDEXNAMETEMPLATE> -<DEFTABLEOPTIONS></DEFTABLEOPTIONS> -<DEFINDEXOPTIONS></DEFINDEXOPTIONS> -<BEGINDATABASESCRIPT></BEGINDATABASESCRIPT> -<ENDDATABASESCRIP></ENDDATABASESCRIP> -<BEGINALTERDATABASESCRIPT></BEGINALTERDATABASESCRIPT> -<ENDALTERDATABASESCRIP></ENDALTERDATABASESCRIP> -<BEGINDROPDATABASESCRIPT></BEGINDROPDATABASESCRIPT> -<ENDDROPDATABASESCRIP></ENDDROPDATABASESCRIP> -<GENDIALOGSELECTEDOBJECTS></GENDIALOGSELECTEDOBJECTS> -<GENTABLES>1</GENTABLES> -<GENTABLEOPTIONS>1</GENTABLEOPTIONS> -<GENCONSTRAINTS>1</GENCONSTRAINTS> -<GENINDEXES>1</GENINDEXES> -<GENTRIGGERS>1</GENTRIGGERS> -<GENVIEWS>1</GENVIEWS> -<GENPROCEDURES>1</GENPROCEDURES> -<GENSEQUENCES>1</GENSEQUENCES> -<GENRELATIONSHIPS>1</GENRELATIONSHIPS> -<GENBEGINENDTABLESCRIPTS>1</GENBEGINENDTABLESCRIPTS> -<GENBEGINENDDBSCRIPTS>1</GENBEGINENDDBSCRIPTS> -<GLOBALPREFIX></GLOBALPREFIX> -<AUTOCREATEINDEXESONKEYS>0</AUTOCREATEINDEXESONKEYS> -<CONVERTDOMAINS>0</CONVERTDOMAINS> -<IGNORECOMMENTS>0</IGNORECOMMENTS> -<USESCHEMANAMES>0</USESCHEMANAMES> -<UCONNAMETEMPLATE></UCONNAMETEMPLATE> -<SQLCREATEFILE>D:\User\felmer\dev-workspace\rtd_phosphonetx\source\sql\postgresql\001\schema-001.sql</SQLCREATEFILE> -<SQLDROPFILE>D:\User\felmer\dev-workspace\rtd_phosphonetx\targets\drop.sql</SQLDROPFILE> -</DDSETTINGS> -<DOMAINS> -<DOMAIN> -<NAME>BINARY_DATA</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>BYTEA</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>CHECKSUM</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>8</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>CODE</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>DESCRIPTION</NAME> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>2000</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>INTEGER_NUMBER</NAME> -<ID>7</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>INTEGER</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>REAL_NUMBER</NAME> -<ID>8</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>SEQUENCE</NAME> -<ID>9</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>TEXT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>SHORT_DESCRIPTION</NAME> -<ID>11</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>200</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>TECH_ID</NAME> -<ID>12</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -</DOMAINS> -<ENTITIES> -<ENT> -<NAME>ABUNDANCES_TYPES</NAME> -<ID>14</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>4</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_ABUNDANCES_TYPES</NAME> -<NAMETEMPLATE>PK_ABUNDANCES_TYPES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>CODE</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>5</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DESCRIPTION</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>11</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>200</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -</ATTRIBUTES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_ABUNDANCES_TYPES_1</NAME> -<NAMETEMPLATE>TUC_ABUNDANCES_TYPES_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>EXPERIMENTS</NAME> -<ID>16</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>3</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_EXPERIMENTS</NAME> -<NAMETEMPLATE>PK_EXPERIMENTS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PERM_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>5</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_EXPERIMENTS_1</NAME> -<NAMETEMPLATE>TUC_EXPERIMENTS_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>DATA_SETS</NAME> -<NAMETEMPLATE>IX_FK_DATA_SETS_EXPERIMENTS</NAMETEMPLATE> -<ID>17</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>5</ATTRLASTID> -<IDXLASTID>3</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_DATA_SETS</NAME> -<NAMETEMPLATE>PK_DATA_SETS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>EXPE_ID</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>SAMP_ID</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PERM_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>5</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<INDEXES> -<INDEX> -<NAME>IX_FK_DATA_SETS_EXPERIMENTS</NAME> -<NAMETEMPLATE>IX_FK_DATA_SETS_EXPERIMENTS</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>EXPE_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>4</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -<INDEX> -<NAME>IX_FK_DATA_SETS_SAMPLES</NAME> -<NAMETEMPLATE>IX_FK_DATA_SETS_SAMPLES</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>SAMP_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>5</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -</INDEXES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_DATA_SETS_1</NAME> -<NAMETEMPLATE>TUC_DATA_SETS_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>IDENTIFICATION_DATA</NAME> -<NAMETEMPLATE>IX_FK_IDENTIFICATION_DATA_SPECTRA</NAMETEMPLATE> -<ID>18</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>4</ATTRLASTID> -<IDXLASTID>2</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_IDENTIFICATION_DATA</NAME> -<NAMETEMPLATE>PK_IDENTIFICATION_DATA</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>SPEC_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -<ATTR> -<NAME>SPECTRA_COUNT</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>7</DOMAINID> -<DT> -<DTLISTNAME>INTEGER</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -</ATTRIBUTES> -<INDEXES> -<INDEX> -<NAME>IX_FK_IDENTIFICATION_DATA_SPECTRA</NAME> -<NAMETEMPLATE>IX_FK_IDENTIFICATION_DATA_SPECTRA</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>SPEC_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>3</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -</INDEXES> -</ENT> -<ENT> -<NAME>MODIFICATIONS</NAME> -<NAMETEMPLATE>IX_FK_MODIFICATIONS_PEPTIDES</NAMETEMPLATE> -<ID>19</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>6</ATTRLASTID> -<IDXLASTID>3</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_MODIFICATIONS</NAME> -<NAMETEMPLATE>PK_MODIFICATIONS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PEPT_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>MOTY_ID</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>POS</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>7</DOMAINID> -<DT> -<DTLISTNAME>INTEGER</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>MASS</NAME> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>6</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<INDEXES> -<INDEX> -<NAME>IX_FK_MODIFICATIONS_PEPTIDES</NAME> -<NAMETEMPLATE>IX_FK_MODIFICATIONS_PEPTIDES</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>PEPT_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>3</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -<INDEX> -<NAME>IX_FK_MODIFICATIONS_MODIFICATION_TYPES</NAME> -<NAMETEMPLATE>IX_FK_MODIFICATIONS_MODIFICATION_TYPES</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>MOTY_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>4</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -</INDEXES> -</ENT> -<ENT> -<NAME>MODIFICATION_TYPES</NAME> -<ID>20</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>6</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_MODIFICATION_TYPES</NAME> -<NAMETEMPLATE>PK_MODIFICATION_TYPES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>CODE</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>5</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DESCRIPTION</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>11</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>200</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -<ATTR> -<NAME>MASS</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -<ATTR> -<NAME>DELTA_MASS</NAME> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -</ATTRIBUTES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_MODIFICATION_TYPES_1</NAME> -<NAMETEMPLATE>TUC_MODIFICATION_TYPES_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>PEPTIDES</NAME> -<NAMETEMPLATE>IX_FK_PEPTIDES_ABUNDANCES</NAMETEMPLATE> -<ID>21</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>9</ATTRLASTID> -<IDXLASTID>5</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_PEPTIDES</NAME> -<NAMETEMPLATE>PK_PEPTIDES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PROT_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>SEQU_ID</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>ABTY_ID</NAME> -<ID>8</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -<ATTR> -<NAME>IDDA_ID</NAME> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -<ATTR> -<NAME>CHARGE</NAME> -<ID>7</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>7</DOMAINID> -<DT> -<DTLISTNAME>INTEGER</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>7</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>ABUNDANCE</NAME> -<ID>9</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -</ATTRIBUTES> -<INDEXES> -<INDEX> -<NAME>IX_FK_PEPTIDES_IDENTIFICATION_DATA</NAME> -<NAMETEMPLATE>IX_FK_PEPTIDES_IDENTIFICATION_DATA</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>IDDA_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>6</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -<INDEX> -<NAME>IX_FK_PEPTIDES_PROTEINS</NAME> -<NAMETEMPLATE>IX_FK_PEPTIDES_PROTEINS</NAMETEMPLATE> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>PROT_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>3</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -<INDEX> -<NAME>IX_FK_PEPTIDES_SEQUENCES</NAME> -<NAMETEMPLATE>IX_FK_PEPTIDES_SEQUENCES</NAMETEMPLATE> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>SEQU_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>4</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -</INDEXES> -</ENT> -<ENT> -<NAME>PROTEIN_STATISTICS</NAME> -<ID>22</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>2</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_PROTEIN_STATISTICS</NAME> -<NAMETEMPLATE>PK_PROTEIN_STATISTICS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -</ENT> -<ENT> -<NAME>PROTEINS</NAME> -<NAMETEMPLATE>IX_FK_PROTEINS_DATA_SETS</NAMETEMPLATE> -<ID>23</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>10</ATTRLASTID> -<IDXLASTID>7</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_PROTEINS</NAME> -<NAMETEMPLATE>PK_PROTEINS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DASE_ID</NAME> -<ID>10</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>10</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>SEQU_ID</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -<ATTR> -<NAME>ABTY_ID</NAME> -<ID>8</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -<ATTR> -<NAME>PRST_ID</NAME> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -<ATTR> -<NAME>DESCRIPTION</NAME> -<ID>7</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>6</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>2000</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>7</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>ABUNDANCE</NAME> -<ID>9</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -</ATTRIBUTES> -<INDEXES> -<INDEX> -<NAME>IX_FK_PROTEINS_SEQUENCES</NAME> -<NAMETEMPLATE>IX_FK_PROTEINS_SEQUENCES</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>SEQU_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>5</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -<INDEX> -<NAME>IX_FK_PROTEINS_PROTEIN_STATISTICS</NAME> -<NAMETEMPLATE>IX_FK_PROTEINS_PROTEIN_STATISTICS</NAMETEMPLATE> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>PRST_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>6</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -<INDEX> -<NAME>IDX_PROTEINS_3</NAME> -<NAMETEMPLATE>IDX_PROTEINS_3</NAMETEMPLATE> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>DASE_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>10</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -</INDEXES> -</ENT> -<ENT> -<NAME>SAMPLES</NAME> -<ID>24</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>4</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_SAMPLES</NAME> -<NAMETEMPLATE>PK_SAMPLES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PERM_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>5</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>EXPE_ID</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_SAMPLES_1</NAME> -<NAMETEMPLATE>TUC_SAMPLES_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>SEQUENCES</NAME> -<ID>25</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>4</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_SEQUENCES</NAME> -<NAMETEMPLATE>PK_SEQUENCES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>AMINO_ACID_SEQUENCE</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>9</DOMAINID> -<DT> -<DTLISTNAME>TEXT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>CHECKSUM</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>4</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>8</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -</ENT> -<ENT> -<NAME>SPECTRA</NAME> -<ID>26</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>3</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_SPECTRA</NAME> -<NAMETEMPLATE>PK_SPECTRA</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DATA</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>3</DOMAINID> -<DT> -<DTLISTNAME>BYTEA</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -</ENT> -</ENTITIES> -<SUBCATEGORIES> -</SUBCATEGORIES> -<TEXTAREAS> -</TEXTAREAS> -<GROUPBOXES> -</GROUPBOXES> -<STAMPS> -</STAMPS> -<SEQUENCES> -</SEQUENCES> -<PROCEDURES> -</PROCEDURES> -<VIEWS> -</VIEWS> -<RELATIONSHIPS> -<REL> -<NAME>DA_EX_FK</NAME> -<NAMETEMPLATE>DA_EX_FK</NAMETEMPLATE> -<ID>29</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>16</PARENTOBJECTID> -<CHILDOBJECTID>17</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>DA_EX_FK</NAME> -<NAMETEMPLATE>DA_EX_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>4</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>DA_SA_FK</NAME> -<NAMETEMPLATE>DA_SA_FK</NAMETEMPLATE> -<ID>30</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>24</PARENTOBJECTID> -<CHILDOBJECTID>17</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>DA_SA_FK</NAME> -<NAMETEMPLATE>DA_SA_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>5</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>ID_SP_FK</NAME> -<NAMETEMPLATE>ID_SP_FK</NAMETEMPLATE> -<ID>31</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>26</PARENTOBJECTID> -<CHILDOBJECTID>18</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>0</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>ID_SP_FK</NAME> -<NAMETEMPLATE>ID_SP_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>3</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>MO_PE_FK</NAME> -<NAMETEMPLATE>MO_PE_FK</NAMETEMPLATE> -<ID>32</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>21</PARENTOBJECTID> -<CHILDOBJECTID>19</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>MO_PE_FK</NAME> -<NAMETEMPLATE>MO_PE_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>3</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>MO_MT_FK</NAME> -<NAMETEMPLATE>MO_MT_FK</NAMETEMPLATE> -<ID>33</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>20</PARENTOBJECTID> -<CHILDOBJECTID>19</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>MO_MT_FK</NAME> -<NAMETEMPLATE>MO_MT_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>4</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>PE_ID_FK</NAME> -<NAMETEMPLATE>PE_ID_FK</NAMETEMPLATE> -<ID>35</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>18</PARENTOBJECTID> -<CHILDOBJECTID>21</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>0</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>PE_ID_FK</NAME> -<NAMETEMPLATE>PE_ID_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>6</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>6</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>PE_PR_FK</NAME> -<NAMETEMPLATE>PE_PR_FK</NAMETEMPLATE> -<ID>36</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>23</PARENTOBJECTID> -<CHILDOBJECTID>21</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>PE_PR_FK</NAME> -<NAMETEMPLATE>PE_PR_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>3</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>PE_SE_FK</NAME> -<NAMETEMPLATE>PE_SE_FK</NAMETEMPLATE> -<ID>37</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>25</PARENTOBJECTID> -<CHILDOBJECTID>21</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>PE_SE_FK</NAME> -<NAMETEMPLATE>PE_SE_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>4</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>PR_SE_FK</NAME> -<NAMETEMPLATE>PR_SE_FK</NAMETEMPLATE> -<ID>39</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>25</PARENTOBJECTID> -<CHILDOBJECTID>23</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>0</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>PR_SE_FK</NAME> -<NAMETEMPLATE>PR_SE_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>5</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>PR_PS_FK</NAME> -<NAMETEMPLATE>PR_PS_FK</NAMETEMPLATE> -<ID>41</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>22</PARENTOBJECTID> -<CHILDOBJECTID>23</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>0</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>PR_PS_FK</NAME> -<NAMETEMPLATE>PR_PS_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>6</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>6</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>ABUNDANCES_TYPES_PROTEINS</NAME> -<NAMETEMPLATE>ABUNDANCES_TYPES_PROTEINS</NAMETEMPLATE> -<ID>43</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>14</PARENTOBJECTID> -<CHILDOBJECTID>23</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>0</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>ABUNDANCES_TYPES_PROTEINS</NAME> -<NAMETEMPLATE>ABUNDANCES_TYPES_PROTEINS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>8</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>8</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>ABUNDANCES_TYPES_PEPTIDES</NAME> -<NAMETEMPLATE>ABUNDANCES_TYPES_PEPTIDES</NAMETEMPLATE> -<ID>44</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>14</PARENTOBJECTID> -<CHILDOBJECTID>21</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>0</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>ABUNDANCES_TYPES_PEPTIDES</NAME> -<NAMETEMPLATE>ABUNDANCES_TYPES_PEPTIDES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>8</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>8</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>DATA_SETS_PROTEINS</NAME> -<NAMETEMPLATE>DATA_SETS_PROTEINS</NAMETEMPLATE> -<ID>46</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>17</PARENTOBJECTID> -<CHILDOBJECTID>23</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>DATA_SETS_PROTEINS</NAME> -<NAMETEMPLATE>DATA_SETS_PROTEINS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>10</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>10</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -</RELATIONSHIPS> -<SUBCATEGORYCONNECTIONS> -</SUBCATEGORYCONNECTIONS> -</DATADICT> -</VERSION> -<VERSION> -<VERSIONINFO> -<VERSIONNUMBER>3</VERSIONNUMBER> -<VERSIONLABEL>Version 2009-06-29 2</VERSIONLABEL> -<VERSIONDATE>2009-06-29 12:29</VERSIONDATE> -<VERSIONCOMMENTS></VERSIONCOMMENTS> -<VERSIONTYPE>DB</VERSIONTYPE> -<VERSIONTYPEDESC>Data dictionary only (no diagrams)</VERSIONTYPEDESC> -</VERSIONINFO> -<DATADICT> -<DBID>postgresql8</DBID> -<LASTID>48</LASTID> -<DDSETTINGS> -<PKCONNAMETEMPLATE>PK_%table%</PKCONNAMETEMPLATE> -<FKCONNAMETEMPLATE>%relname%</FKCONNAMETEMPLATE> -<CCONNAMETEMPLATE>CC_%table%_%column%</CCONNAMETEMPLATE> -<NOTNULLCONNAMETEMPLATE>NN_%column%</NOTNULLCONNAMETEMPLATE> -<DEFAULTCONNAMETEMPLATE>DEF_%table%_%column%</DEFAULTCONNAMETEMPLATE> -<TUCONNAMETEMPLATE>TUC_%table%_%counter%</TUCONNAMETEMPLATE> -<TCCONNAMETEMPLATE>TCC_%table%_%counter%</TCCONNAMETEMPLATE> -<RELNAMETEMPLATE>%parent%_%child%</RELNAMETEMPLATE> -<INDEXNAMETEMPLATE>IDX_%table%_%counter%</INDEXNAMETEMPLATE> -<DEFTABLEOPTIONS></DEFTABLEOPTIONS> -<DEFINDEXOPTIONS></DEFINDEXOPTIONS> -<BEGINDATABASESCRIPT></BEGINDATABASESCRIPT> -<ENDDATABASESCRIP></ENDDATABASESCRIP> -<BEGINALTERDATABASESCRIPT></BEGINALTERDATABASESCRIPT> -<ENDALTERDATABASESCRIP></ENDALTERDATABASESCRIP> -<BEGINDROPDATABASESCRIPT></BEGINDROPDATABASESCRIPT> -<ENDDROPDATABASESCRIP></ENDDROPDATABASESCRIP> -<GENDIALOGSELECTEDOBJECTS></GENDIALOGSELECTEDOBJECTS> -<GENTABLES>1</GENTABLES> -<GENTABLEOPTIONS>1</GENTABLEOPTIONS> -<GENCONSTRAINTS>1</GENCONSTRAINTS> -<GENINDEXES>1</GENINDEXES> -<GENTRIGGERS>1</GENTRIGGERS> -<GENVIEWS>1</GENVIEWS> -<GENPROCEDURES>1</GENPROCEDURES> -<GENSEQUENCES>1</GENSEQUENCES> -<GENRELATIONSHIPS>1</GENRELATIONSHIPS> -<GENBEGINENDTABLESCRIPTS>1</GENBEGINENDTABLESCRIPTS> -<GENBEGINENDDBSCRIPTS>1</GENBEGINENDDBSCRIPTS> -<GLOBALPREFIX></GLOBALPREFIX> -<AUTOCREATEINDEXESONKEYS>0</AUTOCREATEINDEXESONKEYS> -<CONVERTDOMAINS>0</CONVERTDOMAINS> -<IGNORECOMMENTS>0</IGNORECOMMENTS> -<USESCHEMANAMES>0</USESCHEMANAMES> -<UCONNAMETEMPLATE></UCONNAMETEMPLATE> -<SQLCREATEFILE>D:\User\felmer\dev-workspace\rtd_phosphonetx\source\sql\postgresql\001\schema-001.sql</SQLCREATEFILE> -<SQLDROPFILE>D:\User\felmer\dev-workspace\rtd_phosphonetx\targets\drop.sql</SQLDROPFILE> -</DDSETTINGS> -<DOMAINS> -<DOMAIN> -<NAME>BINARY_DATA</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>BYTEA</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>CHECKSUM</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>8</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>CODE</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>DESCRIPTION</NAME> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>2000</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>INTEGER_NUMBER</NAME> -<ID>7</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>INTEGER</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>REAL_NUMBER</NAME> -<ID>8</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>SEQUENCE</NAME> -<ID>9</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>TEXT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>SHORT_DESCRIPTION</NAME> -<ID>11</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>200</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>TECH_ID</NAME> -<ID>12</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -</DOMAINS> -<ENTITIES> -<ENT> -<NAME>ABUNDANCES_TYPES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>14</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>4</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_ABUNDANCES_TYPES</NAME> -<NAMETEMPLATE>PK_ABUNDANCES_TYPES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>CODE</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>5</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DESCRIPTION</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>11</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>200</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -</ATTRIBUTES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_ABUNDANCES_TYPES_1</NAME> -<NAMETEMPLATE>TUC_ABUNDANCES_TYPES_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>EXPERIMENTS</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>16</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>3</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_EXPERIMENTS</NAME> -<NAMETEMPLATE>PK_EXPERIMENTS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PERM_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>5</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_EXPERIMENTS_1</NAME> -<NAMETEMPLATE>TUC_EXPERIMENTS_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>DATA_SETS</NAME> -<NAMETEMPLATE>IX_FK_DATA_SETS_EXPERIMENTS</NAMETEMPLATE> -<ID>17</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>5</ATTRLASTID> -<IDXLASTID>3</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_DATA_SETS</NAME> -<NAMETEMPLATE>PK_DATA_SETS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>EXPE_ID</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>SAMP_ID</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PERM_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>5</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<INDEXES> -<INDEX> -<NAME>IX_FK_DATA_SETS_EXPERIMENTS</NAME> -<NAMETEMPLATE>IX_FK_DATA_SETS_EXPERIMENTS</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>EXPE_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>4</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -<INDEX> -<NAME>IX_FK_DATA_SETS_SAMPLES</NAME> -<NAMETEMPLATE>IX_FK_DATA_SETS_SAMPLES</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>SAMP_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>5</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -</INDEXES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_DATA_SETS_1</NAME> -<NAMETEMPLATE>TUC_DATA_SETS_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>IDENTIFICATION_DATA</NAME> -<NAMETEMPLATE>IX_FK_IDENTIFICATION_DATA_SPECTRA</NAMETEMPLATE> -<ID>18</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>4</ATTRLASTID> -<IDXLASTID>2</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_IDENTIFICATION_DATA</NAME> -<NAMETEMPLATE>PK_IDENTIFICATION_DATA</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>SPEC_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -<ATTR> -<NAME>SPECTRA_COUNT</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>7</DOMAINID> -<DT> -<DTLISTNAME>INTEGER</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -</ATTRIBUTES> -<INDEXES> -<INDEX> -<NAME>IX_FK_IDENTIFICATION_DATA_SPECTRA</NAME> -<NAMETEMPLATE>IX_FK_IDENTIFICATION_DATA_SPECTRA</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>SPEC_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>3</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -</INDEXES> -</ENT> -<ENT> -<NAME>MODIFICATIONS</NAME> -<NAMETEMPLATE>IX_FK_MODIFICATIONS_PEPTIDES</NAMETEMPLATE> -<ID>19</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>6</ATTRLASTID> -<IDXLASTID>3</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_MODIFICATIONS</NAME> -<NAMETEMPLATE>PK_MODIFICATIONS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PEPT_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>MOTY_ID</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>POS</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>7</DOMAINID> -<DT> -<DTLISTNAME>INTEGER</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>MASS</NAME> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>6</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<INDEXES> -<INDEX> -<NAME>IX_FK_MODIFICATIONS_PEPTIDES</NAME> -<NAMETEMPLATE>IX_FK_MODIFICATIONS_PEPTIDES</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>PEPT_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>3</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -<INDEX> -<NAME>IX_FK_MODIFICATIONS_MODIFICATION_TYPES</NAME> -<NAMETEMPLATE>IX_FK_MODIFICATIONS_MODIFICATION_TYPES</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>MOTY_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>4</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -</INDEXES> -</ENT> -<ENT> -<NAME>MODIFICATION_TYPES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>20</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>6</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_MODIFICATION_TYPES</NAME> -<NAMETEMPLATE>PK_MODIFICATION_TYPES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>CODE</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>5</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DESCRIPTION</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>11</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>200</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -<ATTR> -<NAME>MASS</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -<ATTR> -<NAME>DELTA_MASS</NAME> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -</ATTRIBUTES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_MODIFICATION_TYPES_1</NAME> -<NAMETEMPLATE>TUC_MODIFICATION_TYPES_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>PEPTIDES</NAME> -<NAMETEMPLATE>IX_FK_PEPTIDES_ABUNDANCES</NAMETEMPLATE> -<ID>21</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>9</ATTRLASTID> -<IDXLASTID>5</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_PEPTIDES</NAME> -<NAMETEMPLATE>PK_PEPTIDES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PROT_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>SEQU_ID</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>ABTY_ID</NAME> -<ID>8</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -<ATTR> -<NAME>IDDA_ID</NAME> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -<ATTR> -<NAME>CHARGE</NAME> -<ID>7</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>7</DOMAINID> -<DT> -<DTLISTNAME>INTEGER</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>7</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>ABUNDANCE</NAME> -<ID>9</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -</ATTRIBUTES> -<INDEXES> -<INDEX> -<NAME>IX_FK_PEPTIDES_IDENTIFICATION_DATA</NAME> -<NAMETEMPLATE>IX_FK_PEPTIDES_IDENTIFICATION_DATA</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>IDDA_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>6</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -<INDEX> -<NAME>IX_FK_PEPTIDES_PROTEINS</NAME> -<NAMETEMPLATE>IX_FK_PEPTIDES_PROTEINS</NAMETEMPLATE> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>PROT_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>3</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -<INDEX> -<NAME>IX_FK_PEPTIDES_SEQUENCES</NAME> -<NAMETEMPLATE>IX_FK_PEPTIDES_SEQUENCES</NAMETEMPLATE> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>SEQU_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>4</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -</INDEXES> -</ENT> -<ENT> -<NAME>PROTEIN_STATISTICS</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>22</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>2</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_PROTEIN_STATISTICS</NAME> -<NAMETEMPLATE>PK_PROTEIN_STATISTICS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -</ENT> -<ENT> -<NAME>PROTEINS</NAME> -<NAMETEMPLATE>IX_FK_PROTEINS_DATA_SETS</NAMETEMPLATE> -<ID>23</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>10</ATTRLASTID> -<IDXLASTID>7</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_PROTEINS</NAME> -<NAMETEMPLATE>PK_PROTEINS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DASE_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>10</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>10</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>SEQU_ID</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -<ATTR> -<NAME>ABTY_ID</NAME> -<ID>8</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -<ATTR> -<NAME>PRST_ID</NAME> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -<ATTR> -<NAME>ABUNDANCE</NAME> -<ID>9</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -</ATTRIBUTES> -<INDEXES> -<INDEX> -<NAME>IX_FK_PROTEINS_SEQUENCES</NAME> -<NAMETEMPLATE>IX_FK_PROTEINS_SEQUENCES</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>SEQU_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>5</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -<INDEX> -<NAME>IX_FK_PROTEINS_PROTEIN_STATISTICS</NAME> -<NAMETEMPLATE>IX_FK_PROTEINS_PROTEIN_STATISTICS</NAMETEMPLATE> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>PRST_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>6</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -<INDEX> -<NAME>IDX_PROTEINS_3</NAME> -<NAMETEMPLATE>IDX_PROTEINS_3</NAMETEMPLATE> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>DASE_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>10</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -</INDEXES> -</ENT> -<ENT> -<NAME>SAMPLES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>24</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>4</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_SAMPLES</NAME> -<NAMETEMPLATE>PK_SAMPLES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PERM_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>5</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>EXPE_ID</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_SAMPLES_1</NAME> -<NAMETEMPLATE>TUC_SAMPLES_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>SEQUENCES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>25</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>4</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_SEQUENCES</NAME> -<NAMETEMPLATE>PK_SEQUENCES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>AMINO_ACID_SEQUENCE</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>9</DOMAINID> -<DT> -<DTLISTNAME>TEXT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>CHECKSUM</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>4</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>8</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -</ENT> -<ENT> -<NAME>SPECTRA</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>26</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>3</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_SPECTRA</NAME> -<NAMETEMPLATE>PK_SPECTRA</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DATA</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>3</DOMAINID> -<DT> -<DTLISTNAME>BYTEA</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -</ENT> -<ENT> -<NAME>IDENTIFIED_PROTEINS</NAME> -<ID>47</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>4</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_IDENTIFIED_PROTEINS</NAME> -<NAMETEMPLATE>PK_IDENTIFIED_PROTEINS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PROT_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DESCRIPTION</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>6</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>2000</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -</ENT> -</ENTITIES> -<SUBCATEGORIES> -</SUBCATEGORIES> -<TEXTAREAS> -</TEXTAREAS> -<GROUPBOXES> -</GROUPBOXES> -<STAMPS> -</STAMPS> -<SEQUENCES> -</SEQUENCES> -<PROCEDURES> -</PROCEDURES> -<VIEWS> -</VIEWS> -<RELATIONSHIPS> -<REL> -<NAME>DA_EX_FK</NAME> -<NAMETEMPLATE>DA_EX_FK</NAMETEMPLATE> -<ID>29</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>16</PARENTOBJECTID> -<CHILDOBJECTID>17</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>DA_EX_FK</NAME> -<NAMETEMPLATE>DA_EX_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>4</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>DA_SA_FK</NAME> -<NAMETEMPLATE>DA_SA_FK</NAMETEMPLATE> -<ID>30</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>24</PARENTOBJECTID> -<CHILDOBJECTID>17</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>DA_SA_FK</NAME> -<NAMETEMPLATE>DA_SA_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>5</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>ID_SP_FK</NAME> -<NAMETEMPLATE>ID_SP_FK</NAMETEMPLATE> -<ID>31</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>26</PARENTOBJECTID> -<CHILDOBJECTID>18</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>0</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>ID_SP_FK</NAME> -<NAMETEMPLATE>ID_SP_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>3</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>MO_PE_FK</NAME> -<NAMETEMPLATE>MO_PE_FK</NAMETEMPLATE> -<ID>32</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>21</PARENTOBJECTID> -<CHILDOBJECTID>19</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>MO_PE_FK</NAME> -<NAMETEMPLATE>MO_PE_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>3</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>MO_MT_FK</NAME> -<NAMETEMPLATE>MO_MT_FK</NAMETEMPLATE> -<ID>33</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>20</PARENTOBJECTID> -<CHILDOBJECTID>19</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>MO_MT_FK</NAME> -<NAMETEMPLATE>MO_MT_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>4</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>PE_ID_FK</NAME> -<NAMETEMPLATE>PE_ID_FK</NAMETEMPLATE> -<ID>35</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>18</PARENTOBJECTID> -<CHILDOBJECTID>21</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>0</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>PE_ID_FK</NAME> -<NAMETEMPLATE>PE_ID_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>6</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>6</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>PE_PR_FK</NAME> -<NAMETEMPLATE>PE_PR_FK</NAMETEMPLATE> -<ID>36</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>23</PARENTOBJECTID> -<CHILDOBJECTID>21</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>PE_PR_FK</NAME> -<NAMETEMPLATE>PE_PR_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>3</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>PE_SE_FK</NAME> -<NAMETEMPLATE>PE_SE_FK</NAMETEMPLATE> -<ID>37</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>25</PARENTOBJECTID> -<CHILDOBJECTID>21</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>PE_SE_FK</NAME> -<NAMETEMPLATE>PE_SE_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>4</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>PR_SE_FK</NAME> -<NAMETEMPLATE>PR_SE_FK</NAMETEMPLATE> -<ID>39</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>25</PARENTOBJECTID> -<CHILDOBJECTID>23</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>0</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>PR_SE_FK</NAME> -<NAMETEMPLATE>PR_SE_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>5</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>PR_PS_FK</NAME> -<NAMETEMPLATE>PR_PS_FK</NAMETEMPLATE> -<ID>41</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>22</PARENTOBJECTID> -<CHILDOBJECTID>23</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>0</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>PR_PS_FK</NAME> -<NAMETEMPLATE>PR_PS_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>6</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>6</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>ABUNDANCES_TYPES_PROTEINS</NAME> -<NAMETEMPLATE>ABUNDANCES_TYPES_PROTEINS</NAMETEMPLATE> -<ID>43</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>14</PARENTOBJECTID> -<CHILDOBJECTID>23</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>0</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>ABUNDANCES_TYPES_PROTEINS</NAME> -<NAMETEMPLATE>ABUNDANCES_TYPES_PROTEINS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>8</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>8</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>ABUNDANCES_TYPES_PEPTIDES</NAME> -<NAMETEMPLATE>ABUNDANCES_TYPES_PEPTIDES</NAMETEMPLATE> -<ID>44</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>14</PARENTOBJECTID> -<CHILDOBJECTID>21</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>0</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>ABUNDANCES_TYPES_PEPTIDES</NAME> -<NAMETEMPLATE>ABUNDANCES_TYPES_PEPTIDES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>8</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>8</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>DATA_SETS_PROTEINS</NAME> -<NAMETEMPLATE>DATA_SETS_PROTEINS</NAMETEMPLATE> -<ID>46</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>17</PARENTOBJECTID> -<CHILDOBJECTID>23</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>DATA_SETS_PROTEINS</NAME> -<NAMETEMPLATE>DATA_SETS_PROTEINS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>10</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>10</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>PROTEINS_IDENTIFIED_PROTEINS</NAME> -<NAMETEMPLATE>PROTEINS_IDENTIFIED_PROTEINS</NAMETEMPLATE> -<ID>48</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>23</PARENTOBJECTID> -<CHILDOBJECTID>47</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>PROTEINS_IDENTIFIED_PROTEINS</NAME> -<NAMETEMPLATE>PROTEINS_IDENTIFIED_PROTEINS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>3</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -</RELATIONSHIPS> -<SUBCATEGORYCONNECTIONS> -</SUBCATEGORYCONNECTIONS> -</DATADICT> -</VERSION> -<VERSION> -<VERSIONINFO> -<VERSIONNUMBER>4</VERSIONNUMBER> -<VERSIONLABEL>Version 2009-06-30</VERSIONLABEL> -<VERSIONDATE>2009-06-30 09:00</VERSIONDATE> -<VERSIONCOMMENTS></VERSIONCOMMENTS> -<VERSIONTYPE>DB</VERSIONTYPE> -<VERSIONTYPEDESC>Data dictionary only (no diagrams)</VERSIONTYPEDESC> -</VERSIONINFO> -<DATADICT> -<DBID>postgresql8</DBID> -<LASTID>97</LASTID> -<DDSETTINGS> -<PKCONNAMETEMPLATE>PK_%table%</PKCONNAMETEMPLATE> -<FKCONNAMETEMPLATE>%relname%</FKCONNAMETEMPLATE> -<CCONNAMETEMPLATE>CC_%table%_%column%</CCONNAMETEMPLATE> -<NOTNULLCONNAMETEMPLATE>NN_%column%</NOTNULLCONNAMETEMPLATE> -<DEFAULTCONNAMETEMPLATE>DEF_%table%_%column%</DEFAULTCONNAMETEMPLATE> -<TUCONNAMETEMPLATE>TUC_%table%_%counter%</TUCONNAMETEMPLATE> -<TCCONNAMETEMPLATE>TCC_%table%_%counter%</TCCONNAMETEMPLATE> -<RELNAMETEMPLATE>%parent%_%child%</RELNAMETEMPLATE> -<INDEXNAMETEMPLATE>IDX_%table%_%counter%</INDEXNAMETEMPLATE> -<DEFTABLEOPTIONS></DEFTABLEOPTIONS> -<DEFINDEXOPTIONS></DEFINDEXOPTIONS> -<BEGINDATABASESCRIPT></BEGINDATABASESCRIPT> -<ENDDATABASESCRIP></ENDDATABASESCRIP> -<BEGINALTERDATABASESCRIPT></BEGINALTERDATABASESCRIPT> -<ENDALTERDATABASESCRIP></ENDALTERDATABASESCRIP> -<BEGINDROPDATABASESCRIPT></BEGINDROPDATABASESCRIPT> -<ENDDROPDATABASESCRIP></ENDDROPDATABASESCRIP> -<GENDIALOGSELECTEDOBJECTS></GENDIALOGSELECTEDOBJECTS> -<GENTABLES>1</GENTABLES> -<GENTABLEOPTIONS>1</GENTABLEOPTIONS> -<GENCONSTRAINTS>1</GENCONSTRAINTS> -<GENINDEXES>1</GENINDEXES> -<GENTRIGGERS>1</GENTRIGGERS> -<GENVIEWS>1</GENVIEWS> -<GENPROCEDURES>1</GENPROCEDURES> -<GENSEQUENCES>1</GENSEQUENCES> -<GENRELATIONSHIPS>1</GENRELATIONSHIPS> -<GENBEGINENDTABLESCRIPTS>1</GENBEGINENDTABLESCRIPTS> -<GENBEGINENDDBSCRIPTS>1</GENBEGINENDDBSCRIPTS> -<GLOBALPREFIX></GLOBALPREFIX> -<AUTOCREATEINDEXESONKEYS>0</AUTOCREATEINDEXESONKEYS> -<CONVERTDOMAINS>0</CONVERTDOMAINS> -<IGNORECOMMENTS>0</IGNORECOMMENTS> -<USESCHEMANAMES>0</USESCHEMANAMES> -<UCONNAMETEMPLATE></UCONNAMETEMPLATE> -<SQLCREATEFILE>D:\User\felmer\dev-workspace\rtd_phosphonetx\source\sql\postgresql\001\schema-001.sql</SQLCREATEFILE> -<SQLDROPFILE>D:\User\felmer\dev-workspace\rtd_phosphonetx\targets\drop.sql</SQLDROPFILE> -</DDSETTINGS> -<DOMAINS> -<DOMAIN> -<NAME>BINARY_DATA</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>BYTEA</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>CHECKSUM</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>8</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>CODE</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>DESCRIPTION</NAME> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>2000</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>INTEGER_NUMBER</NAME> -<ID>7</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>INTEGER</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>REAL_NUMBER</NAME> -<ID>8</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>LONG_SEQUENCE</NAME> -<ID>9</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>TEXT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>SHORT_DESCRIPTION</NAME> -<ID>11</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>200</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>TECH_ID</NAME> -<ID>12</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>SHORT_SEQUENCE</NAME> -<ID>69</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>1000</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -</DOMAINS> -<ENTITIES> -<ENT> -<NAME>ABUNDANCES_TYPES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>14</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>4</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_ABUNDANCES_TYPES</NAME> -<NAMETEMPLATE>PK_ABUNDANCES_TYPES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>CODE</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>5</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DESCRIPTION</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>11</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>200</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -</ATTRIBUTES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_ABUNDANCES_TYPES_1</NAME> -<NAMETEMPLATE>TUC_ABUNDANCES_TYPES_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>EXPERIMENTS</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>16</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>3</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_EXPERIMENTS</NAME> -<NAMETEMPLATE>PK_EXPERIMENTS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PERM_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>5</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_EXPERIMENTS_1</NAME> -<NAMETEMPLATE>TUC_EXPERIMENTS_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>DATA_SETS</NAME> -<NAMETEMPLATE>IX_FK_DATA_SETS_EXPERIMENTS</NAMETEMPLATE> -<ID>17</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>5</ATTRLASTID> -<IDXLASTID>3</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_DATA_SETS</NAME> -<NAMETEMPLATE>PK_DATA_SETS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>EXPE_ID</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>SAMP_ID</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PERM_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>5</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<INDEXES> -<INDEX> -<NAME>IX_FK_DATA_SETS_EXPERIMENTS</NAME> -<NAMETEMPLATE>IX_FK_DATA_SETS_EXPERIMENTS</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>EXPE_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>4</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -<INDEX> -<NAME>IX_FK_DATA_SETS_SAMPLES</NAME> -<NAMETEMPLATE>IX_FK_DATA_SETS_SAMPLES</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>SAMP_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>5</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -</INDEXES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_DATA_SETS_1</NAME> -<NAMETEMPLATE>TUC_DATA_SETS_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>MODIFICATIONS</NAME> -<NAMETEMPLATE>IX_FK_MODIFICATIONS_PEPTIDES</NAMETEMPLATE> -<ID>19</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>6</ATTRLASTID> -<IDXLASTID>3</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_MODIFICATIONS</NAME> -<NAMETEMPLATE>PK_MODIFICATIONS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PEPT_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>MOTY_ID</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>POS</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>7</DOMAINID> -<DT> -<DTLISTNAME>INTEGER</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>MASS</NAME> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>6</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<INDEXES> -<INDEX> -<NAME>IX_FK_MODIFICATIONS_PEPTIDES</NAME> -<NAMETEMPLATE>IX_FK_MODIFICATIONS_PEPTIDES</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>PEPT_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>3</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -<INDEX> -<NAME>IX_FK_MODIFICATIONS_MODIFICATION_TYPES</NAME> -<NAMETEMPLATE>IX_FK_MODIFICATIONS_MODIFICATION_TYPES</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>MOTY_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>4</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -</INDEXES> -</ENT> -<ENT> -<NAME>MODIFICATION_TYPES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>20</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>6</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_MODIFICATION_TYPES</NAME> -<NAMETEMPLATE>PK_MODIFICATION_TYPES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>CODE</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>5</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DESCRIPTION</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>11</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>200</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -<ATTR> -<NAME>MASS</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -<ATTR> -<NAME>DELTA_MASS</NAME> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -</ATTRIBUTES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_MODIFICATION_TYPES_1</NAME> -<NAMETEMPLATE>TUC_MODIFICATION_TYPES_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>PEPTIDES</NAME> -<NAMETEMPLATE>IX_FK_PEPTIDES_ABUNDANCES</NAMETEMPLATE> -<ID>21</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>10</ATTRLASTID> -<IDXLASTID>5</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_PEPTIDES</NAME> -<NAMETEMPLATE>PK_PEPTIDES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PROT_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>SEQUENCE</NAME> -<ID>10</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>69</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>1000</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>10</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>CHARGE</NAME> -<ID>7</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>7</DOMAINID> -<DT> -<DTLISTNAME>INTEGER</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>7</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<INDEXES> -<INDEX> -<NAME>IX_FK_PEPTIDES_PROTEINS</NAME> -<NAMETEMPLATE>IX_FK_PEPTIDES_PROTEINS</NAMETEMPLATE> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>PROT_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>3</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -</INDEXES> -</ENT> -<ENT> -<NAME>PROTEINS</NAME> -<NAMETEMPLATE>IX_FK_PROTEINS_DATA_SETS</NAMETEMPLATE> -<ID>23</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>11</ATTRLASTID> -<IDXLASTID>7</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_PROTEINS</NAME> -<NAMETEMPLATE>PK_PROTEINS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DASE_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>10</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>10</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PROBABILITY</NAME> -<ID>9</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>9</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<INDEXES> -<INDEX> -<NAME>IDX_PROTEINS_1</NAME> -<NAMETEMPLATE>IDX_PROTEINS_1</NAMETEMPLATE> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>DASE_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>10</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -</INDEXES> -</ENT> -<ENT> -<NAME>SAMPLES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>24</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>4</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_SAMPLES</NAME> -<NAMETEMPLATE>PK_SAMPLES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PERM_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>5</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>EXPE_ID</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_SAMPLES_1</NAME> -<NAMETEMPLATE>TUC_SAMPLES_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>SEQUENCES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>25</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>4</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_SEQUENCES</NAME> -<NAMETEMPLATE>PK_SEQUENCES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>AMINO_ACID_SEQUENCE</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>9</DOMAINID> -<DT> -<DTLISTNAME>TEXT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>CHECKSUM</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>4</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>8</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -</ENT> -<ENT> -<NAME>IDENTIFIED_PROTEINS</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>47</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>5</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_IDENTIFIED_PROTEINS</NAME> -<NAMETEMPLATE>PK_IDENTIFIED_PROTEINS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PROT_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>SEQU_ID</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -<ATTR> -<NAME>DESCRIPTION</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>6</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>2000</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -</ENT> -<ENT> -<NAME>ABUNDANCES</NAME> -<ID>91</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>6</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_ABUNDANCES</NAME> -<NAMETEMPLATE>PK_ABUNDANCES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PROT_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>SAMP_ID</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>ABTY_ID</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>VALUE</NAME> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>6</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -</ENT> -<ENT> -<NAME>PROBABILITY_FDR_MAPPINGS</NAME> -<ID>96</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>5</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_PROBABILITY_FDR_MAPPINGS</NAME> -<NAMETEMPLATE>PK_PROBABILITY_FDR_MAPPINGS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DASE_ID</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PROBABILITY</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>FALSE_DISCOVERY_RATE</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -</ENT> -</ENTITIES> -<SUBCATEGORIES> -</SUBCATEGORIES> -<TEXTAREAS> -</TEXTAREAS> -<GROUPBOXES> -</GROUPBOXES> -<STAMPS> -</STAMPS> -<SEQUENCES> -</SEQUENCES> -<PROCEDURES> -</PROCEDURES> -<VIEWS> -</VIEWS> -<RELATIONSHIPS> -<REL> -<NAME>DA_EX_FK</NAME> -<NAMETEMPLATE>DA_EX_FK</NAMETEMPLATE> -<ID>29</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>16</PARENTOBJECTID> -<CHILDOBJECTID>17</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>DA_EX_FK</NAME> -<NAMETEMPLATE>DA_EX_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>4</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>DA_SA_FK</NAME> -<NAMETEMPLATE>DA_SA_FK</NAMETEMPLATE> -<ID>30</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>24</PARENTOBJECTID> -<CHILDOBJECTID>17</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>DA_SA_FK</NAME> -<NAMETEMPLATE>DA_SA_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>5</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>MO_PE_FK</NAME> -<NAMETEMPLATE>MO_PE_FK</NAMETEMPLATE> -<ID>32</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>21</PARENTOBJECTID> -<CHILDOBJECTID>19</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>MO_PE_FK</NAME> -<NAMETEMPLATE>MO_PE_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>3</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>MO_MT_FK</NAME> -<NAMETEMPLATE>MO_MT_FK</NAMETEMPLATE> -<ID>33</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>20</PARENTOBJECTID> -<CHILDOBJECTID>19</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>MO_MT_FK</NAME> -<NAMETEMPLATE>MO_MT_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>4</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>PE_PR_FK</NAME> -<NAMETEMPLATE>PE_PR_FK</NAMETEMPLATE> -<ID>36</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>23</PARENTOBJECTID> -<CHILDOBJECTID>21</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>PE_PR_FK</NAME> -<NAMETEMPLATE>PE_PR_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>3</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>DATA_SETS_PROTEINS</NAME> -<NAMETEMPLATE>DATA_SETS_PROTEINS</NAMETEMPLATE> -<ID>46</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>17</PARENTOBJECTID> -<CHILDOBJECTID>23</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>DATA_SETS_PROTEINS</NAME> -<NAMETEMPLATE>DATA_SETS_PROTEINS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>10</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>10</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>PROTEINS_IDENTIFIED_PROTEINS</NAME> -<NAMETEMPLATE>PROTEINS_IDENTIFIED_PROTEINS</NAMETEMPLATE> -<ID>48</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>23</PARENTOBJECTID> -<CHILDOBJECTID>47</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>PROTEINS_IDENTIFIED_PROTEINS</NAME> -<NAMETEMPLATE>PROTEINS_IDENTIFIED_PROTEINS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>3</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>SEQUENCES_IDENTIFIED_PROTEINS</NAME> -<NAMETEMPLATE>SEQUENCES_IDENTIFIED_PROTEINS</NAMETEMPLATE> -<ID>50</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>25</PARENTOBJECTID> -<CHILDOBJECTID>47</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>0</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>SEQUENCES_IDENTIFIED_PROTEINS</NAME> -<NAMETEMPLATE>SEQUENCES_IDENTIFIED_PROTEINS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>5</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>SAMPLES_ABUNDANCES</NAME> -<NAMETEMPLATE>SAMPLES_ABUNDANCES</NAMETEMPLATE> -<ID>92</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>24</PARENTOBJECTID> -<CHILDOBJECTID>91</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>SAMPLES_ABUNDANCES</NAME> -<NAMETEMPLATE>SAMPLES_ABUNDANCES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>4</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>ABUNDANCES_TYPES_ABUNDANCES</NAME> -<NAMETEMPLATE>ABUNDANCES_TYPES_ABUNDANCES</NAMETEMPLATE> -<ID>93</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>14</PARENTOBJECTID> -<CHILDOBJECTID>91</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>ABUNDANCES_TYPES_ABUNDANCES</NAME> -<NAMETEMPLATE>ABUNDANCES_TYPES_ABUNDANCES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>5</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>PROTEINS_ABUNDANCES</NAME> -<NAMETEMPLATE>PROTEINS_ABUNDANCES</NAMETEMPLATE> -<ID>94</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>23</PARENTOBJECTID> -<CHILDOBJECTID>91</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>PROTEINS_ABUNDANCES</NAME> -<NAMETEMPLATE>PROTEINS_ABUNDANCES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>3</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>DATA_SETS_PROBABILITY_FDR_MAPPINGS</NAME> -<NAMETEMPLATE>DATA_SETS_PROBABILITY_FDR_MAPPINGS</NAMETEMPLATE> -<ID>97</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>17</PARENTOBJECTID> -<CHILDOBJECTID>96</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>DATA_SETS_PROBABILITY_FDR_MAPPINGS</NAME> -<NAMETEMPLATE>DATA_SETS_PROBABILITY_FDR_MAPPINGS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>5</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -</RELATIONSHIPS> -<SUBCATEGORYCONNECTIONS> -</SUBCATEGORYCONNECTIONS> -</DATADICT> -</VERSION> -<VERSION> -<VERSIONINFO> -<VERSIONNUMBER>5</VERSIONNUMBER> -<VERSIONLABEL>Version 2009-07-06</VERSIONLABEL> -<VERSIONDATE>2009-07-06 13:15</VERSIONDATE> -<VERSIONCOMMENTS></VERSIONCOMMENTS> -<VERSIONTYPE>DB</VERSIONTYPE> -<VERSIONTYPEDESC>Data dictionary only (no diagrams)</VERSIONTYPEDESC> -</VERSIONINFO> -<DATADICT> -<DBID>postgresql8</DBID> -<LASTID>135</LASTID> -<DDSETTINGS> -<PKCONNAMETEMPLATE>PK_%table%</PKCONNAMETEMPLATE> -<FKCONNAMETEMPLATE>%relname%</FKCONNAMETEMPLATE> -<CCONNAMETEMPLATE>CC_%table%_%column%</CCONNAMETEMPLATE> -<NOTNULLCONNAMETEMPLATE>NN_%column%</NOTNULLCONNAMETEMPLATE> -<DEFAULTCONNAMETEMPLATE>DEF_%table%_%column%</DEFAULTCONNAMETEMPLATE> -<TUCONNAMETEMPLATE>TUC_%table%_%counter%</TUCONNAMETEMPLATE> -<TCCONNAMETEMPLATE>TCC_%table%_%counter%</TCCONNAMETEMPLATE> -<RELNAMETEMPLATE>%parent%_%child%</RELNAMETEMPLATE> -<INDEXNAMETEMPLATE>IDX_%table%_%counter%</INDEXNAMETEMPLATE> -<DEFTABLEOPTIONS></DEFTABLEOPTIONS> -<DEFINDEXOPTIONS></DEFINDEXOPTIONS> -<BEGINDATABASESCRIPT></BEGINDATABASESCRIPT> -<ENDDATABASESCRIP></ENDDATABASESCRIP> -<BEGINALTERDATABASESCRIPT></BEGINALTERDATABASESCRIPT> -<ENDALTERDATABASESCRIP></ENDALTERDATABASESCRIP> -<BEGINDROPDATABASESCRIPT></BEGINDROPDATABASESCRIPT> -<ENDDROPDATABASESCRIP></ENDDROPDATABASESCRIP> -<GENDIALOGSELECTEDOBJECTS></GENDIALOGSELECTEDOBJECTS> -<GENTABLES>1</GENTABLES> -<GENTABLEOPTIONS>1</GENTABLEOPTIONS> -<GENCONSTRAINTS>1</GENCONSTRAINTS> -<GENINDEXES>1</GENINDEXES> -<GENTRIGGERS>1</GENTRIGGERS> -<GENVIEWS>1</GENVIEWS> -<GENPROCEDURES>1</GENPROCEDURES> -<GENSEQUENCES>1</GENSEQUENCES> -<GENRELATIONSHIPS>1</GENRELATIONSHIPS> -<GENBEGINENDTABLESCRIPTS>1</GENBEGINENDTABLESCRIPTS> -<GENBEGINENDDBSCRIPTS>1</GENBEGINENDDBSCRIPTS> -<GLOBALPREFIX></GLOBALPREFIX> -<AUTOCREATEINDEXESONKEYS>0</AUTOCREATEINDEXESONKEYS> -<CONVERTDOMAINS>0</CONVERTDOMAINS> -<IGNORECOMMENTS>0</IGNORECOMMENTS> -<USESCHEMANAMES>0</USESCHEMANAMES> -<UCONNAMETEMPLATE></UCONNAMETEMPLATE> -<SQLCREATEFILE>N:\user\cisd\felmer\phosphonetx\schema-001.sql</SQLCREATEFILE> -<SQLDROPFILE>N:\user\cisd\felmer\phosphonetx\drop.sql</SQLDROPFILE> -</DDSETTINGS> -<DOMAINS> -<DOMAIN> -<NAME>CHECKSUM</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>8</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>CODE</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>DESCRIPTION</NAME> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>2000</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>INTEGER_NUMBER</NAME> -<ID>7</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>INTEGER</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>REAL_NUMBER</NAME> -<ID>8</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>LONG_SEQUENCE</NAME> -<ID>9</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>TEXT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>SHORT_DESCRIPTION</NAME> -<ID>11</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>200</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>TECH_ID</NAME> -<ID>12</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>SHORT_SEQUENCE</NAME> -<ID>69</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>1000</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>UNIPROT_ACCESSION_NUMBER</NAME> -<ID>109</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -</DOMAINS> -<ENTITIES> -<ENT> -<NAME>ABUNDANCES_TYPES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>14</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>4</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_ABUNDANCES_TYPES</NAME> -<NAMETEMPLATE>PK_ABUNDANCES_TYPES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>CODE</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>5</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DESCRIPTION</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>11</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>200</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -</ATTRIBUTES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_ABUNDANCES_TYPES_1</NAME> -<NAMETEMPLATE>TUC_ABUNDANCES_TYPES_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>EXPERIMENTS</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>16</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>3</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_EXPERIMENTS</NAME> -<NAMETEMPLATE>PK_EXPERIMENTS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PERM_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>5</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_EXPERIMENTS_1</NAME> -<NAMETEMPLATE>TUC_EXPERIMENTS_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>DATA_SETS</NAME> -<NAMETEMPLATE>IX_FK_DATA_SETS_EXPERIMENTS</NAMETEMPLATE> -<ID>17</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>6</ATTRLASTID> -<IDXLASTID>3</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_DATA_SETS</NAME> -<NAMETEMPLATE>PK_DATA_SETS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>EXPE_ID</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>SAMP_ID</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DB_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>6</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PERM_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>5</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<INDEXES> -<INDEX> -<NAME>IX_FK_DATA_SETS_EXPERIMENTS</NAME> -<NAMETEMPLATE>IX_FK_DATA_SETS_EXPERIMENTS</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>EXPE_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>4</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -<INDEX> -<NAME>IX_FK_DATA_SETS_SAMPLES</NAME> -<NAMETEMPLATE>IX_FK_DATA_SETS_SAMPLES</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>SAMP_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>5</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -</INDEXES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_DATA_SETS_1</NAME> -<NAMETEMPLATE>TUC_DATA_SETS_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>MODIFICATIONS</NAME> -<NAMETEMPLATE>IX_FK_MODIFICATIONS_PEPTIDES</NAMETEMPLATE> -<ID>19</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>6</ATTRLASTID> -<IDXLASTID>3</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_MODIFICATIONS</NAME> -<NAMETEMPLATE>PK_MODIFICATIONS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PEPT_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>MOTY_ID</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>POS</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>7</DOMAINID> -<DT> -<DTLISTNAME>INTEGER</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>MASS</NAME> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>6</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<INDEXES> -<INDEX> -<NAME>IX_FK_MODIFICATIONS_PEPTIDES</NAME> -<NAMETEMPLATE>IX_FK_MODIFICATIONS_PEPTIDES</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>PEPT_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>3</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -<INDEX> -<NAME>IX_FK_MODIFICATIONS_MODIFICATION_TYPES</NAME> -<NAMETEMPLATE>IX_FK_MODIFICATIONS_MODIFICATION_TYPES</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>MOTY_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>4</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -</INDEXES> -</ENT> -<ENT> -<NAME>MODIFICATION_TYPES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>20</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>7</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_MODIFICATION_TYPES</NAME> -<NAMETEMPLATE>PK_MODIFICATION_TYPES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>CODE</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>5</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DESCRIPTION</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>11</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>200</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -<ATTR> -<NAME>AMINO_ACID</NAME> -<ID>7</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER</DTLISTNAME> -<LE>1</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -<ATTR> -<NAME>MASS</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -<ATTR> -<NAME>MASS_TOLERANCE</NAME> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -</ATTRIBUTES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_MODIFICATION_TYPES_1</NAME> -<NAMETEMPLATE>TUC_MODIFICATION_TYPES_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>PEPTIDES</NAME> -<NAMETEMPLATE>IX_FK_PEPTIDES_ABUNDANCES</NAMETEMPLATE> -<ID>21</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>10</ATTRLASTID> -<IDXLASTID>5</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_PEPTIDES</NAME> -<NAMETEMPLATE>PK_PEPTIDES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PROT_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>SEQUENCE</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>10</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>69</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>1000</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>10</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>CHARGE</NAME> -<ID>7</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>7</DOMAINID> -<DT> -<DTLISTNAME>INTEGER</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>7</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<INDEXES> -<INDEX> -<NAME>IX_FK_PEPTIDES_PROTEINS</NAME> -<NAMETEMPLATE>IX_FK_PEPTIDES_PROTEINS</NAMETEMPLATE> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>PROT_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>3</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -</INDEXES> -</ENT> -<ENT> -<NAME>PROTEINS</NAME> -<NAMETEMPLATE>IX_FK_PROTEINS_DATA_SETS</NAMETEMPLATE> -<ID>23</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>11</ATTRLASTID> -<IDXLASTID>7</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_PROTEINS</NAME> -<NAMETEMPLATE>PK_PROTEINS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DASE_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>10</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>10</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PROBABILITY</NAME> -<ID>9</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>9</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<INDEXES> -<INDEX> -<NAME>IDX_PROTEINS_1</NAME> -<NAMETEMPLATE>IDX_PROTEINS_1</NAMETEMPLATE> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>DASE_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>10</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -</INDEXES> -</ENT> -<ENT> -<NAME>SAMPLES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>24</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>4</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_SAMPLES</NAME> -<NAMETEMPLATE>PK_SAMPLES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PERM_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>5</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>EXPE_ID</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_SAMPLES_1</NAME> -<NAMETEMPLATE>TUC_SAMPLES_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>SEQUENCES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>25</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>6</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_SEQUENCES</NAME> -<NAMETEMPLATE>PK_SEQUENCES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DB_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PRRE_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>6</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>AMINO_ACID_SEQUENCE</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>9</DOMAINID> -<DT> -<DTLISTNAME>TEXT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>CHECKSUM</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>4</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>8</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -</ENT> -<ENT> -<NAME>IDENTIFIED_PROTEINS</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>47</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>5</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_IDENTIFIED_PROTEINS</NAME> -<NAMETEMPLATE>PK_IDENTIFIED_PROTEINS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PROT_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>SEQU_ID</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -</ENT> -<ENT> -<NAME>ABUNDANCES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>91</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>6</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_ABUNDANCES</NAME> -<NAMETEMPLATE>PK_ABUNDANCES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PROT_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>SAMP_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>ABTY_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>VALUE</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>6</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -</ENT> -<ENT> -<NAME>PROBABILITY_FDR_MAPPINGS</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>96</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>5</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_PROBABILITY_FDR_MAPPINGS</NAME> -<NAMETEMPLATE>PK_PROBABILITY_FDR_MAPPINGS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DASE_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PROBABILITY</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>FALSE_DISCOVERY_RATE</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -</ENT> -<ENT> -<NAME>PROTEIN_REFERENCES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>98</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>4</ATTRLASTID> -<IDXLASTID>2</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_PROTEIN_REFERENCES</NAME> -<NAMETEMPLATE>PK_PROTEIN_REFERENCES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>UNIPROT_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>109</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DESCRIPTION</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>6</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>2000</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -</ATTRIBUTES> -<INDEXES> -<INDEX> -<NAME>IDX_PROTEIN_REFERENCES_1</NAME> -<NAMETEMPLATE>IDX_PROTEIN_REFERENCES_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>UNIPROT_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>3</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -</INDEXES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_PROTEIN_REFERENCES_1</NAME> -<NAMETEMPLATE>TUC_PROTEIN_REFERENCES_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>DATABASES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>110</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>3</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_DATABASES</NAME> -<NAMETEMPLATE>PK_DATABASES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>NAME_AND_VERSION</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>69</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>1000</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_DATABASES_1</NAME> -<NAMETEMPLATE>TUC_DATABASES_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -</ENTITIES> -<SUBCATEGORIES> -</SUBCATEGORIES> -<TEXTAREAS> -</TEXTAREAS> -<GROUPBOXES> -</GROUPBOXES> -<STAMPS> -</STAMPS> -<SEQUENCES> -</SEQUENCES> -<PROCEDURES> -</PROCEDURES> -<VIEWS> -</VIEWS> -<RELATIONSHIPS> -<REL> -<NAME>DA_EX_FK</NAME> -<NAMETEMPLATE>DA_EX_FK</NAMETEMPLATE> -<ID>29</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>16</PARENTOBJECTID> -<CHILDOBJECTID>17</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>DA_EX_FK</NAME> -<NAMETEMPLATE>DA_EX_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>4</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>DA_SA_FK</NAME> -<NAMETEMPLATE>DA_SA_FK</NAMETEMPLATE> -<ID>30</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>24</PARENTOBJECTID> -<CHILDOBJECTID>17</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>DA_SA_FK</NAME> -<NAMETEMPLATE>DA_SA_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>5</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>MO_PE_FK</NAME> -<NAMETEMPLATE>MO_PE_FK</NAMETEMPLATE> -<ID>32</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>21</PARENTOBJECTID> -<CHILDOBJECTID>19</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>MO_PE_FK</NAME> -<NAMETEMPLATE>MO_PE_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>3</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>MO_MT_FK</NAME> -<NAMETEMPLATE>MO_MT_FK</NAMETEMPLATE> -<ID>33</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>20</PARENTOBJECTID> -<CHILDOBJECTID>19</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>MO_MT_FK</NAME> -<NAMETEMPLATE>MO_MT_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>4</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>PE_PR_FK</NAME> -<NAMETEMPLATE>PE_PR_FK</NAMETEMPLATE> -<ID>36</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>23</PARENTOBJECTID> -<CHILDOBJECTID>21</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>PE_PR_FK</NAME> -<NAMETEMPLATE>PE_PR_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>3</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>DATA_SETS_PROTEINS</NAME> -<NAMETEMPLATE>DATA_SETS_PROTEINS</NAMETEMPLATE> -<ID>46</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>17</PARENTOBJECTID> -<CHILDOBJECTID>23</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>DATA_SETS_PROTEINS</NAME> -<NAMETEMPLATE>DATA_SETS_PROTEINS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>10</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>10</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>PROTEINS_IDENTIFIED_PROTEINS</NAME> -<NAMETEMPLATE>PROTEINS_IDENTIFIED_PROTEINS</NAMETEMPLATE> -<ID>48</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>23</PARENTOBJECTID> -<CHILDOBJECTID>47</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>PROTEINS_IDENTIFIED_PROTEINS</NAME> -<NAMETEMPLATE>PROTEINS_IDENTIFIED_PROTEINS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>3</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>SEQUENCES_IDENTIFIED_PROTEINS</NAME> -<NAMETEMPLATE>SEQUENCES_IDENTIFIED_PROTEINS</NAMETEMPLATE> -<ID>50</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>25</PARENTOBJECTID> -<CHILDOBJECTID>47</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>SEQUENCES_IDENTIFIED_PROTEINS</NAME> -<NAMETEMPLATE>SEQUENCES_IDENTIFIED_PROTEINS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>5</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>SAMPLES_ABUNDANCES</NAME> -<NAMETEMPLATE>SAMPLES_ABUNDANCES</NAMETEMPLATE> -<ID>92</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>24</PARENTOBJECTID> -<CHILDOBJECTID>91</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>SAMPLES_ABUNDANCES</NAME> -<NAMETEMPLATE>SAMPLES_ABUNDANCES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>4</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>ABUNDANCES_TYPES_ABUNDANCES</NAME> -<NAMETEMPLATE>ABUNDANCES_TYPES_ABUNDANCES</NAMETEMPLATE> -<ID>93</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>14</PARENTOBJECTID> -<CHILDOBJECTID>91</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>ABUNDANCES_TYPES_ABUNDANCES</NAME> -<NAMETEMPLATE>ABUNDANCES_TYPES_ABUNDANCES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>5</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>PROTEINS_ABUNDANCES</NAME> -<NAMETEMPLATE>PROTEINS_ABUNDANCES</NAMETEMPLATE> -<ID>94</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>23</PARENTOBJECTID> -<CHILDOBJECTID>91</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>PROTEINS_ABUNDANCES</NAME> -<NAMETEMPLATE>PROTEINS_ABUNDANCES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>3</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>DATA_SETS_PROBABILITY_FDR_MAPPINGS</NAME> -<NAMETEMPLATE>DATA_SETS_PROBABILITY_FDR_MAPPINGS</NAMETEMPLATE> -<ID>97</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>17</PARENTOBJECTID> -<CHILDOBJECTID>96</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>DATA_SETS_PROBABILITY_FDR_MAPPINGS</NAME> -<NAMETEMPLATE>DATA_SETS_PROBABILITY_FDR_MAPPINGS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>5</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>DATABASES_SEQUENCES</NAME> -<NAMETEMPLATE>DATABASES_SEQUENCES</NAMETEMPLATE> -<ID>111</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>110</PARENTOBJECTID> -<CHILDOBJECTID>25</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>DATABASES_SEQUENCES</NAME> -<NAMETEMPLATE>DATABASES_SEQUENCES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>5</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>PROTEIN_REFERENCES_SEQUENCES</NAME> -<NAMETEMPLATE>PROTEIN_REFERENCES_SEQUENCES</NAMETEMPLATE> -<ID>112</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>98</PARENTOBJECTID> -<CHILDOBJECTID>25</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>PROTEIN_REFERENCES_SEQUENCES</NAME> -<NAMETEMPLATE>PROTEIN_REFERENCES_SEQUENCES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>6</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>6</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>DATABASES_DATA_SETS</NAME> -<NAMETEMPLATE>DATABASES_DATA_SETS</NAMETEMPLATE> -<ID>125</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>110</PARENTOBJECTID> -<CHILDOBJECTID>17</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>DATABASES_DATA_SETS</NAME> -<NAMETEMPLATE>DATABASES_DATA_SETS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>6</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>6</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -</RELATIONSHIPS> -<SUBCATEGORYCONNECTIONS> -</SUBCATEGORYCONNECTIONS> -</DATADICT> -</VERSION> -<VERSION> -<VERSIONINFO> -<VERSIONNUMBER>6</VERSIONNUMBER> -<VERSIONLABEL>Version 2009-07-06 1</VERSIONLABEL> -<VERSIONDATE>2009-07-06 13:30</VERSIONDATE> -<VERSIONCOMMENTS></VERSIONCOMMENTS> -<VERSIONTYPE>DB</VERSIONTYPE> -<VERSIONTYPEDESC>Data dictionary only (no diagrams)</VERSIONTYPEDESC> -</VERSIONINFO> -<DATADICT> -<DBID>postgresql8</DBID> -<LASTID>135</LASTID> -<DDSETTINGS> -<PKCONNAMETEMPLATE>PK_%table%</PKCONNAMETEMPLATE> -<FKCONNAMETEMPLATE>%relname%</FKCONNAMETEMPLATE> -<CCONNAMETEMPLATE>CC_%table%_%column%</CCONNAMETEMPLATE> -<NOTNULLCONNAMETEMPLATE>NN_%column%</NOTNULLCONNAMETEMPLATE> -<DEFAULTCONNAMETEMPLATE>DEF_%table%_%column%</DEFAULTCONNAMETEMPLATE> -<TUCONNAMETEMPLATE>TUC_%table%_%counter%</TUCONNAMETEMPLATE> -<TCCONNAMETEMPLATE>TCC_%table%_%counter%</TCCONNAMETEMPLATE> -<RELNAMETEMPLATE>%parent%_%child%</RELNAMETEMPLATE> -<INDEXNAMETEMPLATE>IDX_%table%_%counter%</INDEXNAMETEMPLATE> -<DEFTABLEOPTIONS></DEFTABLEOPTIONS> -<DEFINDEXOPTIONS></DEFINDEXOPTIONS> -<BEGINDATABASESCRIPT></BEGINDATABASESCRIPT> -<ENDDATABASESCRIP></ENDDATABASESCRIP> -<BEGINALTERDATABASESCRIPT></BEGINALTERDATABASESCRIPT> -<ENDALTERDATABASESCRIP></ENDALTERDATABASESCRIP> -<BEGINDROPDATABASESCRIPT></BEGINDROPDATABASESCRIPT> -<ENDDROPDATABASESCRIP></ENDDROPDATABASESCRIP> -<GENDIALOGSELECTEDOBJECTS></GENDIALOGSELECTEDOBJECTS> -<GENTABLES>1</GENTABLES> -<GENTABLEOPTIONS>1</GENTABLEOPTIONS> -<GENCONSTRAINTS>1</GENCONSTRAINTS> -<GENINDEXES>1</GENINDEXES> -<GENTRIGGERS>1</GENTRIGGERS> -<GENVIEWS>1</GENVIEWS> -<GENPROCEDURES>1</GENPROCEDURES> -<GENSEQUENCES>1</GENSEQUENCES> -<GENRELATIONSHIPS>1</GENRELATIONSHIPS> -<GENBEGINENDTABLESCRIPTS>1</GENBEGINENDTABLESCRIPTS> -<GENBEGINENDDBSCRIPTS>1</GENBEGINENDDBSCRIPTS> -<GLOBALPREFIX></GLOBALPREFIX> -<AUTOCREATEINDEXESONKEYS>0</AUTOCREATEINDEXESONKEYS> -<CONVERTDOMAINS>0</CONVERTDOMAINS> -<IGNORECOMMENTS>0</IGNORECOMMENTS> -<USESCHEMANAMES>0</USESCHEMANAMES> -<UCONNAMETEMPLATE></UCONNAMETEMPLATE> -<SQLCREATEFILE>N:\user\cisd\felmer\phosphonetx\schema-001.sql</SQLCREATEFILE> -<SQLDROPFILE>N:\user\cisd\felmer\phosphonetx\drop.sql</SQLDROPFILE> -</DDSETTINGS> -<DOMAINS> -<DOMAIN> -<NAME>CHECKSUM</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>8</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>CODE</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>DESCRIPTION</NAME> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>2000</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>INTEGER_NUMBER</NAME> -<ID>7</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>INTEGER</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>REAL_NUMBER</NAME> -<ID>8</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>LONG_SEQUENCE</NAME> -<ID>9</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>TEXT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>SHORT_DESCRIPTION</NAME> -<ID>11</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>200</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>TECH_ID</NAME> -<ID>12</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>SHORT_SEQUENCE</NAME> -<ID>69</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>1000</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>UNIPROT_ACCESSION_NUMBER</NAME> -<ID>109</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -</DOMAINS> -<ENTITIES> -<ENT> -<NAME>ABUNDANCES_TYPES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>14</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>4</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_ABUNDANCES_TYPES</NAME> -<NAMETEMPLATE>PK_ABUNDANCES_TYPES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>CODE</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>5</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DESCRIPTION</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>11</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>200</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -</ATTRIBUTES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_ABUNDANCES_TYPES_1</NAME> -<NAMETEMPLATE>TUC_ABUNDANCES_TYPES_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>EXPERIMENTS</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>16</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>3</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_EXPERIMENTS</NAME> -<NAMETEMPLATE>PK_EXPERIMENTS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PERM_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>5</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_EXPERIMENTS_1</NAME> -<NAMETEMPLATE>TUC_EXPERIMENTS_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>DATA_SETS</NAME> -<NAMETEMPLATE>IX_FK_DATA_SETS_EXPERIMENTS</NAMETEMPLATE> -<ID>17</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>6</ATTRLASTID> -<IDXLASTID>3</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_DATA_SETS</NAME> -<NAMETEMPLATE>PK_DATA_SETS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>EXPE_ID</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>SAMP_ID</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DB_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>6</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PERM_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>5</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<INDEXES> -<INDEX> -<NAME>IX_FK_DATA_SETS_EXPERIMENTS</NAME> -<NAMETEMPLATE>IX_FK_DATA_SETS_EXPERIMENTS</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>EXPE_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>4</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -<INDEX> -<NAME>IX_FK_DATA_SETS_SAMPLES</NAME> -<NAMETEMPLATE>IX_FK_DATA_SETS_SAMPLES</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>SAMP_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>5</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -</INDEXES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_DATA_SETS_1</NAME> -<NAMETEMPLATE>TUC_DATA_SETS_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>MODIFICATIONS</NAME> -<NAMETEMPLATE>IX_FK_MODIFICATIONS_PEPTIDES</NAMETEMPLATE> -<ID>19</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>6</ATTRLASTID> -<IDXLASTID>3</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_MODIFICATIONS</NAME> -<NAMETEMPLATE>PK_MODIFICATIONS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PEPT_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>MOTY_ID</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>POS</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>7</DOMAINID> -<DT> -<DTLISTNAME>INTEGER</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>MASS</NAME> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>6</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<INDEXES> -<INDEX> -<NAME>IX_FK_MODIFICATIONS_PEPTIDES</NAME> -<NAMETEMPLATE>IX_FK_MODIFICATIONS_PEPTIDES</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>PEPT_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>3</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -<INDEX> -<NAME>IX_FK_MODIFICATIONS_MODIFICATION_TYPES</NAME> -<NAMETEMPLATE>IX_FK_MODIFICATIONS_MODIFICATION_TYPES</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>MOTY_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>4</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -</INDEXES> -</ENT> -<ENT> -<NAME>MODIFICATION_TYPES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>20</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>7</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_MODIFICATION_TYPES</NAME> -<NAMETEMPLATE>PK_MODIFICATION_TYPES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>CODE</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>5</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DESCRIPTION</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>11</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>200</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -<ATTR> -<NAME>AMINO_ACID</NAME> -<ID>7</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER</DTLISTNAME> -<LE>1</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -<ATTR> -<NAME>MASS</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -<ATTR> -<NAME>MASS_TOLERANCE</NAME> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -</ATTRIBUTES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_MODIFICATION_TYPES_1</NAME> -<NAMETEMPLATE>TUC_MODIFICATION_TYPES_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>PEPTIDES</NAME> -<NAMETEMPLATE>IX_FK_PEPTIDES_ABUNDANCES</NAMETEMPLATE> -<ID>21</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>10</ATTRLASTID> -<IDXLASTID>5</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_PEPTIDES</NAME> -<NAMETEMPLATE>PK_PEPTIDES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PROT_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>SEQUENCE</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>10</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>69</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>1000</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>10</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>CHARGE</NAME> -<ID>7</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>7</DOMAINID> -<DT> -<DTLISTNAME>INTEGER</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>7</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<INDEXES> -<INDEX> -<NAME>IX_FK_PEPTIDES_PROTEINS</NAME> -<NAMETEMPLATE>IX_FK_PEPTIDES_PROTEINS</NAMETEMPLATE> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>PROT_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>3</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -</INDEXES> -</ENT> -<ENT> -<NAME>PROTEINS</NAME> -<NAMETEMPLATE>IX_FK_PROTEINS_DATA_SETS</NAMETEMPLATE> -<ID>23</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>11</ATTRLASTID> -<IDXLASTID>7</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_PROTEINS</NAME> -<NAMETEMPLATE>PK_PROTEINS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DASE_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>10</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>10</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PROBABILITY</NAME> -<ID>9</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>9</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<INDEXES> -<INDEX> -<NAME>IDX_PROTEINS_1</NAME> -<NAMETEMPLATE>IDX_PROTEINS_1</NAMETEMPLATE> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>DASE_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>10</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -</INDEXES> -</ENT> -<ENT> -<NAME>SAMPLES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>24</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>4</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_SAMPLES</NAME> -<NAMETEMPLATE>PK_SAMPLES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PERM_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>5</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>EXPE_ID</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_SAMPLES_1</NAME> -<NAMETEMPLATE>TUC_SAMPLES_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>SEQUENCES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>25</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>6</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_SEQUENCES</NAME> -<NAMETEMPLATE>PK_SEQUENCES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DB_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PRRE_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>6</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>AMINO_ACID_SEQUENCE</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>9</DOMAINID> -<DT> -<DTLISTNAME>TEXT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>CHECKSUM</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>4</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>8</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -</ENT> -<ENT> -<NAME>IDENTIFIED_PROTEINS</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>47</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>5</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_IDENTIFIED_PROTEINS</NAME> -<NAMETEMPLATE>PK_IDENTIFIED_PROTEINS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PROT_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>SEQU_ID</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -</ENT> -<ENT> -<NAME>ABUNDANCES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>91</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>6</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_ABUNDANCES</NAME> -<NAMETEMPLATE>PK_ABUNDANCES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PROT_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>SAMP_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>ABTY_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>VALUE</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>6</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -</ENT> -<ENT> -<NAME>PROBABILITY_FDR_MAPPINGS</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>96</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>5</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_PROBABILITY_FDR_MAPPINGS</NAME> -<NAMETEMPLATE>PK_PROBABILITY_FDR_MAPPINGS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DASE_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PROBABILITY</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>FALSE_DISCOVERY_RATE</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -</ENT> -<ENT> -<NAME>PROTEIN_REFERENCES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>98</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>4</ATTRLASTID> -<IDXLASTID>2</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_PROTEIN_REFERENCES</NAME> -<NAMETEMPLATE>PK_PROTEIN_REFERENCES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>UNIPROT_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>109</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DESCRIPTION</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>6</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>2000</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -</ATTRIBUTES> -<INDEXES> -<INDEX> -<NAME>IDX_PROTEIN_REFERENCES_1</NAME> -<NAMETEMPLATE>IDX_PROTEIN_REFERENCES_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>UNIPROT_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>3</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -</INDEXES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_PROTEIN_REFERENCES_1</NAME> -<NAMETEMPLATE>TUC_PROTEIN_REFERENCES_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>DATABASES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>110</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>3</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_DATABASES</NAME> -<NAMETEMPLATE>PK_DATABASES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>NAME_AND_VERSION</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>11</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>200</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_DATABASES_1</NAME> -<NAMETEMPLATE>TUC_DATABASES_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -</ENTITIES> -<SUBCATEGORIES> -</SUBCATEGORIES> -<TEXTAREAS> -</TEXTAREAS> -<GROUPBOXES> -</GROUPBOXES> -<STAMPS> -</STAMPS> -<SEQUENCES> -</SEQUENCES> -<PROCEDURES> -</PROCEDURES> -<VIEWS> -</VIEWS> -<RELATIONSHIPS> -<REL> -<NAME>DA_EX_FK</NAME> -<NAMETEMPLATE>DA_EX_FK</NAMETEMPLATE> -<ID>29</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>16</PARENTOBJECTID> -<CHILDOBJECTID>17</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>DA_EX_FK</NAME> -<NAMETEMPLATE>DA_EX_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>4</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>DA_SA_FK</NAME> -<NAMETEMPLATE>DA_SA_FK</NAMETEMPLATE> -<ID>30</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>24</PARENTOBJECTID> -<CHILDOBJECTID>17</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>DA_SA_FK</NAME> -<NAMETEMPLATE>DA_SA_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>5</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>MO_PE_FK</NAME> -<NAMETEMPLATE>MO_PE_FK</NAMETEMPLATE> -<ID>32</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>21</PARENTOBJECTID> -<CHILDOBJECTID>19</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>MO_PE_FK</NAME> -<NAMETEMPLATE>MO_PE_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>3</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>MO_MT_FK</NAME> -<NAMETEMPLATE>MO_MT_FK</NAMETEMPLATE> -<ID>33</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>20</PARENTOBJECTID> -<CHILDOBJECTID>19</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>MO_MT_FK</NAME> -<NAMETEMPLATE>MO_MT_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>4</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>PE_PR_FK</NAME> -<NAMETEMPLATE>PE_PR_FK</NAMETEMPLATE> -<ID>36</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>23</PARENTOBJECTID> -<CHILDOBJECTID>21</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>PE_PR_FK</NAME> -<NAMETEMPLATE>PE_PR_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>3</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>DATA_SETS_PROTEINS</NAME> -<NAMETEMPLATE>DATA_SETS_PROTEINS</NAMETEMPLATE> -<ID>46</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>17</PARENTOBJECTID> -<CHILDOBJECTID>23</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>DATA_SETS_PROTEINS</NAME> -<NAMETEMPLATE>DATA_SETS_PROTEINS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>10</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>10</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>PROTEINS_IDENTIFIED_PROTEINS</NAME> -<NAMETEMPLATE>PROTEINS_IDENTIFIED_PROTEINS</NAMETEMPLATE> -<ID>48</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>23</PARENTOBJECTID> -<CHILDOBJECTID>47</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>PROTEINS_IDENTIFIED_PROTEINS</NAME> -<NAMETEMPLATE>PROTEINS_IDENTIFIED_PROTEINS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>3</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>SEQUENCES_IDENTIFIED_PROTEINS</NAME> -<NAMETEMPLATE>SEQUENCES_IDENTIFIED_PROTEINS</NAMETEMPLATE> -<ID>50</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>25</PARENTOBJECTID> -<CHILDOBJECTID>47</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>SEQUENCES_IDENTIFIED_PROTEINS</NAME> -<NAMETEMPLATE>SEQUENCES_IDENTIFIED_PROTEINS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>5</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>SAMPLES_ABUNDANCES</NAME> -<NAMETEMPLATE>SAMPLES_ABUNDANCES</NAMETEMPLATE> -<ID>92</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>24</PARENTOBJECTID> -<CHILDOBJECTID>91</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>SAMPLES_ABUNDANCES</NAME> -<NAMETEMPLATE>SAMPLES_ABUNDANCES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>4</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>ABUNDANCES_TYPES_ABUNDANCES</NAME> -<NAMETEMPLATE>ABUNDANCES_TYPES_ABUNDANCES</NAMETEMPLATE> -<ID>93</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>14</PARENTOBJECTID> -<CHILDOBJECTID>91</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>ABUNDANCES_TYPES_ABUNDANCES</NAME> -<NAMETEMPLATE>ABUNDANCES_TYPES_ABUNDANCES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>5</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>PROTEINS_ABUNDANCES</NAME> -<NAMETEMPLATE>PROTEINS_ABUNDANCES</NAMETEMPLATE> -<ID>94</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>23</PARENTOBJECTID> -<CHILDOBJECTID>91</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>PROTEINS_ABUNDANCES</NAME> -<NAMETEMPLATE>PROTEINS_ABUNDANCES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>3</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>DATA_SETS_PROBABILITY_FDR_MAPPINGS</NAME> -<NAMETEMPLATE>DATA_SETS_PROBABILITY_FDR_MAPPINGS</NAMETEMPLATE> -<ID>97</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>17</PARENTOBJECTID> -<CHILDOBJECTID>96</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>DATA_SETS_PROBABILITY_FDR_MAPPINGS</NAME> -<NAMETEMPLATE>DATA_SETS_PROBABILITY_FDR_MAPPINGS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>5</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>DATABASES_SEQUENCES</NAME> -<NAMETEMPLATE>DATABASES_SEQUENCES</NAMETEMPLATE> -<ID>111</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>110</PARENTOBJECTID> -<CHILDOBJECTID>25</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>DATABASES_SEQUENCES</NAME> -<NAMETEMPLATE>DATABASES_SEQUENCES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>5</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>PROTEIN_REFERENCES_SEQUENCES</NAME> -<NAMETEMPLATE>PROTEIN_REFERENCES_SEQUENCES</NAMETEMPLATE> -<ID>112</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>98</PARENTOBJECTID> -<CHILDOBJECTID>25</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>PROTEIN_REFERENCES_SEQUENCES</NAME> -<NAMETEMPLATE>PROTEIN_REFERENCES_SEQUENCES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>6</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>6</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>DATABASES_DATA_SETS</NAME> -<NAMETEMPLATE>DATABASES_DATA_SETS</NAMETEMPLATE> -<ID>125</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>110</PARENTOBJECTID> -<CHILDOBJECTID>17</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>DATABASES_DATA_SETS</NAME> -<NAMETEMPLATE>DATABASES_DATA_SETS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>6</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>6</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -</RELATIONSHIPS> -<SUBCATEGORYCONNECTIONS> -</SUBCATEGORYCONNECTIONS> -</DATADICT> -</VERSION> -<VERSION> -<VERSIONINFO> -<VERSIONNUMBER>7</VERSIONNUMBER> -<VERSIONLABEL>Version 2009-07-07</VERSIONLABEL> -<VERSIONDATE>2009-07-07 08:01</VERSIONDATE> -<VERSIONCOMMENTS></VERSIONCOMMENTS> -<VERSIONTYPE>DB</VERSIONTYPE> -<VERSIONTYPEDESC>Data dictionary only (no diagrams)</VERSIONTYPEDESC> -</VERSIONINFO> -<DATADICT> -<DBID>postgresql8</DBID> -<LASTID>135</LASTID> -<DDSETTINGS> -<PKCONNAMETEMPLATE>PK_%table%</PKCONNAMETEMPLATE> -<FKCONNAMETEMPLATE>%relname%</FKCONNAMETEMPLATE> -<CCONNAMETEMPLATE>CC_%table%_%column%</CCONNAMETEMPLATE> -<NOTNULLCONNAMETEMPLATE>NN_%column%</NOTNULLCONNAMETEMPLATE> -<DEFAULTCONNAMETEMPLATE>DEF_%table%_%column%</DEFAULTCONNAMETEMPLATE> -<TUCONNAMETEMPLATE>TUC_%table%_%counter%</TUCONNAMETEMPLATE> -<TCCONNAMETEMPLATE>TCC_%table%_%counter%</TCCONNAMETEMPLATE> -<RELNAMETEMPLATE>%parent%_%child%</RELNAMETEMPLATE> -<INDEXNAMETEMPLATE>IDX_%table%_%counter%</INDEXNAMETEMPLATE> -<DEFTABLEOPTIONS></DEFTABLEOPTIONS> -<DEFINDEXOPTIONS></DEFINDEXOPTIONS> -<BEGINDATABASESCRIPT></BEGINDATABASESCRIPT> -<ENDDATABASESCRIP></ENDDATABASESCRIP> -<BEGINALTERDATABASESCRIPT></BEGINALTERDATABASESCRIPT> -<ENDALTERDATABASESCRIP></ENDALTERDATABASESCRIP> -<BEGINDROPDATABASESCRIPT></BEGINDROPDATABASESCRIPT> -<ENDDROPDATABASESCRIP></ENDDROPDATABASESCRIP> -<GENDIALOGSELECTEDOBJECTS></GENDIALOGSELECTEDOBJECTS> -<GENTABLES>1</GENTABLES> -<GENTABLEOPTIONS>1</GENTABLEOPTIONS> -<GENCONSTRAINTS>1</GENCONSTRAINTS> -<GENINDEXES>1</GENINDEXES> -<GENTRIGGERS>1</GENTRIGGERS> -<GENVIEWS>1</GENVIEWS> -<GENPROCEDURES>1</GENPROCEDURES> -<GENSEQUENCES>1</GENSEQUENCES> -<GENRELATIONSHIPS>1</GENRELATIONSHIPS> -<GENBEGINENDTABLESCRIPTS>1</GENBEGINENDTABLESCRIPTS> -<GENBEGINENDDBSCRIPTS>1</GENBEGINENDDBSCRIPTS> -<GLOBALPREFIX></GLOBALPREFIX> -<AUTOCREATEINDEXESONKEYS>0</AUTOCREATEINDEXESONKEYS> -<CONVERTDOMAINS>0</CONVERTDOMAINS> -<IGNORECOMMENTS>0</IGNORECOMMENTS> -<USESCHEMANAMES>0</USESCHEMANAMES> -<UCONNAMETEMPLATE></UCONNAMETEMPLATE> -<SQLCREATEFILE>N:\user\cisd\felmer\phosphonetx\schema-001.sql</SQLCREATEFILE> -<SQLDROPFILE>N:\user\cisd\felmer\phosphonetx\drop.sql</SQLDROPFILE> -</DDSETTINGS> -<DOMAINS> -<DOMAIN> -<NAME>CHECKSUM</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>8</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>CODE</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>DESCRIPTION</NAME> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>2000</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>INTEGER_NUMBER</NAME> -<ID>7</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>INTEGER</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>REAL_NUMBER</NAME> -<ID>8</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>LONG_SEQUENCE</NAME> -<ID>9</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>TEXT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>SHORT_DESCRIPTION</NAME> -<ID>11</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>200</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>TECH_ID</NAME> -<ID>12</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>SHORT_SEQUENCE</NAME> -<ID>69</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>1000</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>UNIPROT_ACCESSION_NUMBER</NAME> -<ID>109</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -</DOMAINS> -<ENTITIES> -<ENT> -<NAME>EXPERIMENTS</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>16</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>3</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_EXPERIMENTS</NAME> -<NAMETEMPLATE>PK_EXPERIMENTS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PERM_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>5</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_EXPERIMENTS_1</NAME> -<NAMETEMPLATE>TUC_EXPERIMENTS_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>DATA_SETS</NAME> -<NAMETEMPLATE>IX_FK_DATA_SETS_EXPERIMENTS</NAMETEMPLATE> -<ID>17</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>6</ATTRLASTID> -<IDXLASTID>3</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_DATA_SETS</NAME> -<NAMETEMPLATE>PK_DATA_SETS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>EXPE_ID</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>SAMP_ID</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DB_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>6</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PERM_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>5</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<INDEXES> -<INDEX> -<NAME>IX_FK_DATA_SETS_EXPERIMENTS</NAME> -<NAMETEMPLATE>IX_FK_DATA_SETS_EXPERIMENTS</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>EXPE_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>4</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -<INDEX> -<NAME>IX_FK_DATA_SETS_SAMPLES</NAME> -<NAMETEMPLATE>IX_FK_DATA_SETS_SAMPLES</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>SAMP_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>5</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -</INDEXES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_DATA_SETS_1</NAME> -<NAMETEMPLATE>TUC_DATA_SETS_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>MODIFICATIONS</NAME> -<NAMETEMPLATE>IX_FK_MODIFICATIONS_PEPTIDES</NAMETEMPLATE> -<ID>19</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>6</ATTRLASTID> -<IDXLASTID>3</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_MODIFICATIONS</NAME> -<NAMETEMPLATE>PK_MODIFICATIONS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PEPT_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>MOTY_ID</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>POS</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>7</DOMAINID> -<DT> -<DTLISTNAME>INTEGER</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>MASS</NAME> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>6</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<INDEXES> -<INDEX> -<NAME>IX_FK_MODIFICATIONS_PEPTIDES</NAME> -<NAMETEMPLATE>IX_FK_MODIFICATIONS_PEPTIDES</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>PEPT_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>3</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -<INDEX> -<NAME>IX_FK_MODIFICATIONS_MODIFICATION_TYPES</NAME> -<NAMETEMPLATE>IX_FK_MODIFICATIONS_MODIFICATION_TYPES</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>MOTY_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>4</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -</INDEXES> -</ENT> -<ENT> -<NAME>MODIFICATION_TYPES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>20</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>7</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_MODIFICATION_TYPES</NAME> -<NAMETEMPLATE>PK_MODIFICATION_TYPES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>CODE</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>5</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DESCRIPTION</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>11</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>200</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -<ATTR> -<NAME>AMINO_ACID</NAME> -<ID>7</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER</DTLISTNAME> -<LE>1</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -<ATTR> -<NAME>MASS</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -<ATTR> -<NAME>MASS_TOLERANCE</NAME> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -</ATTRIBUTES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_MODIFICATION_TYPES_1</NAME> -<NAMETEMPLATE>TUC_MODIFICATION_TYPES_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>PEPTIDES</NAME> -<NAMETEMPLATE>IX_FK_PEPTIDES_ABUNDANCES</NAMETEMPLATE> -<ID>21</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>10</ATTRLASTID> -<IDXLASTID>5</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_PEPTIDES</NAME> -<NAMETEMPLATE>PK_PEPTIDES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PROT_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>SEQUENCE</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>10</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>69</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>1000</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>10</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>CHARGE</NAME> -<ID>7</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>7</DOMAINID> -<DT> -<DTLISTNAME>INTEGER</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>7</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<INDEXES> -<INDEX> -<NAME>IX_FK_PEPTIDES_PROTEINS</NAME> -<NAMETEMPLATE>IX_FK_PEPTIDES_PROTEINS</NAMETEMPLATE> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>PROT_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>3</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -</INDEXES> -</ENT> -<ENT> -<NAME>PROTEINS</NAME> -<NAMETEMPLATE>IX_FK_PROTEINS_DATA_SETS</NAMETEMPLATE> -<ID>23</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>11</ATTRLASTID> -<IDXLASTID>7</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_PROTEINS</NAME> -<NAMETEMPLATE>PK_PROTEINS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DASE_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>10</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>10</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PROBABILITY</NAME> -<ID>9</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>9</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<INDEXES> -<INDEX> -<NAME>IDX_PROTEINS_1</NAME> -<NAMETEMPLATE>IDX_PROTEINS_1</NAMETEMPLATE> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>DASE_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>10</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -</INDEXES> -</ENT> -<ENT> -<NAME>SAMPLES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>24</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>4</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_SAMPLES</NAME> -<NAMETEMPLATE>PK_SAMPLES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PERM_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>5</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>EXPE_ID</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_SAMPLES_1</NAME> -<NAMETEMPLATE>TUC_SAMPLES_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>SEQUENCES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>25</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>6</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_SEQUENCES</NAME> -<NAMETEMPLATE>PK_SEQUENCES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DB_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PRRE_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>6</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>AMINO_ACID_SEQUENCE</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>9</DOMAINID> -<DT> -<DTLISTNAME>TEXT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>CHECKSUM</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>4</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>8</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -</ENT> -<ENT> -<NAME>IDENTIFIED_PROTEINS</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>47</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>5</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_IDENTIFIED_PROTEINS</NAME> -<NAMETEMPLATE>PK_IDENTIFIED_PROTEINS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PROT_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>SEQU_ID</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -</ENT> -<ENT> -<NAME>ABUNDANCES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>91</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>6</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_ABUNDANCES</NAME> -<NAMETEMPLATE>PK_ABUNDANCES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PROT_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>SAMP_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>VALUE</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>6</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -</ENT> -<ENT> -<NAME>PROBABILITY_FDR_MAPPINGS</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>96</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>5</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_PROBABILITY_FDR_MAPPINGS</NAME> -<NAMETEMPLATE>PK_PROBABILITY_FDR_MAPPINGS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DASE_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PROBABILITY</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>FALSE_DISCOVERY_RATE</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -</ENT> -<ENT> -<NAME>PROTEIN_REFERENCES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>98</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>4</ATTRLASTID> -<IDXLASTID>2</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_PROTEIN_REFERENCES</NAME> -<NAMETEMPLATE>PK_PROTEIN_REFERENCES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>UNIPROT_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>109</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DESCRIPTION</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>6</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>2000</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -</ATTRIBUTES> -<INDEXES> -<INDEX> -<NAME>IDX_PROTEIN_REFERENCES_1</NAME> -<NAMETEMPLATE>IDX_PROTEIN_REFERENCES_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>UNIPROT_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>3</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -</INDEXES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_PROTEIN_REFERENCES_1</NAME> -<NAMETEMPLATE>TUC_PROTEIN_REFERENCES_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>DATABASES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>110</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>3</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_DATABASES</NAME> -<NAMETEMPLATE>PK_DATABASES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>NAME_AND_VERSION</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>11</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>200</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_DATABASES_1</NAME> -<NAMETEMPLATE>TUC_DATABASES_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -</ENTITIES> -<SUBCATEGORIES> -</SUBCATEGORIES> -<TEXTAREAS> -</TEXTAREAS> -<GROUPBOXES> -</GROUPBOXES> -<STAMPS> -</STAMPS> -<SEQUENCES> -</SEQUENCES> -<PROCEDURES> -</PROCEDURES> -<VIEWS> -</VIEWS> -<RELATIONSHIPS> -<REL> -<NAME>DA_EX_FK</NAME> -<NAMETEMPLATE>DA_EX_FK</NAMETEMPLATE> -<ID>29</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>16</PARENTOBJECTID> -<CHILDOBJECTID>17</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>DA_EX_FK</NAME> -<NAMETEMPLATE>DA_EX_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>4</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>DA_SA_FK</NAME> -<NAMETEMPLATE>DA_SA_FK</NAMETEMPLATE> -<ID>30</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>24</PARENTOBJECTID> -<CHILDOBJECTID>17</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>DA_SA_FK</NAME> -<NAMETEMPLATE>DA_SA_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>5</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>MO_PE_FK</NAME> -<NAMETEMPLATE>MO_PE_FK</NAMETEMPLATE> -<ID>32</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>21</PARENTOBJECTID> -<CHILDOBJECTID>19</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>MO_PE_FK</NAME> -<NAMETEMPLATE>MO_PE_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>3</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>MO_MT_FK</NAME> -<NAMETEMPLATE>MO_MT_FK</NAMETEMPLATE> -<ID>33</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>20</PARENTOBJECTID> -<CHILDOBJECTID>19</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>MO_MT_FK</NAME> -<NAMETEMPLATE>MO_MT_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>4</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>PE_PR_FK</NAME> -<NAMETEMPLATE>PE_PR_FK</NAMETEMPLATE> -<ID>36</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>23</PARENTOBJECTID> -<CHILDOBJECTID>21</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>PE_PR_FK</NAME> -<NAMETEMPLATE>PE_PR_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>3</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>DATA_SETS_PROTEINS</NAME> -<NAMETEMPLATE>DATA_SETS_PROTEINS</NAMETEMPLATE> -<ID>46</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>17</PARENTOBJECTID> -<CHILDOBJECTID>23</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>DATA_SETS_PROTEINS</NAME> -<NAMETEMPLATE>DATA_SETS_PROTEINS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>10</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>10</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>PROTEINS_IDENTIFIED_PROTEINS</NAME> -<NAMETEMPLATE>PROTEINS_IDENTIFIED_PROTEINS</NAMETEMPLATE> -<ID>48</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>23</PARENTOBJECTID> -<CHILDOBJECTID>47</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>PROTEINS_IDENTIFIED_PROTEINS</NAME> -<NAMETEMPLATE>PROTEINS_IDENTIFIED_PROTEINS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>3</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>SEQUENCES_IDENTIFIED_PROTEINS</NAME> -<NAMETEMPLATE>SEQUENCES_IDENTIFIED_PROTEINS</NAMETEMPLATE> -<ID>50</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>25</PARENTOBJECTID> -<CHILDOBJECTID>47</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>SEQUENCES_IDENTIFIED_PROTEINS</NAME> -<NAMETEMPLATE>SEQUENCES_IDENTIFIED_PROTEINS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>5</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>SAMPLES_ABUNDANCES</NAME> -<NAMETEMPLATE>SAMPLES_ABUNDANCES</NAMETEMPLATE> -<ID>92</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>24</PARENTOBJECTID> -<CHILDOBJECTID>91</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>SAMPLES_ABUNDANCES</NAME> -<NAMETEMPLATE>SAMPLES_ABUNDANCES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>4</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>PROTEINS_ABUNDANCES</NAME> -<NAMETEMPLATE>PROTEINS_ABUNDANCES</NAMETEMPLATE> -<ID>94</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>23</PARENTOBJECTID> -<CHILDOBJECTID>91</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>PROTEINS_ABUNDANCES</NAME> -<NAMETEMPLATE>PROTEINS_ABUNDANCES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>3</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>DATA_SETS_PROBABILITY_FDR_MAPPINGS</NAME> -<NAMETEMPLATE>DATA_SETS_PROBABILITY_FDR_MAPPINGS</NAMETEMPLATE> -<ID>97</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>17</PARENTOBJECTID> -<CHILDOBJECTID>96</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>DATA_SETS_PROBABILITY_FDR_MAPPINGS</NAME> -<NAMETEMPLATE>DATA_SETS_PROBABILITY_FDR_MAPPINGS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>5</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>DATABASES_SEQUENCES</NAME> -<NAMETEMPLATE>DATABASES_SEQUENCES</NAMETEMPLATE> -<ID>111</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>110</PARENTOBJECTID> -<CHILDOBJECTID>25</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>DATABASES_SEQUENCES</NAME> -<NAMETEMPLATE>DATABASES_SEQUENCES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>5</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>PROTEIN_REFERENCES_SEQUENCES</NAME> -<NAMETEMPLATE>PROTEIN_REFERENCES_SEQUENCES</NAMETEMPLATE> -<ID>112</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>98</PARENTOBJECTID> -<CHILDOBJECTID>25</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>PROTEIN_REFERENCES_SEQUENCES</NAME> -<NAMETEMPLATE>PROTEIN_REFERENCES_SEQUENCES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>6</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>6</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>DATABASES_DATA_SETS</NAME> -<NAMETEMPLATE>DATABASES_DATA_SETS</NAMETEMPLATE> -<ID>125</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>110</PARENTOBJECTID> -<CHILDOBJECTID>17</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>DATABASES_DATA_SETS</NAME> -<NAMETEMPLATE>DATABASES_DATA_SETS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>6</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>6</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -</RELATIONSHIPS> -<SUBCATEGORYCONNECTIONS> -</SUBCATEGORYCONNECTIONS> -</DATADICT> -</VERSION> -<VERSION> -<VERSIONINFO> -<VERSIONNUMBER>8</VERSIONNUMBER> -<VERSIONLABEL>Version 2009-07-15</VERSIONLABEL> -<VERSIONDATE>2009-07-15 15:52</VERSIONDATE> -<VERSIONCOMMENTS></VERSIONCOMMENTS> -<VERSIONTYPE>DB</VERSIONTYPE> -<VERSIONTYPEDESC>Data dictionary only (no diagrams)</VERSIONTYPEDESC> -</VERSIONINFO> -<DATADICT> -<DBID>postgresql8</DBID> -<LASTID>139</LASTID> -<DDSETTINGS> -<PKCONNAMETEMPLATE>PK_%table%</PKCONNAMETEMPLATE> -<FKCONNAMETEMPLATE>%relname%</FKCONNAMETEMPLATE> -<CCONNAMETEMPLATE>CC_%table%_%column%</CCONNAMETEMPLATE> -<NOTNULLCONNAMETEMPLATE>NN_%column%</NOTNULLCONNAMETEMPLATE> -<DEFAULTCONNAMETEMPLATE>DEF_%table%_%column%</DEFAULTCONNAMETEMPLATE> -<TUCONNAMETEMPLATE>TUC_%table%_%counter%</TUCONNAMETEMPLATE> -<TCCONNAMETEMPLATE>TCC_%table%_%counter%</TCCONNAMETEMPLATE> -<RELNAMETEMPLATE>%parent%_%child%</RELNAMETEMPLATE> -<INDEXNAMETEMPLATE>IDX_%table%_%counter%</INDEXNAMETEMPLATE> -<DEFTABLEOPTIONS></DEFTABLEOPTIONS> -<DEFINDEXOPTIONS></DEFINDEXOPTIONS> -<BEGINDATABASESCRIPT></BEGINDATABASESCRIPT> -<ENDDATABASESCRIP></ENDDATABASESCRIP> -<BEGINALTERDATABASESCRIPT></BEGINALTERDATABASESCRIPT> -<ENDALTERDATABASESCRIP></ENDALTERDATABASESCRIP> -<BEGINDROPDATABASESCRIPT></BEGINDROPDATABASESCRIPT> -<ENDDROPDATABASESCRIP></ENDDROPDATABASESCRIP> -<GENDIALOGSELECTEDOBJECTS></GENDIALOGSELECTEDOBJECTS> -<GENTABLES>1</GENTABLES> -<GENTABLEOPTIONS>1</GENTABLEOPTIONS> -<GENCONSTRAINTS>1</GENCONSTRAINTS> -<GENINDEXES>1</GENINDEXES> -<GENTRIGGERS>1</GENTRIGGERS> -<GENVIEWS>1</GENVIEWS> -<GENPROCEDURES>1</GENPROCEDURES> -<GENSEQUENCES>1</GENSEQUENCES> -<GENRELATIONSHIPS>1</GENRELATIONSHIPS> -<GENBEGINENDTABLESCRIPTS>1</GENBEGINENDTABLESCRIPTS> -<GENBEGINENDDBSCRIPTS>1</GENBEGINENDDBSCRIPTS> -<GLOBALPREFIX></GLOBALPREFIX> -<AUTOCREATEINDEXESONKEYS>0</AUTOCREATEINDEXESONKEYS> -<CONVERTDOMAINS>0</CONVERTDOMAINS> -<IGNORECOMMENTS>0</IGNORECOMMENTS> -<USESCHEMANAMES>0</USESCHEMANAMES> -<UCONNAMETEMPLATE></UCONNAMETEMPLATE> -<SQLCREATEFILE>D:\User\felmer\dev-workspace\rtd_phosphonetx\source\sql\postgresql\001\schema-001.sql</SQLCREATEFILE> -<SQLDROPFILE>D:\User\felmer\dev-workspace\rtd_phosphonetx\source\sql\postgresql\001\drop.sql</SQLDROPFILE> -</DDSETTINGS> -<DOMAINS> -<DOMAIN> -<NAME>CHECKSUM</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>8</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>CODE</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>DESCRIPTION</NAME> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>2000</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>INTEGER_NUMBER</NAME> -<ID>7</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>INTEGER</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>REAL_NUMBER</NAME> -<ID>8</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>LONG_SEQUENCE</NAME> -<ID>9</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>TEXT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>SHORT_DESCRIPTION</NAME> -<ID>11</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>200</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>TECH_ID</NAME> -<ID>12</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>SHORT_SEQUENCE</NAME> -<ID>69</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>1000</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>UNIPROT_ACCESSION_NUMBER</NAME> -<ID>109</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -</DOMAINS> -<ENTITIES> -<ENT> -<NAME>EXPERIMENTS</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>16</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>3</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_EXPERIMENTS</NAME> -<NAMETEMPLATE>PK_EXPERIMENTS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PERM_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>5</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_EXPERIMENTS_1</NAME> -<NAMETEMPLATE>TUC_EXPERIMENTS_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>DATA_SETS</NAME> -<NAMETEMPLATE>IX_FK_DATA_SETS_EXPERIMENTS</NAMETEMPLATE> -<ID>17</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>6</ATTRLASTID> -<IDXLASTID>3</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_DATA_SETS</NAME> -<NAMETEMPLATE>PK_DATA_SETS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>EXPE_ID</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>SAMP_ID</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DB_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>6</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PERM_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>5</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<INDEXES> -<INDEX> -<NAME>IX_FK_DATA_SETS_EXPERIMENTS</NAME> -<NAMETEMPLATE>IX_FK_DATA_SETS_EXPERIMENTS</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>EXPE_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>4</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -<INDEX> -<NAME>IX_FK_DATA_SETS_SAMPLES</NAME> -<NAMETEMPLATE>IX_FK_DATA_SETS_SAMPLES</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>SAMP_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>5</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -</INDEXES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_DATA_SETS_1</NAME> -<NAMETEMPLATE>TUC_DATA_SETS_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>MODIFICATIONS</NAME> -<NAMETEMPLATE>IX_FK_MODIFICATIONS_PEPTIDES</NAMETEMPLATE> -<ID>19</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>7</ATTRLASTID> -<IDXLASTID>5</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_MODIFICATIONS</NAME> -<NAMETEMPLATE>PK_MODIFICATIONS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>MOPE_ID</NAME> -<ID>7</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>7</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>POS</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>7</DOMAINID> -<DT> -<DTLISTNAME>INTEGER</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>MASS</NAME> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>6</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -</ENT> -<ENT> -<NAME>PEPTIDES</NAME> -<NAMETEMPLATE>IX_FK_PEPTIDES_ABUNDANCES</NAMETEMPLATE> -<ID>21</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>10</ATTRLASTID> -<IDXLASTID>5</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_PEPTIDES</NAME> -<NAMETEMPLATE>PK_PEPTIDES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PROT_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>SEQUENCE</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>10</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>69</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>1000</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>10</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>CHARGE</NAME> -<ID>7</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>7</DOMAINID> -<DT> -<DTLISTNAME>INTEGER</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>7</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<INDEXES> -<INDEX> -<NAME>IX_FK_PEPTIDES_PROTEINS</NAME> -<NAMETEMPLATE>IX_FK_PEPTIDES_PROTEINS</NAMETEMPLATE> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>PROT_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>3</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -</INDEXES> -</ENT> -<ENT> -<NAME>PROTEINS</NAME> -<NAMETEMPLATE>IX_FK_PROTEINS_DATA_SETS</NAMETEMPLATE> -<ID>23</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>11</ATTRLASTID> -<IDXLASTID>7</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_PROTEINS</NAME> -<NAMETEMPLATE>PK_PROTEINS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DASE_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>10</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>10</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PROBABILITY</NAME> -<ID>9</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>9</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<INDEXES> -<INDEX> -<NAME>IDX_PROTEINS_1</NAME> -<NAMETEMPLATE>IDX_PROTEINS_1</NAMETEMPLATE> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>DASE_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>10</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -</INDEXES> -</ENT> -<ENT> -<NAME>SAMPLES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>24</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>4</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_SAMPLES</NAME> -<NAMETEMPLATE>PK_SAMPLES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PERM_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>5</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>EXPE_ID</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_SAMPLES_1</NAME> -<NAMETEMPLATE>TUC_SAMPLES_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>SEQUENCES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>25</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>6</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_SEQUENCES</NAME> -<NAMETEMPLATE>PK_SEQUENCES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DB_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PRRE_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>6</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>AMINO_ACID_SEQUENCE</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>9</DOMAINID> -<DT> -<DTLISTNAME>TEXT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>CHECKSUM</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>4</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>8</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -</ENT> -<ENT> -<NAME>IDENTIFIED_PROTEINS</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>47</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>5</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_IDENTIFIED_PROTEINS</NAME> -<NAMETEMPLATE>PK_IDENTIFIED_PROTEINS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PROT_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>SEQU_ID</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -</ENT> -<ENT> -<NAME>ABUNDANCES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>91</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>6</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_ABUNDANCES</NAME> -<NAMETEMPLATE>PK_ABUNDANCES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PROT_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>SAMP_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>VALUE</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>6</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -</ENT> -<ENT> -<NAME>PROBABILITY_FDR_MAPPINGS</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>96</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>5</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_PROBABILITY_FDR_MAPPINGS</NAME> -<NAMETEMPLATE>PK_PROBABILITY_FDR_MAPPINGS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DASE_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PROBABILITY</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>FALSE_DISCOVERY_RATE</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -</ENT> -<ENT> -<NAME>PROTEIN_REFERENCES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>98</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>4</ATTRLASTID> -<IDXLASTID>2</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_PROTEIN_REFERENCES</NAME> -<NAMETEMPLATE>PK_PROTEIN_REFERENCES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>UNIPROT_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>109</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DESCRIPTION</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>6</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>2000</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -</ATTRIBUTES> -<INDEXES> -<INDEX> -<NAME>IDX_PROTEIN_REFERENCES_1</NAME> -<NAMETEMPLATE>IDX_PROTEIN_REFERENCES_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>UNIPROT_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>3</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -</INDEXES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_PROTEIN_REFERENCES_1</NAME> -<NAMETEMPLATE>TUC_PROTEIN_REFERENCES_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>DATABASES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>110</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>3</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_DATABASES</NAME> -<NAMETEMPLATE>PK_DATABASES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>NAME_AND_VERSION</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>11</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>200</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_DATABASES_1</NAME> -<NAMETEMPLATE>TUC_DATABASES_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>MODIFIED_PEPTIDES</NAME> -<ID>136</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>5</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_MODIFIED_PEPTIDES</NAME> -<NAMETEMPLATE>PK_MODIFIED_PEPTIDES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PEPT_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>NTERM_MASS</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>CTERM_MASS</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -</ENT> -</ENTITIES> -<SUBCATEGORIES> -</SUBCATEGORIES> -<TEXTAREAS> -</TEXTAREAS> -<GROUPBOXES> -</GROUPBOXES> -<STAMPS> -</STAMPS> -<SEQUENCES> -</SEQUENCES> -<PROCEDURES> -</PROCEDURES> -<VIEWS> -</VIEWS> -<RELATIONSHIPS> -<REL> -<NAME>DA_EX_FK</NAME> -<NAMETEMPLATE>DA_EX_FK</NAMETEMPLATE> -<ID>29</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>16</PARENTOBJECTID> -<CHILDOBJECTID>17</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>DA_EX_FK</NAME> -<NAMETEMPLATE>DA_EX_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>4</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>DA_SA_FK</NAME> -<NAMETEMPLATE>DA_SA_FK</NAMETEMPLATE> -<ID>30</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>24</PARENTOBJECTID> -<CHILDOBJECTID>17</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>DA_SA_FK</NAME> -<NAMETEMPLATE>DA_SA_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>5</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>PE_PR_FK</NAME> -<NAMETEMPLATE>PE_PR_FK</NAMETEMPLATE> -<ID>36</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>23</PARENTOBJECTID> -<CHILDOBJECTID>21</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>PE_PR_FK</NAME> -<NAMETEMPLATE>PE_PR_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>3</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>DATA_SETS_PROTEINS</NAME> -<NAMETEMPLATE>DATA_SETS_PROTEINS</NAMETEMPLATE> -<ID>46</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>17</PARENTOBJECTID> -<CHILDOBJECTID>23</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>DATA_SETS_PROTEINS</NAME> -<NAMETEMPLATE>DATA_SETS_PROTEINS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>10</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>10</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>PROTEINS_IDENTIFIED_PROTEINS</NAME> -<NAMETEMPLATE>PROTEINS_IDENTIFIED_PROTEINS</NAMETEMPLATE> -<ID>48</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>23</PARENTOBJECTID> -<CHILDOBJECTID>47</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>PROTEINS_IDENTIFIED_PROTEINS</NAME> -<NAMETEMPLATE>PROTEINS_IDENTIFIED_PROTEINS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>3</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>SEQUENCES_IDENTIFIED_PROTEINS</NAME> -<NAMETEMPLATE>SEQUENCES_IDENTIFIED_PROTEINS</NAMETEMPLATE> -<ID>50</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>25</PARENTOBJECTID> -<CHILDOBJECTID>47</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>SEQUENCES_IDENTIFIED_PROTEINS</NAME> -<NAMETEMPLATE>SEQUENCES_IDENTIFIED_PROTEINS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>5</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>SAMPLES_ABUNDANCES</NAME> -<NAMETEMPLATE>SAMPLES_ABUNDANCES</NAMETEMPLATE> -<ID>92</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>24</PARENTOBJECTID> -<CHILDOBJECTID>91</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>SAMPLES_ABUNDANCES</NAME> -<NAMETEMPLATE>SAMPLES_ABUNDANCES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>4</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>PROTEINS_ABUNDANCES</NAME> -<NAMETEMPLATE>PROTEINS_ABUNDANCES</NAMETEMPLATE> -<ID>94</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>23</PARENTOBJECTID> -<CHILDOBJECTID>91</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>PROTEINS_ABUNDANCES</NAME> -<NAMETEMPLATE>PROTEINS_ABUNDANCES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>3</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>DATA_SETS_PROBABILITY_FDR_MAPPINGS</NAME> -<NAMETEMPLATE>DATA_SETS_PROBABILITY_FDR_MAPPINGS</NAMETEMPLATE> -<ID>97</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>17</PARENTOBJECTID> -<CHILDOBJECTID>96</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>DATA_SETS_PROBABILITY_FDR_MAPPINGS</NAME> -<NAMETEMPLATE>DATA_SETS_PROBABILITY_FDR_MAPPINGS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>5</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>DATABASES_SEQUENCES</NAME> -<NAMETEMPLATE>DATABASES_SEQUENCES</NAMETEMPLATE> -<ID>111</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>110</PARENTOBJECTID> -<CHILDOBJECTID>25</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>DATABASES_SEQUENCES</NAME> -<NAMETEMPLATE>DATABASES_SEQUENCES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>5</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>PROTEIN_REFERENCES_SEQUENCES</NAME> -<NAMETEMPLATE>PROTEIN_REFERENCES_SEQUENCES</NAMETEMPLATE> -<ID>112</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>98</PARENTOBJECTID> -<CHILDOBJECTID>25</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>PROTEIN_REFERENCES_SEQUENCES</NAME> -<NAMETEMPLATE>PROTEIN_REFERENCES_SEQUENCES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>6</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>6</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>DATABASES_DATA_SETS</NAME> -<NAMETEMPLATE>DATABASES_DATA_SETS</NAMETEMPLATE> -<ID>125</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>110</PARENTOBJECTID> -<CHILDOBJECTID>17</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>DATABASES_DATA_SETS</NAME> -<NAMETEMPLATE>DATABASES_DATA_SETS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>6</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>6</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>PEPTIDES_MODIFIED_PEPTIDES</NAME> -<NAMETEMPLATE>PEPTIDES_MODIFIED_PEPTIDES</NAMETEMPLATE> -<ID>138</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>21</PARENTOBJECTID> -<CHILDOBJECTID>136</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>PEPTIDES_MODIFIED_PEPTIDES</NAME> -<NAMETEMPLATE>PEPTIDES_MODIFIED_PEPTIDES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>3</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>MODIFIED_PEPTIDES_MODIFICATIONS</NAME> -<NAMETEMPLATE>MODIFIED_PEPTIDES_MODIFICATIONS</NAMETEMPLATE> -<ID>139</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>136</PARENTOBJECTID> -<CHILDOBJECTID>19</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>MODIFIED_PEPTIDES_MODIFICATIONS</NAME> -<NAMETEMPLATE>MODIFIED_PEPTIDES_MODIFICATIONS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>7</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>7</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -</RELATIONSHIPS> -<SUBCATEGORYCONNECTIONS> -</SUBCATEGORYCONNECTIONS> -</DATADICT> -</VERSION> -<VERSION> -<VERSIONINFO> -<VERSIONNUMBER>9</VERSIONNUMBER> -<VERSIONLABEL>Version 2009-07-15 1</VERSIONLABEL> -<VERSIONDATE>2009-07-15 15:53</VERSIONDATE> -<VERSIONCOMMENTS></VERSIONCOMMENTS> -<VERSIONTYPE>DB</VERSIONTYPE> -<VERSIONTYPEDESC>Data dictionary only (no diagrams)</VERSIONTYPEDESC> -</VERSIONINFO> -<DATADICT> -<DBID>postgresql8</DBID> -<LASTID>139</LASTID> -<DDSETTINGS> -<PKCONNAMETEMPLATE>PK_%table%</PKCONNAMETEMPLATE> -<FKCONNAMETEMPLATE>%relname%</FKCONNAMETEMPLATE> -<CCONNAMETEMPLATE>CC_%table%_%column%</CCONNAMETEMPLATE> -<NOTNULLCONNAMETEMPLATE>NN_%column%</NOTNULLCONNAMETEMPLATE> -<DEFAULTCONNAMETEMPLATE>DEF_%table%_%column%</DEFAULTCONNAMETEMPLATE> -<TUCONNAMETEMPLATE>TUC_%table%_%counter%</TUCONNAMETEMPLATE> -<TCCONNAMETEMPLATE>TCC_%table%_%counter%</TCCONNAMETEMPLATE> -<RELNAMETEMPLATE>%parent%_%child%</RELNAMETEMPLATE> -<INDEXNAMETEMPLATE>IDX_%table%_%counter%</INDEXNAMETEMPLATE> -<DEFTABLEOPTIONS></DEFTABLEOPTIONS> -<DEFINDEXOPTIONS></DEFINDEXOPTIONS> -<BEGINDATABASESCRIPT></BEGINDATABASESCRIPT> -<ENDDATABASESCRIP></ENDDATABASESCRIP> -<BEGINALTERDATABASESCRIPT></BEGINALTERDATABASESCRIPT> -<ENDALTERDATABASESCRIP></ENDALTERDATABASESCRIP> -<BEGINDROPDATABASESCRIPT></BEGINDROPDATABASESCRIPT> -<ENDDROPDATABASESCRIP></ENDDROPDATABASESCRIP> -<GENDIALOGSELECTEDOBJECTS></GENDIALOGSELECTEDOBJECTS> -<GENTABLES>1</GENTABLES> -<GENTABLEOPTIONS>1</GENTABLEOPTIONS> -<GENCONSTRAINTS>1</GENCONSTRAINTS> -<GENINDEXES>1</GENINDEXES> -<GENTRIGGERS>1</GENTRIGGERS> -<GENVIEWS>1</GENVIEWS> -<GENPROCEDURES>1</GENPROCEDURES> -<GENSEQUENCES>1</GENSEQUENCES> -<GENRELATIONSHIPS>1</GENRELATIONSHIPS> -<GENBEGINENDTABLESCRIPTS>1</GENBEGINENDTABLESCRIPTS> -<GENBEGINENDDBSCRIPTS>1</GENBEGINENDDBSCRIPTS> -<GLOBALPREFIX></GLOBALPREFIX> -<AUTOCREATEINDEXESONKEYS>0</AUTOCREATEINDEXESONKEYS> -<CONVERTDOMAINS>0</CONVERTDOMAINS> -<IGNORECOMMENTS>0</IGNORECOMMENTS> -<USESCHEMANAMES>0</USESCHEMANAMES> -<UCONNAMETEMPLATE></UCONNAMETEMPLATE> -<SQLCREATEFILE>D:\User\felmer\dev-workspace\rtd_phosphonetx\source\sql\postgresql\001\schema-001.sql</SQLCREATEFILE> -<SQLDROPFILE>D:\User\felmer\dev-workspace\rtd_phosphonetx\source\sql\postgresql\001\drop.sql</SQLDROPFILE> -</DDSETTINGS> -<DOMAINS> -<DOMAIN> -<NAME>CHECKSUM</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>8</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>CODE</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>DESCRIPTION</NAME> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>2000</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>INTEGER_NUMBER</NAME> -<ID>7</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>INTEGER</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>REAL_NUMBER</NAME> -<ID>8</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>LONG_SEQUENCE</NAME> -<ID>9</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>TEXT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>SHORT_DESCRIPTION</NAME> -<ID>11</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>200</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>TECH_ID</NAME> -<ID>12</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>SHORT_SEQUENCE</NAME> -<ID>69</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>1000</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>UNIPROT_ACCESSION_NUMBER</NAME> -<ID>109</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -</DOMAINS> -<ENTITIES> -<ENT> -<NAME>EXPERIMENTS</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>16</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>3</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_EXPERIMENTS</NAME> -<NAMETEMPLATE>PK_EXPERIMENTS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PERM_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>5</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_EXPERIMENTS_1</NAME> -<NAMETEMPLATE>TUC_EXPERIMENTS_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>DATA_SETS</NAME> -<NAMETEMPLATE>IX_FK_DATA_SETS_EXPERIMENTS</NAMETEMPLATE> -<ID>17</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>6</ATTRLASTID> -<IDXLASTID>3</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_DATA_SETS</NAME> -<NAMETEMPLATE>PK_DATA_SETS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>EXPE_ID</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>SAMP_ID</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DB_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>6</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PERM_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>5</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<INDEXES> -<INDEX> -<NAME>IX_FK_DATA_SETS_EXPERIMENTS</NAME> -<NAMETEMPLATE>IX_FK_DATA_SETS_EXPERIMENTS</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>EXPE_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>4</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -<INDEX> -<NAME>IX_FK_DATA_SETS_SAMPLES</NAME> -<NAMETEMPLATE>IX_FK_DATA_SETS_SAMPLES</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>SAMP_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>5</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -</INDEXES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_DATA_SETS_1</NAME> -<NAMETEMPLATE>TUC_DATA_SETS_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>MODIFICATIONS</NAME> -<NAMETEMPLATE>IX_FK_MODIFICATIONS_PEPTIDES</NAMETEMPLATE> -<ID>19</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>7</ATTRLASTID> -<IDXLASTID>5</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_MODIFICATIONS</NAME> -<NAMETEMPLATE>PK_MODIFICATIONS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>MOPE_ID</NAME> -<ID>7</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>7</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>POS</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>7</DOMAINID> -<DT> -<DTLISTNAME>INTEGER</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>MASS</NAME> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>6</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -</ENT> -<ENT> -<NAME>PEPTIDES</NAME> -<NAMETEMPLATE>IX_FK_PEPTIDES_ABUNDANCES</NAMETEMPLATE> -<ID>21</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>10</ATTRLASTID> -<IDXLASTID>5</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_PEPTIDES</NAME> -<NAMETEMPLATE>PK_PEPTIDES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PROT_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>SEQUENCE</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>10</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>69</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>1000</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>10</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>CHARGE</NAME> -<ID>7</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>7</DOMAINID> -<DT> -<DTLISTNAME>INTEGER</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>7</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<INDEXES> -<INDEX> -<NAME>IX_FK_PEPTIDES_PROTEINS</NAME> -<NAMETEMPLATE>IX_FK_PEPTIDES_PROTEINS</NAMETEMPLATE> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>PROT_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>3</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -</INDEXES> -</ENT> -<ENT> -<NAME>PROTEINS</NAME> -<NAMETEMPLATE>IX_FK_PROTEINS_DATA_SETS</NAMETEMPLATE> -<ID>23</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>11</ATTRLASTID> -<IDXLASTID>7</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_PROTEINS</NAME> -<NAMETEMPLATE>PK_PROTEINS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DASE_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>10</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>10</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PROBABILITY</NAME> -<ID>9</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>9</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<INDEXES> -<INDEX> -<NAME>IDX_PROTEINS_1</NAME> -<NAMETEMPLATE>IDX_PROTEINS_1</NAMETEMPLATE> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>DASE_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>10</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -</INDEXES> -</ENT> -<ENT> -<NAME>SAMPLES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>24</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>4</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_SAMPLES</NAME> -<NAMETEMPLATE>PK_SAMPLES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PERM_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>5</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>EXPE_ID</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_SAMPLES_1</NAME> -<NAMETEMPLATE>TUC_SAMPLES_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>SEQUENCES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>25</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>6</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_SEQUENCES</NAME> -<NAMETEMPLATE>PK_SEQUENCES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DB_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PRRE_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>6</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>AMINO_ACID_SEQUENCE</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>9</DOMAINID> -<DT> -<DTLISTNAME>TEXT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>CHECKSUM</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>4</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>8</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -</ENT> -<ENT> -<NAME>IDENTIFIED_PROTEINS</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>47</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>5</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_IDENTIFIED_PROTEINS</NAME> -<NAMETEMPLATE>PK_IDENTIFIED_PROTEINS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PROT_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>SEQU_ID</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -</ENT> -<ENT> -<NAME>ABUNDANCES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>91</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>6</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_ABUNDANCES</NAME> -<NAMETEMPLATE>PK_ABUNDANCES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PROT_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>SAMP_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>VALUE</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>6</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -</ENT> -<ENT> -<NAME>PROBABILITY_FDR_MAPPINGS</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>96</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>5</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_PROBABILITY_FDR_MAPPINGS</NAME> -<NAMETEMPLATE>PK_PROBABILITY_FDR_MAPPINGS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DASE_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PROBABILITY</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>FALSE_DISCOVERY_RATE</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -</ENT> -<ENT> -<NAME>PROTEIN_REFERENCES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>98</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>4</ATTRLASTID> -<IDXLASTID>2</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_PROTEIN_REFERENCES</NAME> -<NAMETEMPLATE>PK_PROTEIN_REFERENCES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>UNIPROT_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>109</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DESCRIPTION</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>6</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>2000</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -</ATTRIBUTES> -<INDEXES> -<INDEX> -<NAME>IDX_PROTEIN_REFERENCES_1</NAME> -<NAMETEMPLATE>IDX_PROTEIN_REFERENCES_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>UNIPROT_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>3</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -</INDEXES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_PROTEIN_REFERENCES_1</NAME> -<NAMETEMPLATE>TUC_PROTEIN_REFERENCES_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>DATABASES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>110</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>3</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_DATABASES</NAME> -<NAMETEMPLATE>PK_DATABASES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>NAME_AND_VERSION</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>11</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>200</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_DATABASES_1</NAME> -<NAMETEMPLATE>TUC_DATABASES_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>MODIFIED_PEPTIDES</NAME> -<ID>136</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>5</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_MODIFIED_PEPTIDES</NAME> -<NAMETEMPLATE>PK_MODIFIED_PEPTIDES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PEPT_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>NTERM_MASS</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>CTERM_MASS</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -</ENT> -</ENTITIES> -<SUBCATEGORIES> -</SUBCATEGORIES> -<TEXTAREAS> -</TEXTAREAS> -<GROUPBOXES> -</GROUPBOXES> -<STAMPS> -</STAMPS> -<SEQUENCES> -</SEQUENCES> -<PROCEDURES> -</PROCEDURES> -<VIEWS> -</VIEWS> -<RELATIONSHIPS> -<REL> -<NAME>DA_EX_FK</NAME> -<NAMETEMPLATE>DA_EX_FK</NAMETEMPLATE> -<ID>29</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>16</PARENTOBJECTID> -<CHILDOBJECTID>17</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>DA_EX_FK</NAME> -<NAMETEMPLATE>DA_EX_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>4</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>DA_SA_FK</NAME> -<NAMETEMPLATE>DA_SA_FK</NAMETEMPLATE> -<ID>30</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>24</PARENTOBJECTID> -<CHILDOBJECTID>17</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>DA_SA_FK</NAME> -<NAMETEMPLATE>DA_SA_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>5</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>PE_PR_FK</NAME> -<NAMETEMPLATE>PE_PR_FK</NAMETEMPLATE> -<ID>36</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>23</PARENTOBJECTID> -<CHILDOBJECTID>21</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>PE_PR_FK</NAME> -<NAMETEMPLATE>PE_PR_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>3</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>DATA_SETS_PROTEINS</NAME> -<NAMETEMPLATE>DATA_SETS_PROTEINS</NAMETEMPLATE> -<ID>46</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>17</PARENTOBJECTID> -<CHILDOBJECTID>23</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>DATA_SETS_PROTEINS</NAME> -<NAMETEMPLATE>DATA_SETS_PROTEINS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>10</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>10</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>PROTEINS_IDENTIFIED_PROTEINS</NAME> -<NAMETEMPLATE>PROTEINS_IDENTIFIED_PROTEINS</NAMETEMPLATE> -<ID>48</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>23</PARENTOBJECTID> -<CHILDOBJECTID>47</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>PROTEINS_IDENTIFIED_PROTEINS</NAME> -<NAMETEMPLATE>PROTEINS_IDENTIFIED_PROTEINS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>3</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>SEQUENCES_IDENTIFIED_PROTEINS</NAME> -<NAMETEMPLATE>SEQUENCES_IDENTIFIED_PROTEINS</NAMETEMPLATE> -<ID>50</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>25</PARENTOBJECTID> -<CHILDOBJECTID>47</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>SEQUENCES_IDENTIFIED_PROTEINS</NAME> -<NAMETEMPLATE>SEQUENCES_IDENTIFIED_PROTEINS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>5</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>SAMPLES_ABUNDANCES</NAME> -<NAMETEMPLATE>SAMPLES_ABUNDANCES</NAMETEMPLATE> -<ID>92</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>24</PARENTOBJECTID> -<CHILDOBJECTID>91</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>SAMPLES_ABUNDANCES</NAME> -<NAMETEMPLATE>SAMPLES_ABUNDANCES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>4</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>PROTEINS_ABUNDANCES</NAME> -<NAMETEMPLATE>PROTEINS_ABUNDANCES</NAMETEMPLATE> -<ID>94</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>23</PARENTOBJECTID> -<CHILDOBJECTID>91</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>PROTEINS_ABUNDANCES</NAME> -<NAMETEMPLATE>PROTEINS_ABUNDANCES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>3</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>DATA_SETS_PROBABILITY_FDR_MAPPINGS</NAME> -<NAMETEMPLATE>DATA_SETS_PROBABILITY_FDR_MAPPINGS</NAMETEMPLATE> -<ID>97</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>17</PARENTOBJECTID> -<CHILDOBJECTID>96</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>DATA_SETS_PROBABILITY_FDR_MAPPINGS</NAME> -<NAMETEMPLATE>DATA_SETS_PROBABILITY_FDR_MAPPINGS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>5</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>DATABASES_SEQUENCES</NAME> -<NAMETEMPLATE>DATABASES_SEQUENCES</NAMETEMPLATE> -<ID>111</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>110</PARENTOBJECTID> -<CHILDOBJECTID>25</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>DATABASES_SEQUENCES</NAME> -<NAMETEMPLATE>DATABASES_SEQUENCES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>5</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>PROTEIN_REFERENCES_SEQUENCES</NAME> -<NAMETEMPLATE>PROTEIN_REFERENCES_SEQUENCES</NAMETEMPLATE> -<ID>112</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>98</PARENTOBJECTID> -<CHILDOBJECTID>25</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>PROTEIN_REFERENCES_SEQUENCES</NAME> -<NAMETEMPLATE>PROTEIN_REFERENCES_SEQUENCES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>6</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>6</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>DATABASES_DATA_SETS</NAME> -<NAMETEMPLATE>DATABASES_DATA_SETS</NAMETEMPLATE> -<ID>125</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>110</PARENTOBJECTID> -<CHILDOBJECTID>17</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>DATABASES_DATA_SETS</NAME> -<NAMETEMPLATE>DATABASES_DATA_SETS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>6</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>6</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>PEPTIDES_MODIFIED_PEPTIDES</NAME> -<NAMETEMPLATE>PEPTIDES_MODIFIED_PEPTIDES</NAMETEMPLATE> -<ID>138</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>21</PARENTOBJECTID> -<CHILDOBJECTID>136</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>PEPTIDES_MODIFIED_PEPTIDES</NAME> -<NAMETEMPLATE>PEPTIDES_MODIFIED_PEPTIDES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>3</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>MODIFIED_PEPTIDES_MODIFICATIONS</NAME> -<NAMETEMPLATE>MODIFIED_PEPTIDES_MODIFICATIONS</NAMETEMPLATE> -<ID>139</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>136</PARENTOBJECTID> -<CHILDOBJECTID>19</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>MODIFIED_PEPTIDES_MODIFICATIONS</NAME> -<NAMETEMPLATE>MODIFIED_PEPTIDES_MODIFICATIONS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>7</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>7</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -</RELATIONSHIPS> -<SUBCATEGORYCONNECTIONS> -</SUBCATEGORYCONNECTIONS> -</DATADICT> -</VERSION> - -</dezign> \ No newline at end of file diff --git a/rtd_phosphonetx/source/sql/proteomics/postgresql/001/schema-001.png b/rtd_phosphonetx/source/sql/proteomics/postgresql/001/schema-001.png deleted file mode 100644 index 69f33d205fd55433318b8e294148b3eb20267d5d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 199097 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 diff --git a/rtd_phosphonetx/source/sql/proteomics/postgresql/001/schema-001.sql b/rtd_phosphonetx/source/sql/proteomics/postgresql/001/schema-001.sql deleted file mode 100644 index 5aaa048555b..00000000000 --- a/rtd_phosphonetx/source/sql/proteomics/postgresql/001/schema-001.sql +++ /dev/null @@ -1,284 +0,0 @@ -/* ---------------------------------------------------------------------- */ -/* Script generated with: DeZign for Databases v5.2.3 */ -/* Target DBMS: PostgreSQL 8 */ -/* Project file: schema-001.dez */ -/* Project name: */ -/* Author: */ -/* Script type: Database creation script */ -/* Created on: 2009-09-28 08:43 */ -/* Model version: Version 2009-09-28 */ -/* ---------------------------------------------------------------------- */ - - -/* ---------------------------------------------------------------------- */ -/* Domains */ -/* ---------------------------------------------------------------------- */ - -CREATE DOMAIN CHECKSUM AS CHARACTER VARYING(8); - -CREATE DOMAIN CODE AS CHARACTER VARYING(40); - -CREATE DOMAIN DESCRIPTION AS CHARACTER VARYING(2000); - -CREATE DOMAIN INTEGER_NUMBER AS INTEGER; - -CREATE DOMAIN REAL_NUMBER AS DOUBLE PRECISION; - -CREATE DOMAIN LONG_SEQUENCE AS TEXT; - -CREATE DOMAIN SHORT_DESCRIPTION AS CHARACTER VARYING(200); - -CREATE DOMAIN TECH_ID AS BIGINT; - -CREATE DOMAIN SHORT_SEQUENCE AS CHARACTER VARYING(1000); - -CREATE DOMAIN ACCESSION_NUMBER AS CHARACTER VARYING(256); - -CREATE DOMAIN SPECTRUM_REFERENCE AS CHARACTER VARYING(100); - -/* ---------------------------------------------------------------------- */ -/* Tables */ -/* ---------------------------------------------------------------------- */ - -/* ---------------------------------------------------------------------- */ -/* Add table "EXPERIMENTS" */ -/* ---------------------------------------------------------------------- */ - -CREATE TABLE EXPERIMENTS ( - ID BIGSERIAL NOT NULL, - PERM_ID CODE NOT NULL, - CONSTRAINT PK_EXPERIMENTS PRIMARY KEY (ID), - CONSTRAINT TUC_EXPERIMENTS_1 UNIQUE (PERM_ID) -); - -/* ---------------------------------------------------------------------- */ -/* Add table "DATA_SETS" */ -/* ---------------------------------------------------------------------- */ - -CREATE TABLE DATA_SETS ( - ID BIGSERIAL NOT NULL, - EXPE_ID TECH_ID NOT NULL, - SAMP_ID TECH_ID, - DB_ID TECH_ID NOT NULL, - PERM_ID CODE NOT NULL, - CONSTRAINT PK_DATA_SETS PRIMARY KEY (ID), - CONSTRAINT TUC_DATA_SETS_1 UNIQUE (PERM_ID) -); - -CREATE INDEX IX_FK_DATA_SETS_EXPERIMENTS ON DATA_SETS (EXPE_ID); - -CREATE INDEX IX_FK_DATA_SETS_SAMPLES ON DATA_SETS (SAMP_ID); - -/* ---------------------------------------------------------------------- */ -/* Add table "MODIFICATIONS" */ -/* ---------------------------------------------------------------------- */ - -CREATE TABLE MODIFICATIONS ( - ID BIGSERIAL NOT NULL, - MOPE_ID TECH_ID NOT NULL, - POS INTEGER_NUMBER NOT NULL, - MASS REAL_NUMBER NOT NULL, - CONSTRAINT PK_MODIFICATIONS PRIMARY KEY (ID) -); - -/* ---------------------------------------------------------------------- */ -/* Add table "PEPTIDES" */ -/* ---------------------------------------------------------------------- */ - -CREATE TABLE PEPTIDES ( - ID BIGSERIAL NOT NULL, - PROT_ID TECH_ID NOT NULL, - SEQUENCE SHORT_SEQUENCE NOT NULL, - CHARGE INTEGER_NUMBER NOT NULL, - CONSTRAINT PK_PEPTIDES PRIMARY KEY (ID) -); - -CREATE INDEX IX_FK_PEPTIDES_PROTEINS ON PEPTIDES (PROT_ID); - -/* ---------------------------------------------------------------------- */ -/* Add table "PROTEINS" */ -/* ---------------------------------------------------------------------- */ - -CREATE TABLE PROTEINS ( - ID BIGSERIAL NOT NULL, - DASE_ID TECH_ID NOT NULL, - PROBABILITY REAL_NUMBER NOT NULL, - CONSTRAINT PK_PROTEINS PRIMARY KEY (ID) -); - -CREATE INDEX IDX_PROTEINS_1 ON PROTEINS (DASE_ID); - -/* ---------------------------------------------------------------------- */ -/* Add table "SAMPLES" */ -/* ---------------------------------------------------------------------- */ - -CREATE TABLE SAMPLES ( - ID BIGSERIAL NOT NULL, - PERM_ID CODE NOT NULL, - EXPE_ID TECH_ID NOT NULL, - CONSTRAINT PK_SAMPLES PRIMARY KEY (ID), - CONSTRAINT TUC_SAMPLES_1 UNIQUE (PERM_ID) -); - -/* ---------------------------------------------------------------------- */ -/* Add table "SEQUENCES" */ -/* ---------------------------------------------------------------------- */ - -CREATE TABLE SEQUENCES ( - ID BIGSERIAL NOT NULL, - DB_ID TECH_ID NOT NULL, - PRRE_ID TECH_ID NOT NULL, - AMINO_ACID_SEQUENCE LONG_SEQUENCE NOT NULL, - CHECKSUM CHECKSUM NOT NULL, - CONSTRAINT PK_SEQUENCES PRIMARY KEY (ID) -); - -/* ---------------------------------------------------------------------- */ -/* Add table "IDENTIFIED_PROTEINS" */ -/* ---------------------------------------------------------------------- */ - -CREATE TABLE IDENTIFIED_PROTEINS ( - ID BIGSERIAL NOT NULL, - PROT_ID TECH_ID NOT NULL, - SEQU_ID TECH_ID NOT NULL, - CONSTRAINT PK_IDENTIFIED_PROTEINS PRIMARY KEY (ID) -); - -/* ---------------------------------------------------------------------- */ -/* Add table "ABUNDANCES" */ -/* ---------------------------------------------------------------------- */ - -CREATE TABLE ABUNDANCES ( - ID BIGSERIAL NOT NULL, - PROT_ID TECH_ID NOT NULL, - SAMP_ID TECH_ID NOT NULL, - VALUE REAL_NUMBER NOT NULL, - CONSTRAINT PK_ABUNDANCES PRIMARY KEY (ID) -); - -/* ---------------------------------------------------------------------- */ -/* Add table "PROBABILITY_FDR_MAPPINGS" */ -/* ---------------------------------------------------------------------- */ - -CREATE TABLE PROBABILITY_FDR_MAPPINGS ( - ID BIGSERIAL NOT NULL, - DASE_ID TECH_ID NOT NULL, - PROBABILITY REAL_NUMBER NOT NULL, - FALSE_DISCOVERY_RATE REAL_NUMBER NOT NULL, - CONSTRAINT PK_PROBABILITY_FDR_MAPPINGS PRIMARY KEY (ID) -); - -/* ---------------------------------------------------------------------- */ -/* Add table "PROTEIN_REFERENCES" */ -/* ---------------------------------------------------------------------- */ - -CREATE TABLE PROTEIN_REFERENCES ( - ID BIGSERIAL NOT NULL, - ACCESSION_NUMBER ACCESSION_NUMBER NOT NULL, - DESCRIPTION DESCRIPTION, - CONSTRAINT PK_PROTEIN_REFERENCES PRIMARY KEY (ID), - CONSTRAINT TUC_PROTEIN_REFERENCES_1 UNIQUE (ACCESSION_NUMBER) -); - -CREATE INDEX IDX_PROTEIN_REFERENCES_1 ON PROTEIN_REFERENCES (ACCESSION_NUMBER); - -/* ---------------------------------------------------------------------- */ -/* Add table "DATABASES" */ -/* ---------------------------------------------------------------------- */ - -CREATE TABLE DATABASES ( - ID BIGSERIAL NOT NULL, - NAME_AND_VERSION SHORT_DESCRIPTION NOT NULL, - CONSTRAINT PK_DATABASES PRIMARY KEY (ID), - CONSTRAINT TUC_DATABASES_1 UNIQUE (NAME_AND_VERSION) -); - -/* ---------------------------------------------------------------------- */ -/* Add table "MODIFIED_PEPTIDES" */ -/* ---------------------------------------------------------------------- */ - -CREATE TABLE MODIFIED_PEPTIDES ( - ID BIGSERIAL NOT NULL, - PEPT_ID TECH_ID NOT NULL, - NTERM_MASS REAL_NUMBER NOT NULL, - CTERM_MASS REAL_NUMBER NOT NULL, - CONSTRAINT PK_MODIFIED_PEPTIDES PRIMARY KEY (ID) -); - -/* ---------------------------------------------------------------------- */ -/* Add table "SPECTRUM_REFERENCES" */ -/* ---------------------------------------------------------------------- */ - -CREATE TABLE SPECTRUM_REFERENCES ( - ID BIGSERIAL NOT NULL, - PEPT_ID TECH_ID NOT NULL, - REFERENCE SPECTRUM_REFERENCE NOT NULL, - CONSTRAINT PK_SPECTRUM_REFERENCES PRIMARY KEY (ID) -); - -/* ---------------------------------------------------------------------- */ -/* Add table "MODIFICATION_FRACTIONS" */ -/* ---------------------------------------------------------------------- */ - -CREATE TABLE MODIFICATION_FRACTIONS ( - ID BIGSERIAL NOT NULL, - MODI_ID TECH_ID NOT NULL, - SAMP_ID TECH_ID, - FRACTION REAL_NUMBER NOT NULL, - CONSTRAINT PK_MODIFICATION_FRACTIONS PRIMARY KEY (ID) -); - -/* ---------------------------------------------------------------------- */ -/* Foreign key constraints */ -/* ---------------------------------------------------------------------- */ - -ALTER TABLE DATA_SETS ADD CONSTRAINT DA_EX_FK - FOREIGN KEY (EXPE_ID) REFERENCES EXPERIMENTS (ID); - -ALTER TABLE DATA_SETS ADD CONSTRAINT DA_SA_FK - FOREIGN KEY (SAMP_ID) REFERENCES SAMPLES (ID); - -ALTER TABLE DATA_SETS ADD CONSTRAINT DATABASES_DATA_SETS - FOREIGN KEY (DB_ID) REFERENCES DATABASES (ID); - -ALTER TABLE MODIFICATIONS ADD CONSTRAINT MODIFIED_PEPTIDES_MODIFICATIONS - FOREIGN KEY (MOPE_ID) REFERENCES MODIFIED_PEPTIDES (ID); - -ALTER TABLE PEPTIDES ADD CONSTRAINT PE_PR_FK - FOREIGN KEY (PROT_ID) REFERENCES PROTEINS (ID); - -ALTER TABLE PROTEINS ADD CONSTRAINT DATA_SETS_PROTEINS - FOREIGN KEY (DASE_ID) REFERENCES DATA_SETS (ID); - -ALTER TABLE SEQUENCES ADD CONSTRAINT DATABASES_SEQUENCES - FOREIGN KEY (DB_ID) REFERENCES DATABASES (ID); - -ALTER TABLE SEQUENCES ADD CONSTRAINT PROTEIN_REFERENCES_SEQUENCES - FOREIGN KEY (PRRE_ID) REFERENCES PROTEIN_REFERENCES (ID); - -ALTER TABLE IDENTIFIED_PROTEINS ADD CONSTRAINT PROTEINS_IDENTIFIED_PROTEINS - FOREIGN KEY (PROT_ID) REFERENCES PROTEINS (ID); - -ALTER TABLE IDENTIFIED_PROTEINS ADD CONSTRAINT SEQUENCES_IDENTIFIED_PROTEINS - FOREIGN KEY (SEQU_ID) REFERENCES SEQUENCES (ID); - -ALTER TABLE ABUNDANCES ADD CONSTRAINT SAMPLES_ABUNDANCES - FOREIGN KEY (SAMP_ID) REFERENCES SAMPLES (ID); - -ALTER TABLE ABUNDANCES ADD CONSTRAINT PROTEINS_ABUNDANCES - FOREIGN KEY (PROT_ID) REFERENCES PROTEINS (ID); - -ALTER TABLE PROBABILITY_FDR_MAPPINGS ADD CONSTRAINT DATA_SETS_PROBABILITY_FDR_MAPPINGS - FOREIGN KEY (DASE_ID) REFERENCES DATA_SETS (ID); - -ALTER TABLE MODIFIED_PEPTIDES ADD CONSTRAINT PEPTIDES_MODIFIED_PEPTIDES - FOREIGN KEY (PEPT_ID) REFERENCES PEPTIDES (ID); - -ALTER TABLE SPECTRUM_REFERENCES ADD CONSTRAINT PEPTIDES_SPECTRUM_REFERENCES - FOREIGN KEY (PEPT_ID) REFERENCES PEPTIDES (ID); - -ALTER TABLE MODIFICATION_FRACTIONS ADD CONSTRAINT MODIFICATIONS_MODIFICATION_FRACTIONS - FOREIGN KEY (MODI_ID) REFERENCES MODIFICATIONS (ID); - -ALTER TABLE MODIFICATION_FRACTIONS ADD CONSTRAINT SAMPLES_MODIFICATION_FRACTIONS - FOREIGN KEY (SAMP_ID) REFERENCES SAMPLES (ID); diff --git a/rtd_phosphonetx/source/sql/proteomics/postgresql/002/schema-002.png b/rtd_phosphonetx/source/sql/proteomics/postgresql/002/schema-002.png deleted file mode 100755 index 69f33d205fd55433318b8e294148b3eb20267d5d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 199097 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 diff --git a/rtd_phosphonetx/source/sql/proteomics/postgresql/002/schema-002.sql b/rtd_phosphonetx/source/sql/proteomics/postgresql/002/schema-002.sql deleted file mode 100755 index 4d4128aa57e..00000000000 --- a/rtd_phosphonetx/source/sql/proteomics/postgresql/002/schema-002.sql +++ /dev/null @@ -1,292 +0,0 @@ -/* ---------------------------------------------------------------------- */ -/* Script generated with: DeZign for Databases v5.2.3 */ -/* Target DBMS: PostgreSQL 8 */ -/* Project file: schema.dez */ -/* Project name: */ -/* Author: */ -/* Script type: Database creation script */ -/* Created on: 2009-12-07 11:03 */ -/* Model version: Version 2009-12-07 */ -/* ---------------------------------------------------------------------- */ - - -/* ---------------------------------------------------------------------- */ -/* Domains */ -/* ---------------------------------------------------------------------- */ - -CREATE DOMAIN CHECKSUM AS CHARACTER VARYING(8); - -CREATE DOMAIN CODE AS CHARACTER VARYING(40); - -CREATE DOMAIN DESCRIPTION AS CHARACTER VARYING(2000); - -CREATE DOMAIN INTEGER_NUMBER AS INTEGER; - -CREATE DOMAIN REAL_NUMBER AS DOUBLE PRECISION; - -CREATE DOMAIN LONG_SEQUENCE AS TEXT; - -CREATE DOMAIN SHORT_DESCRIPTION AS CHARACTER VARYING(200); - -CREATE DOMAIN TECH_ID AS BIGINT; - -CREATE DOMAIN SHORT_SEQUENCE AS CHARACTER VARYING(1000); - -CREATE DOMAIN ACCESSION_NUMBER AS CHARACTER VARYING(256); - -CREATE DOMAIN SPECTRUM_REFERENCE AS CHARACTER VARYING(100); - -/* ---------------------------------------------------------------------- */ -/* Tables */ -/* ---------------------------------------------------------------------- */ - -/* ---------------------------------------------------------------------- */ -/* Add table "EXPERIMENTS" */ -/* ---------------------------------------------------------------------- */ - -CREATE TABLE EXPERIMENTS ( - ID BIGSERIAL NOT NULL, - PERM_ID CODE NOT NULL, - CONSTRAINT PK_EXPERIMENTS PRIMARY KEY (ID), - CONSTRAINT TUC_EXPERIMENTS_1 UNIQUE (PERM_ID) -); - -/* ---------------------------------------------------------------------- */ -/* Add table "DATA_SETS" */ -/* ---------------------------------------------------------------------- */ - -CREATE TABLE DATA_SETS ( - ID BIGSERIAL NOT NULL, - EXPE_ID TECH_ID NOT NULL, - SAMP_ID TECH_ID, - DB_ID TECH_ID NOT NULL, - PERM_ID CODE NOT NULL, - CONSTRAINT PK_DATA_SETS PRIMARY KEY (ID), - CONSTRAINT TUC_DATA_SETS_1 UNIQUE (PERM_ID) -); - -CREATE INDEX IX_FK_DATA_SETS_EXPERIMENTS ON DATA_SETS (EXPE_ID); - -CREATE INDEX IX_FK_DATA_SETS_SAMPLES ON DATA_SETS (SAMP_ID); - -/* ---------------------------------------------------------------------- */ -/* Add table "MODIFICATIONS" */ -/* ---------------------------------------------------------------------- */ - -CREATE TABLE MODIFICATIONS ( - ID BIGSERIAL NOT NULL, - MOPE_ID TECH_ID NOT NULL, - POS INTEGER_NUMBER NOT NULL, - MASS REAL_NUMBER NOT NULL, - CONSTRAINT PK_MODIFICATIONS PRIMARY KEY (ID) -); - -/* ---------------------------------------------------------------------- */ -/* Add table "PEPTIDES" */ -/* ---------------------------------------------------------------------- */ - -CREATE TABLE PEPTIDES ( - ID BIGSERIAL NOT NULL, - PROT_ID TECH_ID NOT NULL, - SEQUENCE SHORT_SEQUENCE NOT NULL, - CHARGE INTEGER_NUMBER NOT NULL, - CONSTRAINT PK_PEPTIDES PRIMARY KEY (ID) -); - -CREATE INDEX IX_FK_PEPTIDES_PROTEINS ON PEPTIDES (PROT_ID); - -/* ---------------------------------------------------------------------- */ -/* Add table "PROTEINS" */ -/* ---------------------------------------------------------------------- */ - -CREATE TABLE PROTEINS ( - ID BIGSERIAL NOT NULL, - DASE_ID TECH_ID NOT NULL, - PROBABILITY REAL_NUMBER NOT NULL, - CONSTRAINT PK_PROTEINS PRIMARY KEY (ID) -); - -CREATE INDEX IDX_PROTEINS_1 ON PROTEINS (DASE_ID); - -/* ---------------------------------------------------------------------- */ -/* Add table "SAMPLES" */ -/* ---------------------------------------------------------------------- */ - -CREATE TABLE SAMPLES ( - ID BIGSERIAL NOT NULL, - PERM_ID CODE NOT NULL, - EXPE_ID TECH_ID NOT NULL, - CONSTRAINT PK_SAMPLES PRIMARY KEY (ID), - CONSTRAINT TUC_SAMPLES_1 UNIQUE (PERM_ID) -); - -/* ---------------------------------------------------------------------- */ -/* Add table "SEQUENCES" */ -/* ---------------------------------------------------------------------- */ - -CREATE TABLE SEQUENCES ( - ID BIGSERIAL NOT NULL, - DB_ID TECH_ID NOT NULL, - PRRE_ID TECH_ID NOT NULL, - AMINO_ACID_SEQUENCE LONG_SEQUENCE NOT NULL, - CHECKSUM CHECKSUM NOT NULL, - CONSTRAINT PK_SEQUENCES PRIMARY KEY (ID) -); - -/* ---------------------------------------------------------------------- */ -/* Add table "IDENTIFIED_PROTEINS" */ -/* ---------------------------------------------------------------------- */ - -CREATE TABLE IDENTIFIED_PROTEINS ( - ID BIGSERIAL NOT NULL, - PROT_ID TECH_ID NOT NULL, - SEQU_ID TECH_ID NOT NULL, - CONSTRAINT PK_IDENTIFIED_PROTEINS PRIMARY KEY (ID) -); - -/* ---------------------------------------------------------------------- */ -/* Add table "ABUNDANCES" */ -/* ---------------------------------------------------------------------- */ - -CREATE TABLE ABUNDANCES ( - ID BIGSERIAL NOT NULL, - PROT_ID TECH_ID NOT NULL, - SAMP_ID TECH_ID NOT NULL, - VALUE REAL_NUMBER NOT NULL, - CONSTRAINT PK_ABUNDANCES PRIMARY KEY (ID) -); - -/* ---------------------------------------------------------------------- */ -/* Add table "PROBABILITY_FDR_MAPPINGS" */ -/* ---------------------------------------------------------------------- */ - -CREATE TABLE PROBABILITY_FDR_MAPPINGS ( - ID BIGSERIAL NOT NULL, - DASE_ID TECH_ID NOT NULL, - PROBABILITY REAL_NUMBER NOT NULL, - FALSE_DISCOVERY_RATE REAL_NUMBER NOT NULL, - CONSTRAINT PK_PROBABILITY_FDR_MAPPINGS PRIMARY KEY (ID) -); - -/* ---------------------------------------------------------------------- */ -/* Add table "PROTEIN_REFERENCES" */ -/* ---------------------------------------------------------------------- */ - -CREATE TABLE PROTEIN_REFERENCES ( - ID BIGSERIAL NOT NULL, - ACCESSION_NUMBER ACCESSION_NUMBER NOT NULL, - DESCRIPTION DESCRIPTION, - CONSTRAINT PK_PROTEIN_REFERENCES PRIMARY KEY (ID), - CONSTRAINT TUC_PROTEIN_REFERENCES_1 UNIQUE (ACCESSION_NUMBER) -); - -CREATE INDEX IDX_PROTEIN_REFERENCES_1 ON PROTEIN_REFERENCES (ACCESSION_NUMBER); - -/* ---------------------------------------------------------------------- */ -/* Add table "DATABASES" */ -/* ---------------------------------------------------------------------- */ - -CREATE TABLE DATABASES ( - ID BIGSERIAL NOT NULL, - NAME_AND_VERSION SHORT_DESCRIPTION NOT NULL, - CONSTRAINT PK_DATABASES PRIMARY KEY (ID), - CONSTRAINT TUC_DATABASES_1 UNIQUE (NAME_AND_VERSION) -); - -/* ---------------------------------------------------------------------- */ -/* Add table "MODIFIED_PEPTIDES" */ -/* ---------------------------------------------------------------------- */ - -CREATE TABLE MODIFIED_PEPTIDES ( - ID BIGSERIAL NOT NULL, - PEPT_ID TECH_ID NOT NULL, - NTERM_MASS REAL_NUMBER NOT NULL, - CTERM_MASS REAL_NUMBER NOT NULL, - CONSTRAINT PK_MODIFIED_PEPTIDES PRIMARY KEY (ID) -); - -/* ---------------------------------------------------------------------- */ -/* Add table "SPECTRUM_REFERENCES" */ -/* ---------------------------------------------------------------------- */ - -CREATE TABLE SPECTRUM_REFERENCES ( - ID BIGSERIAL NOT NULL, - PEPT_ID TECH_ID NOT NULL, - REFERENCE SPECTRUM_REFERENCE NOT NULL, - CONSTRAINT PK_SPECTRUM_REFERENCES PRIMARY KEY (ID) -); - -/* ---------------------------------------------------------------------- */ -/* Add table "MODIFICATION_FRACTIONS" */ -/* ---------------------------------------------------------------------- */ - -CREATE TABLE MODIFICATION_FRACTIONS ( - ID BIGSERIAL NOT NULL, - MODI_ID TECH_ID NOT NULL, - SAMP_ID TECH_ID, - FRACTION REAL_NUMBER NOT NULL, - CONSTRAINT PK_MODIFICATION_FRACTIONS PRIMARY KEY (ID) -); - -/* ---------------------------------------------------------------------- */ -/* Add table "EVENTS" */ -/* ---------------------------------------------------------------------- */ - -CREATE TABLE EVENTS ( - LAST_SEEN_DELETION_EVENT_ID TECH_ID NOT NULL -); - -/* ---------------------------------------------------------------------- */ -/* Foreign key constraints */ -/* ---------------------------------------------------------------------- */ - -ALTER TABLE DATA_SETS ADD CONSTRAINT DA_EX_FK - FOREIGN KEY (EXPE_ID) REFERENCES EXPERIMENTS (ID); - -ALTER TABLE DATA_SETS ADD CONSTRAINT DA_SA_FK - FOREIGN KEY (SAMP_ID) REFERENCES SAMPLES (ID); - -ALTER TABLE DATA_SETS ADD CONSTRAINT DATABASES_DATA_SETS - FOREIGN KEY (DB_ID) REFERENCES DATABASES (ID); - -ALTER TABLE MODIFICATIONS ADD CONSTRAINT MODIFIED_PEPTIDES_MODIFICATIONS - FOREIGN KEY (MOPE_ID) REFERENCES MODIFIED_PEPTIDES (ID) ON DELETE CASCADE; - -ALTER TABLE PEPTIDES ADD CONSTRAINT PE_PR_FK - FOREIGN KEY (PROT_ID) REFERENCES PROTEINS (ID) ON DELETE CASCADE; - -ALTER TABLE PROTEINS ADD CONSTRAINT DATA_SETS_PROTEINS - FOREIGN KEY (DASE_ID) REFERENCES DATA_SETS (ID) ON DELETE CASCADE; - -ALTER TABLE SEQUENCES ADD CONSTRAINT DATABASES_SEQUENCES - FOREIGN KEY (DB_ID) REFERENCES DATABASES (ID); - -ALTER TABLE SEQUENCES ADD CONSTRAINT PROTEIN_REFERENCES_SEQUENCES - FOREIGN KEY (PRRE_ID) REFERENCES PROTEIN_REFERENCES (ID); - -ALTER TABLE IDENTIFIED_PROTEINS ADD CONSTRAINT PROTEINS_IDENTIFIED_PROTEINS - FOREIGN KEY (PROT_ID) REFERENCES PROTEINS (ID) ON DELETE CASCADE; - -ALTER TABLE IDENTIFIED_PROTEINS ADD CONSTRAINT SEQUENCES_IDENTIFIED_PROTEINS - FOREIGN KEY (SEQU_ID) REFERENCES SEQUENCES (ID); - -ALTER TABLE ABUNDANCES ADD CONSTRAINT SAMPLES_ABUNDANCES - FOREIGN KEY (SAMP_ID) REFERENCES SAMPLES (ID); - -ALTER TABLE ABUNDANCES ADD CONSTRAINT PROTEINS_ABUNDANCES - FOREIGN KEY (PROT_ID) REFERENCES PROTEINS (ID) ON DELETE CASCADE; - -ALTER TABLE PROBABILITY_FDR_MAPPINGS ADD CONSTRAINT DATA_SETS_PROBABILITY_FDR_MAPPINGS - FOREIGN KEY (DASE_ID) REFERENCES DATA_SETS (ID) ON DELETE CASCADE; - -ALTER TABLE MODIFIED_PEPTIDES ADD CONSTRAINT PEPTIDES_MODIFIED_PEPTIDES - FOREIGN KEY (PEPT_ID) REFERENCES PEPTIDES (ID) ON DELETE CASCADE; - -ALTER TABLE SPECTRUM_REFERENCES ADD CONSTRAINT PEPTIDES_SPECTRUM_REFERENCES - FOREIGN KEY (PEPT_ID) REFERENCES PEPTIDES (ID) ON DELETE CASCADE; - -ALTER TABLE MODIFICATION_FRACTIONS ADD CONSTRAINT MODIFICATIONS_MODIFICATION_FRACTIONS - FOREIGN KEY (MODI_ID) REFERENCES MODIFICATIONS (ID) ON DELETE CASCADE; - -ALTER TABLE MODIFICATION_FRACTIONS ADD CONSTRAINT SAMPLES_MODIFICATION_FRACTIONS - FOREIGN KEY (SAMP_ID) REFERENCES SAMPLES (ID); diff --git a/rtd_phosphonetx/source/sql/proteomics/postgresql/003/grant-003.sql b/rtd_phosphonetx/source/sql/proteomics/postgresql/003/grant-003.sql deleted file mode 100644 index 2e85f4fb1f6..00000000000 --- a/rtd_phosphonetx/source/sql/proteomics/postgresql/003/grant-003.sql +++ /dev/null @@ -1,18 +0,0 @@ --- Granting SELECT privilege to group PHOSPHONETX_READONLY - -GRANT SELECT ON TABLE EXPERIMENTS TO GROUP PHOSPHONETX_READONLY; -GRANT SELECT ON TABLE DATA_SETS TO GROUP PHOSPHONETX_READONLY; -GRANT SELECT ON TABLE MODIFICATIONS TO GROUP PHOSPHONETX_READONLY; -GRANT SELECT ON TABLE PEPTIDES TO GROUP PHOSPHONETX_READONLY; -GRANT SELECT ON TABLE PROTEINS TO GROUP PHOSPHONETX_READONLY; -GRANT SELECT ON TABLE SAMPLES TO GROUP PHOSPHONETX_READONLY; -GRANT SELECT ON TABLE SEQUENCES TO GROUP PHOSPHONETX_READONLY; -GRANT SELECT ON TABLE IDENTIFIED_PROTEINS TO GROUP PHOSPHONETX_READONLY; -GRANT SELECT ON TABLE ABUNDANCES TO GROUP PHOSPHONETX_READONLY; -GRANT SELECT ON TABLE PROBABILITY_FDR_MAPPINGS TO GROUP PHOSPHONETX_READONLY; -GRANT SELECT ON TABLE PROTEIN_REFERENCES TO GROUP PHOSPHONETX_READONLY; -GRANT SELECT ON TABLE DATABASES TO GROUP PHOSPHONETX_READONLY; -GRANT SELECT ON TABLE MODIFIED_PEPTIDES TO GROUP PHOSPHONETX_READONLY; -GRANT SELECT ON TABLE SPECTRUM_REFERENCES TO GROUP PHOSPHONETX_READONLY; -GRANT SELECT ON TABLE MODIFICATION_FRACTIONS TO GROUP PHOSPHONETX_READONLY; -GRANT SELECT ON TABLE EVENTS TO GROUP PHOSPHONETX_READONLY; diff --git a/rtd_phosphonetx/source/sql/proteomics/postgresql/003/schema-003.png b/rtd_phosphonetx/source/sql/proteomics/postgresql/003/schema-003.png deleted file mode 100755 index da8cae484122317fee9b24a68fa70670bec52989..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65092 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%0AroZ+nl28U+e+e`S~FWQ}orQXeZwvNFBfb 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 R%Y%SFSxF^{axvrg{|o2d2D|_O diff --git a/rtd_phosphonetx/source/sql/proteomics/postgresql/003/schema-003.sql b/rtd_phosphonetx/source/sql/proteomics/postgresql/003/schema-003.sql deleted file mode 100755 index 4dd90b2711c..00000000000 --- a/rtd_phosphonetx/source/sql/proteomics/postgresql/003/schema-003.sql +++ /dev/null @@ -1,293 +0,0 @@ -/* ---------------------------------------------------------------------- */ -/* Script generated with: DeZign for Databases v5.2.3 */ -/* Target DBMS: PostgreSQL 8 */ -/* Project file: schema.dez */ -/* Project name: */ -/* Author: */ -/* Script type: Database creation script */ -/* Created on: 2010-03-31 16:10 */ -/* Model version: Version 2010-03-31 */ -/* ---------------------------------------------------------------------- */ - - -/* ---------------------------------------------------------------------- */ -/* Domains */ -/* ---------------------------------------------------------------------- */ - -CREATE DOMAIN CHECKSUM AS CHARACTER VARYING(8); - -CREATE DOMAIN CODE AS CHARACTER VARYING(40); - -CREATE DOMAIN DESCRIPTION AS CHARACTER VARYING(2000); - -CREATE DOMAIN INTEGER_NUMBER AS INTEGER; - -CREATE DOMAIN REAL_NUMBER AS DOUBLE PRECISION; - -CREATE DOMAIN LONG_SEQUENCE AS TEXT; - -CREATE DOMAIN SHORT_DESCRIPTION AS CHARACTER VARYING(200); - -CREATE DOMAIN TECH_ID AS BIGINT; - -CREATE DOMAIN SHORT_SEQUENCE AS CHARACTER VARYING(1000); - -CREATE DOMAIN ACCESSION_NUMBER AS CHARACTER VARYING(256); - -CREATE DOMAIN SPECTRUM_REFERENCE AS CHARACTER VARYING(100); - -/* ---------------------------------------------------------------------- */ -/* Tables */ -/* ---------------------------------------------------------------------- */ - -/* ---------------------------------------------------------------------- */ -/* Add table "EXPERIMENTS" */ -/* ---------------------------------------------------------------------- */ - -CREATE TABLE EXPERIMENTS ( - ID BIGSERIAL NOT NULL, - PERM_ID CODE NOT NULL, - CONSTRAINT PK_EXPERIMENTS PRIMARY KEY (ID), - CONSTRAINT TUC_EXPERIMENTS_1 UNIQUE (PERM_ID) -); - -/* ---------------------------------------------------------------------- */ -/* Add table "DATA_SETS" */ -/* ---------------------------------------------------------------------- */ - -CREATE TABLE DATA_SETS ( - ID BIGSERIAL NOT NULL, - EXPE_ID TECH_ID NOT NULL, - SAMP_ID TECH_ID, - DB_ID TECH_ID NOT NULL, - PERM_ID CODE NOT NULL, - CONSTRAINT PK_DATA_SETS PRIMARY KEY (ID), - CONSTRAINT TUC_DATA_SETS_1 UNIQUE (PERM_ID) -); - -CREATE INDEX IX_FK_DATA_SETS_EXPERIMENTS ON DATA_SETS (EXPE_ID); - -CREATE INDEX IX_FK_DATA_SETS_SAMPLES ON DATA_SETS (SAMP_ID); - -/* ---------------------------------------------------------------------- */ -/* Add table "MODIFICATIONS" */ -/* ---------------------------------------------------------------------- */ - -CREATE TABLE MODIFICATIONS ( - ID BIGSERIAL NOT NULL, - MOPE_ID TECH_ID NOT NULL, - POS INTEGER_NUMBER NOT NULL, - MASS REAL_NUMBER NOT NULL, - CONSTRAINT PK_MODIFICATIONS PRIMARY KEY (ID) -); - -/* ---------------------------------------------------------------------- */ -/* Add table "PEPTIDES" */ -/* ---------------------------------------------------------------------- */ - -CREATE TABLE PEPTIDES ( - ID BIGSERIAL NOT NULL, - PROT_ID TECH_ID NOT NULL, - SEQUENCE SHORT_SEQUENCE NOT NULL, - CHARGE INTEGER_NUMBER NOT NULL, - CONSTRAINT PK_PEPTIDES PRIMARY KEY (ID) -); - -CREATE INDEX IX_FK_PEPTIDES_PROTEINS ON PEPTIDES (PROT_ID); - -/* ---------------------------------------------------------------------- */ -/* Add table "PROTEINS" */ -/* ---------------------------------------------------------------------- */ - -CREATE TABLE PROTEINS ( - ID BIGSERIAL NOT NULL, - DASE_ID TECH_ID NOT NULL, - PROBABILITY REAL_NUMBER NOT NULL, - CONSTRAINT PK_PROTEINS PRIMARY KEY (ID) -); - -CREATE INDEX IDX_PROTEINS_1 ON PROTEINS (DASE_ID); - -/* ---------------------------------------------------------------------- */ -/* Add table "SAMPLES" */ -/* ---------------------------------------------------------------------- */ - -CREATE TABLE SAMPLES ( - ID BIGSERIAL NOT NULL, - PERM_ID CODE NOT NULL, - EXPE_ID TECH_ID NOT NULL, - CONSTRAINT PK_SAMPLES PRIMARY KEY (ID), - CONSTRAINT TUC_SAMPLES_1 UNIQUE (PERM_ID) -); - -/* ---------------------------------------------------------------------- */ -/* Add table "SEQUENCES" */ -/* ---------------------------------------------------------------------- */ - -CREATE TABLE SEQUENCES ( - ID BIGSERIAL NOT NULL, - DB_ID TECH_ID NOT NULL, - PRRE_ID TECH_ID NOT NULL, - AMINO_ACID_SEQUENCE LONG_SEQUENCE NOT NULL, - CHECKSUM CHECKSUM NOT NULL, - CONSTRAINT PK_SEQUENCES PRIMARY KEY (ID) -); - -/* ---------------------------------------------------------------------- */ -/* Add table "IDENTIFIED_PROTEINS" */ -/* ---------------------------------------------------------------------- */ - -CREATE TABLE IDENTIFIED_PROTEINS ( - ID BIGSERIAL NOT NULL, - PROT_ID TECH_ID NOT NULL, - SEQU_ID TECH_ID NOT NULL, - COVERAGE REAL_NUMBER, - CONSTRAINT PK_IDENTIFIED_PROTEINS PRIMARY KEY (ID) -); - -/* ---------------------------------------------------------------------- */ -/* Add table "ABUNDANCES" */ -/* ---------------------------------------------------------------------- */ - -CREATE TABLE ABUNDANCES ( - ID BIGSERIAL NOT NULL, - PROT_ID TECH_ID NOT NULL, - SAMP_ID TECH_ID NOT NULL, - VALUE REAL_NUMBER NOT NULL, - CONSTRAINT PK_ABUNDANCES PRIMARY KEY (ID) -); - -/* ---------------------------------------------------------------------- */ -/* Add table "PROBABILITY_FDR_MAPPINGS" */ -/* ---------------------------------------------------------------------- */ - -CREATE TABLE PROBABILITY_FDR_MAPPINGS ( - ID BIGSERIAL NOT NULL, - DASE_ID TECH_ID NOT NULL, - PROBABILITY REAL_NUMBER NOT NULL, - FALSE_DISCOVERY_RATE REAL_NUMBER NOT NULL, - CONSTRAINT PK_PROBABILITY_FDR_MAPPINGS PRIMARY KEY (ID) -); - -/* ---------------------------------------------------------------------- */ -/* Add table "PROTEIN_REFERENCES" */ -/* ---------------------------------------------------------------------- */ - -CREATE TABLE PROTEIN_REFERENCES ( - ID BIGSERIAL NOT NULL, - ACCESSION_NUMBER ACCESSION_NUMBER NOT NULL, - DESCRIPTION DESCRIPTION, - CONSTRAINT PK_PROTEIN_REFERENCES PRIMARY KEY (ID), - CONSTRAINT TUC_PROTEIN_REFERENCES_1 UNIQUE (ACCESSION_NUMBER) -); - -CREATE INDEX IDX_PROTEIN_REFERENCES_1 ON PROTEIN_REFERENCES (ACCESSION_NUMBER); - -/* ---------------------------------------------------------------------- */ -/* Add table "DATABASES" */ -/* ---------------------------------------------------------------------- */ - -CREATE TABLE DATABASES ( - ID BIGSERIAL NOT NULL, - NAME_AND_VERSION SHORT_DESCRIPTION NOT NULL, - CONSTRAINT PK_DATABASES PRIMARY KEY (ID), - CONSTRAINT TUC_DATABASES_1 UNIQUE (NAME_AND_VERSION) -); - -/* ---------------------------------------------------------------------- */ -/* Add table "MODIFIED_PEPTIDES" */ -/* ---------------------------------------------------------------------- */ - -CREATE TABLE MODIFIED_PEPTIDES ( - ID BIGSERIAL NOT NULL, - PEPT_ID TECH_ID NOT NULL, - NTERM_MASS REAL_NUMBER NOT NULL, - CTERM_MASS REAL_NUMBER NOT NULL, - CONSTRAINT PK_MODIFIED_PEPTIDES PRIMARY KEY (ID) -); - -/* ---------------------------------------------------------------------- */ -/* Add table "SPECTRUM_REFERENCES" */ -/* ---------------------------------------------------------------------- */ - -CREATE TABLE SPECTRUM_REFERENCES ( - ID BIGSERIAL NOT NULL, - PEPT_ID TECH_ID NOT NULL, - REFERENCE SPECTRUM_REFERENCE NOT NULL, - CONSTRAINT PK_SPECTRUM_REFERENCES PRIMARY KEY (ID) -); - -/* ---------------------------------------------------------------------- */ -/* Add table "MODIFICATION_FRACTIONS" */ -/* ---------------------------------------------------------------------- */ - -CREATE TABLE MODIFICATION_FRACTIONS ( - ID BIGSERIAL NOT NULL, - MODI_ID TECH_ID NOT NULL, - SAMP_ID TECH_ID, - FRACTION REAL_NUMBER NOT NULL, - CONSTRAINT PK_MODIFICATION_FRACTIONS PRIMARY KEY (ID) -); - -/* ---------------------------------------------------------------------- */ -/* Add table "EVENTS" */ -/* ---------------------------------------------------------------------- */ - -CREATE TABLE EVENTS ( - LAST_SEEN_DELETION_EVENT_ID TECH_ID NOT NULL -); - -/* ---------------------------------------------------------------------- */ -/* Foreign key constraints */ -/* ---------------------------------------------------------------------- */ - -ALTER TABLE DATA_SETS ADD CONSTRAINT DA_EX_FK - FOREIGN KEY (EXPE_ID) REFERENCES EXPERIMENTS (ID); - -ALTER TABLE DATA_SETS ADD CONSTRAINT DA_SA_FK - FOREIGN KEY (SAMP_ID) REFERENCES SAMPLES (ID); - -ALTER TABLE DATA_SETS ADD CONSTRAINT DATABASES_DATA_SETS - FOREIGN KEY (DB_ID) REFERENCES DATABASES (ID); - -ALTER TABLE MODIFICATIONS ADD CONSTRAINT MODIFIED_PEPTIDES_MODIFICATIONS - FOREIGN KEY (MOPE_ID) REFERENCES MODIFIED_PEPTIDES (ID) ON DELETE CASCADE; - -ALTER TABLE PEPTIDES ADD CONSTRAINT PE_PR_FK - FOREIGN KEY (PROT_ID) REFERENCES PROTEINS (ID) ON DELETE CASCADE; - -ALTER TABLE PROTEINS ADD CONSTRAINT DATA_SETS_PROTEINS - FOREIGN KEY (DASE_ID) REFERENCES DATA_SETS (ID) ON DELETE CASCADE; - -ALTER TABLE SEQUENCES ADD CONSTRAINT DATABASES_SEQUENCES - FOREIGN KEY (DB_ID) REFERENCES DATABASES (ID); - -ALTER TABLE SEQUENCES ADD CONSTRAINT PROTEIN_REFERENCES_SEQUENCES - FOREIGN KEY (PRRE_ID) REFERENCES PROTEIN_REFERENCES (ID); - -ALTER TABLE IDENTIFIED_PROTEINS ADD CONSTRAINT PROTEINS_IDENTIFIED_PROTEINS - FOREIGN KEY (PROT_ID) REFERENCES PROTEINS (ID) ON DELETE CASCADE; - -ALTER TABLE IDENTIFIED_PROTEINS ADD CONSTRAINT SEQUENCES_IDENTIFIED_PROTEINS - FOREIGN KEY (SEQU_ID) REFERENCES SEQUENCES (ID); - -ALTER TABLE ABUNDANCES ADD CONSTRAINT SAMPLES_ABUNDANCES - FOREIGN KEY (SAMP_ID) REFERENCES SAMPLES (ID); - -ALTER TABLE ABUNDANCES ADD CONSTRAINT PROTEINS_ABUNDANCES - FOREIGN KEY (PROT_ID) REFERENCES PROTEINS (ID) ON DELETE CASCADE; - -ALTER TABLE PROBABILITY_FDR_MAPPINGS ADD CONSTRAINT DATA_SETS_PROBABILITY_FDR_MAPPINGS - FOREIGN KEY (DASE_ID) REFERENCES DATA_SETS (ID) ON DELETE CASCADE; - -ALTER TABLE MODIFIED_PEPTIDES ADD CONSTRAINT PEPTIDES_MODIFIED_PEPTIDES - FOREIGN KEY (PEPT_ID) REFERENCES PEPTIDES (ID) ON DELETE CASCADE; - -ALTER TABLE SPECTRUM_REFERENCES ADD CONSTRAINT PEPTIDES_SPECTRUM_REFERENCES - FOREIGN KEY (PEPT_ID) REFERENCES PEPTIDES (ID) ON DELETE CASCADE; - -ALTER TABLE MODIFICATION_FRACTIONS ADD CONSTRAINT MODIFICATIONS_MODIFICATION_FRACTIONS - FOREIGN KEY (MODI_ID) REFERENCES MODIFICATIONS (ID) ON DELETE CASCADE; - -ALTER TABLE MODIFICATION_FRACTIONS ADD CONSTRAINT SAMPLES_MODIFICATION_FRACTIONS - FOREIGN KEY (SAMP_ID) REFERENCES SAMPLES (ID); diff --git a/rtd_phosphonetx/source/sql/proteomics/postgresql/004/grant-004.sql b/rtd_phosphonetx/source/sql/proteomics/postgresql/004/grant-004.sql deleted file mode 100644 index 2e85f4fb1f6..00000000000 --- a/rtd_phosphonetx/source/sql/proteomics/postgresql/004/grant-004.sql +++ /dev/null @@ -1,18 +0,0 @@ --- Granting SELECT privilege to group PHOSPHONETX_READONLY - -GRANT SELECT ON TABLE EXPERIMENTS TO GROUP PHOSPHONETX_READONLY; -GRANT SELECT ON TABLE DATA_SETS TO GROUP PHOSPHONETX_READONLY; -GRANT SELECT ON TABLE MODIFICATIONS TO GROUP PHOSPHONETX_READONLY; -GRANT SELECT ON TABLE PEPTIDES TO GROUP PHOSPHONETX_READONLY; -GRANT SELECT ON TABLE PROTEINS TO GROUP PHOSPHONETX_READONLY; -GRANT SELECT ON TABLE SAMPLES TO GROUP PHOSPHONETX_READONLY; -GRANT SELECT ON TABLE SEQUENCES TO GROUP PHOSPHONETX_READONLY; -GRANT SELECT ON TABLE IDENTIFIED_PROTEINS TO GROUP PHOSPHONETX_READONLY; -GRANT SELECT ON TABLE ABUNDANCES TO GROUP PHOSPHONETX_READONLY; -GRANT SELECT ON TABLE PROBABILITY_FDR_MAPPINGS TO GROUP PHOSPHONETX_READONLY; -GRANT SELECT ON TABLE PROTEIN_REFERENCES TO GROUP PHOSPHONETX_READONLY; -GRANT SELECT ON TABLE DATABASES TO GROUP PHOSPHONETX_READONLY; -GRANT SELECT ON TABLE MODIFIED_PEPTIDES TO GROUP PHOSPHONETX_READONLY; -GRANT SELECT ON TABLE SPECTRUM_REFERENCES TO GROUP PHOSPHONETX_READONLY; -GRANT SELECT ON TABLE MODIFICATION_FRACTIONS TO GROUP PHOSPHONETX_READONLY; -GRANT SELECT ON TABLE EVENTS TO GROUP PHOSPHONETX_READONLY; diff --git a/rtd_phosphonetx/source/sql/proteomics/postgresql/004/schema-004.png b/rtd_phosphonetx/source/sql/proteomics/postgresql/004/schema-004.png deleted file mode 100755 index fceffeedd9cb97b93e06432546eb207feba07418..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 66176 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Π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 diff --git a/rtd_phosphonetx/source/sql/proteomics/postgresql/004/schema-004.sql b/rtd_phosphonetx/source/sql/proteomics/postgresql/004/schema-004.sql deleted file mode 100755 index 824269ff55a..00000000000 --- a/rtd_phosphonetx/source/sql/proteomics/postgresql/004/schema-004.sql +++ /dev/null @@ -1,296 +0,0 @@ -/* ---------------------------------------------------------------------- */ -/* Script generated with: DeZign for Databases v5.2.3 */ -/* Target DBMS: PostgreSQL 8 */ -/* Project file: schema.dez */ -/* Project name: */ -/* Author: */ -/* Script type: Database creation script */ -/* Created on: 2010-05-27 14:26 */ -/* Model version: Version 2010-05-27 */ -/* ---------------------------------------------------------------------- */ - - -/* ---------------------------------------------------------------------- */ -/* Domains */ -/* ---------------------------------------------------------------------- */ - -CREATE DOMAIN CHECKSUM AS CHARACTER VARYING(8); - -CREATE DOMAIN CODE AS CHARACTER VARYING(40); - -CREATE DOMAIN DESCRIPTION AS CHARACTER VARYING(2000); - -CREATE DOMAIN INTEGER_NUMBER AS INTEGER; - -CREATE DOMAIN REAL_NUMBER AS DOUBLE PRECISION; - -CREATE DOMAIN LONG_SEQUENCE AS TEXT; - -CREATE DOMAIN SHORT_DESCRIPTION AS CHARACTER VARYING(200); - -CREATE DOMAIN TECH_ID AS BIGINT; - -CREATE DOMAIN SHORT_SEQUENCE AS CHARACTER VARYING(1000); - -CREATE DOMAIN ACCESSION_NUMBER AS CHARACTER VARYING(256); - -CREATE DOMAIN SPECTRUM_REFERENCE AS CHARACTER VARYING(100); - -CREATE DOMAIN BOOLEAN_CHAR AS BOOLEAN DEFAULT FALSE; - -/* ---------------------------------------------------------------------- */ -/* Tables */ -/* ---------------------------------------------------------------------- */ - -/* ---------------------------------------------------------------------- */ -/* Add table "EXPERIMENTS" */ -/* ---------------------------------------------------------------------- */ - -CREATE TABLE EXPERIMENTS ( - ID BIGSERIAL NOT NULL, - PERM_ID CODE NOT NULL, - CONSTRAINT PK_EXPERIMENTS PRIMARY KEY (ID), - CONSTRAINT TUC_EXPERIMENTS_1 UNIQUE (PERM_ID) -); - -/* ---------------------------------------------------------------------- */ -/* Add table "DATA_SETS" */ -/* ---------------------------------------------------------------------- */ - -CREATE TABLE DATA_SETS ( - ID BIGSERIAL NOT NULL, - EXPE_ID TECH_ID NOT NULL, - SAMP_ID TECH_ID, - DB_ID TECH_ID NOT NULL, - PERM_ID CODE NOT NULL, - CONSTRAINT PK_DATA_SETS PRIMARY KEY (ID), - CONSTRAINT TUC_DATA_SETS_1 UNIQUE (PERM_ID) -); - -CREATE INDEX IX_FK_DATA_SETS_EXPERIMENTS ON DATA_SETS (EXPE_ID); - -CREATE INDEX IX_FK_DATA_SETS_SAMPLES ON DATA_SETS (SAMP_ID); - -/* ---------------------------------------------------------------------- */ -/* Add table "MODIFICATIONS" */ -/* ---------------------------------------------------------------------- */ - -CREATE TABLE MODIFICATIONS ( - ID BIGSERIAL NOT NULL, - MOPE_ID TECH_ID NOT NULL, - POS INTEGER_NUMBER NOT NULL, - MASS REAL_NUMBER NOT NULL, - CONSTRAINT PK_MODIFICATIONS PRIMARY KEY (ID) -); - -/* ---------------------------------------------------------------------- */ -/* Add table "PEPTIDES" */ -/* ---------------------------------------------------------------------- */ - -CREATE TABLE PEPTIDES ( - ID BIGSERIAL NOT NULL, - PROT_ID TECH_ID NOT NULL, - SEQUENCE SHORT_SEQUENCE NOT NULL, - CHARGE INTEGER_NUMBER NOT NULL, - CONSTRAINT PK_PEPTIDES PRIMARY KEY (ID) -); - -CREATE INDEX IX_FK_PEPTIDES_PROTEINS ON PEPTIDES (PROT_ID); - -/* ---------------------------------------------------------------------- */ -/* Add table "PROTEINS" */ -/* ---------------------------------------------------------------------- */ - -CREATE TABLE PROTEINS ( - ID BIGSERIAL NOT NULL, - DASE_ID TECH_ID NOT NULL, - PROBABILITY REAL_NUMBER NOT NULL, - CONSTRAINT PK_PROTEINS PRIMARY KEY (ID) -); - -CREATE INDEX IDX_PROTEINS_1 ON PROTEINS (DASE_ID); - -/* ---------------------------------------------------------------------- */ -/* Add table "SAMPLES" */ -/* ---------------------------------------------------------------------- */ - -CREATE TABLE SAMPLES ( - ID BIGSERIAL NOT NULL, - PERM_ID CODE NOT NULL, - EXPE_ID TECH_ID NOT NULL, - CONSTRAINT PK_SAMPLES PRIMARY KEY (ID), - CONSTRAINT TUC_SAMPLES_1 UNIQUE (PERM_ID) -); - -/* ---------------------------------------------------------------------- */ -/* Add table "SEQUENCES" */ -/* ---------------------------------------------------------------------- */ - -CREATE TABLE SEQUENCES ( - ID BIGSERIAL NOT NULL, - DB_ID TECH_ID NOT NULL, - PRRE_ID TECH_ID NOT NULL, - AMINO_ACID_SEQUENCE LONG_SEQUENCE NOT NULL, - CHECKSUM CHECKSUM NOT NULL, - CONSTRAINT PK_SEQUENCES PRIMARY KEY (ID) -); - -/* ---------------------------------------------------------------------- */ -/* Add table "IDENTIFIED_PROTEINS" */ -/* ---------------------------------------------------------------------- */ - -CREATE TABLE IDENTIFIED_PROTEINS ( - ID BIGSERIAL NOT NULL, - PROT_ID TECH_ID NOT NULL, - SEQU_ID TECH_ID NOT NULL, - COVERAGE REAL_NUMBER, - IS_PRIMARY BOOLEAN_CHAR NOT NULL, - CONSTRAINT PK_IDENTIFIED_PROTEINS PRIMARY KEY (ID) -); - -/* ---------------------------------------------------------------------- */ -/* Add table "ABUNDANCES" */ -/* ---------------------------------------------------------------------- */ - -CREATE TABLE ABUNDANCES ( - ID BIGSERIAL NOT NULL, - PROT_ID TECH_ID NOT NULL, - SAMP_ID TECH_ID NOT NULL, - VALUE REAL_NUMBER NOT NULL, - CONSTRAINT PK_ABUNDANCES PRIMARY KEY (ID) -); - -/* ---------------------------------------------------------------------- */ -/* Add table "PROBABILITY_FDR_MAPPINGS" */ -/* ---------------------------------------------------------------------- */ - -CREATE TABLE PROBABILITY_FDR_MAPPINGS ( - ID BIGSERIAL NOT NULL, - DASE_ID TECH_ID NOT NULL, - PROBABILITY REAL_NUMBER NOT NULL, - FALSE_DISCOVERY_RATE REAL_NUMBER NOT NULL, - CONSTRAINT PK_PROBABILITY_FDR_MAPPINGS PRIMARY KEY (ID) -); - -/* ---------------------------------------------------------------------- */ -/* Add table "PROTEIN_REFERENCES" */ -/* ---------------------------------------------------------------------- */ - -CREATE TABLE PROTEIN_REFERENCES ( - ID BIGSERIAL NOT NULL, - ACCESSION_NUMBER ACCESSION_NUMBER NOT NULL, - DESCRIPTION DESCRIPTION, - CONSTRAINT PK_PROTEIN_REFERENCES PRIMARY KEY (ID), - CONSTRAINT TUC_PROTEIN_REFERENCES_1 UNIQUE (ACCESSION_NUMBER) -); - -CREATE INDEX IDX_PROTEIN_REFERENCES_1 ON PROTEIN_REFERENCES (ACCESSION_NUMBER); - -/* ---------------------------------------------------------------------- */ -/* Add table "DATABASES" */ -/* ---------------------------------------------------------------------- */ - -CREATE TABLE DATABASES ( - ID BIGSERIAL NOT NULL, - NAME_AND_VERSION SHORT_DESCRIPTION NOT NULL, - CONSTRAINT PK_DATABASES PRIMARY KEY (ID), - CONSTRAINT TUC_DATABASES_1 UNIQUE (NAME_AND_VERSION) -); - -/* ---------------------------------------------------------------------- */ -/* Add table "MODIFIED_PEPTIDES" */ -/* ---------------------------------------------------------------------- */ - -CREATE TABLE MODIFIED_PEPTIDES ( - ID BIGSERIAL NOT NULL, - PEPT_ID TECH_ID NOT NULL, - NTERM_MASS REAL_NUMBER NOT NULL, - CTERM_MASS REAL_NUMBER NOT NULL, - CONSTRAINT PK_MODIFIED_PEPTIDES PRIMARY KEY (ID) -); - -/* ---------------------------------------------------------------------- */ -/* Add table "SPECTRUM_REFERENCES" */ -/* ---------------------------------------------------------------------- */ - -CREATE TABLE SPECTRUM_REFERENCES ( - ID BIGSERIAL NOT NULL, - PEPT_ID TECH_ID NOT NULL, - REFERENCE SPECTRUM_REFERENCE NOT NULL, - CONSTRAINT PK_SPECTRUM_REFERENCES PRIMARY KEY (ID) -); - -/* ---------------------------------------------------------------------- */ -/* Add table "MODIFICATION_FRACTIONS" */ -/* ---------------------------------------------------------------------- */ - -CREATE TABLE MODIFICATION_FRACTIONS ( - ID BIGSERIAL NOT NULL, - MODI_ID TECH_ID NOT NULL, - SAMP_ID TECH_ID, - FRACTION REAL_NUMBER NOT NULL, - CONSTRAINT PK_MODIFICATION_FRACTIONS PRIMARY KEY (ID) -); - -/* ---------------------------------------------------------------------- */ -/* Add table "EVENTS" */ -/* ---------------------------------------------------------------------- */ - -CREATE TABLE EVENTS ( - LAST_SEEN_DELETION_EVENT_ID TECH_ID NOT NULL -); - -/* ---------------------------------------------------------------------- */ -/* Foreign key constraints */ -/* ---------------------------------------------------------------------- */ - -ALTER TABLE DATA_SETS ADD CONSTRAINT DA_EX_FK - FOREIGN KEY (EXPE_ID) REFERENCES EXPERIMENTS (ID); - -ALTER TABLE DATA_SETS ADD CONSTRAINT DA_SA_FK - FOREIGN KEY (SAMP_ID) REFERENCES SAMPLES (ID); - -ALTER TABLE DATA_SETS ADD CONSTRAINT DATABASES_DATA_SETS - FOREIGN KEY (DB_ID) REFERENCES DATABASES (ID); - -ALTER TABLE MODIFICATIONS ADD CONSTRAINT MODIFIED_PEPTIDES_MODIFICATIONS - FOREIGN KEY (MOPE_ID) REFERENCES MODIFIED_PEPTIDES (ID) ON DELETE CASCADE; - -ALTER TABLE PEPTIDES ADD CONSTRAINT PE_PR_FK - FOREIGN KEY (PROT_ID) REFERENCES PROTEINS (ID) ON DELETE CASCADE; - -ALTER TABLE PROTEINS ADD CONSTRAINT DATA_SETS_PROTEINS - FOREIGN KEY (DASE_ID) REFERENCES DATA_SETS (ID) ON DELETE CASCADE; - -ALTER TABLE SEQUENCES ADD CONSTRAINT DATABASES_SEQUENCES - FOREIGN KEY (DB_ID) REFERENCES DATABASES (ID); - -ALTER TABLE SEQUENCES ADD CONSTRAINT PROTEIN_REFERENCES_SEQUENCES - FOREIGN KEY (PRRE_ID) REFERENCES PROTEIN_REFERENCES (ID); - -ALTER TABLE IDENTIFIED_PROTEINS ADD CONSTRAINT PROTEINS_IDENTIFIED_PROTEINS - FOREIGN KEY (PROT_ID) REFERENCES PROTEINS (ID) ON DELETE CASCADE; - -ALTER TABLE IDENTIFIED_PROTEINS ADD CONSTRAINT SEQUENCES_IDENTIFIED_PROTEINS - FOREIGN KEY (SEQU_ID) REFERENCES SEQUENCES (ID); - -ALTER TABLE ABUNDANCES ADD CONSTRAINT SAMPLES_ABUNDANCES - FOREIGN KEY (SAMP_ID) REFERENCES SAMPLES (ID); - -ALTER TABLE ABUNDANCES ADD CONSTRAINT PROTEINS_ABUNDANCES - FOREIGN KEY (PROT_ID) REFERENCES PROTEINS (ID) ON DELETE CASCADE; - -ALTER TABLE PROBABILITY_FDR_MAPPINGS ADD CONSTRAINT DATA_SETS_PROBABILITY_FDR_MAPPINGS - FOREIGN KEY (DASE_ID) REFERENCES DATA_SETS (ID) ON DELETE CASCADE; - -ALTER TABLE MODIFIED_PEPTIDES ADD CONSTRAINT PEPTIDES_MODIFIED_PEPTIDES - FOREIGN KEY (PEPT_ID) REFERENCES PEPTIDES (ID) ON DELETE CASCADE; - -ALTER TABLE SPECTRUM_REFERENCES ADD CONSTRAINT PEPTIDES_SPECTRUM_REFERENCES - FOREIGN KEY (PEPT_ID) REFERENCES PEPTIDES (ID) ON DELETE CASCADE; - -ALTER TABLE MODIFICATION_FRACTIONS ADD CONSTRAINT MODIFICATIONS_MODIFICATION_FRACTIONS - FOREIGN KEY (MODI_ID) REFERENCES MODIFICATIONS (ID) ON DELETE CASCADE; - -ALTER TABLE MODIFICATION_FRACTIONS ADD CONSTRAINT SAMPLES_MODIFICATION_FRACTIONS - FOREIGN KEY (SAMP_ID) REFERENCES SAMPLES (ID); diff --git a/rtd_phosphonetx/source/sql/proteomics/postgresql/005/grant-005.sql b/rtd_phosphonetx/source/sql/proteomics/postgresql/005/grant-005.sql deleted file mode 100644 index 2e85f4fb1f6..00000000000 --- a/rtd_phosphonetx/source/sql/proteomics/postgresql/005/grant-005.sql +++ /dev/null @@ -1,18 +0,0 @@ --- Granting SELECT privilege to group PHOSPHONETX_READONLY - -GRANT SELECT ON TABLE EXPERIMENTS TO GROUP PHOSPHONETX_READONLY; -GRANT SELECT ON TABLE DATA_SETS TO GROUP PHOSPHONETX_READONLY; -GRANT SELECT ON TABLE MODIFICATIONS TO GROUP PHOSPHONETX_READONLY; -GRANT SELECT ON TABLE PEPTIDES TO GROUP PHOSPHONETX_READONLY; -GRANT SELECT ON TABLE PROTEINS TO GROUP PHOSPHONETX_READONLY; -GRANT SELECT ON TABLE SAMPLES TO GROUP PHOSPHONETX_READONLY; -GRANT SELECT ON TABLE SEQUENCES TO GROUP PHOSPHONETX_READONLY; -GRANT SELECT ON TABLE IDENTIFIED_PROTEINS TO GROUP PHOSPHONETX_READONLY; -GRANT SELECT ON TABLE ABUNDANCES TO GROUP PHOSPHONETX_READONLY; -GRANT SELECT ON TABLE PROBABILITY_FDR_MAPPINGS TO GROUP PHOSPHONETX_READONLY; -GRANT SELECT ON TABLE PROTEIN_REFERENCES TO GROUP PHOSPHONETX_READONLY; -GRANT SELECT ON TABLE DATABASES TO GROUP PHOSPHONETX_READONLY; -GRANT SELECT ON TABLE MODIFIED_PEPTIDES TO GROUP PHOSPHONETX_READONLY; -GRANT SELECT ON TABLE SPECTRUM_REFERENCES TO GROUP PHOSPHONETX_READONLY; -GRANT SELECT ON TABLE MODIFICATION_FRACTIONS TO GROUP PHOSPHONETX_READONLY; -GRANT SELECT ON TABLE EVENTS TO GROUP PHOSPHONETX_READONLY; diff --git a/rtd_phosphonetx/source/sql/proteomics/postgresql/005/schema-005.png b/rtd_phosphonetx/source/sql/proteomics/postgresql/005/schema-005.png deleted file mode 100755 index fceffeedd9cb97b93e06432546eb207feba07418..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 66176 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Π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 diff --git a/rtd_phosphonetx/source/sql/proteomics/postgresql/005/schema-005.sql b/rtd_phosphonetx/source/sql/proteomics/postgresql/005/schema-005.sql deleted file mode 100755 index ac882b6f7f9..00000000000 --- a/rtd_phosphonetx/source/sql/proteomics/postgresql/005/schema-005.sql +++ /dev/null @@ -1,310 +0,0 @@ -/* ---------------------------------------------------------------------- */ -/* Script generated with: DeZign for Databases v5.2.3 */ -/* Target DBMS: PostgreSQL 8 */ -/* Project file: schema.dez */ -/* Project name: */ -/* Author: */ -/* Script type: Database creation script */ -/* Created on: 2011-06-08 08:28 */ -/* Model version: Version 2011-06-08 */ -/* ---------------------------------------------------------------------- */ - - -/* ---------------------------------------------------------------------- */ -/* Domains */ -/* ---------------------------------------------------------------------- */ - -CREATE DOMAIN CHECKSUM AS CHARACTER VARYING(8); - -CREATE DOMAIN CODE AS CHARACTER VARYING(40); - -CREATE DOMAIN DESCRIPTION AS CHARACTER VARYING(2000); - -CREATE DOMAIN INTEGER_NUMBER AS INTEGER; - -CREATE DOMAIN REAL_NUMBER AS DOUBLE PRECISION; - -CREATE DOMAIN LONG_SEQUENCE AS TEXT; - -CREATE DOMAIN SHORT_DESCRIPTION AS CHARACTER VARYING(200); - -CREATE DOMAIN TECH_ID AS BIGINT; - -CREATE DOMAIN SHORT_SEQUENCE AS CHARACTER VARYING(1000); - -CREATE DOMAIN ACCESSION_NUMBER AS CHARACTER VARYING(256); - -CREATE DOMAIN SPECTRUM_REFERENCE AS CHARACTER VARYING(100); - -CREATE DOMAIN BOOLEAN_CHAR AS BOOLEAN DEFAULT FALSE; - -/* ---------------------------------------------------------------------- */ -/* Tables */ -/* ---------------------------------------------------------------------- */ - -/* ---------------------------------------------------------------------- */ -/* Add table "EXPERIMENTS" */ -/* ---------------------------------------------------------------------- */ - -CREATE TABLE EXPERIMENTS ( - ID BIGSERIAL NOT NULL, - PERM_ID CODE NOT NULL, - CONSTRAINT PK_EXPERIMENTS PRIMARY KEY (ID), - CONSTRAINT TUC_EXPERIMENTS_1 UNIQUE (PERM_ID) -); - -/* ---------------------------------------------------------------------- */ -/* Add table "DATA_SETS" */ -/* ---------------------------------------------------------------------- */ - -CREATE TABLE DATA_SETS ( - ID BIGSERIAL NOT NULL, - EXPE_ID TECH_ID NOT NULL, - SAMP_ID TECH_ID, - DB_ID TECH_ID NOT NULL, - PERM_ID CODE NOT NULL, - CONSTRAINT PK_DATA_SETS PRIMARY KEY (ID), - CONSTRAINT TUC_DATA_SETS_1 UNIQUE (PERM_ID) -); - -CREATE INDEX IX_FK_DATA_SETS_EXPERIMENTS ON DATA_SETS (EXPE_ID); - -CREATE INDEX IX_FK_DATA_SETS_SAMPLES ON DATA_SETS (SAMP_ID); - -/* ---------------------------------------------------------------------- */ -/* Add table "MODIFICATIONS" */ -/* ---------------------------------------------------------------------- */ - -CREATE TABLE MODIFICATIONS ( - ID BIGSERIAL NOT NULL, - MOPE_ID TECH_ID NOT NULL, - POS INTEGER_NUMBER NOT NULL, - MASS REAL_NUMBER NOT NULL, - CONSTRAINT PK_MODIFICATIONS PRIMARY KEY (ID) -); - -CREATE INDEX IX_FK_MODIFICATIONS_MODIFIED_PEPTIDES ON MODIFICATIONS (MOPE_ID); - -/* ---------------------------------------------------------------------- */ -/* Add table "PEPTIDES" */ -/* ---------------------------------------------------------------------- */ - -CREATE TABLE PEPTIDES ( - ID BIGSERIAL NOT NULL, - PROT_ID TECH_ID NOT NULL, - SEQUENCE SHORT_SEQUENCE NOT NULL, - CHARGE INTEGER_NUMBER NOT NULL, - CONSTRAINT PK_PEPTIDES PRIMARY KEY (ID) -); - -CREATE INDEX IX_FK_PEPTIDES_PROTEINS ON PEPTIDES (PROT_ID); - -/* ---------------------------------------------------------------------- */ -/* Add table "PROTEINS" */ -/* ---------------------------------------------------------------------- */ - -CREATE TABLE PROTEINS ( - ID BIGSERIAL NOT NULL, - DASE_ID TECH_ID NOT NULL, - PROBABILITY REAL_NUMBER NOT NULL, - CONSTRAINT PK_PROTEINS PRIMARY KEY (ID) -); - -CREATE INDEX IDX_PROTEINS_1 ON PROTEINS (DASE_ID); - -/* ---------------------------------------------------------------------- */ -/* Add table "SAMPLES" */ -/* ---------------------------------------------------------------------- */ - -CREATE TABLE SAMPLES ( - ID BIGSERIAL NOT NULL, - PERM_ID CODE NOT NULL, - EXPE_ID TECH_ID NOT NULL, - CONSTRAINT PK_SAMPLES PRIMARY KEY (ID), - CONSTRAINT TUC_SAMPLES_1 UNIQUE (PERM_ID) -); - -/* ---------------------------------------------------------------------- */ -/* Add table "SEQUENCES" */ -/* ---------------------------------------------------------------------- */ - -CREATE TABLE SEQUENCES ( - ID BIGSERIAL NOT NULL, - DB_ID TECH_ID NOT NULL, - PRRE_ID TECH_ID NOT NULL, - AMINO_ACID_SEQUENCE LONG_SEQUENCE NOT NULL, - CHECKSUM CHECKSUM NOT NULL, - CONSTRAINT PK_SEQUENCES PRIMARY KEY (ID) -); - -CREATE INDEX IX_FK_SEQUENCES_PROTEIN_REFERENCES ON SEQUENCES (PRRE_ID); - -/* ---------------------------------------------------------------------- */ -/* Add table "IDENTIFIED_PROTEINS" */ -/* ---------------------------------------------------------------------- */ - -CREATE TABLE IDENTIFIED_PROTEINS ( - ID BIGSERIAL NOT NULL, - PROT_ID TECH_ID NOT NULL, - SEQU_ID TECH_ID NOT NULL, - COVERAGE REAL_NUMBER, - IS_PRIMARY BOOLEAN_CHAR NOT NULL, - CONSTRAINT PK_IDENTIFIED_PROTEINS PRIMARY KEY (ID) -); - -CREATE INDEX IX_FK_IDENTIFIED_PROTEINS_PROTEINS ON IDENTIFIED_PROTEINS (PROT_ID); - -/* ---------------------------------------------------------------------- */ -/* Add table "ABUNDANCES" */ -/* ---------------------------------------------------------------------- */ - -CREATE TABLE ABUNDANCES ( - ID BIGSERIAL NOT NULL, - PROT_ID TECH_ID NOT NULL, - SAMP_ID TECH_ID NOT NULL, - VALUE REAL_NUMBER NOT NULL, - CONSTRAINT PK_ABUNDANCES PRIMARY KEY (ID) -); - -CREATE INDEX IX_FK_ABUNDANCES_PROTEINS ON ABUNDANCES (PROT_ID); - -/* ---------------------------------------------------------------------- */ -/* Add table "PROBABILITY_FDR_MAPPINGS" */ -/* ---------------------------------------------------------------------- */ - -CREATE TABLE PROBABILITY_FDR_MAPPINGS ( - ID BIGSERIAL NOT NULL, - DASE_ID TECH_ID NOT NULL, - PROBABILITY REAL_NUMBER NOT NULL, - FALSE_DISCOVERY_RATE REAL_NUMBER NOT NULL, - CONSTRAINT PK_PROBABILITY_FDR_MAPPINGS PRIMARY KEY (ID) -); - -CREATE INDEX IX_FK_PROBABILITY_FDR_MAPPINGS_DATA_SETS ON PROBABILITY_FDR_MAPPINGS (DASE_ID); - -/* ---------------------------------------------------------------------- */ -/* Add table "PROTEIN_REFERENCES" */ -/* ---------------------------------------------------------------------- */ - -CREATE TABLE PROTEIN_REFERENCES ( - ID BIGSERIAL NOT NULL, - ACCESSION_NUMBER ACCESSION_NUMBER NOT NULL, - DESCRIPTION DESCRIPTION, - CONSTRAINT PK_PROTEIN_REFERENCES PRIMARY KEY (ID), - CONSTRAINT TUC_PROTEIN_REFERENCES_1 UNIQUE (ACCESSION_NUMBER) -); - -CREATE INDEX IDX_PROTEIN_REFERENCES_1 ON PROTEIN_REFERENCES (ACCESSION_NUMBER); - -/* ---------------------------------------------------------------------- */ -/* Add table "DATABASES" */ -/* ---------------------------------------------------------------------- */ - -CREATE TABLE DATABASES ( - ID BIGSERIAL NOT NULL, - NAME_AND_VERSION SHORT_DESCRIPTION NOT NULL, - CONSTRAINT PK_DATABASES PRIMARY KEY (ID), - CONSTRAINT TUC_DATABASES_1 UNIQUE (NAME_AND_VERSION) -); - -/* ---------------------------------------------------------------------- */ -/* Add table "MODIFIED_PEPTIDES" */ -/* ---------------------------------------------------------------------- */ - -CREATE TABLE MODIFIED_PEPTIDES ( - ID BIGSERIAL NOT NULL, - PEPT_ID TECH_ID NOT NULL, - NTERM_MASS REAL_NUMBER NOT NULL, - CTERM_MASS REAL_NUMBER NOT NULL, - CONSTRAINT PK_MODIFIED_PEPTIDES PRIMARY KEY (ID) -); - -CREATE INDEX IX_FK_MODIFIED_PEPTIDES_PEPTIDES ON MODIFIED_PEPTIDES (PEPT_ID); - -/* ---------------------------------------------------------------------- */ -/* Add table "SPECTRUM_REFERENCES" */ -/* ---------------------------------------------------------------------- */ - -CREATE TABLE SPECTRUM_REFERENCES ( - ID BIGSERIAL NOT NULL, - PEPT_ID TECH_ID NOT NULL, - REFERENCE SPECTRUM_REFERENCE NOT NULL, - CONSTRAINT PK_SPECTRUM_REFERENCES PRIMARY KEY (ID) -); - -/* ---------------------------------------------------------------------- */ -/* Add table "MODIFICATION_FRACTIONS" */ -/* ---------------------------------------------------------------------- */ - -CREATE TABLE MODIFICATION_FRACTIONS ( - ID BIGSERIAL NOT NULL, - MODI_ID TECH_ID NOT NULL, - SAMP_ID TECH_ID, - FRACTION REAL_NUMBER NOT NULL, - CONSTRAINT PK_MODIFICATION_FRACTIONS PRIMARY KEY (ID) -); - -CREATE INDEX IX_FK_MODIFICATION_FRACTIONS_MODIFICATIONS ON MODIFICATION_FRACTIONS (MODI_ID); - -/* ---------------------------------------------------------------------- */ -/* Add table "EVENTS" */ -/* ---------------------------------------------------------------------- */ - -CREATE TABLE EVENTS ( - LAST_SEEN_DELETION_EVENT_ID TECH_ID NOT NULL -); - -/* ---------------------------------------------------------------------- */ -/* Foreign key constraints */ -/* ---------------------------------------------------------------------- */ - -ALTER TABLE DATA_SETS ADD CONSTRAINT DA_EX_FK - FOREIGN KEY (EXPE_ID) REFERENCES EXPERIMENTS (ID); - -ALTER TABLE DATA_SETS ADD CONSTRAINT DA_SA_FK - FOREIGN KEY (SAMP_ID) REFERENCES SAMPLES (ID); - -ALTER TABLE DATA_SETS ADD CONSTRAINT DATABASES_DATA_SETS - FOREIGN KEY (DB_ID) REFERENCES DATABASES (ID); - -ALTER TABLE MODIFICATIONS ADD CONSTRAINT MODIFIED_PEPTIDES_MODIFICATIONS - FOREIGN KEY (MOPE_ID) REFERENCES MODIFIED_PEPTIDES (ID) ON DELETE CASCADE; - -ALTER TABLE PEPTIDES ADD CONSTRAINT PE_PR_FK - FOREIGN KEY (PROT_ID) REFERENCES PROTEINS (ID) ON DELETE CASCADE; - -ALTER TABLE PROTEINS ADD CONSTRAINT DATA_SETS_PROTEINS - FOREIGN KEY (DASE_ID) REFERENCES DATA_SETS (ID) ON DELETE CASCADE; - -ALTER TABLE SEQUENCES ADD CONSTRAINT DATABASES_SEQUENCES - FOREIGN KEY (DB_ID) REFERENCES DATABASES (ID); - -ALTER TABLE SEQUENCES ADD CONSTRAINT PROTEIN_REFERENCES_SEQUENCES - FOREIGN KEY (PRRE_ID) REFERENCES PROTEIN_REFERENCES (ID); - -ALTER TABLE IDENTIFIED_PROTEINS ADD CONSTRAINT PROTEINS_IDENTIFIED_PROTEINS - FOREIGN KEY (PROT_ID) REFERENCES PROTEINS (ID) ON DELETE CASCADE; - -ALTER TABLE IDENTIFIED_PROTEINS ADD CONSTRAINT SEQUENCES_IDENTIFIED_PROTEINS - FOREIGN KEY (SEQU_ID) REFERENCES SEQUENCES (ID); - -ALTER TABLE ABUNDANCES ADD CONSTRAINT SAMPLES_ABUNDANCES - FOREIGN KEY (SAMP_ID) REFERENCES SAMPLES (ID); - -ALTER TABLE ABUNDANCES ADD CONSTRAINT PROTEINS_ABUNDANCES - FOREIGN KEY (PROT_ID) REFERENCES PROTEINS (ID) ON DELETE CASCADE; - -ALTER TABLE PROBABILITY_FDR_MAPPINGS ADD CONSTRAINT DATA_SETS_PROBABILITY_FDR_MAPPINGS - FOREIGN KEY (DASE_ID) REFERENCES DATA_SETS (ID) ON DELETE CASCADE; - -ALTER TABLE MODIFIED_PEPTIDES ADD CONSTRAINT PEPTIDES_MODIFIED_PEPTIDES - FOREIGN KEY (PEPT_ID) REFERENCES PEPTIDES (ID) ON DELETE CASCADE; - -ALTER TABLE SPECTRUM_REFERENCES ADD CONSTRAINT PEPTIDES_SPECTRUM_REFERENCES - FOREIGN KEY (PEPT_ID) REFERENCES PEPTIDES (ID) ON DELETE CASCADE; - -ALTER TABLE MODIFICATION_FRACTIONS ADD CONSTRAINT MODIFICATIONS_MODIFICATION_FRACTIONS - FOREIGN KEY (MODI_ID) REFERENCES MODIFICATIONS (ID) ON DELETE CASCADE; - -ALTER TABLE MODIFICATION_FRACTIONS ADD CONSTRAINT SAMPLES_MODIFICATION_FRACTIONS - FOREIGN KEY (SAMP_ID) REFERENCES SAMPLES (ID); diff --git a/rtd_phosphonetx/source/sql/proteomics/postgresql/migration/migration-001-002.sql b/rtd_phosphonetx/source/sql/proteomics/postgresql/migration/migration-001-002.sql deleted file mode 100644 index 36900c0353f..00000000000 --- a/rtd_phosphonetx/source/sql/proteomics/postgresql/migration/migration-001-002.sql +++ /dev/null @@ -1,41 +0,0 @@ -CREATE TABLE EVENTS ( - LAST_SEEN_DELETION_EVENT_ID TECH_ID NOT NULL -); - - -ALTER TABLE MODIFICATIONS DROP CONSTRAINT MODIFIED_PEPTIDES_MODIFICATIONS; -ALTER TABLE MODIFICATIONS ADD CONSTRAINT MODIFIED_PEPTIDES_MODIFICATIONS - FOREIGN KEY (MOPE_ID) REFERENCES MODIFIED_PEPTIDES (ID) ON DELETE CASCADE; - -ALTER TABLE PEPTIDES DROP CONSTRAINT PE_PR_FK; -ALTER TABLE PEPTIDES ADD CONSTRAINT PE_PR_FK - FOREIGN KEY (PROT_ID) REFERENCES PROTEINS (ID) ON DELETE CASCADE; - -ALTER TABLE PROTEINS DROP CONSTRAINT DATA_SETS_PROTEINS; -ALTER TABLE PROTEINS ADD CONSTRAINT DATA_SETS_PROTEINS - FOREIGN KEY (DASE_ID) REFERENCES DATA_SETS (ID) ON DELETE CASCADE; - -ALTER TABLE IDENTIFIED_PROTEINS DROP CONSTRAINT PROTEINS_IDENTIFIED_PROTEINS; -ALTER TABLE IDENTIFIED_PROTEINS ADD CONSTRAINT PROTEINS_IDENTIFIED_PROTEINS - FOREIGN KEY (PROT_ID) REFERENCES PROTEINS (ID) ON DELETE CASCADE; - -ALTER TABLE ABUNDANCES DROP CONSTRAINT PROTEINS_ABUNDANCES; -ALTER TABLE ABUNDANCES ADD CONSTRAINT PROTEINS_ABUNDANCES - FOREIGN KEY (PROT_ID) REFERENCES PROTEINS (ID) ON DELETE CASCADE; - -ALTER TABLE PROBABILITY_FDR_MAPPINGS DROP CONSTRAINT DATA_SETS_PROBABILITY_FDR_MAPPINGS; -ALTER TABLE PROBABILITY_FDR_MAPPINGS ADD CONSTRAINT DATA_SETS_PROBABILITY_FDR_MAPPINGS - FOREIGN KEY (DASE_ID) REFERENCES DATA_SETS (ID) ON DELETE CASCADE; - -ALTER TABLE MODIFIED_PEPTIDES DROP CONSTRAINT PEPTIDES_MODIFIED_PEPTIDES; -ALTER TABLE MODIFIED_PEPTIDES ADD CONSTRAINT PEPTIDES_MODIFIED_PEPTIDES - FOREIGN KEY (PEPT_ID) REFERENCES PEPTIDES (ID) ON DELETE CASCADE; - -ALTER TABLE SPECTRUM_REFERENCES DROP CONSTRAINT PEPTIDES_SPECTRUM_REFERENCES; -ALTER TABLE SPECTRUM_REFERENCES ADD CONSTRAINT PEPTIDES_SPECTRUM_REFERENCES - FOREIGN KEY (PEPT_ID) REFERENCES PEPTIDES (ID) ON DELETE CASCADE; - -ALTER TABLE MODIFICATION_FRACTIONS DROP CONSTRAINT MODIFICATIONS_MODIFICATION_FRACTIONS; -ALTER TABLE MODIFICATION_FRACTIONS ADD CONSTRAINT MODIFICATIONS_MODIFICATION_FRACTIONS - FOREIGN KEY (MODI_ID) REFERENCES MODIFICATIONS (ID) ON DELETE CASCADE; - \ No newline at end of file diff --git a/rtd_phosphonetx/source/sql/proteomics/postgresql/migration/migration-002-003.sql b/rtd_phosphonetx/source/sql/proteomics/postgresql/migration/migration-002-003.sql deleted file mode 100644 index 639f94657a5..00000000000 --- a/rtd_phosphonetx/source/sql/proteomics/postgresql/migration/migration-002-003.sql +++ /dev/null @@ -1,4 +0,0 @@ --- JAVA ch.systemsx.cisd.openbis.plugin.phosphonetx.server.dataaccess.db.migration.MigrationStepFrom002To003 - -ALTER TABLE IDENTIFIED_PROTEINS ADD COLUMN COVERAGE REAL_NUMBER; - diff --git a/rtd_phosphonetx/source/sql/proteomics/postgresql/migration/migration-003-004.sql b/rtd_phosphonetx/source/sql/proteomics/postgresql/migration/migration-003-004.sql deleted file mode 100644 index 84d3d8a841b..00000000000 --- a/rtd_phosphonetx/source/sql/proteomics/postgresql/migration/migration-003-004.sql +++ /dev/null @@ -1,5 +0,0 @@ -CREATE DOMAIN BOOLEAN_CHAR AS BOOLEAN DEFAULT FALSE; - -ALTER TABLE IDENTIFIED_PROTEINS ADD COLUMN IS_PRIMARY BOOLEAN_CHAR NOT NULL; - -UPDATE IDENTIFIED_PROTEINS SET IS_PRIMARY = 'T' WHERE ID = ANY(SELECT MIN(ID) FROM IDENTIFIED_PROTEINS GROUP BY PROT_ID); diff --git a/rtd_phosphonetx/source/sql/proteomics/postgresql/migration/migration-004-005.sql b/rtd_phosphonetx/source/sql/proteomics/postgresql/migration/migration-004-005.sql deleted file mode 100644 index fb183f726ad..00000000000 --- a/rtd_phosphonetx/source/sql/proteomics/postgresql/migration/migration-004-005.sql +++ /dev/null @@ -1,14 +0,0 @@ -DROP INDEX IF EXISTS IX_FK_MODIFICATION_FRACTIONS_MODIFICATIONS; -CREATE INDEX IX_FK_MODIFICATION_FRACTIONS_MODIFICATIONS ON MODIFICATION_FRACTIONS (MODI_ID); -DROP INDEX IF EXISTS IX_FK_MODIFICATIONS_MODIFIED_PEPTIDES; -CREATE INDEX IX_FK_MODIFICATIONS_MODIFIED_PEPTIDES ON MODIFICATIONS (MOPE_ID); -DROP INDEX IF EXISTS IX_FK_MODIFIED_PEPTIDES_PEPTIDES; -CREATE INDEX IX_FK_MODIFIED_PEPTIDES_PEPTIDES ON MODIFIED_PEPTIDES (PEPT_ID); -DROP INDEX IF EXISTS IX_FK_ABUNDANCES_PROTEINS; -CREATE INDEX IX_FK_ABUNDANCES_PROTEINS ON ABUNDANCES (PROT_ID); -DROP INDEX IF EXISTS IX_FK_IDENTIFIED_PROTEINS_PROTEINS; -CREATE INDEX IX_FK_IDENTIFIED_PROTEINS_PROTEINS ON IDENTIFIED_PROTEINS (PROT_ID); -DROP INDEX IF EXISTS IX_FK_SEQUENCES_PROTEIN_REFERENCES; -CREATE INDEX IX_FK_SEQUENCES_PROTEIN_REFERENCES ON SEQUENCES (PRRE_ID); -DROP INDEX IF EXISTS IX_FK_PROBABILITY_FDR_MAPPINGS_DATA_SETS; -CREATE INDEX IX_FK_PROBABILITY_FDR_MAPPINGS_DATA_SETS ON PROBABILITY_FDR_MAPPINGS (DASE_ID); diff --git a/rtd_phosphonetx/source/sql/proteomics/postgresql/schema.dez b/rtd_phosphonetx/source/sql/proteomics/postgresql/schema.dez deleted file mode 100755 index 4c8ebf447f3..00000000000 --- a/rtd_phosphonetx/source/sql/proteomics/postgresql/schema.dez +++ /dev/null @@ -1,26376 +0,0 @@ -<?xml version="1.0" encoding="iso-8859-1"?><dezign> - -<FILEFORMATVERSION>51</FILEFORMATVERSION> -<VERSION> -<PROJECTSETTINGS> -<PROJECTFILENAME>D:\User\felmer\dev-workspace\rtd_phosphonetx\source\sql\postgresql\phosphonetx.dez</PROJECTFILENAME> -<MODIFIED>2011-06-08</MODIFIED> -<CREATED>2009-06-29</CREATED> -<CREATED2></CREATED2> -<PROJECTNAME></PROJECTNAME> -<DESCRIPTION></DESCRIPTION> -<AUTHOR></AUTHOR> -<COPYRIGHT></COPYRIGHT> -<LASTGENERATEDFILES>G:\phosphonetx\datamodel\schema.sql;G:\phosphonetx\datamodel\drop.sql;\CreateDBLog_201106081.txt</LASTGENERATEDFILES> -</PROJECTSETTINGS> -<CONNECTIONSETTINGS> -<SQLFILE>D:\User\felmer\dev-workspace\rtd_phosphonetx\source\sql\postgresql\001\schema-001.sql</SQLFILE> -<CONNECTIONTYPE>SQLFILE</CONNECTIONTYPE> -<DBID>postgresql8</DBID> -</CONNECTIONSETTINGS> -<DATADICT> -<DBID>postgresql8</DBID> -<LASTID>236</LASTID> -<DDSETTINGS> -<PKCONNAMETEMPLATE>PK_%table%</PKCONNAMETEMPLATE> -<FKCONNAMETEMPLATE>%relname%</FKCONNAMETEMPLATE> -<CCONNAMETEMPLATE>CC_%table%_%column%</CCONNAMETEMPLATE> -<NOTNULLCONNAMETEMPLATE>NN_%column%</NOTNULLCONNAMETEMPLATE> -<DEFAULTCONNAMETEMPLATE>DEF_%table%_%column%</DEFAULTCONNAMETEMPLATE> -<TUCONNAMETEMPLATE>TUC_%table%_%counter%</TUCONNAMETEMPLATE> -<TCCONNAMETEMPLATE>TCC_%table%_%counter%</TCCONNAMETEMPLATE> -<RELNAMETEMPLATE>%parent%_%child%</RELNAMETEMPLATE> -<INDEXNAMETEMPLATE>IDX_%table%_%counter%</INDEXNAMETEMPLATE> -<DEFTABLEOPTIONS></DEFTABLEOPTIONS> -<DEFINDEXOPTIONS></DEFINDEXOPTIONS> -<BEGINDATABASESCRIPT></BEGINDATABASESCRIPT> -<ENDDATABASESCRIP></ENDDATABASESCRIP> -<BEGINALTERDATABASESCRIPT></BEGINALTERDATABASESCRIPT> -<ENDALTERDATABASESCRIP></ENDALTERDATABASESCRIP> -<BEGINDROPDATABASESCRIPT></BEGINDROPDATABASESCRIPT> -<ENDDROPDATABASESCRIP></ENDDROPDATABASESCRIP> -<GENDIALOGSELECTEDOBJECTS></GENDIALOGSELECTEDOBJECTS> -<GENTABLES>1</GENTABLES> -<GENTABLEOPTIONS>1</GENTABLEOPTIONS> -<GENCONSTRAINTS>1</GENCONSTRAINTS> -<GENINDEXES>1</GENINDEXES> -<GENTRIGGERS>1</GENTRIGGERS> -<GENVIEWS>1</GENVIEWS> -<GENPROCEDURES>1</GENPROCEDURES> -<GENSEQUENCES>1</GENSEQUENCES> -<GENRELATIONSHIPS>1</GENRELATIONSHIPS> -<GENBEGINENDTABLESCRIPTS>1</GENBEGINENDTABLESCRIPTS> -<GENBEGINENDDBSCRIPTS>1</GENBEGINENDDBSCRIPTS> -<GLOBALPREFIX></GLOBALPREFIX> -<AUTOCREATEINDEXESONKEYS>0</AUTOCREATEINDEXESONKEYS> -<CONVERTDOMAINS>0</CONVERTDOMAINS> -<IGNORECOMMENTS>0</IGNORECOMMENTS> -<USESCHEMANAMES>0</USESCHEMANAMES> -<UCONNAMETEMPLATE></UCONNAMETEMPLATE> -<SQLCREATEFILE>G:\phosphonetx\datamodel\schema.sql</SQLCREATEFILE> -<SQLDROPFILE>G:\phosphonetx\datamodel\drop.sql</SQLDROPFILE> -</DDSETTINGS> -<DOMAINS> -<DOMAIN> -<NAME>CHECKSUM</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>8</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>CODE</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>DESCRIPTION</NAME> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>2000</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>INTEGER_NUMBER</NAME> -<ID>7</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>INTEGER</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>REAL_NUMBER</NAME> -<ID>8</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>LONG_SEQUENCE</NAME> -<ID>9</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>TEXT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>SHORT_DESCRIPTION</NAME> -<ID>11</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>200</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>TECH_ID</NAME> -<ID>12</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>SHORT_SEQUENCE</NAME> -<ID>69</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>1000</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>ACCESSION_NUMBER</NAME> -<ID>109</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>256</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>SPECTRUM_REFERENCE</NAME> -<ID>171</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>100</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>BOOLEAN_CHAR</NAME> -<ID>188</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>BOOLEAN</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<DEFCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>FALSE</VALUE> -<CONLEVEL>0</CONLEVEL> -<CONTYPE>6</CONTYPE> -<ATTRIBUTEIDS> -</ATTRIBUTEIDS> -</DEFCON> -</DOMAIN> -</DOMAINS> -<ENTITIES> -<ENT> -<NAME>EXPERIMENTS</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>16</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>3</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_EXPERIMENTS</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PERM_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>5</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_EXPERIMENTS_1</NAME> -<NAMETEMPLATE>TUC_%table%_%counter%</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>DATA_SETS</NAME> -<NAMETEMPLATE>IX_FK_DATA_SETS_EXPERIMENTS</NAMETEMPLATE> -<ID>17</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>6</ATTRLASTID> -<IDXLASTID>3</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_DATA_SETS</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>EXPE_ID</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>SAMP_ID</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -<ATTR> -<NAME>DB_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>6</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PERM_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>5</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<INDEXES> -<INDEX> -<NAME>IX_FK_DATA_SETS_EXPERIMENTS</NAME> -<NAMETEMPLATE>IX_FK_DATA_SETS_EXPERIMENTS</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>EXPE_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>4</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -<INDEX> -<NAME>IX_FK_DATA_SETS_SAMPLES</NAME> -<NAMETEMPLATE>IX_FK_DATA_SETS_SAMPLES</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>SAMP_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>5</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -</INDEXES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_DATA_SETS_1</NAME> -<NAMETEMPLATE>TUC_%table%_%counter%</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>MODIFICATIONS</NAME> -<NAMETEMPLATE>IX_FK_MODIFICATIONS_PEPTIDES</NAMETEMPLATE> -<ID>19</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>7</ATTRLASTID> -<IDXLASTID>6</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_MODIFICATIONS</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>MOPE_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>7</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>7</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>POS</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>7</DOMAINID> -<DT> -<DTLISTNAME>INTEGER</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>MASS</NAME> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>6</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<INDEXES> -<INDEX> -<NAME>IX_FK_MODIFICATIONS_MODIFIED_PEPTIDES</NAME> -<NAMETEMPLATE>IX_FK_MODIFICATIONS_MODIFIED_PEPTIDES</NAMETEMPLATE> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>MOPE_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>7</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -</INDEXES> -</ENT> -<ENT> -<NAME>PEPTIDES</NAME> -<NAMETEMPLATE>IX_FK_PEPTIDES_ABUNDANCES</NAMETEMPLATE> -<ID>21</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>10</ATTRLASTID> -<IDXLASTID>5</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_PEPTIDES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PROT_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>SEQUENCE</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>10</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>69</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>1000</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>10</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>CHARGE</NAME> -<ID>7</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>7</DOMAINID> -<DT> -<DTLISTNAME>INTEGER</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>7</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<INDEXES> -<INDEX> -<NAME>IX_FK_PEPTIDES_PROTEINS</NAME> -<NAMETEMPLATE>IX_FK_PEPTIDES_PROTEINS</NAMETEMPLATE> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>PROT_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>3</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -</INDEXES> -</ENT> -<ENT> -<NAME>PROTEINS</NAME> -<NAMETEMPLATE>IX_FK_PROTEINS_DATA_SETS</NAMETEMPLATE> -<ID>23</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>11</ATTRLASTID> -<IDXLASTID>7</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_PROTEINS</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DASE_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>10</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>10</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PROBABILITY</NAME> -<ID>9</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>9</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<INDEXES> -<INDEX> -<NAME>IDX_PROTEINS_1</NAME> -<NAMETEMPLATE>IDX_%table%_%counter%</NAMETEMPLATE> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>DASE_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>10</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -</INDEXES> -</ENT> -<ENT> -<NAME>SAMPLES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>24</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>4</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_SAMPLES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PERM_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>5</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>EXPE_ID</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_SAMPLES_1</NAME> -<NAMETEMPLATE>TUC_%table%_%counter%</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>SEQUENCES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>25</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>6</ATTRLASTID> -<IDXLASTID>2</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_SEQUENCES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DB_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PRRE_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>6</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>AMINO_ACID_SEQUENCE</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>9</DOMAINID> -<DT> -<DTLISTNAME>TEXT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>CHECKSUM</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>4</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>8</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<INDEXES> -<INDEX> -<NAME>IX_FK_SEQUENCES_PROTEIN_REFERENCES</NAME> -<NAMETEMPLATE>IX_FK_SEQUENCES_PROTEIN_REFERENCES</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>PRRE_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>6</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -</INDEXES> -</ENT> -<ENT> -<NAME>IDENTIFIED_PROTEINS</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>47</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>7</ATTRLASTID> -<IDXLASTID>2</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_IDENTIFIED_PROTEINS</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PROT_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>SEQU_ID</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>COVERAGE</NAME> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -<ATTR> -<NAME>IS_PRIMARY</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>7</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>188</DOMAINID> -<DT> -<DTLISTNAME>BOOLEAN</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>7</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -<DEFCON> -<NAME></NAME> -<NAMETEMPLATE>DEF_%table%_%column%</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>FALSE</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>6</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>7</ATTRIBUTEID> -</ATTRIBUTEIDS> -</DEFCON> -</ATTR> -</ATTRIBUTES> -<INDEXES> -<INDEX> -<NAME>IX_FK_IDENTIFIED_PROTEINS_PROTEINS</NAME> -<NAMETEMPLATE>IX_FK_IDENTIFIED_PROTEINS_PROTEINS</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>PROT_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>3</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -</INDEXES> -</ENT> -<ENT> -<NAME>ABUNDANCES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>91</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>6</ATTRLASTID> -<IDXLASTID>2</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_ABUNDANCES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PROT_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>SAMP_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>VALUE</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>6</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<INDEXES> -<INDEX> -<NAME>IX_FK_ABUNDANCES_PROTEINS</NAME> -<NAMETEMPLATE>IX_FK_ABUNDANCES_PROTEINS</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>PROT_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>3</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -</INDEXES> -</ENT> -<ENT> -<NAME>PROBABILITY_FDR_MAPPINGS</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>96</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>5</ATTRLASTID> -<IDXLASTID>2</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_PROBABILITY_FDR_MAPPINGS</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DASE_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PROBABILITY</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>FALSE_DISCOVERY_RATE</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<INDEXES> -<INDEX> -<NAME>IX_FK_PROBABILITY_FDR_MAPPINGS_DATA_SETS</NAME> -<NAMETEMPLATE>IX_FK_PROBABILITY_FDR_MAPPINGS_DATA_SETS</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>DASE_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>5</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -</INDEXES> -</ENT> -<ENT> -<NAME>PROTEIN_REFERENCES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>98</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>4</ATTRLASTID> -<IDXLASTID>2</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_PROTEIN_REFERENCES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>ACCESSION_NUMBER</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>109</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>256</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DESCRIPTION</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>6</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>2000</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -</ATTRIBUTES> -<INDEXES> -<INDEX> -<NAME>IDX_PROTEIN_REFERENCES_1</NAME> -<NAMETEMPLATE>IDX_%table%_%counter%</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>ACCESSION_NUMBER</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>3</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -</INDEXES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_PROTEIN_REFERENCES_1</NAME> -<NAMETEMPLATE>TUC_%table%_%counter%</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>DATABASES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>110</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>3</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_DATABASES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>NAME_AND_VERSION</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>11</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>200</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_DATABASES_1</NAME> -<NAMETEMPLATE>TUC_%table%_%counter%</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>MODIFIED_PEPTIDES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>136</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>5</ATTRLASTID> -<IDXLASTID>2</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_MODIFIED_PEPTIDES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PEPT_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>NTERM_MASS</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>CTERM_MASS</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<INDEXES> -<INDEX> -<NAME>IX_FK_MODIFIED_PEPTIDES_PEPTIDES</NAME> -<NAMETEMPLATE>IX_FK_MODIFIED_PEPTIDES_PEPTIDES</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>PEPT_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>3</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -</INDEXES> -</ENT> -<ENT> -<NAME>SPECTRUM_REFERENCES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>160</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>4</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_SPECTRUM_REFERENCES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PEPT_ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>REFERENCE</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>171</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>100</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -</ENT> -<ENT> -<NAME>MODIFICATION_FRACTIONS</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>173</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>5</ATTRLASTID> -<IDXLASTID>2</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_MODIFICATION_FRACTIONS</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>MODI_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>SAMP_ID</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -<ATTR> -<NAME>FRACTION</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<INDEXES> -<INDEX> -<NAME>IX_FK_MODIFICATION_FRACTIONS_MODIFICATIONS</NAME> -<NAMETEMPLATE>IX_FK_MODIFICATION_FRACTIONS_MODIFICATIONS</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>MODI_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>3</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -</INDEXES> -</ENT> -<ENT> -<NAME>EVENTS</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>176</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>2</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<ATTRIBUTES> -<ATTR> -<NAME>LAST_SEEN_DELETION_EVENT_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -</ENT> -</ENTITIES> -<SUBCATEGORIES> -</SUBCATEGORIES> -<TEXTAREAS> -</TEXTAREAS> -<GROUPBOXES> -</GROUPBOXES> -<STAMPS> -</STAMPS> -<SEQUENCES> -</SEQUENCES> -<PROCEDURES> -</PROCEDURES> -<VIEWS> -</VIEWS> -<RELATIONSHIPS> -<REL> -<NAME>DA_EX_FK</NAME> -<NAMETEMPLATE>DA_EX_FK</NAMETEMPLATE> -<ID>29</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>16</PARENTOBJECTID> -<CHILDOBJECTID>17</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>DA_EX_FK</NAME> -<NAMETEMPLATE>DA_EX_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>4</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>DA_SA_FK</NAME> -<NAMETEMPLATE>DA_SA_FK</NAMETEMPLATE> -<ID>30</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>24</PARENTOBJECTID> -<CHILDOBJECTID>17</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>0</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>DA_SA_FK</NAME> -<NAMETEMPLATE>DA_SA_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>5</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>PE_PR_FK</NAME> -<NAMETEMPLATE>PE_PR_FK</NAMETEMPLATE> -<ID>36</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>23</PARENTOBJECTID> -<CHILDOBJECTID>21</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>2</DELETERULE> -<CONSTRAINT> -<NAME>PE_PR_FK</NAME> -<NAMETEMPLATE>PE_PR_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>3</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>DATA_SETS_PROTEINS</NAME> -<NAMETEMPLATE>%parent%_%child%</NAMETEMPLATE> -<ID>46</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>17</PARENTOBJECTID> -<CHILDOBJECTID>23</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>2</DELETERULE> -<CONSTRAINT> -<NAME>DATA_SETS_PROTEINS</NAME> -<NAMETEMPLATE>%relname%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>10</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>10</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>PROTEINS_IDENTIFIED_PROTEINS</NAME> -<NAMETEMPLATE>%parent%_%child%</NAMETEMPLATE> -<ID>48</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>23</PARENTOBJECTID> -<CHILDOBJECTID>47</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>2</DELETERULE> -<CONSTRAINT> -<NAME>PROTEINS_IDENTIFIED_PROTEINS</NAME> -<NAMETEMPLATE>%relname%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>3</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>SEQUENCES_IDENTIFIED_PROTEINS</NAME> -<NAMETEMPLATE>%parent%_%child%</NAMETEMPLATE> -<ID>50</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>25</PARENTOBJECTID> -<CHILDOBJECTID>47</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>SEQUENCES_IDENTIFIED_PROTEINS</NAME> -<NAMETEMPLATE>%relname%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>5</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>SAMPLES_ABUNDANCES</NAME> -<NAMETEMPLATE>%parent%_%child%</NAMETEMPLATE> -<ID>92</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>24</PARENTOBJECTID> -<CHILDOBJECTID>91</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>SAMPLES_ABUNDANCES</NAME> -<NAMETEMPLATE>%relname%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>4</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>PROTEINS_ABUNDANCES</NAME> -<NAMETEMPLATE>%parent%_%child%</NAMETEMPLATE> -<ID>94</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>23</PARENTOBJECTID> -<CHILDOBJECTID>91</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>2</DELETERULE> -<CONSTRAINT> -<NAME>PROTEINS_ABUNDANCES</NAME> -<NAMETEMPLATE>%relname%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>3</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>DATA_SETS_PROBABILITY_FDR_MAPPINGS</NAME> -<NAMETEMPLATE>%parent%_%child%</NAMETEMPLATE> -<ID>97</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>17</PARENTOBJECTID> -<CHILDOBJECTID>96</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>2</DELETERULE> -<CONSTRAINT> -<NAME>DATA_SETS_PROBABILITY_FDR_MAPPINGS</NAME> -<NAMETEMPLATE>%relname%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>5</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>DATABASES_SEQUENCES</NAME> -<NAMETEMPLATE>%parent%_%child%</NAMETEMPLATE> -<ID>111</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>110</PARENTOBJECTID> -<CHILDOBJECTID>25</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>DATABASES_SEQUENCES</NAME> -<NAMETEMPLATE>%relname%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>5</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>PROTEIN_REFERENCES_SEQUENCES</NAME> -<NAMETEMPLATE>%parent%_%child%</NAMETEMPLATE> -<ID>112</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>98</PARENTOBJECTID> -<CHILDOBJECTID>25</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>PROTEIN_REFERENCES_SEQUENCES</NAME> -<NAMETEMPLATE>%relname%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>6</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>6</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>DATABASES_DATA_SETS</NAME> -<NAMETEMPLATE>%parent%_%child%</NAMETEMPLATE> -<ID>125</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>110</PARENTOBJECTID> -<CHILDOBJECTID>17</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>DATABASES_DATA_SETS</NAME> -<NAMETEMPLATE>%relname%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>6</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>6</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>PEPTIDES_MODIFIED_PEPTIDES</NAME> -<NAMETEMPLATE>%parent%_%child%</NAMETEMPLATE> -<ID>138</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>21</PARENTOBJECTID> -<CHILDOBJECTID>136</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>2</DELETERULE> -<CONSTRAINT> -<NAME>PEPTIDES_MODIFIED_PEPTIDES</NAME> -<NAMETEMPLATE>%relname%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>3</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>MODIFIED_PEPTIDES_MODIFICATIONS</NAME> -<NAMETEMPLATE>%parent%_%child%</NAMETEMPLATE> -<ID>139</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>136</PARENTOBJECTID> -<CHILDOBJECTID>19</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>2</DELETERULE> -<CONSTRAINT> -<NAME>MODIFIED_PEPTIDES_MODIFICATIONS</NAME> -<NAMETEMPLATE>%relname%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>7</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>7</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>PEPTIDES_SPECTRUM_REFERENCES</NAME> -<NAMETEMPLATE>%parent%_%child%</NAMETEMPLATE> -<ID>172</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>21</PARENTOBJECTID> -<CHILDOBJECTID>160</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>2</DELETERULE> -<CONSTRAINT> -<NAME>PEPTIDES_SPECTRUM_REFERENCES</NAME> -<NAMETEMPLATE>%relname%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>2</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>MODIFICATIONS_MODIFICATION_FRACTIONS</NAME> -<NAMETEMPLATE>%parent%_%child%</NAMETEMPLATE> -<ID>174</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>19</PARENTOBJECTID> -<CHILDOBJECTID>173</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>2</DELETERULE> -<CONSTRAINT> -<NAME>MODIFICATIONS_MODIFICATION_FRACTIONS</NAME> -<NAMETEMPLATE>%relname%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>3</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>SAMPLES_MODIFICATION_FRACTIONS</NAME> -<NAMETEMPLATE>%parent%_%child%</NAMETEMPLATE> -<ID>175</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>24</PARENTOBJECTID> -<CHILDOBJECTID>173</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>0</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>SAMPLES_MODIFICATION_FRACTIONS</NAME> -<NAMETEMPLATE>%relname%</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>4</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -</RELATIONSHIPS> -<SUBCATEGORYCONNECTIONS> -</SUBCATEGORYCONNECTIONS> -</DATADICT> -<DIAGRAMS> -<DisplayPreferences> -<USEINDICATORLINE>0</USEINDICATORLINE> -<INDICATORBITMAPS>0</INDICATORBITMAPS> -<PKINDICATOR>PK</PKINDICATOR> -<FKINDICATOR>FK</FKINDICATOR> -<PFINDICATOR>PF</PFINDICATOR> -<NOTNULLINDICATOR>*</NOTNULLINDICATOR> -<INDICATORPOSITION>0</INDICATORPOSITION> -<DEFTEXTAREACOLOR>16777215</DEFTEXTAREACOLOR> -<DEFENTCOLOR>16777215</DEFENTCOLOR> -<DEFSTAMPCOLOR>16777215</DEFSTAMPCOLOR> -<DEFGROUPBOXCOLOR>8421504</DEFGROUPBOXCOLOR> -<DEFTEXTAREALINECOLOR>0</DEFTEXTAREALINECOLOR> -<DEFENTLINECOLOR>0</DEFENTLINECOLOR> -<DEFSTAMPLINECOLOR>0</DEFSTAMPLINECOLOR> -<DEFSUBCATLINECOLOR>0</DEFSUBCATLINECOLOR> -<DEFCONLINECOLOR>0</DEFCONLINECOLOR> -<DEFGROUPBOXLINECOLOR>0</DEFGROUPBOXLINECOLOR> -<DEFTEXTAREATRANSPARENT>0</DEFTEXTAREATRANSPARENT> -<DEFSTAMPTRANSPARENT>0</DEFSTAMPTRANSPARENT> -<DEFTEXTAREALINEWIDTH>1</DEFTEXTAREALINEWIDTH> -<DEFSTAMPLINEWIDTH>1</DEFSTAMPLINEWIDTH> -<DEFGROUPBOXLINEWIDTH>0</DEFGROUPBOXLINEWIDTH> -<DEFTEXTAREALINESTYLE>0</DEFTEXTAREALINESTYLE> -<DEFSTAMPLINESTYLE>0</DEFSTAMPLINESTYLE> -<DEFGROUPBOXLINESTYLE>0</DEFGROUPBOXLINESTYLE> -<ENTNAMEFONT>Arial,9,B,0,clNavy,0</ENTNAMEFONT> -<ENTPKFONT>Arial,8,B,0,clWindowText,0</ENTPKFONT> -<ENTFKFONT>Arial,8,I,0,clWindowText,0</ENTFKFONT> -<ENTATTRFONT>Arial,8,,0,clWindowText,0</ENTATTRFONT> -<TEXTAREAFONT>Arial,8,,0,clWindowText,0</TEXTAREAFONT> -<GROUPBOXFONT>Arial,8,,0,clWindowText,0</GROUPBOXFONT> -<CAPTIONFONT>Arial,8,,0,clWindowText,0</CAPTIONFONT> -</DisplayPreferences> -<DIAGRAM> -<ID>1</ID> -<NAME>Main Diagram</NAME> -<DESC></DESC> -<TODO></TODO> -<ISMAINDIAGRAM>1</ISMAINDIAGRAM> -<BGCOLOR>16777215</BGCOLOR> -<DISPLAYLEVEL>0</DISPLAYLEVEL> -<VISIBLEATTR>2</VISIBLEATTR> -<CAPTIONSTYLE>0</CAPTIONSTYLE> -<SHOWPKINDICATOR>1</SHOWPKINDICATOR> -<SHOWFKINDICATOR>1</SHOWFKINDICATOR> -<SHOWNOTNULLINDICATOR>1</SHOWNOTNULLINDICATOR> -<NOTATION>0</NOTATION> -</DIAGRAM> -<CONTROLS> -<ENTITYCONTROLS> -<ENTC> -<ID>16</ID> -<DIAGRAMID>1</DIAGRAMID> -<W>136</W> -<H>63</H> -<L>544</L> -<T>1</T> -<BRUSH>0,16777215</BRUSH> -<PEN>0,1,4,0</PEN> -<FONT>Arial,8,,0,clWindowText,0</FONT> -<TR>0</TR> -<AS>1</AS> -</ENTC> -<ENTC> -<ID>17</ID> -<DIAGRAMID>1</DIAGRAMID> -<W>139</W> -<H>108</H> -<L>295</L> -<T>1</T> -<BRUSH>0,16777215</BRUSH> -<PEN>0,1,4,0</PEN> -<FONT>Arial,8,,0,clWindowText,0</FONT> -<TR>0</TR> -<AS>1</AS> -</ENTC> -<ENTC> -<ID>19</ID> -<DIAGRAMID>1</DIAGRAMID> -<W>177</W> -<H>93</H> -<L>12</L> -<T>628</T> -<BRUSH>0,16777215</BRUSH> -<PEN>0,1,4,0</PEN> -<FONT>Arial,8,,0,clWindowText,0</FONT> -<TR>0</TR> -<AS>1</AS> -</ENTC> -<ENTC> -<ID>21</ID> -<DIAGRAMID>1</DIAGRAMID> -<W>187</W> -<H>93</H> -<L>271</L> -<T>480</T> -<BRUSH>0,16777215</BRUSH> -<PEN>0,1,4,0</PEN> -<FONT>Arial,8,,0,clWindowText,0</FONT> -<TR>0</TR> -<AS>1</AS> -</ENTC> -<ENTC> -<ID>23</ID> -<DIAGRAMID>1</DIAGRAMID> -<W>180</W> -<H>78</H> -<L>274</L> -<T>328</T> -<BRUSH>0,16777215</BRUSH> -<PEN>0,1,4,0</PEN> -<FONT>Arial,8,,0,clWindowText,0</FONT> -<TR>0</TR> -<AS>1</AS> -</ENTC> -<ENTC> -<ID>24</ID> -<DIAGRAMID>1</DIAGRAMID> -<W>136</W> -<H>78</H> -<L>12</L> -<T>1</T> -<BRUSH>0,16777215</BRUSH> -<PEN>0,1,4,0</PEN> -<FONT>Arial,8,,0,clWindowText,0</FONT> -<TR>0</TR> -<AS>1</AS> -</ENTC> -<ENTC> -<ID>25</ID> -<DIAGRAMID>1</DIAGRAMID> -<W>250</W> -<H>108</H> -<L>754</L> -<T>328</T> -<BRUSH>0,16777215</BRUSH> -<PEN>0,1,4,0</PEN> -<FONT>Arial,8,,0,clWindowText,0</FONT> -<TR>0</TR> -<AS>1</AS> -</ENTC> -<ENTC> -<ID>47</ID> -<DIAGRAMID>1</DIAGRAMID> -<W>184</W> -<H>108</H> -<L>518</L> -<T>328</T> -<BRUSH>0,16777215</BRUSH> -<PEN>0,1,4,0</PEN> -<FONT>Arial,8,,0,clWindowText,0</FONT> -<TR>0</TR> -<AS>1</AS> -</ENTC> -<ENTC> -<ID>91</ID> -<DIAGRAMID>1</DIAGRAMID> -<W>161</W> -<H>93</H> -<L>114</L> -<T>182</T> -<BRUSH>0,16777215</BRUSH> -<PEN>0,1,4,0</PEN> -<FONT>Arial,8,,0,clWindowText,0</FONT> -<TR>0</TR> -<AS>1</AS> -</ENTC> -<ENTC> -<ID>96</ID> -<DIAGRAMID>1</DIAGRAMID> -<W>243</W> -<H>93</H> -<L>490</L> -<T>182</T> -<BRUSH>0,16777215</BRUSH> -<PEN>0,1,4,0</PEN> -<FONT>Arial,8,,0,clWindowText,0</FONT> -<TR>0</TR> -<AS>1</AS> -</ENTC> -<ENTC> -<ID>98</ID> -<DIAGRAMID>1</DIAGRAMID> -<W>252</W> -<H>78</H> -<L>752</L> -<T>480</T> -<BRUSH>0,16777215</BRUSH> -<PEN>0,1,4,0</PEN> -<FONT>Arial,8,,0,clWindowText,0</FONT> -<TR>0</TR> -<AS>1</AS> -</ENTC> -<ENTC> -<ID>110</ID> -<DIAGRAMID>1</DIAGRAMID> -<W>252</W> -<H>63</H> -<L>752</L> -<T>91</T> -<BRUSH>0,16777215</BRUSH> -<PEN>0,1,4,0</PEN> -<FONT>Arial,8,,0,clWindowText,0</FONT> -<TR>0</TR> -<AS>1</AS> -</ENTC> -<ENTC> -<ID>136</ID> -<DIAGRAMID>1</DIAGRAMID> -<W>183</W> -<H>93</H> -<L>273</L> -<T>628</T> -<BRUSH>0,16777215</BRUSH> -<PEN>0,1,4,0</PEN> -<FONT>Arial,8,,0,clWindowText,0</FONT> -<TR>0</TR> -<AS>1</AS> -</ENTC> -<ENTC> -<ID>160</ID> -<DIAGRAMID>1</DIAGRAMID> -<W>214</W> -<H>78</H> -<L>505</L> -<T>480</T> -<BRUSH>0,16777215</BRUSH> -<PEN>0,1,4,0</PEN> -<FONT>Arial,8,,0,clWindowText,0</FONT> -<TR>0</TR> -<AS>1</AS> -</ENTC> -<ENTC> -<ID>173</ID> -<DIAGRAMID>1</DIAGRAMID> -<W>164</W> -<H>93</H> -<L>12</L> -<T>480</T> -<BRUSH>0,16777215</BRUSH> -<PEN>0,1,4,0</PEN> -<FONT>Arial,8,,0,clWindowText,0</FONT> -<TR>0</TR> -<AS>1</AS> -</ENTC> -<ENTC> -<ID>176</ID> -<DIAGRAMID>1</DIAGRAMID> -<W>226</W> -<H>48</H> -<L>778</L> -<T>1</T> -<BRUSH>0,16777215</BRUSH> -<PEN>0,1,4,0</PEN> -<FONT>Arial,8,,0,clWindowText,0</FONT> -<TR>0</TR> -<AS>1</AS> -</ENTC> -</ENTITYCONTROLS> -<SUBCATEGORYCONTROLS> -</SUBCATEGORYCONTROLS> -<TEXTAREACONTROLS> -</TEXTAREACONTROLS> -<STAMPCONTROLS> -</STAMPCONTROLS> -<GROUPBOXESCONTROLS> -</GROUPBOXESCONTROLS> -<RELATIONSHIPCONNECTORS> -<RELC> -<ID>29</ID> -<DIAGRAMID>1</DIAGRAMID> -<FONT>Arial,8,,0,clWindowText,0</FONT> -<PEN>1,1,4,0</PEN> -<FROMRELATIVEX>5000</FROMRELATIVEX> -<FROMRELATIVEY>4921</FROMRELATIVEY> -<TORELATIVEX>5000</TORELATIVEX> -<TORELATIVEY>2870</TORELATIVEY> -<POINTS> -<POINT> -<X>543</X> -<Y>32</Y> -</POINT> -<POINT> -<X>480</X> -<Y>32</Y> -</POINT> -<POINT> -<X>480</X> -<Y>32</Y> -</POINT> -<POINT> -<X>434</X> -<Y>32</Y> -</POINT> -</POINTS> -</RELC> -<RELC> -<ID>30</ID> -<DIAGRAMID>1</DIAGRAMID> -<FONT>Arial,8,,0,clWindowText,0</FONT> -<PEN>1,1,4,0</PEN> -<FROMRELATIVEX>5000</FROMRELATIVEX> -<FROMRELATIVEY>5000</FROMRELATIVEY> -<TORELATIVEX>5000</TORELATIVEX> -<TORELATIVEY>3611</TORELATIVEY> -<POINTS> -<POINT> -<X>148</X> -<Y>40</Y> -</POINT> -<POINT> -<X>219</X> -<Y>40</Y> -</POINT> -<POINT> -<X>219</X> -<Y>40</Y> -</POINT> -<POINT> -<X>294</X> -<Y>40</Y> -</POINT> -</POINTS> -</RELC> -<RELC> -<ID>36</ID> -<DIAGRAMID>1</DIAGRAMID> -<FONT>Arial,8,,0,clWindowText,0</FONT> -<PEN>1,1,4,0</PEN> -<FROMRELATIVEX>5000</FROMRELATIVEX> -<FROMRELATIVEY>5000</FROMRELATIVEY> -<TORELATIVEX>4973</TORELATIVEX> -<TORELATIVEY>5000</TORELATIVEY> -<POINTS> -<POINT> -<X>364</X> -<Y>406</Y> -</POINT> -<POINT> -<X>364</X> -<Y>428</Y> -</POINT> -<POINT> -<X>364</X> -<Y>428</Y> -</POINT> -<POINT> -<X>364</X> -<Y>479</Y> -</POINT> -</POINTS> -</RELC> -<RELC> -<ID>46</ID> -<DIAGRAMID>1</DIAGRAMID> -<FONT>Arial,8,,0,clWindowText,0</FONT> -<PEN>1,1,4,0</PEN> -<FROMRELATIVEX>4964</FROMRELATIVEX> -<FROMRELATIVEY>5000</FROMRELATIVEY> -<TORELATIVEX>5000</TORELATIVEX> -<TORELATIVEY>5000</TORELATIVEY> -<POINTS> -<POINT> -<X>364</X> -<Y>109</Y> -</POINT> -<POINT> -<X>364</X> -<Y>183</Y> -</POINT> -<POINT> -<X>364</X> -<Y>183</Y> -</POINT> -<POINT> -<X>364</X> -<Y>327</Y> -</POINT> -</POINTS> -</RELC> -<RELC> -<ID>48</ID> -<DIAGRAMID>1</DIAGRAMID> -<FONT>Arial,8,,0,clWindowText,0</FONT> -<PEN>1,1,4,0</PEN> -<FROMRELATIVEX>5000</FROMRELATIVEX> -<FROMRELATIVEY>5000</FROMRELATIVEY> -<TORELATIVEX>5000</TORELATIVEX> -<TORELATIVEY>3611</TORELATIVEY> -<POINTS> -<POINT> -<X>454</X> -<Y>367</Y> -</POINT> -<POINT> -<X>489</X> -<Y>367</Y> -</POINT> -<POINT> -<X>489</X> -<Y>367</Y> -</POINT> -<POINT> -<X>517</X> -<Y>367</Y> -</POINT> -</POINTS> -</RELC> -<RELC> -<ID>50</ID> -<DIAGRAMID>1</DIAGRAMID> -<FONT>Arial,8,,0,clWindowText,0</FONT> -<PEN>1,1,4,0</PEN> -<FROMRELATIVEX>2840</FROMRELATIVEX> -<FROMRELATIVEY>5000</FROMRELATIVEY> -<TORELATIVEX>5000</TORELATIVEX> -<TORELATIVEY>5000</TORELATIVEY> -<POINTS> -<POINT> -<X>753</X> -<Y>382</Y> -</POINT> -<POINT> -<X>722</X> -<Y>382</Y> -</POINT> -<POINT> -<X>722</X> -<Y>382</Y> -</POINT> -<POINT> -<X>702</X> -<Y>382</Y> -</POINT> -</POINTS> -</RELC> -<RELC> -<ID>92</ID> -<DIAGRAMID>1</DIAGRAMID> -<FONT>Arial,8,,0,clWindowText,0</FONT> -<PEN>1,1,4,0</PEN> -<FROMRELATIVEX>8750</FROMRELATIVEX> -<FROMRELATIVEY>5000</FROMRELATIVEY> -<TORELATIVEX>1056</TORELATIVEX> -<TORELATIVEY>5000</TORELATIVEY> -<POINTS> -<POINT> -<X>131</X> -<Y>79</Y> -</POINT> -<POINT> -<X>131</X> -<Y>143</Y> -</POINT> -<POINT> -<X>131</X> -<Y>143</Y> -</POINT> -<POINT> -<X>131</X> -<Y>181</Y> -</POINT> -</POINTS> -</RELC> -<RELC> -<ID>94</ID> -<DIAGRAMID>1</DIAGRAMID> -<FONT>Arial,8,,0,clWindowText,0</FONT> -<PEN>1,1,4,0</PEN> -<FROMRELATIVEX>0</FROMRELATIVEX> -<FROMRELATIVEY>5000</FROMRELATIVEY> -<TORELATIVEX>9938</TORELATIVEX> -<TORELATIVEY>4194</TORELATIVEY> -<POINTS> -<POINT> -<X>274</X> -<Y>327</Y> -</POINT> -<POINT> -<X>274</X> -<Y>299</Y> -</POINT> -<POINT> -<X>274</X> -<Y>299</Y> -</POINT> -<POINT> -<X>274</X> -<Y>275</Y> -</POINT> -</POINTS> -</RELC> -<RELC> -<ID>97</ID> -<DIAGRAMID>1</DIAGRAMID> -<FONT>Arial,8,,0,clWindowText,0</FONT> -<PEN>1,1,4,0</PEN> -<FROMRELATIVEX>8369</FROMRELATIVEX> -<FROMRELATIVEY>5000</FROMRELATIVEY> -<TORELATIVEX>5000</TORELATIVEX> -<TORELATIVEY>5000</TORELATIVEY> -<POINTS> -<POINT> -<X>411</X> -<Y>109</Y> -</POINT> -<POINT> -<X>411</X> -<Y>161</Y> -</POINT> -<POINT> -<X>612</X> -<Y>161</Y> -</POINT> -<POINT> -<X>612</X> -<Y>181</Y> -</POINT> -</POINTS> -</RELC> -<RELC> -<ID>111</ID> -<DIAGRAMID>1</DIAGRAMID> -<FONT>Arial,8,,0,clWindowText,0</FONT> -<PEN>1,1,4,0</PEN> -<FROMRELATIVEX>5040</FROMRELATIVEX> -<FROMRELATIVEY>7619</FROMRELATIVEY> -<TORELATIVEX>5000</TORELATIVEX> -<TORELATIVEY>1296</TORELATIVEY> -<POINTS> -<POINT> -<X>879</X> -<Y>154</Y> -</POINT> -<POINT> -<X>879</X> -<Y>235</Y> -</POINT> -<POINT> -<X>879</X> -<Y>235</Y> -</POINT> -<POINT> -<X>879</X> -<Y>327</Y> -</POINT> -</POINTS> -</RELC> -<RELC> -<ID>112</ID> -<DIAGRAMID>1</DIAGRAMID> -<FONT>Arial,8,,0,clWindowText,0</FONT> -<PEN>1,1,4,0</PEN> -<FROMRELATIVEX>5040</FROMRELATIVEX> -<FROMRELATIVEY>5000</FROMRELATIVEY> -<TORELATIVEX>5000</TORELATIVEX> -<TORELATIVEY>3611</TORELATIVEY> -<POINTS> -<POINT> -<X>879</X> -<Y>479</Y> -</POINT> -<POINT> -<X>879</X> -<Y>447</Y> -</POINT> -<POINT> -<X>879</X> -<Y>447</Y> -</POINT> -<POINT> -<X>879</X> -<Y>436</Y> -</POINT> -</POINTS> -</RELC> -<RELC> -<ID>125</ID> -<DIAGRAMID>1</DIAGRAMID> -<FONT>Arial,8,,0,clWindowText,0</FONT> -<PEN>1,1,4,0</PEN> -<FROMRELATIVEX>5000</FROMRELATIVEX> -<FROMRELATIVEY>1429</FROMRELATIVEY> -<TORELATIVEX>5000</TORELATIVEX> -<TORELATIVEY>9167</TORELATIVEY> -<POINTS> -<POINT> -<X>751</X> -<Y>100</Y> -</POINT> -<POINT> -<X>578</X> -<Y>100</Y> -</POINT> -<POINT> -<X>578</X> -<Y>100</Y> -</POINT> -<POINT> -<X>434</X> -<Y>100</Y> -</POINT> -</POINTS> -</RELC> -<RELC> -<ID>138</ID> -<DIAGRAMID>1</DIAGRAMID> -<FONT>Arial,8,,0,clWindowText,0</FONT> -<PEN>1,1,4,0</PEN> -<FROMRELATIVEX>4973</FROMRELATIVEX> -<FROMRELATIVEY>5000</FROMRELATIVEY> -<TORELATIVEX>4973</TORELATIVEX> -<TORELATIVEY>5000</TORELATIVEY> -<POINTS> -<POINT> -<X>364</X> -<Y>573</Y> -</POINT> -<POINT> -<X>364</X> -<Y>585</Y> -</POINT> -<POINT> -<X>364</X> -<Y>585</Y> -</POINT> -<POINT> -<X>364</X> -<Y>627</Y> -</POINT> -</POINTS> -</RELC> -<RELC> -<ID>139</ID> -<DIAGRAMID>1</DIAGRAMID> -<FONT>Arial,8,,0,clWindowText,0</FONT> -<PEN>1,1,4,0</PEN> -<FROMRELATIVEX>929</FROMRELATIVEX> -<FROMRELATIVEY>4946</FROMRELATIVEY> -<TORELATIVEX>5000</TORELATIVEX> -<TORELATIVEY>4946</TORELATIVEY> -<POINTS> -<POINT> -<X>272</X> -<Y>674</Y> -</POINT> -<POINT> -<X>237</X> -<Y>674</Y> -</POINT> -<POINT> -<X>237</X> -<Y>674</Y> -</POINT> -<POINT> -<X>189</X> -<Y>674</Y> -</POINT> -</POINTS> -</RELC> -<RELC> -<ID>172</ID> -<DIAGRAMID>1</DIAGRAMID> -<FONT>Arial,8,,0,clWindowText,0</FONT> -<PEN>1,1,4,0</PEN> -<FROMRELATIVEX>5000</FROMRELATIVEX> -<FROMRELATIVEY>4194</FROMRELATIVEY> -<TORELATIVEX>5000</TORELATIVEX> -<TORELATIVEY>5000</TORELATIVEY> -<POINTS> -<POINT> -<X>458</X> -<Y>519</Y> -</POINT> -<POINT> -<X>469</X> -<Y>519</Y> -</POINT> -<POINT> -<X>469</X> -<Y>519</Y> -</POINT> -<POINT> -<X>504</X> -<Y>519</Y> -</POINT> -</POINTS> -</RELC> -<RELC> -<ID>174</ID> -<DIAGRAMID>1</DIAGRAMID> -<FONT>Arial,8,,0,clWindowText,0</FONT> -<PEN>1,1,4,0</PEN> -<FROMRELATIVEX>4633</FROMRELATIVEX> -<FROMRELATIVEY>5000</FROMRELATIVEY> -<TORELATIVEX>5000</TORELATIVEX> -<TORELATIVEY>5000</TORELATIVEY> -<POINTS> -<POINT> -<X>94</X> -<Y>627</Y> -</POINT> -<POINT> -<X>94</X> -<Y>585</Y> -</POINT> -<POINT> -<X>94</X> -<Y>585</Y> -</POINT> -<POINT> -<X>94</X> -<Y>573</Y> -</POINT> -</POINTS> -</RELC> -<RELC> -<ID>175</ID> -<DIAGRAMID>1</DIAGRAMID> -<FONT>Arial,8,,0,clWindowText,0</FONT> -<PEN>1,1,4,0</PEN> -<FROMRELATIVEX>5000</FROMRELATIVEX> -<FROMRELATIVEY>5000</FROMRELATIVEY> -<TORELATIVEX>4146</TORELATIVEX> -<TORELATIVEY>5000</TORELATIVEY> -<POINTS> -<POINT> -<X>80</X> -<Y>79</Y> -</POINT> -<POINT> -<X>80</X> -<Y>202</Y> -</POINT> -<POINT> -<X>80</X> -<Y>202</Y> -</POINT> -<POINT> -<X>80</X> -<Y>479</Y> -</POINT> -</POINTS> -</RELC> -</RELATIONSHIPCONNECTORS> -<SUBCATEGORYCONNECTORS> -</SUBCATEGORYCONNECTORS> -</CONTROLS> -</DIAGRAMS> -</VERSION><VERSION> -<VERSIONINFO> -<VERSIONNUMBER>1</VERSIONNUMBER> -<VERSIONLABEL>Version 2009-06-29</VERSIONLABEL> -<VERSIONDATE>2009-06-29 10:58</VERSIONDATE> -<VERSIONCOMMENTS></VERSIONCOMMENTS> -<VERSIONTYPE>DB</VERSIONTYPE> -<VERSIONTYPEDESC>Data dictionary only (no diagrams)</VERSIONTYPEDESC> -</VERSIONINFO> -<DATADICT> -<DBID>postgresql8</DBID> -<LASTID>46</LASTID> -<DDSETTINGS> -<PKCONNAMETEMPLATE>PK_%table%</PKCONNAMETEMPLATE> -<FKCONNAMETEMPLATE>%relname%</FKCONNAMETEMPLATE> -<CCONNAMETEMPLATE>CC_%table%_%column%</CCONNAMETEMPLATE> -<NOTNULLCONNAMETEMPLATE>NN_%column%</NOTNULLCONNAMETEMPLATE> -<DEFAULTCONNAMETEMPLATE>DEF_%table%_%column%</DEFAULTCONNAMETEMPLATE> -<TUCONNAMETEMPLATE>TUC_%table%_%counter%</TUCONNAMETEMPLATE> -<TCCONNAMETEMPLATE>TCC_%table%_%counter%</TCCONNAMETEMPLATE> -<RELNAMETEMPLATE>%parent%_%child%</RELNAMETEMPLATE> -<INDEXNAMETEMPLATE>IDX_%table%_%counter%</INDEXNAMETEMPLATE> -<DEFTABLEOPTIONS></DEFTABLEOPTIONS> -<DEFINDEXOPTIONS></DEFINDEXOPTIONS> -<BEGINDATABASESCRIPT></BEGINDATABASESCRIPT> -<ENDDATABASESCRIP></ENDDATABASESCRIP> -<BEGINALTERDATABASESCRIPT></BEGINALTERDATABASESCRIPT> -<ENDALTERDATABASESCRIP></ENDALTERDATABASESCRIP> -<BEGINDROPDATABASESCRIPT></BEGINDROPDATABASESCRIPT> -<ENDDROPDATABASESCRIP></ENDDROPDATABASESCRIP> -<GENDIALOGSELECTEDOBJECTS></GENDIALOGSELECTEDOBJECTS> -<GENTABLES>1</GENTABLES> -<GENTABLEOPTIONS>1</GENTABLEOPTIONS> -<GENCONSTRAINTS>1</GENCONSTRAINTS> -<GENINDEXES>1</GENINDEXES> -<GENTRIGGERS>1</GENTRIGGERS> -<GENVIEWS>1</GENVIEWS> -<GENPROCEDURES>1</GENPROCEDURES> -<GENSEQUENCES>1</GENSEQUENCES> -<GENRELATIONSHIPS>1</GENRELATIONSHIPS> -<GENBEGINENDTABLESCRIPTS>1</GENBEGINENDTABLESCRIPTS> -<GENBEGINENDDBSCRIPTS>1</GENBEGINENDDBSCRIPTS> -<GLOBALPREFIX></GLOBALPREFIX> -<AUTOCREATEINDEXESONKEYS>0</AUTOCREATEINDEXESONKEYS> -<CONVERTDOMAINS>0</CONVERTDOMAINS> -<IGNORECOMMENTS>0</IGNORECOMMENTS> -<USESCHEMANAMES>0</USESCHEMANAMES> -<UCONNAMETEMPLATE></UCONNAMETEMPLATE> -<SQLCREATEFILE>D:\User\felmer\dev-workspace\rtd_phosphonetx\source\sql\postgresql\001\schema-001.sql</SQLCREATEFILE> -<SQLDROPFILE>D:\User\felmer\dev-workspace\rtd_phosphonetx\targets\drop.sql</SQLDROPFILE> -</DDSETTINGS> -<DOMAINS> -<DOMAIN> -<NAME>BINARY_DATA</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>BYTEA</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>CHECKSUM</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>8</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>CODE</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>DESCRIPTION</NAME> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>2000</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>INTEGER_NUMBER</NAME> -<ID>7</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>INTEGER</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>REAL_NUMBER</NAME> -<ID>8</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>SEQUENCE</NAME> -<ID>9</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>TEXT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>SHORT_DESCRIPTION</NAME> -<ID>11</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>200</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>TECH_ID</NAME> -<ID>12</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -</DOMAINS> -<ENTITIES> -<ENT> -<NAME>ABUNDANCES_TYPES</NAME> -<ID>14</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>4</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_ABUNDANCES_TYPES</NAME> -<NAMETEMPLATE>PK_ABUNDANCES_TYPES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>CODE</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>5</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DESCRIPTION</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>11</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>200</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -</ATTRIBUTES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_ABUNDANCES_TYPES_1</NAME> -<NAMETEMPLATE>TUC_ABUNDANCES_TYPES_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>EXPERIMENTS</NAME> -<ID>16</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>3</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_EXPERIMENTS</NAME> -<NAMETEMPLATE>PK_EXPERIMENTS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PERM_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>5</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_EXPERIMENTS_1</NAME> -<NAMETEMPLATE>TUC_EXPERIMENTS_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>DATA_SETS</NAME> -<NAMETEMPLATE>IX_FK_DATA_SETS_EXPERIMENTS</NAMETEMPLATE> -<ID>17</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>5</ATTRLASTID> -<IDXLASTID>3</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_DATA_SETS</NAME> -<NAMETEMPLATE>PK_DATA_SETS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>EXPE_ID</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>SAMP_ID</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PERM_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>5</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<INDEXES> -<INDEX> -<NAME>IX_FK_DATA_SETS_EXPERIMENTS</NAME> -<NAMETEMPLATE>IX_FK_DATA_SETS_EXPERIMENTS</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>EXPE_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>4</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -<INDEX> -<NAME>IX_FK_DATA_SETS_SAMPLES</NAME> -<NAMETEMPLATE>IX_FK_DATA_SETS_SAMPLES</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>SAMP_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>5</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -</INDEXES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_DATA_SETS_1</NAME> -<NAMETEMPLATE>TUC_DATA_SETS_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>IDENTIFICATION_DATA</NAME> -<NAMETEMPLATE>IX_FK_IDENTIFICATION_DATA_SPECTRA</NAMETEMPLATE> -<ID>18</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>4</ATTRLASTID> -<IDXLASTID>2</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_IDENTIFICATION_DATA</NAME> -<NAMETEMPLATE>PK_IDENTIFICATION_DATA</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>SPEC_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -<ATTR> -<NAME>SPECTRA_COUNT</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>7</DOMAINID> -<DT> -<DTLISTNAME>INTEGER</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -</ATTRIBUTES> -<INDEXES> -<INDEX> -<NAME>IX_FK_IDENTIFICATION_DATA_SPECTRA</NAME> -<NAMETEMPLATE>IX_FK_IDENTIFICATION_DATA_SPECTRA</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>SPEC_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>3</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -</INDEXES> -</ENT> -<ENT> -<NAME>MODIFICATIONS</NAME> -<NAMETEMPLATE>IX_FK_MODIFICATIONS_PEPTIDES</NAMETEMPLATE> -<ID>19</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>6</ATTRLASTID> -<IDXLASTID>3</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_MODIFICATIONS</NAME> -<NAMETEMPLATE>PK_MODIFICATIONS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PEPT_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>MOTY_ID</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>POS</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>7</DOMAINID> -<DT> -<DTLISTNAME>INTEGER</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>MASS</NAME> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>6</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<INDEXES> -<INDEX> -<NAME>IX_FK_MODIFICATIONS_PEPTIDES</NAME> -<NAMETEMPLATE>IX_FK_MODIFICATIONS_PEPTIDES</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>PEPT_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>3</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -<INDEX> -<NAME>IX_FK_MODIFICATIONS_MODIFICATION_TYPES</NAME> -<NAMETEMPLATE>IX_FK_MODIFICATIONS_MODIFICATION_TYPES</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>MOTY_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>4</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -</INDEXES> -</ENT> -<ENT> -<NAME>MODIFICATION_TYPES</NAME> -<ID>20</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>6</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_MODIFICATION_TYPES</NAME> -<NAMETEMPLATE>PK_MODIFICATION_TYPES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>CODE</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>5</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DESCRIPTION</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>11</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>200</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -<ATTR> -<NAME>MASS</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -<ATTR> -<NAME>DELTA_MASS</NAME> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -</ATTRIBUTES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_MODIFICATION_TYPES_1</NAME> -<NAMETEMPLATE>TUC_MODIFICATION_TYPES_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>PEPTIDES</NAME> -<NAMETEMPLATE>IX_FK_PEPTIDES_ABUNDANCES</NAMETEMPLATE> -<ID>21</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>9</ATTRLASTID> -<IDXLASTID>5</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_PEPTIDES</NAME> -<NAMETEMPLATE>PK_PEPTIDES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PROT_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>SEQU_ID</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>ABTY_ID</NAME> -<ID>8</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -<ATTR> -<NAME>IDDA_ID</NAME> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -<ATTR> -<NAME>CHARGE</NAME> -<ID>7</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>7</DOMAINID> -<DT> -<DTLISTNAME>INTEGER</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>7</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>ABUNDANCE</NAME> -<ID>9</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -</ATTRIBUTES> -<INDEXES> -<INDEX> -<NAME>IX_FK_PEPTIDES_IDENTIFICATION_DATA</NAME> -<NAMETEMPLATE>IX_FK_PEPTIDES_IDENTIFICATION_DATA</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>IDDA_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>6</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -<INDEX> -<NAME>IX_FK_PEPTIDES_PROTEINS</NAME> -<NAMETEMPLATE>IX_FK_PEPTIDES_PROTEINS</NAMETEMPLATE> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>PROT_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>3</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -<INDEX> -<NAME>IX_FK_PEPTIDES_SEQUENCES</NAME> -<NAMETEMPLATE>IX_FK_PEPTIDES_SEQUENCES</NAMETEMPLATE> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>SEQU_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>4</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -</INDEXES> -</ENT> -<ENT> -<NAME>PROTEIN_STATISTICS</NAME> -<ID>22</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>2</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_PROTEIN_STATISTICS</NAME> -<NAMETEMPLATE>PK_PROTEIN_STATISTICS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -</ENT> -<ENT> -<NAME>PROTEINS</NAME> -<NAMETEMPLATE>IX_FK_PROTEINS_DATA_SETS</NAMETEMPLATE> -<ID>23</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>10</ATTRLASTID> -<IDXLASTID>5</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_PROTEINS</NAME> -<NAMETEMPLATE>PK_PROTEINS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DASE_ID</NAME> -<ID>10</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>10</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>SEQU_ID</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -<ATTR> -<NAME>ABTY_ID</NAME> -<ID>8</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -<ATTR> -<NAME>PRST_ID</NAME> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -<ATTR> -<NAME>DESCRIPTION</NAME> -<ID>7</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>6</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>2000</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>7</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>ABUNDANCE</NAME> -<ID>9</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -</ATTRIBUTES> -<INDEXES> -<INDEX> -<NAME>IX_FK_PROTEINS_SEQUENCES</NAME> -<NAMETEMPLATE>IX_FK_PROTEINS_SEQUENCES</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>SEQU_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>5</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -<INDEX> -<NAME>IX_FK_PROTEINS_PROTEIN_STATISTICS</NAME> -<NAMETEMPLATE>IX_FK_PROTEINS_PROTEIN_STATISTICS</NAMETEMPLATE> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>PRST_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>6</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -</INDEXES> -</ENT> -<ENT> -<NAME>SAMPLES</NAME> -<ID>24</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>4</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_SAMPLES</NAME> -<NAMETEMPLATE>PK_SAMPLES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PERM_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>5</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>EXPE_ID</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_SAMPLES_1</NAME> -<NAMETEMPLATE>TUC_SAMPLES_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>SEQUENCES</NAME> -<ID>25</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>4</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_SEQUENCES</NAME> -<NAMETEMPLATE>PK_SEQUENCES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>AMINO_ACID_SEQUENCE</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>9</DOMAINID> -<DT> -<DTLISTNAME>TEXT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>CHECKSUM</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>4</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>8</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -</ENT> -<ENT> -<NAME>SPECTRA</NAME> -<ID>26</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>3</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_SPECTRA</NAME> -<NAMETEMPLATE>PK_SPECTRA</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DATA</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>3</DOMAINID> -<DT> -<DTLISTNAME>BYTEA</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -</ENT> -</ENTITIES> -<SUBCATEGORIES> -</SUBCATEGORIES> -<TEXTAREAS> -</TEXTAREAS> -<GROUPBOXES> -</GROUPBOXES> -<STAMPS> -</STAMPS> -<SEQUENCES> -<SEQUENCE> -<NAME>SEQ</NAME> -<ID>10</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<INCREMENT>1</INCREMENT> -<SEED>0</SEED> -<MAX>NOMAXVALUE</MAX> -<MIN>NOMINVALUE</MIN> -<CACHE></CACHE> -<CACHECODE></CACHECODE> -<CYCLE></CYCLE> -<ORDER></ORDER> -</SEQUENCE> -</SEQUENCES> -<PROCEDURES> -</PROCEDURES> -<VIEWS> -</VIEWS> -<RELATIONSHIPS> -<REL> -<NAME>DA_EX_FK</NAME> -<NAMETEMPLATE>DA_EX_FK</NAMETEMPLATE> -<ID>29</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>16</PARENTOBJECTID> -<CHILDOBJECTID>17</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>DA_EX_FK</NAME> -<NAMETEMPLATE>DA_EX_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>4</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>DA_SA_FK</NAME> -<NAMETEMPLATE>DA_SA_FK</NAMETEMPLATE> -<ID>30</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>24</PARENTOBJECTID> -<CHILDOBJECTID>17</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>DA_SA_FK</NAME> -<NAMETEMPLATE>DA_SA_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>5</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>ID_SP_FK</NAME> -<NAMETEMPLATE>ID_SP_FK</NAMETEMPLATE> -<ID>31</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>26</PARENTOBJECTID> -<CHILDOBJECTID>18</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>0</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>ID_SP_FK</NAME> -<NAMETEMPLATE>ID_SP_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>3</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>MO_PE_FK</NAME> -<NAMETEMPLATE>MO_PE_FK</NAMETEMPLATE> -<ID>32</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>21</PARENTOBJECTID> -<CHILDOBJECTID>19</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>MO_PE_FK</NAME> -<NAMETEMPLATE>MO_PE_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>3</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>MO_MT_FK</NAME> -<NAMETEMPLATE>MO_MT_FK</NAMETEMPLATE> -<ID>33</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>20</PARENTOBJECTID> -<CHILDOBJECTID>19</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>MO_MT_FK</NAME> -<NAMETEMPLATE>MO_MT_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>4</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>PE_ID_FK</NAME> -<NAMETEMPLATE>PE_ID_FK</NAMETEMPLATE> -<ID>35</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>18</PARENTOBJECTID> -<CHILDOBJECTID>21</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>0</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>PE_ID_FK</NAME> -<NAMETEMPLATE>PE_ID_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>6</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>6</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>PE_PR_FK</NAME> -<NAMETEMPLATE>PE_PR_FK</NAMETEMPLATE> -<ID>36</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>23</PARENTOBJECTID> -<CHILDOBJECTID>21</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>PE_PR_FK</NAME> -<NAMETEMPLATE>PE_PR_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>3</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>PE_SE_FK</NAME> -<NAMETEMPLATE>PE_SE_FK</NAMETEMPLATE> -<ID>37</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>25</PARENTOBJECTID> -<CHILDOBJECTID>21</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>PE_SE_FK</NAME> -<NAMETEMPLATE>PE_SE_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>4</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>PR_SE_FK</NAME> -<NAMETEMPLATE>PR_SE_FK</NAMETEMPLATE> -<ID>39</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>25</PARENTOBJECTID> -<CHILDOBJECTID>23</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>0</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>PR_SE_FK</NAME> -<NAMETEMPLATE>PR_SE_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>5</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>PR_PS_FK</NAME> -<NAMETEMPLATE>PR_PS_FK</NAMETEMPLATE> -<ID>41</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>22</PARENTOBJECTID> -<CHILDOBJECTID>23</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>0</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>PR_PS_FK</NAME> -<NAMETEMPLATE>PR_PS_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>6</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>6</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>ABUNDANCES_TYPES_PROTEINS</NAME> -<NAMETEMPLATE>ABUNDANCES_TYPES_PROTEINS</NAMETEMPLATE> -<ID>43</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>14</PARENTOBJECTID> -<CHILDOBJECTID>23</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>0</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>ABUNDANCES_TYPES_PROTEINS</NAME> -<NAMETEMPLATE>ABUNDANCES_TYPES_PROTEINS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>8</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>8</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>ABUNDANCES_TYPES_PEPTIDES</NAME> -<NAMETEMPLATE>ABUNDANCES_TYPES_PEPTIDES</NAMETEMPLATE> -<ID>44</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>14</PARENTOBJECTID> -<CHILDOBJECTID>21</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>0</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>ABUNDANCES_TYPES_PEPTIDES</NAME> -<NAMETEMPLATE>ABUNDANCES_TYPES_PEPTIDES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>8</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>8</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>DATA_SETS_PROTEINS</NAME> -<NAMETEMPLATE>DATA_SETS_PROTEINS</NAMETEMPLATE> -<ID>46</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>17</PARENTOBJECTID> -<CHILDOBJECTID>23</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>DATA_SETS_PROTEINS</NAME> -<NAMETEMPLATE>DATA_SETS_PROTEINS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>10</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>10</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -</RELATIONSHIPS> -<SUBCATEGORYCONNECTIONS> -</SUBCATEGORYCONNECTIONS> -</DATADICT> -</VERSION> -<VERSION> -<VERSIONINFO> -<VERSIONNUMBER>2</VERSIONNUMBER> -<VERSIONLABEL>Version 2009-06-29 1</VERSIONLABEL> -<VERSIONDATE>2009-06-29 11:02</VERSIONDATE> -<VERSIONCOMMENTS></VERSIONCOMMENTS> -<VERSIONTYPE>DB</VERSIONTYPE> -<VERSIONTYPEDESC>Data dictionary only (no diagrams)</VERSIONTYPEDESC> -</VERSIONINFO> -<DATADICT> -<DBID>postgresql8</DBID> -<LASTID>46</LASTID> -<DDSETTINGS> -<PKCONNAMETEMPLATE>PK_%table%</PKCONNAMETEMPLATE> -<FKCONNAMETEMPLATE>%relname%</FKCONNAMETEMPLATE> -<CCONNAMETEMPLATE>CC_%table%_%column%</CCONNAMETEMPLATE> -<NOTNULLCONNAMETEMPLATE>NN_%column%</NOTNULLCONNAMETEMPLATE> -<DEFAULTCONNAMETEMPLATE>DEF_%table%_%column%</DEFAULTCONNAMETEMPLATE> -<TUCONNAMETEMPLATE>TUC_%table%_%counter%</TUCONNAMETEMPLATE> -<TCCONNAMETEMPLATE>TCC_%table%_%counter%</TCCONNAMETEMPLATE> -<RELNAMETEMPLATE>%parent%_%child%</RELNAMETEMPLATE> -<INDEXNAMETEMPLATE>IDX_%table%_%counter%</INDEXNAMETEMPLATE> -<DEFTABLEOPTIONS></DEFTABLEOPTIONS> -<DEFINDEXOPTIONS></DEFINDEXOPTIONS> -<BEGINDATABASESCRIPT></BEGINDATABASESCRIPT> -<ENDDATABASESCRIP></ENDDATABASESCRIP> -<BEGINALTERDATABASESCRIPT></BEGINALTERDATABASESCRIPT> -<ENDALTERDATABASESCRIP></ENDALTERDATABASESCRIP> -<BEGINDROPDATABASESCRIPT></BEGINDROPDATABASESCRIPT> -<ENDDROPDATABASESCRIP></ENDDROPDATABASESCRIP> -<GENDIALOGSELECTEDOBJECTS></GENDIALOGSELECTEDOBJECTS> -<GENTABLES>1</GENTABLES> -<GENTABLEOPTIONS>1</GENTABLEOPTIONS> -<GENCONSTRAINTS>1</GENCONSTRAINTS> -<GENINDEXES>1</GENINDEXES> -<GENTRIGGERS>1</GENTRIGGERS> -<GENVIEWS>1</GENVIEWS> -<GENPROCEDURES>1</GENPROCEDURES> -<GENSEQUENCES>1</GENSEQUENCES> -<GENRELATIONSHIPS>1</GENRELATIONSHIPS> -<GENBEGINENDTABLESCRIPTS>1</GENBEGINENDTABLESCRIPTS> -<GENBEGINENDDBSCRIPTS>1</GENBEGINENDDBSCRIPTS> -<GLOBALPREFIX></GLOBALPREFIX> -<AUTOCREATEINDEXESONKEYS>0</AUTOCREATEINDEXESONKEYS> -<CONVERTDOMAINS>0</CONVERTDOMAINS> -<IGNORECOMMENTS>0</IGNORECOMMENTS> -<USESCHEMANAMES>0</USESCHEMANAMES> -<UCONNAMETEMPLATE></UCONNAMETEMPLATE> -<SQLCREATEFILE>D:\User\felmer\dev-workspace\rtd_phosphonetx\source\sql\postgresql\001\schema-001.sql</SQLCREATEFILE> -<SQLDROPFILE>D:\User\felmer\dev-workspace\rtd_phosphonetx\targets\drop.sql</SQLDROPFILE> -</DDSETTINGS> -<DOMAINS> -<DOMAIN> -<NAME>BINARY_DATA</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>BYTEA</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>CHECKSUM</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>8</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>CODE</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>DESCRIPTION</NAME> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>2000</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>INTEGER_NUMBER</NAME> -<ID>7</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>INTEGER</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>REAL_NUMBER</NAME> -<ID>8</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>SEQUENCE</NAME> -<ID>9</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>TEXT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>SHORT_DESCRIPTION</NAME> -<ID>11</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>200</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>TECH_ID</NAME> -<ID>12</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -</DOMAINS> -<ENTITIES> -<ENT> -<NAME>ABUNDANCES_TYPES</NAME> -<ID>14</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>4</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_ABUNDANCES_TYPES</NAME> -<NAMETEMPLATE>PK_ABUNDANCES_TYPES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>CODE</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>5</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DESCRIPTION</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>11</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>200</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -</ATTRIBUTES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_ABUNDANCES_TYPES_1</NAME> -<NAMETEMPLATE>TUC_ABUNDANCES_TYPES_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>EXPERIMENTS</NAME> -<ID>16</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>3</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_EXPERIMENTS</NAME> -<NAMETEMPLATE>PK_EXPERIMENTS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PERM_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>5</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_EXPERIMENTS_1</NAME> -<NAMETEMPLATE>TUC_EXPERIMENTS_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>DATA_SETS</NAME> -<NAMETEMPLATE>IX_FK_DATA_SETS_EXPERIMENTS</NAMETEMPLATE> -<ID>17</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>5</ATTRLASTID> -<IDXLASTID>3</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_DATA_SETS</NAME> -<NAMETEMPLATE>PK_DATA_SETS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>EXPE_ID</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>SAMP_ID</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PERM_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>5</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<INDEXES> -<INDEX> -<NAME>IX_FK_DATA_SETS_EXPERIMENTS</NAME> -<NAMETEMPLATE>IX_FK_DATA_SETS_EXPERIMENTS</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>EXPE_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>4</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -<INDEX> -<NAME>IX_FK_DATA_SETS_SAMPLES</NAME> -<NAMETEMPLATE>IX_FK_DATA_SETS_SAMPLES</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>SAMP_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>5</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -</INDEXES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_DATA_SETS_1</NAME> -<NAMETEMPLATE>TUC_DATA_SETS_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>IDENTIFICATION_DATA</NAME> -<NAMETEMPLATE>IX_FK_IDENTIFICATION_DATA_SPECTRA</NAMETEMPLATE> -<ID>18</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>4</ATTRLASTID> -<IDXLASTID>2</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_IDENTIFICATION_DATA</NAME> -<NAMETEMPLATE>PK_IDENTIFICATION_DATA</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>SPEC_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -<ATTR> -<NAME>SPECTRA_COUNT</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>7</DOMAINID> -<DT> -<DTLISTNAME>INTEGER</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -</ATTRIBUTES> -<INDEXES> -<INDEX> -<NAME>IX_FK_IDENTIFICATION_DATA_SPECTRA</NAME> -<NAMETEMPLATE>IX_FK_IDENTIFICATION_DATA_SPECTRA</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>SPEC_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>3</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -</INDEXES> -</ENT> -<ENT> -<NAME>MODIFICATIONS</NAME> -<NAMETEMPLATE>IX_FK_MODIFICATIONS_PEPTIDES</NAMETEMPLATE> -<ID>19</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>6</ATTRLASTID> -<IDXLASTID>3</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_MODIFICATIONS</NAME> -<NAMETEMPLATE>PK_MODIFICATIONS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PEPT_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>MOTY_ID</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>POS</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>7</DOMAINID> -<DT> -<DTLISTNAME>INTEGER</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>MASS</NAME> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>6</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<INDEXES> -<INDEX> -<NAME>IX_FK_MODIFICATIONS_PEPTIDES</NAME> -<NAMETEMPLATE>IX_FK_MODIFICATIONS_PEPTIDES</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>PEPT_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>3</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -<INDEX> -<NAME>IX_FK_MODIFICATIONS_MODIFICATION_TYPES</NAME> -<NAMETEMPLATE>IX_FK_MODIFICATIONS_MODIFICATION_TYPES</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>MOTY_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>4</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -</INDEXES> -</ENT> -<ENT> -<NAME>MODIFICATION_TYPES</NAME> -<ID>20</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>6</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_MODIFICATION_TYPES</NAME> -<NAMETEMPLATE>PK_MODIFICATION_TYPES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>CODE</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>5</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DESCRIPTION</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>11</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>200</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -<ATTR> -<NAME>MASS</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -<ATTR> -<NAME>DELTA_MASS</NAME> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -</ATTRIBUTES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_MODIFICATION_TYPES_1</NAME> -<NAMETEMPLATE>TUC_MODIFICATION_TYPES_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>PEPTIDES</NAME> -<NAMETEMPLATE>IX_FK_PEPTIDES_ABUNDANCES</NAMETEMPLATE> -<ID>21</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>9</ATTRLASTID> -<IDXLASTID>5</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_PEPTIDES</NAME> -<NAMETEMPLATE>PK_PEPTIDES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PROT_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>SEQU_ID</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>ABTY_ID</NAME> -<ID>8</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -<ATTR> -<NAME>IDDA_ID</NAME> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -<ATTR> -<NAME>CHARGE</NAME> -<ID>7</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>7</DOMAINID> -<DT> -<DTLISTNAME>INTEGER</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>7</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>ABUNDANCE</NAME> -<ID>9</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -</ATTRIBUTES> -<INDEXES> -<INDEX> -<NAME>IX_FK_PEPTIDES_IDENTIFICATION_DATA</NAME> -<NAMETEMPLATE>IX_FK_PEPTIDES_IDENTIFICATION_DATA</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>IDDA_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>6</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -<INDEX> -<NAME>IX_FK_PEPTIDES_PROTEINS</NAME> -<NAMETEMPLATE>IX_FK_PEPTIDES_PROTEINS</NAMETEMPLATE> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>PROT_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>3</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -<INDEX> -<NAME>IX_FK_PEPTIDES_SEQUENCES</NAME> -<NAMETEMPLATE>IX_FK_PEPTIDES_SEQUENCES</NAMETEMPLATE> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>SEQU_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>4</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -</INDEXES> -</ENT> -<ENT> -<NAME>PROTEIN_STATISTICS</NAME> -<ID>22</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>2</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_PROTEIN_STATISTICS</NAME> -<NAMETEMPLATE>PK_PROTEIN_STATISTICS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -</ENT> -<ENT> -<NAME>PROTEINS</NAME> -<NAMETEMPLATE>IX_FK_PROTEINS_DATA_SETS</NAMETEMPLATE> -<ID>23</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>10</ATTRLASTID> -<IDXLASTID>7</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_PROTEINS</NAME> -<NAMETEMPLATE>PK_PROTEINS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DASE_ID</NAME> -<ID>10</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>10</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>SEQU_ID</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -<ATTR> -<NAME>ABTY_ID</NAME> -<ID>8</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -<ATTR> -<NAME>PRST_ID</NAME> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -<ATTR> -<NAME>DESCRIPTION</NAME> -<ID>7</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>6</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>2000</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>7</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>ABUNDANCE</NAME> -<ID>9</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -</ATTRIBUTES> -<INDEXES> -<INDEX> -<NAME>IX_FK_PROTEINS_SEQUENCES</NAME> -<NAMETEMPLATE>IX_FK_PROTEINS_SEQUENCES</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>SEQU_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>5</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -<INDEX> -<NAME>IX_FK_PROTEINS_PROTEIN_STATISTICS</NAME> -<NAMETEMPLATE>IX_FK_PROTEINS_PROTEIN_STATISTICS</NAMETEMPLATE> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>PRST_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>6</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -<INDEX> -<NAME>IDX_PROTEINS_3</NAME> -<NAMETEMPLATE>IDX_PROTEINS_3</NAMETEMPLATE> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>DASE_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>10</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -</INDEXES> -</ENT> -<ENT> -<NAME>SAMPLES</NAME> -<ID>24</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>4</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_SAMPLES</NAME> -<NAMETEMPLATE>PK_SAMPLES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PERM_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>5</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>EXPE_ID</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_SAMPLES_1</NAME> -<NAMETEMPLATE>TUC_SAMPLES_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>SEQUENCES</NAME> -<ID>25</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>4</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_SEQUENCES</NAME> -<NAMETEMPLATE>PK_SEQUENCES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>AMINO_ACID_SEQUENCE</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>9</DOMAINID> -<DT> -<DTLISTNAME>TEXT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>CHECKSUM</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>4</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>8</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -</ENT> -<ENT> -<NAME>SPECTRA</NAME> -<ID>26</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>3</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_SPECTRA</NAME> -<NAMETEMPLATE>PK_SPECTRA</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DATA</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>3</DOMAINID> -<DT> -<DTLISTNAME>BYTEA</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -</ENT> -</ENTITIES> -<SUBCATEGORIES> -</SUBCATEGORIES> -<TEXTAREAS> -</TEXTAREAS> -<GROUPBOXES> -</GROUPBOXES> -<STAMPS> -</STAMPS> -<SEQUENCES> -</SEQUENCES> -<PROCEDURES> -</PROCEDURES> -<VIEWS> -</VIEWS> -<RELATIONSHIPS> -<REL> -<NAME>DA_EX_FK</NAME> -<NAMETEMPLATE>DA_EX_FK</NAMETEMPLATE> -<ID>29</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>16</PARENTOBJECTID> -<CHILDOBJECTID>17</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>DA_EX_FK</NAME> -<NAMETEMPLATE>DA_EX_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>4</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>DA_SA_FK</NAME> -<NAMETEMPLATE>DA_SA_FK</NAMETEMPLATE> -<ID>30</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>24</PARENTOBJECTID> -<CHILDOBJECTID>17</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>DA_SA_FK</NAME> -<NAMETEMPLATE>DA_SA_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>5</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>ID_SP_FK</NAME> -<NAMETEMPLATE>ID_SP_FK</NAMETEMPLATE> -<ID>31</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>26</PARENTOBJECTID> -<CHILDOBJECTID>18</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>0</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>ID_SP_FK</NAME> -<NAMETEMPLATE>ID_SP_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>3</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>MO_PE_FK</NAME> -<NAMETEMPLATE>MO_PE_FK</NAMETEMPLATE> -<ID>32</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>21</PARENTOBJECTID> -<CHILDOBJECTID>19</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>MO_PE_FK</NAME> -<NAMETEMPLATE>MO_PE_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>3</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>MO_MT_FK</NAME> -<NAMETEMPLATE>MO_MT_FK</NAMETEMPLATE> -<ID>33</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>20</PARENTOBJECTID> -<CHILDOBJECTID>19</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>MO_MT_FK</NAME> -<NAMETEMPLATE>MO_MT_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>4</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>PE_ID_FK</NAME> -<NAMETEMPLATE>PE_ID_FK</NAMETEMPLATE> -<ID>35</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>18</PARENTOBJECTID> -<CHILDOBJECTID>21</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>0</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>PE_ID_FK</NAME> -<NAMETEMPLATE>PE_ID_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>6</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>6</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>PE_PR_FK</NAME> -<NAMETEMPLATE>PE_PR_FK</NAMETEMPLATE> -<ID>36</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>23</PARENTOBJECTID> -<CHILDOBJECTID>21</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>PE_PR_FK</NAME> -<NAMETEMPLATE>PE_PR_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>3</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>PE_SE_FK</NAME> -<NAMETEMPLATE>PE_SE_FK</NAMETEMPLATE> -<ID>37</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>25</PARENTOBJECTID> -<CHILDOBJECTID>21</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>PE_SE_FK</NAME> -<NAMETEMPLATE>PE_SE_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>4</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>PR_SE_FK</NAME> -<NAMETEMPLATE>PR_SE_FK</NAMETEMPLATE> -<ID>39</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>25</PARENTOBJECTID> -<CHILDOBJECTID>23</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>0</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>PR_SE_FK</NAME> -<NAMETEMPLATE>PR_SE_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>5</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>PR_PS_FK</NAME> -<NAMETEMPLATE>PR_PS_FK</NAMETEMPLATE> -<ID>41</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>22</PARENTOBJECTID> -<CHILDOBJECTID>23</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>0</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>PR_PS_FK</NAME> -<NAMETEMPLATE>PR_PS_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>6</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>6</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>ABUNDANCES_TYPES_PROTEINS</NAME> -<NAMETEMPLATE>ABUNDANCES_TYPES_PROTEINS</NAMETEMPLATE> -<ID>43</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>14</PARENTOBJECTID> -<CHILDOBJECTID>23</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>0</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>ABUNDANCES_TYPES_PROTEINS</NAME> -<NAMETEMPLATE>ABUNDANCES_TYPES_PROTEINS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>8</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>8</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>ABUNDANCES_TYPES_PEPTIDES</NAME> -<NAMETEMPLATE>ABUNDANCES_TYPES_PEPTIDES</NAMETEMPLATE> -<ID>44</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>14</PARENTOBJECTID> -<CHILDOBJECTID>21</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>0</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>ABUNDANCES_TYPES_PEPTIDES</NAME> -<NAMETEMPLATE>ABUNDANCES_TYPES_PEPTIDES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>8</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>8</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>DATA_SETS_PROTEINS</NAME> -<NAMETEMPLATE>DATA_SETS_PROTEINS</NAMETEMPLATE> -<ID>46</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>17</PARENTOBJECTID> -<CHILDOBJECTID>23</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>DATA_SETS_PROTEINS</NAME> -<NAMETEMPLATE>DATA_SETS_PROTEINS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>10</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>10</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -</RELATIONSHIPS> -<SUBCATEGORYCONNECTIONS> -</SUBCATEGORYCONNECTIONS> -</DATADICT> -</VERSION> -<VERSION> -<VERSIONINFO> -<VERSIONNUMBER>3</VERSIONNUMBER> -<VERSIONLABEL>Version 2009-06-29 2</VERSIONLABEL> -<VERSIONDATE>2009-06-29 12:29</VERSIONDATE> -<VERSIONCOMMENTS></VERSIONCOMMENTS> -<VERSIONTYPE>DB</VERSIONTYPE> -<VERSIONTYPEDESC>Data dictionary only (no diagrams)</VERSIONTYPEDESC> -</VERSIONINFO> -<DATADICT> -<DBID>postgresql8</DBID> -<LASTID>48</LASTID> -<DDSETTINGS> -<PKCONNAMETEMPLATE>PK_%table%</PKCONNAMETEMPLATE> -<FKCONNAMETEMPLATE>%relname%</FKCONNAMETEMPLATE> -<CCONNAMETEMPLATE>CC_%table%_%column%</CCONNAMETEMPLATE> -<NOTNULLCONNAMETEMPLATE>NN_%column%</NOTNULLCONNAMETEMPLATE> -<DEFAULTCONNAMETEMPLATE>DEF_%table%_%column%</DEFAULTCONNAMETEMPLATE> -<TUCONNAMETEMPLATE>TUC_%table%_%counter%</TUCONNAMETEMPLATE> -<TCCONNAMETEMPLATE>TCC_%table%_%counter%</TCCONNAMETEMPLATE> -<RELNAMETEMPLATE>%parent%_%child%</RELNAMETEMPLATE> -<INDEXNAMETEMPLATE>IDX_%table%_%counter%</INDEXNAMETEMPLATE> -<DEFTABLEOPTIONS></DEFTABLEOPTIONS> -<DEFINDEXOPTIONS></DEFINDEXOPTIONS> -<BEGINDATABASESCRIPT></BEGINDATABASESCRIPT> -<ENDDATABASESCRIP></ENDDATABASESCRIP> -<BEGINALTERDATABASESCRIPT></BEGINALTERDATABASESCRIPT> -<ENDALTERDATABASESCRIP></ENDALTERDATABASESCRIP> -<BEGINDROPDATABASESCRIPT></BEGINDROPDATABASESCRIPT> -<ENDDROPDATABASESCRIP></ENDDROPDATABASESCRIP> -<GENDIALOGSELECTEDOBJECTS></GENDIALOGSELECTEDOBJECTS> -<GENTABLES>1</GENTABLES> -<GENTABLEOPTIONS>1</GENTABLEOPTIONS> -<GENCONSTRAINTS>1</GENCONSTRAINTS> -<GENINDEXES>1</GENINDEXES> -<GENTRIGGERS>1</GENTRIGGERS> -<GENVIEWS>1</GENVIEWS> -<GENPROCEDURES>1</GENPROCEDURES> -<GENSEQUENCES>1</GENSEQUENCES> -<GENRELATIONSHIPS>1</GENRELATIONSHIPS> -<GENBEGINENDTABLESCRIPTS>1</GENBEGINENDTABLESCRIPTS> -<GENBEGINENDDBSCRIPTS>1</GENBEGINENDDBSCRIPTS> -<GLOBALPREFIX></GLOBALPREFIX> -<AUTOCREATEINDEXESONKEYS>0</AUTOCREATEINDEXESONKEYS> -<CONVERTDOMAINS>0</CONVERTDOMAINS> -<IGNORECOMMENTS>0</IGNORECOMMENTS> -<USESCHEMANAMES>0</USESCHEMANAMES> -<UCONNAMETEMPLATE></UCONNAMETEMPLATE> -<SQLCREATEFILE>D:\User\felmer\dev-workspace\rtd_phosphonetx\source\sql\postgresql\001\schema-001.sql</SQLCREATEFILE> -<SQLDROPFILE>D:\User\felmer\dev-workspace\rtd_phosphonetx\targets\drop.sql</SQLDROPFILE> -</DDSETTINGS> -<DOMAINS> -<DOMAIN> -<NAME>BINARY_DATA</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>BYTEA</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>CHECKSUM</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>8</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>CODE</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>DESCRIPTION</NAME> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>2000</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>INTEGER_NUMBER</NAME> -<ID>7</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>INTEGER</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>REAL_NUMBER</NAME> -<ID>8</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>SEQUENCE</NAME> -<ID>9</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>TEXT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>SHORT_DESCRIPTION</NAME> -<ID>11</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>200</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>TECH_ID</NAME> -<ID>12</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -</DOMAINS> -<ENTITIES> -<ENT> -<NAME>ABUNDANCES_TYPES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>14</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>4</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_ABUNDANCES_TYPES</NAME> -<NAMETEMPLATE>PK_ABUNDANCES_TYPES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>CODE</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>5</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DESCRIPTION</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>11</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>200</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -</ATTRIBUTES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_ABUNDANCES_TYPES_1</NAME> -<NAMETEMPLATE>TUC_ABUNDANCES_TYPES_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>EXPERIMENTS</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>16</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>3</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_EXPERIMENTS</NAME> -<NAMETEMPLATE>PK_EXPERIMENTS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PERM_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>5</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_EXPERIMENTS_1</NAME> -<NAMETEMPLATE>TUC_EXPERIMENTS_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>DATA_SETS</NAME> -<NAMETEMPLATE>IX_FK_DATA_SETS_EXPERIMENTS</NAMETEMPLATE> -<ID>17</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>5</ATTRLASTID> -<IDXLASTID>3</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_DATA_SETS</NAME> -<NAMETEMPLATE>PK_DATA_SETS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>EXPE_ID</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>SAMP_ID</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PERM_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>5</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<INDEXES> -<INDEX> -<NAME>IX_FK_DATA_SETS_EXPERIMENTS</NAME> -<NAMETEMPLATE>IX_FK_DATA_SETS_EXPERIMENTS</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>EXPE_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>4</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -<INDEX> -<NAME>IX_FK_DATA_SETS_SAMPLES</NAME> -<NAMETEMPLATE>IX_FK_DATA_SETS_SAMPLES</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>SAMP_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>5</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -</INDEXES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_DATA_SETS_1</NAME> -<NAMETEMPLATE>TUC_DATA_SETS_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>IDENTIFICATION_DATA</NAME> -<NAMETEMPLATE>IX_FK_IDENTIFICATION_DATA_SPECTRA</NAMETEMPLATE> -<ID>18</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>4</ATTRLASTID> -<IDXLASTID>2</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_IDENTIFICATION_DATA</NAME> -<NAMETEMPLATE>PK_IDENTIFICATION_DATA</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>SPEC_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -<ATTR> -<NAME>SPECTRA_COUNT</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>7</DOMAINID> -<DT> -<DTLISTNAME>INTEGER</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -</ATTRIBUTES> -<INDEXES> -<INDEX> -<NAME>IX_FK_IDENTIFICATION_DATA_SPECTRA</NAME> -<NAMETEMPLATE>IX_FK_IDENTIFICATION_DATA_SPECTRA</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>SPEC_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>3</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -</INDEXES> -</ENT> -<ENT> -<NAME>MODIFICATIONS</NAME> -<NAMETEMPLATE>IX_FK_MODIFICATIONS_PEPTIDES</NAMETEMPLATE> -<ID>19</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>6</ATTRLASTID> -<IDXLASTID>3</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_MODIFICATIONS</NAME> -<NAMETEMPLATE>PK_MODIFICATIONS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PEPT_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>MOTY_ID</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>POS</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>7</DOMAINID> -<DT> -<DTLISTNAME>INTEGER</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>MASS</NAME> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>6</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<INDEXES> -<INDEX> -<NAME>IX_FK_MODIFICATIONS_PEPTIDES</NAME> -<NAMETEMPLATE>IX_FK_MODIFICATIONS_PEPTIDES</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>PEPT_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>3</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -<INDEX> -<NAME>IX_FK_MODIFICATIONS_MODIFICATION_TYPES</NAME> -<NAMETEMPLATE>IX_FK_MODIFICATIONS_MODIFICATION_TYPES</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>MOTY_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>4</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -</INDEXES> -</ENT> -<ENT> -<NAME>MODIFICATION_TYPES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>20</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>6</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_MODIFICATION_TYPES</NAME> -<NAMETEMPLATE>PK_MODIFICATION_TYPES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>CODE</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>5</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DESCRIPTION</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>11</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>200</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -<ATTR> -<NAME>MASS</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -<ATTR> -<NAME>DELTA_MASS</NAME> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -</ATTRIBUTES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_MODIFICATION_TYPES_1</NAME> -<NAMETEMPLATE>TUC_MODIFICATION_TYPES_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>PEPTIDES</NAME> -<NAMETEMPLATE>IX_FK_PEPTIDES_ABUNDANCES</NAMETEMPLATE> -<ID>21</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>9</ATTRLASTID> -<IDXLASTID>5</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_PEPTIDES</NAME> -<NAMETEMPLATE>PK_PEPTIDES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PROT_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>SEQU_ID</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>ABTY_ID</NAME> -<ID>8</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -<ATTR> -<NAME>IDDA_ID</NAME> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -<ATTR> -<NAME>CHARGE</NAME> -<ID>7</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>7</DOMAINID> -<DT> -<DTLISTNAME>INTEGER</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>7</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>ABUNDANCE</NAME> -<ID>9</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -</ATTRIBUTES> -<INDEXES> -<INDEX> -<NAME>IX_FK_PEPTIDES_IDENTIFICATION_DATA</NAME> -<NAMETEMPLATE>IX_FK_PEPTIDES_IDENTIFICATION_DATA</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>IDDA_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>6</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -<INDEX> -<NAME>IX_FK_PEPTIDES_PROTEINS</NAME> -<NAMETEMPLATE>IX_FK_PEPTIDES_PROTEINS</NAMETEMPLATE> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>PROT_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>3</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -<INDEX> -<NAME>IX_FK_PEPTIDES_SEQUENCES</NAME> -<NAMETEMPLATE>IX_FK_PEPTIDES_SEQUENCES</NAMETEMPLATE> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>SEQU_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>4</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -</INDEXES> -</ENT> -<ENT> -<NAME>PROTEIN_STATISTICS</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>22</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>2</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_PROTEIN_STATISTICS</NAME> -<NAMETEMPLATE>PK_PROTEIN_STATISTICS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -</ENT> -<ENT> -<NAME>PROTEINS</NAME> -<NAMETEMPLATE>IX_FK_PROTEINS_DATA_SETS</NAMETEMPLATE> -<ID>23</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>10</ATTRLASTID> -<IDXLASTID>7</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_PROTEINS</NAME> -<NAMETEMPLATE>PK_PROTEINS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DASE_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>10</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>10</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>SEQU_ID</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -<ATTR> -<NAME>ABTY_ID</NAME> -<ID>8</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -<ATTR> -<NAME>PRST_ID</NAME> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -<ATTR> -<NAME>ABUNDANCE</NAME> -<ID>9</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -</ATTRIBUTES> -<INDEXES> -<INDEX> -<NAME>IX_FK_PROTEINS_SEQUENCES</NAME> -<NAMETEMPLATE>IX_FK_PROTEINS_SEQUENCES</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>SEQU_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>5</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -<INDEX> -<NAME>IX_FK_PROTEINS_PROTEIN_STATISTICS</NAME> -<NAMETEMPLATE>IX_FK_PROTEINS_PROTEIN_STATISTICS</NAMETEMPLATE> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>PRST_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>6</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -<INDEX> -<NAME>IDX_PROTEINS_3</NAME> -<NAMETEMPLATE>IDX_PROTEINS_3</NAMETEMPLATE> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>DASE_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>10</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -</INDEXES> -</ENT> -<ENT> -<NAME>SAMPLES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>24</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>4</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_SAMPLES</NAME> -<NAMETEMPLATE>PK_SAMPLES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PERM_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>5</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>EXPE_ID</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_SAMPLES_1</NAME> -<NAMETEMPLATE>TUC_SAMPLES_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>SEQUENCES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>25</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>4</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_SEQUENCES</NAME> -<NAMETEMPLATE>PK_SEQUENCES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>AMINO_ACID_SEQUENCE</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>9</DOMAINID> -<DT> -<DTLISTNAME>TEXT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>CHECKSUM</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>4</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>8</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -</ENT> -<ENT> -<NAME>SPECTRA</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>26</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>3</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_SPECTRA</NAME> -<NAMETEMPLATE>PK_SPECTRA</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DATA</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>3</DOMAINID> -<DT> -<DTLISTNAME>BYTEA</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -</ENT> -<ENT> -<NAME>IDENTIFIED_PROTEINS</NAME> -<ID>47</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>4</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_IDENTIFIED_PROTEINS</NAME> -<NAMETEMPLATE>PK_IDENTIFIED_PROTEINS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PROT_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DESCRIPTION</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>6</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>2000</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -</ENT> -</ENTITIES> -<SUBCATEGORIES> -</SUBCATEGORIES> -<TEXTAREAS> -</TEXTAREAS> -<GROUPBOXES> -</GROUPBOXES> -<STAMPS> -</STAMPS> -<SEQUENCES> -</SEQUENCES> -<PROCEDURES> -</PROCEDURES> -<VIEWS> -</VIEWS> -<RELATIONSHIPS> -<REL> -<NAME>DA_EX_FK</NAME> -<NAMETEMPLATE>DA_EX_FK</NAMETEMPLATE> -<ID>29</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>16</PARENTOBJECTID> -<CHILDOBJECTID>17</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>DA_EX_FK</NAME> -<NAMETEMPLATE>DA_EX_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>4</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>DA_SA_FK</NAME> -<NAMETEMPLATE>DA_SA_FK</NAMETEMPLATE> -<ID>30</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>24</PARENTOBJECTID> -<CHILDOBJECTID>17</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>DA_SA_FK</NAME> -<NAMETEMPLATE>DA_SA_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>5</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>ID_SP_FK</NAME> -<NAMETEMPLATE>ID_SP_FK</NAMETEMPLATE> -<ID>31</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>26</PARENTOBJECTID> -<CHILDOBJECTID>18</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>0</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>ID_SP_FK</NAME> -<NAMETEMPLATE>ID_SP_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>3</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>MO_PE_FK</NAME> -<NAMETEMPLATE>MO_PE_FK</NAMETEMPLATE> -<ID>32</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>21</PARENTOBJECTID> -<CHILDOBJECTID>19</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>MO_PE_FK</NAME> -<NAMETEMPLATE>MO_PE_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>3</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>MO_MT_FK</NAME> -<NAMETEMPLATE>MO_MT_FK</NAMETEMPLATE> -<ID>33</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>20</PARENTOBJECTID> -<CHILDOBJECTID>19</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>MO_MT_FK</NAME> -<NAMETEMPLATE>MO_MT_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>4</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>PE_ID_FK</NAME> -<NAMETEMPLATE>PE_ID_FK</NAMETEMPLATE> -<ID>35</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>18</PARENTOBJECTID> -<CHILDOBJECTID>21</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>0</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>PE_ID_FK</NAME> -<NAMETEMPLATE>PE_ID_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>6</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>6</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>PE_PR_FK</NAME> -<NAMETEMPLATE>PE_PR_FK</NAMETEMPLATE> -<ID>36</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>23</PARENTOBJECTID> -<CHILDOBJECTID>21</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>PE_PR_FK</NAME> -<NAMETEMPLATE>PE_PR_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>3</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>PE_SE_FK</NAME> -<NAMETEMPLATE>PE_SE_FK</NAMETEMPLATE> -<ID>37</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>25</PARENTOBJECTID> -<CHILDOBJECTID>21</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>PE_SE_FK</NAME> -<NAMETEMPLATE>PE_SE_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>4</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>PR_SE_FK</NAME> -<NAMETEMPLATE>PR_SE_FK</NAMETEMPLATE> -<ID>39</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>25</PARENTOBJECTID> -<CHILDOBJECTID>23</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>0</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>PR_SE_FK</NAME> -<NAMETEMPLATE>PR_SE_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>5</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>PR_PS_FK</NAME> -<NAMETEMPLATE>PR_PS_FK</NAMETEMPLATE> -<ID>41</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>22</PARENTOBJECTID> -<CHILDOBJECTID>23</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>0</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>PR_PS_FK</NAME> -<NAMETEMPLATE>PR_PS_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>6</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>6</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>ABUNDANCES_TYPES_PROTEINS</NAME> -<NAMETEMPLATE>ABUNDANCES_TYPES_PROTEINS</NAMETEMPLATE> -<ID>43</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>14</PARENTOBJECTID> -<CHILDOBJECTID>23</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>0</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>ABUNDANCES_TYPES_PROTEINS</NAME> -<NAMETEMPLATE>ABUNDANCES_TYPES_PROTEINS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>8</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>8</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>ABUNDANCES_TYPES_PEPTIDES</NAME> -<NAMETEMPLATE>ABUNDANCES_TYPES_PEPTIDES</NAMETEMPLATE> -<ID>44</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>14</PARENTOBJECTID> -<CHILDOBJECTID>21</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>0</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>ABUNDANCES_TYPES_PEPTIDES</NAME> -<NAMETEMPLATE>ABUNDANCES_TYPES_PEPTIDES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>8</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>8</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>DATA_SETS_PROTEINS</NAME> -<NAMETEMPLATE>DATA_SETS_PROTEINS</NAMETEMPLATE> -<ID>46</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>17</PARENTOBJECTID> -<CHILDOBJECTID>23</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>DATA_SETS_PROTEINS</NAME> -<NAMETEMPLATE>DATA_SETS_PROTEINS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>10</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>10</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>PROTEINS_IDENTIFIED_PROTEINS</NAME> -<NAMETEMPLATE>PROTEINS_IDENTIFIED_PROTEINS</NAMETEMPLATE> -<ID>48</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>23</PARENTOBJECTID> -<CHILDOBJECTID>47</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>PROTEINS_IDENTIFIED_PROTEINS</NAME> -<NAMETEMPLATE>PROTEINS_IDENTIFIED_PROTEINS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>3</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -</RELATIONSHIPS> -<SUBCATEGORYCONNECTIONS> -</SUBCATEGORYCONNECTIONS> -</DATADICT> -</VERSION> -<VERSION> -<VERSIONINFO> -<VERSIONNUMBER>4</VERSIONNUMBER> -<VERSIONLABEL>Version 2009-06-30</VERSIONLABEL> -<VERSIONDATE>2009-06-30 09:00</VERSIONDATE> -<VERSIONCOMMENTS></VERSIONCOMMENTS> -<VERSIONTYPE>DB</VERSIONTYPE> -<VERSIONTYPEDESC>Data dictionary only (no diagrams)</VERSIONTYPEDESC> -</VERSIONINFO> -<DATADICT> -<DBID>postgresql8</DBID> -<LASTID>97</LASTID> -<DDSETTINGS> -<PKCONNAMETEMPLATE>PK_%table%</PKCONNAMETEMPLATE> -<FKCONNAMETEMPLATE>%relname%</FKCONNAMETEMPLATE> -<CCONNAMETEMPLATE>CC_%table%_%column%</CCONNAMETEMPLATE> -<NOTNULLCONNAMETEMPLATE>NN_%column%</NOTNULLCONNAMETEMPLATE> -<DEFAULTCONNAMETEMPLATE>DEF_%table%_%column%</DEFAULTCONNAMETEMPLATE> -<TUCONNAMETEMPLATE>TUC_%table%_%counter%</TUCONNAMETEMPLATE> -<TCCONNAMETEMPLATE>TCC_%table%_%counter%</TCCONNAMETEMPLATE> -<RELNAMETEMPLATE>%parent%_%child%</RELNAMETEMPLATE> -<INDEXNAMETEMPLATE>IDX_%table%_%counter%</INDEXNAMETEMPLATE> -<DEFTABLEOPTIONS></DEFTABLEOPTIONS> -<DEFINDEXOPTIONS></DEFINDEXOPTIONS> -<BEGINDATABASESCRIPT></BEGINDATABASESCRIPT> -<ENDDATABASESCRIP></ENDDATABASESCRIP> -<BEGINALTERDATABASESCRIPT></BEGINALTERDATABASESCRIPT> -<ENDALTERDATABASESCRIP></ENDALTERDATABASESCRIP> -<BEGINDROPDATABASESCRIPT></BEGINDROPDATABASESCRIPT> -<ENDDROPDATABASESCRIP></ENDDROPDATABASESCRIP> -<GENDIALOGSELECTEDOBJECTS></GENDIALOGSELECTEDOBJECTS> -<GENTABLES>1</GENTABLES> -<GENTABLEOPTIONS>1</GENTABLEOPTIONS> -<GENCONSTRAINTS>1</GENCONSTRAINTS> -<GENINDEXES>1</GENINDEXES> -<GENTRIGGERS>1</GENTRIGGERS> -<GENVIEWS>1</GENVIEWS> -<GENPROCEDURES>1</GENPROCEDURES> -<GENSEQUENCES>1</GENSEQUENCES> -<GENRELATIONSHIPS>1</GENRELATIONSHIPS> -<GENBEGINENDTABLESCRIPTS>1</GENBEGINENDTABLESCRIPTS> -<GENBEGINENDDBSCRIPTS>1</GENBEGINENDDBSCRIPTS> -<GLOBALPREFIX></GLOBALPREFIX> -<AUTOCREATEINDEXESONKEYS>0</AUTOCREATEINDEXESONKEYS> -<CONVERTDOMAINS>0</CONVERTDOMAINS> -<IGNORECOMMENTS>0</IGNORECOMMENTS> -<USESCHEMANAMES>0</USESCHEMANAMES> -<UCONNAMETEMPLATE></UCONNAMETEMPLATE> -<SQLCREATEFILE>D:\User\felmer\dev-workspace\rtd_phosphonetx\source\sql\postgresql\001\schema-001.sql</SQLCREATEFILE> -<SQLDROPFILE>D:\User\felmer\dev-workspace\rtd_phosphonetx\targets\drop.sql</SQLDROPFILE> -</DDSETTINGS> -<DOMAINS> -<DOMAIN> -<NAME>BINARY_DATA</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>BYTEA</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>CHECKSUM</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>8</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>CODE</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>DESCRIPTION</NAME> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>2000</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>INTEGER_NUMBER</NAME> -<ID>7</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>INTEGER</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>REAL_NUMBER</NAME> -<ID>8</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>LONG_SEQUENCE</NAME> -<ID>9</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>TEXT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>SHORT_DESCRIPTION</NAME> -<ID>11</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>200</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>TECH_ID</NAME> -<ID>12</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>SHORT_SEQUENCE</NAME> -<ID>69</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>1000</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -</DOMAINS> -<ENTITIES> -<ENT> -<NAME>ABUNDANCES_TYPES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>14</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>4</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_ABUNDANCES_TYPES</NAME> -<NAMETEMPLATE>PK_ABUNDANCES_TYPES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>CODE</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>5</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DESCRIPTION</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>11</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>200</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -</ATTRIBUTES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_ABUNDANCES_TYPES_1</NAME> -<NAMETEMPLATE>TUC_ABUNDANCES_TYPES_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>EXPERIMENTS</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>16</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>3</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_EXPERIMENTS</NAME> -<NAMETEMPLATE>PK_EXPERIMENTS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PERM_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>5</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_EXPERIMENTS_1</NAME> -<NAMETEMPLATE>TUC_EXPERIMENTS_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>DATA_SETS</NAME> -<NAMETEMPLATE>IX_FK_DATA_SETS_EXPERIMENTS</NAMETEMPLATE> -<ID>17</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>5</ATTRLASTID> -<IDXLASTID>3</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_DATA_SETS</NAME> -<NAMETEMPLATE>PK_DATA_SETS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>EXPE_ID</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>SAMP_ID</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PERM_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>5</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<INDEXES> -<INDEX> -<NAME>IX_FK_DATA_SETS_EXPERIMENTS</NAME> -<NAMETEMPLATE>IX_FK_DATA_SETS_EXPERIMENTS</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>EXPE_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>4</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -<INDEX> -<NAME>IX_FK_DATA_SETS_SAMPLES</NAME> -<NAMETEMPLATE>IX_FK_DATA_SETS_SAMPLES</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>SAMP_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>5</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -</INDEXES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_DATA_SETS_1</NAME> -<NAMETEMPLATE>TUC_DATA_SETS_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>MODIFICATIONS</NAME> -<NAMETEMPLATE>IX_FK_MODIFICATIONS_PEPTIDES</NAMETEMPLATE> -<ID>19</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>6</ATTRLASTID> -<IDXLASTID>3</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_MODIFICATIONS</NAME> -<NAMETEMPLATE>PK_MODIFICATIONS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PEPT_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>MOTY_ID</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>POS</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>7</DOMAINID> -<DT> -<DTLISTNAME>INTEGER</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>MASS</NAME> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>6</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<INDEXES> -<INDEX> -<NAME>IX_FK_MODIFICATIONS_PEPTIDES</NAME> -<NAMETEMPLATE>IX_FK_MODIFICATIONS_PEPTIDES</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>PEPT_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>3</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -<INDEX> -<NAME>IX_FK_MODIFICATIONS_MODIFICATION_TYPES</NAME> -<NAMETEMPLATE>IX_FK_MODIFICATIONS_MODIFICATION_TYPES</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>MOTY_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>4</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -</INDEXES> -</ENT> -<ENT> -<NAME>MODIFICATION_TYPES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>20</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>6</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_MODIFICATION_TYPES</NAME> -<NAMETEMPLATE>PK_MODIFICATION_TYPES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>CODE</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>5</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DESCRIPTION</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>11</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>200</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -<ATTR> -<NAME>MASS</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -<ATTR> -<NAME>DELTA_MASS</NAME> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -</ATTRIBUTES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_MODIFICATION_TYPES_1</NAME> -<NAMETEMPLATE>TUC_MODIFICATION_TYPES_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>PEPTIDES</NAME> -<NAMETEMPLATE>IX_FK_PEPTIDES_ABUNDANCES</NAMETEMPLATE> -<ID>21</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>10</ATTRLASTID> -<IDXLASTID>5</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_PEPTIDES</NAME> -<NAMETEMPLATE>PK_PEPTIDES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PROT_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>SEQUENCE</NAME> -<ID>10</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>69</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>1000</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>10</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>CHARGE</NAME> -<ID>7</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>7</DOMAINID> -<DT> -<DTLISTNAME>INTEGER</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>7</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<INDEXES> -<INDEX> -<NAME>IX_FK_PEPTIDES_PROTEINS</NAME> -<NAMETEMPLATE>IX_FK_PEPTIDES_PROTEINS</NAMETEMPLATE> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>PROT_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>3</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -</INDEXES> -</ENT> -<ENT> -<NAME>PROTEINS</NAME> -<NAMETEMPLATE>IX_FK_PROTEINS_DATA_SETS</NAMETEMPLATE> -<ID>23</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>11</ATTRLASTID> -<IDXLASTID>7</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_PROTEINS</NAME> -<NAMETEMPLATE>PK_PROTEINS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DASE_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>10</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>10</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PROBABILITY</NAME> -<ID>9</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>9</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<INDEXES> -<INDEX> -<NAME>IDX_PROTEINS_1</NAME> -<NAMETEMPLATE>IDX_PROTEINS_1</NAMETEMPLATE> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>DASE_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>10</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -</INDEXES> -</ENT> -<ENT> -<NAME>SAMPLES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>24</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>4</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_SAMPLES</NAME> -<NAMETEMPLATE>PK_SAMPLES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PERM_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>5</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>EXPE_ID</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_SAMPLES_1</NAME> -<NAMETEMPLATE>TUC_SAMPLES_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>SEQUENCES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>25</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>4</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_SEQUENCES</NAME> -<NAMETEMPLATE>PK_SEQUENCES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>AMINO_ACID_SEQUENCE</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>9</DOMAINID> -<DT> -<DTLISTNAME>TEXT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>CHECKSUM</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>4</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>8</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -</ENT> -<ENT> -<NAME>IDENTIFIED_PROTEINS</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>47</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>5</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_IDENTIFIED_PROTEINS</NAME> -<NAMETEMPLATE>PK_IDENTIFIED_PROTEINS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PROT_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>SEQU_ID</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -<ATTR> -<NAME>DESCRIPTION</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>6</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>2000</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -</ENT> -<ENT> -<NAME>ABUNDANCES</NAME> -<ID>91</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>6</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_ABUNDANCES</NAME> -<NAMETEMPLATE>PK_ABUNDANCES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PROT_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>SAMP_ID</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>ABTY_ID</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>VALUE</NAME> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>6</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -</ENT> -<ENT> -<NAME>PROBABILITY_FDR_MAPPINGS</NAME> -<ID>96</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>5</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_PROBABILITY_FDR_MAPPINGS</NAME> -<NAMETEMPLATE>PK_PROBABILITY_FDR_MAPPINGS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DASE_ID</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PROBABILITY</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>FALSE_DISCOVERY_RATE</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -</ENT> -</ENTITIES> -<SUBCATEGORIES> -</SUBCATEGORIES> -<TEXTAREAS> -</TEXTAREAS> -<GROUPBOXES> -</GROUPBOXES> -<STAMPS> -</STAMPS> -<SEQUENCES> -</SEQUENCES> -<PROCEDURES> -</PROCEDURES> -<VIEWS> -</VIEWS> -<RELATIONSHIPS> -<REL> -<NAME>DA_EX_FK</NAME> -<NAMETEMPLATE>DA_EX_FK</NAMETEMPLATE> -<ID>29</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>16</PARENTOBJECTID> -<CHILDOBJECTID>17</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>DA_EX_FK</NAME> -<NAMETEMPLATE>DA_EX_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>4</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>DA_SA_FK</NAME> -<NAMETEMPLATE>DA_SA_FK</NAMETEMPLATE> -<ID>30</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>24</PARENTOBJECTID> -<CHILDOBJECTID>17</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>DA_SA_FK</NAME> -<NAMETEMPLATE>DA_SA_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>5</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>MO_PE_FK</NAME> -<NAMETEMPLATE>MO_PE_FK</NAMETEMPLATE> -<ID>32</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>21</PARENTOBJECTID> -<CHILDOBJECTID>19</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>MO_PE_FK</NAME> -<NAMETEMPLATE>MO_PE_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>3</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>MO_MT_FK</NAME> -<NAMETEMPLATE>MO_MT_FK</NAMETEMPLATE> -<ID>33</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>20</PARENTOBJECTID> -<CHILDOBJECTID>19</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>MO_MT_FK</NAME> -<NAMETEMPLATE>MO_MT_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>4</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>PE_PR_FK</NAME> -<NAMETEMPLATE>PE_PR_FK</NAMETEMPLATE> -<ID>36</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>23</PARENTOBJECTID> -<CHILDOBJECTID>21</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>PE_PR_FK</NAME> -<NAMETEMPLATE>PE_PR_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>3</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>DATA_SETS_PROTEINS</NAME> -<NAMETEMPLATE>DATA_SETS_PROTEINS</NAMETEMPLATE> -<ID>46</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>17</PARENTOBJECTID> -<CHILDOBJECTID>23</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>DATA_SETS_PROTEINS</NAME> -<NAMETEMPLATE>DATA_SETS_PROTEINS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>10</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>10</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>PROTEINS_IDENTIFIED_PROTEINS</NAME> -<NAMETEMPLATE>PROTEINS_IDENTIFIED_PROTEINS</NAMETEMPLATE> -<ID>48</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>23</PARENTOBJECTID> -<CHILDOBJECTID>47</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>PROTEINS_IDENTIFIED_PROTEINS</NAME> -<NAMETEMPLATE>PROTEINS_IDENTIFIED_PROTEINS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>3</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>SEQUENCES_IDENTIFIED_PROTEINS</NAME> -<NAMETEMPLATE>SEQUENCES_IDENTIFIED_PROTEINS</NAMETEMPLATE> -<ID>50</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>25</PARENTOBJECTID> -<CHILDOBJECTID>47</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>0</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>SEQUENCES_IDENTIFIED_PROTEINS</NAME> -<NAMETEMPLATE>SEQUENCES_IDENTIFIED_PROTEINS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>5</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>SAMPLES_ABUNDANCES</NAME> -<NAMETEMPLATE>SAMPLES_ABUNDANCES</NAMETEMPLATE> -<ID>92</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>24</PARENTOBJECTID> -<CHILDOBJECTID>91</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>SAMPLES_ABUNDANCES</NAME> -<NAMETEMPLATE>SAMPLES_ABUNDANCES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>4</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>ABUNDANCES_TYPES_ABUNDANCES</NAME> -<NAMETEMPLATE>ABUNDANCES_TYPES_ABUNDANCES</NAMETEMPLATE> -<ID>93</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>14</PARENTOBJECTID> -<CHILDOBJECTID>91</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>ABUNDANCES_TYPES_ABUNDANCES</NAME> -<NAMETEMPLATE>ABUNDANCES_TYPES_ABUNDANCES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>5</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>PROTEINS_ABUNDANCES</NAME> -<NAMETEMPLATE>PROTEINS_ABUNDANCES</NAMETEMPLATE> -<ID>94</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>23</PARENTOBJECTID> -<CHILDOBJECTID>91</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>PROTEINS_ABUNDANCES</NAME> -<NAMETEMPLATE>PROTEINS_ABUNDANCES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>3</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>DATA_SETS_PROBABILITY_FDR_MAPPINGS</NAME> -<NAMETEMPLATE>DATA_SETS_PROBABILITY_FDR_MAPPINGS</NAMETEMPLATE> -<ID>97</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>17</PARENTOBJECTID> -<CHILDOBJECTID>96</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>DATA_SETS_PROBABILITY_FDR_MAPPINGS</NAME> -<NAMETEMPLATE>DATA_SETS_PROBABILITY_FDR_MAPPINGS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>5</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -</RELATIONSHIPS> -<SUBCATEGORYCONNECTIONS> -</SUBCATEGORYCONNECTIONS> -</DATADICT> -</VERSION> -<VERSION> -<VERSIONINFO> -<VERSIONNUMBER>5</VERSIONNUMBER> -<VERSIONLABEL>Version 2009-07-06</VERSIONLABEL> -<VERSIONDATE>2009-07-06 13:15</VERSIONDATE> -<VERSIONCOMMENTS></VERSIONCOMMENTS> -<VERSIONTYPE>DB</VERSIONTYPE> -<VERSIONTYPEDESC>Data dictionary only (no diagrams)</VERSIONTYPEDESC> -</VERSIONINFO> -<DATADICT> -<DBID>postgresql8</DBID> -<LASTID>135</LASTID> -<DDSETTINGS> -<PKCONNAMETEMPLATE>PK_%table%</PKCONNAMETEMPLATE> -<FKCONNAMETEMPLATE>%relname%</FKCONNAMETEMPLATE> -<CCONNAMETEMPLATE>CC_%table%_%column%</CCONNAMETEMPLATE> -<NOTNULLCONNAMETEMPLATE>NN_%column%</NOTNULLCONNAMETEMPLATE> -<DEFAULTCONNAMETEMPLATE>DEF_%table%_%column%</DEFAULTCONNAMETEMPLATE> -<TUCONNAMETEMPLATE>TUC_%table%_%counter%</TUCONNAMETEMPLATE> -<TCCONNAMETEMPLATE>TCC_%table%_%counter%</TCCONNAMETEMPLATE> -<RELNAMETEMPLATE>%parent%_%child%</RELNAMETEMPLATE> -<INDEXNAMETEMPLATE>IDX_%table%_%counter%</INDEXNAMETEMPLATE> -<DEFTABLEOPTIONS></DEFTABLEOPTIONS> -<DEFINDEXOPTIONS></DEFINDEXOPTIONS> -<BEGINDATABASESCRIPT></BEGINDATABASESCRIPT> -<ENDDATABASESCRIP></ENDDATABASESCRIP> -<BEGINALTERDATABASESCRIPT></BEGINALTERDATABASESCRIPT> -<ENDALTERDATABASESCRIP></ENDALTERDATABASESCRIP> -<BEGINDROPDATABASESCRIPT></BEGINDROPDATABASESCRIPT> -<ENDDROPDATABASESCRIP></ENDDROPDATABASESCRIP> -<GENDIALOGSELECTEDOBJECTS></GENDIALOGSELECTEDOBJECTS> -<GENTABLES>1</GENTABLES> -<GENTABLEOPTIONS>1</GENTABLEOPTIONS> -<GENCONSTRAINTS>1</GENCONSTRAINTS> -<GENINDEXES>1</GENINDEXES> -<GENTRIGGERS>1</GENTRIGGERS> -<GENVIEWS>1</GENVIEWS> -<GENPROCEDURES>1</GENPROCEDURES> -<GENSEQUENCES>1</GENSEQUENCES> -<GENRELATIONSHIPS>1</GENRELATIONSHIPS> -<GENBEGINENDTABLESCRIPTS>1</GENBEGINENDTABLESCRIPTS> -<GENBEGINENDDBSCRIPTS>1</GENBEGINENDDBSCRIPTS> -<GLOBALPREFIX></GLOBALPREFIX> -<AUTOCREATEINDEXESONKEYS>0</AUTOCREATEINDEXESONKEYS> -<CONVERTDOMAINS>0</CONVERTDOMAINS> -<IGNORECOMMENTS>0</IGNORECOMMENTS> -<USESCHEMANAMES>0</USESCHEMANAMES> -<UCONNAMETEMPLATE></UCONNAMETEMPLATE> -<SQLCREATEFILE>N:\user\cisd\felmer\phosphonetx\schema-001.sql</SQLCREATEFILE> -<SQLDROPFILE>N:\user\cisd\felmer\phosphonetx\drop.sql</SQLDROPFILE> -</DDSETTINGS> -<DOMAINS> -<DOMAIN> -<NAME>CHECKSUM</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>8</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>CODE</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>DESCRIPTION</NAME> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>2000</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>INTEGER_NUMBER</NAME> -<ID>7</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>INTEGER</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>REAL_NUMBER</NAME> -<ID>8</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>LONG_SEQUENCE</NAME> -<ID>9</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>TEXT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>SHORT_DESCRIPTION</NAME> -<ID>11</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>200</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>TECH_ID</NAME> -<ID>12</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>SHORT_SEQUENCE</NAME> -<ID>69</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>1000</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>UNIPROT_ACCESSION_NUMBER</NAME> -<ID>109</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -</DOMAINS> -<ENTITIES> -<ENT> -<NAME>ABUNDANCES_TYPES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>14</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>4</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_ABUNDANCES_TYPES</NAME> -<NAMETEMPLATE>PK_ABUNDANCES_TYPES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>CODE</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>5</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DESCRIPTION</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>11</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>200</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -</ATTRIBUTES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_ABUNDANCES_TYPES_1</NAME> -<NAMETEMPLATE>TUC_ABUNDANCES_TYPES_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>EXPERIMENTS</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>16</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>3</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_EXPERIMENTS</NAME> -<NAMETEMPLATE>PK_EXPERIMENTS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PERM_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>5</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_EXPERIMENTS_1</NAME> -<NAMETEMPLATE>TUC_EXPERIMENTS_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>DATA_SETS</NAME> -<NAMETEMPLATE>IX_FK_DATA_SETS_EXPERIMENTS</NAMETEMPLATE> -<ID>17</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>6</ATTRLASTID> -<IDXLASTID>3</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_DATA_SETS</NAME> -<NAMETEMPLATE>PK_DATA_SETS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>EXPE_ID</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>SAMP_ID</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DB_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>6</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PERM_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>5</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<INDEXES> -<INDEX> -<NAME>IX_FK_DATA_SETS_EXPERIMENTS</NAME> -<NAMETEMPLATE>IX_FK_DATA_SETS_EXPERIMENTS</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>EXPE_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>4</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -<INDEX> -<NAME>IX_FK_DATA_SETS_SAMPLES</NAME> -<NAMETEMPLATE>IX_FK_DATA_SETS_SAMPLES</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>SAMP_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>5</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -</INDEXES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_DATA_SETS_1</NAME> -<NAMETEMPLATE>TUC_DATA_SETS_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>MODIFICATIONS</NAME> -<NAMETEMPLATE>IX_FK_MODIFICATIONS_PEPTIDES</NAMETEMPLATE> -<ID>19</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>6</ATTRLASTID> -<IDXLASTID>3</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_MODIFICATIONS</NAME> -<NAMETEMPLATE>PK_MODIFICATIONS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PEPT_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>MOTY_ID</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>POS</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>7</DOMAINID> -<DT> -<DTLISTNAME>INTEGER</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>MASS</NAME> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>6</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<INDEXES> -<INDEX> -<NAME>IX_FK_MODIFICATIONS_PEPTIDES</NAME> -<NAMETEMPLATE>IX_FK_MODIFICATIONS_PEPTIDES</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>PEPT_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>3</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -<INDEX> -<NAME>IX_FK_MODIFICATIONS_MODIFICATION_TYPES</NAME> -<NAMETEMPLATE>IX_FK_MODIFICATIONS_MODIFICATION_TYPES</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>MOTY_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>4</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -</INDEXES> -</ENT> -<ENT> -<NAME>MODIFICATION_TYPES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>20</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>7</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_MODIFICATION_TYPES</NAME> -<NAMETEMPLATE>PK_MODIFICATION_TYPES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>CODE</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>5</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DESCRIPTION</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>11</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>200</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -<ATTR> -<NAME>AMINO_ACID</NAME> -<ID>7</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER</DTLISTNAME> -<LE>1</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -<ATTR> -<NAME>MASS</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -<ATTR> -<NAME>MASS_TOLERANCE</NAME> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -</ATTRIBUTES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_MODIFICATION_TYPES_1</NAME> -<NAMETEMPLATE>TUC_MODIFICATION_TYPES_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>PEPTIDES</NAME> -<NAMETEMPLATE>IX_FK_PEPTIDES_ABUNDANCES</NAMETEMPLATE> -<ID>21</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>10</ATTRLASTID> -<IDXLASTID>5</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_PEPTIDES</NAME> -<NAMETEMPLATE>PK_PEPTIDES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PROT_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>SEQUENCE</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>10</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>69</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>1000</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>10</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>CHARGE</NAME> -<ID>7</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>7</DOMAINID> -<DT> -<DTLISTNAME>INTEGER</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>7</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<INDEXES> -<INDEX> -<NAME>IX_FK_PEPTIDES_PROTEINS</NAME> -<NAMETEMPLATE>IX_FK_PEPTIDES_PROTEINS</NAMETEMPLATE> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>PROT_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>3</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -</INDEXES> -</ENT> -<ENT> -<NAME>PROTEINS</NAME> -<NAMETEMPLATE>IX_FK_PROTEINS_DATA_SETS</NAMETEMPLATE> -<ID>23</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>11</ATTRLASTID> -<IDXLASTID>7</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_PROTEINS</NAME> -<NAMETEMPLATE>PK_PROTEINS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DASE_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>10</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>10</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PROBABILITY</NAME> -<ID>9</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>9</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<INDEXES> -<INDEX> -<NAME>IDX_PROTEINS_1</NAME> -<NAMETEMPLATE>IDX_PROTEINS_1</NAMETEMPLATE> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>DASE_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>10</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -</INDEXES> -</ENT> -<ENT> -<NAME>SAMPLES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>24</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>4</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_SAMPLES</NAME> -<NAMETEMPLATE>PK_SAMPLES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PERM_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>5</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>EXPE_ID</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_SAMPLES_1</NAME> -<NAMETEMPLATE>TUC_SAMPLES_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>SEQUENCES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>25</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>6</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_SEQUENCES</NAME> -<NAMETEMPLATE>PK_SEQUENCES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DB_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PRRE_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>6</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>AMINO_ACID_SEQUENCE</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>9</DOMAINID> -<DT> -<DTLISTNAME>TEXT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>CHECKSUM</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>4</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>8</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -</ENT> -<ENT> -<NAME>IDENTIFIED_PROTEINS</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>47</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>5</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_IDENTIFIED_PROTEINS</NAME> -<NAMETEMPLATE>PK_IDENTIFIED_PROTEINS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PROT_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>SEQU_ID</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -</ENT> -<ENT> -<NAME>ABUNDANCES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>91</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>6</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_ABUNDANCES</NAME> -<NAMETEMPLATE>PK_ABUNDANCES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PROT_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>SAMP_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>ABTY_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>VALUE</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>6</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -</ENT> -<ENT> -<NAME>PROBABILITY_FDR_MAPPINGS</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>96</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>5</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_PROBABILITY_FDR_MAPPINGS</NAME> -<NAMETEMPLATE>PK_PROBABILITY_FDR_MAPPINGS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DASE_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PROBABILITY</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>FALSE_DISCOVERY_RATE</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -</ENT> -<ENT> -<NAME>PROTEIN_REFERENCES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>98</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>4</ATTRLASTID> -<IDXLASTID>2</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_PROTEIN_REFERENCES</NAME> -<NAMETEMPLATE>PK_PROTEIN_REFERENCES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>UNIPROT_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>109</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DESCRIPTION</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>6</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>2000</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -</ATTRIBUTES> -<INDEXES> -<INDEX> -<NAME>IDX_PROTEIN_REFERENCES_1</NAME> -<NAMETEMPLATE>IDX_PROTEIN_REFERENCES_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>UNIPROT_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>3</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -</INDEXES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_PROTEIN_REFERENCES_1</NAME> -<NAMETEMPLATE>TUC_PROTEIN_REFERENCES_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>DATABASES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>110</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>3</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_DATABASES</NAME> -<NAMETEMPLATE>PK_DATABASES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>NAME_AND_VERSION</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>69</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>1000</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_DATABASES_1</NAME> -<NAMETEMPLATE>TUC_DATABASES_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -</ENTITIES> -<SUBCATEGORIES> -</SUBCATEGORIES> -<TEXTAREAS> -</TEXTAREAS> -<GROUPBOXES> -</GROUPBOXES> -<STAMPS> -</STAMPS> -<SEQUENCES> -</SEQUENCES> -<PROCEDURES> -</PROCEDURES> -<VIEWS> -</VIEWS> -<RELATIONSHIPS> -<REL> -<NAME>DA_EX_FK</NAME> -<NAMETEMPLATE>DA_EX_FK</NAMETEMPLATE> -<ID>29</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>16</PARENTOBJECTID> -<CHILDOBJECTID>17</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>DA_EX_FK</NAME> -<NAMETEMPLATE>DA_EX_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>4</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>DA_SA_FK</NAME> -<NAMETEMPLATE>DA_SA_FK</NAMETEMPLATE> -<ID>30</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>24</PARENTOBJECTID> -<CHILDOBJECTID>17</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>DA_SA_FK</NAME> -<NAMETEMPLATE>DA_SA_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>5</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>MO_PE_FK</NAME> -<NAMETEMPLATE>MO_PE_FK</NAMETEMPLATE> -<ID>32</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>21</PARENTOBJECTID> -<CHILDOBJECTID>19</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>MO_PE_FK</NAME> -<NAMETEMPLATE>MO_PE_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>3</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>MO_MT_FK</NAME> -<NAMETEMPLATE>MO_MT_FK</NAMETEMPLATE> -<ID>33</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>20</PARENTOBJECTID> -<CHILDOBJECTID>19</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>MO_MT_FK</NAME> -<NAMETEMPLATE>MO_MT_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>4</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>PE_PR_FK</NAME> -<NAMETEMPLATE>PE_PR_FK</NAMETEMPLATE> -<ID>36</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>23</PARENTOBJECTID> -<CHILDOBJECTID>21</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>PE_PR_FK</NAME> -<NAMETEMPLATE>PE_PR_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>3</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>DATA_SETS_PROTEINS</NAME> -<NAMETEMPLATE>DATA_SETS_PROTEINS</NAMETEMPLATE> -<ID>46</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>17</PARENTOBJECTID> -<CHILDOBJECTID>23</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>DATA_SETS_PROTEINS</NAME> -<NAMETEMPLATE>DATA_SETS_PROTEINS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>10</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>10</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>PROTEINS_IDENTIFIED_PROTEINS</NAME> -<NAMETEMPLATE>PROTEINS_IDENTIFIED_PROTEINS</NAMETEMPLATE> -<ID>48</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>23</PARENTOBJECTID> -<CHILDOBJECTID>47</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>PROTEINS_IDENTIFIED_PROTEINS</NAME> -<NAMETEMPLATE>PROTEINS_IDENTIFIED_PROTEINS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>3</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>SEQUENCES_IDENTIFIED_PROTEINS</NAME> -<NAMETEMPLATE>SEQUENCES_IDENTIFIED_PROTEINS</NAMETEMPLATE> -<ID>50</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>25</PARENTOBJECTID> -<CHILDOBJECTID>47</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>SEQUENCES_IDENTIFIED_PROTEINS</NAME> -<NAMETEMPLATE>SEQUENCES_IDENTIFIED_PROTEINS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>5</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>SAMPLES_ABUNDANCES</NAME> -<NAMETEMPLATE>SAMPLES_ABUNDANCES</NAMETEMPLATE> -<ID>92</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>24</PARENTOBJECTID> -<CHILDOBJECTID>91</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>SAMPLES_ABUNDANCES</NAME> -<NAMETEMPLATE>SAMPLES_ABUNDANCES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>4</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>ABUNDANCES_TYPES_ABUNDANCES</NAME> -<NAMETEMPLATE>ABUNDANCES_TYPES_ABUNDANCES</NAMETEMPLATE> -<ID>93</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>14</PARENTOBJECTID> -<CHILDOBJECTID>91</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>ABUNDANCES_TYPES_ABUNDANCES</NAME> -<NAMETEMPLATE>ABUNDANCES_TYPES_ABUNDANCES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>5</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>PROTEINS_ABUNDANCES</NAME> -<NAMETEMPLATE>PROTEINS_ABUNDANCES</NAMETEMPLATE> -<ID>94</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>23</PARENTOBJECTID> -<CHILDOBJECTID>91</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>PROTEINS_ABUNDANCES</NAME> -<NAMETEMPLATE>PROTEINS_ABUNDANCES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>3</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>DATA_SETS_PROBABILITY_FDR_MAPPINGS</NAME> -<NAMETEMPLATE>DATA_SETS_PROBABILITY_FDR_MAPPINGS</NAMETEMPLATE> -<ID>97</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>17</PARENTOBJECTID> -<CHILDOBJECTID>96</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>DATA_SETS_PROBABILITY_FDR_MAPPINGS</NAME> -<NAMETEMPLATE>DATA_SETS_PROBABILITY_FDR_MAPPINGS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>5</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>DATABASES_SEQUENCES</NAME> -<NAMETEMPLATE>DATABASES_SEQUENCES</NAMETEMPLATE> -<ID>111</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>110</PARENTOBJECTID> -<CHILDOBJECTID>25</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>DATABASES_SEQUENCES</NAME> -<NAMETEMPLATE>DATABASES_SEQUENCES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>5</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>PROTEIN_REFERENCES_SEQUENCES</NAME> -<NAMETEMPLATE>PROTEIN_REFERENCES_SEQUENCES</NAMETEMPLATE> -<ID>112</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>98</PARENTOBJECTID> -<CHILDOBJECTID>25</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>PROTEIN_REFERENCES_SEQUENCES</NAME> -<NAMETEMPLATE>PROTEIN_REFERENCES_SEQUENCES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>6</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>6</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>DATABASES_DATA_SETS</NAME> -<NAMETEMPLATE>DATABASES_DATA_SETS</NAMETEMPLATE> -<ID>125</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>110</PARENTOBJECTID> -<CHILDOBJECTID>17</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>DATABASES_DATA_SETS</NAME> -<NAMETEMPLATE>DATABASES_DATA_SETS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>6</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>6</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -</RELATIONSHIPS> -<SUBCATEGORYCONNECTIONS> -</SUBCATEGORYCONNECTIONS> -</DATADICT> -</VERSION> -<VERSION> -<VERSIONINFO> -<VERSIONNUMBER>6</VERSIONNUMBER> -<VERSIONLABEL>Version 2009-07-06 1</VERSIONLABEL> -<VERSIONDATE>2009-07-06 13:30</VERSIONDATE> -<VERSIONCOMMENTS></VERSIONCOMMENTS> -<VERSIONTYPE>DB</VERSIONTYPE> -<VERSIONTYPEDESC>Data dictionary only (no diagrams)</VERSIONTYPEDESC> -</VERSIONINFO> -<DATADICT> -<DBID>postgresql8</DBID> -<LASTID>135</LASTID> -<DDSETTINGS> -<PKCONNAMETEMPLATE>PK_%table%</PKCONNAMETEMPLATE> -<FKCONNAMETEMPLATE>%relname%</FKCONNAMETEMPLATE> -<CCONNAMETEMPLATE>CC_%table%_%column%</CCONNAMETEMPLATE> -<NOTNULLCONNAMETEMPLATE>NN_%column%</NOTNULLCONNAMETEMPLATE> -<DEFAULTCONNAMETEMPLATE>DEF_%table%_%column%</DEFAULTCONNAMETEMPLATE> -<TUCONNAMETEMPLATE>TUC_%table%_%counter%</TUCONNAMETEMPLATE> -<TCCONNAMETEMPLATE>TCC_%table%_%counter%</TCCONNAMETEMPLATE> -<RELNAMETEMPLATE>%parent%_%child%</RELNAMETEMPLATE> -<INDEXNAMETEMPLATE>IDX_%table%_%counter%</INDEXNAMETEMPLATE> -<DEFTABLEOPTIONS></DEFTABLEOPTIONS> -<DEFINDEXOPTIONS></DEFINDEXOPTIONS> -<BEGINDATABASESCRIPT></BEGINDATABASESCRIPT> -<ENDDATABASESCRIP></ENDDATABASESCRIP> -<BEGINALTERDATABASESCRIPT></BEGINALTERDATABASESCRIPT> -<ENDALTERDATABASESCRIP></ENDALTERDATABASESCRIP> -<BEGINDROPDATABASESCRIPT></BEGINDROPDATABASESCRIPT> -<ENDDROPDATABASESCRIP></ENDDROPDATABASESCRIP> -<GENDIALOGSELECTEDOBJECTS></GENDIALOGSELECTEDOBJECTS> -<GENTABLES>1</GENTABLES> -<GENTABLEOPTIONS>1</GENTABLEOPTIONS> -<GENCONSTRAINTS>1</GENCONSTRAINTS> -<GENINDEXES>1</GENINDEXES> -<GENTRIGGERS>1</GENTRIGGERS> -<GENVIEWS>1</GENVIEWS> -<GENPROCEDURES>1</GENPROCEDURES> -<GENSEQUENCES>1</GENSEQUENCES> -<GENRELATIONSHIPS>1</GENRELATIONSHIPS> -<GENBEGINENDTABLESCRIPTS>1</GENBEGINENDTABLESCRIPTS> -<GENBEGINENDDBSCRIPTS>1</GENBEGINENDDBSCRIPTS> -<GLOBALPREFIX></GLOBALPREFIX> -<AUTOCREATEINDEXESONKEYS>0</AUTOCREATEINDEXESONKEYS> -<CONVERTDOMAINS>0</CONVERTDOMAINS> -<IGNORECOMMENTS>0</IGNORECOMMENTS> -<USESCHEMANAMES>0</USESCHEMANAMES> -<UCONNAMETEMPLATE></UCONNAMETEMPLATE> -<SQLCREATEFILE>N:\user\cisd\felmer\phosphonetx\schema-001.sql</SQLCREATEFILE> -<SQLDROPFILE>N:\user\cisd\felmer\phosphonetx\drop.sql</SQLDROPFILE> -</DDSETTINGS> -<DOMAINS> -<DOMAIN> -<NAME>CHECKSUM</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>8</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>CODE</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>DESCRIPTION</NAME> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>2000</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>INTEGER_NUMBER</NAME> -<ID>7</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>INTEGER</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>REAL_NUMBER</NAME> -<ID>8</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>LONG_SEQUENCE</NAME> -<ID>9</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>TEXT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>SHORT_DESCRIPTION</NAME> -<ID>11</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>200</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>TECH_ID</NAME> -<ID>12</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>SHORT_SEQUENCE</NAME> -<ID>69</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>1000</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>UNIPROT_ACCESSION_NUMBER</NAME> -<ID>109</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -</DOMAINS> -<ENTITIES> -<ENT> -<NAME>ABUNDANCES_TYPES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>14</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>4</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_ABUNDANCES_TYPES</NAME> -<NAMETEMPLATE>PK_ABUNDANCES_TYPES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>CODE</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>5</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DESCRIPTION</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>11</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>200</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -</ATTRIBUTES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_ABUNDANCES_TYPES_1</NAME> -<NAMETEMPLATE>TUC_ABUNDANCES_TYPES_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>EXPERIMENTS</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>16</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>3</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_EXPERIMENTS</NAME> -<NAMETEMPLATE>PK_EXPERIMENTS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PERM_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>5</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_EXPERIMENTS_1</NAME> -<NAMETEMPLATE>TUC_EXPERIMENTS_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>DATA_SETS</NAME> -<NAMETEMPLATE>IX_FK_DATA_SETS_EXPERIMENTS</NAMETEMPLATE> -<ID>17</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>6</ATTRLASTID> -<IDXLASTID>3</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_DATA_SETS</NAME> -<NAMETEMPLATE>PK_DATA_SETS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>EXPE_ID</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>SAMP_ID</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DB_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>6</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PERM_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>5</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<INDEXES> -<INDEX> -<NAME>IX_FK_DATA_SETS_EXPERIMENTS</NAME> -<NAMETEMPLATE>IX_FK_DATA_SETS_EXPERIMENTS</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>EXPE_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>4</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -<INDEX> -<NAME>IX_FK_DATA_SETS_SAMPLES</NAME> -<NAMETEMPLATE>IX_FK_DATA_SETS_SAMPLES</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>SAMP_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>5</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -</INDEXES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_DATA_SETS_1</NAME> -<NAMETEMPLATE>TUC_DATA_SETS_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>MODIFICATIONS</NAME> -<NAMETEMPLATE>IX_FK_MODIFICATIONS_PEPTIDES</NAMETEMPLATE> -<ID>19</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>6</ATTRLASTID> -<IDXLASTID>3</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_MODIFICATIONS</NAME> -<NAMETEMPLATE>PK_MODIFICATIONS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PEPT_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>MOTY_ID</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>POS</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>7</DOMAINID> -<DT> -<DTLISTNAME>INTEGER</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>MASS</NAME> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>6</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<INDEXES> -<INDEX> -<NAME>IX_FK_MODIFICATIONS_PEPTIDES</NAME> -<NAMETEMPLATE>IX_FK_MODIFICATIONS_PEPTIDES</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>PEPT_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>3</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -<INDEX> -<NAME>IX_FK_MODIFICATIONS_MODIFICATION_TYPES</NAME> -<NAMETEMPLATE>IX_FK_MODIFICATIONS_MODIFICATION_TYPES</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>MOTY_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>4</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -</INDEXES> -</ENT> -<ENT> -<NAME>MODIFICATION_TYPES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>20</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>7</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_MODIFICATION_TYPES</NAME> -<NAMETEMPLATE>PK_MODIFICATION_TYPES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>CODE</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>5</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DESCRIPTION</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>11</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>200</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -<ATTR> -<NAME>AMINO_ACID</NAME> -<ID>7</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER</DTLISTNAME> -<LE>1</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -<ATTR> -<NAME>MASS</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -<ATTR> -<NAME>MASS_TOLERANCE</NAME> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -</ATTRIBUTES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_MODIFICATION_TYPES_1</NAME> -<NAMETEMPLATE>TUC_MODIFICATION_TYPES_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>PEPTIDES</NAME> -<NAMETEMPLATE>IX_FK_PEPTIDES_ABUNDANCES</NAMETEMPLATE> -<ID>21</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>10</ATTRLASTID> -<IDXLASTID>5</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_PEPTIDES</NAME> -<NAMETEMPLATE>PK_PEPTIDES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PROT_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>SEQUENCE</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>10</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>69</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>1000</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>10</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>CHARGE</NAME> -<ID>7</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>7</DOMAINID> -<DT> -<DTLISTNAME>INTEGER</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>7</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<INDEXES> -<INDEX> -<NAME>IX_FK_PEPTIDES_PROTEINS</NAME> -<NAMETEMPLATE>IX_FK_PEPTIDES_PROTEINS</NAMETEMPLATE> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>PROT_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>3</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -</INDEXES> -</ENT> -<ENT> -<NAME>PROTEINS</NAME> -<NAMETEMPLATE>IX_FK_PROTEINS_DATA_SETS</NAMETEMPLATE> -<ID>23</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>11</ATTRLASTID> -<IDXLASTID>7</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_PROTEINS</NAME> -<NAMETEMPLATE>PK_PROTEINS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DASE_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>10</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>10</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PROBABILITY</NAME> -<ID>9</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>9</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<INDEXES> -<INDEX> -<NAME>IDX_PROTEINS_1</NAME> -<NAMETEMPLATE>IDX_PROTEINS_1</NAMETEMPLATE> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>DASE_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>10</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -</INDEXES> -</ENT> -<ENT> -<NAME>SAMPLES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>24</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>4</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_SAMPLES</NAME> -<NAMETEMPLATE>PK_SAMPLES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PERM_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>5</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>EXPE_ID</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_SAMPLES_1</NAME> -<NAMETEMPLATE>TUC_SAMPLES_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>SEQUENCES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>25</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>6</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_SEQUENCES</NAME> -<NAMETEMPLATE>PK_SEQUENCES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DB_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PRRE_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>6</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>AMINO_ACID_SEQUENCE</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>9</DOMAINID> -<DT> -<DTLISTNAME>TEXT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>CHECKSUM</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>4</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>8</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -</ENT> -<ENT> -<NAME>IDENTIFIED_PROTEINS</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>47</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>5</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_IDENTIFIED_PROTEINS</NAME> -<NAMETEMPLATE>PK_IDENTIFIED_PROTEINS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PROT_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>SEQU_ID</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -</ENT> -<ENT> -<NAME>ABUNDANCES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>91</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>6</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_ABUNDANCES</NAME> -<NAMETEMPLATE>PK_ABUNDANCES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PROT_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>SAMP_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>ABTY_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>VALUE</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>6</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -</ENT> -<ENT> -<NAME>PROBABILITY_FDR_MAPPINGS</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>96</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>5</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_PROBABILITY_FDR_MAPPINGS</NAME> -<NAMETEMPLATE>PK_PROBABILITY_FDR_MAPPINGS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DASE_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PROBABILITY</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>FALSE_DISCOVERY_RATE</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -</ENT> -<ENT> -<NAME>PROTEIN_REFERENCES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>98</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>4</ATTRLASTID> -<IDXLASTID>2</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_PROTEIN_REFERENCES</NAME> -<NAMETEMPLATE>PK_PROTEIN_REFERENCES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>UNIPROT_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>109</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DESCRIPTION</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>6</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>2000</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -</ATTRIBUTES> -<INDEXES> -<INDEX> -<NAME>IDX_PROTEIN_REFERENCES_1</NAME> -<NAMETEMPLATE>IDX_PROTEIN_REFERENCES_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>UNIPROT_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>3</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -</INDEXES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_PROTEIN_REFERENCES_1</NAME> -<NAMETEMPLATE>TUC_PROTEIN_REFERENCES_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>DATABASES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>110</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>3</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_DATABASES</NAME> -<NAMETEMPLATE>PK_DATABASES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>NAME_AND_VERSION</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>11</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>200</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_DATABASES_1</NAME> -<NAMETEMPLATE>TUC_DATABASES_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -</ENTITIES> -<SUBCATEGORIES> -</SUBCATEGORIES> -<TEXTAREAS> -</TEXTAREAS> -<GROUPBOXES> -</GROUPBOXES> -<STAMPS> -</STAMPS> -<SEQUENCES> -</SEQUENCES> -<PROCEDURES> -</PROCEDURES> -<VIEWS> -</VIEWS> -<RELATIONSHIPS> -<REL> -<NAME>DA_EX_FK</NAME> -<NAMETEMPLATE>DA_EX_FK</NAMETEMPLATE> -<ID>29</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>16</PARENTOBJECTID> -<CHILDOBJECTID>17</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>DA_EX_FK</NAME> -<NAMETEMPLATE>DA_EX_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>4</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>DA_SA_FK</NAME> -<NAMETEMPLATE>DA_SA_FK</NAMETEMPLATE> -<ID>30</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>24</PARENTOBJECTID> -<CHILDOBJECTID>17</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>DA_SA_FK</NAME> -<NAMETEMPLATE>DA_SA_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>5</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>MO_PE_FK</NAME> -<NAMETEMPLATE>MO_PE_FK</NAMETEMPLATE> -<ID>32</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>21</PARENTOBJECTID> -<CHILDOBJECTID>19</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>MO_PE_FK</NAME> -<NAMETEMPLATE>MO_PE_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>3</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>MO_MT_FK</NAME> -<NAMETEMPLATE>MO_MT_FK</NAMETEMPLATE> -<ID>33</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>20</PARENTOBJECTID> -<CHILDOBJECTID>19</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>MO_MT_FK</NAME> -<NAMETEMPLATE>MO_MT_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>4</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>PE_PR_FK</NAME> -<NAMETEMPLATE>PE_PR_FK</NAMETEMPLATE> -<ID>36</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>23</PARENTOBJECTID> -<CHILDOBJECTID>21</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>PE_PR_FK</NAME> -<NAMETEMPLATE>PE_PR_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>3</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>DATA_SETS_PROTEINS</NAME> -<NAMETEMPLATE>DATA_SETS_PROTEINS</NAMETEMPLATE> -<ID>46</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>17</PARENTOBJECTID> -<CHILDOBJECTID>23</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>DATA_SETS_PROTEINS</NAME> -<NAMETEMPLATE>DATA_SETS_PROTEINS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>10</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>10</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>PROTEINS_IDENTIFIED_PROTEINS</NAME> -<NAMETEMPLATE>PROTEINS_IDENTIFIED_PROTEINS</NAMETEMPLATE> -<ID>48</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>23</PARENTOBJECTID> -<CHILDOBJECTID>47</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>PROTEINS_IDENTIFIED_PROTEINS</NAME> -<NAMETEMPLATE>PROTEINS_IDENTIFIED_PROTEINS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>3</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>SEQUENCES_IDENTIFIED_PROTEINS</NAME> -<NAMETEMPLATE>SEQUENCES_IDENTIFIED_PROTEINS</NAMETEMPLATE> -<ID>50</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>25</PARENTOBJECTID> -<CHILDOBJECTID>47</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>SEQUENCES_IDENTIFIED_PROTEINS</NAME> -<NAMETEMPLATE>SEQUENCES_IDENTIFIED_PROTEINS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>5</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>SAMPLES_ABUNDANCES</NAME> -<NAMETEMPLATE>SAMPLES_ABUNDANCES</NAMETEMPLATE> -<ID>92</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>24</PARENTOBJECTID> -<CHILDOBJECTID>91</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>SAMPLES_ABUNDANCES</NAME> -<NAMETEMPLATE>SAMPLES_ABUNDANCES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>4</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>ABUNDANCES_TYPES_ABUNDANCES</NAME> -<NAMETEMPLATE>ABUNDANCES_TYPES_ABUNDANCES</NAMETEMPLATE> -<ID>93</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>14</PARENTOBJECTID> -<CHILDOBJECTID>91</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>ABUNDANCES_TYPES_ABUNDANCES</NAME> -<NAMETEMPLATE>ABUNDANCES_TYPES_ABUNDANCES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>5</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>PROTEINS_ABUNDANCES</NAME> -<NAMETEMPLATE>PROTEINS_ABUNDANCES</NAMETEMPLATE> -<ID>94</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>23</PARENTOBJECTID> -<CHILDOBJECTID>91</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>PROTEINS_ABUNDANCES</NAME> -<NAMETEMPLATE>PROTEINS_ABUNDANCES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>3</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>DATA_SETS_PROBABILITY_FDR_MAPPINGS</NAME> -<NAMETEMPLATE>DATA_SETS_PROBABILITY_FDR_MAPPINGS</NAMETEMPLATE> -<ID>97</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>17</PARENTOBJECTID> -<CHILDOBJECTID>96</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>DATA_SETS_PROBABILITY_FDR_MAPPINGS</NAME> -<NAMETEMPLATE>DATA_SETS_PROBABILITY_FDR_MAPPINGS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>5</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>DATABASES_SEQUENCES</NAME> -<NAMETEMPLATE>DATABASES_SEQUENCES</NAMETEMPLATE> -<ID>111</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>110</PARENTOBJECTID> -<CHILDOBJECTID>25</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>DATABASES_SEQUENCES</NAME> -<NAMETEMPLATE>DATABASES_SEQUENCES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>5</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>PROTEIN_REFERENCES_SEQUENCES</NAME> -<NAMETEMPLATE>PROTEIN_REFERENCES_SEQUENCES</NAMETEMPLATE> -<ID>112</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>98</PARENTOBJECTID> -<CHILDOBJECTID>25</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>PROTEIN_REFERENCES_SEQUENCES</NAME> -<NAMETEMPLATE>PROTEIN_REFERENCES_SEQUENCES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>6</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>6</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>DATABASES_DATA_SETS</NAME> -<NAMETEMPLATE>DATABASES_DATA_SETS</NAMETEMPLATE> -<ID>125</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>110</PARENTOBJECTID> -<CHILDOBJECTID>17</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>DATABASES_DATA_SETS</NAME> -<NAMETEMPLATE>DATABASES_DATA_SETS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>6</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>6</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -</RELATIONSHIPS> -<SUBCATEGORYCONNECTIONS> -</SUBCATEGORYCONNECTIONS> -</DATADICT> -</VERSION> -<VERSION> -<VERSIONINFO> -<VERSIONNUMBER>7</VERSIONNUMBER> -<VERSIONLABEL>Version 2009-07-07</VERSIONLABEL> -<VERSIONDATE>2009-07-07 08:01</VERSIONDATE> -<VERSIONCOMMENTS></VERSIONCOMMENTS> -<VERSIONTYPE>DB</VERSIONTYPE> -<VERSIONTYPEDESC>Data dictionary only (no diagrams)</VERSIONTYPEDESC> -</VERSIONINFO> -<DATADICT> -<DBID>postgresql8</DBID> -<LASTID>135</LASTID> -<DDSETTINGS> -<PKCONNAMETEMPLATE>PK_%table%</PKCONNAMETEMPLATE> -<FKCONNAMETEMPLATE>%relname%</FKCONNAMETEMPLATE> -<CCONNAMETEMPLATE>CC_%table%_%column%</CCONNAMETEMPLATE> -<NOTNULLCONNAMETEMPLATE>NN_%column%</NOTNULLCONNAMETEMPLATE> -<DEFAULTCONNAMETEMPLATE>DEF_%table%_%column%</DEFAULTCONNAMETEMPLATE> -<TUCONNAMETEMPLATE>TUC_%table%_%counter%</TUCONNAMETEMPLATE> -<TCCONNAMETEMPLATE>TCC_%table%_%counter%</TCCONNAMETEMPLATE> -<RELNAMETEMPLATE>%parent%_%child%</RELNAMETEMPLATE> -<INDEXNAMETEMPLATE>IDX_%table%_%counter%</INDEXNAMETEMPLATE> -<DEFTABLEOPTIONS></DEFTABLEOPTIONS> -<DEFINDEXOPTIONS></DEFINDEXOPTIONS> -<BEGINDATABASESCRIPT></BEGINDATABASESCRIPT> -<ENDDATABASESCRIP></ENDDATABASESCRIP> -<BEGINALTERDATABASESCRIPT></BEGINALTERDATABASESCRIPT> -<ENDALTERDATABASESCRIP></ENDALTERDATABASESCRIP> -<BEGINDROPDATABASESCRIPT></BEGINDROPDATABASESCRIPT> -<ENDDROPDATABASESCRIP></ENDDROPDATABASESCRIP> -<GENDIALOGSELECTEDOBJECTS></GENDIALOGSELECTEDOBJECTS> -<GENTABLES>1</GENTABLES> -<GENTABLEOPTIONS>1</GENTABLEOPTIONS> -<GENCONSTRAINTS>1</GENCONSTRAINTS> -<GENINDEXES>1</GENINDEXES> -<GENTRIGGERS>1</GENTRIGGERS> -<GENVIEWS>1</GENVIEWS> -<GENPROCEDURES>1</GENPROCEDURES> -<GENSEQUENCES>1</GENSEQUENCES> -<GENRELATIONSHIPS>1</GENRELATIONSHIPS> -<GENBEGINENDTABLESCRIPTS>1</GENBEGINENDTABLESCRIPTS> -<GENBEGINENDDBSCRIPTS>1</GENBEGINENDDBSCRIPTS> -<GLOBALPREFIX></GLOBALPREFIX> -<AUTOCREATEINDEXESONKEYS>0</AUTOCREATEINDEXESONKEYS> -<CONVERTDOMAINS>0</CONVERTDOMAINS> -<IGNORECOMMENTS>0</IGNORECOMMENTS> -<USESCHEMANAMES>0</USESCHEMANAMES> -<UCONNAMETEMPLATE></UCONNAMETEMPLATE> -<SQLCREATEFILE>N:\user\cisd\felmer\phosphonetx\schema-001.sql</SQLCREATEFILE> -<SQLDROPFILE>N:\user\cisd\felmer\phosphonetx\drop.sql</SQLDROPFILE> -</DDSETTINGS> -<DOMAINS> -<DOMAIN> -<NAME>CHECKSUM</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>8</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>CODE</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>DESCRIPTION</NAME> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>2000</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>INTEGER_NUMBER</NAME> -<ID>7</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>INTEGER</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>REAL_NUMBER</NAME> -<ID>8</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>LONG_SEQUENCE</NAME> -<ID>9</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>TEXT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>SHORT_DESCRIPTION</NAME> -<ID>11</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>200</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>TECH_ID</NAME> -<ID>12</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>SHORT_SEQUENCE</NAME> -<ID>69</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>1000</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>UNIPROT_ACCESSION_NUMBER</NAME> -<ID>109</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -</DOMAINS> -<ENTITIES> -<ENT> -<NAME>EXPERIMENTS</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>16</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>3</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_EXPERIMENTS</NAME> -<NAMETEMPLATE>PK_EXPERIMENTS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PERM_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>5</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_EXPERIMENTS_1</NAME> -<NAMETEMPLATE>TUC_EXPERIMENTS_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>DATA_SETS</NAME> -<NAMETEMPLATE>IX_FK_DATA_SETS_EXPERIMENTS</NAMETEMPLATE> -<ID>17</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>6</ATTRLASTID> -<IDXLASTID>3</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_DATA_SETS</NAME> -<NAMETEMPLATE>PK_DATA_SETS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>EXPE_ID</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>SAMP_ID</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DB_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>6</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PERM_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>5</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<INDEXES> -<INDEX> -<NAME>IX_FK_DATA_SETS_EXPERIMENTS</NAME> -<NAMETEMPLATE>IX_FK_DATA_SETS_EXPERIMENTS</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>EXPE_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>4</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -<INDEX> -<NAME>IX_FK_DATA_SETS_SAMPLES</NAME> -<NAMETEMPLATE>IX_FK_DATA_SETS_SAMPLES</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>SAMP_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>5</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -</INDEXES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_DATA_SETS_1</NAME> -<NAMETEMPLATE>TUC_DATA_SETS_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>MODIFICATIONS</NAME> -<NAMETEMPLATE>IX_FK_MODIFICATIONS_PEPTIDES</NAMETEMPLATE> -<ID>19</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>6</ATTRLASTID> -<IDXLASTID>3</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_MODIFICATIONS</NAME> -<NAMETEMPLATE>PK_MODIFICATIONS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PEPT_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>MOTY_ID</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>POS</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>7</DOMAINID> -<DT> -<DTLISTNAME>INTEGER</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>MASS</NAME> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>6</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<INDEXES> -<INDEX> -<NAME>IX_FK_MODIFICATIONS_PEPTIDES</NAME> -<NAMETEMPLATE>IX_FK_MODIFICATIONS_PEPTIDES</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>PEPT_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>3</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -<INDEX> -<NAME>IX_FK_MODIFICATIONS_MODIFICATION_TYPES</NAME> -<NAMETEMPLATE>IX_FK_MODIFICATIONS_MODIFICATION_TYPES</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>MOTY_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>4</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -</INDEXES> -</ENT> -<ENT> -<NAME>MODIFICATION_TYPES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>20</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>7</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_MODIFICATION_TYPES</NAME> -<NAMETEMPLATE>PK_MODIFICATION_TYPES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>CODE</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>5</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DESCRIPTION</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>11</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>200</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -<ATTR> -<NAME>AMINO_ACID</NAME> -<ID>7</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER</DTLISTNAME> -<LE>1</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -<ATTR> -<NAME>MASS</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -<ATTR> -<NAME>MASS_TOLERANCE</NAME> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -</ATTRIBUTES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_MODIFICATION_TYPES_1</NAME> -<NAMETEMPLATE>TUC_MODIFICATION_TYPES_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>PEPTIDES</NAME> -<NAMETEMPLATE>IX_FK_PEPTIDES_ABUNDANCES</NAMETEMPLATE> -<ID>21</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>10</ATTRLASTID> -<IDXLASTID>5</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_PEPTIDES</NAME> -<NAMETEMPLATE>PK_PEPTIDES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PROT_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>SEQUENCE</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>10</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>69</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>1000</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>10</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>CHARGE</NAME> -<ID>7</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>7</DOMAINID> -<DT> -<DTLISTNAME>INTEGER</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>7</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<INDEXES> -<INDEX> -<NAME>IX_FK_PEPTIDES_PROTEINS</NAME> -<NAMETEMPLATE>IX_FK_PEPTIDES_PROTEINS</NAMETEMPLATE> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>PROT_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>3</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -</INDEXES> -</ENT> -<ENT> -<NAME>PROTEINS</NAME> -<NAMETEMPLATE>IX_FK_PROTEINS_DATA_SETS</NAMETEMPLATE> -<ID>23</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>11</ATTRLASTID> -<IDXLASTID>7</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_PROTEINS</NAME> -<NAMETEMPLATE>PK_PROTEINS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DASE_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>10</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>10</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PROBABILITY</NAME> -<ID>9</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>9</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<INDEXES> -<INDEX> -<NAME>IDX_PROTEINS_1</NAME> -<NAMETEMPLATE>IDX_PROTEINS_1</NAMETEMPLATE> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>DASE_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>10</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -</INDEXES> -</ENT> -<ENT> -<NAME>SAMPLES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>24</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>4</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_SAMPLES</NAME> -<NAMETEMPLATE>PK_SAMPLES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PERM_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>5</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>EXPE_ID</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_SAMPLES_1</NAME> -<NAMETEMPLATE>TUC_SAMPLES_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>SEQUENCES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>25</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>6</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_SEQUENCES</NAME> -<NAMETEMPLATE>PK_SEQUENCES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DB_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PRRE_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>6</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>AMINO_ACID_SEQUENCE</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>9</DOMAINID> -<DT> -<DTLISTNAME>TEXT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>CHECKSUM</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>4</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>8</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -</ENT> -<ENT> -<NAME>IDENTIFIED_PROTEINS</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>47</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>5</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_IDENTIFIED_PROTEINS</NAME> -<NAMETEMPLATE>PK_IDENTIFIED_PROTEINS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PROT_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>SEQU_ID</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -</ENT> -<ENT> -<NAME>ABUNDANCES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>91</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>6</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_ABUNDANCES</NAME> -<NAMETEMPLATE>PK_ABUNDANCES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PROT_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>SAMP_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>VALUE</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>6</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -</ENT> -<ENT> -<NAME>PROBABILITY_FDR_MAPPINGS</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>96</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>5</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_PROBABILITY_FDR_MAPPINGS</NAME> -<NAMETEMPLATE>PK_PROBABILITY_FDR_MAPPINGS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DASE_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PROBABILITY</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>FALSE_DISCOVERY_RATE</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -</ENT> -<ENT> -<NAME>PROTEIN_REFERENCES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>98</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>4</ATTRLASTID> -<IDXLASTID>2</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_PROTEIN_REFERENCES</NAME> -<NAMETEMPLATE>PK_PROTEIN_REFERENCES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>UNIPROT_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>109</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DESCRIPTION</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>6</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>2000</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -</ATTRIBUTES> -<INDEXES> -<INDEX> -<NAME>IDX_PROTEIN_REFERENCES_1</NAME> -<NAMETEMPLATE>IDX_PROTEIN_REFERENCES_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>UNIPROT_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>3</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -</INDEXES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_PROTEIN_REFERENCES_1</NAME> -<NAMETEMPLATE>TUC_PROTEIN_REFERENCES_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>DATABASES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>110</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>3</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_DATABASES</NAME> -<NAMETEMPLATE>PK_DATABASES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>NAME_AND_VERSION</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>11</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>200</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_DATABASES_1</NAME> -<NAMETEMPLATE>TUC_DATABASES_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -</ENTITIES> -<SUBCATEGORIES> -</SUBCATEGORIES> -<TEXTAREAS> -</TEXTAREAS> -<GROUPBOXES> -</GROUPBOXES> -<STAMPS> -</STAMPS> -<SEQUENCES> -</SEQUENCES> -<PROCEDURES> -</PROCEDURES> -<VIEWS> -</VIEWS> -<RELATIONSHIPS> -<REL> -<NAME>DA_EX_FK</NAME> -<NAMETEMPLATE>DA_EX_FK</NAMETEMPLATE> -<ID>29</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>16</PARENTOBJECTID> -<CHILDOBJECTID>17</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>DA_EX_FK</NAME> -<NAMETEMPLATE>DA_EX_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>4</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>DA_SA_FK</NAME> -<NAMETEMPLATE>DA_SA_FK</NAMETEMPLATE> -<ID>30</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>24</PARENTOBJECTID> -<CHILDOBJECTID>17</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>DA_SA_FK</NAME> -<NAMETEMPLATE>DA_SA_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>5</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>MO_PE_FK</NAME> -<NAMETEMPLATE>MO_PE_FK</NAMETEMPLATE> -<ID>32</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>21</PARENTOBJECTID> -<CHILDOBJECTID>19</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>MO_PE_FK</NAME> -<NAMETEMPLATE>MO_PE_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>3</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>MO_MT_FK</NAME> -<NAMETEMPLATE>MO_MT_FK</NAMETEMPLATE> -<ID>33</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>20</PARENTOBJECTID> -<CHILDOBJECTID>19</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>MO_MT_FK</NAME> -<NAMETEMPLATE>MO_MT_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>4</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>PE_PR_FK</NAME> -<NAMETEMPLATE>PE_PR_FK</NAMETEMPLATE> -<ID>36</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>23</PARENTOBJECTID> -<CHILDOBJECTID>21</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>PE_PR_FK</NAME> -<NAMETEMPLATE>PE_PR_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>3</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>DATA_SETS_PROTEINS</NAME> -<NAMETEMPLATE>DATA_SETS_PROTEINS</NAMETEMPLATE> -<ID>46</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>17</PARENTOBJECTID> -<CHILDOBJECTID>23</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>DATA_SETS_PROTEINS</NAME> -<NAMETEMPLATE>DATA_SETS_PROTEINS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>10</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>10</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>PROTEINS_IDENTIFIED_PROTEINS</NAME> -<NAMETEMPLATE>PROTEINS_IDENTIFIED_PROTEINS</NAMETEMPLATE> -<ID>48</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>23</PARENTOBJECTID> -<CHILDOBJECTID>47</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>PROTEINS_IDENTIFIED_PROTEINS</NAME> -<NAMETEMPLATE>PROTEINS_IDENTIFIED_PROTEINS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>3</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>SEQUENCES_IDENTIFIED_PROTEINS</NAME> -<NAMETEMPLATE>SEQUENCES_IDENTIFIED_PROTEINS</NAMETEMPLATE> -<ID>50</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>25</PARENTOBJECTID> -<CHILDOBJECTID>47</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>SEQUENCES_IDENTIFIED_PROTEINS</NAME> -<NAMETEMPLATE>SEQUENCES_IDENTIFIED_PROTEINS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>5</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>SAMPLES_ABUNDANCES</NAME> -<NAMETEMPLATE>SAMPLES_ABUNDANCES</NAMETEMPLATE> -<ID>92</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>24</PARENTOBJECTID> -<CHILDOBJECTID>91</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>SAMPLES_ABUNDANCES</NAME> -<NAMETEMPLATE>SAMPLES_ABUNDANCES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>4</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>PROTEINS_ABUNDANCES</NAME> -<NAMETEMPLATE>PROTEINS_ABUNDANCES</NAMETEMPLATE> -<ID>94</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>23</PARENTOBJECTID> -<CHILDOBJECTID>91</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>PROTEINS_ABUNDANCES</NAME> -<NAMETEMPLATE>PROTEINS_ABUNDANCES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>3</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>DATA_SETS_PROBABILITY_FDR_MAPPINGS</NAME> -<NAMETEMPLATE>DATA_SETS_PROBABILITY_FDR_MAPPINGS</NAMETEMPLATE> -<ID>97</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>17</PARENTOBJECTID> -<CHILDOBJECTID>96</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>DATA_SETS_PROBABILITY_FDR_MAPPINGS</NAME> -<NAMETEMPLATE>DATA_SETS_PROBABILITY_FDR_MAPPINGS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>5</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>DATABASES_SEQUENCES</NAME> -<NAMETEMPLATE>DATABASES_SEQUENCES</NAMETEMPLATE> -<ID>111</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>110</PARENTOBJECTID> -<CHILDOBJECTID>25</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>DATABASES_SEQUENCES</NAME> -<NAMETEMPLATE>DATABASES_SEQUENCES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>5</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>PROTEIN_REFERENCES_SEQUENCES</NAME> -<NAMETEMPLATE>PROTEIN_REFERENCES_SEQUENCES</NAMETEMPLATE> -<ID>112</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>98</PARENTOBJECTID> -<CHILDOBJECTID>25</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>PROTEIN_REFERENCES_SEQUENCES</NAME> -<NAMETEMPLATE>PROTEIN_REFERENCES_SEQUENCES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>6</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>6</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>DATABASES_DATA_SETS</NAME> -<NAMETEMPLATE>DATABASES_DATA_SETS</NAMETEMPLATE> -<ID>125</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>110</PARENTOBJECTID> -<CHILDOBJECTID>17</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>DATABASES_DATA_SETS</NAME> -<NAMETEMPLATE>DATABASES_DATA_SETS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>6</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>6</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -</RELATIONSHIPS> -<SUBCATEGORYCONNECTIONS> -</SUBCATEGORYCONNECTIONS> -</DATADICT> -</VERSION> -<VERSION> -<VERSIONINFO> -<VERSIONNUMBER>8</VERSIONNUMBER> -<VERSIONLABEL>Version 2009-07-15</VERSIONLABEL> -<VERSIONDATE>2009-07-15 15:52</VERSIONDATE> -<VERSIONCOMMENTS></VERSIONCOMMENTS> -<VERSIONTYPE>DB</VERSIONTYPE> -<VERSIONTYPEDESC>Data dictionary only (no diagrams)</VERSIONTYPEDESC> -</VERSIONINFO> -<DATADICT> -<DBID>postgresql8</DBID> -<LASTID>139</LASTID> -<DDSETTINGS> -<PKCONNAMETEMPLATE>PK_%table%</PKCONNAMETEMPLATE> -<FKCONNAMETEMPLATE>%relname%</FKCONNAMETEMPLATE> -<CCONNAMETEMPLATE>CC_%table%_%column%</CCONNAMETEMPLATE> -<NOTNULLCONNAMETEMPLATE>NN_%column%</NOTNULLCONNAMETEMPLATE> -<DEFAULTCONNAMETEMPLATE>DEF_%table%_%column%</DEFAULTCONNAMETEMPLATE> -<TUCONNAMETEMPLATE>TUC_%table%_%counter%</TUCONNAMETEMPLATE> -<TCCONNAMETEMPLATE>TCC_%table%_%counter%</TCCONNAMETEMPLATE> -<RELNAMETEMPLATE>%parent%_%child%</RELNAMETEMPLATE> -<INDEXNAMETEMPLATE>IDX_%table%_%counter%</INDEXNAMETEMPLATE> -<DEFTABLEOPTIONS></DEFTABLEOPTIONS> -<DEFINDEXOPTIONS></DEFINDEXOPTIONS> -<BEGINDATABASESCRIPT></BEGINDATABASESCRIPT> -<ENDDATABASESCRIP></ENDDATABASESCRIP> -<BEGINALTERDATABASESCRIPT></BEGINALTERDATABASESCRIPT> -<ENDALTERDATABASESCRIP></ENDALTERDATABASESCRIP> -<BEGINDROPDATABASESCRIPT></BEGINDROPDATABASESCRIPT> -<ENDDROPDATABASESCRIP></ENDDROPDATABASESCRIP> -<GENDIALOGSELECTEDOBJECTS></GENDIALOGSELECTEDOBJECTS> -<GENTABLES>1</GENTABLES> -<GENTABLEOPTIONS>1</GENTABLEOPTIONS> -<GENCONSTRAINTS>1</GENCONSTRAINTS> -<GENINDEXES>1</GENINDEXES> -<GENTRIGGERS>1</GENTRIGGERS> -<GENVIEWS>1</GENVIEWS> -<GENPROCEDURES>1</GENPROCEDURES> -<GENSEQUENCES>1</GENSEQUENCES> -<GENRELATIONSHIPS>1</GENRELATIONSHIPS> -<GENBEGINENDTABLESCRIPTS>1</GENBEGINENDTABLESCRIPTS> -<GENBEGINENDDBSCRIPTS>1</GENBEGINENDDBSCRIPTS> -<GLOBALPREFIX></GLOBALPREFIX> -<AUTOCREATEINDEXESONKEYS>0</AUTOCREATEINDEXESONKEYS> -<CONVERTDOMAINS>0</CONVERTDOMAINS> -<IGNORECOMMENTS>0</IGNORECOMMENTS> -<USESCHEMANAMES>0</USESCHEMANAMES> -<UCONNAMETEMPLATE></UCONNAMETEMPLATE> -<SQLCREATEFILE>D:\User\felmer\dev-workspace\rtd_phosphonetx\source\sql\postgresql\001\schema-001.sql</SQLCREATEFILE> -<SQLDROPFILE>D:\User\felmer\dev-workspace\rtd_phosphonetx\source\sql\postgresql\001\drop.sql</SQLDROPFILE> -</DDSETTINGS> -<DOMAINS> -<DOMAIN> -<NAME>CHECKSUM</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>8</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>CODE</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>DESCRIPTION</NAME> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>2000</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>INTEGER_NUMBER</NAME> -<ID>7</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>INTEGER</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>REAL_NUMBER</NAME> -<ID>8</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>LONG_SEQUENCE</NAME> -<ID>9</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>TEXT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>SHORT_DESCRIPTION</NAME> -<ID>11</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>200</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>TECH_ID</NAME> -<ID>12</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>SHORT_SEQUENCE</NAME> -<ID>69</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>1000</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>UNIPROT_ACCESSION_NUMBER</NAME> -<ID>109</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -</DOMAINS> -<ENTITIES> -<ENT> -<NAME>EXPERIMENTS</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>16</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>3</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_EXPERIMENTS</NAME> -<NAMETEMPLATE>PK_EXPERIMENTS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PERM_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>5</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_EXPERIMENTS_1</NAME> -<NAMETEMPLATE>TUC_EXPERIMENTS_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>DATA_SETS</NAME> -<NAMETEMPLATE>IX_FK_DATA_SETS_EXPERIMENTS</NAMETEMPLATE> -<ID>17</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>6</ATTRLASTID> -<IDXLASTID>3</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_DATA_SETS</NAME> -<NAMETEMPLATE>PK_DATA_SETS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>EXPE_ID</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>SAMP_ID</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DB_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>6</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PERM_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>5</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<INDEXES> -<INDEX> -<NAME>IX_FK_DATA_SETS_EXPERIMENTS</NAME> -<NAMETEMPLATE>IX_FK_DATA_SETS_EXPERIMENTS</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>EXPE_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>4</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -<INDEX> -<NAME>IX_FK_DATA_SETS_SAMPLES</NAME> -<NAMETEMPLATE>IX_FK_DATA_SETS_SAMPLES</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>SAMP_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>5</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -</INDEXES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_DATA_SETS_1</NAME> -<NAMETEMPLATE>TUC_DATA_SETS_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>MODIFICATIONS</NAME> -<NAMETEMPLATE>IX_FK_MODIFICATIONS_PEPTIDES</NAMETEMPLATE> -<ID>19</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>7</ATTRLASTID> -<IDXLASTID>5</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_MODIFICATIONS</NAME> -<NAMETEMPLATE>PK_MODIFICATIONS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>MOPE_ID</NAME> -<ID>7</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>7</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>POS</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>7</DOMAINID> -<DT> -<DTLISTNAME>INTEGER</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>MASS</NAME> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>6</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -</ENT> -<ENT> -<NAME>PEPTIDES</NAME> -<NAMETEMPLATE>IX_FK_PEPTIDES_ABUNDANCES</NAMETEMPLATE> -<ID>21</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>10</ATTRLASTID> -<IDXLASTID>5</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_PEPTIDES</NAME> -<NAMETEMPLATE>PK_PEPTIDES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PROT_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>SEQUENCE</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>10</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>69</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>1000</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>10</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>CHARGE</NAME> -<ID>7</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>7</DOMAINID> -<DT> -<DTLISTNAME>INTEGER</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>7</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<INDEXES> -<INDEX> -<NAME>IX_FK_PEPTIDES_PROTEINS</NAME> -<NAMETEMPLATE>IX_FK_PEPTIDES_PROTEINS</NAMETEMPLATE> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>PROT_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>3</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -</INDEXES> -</ENT> -<ENT> -<NAME>PROTEINS</NAME> -<NAMETEMPLATE>IX_FK_PROTEINS_DATA_SETS</NAMETEMPLATE> -<ID>23</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>11</ATTRLASTID> -<IDXLASTID>7</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_PROTEINS</NAME> -<NAMETEMPLATE>PK_PROTEINS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DASE_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>10</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>10</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PROBABILITY</NAME> -<ID>9</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>9</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<INDEXES> -<INDEX> -<NAME>IDX_PROTEINS_1</NAME> -<NAMETEMPLATE>IDX_PROTEINS_1</NAMETEMPLATE> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>DASE_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>10</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -</INDEXES> -</ENT> -<ENT> -<NAME>SAMPLES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>24</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>4</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_SAMPLES</NAME> -<NAMETEMPLATE>PK_SAMPLES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PERM_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>5</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>EXPE_ID</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_SAMPLES_1</NAME> -<NAMETEMPLATE>TUC_SAMPLES_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>SEQUENCES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>25</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>6</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_SEQUENCES</NAME> -<NAMETEMPLATE>PK_SEQUENCES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DB_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PRRE_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>6</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>AMINO_ACID_SEQUENCE</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>9</DOMAINID> -<DT> -<DTLISTNAME>TEXT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>CHECKSUM</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>4</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>8</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -</ENT> -<ENT> -<NAME>IDENTIFIED_PROTEINS</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>47</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>5</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_IDENTIFIED_PROTEINS</NAME> -<NAMETEMPLATE>PK_IDENTIFIED_PROTEINS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PROT_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>SEQU_ID</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -</ENT> -<ENT> -<NAME>ABUNDANCES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>91</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>6</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_ABUNDANCES</NAME> -<NAMETEMPLATE>PK_ABUNDANCES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PROT_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>SAMP_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>VALUE</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>6</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -</ENT> -<ENT> -<NAME>PROBABILITY_FDR_MAPPINGS</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>96</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>5</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_PROBABILITY_FDR_MAPPINGS</NAME> -<NAMETEMPLATE>PK_PROBABILITY_FDR_MAPPINGS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DASE_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PROBABILITY</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>FALSE_DISCOVERY_RATE</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -</ENT> -<ENT> -<NAME>PROTEIN_REFERENCES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>98</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>4</ATTRLASTID> -<IDXLASTID>2</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_PROTEIN_REFERENCES</NAME> -<NAMETEMPLATE>PK_PROTEIN_REFERENCES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>UNIPROT_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>109</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DESCRIPTION</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>6</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>2000</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -</ATTRIBUTES> -<INDEXES> -<INDEX> -<NAME>IDX_PROTEIN_REFERENCES_1</NAME> -<NAMETEMPLATE>IDX_PROTEIN_REFERENCES_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>UNIPROT_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>3</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -</INDEXES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_PROTEIN_REFERENCES_1</NAME> -<NAMETEMPLATE>TUC_PROTEIN_REFERENCES_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>DATABASES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>110</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>3</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_DATABASES</NAME> -<NAMETEMPLATE>PK_DATABASES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>NAME_AND_VERSION</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>11</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>200</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_DATABASES_1</NAME> -<NAMETEMPLATE>TUC_DATABASES_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>MODIFIED_PEPTIDES</NAME> -<ID>136</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>5</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_MODIFIED_PEPTIDES</NAME> -<NAMETEMPLATE>PK_MODIFIED_PEPTIDES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PEPT_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>NTERM_MASS</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>CTERM_MASS</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -</ENT> -</ENTITIES> -<SUBCATEGORIES> -</SUBCATEGORIES> -<TEXTAREAS> -</TEXTAREAS> -<GROUPBOXES> -</GROUPBOXES> -<STAMPS> -</STAMPS> -<SEQUENCES> -</SEQUENCES> -<PROCEDURES> -</PROCEDURES> -<VIEWS> -</VIEWS> -<RELATIONSHIPS> -<REL> -<NAME>DA_EX_FK</NAME> -<NAMETEMPLATE>DA_EX_FK</NAMETEMPLATE> -<ID>29</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>16</PARENTOBJECTID> -<CHILDOBJECTID>17</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>DA_EX_FK</NAME> -<NAMETEMPLATE>DA_EX_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>4</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>DA_SA_FK</NAME> -<NAMETEMPLATE>DA_SA_FK</NAMETEMPLATE> -<ID>30</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>24</PARENTOBJECTID> -<CHILDOBJECTID>17</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>DA_SA_FK</NAME> -<NAMETEMPLATE>DA_SA_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>5</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>PE_PR_FK</NAME> -<NAMETEMPLATE>PE_PR_FK</NAMETEMPLATE> -<ID>36</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>23</PARENTOBJECTID> -<CHILDOBJECTID>21</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>PE_PR_FK</NAME> -<NAMETEMPLATE>PE_PR_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>3</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>DATA_SETS_PROTEINS</NAME> -<NAMETEMPLATE>DATA_SETS_PROTEINS</NAMETEMPLATE> -<ID>46</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>17</PARENTOBJECTID> -<CHILDOBJECTID>23</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>DATA_SETS_PROTEINS</NAME> -<NAMETEMPLATE>DATA_SETS_PROTEINS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>10</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>10</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>PROTEINS_IDENTIFIED_PROTEINS</NAME> -<NAMETEMPLATE>PROTEINS_IDENTIFIED_PROTEINS</NAMETEMPLATE> -<ID>48</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>23</PARENTOBJECTID> -<CHILDOBJECTID>47</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>PROTEINS_IDENTIFIED_PROTEINS</NAME> -<NAMETEMPLATE>PROTEINS_IDENTIFIED_PROTEINS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>3</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>SEQUENCES_IDENTIFIED_PROTEINS</NAME> -<NAMETEMPLATE>SEQUENCES_IDENTIFIED_PROTEINS</NAMETEMPLATE> -<ID>50</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>25</PARENTOBJECTID> -<CHILDOBJECTID>47</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>SEQUENCES_IDENTIFIED_PROTEINS</NAME> -<NAMETEMPLATE>SEQUENCES_IDENTIFIED_PROTEINS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>5</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>SAMPLES_ABUNDANCES</NAME> -<NAMETEMPLATE>SAMPLES_ABUNDANCES</NAMETEMPLATE> -<ID>92</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>24</PARENTOBJECTID> -<CHILDOBJECTID>91</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>SAMPLES_ABUNDANCES</NAME> -<NAMETEMPLATE>SAMPLES_ABUNDANCES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>4</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>PROTEINS_ABUNDANCES</NAME> -<NAMETEMPLATE>PROTEINS_ABUNDANCES</NAMETEMPLATE> -<ID>94</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>23</PARENTOBJECTID> -<CHILDOBJECTID>91</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>PROTEINS_ABUNDANCES</NAME> -<NAMETEMPLATE>PROTEINS_ABUNDANCES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>3</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>DATA_SETS_PROBABILITY_FDR_MAPPINGS</NAME> -<NAMETEMPLATE>DATA_SETS_PROBABILITY_FDR_MAPPINGS</NAMETEMPLATE> -<ID>97</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>17</PARENTOBJECTID> -<CHILDOBJECTID>96</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>DATA_SETS_PROBABILITY_FDR_MAPPINGS</NAME> -<NAMETEMPLATE>DATA_SETS_PROBABILITY_FDR_MAPPINGS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>5</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>DATABASES_SEQUENCES</NAME> -<NAMETEMPLATE>DATABASES_SEQUENCES</NAMETEMPLATE> -<ID>111</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>110</PARENTOBJECTID> -<CHILDOBJECTID>25</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>DATABASES_SEQUENCES</NAME> -<NAMETEMPLATE>DATABASES_SEQUENCES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>5</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>PROTEIN_REFERENCES_SEQUENCES</NAME> -<NAMETEMPLATE>PROTEIN_REFERENCES_SEQUENCES</NAMETEMPLATE> -<ID>112</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>98</PARENTOBJECTID> -<CHILDOBJECTID>25</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>PROTEIN_REFERENCES_SEQUENCES</NAME> -<NAMETEMPLATE>PROTEIN_REFERENCES_SEQUENCES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>6</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>6</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>DATABASES_DATA_SETS</NAME> -<NAMETEMPLATE>DATABASES_DATA_SETS</NAMETEMPLATE> -<ID>125</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>110</PARENTOBJECTID> -<CHILDOBJECTID>17</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>DATABASES_DATA_SETS</NAME> -<NAMETEMPLATE>DATABASES_DATA_SETS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>6</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>6</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>PEPTIDES_MODIFIED_PEPTIDES</NAME> -<NAMETEMPLATE>PEPTIDES_MODIFIED_PEPTIDES</NAMETEMPLATE> -<ID>138</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>21</PARENTOBJECTID> -<CHILDOBJECTID>136</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>PEPTIDES_MODIFIED_PEPTIDES</NAME> -<NAMETEMPLATE>PEPTIDES_MODIFIED_PEPTIDES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>3</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>MODIFIED_PEPTIDES_MODIFICATIONS</NAME> -<NAMETEMPLATE>MODIFIED_PEPTIDES_MODIFICATIONS</NAMETEMPLATE> -<ID>139</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>136</PARENTOBJECTID> -<CHILDOBJECTID>19</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>MODIFIED_PEPTIDES_MODIFICATIONS</NAME> -<NAMETEMPLATE>MODIFIED_PEPTIDES_MODIFICATIONS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>7</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>7</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -</RELATIONSHIPS> -<SUBCATEGORYCONNECTIONS> -</SUBCATEGORYCONNECTIONS> -</DATADICT> -</VERSION> -<VERSION> -<VERSIONINFO> -<VERSIONNUMBER>9</VERSIONNUMBER> -<VERSIONLABEL>Version 2009-07-15 1</VERSIONLABEL> -<VERSIONDATE>2009-07-15 15:53</VERSIONDATE> -<VERSIONCOMMENTS></VERSIONCOMMENTS> -<VERSIONTYPE>DB</VERSIONTYPE> -<VERSIONTYPEDESC>Data dictionary only (no diagrams)</VERSIONTYPEDESC> -</VERSIONINFO> -<DATADICT> -<DBID>postgresql8</DBID> -<LASTID>139</LASTID> -<DDSETTINGS> -<PKCONNAMETEMPLATE>PK_%table%</PKCONNAMETEMPLATE> -<FKCONNAMETEMPLATE>%relname%</FKCONNAMETEMPLATE> -<CCONNAMETEMPLATE>CC_%table%_%column%</CCONNAMETEMPLATE> -<NOTNULLCONNAMETEMPLATE>NN_%column%</NOTNULLCONNAMETEMPLATE> -<DEFAULTCONNAMETEMPLATE>DEF_%table%_%column%</DEFAULTCONNAMETEMPLATE> -<TUCONNAMETEMPLATE>TUC_%table%_%counter%</TUCONNAMETEMPLATE> -<TCCONNAMETEMPLATE>TCC_%table%_%counter%</TCCONNAMETEMPLATE> -<RELNAMETEMPLATE>%parent%_%child%</RELNAMETEMPLATE> -<INDEXNAMETEMPLATE>IDX_%table%_%counter%</INDEXNAMETEMPLATE> -<DEFTABLEOPTIONS></DEFTABLEOPTIONS> -<DEFINDEXOPTIONS></DEFINDEXOPTIONS> -<BEGINDATABASESCRIPT></BEGINDATABASESCRIPT> -<ENDDATABASESCRIP></ENDDATABASESCRIP> -<BEGINALTERDATABASESCRIPT></BEGINALTERDATABASESCRIPT> -<ENDALTERDATABASESCRIP></ENDALTERDATABASESCRIP> -<BEGINDROPDATABASESCRIPT></BEGINDROPDATABASESCRIPT> -<ENDDROPDATABASESCRIP></ENDDROPDATABASESCRIP> -<GENDIALOGSELECTEDOBJECTS></GENDIALOGSELECTEDOBJECTS> -<GENTABLES>1</GENTABLES> -<GENTABLEOPTIONS>1</GENTABLEOPTIONS> -<GENCONSTRAINTS>1</GENCONSTRAINTS> -<GENINDEXES>1</GENINDEXES> -<GENTRIGGERS>1</GENTRIGGERS> -<GENVIEWS>1</GENVIEWS> -<GENPROCEDURES>1</GENPROCEDURES> -<GENSEQUENCES>1</GENSEQUENCES> -<GENRELATIONSHIPS>1</GENRELATIONSHIPS> -<GENBEGINENDTABLESCRIPTS>1</GENBEGINENDTABLESCRIPTS> -<GENBEGINENDDBSCRIPTS>1</GENBEGINENDDBSCRIPTS> -<GLOBALPREFIX></GLOBALPREFIX> -<AUTOCREATEINDEXESONKEYS>0</AUTOCREATEINDEXESONKEYS> -<CONVERTDOMAINS>0</CONVERTDOMAINS> -<IGNORECOMMENTS>0</IGNORECOMMENTS> -<USESCHEMANAMES>0</USESCHEMANAMES> -<UCONNAMETEMPLATE></UCONNAMETEMPLATE> -<SQLCREATEFILE>D:\User\felmer\dev-workspace\rtd_phosphonetx\source\sql\postgresql\001\schema-001.sql</SQLCREATEFILE> -<SQLDROPFILE>D:\User\felmer\dev-workspace\rtd_phosphonetx\source\sql\postgresql\001\drop.sql</SQLDROPFILE> -</DDSETTINGS> -<DOMAINS> -<DOMAIN> -<NAME>CHECKSUM</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>8</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>CODE</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>DESCRIPTION</NAME> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>2000</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>INTEGER_NUMBER</NAME> -<ID>7</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>INTEGER</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>REAL_NUMBER</NAME> -<ID>8</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>LONG_SEQUENCE</NAME> -<ID>9</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>TEXT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>SHORT_DESCRIPTION</NAME> -<ID>11</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>200</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>TECH_ID</NAME> -<ID>12</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>SHORT_SEQUENCE</NAME> -<ID>69</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>1000</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -<DOMAIN> -<NAME>UNIPROT_ACCESSION_NUMBER</NAME> -<ID>109</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</DOMAIN> -</DOMAINS> -<ENTITIES> -<ENT> -<NAME>EXPERIMENTS</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>16</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>3</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_EXPERIMENTS</NAME> -<NAMETEMPLATE>PK_EXPERIMENTS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PERM_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>5</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_EXPERIMENTS_1</NAME> -<NAMETEMPLATE>TUC_EXPERIMENTS_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>DATA_SETS</NAME> -<NAMETEMPLATE>IX_FK_DATA_SETS_EXPERIMENTS</NAMETEMPLATE> -<ID>17</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>6</ATTRLASTID> -<IDXLASTID>3</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_DATA_SETS</NAME> -<NAMETEMPLATE>PK_DATA_SETS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>EXPE_ID</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>SAMP_ID</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DB_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>6</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PERM_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>5</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<INDEXES> -<INDEX> -<NAME>IX_FK_DATA_SETS_EXPERIMENTS</NAME> -<NAMETEMPLATE>IX_FK_DATA_SETS_EXPERIMENTS</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>EXPE_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>4</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -<INDEX> -<NAME>IX_FK_DATA_SETS_SAMPLES</NAME> -<NAMETEMPLATE>IX_FK_DATA_SETS_SAMPLES</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>SAMP_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>5</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -</INDEXES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_DATA_SETS_1</NAME> -<NAMETEMPLATE>TUC_DATA_SETS_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>MODIFICATIONS</NAME> -<NAMETEMPLATE>IX_FK_MODIFICATIONS_PEPTIDES</NAMETEMPLATE> -<ID>19</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>7</ATTRLASTID> -<IDXLASTID>5</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_MODIFICATIONS</NAME> -<NAMETEMPLATE>PK_MODIFICATIONS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>MOPE_ID</NAME> -<ID>7</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>7</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>POS</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>7</DOMAINID> -<DT> -<DTLISTNAME>INTEGER</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>MASS</NAME> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>6</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -</ENT> -<ENT> -<NAME>PEPTIDES</NAME> -<NAMETEMPLATE>IX_FK_PEPTIDES_ABUNDANCES</NAMETEMPLATE> -<ID>21</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>10</ATTRLASTID> -<IDXLASTID>5</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_PEPTIDES</NAME> -<NAMETEMPLATE>PK_PEPTIDES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PROT_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>SEQUENCE</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>10</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>69</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>1000</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>10</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>CHARGE</NAME> -<ID>7</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>7</DOMAINID> -<DT> -<DTLISTNAME>INTEGER</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>7</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<INDEXES> -<INDEX> -<NAME>IX_FK_PEPTIDES_PROTEINS</NAME> -<NAMETEMPLATE>IX_FK_PEPTIDES_PROTEINS</NAMETEMPLATE> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>PROT_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>3</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -</INDEXES> -</ENT> -<ENT> -<NAME>PROTEINS</NAME> -<NAMETEMPLATE>IX_FK_PROTEINS_DATA_SETS</NAMETEMPLATE> -<ID>23</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>11</ATTRLASTID> -<IDXLASTID>7</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_PROTEINS</NAME> -<NAMETEMPLATE>PK_PROTEINS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DASE_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>10</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>10</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PROBABILITY</NAME> -<ID>9</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>9</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<INDEXES> -<INDEX> -<NAME>IDX_PROTEINS_1</NAME> -<NAMETEMPLATE>IDX_PROTEINS_1</NAMETEMPLATE> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>DASE_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>10</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -</INDEXES> -</ENT> -<ENT> -<NAME>SAMPLES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>24</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>4</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_SAMPLES</NAME> -<NAMETEMPLATE>PK_SAMPLES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PERM_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>5</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>EXPE_ID</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_SAMPLES_1</NAME> -<NAMETEMPLATE>TUC_SAMPLES_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>SEQUENCES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>25</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>6</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_SEQUENCES</NAME> -<NAMETEMPLATE>PK_SEQUENCES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DB_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PRRE_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>6</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>AMINO_ACID_SEQUENCE</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>9</DOMAINID> -<DT> -<DTLISTNAME>TEXT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>CHECKSUM</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>4</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>8</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -</ENT> -<ENT> -<NAME>IDENTIFIED_PROTEINS</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>47</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>5</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_IDENTIFIED_PROTEINS</NAME> -<NAMETEMPLATE>PK_IDENTIFIED_PROTEINS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PROT_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>SEQU_ID</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -</ENT> -<ENT> -<NAME>ABUNDANCES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>91</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>6</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_ABUNDANCES</NAME> -<NAMETEMPLATE>PK_ABUNDANCES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PROT_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>SAMP_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>VALUE</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>6</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>6</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -</ENT> -<ENT> -<NAME>PROBABILITY_FDR_MAPPINGS</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>96</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>5</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_PROBABILITY_FDR_MAPPINGS</NAME> -<NAMETEMPLATE>PK_PROBABILITY_FDR_MAPPINGS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DASE_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PROBABILITY</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>FALSE_DISCOVERY_RATE</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -</ENT> -<ENT> -<NAME>PROTEIN_REFERENCES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>98</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>4</ATTRLASTID> -<IDXLASTID>2</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_PROTEIN_REFERENCES</NAME> -<NAMETEMPLATE>PK_PROTEIN_REFERENCES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>UNIPROT_ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>109</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>40</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>DESCRIPTION</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>6</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>2000</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -</ATTR> -</ATTRIBUTES> -<INDEXES> -<INDEX> -<NAME>IDX_PROTEIN_REFERENCES_1</NAME> -<NAMETEMPLATE>IDX_PROTEIN_REFERENCES_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<RELID>0</RELID> -<AUTOIDXTYPE>0</AUTOIDXTYPE> -<IDXCOLS> -<IDXCOL> -<NAME>UNIPROT_ID</NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<IDXCOLATTRID>3</IDXCOLATTRID> -</IDXCOL> -</IDXCOLS> -</INDEX> -</INDEXES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_PROTEIN_REFERENCES_1</NAME> -<NAMETEMPLATE>TUC_PROTEIN_REFERENCES_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>DATABASES</NAME> -<NAMETEMPLATE>PK_%table%</NAMETEMPLATE> -<ID>110</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>3</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>2</CONLASTID> -<PKCON> -<NAME>PK_DATABASES</NAME> -<NAMETEMPLATE>PK_DATABASES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>NAME_AND_VERSION</NAME> -<NAMETEMPLATE>NN_%column%</NAMETEMPLATE> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>11</DOMAINID> -<DT> -<DTLISTNAME>CHARACTER VARYING</DTLISTNAME> -<LE>200</LE> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -<CONSTRAINTS> -<CONSTRAINT> -<NAME>TUC_DATABASES_1</NAME> -<NAMETEMPLATE>TUC_DATABASES_1</NAMETEMPLATE> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>2</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -</CONSTRAINTS> -</ENT> -<ENT> -<NAME>MODIFIED_PEPTIDES</NAME> -<ID>136</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<ATTRLASTID>5</ATTRLASTID> -<IDXLASTID>1</IDXLASTID> -<TRGLASTID>1</TRGLASTID> -<CONLASTID>1</CONLASTID> -<PKCON> -<NAME>PK_MODIFIED_PEPTIDES</NAME> -<NAMETEMPLATE>PK_MODIFIED_PEPTIDES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>3</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</PKCON> -<ATTRIBUTES> -<ATTR> -<NAME>ID</NAME> -<ID>2</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>-1</DOMAINID> -<DT> -<DTLISTNAME>BIGSERIAL</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>2</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>PEPT_ID</NAME> -<ID>3</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>12</DOMAINID> -<DT> -<DTLISTNAME>BIGINT</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>NTERM_MASS</NAME> -<ID>4</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -<ATTR> -<NAME>CTERM_MASS</NAME> -<ID>5</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<DOMAINID>8</DOMAINID> -<DT> -<DTLISTNAME>DOUBLE PRECISION</DTLISTNAME> -<SD>0</SD> -<INC>1</INC> -</DT> -<NNCON> -<NAME></NAME> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<VALUE>1</VALUE> -<CONLEVEL>1</CONLEVEL> -<CONTYPE>5</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</NNCON> -</ATTR> -</ATTRIBUTES> -</ENT> -</ENTITIES> -<SUBCATEGORIES> -</SUBCATEGORIES> -<TEXTAREAS> -</TEXTAREAS> -<GROUPBOXES> -</GROUPBOXES> -<STAMPS> -</STAMPS> -<SEQUENCES> -</SEQUENCES> -<PROCEDURES> -</PROCEDURES> -<VIEWS> -</VIEWS> -<RELATIONSHIPS> -<REL> -<NAME>DA_EX_FK</NAME> -<NAMETEMPLATE>DA_EX_FK</NAMETEMPLATE> -<ID>29</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>16</PARENTOBJECTID> -<CHILDOBJECTID>17</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>DA_EX_FK</NAME> -<NAMETEMPLATE>DA_EX_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>4</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>DA_SA_FK</NAME> -<NAMETEMPLATE>DA_SA_FK</NAMETEMPLATE> -<ID>30</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>24</PARENTOBJECTID> -<CHILDOBJECTID>17</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>DA_SA_FK</NAME> -<NAMETEMPLATE>DA_SA_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>5</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>PE_PR_FK</NAME> -<NAMETEMPLATE>PE_PR_FK</NAMETEMPLATE> -<ID>36</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>23</PARENTOBJECTID> -<CHILDOBJECTID>21</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>PE_PR_FK</NAME> -<NAMETEMPLATE>PE_PR_FK</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>3</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>DATA_SETS_PROTEINS</NAME> -<NAMETEMPLATE>DATA_SETS_PROTEINS</NAMETEMPLATE> -<ID>46</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>17</PARENTOBJECTID> -<CHILDOBJECTID>23</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>DATA_SETS_PROTEINS</NAME> -<NAMETEMPLATE>DATA_SETS_PROTEINS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>10</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>10</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>PROTEINS_IDENTIFIED_PROTEINS</NAME> -<NAMETEMPLATE>PROTEINS_IDENTIFIED_PROTEINS</NAMETEMPLATE> -<ID>48</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>23</PARENTOBJECTID> -<CHILDOBJECTID>47</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>PROTEINS_IDENTIFIED_PROTEINS</NAME> -<NAMETEMPLATE>PROTEINS_IDENTIFIED_PROTEINS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>3</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>SEQUENCES_IDENTIFIED_PROTEINS</NAME> -<NAMETEMPLATE>SEQUENCES_IDENTIFIED_PROTEINS</NAMETEMPLATE> -<ID>50</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>25</PARENTOBJECTID> -<CHILDOBJECTID>47</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>SEQUENCES_IDENTIFIED_PROTEINS</NAME> -<NAMETEMPLATE>SEQUENCES_IDENTIFIED_PROTEINS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>5</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>SAMPLES_ABUNDANCES</NAME> -<NAMETEMPLATE>SAMPLES_ABUNDANCES</NAMETEMPLATE> -<ID>92</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>24</PARENTOBJECTID> -<CHILDOBJECTID>91</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>SAMPLES_ABUNDANCES</NAME> -<NAMETEMPLATE>SAMPLES_ABUNDANCES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>4</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>4</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>PROTEINS_ABUNDANCES</NAME> -<NAMETEMPLATE>PROTEINS_ABUNDANCES</NAMETEMPLATE> -<ID>94</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>23</PARENTOBJECTID> -<CHILDOBJECTID>91</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>PROTEINS_ABUNDANCES</NAME> -<NAMETEMPLATE>PROTEINS_ABUNDANCES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>3</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>DATA_SETS_PROBABILITY_FDR_MAPPINGS</NAME> -<NAMETEMPLATE>DATA_SETS_PROBABILITY_FDR_MAPPINGS</NAMETEMPLATE> -<ID>97</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>17</PARENTOBJECTID> -<CHILDOBJECTID>96</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>DATA_SETS_PROBABILITY_FDR_MAPPINGS</NAME> -<NAMETEMPLATE>DATA_SETS_PROBABILITY_FDR_MAPPINGS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>5</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>DATABASES_SEQUENCES</NAME> -<NAMETEMPLATE>DATABASES_SEQUENCES</NAMETEMPLATE> -<ID>111</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>110</PARENTOBJECTID> -<CHILDOBJECTID>25</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>DATABASES_SEQUENCES</NAME> -<NAMETEMPLATE>DATABASES_SEQUENCES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>5</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>5</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>PROTEIN_REFERENCES_SEQUENCES</NAME> -<NAMETEMPLATE>PROTEIN_REFERENCES_SEQUENCES</NAMETEMPLATE> -<ID>112</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>98</PARENTOBJECTID> -<CHILDOBJECTID>25</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>PROTEIN_REFERENCES_SEQUENCES</NAME> -<NAMETEMPLATE>PROTEIN_REFERENCES_SEQUENCES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>6</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>6</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>DATABASES_DATA_SETS</NAME> -<NAMETEMPLATE>DATABASES_DATA_SETS</NAMETEMPLATE> -<ID>125</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>110</PARENTOBJECTID> -<CHILDOBJECTID>17</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>DATABASES_DATA_SETS</NAME> -<NAMETEMPLATE>DATABASES_DATA_SETS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>6</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>6</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>PEPTIDES_MODIFIED_PEPTIDES</NAME> -<NAMETEMPLATE>PEPTIDES_MODIFIED_PEPTIDES</NAMETEMPLATE> -<ID>138</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>21</PARENTOBJECTID> -<CHILDOBJECTID>136</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>PEPTIDES_MODIFIED_PEPTIDES</NAME> -<NAMETEMPLATE>PEPTIDES_MODIFIED_PEPTIDES</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>3</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>3</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -<REL> -<NAME>MODIFIED_PEPTIDES_MODIFICATIONS</NAME> -<NAMETEMPLATE>MODIFIED_PEPTIDES_MODIFICATIONS</NAMETEMPLATE> -<ID>139</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<PARENTOBJECTID>136</PARENTOBJECTID> -<CHILDOBJECTID>19</CHILDOBJECTID> -<CARDINALITY>0</CARDINALITY> -<RELTYPE>1</RELTYPE> -<MANDATORYPARENT>1</MANDATORYPARENT> -<UPDATERULE>0</UPDATERULE> -<DELETERULE>0</DELETERULE> -<CONSTRAINT> -<NAME>MODIFIED_PEPTIDES_MODIFICATIONS</NAME> -<NAMETEMPLATE>MODIFIED_PEPTIDES_MODIFICATIONS</NAMETEMPLATE> -<ID>1</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<CONLEVEL>2</CONLEVEL> -<CONTYPE>4</CONTYPE> -<ATTRIBUTEIDS> -<ATTRIBUTEID>7</ATTRIBUTEID> -</ATTRIBUTEIDS> -</CONSTRAINT> -<PAIRS> -<PAIR> -<NAME></NAME> -<ID>0</ID> -<POSNR>0</POSNR> -<SCHEMA></SCHEMA> -<DESC></DESC> -<KEYID>2</KEYID> -<FOREIGNKEYID>7</FOREIGNKEYID> -</PAIR> -</PAIRS> -</REL> -</RELATIONSHIPS> -<SUBCATEGORYCONNECTIONS> -</SUBCATEGORYCONNECTIONS> -</DATADICT> -</VERSION> - -</dezign> \ No newline at end of file diff --git a/rtd_phosphonetx/sourceTest/core-plugins/core-plugins.properties b/rtd_phosphonetx/sourceTest/core-plugins/core-plugins.properties deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/dss/proteomics/server/plugins/APMSReportTest.java b/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/dss/proteomics/server/plugins/APMSReportTest.java deleted file mode 100644 index 84e93ffbf16..00000000000 --- a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/dss/proteomics/server/plugins/APMSReportTest.java +++ /dev/null @@ -1,297 +0,0 @@ -/* - * Copyright 2011 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.dss.proteomics.server.plugins; - -import static ch.systemsx.cisd.openbis.dss.proteomics.server.plugins.APMSReport.DEFAULT_PROTEIN_PROPERTY_CODE; - -import java.io.File; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; -import java.util.Properties; -import java.util.Set; - -import javax.activation.DataHandler; - -import org.apache.commons.io.IOUtils; -import org.hamcrest.BaseMatcher; -import org.hamcrest.Description; -import org.hamcrest.core.IsNull; -import org.jmock.Expectations; -import org.jmock.Mockery; -import org.testng.annotations.AfterMethod; -import org.testng.annotations.BeforeMethod; -import org.testng.annotations.Test; - -import ch.rinn.restrictions.Friend; -import ch.systemsx.cisd.base.tests.AbstractFileSystemTestCase; -import ch.systemsx.cisd.common.exceptions.UserFailureException; -import ch.systemsx.cisd.common.filesystem.FileUtilities; -import ch.systemsx.cisd.common.mail.EMailAddress; -import ch.systemsx.cisd.common.mail.IMailClient; -import ch.systemsx.cisd.common.test.RecordingMatcher; -import ch.systemsx.cisd.openbis.dss.generic.server.plugins.standard.MockDataSetDirectoryProvider; -import ch.systemsx.cisd.openbis.dss.generic.shared.Constants; -import ch.systemsx.cisd.openbis.dss.generic.shared.DataSetProcessingContext; -import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService; -import ch.systemsx.cisd.openbis.dss.generic.shared.ProcessingStatus; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ListSampleCriteria; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModel; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelColumnHeader; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRow; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.builders.SampleBuilder; -import ch.systemsx.cisd.openbis.generic.shared.dto.DatasetDescription; -import ch.systemsx.cisd.openbis.generic.shared.dto.builders.DatasetDescriptionBuilder; -import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifierFactory; - -/** - * @author Franz-Josef Elmer - */ -@Friend(toClasses = APMSReport.class) -public class APMSReportTest extends AbstractFileSystemTestCase -{ - private static final String EXAMPLE_PROTEINS = - "# Protein abundances computed from file 'result.consensusXML'\n" - + "# Parameters (relevant only): top=3, average=median, include_all, consensus:normalize\n" - + "# Files/samples associated with abundance values below:" - + " 0: '/cluster/s1.featureXML'," - + " 1: '/cluster/s2.featureXML'," - + " 2: '/cluster/s3.featureXML'\n" - + "\"protein\",\"n_proteins\",\"protein_score\",\"n_peptides\",\"abundance_0\",\"abundance_1\",\"abundance_2\"\n" - + "\"P1\",1,1,5,1.5,2.5,3.5\n" + "\"P2\",1,1,6,11.5,0,13.5\n" - + "\"P3\",1,1,14,21.5,22.5,0\n"; - - private Mockery context; - - private APMSReport report; - - private IEncapsulatedOpenBISService service; - - private IMailClient mailClient; - - private DataSetProcessingContext processingContext; - - @BeforeMethod - public void beforeMethod() - { - File dataSetFolder = createDataSet("1"); - FileUtilities.writeToFile(new File(dataSetFolder, APMSReport.PROTEIN_FILE_NAME), - EXAMPLE_PROTEINS); - createDataSet("2"); - - context = new Mockery(); - service = context.mock(IEncapsulatedOpenBISService.class); - mailClient = context.mock(IMailClient.class); - report = new APMSReport(new Properties(), workingDirectory); - report.setService(service); - MockDataSetDirectoryProvider directoryProvider = - new MockDataSetDirectoryProvider(workingDirectory, Constants.DEFAULT_SHARE_ID); - processingContext = - new DataSetProcessingContext(null, directoryProvider, - Collections.<String, String> emptyMap(), mailClient, "test-user", "a@bc.de"); - } - - private File createDataSet(String location) - { - File share = new File(workingDirectory, Constants.DEFAULT_SHARE_ID); - File originalFolder = new File(new File(share, location), "original"); - originalFolder.mkdirs(); - File dataSetFolder = new File(originalFolder, "data-set-folder"); - dataSetFolder.mkdirs(); - return dataSetFolder; - } - - @AfterMethod - public void afterMethod() - { - // To following line of code should also be called at the end of each test method. - // Otherwise one do not known which test failed. - context.assertIsSatisfied(); - } - - @Test - public void testProcess() throws IOException - { - Sample b2 = new SampleBuilder("/S/B2").id(12).getSample(); - prepareGetSample(new SampleBuilder("/MS_DATA/S1").id(1).childOf(b2).getSample()); - prepareGetSample(new SampleBuilder("/MS_DATA/S2").id(2).childOf(b2).getSample()); - prepareGetSample(new SampleBuilder("/MS_DATA/S3").id(3).childOf(b2).getSample()); - DatasetDescriptionBuilder ds1 = - new DatasetDescriptionBuilder("ds1").location("1").space("s").project("p") - .experiment("e"); - DatasetDescriptionBuilder ds2 = new DatasetDescriptionBuilder("ds2").location("2"); - List<DatasetDescription> dataSets = - Arrays.asList(ds1.getDatasetDescription(), ds2.getDatasetDescription()); - final RecordingMatcher<String> subjectMatcher = new RecordingMatcher<String>(); - final RecordingMatcher<String> contentMatcher = new RecordingMatcher<String>(); - final RecordingMatcher<String> fileNameMatcher = new RecordingMatcher<String>(); - final RecordingMatcher<DataHandler> attachmentMatcher = new RecordingMatcher<DataHandler>(); - final RecordingMatcher<EMailAddress[]> addressesMatcher = - new RecordingMatcher<EMailAddress[]>(); - context.checking(new Expectations() - { - { - one(mailClient).sendEmailMessageWithAttachment(with(subjectMatcher), - with(contentMatcher), with(fileNameMatcher), with(attachmentMatcher), - with(new IsNull<EMailAddress>()), with(new IsNull<EMailAddress>()), - with(addressesMatcher)); - } - }); - - ProcessingStatus status = report.process(dataSets, processingContext); - assertEquals("Protein APMS Report", subjectMatcher.recordedObject()); - assertEquals("Dear User\n\n" - + "Enclosed you will find the Protein APMS report file for experiment s/p/e.\n" - + "Data Set: ds1", contentMatcher.recordedObject()); - @SuppressWarnings("unchecked") - List<String> fileLines = - IOUtils.readLines(attachmentMatcher.recordedObject().getInputStream()); - assertEquals("Sample ID,Bait,Prey,freq of obs," - + "avg MS1 intensities (normalized for the bait),STDV MS1 intensity", - fileLines.get(0)); - assertEquals(4, fileLines.size()); - assertEquals("[ERROR: \"Exception occured: " - + UserFailureException.class.getName() + ": File " - + APMSReport.PROTEIN_FILE_NAME + " missing.\"]", status.getErrorStatuses() - .toString()); - - context.assertIsSatisfied(); - } - - @Test - public void testCreateReport() - { - Sample master = - new SampleBuilder("/master").property(DEFAULT_PROTEIN_PROPERTY_CODE, "Q1") - .getSample(); - Sample b1 = new SampleBuilder("/S/B1").id(11).childOf(master).getSample(); - Sample b2 = new SampleBuilder("/S/B2").id(12).getSample(); - prepareGetSample(new SampleBuilder("/MS_DATA/S1").id(1).childOf(b1).getSample()); - prepareGetSample(new SampleBuilder("/MS_DATA/S2").id(2).childOf(b1).getSample()); - prepareGetSample(new SampleBuilder("/MS_DATA/S3").id(3).childOf(b2).getSample()); - DatasetDescriptionBuilder ds1 = new DatasetDescriptionBuilder("ds1").location("1"); - List<DatasetDescription> dataSets = Arrays.asList(ds1.getDatasetDescription()); - - TableModel table = report.createReport(dataSets, processingContext); - - List<TableModelColumnHeader> headers = table.getHeader(); - assertEquals("[Sample ID, Bait, Prey, freq of obs, " - + "avg MS1 intensities (normalized for the bait), STDV MS1 intensity]", - headers.toString()); - List<TableModelRow> rows = table.getRows(); - assertEquals("[B1, Q1, P1, 1.0, 2.0, 0.5]", rows.get(0).getValues().toString()); - assertEquals("[B2, , P1, 1.0, 3.5, 0.0]", rows.get(1).getValues().toString()); - assertEquals("[B1, Q1, P2, 0.5, 5.75, 5.75]", rows.get(2).getValues().toString()); - assertEquals("[B2, , P2, 1.0, 13.5, 0.0]", rows.get(3).getValues().toString()); - assertEquals("[B1, Q1, P3, 1.0, 22.0, 0.5]", rows.get(4).getValues().toString()); - assertEquals("[B2, , P3, 0.0, 0.0, 0.0]", rows.get(5).getValues().toString()); - assertEquals(3 * 2, rows.size()); - - context.assertIsSatisfied(); - } - - @Test - public void testCreateReportForMissingProteinsFile() - { - DatasetDescriptionBuilder ds = new DatasetDescriptionBuilder("ds2").location("2"); - try - { - report.createReport(Arrays.asList(ds.getDatasetDescription()), processingContext); - fail("UserFailureException expected"); - } catch (UserFailureException ex) - { - assertEquals("File " + APMSReport.PROTEIN_FILE_NAME + " missing.", ex.getMessage()); - } - - context.assertIsSatisfied(); - } - - @Test - public void testCreateReportForTwoDataSets() - { - DatasetDescriptionBuilder ds1 = new DatasetDescriptionBuilder("ds1").location("1"); - DatasetDescriptionBuilder ds2 = new DatasetDescriptionBuilder("ds2").location("2"); - try - { - report.createReport( - Arrays.asList(ds1.getDatasetDescription(), ds2.getDatasetDescription()), null); - fail("UserFailureException expected"); - } catch (UserFailureException ex) - { - assertEquals("Chosen plugin works with exactly one data set. 2 data sets selected.", - ex.getMessage()); - } - - context.assertIsSatisfied(); - } - - private void prepareGetSample(final Sample sample) - { - context.checking(new Expectations() - { - { - one(service).tryGetSampleWithExperiment( - SampleIdentifierFactory.parse(sample.getIdentifier())); - will(returnValue(sample)); - } - }); - prepareGetAncestors(sample); - } - - protected void prepareGetAncestors(final Sample sample) - { - List<IEntityProperty> properties = sample.getProperties(); - for (IEntityProperty property : properties) - { - if (property.getPropertyType().getCode().equals(DEFAULT_PROTEIN_PROPERTY_CODE)) - { - return; - } - } - final Set<Sample> parents = sample.getParents(); - context.checking(new Expectations() - { - { - one(service).listSamples(with(new BaseMatcher<ListSampleCriteria>() - { - @Override - public boolean matches(Object item) - { - return sample.getId() == ((ListSampleCriteria) item) - .getChildSampleId().getId(); - } - - @Override - public void describeTo(Description description) - { - description.appendText("parents of " + sample.getIdentifier()); - } - })); - will(returnValue(new ArrayList<Sample>(parents))); - } - }); - for (Sample parent : parents) - { - prepareGetAncestors(parent); - } - } - -} diff --git a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/dss/proteomics/server/plugins/LocalAndRemoteCopierTest.java b/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/dss/proteomics/server/plugins/LocalAndRemoteCopierTest.java deleted file mode 100644 index cf6469dc431..00000000000 --- a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/dss/proteomics/server/plugins/LocalAndRemoteCopierTest.java +++ /dev/null @@ -1,392 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.dss.proteomics.server.plugins; - -import static ch.systemsx.cisd.openbis.dss.generic.server.plugins.standard.DataSetCopier.SSH_TIMEOUT_MILLIS; - -import java.io.File; -import java.io.IOException; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Properties; - -import org.apache.commons.io.FileUtils; -import org.jmock.Expectations; -import org.jmock.Mockery; -import org.testng.annotations.AfterMethod; -import org.testng.annotations.BeforeMethod; -import org.testng.annotations.Test; - -import ch.rinn.restrictions.Friend; -import ch.systemsx.cisd.base.exceptions.CheckedExceptionTunnel; -import ch.systemsx.cisd.base.tests.AbstractFileSystemTestCase; -import ch.systemsx.cisd.common.concurrent.ExecutionResult; -import ch.systemsx.cisd.common.exceptions.ConfigurationFailureException; -import ch.systemsx.cisd.common.exceptions.EnvironmentFailureException; -import ch.systemsx.cisd.common.exceptions.Status; -import ch.systemsx.cisd.common.filesystem.BooleanStatus; -import ch.systemsx.cisd.common.filesystem.FileUtilities; -import ch.systemsx.cisd.common.filesystem.IPathCopier; -import ch.systemsx.cisd.common.filesystem.ssh.ISshCommandExecutor; -import ch.systemsx.cisd.common.process.ProcessResult; -import ch.systemsx.cisd.common.utilities.ITextHandler; -import ch.systemsx.cisd.openbis.dss.generic.server.plugins.standard.DataSetCopier; -import ch.systemsx.cisd.openbis.dss.generic.server.plugins.standard.IPathCopierFactory; -import ch.systemsx.cisd.openbis.dss.generic.server.plugins.standard.ISshCommandExecutorFactory; -import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetInformation; -import ch.systemsx.cisd.openbis.dss.generic.shared.utils.RSyncConfig; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetKind; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetType; - -/** - * @author Franz-Josef Elmer - */ -@Friend(toClasses = LocalAndRemoteCopier.class) -public class LocalAndRemoteCopierTest extends AbstractFileSystemTestCase -{ - private static final ProcessResult OK_RESULT = new ProcessResult(Arrays.asList(""), 0, null, - ExecutionResult.create(null), null, 0, (List<String>) null, null, null, null); - - private static final String SAMPLE_CODE = "my-sample"; - - private static final DataSetType DATA_SET_TYPE = new DataSetType("MY"); - - private static final DataSetKind DATA_SET_KIND = DataSetKind.PHYSICAL; - - private static final String DATA_SET_CODE = "my-dataset-123"; - - private static final String FOLDER_NAME = DATA_SET_CODE; - - private static final String DATA = "hello test"; - - private Mockery context; - - private File dataSet; - - private IPathCopierFactory copierFactory; - - private IPathCopier copier; - - private ISshCommandExecutorFactory sshExecutorFactory; - - private ISshCommandExecutor sshExecutor; - - private File destination; - - private File dataFile; - - private File rsyncExec; - - private File sshExec; - - @BeforeMethod - public void beforeMethod() throws Exception - { - context = new Mockery(); - copierFactory = context.mock(IPathCopierFactory.class); - copier = context.mock(IPathCopier.class); - sshExecutorFactory = context.mock(ISshCommandExecutorFactory.class); - sshExecutor = context.mock(ISshCommandExecutor.class); - dataSet = new File(workingDirectory, "data-set"); - dataSet.mkdirs(); - dataFile = new File(dataSet, "data.txt"); - FileUtilities.writeToFile(dataFile, DATA); - destination = new File(workingDirectory, "destination"); - destination.mkdirs(); - rsyncExec = new File(workingDirectory, "my-rsync"); - rsyncExec.createNewFile(); - sshExec = new File(workingDirectory, "my-rssh"); - sshExec.createNewFile(); - } - - @AfterMethod - public void afterMethod() - { - // To following line of code should also be called at the end of each test method. - // Otherwise one do not known which test failed. - context.assertIsSatisfied(); - } - - @Test - public void testLocalWithKnownSample() - { - Properties properties = new Properties(); - prepareCopier(properties); - properties.setProperty(DataSetCopier.DESTINATION_KEY, destination.getPath()); - LocalAndRemoteCopier msInjectionCopier = - new LocalAndRemoteCopier(properties, copierFactory, sshExecutorFactory); - prepareForCheckingLastModifiedDate(); - - DataSetInformation dataSetInformation = new DataSetInformation(); - dataSetInformation.setDataSetCode(DATA_SET_CODE); - dataSetInformation.setDataSetType(DATA_SET_TYPE); - dataSetInformation.setDataSetKind(DATA_SET_KIND); - HashMap<String, String> parameterBindings = new HashMap<String, String>(); - parameterBindings.put(DATA_SET_CODE, SAMPLE_CODE); - Status status = msInjectionCopier.handle(dataSet, dataSetInformation, parameterBindings); - - assertEquals(Status.OK, status); - File copiedDataSet = new File(destination, FOLDER_NAME); - assertEquals(true, copiedDataSet.isDirectory()); - assertEquals(dataSet.lastModified(), copiedDataSet.lastModified()); - assertEquals(DATA, FileUtilities.loadToString(new File(copiedDataSet, dataFile.getName())) - .trim()); - - context.assertIsSatisfied(); - } - - @Test - public void testLocalWithUnknownSample() - { - Properties properties = new Properties(); - prepareCopier(properties); - properties.setProperty(DataSetCopier.DESTINATION_KEY, destination.getPath()); - LocalAndRemoteCopier msInjectionCopier = - new LocalAndRemoteCopier(properties, copierFactory, sshExecutorFactory); - - DataSetInformation dataSetInformation = new DataSetInformation(); - dataSetInformation.setDataSetCode(DATA_SET_CODE); - dataSetInformation.setDataSetType(DATA_SET_TYPE); - dataSetInformation.setDataSetKind(DATA_SET_KIND); - HashMap<String, String> parameterBindings = new HashMap<String, String>(); - Status status = msInjectionCopier.handle(dataSet, dataSetInformation, parameterBindings); - - assertEquals(Status.OK, status); - File copiedDataSet = new File(destination, DATA_SET_CODE); - assertEquals(true, copiedDataSet.isDirectory()); - - context.assertIsSatisfied(); - } - - @Test - public void testLocalWithAlreadyExistingDestination() - { - Properties properties = new Properties(); - prepareCopier(properties); - properties.setProperty(DataSetCopier.DESTINATION_KEY, destination.getPath()); - LocalAndRemoteCopier msInjectionCopier = - new LocalAndRemoteCopier(properties, copierFactory, sshExecutorFactory); - File copiedDataSet = new File(destination, FOLDER_NAME); - copiedDataSet.mkdirs(); - File dummy = new File(copiedDataSet, "dummy"); - FileUtilities.writeToFile(dummy, "hello"); - - DataSetInformation dataSetInformation = new DataSetInformation(); - dataSetInformation.setDataSetCode(DATA_SET_CODE); - dataSetInformation.setDataSetType(DATA_SET_TYPE); - dataSetInformation.setDataSetKind(DATA_SET_KIND); - HashMap<String, String> parameterBindings = new HashMap<String, String>(); - parameterBindings.put(DATA_SET_CODE, SAMPLE_CODE); - Status status = msInjectionCopier.handle(dataSet, dataSetInformation, parameterBindings); - - assertEquals(Status.OK, status); - assertEquals(true, copiedDataSet.isDirectory()); - assertEquals(DATA, FileUtilities.loadToString(new File(copiedDataSet, dataFile.getName())) - .trim()); - assertEquals(false, dummy.exists()); - - context.assertIsSatisfied(); - } - - @Test - public void testRemoteWithMarkerFile() - { - Properties properties = new Properties(); - properties.setProperty(LocalAndRemoteCopier.MARKER_FILE_PREFIX, "MARKER-"); - properties.setProperty(DataSetCopier.DESTINATION_KEY, "localhost:" + destination.getPath()); - properties.setProperty(DataSetCopier.RSYNC_EXEC + "-executable", rsyncExec.getPath()); - properties.setProperty(DataSetCopier.SSH_EXEC + "-executable", sshExec.getPath()); - context.checking(new Expectations() - { - { - one(copierFactory).create(rsyncExec, sshExec, DataSetCopier.SSH_TIMEOUT_MILLIS, - RSyncConfig.getInstance().getAdditionalCommandLineOptions()); - will(returnValue(copier)); - - one(copier).check(); - one(copier).checkRsyncConnectionViaSsh("localhost", null, - DataSetCopier.SSH_TIMEOUT_MILLIS); - will(returnValue(true)); - - one(sshExecutorFactory).create(sshExec, "localhost"); - will(returnValue(sshExecutor)); - - final String copiedDataSet = new File(destination, FOLDER_NAME).getPath(); - one(sshExecutor).exists(copiedDataSet, SSH_TIMEOUT_MILLIS); - will(returnValue(BooleanStatus.createTrue())); - - one(sshExecutor).executeCommandRemotely("rm -rf " + copiedDataSet, - SSH_TIMEOUT_MILLIS); - will(returnValue(OK_RESULT)); - - one(copier).copyToRemote(dataSet, destination.getPath(), "localhost", null, null, null, null); - will(returnValue(Status.OK)); - - one(sshExecutor).executeCommandRemotely( - "mv " + new File(destination, dataSet.getName()) + " " + copiedDataSet, - SSH_TIMEOUT_MILLIS); - will(returnValue(OK_RESULT)); - - one(sshExecutor).executeCommandRemotely( - "touch " + new File(destination, "MARKER-" + FOLDER_NAME), - SSH_TIMEOUT_MILLIS); - will(returnValue(OK_RESULT)); - } - }); - LocalAndRemoteCopier msInjectionCopier = - new LocalAndRemoteCopier(properties, copierFactory, sshExecutorFactory); - - DataSetInformation dataSetInformation = new DataSetInformation(); - dataSetInformation.setDataSetCode(DATA_SET_CODE); - dataSetInformation.setDataSetType(DATA_SET_TYPE); - dataSetInformation.setDataSetKind(DATA_SET_KIND); - HashMap<String, String> parameterBindings = new HashMap<String, String>(); - parameterBindings.put(DATA_SET_CODE, SAMPLE_CODE); - Status status = msInjectionCopier.handle(dataSet, dataSetInformation, parameterBindings); - - assertEquals(Status.OK, status); - context.assertIsSatisfied(); - } - - private void prepareForCheckingLastModifiedDate() - { - // Sleep long enough to test last modified date of target will be same as of source. - try - { - Thread.sleep(2000); - } catch (InterruptedException ex) - { - // ignored - } - } - - private void prepareCopier(Properties properties) - { - properties.setProperty(DataSetCopier.RSYNC_EXEC + "-executable", rsyncExec.getPath()); - context.checking(new Expectations() - { - { - one(copierFactory).create(rsyncExec, null, DataSetCopier.SSH_TIMEOUT_MILLIS, - RSyncConfig.getInstance().getAdditionalCommandLineOptions()); - will(returnValue(new MockCopier())); - } - }); - } - - private final class MockCopier implements IPathCopier - { - - @Override - public boolean isProgressEnabled() - { - return false; - } - - @Override - public boolean terminate() - { - return false; - } - - @Override - public boolean isRemote() - { - return false; - } - - @Override - public void check() throws EnvironmentFailureException, ConfigurationFailureException - { - } - - @Override - public Status copy(File sourcePath, File destinationDirectory, - ITextHandler stdoutHandlerOrNull, ITextHandler stderrHandlerOrNull) - { - return null; - } - - @Override - public Status copyContent(File sourcePath, File destinationDirectory, - ITextHandler stdoutHandlerOrNull, ITextHandler stderrHandlerOrNull) - { - return null; - } - - @Override - public Status copyToRemote(File sourcePath, String destinationDirectory, - String destinationHostOrNull, String rsyncModuleNameOrNull, - String rsyncPasswordFileOrNull, - ITextHandler stdoutHandlerOrNull, ITextHandler stderrHandlerOrNull) - { - try - { - FileUtils.copyDirectoryToDirectory(dataSet, new File(destinationDirectory)); - } catch (IOException ex) - { - throw CheckedExceptionTunnel.wrapIfNecessary(ex); - } - File file = new File(destinationDirectory, dataSet.getName()); - file.setLastModified(dataSet.lastModified()); - return Status.OK; - } - - @Override - public Status copyContentToRemote(File sourcePath, String destinationDirectory, - String destinationHostOrNull, String rsyncModuleNameOrNull, - String rsyncPasswordFileOrNull, - ITextHandler stdoutHandlerOrNull, ITextHandler stderrHandlerOrNull) - { - return null; - } - - @Override - public Status copyFromRemote(String sourcePath, String sourceHost, - File destinationDirectory, String rsyncModuleNameOrNull, - String rsyncPasswordFileOrNull, - ITextHandler stdoutHandlerOrNull, ITextHandler stderrHandlerOrNull) - { - return null; - } - - @Override - public Status copyContentFromRemote(String sourcePath, String sourceHost, - File destinationDirectory, String rsyncModuleNameOrNull, - String rsyncPasswordFileOrNull, - ITextHandler stdoutHandlerOrNull, ITextHandler stderrHandlerOrNull) - { - return null; - } - - @Override - public boolean checkRsyncConnectionViaSsh(String host, String rsyncExecutableOnHostOrNull, - long millisToWaitForCompletion) - { - return false; - } - - @Override - public boolean checkRsyncConnectionViaRsyncServer(String host, String rsyncModule, - String rsyncPassworFileOrNull, long millisToWaitForCompletion) - { - return false; - } - - } - -} diff --git a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/etlserver/proteomics/AbundanceHandlerTest.java b/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/etlserver/proteomics/AbundanceHandlerTest.java deleted file mode 100644 index 2f71d9dd3a5..00000000000 --- a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/etlserver/proteomics/AbundanceHandlerTest.java +++ /dev/null @@ -1,405 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.etlserver.proteomics; - -import java.util.Arrays; -import java.util.List; - -import org.hamcrest.BaseMatcher; -import org.hamcrest.Description; -import org.hamcrest.core.IsNull; -import org.jmock.Expectations; -import org.jmock.Mockery; -import org.testng.AssertJUnit; -import org.testng.annotations.AfterMethod; -import org.testng.annotations.BeforeMethod; -import org.testng.annotations.Test; - -import ch.systemsx.cisd.common.exceptions.UserFailureException; -import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService; -import ch.systemsx.cisd.openbis.etlserver.proteomics.dto.Experiment; -import ch.systemsx.cisd.openbis.etlserver.proteomics.dto.Parameter; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewSample; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample; -import ch.systemsx.cisd.openbis.generic.shared.dto.ListSamplesByPropertyCriteria; -import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ExperimentIdentifier; -import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ProjectIdentifier; -import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifier; -import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifierFactory; -import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SpaceIdentifier; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.CommonConstants; - -/** - * @author Franz-Josef Elmer - */ -public class AbundanceHandlerTest extends AssertJUnit -{ - private static final String SPACE_CODE = "G1"; - - private static final SpaceIdentifier SPACE_IDENTIFIER = new SpaceIdentifier(SPACE_CODE); - - private static final String EXPERIMENT_CODE = "E1"; - - private static final SpaceIdentifier SPACE_IDENTIFIER_MS = new SpaceIdentifier( - CommonConstants.MS_DATA_SPACE); - - private static final String PARAMETER_VALUE = "1234.5"; - - private static final double ABUNDANCE = 1234.5; - - private static final String PARAMETER_NAME = "ABC12"; - - private static final SampleIdentifier SAMPLE_IDENTIFER = new SampleIdentifier(SPACE_IDENTIFIER_MS, - PARAMETER_NAME); - - private static final ExperimentIdentifier EXPERIMENT_IDENTIFIER = new ExperimentIdentifier( - new ProjectIdentifier(SPACE_CODE, "P1"), EXPERIMENT_CODE); - - private static final String SAMPLE_PERM_ID = "s12-34"; - - private static final String EXPERIMENT_PERM_ID = "e12345-42"; - - private static final long EXPERIMENT_ID = 42; - - private static final long SAMPLE_ID = 43; - - private static final long PROTEIN_ID = 4711; - - private static final String PROTEIN_NAME = "my protein"; - - private static final ListSamplesByPropertyCriteria CRITERIA = - new ListSamplesByPropertyCriteria(AbundanceHandler.MZXML_FILENAME, PARAMETER_NAME, - SPACE_CODE, null); - - private Mockery context; - - private IProtDAO dao; - - private IEncapsulatedOpenBISService service; - - private Experiment experiment; - - private AbundanceHandler handler; - - @BeforeMethod - public void beforeMethod() - { - context = new Mockery(); - dao = context.mock(IProtDAO.class); - service = context.mock(IEncapsulatedOpenBISService.class); - experiment = new Experiment(); - experiment.setPermID(EXPERIMENT_PERM_ID); - experiment.setId(EXPERIMENT_ID); - handler = new AbundanceHandler(service, dao, EXPERIMENT_IDENTIFIER, experiment, "+", false); - } - - @AfterMethod - public void afterMethod() - { - // To following line of code should also be called at the end of each test method. - // Otherwise one do not known which test failed. - context.assertIsSatisfied(); - } - - @Test - public void testAddAbundanceValueWhichIsNotANumber() - { - prepareCreateSampleIdentifiedByCode(); - - try - { - handler.addAbundancesToDatabase(createParameter("blabla"), PROTEIN_ID, PROTEIN_NAME); - fail("UserFailureException expected"); - } catch (UserFailureException e) - { - assertEquals("Abundance of sample '" + PARAMETER_NAME + "' of protein '" + PROTEIN_NAME - + "' is not a number: blabla", e.getMessage()); - } - - context.assertIsSatisfied(); - } - - @Test - public void testAddTwoAbundanceValuesForASampleIdentifiedByCode() - { - prepareCreateSampleIdentifiedByCode(); - context.checking(new Expectations() - { - { - one(dao).createAbundance(PROTEIN_ID, SAMPLE_ID, ABUNDANCE); - one(dao).createAbundance(PROTEIN_ID, SAMPLE_ID, 1.5); - } - }); - - handler.addAbundancesToDatabase(createParameter(PARAMETER_VALUE), PROTEIN_ID, PROTEIN_NAME); - handler.addAbundancesToDatabase(createParameter("1.5"), PROTEIN_ID, PROTEIN_NAME); - - context.assertIsSatisfied(); - } - - @Test - public void testAddTwoAbundanceValuesForASampleIdentifiedByCodeAndSpace() - { - String sampleIdentifier = "/" + SPACE_CODE + "/" + PARAMETER_NAME; - prepareCreateSampleIdentifiedByIdentifier(sampleIdentifier); - context.checking(new Expectations() - { - { - one(dao).createAbundance(PROTEIN_ID, SAMPLE_ID, ABUNDANCE); - one(dao).createAbundance(PROTEIN_ID, SAMPLE_ID, 1.5); - } - }); - - handler.addAbundancesToDatabase(createParameter(sampleIdentifier, PARAMETER_VALUE), - PROTEIN_ID, PROTEIN_NAME); - handler.addAbundancesToDatabase(createParameter(sampleIdentifier, "1.5"), PROTEIN_ID, - PROTEIN_NAME); - - context.assertIsSatisfied(); - } - - @Test - public void testAddTwoAbundanceValuesForASampleIdentifiedByPropertyButNoSampleFound() - { - prepareCreateSampleIdentifiedByProperty(Arrays.<Sample> asList()); - - try - { - handler.addAbundancesToDatabase(createParameter(PARAMETER_VALUE), PROTEIN_ID, - PROTEIN_NAME); - fail("UserFailureException expected"); - } catch (UserFailureException e) - { - assertEquals("Protein '" + PROTEIN_NAME - + "' has an abundance value for an unidentified sample: " + PARAMETER_NAME, - e.getMessage()); - } - - try - { - handler.addAbundancesToDatabase(createParameter(PARAMETER_VALUE), PROTEIN_ID, - PROTEIN_NAME); - fail("UserFailureException expected"); - } catch (UserFailureException e) - { - assertEquals("Protein '" + PROTEIN_NAME - + "' has an abundance value for an unidentified sample: " + PARAMETER_NAME, - e.getMessage()); - } - - context.assertIsSatisfied(); - } - - @Test - public void testAddAbundanceValuesForASampleIdentifiedByPropertyButTwoSamplesFound() - { - Sample sample = new Sample(); - sample.setPermId(SAMPLE_PERM_ID); - prepareCreateSampleIdentifiedByProperty(Arrays.<Sample> asList(sample, sample)); - - try - { - handler.addAbundancesToDatabase(createParameter(PARAMETER_VALUE), PROTEIN_ID, - PROTEIN_NAME); - fail("UserFailureException expected"); - } catch (UserFailureException e) - { - assertEquals("Protein '" + PROTEIN_NAME - + "' has an abundance value for a not uniquely specified sample " - + "(2 samples are found): " + PARAMETER_NAME, e.getMessage()); - } - - context.assertIsSatisfied(); - } - - @Test - public void testAddAbundanceValuesForASampleIdentifiedByProperty() - { - final Sample sample = new Sample(); - sample.setPermId(SAMPLE_PERM_ID); - sample.setIdentifier("blabla"); - prepareCreateSampleIdentifiedByProperty(Arrays.<Sample> asList(sample)); - prepareCreateSample(); - context.checking(new Expectations() - { - { - one(dao).createAbundance(PROTEIN_ID, SAMPLE_ID, ABUNDANCE); - one(service).registerSample(with(new BaseMatcher<NewSample>() - { - - @Override - @SuppressWarnings("deprecation") - public boolean matches(Object item) - { - if (item instanceof NewSample) - { - NewSample newSample = (NewSample) item; - assertEquals(SPACE_IDENTIFIER + "/" + PARAMETER_NAME + "_" - + EXPERIMENT_CODE, newSample.getIdentifier()); - assertEquals(EXPERIMENT_IDENTIFIER.toString(), - newSample.getExperimentIdentifier()); - assertEquals(sample.getIdentifier(), - newSample.getParentIdentifier()); - return true; - } - return false; - } - - @Override - public void describeTo(Description description) - { - - } - }), with(new IsNull<String>())); - } - }); - - handler.addAbundancesToDatabase( - createParameter(PARAMETER_NAME + "+blabla.xml", PARAMETER_VALUE), PROTEIN_ID, - PROTEIN_NAME); - - context.assertIsSatisfied(); - } - - private Parameter createParameter(String value) - { - return createParameter(PARAMETER_NAME, value); - } - - Parameter createParameter(String parameterName, String value) - { - Parameter parameter = new Parameter(); - parameter.setName(parameterName); - parameter.setValue(value); - return parameter; - } - - private void prepareCreateSampleIdentifiedByCode() - { - prepareCreateSampleIdentifiedByIdentifier(PARAMETER_NAME); - } - - void prepareCreateSampleIdentifiedByIdentifier(final String sampleIdentifier) - { - Sample sample = new Sample(); - sample.setPermId(SAMPLE_PERM_ID); - sample.setIdentifier(sampleIdentifier); - prepareGetSample( - SampleIdentifierFactory - .parse(sampleIdentifier, "/" + CommonConstants.MS_DATA_SPACE).toString(), - sample); - prepareCreateSample(); - context.checking(new Expectations() - { - { - one(service).registerSample(with(new BaseMatcher<NewSample>() - { - @Override - @SuppressWarnings("deprecation") - public boolean matches(Object item) - { - if (item instanceof NewSample) - { - NewSample newSample = (NewSample) item; - assertEquals(SPACE_IDENTIFIER + "/" + PARAMETER_NAME + "_" - + EXPERIMENT_CODE, newSample.getIdentifier()); - assertEquals(EXPERIMENT_IDENTIFIER.toString(), - newSample.getExperimentIdentifier()); - assertEquals(sampleIdentifier, newSample.getParentIdentifier()); - return true; - } - return false; - } - - @Override - public void describeTo(Description description) - { - - } - }), with(new IsNull<String>())); - } - }); - } - - private void prepareCreateSample() - { - context.checking(new Expectations() - { - { - one(dao).tryToGetSampleByPermID(SAMPLE_PERM_ID); - will(returnValue(null)); - - one(dao).createSample(EXPERIMENT_ID, SAMPLE_PERM_ID); - will(returnValue(SAMPLE_ID)); - } - }); - } - - private void prepareCreateSampleIdentifiedByProperty(final List<Sample> samples) - { - prepareGetSample(SAMPLE_IDENTIFER.toString(), null); - context.checking(new Expectations() - { - { - one(service).listSamplesByCriteria( - with(new BaseMatcher<ListSamplesByPropertyCriteria>() - { - @Override - public boolean matches(Object item) - { - return CRITERIA.toString().equals(item.toString()); - } - - @Override - public void describeTo(Description description) - { - description.appendValue(CRITERIA); - - } - })); - will(returnValue(samples)); - } - }); - } - - private void prepareGetSample(final String expectedSampleIdentifier, final Sample sample) - { - context.checking(new Expectations() - { - { - one(service).tryGetSampleWithExperiment( - with(new BaseMatcher<SampleIdentifier>() - { - - @Override - public boolean matches(Object item) - { - return expectedSampleIdentifier.equals(item.toString()); - } - - @Override - public void describeTo(Description description) - { - description.appendValue(expectedSampleIdentifier); - - } - })); - will(returnValue(sample)); - } - }); - } -} diff --git a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/etlserver/proteomics/DataSetInfoExtractorForMSInjectionTest.java b/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/etlserver/proteomics/DataSetInfoExtractorForMSInjectionTest.java deleted file mode 100644 index d6c11894cb1..00000000000 --- a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/etlserver/proteomics/DataSetInfoExtractorForMSInjectionTest.java +++ /dev/null @@ -1,722 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.etlserver.proteomics; - -import static ch.systemsx.cisd.openbis.etlserver.proteomics.DataSetInfoExtractorForMSInjection.BIOLOGICAL_SAMPLE_IDENTIFIER_KEY; -import static ch.systemsx.cisd.openbis.etlserver.proteomics.DataSetInfoExtractorForMSInjection.DATA_SET_PROPERTIES_FILE; -import static ch.systemsx.cisd.openbis.etlserver.proteomics.DataSetInfoExtractorForMSInjection.DATA_SET_TYPE_KEY; -import static ch.systemsx.cisd.openbis.etlserver.proteomics.DataSetInfoExtractorForMSInjection.EXPERIMENT_CODE_KEY; -import static ch.systemsx.cisd.openbis.etlserver.proteomics.DataSetInfoExtractorForMSInjection.EXPERIMENT_TYPE_CODE; -import static ch.systemsx.cisd.openbis.etlserver.proteomics.DataSetInfoExtractorForMSInjection.MS_INJECTION_PROPERTIES_FILE; -import static ch.systemsx.cisd.openbis.etlserver.proteomics.DataSetInfoExtractorForMSInjection.PARENT_TYPE_KEY; -import static ch.systemsx.cisd.openbis.etlserver.proteomics.DataSetInfoExtractorForMSInjection.PROJECT_CODE_KEY; -import static ch.systemsx.cisd.openbis.etlserver.proteomics.DataSetInfoExtractorForMSInjection.SAMPLE_CODE_KEY; -import static ch.systemsx.cisd.openbis.etlserver.proteomics.DataSetInfoExtractorForMSInjection.USER_KEY; - -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.util.Arrays; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Properties; - -import org.apache.commons.io.IOUtils; -import org.hamcrest.BaseMatcher; -import org.hamcrest.Description; -import org.jmock.Expectations; -import org.jmock.Mockery; -import org.testng.Assert; -import org.testng.annotations.AfterMethod; -import org.testng.annotations.BeforeMethod; -import org.testng.annotations.Test; - -import ch.systemsx.cisd.base.exceptions.CheckedExceptionTunnel; -import ch.systemsx.cisd.base.tests.AbstractFileSystemTestCase; -import ch.systemsx.cisd.common.exceptions.ConfigurationFailureException; -import ch.systemsx.cisd.common.exceptions.UserFailureException; -import ch.systemsx.cisd.etlserver.IDataSetInfoExtractor; -import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService; -import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetInformation; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetType; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetTypePropertyType; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetTypeWithVocabularyTerms; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityProperty; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewExperiment; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewSample; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PhysicalDataSet; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PropertyType; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleType; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleTypePropertyType; -import ch.systemsx.cisd.openbis.generic.shared.dto.NewProperty; -import ch.systemsx.cisd.openbis.generic.shared.dto.SampleUpdatesDTO; -import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ExperimentIdentifier; -import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifier; -import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifierFactory; -import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SpaceIdentifier; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.CommonConstants; - -/** - * @author Franz-Josef Elmer - */ -public class DataSetInfoExtractorForMSInjectionTest extends AbstractFileSystemTestCase -{ - private static final String PROJECT_CODE = "MS2"; - - private static final String EXPERIMENT_CODE = "2010-02"; - - private static final String SAMPLE_CODE = "U09-1242"; - - private static final String SAMPLE_IDENTIFIER = - SpaceIdentifier.Constants.IDENTIFIER_SEPARATOR + CommonConstants.MS_DATA_SPACE - + SpaceIdentifier.Constants.IDENTIFIER_SEPARATOR + SAMPLE_CODE; - - private static final String EXPERIMENT_IDENTIFIER = - SpaceIdentifier.Constants.IDENTIFIER_SEPARATOR + CommonConstants.MS_DATA_SPACE - + SpaceIdentifier.Constants.IDENTIFIER_SEPARATOR + PROJECT_CODE - + SpaceIdentifier.Constants.IDENTIFIER_SEPARATOR + EXPERIMENT_CODE; - - private static final long EXPERIMENT_ID = 42; - - private static final long SAMPLE_ID = 43; - - private static final String SAMPLE_PROPERTY = "name"; - - private Mockery context; - - private IEncapsulatedOpenBISService service; - - private IDataSetInfoExtractor extractor; - - private File dataSet; - - @BeforeMethod - public void beforeMethod() - { - context = new Mockery(); - service = context.mock(IEncapsulatedOpenBISService.class); - extractor = new DataSetInfoExtractorForMSInjection(service); - dataSet = new File(workingDirectory, "data-set"); - dataSet.mkdirs(); - } - - @AfterMethod - public void afterMethod() - { - // To following line of code should also be called at the end of each test method. - // Otherwise one do not known which test failed. - context.assertIsSatisfied(); - } - - @Test - public void testMissingPropertiesFile() - { - try - { - extractor.getDataSetInformation(dataSet, service); - fail("UserFailureException expected"); - } catch (UserFailureException ex) - { - assertEquals("Missing properties file '" + MS_INJECTION_PROPERTIES_FILE + "'.", ex - .getMessage()); - } - - context.assertIsSatisfied(); - } - - @Test - public void testPropertiesFileIsAFolder() - { - new File(dataSet, MS_INJECTION_PROPERTIES_FILE).mkdir(); - try - { - extractor.getDataSetInformation(dataSet, service); - fail("UserFailureException expected"); - } catch (UserFailureException ex) - { - assertEquals("Properties file '" + MS_INJECTION_PROPERTIES_FILE + "' is a folder.", ex - .getMessage()); - } - - context.assertIsSatisfied(); - } - - @Test - public void testMissingSampleCode() - { - Properties properties = new Properties(); - save(properties, MS_INJECTION_PROPERTIES_FILE); - - try - { - extractor.getDataSetInformation(dataSet, service); - fail("ConfigurationFailureException expected"); - } catch (ConfigurationFailureException ex) - { - assertEquals("Given key '" + SAMPLE_CODE_KEY + "' not found in properties '[]'", ex - .getMessage()); - } - - context.assertIsSatisfied(); - } - - @Test - public void testMissingProjectCode() - { - Properties properties = new Properties(); - - properties.setProperty(SAMPLE_CODE_KEY, SAMPLE_CODE); - save(properties, MS_INJECTION_PROPERTIES_FILE); - - try - { - extractor.getDataSetInformation(dataSet, service); - fail("ConfigurationFailureException expected"); - } catch (ConfigurationFailureException ex) - { - assertEquals("Given key '" + PROJECT_CODE_KEY + "' not found in properties '[" - + SAMPLE_CODE_KEY + "]'", ex.getMessage()); - } - - context.assertIsSatisfied(); - } - - @Test - public void testMissingExperimentCode() - { - Properties properties = new Properties(); - properties.setProperty(SAMPLE_CODE_KEY, SAMPLE_CODE); - properties.setProperty(PROJECT_CODE_KEY, PROJECT_CODE); - save(properties, MS_INJECTION_PROPERTIES_FILE); - - try - { - extractor.getDataSetInformation(dataSet, service); - fail("ConfigurationFailureException expected"); - } catch (ConfigurationFailureException ex) - { - assertEquals("Given key '" + EXPERIMENT_CODE_KEY + "' not found in properties '[" - + PROJECT_CODE_KEY + ", " + SAMPLE_CODE_KEY + "]'", ex.getMessage()); - } - - context.assertIsSatisfied(); - } - - @Test - public void testMissingDataSetPropertiesFile() - { - Properties sampleProperties = new Properties(); - sampleProperties.setProperty(SAMPLE_CODE_KEY, SAMPLE_CODE); - sampleProperties.setProperty(PROJECT_CODE_KEY, PROJECT_CODE); - sampleProperties.setProperty(EXPERIMENT_CODE_KEY, EXPERIMENT_CODE); - sampleProperties.setProperty(USER_KEY, "user1"); - save(sampleProperties, MS_INJECTION_PROPERTIES_FILE); - SampleTypePropertyType pt = createPropertyType(SAMPLE_CODE_KEY, true); - prepareGetExperimentAndGetSampleType(true, pt); - prepareRegisterSample(null); - - try - { - extractor.getDataSetInformation(dataSet, service); - fail("UserFailureException expected"); - } catch (UserFailureException ex) - { - assertEquals("Missing properties file '" + DATA_SET_PROPERTIES_FILE + "'.", ex - .getMessage()); - } - - context.assertIsSatisfied(); - } - - @Test - public void testMissingDataSetType() - { - Properties sampleProperties = new Properties(); - sampleProperties.setProperty(SAMPLE_CODE_KEY, SAMPLE_CODE); - sampleProperties.setProperty(PROJECT_CODE_KEY, PROJECT_CODE); - sampleProperties.setProperty(EXPERIMENT_CODE_KEY, EXPERIMENT_CODE); - sampleProperties.setProperty(USER_KEY, "user1"); - save(sampleProperties, MS_INJECTION_PROPERTIES_FILE); - Properties dataSetProperties = new Properties(); - save(dataSetProperties, DATA_SET_PROPERTIES_FILE); - SampleTypePropertyType pt = createPropertyType(SAMPLE_CODE_KEY, true); - prepareGetExperimentAndGetSampleType(true, pt); - prepareRegisterSample(null); - - try - { - extractor.getDataSetInformation(dataSet, service); - fail("ConfigurationFailureException expected"); - } catch (ConfigurationFailureException ex) - { - assertEquals("Given key '" + DATA_SET_TYPE_KEY + "' not found in properties '[]'", ex - .getMessage()); - } - - context.assertIsSatisfied(); - } - - @Test - public void testRegisterRawData() - { - Properties sampleProperties = new Properties(); - sampleProperties.setProperty(PROJECT_CODE_KEY, PROJECT_CODE); - sampleProperties.setProperty(SAMPLE_CODE_KEY, SAMPLE_CODE); - sampleProperties.setProperty(EXPERIMENT_CODE_KEY, EXPERIMENT_CODE); - sampleProperties.setProperty(USER_KEY, "user1"); - sampleProperties.setProperty("TEMPERATURE", "47.11"); - save(sampleProperties, MS_INJECTION_PROPERTIES_FILE); - Properties dataSetProperties = new Properties(); - dataSetProperties.setProperty(DATA_SET_TYPE_KEY, "RAW_DATA"); - dataSetProperties.setProperty("CENTROID", "true"); - dataSetProperties.setProperty("BLABLA", "blub"); - save(dataSetProperties, DATA_SET_PROPERTIES_FILE); - SampleTypePropertyType pt1 = createPropertyType(SAMPLE_CODE_KEY, true); - SampleTypePropertyType pt2 = createPropertyType("VOLUME", false); - prepareGetExperimentAndGetSampleType(false, pt1, pt2); - prepareRegisterSample(null); - prepareGetDataSetType("RAW_DATA", createDataSetPropertyType("CENTROID", false)); - - DataSetInformation info = extractor.getDataSetInformation(dataSet, service); - - assertEquals(CommonConstants.MS_DATA_SPACE, info.getSpaceCode()); - assertEquals(SAMPLE_CODE, info.getSampleCode()); - assertEquals(EXPERIMENT_IDENTIFIER, info.getExperimentIdentifier().toString()); - List<NewProperty> dProps = info.getDataSetProperties(); - assertEquals(1, dProps.size()); - assertEquals("CENTROID", dProps.get(0).getPropertyCode()); - assertEquals("true", dProps.get(0).getValue()); - - context.assertIsSatisfied(); - } - - @Test - public void testRegisterRawDataAndLinkToBiologicalSampe() - { - Properties sampleProperties = new Properties(); - sampleProperties.setProperty(PROJECT_CODE_KEY, PROJECT_CODE); - sampleProperties.setProperty(SAMPLE_CODE_KEY, SAMPLE_CODE); - sampleProperties.setProperty(EXPERIMENT_CODE_KEY, EXPERIMENT_CODE); - sampleProperties.setProperty(BIOLOGICAL_SAMPLE_IDENTIFIER_KEY, "bio-sample"); - sampleProperties.setProperty(USER_KEY, "user1"); - sampleProperties.setProperty("TEMPERATURE", "47.11"); - save(sampleProperties, MS_INJECTION_PROPERTIES_FILE); - Properties dataSetProperties = new Properties(); - dataSetProperties.setProperty(DATA_SET_TYPE_KEY, "RAW_DATA"); - dataSetProperties.setProperty("CENTROID", "true"); - dataSetProperties.setProperty("BLABLA", "blub"); - save(dataSetProperties, DATA_SET_PROPERTIES_FILE); - SampleTypePropertyType pt1 = createPropertyType(SAMPLE_CODE_KEY, true); - SampleTypePropertyType pt2 = createPropertyType("VOLUME", false); - prepareGetExperimentAndGetSampleType(false, pt1, pt2); - prepareRegisterSample("bio-sample"); - prepareGetDataSetType("RAW_DATA", createDataSetPropertyType("CENTROID", false)); - context.checking(new Expectations() - { - { - one(service).tryGetSampleWithExperiment(SampleIdentifierFactory.parse("bio-sample")); - will(returnValue(new Sample())); - } - }); - - DataSetInformation info = extractor.getDataSetInformation(dataSet, service); - - assertEquals(CommonConstants.MS_DATA_SPACE, info.getSpaceCode()); - assertEquals(SAMPLE_CODE, info.getSampleCode()); - assertEquals(EXPERIMENT_IDENTIFIER, info.getExperimentIdentifier().toString()); - List<NewProperty> dProps = info.getDataSetProperties(); - assertEquals(1, dProps.size()); - assertEquals("CENTROID", dProps.get(0).getPropertyCode()); - assertEquals("true", dProps.get(0).getValue()); - - context.assertIsSatisfied(); - } - - @Test - public void testRegisterSupersedingRawDataWhichUpdatesSampleProperties() - { - Properties sampleProperties = new Properties(); - sampleProperties.setProperty(PROJECT_CODE_KEY, PROJECT_CODE); - sampleProperties.setProperty(SAMPLE_CODE_KEY, SAMPLE_CODE); - sampleProperties.setProperty(EXPERIMENT_CODE_KEY, EXPERIMENT_CODE); - sampleProperties.setProperty(SAMPLE_PROPERTY, "Isaac"); - sampleProperties.setProperty("TEMPERATURE", "47.11"); - save(sampleProperties, MS_INJECTION_PROPERTIES_FILE); - Properties dataSetProperties = new Properties(); - dataSetProperties.setProperty(DATA_SET_TYPE_KEY, "RAW_DATA"); - dataSetProperties.setProperty("CENTROID", "true"); - dataSetProperties.setProperty("BLABLA", "blub"); - save(dataSetProperties, DATA_SET_PROPERTIES_FILE); - prepareGetExperimentAndGetSampleType(false, createPropertyType(SAMPLE_PROPERTY, true)); - prepareUpdateSample("Isaac", null); - prepareGetDataSetType("RAW_DATA", createDataSetPropertyType("CENTROID", false)); - - DataSetInformation info = extractor.getDataSetInformation(dataSet, service); - - assertEquals(CommonConstants.MS_DATA_SPACE, info.getSpaceCode()); - assertEquals(SAMPLE_CODE, info.getSampleCode()); - assertEquals(EXPERIMENT_IDENTIFIER, info.getExperimentIdentifier().toString()); - List<NewProperty> dProps = info.getDataSetProperties(); - assertEquals(1, dProps.size()); - assertEquals("CENTROID", dProps.get(0).getPropertyCode()); - assertEquals("true", dProps.get(0).getValue()); - - context.assertIsSatisfied(); - } - - @Test - public void testRegisterSupersedingRawDataWhichUpdatesSampleParent() - { - Properties sampleProperties = new Properties(); - sampleProperties.setProperty(BIOLOGICAL_SAMPLE_IDENTIFIER_KEY, "bio-sample"); - sampleProperties.setProperty(PROJECT_CODE_KEY, PROJECT_CODE); - sampleProperties.setProperty(SAMPLE_CODE_KEY, SAMPLE_CODE); - sampleProperties.setProperty(EXPERIMENT_CODE_KEY, EXPERIMENT_CODE); - sampleProperties.setProperty(SAMPLE_PROPERTY, "Isaac"); - sampleProperties.setProperty("TEMPERATURE", "47.11"); - save(sampleProperties, MS_INJECTION_PROPERTIES_FILE); - Properties dataSetProperties = new Properties(); - dataSetProperties.setProperty(DATA_SET_TYPE_KEY, "RAW_DATA"); - dataSetProperties.setProperty("CENTROID", "true"); - dataSetProperties.setProperty("BLABLA", "blub"); - save(dataSetProperties, DATA_SET_PROPERTIES_FILE); - prepareGetExperimentAndGetSampleType(false, createPropertyType(SAMPLE_PROPERTY, true)); - prepareUpdateSample("Isaac", new String[] { "bio-sample" }); - prepareGetDataSetType("RAW_DATA", createDataSetPropertyType("CENTROID", false)); - context.checking(new Expectations() - { - { - one(service).tryGetSampleWithExperiment( - SampleIdentifierFactory.parse("bio-sample")); - will(returnValue(new Sample())); - } - }); - - DataSetInformation info = extractor.getDataSetInformation(dataSet, service); - - assertEquals(CommonConstants.MS_DATA_SPACE, info.getSpaceCode()); - assertEquals(SAMPLE_CODE, info.getSampleCode()); - assertEquals(EXPERIMENT_IDENTIFIER, info.getExperimentIdentifier().toString()); - List<NewProperty> dProps = info.getDataSetProperties(); - assertEquals(1, dProps.size()); - assertEquals("CENTROID", dProps.get(0).getPropertyCode()); - assertEquals("true", dProps.get(0).getValue()); - - context.assertIsSatisfied(); - } - - @Test - public void testRegisterParentDataSet() - { - Properties sampleProperties = new Properties(); - sampleProperties.setProperty(PROJECT_CODE_KEY, PROJECT_CODE); - sampleProperties.setProperty(SAMPLE_CODE_KEY, SAMPLE_CODE); - sampleProperties.setProperty(EXPERIMENT_CODE_KEY, EXPERIMENT_CODE); - sampleProperties.setProperty(SAMPLE_PROPERTY, "Albert"); - save(sampleProperties, MS_INJECTION_PROPERTIES_FILE); - Properties dataSetProperties = new Properties(); - dataSetProperties.setProperty(DATA_SET_TYPE_KEY, "MZXML_DATA"); - dataSetProperties.setProperty(PARENT_TYPE_KEY, "RAW_DATA"); - save(dataSetProperties, DATA_SET_PROPERTIES_FILE); - SampleTypePropertyType pt1 = createPropertyType(SAMPLE_PROPERTY, false); - SampleTypePropertyType pt2 = createPropertyType("VOLUME", false); - SampleTypePropertyType pt3 = createPropertyType("TEMPERATURE", false); - prepareGetExperimentAndGetSampleType(true, pt1, pt2, pt3); - prepareUpdateSample(null, null); - prepareGetDataSetType("MZXML_DATA"); - context.checking(new Expectations() - { - { - one(service).listDataSetsBySampleID(SAMPLE_ID, false); - AbstractExternalData ds1 = createDataSet("RAW_DATA", "raw1", 11); - AbstractExternalData ds2 = createDataSet("MZXML_DATA", "mzxml1", 13); - AbstractExternalData ds3 = createDataSet("RAW_DATA", "raw2", 12); - will(returnValue(Arrays.asList(ds1, ds2, ds3))); - } - }); - - DataSetInformation info = extractor.getDataSetInformation(dataSet, service); - - assertEquals(CommonConstants.MS_DATA_SPACE, info.getSpaceCode()); - assertEquals(SAMPLE_CODE, info.getSampleCode()); - assertEquals(new SampleIdentifier(new SpaceIdentifier(CommonConstants.MS_DATA_SPACE), - SAMPLE_CODE), info.getSampleIdentifier()); - assertEquals(EXPERIMENT_IDENTIFIER, info.getExperimentIdentifier().toString()); - assertEquals(0, info.getDataSetProperties().size()); - List<String> parentDataSetCodes = info.getParentDataSetCodes(); - assertEquals("raw2", parentDataSetCodes.get(0)); - assertEquals(1, parentDataSetCodes.size()); - - context.assertIsSatisfied(); - } - - @Test - public void testMissingMandatoryProperties() - { - Properties properties = new Properties(); - properties.setProperty(PROJECT_CODE_KEY, PROJECT_CODE); - properties.setProperty(SAMPLE_CODE_KEY, SAMPLE_CODE); - properties.setProperty(EXPERIMENT_CODE_KEY, EXPERIMENT_CODE); - save(properties, MS_INJECTION_PROPERTIES_FILE); - SampleTypePropertyType pt1 = createPropertyType(SAMPLE_CODE_KEY, true); - SampleTypePropertyType pt2 = createPropertyType("VOLUME", true); - SampleTypePropertyType pt3 = createPropertyType("TEMPERATURE", true); - prepareGetExperimentAndGetSampleType(true, pt1, pt2, pt3); - context.checking(new Expectations() - { - { - one(service).tryGetSampleWithExperiment( - SampleIdentifierFactory.parse(SAMPLE_IDENTIFIER)); - will(returnValue(null)); - } - }); - - try - { - extractor.getDataSetInformation(dataSet, service); - fail("UserFailureException expected"); - } catch (UserFailureException ex) - { - assertEquals("The following mandatory properties are missed: [VOLUME, TEMPERATURE]", ex - .getMessage()); - } - - context.assertIsSatisfied(); - } - - private void prepareGetExperimentAndGetSampleType(final boolean experimentExists, - final SampleTypePropertyType... sampleTypePropertyTypes) - { - context.checking(new Expectations() - { - { - ExperimentIdentifier identifier = - new ExperimentIdentifier(CommonConstants.MS_DATA_SPACE, PROJECT_CODE, - EXPERIMENT_CODE); - one(service).tryGetExperiment(identifier); - Experiment experiment = new Experiment(); - experiment.setId(EXPERIMENT_ID); - will(returnValue(experimentExists ? experiment : null)); - - if (experimentExists == false) - { - one(service).registerExperiment( - new NewExperiment(identifier.toString(), EXPERIMENT_TYPE_CODE)); - } - } - }); - prepareGetSampleType(sampleTypePropertyTypes); - } - - private void prepareGetSampleType(final SampleTypePropertyType... sampleTypePropertyTypes) - { - context.checking(new Expectations() - { - { - one(service).getSampleType(CommonConstants.MS_INJECTION_SAMPLE_TYPE_CODE); - SampleType sampleType = new SampleType(); - sampleType.setCode(CommonConstants.MS_INJECTION_SAMPLE_TYPE_CODE); - sampleType.setSampleTypePropertyTypes(Arrays.asList(sampleTypePropertyTypes)); - will(returnValue(sampleType)); - } - }); - } - - private void prepareGetDataSetType(final String dataSetType, - final DataSetTypePropertyType... types) - { - context.checking(new Expectations() - { - { - one(service).getDataSetType(dataSetType); - DataSetTypeWithVocabularyTerms result = new DataSetTypeWithVocabularyTerms(); - DataSetType type = new DataSetType(dataSetType); - type.setDataSetTypePropertyTypes(Arrays.asList(types)); - result.setDataSetType(type); - will(returnValue(result)); - } - }); - } - - private void prepareRegisterSample(final String parentIdentifier) - { - context.checking(new Expectations() - { - { - one(service).tryGetSampleWithExperiment( - SampleIdentifierFactory.parse(SAMPLE_IDENTIFIER)); - will(returnValue(null)); - - one(service).registerSample(with(new BaseMatcher<NewSample>() - { - @Override - public boolean matches(Object item) - { - if (item instanceof NewSample) - { - NewSample sample = (NewSample) item; - assertEquals(CommonConstants.MS_INJECTION_SAMPLE_TYPE_CODE, sample.getSampleType().getCode()); - assertEquals(SAMPLE_IDENTIFIER, sample.getIdentifier()); - assertEquals(EXPERIMENT_IDENTIFIER, sample - .getExperimentIdentifier()); - String[] parents = sample.getParentsOrNull(); - assertEquals(parentIdentifier, parents == null ? null : parents[0]); - IEntityProperty[] properties = sample.getProperties(); - Map<String, IEntityProperty> map = - new HashMap<String, IEntityProperty>(); - for (IEntityProperty property : properties) - { - map.put(property.getPropertyType().getCode(), property); - } - - assertEquals(SAMPLE_CODE, map.get(SAMPLE_CODE_KEY).getValue()); - assertEquals(1, map.size()); - return true; - } - return false; - } - - @Override - public void describeTo(Description description) - { - description.appendText(SAMPLE_IDENTIFIER); - } - }), with("user1")); - } - }); - } - - private void prepareUpdateSample(final String newName, final String[] expectedModifiedParentCodesOrNull) - { - context.checking(new Expectations() - { - { - one(service).tryGetSampleWithExperiment( - SampleIdentifierFactory.parse(SAMPLE_IDENTIFIER)); - Sample sample = new Sample(); - sample.setId(SAMPLE_ID); - sample.setModificationDate(new Date(4711)); - sample.setProperties(Arrays.<IEntityProperty> asList(createProperty( - SAMPLE_PROPERTY, "Albert"))); - SampleType sampleType = new SampleType(); - sampleType.setSampleTypePropertyTypes(Arrays.asList(createPropertyType( - SAMPLE_PROPERTY, true))); - sample.setSampleType(sampleType); - will(returnValue(sample)); - - one(service).updateSample(with(new BaseMatcher<SampleUpdatesDTO>() - { - @Override - public boolean matches(Object item) - { - if (item instanceof SampleUpdatesDTO) - { - SampleUpdatesDTO sampleUpdate = (SampleUpdatesDTO) item; - assertEquals(SAMPLE_ID, sampleUpdate.getSampleIdOrNull() - .getId().longValue()); - assertEquals(0, sampleUpdate.getAttachments().size()); - assertEquals(null, sampleUpdate.getContainerIdentifierOrNull()); - Assert.assertEquals( - sampleUpdate.getModifiedParentCodesOrNull(), - expectedModifiedParentCodesOrNull); - assertEquals(EXPERIMENT_IDENTIFIER, sampleUpdate - .getExperimentIdentifierOrNull().toString()); - assertEquals(SAMPLE_IDENTIFIER, sampleUpdate - .getSampleIdentifier().toString()); - List<IEntityProperty> properties = sampleUpdate.getProperties(); - assertEquals(SAMPLE_PROPERTY, properties.get(0) - .getPropertyType().getCode()); - assertEquals(newName == null ? "Albert" : newName, properties - .get(0).getValue()); - assertEquals(1, properties.size()); - return true; - } - return false; - } - - @Override - public void describeTo(Description description) - { - } - })); - } - }); - } - - private void save(Properties properties, String fileName) - { - File propertiesFile = new File(dataSet, fileName); - FileOutputStream outputStream = null; - try - { - outputStream = new FileOutputStream(propertiesFile); - properties.store(outputStream, null); - } catch (IOException ex) - { - throw CheckedExceptionTunnel.wrapIfNecessary(ex); - } finally - { - IOUtils.closeQuietly(outputStream); - } - } - - private SampleTypePropertyType createPropertyType(String key, boolean mandatory) - { - SampleTypePropertyType stpt = new SampleTypePropertyType(); - stpt.setMandatory(mandatory); - PropertyType propertyType = new PropertyType(); - propertyType.setCode(key); - stpt.setPropertyType(propertyType); - return stpt; - } - - private DataSetTypePropertyType createDataSetPropertyType(String key, boolean mandatory) - { - DataSetTypePropertyType etpt = new DataSetTypePropertyType(); - etpt.setMandatory(mandatory); - PropertyType propertyType = new PropertyType(); - propertyType.setCode(key); - etpt.setPropertyType(propertyType); - return etpt; - } - - private EntityProperty createProperty(String name, String value) - { - EntityProperty entityProperty = new EntityProperty(); - PropertyType propertyType = new PropertyType(); - propertyType.setCode(name); - entityProperty.setPropertyType(propertyType); - entityProperty.setValue(value); - return entityProperty; - } - - private AbstractExternalData createDataSet(String type, String code, int timestamp) - { - PhysicalDataSet ds = new PhysicalDataSet(); - ds.setDataSetType(new DataSetType(type)); - ds.setCode(code); - ds.setRegistrationDate(new Date(timestamp)); - return ds; - } - -} \ No newline at end of file diff --git a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/etlserver/proteomics/DataSetInfoExtractorForProteinResultsTest.java b/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/etlserver/proteomics/DataSetInfoExtractorForProteinResultsTest.java deleted file mode 100644 index a6d4275ff7f..00000000000 --- a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/etlserver/proteomics/DataSetInfoExtractorForProteinResultsTest.java +++ /dev/null @@ -1,479 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.etlserver.proteomics; - -import static ch.systemsx.cisd.openbis.etlserver.proteomics.DataSetInfoExtractorForProteinResults.DEFAULT_EXPERIMENT_TYPE_CODE; -import static ch.systemsx.cisd.openbis.etlserver.proteomics.DataSetInfoExtractorForProteinResults.EXPERIMENT_IDENTIFIER_KEY; -import static ch.systemsx.cisd.openbis.etlserver.proteomics.DataSetInfoExtractorForProteinResults.EXPERIMENT_PROPERTIES_FILE_NAME_KEY; -import static ch.systemsx.cisd.openbis.etlserver.proteomics.DataSetInfoExtractorForProteinResults.EXPERIMENT_TYPE_CODE_KEY; -import static ch.systemsx.cisd.openbis.etlserver.proteomics.DataSetInfoExtractorForProteinResults.PARENT_DATA_SET_CODES; - -import java.io.File; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; -import java.util.Properties; - -import org.hamcrest.BaseMatcher; -import org.hamcrest.Description; -import org.jmock.Expectations; -import org.jmock.Mockery; -import org.testng.annotations.AfterMethod; -import org.testng.annotations.BeforeMethod; -import org.testng.annotations.Test; - -import ch.rinn.restrictions.Friend; -import ch.systemsx.cisd.base.tests.AbstractFileSystemTestCase; -import ch.systemsx.cisd.common.exceptions.UserFailureException; -import ch.systemsx.cisd.common.filesystem.FileUtilities; -import ch.systemsx.cisd.common.test.RecordingMatcher; -import ch.systemsx.cisd.etlserver.IDataSetInfoExtractor; -import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService; -import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetInformation; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentType; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentTypePropertyType; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewExperiment; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PropertyType; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.builders.DataSetBuilder; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.builders.ExperimentBuilder; -import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ExperimentIdentifier; -import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ProjectIdentifier; - -/** - * @author Franz-Josef Elmer - */ -@Friend(toClasses = DataSetInfoExtractorForProteinResults.class) -public class DataSetInfoExtractorForProteinResultsTest extends AbstractFileSystemTestCase -{ - private static final String PARENT_DATA_SET_CODES_KEY = - DataSetInfoExtractorForProteinResults.PARENT_DATA_SET_CODES.toUpperCase(); - - private Mockery context; - - private IEncapsulatedOpenBISService service; - - private File dataSet; - - private File protXmlFile; - - @BeforeMethod - public void beforeMethod() - { - context = new Mockery(); - service = context.mock(IEncapsulatedOpenBISService.class); - dataSet = new File(workingDirectory, "space1&project1"); - dataSet.mkdirs(); - protXmlFile = new File(dataSet, "prot.xml"); - } - - @AfterMethod - public void afterMethod() - { - // To following line of code should also be called at the end of each test method. - // Otherwise one do not known which test failed. - context.assertIsSatisfied(); - } - - @Test - public void testWithNonDefaultExperimentTypeAndPropertiesFileName() - { - FileUtilities.writeToFile(protXmlFile, ""); - String propertiesFile = "my.properties"; - FileUtilities.writeToFile(new File(dataSet, propertiesFile), "answer=42\nblabla=blub\n" - + EXPERIMENT_IDENTIFIER_KEY + "= /TEST/PROJECT/EXP_TO_BE_IGNORED\n" - + PARENT_DATA_SET_CODES + "=1 2 3 4\n"); - Properties properties = new Properties(); - String experimentType = "MY_EXPERIMENT"; - properties.setProperty(EXPERIMENT_TYPE_CODE_KEY, experimentType); - properties.setProperty(EXPERIMENT_PROPERTIES_FILE_NAME_KEY, propertiesFile); - prepareGetDataSet("1"); - prepareGetDataSet("2"); - prepareGetDataSet("3"); - prepareGetDataSet("4"); - prepare(experimentType); - context.checking(new Expectations() - { - { - one(service).registerExperiment(with(any(NewExperiment.class))); - } - }); - - IDataSetInfoExtractor extractor = createExtractor(properties); - - DataSetInformation info = extractor.getDataSetInformation(dataSet, service); - - assertEquals("/SPACE1/PROJECT1/E4711", info.getExperimentIdentifier().toString()); - assertEquals("[1, 2, 3, 4]", info.getParentDataSetCodes().toString()); - context.assertIsSatisfied(); - } - - @Test - public void testWithProvidedExperimentCode() - { - FileUtilities.writeToFile(protXmlFile, ""); - String propertiesFile = "my.properties"; - FileUtilities.writeToFile(new File(dataSet, propertiesFile), "answer=42\nblabla=blub\n" - + DataSetInfoExtractorForProteinResults.EXPERIMENT_CODE_KEY + "= MY_EXP1\n"); - Properties properties = new Properties(); - String experimentType = "MY_EXPERIMENT"; - properties.setProperty(EXPERIMENT_TYPE_CODE_KEY, experimentType); - properties.setProperty(EXPERIMENT_PROPERTIES_FILE_NAME_KEY, propertiesFile); - prepare(experimentType, false); - context.checking(new Expectations() - { - { - one(service).registerExperiment(with(any(NewExperiment.class))); - } - }); - - IDataSetInfoExtractor extractor = createExtractor(properties); - - DataSetInformation info = extractor.getDataSetInformation(dataSet, service); - - assertEquals("/SPACE1/PROJECT1/MY_EXP1", info.getExperimentIdentifier().toString()); - context.assertIsSatisfied(); - } - - @Test - public void testRegistrationWithOneMandatoryProperty() - { - FileUtilities.writeToFile(protXmlFile, ""); - FileUtilities.writeToFile(new File(dataSet, - DataSetInfoExtractorForProteinResults.DEFAULT_EXPERIMENT_PROPERTIES_FILE_NAME), - "answer=42\nblabla=blub\n" + PARENT_DATA_SET_CODES + "=1 2 3 4\n"); - prepare(DEFAULT_EXPERIMENT_TYPE_CODE); - prepareGetDataSet("1"); - prepareGetDataSet("2"); - prepareGetDataSet("3"); - prepareGetDataSet("4"); - - context.checking(new Expectations() - { - { - one(service).registerExperiment(with(new BaseMatcher<NewExperiment>() - { - @Override - public boolean matches(Object item) - { - if (item instanceof NewExperiment) - { - NewExperiment experiment = (NewExperiment) item; - assertEquals(DEFAULT_EXPERIMENT_TYPE_CODE, - experiment.getExperimentTypeCode()); - IEntityProperty[] properties = experiment.getProperties(); - assertEquals(1, properties.length); - assertEquals("answer", properties[0].getPropertyType() - .getCode()); - assertEquals("42", properties[0].tryGetAsString()); - return true; - } - return false; - } - - @Override - public void describeTo(Description description) - { - } - })); - } - }); - - IDataSetInfoExtractor extractor = createExtractor(new Properties()); - DataSetInformation info = extractor.getDataSetInformation(dataSet, service); - - assertEquals("/SPACE1/PROJECT1/E4711", info.getExperimentIdentifier().toString()); - assertEquals("[1, 2, 3, 4]", info.getParentDataSetCodes().toString()); - context.assertIsSatisfied(); - } - - @Test - public void testRegistrationWithMissingProtXmlFile() - { - prepare(DEFAULT_EXPERIMENT_TYPE_CODE); - - IDataSetInfoExtractor extractor = createExtractor(new Properties()); - try - { - extractor.getDataSetInformation(dataSet, service); - fail("UserFailureException expected"); - } catch (UserFailureException ex) - { - assertEquals("No *prot.xml file found in data set '" + dataSet + "'.", ex.getMessage()); - } - - context.assertIsSatisfied(); - } - - @Test - public void testRegistrationWithMissingMandatoryProperty() - { - FileUtilities.writeToFile(protXmlFile, ""); - prepare(DEFAULT_EXPERIMENT_TYPE_CODE); - - IDataSetInfoExtractor extractor = createExtractor(new Properties()); - try - { - extractor.getDataSetInformation(dataSet, service); - fail("UserFailureException expected"); - } catch (UserFailureException ex) - { - assertEquals("The following mandatory properties are missed: [answer]", ex.getMessage()); - } - - context.assertIsSatisfied(); - } - - @Test - public void testWithParentDataSetsDefinedByBaseExperimentAndProtXmlFileTooLarge() - { - FileUtilities.writeToFile(protXmlFile, "abc"); - String propertiesFile = "my.properties"; - FileUtilities.writeToFile(new File(dataSet, propertiesFile), "answer=42\nblabla=blub\n" - + EXPERIMENT_IDENTIFIER_KEY + "= /TEST/PROJECT/EXP1\n"); - Properties properties = new Properties(); - String experimentType = "MY_EXPERIMENT"; - properties.setProperty(EXPERIMENT_TYPE_CODE_KEY, experimentType); - properties.setProperty(EXPERIMENT_PROPERTIES_FILE_NAME_KEY, propertiesFile); - properties.setProperty(DataSetInfoExtractorForProteinResults.PROT_XML_SIZE_THRESHOLD, "0"); - prepare(experimentType); - final RecordingMatcher<NewExperiment> experimentMatcher = new RecordingMatcher<NewExperiment>(); - context.checking(new Expectations() - { - { - one(service).tryGetExperiment( - new ExperimentIdentifier(new ProjectIdentifier("TEST", "PROJECT"), - "EXP1")); - Experiment experiment = new ExperimentBuilder().id(123789L).getExperiment(); - will(returnValue(experiment)); - - one(service).listDataSetsByExperimentID(experiment.getId()); - AbstractExternalData ds1 = new DataSetBuilder().code("ds1").getDataSet(); - AbstractExternalData ds2 = new DataSetBuilder().code("ds2").getDataSet(); - will(returnValue(Arrays.asList(ds1, ds2))); - - one(service).registerExperiment(with(experimentMatcher)); - } - }); - - IDataSetInfoExtractor extractor = createExtractor(properties); - - DataSetInformation info = extractor.getDataSetInformation(dataSet, service); - - assertEquals("/SPACE1/PROJECT1/E4711", info.getExperimentIdentifier().toString()); - assertEquals("[ds1, ds2]", info.getParentDataSetCodes().toString()); - IEntityProperty[] expProps = experimentMatcher.recordedObject().getProperties(); - assertEquals("Size of prot.xml file prot.xml is with 3 bytes too large. Maximum size is 0 bytes", - asMap(expProps).get(DataSetInfoExtractorForProteinResults.NOT_PROCESSED_PROPERTY).getValue()); - context.assertIsSatisfied(); - } - - @Test - public void testWithUnkownBaseExperiment() - { - FileUtilities.writeToFile(protXmlFile, ""); - String propertiesFile = "my.properties"; - FileUtilities.writeToFile(new File(dataSet, propertiesFile), "answer=42\nblabla=blub\n" - + EXPERIMENT_IDENTIFIER_KEY + "= /TEST/PROJECT/EXP1\n"); - Properties properties = new Properties(); - String experimentType = "MY_EXPERIMENT"; - properties.setProperty(EXPERIMENT_TYPE_CODE_KEY, experimentType); - properties.setProperty(EXPERIMENT_PROPERTIES_FILE_NAME_KEY, propertiesFile); - prepare(experimentType); - context.checking(new Expectations() - { - { - one(service).tryGetExperiment( - new ExperimentIdentifier(new ProjectIdentifier("TEST", "PROJECT"), - "EXP1")); - will(returnValue(null)); - - } - }); - - IDataSetInfoExtractor extractor = createExtractor(properties); - - try - { - extractor.getDataSetInformation(dataSet, service); - fail("UserFailureException expected."); - } catch (UserFailureException ex) - { - assertEquals("Unkown experiment /TEST/PROJECT/EXP1", ex.getMessage()); - } - context.assertIsSatisfied(); - } - - @Test - public void testWithUnkownParentDataSets() - { - FileUtilities.writeToFile(protXmlFile, ""); - String propertiesFile = "my.properties"; - FileUtilities.writeToFile(new File(dataSet, propertiesFile), "answer=42\nblabla=blub\n" - + EXPERIMENT_IDENTIFIER_KEY + "= /TEST/PROJECT/EXP1\n" + PARENT_DATA_SET_CODES_KEY - + " = ds1 ds2, ds3"); - Properties properties = new Properties(); - String experimentType = "MY_EXPERIMENT"; - properties.setProperty(EXPERIMENT_TYPE_CODE_KEY, experimentType); - properties.setProperty(EXPERIMENT_PROPERTIES_FILE_NAME_KEY, propertiesFile); - prepare(experimentType); - prepareGetDataSet("ds1"); - prepareGetDataSet("ds2", null); - prepareGetDataSet("ds3", null); - - IDataSetInfoExtractor extractor = createExtractor(properties); - - try - { - extractor.getDataSetInformation(dataSet, service); - fail("UserFailureException expected."); - } catch (UserFailureException ex) - { - assertEquals("Unknown data sets: ds2, ds3", ex.getMessage()); - } - context.assertIsSatisfied(); - } - - @Test - public void testWithParentDataSetsSeparatedBySpaces() - { - FileUtilities.writeToFile(protXmlFile, ""); - String propertiesFile = "my.properties"; - FileUtilities.writeToFile(new File(dataSet, propertiesFile), "answer=42\nblabla=blub\n" - + EXPERIMENT_IDENTIFIER_KEY + "= /TEST/PROJECT/EXP1\n" + PARENT_DATA_SET_CODES_KEY - + " = ds1 ds2"); - Properties properties = new Properties(); - String experimentType = "MY_EXPERIMENT"; - properties.setProperty(EXPERIMENT_TYPE_CODE_KEY, experimentType); - properties.setProperty(EXPERIMENT_PROPERTIES_FILE_NAME_KEY, propertiesFile); - prepare(experimentType); - prepareGetDataSet("ds1"); - prepareGetDataSet("ds2"); - context.checking(new Expectations() - { - { - one(service).registerExperiment(with(any(NewExperiment.class))); - } - }); - - IDataSetInfoExtractor extractor = createExtractor(properties); - - DataSetInformation info = extractor.getDataSetInformation(dataSet, service); - - assertEquals("/SPACE1/PROJECT1/E4711", info.getExperimentIdentifier().toString()); - assertEquals("[ds1, ds2]", info.getParentDataSetCodes().toString()); - context.assertIsSatisfied(); - } - - @Test - public void testWithParentDataSetsSeparatedByComma() - { - FileUtilities.writeToFile(protXmlFile, ""); - String propertiesFile = "my.properties"; - FileUtilities.writeToFile(new File(dataSet, propertiesFile), "answer=42\nblabla=blub\n" - + PARENT_DATA_SET_CODES_KEY + " = ds1,ds2"); - Properties properties = new Properties(); - String experimentType = "MY_EXPERIMENT"; - properties.setProperty(EXPERIMENT_TYPE_CODE_KEY, experimentType); - properties.setProperty(EXPERIMENT_PROPERTIES_FILE_NAME_KEY, propertiesFile); - prepare(experimentType); - prepareGetDataSet("ds1"); - prepareGetDataSet("ds2"); - context.checking(new Expectations() - { - { - one(service).registerExperiment(with(any(NewExperiment.class))); - } - }); - - IDataSetInfoExtractor extractor = createExtractor(properties); - - DataSetInformation info = extractor.getDataSetInformation(dataSet, service); - - assertEquals("/SPACE1/PROJECT1/E4711", info.getExperimentIdentifier().toString()); - assertEquals("[ds1, ds2]", info.getParentDataSetCodes().toString()); - context.assertIsSatisfied(); - } - - private void prepare(final String experimentType) - { - prepare(experimentType, true); - } - - private void prepare(final String experimentType, final boolean experimentCodeGenerated) - { - context.checking(new Expectations() - { - { - if (experimentCodeGenerated) - { - one(service).generateCodes("E", EntityKind.EXPERIMENT, 1); - will(returnValue(Collections.singletonList("E4711"))); - } - - one(service).getExperimentType(experimentType); - ExperimentType type = new ExperimentType(); - ExperimentTypePropertyType etpt1 = new ExperimentTypePropertyType(); - PropertyType propertyType1 = new PropertyType(); - propertyType1.setCode("answer"); - etpt1.setPropertyType(propertyType1); - etpt1.setMandatory(true); - ExperimentTypePropertyType etpt2 = new ExperimentTypePropertyType(); - PropertyType propertyType2 = new PropertyType(); - propertyType2.setCode(DataSetInfoExtractorForProteinResults.NOT_PROCESSED_PROPERTY); - etpt2.setPropertyType(propertyType2); - type.setExperimentTypePropertyTypes(Arrays.asList(etpt1, etpt2)); - will(returnValue(type)); - } - }); - } - - private void prepareGetDataSet(final String dataSetCode) - { - prepareGetDataSet(dataSetCode, new DataSetBuilder().code(dataSetCode).getDataSet()); - } - - private void prepareGetDataSet(final String dataSetCode, final AbstractExternalData data) - { - context.checking(new Expectations() - { - { - one(service).tryGetDataSet(dataSetCode); - will(returnValue(data)); - } - }); - } - - private Map<String, IEntityProperty> asMap(IEntityProperty[] properties) - { - Map<String, IEntityProperty> result = new HashMap<String, IEntityProperty>(); - for (IEntityProperty property : properties) - { - result.put(property.getPropertyType().getCode(), property); - } - return result; - } - - private IDataSetInfoExtractor createExtractor(Properties properties) - { - return new DataSetInfoExtractorForProteinResults(properties, service); - } -} diff --git a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/etlserver/proteomics/ProtXMLLoaderTest.java b/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/etlserver/proteomics/ProtXMLLoaderTest.java deleted file mode 100644 index a9664abc6a8..00000000000 --- a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/etlserver/proteomics/ProtXMLLoaderTest.java +++ /dev/null @@ -1,113 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.etlserver.proteomics; - -import java.io.File; -import java.util.List; - -import org.testng.annotations.Test; - -import ch.systemsx.cisd.common.filesystem.FileUtilities; -import ch.systemsx.cisd.openbis.etlserver.proteomics.ProtXMLLoader; -import ch.systemsx.cisd.openbis.etlserver.proteomics.dto.AminoAcidMass; -import ch.systemsx.cisd.openbis.etlserver.proteomics.dto.AnnotatedProtein; -import ch.systemsx.cisd.openbis.etlserver.proteomics.dto.Parameter; -import ch.systemsx.cisd.openbis.etlserver.proteomics.dto.Peptide; -import ch.systemsx.cisd.openbis.etlserver.proteomics.dto.PeptideModification; -import ch.systemsx.cisd.openbis.etlserver.proteomics.dto.Protein; -import ch.systemsx.cisd.openbis.etlserver.proteomics.dto.ProteinGroup; -import ch.systemsx.cisd.openbis.etlserver.proteomics.dto.ProteinProphetDetails; -import ch.systemsx.cisd.openbis.etlserver.proteomics.dto.ProteinSummary; -import ch.systemsx.cisd.openbis.etlserver.proteomics.dto.ProteinSummaryDataFilter; -import ch.systemsx.cisd.openbis.etlserver.proteomics.dto.ProteinSummaryHeader; - -/** - * @author Franz-Josef Elmer - */ -public class ProtXMLLoaderTest extends ProtXMLTestCase -{ - @Test - public void test() - { - File file = new File(workingDirectory, "test.xml"); - FileUtilities.writeToFile(file, EXAMPLE); - ProteinSummary summary = new ProtXMLLoader(true).readProtXML(file); - - ProteinSummaryHeader header = summary.getSummaryHeader(); - assertEquals("some/path/uniprot.HUMAN.v125.fasta", header.getReferenceDatabase()); - ProteinProphetDetails proteinProphet = - (ProteinProphetDetails) summary.getSummaryHeader().getProgramDetails().getSummary()[0]; - List<ProteinSummaryDataFilter> dataFilters = proteinProphet.getDataFilters(); - assertEquals(1, dataFilters.size()); - assertEquals(0.25, dataFilters.get(0).getMinProbability()); - assertEquals(1.0, dataFilters.get(0).getSensitivity()); - assertEquals(0.5, dataFilters.get(0).getFalsePositiveErrorRate()); - - List<ProteinGroup> groups = summary.getProteinGroups(); - assertEquals(2, groups.size()); - assertEquals(1.0, groups.get(0).getProbability()); - List<Protein> proteins = groups.get(0).getProteins(); - assertEquals(2, proteins.size()); - Protein protein1 = proteins.get(0); - assertEquals(1.0, protein1.getProbability()); - List<Parameter> parameters = protein1.getParameters(); - assertEquals(2, parameters.size()); - assertEquals("key1", parameters.get(0).getName()); - assertEquals("value1", parameters.get(0).getValue()); - assertEquals("type1", parameters.get(0).getType()); - assertEquals("key2", parameters.get(1).getName()); - assertEquals("value2", parameters.get(1).getValue()); - assertEquals("type2", parameters.get(1).getType()); - assertEquals("P42", protein1.getAnnotation().getDescription()); - List<AnnotatedProtein> indistinguishableProteins = protein1.getIndistinguishableProteins(); - assertEquals(2, indistinguishableProteins.size()); - assertEquals("P43", indistinguishableProteins.get(0).getAnnotation().getDescription()); - assertEquals("P44", indistinguishableProteins.get(1).getAnnotation().getDescription()); - List<Peptide> peptides = protein1.getPeptides(); - assertEquals(2, peptides.size()); - assertEquals("VYQIDGNYSR", peptides.get(0).getSequence()); - assertEquals(1, peptides.get(0).getModifications().size()); - PeptideModification peptideModification = peptides.get(0).getModifications().get(0); - assertEquals(42.0, peptideModification.getNTermMass()); - assertEquals(24.25, peptideModification.getCTermMass()); - List<AminoAcidMass> masses = peptideModification.getAminoAcidMasses(); - assertEquals(2, masses.size()); - assertEquals(1, masses.get(0).getPosition()); - assertEquals(115.25, masses.get(0).getMass()); - assertEquals(4, masses.get(1).getPosition()); - assertEquals(31.75, masses.get(1).getMass()); - assertEquals("ITSN", peptides.get(1).getSequence()); - assertEquals(0, peptides.get(1).getModifications().size()); - Protein protein2 = proteins.get(1); - assertEquals(0.0, protein2.getProbability()); - assertEquals("Q42", protein2.getAnnotation().getDescription()); - assertEquals(0, protein2.getIndistinguishableProteins().size()); - assertEquals(1, protein2.getPeptides().size()); - assertEquals("YSR", protein2.getPeptides().get(0).getSequence()); - assertEquals(0, protein2.getPeptides().get(0).getModifications().size()); - - assertEquals(0.75, groups.get(1).getProbability()); - assertEquals(1, groups.get(1).getProteins().size()); - Protein protein = groups.get(1).getProteins().get(0); - assertEquals(0.75, protein.getProbability()); - assertEquals("R42", protein.getAnnotation().getDescription()); - assertEquals(0, protein.getIndistinguishableProteins().size()); - assertEquals(1, protein.getPeptides().size()); - assertEquals("IYSR", protein.getPeptides().get(0).getSequence()); - assertEquals(0, protein.getPeptides().get(0).getModifications().size()); - } -} diff --git a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/etlserver/proteomics/ProtXMLTestCase.java b/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/etlserver/proteomics/ProtXMLTestCase.java deleted file mode 100644 index d94493700d8..00000000000 --- a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/etlserver/proteomics/ProtXMLTestCase.java +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.etlserver.proteomics; - -import ch.systemsx.cisd.base.tests.AbstractFileSystemTestCase; - -/** - * @author Franz-Josef Elmer - */ -public abstract class ProtXMLTestCase extends AbstractFileSystemTestCase -{ - - protected static final String EXAMPLE = - "<?xml version='1.0' encoding='UTF-8'?>\n" - + "<protein_summary xmlns='http://regis-web.systemsbiology.net/protXML' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' " - + - "xsi:schemaLocation='http://regis-web.systemsbiology.net/protXML http://sashimi.sourceforge.net/schema_revision/protXML/protXML_v5.xsd'>\n" - + "<protein_summary_header reference_database='some/path/uniprot.HUMAN.v125.fasta' residue_substitution_list='I -> L' " - + - "source_files='/home/lars/tmp/interact.pep.xml' source_files_alt='/home/lars/tmp/interact.pep.xml' min_peptide_probability='0.20' min_peptide_weight='0.50' num_predicted_correct_prots='755.6' num_input_1_spectra='0' num_input_2_spectra='77824' num_input_3_spectra='38201' num_input_4_spectra='0' num_input_5_spectra='0' initial_min_peptide_prob='0.05' total_no_spectrum_ids='104665.2' sample_enzyme='trypsin'>\n" - + " <program_details analysis='' time='2009-08-12T09:08:07'>\n" - + " <proteinprophet_details occam_flag='true' groups_flag='Y' degen_flag='Y' nsp_flag='Y' initial_peptide_wt_iters='2' " - + - "nsp_distribution_iters='2' final_peptide_wt_iters='4' run_options='XML'>\n" - + " <nsp_information neighboring_bin_smoothing='Y'>\n" - + " <nsp_distribution bin_no='0' nsp_lower_bound_incl='0.00' nsp_upper_bound_incl='0.00' pos_freq='0.003' neg_freq='0.320' pos_to_neg_ratio='0.01'/>\n" - + " </nsp_information>\n" - + " <ni_information>\n" - + " <ni_distribution bin_no='1' pos_freq='42' neg_freq='42' pos_to_neg_ratio='1'/>\n" - + " </ni_information>\n" - + " <protein_summary_data_filter min_probability='0.25' sensitivity='1' false_positive_error_rate='0.5' predicted_num_correct='9' " - + - "predicted_num_incorrect='4'/>\n" - + " </proteinprophet_details>\n" - + " </program_details>\n" - + "</protein_summary_header>\n" - + "<dataset_derivation generation_no='1'/>\n" - + "<protein_group probability='1' group_number='1'>\n" - + " <protein probability='1' protein_name='a' n_indistinguishable_proteins='3' group_sibling_id='0'>\n" - + " <parameter name='key1' value='value1' type='type1'/>\n" - + " <parameter name='key2' value='value2' type='type2'/>\n" - + " <annotation protein_description='P42'/>\n" - + " <indistinguishable_protein protein_name='a'><annotation protein_description='P43'/></indistinguishable_protein>\n" - + " <indistinguishable_protein protein_name='a'><annotation protein_description='P44'/></indistinguishable_protein>\n" - + " <peptide peptide_sequence='VYQIDGNYSR' charge='1' initial_probability='0' is_nondegenerate_evidence='true' n_enzymatic_termini='1' n_instances='1' is_contributing_evidence='N'>\n" - + " <modification_info mod_nterm_mass='42' mod_cterm_mass='24.25'>\n" - + " <mod_aminoacid_mass position='1' mass='115.25'/>\n" - + " <mod_aminoacid_mass position='4' mass='31.75'/>\n" - + " </modification_info>\n" - + " </peptide>\n" - + " <peptide peptide_sequence='ITSN' charge='1' initial_probability='0' is_nondegenerate_evidence='Y' n_enzymatic_termini='1' n_instances='1' is_contributing_evidence='N'/>\n" - + " </protein>\n" - + " <protein probability='0' protein_name='a' n_indistinguishable_proteins='1' group_sibling_id='1'>\n" - + " <annotation protein_description='Q42'/>\n" - + " <peptide peptide_sequence='YSR' charge='1' initial_probability='0' is_nondegenerate_evidence='Y' n_enzymatic_termini='1' n_instances='1' is_contributing_evidence='N'/>\n" - + " </protein>\n" - + "</protein_group>\n" - + "<protein_group probability='0.75' group_number='2'>\n" - + " <protein probability='0.75' protein_name='a' n_indistinguishable_proteins='1' group_sibling_id='2'>\n" - + " <annotation protein_description='R42'/>\n" - + " <peptide peptide_sequence='IYSR' charge='1' initial_probability='0' is_nondegenerate_evidence='Y' n_enzymatic_termini='1' n_instances='1' is_contributing_evidence='N'/>\n" - + " </protein>\n" - + "</protein_group>\n" - + "</protein_summary>\n"; - - /** - * - * - */ - public ProtXMLTestCase() - { - super(); - } - - /** - * @param cleanAfterMethod - */ - public ProtXMLTestCase(boolean cleanAfterMethod) - { - super(cleanAfterMethod); - } - -} \ No newline at end of file diff --git a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/etlserver/proteomics/ProtXMLUploaderTest.java b/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/etlserver/proteomics/ProtXMLUploaderTest.java deleted file mode 100644 index 28a17c1fff1..00000000000 --- a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/etlserver/proteomics/ProtXMLUploaderTest.java +++ /dev/null @@ -1,155 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.etlserver.proteomics; - -import java.io.File; -import java.util.Properties; - -import org.jmock.Mockery; -import org.testng.annotations.AfterMethod; -import org.testng.annotations.BeforeMethod; -import org.testng.annotations.Test; - -import ch.systemsx.cisd.common.filesystem.FileUtilities; -import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService; -import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetInformation; -import ch.systemsx.cisd.openbis.etlserver.proteomics.dto.ProteinSummary; -import ch.systemsx.cisd.openbis.etlserver.proteomics.dto.ProteinSummaryHeader; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.builders.ExperimentBuilder; - -/** - * @author Franz-Josef Elmer - */ -public class ProtXMLUploaderTest extends ProtXMLTestCase -{ - private static final class MockUploader extends ProtXMLUploader - { - private final IEncapsulatedOpenBISService openbisService; - - private DataSetInformation dataSetInformation; - - private ProteinSummary proteinSummary; - - public MockUploader(Properties properties, IEncapsulatedOpenBISService openbisService) - { - super(properties, openbisService); - this.openbisService = openbisService; - } - - @Override - protected ResultDataSetUploader createUploader() - { - return new ResultDataSetUploader(null, null, null, true, "+", false) - { - @Override - void upload(DataSetInformation dataSetInfo, ProteinSummary summary) - { - dataSetInformation = dataSetInfo; - proteinSummary = summary; - } - }; - } - - public IEncapsulatedOpenBISService getService() - { - return openbisService; - } - - public DataSetInformation getDataSetInformation() - { - return dataSetInformation; - } - - public ProteinSummary getProteinSummary() - { - return proteinSummary; - } - } - - private Mockery context; - - private IEncapsulatedOpenBISService service; - - private MockUploader uploader; - - @BeforeMethod - public void startUp() - { - context = new Mockery(); - service = context.mock(IEncapsulatedOpenBISService.class); - Properties properties = new Properties(); - properties.setProperty("database.kind", "test"); - uploader = new MockUploader(properties, service); - } - - @AfterMethod - public void afterMethod() - { - // To following line of code should also be called at the end of each test method. - // Otherwise one do not known which test failed. - context.assertIsSatisfied(); - } - - @Test - public void testDataSetIsProtXMLFile() - { - File file = new File(workingDirectory, "test.xml"); - FileUtilities.writeToFile(file, EXAMPLE); - DataSetInformation dataSetInformation = new DataSetInformation(); - - uploader.upload(file, dataSetInformation); - - assertSame(service, uploader.getService()); - assertSame(dataSetInformation, uploader.getDataSetInformation()); - ProteinSummaryHeader header = uploader.getProteinSummary().getSummaryHeader(); - assertEquals("some/path/uniprot.HUMAN.v125.fasta", header.getReferenceDatabase()); - context.assertIsSatisfied(); - } - - @Test - public void testDataSetIsFolderWithProtXMLFile() - { - File dataSet = new File(workingDirectory, "data-set"); - dataSet.mkdir(); - FileUtilities.writeToFile(new File(dataSet, "test-prot.xml"), EXAMPLE); - DataSetInformation dataSetInformation = new DataSetInformation(); - - uploader.upload(dataSet, dataSetInformation); - - assertSame(service, uploader.getService()); - assertSame(dataSetInformation, uploader.getDataSetInformation()); - ProteinSummaryHeader header = uploader.getProteinSummary().getSummaryHeader(); - assertEquals("some/path/uniprot.HUMAN.v125.fasta", header.getReferenceDatabase()); - context.assertIsSatisfied(); - } - - @Test - public void testDataSetIsFolderWithProtXMLFileToBeTooLarge() - { - File dataSet = new File(workingDirectory, "data-set"); - dataSet.mkdir(); - FileUtilities.writeToFile(new File(dataSet, "test-prot.xml"), EXAMPLE); - DataSetInformation dataSetInformation = new DataSetInformation(); - dataSetInformation.setExperiment(new ExperimentBuilder().property( - DataSetInfoExtractorForProteinResults.NOT_PROCESSED_PROPERTY, "too large").getExperiment()); - - uploader.upload(dataSet, dataSetInformation); - - assertEquals(null, uploader.getDataSetInformation()); - context.assertIsSatisfied(); - } -} diff --git a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/etlserver/proteomics/ProteinDescriptionTest.java b/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/etlserver/proteomics/ProteinDescriptionTest.java deleted file mode 100644 index 977515a90c1..00000000000 --- a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/etlserver/proteomics/ProteinDescriptionTest.java +++ /dev/null @@ -1,182 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.etlserver.proteomics; - -import org.testng.AssertJUnit; -import org.testng.annotations.Test; - -import ch.systemsx.cisd.common.exceptions.UserFailureException; -import ch.systemsx.cisd.openbis.etlserver.proteomics.ProteinDescription; -import ch.systemsx.cisd.openbis.etlserver.proteomics.dto.ProteinAnnotation; - -/** - * @author Franz-Josef Elmer - */ -public class ProteinDescriptionTest extends AssertJUnit -{ - @Test - public void testWithOutAccessionNumber() - { - ProteinAnnotation annotation = createAnnotation("Q92902"); - try - { - new ProteinDescription(annotation, 0, true); - fail("UserFailureException expected"); - } catch (UserFailureException ex) - { - assertEquals("Can not find a amino-acid sequence in following protein description: Q92902", ex.getMessage()); - } - } - - @Test - public void testWithAccessionNumberAndSequence() - { - ProteinAnnotation annotation = - createAnnotation("Q92902 \\ID=HPS1_HUMAN \\MODRES= " - + "\\VARIANT=(55|.|)(100|E|D)(186|A|V)(283|G|W)(480|A|T) " - + "\\NCBITAXID=9606 \\DE=Hermansky-Pudlak syndrome 1 protein " - + "\\SEQ=MKCVLVATEGAEVLFYWTDQEFEESLRLKFGQSENEEEELPA"); - ProteinDescription description = new ProteinDescription(annotation, 0, true); - assertEquals("Q92902", description.getAccessionNumber()); - assertEquals("Hermansky-Pudlak syndrome 1 protein", description.getDescription()); - assertEquals("MKCVLVATEGAEVLFYWTDQEFEESLRLKFGQSENEEEELPA", description.getSequence()); - } - - @Test - public void testWithSwissProtNameAsAccessionNumber() - { - ProteinAnnotation annotation = createAnnotation("my protein"); - ProteinDescription description = new ProteinDescription(annotation, 4711, false); - - assertEquals("my protein", description.getDescription()); - assertEquals("", description.getSequence()); - assertEquals("sp|swissprot-42", description.getAccessionNumber()); - } - - @Test - public void testWithTremblNameAsAccessionNumber() - { - ProteinAnnotation annotation = createAnnotation("my protein"); - annotation.setSwissprotName(null); - ProteinDescription description = new ProteinDescription(annotation, 4711, false); - - assertEquals("my protein", description.getDescription()); - assertEquals("", description.getSequence()); - assertEquals("tr|trembl-42", description.getAccessionNumber()); - } - - @Test - public void testWithIpiNameAsAccessionNumber() - { - ProteinAnnotation annotation = createAnnotation("my protein"); - annotation.setSwissprotName(null); - annotation.setTremblName(null); - ProteinDescription description = new ProteinDescription(annotation, 4711, false); - - assertEquals("my protein", description.getDescription()); - assertEquals("", description.getSequence()); - assertEquals("ipi|ipi-42", description.getAccessionNumber()); - } - - @Test - public void testWithEnsemblNameAsAccessionNumber() - { - ProteinAnnotation annotation = createAnnotation("my protein"); - annotation.setSwissprotName(null); - annotation.setTremblName(null); - annotation.setIpiName(null); - ProteinDescription description = new ProteinDescription(annotation, 4711, false); - - assertEquals("my protein", description.getDescription()); - assertEquals("", description.getSequence()); - assertEquals("ens|ensembl-42", description.getAccessionNumber()); - } - - @Test - public void testWithRefSeqNameAsAccessionNumber() - { - ProteinAnnotation annotation = createAnnotation("my protein"); - annotation.setSwissprotName(null); - annotation.setTremblName(null); - annotation.setIpiName(null); - annotation.setEnsemblName(null); - ProteinDescription description = new ProteinDescription(annotation, 4711, false); - - assertEquals("my protein", description.getDescription()); - assertEquals("", description.getSequence()); - assertEquals("rs|refseq-42", description.getAccessionNumber()); - } - - @Test - public void testWithLocusLinkNameAsAccessionNumber() - { - ProteinAnnotation annotation = createAnnotation("my protein"); - annotation.setSwissprotName(null); - annotation.setTremblName(null); - annotation.setIpiName(null); - annotation.setEnsemblName(null); - annotation.setRefseqName(null); - ProteinDescription description = new ProteinDescription(annotation, 4711, false); - - assertEquals("my protein", description.getDescription()); - assertEquals("", description.getSequence()); - assertEquals("ll|locus-link-42", description.getAccessionNumber()); - } - - @Test - public void testWithFlybaseNameAsAccessionNumber() - { - ProteinAnnotation annotation = createAnnotation("my protein"); - annotation.setSwissprotName(null); - annotation.setTremblName(null); - annotation.setIpiName(null); - annotation.setEnsemblName(null); - annotation.setRefseqName(null); - annotation.setLocusLinkName(null); - ProteinDescription description = new ProteinDescription(annotation, 4711, false); - - assertEquals("my protein", description.getDescription()); - assertEquals("", description.getSequence()); - assertEquals("fb|flybase-42", description.getAccessionNumber()); - } - - @Test - public void testWithNoAccessionNumber() - { - ProteinAnnotation annotation = new ProteinAnnotation(); - annotation.setDescription(""); - ProteinDescription description = new ProteinDescription(annotation, 4711, false); - - assertEquals("", description.getDescription()); - assertEquals("", description.getSequence()); - assertEquals("unknown|4711", description.getAccessionNumber()); - } - - private ProteinAnnotation createAnnotation(String description) - { - ProteinAnnotation proteinAnnotation = new ProteinAnnotation(); - proteinAnnotation.setDescription(description); - proteinAnnotation.setEnsemblName("ensembl-42"); - proteinAnnotation.setFlybase("flybase-42"); - proteinAnnotation.setIpiName("ipi-42"); - proteinAnnotation.setLocusLinkName("locus-link-42"); - proteinAnnotation.setRefseqName("refseq-42"); - proteinAnnotation.setSwissprotName("swissprot-42"); - proteinAnnotation.setTremblName("trembl-42"); - return proteinAnnotation; - } -} diff --git a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/etlserver/proteomics/ProteinResultDataSetParentLinkingTaskTest.java b/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/etlserver/proteomics/ProteinResultDataSetParentLinkingTaskTest.java deleted file mode 100644 index 9392844d0da..00000000000 --- a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/etlserver/proteomics/ProteinResultDataSetParentLinkingTaskTest.java +++ /dev/null @@ -1,178 +0,0 @@ -/* - * Copyright 2011 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.etlserver.proteomics; - -import java.util.Arrays; -import java.util.List; - -import org.apache.log4j.Level; -import org.jmock.Expectations; -import org.jmock.Mockery; -import org.testng.AssertJUnit; -import org.testng.annotations.AfterMethod; -import org.testng.annotations.BeforeMethod; -import org.testng.annotations.Test; - -import ch.systemsx.cisd.common.logging.BufferedAppender; -import ch.systemsx.cisd.common.test.RecordingMatcher; -import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PhysicalDataSet; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.builders.DataSetBuilder; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.builders.ExperimentBuilder; -import ch.systemsx.cisd.openbis.generic.shared.dto.AtomicEntityOperationDetails; -import ch.systemsx.cisd.openbis.generic.shared.dto.DataSetBatchUpdatesDTO; -import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ExperimentIdentifierFactory; -import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ProjectIdentifier; -import ch.systemsx.cisd.openbis.util.LogRecordingUtils; - -/** - * @author Franz-Josef Elmer - */ -public class ProteinResultDataSetParentLinkingTaskTest extends AssertJUnit -{ - private static final String PARENT_DATA_SET_CODES_KEY = - DataSetInfoExtractorForProteinResults.PARENT_DATA_SET_CODES.toUpperCase(); - - private static final String BASE_EXPERIMENT_KEY = - DataSetInfoExtractorForProteinResults.EXPERIMENT_IDENTIFIER_KEY.toUpperCase(); - - private BufferedAppender logRecorder; - - private Mockery context; - - private IEncapsulatedOpenBISService service; - - private ProteinResultDataSetParentLinkingTask task; - - @BeforeMethod - public void beforeMethod() - { - logRecorder = LogRecordingUtils.createRecorder("%-5p %c - %m%n", Level.DEBUG); - context = new Mockery(); - service = context.mock(IEncapsulatedOpenBISService.class); - task = new ProteinResultDataSetParentLinkingTask(service); - } - - @AfterMethod - public void afterMethod() - { - logRecorder.reset(); - // To following line of code should also be called at the end of each test method. - // Otherwise one do not known which test failed. - context.assertIsSatisfied(); - } - - @Test - public void test() - { - final Experiment e1 = - new ExperimentBuilder().id(1).identifier("/S/P1/E1").property("ABC", "non-sense") - .getExperiment(); - final Experiment e2 = - new ExperimentBuilder().id(2).identifier("/A/P2/E2") - .property(PARENT_DATA_SET_CODES_KEY, "non-sense2").getExperiment(); - final Experiment e3 = - new ExperimentBuilder().id(3).identifier("/A/P2/E3") - .property(PARENT_DATA_SET_CODES_KEY, "ds1, ds3").getExperiment(); - final Experiment e4 = - new ExperimentBuilder().id(4).identifier("/S/P1/E4") - .property(BASE_EXPERIMENT_KEY, "/S/P1/E1").getExperiment(); - final PhysicalDataSet ds1 = - new DataSetBuilder(1).code("ds1").fileFormat("A").experiment(e1) - .version(11).getDataSet(); - final PhysicalDataSet ds2 = - new DataSetBuilder(2).code("ds2").fileFormat("B").experiment(e4) - .version(22).getDataSet(); - final PhysicalDataSet ds3 = - new DataSetBuilder(3).code("ds3").fileFormat("C").experiment(e3) - .version(33).property("ALPHA", "3.1").getDataSet(); - final RecordingMatcher<AtomicEntityOperationDetails> operationRecorder = - new RecordingMatcher<AtomicEntityOperationDetails>(); - context.checking(new Expectations() - { - { - one(service).listProjects(); - will(returnValue(Arrays.asList(e1.getProject(), e2.getProject()))); - - one(service).listExperiments(new ProjectIdentifier("S", "P1")); - will(returnValue(Arrays.asList(e1, e4))); - - one(service).listExperiments(new ProjectIdentifier("A", "P2")); - will(returnValue(Arrays.asList(e2, e3))); - - one(service).tryGetExperiment(ExperimentIdentifierFactory.parse("/S/P1/E1")); - will(returnValue(e1)); - - one(service).tryGetDataSet("non-sense2"); - will(returnValue(null)); - - one(service).tryGetDataSet("ds1"); - will(returnValue(ds1)); - - one(service).tryGetDataSet("ds3"); - will(returnValue(ds3)); - - one(service).listDataSetsByExperimentID(e1.getId()); - will(returnValue(Arrays.asList(ds1))); - - one(service).listDataSetsByExperimentID(e3.getId()); - will(returnValue(Arrays.asList(ds3))); - - one(service).listDataSetsByExperimentID(e4.getId()); - will(returnValue(Arrays.asList(ds2))); - - one(service).performEntityOperations(with(operationRecorder)); - } - }); - - task.execute(); - - assertEquals("INFO OPERATION.ProteinResultDataSetParentLinkingTask - " - + "Parent data set links of data set ds2 " - + "from experiment /S/P1/E4 will be updated.\n" - + "INFO OPERATION.ProteinResultDataSetParentLinkingTask - " - + "Parent data set links of data set ds3 " - + "from experiment /A/P2/E3 will be updated.\n" - + "INFO OPERATION.ProteinResultDataSetParentLinkingTask - " - + "Parent data set links for 2 data sets have been updated.", - logRecorder.getLogContent()); - List<DataSetBatchUpdatesDTO> dataSetUpdates = - operationRecorder.recordedObject().getDataSetUpdates(); - assertEquals(2L, dataSetUpdates.get(0).getDatasetId().getId().longValue()); - assertEquals(22, dataSetUpdates.get(0).getVersion()); - assertEquals("B", dataSetUpdates.get(0).getFileFormatTypeCode()); - assertEquals("[]", dataSetUpdates.get(0).getProperties().toString()); - assertEquals(e4.getIdentifier(), dataSetUpdates.get(0).getExperimentIdentifierOrNull() - .toString()); - assertEquals("[ds1]", - Arrays.asList(dataSetUpdates.get(0).getModifiedParentDatasetCodesOrNull()) - .toString()); - assertEquals(3L, dataSetUpdates.get(1).getDatasetId().getId().longValue()); - assertEquals(33, dataSetUpdates.get(1).getVersion()); - assertEquals("C", dataSetUpdates.get(1).getFileFormatTypeCode()); - assertEquals("[ALPHA: 3.1]", dataSetUpdates.get(1).getProperties().toString()); - assertEquals(e3.getIdentifier(), dataSetUpdates.get(1).getExperimentIdentifierOrNull() - .toString()); - assertEquals("[ds1, ds3]", - Arrays.asList(dataSetUpdates.get(1).getModifiedParentDatasetCodesOrNull()) - .toString()); - assertEquals(2, dataSetUpdates.size()); - context.assertIsSatisfied(); - } - -} diff --git a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/etlserver/proteomics/ResultDataSetUploaderTest.java b/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/etlserver/proteomics/ResultDataSetUploaderTest.java deleted file mode 100644 index fb70ac7b248..00000000000 --- a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/etlserver/proteomics/ResultDataSetUploaderTest.java +++ /dev/null @@ -1,705 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.etlserver.proteomics; - -import java.sql.Connection; -import java.sql.SQLException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; - -import org.hamcrest.BaseMatcher; -import org.hamcrest.Description; -import org.hamcrest.core.IsNull; -import org.jmock.Expectations; -import org.jmock.Mockery; -import org.testng.AssertJUnit; -import org.testng.annotations.AfterMethod; -import org.testng.annotations.BeforeMethod; -import org.testng.annotations.Test; - -import ch.systemsx.cisd.base.exceptions.CheckedExceptionTunnel; -import ch.systemsx.cisd.common.exceptions.UserFailureException; -import ch.systemsx.cisd.common.test.AssertionUtil; -import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService; -import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetInformation; -import ch.systemsx.cisd.openbis.etlserver.proteomics.dto.AminoAcidMass; -import ch.systemsx.cisd.openbis.etlserver.proteomics.dto.AnnotatedProtein; -import ch.systemsx.cisd.openbis.etlserver.proteomics.dto.DataSet; -import ch.systemsx.cisd.openbis.etlserver.proteomics.dto.Database; -import ch.systemsx.cisd.openbis.etlserver.proteomics.dto.Experiment; -import ch.systemsx.cisd.openbis.etlserver.proteomics.dto.Parameter; -import ch.systemsx.cisd.openbis.etlserver.proteomics.dto.Peptide; -import ch.systemsx.cisd.openbis.etlserver.proteomics.dto.PeptideModification; -import ch.systemsx.cisd.openbis.etlserver.proteomics.dto.ProgramDetails; -import ch.systemsx.cisd.openbis.etlserver.proteomics.dto.Protein; -import ch.systemsx.cisd.openbis.etlserver.proteomics.dto.ProteinAnnotation; -import ch.systemsx.cisd.openbis.etlserver.proteomics.dto.ProteinGroup; -import ch.systemsx.cisd.openbis.etlserver.proteomics.dto.ProteinProphetDetails; -import ch.systemsx.cisd.openbis.etlserver.proteomics.dto.ProteinReference; -import ch.systemsx.cisd.openbis.etlserver.proteomics.dto.ProteinSummary; -import ch.systemsx.cisd.openbis.etlserver.proteomics.dto.ProteinSummaryDataFilter; -import ch.systemsx.cisd.openbis.etlserver.proteomics.dto.ProteinSummaryHeader; -import ch.systemsx.cisd.openbis.etlserver.proteomics.dto.Sequence; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewSample; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Space; -import ch.systemsx.cisd.openbis.generic.shared.dto.ListSamplesByPropertyCriteria; -import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ExperimentIdentifier; -import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifier; -import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SpaceIdentifier; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.CommonConstants; - -/** - * @author Franz-Josef Elmer - */ -public class ResultDataSetUploaderTest extends AssertJUnit -{ - private static final long MOD_PEPTIDE_ID = 101L; - - private static final long PEPTIDE_ID = 99L; - - private static final long CELL_LYSATE_ID1 = 88L; - - private static final String CELL_LYSATE1 = "cell_lysate1"; - - private static final String CELL_LYSATE_PERM_ID1 = "c1"; - - private static final long SEQUENCE_ID = 77L; - - private static final long PROTEIN_REFERENCE_ID = 66L; - - private static final String UNIPROT_ID1 = "unipr1"; - - private static final String PROTEIN_NAME1 = "my protein"; - - private static final String SEQUENCE1 = "seq"; - - private static final String UNIPROT_ID2 = "unipr2"; - - private static final String PROTEIN_NAME2 = "my 2. protein"; - - private static final String SEQUENCE2 = "seqe"; - - private static final long PROTEIN1_ID = 55L; - - private static final long DATA_SET_ID = 42L; - - private static final String DATA_SET_CODE = "ds1"; - - private static final long DATABASE_ID = 33l; - - private static final String NAME_AND_VERSION = "uniprot.HUMAN.v123.fasta"; - - private static final String REFERENCE_DATABASE = "/here/and/there/" + NAME_AND_VERSION; - - private static final String EXPERIMENT_CODE = "E1"; - - private static final long EXPERIMENT_ID = 11l; - - private static final String EXPERIMENT_PERM_ID = "e1234"; - - private static final String SAMPLE_PERM_ID = "s1234"; - - private static final String DB_INSTANCE = "DB"; - - private static final String SPACE_CODE = "S1"; - - private static final String PROJECT_CODE = "P1"; - - private Mockery context; - - private Connection connection; - - private IEncapsulatedOpenBISService service; - - private IProtDAO dao; - - private ResultDataSetUploader uploader; - - @BeforeMethod - public void beforeMethod() - { - context = new Mockery(); - connection = context.mock(Connection.class); - dao = context.mock(IProtDAO.class); - service = context.mock(IEncapsulatedOpenBISService.class); - - uploader = new ResultDataSetUploader(dao, connection, service, true, "+", false); - } - - @AfterMethod - public void afterMethod() - { - // To following line of code should also be called at the end of each test method. - // Otherwise one do not known which test failed. - context.assertIsSatisfied(); - } - - @Test - public void testNoProteinsGetExperimentSampleDatabaseAndDataSet() - { - context.checking(new Expectations() - { - { - one(dao).tryToGetExperimentByPermID(EXPERIMENT_PERM_ID); - Experiment experiment = new Experiment(); - experiment.setPermID(EXPERIMENT_PERM_ID); - experiment.setId(EXPERIMENT_ID); - will(returnValue(experiment)); - - one(dao).tryToGetDatabaseByName(NAME_AND_VERSION); - Database database = new Database(); - database.setNameAndVersion(NAME_AND_VERSION); - database.setId(DATABASE_ID); - will(returnValue(database)); - - one(dao).tryToGetDataSetByPermID(DATA_SET_CODE); - DataSet dataSet = new DataSet(); - dataSet.setId(DATA_SET_ID); - dataSet.setDatabaseID(DATABASE_ID); - will(returnValue(dataSet)); - } - }); - - uploader.upload(createDataSetInfo(), createProteinSummary()); - - context.assertIsSatisfied(); - } - - @Test - public void testNoProteinsCreateExperimentSampleDatabaseAndDataSet() - { - prepareForCreatingExperimentSampleDatabaseAndDataSet(); - - uploader.upload(createDataSetInfo(), createProteinSummary()); - - context.assertIsSatisfied(); - } - - @Test - public void testEmptyProteinGroup() - { - prepareForCreatingExperimentSampleDatabaseAndDataSet(); - - ProteinSummary summary = createProteinSummary(); - summary.getProteinGroups().add(createProteinGroup()); - uploader.upload(createDataSetInfo(), summary); - - context.assertIsSatisfied(); - } - - @Test - public void testProteinWithIndistiguishableProtein() - { - prepareForCreatingExperimentSampleDatabaseAndDataSet(); - double probability = 1.0; - prepareForCreatingProtein(probability); - ProteinAnnotation a1 = createAnnotation(UNIPROT_ID1, PROTEIN_NAME1, SEQUENCE1); - prepareForCreatingIdentifiedProtein(a1, false, true); - ProteinAnnotation a2 = createAnnotation(UNIPROT_ID2, PROTEIN_NAME2, SEQUENCE2); - prepareForCreatingIdentifiedProtein(a2, true, false); - - ProteinSummary summary = createProteinSummary(); - Protein p1 = createProtein(probability, a1, a2); - p1.setPeptides(Collections.<Peptide> emptyList()); - summary.getProteinGroups().add(createProteinGroup(p1)); - - uploader.upload(createDataSetInfo(), summary); - context.assertIsSatisfied(); - } - - @Test - public void testProteinGroupWithTwoProteins() - { - prepareForCreatingExperimentSampleDatabaseAndDataSet(); - double probability = 1.0; - ProteinAnnotation a1 = createAnnotation(UNIPROT_ID1, PROTEIN_NAME1, SEQUENCE1); - prepareForCreatingProtein(probability); - prepareForCreatingIdentifiedProtein(a1, false, true); - Protein p1 = createProtein(probability, a1); - p1.setPeptides(Collections.<Peptide> emptyList()); - ProteinAnnotation a2 = createAnnotation(UNIPROT_ID2, PROTEIN_NAME2, SEQUENCE2); - probability = 0.99; - prepareForCreatingProtein(probability); - prepareForCreatingIdentifiedProtein(a2, false, true); - Protein p2 = createProtein(probability, a2); - p2.setPeptides(Collections.<Peptide> emptyList()); - - ProteinSummary summary = createProteinSummary(); - summary.getProteinGroups().add(createProteinGroup(p1, p2)); - - uploader.upload(createDataSetInfo(), summary); - context.assertIsSatisfied(); - } - - @Test - public void testAbundancesForSameSampleInTwoDifferentProteins() - { - prepareForCreatingExperimentSampleDatabaseAndDataSet(); - double probability = 0.75; - ProteinSummary summary = createProteinSummary(); - prepareForCreatingProtein(probability); - ProteinAnnotation a1 = createAnnotation(UNIPROT_ID1, PROTEIN_NAME1, SEQUENCE1); - prepareForCreatingIdentifiedProtein(a1, false, true); - Protein p1 = createProtein(probability, a1); - p1.setName(PROTEIN_NAME1); - p1.getParameters().add(createAbundance(CELL_LYSATE1, 2.5)); - p1.getParameters().add(new Parameter()); - prepareCreateSample(); - context.checking(new Expectations() - { - { - one(service).registerSample(with(any(NewSample.class)), with(new IsNull<String>())); - - one(dao).createAbundance(PROTEIN1_ID, CELL_LYSATE_ID1, 2.5); - } - }); - p1.setPeptides(Collections.<Peptide> emptyList()); - - prepareForCreatingProtein(probability); - summary.getProteinGroups().add(createProteinGroup(p1)); - ProteinAnnotation a2 = createAnnotation(UNIPROT_ID2, PROTEIN_NAME2, SEQUENCE2); - prepareForCreatingIdentifiedProtein(a2, false, true); - Protein p2 = createProtein(probability, a2); - p2.setName(PROTEIN_NAME1); - p2.getParameters().add(createAbundance(CELL_LYSATE1, 42.5)); - context.checking(new Expectations() - { - { - one(dao).createAbundance(PROTEIN1_ID, CELL_LYSATE_ID1, 42.5); - } - }); - p2.setPeptides(Collections.<Peptide> emptyList()); - summary.getProteinGroups().add(createProteinGroup(p2)); - prepareForCommit(); - - uploader.upload(createDataSetInfo(), summary); - uploader.commit(); - context.assertIsSatisfied(); - } - - @Test - public void testAbundancesForNonExistingSample() - { - prepareForCreatingExperimentSampleDatabaseAndDataSet(); - double probability = 0.75; - prepareForCreatingProtein(probability); - ProteinSummary summary = createProteinSummary(); - Protein p1 = createProtein(probability); - p1.setName(PROTEIN_NAME1); - p1.getParameters().add(createAbundance(CELL_LYSATE1, 2.5)); - p1.getParameters().add(new Parameter()); - final SpaceIdentifier groupIdentifier = new SpaceIdentifier(CommonConstants.MS_DATA_SPACE); - final SampleIdentifier sampleIdentifier = - new SampleIdentifier(groupIdentifier, CELL_LYSATE1); - final ListSamplesByPropertyCriteria criteria = - new ListSamplesByPropertyCriteria(AbstractSampleHandler.MZXML_FILENAME, CELL_LYSATE1, - SPACE_CODE, null); - context.checking(new Expectations() - { - { - one(service).tryGetSampleWithExperiment(sampleIdentifier); - will(returnValue(null)); - - one(service).listSamplesByCriteria( - with(new BaseMatcher<ListSamplesByPropertyCriteria>() - { - @Override - public boolean matches(Object item) - { - return criteria.toString().equals(item.toString()); - } - - @Override - public void describeTo(Description description) - { - description.appendValue(criteria); - } - })); - } - }); - p1.setPeptides(Collections.<Peptide> emptyList()); - summary.getProteinGroups().add(createProteinGroup(p1)); - prepareForRollback(); - - try - { - uploader.upload(createDataSetInfo(), summary); - fail("UserFailureException expected"); - } catch (UserFailureException ex) - { - AssertionUtil.assertContains("Protein '" + PROTEIN_NAME1 - + "' has an abundance value for an unidentified sample: " + CELL_LYSATE1, ex - .getMessage()); - } - - context.assertIsSatisfied(); - } - - @Test - public void testProteinWithUnmodifiedPeptide() - { - prepareForCreatingExperimentSampleDatabaseAndDataSet(); - double probability = 1.0; - prepareForCreatingProtein(probability); - ProteinAnnotation a1 = createAnnotation(UNIPROT_ID1, PROTEIN_NAME1, SEQUENCE1); - prepareForCreatingIdentifiedProtein(a1, false, true); - - ProteinSummary summary = createProteinSummary(); - Protein p1 = createProtein(probability, a1); - final Peptide peptide = new Peptide(); - peptide.setSequence("abcd"); - peptide.setCharge(3); - p1.setPeptides(Arrays.asList(peptide)); - summary.getProteinGroups().add(createProteinGroup(p1)); - context.checking(new Expectations() - { - { - one(dao).createPeptide(PROTEIN1_ID, peptide.getSequence(), peptide.getCharge()); - will(returnValue(PEPTIDE_ID)); - } - }); - - uploader.upload(createDataSetInfo(), summary); - - context.assertIsSatisfied(); - } - - @Test - public void testProteinWithModifiedPeptide() - { - prepareForCreatingExperimentSampleDatabaseAndDataSet(); - double probability = 1.0; - prepareForCreatingProtein(probability); - ProteinAnnotation a1 = createAnnotation(UNIPROT_ID1, PROTEIN_NAME1, SEQUENCE1); - prepareForCreatingIdentifiedProtein(a1, false, true); - - ProteinSummary summary = createProteinSummary(); - Protein p1 = createProtein(probability, a1); - final Peptide peptide = new Peptide(); - peptide.setSequence("abcd"); - peptide.setCharge(3); - final PeptideModification modification = new PeptideModification(); - modification.setNTermMass(42); - modification.setCTermMass(4711); - final AminoAcidMass mass = new AminoAcidMass(); - mass.setMass(123); - mass.setPosition(1); - modification.setAminoAcidMasses(Arrays.asList(mass)); - peptide.getModifications().add(modification); - p1.setPeptides(Arrays.asList(peptide)); - summary.getProteinGroups().add(createProteinGroup(p1)); - context.checking(new Expectations() - { - { - one(dao).createPeptide(PROTEIN1_ID, peptide.getSequence(), peptide.getCharge()); - will(returnValue(PEPTIDE_ID)); - - one(dao).createModifiedPeptide(PEPTIDE_ID, modification.getNTermMass(), - modification.getCTermMass()); - will(returnValue(MOD_PEPTIDE_ID)); - - one(dao).createModification(MOD_PEPTIDE_ID, mass.getPosition(), mass.getMass()); - } - }); - - uploader.upload(createDataSetInfo(), summary); - - context.assertIsSatisfied(); - } - - @Test - public void testProteinWithPeptideWithModificationParameter() - { - prepareForCreatingExperimentSampleDatabaseAndDataSet(); - double probability = 1.0; - prepareForCreatingProtein(probability); - ProteinAnnotation a1 = createAnnotation(UNIPROT_ID1, PROTEIN_NAME1, SEQUENCE1); - prepareForCreatingIdentifiedProtein(a1, false, true); - - ProteinSummary summary = createProteinSummary(); - Protein p1 = createProtein(probability, a1); - final Peptide peptide = new Peptide(); - Parameter parameter = new Parameter(); - parameter.setName(CELL_LYSATE1); - parameter.setValue("2:9.5:0.125"); - parameter.setType(ResultDataSetUploader.PARAMETER_TYPE_MODIFICATION); - peptide.setParameters(Arrays.asList(parameter)); - peptide.setSequence("abcd"); - peptide.setCharge(3); - p1.setPeptides(Arrays.asList(peptide)); - summary.getProteinGroups().add(createProteinGroup(p1)); - prepareCreateSample(); - context.checking(new Expectations() - { - { - one(dao).createPeptide(PROTEIN1_ID, peptide.getSequence(), peptide.getCharge()); - will(returnValue(PEPTIDE_ID)); - - one(dao).createModifiedPeptide(PEPTIDE_ID, 0, 0); - will(returnValue(MOD_PEPTIDE_ID)); - - one(dao).createModification(MOD_PEPTIDE_ID, 2, 9.5); - will(returnValue(157L)); - - one(dao).createModificationFraction(157L, CELL_LYSATE_ID1, 0.125); - } - }); - - uploader.upload(createDataSetInfo(), summary); - - context.assertIsSatisfied(); - } - - private Parameter createAbundance(String sampleCode, double value) - { - Parameter parameter = new Parameter(); - parameter.setName(sampleCode); - parameter.setValue(Double.toString(value)); - parameter.setType(ResultDataSetUploader.PARAMETER_TYPE_ABUNDANCE); - return parameter; - } - - private Protein createProtein(double probability, ProteinAnnotation... annotations) - { - Protein protein = new Protein(); - protein.setProbability(probability); - if (annotations.length > 0) - { - protein.setAnnotation(annotations[0]); - } - List<AnnotatedProtein> indistinguishableProteins = new ArrayList<AnnotatedProtein>(); - for (int i = 1; i < annotations.length; i++) - { - AnnotatedProtein annotatedProtein = new AnnotatedProtein(); - annotatedProtein.setAnnotation(annotations[i]); - indistinguishableProteins.add(annotatedProtein); - } - protein.setIndistinguishableProteins(indistinguishableProteins); - return protein; - } - - private ProteinAnnotation createAnnotation(String uniprotID, String description, String sequence) - { - ProteinAnnotation proteinAnnotation = new ProteinAnnotation(); - proteinAnnotation.setDescription(uniprotID - + " " - + ProteinDescription.createKeyValuePair(ProteinDescription.DESCRIPTION_KEY, - description) + " " - + ProteinDescription.createKeyValuePair(ProteinDescription.SEQUENCE_KEY, sequence)); - return proteinAnnotation; - } - - private ProteinGroup createProteinGroup(Protein... proteins) - { - ProteinGroup proteinGroup = new ProteinGroup(); - proteinGroup.setProteins(Arrays.asList(proteins)); - return proteinGroup; - } - - private void prepareForCreatingProtein(final double probability) - { - context.checking(new Expectations() - { - { - one(dao).createProtein(DATA_SET_ID, probability); - will(returnValue(PROTEIN1_ID)); - } - }); - } - - private void prepareCreateSample() - { - context.checking(new Expectations() - { - { - one(service).tryGetSampleWithExperiment( - new SampleIdentifier(new SpaceIdentifier( - CommonConstants.MS_DATA_SPACE), CELL_LYSATE1)); - ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample sample = - new ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample(); - sample.setPermId(CELL_LYSATE_PERM_ID1); - will(returnValue(sample)); - one(dao).tryToGetSampleByPermID(CELL_LYSATE_PERM_ID1); - will(returnValue(null)); - one(dao).createSample(EXPERIMENT_ID, CELL_LYSATE_PERM_ID1); - will(returnValue(CELL_LYSATE_ID1)); - } - }); - } - - private void prepareForCreatingIdentifiedProtein(ProteinAnnotation annotation, - final boolean referenceExist, final boolean primary) - { - ProteinDescription proteinDescription = new ProteinDescription(annotation, 0, true); - final String uniprotID = proteinDescription.getAccessionNumber(); - final String description = proteinDescription.getDescription(); - final String sequence = proteinDescription.getSequence(); - context.checking(new Expectations() - { - { - one(dao).tryToGetProteinReference(uniprotID); - if (referenceExist == false) - { - will(returnValue(null)); - - one(dao).createProteinReference(uniprotID, description); - will(returnValue(PROTEIN_REFERENCE_ID)); - } else - { - ProteinReference proteinReference = new ProteinReference(); - proteinReference.setId(PROTEIN_REFERENCE_ID); - will(returnValue(proteinReference)); - - one(dao).updateProteinReferenceDescription(PROTEIN_REFERENCE_ID, - description); - } - - one(dao).tryToGetSequencesByReferenceAndDatabase(PROTEIN_REFERENCE_ID, - DATABASE_ID); - Sequence seq = new Sequence(sequence); - seq.setId(SEQUENCE_ID); - if (referenceExist == false) - { - will(returnValue(null)); - - seq.setDatabaseID(DATABASE_ID); - seq.setProteinReferenceID(PROTEIN_REFERENCE_ID); - one(dao).createSequence(seq); - will(returnValue(SEQUENCE_ID)); - } else - { - will(returnValue(Arrays.asList(seq))); - } - - one(dao).createIdentifiedProtein(PROTEIN1_ID, SEQUENCE_ID, 0, primary); - } - }); - } - - private void prepareForCreatingExperimentSampleDatabaseAndDataSet() - { - context.checking(new Expectations() - { - { - one(dao).tryToGetExperimentByPermID(EXPERIMENT_PERM_ID); - will(returnValue(null)); - one(dao).createExperiment(EXPERIMENT_PERM_ID); - will(returnValue(EXPERIMENT_ID)); - - one(dao).tryToGetDatabaseByName(NAME_AND_VERSION); - will(returnValue(null)); - one(dao).createDatabase(NAME_AND_VERSION); - will(returnValue(DATABASE_ID)); - - one(dao).tryToGetDataSetByPermID(DATA_SET_CODE); - will(returnValue(null)); - one(dao).createDataSet(EXPERIMENT_ID, DATA_SET_CODE, DATABASE_ID); - will(returnValue(DATA_SET_ID)); - } - }); - } - - private void prepareForCommit() - { - context.checking(new Expectations() - { - { - try - { - one(connection).commit(); - one(connection).close(); - } catch (SQLException ex) - { - throw CheckedExceptionTunnel.wrapIfNecessary(ex); - } - } - }); - } - - private void prepareForRollback() - { - context.checking(new Expectations() - { - { - try - { - one(connection).isClosed(); - will(returnValue(false)); - one(connection).rollback(); - one(connection).close(); - } catch (SQLException ex) - { - throw CheckedExceptionTunnel.wrapIfNecessary(ex); - } - } - }); - } - - private DataSetInformation createDataSetInfo() - { - DataSetInformation info = new DataSetInformation(); - info.setExperimentIdentifier(new ExperimentIdentifier(SPACE_CODE, PROJECT_CODE, EXPERIMENT_CODE)); - info.setDataSetCode(DATA_SET_CODE); - ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample sample = - new ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample(); - sample.setPermId(SAMPLE_PERM_ID); - ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment experiment = - new ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment(); - experiment.setPermId(EXPERIMENT_PERM_ID); - sample.setExperiment(experiment); - Space space = new Space(); - space.setCode(SPACE_CODE); - sample.setSpace(space); - info.setSample(sample); - return info; - } - - private ProteinSummary createProteinSummary() - { - ProteinSummary proteinSummary = new ProteinSummary(); - ProteinSummaryHeader proteinSummaryHeader = new ProteinSummaryHeader(); - proteinSummaryHeader.setReferenceDatabase(REFERENCE_DATABASE); - ProgramDetails programDetails = new ProgramDetails(); - ProteinProphetDetails proteinProphetDetails = new ProteinProphetDetails(); - ProteinSummaryDataFilter m1 = createFilter(0.5, 0.125); - ProteinSummaryDataFilter m2 = createFilter(1.0, 0.0); - proteinProphetDetails.setDataFilters(Arrays.asList(m1, m2)); - programDetails.setSummary(new Object[] - { proteinProphetDetails }); - proteinSummaryHeader.setProgramDetails(programDetails); - proteinSummary.setSummaryHeader(proteinSummaryHeader); - proteinSummary.setProteinGroups(new ArrayList<ProteinGroup>()); - return proteinSummary; - } - - private ProteinSummaryDataFilter createFilter(final double probability, final double fdr) - { - context.checking(new Expectations() - { - { - one(dao).createProbabilityToFDRMapping(DATA_SET_ID, probability, fdr); - } - }); - ProteinSummaryDataFilter mapping = new ProteinSummaryDataFilter(); - mapping.setMinProbability(probability); - mapping.setFalsePositiveErrorRate(fdr); - return mapping; - } - -} diff --git a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/etlserver/proteomics/TypeExtractorForMSInjectionTest.java b/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/etlserver/proteomics/TypeExtractorForMSInjectionTest.java deleted file mode 100644 index d1ec3a35ec2..00000000000 --- a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/etlserver/proteomics/TypeExtractorForMSInjectionTest.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.etlserver.proteomics; - -import static ch.systemsx.cisd.openbis.etlserver.proteomics.DataSetInfoExtractorForMSInjection.DATA_SET_PROPERTIES_FILE; - -import java.io.File; -import java.util.Properties; - -import org.testng.annotations.Test; - -import ch.systemsx.cisd.base.tests.AbstractFileSystemTestCase; -import ch.systemsx.cisd.common.exceptions.UserFailureException; -import ch.systemsx.cisd.common.filesystem.FileUtilities; -import ch.systemsx.cisd.openbis.etlserver.proteomics.TypeExtractorForMSInjection; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetType; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.LocatorType; - -/** - * @author Franz-Josef Elmer - */ -public class TypeExtractorForMSInjectionTest extends AbstractFileSystemTestCase -{ - @Test - public void testMissingDataSetPropertiesFile() - { - TypeExtractorForMSInjection extractor = new TypeExtractorForMSInjection(new Properties()); - try - { - extractor.getDataSetType(workingDirectory); - fail("UserFailureException expected"); - } catch (UserFailureException ex) - { - assertEquals("Missing properties file '" + DATA_SET_PROPERTIES_FILE + "'.", ex.getMessage()); - } - } - - @Test - public void testGetDataSetType() - { - FileUtilities.writeToFile(new File(workingDirectory, DATA_SET_PROPERTIES_FILE), "DATA_SET_TYPE = RAW"); - TypeExtractorForMSInjection extractor = new TypeExtractorForMSInjection(new Properties()); - DataSetType dataSetType = extractor.getDataSetType(workingDirectory); - assertEquals("RAW", dataSetType.getCode()); - } - - @Test - public void testGetProcessorType() - { - FileUtilities.writeToFile(new File(workingDirectory, DATA_SET_PROPERTIES_FILE), "DATA_SET_TYPE = RAW"); - TypeExtractorForMSInjection extractor = new TypeExtractorForMSInjection(new Properties()); - assertEquals(null, extractor.getProcessorType(workingDirectory)); - } - - @Test - public void testGetFileFormatType() - { - FileUtilities.writeToFile(new File(workingDirectory, DATA_SET_PROPERTIES_FILE), "FILE_TYPE = XML"); - TypeExtractorForMSInjection extractor = new TypeExtractorForMSInjection(new Properties()); - assertEquals("XML", extractor.getFileFormatType(workingDirectory).getCode()); - } - - @Test - public void testGetLocatorType() - { - FileUtilities.writeToFile(new File(workingDirectory, DATA_SET_PROPERTIES_FILE), "FILE_TYPE = XML"); - TypeExtractorForMSInjection extractor = new TypeExtractorForMSInjection(new Properties()); - assertEquals(LocatorType.DEFAULT_LOCATOR_TYPE_CODE, extractor.getLocatorType(workingDirectory).getCode()); - } -} diff --git a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/etlserver/proteomics/UtilTest.java b/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/etlserver/proteomics/UtilTest.java deleted file mode 100644 index 7742a5a902d..00000000000 --- a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/etlserver/proteomics/UtilTest.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.etlserver.proteomics; - -import java.util.Arrays; -import java.util.Properties; - -import org.testng.AssertJUnit; -import org.testng.annotations.Test; - -import ch.systemsx.cisd.common.exceptions.UserFailureException; -import ch.systemsx.cisd.openbis.etlserver.proteomics.Util; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PropertyType; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleType; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleTypePropertyType; - -/** - * @author Franz-Josef Elmer - */ -public class UtilTest extends AssertJUnit -{ - @Test - public void testGetAndCheckProperties() - { - SampleType entityType = new SampleType(); - SampleTypePropertyType etpt1 = createETPT("answer", false); - SampleTypePropertyType etpt2 = createETPT("greetings", true); - entityType.setSampleTypePropertyTypes(Arrays.asList(etpt1, etpt2)); - Properties properties = new Properties(); - properties.setProperty("greetings", "hello"); - properties.setProperty("blabla", "blub"); - - IEntityProperty[] entityProperties = Util.getAndCheckProperties(properties, entityType); - - assertEquals(1, entityProperties.length); - assertEquals("greetings", entityProperties[0].getPropertyType().getCode()); - assertEquals("hello", entityProperties[0].tryGetAsString()); - } - - @Test - public void testGetAndCheckPropertiesForMissingMandatoryProperty() - { - SampleType entityType = new SampleType(); - SampleTypePropertyType etpt1 = createETPT("answer", true); - SampleTypePropertyType etpt2 = createETPT("greetings", true); - entityType.setSampleTypePropertyTypes(Arrays.asList(etpt1, etpt2)); - Properties properties = new Properties(); - properties.setProperty("greetings", "hello"); - - try - { - Util.getAndCheckProperties(properties, entityType); - fail("UserFailureException expected"); - } catch (UserFailureException ex) - { - assertEquals("The following mandatory properties are missed: [answer]", ex.getMessage()); - } - } - - private SampleTypePropertyType createETPT(String code, boolean mandatory) - { - PropertyType propertyType = new PropertyType(); - propertyType.setCode(code); - SampleTypePropertyType etpt = new SampleTypePropertyType(); - etpt.setPropertyType(propertyType); - etpt.setMandatory(mandatory); - return etpt; - } -} diff --git a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/DependencyCheckingTest.java b/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/DependencyCheckingTest.java deleted file mode 100644 index c5d317bd38f..00000000000 --- a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/DependencyCheckingTest.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright 2011 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics; - -import ch.systemsx.cisd.common.test.AbstractDependencyCheckingTestCase; - -/** - * @author Franz-Josef Elmer - */ -public class DependencyCheckingTest extends AbstractDependencyCheckingTestCase -{ - -} diff --git a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/api/v1/ProteomicsDataApiFacadeTest.java b/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/api/v1/ProteomicsDataApiFacadeTest.java deleted file mode 100644 index 82048aff03a..00000000000 --- a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/api/v1/ProteomicsDataApiFacadeTest.java +++ /dev/null @@ -1,223 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.client.api.v1; - -import java.util.Arrays; -import java.util.HashMap; -import java.util.HashSet; -import java.util.LinkedList; -import java.util.List; -import java.util.Set; - -import org.jmock.Expectations; -import org.jmock.Mockery; -import org.testng.AssertJUnit; -import org.testng.annotations.AfterMethod; -import org.testng.annotations.BeforeMethod; -import org.testng.annotations.Test; - -import ch.systemsx.cisd.openbis.generic.shared.api.v1.IGeneralInformationService; -import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.Project; -import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.Role; -import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SpaceWithProjectsAndRoleAssignments; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.api.v1.IProteomicsDataService; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.api.v1.dto.DataStoreServerProcessingPluginInfo; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.api.v1.dto.MsInjectionDataInfo; - -/** - * @author Franz-Josef Elmer - */ -public class ProteomicsDataApiFacadeTest extends AssertJUnit -{ - private static final String SESSION_TOKEN = "Session-42"; - - private Mockery context; - - private IProteomicsDataService proteomicsDataService; - - private IGeneralInformationService generalInfoService; - - private IProteomicsDataApiFacade facade; - - @BeforeMethod - public void beforeMethod() - { - context = new Mockery(); - proteomicsDataService = context.mock(IProteomicsDataService.class); - generalInfoService = context.mock(IGeneralInformationService.class); - facade = new ProteomicsDataApiFacade(proteomicsDataService, generalInfoService, SESSION_TOKEN); - } - - @AfterMethod - public void afterMethod() - { - context.assertIsSatisfied(); - } - - @Test - public void testGetSessionToken() - { - assertEquals(SESSION_TOKEN, facade.getSessionToken()); - - context.assertIsSatisfied(); - } - - @Test - public void testLogout() - { - context.checking(new Expectations() - { - { - one(generalInfoService).logout(SESSION_TOKEN); - } - }); - - facade.logout(); - - context.assertIsSatisfied(); - } - - @Test - public void testListDataStoreServerProcessingPluginInfos() - { - final List<DataStoreServerProcessingPluginInfo> result = - new LinkedList<DataStoreServerProcessingPluginInfo>(); - context.checking(new Expectations() - { - { - one(proteomicsDataService).listDataStoreServerProcessingPluginInfos(SESSION_TOKEN); - will(returnValue(result)); - } - }); - - assertSame(result, facade.listDataStoreServerProcessingPluginInfos()); - context.assertIsSatisfied(); - } - - @Test - public void testListRawDataSamples() - { - final List<MsInjectionDataInfo> result = new LinkedList<MsInjectionDataInfo>(); - context.checking(new Expectations() - { - { - one(proteomicsDataService).listRawDataSamples(SESSION_TOKEN, "user1"); - will(returnValue(result)); - } - }); - - assertSame(result, facade.listRawDataSamples("user1")); - context.assertIsSatisfied(); - } - - @Test - public void testListAllRawDataSamples() - { - final List<MsInjectionDataInfo> result = new LinkedList<MsInjectionDataInfo>(); - context.checking(new Expectations() - { - { - one(proteomicsDataService).listAllRawDataSamples(SESSION_TOKEN, "user1"); - will(returnValue(result)); - } - }); - - assertSame(result, facade.listAllRawDataSamples("user1")); - context.assertIsSatisfied(); - } - - @Test - public void testProcessDataSets() - { - context.checking(new Expectations() - { - { - one(proteomicsDataService).processDataSets(SESSION_TOKEN, "user1", "key", - Arrays.asList("ds1", "ds2")); - } - }); - - facade.processDataSets("user1", "key", Arrays.asList("ds1", "ds2")); - - context.assertIsSatisfied(); - } - - @Test - public void testListProjectsButNoUserRoles() - { - context.checking(new Expectations() - { - { - one(generalInfoService).listNamedRoleSets(SESSION_TOKEN); - will(returnValue(new HashMap<String, Set<Role>>())); - } - }); - - try - { - facade.listProjects("user1"); - fail("IllegalStateException expected"); - } catch (IllegalStateException ex) - { - assertEquals("Role set SPACE_USER not known.", ex.getMessage()); - } - - context.assertIsSatisfied(); - } - - @Test - public void testListProjects() - { - context.checking(new Expectations() - { - { - one(generalInfoService).listNamedRoleSets(SESSION_TOKEN); - HashMap<String, Set<Role>> sets = new HashMap<String, Set<Role>>(); - HashSet<Role> set = new HashSet<Role>(); - set.add(new Role("R1", true)); - set.add(new Role("R2", false)); - sets.put("SPACE_USER", set); - will(returnValue(sets)); - - one(generalInfoService).listSpacesWithProjectsAndRoleAssignments(SESSION_TOKEN, null); - SpaceWithProjectsAndRoleAssignments a = createSpace("A", "alpha", "beta"); - a.add("user1", new Role("R1", true)); - a.add("user1", new Role("R3", false)); - SpaceWithProjectsAndRoleAssignments b = createSpace("B", "gamma"); - b.add("user1", new Role("R2", true)); - will(returnValue(Arrays.asList(a, b))); - } - }); - - List<Project> projects = facade.listProjects("user1"); - - assertEquals("[/A/alpha, /A/beta]", projects.toString()); - context.assertIsSatisfied(); - } - - private SpaceWithProjectsAndRoleAssignments createSpace(String spaceCode, String... projects) - { - SpaceWithProjectsAndRoleAssignments space = new SpaceWithProjectsAndRoleAssignments(spaceCode); - long id = 1; - for (String project : projects) - { - space.add(new Project(id, Long.toString(id), spaceCode, project, null)); - ++id; - } - return space; - } -} diff --git a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/ProteinRenderersTest.java b/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/ProteinRenderersTest.java deleted file mode 100644 index 9676c640cba..00000000000 --- a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/ProteinRenderersTest.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright 2011 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.application; - -import java.util.Arrays; - -import org.testng.AssertJUnit; -import org.testng.annotations.Test; - -import ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.application.ProteinRenderers; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.Peptide; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.PeptideModification; - -/** - * @author Franz-Josef Elmer - */ -public class ProteinRenderersTest extends AssertJUnit -{ - @Test - public void testRenderAminoAcidSymbol() - { - assertEquals("<font style='text-decoration:underline; cursor:pointer' " - + "color='blue' title='mass=4.5'>A</font>", - ProteinRenderers.renderAminoAcidSymbol('A', null, 4.5)); - assertEquals("<font style='text-decoration:underline; cursor:pointer' " - + "color='blue' title='position=42, mass=4.5'>A</font>", - ProteinRenderers.renderAminoAcidSymbol('A', 42, 4.5)); - } - - @Test - public void testMarkOccurrencesWithHtml() - { - Peptide p1 = peptide("defgh:2=4.25"); - Peptide p2 = peptide("ijk:1=-2.75"); - Peptide p3 = peptide("jko"); - Peptide p4 = peptide("jjab"); - String e = ProteinRenderers.renderAminoAcidSymbol('e', 5, 4.25); - String i1 = ProteinRenderers.renderAminoAcidSymbol('i', 9, -2.75); - String i2 = ProteinRenderers.renderAminoAcidSymbol('i', 15, -2.75); - assertEquals( - "abc<font color='red'>d" + e + " fgh" + i1 + "j k</font>lmn<font color='red'>" - + i2 + " jko</font>pq rstu", - ProteinRenderers.markOccurrencesWithHtml("abcdefghijklmnijkopqrstu", - Arrays.asList(p1, p2, p3, p4), 5)); - } - - private Peptide peptide(String description) - { - Peptide peptide = new Peptide(); - int indexOfColon = description.indexOf(':'); - if (indexOfColon < 0) - { - peptide.setSequence(description); - return peptide; - } - peptide.setSequence(description.substring(0, indexOfColon)); - String[] modificationDescriptions = description.substring(indexOfColon + 1).split(","); - for (String modificationDescription : modificationDescriptions) - { - String[] posAndMass = modificationDescription.split("="); - PeptideModification peptideModification = new PeptideModification(); - peptideModification.setPosition(Integer.parseInt(posAndMass[0])); - peptideModification.setMass(Double.parseDouble(posAndMass[1])); - peptide.getModifications().add(peptideModification); - } - return peptide; - } - -} diff --git a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/dto/.gitignore b/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/dto/.gitignore deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/server/PhosphoNetXClientServiceTest.java b/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/server/PhosphoNetXClientServiceTest.java deleted file mode 100644 index 6eee125b577..00000000000 --- a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/server/PhosphoNetXClientServiceTest.java +++ /dev/null @@ -1,302 +0,0 @@ -/* - * Copyright 2011 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.client.web.server; - -import java.io.File; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Properties; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpSession; - -import org.jmock.Expectations; -import org.jmock.Mockery; -import org.testng.annotations.AfterMethod; -import org.testng.annotations.BeforeMethod; -import org.testng.annotations.Test; - -import ch.rinn.restrictions.Friend; -import ch.systemsx.cisd.base.tests.AbstractFileSystemTestCase; -import ch.systemsx.cisd.common.exceptions.UserFailureException; -import ch.systemsx.cisd.common.filesystem.FileUtilities; -import ch.systemsx.cisd.common.servlet.IRequestContextProvider; -import ch.systemsx.cisd.common.utilities.MockTimeProvider; -import ch.systemsx.cisd.openbis.generic.client.web.client.dto.GridRowModels; -import ch.systemsx.cisd.openbis.generic.client.web.client.dto.IResultSetConfig; -import ch.systemsx.cisd.openbis.generic.client.web.client.dto.ResultSetFetchConfig; -import ch.systemsx.cisd.openbis.generic.client.web.client.dto.TypedTableResultSet; -import ch.systemsx.cisd.openbis.generic.client.web.server.AbstractClientService; -import ch.systemsx.cisd.openbis.generic.client.web.server.resultset.DefaultResultSet; -import ch.systemsx.cisd.openbis.generic.client.web.server.resultset.IOriginalDataProvider; -import ch.systemsx.cisd.openbis.generic.client.web.server.resultset.IResultSet; -import ch.systemsx.cisd.openbis.generic.client.web.server.resultset.IResultSetManager; -import ch.systemsx.cisd.openbis.generic.shared.WebClientConfigurationProvider; -import ch.systemsx.cisd.openbis.generic.shared.basic.GridRowModel; -import ch.systemsx.cisd.openbis.generic.shared.basic.SessionConstants; -import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelColumnHeader; -import ch.systemsx.cisd.openbis.generic.shared.util.CacheManager; -import ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.Constants; -import ch.systemsx.cisd.openbis.plugin.proteomics.client.web.client.dto.ListProteinByExperimentCriteria; -import ch.systemsx.cisd.openbis.plugin.proteomics.client.web.server.PhosphoNetXClientService; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.IPhosphoNetXServer; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.AbundanceColumnDefinition; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.AggregateFunction; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.ProteinInfo; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.Treatment; - -/** - * @author Franz-Josef Elmer - */ -@Friend(toClasses = { AbstractClientService.class, PhosphoNetXClientService.class, CacheManager.class }) -public class PhosphoNetXClientServiceTest extends AbstractFileSystemTestCase -{ - private static final String SESSION_TOKEN = "session-token"; - - private static final class SimpleResultSetManager<K> implements IResultSetManager<K> - { - - @Override - public <T> IResultSet<K, T> getResultSet(String sessionToken, - IResultSetConfig<K, T> resultConfig, IOriginalDataProvider<T> dataProvider) - throws UserFailureException - { - List<TableModelColumnHeader> headers = dataProvider.getHeaders(); - List<T> originalData = dataProvider.getOriginalData(Integer.MAX_VALUE); - List<GridRowModel<T>> rows = new ArrayList<GridRowModel<T>>(); - for (int i = 0; i < originalData.size(); i++) - { - T rowData = originalData.get(i); - rows.add(new GridRowModel<T>(rowData, null)); - } - return new DefaultResultSet<K, T>(resultConfig.getCacheConfig().tryGetResultSetKey(), - new GridRowModels<T>(rows, headers, null, null), rows.size(), false); - } - - @Override - public void removeResultSet(K resultSetKey) throws UserFailureException - { - } - - @Override - public void lockResultSet(K resultSetKey) - { - } - - } - - private Mockery context; - - private IPhosphoNetXServer server; - - private PhosphoNetXClientService clientService; - - private IRequestContextProvider requestContextProvider; - - private HttpServletRequest request; - - private HttpSession httpSession; - - private File cacheFolder; - - @BeforeMethod - public final void beforeMethod() throws Exception - { - context = new Mockery(); - server = context.mock(IPhosphoNetXServer.class); - requestContextProvider = context.mock(IRequestContextProvider.class); - request = context.mock(HttpServletRequest.class); - httpSession = context.mock(HttpSession.class); - clientService = new PhosphoNetXClientService(); - clientService.server = server; - clientService.requestContextProvider = requestContextProvider; - context.checking(new Expectations() - { - { - allowing(requestContextProvider).getHttpServletRequest(); - will(returnValue(request)); - - allowing(request).getSession(false); - will(returnValue(httpSession)); - - allowing(httpSession).getAttribute("openbis-session-token"); - will(returnValue(SESSION_TOKEN)); - - allowing(httpSession).getAttribute(SessionConstants.OPENBIS_RESULT_SET_MANAGER); - will(returnValue(new SimpleResultSetManager<String>())); - } - }); - Properties properties = new Properties(); - cacheFolder = new File(workingDirectory, "cache"); - if (cacheFolder.exists()) - { - assertTrue(FileUtilities.deleteRecursively(cacheFolder)); - } - properties.setProperty("technologies", Constants.TECHNOLOGY_NAME); - properties.setProperty(Constants.TECHNOLOGY_NAME + "." + CacheManager.CACHE_FOLDER_KEY, - cacheFolder.getPath()); - clientService.webClientConfigurationProvider = - new WebClientConfigurationProvider(properties); - clientService.timeProvider = new MockTimeProvider(); - clientService.afterPropertiesSet(); - } - - @AfterMethod - public final void afterMethod() - { - context.assertIsSatisfied(); - } - - @Test - public void testGetAbundanceColumnDefinitionsForProteinByExperiment() - { - final TechId experimentID = new TechId(41L); - final AbundanceColumnDefinition colDef = new AbundanceColumnDefinition(); - colDef.setSampleCode("S1"); - Treatment treatment = new Treatment(); - treatment.setType("type1"); - treatment.setTypeCode("code"); - colDef.setTreatments(Arrays.asList(treatment)); - context.checking(new Expectations() - { - { - one(server).getAbundanceColumnDefinitionsForProteinByExperiment(SESSION_TOKEN, - experimentID, null); - will(returnValue(Arrays.asList(colDef))); - } - }); - - List<AbundanceColumnDefinition> colDefs = - clientService.getAbundanceColumnDefinitionsForProteinByExperiment(experimentID, - null); - colDefs = - clientService.getAbundanceColumnDefinitionsForProteinByExperiment(experimentID, - null); - assertEquals(colDef.getSampleCode(), colDefs.get(0).getSampleCode()); - assertEquals(treatment.getType(), colDefs.get(0).getTreatments().get(0).getType()); - assertEquals(1, colDefs.size()); - assertEquals(3, cacheFolder.listFiles().length); - - context.assertIsSatisfied(); - } - - @Test - public void testListProteinsByExperiment() - { - final TechId experimentID1 = new TechId(42L); - final TechId experimentID2 = new TechId(4711L); - final AbundanceColumnDefinition colDef = new AbundanceColumnDefinition(); - colDef.setSampleCode("S1"); - Treatment treatment = new Treatment(); - treatment.setType("type1"); - treatment.setTypeCode("code"); - colDef.setTreatments(Arrays.asList(treatment)); - final double fdr1 = 0.125; - final double fdr2 = 0.25; - final AggregateFunction f1 = AggregateFunction.MAX; - final AggregateFunction f2 = AggregateFunction.MIN; - final String treatment1 = "t1"; - final String treatment2 = "t2"; - final ProteinInfo p1 = createProtein(1); - final ProteinInfo p2 = createProtein(2); - final ProteinInfo p3 = createProtein(3); - final ProteinInfo p4 = createProtein(4); - final ProteinInfo p5 = createProtein(5); - final ProteinInfo p6 = createProtein(6); - context.checking(new Expectations() - { - { - one(server).getAbundanceColumnDefinitionsForProteinByExperiment(SESSION_TOKEN, - experimentID1, treatment1); - will(returnValue(Arrays.asList(colDef))); - one(server).getAbundanceColumnDefinitionsForProteinByExperiment(SESSION_TOKEN, - experimentID1, treatment2); - will(returnValue(Arrays.asList(colDef))); - one(server).getAbundanceColumnDefinitionsForProteinByExperiment(SESSION_TOKEN, - experimentID2, treatment1); - will(returnValue(Arrays.asList(colDef))); - one(server).listProteinsByExperiment(SESSION_TOKEN, experimentID1, fdr1, f1, - treatment1, false); - will(returnValue(Arrays.asList(p1))); - one(server).listProteinsByExperiment(SESSION_TOKEN, experimentID2, fdr1, f1, - treatment1, false); - will(returnValue(Arrays.asList(p2))); - one(server).listProteinsByExperiment(SESSION_TOKEN, experimentID1, fdr2, f1, - treatment1, false); - will(returnValue(Arrays.asList(p3))); - one(server).listProteinsByExperiment(SESSION_TOKEN, experimentID1, fdr1, f2, - treatment1, false); - will(returnValue(Arrays.asList(p4))); - one(server).listProteinsByExperiment(SESSION_TOKEN, experimentID1, fdr1, f1, - treatment2, false); - will(returnValue(Arrays.asList(p5))); - one(server).listProteinsByExperiment(SESSION_TOKEN, experimentID1, fdr1, f1, - treatment1, true); - will(returnValue(Arrays.asList(p6))); - - } - }); - - listAndCheckProteins(p1, experimentID1, fdr1, f1, treatment1, false); - listAndCheckProteins(p2, experimentID2, fdr1, f1, treatment1, false); - listAndCheckProteins(p3, experimentID1, fdr2, f1, treatment1, false); - listAndCheckProteins(p4, experimentID1, fdr1, f2, treatment1, false); - listAndCheckProteins(p5, experimentID1, fdr1, f1, treatment2, false); - listAndCheckProteins(p6, experimentID1, fdr1, f1, treatment1, true); - listAndCheckProteins(p1, experimentID1, fdr1, f1, treatment1, false); - listAndCheckProteins(p2, experimentID2, fdr1, f1, treatment1, false); - listAndCheckProteins(p3, experimentID1, fdr2, f1, treatment1, false); - listAndCheckProteins(p4, experimentID1, fdr1, f2, treatment1, false); - listAndCheckProteins(p5, experimentID1, fdr1, f1, treatment2, false); - listAndCheckProteins(p6, experimentID1, fdr1, f1, treatment1, true); - assertEquals("Unexpectd number of files: " + Arrays.asList(cacheFolder.listFiles()), 19, - cacheFolder.listFiles().length); - - context.assertIsSatisfied(); - } - - private void listAndCheckProteins(ProteinInfo protein, TechId experimentId, - double falseDiscoveryRate, AggregateFunction function, String treatmentTypeCode, - boolean aggregateOnOriginal) - { - ListProteinByExperimentCriteria criteria = new ListProteinByExperimentCriteria(); - criteria.setCacheConfig(ResultSetFetchConfig.createFetchFromCache("key")); - criteria.setExperimentID(experimentId); - criteria.setFalseDiscoveryRate(falseDiscoveryRate); - criteria.setAggregateFunction(function); - criteria.setTreatmentTypeCode(treatmentTypeCode); - criteria.setAggregateOriginal(aggregateOnOriginal); - TypedTableResultSet<ProteinInfo> rs = clientService.listProteinsByExperiment(criteria); - ProteinInfo actualProtein = rs.getResultSet().getList().get(0).getOriginalObject().getObjectOrNull(); - assertEquals(protein.getId(), actualProtein.getId()); - assertEquals(protein.getDescription(), actualProtein.getDescription()); - assertEquals(1, rs.getResultSet().getTotalLength()); - } - - private ProteinInfo createProtein(long id) - { - ProteinInfo protein = new ProteinInfo(); - protein.setId(new TechId(id)); - protein.setDescription("Protein " + id); - protein.setAbundances(new HashMap<Long, Double>()); - return protein; - } - -} diff --git a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/server/RawDataSampleProviderTest.java b/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/server/RawDataSampleProviderTest.java deleted file mode 100644 index 8cac244ce94..00000000000 --- a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/server/RawDataSampleProviderTest.java +++ /dev/null @@ -1,231 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.client.web.server; - -import static ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.RawDataSampleGridIDs.CODE; -import static ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.RawDataSampleGridIDs.PARENT; -import static ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.RawDataSampleGridIDs.REGISTRATION_DATE; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Date; -import java.util.List; - -import org.jmock.Expectations; -import org.testng.annotations.BeforeMethod; -import org.testng.annotations.Test; - -import ch.rinn.restrictions.Friend; -import ch.systemsx.cisd.openbis.generic.shared.AbstractServerTestCase; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataType; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataTypeCode; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.GenericEntityProperty; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PropertyType; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelColumnHeader; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRow; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRowWithObject; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TypedTableModel; -import ch.systemsx.cisd.openbis.plugin.proteomics.client.web.server.RawDataSampleProvider; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.IProteomicsDataServiceInternal; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.dto.MsInjectionSample; - -/** - * @author Franz-Josef Elmer - */ -@Friend(toClasses = RawDataSampleProvider.class) -public class RawDataSampleProviderTest extends AbstractServerTestCase -{ - private IProteomicsDataServiceInternal service; - - private RawDataSampleProvider provider; - - @Override - @BeforeMethod - public final void setUp() - { - super.setUp(); - service = context.mock(IProteomicsDataServiceInternal.class); - provider = new RawDataSampleProvider(service, SESSION_TOKEN); - } - - @Test - public void testGetHeadersForNoData() - { - prepareListRawDataSamples(); - - List<TableModelColumnHeader> headers = provider.getTableModel(Integer.MAX_VALUE).getHeader(); - - assertFixedColumns(headers); - assertEquals(4, headers.size()); - context.assertIsSatisfied(); - } - - @Test - public void testGetHeaders() - { - Sample ms1 = sample("MS1", sample("ABC", "alpha", "beta"), "one"); - Sample ms2 = sample("MS2", sample("DE", "gamma", "beta"), "one"); - Sample ms3 = sample("MS3", sample("DE", "gamma", "alpha"), "two"); - prepareListRawDataSamples(ms1, ms2, ms3); - - List<TableModelColumnHeader> headers = provider.getTableModel(Integer.MAX_VALUE).getHeader(); - - assertFixedColumns(headers); - assertPropertyHeader("one", "USER-ONE", 4, headers); - assertPropertyHeader("two", "USER-TWO", 5, headers); - assertPropertyHeader("alpha", "BIO_USER-ALPHA", 6, headers); - assertPropertyHeader("beta", "BIO_USER-BETA", 7, headers); - assertPropertyHeader("gamma", "BIO_USER-GAMMA", 8, headers); - assertEquals(9, headers.size()); - context.assertIsSatisfied(); - } - - @Test - public void testGetOriginalDataForNoData() - { - prepareListRawDataSamples(); - - List<TableModelRowWithObject<Sample>> data = provider.getTableModel(Integer.MAX_VALUE).getRows(); - - assertEquals(0, data.size()); - context.assertIsSatisfied(); - } - - @Test - public void testGetOriginalData() - { - Sample ms1 = sample("MS1", sample("ABC", "beta", "alpha"), "one"); - Sample ms2 = sample("MS2", sample("DE", "gamma", "beta"), "one"); - Sample parent = sample("FG", "alpha", "gamma"); - Experiment experiment = new Experiment(); - experiment.setIdentifier("/G/P/E1"); - parent.setExperiment(experiment); - Sample ms3 = sample("MS3", parent, "2"); - prepareListRawDataSamples(ms1, ms2, ms3); - - TypedTableModel<Sample> tableModel = provider.getTableModel(Integer.MAX_VALUE); - List<TableModelRowWithObject<Sample>> data = tableModel.getRows(); - - assertEquals(3, data.size()); - assertEquals("[null, null, null, null, 2, one, alpha, beta, gamma]", tableModel.getHeader().toString()); - assertRow("MS1, Mon Mar 30 17:18:20 CET 1970, /G/ABC, , , 3, 6, 4, ", data.get(0)); - assertRow("MS2, Mon Mar 30 17:20:00 CET 1970, /G/DE, , , 3, , 5, 5", data.get(1)); - assertRow("MS3, Mon Mar 30 17:21:40 CET 1970, /G/FG, /G/P/E1, 1, , 5, , 6", data.get(2)); - context.assertIsSatisfied(); - } - - private void assertRow(String expectedRow, TableModelRow row) - { - StringBuilder builder = new StringBuilder(); - int length = expectedRow.split(",").length; - for (int i = 0; i < length; i++) - { - if (builder.length() > 0) - { - builder.append(", "); - } - builder.append(row.getValues().get(i)); - } - assertEquals(expectedRow, builder.toString()); - } - - private void assertFixedColumns(List<TableModelColumnHeader> headers) - { - assertUntitledHeader(CODE, 0, DataTypeCode.VARCHAR, headers.get(0)); - assertUntitledHeader(REGISTRATION_DATE, 1, DataTypeCode.TIMESTAMP, headers.get(1)); - assertUntitledHeader(PARENT, 2, DataTypeCode.VARCHAR, headers.get(2)); - } - - private void assertUntitledHeader(String expectedCode, int expectedIndex, - DataTypeCode expectedType, TableModelColumnHeader header) - { - assertHeader(null, expectedCode, expectedIndex, expectedType, header); - } - - private void assertPropertyHeader(String expectedLabel, String expectedCode, int index, List<TableModelColumnHeader> headers) - { - TableModelColumnHeader header = headers.get(index); - assertHeader(expectedLabel, expectedCode, index, DataTypeCode.INTEGER, header); - } - - private void assertHeader(String expectedTitle, String expectedCode, int expectedIndex, - DataTypeCode expectedType, TableModelColumnHeader header) - { - assertEquals(expectedTitle, header.getTitle()); - assertEquals(expectedCode, header.getId()); - assertEquals(expectedIndex, header.getIndex()); - assertEquals(expectedType, header.getDataType()); - } - - private Sample sample(String code, Sample parent, String... properties) - { - Sample sample = sample(code, properties); - sample.setGeneratedFrom(parent); - return sample; - } - - private Sample sample(String code, String... properties) - { - Sample sample = new Sample(); - sample.setCode(code); - sample.setIdentifier("/G/" + code); - sample.setId((long) code.hashCode()); - sample.setRegistrationDate(new Date(code.hashCode() * 100000L)); - sample.setProperties(createProperties(properties)); - return sample; - } - - private List<IEntityProperty> createProperties(String... labels) - { - ArrayList<IEntityProperty> properties = new ArrayList<IEntityProperty>(); - for (String label : labels) - { - GenericEntityProperty property = new GenericEntityProperty(); - PropertyType propertyType = new PropertyType(); - propertyType.setLabel(label); - propertyType.setCode(propertyType.getLabel().toUpperCase()); - propertyType.setSimpleCode(propertyType.getCode()); - DataType dataType = new DataType(); - dataType.setCode(DataTypeCode.INTEGER); - propertyType.setDataType(dataType); - property.setPropertyType(propertyType); - property.setValue(Integer.toString(label.length() + properties.size())); - properties.add(property); - } - return properties; - } - - private void prepareListRawDataSamples(final Sample... samples) - { - context.checking(new Expectations() - { - { - one(service).listRawDataSamples(SESSION_TOKEN); - List<MsInjectionSample> list = new ArrayList<MsInjectionSample>(); - for (Sample sample : samples) - { - list.add(new MsInjectionSample(sample, Arrays.<AbstractExternalData> asList())); - } - will(returnValue(list)); - } - }); - } -} diff --git a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/server/resultset/ProteinSequenceProviderTest.java b/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/server/resultset/ProteinSequenceProviderTest.java deleted file mode 100644 index 01b17862c6c..00000000000 --- a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/server/resultset/ProteinSequenceProviderTest.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright 2011 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.client.web.server.resultset; - -import java.util.Arrays; - -import org.jmock.Expectations; -import org.testng.annotations.Test; - -import ch.systemsx.cisd.openbis.generic.client.web.server.resultset.AbstractProviderTest; -import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TypedTableModel; -import ch.systemsx.cisd.openbis.plugin.proteomics.client.web.server.resultset.ProteinSequenceProvider; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.IPhosphoNetXServer; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.ProteinSequence; - -/** - * @author Franz-Josef Elmer - */ -public class ProteinSequenceProviderTest extends AbstractProviderTest -{ - @Test - public void test() - { - final ProteinSequence ps = new ProteinSequence(); - ps.setShortName("short-name"); - ps.setDatabaseNameAndVersion("db-version"); - ps.setSequence("ABC"); - final IPhosphoNetXServer phosphonetxServer = context.mock(IPhosphoNetXServer.class); - context.checking(new Expectations() - { - { - one(phosphonetxServer).listProteinSequencesByProteinReference(SESSION_TOKEN, new TechId(42), new TechId(43)); - will(returnValue(Arrays.asList(ps))); - } - }); - ProteinSequenceProvider provider = - new ProteinSequenceProvider(phosphonetxServer, SESSION_TOKEN, new TechId(42), new TechId(43)); - - TypedTableModel<ProteinSequence> model = provider.createTableModel(); - - assertEquals("[SEQUENCE_SHORT_NAME, DATABASE_NAME_AND_VERSION, SEQUENCE]", getHeaderIDs(model).toString()); - assertEquals("[VARCHAR, VARCHAR, VARCHAR]", getHeaderDataTypes(model).toString()); - assertEquals("[null, null, null]", getHeaderEntityKinds(model).toString()); - assertSame(ps, model.getRows().get(0).getObjectOrNull()); - assertEquals("[short-name, db-version, ABC]", model.getRows().get(0).getValues().toString()); - assertEquals(1, model.getRows().size()); - context.assertIsSatisfied(); - } - -} diff --git a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/server/resultset/ProteinSummaryProviderTest.java b/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/server/resultset/ProteinSummaryProviderTest.java deleted file mode 100644 index bcd305c7221..00000000000 --- a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/server/resultset/ProteinSummaryProviderTest.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright 2011 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.client.web.server.resultset; - -import java.util.Arrays; - -import org.jmock.Expectations; -import org.testng.annotations.Test; - -import ch.systemsx.cisd.openbis.generic.client.web.server.resultset.AbstractProviderTest; -import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TypedTableModel; -import ch.systemsx.cisd.openbis.plugin.proteomics.client.web.server.resultset.ProteinSummaryProvider; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.IPhosphoNetXServer; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.ProteinSummary; - -/** - * @author Franz-Josef Elmer - */ -public class ProteinSummaryProviderTest extends AbstractProviderTest -{ - @Test - public void test() - { - final ProteinSummary ps = new ProteinSummary(); - ps.setFDR(0.125); - ps.setProteinCount(42); - ps.setPeptideCount(4711); - ps.setDecoyProteinCount(2); - ps.setDecoyPeptideCount(5); - final IPhosphoNetXServer phosphonetxServer = context.mock(IPhosphoNetXServer.class); - context.checking(new Expectations() - { - { - one(phosphonetxServer).listProteinSummariesByExperiment(SESSION_TOKEN, - new TechId(12)); - will(returnValue(Arrays.asList(ps))); - } - }); - ProteinSummaryProvider provider = - new ProteinSummaryProvider(phosphonetxServer, SESSION_TOKEN, new TechId(12)); - - TypedTableModel<ProteinSummary> model = provider.createTableModel(); - - assertEquals( - "[FDR, PROTEIN_COUNT, PEPTIDE_COUNT, DECOY_PROTEIN_COUNT, DECOY_PEPTIDE_COUNT]", - getHeaderIDs(model).toString()); - assertEquals("[REAL, INTEGER, INTEGER, INTEGER, INTEGER]", getHeaderDataTypes(model) - .toString()); - assertEquals("[null, null, null, null, null]", getHeaderEntityKinds(model).toString()); - assertSame(ps, model.getRows().get(0).getObjectOrNull()); - assertEquals("[0.125, 42, 4711, 2, 5]", model.getRows().get(0).getValues().toString()); - assertEquals(1, model.getRows().size()); - context.assertIsSatisfied(); - } -} diff --git a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/PhosphoNetXServerTest.java b/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/PhosphoNetXServerTest.java deleted file mode 100644 index 7c0980fc7ab..00000000000 --- a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/PhosphoNetXServerTest.java +++ /dev/null @@ -1,188 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.server; - -import java.util.Arrays; -import java.util.List; - -import org.jmock.Expectations; -import org.testng.annotations.BeforeMethod; -import org.testng.annotations.Test; - -import ch.rinn.restrictions.Friend; -import ch.systemsx.cisd.openbis.common.eodsql.MockDataSet; -import ch.systemsx.cisd.openbis.generic.server.plugin.IDataSetTypeSlaveServerPlugin; -import ch.systemsx.cisd.openbis.generic.server.plugin.ISampleTypeSlaveServerPlugin; -import ch.systemsx.cisd.openbis.generic.shared.AbstractServerTestCase; -import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample; -import ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentPE; -import ch.systemsx.cisd.openbis.plugin.proteomics.server.business.IAbundanceColumnDefinitionTable; -import ch.systemsx.cisd.openbis.plugin.proteomics.server.business.IBusinessObjectFactory; -import ch.systemsx.cisd.openbis.plugin.proteomics.server.business.IProteinDetailsBO; -import ch.systemsx.cisd.openbis.plugin.proteomics.server.business.IProteinRelatedSampleTable; -import ch.systemsx.cisd.openbis.plugin.proteomics.server.business.ISampleProvider; -import ch.systemsx.cisd.openbis.plugin.proteomics.server.dataaccess.IPhosphoNetXDAOFactory; -import ch.systemsx.cisd.openbis.plugin.proteomics.server.dataaccess.IProteinQueryDAO; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.AbundanceColumnDefinition; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.ProteinDetails; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.ProteinRelatedSample; - -/** - * @author Franz-Josef Elmer - */ -@Friend(toClasses = PhosphoNetXServer.class) -public class PhosphoNetXServerTest extends AbstractServerTestCase -{ - private static final TechId EXPERIMENT_ID = new TechId(42L); - - private static final String EXPERIMENT_PERM_ID = "e123-45"; - - private static final String SAMPLE_PERM_ID = "s34-56"; - - private IPhosphoNetXDAOFactory phosphoNetXDAOFactory; - - private IBusinessObjectFactory boFactory; - - private ISampleTypeSlaveServerPlugin sampleTypeSlaveServerPlugin; - - private IDataSetTypeSlaveServerPlugin dataSetTypeSlaveServerPlugin; - - private IProteinQueryDAO proteinDAO; - - private PhosphoNetXServer server; - - private IAbundanceColumnDefinitionTable abundanceColumnDefinitionTable; - - private ISampleProvider sampleProvider; - - private IProteinDetailsBO proteinDetailsBO; - - private IProteinRelatedSampleTable proteinRelatedSampleTable; - - @Override - @BeforeMethod - public void setUp() - { - super.setUp(); - phosphoNetXDAOFactory = context.mock(IPhosphoNetXDAOFactory.class); - boFactory = context.mock(IBusinessObjectFactory.class); - sampleTypeSlaveServerPlugin = context.mock(ISampleTypeSlaveServerPlugin.class); - dataSetTypeSlaveServerPlugin = context.mock(IDataSetTypeSlaveServerPlugin.class); - proteinDAO = context.mock(IProteinQueryDAO.class); - abundanceColumnDefinitionTable = context.mock(IAbundanceColumnDefinitionTable.class); - proteinDetailsBO = context.mock(IProteinDetailsBO.class); - proteinRelatedSampleTable = context.mock(IProteinRelatedSampleTable.class); - sampleProvider = context.mock(ISampleProvider.class); - server = - new PhosphoNetXServer(sessionManager, daoFactory, propertiesBatchManager, - phosphoNetXDAOFactory, boFactory, sampleTypeSlaveServerPlugin, - dataSetTypeSlaveServerPlugin); - context.checking(new Expectations() - { - { - allowing(boFactory).createProteinDetailsBO(session); - will(returnValue(proteinDetailsBO)); - - allowing(boFactory).createProteinRelatedSampleTable(session); - will(returnValue(proteinRelatedSampleTable)); - } - }); - } - - @Test - public void testGetAbundanceColumnDefinitionsForProteinByExperiment() - { - prepareGetSession(); - final MockDataSet<String> mockDataSet = new MockDataSet<String>(); - mockDataSet.add(SAMPLE_PERM_ID); - final List<AbundanceColumnDefinition> result = Arrays.asList(); - context.checking(new Expectations() - { - { - one(experimentDAO).getByTechId(EXPERIMENT_ID); - ExperimentPE experimentPE = new ExperimentPE(); - experimentPE.setPermId(EXPERIMENT_PERM_ID); - will(returnValue(experimentPE)); - - allowing(phosphoNetXDAOFactory).getProteinQueryDAO(EXPERIMENT_ID); - will(returnValue(proteinDAO)); - - one(proteinDAO).listAbundanceRelatedSamplePermIDsByExperiment(EXPERIMENT_PERM_ID); - will(returnValue(mockDataSet)); - - one(boFactory).createAbundanceColumnDefinitionTable(session); - will(returnValue(abundanceColumnDefinitionTable)); - - one(boFactory).createSampleProvider(session); - will(returnValue(sampleProvider)); - - one(sampleProvider).loadByExperimentID(EXPERIMENT_ID); - - one(sampleProvider).getSample(SAMPLE_PERM_ID); - Sample sample = new Sample(); - sample.setPermId(SAMPLE_PERM_ID); - will(returnValue(sample)); - - one(abundanceColumnDefinitionTable).add(sample); - - one(abundanceColumnDefinitionTable).getSortedAndAggregatedDefinitions("PH"); - will(returnValue(result)); - } - }); - - List<AbundanceColumnDefinition> definitions = - server.getAbundanceColumnDefinitionsForProteinByExperiment(SESSION_TOKEN, - EXPERIMENT_ID, "PH"); - assertSame(result, definitions); - assertEquals(true, mockDataSet.hasCloseBeenInvoked()); - context.assertIsSatisfied(); - } - - @Test - public void testListProteinRelatedSamplesByProtein() - { - prepareGetSession(); - final TechId experimentID = new TechId(42); - final TechId proteinReferenceID = new TechId(4711); - final List<Object> result = Arrays.asList(); - context.checking(new Expectations() - { - { - one(proteinDetailsBO).loadByExperimentAndReference(experimentID, - proteinReferenceID); - one(proteinDetailsBO).getDetailsOrNull(); - ProteinDetails details = new ProteinDetails(); - String sequence = "abcdefabcab"; - details.setSequence(sequence); - will(returnValue(details)); - - one(proteinRelatedSampleTable).load(session, experimentID, proteinReferenceID, sequence); - one(proteinRelatedSampleTable).getSamples(); - will(returnValue(result)); - } - }); - - List<ProteinRelatedSample> list = - server.listProteinRelatedSamplesByProtein(SESSION_TOKEN, experimentID, - proteinReferenceID); - - assertSame(result, list); - context.assertIsSatisfied(); - } - -} diff --git a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/ProteomicsDataServiceInternalTest.java b/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/ProteomicsDataServiceInternalTest.java deleted file mode 100644 index 7d4729d7446..00000000000 --- a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/ProteomicsDataServiceInternalTest.java +++ /dev/null @@ -1,449 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.server; - -import static ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataStoreServiceKind.PROCESSING; -import static ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataStoreServiceKind.QUERIES; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.Date; -import java.util.HashMap; -import java.util.HashSet; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Map; - -import org.jmock.Expectations; -import org.testng.annotations.BeforeMethod; -import org.testng.annotations.Test; - -import ch.rinn.restrictions.Friend; -import ch.systemsx.cisd.openbis.generic.server.TestJythonEvaluatorPool; -import ch.systemsx.cisd.openbis.generic.server.authorization.TestAuthorizationConfig; -import ch.systemsx.cisd.openbis.generic.server.business.bo.ICommonBusinessObjectFactory; -import ch.systemsx.cisd.openbis.generic.shared.AbstractServerTestCase; -import ch.systemsx.cisd.openbis.generic.shared.CommonTestUtils; -import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataStoreServiceKind; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataTypeCode; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PhysicalDataSet; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Space; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.RoleWithHierarchy.RoleCode; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.builders.DataSetBuilder; -import ch.systemsx.cisd.openbis.generic.shared.dto.DataStorePE; -import ch.systemsx.cisd.openbis.generic.shared.dto.DataStoreServicePE; -import ch.systemsx.cisd.openbis.generic.shared.dto.EntityPropertyPE; -import ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentPE; -import ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentTypePE; -import ch.systemsx.cisd.openbis.generic.shared.dto.ExternalDataPE; -import ch.systemsx.cisd.openbis.generic.shared.dto.PersonPE; -import ch.systemsx.cisd.openbis.generic.shared.dto.ProjectPE; -import ch.systemsx.cisd.openbis.generic.shared.dto.RoleAssignmentPE; -import ch.systemsx.cisd.openbis.generic.shared.dto.Session; -import ch.systemsx.cisd.openbis.generic.shared.dto.SpacePE; -import ch.systemsx.cisd.openbis.generic.shared.dto.properties.EntityKind; -import ch.systemsx.cisd.openbis.generic.shared.managed_property.ManagedPropertyEvaluatorFactory; -import ch.systemsx.cisd.openbis.plugin.proteomics.server.business.IBusinessObjectFactory; -import ch.systemsx.cisd.openbis.plugin.proteomics.server.business.ISampleLoader; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.IProteomicsDataServiceInternal; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.CommonConstants; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.dto.MsInjectionSample; - -/** - * @author Franz-Josef Elmer - */ -@Friend(toClasses = ProteomicsDataServiceInternal.class) -public class ProteomicsDataServiceInternalTest extends AbstractServerTestCase -{ - private static final String GROUP_CODE = "g"; - - private static final String COPY_PROCESSING_KEY = "copy-data-sets"; - - private static final String EXPERIMENT_TYPE = "EXPE"; - - private IProteomicsDataServiceInternal service; - - private ICommonBusinessObjectFactory commonBoFactory; - - private ExperimentTypePE experimentType; - - private IBusinessObjectFactory boFactory; - - private ISampleLoader sampleLoader; - - @Override - @BeforeMethod - public final void setUp() - { - super.setUp(); - commonBoFactory = context.mock(ICommonBusinessObjectFactory.class); - boFactory = context.mock(IBusinessObjectFactory.class); - sampleLoader = context.mock(ISampleLoader.class); - service = - new ProteomicsDataServiceInternal(sessionManager, daoFactory, - propertiesBatchManager, commonBoFactory, boFactory, - new ManagedPropertyEvaluatorFactory(null, new TestJythonEvaluatorPool())); - experimentType = new ExperimentTypePE(); - experimentType.setCode(EXPERIMENT_TYPE); - PersonPE person = new PersonPE(); - RoleAssignmentPE roleAssignment = new RoleAssignmentPE(); - roleAssignment.setRole(RoleCode.ADMIN); - SpacePE group = new SpacePE(); - group.setCode("Space-0"); - roleAssignment.setSpace(group); - person.setRoleAssignments(Collections.singleton(roleAssignment)); - session.setPerson(person); - } - - @Test - public void testListRawDataSamples() - { - prepareGetSession(); - prepareListRawDataSamples(42L); - - List<MsInjectionSample> samples = service.listRawDataSamples(SESSION_TOKEN); - - assertEquals(42L, samples.get(0).getSample().getId().longValue()); - assertEquals(1, samples.size()); - context.assertIsSatisfied(); - } - - @Test - public void testProcessDataSets() - { - prepareGetSession(); - HashMap<String, String> parameterBindings = new HashMap<String, String>(); - prepareProcessDataSets(session, parameterBindings, "ds1", "ds2"); - - service.processDataSets(SESSION_TOKEN, COPY_PROCESSING_KEY, Arrays.asList("ds1", "ds2")); - - context.assertIsSatisfied(); - } - - @Test - public void testListExperiments() - { - prepareGetSession(); - final ExperimentPE e1 = experiment(1); - final ExperimentPE e2 = experiment(2, "a"); - prepareListExperiments(e1, e2); - - List<Experiment> list = service.listExperiments(SESSION_TOKEN, EXPERIMENT_TYPE); - - assertEquals("/G/P/e1", list.get(0).getIdentifier()); - assertEquals(1, list.get(0).getRegistrationDate().getTime()); - assertEquals(0, list.get(0).getProperties().size()); - assertEquals("/G/P/e2", list.get(1).getIdentifier()); - assertEquals(4, list.get(1).getRegistrationDate().getTime()); - assertEquals("A", list.get(1).getProperties().get(0).getPropertyType().getCode()); - assertEquals("a-value", list.get(1).getProperties().get(0).getValue()); - assertEquals(1, list.get(1).getProperties().size()); - assertEquals(2, list.size()); - context.assertIsSatisfied(); - } - - @Test - public void testProcessSearchData() - { - final Session testSession = createSessionAndPrepareGetSession(GROUP_CODE); - final ExperimentPE e1 = experiment(1); - final ExperimentPE e2 = experiment(2, "a"); - context.checking(new Expectations() - { - { - one(experimentDAO).tryGetByTechId(new TechId(e1.getId())); - will(returnValue(e1)); - - one(dataSetDAO).listDataSets(e1); - ExternalDataPE ds1 = new ExternalDataPE(); - ds1.setCode("ds1"); - will(returnValue(Arrays.asList(ds1))); - - one(experimentDAO).tryGetByTechId(new TechId(e2.getId())); - will(returnValue(e2)); - - one(dataSetDAO).listDataSets(e2); - ExternalDataPE ds2 = new ExternalDataPE(); - ds2.setCode("ds2"); - will(returnValue(Arrays.asList(ds2))); - } - }); - prepareProcessDataSets(testSession, new HashMap<String, String>(), "ds1", "ds2"); - - service.processProteinResultDataSets(SESSION_TOKEN, COPY_PROCESSING_KEY, EXPERIMENT_TYPE, - new long[] { e1.getId(), e2.getId() }); - - context.assertIsSatisfied(); - } - - @Test - public void testProcessSearchDataFilteredByValidator() - { - Session testSession = createSessionAndPrepareGetSession(GROUP_CODE + 2); - final ExperimentPE e1 = experiment(1); - final ExperimentPE e2 = experiment(2, "a"); - - context.checking(new Expectations() - { - { - allowing(daoFactory).getAuthorizationConfig(); - will(returnValue(new TestAuthorizationConfig(false, false))); - - one(experimentDAO).tryGetByTechId(new TechId(e1.getId())); - will(returnValue(e1)); - - one(experimentDAO).tryGetByTechId(new TechId(e2.getId())); - will(returnValue(e2)); - } - }); - prepareProcessDataSets(testSession, new HashMap<String, String>()); - - service.processProteinResultDataSets(SESSION_TOKEN, COPY_PROCESSING_KEY, EXPERIMENT_TYPE, - new long[] { e1.getId(), e2.getId() }); - - context.assertIsSatisfied(); - } - - @Test - public void testProcessSearchDataFilteredByIds() - { - Session testSession = createSessionAndPrepareGetSession(GROUP_CODE); - final ExperimentPE e1 = experiment(1); - context.checking(new Expectations() - { - { - one(experimentDAO).tryGetByTechId(new TechId(e1.getId())); - will(returnValue(e1)); - - one(dataSetDAO).listDataSets(e1); - ExternalDataPE ds1 = new ExternalDataPE(); - ds1.setCode("ds1"); - will(returnValue(Arrays.asList(ds1))); - } - }); - prepareProcessDataSets(testSession, new HashMap<String, String>(), "ds1"); - - service.processProteinResultDataSets(SESSION_TOKEN, COPY_PROCESSING_KEY, EXPERIMENT_TYPE, - new long[] { e1.getId() }); - - context.assertIsSatisfied(); - } - - private Session createSessionAndPrepareGetSession(String spaceCode) - { - final Session testSession = - new Session(CommonTestUtils.USER_ID, SESSION_TOKEN, PRINCIPAL, "remote-host", 1); - PersonPE person = new PersonPE(); - RoleAssignmentPE roleAssignmentPE = new RoleAssignmentPE(); - SpacePE group = new SpacePE(); - group.setCode(spaceCode); - roleAssignmentPE.setRole(RoleCode.ADMIN); - roleAssignmentPE.setSpace(group); - person.setRoleAssignments(new HashSet<RoleAssignmentPE>(Arrays.asList(roleAssignmentPE))); - testSession.setPerson(person); - context.checking(new Expectations() - { - { - allowing(sessionManager).getSession(SESSION_TOKEN); - will(returnValue(testSession)); - } - }); - return testSession; - } - - private void prepareListExperiments(final ExperimentPE... experiments) - { - context.checking(new Expectations() - { - { - one(daoFactory).getEntityTypeDAO(EntityKind.EXPERIMENT); - will(returnValue(entityTypeDAO)); - - one(entityTypeDAO).tryToFindEntityTypeByCode(EXPERIMENT_TYPE); - will(returnValue(experimentType)); - - one(experimentDAO).listExperimentsWithProperties(experimentType, null, null); - will(returnValue(Arrays.asList(experiments))); - - one(metaprojectDAO).listMetaprojectAssignmentsForEntities( - session.tryGetPerson(), Arrays.asList(experiments), - EntityKind.EXPERIMENT); - } - }); - } - - private void prepareProcessDataSets(final Session testSession, - final Map<String, String> parameterBindings, final String... dataSetCodes) - { - context.checking(new Expectations() - { - { - one(dataStoreDAO).listDataStores(); - DataStorePE s1 = - store("s1", service("a", PROCESSING), - service(COPY_PROCESSING_KEY, QUERIES)); - DataStorePE s2 = store("s2", service(COPY_PROCESSING_KEY, PROCESSING)); - will(returnValue(Arrays.asList(s1, s2))); - - one(commonBoFactory).createDataSetTable(testSession); - will(returnValue(dataSetTable)); - - one(dataSetTable).processDatasets(COPY_PROCESSING_KEY, "s2", - Arrays.asList(dataSetCodes), parameterBindings); - } - - }); - } - - private void prepareListRawDataSamples(final Long... sampleIDs) - { - final List<Sample> samples = new ArrayList<Sample>(); - final LinkedHashSet<Long> experimentIds = new LinkedHashSet<Long>(); - final List<ExperimentPE> bioExperiments = new ArrayList<ExperimentPE>(); - for (Long id : sampleIDs) - { - Sample sample = new Sample(); - sample.setId(id); - sample.setCode("s-" + id); - sample.setIdentifier("S" + id); - Experiment experiment = new Experiment(); - experiment.setId(id * 10); - sample.setExperiment(experiment); - Sample parent = new Sample(); - parent.setId(id * 100); - Space space = new Space(); - space.setCode("Space-" + id % 2); - parent.setSpace(space); - Experiment parentExperiment = new Experiment(); - parentExperiment.setId(id * 20); - parent.setExperiment(parentExperiment); - sample.setGeneratedFrom(parent); - samples.add(sample); - if (id % 2 == 0) - { - ExperimentPE bioExperiment = - createExperiment("e-type", "exp-" + id, space.getCode()); - bioExperiment.setId(parentExperiment.getId()); - bioExperiments.add(bioExperiment); - experimentIds.add(bioExperiment.getId()); - } - } - context.checking(new Expectations() - { - { - one(boFactory).createSampleLoader(session); - will(returnValue(sampleLoader)); - - one(sampleLoader).listSamplesWithParentsByTypeAndSpace( - CommonConstants.MS_INJECTION_SAMPLE_TYPE_CODE, - CommonConstants.MS_DATA_SPACE); - will(returnValue(samples)); - - one(experimentDAO).listExperimentsWithProperties(experimentIds); - will(returnValue(bioExperiments)); - - List<Sample> filteredSamples = new ArrayList<Sample>(); - Map<Sample, List<PhysicalDataSet>> dataSetsBySamples = - new HashMap<Sample, List<PhysicalDataSet>>(); - for (Sample sample : samples) - { - if ("Space-0".equals(sample.getGeneratedFrom().getSpace().getCode())) - { - Long id = sample.getId(); - String dataSetType = "dt-" + id % 2; - long ds1Id = id * 1000; - PhysicalDataSet ds1 = - new DataSetBuilder(ds1Id).code("ds-" + id) - .registrationDate(new Date(ds1Id)).sample(sample) - .type(dataSetType).getDataSet(); - - long ds2Id = (id + 1) * 1001; - PhysicalDataSet ds2 = - new DataSetBuilder(ds2Id).code("ds-" + id + 1) - .registrationDate(new Date(ds2Id)).sample(sample) - .type(dataSetType).getDataSet(); - - long ds2ChildId = ds2.getId() + 1; - PhysicalDataSet ds2Child = - new DataSetBuilder(ds2ChildId).code(ds2.getCode() + "-child") - .registrationDate(new Date(ds2ChildId)).sample(sample) - .type(dataSetType).getDataSet(); - - ds2.setChildren(Arrays.<AbstractExternalData> asList(ds2Child)); - dataSetsBySamples.put(sample, Arrays.asList(ds1, ds2)); - - filteredSamples.add(sample); - } - } - - one(commonBoFactory).createDatasetLister(session); - will(returnValue(datasetLister)); - - one(datasetLister).listAllDataSetsFor(filteredSamples); - will(returnValue(dataSetsBySamples)); - - } - }); - } - - private ExperimentPE experiment(long id, String... properties) - { - ExperimentPE experiment = new ExperimentPE(); - experiment.setExperimentType(experimentType); - experiment.setId(id); - experiment.setCode("e" + id); - ProjectPE project = new ProjectPE(); - project.setCode("p"); - SpacePE group = - CommonTestUtils.createSpace(GROUP_CODE); - project.setSpace(group); - experiment.setProject(project); - experiment.setRegistrationDate(new Date(id * id)); - if (properties.length > 0) - { - LinkedHashSet<EntityPropertyPE> props = new LinkedHashSet<EntityPropertyPE>(); - for (String property : properties) - { - props.add(CommonTestUtils.createExperimentPropertyPE(property, EXPERIMENT_TYPE, - DataTypeCode.VARCHAR, property + "-value")); - } - experiment.setProperties(props); - } - return experiment; - } - - private DataStorePE store(String code, DataStoreServicePE... services) - { - DataStorePE store = new DataStorePE(); - store.setCode(code); - store.setServices(new LinkedHashSet<DataStoreServicePE>(Arrays.asList(services))); - return store; - } - - private DataStoreServicePE service(String key, DataStoreServiceKind kind) - { - DataStoreServicePE dataStoreService = new DataStoreServicePE(); - dataStoreService.setKey(key); - dataStoreService.setKind(kind); - return dataStoreService; - } -} diff --git a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/ServerInterfaceRegressionTest.java b/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/ServerInterfaceRegressionTest.java deleted file mode 100644 index e00a088a3c2..00000000000 --- a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/ServerInterfaceRegressionTest.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright 2012 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.server; - -import org.testng.annotations.Test; - -import ch.systemsx.cisd.openbis.generic.server.util.AnnotationAppliedTestCase; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.IPhosphoNetXServer; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.IProteomicsDataServiceInternal; - -/** - * @author Franz-Josef Elmer - */ -public class ServerInterfaceRegressionTest extends AnnotationAppliedTestCase -{ - @Test - public void testServerAnnotations() - { - assertMandatoryMethodAnnotations(IPhosphoNetXServer.class, PhosphoNetXServer.class, null); - } - - @Test - public void testDataServiceInternalAnnotations() - { - assertMandatoryMethodAnnotations(IProteomicsDataServiceInternal.class, - ProteomicsDataServiceInternal.class, null); - } - -} diff --git a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/api/v1/ProteomicsDataServiceTest.java b/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/api/v1/ProteomicsDataServiceTest.java deleted file mode 100644 index 6d981e82a83..00000000000 --- a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/api/v1/ProteomicsDataServiceTest.java +++ /dev/null @@ -1,426 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.server.api.v1; - -import java.io.Serializable; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.Comparator; -import java.util.Date; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; - -import org.jmock.Expectations; -import org.testng.annotations.BeforeMethod; -import org.testng.annotations.Test; - -import ch.systemsx.cisd.common.exceptions.UserFailureException; -import ch.systemsx.cisd.openbis.generic.shared.AbstractServerTestCase; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetType; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataStoreServiceKind; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataType; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataTypeCode; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityProperty; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Project; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PropertyType; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Space; -import ch.systemsx.cisd.openbis.generic.shared.dto.DataSetTypePE; -import ch.systemsx.cisd.openbis.generic.shared.dto.DataStorePE; -import ch.systemsx.cisd.openbis.generic.shared.dto.DataStoreServicePE; -import ch.systemsx.cisd.openbis.generic.shared.dto.SessionContextDTO; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.IProteomicsDataServiceInternal; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.api.v1.IProteomicsDataService; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.api.v1.dto.DataSet; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.api.v1.dto.DataStoreServerProcessingPluginInfo; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.api.v1.dto.MsInjectionDataInfo; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.api.v1.dto.PropertyKey; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.dto.MsInjectionSample; - -/** - * @author Franz-Josef Elmer - */ -public class ProteomicsDataServiceTest extends AbstractServerTestCase -{ - private static final String MS_SEARCH = "MS_SEARCH"; - - private static final String RAW_DATA = "RAW_DATA"; - - private static final String MZXML_DATA = "MZXML_DATA"; - - private IProteomicsDataServiceInternal internalService; - - private IProteomicsDataService service; - - private SessionContextDTO session2; - - @Override - @BeforeMethod - public final void setUp() - { - super.setUp(); - internalService = context.mock(IProteomicsDataServiceInternal.class); - service = - new ProteomicsDataService(sessionManager, daoFactory, propertiesBatchManager, - internalService); - session2 = new SessionContextDTO(); - session2.setSessionToken(SESSION_TOKEN + "2"); - } - - @Test - public void testListDataStoreServerProcessingPluginInfos() - { - prepareGetSession(); - DataStoreServicePE s1 = new DataStoreServicePE(); - s1.setKind(DataStoreServiceKind.QUERIES); - DataStoreServicePE s2 = new DataStoreServicePE(); - s2.setKind(DataStoreServiceKind.PROCESSING); - s2.setKey("my-key"); - s2.setLabel("my label"); - DataSetTypePE dataSetType = new DataSetTypePE(); - dataSetType.setCode("my type"); - s2.setDatasetTypes(Collections.singleton(dataSetType)); - final DataStorePE store = new DataStorePE(); - store.setServices(new HashSet<DataStoreServicePE>(Arrays.asList(s1, s2))); - context.checking(new Expectations() - { - { - one(dataStoreDAO).listDataStores(); - will(returnValue(Arrays.asList(store))); - } - }); - - List<DataStoreServerProcessingPluginInfo> infos = - service.listDataStoreServerProcessingPluginInfos(SESSION_TOKEN); - - assertEquals(s2.getKey(), infos.get(0).getKey()); - assertEquals(s2.getLabel(), infos.get(0).getLabel()); - assertEquals(Arrays.asList(dataSetType.getCode()), infos.get(0).getDatasetTypeCodes()); - assertEquals(1, infos.size()); - context.assertIsSatisfied(); - } - - @Test - public void testListRawDataSamplesForUnknownUser() - { - prepareGetSession(); - prepareLoginLogout(null); - - try - { - service.listRawDataSamples(SESSION_TOKEN, "abc"); - fail("UserFailureException expected"); - } catch (UserFailureException ex) - { - assertEquals("Unknown user ID: abc", ex.getMessage()); - } - - context.assertIsSatisfied(); - } - - @Test - public void testListRawDataSamples() - { - prepareGetSession(); - prepareLoginLogout(session2); - final Sample sample = new Sample(); - sample.setId(4711L); - sample.setCode("ms-inj-42"); - sample.setRegistrationDate(new Date(4711)); - IEntityProperty p1 = property("integer", DataTypeCode.INTEGER, "123456"); - IEntityProperty p2 = property("real", DataTypeCode.REAL, "1.25"); - IEntityProperty p3 = property("string", DataTypeCode.VARCHAR, "hello"); - sample.setProperties(Arrays.asList(p1, p2, p3)); - Sample parent = new Sample(); - parent.setId(4710L); - parent.setIdentifier("parent"); - IEntityProperty p4 = property("boolean", DataTypeCode.BOOLEAN, "true"); - IEntityProperty p5 = property("link", DataTypeCode.HYPERLINK, "link"); - parent.setProperties(Arrays.asList(p4, p5)); - Experiment experiment = new Experiment(); - experiment.setId(4747L); - experiment.setCode("exp1"); - Project project = new Project(); - project.setCode("project1"); - Space space = new Space(); - space.setCode("space1"); - project.setSpace(space); - experiment.setProject(project); - experiment.setRegistrationDate(new Date(1234567)); - IEntityProperty p6 = property("ex", DataTypeCode.VARCHAR, "exp"); - experiment.setProperties(Arrays.<IEntityProperty> asList(p6)); - parent.setExperiment(experiment); - sample.setGeneratedFrom(parent); - final AbstractExternalData ds1 = createDataSet(RAW_DATA, 10); - final AbstractExternalData ds2 = createDataSet(MZXML_DATA, 20); - AbstractExternalData ds3 = createDataSet(MZXML_DATA, 15); - AbstractExternalData ds4 = createDataSet(RAW_DATA, 30); - ds2.setChildren(Arrays.asList(ds3)); - ds3.setChildren(Arrays.asList(ds4)); - context.checking(new Expectations() - { - { - one(internalService).listRawDataSamples(session2.getSessionToken()); - MsInjectionSample msInjectionSample = new MsInjectionSample(sample, Arrays.asList(ds1, ds2)); - will(returnValue(Arrays.asList(msInjectionSample))); - } - }); - - List<MsInjectionDataInfo> infos = service.listRawDataSamples(SESSION_TOKEN, "abc"); - - MsInjectionDataInfo info = infos.get(0); - assertEquals(sample.getId().longValue(), info.getMsInjectionSampleID()); - assertEquals(sample.getCode(), info.getMsInjectionSampleCode()); - assertEquals(sample.getRegistrationDate(), info.getMsInjectionSampleRegistrationDate()); - checkProperties(info.getMsInjectionSampleProperties(), p1, p2, p3); - assertEquals(parent.getId().longValue(), info.getBiologicalSampleID()); - assertEquals(parent.getIdentifier(), info.getBiologicalSampleIdentifier()); - checkProperties(info.getBiologicalSampleProperties(), p4, p5); - assertEquals("4747:space1/project1/exp1 date:1234567 {ex[EX]=exp}", - renderExperiment(info.getBiologicalExperiment())); - checkProperties(info.getBiologicalExperiment().getProperties(), p6); - List<DataSet> dataSets = new ArrayList<DataSet>(info.getDataSets()); - Collections.sort(dataSets, new Comparator<DataSet>() - { - @Override - public int compare(DataSet d1, DataSet d2) - { - return d1.getCode().compareTo(d2.getCode()); - } - }); - assertEquals("20:MZXML_DATA-20 [MZXML_DATA date:20] {n[N]=2.5}, children:15", - renderDataSet(dataSets.get(0))); - assertEquals("10:RAW_DATA-10 [RAW_DATA date:10] {n[N]=2.5}", renderDataSet(dataSets.get(1))); - assertEquals("15:MZXML_DATA-15 [MZXML_DATA date:15] {n[N]=2.5}, parent:20 , children:30", - renderDataSet(dataSets.get(0).getChildren().iterator().next())); - assertEquals("30:RAW_DATA-30 [RAW_DATA date:30] {n[N]=2.5}, parent:15", - renderDataSet(dataSets.get(0).getChildren().iterator().next().getChildren() - .iterator().next())); - assertEquals(2, dataSets.size()); - Map<String, Date> dates = info.getLatestDataSetRegistrationDates(); - assertEquals(30, dates.get(RAW_DATA).getTime()); - assertEquals(20, dates.get(MZXML_DATA).getTime()); - assertEquals(2, dates.size()); - assertEquals(1, infos.size()); - context.assertIsSatisfied(); - } - - private String renderExperiment(ch.systemsx.cisd.openbis.plugin.proteomics.shared.api.v1.dto.Experiment experiment) - { - StringBuilder builder = new StringBuilder(); - builder.append(experiment.getId()).append(":").append(experiment.getSpaceCode()); - builder.append('/').append(experiment.getProjectCode()); - builder.append('/').append(experiment.getCode()); - builder.append(" date:").append(experiment.getRegistrationDate().getTime()); - builder.append(' ').append(experiment.getProperties()); - return builder.toString(); - } - - private String renderDataSet(DataSet dataSet) - { - StringBuilder builder = new StringBuilder(); - builder.append(dataSet.getId()).append(":").append(dataSet.getCode()); - builder.append(" [").append(dataSet.getType()).append(" date:"); - builder.append(dataSet.getRegistrationDate().getTime()).append("] "); - builder.append(dataSet.getProperties()); - Set<DataSet> parents = dataSet.getParents(); - if (parents != null && parents.isEmpty() == false) - { - builder.append(", parent:"); - for (DataSet parent : parents) - { - builder.append(parent.getId()).append(' '); - } - } - Set<DataSet> children = dataSet.getChildren(); - if (children != null && children.isEmpty() == false) - { - builder.append(", children:"); - for (DataSet child : children) - { - builder.append(child.getId()).append(' '); - } - } - return builder.toString().trim(); - } - - @Test - public void testProcessDataSetsForUnknownUser() - { - prepareGetSession(); - prepareLoginLogout(null); - - try - { - service.processDataSets(SESSION_TOKEN, "abc", null, Arrays.asList("ds1")); - fail("UserFailureException expected"); - } catch (UserFailureException ex) - { - assertEquals("Unknown user ID: abc", ex.getMessage()); - } - - context.assertIsSatisfied(); - } - - @Test - public void testProcessDataSets() - { - prepareGetSession(); - prepareLoginLogout(session2); - context.checking(new Expectations() - { - { - one(internalService).processDataSets(session2.getSessionToken(), "dsp1", Arrays.asList("ds1")); - } - }); - - service.processDataSets(SESSION_TOKEN, "abc", "dsp1", Arrays.asList("ds1")); - - context.assertIsSatisfied(); - } - - @Test - public void testListExperiments() - { - prepareGetSession(); - prepareLoginLogout(session2); - final Experiment e = new Experiment(); - e.setId(42L); - e.setCode("E42"); - Project project = new Project(); - project.setCode("p"); - Space space = new Space(); - space.setCode("s"); - project.setSpace(space); - e.setProject(project); - e.setRegistrationDate(new Date(4711)); - EntityProperty p1 = new EntityProperty(); - PropertyType propertyType = new PropertyType(); - propertyType.setCode("ANSWER"); - propertyType.setLabel("answer"); - propertyType.setDataType(new DataType(DataTypeCode.INTEGER)); - p1.setPropertyType(propertyType); - p1.setValue("42"); - e.setProperties(Arrays.<IEntityProperty> asList(p1)); - context.checking(new Expectations() - { - { - one(internalService).listExperiments(session2.getSessionToken(), MS_SEARCH); - will(returnValue(Arrays.asList(e))); - } - }); - - List<ch.systemsx.cisd.openbis.plugin.proteomics.shared.api.v1.dto.Experiment> experiments = - service.listExperiments(SESSION_TOKEN, "abc", MS_SEARCH); - - assertEquals(e.getId().longValue(), experiments.get(0).getId()); - assertEquals(e.getCode(), experiments.get(0).getCode()); - assertEquals(e.getProject().getCode(), experiments.get(0).getProjectCode()); - assertEquals(e.getProject().getSpace().getCode(), experiments.get(0).getSpaceCode()); - assertEquals(e.getRegistrationDate(), experiments.get(0).getRegistrationDate()); - Map<PropertyKey, Serializable> properties = experiments.get(0).getProperties(); - Set<Entry<PropertyKey, Serializable>> entrySet = properties.entrySet(); - List<Entry<PropertyKey, Serializable>> list = new ArrayList<Entry<PropertyKey, Serializable>>(entrySet); - assertEquals(e.getProperties().get(0).getPropertyType().getCode(), list.get(0).getKey().getId()); - assertEquals(e.getProperties().get(0).getPropertyType().getLabel(), list.get(0).getKey().getLabel()); - Serializable value = list.get(0).getValue(); - assertEquals(Long.class, value.getClass()); - assertEquals(e.getProperties().get(0).getValue(), value.toString()); - assertEquals(1, properties.size()); - assertEquals(1, experiments.size()); - context.assertIsSatisfied(); - } - - @Test - public void testProcessSearchData() - { - prepareGetSession(); - prepareLoginLogout(session2); - final long[] ids = new long[] { 42 }; - context.checking(new Expectations() - { - { - one(internalService).processProteinResultDataSets(session2.getSessionToken(), - "dsp1", MS_SEARCH, ids); - } - }); - - service.processProteinResultDataSets(SESSION_TOKEN, "abc", "dsp1", MS_SEARCH, ids); - - context.assertIsSatisfied(); - } - - private void prepareLoginLogout(final SessionContextDTO mySession) - { - context.checking(new Expectations() - { - { - one(internalService).tryAuthenticate("abc", "dummy-password"); - will(returnValue(mySession)); - - if (mySession != null) - { - one(internalService).logout(mySession.getSessionToken()); - } - } - }); - } - - private void checkProperties(Map<PropertyKey, Serializable> properties, IEntityProperty... expectedProperties) - { - for (IEntityProperty expectedProperty : expectedProperties) - { - PropertyType propertyType = expectedProperty.getPropertyType(); - PropertyKey key = new PropertyKey(propertyType.getCode(), propertyType.getLabel()); - Serializable v = properties.get(key); - assertNotNull("Missing property: " + key, v); - assertEquals("Property " + propertyType, expectedProperty.tryGetAsString(), String.valueOf(v)); - } - assertEquals(expectedProperties.length, properties.size()); - } - - private IEntityProperty property(String code, DataTypeCode dataTypeCode, String value) - { - EntityProperty property = new EntityProperty(); - PropertyType propertyType = new PropertyType(); - propertyType.setCode(code.toUpperCase()); - propertyType.setLabel(code); - propertyType.setDataType(new DataType(dataTypeCode)); - property.setPropertyType(propertyType); - property.setValue(value); - return property; - } - - private AbstractExternalData createDataSet(String type, long date) - { - AbstractExternalData dataSet = new ch.systemsx.cisd.openbis.generic.shared.basic.dto.PhysicalDataSet(); - dataSet.setId(date); - dataSet.setCode(type + "-" + date); - dataSet.setDataSetType(new DataSetType(type)); - dataSet.setRegistrationDate(new Date(date)); - dataSet.setDataSetProperties(Arrays.asList(property("n", DataTypeCode.REAL, "2.5"))); - return dataSet; - } - -} diff --git a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/api/v1/ServerInterfaceRegressionTest.java b/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/api/v1/ServerInterfaceRegressionTest.java deleted file mode 100644 index 78a756dd9d2..00000000000 --- a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/api/v1/ServerInterfaceRegressionTest.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright 2012 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.server.api.v1; - -import org.testng.annotations.Test; - -import ch.systemsx.cisd.openbis.generic.server.util.AnnotationAppliedTestCase; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.api.v1.IProteomicsDataService; - -/** - * @author Franz-Josef Elmer - */ -public class ServerInterfaceRegressionTest extends AnnotationAppliedTestCase -{ - @Test - public void testServerAnnotations() - { - assertMandatoryMethodAnnotations(IProteomicsDataService.class, ProteomicsDataService.class, - "logout: RolesAllowed\n" + "tryToAuthenticateAtRawDataServer: RolesAllowed\n", null); - } -} diff --git a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/authorization/validator/RawDataSampleValidatorTest.java b/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/authorization/validator/RawDataSampleValidatorTest.java deleted file mode 100644 index 1252d2eb5b7..00000000000 --- a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/authorization/validator/RawDataSampleValidatorTest.java +++ /dev/null @@ -1,182 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.server.authorization.validator; - -import java.util.Arrays; -import java.util.LinkedHashSet; - -import org.jmock.Expectations; -import org.jmock.Mockery; -import org.testng.AssertJUnit; -import org.testng.annotations.AfterMethod; -import org.testng.annotations.BeforeMethod; -import org.testng.annotations.Test; - -import ch.systemsx.cisd.openbis.generic.server.authorization.AuthorizationDataProvider; -import ch.systemsx.cisd.openbis.generic.server.authorization.TestAuthorizationConfig; -import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDAOFactory; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.RoleWithHierarchy.RoleCode; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Space; -import ch.systemsx.cisd.openbis.generic.shared.dto.PersonPE; -import ch.systemsx.cisd.openbis.generic.shared.dto.RoleAssignmentPE; -import ch.systemsx.cisd.openbis.generic.shared.dto.SpacePE; -import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifier; -import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifierFactory; -import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SpaceIdentifier; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.dto.MsInjectionSample; - -/** - * @author Franz-Josef Elmer - */ -public class RawDataSampleValidatorTest extends AssertJUnit -{ - - private static final MsInjectionSample NO_PARENT = create("no-parent", null); - - private static final MsInjectionSample WITH_INSTANCE_PARENT = create("with-instance-parent", "/parent"); - - private static final MsInjectionSample WITH_PARENT_IN_G1 = create("with-parent-in-g1", "/g1/parent"); - - private static final MsInjectionSample WITH_PARENT_IN_G2 = create("with-parent-in-g2", "/g2/parent"); - - private Mockery context; - - private RawDataSampleValidator validator; - - private IDAOFactory daoFactory; - - @BeforeMethod - protected void beforeMethod() - { - context = new Mockery(); - daoFactory = context.mock(IDAOFactory.class); - validator = new RawDataSampleValidator(); - validator.init(new AuthorizationDataProvider(daoFactory)); - } - - @AfterMethod - protected void afterMethod() - { - context.assertIsSatisfied(); - } - - private static MsInjectionSample create(String sampleCode, String parentSampleIdentifierOrNull) - { - Sample sample = new Sample(); - sample.setCode(sampleCode); - if (parentSampleIdentifierOrNull != null) - { - Sample parent = new Sample(); - parent.setIdentifier(parentSampleIdentifierOrNull); - SampleIdentifier identifier = - SampleIdentifierFactory.parse(parentSampleIdentifierOrNull); - parent.setCode(identifier.getSampleCode()); - SpaceIdentifier spaceLevel = identifier.getSpaceLevel(); - if (spaceLevel != null) - { - Space space = new Space(); - space.setCode(spaceLevel.getSpaceCode()); - parent.setSpace(space); - } - sample.setGeneratedFrom(parent); - } - return new MsInjectionSample(sample, Arrays.<AbstractExternalData> asList()); - } - - @Test - public void testUserWithNoRights() - { - context.checking(new Expectations() - { - { - allowing(daoFactory).getAuthorizationConfig(); - will(returnValue(new TestAuthorizationConfig(false, false))); - } - }); - - PersonPE person = createPersonWithRoles(); - - assertEquals(false, validator.isValid(person, NO_PARENT)); - assertEquals(true, validator.isValid(person, WITH_INSTANCE_PARENT)); - assertEquals(false, validator.isValid(person, WITH_PARENT_IN_G1)); - assertEquals(false, validator.isValid(person, WITH_PARENT_IN_G2)); - } - - @Test - public void testUserWithRightsForGroupG1() - { - context.checking(new Expectations() - { - { - allowing(daoFactory).getAuthorizationConfig(); - will(returnValue(new TestAuthorizationConfig(false, false))); - } - }); - - PersonPE person = createPersonWithRoles(createRole("G1")); - - assertEquals(false, validator.isValid(person, NO_PARENT)); - assertEquals(true, validator.isValid(person, WITH_INSTANCE_PARENT)); - assertEquals(true, validator.isValid(person, WITH_PARENT_IN_G1)); - assertEquals(false, validator.isValid(person, WITH_PARENT_IN_G2)); - } - - @Test - public void testUserWithRightsForGroupG1AndG2() - { - PersonPE person = createPersonWithRoles(createRole("G1"), createRole("G2")); - - assertEquals(false, validator.isValid(person, NO_PARENT)); - assertEquals(true, validator.isValid(person, WITH_INSTANCE_PARENT)); - assertEquals(true, validator.isValid(person, WITH_PARENT_IN_G1)); - assertEquals(true, validator.isValid(person, WITH_PARENT_IN_G2)); - } - - @Test - public void testUserWithRightsForForInstanceT() - { - PersonPE person = createPersonWithRoles(createRole(null)); - - assertEquals(false, validator.isValid(person, NO_PARENT)); - assertEquals(true, validator.isValid(person, WITH_INSTANCE_PARENT)); - assertEquals(true, validator.isValid(person, WITH_PARENT_IN_G1)); - assertEquals(true, validator.isValid(person, WITH_PARENT_IN_G2)); - } - - private PersonPE createPersonWithRoles(RoleAssignmentPE... roles) - { - PersonPE person = new PersonPE(); - person.setRoleAssignments(new LinkedHashSet<RoleAssignmentPE>(Arrays.asList(roles))); - return person; - } - - private RoleAssignmentPE createRole(String groupCodeOrNull) - { - RoleAssignmentPE role = new RoleAssignmentPE(); - role.setRole(RoleCode.ADMIN); - - if (groupCodeOrNull != null) - { - SpacePE group = new SpacePE(); - group.setCode(groupCodeOrNull); - role.setSpace(group); - } - return role; - } -} diff --git a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/AbstractBOTestCase.java b/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/AbstractBOTestCase.java deleted file mode 100644 index df0bba52ee2..00000000000 --- a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/AbstractBOTestCase.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright 2011 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.server.business; - -import org.testng.annotations.BeforeMethod; - -import ch.systemsx.cisd.openbis.generic.shared.AbstractServerTestCase; -import ch.systemsx.cisd.openbis.plugin.proteomics.server.dataaccess.IPhosphoNetXDAOFactory; -import ch.systemsx.cisd.openbis.plugin.proteomics.server.dataaccess.IProteinQueryDAO; - -/** - * @author Franz-Josef Elmer - */ -public abstract class AbstractBOTestCase extends AbstractServerTestCase -{ - protected IPhosphoNetXDAOFactory specificDAOFactory; - - protected IProteinQueryDAO proteinDAO; - - @Override - @BeforeMethod - public void setUp() - { - super.setUp(); - specificDAOFactory = context.mock(IPhosphoNetXDAOFactory.class); - proteinDAO = context.mock(IProteinQueryDAO.class); - } - -} diff --git a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/AbstractLoaderTestCase.java b/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/AbstractLoaderTestCase.java deleted file mode 100644 index b8ea7079891..00000000000 --- a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/AbstractLoaderTestCase.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.server.business; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.test.annotation.Rollback; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.transaction.annotation.Transactional; - -import ch.systemsx.cisd.authentication.Principal; -import ch.systemsx.cisd.openbis.generic.server.business.bo.ICommonBusinessObjectFactory; -import ch.systemsx.cisd.openbis.generic.server.dataaccess.db.AbstractDAOWithoutContextTest; -import ch.systemsx.cisd.openbis.generic.shared.CommonTestUtils; -import ch.systemsx.cisd.openbis.generic.shared.dto.Session; - -/** - * @author Franz-Josef Elmer - */ -@ContextConfiguration(locations = "classpath:proteomics-applicationContext.xml") -// In 'commonContext.xml', our transaction manager is called 'transaction-manager' (by default -// Spring looks for 'transactionManager'). -@Transactional(transactionManager = "transaction-manager") -@Rollback -public abstract class AbstractLoaderTestCase extends AbstractDAOWithoutContextTest -{ - private static final Principal PRINCIPAL = new Principal(CommonTestUtils.USER_ID, "john", - "doe", "j@d"); - - private static final String SESSION_TOKEN = "session-token"; - - protected ICommonBusinessObjectFactory boFactory; - - @Autowired - public final void setBoFactory(final ICommonBusinessObjectFactory boFactory) - { - this.boFactory = boFactory; - } - - protected Session session() - { - return new Session(CommonTestUtils.USER_ID, SESSION_TOKEN, - PRINCIPAL, "remote-host", 1); - } -} diff --git a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/AbundanceColumnDefinitionTableTest.java b/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/AbundanceColumnDefinitionTableTest.java deleted file mode 100644 index eb09955054b..00000000000 --- a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/AbundanceColumnDefinitionTableTest.java +++ /dev/null @@ -1,169 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.server.business; - -import static ch.systemsx.cisd.openbis.plugin.proteomics.server.business.TreatmentFinder.TREATMENT_TYPE_CODE; -import static ch.systemsx.cisd.openbis.plugin.proteomics.server.business.TreatmentFinder.TREATMENT_VALUE_CODE; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -import org.testng.annotations.BeforeMethod; -import org.testng.annotations.Test; - -import ch.systemsx.cisd.openbis.generic.shared.AbstractServerTestCase; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataType; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataTypeCode; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityProperty; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PropertyType; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.VocabularyTerm; -import ch.systemsx.cisd.openbis.plugin.proteomics.server.business.AbundanceColumnDefinitionTable; -import ch.systemsx.cisd.openbis.plugin.proteomics.server.dataaccess.IPhosphoNetXDAOFactory; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.AbundanceColumnDefinition; - -/** - * @author Franz-Josef Elmer - */ -public class AbundanceColumnDefinitionTableTest extends AbstractServerTestCase -{ - private IPhosphoNetXDAOFactory phosphoNetXDAOFactory; - - private AbundanceColumnDefinitionTable table; - - @Override - @BeforeMethod - public void setUp() - { - super.setUp(); - phosphoNetXDAOFactory = context.mock(IPhosphoNetXDAOFactory.class); - table = new AbundanceColumnDefinitionTable(daoFactory, phosphoNetXDAOFactory, session); - } - - @Test - public void testNoAbundanceColumns() - { - List<AbundanceColumnDefinition> definitions = table.getSortedAndAggregatedDefinitions(null); - - assertEquals(0, definitions.size()); - - context.assertIsSatisfied(); - } - - @Test - public void testOneAbundanceColumnWithoutTreatment() - { - Sample s1 = createSample(42); - - table.add(s1); - List<AbundanceColumnDefinition> definitions = table.getSortedAndAggregatedDefinitions(null); - - assertEquals(1, definitions.size()); - assertEquals(42l, definitions.get(0).getID()); - assertEquals("code-42", definitions.get(0).getSampleCode()); - assertEquals(0, definitions.get(0).getTreatments().size()); - - context.assertIsSatisfied(); - } - - @Test - public void testOneAbundanceColumnWithOneTreatment() - { - Sample s1 = createSample(42); - addTreatment(s1, "", "abc"); - - table.add(s1); - List<AbundanceColumnDefinition> definitions = table.getSortedAndAggregatedDefinitions(null); - - assertEquals(1, definitions.size()); - assertEquals(42l, definitions.get(0).getID()); - assertEquals("code-42", definitions.get(0).getSampleCode()); - assertEquals(1, definitions.get(0).getTreatments().size()); - assertEquals("pH", definitions.get(0).getTreatments().get(0).getType()); - assertEquals("PH", definitions.get(0).getTreatments().get(0).getTypeCode()); - assertEquals("abc", definitions.get(0).getTreatments().get(0).getValue()); - - context.assertIsSatisfied(); - } - - @Test - public void testAbundanceColumnsForTwoSamplesWithSameParent() - { - Sample s1 = createSample(42); - Sample s2 = createSample(43); - Sample parent = createSample(4711); - s1.setGeneratedFrom(parent); - s2.setGeneratedFrom(parent); - addTreatment(parent, "", "abc"); - - table.add(s1); - table.add(s2); - List<AbundanceColumnDefinition> definitions = table.getSortedAndAggregatedDefinitions(null); - - assertEquals(1, definitions.size()); - assertEquals(4711l, definitions.get(0).getID()); - assertEquals("code-4711", definitions.get(0).getSampleCode()); - assertEquals(1, definitions.get(0).getTreatments().size()); - assertEquals("pH", definitions.get(0).getTreatments().get(0).getType()); - assertEquals("PH", definitions.get(0).getTreatments().get(0).getTypeCode()); - assertEquals("abc", definitions.get(0).getTreatments().get(0).getValue()); - - context.assertIsSatisfied(); - } - - private Sample createSample(long sampleID) - { - Sample sample = new Sample(); - sample.setId(sampleID); - sample.setCode("code-" + sampleID); - sample.setPermId("abc-" + sampleID); - sample.setProperties(Collections.<IEntityProperty> emptyList()); - return sample; - } - - private void addTreatment(Sample sample, String type, String value) - { - List<IEntityProperty> properties = new ArrayList<IEntityProperty>(); - EntityProperty sampleProperty = new EntityProperty(); - sampleProperty.setPropertyType(createPropertyType(TREATMENT_TYPE_CODE + type)); - VocabularyTerm term = new VocabularyTerm(); - term.setCode("PH"); - term.setLabel("pH"); - sampleProperty.setVocabularyTerm(term); - properties.add(sampleProperty); - - sampleProperty = new EntityProperty(); - sampleProperty.setPropertyType(createPropertyType(TREATMENT_VALUE_CODE + type)); - sampleProperty.setValue(value); - properties.add(sampleProperty); - - sample.setProperties(properties); - } - - private PropertyType createPropertyType(String code) - { - PropertyType propertyType = new PropertyType(); - propertyType.setCode(code); - DataType dataType = new DataType(); - dataType.setCode(DataTypeCode.VARCHAR); - propertyType.setDataType(dataType); - return propertyType; - } - -} diff --git a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/AbundanceManagerTest.java b/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/AbundanceManagerTest.java deleted file mode 100644 index 34fe966b910..00000000000 --- a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/AbundanceManagerTest.java +++ /dev/null @@ -1,170 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.server.business; - -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.Iterator; - -import org.jmock.Expectations; -import org.testng.annotations.BeforeMethod; -import org.testng.annotations.Test; - -import ch.systemsx.cisd.openbis.generic.shared.AbstractServerTestCase; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample; -import ch.systemsx.cisd.openbis.plugin.proteomics.server.business.AbundanceManager; -import ch.systemsx.cisd.openbis.plugin.proteomics.server.business.ISampleProvider; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.dto.ProteinAbundance; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.dto.ProteinReferenceWithProtein; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.dto.ProteinWithAbundances; - -/** - * @author Franz-Josef Elmer - */ -public class AbundanceManagerTest extends AbstractServerTestCase -{ - private static final String PERM_ID1 = "s101"; - - private static final String PERM_ID2 = "s102"; - - private static final long SAMPLE_ID_A = 42; - - private static final long SAMPLE_ID_B = 4711; - - private AbundanceManager abundanceManager; - - private ISampleProvider sampleProvider; - - @Override - @BeforeMethod - public void setUp() - { - super.setUp(); - - sampleProvider = context.mock(ISampleProvider.class); - abundanceManager = new AbundanceManager(sampleProvider); - } - - @Test - public void testNoProteinReferenceHandled() - { - assertEquals(0, abundanceManager.getSampleIDs().size()); - assertEquals(0, abundanceManager.getProteinsWithAbundances().size()); - } - - @Test - public void testHandleTwoProteinReferencesButOnlyOneHasAnAbundance() - { - prepareSampleIDProvider(); - ProteinReferenceWithProtein protein1 = new ProteinReferenceWithProtein(); - protein1.setId(1); - protein1.setAccessionNumber("abc1"); - protein1.setDescription("abc one"); - ProteinAbundance proteinAbundance = new ProteinAbundance(); - proteinAbundance.setSampleID(PERM_ID1); - proteinAbundance.setAbundance(1.5); - abundanceManager.handle(protein1, Collections.singletonList(proteinAbundance)); - ProteinReferenceWithProtein protein2 = new ProteinReferenceWithProtein(); - protein2.setId(2); - protein2.setAccessionNumber("abc2"); - protein2.setDescription("abc two"); - abundanceManager.handle(protein2, null); - - assertEquals(1, abundanceManager.getSampleIDs().size()); - Collection<ProteinWithAbundances> proteinsWithAbundances = abundanceManager.getProteinsWithAbundances(); - assertEquals(2, proteinsWithAbundances.size()); - Iterator<ProteinWithAbundances> iterator = proteinsWithAbundances.iterator(); - ProteinWithAbundances p1 = iterator.next(); - assertEquals(1, p1.getId()); - assertEquals("abc one", p1.getDescription()); - assertEquals("abc1", p1.getAccessionNumber()); - assertEquals(1, p1.getSampleIDs().size()); - assertEquals(SAMPLE_ID_A, p1.getSampleIDs().iterator().next().longValue()); - assertEquals(0, p1.getAbundancesForSample(12345678).length); - assertEquals(1, p1.getAbundancesForSample(SAMPLE_ID_A).length); - assertEquals(1.5, p1.getAbundancesForSample(SAMPLE_ID_A)[0]); - ProteinWithAbundances p2 = iterator.next(); - assertEquals(2, p2.getId()); - assertEquals("abc two", p2.getDescription()); - assertEquals("abc2", p2.getAccessionNumber()); - assertEquals(0, p2.getSampleIDs().size()); - - context.assertIsSatisfied(); - } - - @Test - public void testHandleProteinReferencesWithManyAbundancesForTwoSamples() - { - prepareSampleIDProvider(); - ProteinReferenceWithProtein protein1 = new ProteinReferenceWithProtein(); - protein1.setId(1); - protein1.setAccessionNumber("abc1"); - protein1.setDescription("abc one"); - - abundanceManager.handle(protein1, Arrays.asList(a(PERM_ID1, 1.5), a(PERM_ID1, 2.25), a( - PERM_ID2, 42), a(PERM_ID2, 4.75), a(PERM_ID2, 7.5))); - - assertEquals(2, abundanceManager.getSampleIDs().size()); - Collection<ProteinWithAbundances> proteinsWithAbundances = abundanceManager.getProteinsWithAbundances(); - assertEquals(1, proteinsWithAbundances.size()); - ProteinWithAbundances protein = proteinsWithAbundances.iterator().next(); - assertEquals(1, protein.getId()); - assertEquals("abc one", protein.getDescription()); - assertEquals("abc1", protein.getAccessionNumber()); - assertEquals(2, protein.getSampleIDs().size()); - Iterator<Long> iterator = protein.getSampleIDs().iterator(); - assertEquals(SAMPLE_ID_A, iterator.next().longValue()); - assertEquals(SAMPLE_ID_B, iterator.next().longValue()); - assertEquals(2, protein.getAbundancesForSample(SAMPLE_ID_A).length); - assertEquals(1.5, protein.getAbundancesForSample(SAMPLE_ID_A)[0]); - assertEquals(2.25, protein.getAbundancesForSample(SAMPLE_ID_A)[1]); - assertEquals(3, protein.getAbundancesForSample(SAMPLE_ID_B).length); - assertEquals(42.0, protein.getAbundancesForSample(SAMPLE_ID_B)[0]); - assertEquals(4.75, protein.getAbundancesForSample(SAMPLE_ID_B)[1]); - assertEquals(7.5, protein.getAbundancesForSample(SAMPLE_ID_B)[2]); - - context.assertIsSatisfied(); - } - - private void prepareSampleIDProvider() - { - context.checking(new Expectations() - { - { - allowing(sampleProvider).getSample(PERM_ID1); - Sample s1 = new Sample(); - s1.setId(SAMPLE_ID_A); - will(returnValue(s1)); - allowing(sampleProvider).getSample(PERM_ID2); - Sample s2 = new Sample(); - Sample parent = new Sample(); - parent.setId(SAMPLE_ID_B); - s2.setGeneratedFrom(parent); - will(returnValue(s2)); - } - }); - } - - private ProteinAbundance a(String samplePermID, double abundance) - { - ProteinAbundance protein = new ProteinAbundance(); - protein.setSampleID(samplePermID); - protein.setAbundance(abundance); - return protein; - } -} diff --git a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/AccessionNumberBuilderTest.java b/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/AccessionNumberBuilderTest.java deleted file mode 100644 index 4a881fe08b1..00000000000 --- a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/AccessionNumberBuilderTest.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.server.business; - -import org.testng.AssertJUnit; -import org.testng.annotations.Test; - -import ch.systemsx.cisd.openbis.plugin.proteomics.server.business.AccessionNumberBuilder; - -/** - * @author Franz-Josef Elmer - */ -public class AccessionNumberBuilderTest extends AssertJUnit -{ - @Test - public void test() - { - check(null, "", ""); - check(null, "abc", "abc"); - check(null, "DECOY_abc", "DECOY_abc"); - check("", "abc", "|abc"); - check("", "DECOY_abc", "DECOY_|abc"); - check("", "ab", "|ab|c"); - check("a", "b", "a|b"); - check("a", "DECOY_b", "DECOY_a|b"); - check("a", "DECOY_b", "DECOY_a|DECOY_b"); - check("a", "b", "a|b|c"); - check("a", "DECOY_b", "DECOY_a|b|c"); - check("a", "DECOY_b", "DECOY_a|DECOY_b|c"); - check("a", "", "a||c"); - check("a", "DECOY_", "DECOY_a||c"); - check("", "", "||c"); - check("", "", "||"); - check("", "", "|"); - } - - private void check(String expectedType, String expectedAccessionNumber, String fullAccessionNumber) - { - AccessionNumberBuilder builder = new AccessionNumberBuilder(fullAccessionNumber); - assertEquals(expectedType, builder.getTypeOrNull()); - assertEquals(expectedAccessionNumber, builder.getAccessionNumber()); - } -} diff --git a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/ErrorModelTest.java b/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/ErrorModelTest.java deleted file mode 100644 index 394afd559d3..00000000000 --- a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/ErrorModelTest.java +++ /dev/null @@ -1,159 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.server.business; - -import org.jmock.Expectations; -import org.jmock.Mockery; -import org.testng.AssertJUnit; -import org.testng.annotations.AfterMethod; -import org.testng.annotations.BeforeMethod; -import org.testng.annotations.Test; - -import ch.systemsx.cisd.openbis.common.eodsql.MockDataSet; -import ch.systemsx.cisd.openbis.plugin.proteomics.server.dataaccess.IProteinQueryDAO; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.dto.IdentifiedProtein; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.dto.ProbabilityFDRMapping; - -/** - * @author Franz-Josef Elmer - */ -public class ErrorModelTest extends AssertJUnit -{ - private static final double TOL = 1e-6; - - private static final long DATA_SET1_ID = 42; - - private static final long DATA_SET2_ID = 43; - - private static final long DATA_SET3_ID = 44; - - private Mockery context; - - private IProteinQueryDAO proteinQueryDAO; - - private ErrorModel errorModel; - - @BeforeMethod - public void beforeMethod() - { - context = new Mockery(); - proteinQueryDAO = context.mock(IProteinQueryDAO.class); - errorModel = new ErrorModel(proteinQueryDAO); - context.checking(new Expectations() - { - { - - atMost(1).of(proteinQueryDAO).getProbabilityFDRMapping(DATA_SET1_ID); - MockDataSet<ProbabilityFDRMapping> dataSet1 = new MockDataSet<ProbabilityFDRMapping>(); - createEntry(dataSet1, 0.4, 0.9); - createEntry(dataSet1, 0.5, 0.95); - will(returnValue(dataSet1)); - - atMost(1).of(proteinQueryDAO).getProbabilityFDRMapping(DATA_SET2_ID); - MockDataSet<ProbabilityFDRMapping> dataSet2 = new MockDataSet<ProbabilityFDRMapping>(); - createEntry(dataSet2, 1, 1); - createEntry(dataSet2, 0.4, 0.9); - createEntry(dataSet2, 0.1, 0.7); - createEntry(dataSet2, 0.0, 0.6); - will(returnValue(dataSet2)); - - atMost(1).of(proteinQueryDAO).getProbabilityFDRMapping(DATA_SET3_ID); - MockDataSet<ProbabilityFDRMapping> dataSet3 = new MockDataSet<ProbabilityFDRMapping>(); - will(returnValue(dataSet3)); - } - }); - } - - @AfterMethod - public void afterMethod() - { - // To following line of code should also be called at the end of each test method. - // Otherwise one do not known which test failed. - context.assertIsSatisfied(); - } - - @Test - public void testExact() - { - IdentifiedProtein protein = create(DATA_SET1_ID, 0.4); - errorModel.setFalseDiscoveryRateFor(protein); - - assertEquals(0.9, protein.getFalseDiscoveryRate(), TOL); - - context.assertIsSatisfied(); - } - - @Test - public void testInterpolation() - { - IdentifiedProtein protein = create(DATA_SET1_ID, 0.42); - errorModel.setFalseDiscoveryRateFor(protein); - - assertEquals(0.91, protein.getFalseDiscoveryRate(), TOL); - - context.assertIsSatisfied(); - } - - @Test - public void testCachedMapping() - { - IdentifiedProtein protein = create(DATA_SET1_ID, 0.42); - errorModel.setFalseDiscoveryRateFor(protein); - - assertEquals(0.91, protein.getFalseDiscoveryRate(), TOL); - - protein = create(DATA_SET2_ID, 0.25); - errorModel.setFalseDiscoveryRateFor(protein); - - assertEquals(0.8, protein.getFalseDiscoveryRate(), TOL); - - protein = create(DATA_SET1_ID, 0.5); - errorModel.setFalseDiscoveryRateFor(protein); - - assertEquals(0.95, protein.getFalseDiscoveryRate(), TOL); - - context.assertIsSatisfied(); - } - - @Test - public void testNoMappings() - { - IdentifiedProtein protein = create(DATA_SET3_ID, 0.2); - - errorModel.setFalseDiscoveryRateFor(protein); - - double falseDiscoveryRate = protein.getFalseDiscoveryRate(); - assertTrue("unexpected FDR: " + falseDiscoveryRate, Double.isNaN(falseDiscoveryRate)); - } - - private IdentifiedProtein create(long dataSetID, double probability) - { - IdentifiedProtein protein = new IdentifiedProtein(); - protein.setDataSetID(dataSetID); - protein.setProbability(probability); - return protein; - } - - private void createEntry(MockDataSet<ProbabilityFDRMapping> dataSet, double propability, - double falseDiscoveryRate) - { - ProbabilityFDRMapping mapping = new ProbabilityFDRMapping(); - mapping.setProbability(propability); - mapping.setFalseDiscoveryRate(falseDiscoveryRate); - dataSet.add(mapping); - } -} diff --git a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/ExperimentLoaderTest.java b/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/ExperimentLoaderTest.java deleted file mode 100644 index 3f7b6ad9887..00000000000 --- a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/ExperimentLoaderTest.java +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.server.business; - -import static org.testng.AssertJUnit.assertEquals; - -import java.util.ArrayList; -import java.util.List; - -import org.testng.annotations.Test; - -import ch.systemsx.cisd.openbis.generic.server.TestJythonEvaluatorPool; -import ch.systemsx.cisd.openbis.generic.server.dataaccess.ISampleDAO; -import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample; -import ch.systemsx.cisd.openbis.generic.shared.managed_property.ManagedPropertyEvaluatorFactory; -import ch.systemsx.cisd.openbis.generic.shared.translator.SampleTranslator; - -/** - * @author Franz-Josef Elmer - */ -@Test(groups = "db") -public class ExperimentLoaderTest extends AbstractLoaderTestCase -{ - @Test - public void test() - { - ExperimentLoader loader = - new ExperimentLoader(daoFactory, new ManagedPropertyEvaluatorFactory(null, new TestJythonEvaluatorPool())); - List<Sample> samples = loadSamples(980L, 981L, 986L); - - loader.enrichWithExperiments(session(), samples); - - StringBuilder builder = new StringBuilder(); - for (Sample sample : samples) - { - builder.append(sample.getId()).append(' ').append(sample.getCode()); - Experiment experiment = sample.getExperiment(); - if (experiment != null) - { - builder.append(": ").append(experiment.getCode()).append(' '); - builder.append(getSortedProperties(experiment)); - } - builder.append('\n'); - } - assertEquals("980 3V-126\n" + "981 DP\n" - + "986 3VCP5: EXP10 [DESCRIPTION: A simple experiment, GENDER: MALE]\n", - builder.toString()); - } - - private List<Sample> loadSamples(Long... ids) - { - ISampleDAO sampleDAO = daoFactory.getSampleDAO(); - List<Sample> list = new ArrayList<Sample>(); - for (Long id : ids) - { - list.add(SampleTranslator.translate(sampleDAO.tryGetByTechId(new TechId(id)), "", null, - new ManagedPropertyEvaluatorFactory(null, new TestJythonEvaluatorPool()), null)); - - } - return list; - } -} diff --git a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/ProteinInfoTableTest.java b/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/ProteinInfoTableTest.java deleted file mode 100644 index 3c2741cf5b6..00000000000 --- a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/ProteinInfoTableTest.java +++ /dev/null @@ -1,302 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.server.business; - -import it.unimi.dsi.fastutil.longs.LongArraySet; -import it.unimi.dsi.fastutil.longs.LongSet; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Map; - -import net.lemnik.eodsql.DataSet; - -import org.jmock.Expectations; -import org.testng.annotations.BeforeMethod; -import org.testng.annotations.Test; - -import ch.systemsx.cisd.openbis.common.eodsql.MockDataSet; -import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample; -import ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentPE; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.AbundanceColumnDefinition; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.AggregateFunction; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.ProteinInfo; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.dto.ProbabilityFDRMapping; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.dto.ProteinAbundance; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.dto.ProteinReferenceWithProtein; - -/** - * @author Franz-Josef Elmer - */ -public class ProteinInfoTableTest extends AbstractBOTestCase -{ - private static final double COVERAGE = 0.5; - - private static final String PERM_ID_PREFIX = "abc-"; - - private static final long SAMPLE_ID_3 = 211L; - - private static final long SAMPLE_ID_2 = 102L; - - private static final long SAMPLE_ID_1 = 101L; - - private static final Double ABUNDANCE = new Double(47.11); - - private static final long PROTEIN_ID = 4141L; - - private static final long PROTEIN_REFERENCE_ID = 41L; - - private static final String SAMPLE_PERM_ID = "s47-11"; - - private static final long SAMPLE_ID = 4711; - - private static final long DATA_SET_ID = 42L; - - private static final TechId EXPERIMENT_ID = new TechId(234L); - - private static final String EXPERIMENT_PERM_ID = "abc-234"; - - private static final double FALSE_DISCOVERY_RATE = 0.25; - - private static final String ACCESSION_NUMBER = "ABC123"; - - private ProteinInfoTable table; - - private ArrayList<AbundanceColumnDefinition> definitions; - - private ISampleProvider sampleProvider; - - @Override - @BeforeMethod - public void setUp() - { - super.setUp(); - sampleProvider = context.mock(ISampleProvider.class); - table = new ProteinInfoTable(daoFactory, specificDAOFactory, session, sampleProvider); - definitions = new ArrayList<AbundanceColumnDefinition>(); - definitions.add(create(SAMPLE_ID_1, SAMPLE_ID_2)); - definitions.add(create(SAMPLE_ID_3)); - } - - private AbundanceColumnDefinition create(long... ids) - { - AbundanceColumnDefinition definition = new AbundanceColumnDefinition(); - for (long id : ids) - { - definition.addSampleID(id); - } - return definition; - } - - @Test - public void testLoadLeadingToAnEmptyTable() - { - prepareGetProteinQueryDAO(EXPERIMENT_PERM_ID); - MockDataSet<ProteinReferenceWithProtein> proteinReferences = new MockDataSet<ProteinReferenceWithProtein>(); - MockDataSet<ProteinAbundance> proteinAbundances = new MockDataSet<ProteinAbundance>(); - prepareLoadDataSet(proteinReferences, proteinAbundances); - - table.load(Arrays.<AbundanceColumnDefinition> asList(), EXPERIMENT_ID, - FALSE_DISCOVERY_RATE, AggregateFunction.MEAN, false); - - assertEquals(0, table.getProteinInfos().size()); - - assertEquals(true, proteinReferences.hasCloseBeenInvoked()); - assertEquals(true, proteinAbundances.hasCloseBeenInvoked()); - context.assertIsSatisfied(); - } - - @Test - public void testSimpleLoad() - { - prepareGetProteinQueryDAO(EXPERIMENT_PERM_ID); - MockDataSet<ProteinReferenceWithProtein> proteinReferences = - new MockDataSet<ProteinReferenceWithProtein>(); - MockDataSet<ProteinAbundance> abundances = new MockDataSet<ProteinAbundance>(); - ProteinReferenceWithProtein proteinReference = new ProteinReferenceWithProtein(); - proteinReference.setDataSetID(DATA_SET_ID); - proteinReference.setProteinID(PROTEIN_ID); - proteinReference.setAccessionNumber(ACCESSION_NUMBER); - proteinReference.setId(PROTEIN_REFERENCE_ID); - proteinReferences.add(proteinReference); - ProteinAbundance proteinAbundance = new ProteinAbundance(); - proteinAbundance.setId(PROTEIN_ID); - proteinAbundance.setAbundance(ABUNDANCE); - proteinAbundance.setSampleID(SAMPLE_PERM_ID); - abundances.add(proteinAbundance); - proteinReference = new ProteinReferenceWithProtein(); - proteinReference.setProteinID(PROTEIN_ID); - proteinReference.setId(PROTEIN_REFERENCE_ID); - proteinReference.setProbability(1); - proteinReference.setDataSetID(DATA_SET_ID); - proteinReferences.add(proteinReference); - final MockDataSet<ProbabilityFDRMapping> mappings = new MockDataSet<ProbabilityFDRMapping>(); - mappings.add(new ProbabilityFDRMapping()); - ProbabilityFDRMapping mapping = new ProbabilityFDRMapping(); - mapping.setProbability(1); - mapping.setFalseDiscoveryRate(1); - mappings.add(mapping); - prepareLoadDataSet(proteinReferences, abundances); - context.checking(new Expectations() - { - { - one(proteinDAO).getProbabilityFDRMapping(DATA_SET_ID); - will(returnValue(mappings)); - - one(sampleProvider).getSample(SAMPLE_PERM_ID); - Sample sample = new Sample(); - Sample parent = new Sample(); - parent.setId(SAMPLE_ID); - sample.setGeneratedFrom(parent); - will(returnValue(sample)); - } - }); - - table.load(Arrays.<AbundanceColumnDefinition> asList(), EXPERIMENT_ID, - FALSE_DISCOVERY_RATE, AggregateFunction.MEAN, false); - - Collection<ProteinInfo> proteins = table.getProteinInfos(); - assertEquals(1, proteins.size()); - ProteinInfo protein = proteins.iterator().next(); - assertEquals(PROTEIN_REFERENCE_ID, protein.getId().getId().longValue()); - assertEquals(ACCESSION_NUMBER, protein.getAccessionNumber()); - - assertEquals(true, proteinReferences.hasCloseBeenInvoked()); - assertEquals(true, mappings.hasCloseBeenInvoked()); - context.assertIsSatisfied(); - } - - @Test - public void testLoadWithAggregationOnOriginal() - { - checkAggregationType(2.0, true); - } - - @Test - public void testLoadWithAggregationOnAggregation() - { - checkAggregationType(2.25, false); - } - - private void checkAggregationType(double expectedAbundance, boolean aggregateOriginal) - { - prepareGetProteinQueryDAO(EXPERIMENT_PERM_ID); - final MockDataSet<ProteinReferenceWithProtein> proteinReferences = - new MockDataSet<ProteinReferenceWithProtein>(); - ProteinReferenceWithProtein proteinReference = new ProteinReferenceWithProtein(); - proteinReference.setProteinID(PROTEIN_ID); - proteinReference.setDataSetID(DATA_SET_ID); - proteinReference.setAccessionNumber(ACCESSION_NUMBER); - proteinReference.setId(PROTEIN_REFERENCE_ID); - proteinReference.setCoverage(COVERAGE); - proteinReferences.add(proteinReference); - MockDataSet<ProteinAbundance> proteinAbundances = new MockDataSet<ProteinAbundance>(); - proteinAbundances.add(createProteinAbundance(SAMPLE_ID_1, 1)); - proteinAbundances.add(createProteinAbundance(SAMPLE_ID_1, 2)); - proteinAbundances.add(createProteinAbundance(SAMPLE_ID_2, 3)); - proteinAbundances.add(createProteinAbundance(SAMPLE_ID_3, 20)); - final MockDataSet<ProbabilityFDRMapping> mappings = new MockDataSet<ProbabilityFDRMapping>(); - mappings.add(new ProbabilityFDRMapping()); - ProbabilityFDRMapping mapping = new ProbabilityFDRMapping(); - mapping.setProbability(1); - mapping.setFalseDiscoveryRate(1); - mappings.add(mapping); - prepareLoadDataSet(proteinReferences, proteinAbundances); - context.checking(new Expectations() - { - { - one(proteinDAO).getProbabilityFDRMapping(DATA_SET_ID); - will(returnValue(mappings)); - - for (long id : new long[] { SAMPLE_ID_1, SAMPLE_ID_2, SAMPLE_ID_3 }) - { - atLeast(1).of(sampleProvider).getSample(PERM_ID_PREFIX + id); - Sample sample = new Sample(); - sample.setId(id); - will(returnValue(sample)); - } - } - }); - - table.load(definitions, EXPERIMENT_ID, - FALSE_DISCOVERY_RATE, AggregateFunction.MEAN, aggregateOriginal); - - Collection<ProteinInfo> proteins = table.getProteinInfos(); - assertEquals(1, proteins.size()); - ProteinInfo protein = proteins.iterator().next(); - assertEquals(PROTEIN_REFERENCE_ID, protein.getId().getId().longValue()); - assertEquals(ACCESSION_NUMBER, protein.getAccessionNumber()); - Map<Long, Double> abundances = protein.getAbundances(); - assertEquals(2, abundances.size()); - assertEquals(expectedAbundance, abundances.get(SAMPLE_ID_1 * 37 + SAMPLE_ID_2).doubleValue()); - assertEquals(20.0, abundances.get(SAMPLE_ID_3).doubleValue()); - assertEquals(100 * COVERAGE, protein.getCoverage()); - - assertEquals(true, proteinReferences.hasCloseBeenInvoked()); - assertEquals(true, mappings.hasCloseBeenInvoked()); - context.assertIsSatisfied(); - } - - private void prepareGetProteinQueryDAO(final String experimentPermID) - { - context.checking(new Expectations() - { - { - one(specificDAOFactory).getProteinQueryDAO(experimentPermID); - will(returnValue(proteinDAO)); - } - }); - } - - private void prepareLoadDataSet( - final MockDataSet<ProteinReferenceWithProtein> proteinReferences, - final DataSet<ProteinAbundance> proteinAbundances) - { - context.checking(new Expectations() - { - { - one(experimentDAO).getByTechId(EXPERIMENT_ID); - ExperimentPE experimentPE = new ExperimentPE(); - experimentPE.setPermId(EXPERIMENT_PERM_ID); - will(returnValue(experimentPE)); - - one(proteinDAO).listProteinReferencesByExperiment(EXPERIMENT_PERM_ID); - will(returnValue(proteinReferences)); - - LongSet proteinIDs = new LongArraySet(); - for (ProteinReferenceWithProtein p : proteinReferences) - { - proteinIDs.add(p.getProteinID()); - } - one(proteinDAO).listProteinWithAbundanceByExperiment(proteinIDs); - will(returnValue(proteinAbundances)); - } - }); - } - - private ProteinAbundance createProteinAbundance(long sampleID, double abundance) - { - ProteinAbundance proteinAbundance = new ProteinAbundance(); - proteinAbundance.setSampleID(PERM_ID_PREFIX + sampleID); - proteinAbundance.setId(PROTEIN_ID); - proteinAbundance.setAbundance(abundance); - return proteinAbundance; - } - -} diff --git a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/ProteinRelatedSampleTableTest.java b/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/ProteinRelatedSampleTableTest.java deleted file mode 100644 index 66e5a0a788e..00000000000 --- a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/ProteinRelatedSampleTableTest.java +++ /dev/null @@ -1,182 +0,0 @@ -/* - * Copyright 2011 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.server.business; - -import java.util.List; - -import org.jmock.Expectations; -import org.testng.annotations.BeforeMethod; -import org.testng.annotations.Test; - -import ch.systemsx.cisd.openbis.common.eodsql.MockDataSet; -import ch.systemsx.cisd.openbis.generic.server.TestJythonEvaluatorPool; -import ch.systemsx.cisd.openbis.generic.shared.CommonTestUtils; -import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataTypeCode; -import ch.systemsx.cisd.openbis.generic.shared.dto.EntityTypePropertyTypePE; -import ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentPE; -import ch.systemsx.cisd.openbis.generic.shared.dto.PropertyTypePE; -import ch.systemsx.cisd.openbis.generic.shared.dto.SamplePE; -import ch.systemsx.cisd.openbis.generic.shared.dto.SampleTypePE; -import ch.systemsx.cisd.openbis.generic.shared.dto.SpacePE; -import ch.systemsx.cisd.openbis.generic.shared.dto.builders.EntityTypePropertyTypePEBuilder; -import ch.systemsx.cisd.openbis.generic.shared.dto.builders.SamplePEBuilder; -import ch.systemsx.cisd.openbis.generic.shared.dto.builders.SampleTypePEBuilder; -import ch.systemsx.cisd.openbis.generic.shared.dto.builders.SpacePEBuilder; -import ch.systemsx.cisd.openbis.generic.shared.managed_property.ManagedPropertyEvaluatorFactory; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.ProteinRelatedSample; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.dto.SampleAbundance; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.dto.SamplePeptideModification; - -/** - * @author Franz-Josef Elmer - */ -public class ProteinRelatedSampleTableTest extends AbstractBOTestCase -{ - private ProteinRelatedSampleTable table; - - private SamplePE sample1; - - private SamplePE sample2; - - private SamplePE sample3; - - @Override - @BeforeMethod - public void setUp() - { - super.setUp(); - table = - new ProteinRelatedSampleTable(daoFactory, specificDAOFactory, - new ManagedPropertyEvaluatorFactory(null, new TestJythonEvaluatorPool())); - - SpacePE space = - new SpacePEBuilder() - .code("s") - .getSpace(); - SampleTypePEBuilder sampleTypeBuilder = new SampleTypePEBuilder().code("my-type"); - PropertyTypePE propertyType = - CommonTestUtils.createPropertyType("A", DataTypeCode.VARCHAR, null, null); - EntityTypePropertyTypePEBuilder e = sampleTypeBuilder.assign(propertyType); - EntityTypePropertyTypePE etpt = e.getEntityTypePropertyType(); - SampleTypePE sampleType = sampleTypeBuilder.getSampleType(); - sample1 = - new SamplePEBuilder(1).space(space).code("S1").permID("s-1").type(sampleType) - .property(etpt, "hello").getSample(); - sample2 = - new SamplePEBuilder(2).space(space).code("S2").permID("s-2").type(sampleType) - .getSample(); - sample3 = - new SamplePEBuilder(3).space(space).code("S3").permID("s-3").type(sampleType) - .getSample(); - } - - @Test - public void test() - { - final TechId experimentID = new TechId(42); - final TechId proteinReferenceID = new TechId(43); - context.checking(new Expectations() - { - { - one(specificDAOFactory).getProteinQueryDAO(experimentID); - will(returnValue(proteinDAO)); - - one(experimentDAO).getByTechId(experimentID); - ExperimentPE experiment = new ExperimentPE(); - experiment.setPermId("exp-1"); - will(returnValue(experiment)); - - one(proteinDAO).listSampleAbundanceByProtein(experiment.getPermId(), - proteinReferenceID.getId()); - MockDataSet<SampleAbundance> sampleAbundances = - new MockDataSet<SampleAbundance>(); - sampleAbundances.add(sampleAbundance("s-1", 0.25)); - sampleAbundances.add(sampleAbundance("s-2", 0.75)); - will(returnValue(sampleAbundances)); - - one(proteinDAO).listSamplePeptideModificatioByProtein(experiment.getPermId(), - proteinReferenceID.getId()); - MockDataSet<SamplePeptideModification> modifications = - new MockDataSet<SamplePeptideModification>(); - modifications.add(modification("s-2", "ab", 1, 21.5, 0.25)); - modifications.add(modification("s-3", "def", 1, 12.375, 0.5)); - modifications.add(modification("s-3", "def", 3, -1.5, 0.75)); - will(returnValue(modifications)); - - one(sampleDAO).tryToFindByPermID("s-1"); - will(returnValue(sample1)); - - one(sampleDAO).tryToFindByPermID("s-2"); - will(returnValue(sample2)); - - one(sampleDAO).tryToFindByPermID("s-3"); - will(returnValue(sample3)); - } - }); - - table.load(session, experimentID, proteinReferenceID, "abcdefabcab"); - - List<ProteinRelatedSample> samples = table.getSamples(); - assertEquals("1:s-1:S1:/s/S1:SAMPLE:my-type:[A: hello]:0.25::null:null:null", - render(samples.get(0))); - assertEquals("2:s-2:S2:/s/S2:SAMPLE:my-type:[]:0.75:a:1:21.5:0.25", - render(samples.get(1))); - assertEquals("2:s-2:S2:/s/S2:SAMPLE:my-type:[]:0.75:a:7:21.5:0.25", - render(samples.get(2))); - assertEquals("2:s-2:S2:/s/S2:SAMPLE:my-type:[]:0.75:a:10:21.5:0.25", - render(samples.get(3))); - assertEquals("3:s-3:S3:/s/S3:SAMPLE:my-type:[]:null:d:4:12.375:0.5", - render(samples.get(4))); - assertEquals("3:s-3:S3:/s/S3:SAMPLE:my-type:[]:null:f:6:-1.5:0.75", - render(samples.get(5))); - assertEquals(6, samples.size()); - context.assertIsSatisfied(); - } - - private String render(ProteinRelatedSample sample) - { - char modifiedAminoAcid = sample.getModifiedAminoAcid(); - return sample.getId() + ":" + sample.getPermId() + ":" + sample.getCode() + ":" - + sample.getIdentifier() + ":" + sample.getEntityKind() + ":" - + sample.getEntityType() + ":" + sample.getProperties() + ":" - + sample.getAbundance() + ":" - + (modifiedAminoAcid == 0 ? "" : Character.toString(modifiedAminoAcid)) + ":" - + sample.getModificationPosition() + ":" + sample.getModificationMass() + ":" - + sample.getModificationFraction(); - } - - private SampleAbundance sampleAbundance(String permID, double abundance) - { - SampleAbundance sampleAbundance = new SampleAbundance(); - sampleAbundance.setSamplePermID(permID); - sampleAbundance.setAbundance(abundance); - return sampleAbundance; - } - - private SamplePeptideModification modification(String permID, String sequence, int position, - double mass, double fraction) - { - SamplePeptideModification modification = new SamplePeptideModification(); - modification.setSamplePermID(permID); - modification.setSequence(sequence); - modification.setPosition(position); - modification.setMass(mass); - modification.setFraction(fraction); - return modification; - } -} diff --git a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/ProteinSummaryTableTest.java b/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/ProteinSummaryTableTest.java deleted file mode 100644 index 119088608ed..00000000000 --- a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/ProteinSummaryTableTest.java +++ /dev/null @@ -1,206 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.server.business; - -import static ch.systemsx.cisd.openbis.plugin.proteomics.server.business.ProteinSummaryTable.FDR_LEVELS; - -import java.util.Arrays; -import java.util.List; - -import org.jmock.Expectations; -import org.testng.annotations.BeforeMethod; -import org.testng.annotations.Test; - -import ch.systemsx.cisd.openbis.common.eodsql.MockDataSet; -import ch.systemsx.cisd.openbis.generic.shared.AbstractServerTestCase; -import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; -import ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentPE; -import ch.systemsx.cisd.openbis.plugin.proteomics.server.dataaccess.IPhosphoNetXDAOFactory; -import ch.systemsx.cisd.openbis.plugin.proteomics.server.dataaccess.IProteinQueryDAO; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.ProteinSummary; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.dto.ProbabilityFDRMapping; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.dto.ProteinReferenceWithProbabilityAndPeptide; - -/** - * @author Franz-Josef Elmer - */ -public class ProteinSummaryTableTest extends AbstractServerTestCase -{ - private static final TechId EXPERIMENT_ID = new TechId(234L); - - private static final String EXPERIMENT_PERM_ID = "abc-234"; - - private static final long DATA_SET_ID = 42L; - - private IPhosphoNetXDAOFactory specificDAOFactory; - - private IProteinQueryDAO proteinDAO; - - private ProteinSummaryTable table; - - @Override - @BeforeMethod - public void setUp() - { - super.setUp(); - specificDAOFactory = context.mock(IPhosphoNetXDAOFactory.class); - proteinDAO = context.mock(IProteinQueryDAO.class); - table = new ProteinSummaryTable(daoFactory, specificDAOFactory, session); - } - - @Test - public void testLoadEmptyData() - { - prepare(); - - table.load(EXPERIMENT_ID); - - List<ProteinSummary> summaries = table.getProteinSummaries(); - for (ProteinSummary proteinSummary : summaries) - { - assertEquals(0, proteinSummary.getProteinCount()); - assertEquals(0, proteinSummary.getPeptideCount()); - } - assertEquals(FDR_LEVELS.length, summaries.size()); - context.assertIsSatisfied(); - } - - @Test - public void testLoadData() - { - ProteinReferenceWithProbabilityAndPeptide i1 = createItem("A", 0.5, 123, "ABCD"); - ProteinReferenceWithProbabilityAndPeptide i2 = createItem("B", 0.5, 123, "DEF"); - ProteinReferenceWithProbabilityAndPeptide i3 = createItem("C", 0.75, 123, "DEF"); - ProteinReferenceWithProbabilityAndPeptide i4 = createItem("D", 0.75, 456, "ABC"); - ProteinReferenceWithProbabilityAndPeptide i5 = createItem("E", 1, 456, "DEF"); - ProteinReferenceWithProbabilityAndPeptide i6 = createItem("F", 1, 456, "XYZ"); - ProteinReferenceWithProbabilityAndPeptide i7 = createItem("DECOY_F", 0.75, 456, "XYZ"); - prepare(i1, i2, i3, i4, i5, i6, i7); - context.checking(new Expectations() - { - { - allowing(proteinDAO).getProbabilityFDRMapping(DATA_SET_ID); - MockDataSet<ProbabilityFDRMapping> dataSet = - new MockDataSet<ProbabilityFDRMapping>(); - dataSet.add(createMappingItem(0.5, FDR_LEVELS[3])); - dataSet.add(createMappingItem(0.75, FDR_LEVELS[2])); - dataSet.add(createMappingItem(1, FDR_LEVELS[0])); - will(returnValue(dataSet)); - } - - }); - table.load(EXPERIMENT_ID); - - List<ProteinSummary> summaries = table.getProteinSummaries(); - assertSummary(0, 1, 2, 0, 0, summaries); - assertSummary(1, 1, 2, 0, 0, summaries); - assertSummary(2, 2, 3, 1, 1, summaries); - assertSummary(3, 2, 4, 1, 1, summaries); - assertSummary(4, 2, 4, 1, 1, summaries); - assertEquals(FDR_LEVELS.length, summaries.size()); - context.assertIsSatisfied(); - } - - @Test - public void testLoadDataWithNoFDRMapping() - { - ProteinReferenceWithProbabilityAndPeptide i1 = createItem("A", 0.5, 123, "ABCD"); - ProteinReferenceWithProbabilityAndPeptide i2 = createItem("B", 0.5, 123, "DEF"); - ProteinReferenceWithProbabilityAndPeptide i3 = createItem("C", 0.75, 123, "DEF"); - ProteinReferenceWithProbabilityAndPeptide i4 = createItem("D", 0.75, 456, "ABC"); - ProteinReferenceWithProbabilityAndPeptide i5 = createItem("E", 1, 456, "DEF"); - ProteinReferenceWithProbabilityAndPeptide i6 = createItem("F", 1, 456, "XYZ"); - ProteinReferenceWithProbabilityAndPeptide i7 = createItem("DECOY_F", 0.75, 456, "XYZ"); - prepare(i1, i2, i3, i4, i5, i6, i7); - context.checking(new Expectations() - { - { - allowing(proteinDAO).getProbabilityFDRMapping(DATA_SET_ID); - MockDataSet<ProbabilityFDRMapping> dataSet = - new MockDataSet<ProbabilityFDRMapping>(); - will(returnValue(dataSet)); - } - }); - table.load(EXPERIMENT_ID); - - List<ProteinSummary> summaries = table.getProteinSummaries(); - assertSummary(0, 2, 4, 1, 1, summaries); - assertSummary(1, 2, 4, 1, 1, summaries); - assertSummary(2, 2, 4, 1, 1, summaries); - assertSummary(3, 2, 4, 1, 1, summaries); - assertSummary(4, 2, 4, 1, 1, summaries); - assertEquals(FDR_LEVELS.length, summaries.size()); - context.assertIsSatisfied(); - } - - private void assertSummary(int index, int expectedProteinCount, int expectedPeptideCount, - int expectedDecoyProteinCount, int expectedDecoyPeptideCount, - List<ProteinSummary> summaries) - { - ProteinSummary proteinSummary = summaries.get(index); - assertEquals(FDR_LEVELS[index], proteinSummary.getFDR(), 1e-6); - assertEquals(expectedProteinCount, proteinSummary.getProteinCount()); - assertEquals(expectedPeptideCount, proteinSummary.getPeptideCount()); - assertEquals(expectedDecoyProteinCount, proteinSummary.getDecoyProteinCount()); - assertEquals(expectedDecoyPeptideCount, proteinSummary.getDecoyPeptideCount()); - } - - private ProbabilityFDRMapping createMappingItem(double probability, double falseDiscoveryRate) - { - ProbabilityFDRMapping m1 = new ProbabilityFDRMapping(); - m1.setProbability(probability); - m1.setFalseDiscoveryRate(falseDiscoveryRate); - return m1; - } - - private void prepare(final ProteinReferenceWithProbabilityAndPeptide... items) - { - context.checking(new Expectations() - { - { - allowing(specificDAOFactory).getProteinQueryDAO(EXPERIMENT_ID); - will(returnValue(proteinDAO)); - - one(experimentDAO).getByTechId(EXPERIMENT_ID); - ExperimentPE experimentPE = new ExperimentPE(); - experimentPE.setPermId(EXPERIMENT_PERM_ID); - will(returnValue(experimentPE)); - - one(proteinDAO).listProteinsWithProbabilityAndPeptidesByExperiment( - EXPERIMENT_PERM_ID); - MockDataSet<ProteinReferenceWithProbabilityAndPeptide> dataSet = - new MockDataSet<ProteinReferenceWithProbabilityAndPeptide>(); - dataSet.addAll(Arrays.asList(items)); - will(returnValue(dataSet)); - } - }); - } - - private ProteinReferenceWithProbabilityAndPeptide createItem(String accessionNumber, double probability, - long id, String peptideSequence) - { - ProteinReferenceWithProbabilityAndPeptide item = - new ProteinReferenceWithProbabilityAndPeptide(); - item.setDataSetID(DATA_SET_ID); - item.setProbability(probability); - item.setId(id); - item.setPeptideSequence(peptideSequence); - item.setAccessionNumber(accessionNumber); - return item; - } - -} diff --git a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/SampleIDProviderTest.java b/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/SampleIDProviderTest.java deleted file mode 100644 index 0196a241d72..00000000000 --- a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/SampleIDProviderTest.java +++ /dev/null @@ -1,122 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.server.business; - -import org.jmock.Expectations; -import org.testng.annotations.BeforeMethod; -import org.testng.annotations.Test; - -import ch.systemsx.cisd.common.exceptions.UserFailureException; -import ch.systemsx.cisd.openbis.generic.shared.AbstractServerTestCase; -import ch.systemsx.cisd.openbis.generic.shared.basic.BasicConstant; -import ch.systemsx.cisd.openbis.generic.shared.dto.PersonPE; -import ch.systemsx.cisd.openbis.generic.shared.dto.RelationshipTypePE; -import ch.systemsx.cisd.openbis.generic.shared.dto.SamplePE; -import ch.systemsx.cisd.openbis.generic.shared.dto.SampleRelationshipPE; - -/** - * @author Franz-Josef Elmer - */ -public class SampleIDProviderTest extends AbstractServerTestCase -{ - private static final String PERM_ID = "abc-1"; - - private static final Long ID = 42L; - - private SampleIDProvider sampleIDProvider; - - @BeforeMethod - @Override - public void setUp() - { - super.setUp(); - sampleIDProvider = new SampleIDProvider(sampleDAO); - } - - @Test - public void testGetUnkownSample() - { - context.checking(new Expectations() - { - { - one(sampleDAO).tryToFindByPermID(PERM_ID); - will(returnValue(null)); - } - }); - - try - { - sampleIDProvider.getSampleIDOrParentSampleID(PERM_ID); - fail("UserFailureException expected."); - } catch (UserFailureException e) - { - assertEquals("No sample found for permID " + PERM_ID, e.getMessage()); - } - - context.assertIsSatisfied(); - } - - @Test - public void testGetSampleIDTwice() - { - context.checking(new Expectations() - { - { - one(sampleDAO).tryToFindByPermID(PERM_ID); - SamplePE sample = new SamplePE(); - sample.setId(ID); - will(returnValue(sample)); - } - }); - - long s1 = sampleIDProvider.getSampleIDOrParentSampleID(PERM_ID); - long s2 = sampleIDProvider.getSampleIDOrParentSampleID(PERM_ID); - assertEquals(ID.longValue(), s1); - assertEquals(ID.longValue(), s2); - - context.assertIsSatisfied(); - } - - @Test - public void testGetParentSampleIDTwice() - { - context.checking(new Expectations() - { - { - one(sampleDAO).tryToFindByPermID(PERM_ID); - SamplePE parentSample = new SamplePE(); - parentSample.setCode("s1"); - parentSample.setId(ID); - SamplePE sample = new SamplePE(); - sample.setCode("s1"); - sample.setId(2 * ID); - RelationshipTypePE relationship = new RelationshipTypePE(); - relationship.setCode(BasicConstant.PARENT_CHILD_INTERNAL_RELATIONSHIP); - sample.addParentRelationship(new SampleRelationshipPE(parentSample, sample, - relationship, new PersonPE())); - will(returnValue(sample)); - } - }); - - long s1 = sampleIDProvider.getSampleIDOrParentSampleID(PERM_ID); - long s2 = sampleIDProvider.getSampleIDOrParentSampleID(PERM_ID); - assertEquals(ID.longValue(), s1); - assertEquals(ID.longValue(), s2); - - context.assertIsSatisfied(); - } -} diff --git a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/SampleLoaderTest.java b/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/SampleLoaderTest.java deleted file mode 100644 index 73196040ee2..00000000000 --- a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/SampleLoaderTest.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.server.business; - -import static org.testng.AssertJUnit.assertEquals; - -import java.util.Collections; -import java.util.Comparator; -import java.util.List; - -import org.testng.annotations.Test; - -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample; -import ch.systemsx.cisd.openbis.generic.shared.dto.PersonPE; -import ch.systemsx.cisd.openbis.generic.shared.dto.Session; - -/** - * @author Franz-Josef Elmer - */ -@Test(groups = "db") -public class SampleLoaderTest extends AbstractLoaderTestCase -{ - - @Test - public void test() - { - Session session = session(); - session.setPerson(new PersonPE()); - SampleLoader loader = new SampleLoader(session, daoFactory, boFactory); - List<Sample> samples = loader.listSamplesWithParentsByTypeAndSpace("CELL_PLATE", "CISD"); - Collections.sort(samples, new Comparator<Sample>() - { - @Override - public int compare(Sample s1, Sample s2) - { - return s1.getCode().compareTo(s2.getCode()); - } - }); - StringBuilder builder = new StringBuilder(); - for (Sample sample : samples) - { - Sample parent = sample.getGeneratedFrom(); - builder.append(sample.getCode()).append(" ").append(getSortedProperties(sample)); - builder.append(" <- ").append(parent.getCode()).append(" "); - builder.append(getSortedProperties(parent)).append('\n'); - } - assertEquals("3VCP5 [] <- 3V-125 [OFFSET: 49]\n" - + "3VCP7 [COMMENT: test comment, ORGANISM: RAT, SIZE: 4711] <- 3V-125 [OFFSET: 49]\n" - + "3VCP8 [] <- 3V-125 [OFFSET: 49]\n" - + "CP-TEST-1 [ANY_MATERIAL: 1 (GENE), BACTERIUM: BACTERIUM-X (BACTERIUM), " - + "COMMENT: very advanced stuff, ORGANISM: HUMAN, SIZE: 123] " - + "<- CP-TEST-2 [ANY_MATERIAL: 2 (GENE), BACTERIUM: BACTERIUM-Y (BACTERIUM), " - + "COMMENT: extremely simple stuff, ORGANISM: GORILLA, SIZE: 321]\n" - + "CP1-A1 [] <- DP1-A [OFFSET: 42]\n" - + "CP1-A2 [] <- DP1-A [OFFSET: 42]\n" - + "CP1-B1 [] <- DP1-B [OFFSET: 42]\n" - + "CP2-A1 [] <- DP2-A [OFFSET: 42]\n", builder.toString()); - } - -} diff --git a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/SampleProviderTest.java b/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/SampleProviderTest.java deleted file mode 100644 index a9f632f812e..00000000000 --- a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/SampleProviderTest.java +++ /dev/null @@ -1,180 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.server.business; - -import java.util.Arrays; -import java.util.Collection; - -import org.hamcrest.BaseMatcher; -import org.hamcrest.Description; -import org.jmock.Expectations; -import org.jmock.Mockery; -import org.testng.AssertJUnit; -import org.testng.annotations.AfterMethod; -import org.testng.annotations.BeforeMethod; -import org.testng.annotations.Test; - -import ch.systemsx.cisd.authentication.Principal; -import ch.systemsx.cisd.common.exceptions.UserFailureException; -import ch.systemsx.cisd.openbis.generic.server.business.bo.samplelister.ISampleLister; -import ch.systemsx.cisd.openbis.generic.shared.CommonTestUtils; -import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ListOrSearchSampleCriteria; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample; -import ch.systemsx.cisd.openbis.generic.shared.dto.Session; -import ch.systemsx.cisd.openbis.plugin.proteomics.server.business.IBusinessObjectFactory; -import ch.systemsx.cisd.openbis.plugin.proteomics.server.business.ISampleProvider; -import ch.systemsx.cisd.openbis.plugin.proteomics.server.business.SampleProvider; - -/** - * @author Franz-Josef Elmer - */ -public class SampleProviderTest extends AssertJUnit -{ - private static final class MatcherOfSampleCriteriaByChildrenIDs extends - BaseMatcher<ListOrSearchSampleCriteria> - { - private final Collection<Long> childrenIDs; - - private MatcherOfSampleCriteriaByChildrenIDs(Collection<Long> childrenIDs) - { - this.childrenIDs = childrenIDs; - } - - @Override - public boolean matches(Object item) - { - if (item instanceof ListOrSearchSampleCriteria) - { - ListOrSearchSampleCriteria criteria = (ListOrSearchSampleCriteria) item; - assertEquals(true, criteria.isEnrichDependentSamplesWithProperties()); - assertEquals(childrenIDs.toString(), criteria.getChildrenSampleIds().toString()); - return true; - } - return false; - } - - @Override - public void describeTo(Description description) - { - } - } - - private static final Principal PRINCIPAL = - new Principal(CommonTestUtils.USER_ID, "john", "doe", "j@d"); - - private static final String SESSION_TOKEN = "session-token"; - - private static final Session SESSION = - new Session(CommonTestUtils.USER_ID, SESSION_TOKEN, PRINCIPAL, "remote-host", 1); - - private static final TechId EXPERIMENT_ID = new TechId(4711); - - private Mockery context; - - private IBusinessObjectFactory boFactory; - - private ISampleProvider sampleProvider; - - private ISampleLister sampleLister; - - @BeforeMethod - public void setUp() - { - context = new Mockery(); - boFactory = context.mock(IBusinessObjectFactory.class); - sampleLister = context.mock(ISampleLister.class); - sampleProvider = new SampleProvider(SESSION, boFactory); - } - - @AfterMethod - public void tearDown() - { - // To following line of code should also be called at the end of each test method. - // Otherwise one do not known which test failed. - context.assertIsSatisfied(); - } - - @Test - public void test() - { - final Sample s1 = createSample("abc"); - final Sample s2 = createSample("123"); - final Sample s3 = createSample("parent-of-123"); - context.checking(new Expectations() - { - { - one(boFactory).createSampleLister(SESSION); - will(returnValue(sampleLister)); - - one(sampleLister).list(with(new BaseMatcher<ListOrSearchSampleCriteria>() - { - @Override - public boolean matches(Object item) - { - if (item instanceof ListOrSearchSampleCriteria) - { - ListOrSearchSampleCriteria criteria = (ListOrSearchSampleCriteria) item; - assertEquals(true, criteria.isEnrichDependentSamplesWithProperties()); - assertEquals(EXPERIMENT_ID, criteria.getExperimentId()); - return true; - } - return false; - } - - @Override - public void describeTo(Description description) - { - } - })); - will(returnValue(Arrays.asList(s1, s2))); - - one(sampleLister).list( - with(new MatcherOfSampleCriteriaByChildrenIDs(Arrays.asList(s1.getId(), - s2.getId())))); - will(returnValue(Arrays.asList(s3))); - - one(sampleLister).list( - with(new MatcherOfSampleCriteriaByChildrenIDs(Arrays.asList(s3.getId())))); - will(returnValue(Arrays.asList())); - } - }); - - sampleProvider.loadByExperimentID(EXPERIMENT_ID); - assertSame(s1, sampleProvider.getSample(s1.getPermId())); - assertSame(s2, sampleProvider.getSample(s2.getPermId())); - assertSame(s3, sampleProvider.getSample(s3.getPermId())); - try - { - sampleProvider.getSample("42"); - fail("UserFailureException expected"); - } catch (UserFailureException ex) - { - assertEquals("No sample with following perm ID registered in openBIS: 42", ex.getMessage()); - } - - context.assertIsSatisfied(); - } - - private Sample createSample(String samplePermID) - { - Sample sample = new Sample(); - sample.setId((long) samplePermID.hashCode()); - sample.setPermId(samplePermID); - return sample; - } -} diff --git a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/TreatmentFinderTest.java b/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/TreatmentFinderTest.java deleted file mode 100644 index 00ee7155f25..00000000000 --- a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/TreatmentFinderTest.java +++ /dev/null @@ -1,196 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.server.business; - -import static ch.systemsx.cisd.openbis.plugin.proteomics.server.business.TreatmentFinder.TREATMENT_TYPE_CODE; -import static ch.systemsx.cisd.openbis.plugin.proteomics.server.business.TreatmentFinder.TREATMENT_VALUE_CODE; - -import java.util.ArrayList; -import java.util.List; - -import org.testng.AssertJUnit; -import org.testng.annotations.Test; - -import ch.systemsx.cisd.common.exceptions.UserFailureException; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataType; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataTypeCode; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityProperty; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Material; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PropertyType; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.VocabularyTerm; -import ch.systemsx.cisd.openbis.plugin.proteomics.server.business.TreatmentFinder; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.Treatment; - -/** - * @author Franz-Josef Elmer - */ -public class TreatmentFinderTest extends AssertJUnit -{ - @Test - public void testFindingTreatmentsInSample() - { - Sample sample = createSample(); - sample.getProperties().add(create("BLABLA", "blub", DataTypeCode.MULTILINE_VARCHAR)); - addTreatment(sample, "", "pH", "7"); - addTreatment(sample, "1", "PLASMA", "20"); - addTreatment(sample, "2", "VIRUS", "HIV", DataTypeCode.MATERIAL); - - List<Treatment> treatments = new TreatmentFinder().findTreatmentsOf(sample); - - assertEquals(3, treatments.size()); - assertTreatment("7", "pH", treatments.get(0)); - assertTreatment("20", "PLASMA", treatments.get(1)); - assertTreatment("HIV", "VIRUS", DataTypeCode.MATERIAL, treatments.get(2)); - } - - @Test - public void testFindingTreatmentsInAncestorsOverriddenInDescendants() - { - Sample sample = createSample(); - Sample parentSample = createSample(); - sample.setGeneratedFrom(parentSample); - Sample grandParentSample = createSample(); - parentSample.setGeneratedFrom(grandParentSample); - addTreatment(grandParentSample, "1", "PLASMA", "35"); - parentSample.getProperties().add(create("BLABLA", "blub", DataTypeCode.MULTILINE_VARCHAR)); - addTreatment(parentSample, "", "pH", "7"); - addTreatment(sample, "", "PLASMA", "20"); - - List<Treatment> treatments = new TreatmentFinder().findTreatmentsOf(sample); - - assertEquals(2, treatments.size()); - assertTreatment("7", "pH", treatments.get(0)); - assertTreatment("20", "PLASMA", treatments.get(1)); - } - - @Test - public void testFindingTreatmentsWhereTreatmentTypeIsNotAVocabulary() - { - Sample sample = createSample(); - sample.getProperties().add(create(TREATMENT_TYPE_CODE, "pH", DataTypeCode.VARCHAR)); - - try - { - new TreatmentFinder().findTreatmentsOf(sample); - fail("UserFailureException expected"); - } catch (UserFailureException e) - { - assertEquals("Data type of property type '" + TREATMENT_TYPE_CODE - + "' must be a vocabulary.", e.getMessage()); - } - } - - @Test - public void testFindingTreatmentsWhereOnlyTreatmentTypeIsDefined() - { - Sample sample = createSample(); - sample.getProperties().add(create(TREATMENT_TYPE_CODE, "pH", DataTypeCode.CONTROLLEDVOCABULARY)); - - List<Treatment> treatments = new TreatmentFinder().findTreatmentsOf(sample); - - assertEquals(1, treatments.size()); - assertTreatment("", "pH", treatments.get(0)); - } - - @Test - public void testFindingTreatmentsWhereOnlyTreatmentValueIsDefined() - { - Sample sample = createSample(); - sample.getProperties().add(create(TREATMENT_VALUE_CODE, "HIV", DataTypeCode.MATERIAL)); - - List<Treatment> treatments = new TreatmentFinder().findTreatmentsOf(sample); - - assertEquals(1, treatments.size()); - assertTreatment("HIV", "", DataTypeCode.MATERIAL, treatments.get(0)); - } - - private void assertTreatment(String expectedValue, String expectedType, Treatment treatment) - { - assertTreatment(expectedValue, expectedType, DataTypeCode.VARCHAR, treatment); - } - - private void assertTreatment(String expectedValue, String expectedType, - DataTypeCode expectedDataType, Treatment treatment) - { - assertEquals("Actual treatment: " + treatment, expectedValue, treatment.getValue()); - assertEquals("Actual treatment: " + treatment, expectedDataType.toString(), treatment - .getValueType()); - assertEquals("Actual treatment: " + treatment, expectedType, treatment.getType()); - assertEquals("Actual treatment: " + treatment, expectedValue + " " + expectedType, - treatment.getLabel()); - } - - private void addTreatment(Sample sample, String treatmentCodePostfix, String treatmentType, - String treatmentValue) - { - addTreatment(sample, treatmentCodePostfix, treatmentType, treatmentValue, - DataTypeCode.VARCHAR); - } - - private void addTreatment(Sample sample, String treatmentCodePostfix, String treatmentType, - String treatmentValue, DataTypeCode valueType) - { - List<IEntityProperty> properties = sample.getProperties(); - properties.add(create(TREATMENT_TYPE_CODE + treatmentCodePostfix, treatmentType, - DataTypeCode.CONTROLLEDVOCABULARY)); - properties.add(create(TREATMENT_VALUE_CODE + treatmentCodePostfix, treatmentValue, - valueType)); - } - - private IEntityProperty create(String code, String value, DataTypeCode type) - { - EntityProperty sampleProperty = new EntityProperty(); - PropertyType propertyType = new PropertyType(); - propertyType.setCode(code); - DataType dataType = new DataType(); - dataType.setCode(type); - propertyType.setDataType(dataType); - sampleProperty.setPropertyType(propertyType); - switch (type) - { - case CONTROLLEDVOCABULARY: - VocabularyTerm term = new VocabularyTerm(); - if (Character.isUpperCase(value.charAt(0))) - { - term.setCode(value); - } else - { - term.setCode(value.toUpperCase()); - term.setLabel(value); - } - sampleProperty.setVocabularyTerm(term); - break; - case MATERIAL: - Material material = new Material(); - material.setCode(value); - sampleProperty.setMaterial(material); - break; - default: - sampleProperty.setValue(value); - } - return sampleProperty; - } - - private Sample createSample() - { - Sample sample = new Sample(); - sample.setProperties(new ArrayList<IEntityProperty>()); - return sample; - } -} diff --git a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/basic/dto/AbundanceColumnDefinitionTest.java b/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/basic/dto/AbundanceColumnDefinitionTest.java deleted file mode 100644 index 0ba2429877e..00000000000 --- a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/basic/dto/AbundanceColumnDefinitionTest.java +++ /dev/null @@ -1,120 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto; - -import java.util.Arrays; - -import org.testng.AssertJUnit; -import org.testng.annotations.Test; - -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.AbundanceColumnDefinition; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.Treatment; - -/** - * @author Franz-Josef Elmer - */ -public class AbundanceColumnDefinitionTest extends AssertJUnit -{ - @Test - public void testCompareTwoDefinitonsWithoutTreatmentsAndSampleCodes() - { - AbundanceColumnDefinition d1 = new AbundanceColumnDefinition(); - AbundanceColumnDefinition d2 = create(null); - - assertEquals(0, d1.compareTo(d2)); - - d1.setSampleCode("bla"); - - assertEquals(0, d1.compareTo(d2)); - } - - @Test - public void testCompareTwoDefinitonsWithoutTreatmentsButSampleCodes() - { - AbundanceColumnDefinition d1 = create("abc"); - AbundanceColumnDefinition d2 = create("abc"); - - assertEquals(0, d1.compareTo(d2)); - - d2.setSampleCode("def"); - - assertEquals(true, d1.compareTo(d2) < 0); - } - - @Test - public void testCompareTwoDefinitonsWithDifferentNumberOfTreatments() - { - AbundanceColumnDefinition d1 = create("abc"); - d1.setSampleCode("abc"); - AbundanceColumnDefinition d2 = create("abc", new Treatment()); - d2.setSampleCode("abc"); - - assertEquals(true, d1.compareTo(d2) < 0); - } - - @Test - public void testCompareTwoDefinitonsWithOneNonNumericalTreatment() - { - AbundanceColumnDefinition d1 = create("abc", treatment("light", "red")); - AbundanceColumnDefinition d2 = create("abc", treatment("light", "blue")); - - assertEquals(true, d1.compareTo(d2) > 0); - } - - @Test - public void testCompareTwoDefinitonsWithOneNumericalTreatment() - { - AbundanceColumnDefinition d1 = create("abc", treatment("pH", "7.5"), treatment("T", "yes")); - AbundanceColumnDefinition d2 = create("abc", treatment("pH", "9e-1")); - - assertEquals(true, d1.compareTo(d2) > 0); - } - - @Test - public void testCompareTwoDefinitonsWithOneNumericalTreatmentButDifferentTypes() - { - AbundanceColumnDefinition d1 = create("abc", treatment("K", "7.5")); - AbundanceColumnDefinition d2 = create("abc", treatment("pH", "9e-1")); - - assertEquals(true, d1.compareTo(d2) < 0); - } - - @Test - public void testCompareTwoDefinitonsWithTwoNumericalTreatment() - { - AbundanceColumnDefinition d1 = create("abc", treatment("pH", "7.50"), treatment("T", "13")); - AbundanceColumnDefinition d2 = create("abc", treatment("pH", "0.75e1"), treatment("T", "8")); - - assertEquals(true, d1.compareTo(d2) > 0); - } - - private AbundanceColumnDefinition create(String sampleCode, Treatment... treatments) - { - AbundanceColumnDefinition definition = new AbundanceColumnDefinition(); - definition.setSampleCode(sampleCode); - definition.setTreatments(Arrays.asList(treatments)); - return definition; - } - - private Treatment treatment(String type, String value) - { - Treatment treatment = new Treatment(); - treatment.setType(type); - treatment.setValue(value); - return treatment; - } -} diff --git a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/basic/dto/AggregateFunctionTest.java b/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/basic/dto/AggregateFunctionTest.java deleted file mode 100644 index 51ef5b19421..00000000000 --- a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/basic/dto/AggregateFunctionTest.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto; - -import org.testng.AssertJUnit; -import org.testng.annotations.Test; - -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.AggregateFunction; - -/** - * @author Franz-Josef Elmer - */ -public class AggregateFunctionTest extends AssertJUnit -{ - @Test - public void testMean() - { - assertEquals(42.0, AggregateFunction.MEAN.aggregate(new double[] { 42 })); - assertEquals(42.5, AggregateFunction.MEAN.aggregate(new double[] { 42, 43 })); - assertEquals(44.0, AggregateFunction.MEAN.aggregate(new double[] { 42, 42, 48 })); - } - - @Test - public void testMedian() - { - assertEquals(42.0, AggregateFunction.MEDIAN.aggregate(new double[] { 42 })); - assertEquals(42.5, AggregateFunction.MEDIAN.aggregate(new double[] { 42, 43 })); - assertEquals(43.0, AggregateFunction.MEDIAN.aggregate(new double[] { 42, 43, 50 })); - assertEquals(46.5, AggregateFunction.MEDIAN.aggregate(new double[] { 42, 43, 50, 59 })); - } - - @Test - public void testSum() - { - assertEquals(42.0, AggregateFunction.SUM.aggregate(new double[] { 42 })); - assertEquals(85.0, AggregateFunction.SUM.aggregate(new double[] { 42, 43 })); - } - - @Test - public void testMin() - { - assertEquals(42.0, AggregateFunction.MIN.aggregate(new double[] { 42 })); - assertEquals(42.0, AggregateFunction.MIN.aggregate(new double[] { 42, 43 })); - } - - @Test - public void testMax() - { - assertEquals(42.0, AggregateFunction.MAX.aggregate(new double[] { 42 })); - assertEquals(43.0, AggregateFunction.MAX.aggregate(new double[] { 42, 43 })); - } - - @Test - public void testCount() - { - assertEquals(1.0, AggregateFunction.COUNT.aggregate(new double[] { 42 })); - assertEquals(2.0, AggregateFunction.COUNT.aggregate(new double[] { 42, 43 })); - } - -} diff --git a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/basic/dto/OccurrenceUtilTest.java b/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/basic/dto/OccurrenceUtilTest.java deleted file mode 100644 index 248567447e0..00000000000 --- a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/basic/dto/OccurrenceUtilTest.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto; - -import java.util.Arrays; - -import org.testng.AssertJUnit; -import org.testng.annotations.Test; - -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.OccurrenceUtil; - -/** - * @author Franz-Josef Elmer - */ -public class OccurrenceUtilTest extends AssertJUnit -{ - @Test - public void testNoCoverage() - { - check("[]", ""); - check("[]", "abc", "xx"); - check("[]", "xx"); - check("[]", "abc"); - } - - @Test - public void testFullCoverage() - { - check("[[abc@0]]", "abc", "abc"); - } - - @Test - public void testPartialAndOverlappingCoverage() - { - check("[[ab@0], [abcd@4], [ab@13]]", "abc abcde hahab", "ab", "bcd"); - check("[[ab@0], [abcd@4], [ab@13]]", "abc abcde hahab", "ab", "cd"); - check("[[abc@0], [abc@4], [ab@13]]", "abc abcde hahab", "ab", "b", "c"); - check("[[abc@0], [abc@4], [b@14]]", "abc abcde hahab", "abc", "b"); - check("[[abcde@0]]", "abcdef", "abcd", "b", "de"); - check("[[haha@10]]", "abc abcde hahab", "haha", "h"); - } - - private void check(String expectedList, String sequence, String... words) - { - assertEquals(expectedList, OccurrenceUtil.getCoverage(sequence, Arrays.asList(words)).toString()); - } -} diff --git a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/proteomics/systemtests/AbstractProteomicsSystemTestCase.java b/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/proteomics/systemtests/AbstractProteomicsSystemTestCase.java deleted file mode 100644 index a1d2981b429..00000000000 --- a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/proteomics/systemtests/AbstractProteomicsSystemTestCase.java +++ /dev/null @@ -1,112 +0,0 @@ -/* - * Copyright 2012 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.proteomics.systemtests; - -import ch.systemsx.cisd.openbis.datastoreserver.systemtests.SystemTestCase; -import ch.systemsx.cisd.openbis.generic.server.ICommonServerForInternalUse; -import ch.systemsx.cisd.openbis.generic.shared.IServiceForDataStoreServer; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Grantee; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.RoleWithHierarchy.RoleCode; -import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SpaceIdentifier; -import ch.systemsx.cisd.openbis.plugin.generic.shared.IGenericServer; -import ch.systemsx.cisd.openbis.plugin.proteomics.server.api.v1.Constants; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.IPhosphoNetXServer; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.IProteomicsDataServiceInternal; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.ResourceNames; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.api.v1.IProteomicsDataService; - -/** - * @author Franz-Josef Elmer - */ -public abstract class AbstractProteomicsSystemTestCase extends SystemTestCase -{ - - /** - * - * - */ - public AbstractProteomicsSystemTestCase() - { - super(); - } - - @Override - protected String getApplicationContextLocation() - { - return "classpath:proteomics-applicationContext.xml"; - } - - protected String registerPerson(String userID) - { - ICommonServerForInternalUse commonServer = getCommonServer(); - String systemSessionToken = commonServer.tryToAuthenticateAsSystem().getSessionToken(); - commonServer.registerPerson(systemSessionToken, userID); - return userID; - } - - protected void assignInstanceRole(String userID, RoleCode roleCode) - { - ICommonServerForInternalUse commonServer = getCommonServer(); - String systemSessionToken = commonServer.tryToAuthenticateAsSystem().getSessionToken(); - commonServer.registerInstanceRole(systemSessionToken, roleCode, - Grantee.createPerson(userID)); - } - - protected void assignSpaceRole(String userID, RoleCode roleCode, SpaceIdentifier spaceIdentifier) - { - ICommonServerForInternalUse commonServer = getCommonServer(); - String systemSessionToken = commonServer.tryToAuthenticateAsSystem().getSessionToken(); - commonServer.registerSpaceRole(systemSessionToken, roleCode, spaceIdentifier, - Grantee.createPerson(userID)); - } - - protected String authenticateAs(String user) - { - return getCommonServer().tryAuthenticate(user, "password").getSessionToken(); - } - - protected ICommonServerForInternalUse getCommonServer() - { - return getBean(ch.systemsx.cisd.openbis.generic.shared.ResourceNames.COMMON_SERVER); - } - - protected IGenericServer getGenericServer() - { - return getBean(ch.systemsx.cisd.openbis.plugin.generic.shared.ResourceNames.GENERIC_PLUGIN_SERVER); - } - - protected IServiceForDataStoreServer getServiceForDSS() - { - return getBean(ch.systemsx.cisd.openbis.generic.shared.ResourceNames.ETL_SERVICE); - } - - protected IProteomicsDataServiceInternal getDataServiceInternal() - { - return getBean(Constants.PROTEOMICS_DATA_SERVICE_INTERNAL); - } - - protected IProteomicsDataService getDataService() - { - return getBean(Constants.PROTEOMICS_DATA_SERVICE); - } - - protected IPhosphoNetXServer getServer() - { - return getBean(ResourceNames.PROTEOMICS_PLUGIN_SERVER); - } - -} \ No newline at end of file diff --git a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/proteomics/systemtests/ProteomicsDataServiceTest.java b/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/proteomics/systemtests/ProteomicsDataServiceTest.java deleted file mode 100644 index 22c5f68a15f..00000000000 --- a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/proteomics/systemtests/ProteomicsDataServiceTest.java +++ /dev/null @@ -1,201 +0,0 @@ -/* - * Copyright 2016 ETH Zuerich, SIS - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.proteomics.systemtests; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; - -import org.testng.annotations.BeforeTest; -import org.testng.annotations.Test; - -import ch.systemsx.cisd.common.collection.SimpleComparator; -import ch.systemsx.cisd.common.exceptions.EnvironmentFailureException; -import ch.systemsx.cisd.common.shared.basic.string.CommaSeparatedListBuilder; -import ch.systemsx.cisd.common.test.AssertionUtil; -import ch.systemsx.cisd.openbis.generic.shared.IServiceForDataStoreServer; -import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetKind; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.FileFormatType; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ListSampleCriteria; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.LocatorType; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewAttachment; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewExperiment; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewSample; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewSamplesWithTypes; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleType; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.builders.DataSetTypeBuilder; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.builders.SampleTypeBuilder; -import ch.systemsx.cisd.openbis.generic.shared.dto.NewExternalData; -import ch.systemsx.cisd.openbis.generic.shared.dto.StorageFormat; -import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ProjectIdentifierFactory; -import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifierFactory; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.api.v1.dto.MsInjectionDataInfo; - -/** - * @author Franz-Josef Elmer - */ -@Test(groups = { "slow", "systemtest" }) -public class ProteomicsDataServiceTest extends AbstractProteomicsSystemTestCase -{ - private static final String EXPERIMENT_IDENTIFIER = "/MS_DATA/A/E"; - - private String sessionToken; - - private Long experimentId; - - private long[] sampleIds; - - @BeforeTest - public void setUpExamples() - { - sessionToken = authenticateAs("test"); - getCommonServer().registerSpace(sessionToken, "MS_DATA", null); - getCommonServer().registerProject(sessionToken, ProjectIdentifierFactory.parse("/MS_DATA/A"), - null, null, Arrays.<NewAttachment> asList()); - NewExperiment experiment = new NewExperiment(); - experiment.setExperimentTypeCode("MS_SEARCH"); - experiment.setIdentifier(EXPERIMENT_IDENTIFIER); - experimentId = getGenericServer().registerExperiment(sessionToken, experiment, Arrays.<NewAttachment> asList()).getId(); - NewSamplesWithTypes samples = new NewSamplesWithTypes(); - SampleType sampleType = new SampleTypeBuilder().code("MS_INJECTION").getSampleType(); - samples.setEntityType(sampleType); - List<NewSample> msInjectionSamples = createMsInjectionSamples("/TEST-SPACE/CP-TEST-4", null, "/CISD/3VCP5"); - samples.setNewEntities(msInjectionSamples); - getGenericServer().registerSamples(sessionToken, Arrays.asList(samples)); - IServiceForDataStoreServer serviceForDSS = getServiceForDSS(); - for (int i = 0; i < msInjectionSamples.size(); i++) - { - NewSample sample = msInjectionSamples.get(i); - NewExternalData dataSet = new NewExternalData(); - dataSet.setDataSetType(new DataSetTypeBuilder().code("UNKNOWN").getDataSetType()); - dataSet.setDataSetKind(DataSetKind.PHYSICAL); - dataSet.setCode("DS-" + i); - dataSet.setFileFormatType(new FileFormatType("XML")); - dataSet.setDataStoreCode("STANDARD"); - dataSet.setLocation("a/b/c/" + dataSet.getCode()); - dataSet.setLocatorType(new LocatorType("RELATIVE_LOCATION")); - dataSet.setStorageFormat(StorageFormat.PROPRIETARY); - serviceForDSS.registerDataSet(sessionToken, SampleIdentifierFactory.parse(sample), - dataSet); - } - ListSampleCriteria criteria = ListSampleCriteria.createForExperiment(new TechId(experimentId)); - List<Sample> samples2 = getCommonServer().listSamples(sessionToken, criteria); - sampleIds = new long[samples2.size()]; - for (int i = 0; i < sampleIds.length; i++) - { - sampleIds[i] = samples2.get(i).getId(); - } - Arrays.sort(sampleIds); - } - - @Test - public void testListRawDataSamplesForAdminUser() - { - List<MsInjectionDataInfo> samples = getDataService().listRawDataSamples(sessionToken, "test"); - - assertEquals("MSI-0:/TEST-SPACE/CP-TEST-4:/TEST-SPACE/NOE/EXP-TEST-2, " - + "MSI-2:/CISD/3VCP5:/CISD/NEMO/EXP10", renderMsInjectionDataInfos(samples)); - } - - @Test - public void testListRawDataSamplesForSpaceUser() - { - List<MsInjectionDataInfo> samples = getDataService().listRawDataSamples(sessionToken, "test_role"); - - assertEquals("MSI-2:/CISD/3VCP5:/CISD/NEMO/EXP10", renderMsInjectionDataInfos(samples)); - } - - @Test - public void testListAllRawDataSamplesForAdminUser() - { - List<MsInjectionDataInfo> samples = getDataService().listAllRawDataSamples(sessionToken, "test"); - - assertEquals("MSI-0:/TEST-SPACE/CP-TEST-4:/TEST-SPACE/NOE/EXP-TEST-2, " - + "MSI-2:/CISD/3VCP5:/CISD/NEMO/EXP10", renderMsInjectionDataInfos(samples)); - } - - @Test - public void testListAllRawDataSamplesForSpaceUser() - { - List<MsInjectionDataInfo> samples = getDataService().listAllRawDataSamples(sessionToken, "test_role"); - - assertEquals("MSI-0:null:null, " - + "MSI-2:/CISD/3VCP5:/CISD/NEMO/EXP10", renderMsInjectionDataInfos(samples)); - } - - @Test - public void testProcessingRawDataForAdminUser() - { - try - { - getDataService().processingRawData(sessionToken, "test", "test-processing", sampleIds, "UNKNOWN"); - } catch (EnvironmentFailureException ex) - { - AssertionUtil.assertContains("[DS-0, DS-2]", ex.getMessage()); - } - } - - @Test - public void testProcessingRawDataForSpaceUser() - { - try - { - getDataService().processingRawData(sessionToken, "test_role", "test-processing", sampleIds, "UNKNOWN"); - } catch (EnvironmentFailureException ex) - { - AssertionUtil.assertContains("[DS-2]", ex.getMessage()); - } - } - - private String renderMsInjectionDataInfos(List<MsInjectionDataInfo> infos) - { - Collections.sort(infos, new SimpleComparator<MsInjectionDataInfo, String>() - { - @Override - public String evaluate(MsInjectionDataInfo item) - { - return item.getMsInjectionSampleCode(); - } - }); - CommaSeparatedListBuilder builder = new CommaSeparatedListBuilder(); - for (MsInjectionDataInfo info : infos) - { - builder.append(info.getMsInjectionSampleCode() + ":" + info.getBiologicalSampleIdentifier() + ":" - + info.getBiologicalExperimentIdentifier()); - } - return builder.toString(); - } - - private List<NewSample> createMsInjectionSamples(String... parentIdentifiers) - { - List<NewSample> samples = new ArrayList<NewSample>(); - SampleType sampleType = new SampleTypeBuilder().code("MS_INJECTION").getSampleType(); - for (int i = 0; i < parentIdentifiers.length; i++) - { - NewSample sample = new NewSample(); - sample.setParentIdentifier(parentIdentifiers[i]); - sample.setIdentifier("/MS_DATA/MSI-" + i); - sample.setSampleType(sampleType); - sample.setExperimentIdentifier(EXPERIMENT_IDENTIFIER); - samples.add(sample); - } - return samples; - } -} diff --git a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/proteomics/systemtests/ServerAuthorizationTest.java b/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/proteomics/systemtests/ServerAuthorizationTest.java deleted file mode 100644 index 1211b9ac241..00000000000 --- a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/proteomics/systemtests/ServerAuthorizationTest.java +++ /dev/null @@ -1,108 +0,0 @@ -/* - * Copyright 2012 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.proteomics.systemtests; - -import org.testng.annotations.BeforeClass; -import org.testng.annotations.Test; - -import ch.systemsx.cisd.common.exceptions.AuthorizationFailureException; -import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.RoleWithHierarchy.RoleCode; -import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SpaceIdentifier; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.IProteomicsDataServiceInternal; - -/** - * @author Franz-Josef Elmer - */ -@Test(groups = { "slow", "systemtest" }) -public class ServerAuthorizationTest extends AbstractProteomicsSystemTestCase -{ - private static final String USER_A = "USER_A"; - - private static final String USER_INSTANCE_OBSERVER = "USER_B"; - - private static final SpaceIdentifier SPACE_A = new SpaceIdentifier("CISD"); - - @BeforeClass - public void createTestUsers() - { - assignSpaceRole(registerPerson(USER_A), RoleCode.ETL_SERVER, SPACE_A); - assignInstanceRole(registerPerson(USER_INSTANCE_OBSERVER), RoleCode.OBSERVER); - } - - @Test(expectedExceptions = AuthorizationFailureException.class) - public void testForServerSetSessionUserFailedBecauseOfAuthorization() - { - String sessionToken = authenticateAs(USER_A); - getServer().setSessionUser(sessionToken, "abc"); - } - - @Test(expectedExceptions = AuthorizationFailureException.class) - public void testListProteinSummariesByExperimentFailedBecauseOfAuthorization() - { - String sessionToken = authenticateAs(USER_A); - getServer().listProteinSummariesByExperiment(sessionToken, new TechId(42)); - } - - @Test(expectedExceptions = AuthorizationFailureException.class) - public void testForDataServiceInternalSetSessionUserFailedBecauseOfAuthorization() - { - IProteomicsDataServiceInternal dataServiceInternal = getDataServiceInternal(); - String sessionToken = dataServiceInternal.tryAuthenticate(USER_A, "abc").getSessionToken(); - dataServiceInternal.setSessionUser(sessionToken, "abc"); - } - - @Test(expectedExceptions = AuthorizationFailureException.class) - public void testForDataServiceInternalListExperimentsFailedBecauseOfAuthorization() - { - IProteomicsDataServiceInternal dataServiceInternal = getDataServiceInternal(); - String sessionToken = dataServiceInternal.tryAuthenticate(USER_A, "abc").getSessionToken(); - dataServiceInternal.listExperiments(sessionToken, "MS_SEARCH"); - } - - @Test - public void testForDataServiceListExperimentsFailedBecauseOfAuthorization() - { - String sessionToken = authenticateAs(USER_A); - try - { - getDataService().listExperiments(sessionToken, USER_A, "MS_SEARCH"); - fail("AuthorizationFailureException expected"); - } catch (AuthorizationFailureException ex) - { - assertEquals("Authorization failure: ERROR: \"None of method roles " - + "'[INSTANCE_OBSERVER, INSTANCE_ADMIN]' " - + "could be found in roles of user 'USER_A'.\".", ex.getMessage()); - } - } - - @Test - public void testForDataServiceListExperimentsFailedBecauseOfAuthorizationOnSecondLevel() - { - String sessionToken = authenticateAs(USER_INSTANCE_OBSERVER); - try - { - getDataService().listExperiments(sessionToken, USER_A, "MS_SEARCH"); - fail("AuthorizationFailureException expected"); - } catch (AuthorizationFailureException ex) - { - assertEquals("Authorization failure: ERROR: \"None of method roles " - + "'[PROJECT_USER, PROJECT_POWER_USER, PROJECT_ADMIN, SPACE_ADMIN, INSTANCE_ADMIN, SPACE_POWER_USER, SPACE_USER]' " - + "could be found in roles of user 'USER_A'.\".", ex.getMessage()); - } - } -} diff --git a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/proteomics/systemtests/authorization/validator/CommonValidatorProteomicsSystemTest.java b/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/proteomics/systemtests/authorization/validator/CommonValidatorProteomicsSystemTest.java deleted file mode 100644 index 109f75aea32..00000000000 --- a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/proteomics/systemtests/authorization/validator/CommonValidatorProteomicsSystemTest.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright 2017 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.proteomics.systemtests.authorization.validator; - -import ch.systemsx.cisd.openbis.datastoreserver.systemtests.authorization.validator.CommonValidatorSystemTest; - -/** - * @author pkupczyk - */ -public abstract class CommonValidatorProteomicsSystemTest<O> extends CommonValidatorSystemTest<O> -{ - - @Override - protected String getApplicationContextLocation() - { - return "classpath:proteomics-applicationContext.xml"; - } - -} diff --git a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/proteomics/systemtests/authorization/validator/sample/ParentSampleValidatorSystemTest.java b/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/proteomics/systemtests/authorization/validator/sample/ParentSampleValidatorSystemTest.java deleted file mode 100644 index 09d22f285ec..00000000000 --- a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/proteomics/systemtests/authorization/validator/sample/ParentSampleValidatorSystemTest.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright 2017 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.proteomics.systemtests.authorization.validator.sample; - -import ch.systemsx.cisd.openbis.datastoreserver.systemtests.authorization.ProjectAuthorizationUser; -import ch.systemsx.cisd.openbis.datastoreserver.systemtests.authorization.common.SampleUtil; -import ch.systemsx.cisd.openbis.datastoreserver.systemtests.authorization.validator.CommonValidatorSystemTestAssertions; -import ch.systemsx.cisd.openbis.datastoreserver.systemtests.authorization.validator.CommonValidatorSystemTestSampleAssertions; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample; -import ch.systemsx.cisd.openbis.generic.shared.dto.ProjectPE; -import ch.systemsx.cisd.openbis.generic.shared.dto.SpacePE; -import ch.systemsx.cisd.openbis.proteomics.systemtests.authorization.validator.CommonValidatorProteomicsSystemTest; - -/** - * @author pkupczyk - */ -public class ParentSampleValidatorSystemTest extends CommonValidatorProteomicsSystemTest<Sample> -{ - - @Override - public Object[] getParams() - { - return getSampleKinds(SampleKind.SHARED_READ); - } - - @Override - protected Sample createObject(SpacePE spacePE, ProjectPE projectPE, Object param) - { - Sample parent = SampleUtil.createObject(this, spacePE, projectPE, param); - Sample sample = new Sample(); - sample.addParent(parent); - return sample; - } - - @Override - protected Sample validateObject(ProjectAuthorizationUser user, Sample object, Object param) - { - return getBean(SampleValidatorProteomicsTestService.class).testParentSampleValidator(user.getSessionProvider(), object); - } - - @Override - protected CommonValidatorSystemTestAssertions<Sample> getAssertions() - { - return new CommonValidatorSystemTestSampleAssertions<>(super.getAssertions()); - } - -} diff --git a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/proteomics/systemtests/authorization/validator/sample/RawDataSampleValidatorSystemTest.java b/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/proteomics/systemtests/authorization/validator/sample/RawDataSampleValidatorSystemTest.java deleted file mode 100644 index 9a06c6a653e..00000000000 --- a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/proteomics/systemtests/authorization/validator/sample/RawDataSampleValidatorSystemTest.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright 2017 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.proteomics.systemtests.authorization.validator.sample; - -import ch.systemsx.cisd.openbis.datastoreserver.systemtests.authorization.ProjectAuthorizationUser; -import ch.systemsx.cisd.openbis.datastoreserver.systemtests.authorization.common.SampleUtil; -import ch.systemsx.cisd.openbis.datastoreserver.systemtests.authorization.validator.CommonValidatorSystemTestAssertions; -import ch.systemsx.cisd.openbis.datastoreserver.systemtests.authorization.validator.CommonValidatorSystemTestSampleAssertions; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample; -import ch.systemsx.cisd.openbis.generic.shared.dto.ProjectPE; -import ch.systemsx.cisd.openbis.generic.shared.dto.SpacePE; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.dto.MsInjectionSample; -import ch.systemsx.cisd.openbis.proteomics.systemtests.authorization.validator.CommonValidatorProteomicsSystemTest; - -/** - * @author pkupczyk - */ -public class RawDataSampleValidatorSystemTest extends CommonValidatorProteomicsSystemTest<MsInjectionSample> -{ - - @Override - public Object[] getParams() - { - return getSampleKinds(SampleKind.SHARED_READ); - } - - @Override - protected MsInjectionSample createObject(SpacePE spacePE, ProjectPE projectPE, Object param) - { - Sample parent = SampleUtil.createObject(this, spacePE, projectPE, param); - Sample sample = new Sample(); - sample.addParent(parent); - return new MsInjectionSample(sample, null); - } - - @Override - protected MsInjectionSample validateObject(ProjectAuthorizationUser user, MsInjectionSample object, Object param) - { - return getBean(SampleValidatorProteomicsTestService.class).testRawDataSampleValidator(user.getSessionProvider(), object); - } - - @Override - protected CommonValidatorSystemTestAssertions<MsInjectionSample> getAssertions() - { - return new CommonValidatorSystemTestSampleAssertions<>(super.getAssertions()); - } - -} diff --git a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/proteomics/systemtests/authorization/validator/sample/SampleValidatorProteomicsTestService.java b/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/proteomics/systemtests/authorization/validator/sample/SampleValidatorProteomicsTestService.java deleted file mode 100644 index 4b988f35884..00000000000 --- a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/proteomics/systemtests/authorization/validator/sample/SampleValidatorProteomicsTestService.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright 2017 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.proteomics.systemtests.authorization.validator.sample; - -import org.springframework.stereotype.Component; -import org.springframework.transaction.annotation.Transactional; - -import ch.systemsx.cisd.openbis.generic.server.authorization.annotation.ReturnValueFilter; -import ch.systemsx.cisd.openbis.generic.server.authorization.annotation.RolesAllowed; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.RoleWithHierarchy; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample; -import ch.systemsx.cisd.openbis.generic.shared.dto.IAuthSessionProvider; -import ch.systemsx.cisd.openbis.plugin.proteomics.server.authorization.validator.ParentSampleValidator; -import ch.systemsx.cisd.openbis.plugin.proteomics.server.authorization.validator.RawDataSampleValidator; -import ch.systemsx.cisd.openbis.plugin.proteomics.shared.dto.MsInjectionSample; - -/** - * @author pkupczyk - */ -@Component -public class SampleValidatorProteomicsTestService -{ - - @Transactional - @RolesAllowed(value = { RoleWithHierarchy.PROJECT_OBSERVER }) - @ReturnValueFilter(validatorClass = ParentSampleValidator.class) - public Sample testParentSampleValidator(IAuthSessionProvider sessionProvider, Sample sample) - { - return sample; - } - - @Transactional - @RolesAllowed(value = { RoleWithHierarchy.PROJECT_OBSERVER }) - @ReturnValueFilter(validatorClass = RawDataSampleValidator.class) - public MsInjectionSample testRawDataSampleValidator(IAuthSessionProvider sessionProvider, MsInjectionSample sample) - { - return sample; - } - -} diff --git a/rtd_phosphonetx/sourceTest/java/tests.xml b/rtd_phosphonetx/sourceTest/java/tests.xml deleted file mode 100644 index 34383147e47..00000000000 --- a/rtd_phosphonetx/sourceTest/java/tests.xml +++ /dev/null @@ -1,14 +0,0 @@ -<suite name="All" verbose="2" > - <test name="All" annotations="JDK"> - <groups> - <run> - <exclude name="broken" /> - </run> - </groups> - <packages> - <package name="ch.systemsx.cisd.openbis.etlserver.proteomics.*" /> - <package name="ch.systemsx.cisd.openbis.dss.proteomics.*" /> - <package name="ch.systemsx.cisd.openbis.plugin.proteomics.*" /> - </packages> - </test> -</suite> diff --git a/rtd_phosphonetx/sourceTest/java/tests_project_authorization.xml b/rtd_phosphonetx/sourceTest/java/tests_project_authorization.xml deleted file mode 100644 index 22211d608c9..00000000000 --- a/rtd_phosphonetx/sourceTest/java/tests_project_authorization.xml +++ /dev/null @@ -1,12 +0,0 @@ -<suite name="projectAuthorization" verbose="2"> - <test name="unit" annotations="JDK"> - <groups> - <run> - <exclude name="broken" /> - </run> - </groups> - <packages> - <package name="ch.systemsx.cisd.openbis.proteomics.systemtests.authorization.validator.*" /> - </packages> - </test> -</suite> diff --git a/rtd_phosphonetx/sourceTest/java/tests_system.xml b/rtd_phosphonetx/sourceTest/java/tests_system.xml deleted file mode 100644 index f5f68092a5b..00000000000 --- a/rtd_phosphonetx/sourceTest/java/tests_system.xml +++ /dev/null @@ -1,7 +0,0 @@ -<suite name="SystemTests" verbose="2" > - <test name="SystemTests" annotations="JDK"> - <packages> - <package name="ch.systemsx.cisd.openbis.proteomics.systemtests.*" /> - </packages> - </test> -</suite> -- GitLab