From 7904bb17dcc0f3ed1f43ed520e84a5f4cb4dacd8 Mon Sep 17 00:00:00 2001 From: vagisha Date: Sun, 9 Feb 2025 12:25:23 -0800 Subject: [PATCH 1/4] Issue 46118: java.nio.file.NoSuchFileException from SpecLibValidator.getPath() For spectrum library source files we look in the "RawFiles" directory of all subfolders that have documents with the library, as well as the parent experiment folder. - Skip the "RawFiles" directory if it does not exist (e.g., if it was deleted by user) in the container. - Added test, and test files --- .../validator/SpecLibValidator.java | 21 +++- .../20210719_SIRT-PRM_SIRT4pep_unsched.msf | Bin 0 -> 100 bytes .../20210719_SIRT-PRM_SIRT4pep_unsched.raw | Bin 0 -> 100 bytes ...20210719_SIRT-PRM_non-SIRT4_unsched_01.msf | Bin 0 -> 100 bytes ...20210719_SIRT-PRM_non-SIRT4_unsched_01.raw | Bin 0 -> 100 bytes ...20210719_SIRT-PRM_non-SIRT4_unsched_02.msf | Bin 0 -> 100 bytes ...20210719_SIRT-PRM_non-SIRT4_unsched_02.raw | Bin 0 -> 100 bytes ...20210719_SIRT-PRM_non-SIRT4_unsched_03.msf | Bin 0 -> 100 bytes ...20210719_SIRT-PRM_non-SIRT4_unsched_03.raw | Bin 0 -> 100 bytes ...20210719_SIRT-PRM_non-SIRT4_unsched_04.msf | Bin 0 -> 100 bytes ...20210719_SIRT-PRM_non-SIRT4_unsched_04.raw | Bin 0 -> 100 bytes ...20210719_SIRT-PRM_non-SIRT4_unsched_05.msf | Bin 0 -> 100 bytes ...20210719_SIRT-PRM_non-SIRT4_unsched_05.raw | Bin 0 -> 100 bytes .../LibraryTest-telomerasehcmvprm/README.txt | 4 + ...merase_HCMV_PRM_Skyline-NO-RESULTS.sky.zip | Bin 0 -> 24747 bytes .../panoramapublic/DataValidationPage.java | 4 +- .../PanoramaPublicBaseTest.java | 11 ++ .../PanoramaPublicValidationTest.java | 118 ++++++++++++++++-- 18 files changed, 139 insertions(+), 19 deletions(-) create mode 100644 panoramapublic/test/sampledata/TargetedMS/panoramapublic/LibraryTest-telomerasehcmvprm/20210719_SIRT-PRM_SIRT4pep_unsched.msf create mode 100644 panoramapublic/test/sampledata/TargetedMS/panoramapublic/LibraryTest-telomerasehcmvprm/20210719_SIRT-PRM_SIRT4pep_unsched.raw create mode 100644 panoramapublic/test/sampledata/TargetedMS/panoramapublic/LibraryTest-telomerasehcmvprm/20210719_SIRT-PRM_non-SIRT4_unsched_01.msf create mode 100644 panoramapublic/test/sampledata/TargetedMS/panoramapublic/LibraryTest-telomerasehcmvprm/20210719_SIRT-PRM_non-SIRT4_unsched_01.raw create mode 100644 panoramapublic/test/sampledata/TargetedMS/panoramapublic/LibraryTest-telomerasehcmvprm/20210719_SIRT-PRM_non-SIRT4_unsched_02.msf create mode 100644 panoramapublic/test/sampledata/TargetedMS/panoramapublic/LibraryTest-telomerasehcmvprm/20210719_SIRT-PRM_non-SIRT4_unsched_02.raw create mode 100644 panoramapublic/test/sampledata/TargetedMS/panoramapublic/LibraryTest-telomerasehcmvprm/20210719_SIRT-PRM_non-SIRT4_unsched_03.msf create mode 100644 panoramapublic/test/sampledata/TargetedMS/panoramapublic/LibraryTest-telomerasehcmvprm/20210719_SIRT-PRM_non-SIRT4_unsched_03.raw create mode 100644 panoramapublic/test/sampledata/TargetedMS/panoramapublic/LibraryTest-telomerasehcmvprm/20210719_SIRT-PRM_non-SIRT4_unsched_04.msf create mode 100644 panoramapublic/test/sampledata/TargetedMS/panoramapublic/LibraryTest-telomerasehcmvprm/20210719_SIRT-PRM_non-SIRT4_unsched_04.raw create mode 100644 panoramapublic/test/sampledata/TargetedMS/panoramapublic/LibraryTest-telomerasehcmvprm/20210719_SIRT-PRM_non-SIRT4_unsched_05.msf create mode 100644 panoramapublic/test/sampledata/TargetedMS/panoramapublic/LibraryTest-telomerasehcmvprm/20210719_SIRT-PRM_non-SIRT4_unsched_05.raw create mode 100644 panoramapublic/test/sampledata/TargetedMS/panoramapublic/LibraryTest-telomerasehcmvprm/README.txt create mode 100644 panoramapublic/test/sampledata/TargetedMS/panoramapublic/LibraryTest-telomerasehcmvprm/Telomerase_HCMV_PRM_Skyline-NO-RESULTS.sky.zip diff --git a/panoramapublic/src/org/labkey/panoramapublic/proteomexchange/validator/SpecLibValidator.java b/panoramapublic/src/org/labkey/panoramapublic/proteomexchange/validator/SpecLibValidator.java index 924b97a1..2655b636 100644 --- a/panoramapublic/src/org/labkey/panoramapublic/proteomexchange/validator/SpecLibValidator.java +++ b/panoramapublic/src/org/labkey/panoramapublic/proteomexchange/validator/SpecLibValidator.java @@ -31,8 +31,10 @@ import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; +import java.util.HashMap; import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.Objects; import java.util.Set; import java.util.stream.Collectors; @@ -210,6 +212,16 @@ private void validateLibrarySources(List sources, FileContentServ // folder as well as any subfolders containing documents that have the library Set containers = getDocsWithLibrary().stream().map(dl -> dl.getRun().getContainer()).collect(Collectors.toSet()); containers.add(expAnnotations.getContainer()); + Set rawFilesDirPaths = new HashSet<>(); + for (Container container: containers) + { + var rawFiesDirPath = DataValidator.getRawFilesDirPath(container, fcs); + // We will look in the "RawFiles" directory only if it exists. + if (Files.exists(rawFiesDirPath)) + { + rawFilesDirPaths.add(rawFiesDirPath); + } + } List spectrumFiles = new ArrayList<>(); List idFiles = new ArrayList<>(); @@ -220,7 +232,7 @@ private void validateLibrarySources(List sources, FileContentServ if (source.hasSpectrumSourceFile() && !checkedFiles.contains(ssf)) { checkedFiles.add(ssf); - Path path = getPath(ssf, containers, source.isMaxQuantSearch(), fcs); + Path path = getPath(ssf, rawFilesDirPaths, source.isMaxQuantSearch(), fcs); SpecLibSourceFile sourceFile = new SpecLibSourceFile(ssf, SPECTRUM); sourceFile.setSpecLibValidationId(getId()); sourceFile.setPath(path != null ? path.toString() : DataFile.NOT_FOUND); @@ -230,7 +242,7 @@ private void validateLibrarySources(List sources, FileContentServ if (source.hasIdFile() && !checkedFiles.contains(idFile)) { checkedFiles.add(idFile); - Path path = getPath(idFile, containers, false, fcs); + Path path = getPath(idFile, rawFilesDirPaths, false, fcs); SpecLibSourceFile sourceFile = new SpecLibSourceFile(idFile, PEPTIDE_ID); sourceFile.setSpecLibValidationId(getId()); sourceFile.setPath(path != null ? path.toString() : DataFile.NOT_FOUND); @@ -241,11 +253,10 @@ private void validateLibrarySources(List sources, FileContentServ setIdFiles(idFiles); } - private Path getPath(String name, Set containers, boolean isMaxquant, FileContentService fcs) + private Path getPath(String name, Set rawFilesDirPaths, boolean isMaxquant, FileContentService fcs) { - for (Container container: containers) + for (Path rawFilesDir: rawFilesDirPaths) { - java.nio.file.Path rawFilesDir = DataValidator.getRawFilesDirPath(container, fcs); Path path = findInDirectoryTree(rawFilesDir, name, isMaxquant); if (path != null) { diff --git a/panoramapublic/test/sampledata/TargetedMS/panoramapublic/LibraryTest-telomerasehcmvprm/20210719_SIRT-PRM_SIRT4pep_unsched.msf b/panoramapublic/test/sampledata/TargetedMS/panoramapublic/LibraryTest-telomerasehcmvprm/20210719_SIRT-PRM_SIRT4pep_unsched.msf new file mode 100644 index 0000000000000000000000000000000000000000..119ebfe869e162a9854cb975b92bfde4fa347200 GIT binary patch literal 100 zcmWFz^vNtqRY=P(%1ta$FlG>7U}R))P*7lCV4lUm=>M64(R&vI0|O5bF9u>3Acg@( N7y~yAG(%6N0RRKp3d#Tg literal 0 HcmV?d00001 diff --git a/panoramapublic/test/sampledata/TargetedMS/panoramapublic/LibraryTest-telomerasehcmvprm/20210719_SIRT-PRM_SIRT4pep_unsched.raw b/panoramapublic/test/sampledata/TargetedMS/panoramapublic/LibraryTest-telomerasehcmvprm/20210719_SIRT-PRM_SIRT4pep_unsched.raw new file mode 100644 index 0000000000000000000000000000000000000000..ccfcc752b9e5c0f8de3b635b245aaf5c9f9b54d6 GIT binary patch literal 100 zcmZQv=*E!AkOzdB4CxGsKpGuzFgO8)m|ORFq}E(#j9^Fxs>%VXPGTr!C}N0b2xh2c SC}t>ONM*=H*9zu`FaQ7$77fk- literal 0 HcmV?d00001 diff --git a/panoramapublic/test/sampledata/TargetedMS/panoramapublic/LibraryTest-telomerasehcmvprm/20210719_SIRT-PRM_non-SIRT4_unsched_01.msf b/panoramapublic/test/sampledata/TargetedMS/panoramapublic/LibraryTest-telomerasehcmvprm/20210719_SIRT-PRM_non-SIRT4_unsched_01.msf new file mode 100644 index 0000000000000000000000000000000000000000..2e89b67771d5d294ecf8212eb6816c86e0ebdedb GIT binary patch literal 100 zcmWFz^vNtqRY=P(%1ta$FlG>7U}R))P*7lCV4lmsSn-g7v4ow0fq@5z7XvX15W@f? NjDed5nxUuC008JO3S9sI literal 0 HcmV?d00001 diff --git a/panoramapublic/test/sampledata/TargetedMS/panoramapublic/LibraryTest-telomerasehcmvprm/20210719_SIRT-PRM_non-SIRT4_unsched_01.raw b/panoramapublic/test/sampledata/TargetedMS/panoramapublic/LibraryTest-telomerasehcmvprm/20210719_SIRT-PRM_non-SIRT4_unsched_01.raw new file mode 100644 index 0000000000000000000000000000000000000000..8cea934dc4e0108855325cb34369699ee229a0f4 GIT binary patch literal 100 zcmZQv=*E!AkOzdB4CxGsKpGuzFgO8)jDn*Qi)yYjMld7;RpkIxCoz;V6fwjz1T$1J R6f=}Cq%!29YX$Q|7ytpu4UYf- literal 0 HcmV?d00001 diff --git a/panoramapublic/test/sampledata/TargetedMS/panoramapublic/LibraryTest-telomerasehcmvprm/20210719_SIRT-PRM_non-SIRT4_unsched_02.msf b/panoramapublic/test/sampledata/TargetedMS/panoramapublic/LibraryTest-telomerasehcmvprm/20210719_SIRT-PRM_non-SIRT4_unsched_02.msf new file mode 100644 index 0000000000000000000000000000000000000000..2321072949bef7d830fc6f687998b3a1841f394b GIT binary patch literal 100 zcmWFz^vNtqRY=P(%1ta$FlG>7U}R))P*7lCU|z()SUit`F@G@w0|O5bgJ>2Yh5<$x M12+vcLr7U}R))P*7lCV4lvv*u=uXSkuYCz`z57U}R))P*7lCV4lIinD&u@F^QLffq@5z7XvX15W@f? NjDed5nxUuC0083e3Pk__ literal 0 HcmV?d00001 diff --git a/panoramapublic/test/sampledata/TargetedMS/panoramapublic/LibraryTest-telomerasehcmvprm/20210719_SIRT-PRM_non-SIRT4_unsched_04.raw b/panoramapublic/test/sampledata/TargetedMS/panoramapublic/LibraryTest-telomerasehcmvprm/20210719_SIRT-PRM_non-SIRT4_unsched_04.raw new file mode 100644 index 0000000000000000000000000000000000000000..50c7fc112997afeb945de4e6891a294766e14919 GIT binary patch literal 100 zcmZQv=*E!AkOzdB4CxGsKpGuzFgO8)T5t9(pILLAF@hl(s454jI*Fl_p@<=#A()|( Sp_rkBA(bH)T`QO$!T7U}R))P*7lCU|z_;m~(`IF@u+Zfq@5z7XvX15W@f? NjDed5nxUuC007*)3N`=$ literal 0 HcmV?d00001 diff --git a/panoramapublic/test/sampledata/TargetedMS/panoramapublic/LibraryTest-telomerasehcmvprm/20210719_SIRT-PRM_non-SIRT4_unsched_05.raw b/panoramapublic/test/sampledata/TargetedMS/panoramapublic/LibraryTest-telomerasehcmvprm/20210719_SIRT-PRM_non-SIRT4_unsched_05.raw new file mode 100644 index 0000000000000000000000000000000000000000..ef8e7ce101761c6c3ffd7034f290a160771302d3 GIT binary patch literal 100 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

{zSK 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 GR{sTGvRFj` literal 0 HcmV?d00001 diff --git a/panoramapublic/test/src/org/labkey/test/pages/panoramapublic/DataValidationPage.java b/panoramapublic/test/src/org/labkey/test/pages/panoramapublic/DataValidationPage.java index f82c1d61..c83cae21 100644 --- a/panoramapublic/test/src/org/labkey/test/pages/panoramapublic/DataValidationPage.java +++ b/panoramapublic/test/src/org/labkey/test/pages/panoramapublic/DataValidationPage.java @@ -167,11 +167,11 @@ public void verifySpectralLibraryStatus(String libraryFile, String fileSize, Str expandLibraryRow(panel, libraryFile, fileSize); verifySpecLibStatus(libraryFile, fileSize, (spectrumFiles.size() == 0 || idFiles.size() == 0 - || spectrumFilesMissing.size() > 0 || idFilesMissing.size() > 0) ? "INCOMPLETE" : "CPMPLETE"); + || spectrumFilesMissing.size() > 0 || idFilesMissing.size() > 0) ? "INCOMPLETE" : "COMPLETE"); var panelText = panel.getText(); List expectedTexts = new ArrayList<>(skylineDocNames); - expectedTexts.add(statusText); + if (statusText != null) expectedTexts.add(statusText); assertTextPresent(new TextSearcher(panelText), expectedTexts.toArray(new String[]{})); verifyLibrarySourceFiles(libraryFile, spectrumFiles, spectrumFilesMissing, panel, "lib-spectrum-files-status"); diff --git a/panoramapublic/test/src/org/labkey/test/tests/panoramapublic/PanoramaPublicBaseTest.java b/panoramapublic/test/src/org/labkey/test/tests/panoramapublic/PanoramaPublicBaseTest.java index 4cc09515..883ade85 100644 --- a/panoramapublic/test/src/org/labkey/test/tests/panoramapublic/PanoramaPublicBaseTest.java +++ b/panoramapublic/test/src/org/labkey/test/tests/panoramapublic/PanoramaPublicBaseTest.java @@ -202,6 +202,11 @@ private void setupSourceFolder(String projectName, String folderName, FolderType { setupSubfolder(projectName, folderName, folderType); // Create the subfolder + updatePermissions(projectName, folderName, adminUsers); + } + + private void updatePermissions(String projectName, String folderName, String[] adminUsers) + { ApiPermissionsHelper permissionsHelper = new ApiPermissionsHelper(this); _userHelper.ensureUsersExist(List.of(adminUsers)); for(String user: adminUsers) @@ -210,6 +215,12 @@ private void setupSourceFolder(String projectName, String folderName, FolderType } } + void setupSubfolder(String projectName, String parentFolderName, String folderName, FolderType folderType, String ... adminUsers) + { + super.setupSubfolder(projectName, parentFolderName, folderName, folderType); + updatePermissions(projectName, parentFolderName + "/" + folderName, adminUsers); + } + void updateSubmitterAccountInfo(String lastName) { goToMyAccount(); diff --git a/panoramapublic/test/src/org/labkey/test/tests/panoramapublic/PanoramaPublicValidationTest.java b/panoramapublic/test/src/org/labkey/test/tests/panoramapublic/PanoramaPublicValidationTest.java index 77f4b8f4..d8e276e9 100644 --- a/panoramapublic/test/src/org/labkey/test/tests/panoramapublic/PanoramaPublicValidationTest.java +++ b/panoramapublic/test/src/org/labkey/test/tests/panoramapublic/PanoramaPublicValidationTest.java @@ -6,6 +6,7 @@ import org.labkey.test.Locator; import org.labkey.test.categories.External; import org.labkey.test.categories.MacCossLabModules; +import org.labkey.test.components.panoramapublic.TargetedMsExperimentWebPart; import org.labkey.test.pages.panoramapublic.DataValidationPage; import org.labkey.test.util.DataRegionTable; import org.labkey.test.util.Ext4Helper; @@ -42,6 +43,17 @@ public class PanoramaPublicValidationTest extends PanoramaPublicBaseTest private static final String AGILENT_DATA_2_ZIP = AGILENT_DATA_2 + ".zip"; private static final String SKY_FILE_8 = "Study9S_Site52_v1_with_library.sky.zip"; + // Raw files used to build the maxquant.blib library used with Olga_srm_course_heavy_light_w_maxquant_lib.sky.zip + private static final List maxQuantLibRawSources = List.of("BBM_332_P110_C04_PRM_007.raw", + "BBM_332_P110_C04_PRM_006.raw", + "BBM_332_P110_C04_PRM_005.raw", + "BBM_332_P110_C04_PRM_004.raw", + "BBM_332_P110_C04_PRM_003.raw"); + // Peptide Id files used to build the maxquant.blib library used with Olga_srm_course_heavy_light_w_maxquant_lib.sky.zip + private static final List maxQuantLibPeptideIdSources = List.of("evidence.txt", "mqpar.xml", "msms.txt"); + + private static final String SKY_FILE_9 = "Telomerase_HCMV_PRM_Skyline-NO-RESULTS.sky.zip"; + @Override public String getSampleDataFolder() { @@ -177,6 +189,96 @@ public void testValidationUpdate() goToValidationDetails().verifyCompleteStatus(); } + @Test + public void testLibraryValidationWithSubfolders() + { + // Set up our source folder. + log("Creating experiment folder"); + String projectName = getProjectName(); + String folderName = "Experiment Folder"; + setupSourceFolder(projectName, folderName, SUBMITTER); + log("Creating subfolder where Skyline documents will be uploaded"); + String subfolderName = "Skyline Documents Folder"; + setupSubfolder(projectName, folderName, subfolderName, FolderType.Experiment, SUBMITTER); + + impersonate(SUBMITTER); + updateSubmitterAccountInfo("One"); + + String testFilesFolder = "LibraryTest-telomerasehcmvprm"; + String testSkyZip = testFilesFolder + "/" + SKY_FILE_9; + + // Upload document and raw data files + log("Uploading and importing Skyline document " + testSkyZip + " into folder " + folderName + "/" + subfolderName); + goToProjectFolder(projectName, folderName + "/" + subfolderName); + importData(testSkyZip, 1); + + // Add the "Targeted MS Experiment" webpart + log("Creating TargetedMS Experiment in folder " + folderName); + goToProjectFolder(projectName, folderName); + String experimentTitle = "This is an experiment to test validation of Bibliospec library source files"; + TargetedMsExperimentWebPart expWebPart = createExperimentCompleteMetadata(experimentTitle); + // Include subfolders + log("Including subfolders in experiment"); + goToDashboard(); + expWebPart.clickMoreDetails(); + clickButton("Include Subfolders"); + + String libraryName = "test_library.blib"; + List rawSources = List.of("20210719_SIRT-PRM_non-SIRT4_unsched_01.raw", + "20210719_SIRT-PRM_non-SIRT4_unsched_02.raw", + "20210719_SIRT-PRM_non-SIRT4_unsched_03.raw", + "20210719_SIRT-PRM_non-SIRT4_unsched_04.raw", + "20210719_SIRT-PRM_non-SIRT4_unsched_05.raw", + "20210719_SIRT-PRM_SIRT4pep_unsched.raw"); + List peptideIdSources = List.of("20210719_SIRT-PRM_non-SIRT4_unsched_01.msf", + "20210719_SIRT-PRM_non-SIRT4_unsched_02.msf", + "20210719_SIRT-PRM_non-SIRT4_unsched_03.msf", + "20210719_SIRT-PRM_non-SIRT4_unsched_04.msf", + "20210719_SIRT-PRM_non-SIRT4_unsched_05.msf", + "20210719_SIRT-PRM_SIRT4pep_unsched.msf"); + + goToDashboard(); + // Upload the source files used to build the maxquant.blib library to the parent experiment folder. + // Since spectral libraries can be used with multiple documents that may be uploaded across subfolders, + // we check all subfolders, as well as the parent experiment folder for library source files. + log("Uploading library source files to parent experiment folder - " + folderName); + uploadRawFiles(rawSources.stream() + .map(file -> testFilesFolder + "/" + file) + .toArray(String[]::new)); + uploadRawFiles(peptideIdSources.stream() + .map(file -> testFilesFolder + "/" + file) + .toArray(String[]::new)); + + // Run validation job and verify the results + log("Running data validation job; expect COMPLETE status"); + DataValidationPage validationPage = submitValidationJob(); + validationPage.verifyCompleteStatus(); + verifySpecLibSourceFiles(validationPage, libraryName, SKY_FILE_9, "100 KB", true, rawSources, peptideIdSources); + + // Delete the "RawFiles" folder in the parent experiment folder + log("Deleting RawFiles directory from the parent experiment folder"); + goToModule("FileContent"); + _fileBrowserHelper.deleteFile("RawFiles"); + + log("Running data validation job; expect INCOMPLETE status"); + validationPage = submitValidationJob(); + validationPage.verifyIncompleteStatus(); + verifySpecLibSourceFiles(validationPage, libraryName, SKY_FILE_9, "100 KB", false, rawSources, peptideIdSources); + } + + private static void verifySpecLibSourceFiles(DataValidationPage validationPage, String libraryFileName, String skyZipName, String libraryFileSize, + boolean allSourcesFound, List rawFiles, List peptideIdFiles) + { + String expectedStatus = allSourcesFound ? null : "Missing spectrum and peptide Id files"; + validationPage.verifySpectralLibraryStatus(libraryFileName, libraryFileSize, expectedStatus, + List.of(skyZipName), + allSourcesFound ? rawFiles : Collections.emptyList(), + !allSourcesFound ? rawFiles : Collections.emptyList(), + allSourcesFound ? peptideIdFiles : Collections.emptyList(), + !allSourcesFound ? peptideIdFiles : Collections.emptyList() + ); + } + private void clickExperimentDetailsLink() { var exptDetailsLink = Locator.XPathLocator.tag("a").withText("[View Experiment Details]").findElement(getDriver()); @@ -352,12 +454,8 @@ private int verifyIncompleteStatus(int jobCount) // Verify library built with MaxQuant results. Expect to see evidence.xml, mqpar.xml in the Peptide ID files list // even though these files are not named in the .blib - validationPage.verifySpectralLibraryStatus("maxquant.blib", "104 KB", "Missing spectrum and peptide Id files", - List.of(SKY_FILE_2), - Collections.emptyList(), - List.of("BBM_332_P110_C04_PRM_007.raw", "BBM_332_P110_C04_PRM_006.raw", "BBM_332_P110_C04_PRM_005.raw", "BBM_332_P110_C04_PRM_004.raw", "BBM_332_P110_C04_PRM_003.raw"), - Collections.emptyList(), - List.of("evidence.txt", "mqpar.xml", "msms.txt")); + verifySpecLibSourceFiles(validationPage, "maxquant.blib", SKY_FILE_2, "104 KB", + false, maxQuantLibRawSources, maxQuantLibPeptideIdSources); // .blib does not have any source files in the SpectrumSourceFiles table. validationPage.verifySpectralLibraryStatus("Qtrap_DP-PA_cons_P0836.blib", "61 KB", @@ -383,12 +481,8 @@ private int verifyMissingBlibAndUnsupportedLibrary(int jobCount) // Verify library built with MaxQuant results. Expect to see evidence.xml, mqpar.xml in the Peptide ID files list // even though these files are not named in the .blib - validationPage.verifySpectralLibraryStatus("maxquant.blib", "104 KB", "Missing spectrum and peptide Id files", - List.of(SKY_FILE_2), - Collections.emptyList(), - List.of("BBM_332_P110_C04_PRM_007.raw", "BBM_332_P110_C04_PRM_006.raw", "BBM_332_P110_C04_PRM_005.raw", "BBM_332_P110_C04_PRM_004.raw", "BBM_332_P110_C04_PRM_003.raw"), - Collections.emptyList(), - List.of("evidence.txt", "mqpar.xml", "msms.txt")); + verifySpecLibSourceFiles(validationPage, "maxquant.blib", SKY_FILE_2, "104 KB", + false, maxQuantLibRawSources, maxQuantLibPeptideIdSources); // .blib does not have any source files in the SpectrumSourceFiles table. validationPage.verifySpectralLibraryStatus("Qtrap_DP-PA_cons_P0836.blib", "61 KB", From 1d46b8cf9b5fcbb23971af2e0d57fc4aee998212 Mon Sep 17 00:00:00 2001 From: vagisha Date: Mon, 10 Feb 2025 08:41:43 -0800 Subject: [PATCH 2/4] Updated README in test files folder. --- .../panoramapublic/LibraryTest-telomerasehcmvprm/README.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/panoramapublic/test/sampledata/TargetedMS/panoramapublic/LibraryTest-telomerasehcmvprm/README.txt b/panoramapublic/test/sampledata/TargetedMS/panoramapublic/LibraryTest-telomerasehcmvprm/README.txt index f2501663..de9ae26f 100644 --- a/panoramapublic/test/sampledata/TargetedMS/panoramapublic/LibraryTest-telomerasehcmvprm/README.txt +++ b/panoramapublic/test/sampledata/TargetedMS/panoramapublic/LibraryTest-telomerasehcmvprm/README.txt @@ -1,4 +1,4 @@ -This folder contains dummy files for testing that all the source files used for building a Bibliospec spectral library results are available in a folder being submitted to Panorama Public. +This folder contains dummy files for testing that all the source files used for building a Bibliospec spectral library are available in the folder being submitted to Panorama Public. Test is: PanoramaPublicValidationTest.testLibraryValidationWithSubfolders() Original files are in the Panorama Public data folder https://panoramaweb.org/telomerasehcmvprm.url Replicates and targets were removed from the test document, Telomerase_HCMV_PRM_Skyline_2024-11-22_21-30-46.sky.zip, to keep the size small. The library, 20211118_SIRT-PRM_HSV1_rescheduling_v2.blib, was rebuilt as test_library.blib with "Filter for document peptides" checked to keep the size of the library small. From f7d1bbf4b8ccd8d75e3c16bf9343112550ada176 Mon Sep 17 00:00:00 2001 From: vagisha Date: Mon, 10 Feb 2025 08:46:19 -0800 Subject: [PATCH 3/4] Fixed comment. --- .../tests/panoramapublic/PanoramaPublicValidationTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/panoramapublic/test/src/org/labkey/test/tests/panoramapublic/PanoramaPublicValidationTest.java b/panoramapublic/test/src/org/labkey/test/tests/panoramapublic/PanoramaPublicValidationTest.java index d8e276e9..f89a5ad6 100644 --- a/panoramapublic/test/src/org/labkey/test/tests/panoramapublic/PanoramaPublicValidationTest.java +++ b/panoramapublic/test/src/org/labkey/test/tests/panoramapublic/PanoramaPublicValidationTest.java @@ -238,8 +238,8 @@ public void testLibraryValidationWithSubfolders() "20210719_SIRT-PRM_SIRT4pep_unsched.msf"); goToDashboard(); - // Upload the source files used to build the maxquant.blib library to the parent experiment folder. - // Since spectral libraries can be used with multiple documents that may be uploaded across subfolders, + // Upload the source files used to build test_library.blib to the parent experiment folder. + // Since spectral libraries can be used with multiple documents that may be uploaded to different subfolders, // we check all subfolders, as well as the parent experiment folder for library source files. log("Uploading library source files to parent experiment folder - " + folderName); uploadRawFiles(rawSources.stream() From 57db94b154cbb8f8dd0069273f86e782d36a4907 Mon Sep 17 00:00:00 2001 From: vagisha Date: Thu, 13 Feb 2025 12:46:11 -0800 Subject: [PATCH 4/4] Fix typo Co-authored-by: Josh Eckels --- .../proteomexchange/validator/SpecLibValidator.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/panoramapublic/src/org/labkey/panoramapublic/proteomexchange/validator/SpecLibValidator.java b/panoramapublic/src/org/labkey/panoramapublic/proteomexchange/validator/SpecLibValidator.java index 2655b636..4c05eed0 100644 --- a/panoramapublic/src/org/labkey/panoramapublic/proteomexchange/validator/SpecLibValidator.java +++ b/panoramapublic/src/org/labkey/panoramapublic/proteomexchange/validator/SpecLibValidator.java @@ -215,11 +215,11 @@ private void validateLibrarySources(List sources, FileContentServ Set rawFilesDirPaths = new HashSet<>(); for (Container container: containers) { - var rawFiesDirPath = DataValidator.getRawFilesDirPath(container, fcs); + var rawFilesDirPath = DataValidator.getRawFilesDirPath(container, fcs); // We will look in the "RawFiles" directory only if it exists. - if (Files.exists(rawFiesDirPath)) + if (Files.exists(rawFilesDirPath)) { - rawFilesDirPaths.add(rawFiesDirPath); + rawFilesDirPaths.add(rawFilesDirPath); } }