From 8c8b06323a1ad178112086b4e3c95a70dd338dc8 Mon Sep 17 00:00:00 2001 From: Clemens Schmid Date: Sat, 26 Sep 2026 23:06:53 +0200 Subject: [PATCH 1/4] first draft of a feature to count SNPs for modify --- src-executables/Main-trident.hs | 1 + src/Poseidon/CLI/Trident/Modify.hs | 128 ++++++++++++------ .../CLI/Trident/OptparseApplicativeParsers.hs | 6 + .../GoldenTestsRunCommands.hs | 4 + 4 files changed, 101 insertions(+), 38 deletions(-) diff --git a/src-executables/Main-trident.hs b/src-executables/Main-trident.hs index 27fc70d6..6e4015a4 100644 --- a/src-executables/Main-trident.hs +++ b/src-executables/Main-trident.hs @@ -262,6 +262,7 @@ modifyOptParser = ModifyOptions <$> parseBasePaths <*> parseChecksumsToRectify <*> parseMaybeContributors <*> parseJannoRemoveEmptyCols + <*> parseUpdateNrSNPs <*> parseOnlyLatest <*> parseForce diff --git a/src/Poseidon/CLI/Trident/Modify.hs b/src/Poseidon/CLI/Trident/Modify.hs index 93fa42fb..3ff51073 100644 --- a/src/Poseidon/CLI/Trident/Modify.hs +++ b/src/Poseidon/CLI/Trident/Modify.hs @@ -5,36 +5,51 @@ module Poseidon.CLI.Trident.Modify ( updateChecksums, addContributors, completeAndWritePackage ) where -import Poseidon.Core.Contributor (ContributorSpec (..)) -import Poseidon.Core.EntityTypes (HasNameAndVersion (..), - PacNameAndVersion (..), - renderNameWithVersion) -import Poseidon.Core.GenotypeData (GenotypeDataSpec (..), - GenotypeFileSpec (..)) -import Poseidon.Core.Janno (makeJannoHeader, - writeJannoFileWithoutEmptyCols) -import Poseidon.Core.Package (PackageReadOptions (..), - PoseidonPackage (..), - defaultPackageReadOptions, - readPoseidonPackageCollection, - writePoseidonPackage) -import Poseidon.Core.PoseidonVersion (PoseidonVersion (..)) -import Poseidon.Core.Utils (PoseidonIO, getChk, logDebug, - logError, logInfo, logWarning) -import Poseidon.Core.Version (VersionComponent (..), - updateThreeComponentVersion) +import Poseidon.Core.Contributor (ContributorSpec (..)) +import Poseidon.Core.EntityTypes (HasNameAndVersion (..), + PacNameAndVersion (..), + renderNameWithVersion) +import Poseidon.Core.GenotypeData (GenotypeDataSpec (..), + GenotypeFileSpec (..), + loadIndividuals, + printSNPCopyProgress) +import Poseidon.Core.Janno (JannoRow (..), JannoRows (..), + makeJannoHeader, + writeJannoFile, + writeJannoFileWithoutEmptyCols) +import Poseidon.Core.Package (PackageReadOptions (..), + PoseidonException (..), + PoseidonPackage (..), + defaultPackageReadOptions, + getJointGenotypeData, + readPoseidonPackageCollection, + writePoseidonPackage) +import Poseidon.Core.PoseidonVersion (PoseidonVersion (..)) +import Poseidon.Core.Utils (PoseidonIO, envErrorLength, + envLogAction, getChk, logDebug, + logError, logInfo, logWarning) +import Poseidon.Core.Version (VersionComponent (..), + updateThreeComponentVersion) -import Control.DeepSeq ((<$!!>)) -import Control.Monad (when) -import Control.Monad.IO.Class (MonadIO, liftIO) -import Data.List (nub) -import Data.Maybe (fromJust) -import Data.Time (UTCTime (..), getCurrentTime) -import Data.Version (Version (..), makeVersion, - showVersion) -import System.Directory (doesFileExist, removeFile) -import System.Exit (exitFailure) -import System.FilePath (()) +import Control.DeepSeq ((<$!!>)) +import Control.Exception (catch, throwIO) +import Control.Monad (when) +import Control.Monad.IO.Class (MonadIO, liftIO) +import Data.List (nub) +import Data.Maybe (fromJust) +import Data.Time (UTCTime (..), getCurrentTime) +import qualified Data.Vector.Unboxed as VU +import qualified Data.Vector.Unboxed.Mutable as VUM +import Data.Version (Version (..), makeVersion, + showVersion) +import Pipes ((>->)) +import qualified Pipes.Prelude as P +import Pipes.Safe (runSafeT) +import Poseidon.CLI.Trident.Forge (sumNonMissingSNPs) +import Poseidon.Core.ColumnTypesJanno (JannoNrSNPs (..)) +import System.Directory (doesFileExist, removeFile) +import System.Exit (exitFailure) +import System.FilePath (()) data ModifyOptions = ModifyOptions { _modifyBaseDirs :: [FilePath] @@ -44,6 +59,7 @@ data ModifyOptions = ModifyOptions , _modifyChecksums :: ChecksumsToModify , _modifyNewContributors :: Maybe [ContributorSpec] , _modifyJannoRemoveEmptyCols :: Bool + , _modifyUpdateNrSNPs :: Bool , _modifyOnlyLatest :: Bool , _modifyForce :: Bool } @@ -68,6 +84,7 @@ runModify (ModifyOptions baseDirs ignorePosVer newPosVer pacVerUpdate checksumUpdate newContributors jannoRemoveEmptyCols + updateNrSNPs onlyLatest force ) = do let pacReadOpts = defaultPackageReadOptions { @@ -100,21 +117,56 @@ runModify (ModifyOptions modifyOnePackage :: PoseidonPackage -> PoseidonIO () modifyOnePackage inPac = do logInfo $ "Modifying package: " ++ renderNameWithVersion inPac - when jannoRemoveEmptyCols $ do + -- counting SNPs for .janno column Nr_SNPs + let inJannoRows = getJannoRows $ posPacJanno inPac + updatedJanno <- if updateNrSNPs + then do + nrSNPs <- countSNPs inPac + nrSNPsFrozen <- liftIO $ VU.freeze nrSNPs + let updatedRows = zipWith + (\x y -> x {jNrSNPs = Just (JannoNrSNPs y)}) + inJannoRows (VU.toList nrSNPsFrozen) + return $ JannoRows updatedRows + else return $ JannoRows inJannoRows + when (updateNrSNPs || jannoRemoveEmptyCols) $ case posPacJannoFile inPac of - Nothing -> do - logWarning "No .janno file to modify with --jannoRemoveEmpty" - Just jannoPath -> do - logInfo "Reordering and removing empty columns from .janno file" - liftIO $ writeJannoFileWithoutEmptyCols - (posPacBaseDir inPac jannoPath) - (makeJannoHeader (posPacJanno inPac)) - (posPacJanno inPac) + Nothing -> logError "No .janno file to modify" + Just jannoPath -> do + logInfo "Writing .janno file" + if jannoRemoveEmptyCols + then do + logInfo "Reordering and removing empty .janno columns" + liftIO $ writeJannoFileWithoutEmptyCols + (posPacBaseDir inPac jannoPath) + (makeJannoHeader updatedJanno) + updatedJanno + else do + liftIO $ writeJannoFile + (posPacBaseDir inPac jannoPath) + (makeJannoHeader updatedJanno) + updatedJanno updatedPacPosVer <- updatePoseidonVersion newPosVer inPac updatedPacContri <- addContributors newContributors updatedPacPosVer updatedPacChecksums <- updateChecksums checksumUpdate updatedPacContri completeAndWritePackage pacVerUpdate updatedPacChecksums +countSNPs :: PoseidonPackage -> PoseidonIO (VUM.IOVector Int) +countSNPs pac = do + logInfo "Counting SNPs..." + inds <- loadIndividuals (posPacBaseDir pac) (posPacGenotypeData pac) + logA <- envLogAction + currentTime <- liftIO getCurrentTime + errLength <- envErrorLength + newNrSNPs <- liftIO $ catch ( + runSafeT $ do + eigenstratProd <- getJointGenotypeData logA False False False [pac] Nothing + let forgePipe = eigenstratProd >-> printSNPCopyProgress logA currentTime + let startAcc = liftIO $ VUM.replicate (length inds) 0 + P.foldM sumNonMissingSNPs startAcc return forgePipe + ) (throwIO . PoseidonGenotypeExceptionForward errLength) + logInfo "Done" + return newNrSNPs + updatePoseidonVersion :: Maybe Version -> PoseidonPackage -> PoseidonIO PoseidonPackage updatePoseidonVersion Nothing pac = return pac updatePoseidonVersion (Just ver) pac = do diff --git a/src/Poseidon/CLI/Trident/OptparseApplicativeParsers.hs b/src/Poseidon/CLI/Trident/OptparseApplicativeParsers.hs index 2f28e0f2..855bdc92 100644 --- a/src/Poseidon/CLI/Trident/OptparseApplicativeParsers.hs +++ b/src/Poseidon/CLI/Trident/OptparseApplicativeParsers.hs @@ -251,6 +251,12 @@ readContributorString s = case P.runParser contributorSpecParser () "" s of Left p -> Left (showParsecErr p) Right x -> Right x +parseUpdateNrSNPs :: OP.Parser Bool +parseUpdateNrSNPs = OP.switch ( + OP.long "updateNrSNPs" <> + OP.help "..." + ) + parseJannoRemoveEmptyCols :: OP.Parser Bool parseJannoRemoveEmptyCols = OP.switch ( OP.long "jannoRemoveEmpty" <> diff --git a/test/PoseidonGoldenTests/GoldenTestsRunCommands.hs b/test/PoseidonGoldenTests/GoldenTestsRunCommands.hs index 5405ebba..3a1a8d80 100644 --- a/test/PoseidonGoldenTests/GoldenTestsRunCommands.hs +++ b/test/PoseidonGoldenTests/GoldenTestsRunCommands.hs @@ -697,6 +697,7 @@ testPipelineModify testDir checkFilePath = do , _modifyChecksums = ChecksumNone , _modifyNewContributors = Nothing , _modifyJannoRemoveEmptyCols = False + , _modifyUpdateNrSNPs = False , _modifyOnlyLatest = False , _modifyForce = False } @@ -713,6 +714,7 @@ testPipelineModify testDir checkFilePath = do , _modifyChecksums = ChecksumAll , _modifyNewContributors = Nothing , _modifyJannoRemoveEmptyCols = False + , _modifyUpdateNrSNPs = False , _modifyOnlyLatest = False , _modifyForce = False } @@ -732,6 +734,7 @@ testPipelineModify testDir checkFilePath = do , ContributorSpec "Herbert Testmann" "herbert@testmann.tw" Nothing ] , _modifyJannoRemoveEmptyCols = False + , _modifyUpdateNrSNPs = False , _modifyOnlyLatest = False , _modifyForce = False } @@ -748,6 +751,7 @@ testPipelineModify testDir checkFilePath = do , _modifyChecksums = ChecksumAll , _modifyNewContributors = Nothing , _modifyJannoRemoveEmptyCols = True + , _modifyUpdateNrSNPs = False , _modifyOnlyLatest = False , _modifyForce = False } From 3d27394d1b70a22c0f0afe6dd157111a36daeea0 Mon Sep 17 00:00:00 2001 From: Clemens Schmid Date: Sun, 27 Sep 2026 17:23:26 +0200 Subject: [PATCH 2/4] cli documentation --- src/Poseidon/CLI/Trident/OptparseApplicativeParsers.hs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/Poseidon/CLI/Trident/OptparseApplicativeParsers.hs b/src/Poseidon/CLI/Trident/OptparseApplicativeParsers.hs index 855bdc92..a17f7117 100644 --- a/src/Poseidon/CLI/Trident/OptparseApplicativeParsers.hs +++ b/src/Poseidon/CLI/Trident/OptparseApplicativeParsers.hs @@ -254,14 +254,13 @@ readContributorString s = case P.runParser contributorSpecParser () "" s of parseUpdateNrSNPs :: OP.Parser Bool parseUpdateNrSNPs = OP.switch ( OP.long "updateNrSNPs" <> - OP.help "..." + OP.help "Count the non-missing SNPs per sample and overwrite/fill the Nr_SNPs column in the .janno file." ) parseJannoRemoveEmptyCols :: OP.Parser Bool parseJannoRemoveEmptyCols = OP.switch ( OP.long "jannoRemoveEmpty" <> - OP.help "Reorder the .janno file and remove empty colums. \ - \Remember to pair this option with --checksumJanno to also update the checksum." + OP.help "Reorder the .janno file and remove empty colums." ) parseMaybeLog :: OP.Parser (Maybe String) From 6668c5818d5f1f85e42842eee1944ad6b671a1d7 Mon Sep 17 00:00:00 2001 From: Clemens Schmid Date: Tue, 29 Sep 2026 14:17:30 +0200 Subject: [PATCH 3/4] included _modifyUpdateNrSNPs in the golden tests and shortened the modify golden test code --- .../GoldenTestCheckSumFile.txt | 6 ++-- .../chronicle/Schiffels/POSEIDON.yml | 2 +- .../chronicle/Schiffels/Schiffels.janno | 22 ++++++------ .../init/Schiffels/POSEIDON.yml | 2 +- .../init/Schiffels/Schiffels.janno | 22 ++++++------ .../timetravel/Schiffels-1.1.1/POSEIDON.yml | 2 +- .../Schiffels-1.1.1/Schiffels.janno | 22 ++++++------ .../GoldenTestsRunCommands.hs | 35 ++++--------------- 8 files changed, 46 insertions(+), 67 deletions(-) diff --git a/test/PoseidonGoldenTests/GoldenTestCheckSumFile.txt b/test/PoseidonGoldenTests/GoldenTestCheckSumFile.txt index 209b1c8d..e26cf990 100644 --- a/test/PoseidonGoldenTests/GoldenTestCheckSumFile.txt +++ b/test/PoseidonGoldenTests/GoldenTestCheckSumFile.txt @@ -70,9 +70,9 @@ e234a2511ce81ff2002b670c5d931b94 rectify rectify/Wang_2020/POSEIDON.yml 3bb396e099d5b8771a3409f5fe85d70b modify init/Schiffels/CHANGELOG.md 667074fbd38a002cf44750e92346a118 modify init/Schiffels/POSEIDON.yml 3bb396e099d5b8771a3409f5fe85d70b modify init/Schiffels/CHANGELOG.md -ebf0b456d5e09686ee7131db06848104 modify init/Schiffels/POSEIDON.yml +039b4eccf98334d4295d0eca7de01389 modify init/Schiffels/POSEIDON.yml 3bb396e099d5b8771a3409f5fe85d70b modify init/Schiffels/CHANGELOG.md -083fe7ef4206c979356a3a2454d780b1 modify init/Schiffels/Schiffels.janno +739bfa83c5fc4c6325be34d59078b13a modify init/Schiffels/Schiffels.janno 5b5c20071f3e53346fdfa04f9dbb0223 forge forge/ForgePac1/POSEIDON.yml 1286a2580e4bfbed7d804d5f3fe125f7 forge forge/ForgePac1/ForgePac1.geno 848cf0fab32e4078a88cc17ad8ec3381 forge forge/ForgePac1/ForgePac1.janno @@ -153,7 +153,7 @@ b4f71aff4fbc11594008c3811781cc43 forge forge/ForgePac22/ForgePac22.bib d4a05cfef045648238a94a9d621cf667 chronicle chronicle/chronicle1.yml b43da4d5734371c0648553120f812466 timetravel timetravel/Lamnidis_2018-1.0.0/POSEIDON.yml 8d57ce1a1ab28c0d8a5f391dd790a59c timetravel timetravel/Lamnidis_2018-1.0.1/POSEIDON.yml -ebf0b456d5e09686ee7131db06848104 timetravel timetravel/Schiffels-1.1.1/POSEIDON.yml +039b4eccf98334d4295d0eca7de01389 timetravel timetravel/Schiffels-1.1.1/POSEIDON.yml 1ab24c45ef3a13e0fb34afac7a21dca8 timetravel timetravel/Schmid_2028-1.0.0/POSEIDON.yml 8d57ce1a1ab28c0d8a5f391dd790a59c fetch fetch/by_package/Lamnidis_2018-1.0.1/POSEIDON.yml 1ab24c45ef3a13e0fb34afac7a21dca8 fetch fetch/by_package/Schmid_2028-1.0.0/POSEIDON.yml diff --git a/test/PoseidonGoldenTests/GoldenTestData/chronicle/Schiffels/POSEIDON.yml b/test/PoseidonGoldenTests/GoldenTestData/chronicle/Schiffels/POSEIDON.yml index a184e9eb..3e7faae8 100644 --- a/test/PoseidonGoldenTests/GoldenTestData/chronicle/Schiffels/POSEIDON.yml +++ b/test/PoseidonGoldenTests/GoldenTestData/chronicle/Schiffels/POSEIDON.yml @@ -19,7 +19,7 @@ genotypeData: indFileChkSum: f77dc756666dbfef3bb35191ae15a167 snpSet: Other jannoFile: Schiffels.janno -jannoFileChkSum: 083fe7ef4206c979356a3a2454d780b1 +jannoFileChkSum: 739bfa83c5fc4c6325be34d59078b13a bibFile: Schiffels.bib bibFileChkSum: 9edc4a757f785a8ecb59c54d16c5690a changelogFile: CHANGELOG.md diff --git a/test/PoseidonGoldenTests/GoldenTestData/chronicle/Schiffels/Schiffels.janno b/test/PoseidonGoldenTests/GoldenTestData/chronicle/Schiffels/Schiffels.janno index c80c86ca..54352013 100644 --- a/test/PoseidonGoldenTests/GoldenTestData/chronicle/Schiffels/Schiffels.janno +++ b/test/PoseidonGoldenTests/GoldenTestData/chronicle/Schiffels/Schiffels.janno @@ -1,11 +1,11 @@ -Poseidon_ID Genetic_Sex Group_Name -XXX001 M POP1 -XXX002 F POP2 -XXX003 M POP1 -XXX004 F POP2 -XXX005 M POP2 -XXX006 F POP2 -XXX007 M POP1 -XXX008 F POP3 -XXX009 F POP1 -XXX010 M POP3 +Poseidon_ID Genetic_Sex Group_Name Nr_SNPs +XXX001 M POP1 9 +XXX002 F POP2 9 +XXX003 M POP1 7 +XXX004 F POP2 9 +XXX005 M POP2 7 +XXX006 F POP2 9 +XXX007 M POP1 9 +XXX008 F POP3 9 +XXX009 F POP1 9 +XXX010 M POP3 9 diff --git a/test/PoseidonGoldenTests/GoldenTestData/init/Schiffels/POSEIDON.yml b/test/PoseidonGoldenTests/GoldenTestData/init/Schiffels/POSEIDON.yml index a184e9eb..3e7faae8 100644 --- a/test/PoseidonGoldenTests/GoldenTestData/init/Schiffels/POSEIDON.yml +++ b/test/PoseidonGoldenTests/GoldenTestData/init/Schiffels/POSEIDON.yml @@ -19,7 +19,7 @@ genotypeData: indFileChkSum: f77dc756666dbfef3bb35191ae15a167 snpSet: Other jannoFile: Schiffels.janno -jannoFileChkSum: 083fe7ef4206c979356a3a2454d780b1 +jannoFileChkSum: 739bfa83c5fc4c6325be34d59078b13a bibFile: Schiffels.bib bibFileChkSum: 9edc4a757f785a8ecb59c54d16c5690a changelogFile: CHANGELOG.md diff --git a/test/PoseidonGoldenTests/GoldenTestData/init/Schiffels/Schiffels.janno b/test/PoseidonGoldenTests/GoldenTestData/init/Schiffels/Schiffels.janno index c80c86ca..54352013 100644 --- a/test/PoseidonGoldenTests/GoldenTestData/init/Schiffels/Schiffels.janno +++ b/test/PoseidonGoldenTests/GoldenTestData/init/Schiffels/Schiffels.janno @@ -1,11 +1,11 @@ -Poseidon_ID Genetic_Sex Group_Name -XXX001 M POP1 -XXX002 F POP2 -XXX003 M POP1 -XXX004 F POP2 -XXX005 M POP2 -XXX006 F POP2 -XXX007 M POP1 -XXX008 F POP3 -XXX009 F POP1 -XXX010 M POP3 +Poseidon_ID Genetic_Sex Group_Name Nr_SNPs +XXX001 M POP1 9 +XXX002 F POP2 9 +XXX003 M POP1 7 +XXX004 F POP2 9 +XXX005 M POP2 7 +XXX006 F POP2 9 +XXX007 M POP1 9 +XXX008 F POP3 9 +XXX009 F POP1 9 +XXX010 M POP3 9 diff --git a/test/PoseidonGoldenTests/GoldenTestData/timetravel/Schiffels-1.1.1/POSEIDON.yml b/test/PoseidonGoldenTests/GoldenTestData/timetravel/Schiffels-1.1.1/POSEIDON.yml index a184e9eb..3e7faae8 100644 --- a/test/PoseidonGoldenTests/GoldenTestData/timetravel/Schiffels-1.1.1/POSEIDON.yml +++ b/test/PoseidonGoldenTests/GoldenTestData/timetravel/Schiffels-1.1.1/POSEIDON.yml @@ -19,7 +19,7 @@ genotypeData: indFileChkSum: f77dc756666dbfef3bb35191ae15a167 snpSet: Other jannoFile: Schiffels.janno -jannoFileChkSum: 083fe7ef4206c979356a3a2454d780b1 +jannoFileChkSum: 739bfa83c5fc4c6325be34d59078b13a bibFile: Schiffels.bib bibFileChkSum: 9edc4a757f785a8ecb59c54d16c5690a changelogFile: CHANGELOG.md diff --git a/test/PoseidonGoldenTests/GoldenTestData/timetravel/Schiffels-1.1.1/Schiffels.janno b/test/PoseidonGoldenTests/GoldenTestData/timetravel/Schiffels-1.1.1/Schiffels.janno index c80c86ca..54352013 100644 --- a/test/PoseidonGoldenTests/GoldenTestData/timetravel/Schiffels-1.1.1/Schiffels.janno +++ b/test/PoseidonGoldenTests/GoldenTestData/timetravel/Schiffels-1.1.1/Schiffels.janno @@ -1,11 +1,11 @@ -Poseidon_ID Genetic_Sex Group_Name -XXX001 M POP1 -XXX002 F POP2 -XXX003 M POP1 -XXX004 F POP2 -XXX005 M POP2 -XXX006 F POP2 -XXX007 M POP1 -XXX008 F POP3 -XXX009 F POP1 -XXX010 M POP3 +Poseidon_ID Genetic_Sex Group_Name Nr_SNPs +XXX001 M POP1 9 +XXX002 F POP2 9 +XXX003 M POP1 7 +XXX004 F POP2 9 +XXX005 M POP2 7 +XXX006 F POP2 9 +XXX007 M POP1 9 +XXX008 F POP3 9 +XXX009 F POP1 9 +XXX010 M POP3 9 diff --git a/test/PoseidonGoldenTests/GoldenTestsRunCommands.hs b/test/PoseidonGoldenTests/GoldenTestsRunCommands.hs index 54c05a6d..c6d6fae6 100644 --- a/test/PoseidonGoldenTests/GoldenTestsRunCommands.hs +++ b/test/PoseidonGoldenTests/GoldenTestsRunCommands.hs @@ -718,54 +718,33 @@ testPipelineModify testDir checkFilePath = do "init" "Schiffels" "POSEIDON.yml" , "init" "Schiffels" "CHANGELOG.md" ] - let modifyOpts2 = ModifyOptions { - _modifyBaseDirs = [testDir "init" "Schiffels"] - , _modifyPoseidonVersion = Just $ makeVersion [2,7,1] - , _modifyIgnorePoseidonVersion = False + let modifyOpts2 = modifyOpts1 { + _modifyPoseidonVersion = Just $ makeVersion [2,7,1] , _modifyPackageVersionUpdate = Just (PackageVersionUpdate Minor (Just "test2")) , _modifyChecksums = ChecksumAll - , _modifyNewContributors = Nothing - , _modifyJannoRemoveEmptyCols = False - , _modifyUpdateNrSNPs = False - , _modifyOnlyLatest = False - , _modifyForce = False } let action2 = testLog (runModify modifyOpts2) >> patchLastModified testDir ("init" "Schiffels" "POSEIDON.yml") runAndChecksumFiles checkFilePath testDir action2 "modify" [ "init" "Schiffels" "POSEIDON.yml" , "init" "Schiffels" "CHANGELOG.md" ] - let modifyOpts3 = ModifyOptions { - _modifyBaseDirs = [testDir "init" "Schiffels"] - , _modifyPoseidonVersion = Nothing - , _modifyIgnorePoseidonVersion = False - , _modifyPackageVersionUpdate = Just (PackageVersionUpdate Patch Nothing) - , _modifyChecksums = ChecksumNone + let modifyOpts3 = modifyOpts1 { + _modifyPackageVersionUpdate = Just (PackageVersionUpdate Patch Nothing) , _modifyNewContributors = Just [ ContributorSpec "Josiah Carberry" "carberry@brown.edu" (Just $ ORCID {_orcidNums = "000000021825009", _orcidChecksum = '7'}) , ContributorSpec "Herbert Testmann" "herbert@testmann.tw" Nothing ] - , _modifyJannoRemoveEmptyCols = False - , _modifyUpdateNrSNPs = False - , _modifyOnlyLatest = False - , _modifyForce = False } let action3 = testLog (runModify modifyOpts3) >> patchLastModified testDir ("init" "Schiffels" "POSEIDON.yml") runAndChecksumFiles checkFilePath testDir action3 "modify" [ "init" "Schiffels" "POSEIDON.yml" , "init" "Schiffels" "CHANGELOG.md" ] - let modifyOpts4 = ModifyOptions { - _modifyBaseDirs = [testDir "init" "Schiffels"] - , _modifyPoseidonVersion = Nothing - , _modifyIgnorePoseidonVersion = False - , _modifyPackageVersionUpdate = Nothing + let modifyOpts4 = modifyOpts1 { + _modifyPackageVersionUpdate = Nothing , _modifyChecksums = ChecksumAll - , _modifyNewContributors = Nothing , _modifyJannoRemoveEmptyCols = True - , _modifyUpdateNrSNPs = False - , _modifyOnlyLatest = False - , _modifyForce = False + , _modifyUpdateNrSNPs = True } let action4 = testLog (runModify modifyOpts4) >> patchLastModified testDir ("init" "Schiffels" "POSEIDON.yml") runAndChecksumFiles checkFilePath testDir action4 "modify" [ From 68b58a53324ff26d7e19a9399b73ee60acedbf5b Mon Sep 17 00:00:00 2001 From: Clemens Schmid Date: Tue, 29 Sep 2026 14:19:11 +0200 Subject: [PATCH 4/4] changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index cf4b13d5..89952d69 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,6 @@ - V 2.3.0.0: - Split the functionality of `rectify` into a new subcommand `modify` that exactly mirrors the former `rectify`, and a new `rectify` that just adds and adjusts checksums and increments version numbers to make recently changed package pass validation again. + - Added an option `--updateNrSNPs` to `modify` to count the number of non-missing SNPs and add the count to the respective .janno column. - V 2.2.2.2: - Switched to newer version of sequence-formats, improving genotype data parsing error messages. - Changed "PoseidonID" to the correct "Poseidon_ID" in an error message and on the server website.