tbtools-cli 1.2.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (139) hide show
  1. tbtools_cli/__init__.py +18 -0
  2. tbtools_cli/auto_commands.py +1149 -0
  3. tbtools_cli/cli.py +528 -0
  4. tbtools_cli/cli_load.py +352 -0
  5. tbtools_cli/cli_rpc.py +303 -0
  6. tbtools_cli/cli_tools_registry.py +93 -0
  7. tbtools_cli/cli_top.py +1160 -0
  8. tbtools_cli/command_metadata.json +4606 -0
  9. tbtools_cli/command_spec.py +382 -0
  10. tbtools_cli/config.example.toml +19 -0
  11. tbtools_cli/config.py +43 -0
  12. tbtools_cli/core.py +508 -0
  13. tbtools_cli/errors.py +38 -0
  14. tbtools_cli/presets.py +100 -0
  15. tbtools_cli/scenarios.py +92 -0
  16. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/AdmixtureCli.java +91 -0
  17. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/AmazingMetaCli.java +78 -0
  18. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/AssemblyRecommandCli.java +47 -0
  19. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/BamIndexCli.java +31 -0
  20. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/BamSortCli.java +43 -0
  21. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/BamStateCli.java +49 -0
  22. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/BarPlotterCli.java +18 -0
  23. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/BarplotCli.java +168 -0
  24. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/BatchVizMotifsCli.java +47 -0
  25. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/BlastXmlConvertCli.java +45 -0
  26. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/BlatExecutorCli.java +66 -0
  27. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/CalcRepeatCli.java +62 -0
  28. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/CalculateSimilarityCli.java +34 -0
  29. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/CddMotifCli.java +46 -0
  30. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/CircleGeneViewerCli.java +81 -0
  31. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/CircosCli.java +76 -0
  32. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/ColorSchemeCli.java +29 -0
  33. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/CtgGroupCli.java +29 -0
  34. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/CubeHeatmapCli.java +70 -0
  35. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/DeHistCli.java +46 -0
  36. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/DegramdomCli.java +33 -0
  37. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/DiffExpCli.java +44 -0
  38. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/DistanceCli.java +53 -0
  39. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/DualSynCli.java +147 -0
  40. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/EggnogCli.java +39 -0
  41. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/ExprCorrCli.java +27 -0
  42. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/FastaMergerCli.java +36 -0
  43. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/FastaTableConvertCli.java +38 -0
  44. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/FileCleanerCli.java +31 -0
  45. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/FileSplitCli.java +15 -0
  46. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/FindBlockDualCli.java +71 -0
  47. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/FindBlockMultipleCli.java +67 -0
  48. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/FindPathCli.java +15 -0
  49. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/GSEAWrapperCli.java +33 -0
  50. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/GenBank2FastaCli.java +32 -0
  51. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/GeneDensityCli.java +38 -0
  52. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/GeneLocGffCli.java +140 -0
  53. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/GeneStructureCli.java +90 -0
  54. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/GenericCli.java +177 -0
  55. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/GetENALinksCli.java +36 -0
  56. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/GetSubNewickTreeCli.java +50 -0
  57. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/GoEnrichCli.java +42 -0
  58. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/GoLevelCli.java +59 -0
  59. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/GroupedBarCli.java +95 -0
  60. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/GsaDiagCli.java +45 -0
  61. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/GxfFilterCli.java +39 -0
  62. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/GxfSortCli.java +23 -0
  63. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/HclustCli.java +43 -0
  64. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/HeatmapCli.java +89 -0
  65. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/HmmerSuiteCli.java +47 -0
  66. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/JgblocksCli.java +65 -0
  67. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/KeggEnrichCli.java +31 -0
  68. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/LayoutHeatmapCli.java +90 -0
  69. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/MCScanXCli.java +80 -0
  70. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/MCScanXFastCli.java +41 -0
  71. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/MSACli.java +46 -0
  72. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/MakeMotifCli.java +39 -0
  73. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/MarkerDesignCli.java +62 -0
  74. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/MarkerToolsCli.java +57 -0
  75. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/Mast2TabCli.java +27 -0
  76. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/MastCli.java +54 -0
  77. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/MastRunCli.java +39 -0
  78. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/Meme2TabCli.java +26 -0
  79. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/MemeCli.java +74 -0
  80. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/MemeRunCli.java +40 -0
  81. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/MgGxfCli.java +35 -0
  82. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/MicroSynCli.java +118 -0
  83. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/MirIdentifyCli.java +55 -0
  84. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/MotifCli.java +75 -0
  85. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/MotifPatternCli.java +67 -0
  86. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/MotifShiftCli.java +30 -0
  87. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/MountainPlotCli.java +44 -0
  88. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/MultiSuperHeatCli.java +64 -0
  89. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/NeedlemanWunschCli.java +76 -0
  90. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/PafGC.java +15 -0
  91. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/PafVizCli.java +67 -0
  92. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/PeakDistCli.java +58 -0
  93. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/Pep2CodonCli.java +26 -0
  94. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/PfamMotifCli.java +43 -0
  95. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/PhyloTreeCli.java +92 -0
  96. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/PileUpCli.java +55 -0
  97. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/PlantCAREResultClassifyCli.java +36 -0
  98. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/PubmedSearchCli.java +25 -0
  99. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/QpcrCli.java +69 -0
  100. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/QpcrDdctCli.java +28 -0
  101. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/QpcrProcCli.java +28 -0
  102. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/QuickGenomeDotCli.java +66 -0
  103. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/QuickProteinAnnoCli.java +34 -0
  104. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/QuickRunIQtreeCli.java +69 -0
  105. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/QuickTrimALCli.java +67 -0
  106. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/RNAplotCli.java +129 -0
  107. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/RegionBedToGFF3Cli.java +43 -0
  108. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/RegionDepthCli.java +29 -0
  109. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/SamBamCovCli.java +33 -0
  110. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/SeqConverterCli.java +17 -0
  111. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/SeqLenTrackCli.java +41 -0
  112. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/SeveralSpeciesCli.java +132 -0
  113. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/SimpleEnricherCli.java +44 -0
  114. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/SimpleHmmscanCli.java +32 -0
  115. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/SixFrameTranlaterCli.java +35 -0
  116. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/StructAnnoCompareCli.java +66 -0
  117. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/SubmitSMARTCli.java +30 -0
  118. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/SuperCircosCli.java +330 -0
  119. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/TableColManipCli.java +56 -0
  120. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/TableCollapseCli.java +33 -0
  121. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/TargetScoreCli.java +47 -0
  122. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/TauCalcCli.java +28 -0
  123. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/TaxonomyBatchCli.java +72 -0
  124. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/TreeCli.java +75 -0
  125. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/TreeRootingCli.java +30 -0
  126. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/TrimMSACli.java +33 -0
  127. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/UnrootedTreeCli.java +44 -0
  128. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/UpSetCli.java +90 -0
  129. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/Venn5Cli.java +60 -0
  130. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/Venn6Cli.java +65 -0
  131. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/ViolinCli.java +66 -0
  132. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/VisualizeCli.java +57 -0
  133. tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/VizGFACli.java +39 -0
  134. tbtools_cli-1.2.0.dist-info/METADATA +504 -0
  135. tbtools_cli-1.2.0.dist-info/RECORD +139 -0
  136. tbtools_cli-1.2.0.dist-info/WHEEL +5 -0
  137. tbtools_cli-1.2.0.dist-info/entry_points.txt +2 -0
  138. tbtools_cli-1.2.0.dist-info/licenses/LICENSE +21 -0
  139. tbtools_cli-1.2.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,41 @@
1
+ /**
2
+ * tbplot mcscanxd — OneStep MCScanX-SuperFast CLI(插件 P00370 CLI 化)
3
+ *
4
+ * 用法: MCScanXFastCli <wkDir> <genome1.fa> <genome2.fa> <gxf1> <gxf2> [threads] [blastHits] [evalue]
5
+ * wkDir: 工作目录(中间文件+结果,须可写)
6
+ * genome1/2: 两个物种的蛋白 FASTA(diamond 比对)
7
+ * gxf1/2: 对应 GXF 注释(GFF/GTF)
8
+ * threads: 线程(默认 4);blastHits: 每基因 hits(默认 5);evalue: 阈值(默认 1e-5)
9
+ *
10
+ * 引擎: OneStepMCSCanXDiamond.OneStepMCScanXSuperFast(插件 jar),
11
+ * diamond 二进制 plugins/lib/bin/diamond(Linux 随包)。
12
+ */
13
+ public class MCScanXFastCli {
14
+ public static void main(String[] args) throws Exception {
15
+ if (args.length < 5) {
16
+ System.err.println("用法: MCScanXFastCli <wkDir> <genome1.fa> <genome2.fa> <gxf1> <gxf2> [threads] [blastHits] [evalue]");
17
+ System.exit(1);
18
+ }
19
+ int threads = args.length > 5 ? Integer.parseInt(args[5]) : 4;
20
+ int hits = args.length > 6 ? Integer.parseInt(args[6]) : 5;
21
+ double evalue = args.length > 7 ? Double.parseDouble(args[7]) : 1e-5;
22
+ java.io.File wk = new java.io.File(args[0]);
23
+ if (!wk.isDirectory() && !wk.mkdirs()) {
24
+ System.err.println("❌ 无法创建工作目录: " + args[0]);
25
+ System.exit(1);
26
+ }
27
+ Object w = Class.forName("OneStepMCSCanXDiamond.OneStepMCScanXSuperFast").getDeclaredConstructor().newInstance();
28
+ Class<?> c = w.getClass();
29
+ c.getMethod("setWkDirectory", java.io.File.class).invoke(w, wk);
30
+ c.getMethod("setInGenome_1", java.io.File.class).invoke(w, new java.io.File(args[1]));
31
+ c.getMethod("setInGenome_2", java.io.File.class).invoke(w, new java.io.File(args[2]));
32
+ c.getMethod("setInGxf_1", java.io.File.class).invoke(w, new java.io.File(args[3]));
33
+ c.getMethod("setInGxf_2", java.io.File.class).invoke(w, new java.io.File(args[4]));
34
+ c.getMethod("setNumberOfThread", int.class).invoke(w, threads);
35
+ c.getMethod("setNumberOfBlastHit", int.class).invoke(w, hits);
36
+ c.getMethod("setEvalue", double.class).invoke(w, evalue);
37
+ c.getMethod("process").invoke(w);
38
+ System.err.println("[tbplot] MCScanX-SuperFast 完成: " + args[0]);
39
+ System.exit(0);
40
+ }
41
+ }
@@ -0,0 +1,46 @@
1
+ import biocjava.bioDoer.JIGplotToolkit.MSA.MSAviewer;
2
+ import jigplot.engine.JIGBasePanel;
3
+ import jigplot.engine.JIGSubPanel;
4
+
5
+ import java.io.File;
6
+ import java.util.ArrayList;
7
+
8
+ /**
9
+ * tbplot msa — TBtools MSA 序列比对图 CLI(08/29 重建,替代损坏的恢复件)
10
+ *
11
+ * 用法: MSACli <aligned.fasta> <out> [padding]
12
+ * 尺寸按子面板自动计算,勿传 w/h(NPE 根因=缺 setInMSAtextFile)
13
+ *
14
+ * 引擎: MSAviewer.setInMSAtextFile + processed() 返回 panel 列表
15
+ * (PIN 14 序列验证 SVG 4.1MB;长序列建议 PNG,08/28)
16
+ */
17
+ public class MSACli {
18
+ public static void main(String[] args) throws Exception {
19
+ if (args.length < 2) {
20
+ System.err.println("用法: MSACli <aligned.fasta> <out> [padding]");
21
+ System.exit(1);
22
+ }
23
+ String inFasta = args[0];
24
+ String outFile = args[1];
25
+
26
+ MSAviewer viewer = new MSAviewer();
27
+ viewer.setInMSAtextFile(new File(inFasta));
28
+ ArrayList<JIGSubPanel> panels = viewer.processed();
29
+ System.err.println("[tbplot] processed() 完成, subpanels=" + panels.size());
30
+ if (panels == null || panels.isEmpty()) {
31
+ System.err.println("错误: 没有生成面板");
32
+ System.exit(1);
33
+ }
34
+
35
+ // 尺寸按最后 subpanel 反推(勿传固定 w/h)
36
+ JIGSubPanel last = panels.get(panels.size() - 1);
37
+ JIGBasePanel base = new JIGBasePanel(1000, 800);
38
+ for (JIGSubPanel p : panels) base.addSubPanel(p);
39
+ String low = outFile.toLowerCase();
40
+ if (low.endsWith(".png")) base.save2PNG(new File(outFile));
41
+ else if (low.endsWith(".pdf")) base.save2PDF(new File(outFile));
42
+ else base.save2SVG(new File(outFile));
43
+ System.err.println("[tbplot] 已保存: " + outFile);
44
+ System.exit(0);
45
+ }
46
+ }
@@ -0,0 +1,39 @@
1
+ /**
2
+ * tbplot makemotif — 从序列生成 MEME motif 文件 CLI(GUI 面板逆向接口,09/20)
3
+ *
4
+ * 用法: MakeMotifCli <in.seqs.txt> <out.meme> [--mol DNA|RNA|Protein]
5
+ *
6
+ * 接口来源:反编译 MakeMotifGUIPanel(GUI 真实调用链):
7
+ * GenerateMotifFromSequences gmfs = new GenerateMotifFromSequences();
8
+ * gmfs.setInSeqLines(File); gmfs.setOutMotifMatrix(File);
9
+ * gmfs.setMoleculeType(MotifMolType); gmfs.process();
10
+ * 输入:每行一条待对齐的等长序列(GUI 粘贴框逐行 = 等长片段);
11
+ * 输出:MEME 格式 letter-probability matrix motif 文件(可直接喂 fimo/mast)。
12
+ */
13
+ public class MakeMotifCli {
14
+ public static void main(String[] args) throws Exception {
15
+ String mol = "DNA";
16
+ java.util.ArrayList<String> pos = new java.util.ArrayList<String>();
17
+ for (int i = 0; i < args.length; i++) {
18
+ if (args[i].equals("--mol") && i+1 < args.length) mol = args[++i];
19
+ else pos.add(args[i]);
20
+ }
21
+ if (pos.size() < 2) {
22
+ System.err.println("用法: MakeMotifCli <in.seqs.txt> <out.meme> [--mol DNA|RNA|Protein]");
23
+ System.exit(1);
24
+ }
25
+ Object gmfs = Class.forName("biocjava.bioIO.BioSoftPipeServer.MEMEsuiteWrapper.GenerateMotifFromSequences")
26
+ .getDeclaredConstructor().newInstance();
27
+ Class<?> c = gmfs.getClass();
28
+ c.getMethod("setInSeqLines", java.io.File.class).invoke(gmfs, new java.io.File(pos.get(0)));
29
+ c.getMethod("setOutMotifMatrix", java.io.File.class).invoke(gmfs, new java.io.File(pos.get(1)));
30
+ Class<?> mm = Class.forName("biocjava.bioIO.BioSoftPipeServer.MEMEsuiteWrapper.GenerateMotifFromSequences$MotifMolType");
31
+ Object mt = mol.equalsIgnoreCase("RNA") ? Enum.valueOf((Class)mm, "RNA")
32
+ : mol.equalsIgnoreCase("Protein") ? Enum.valueOf((Class)mm, "Protein")
33
+ : Enum.valueOf((Class)mm, "DNA");
34
+ c.getMethod("setMoleculeType", mm).invoke(gmfs, mt);
35
+ c.getMethod("process").invoke(gmfs);
36
+ System.err.println("[tbplot] 已保存: " + pos.get(1));
37
+ System.exit(0);
38
+ }
39
+ }
@@ -0,0 +1,62 @@
1
+ import java.io.File;
2
+ import java.io.PrintStream;
3
+ import java.io.ByteArrayOutputStream;
4
+ import java.lang.reflect.Method;
5
+
6
+ /**
7
+ * tbplot marker — TBtools 标记设计工具 CLI(08/29,第 46-48 引擎)
8
+ *
9
+ * 用法: MarkerDesignCli <engineClass> <inMarker> <out.txt> [--maxPoint N]
10
+ * engineClass: MarkerDist|MarkerFilter|SampleDist(biocjava.bioDoer.markerDesign 下)
11
+ * inMarker: 标记 0-1 矩阵(tab 分隔)
12
+ * --maxPoint: MarkerDist 专用(最大点数)
13
+ *
14
+ * ⚠️ 引擎输出模式差异(08/29 反编译确认,统一兼容):
15
+ * - MarkerDist: process() 返回结果字符串(result 非空)→ 直接写文件
16
+ * - MarkerFilter: process() 返回 null,结果走 System.err.println
17
+ * - SampleDist: process() 返回 "",结果走 System.err.println
18
+ * 桥在 process() 期间重定向 System.err 到缓冲,若返回字符串为空则把捕获的 stderr 写入文件。
19
+ */
20
+ public class MarkerDesignCli {
21
+ public static void main(String[] args) throws Exception {
22
+ if (args.length < 3) {
23
+ System.err.println("用法: MarkerDesignCli <MarkerDist|MarkerFilter|SampleDist> <inMarker> <out.txt> [--maxPoint N]");
24
+ System.exit(1);
25
+ }
26
+ String engine = args[0];
27
+ String inMarker = args[1];
28
+ String out = args[2];
29
+ String clsName = "biocjava.bioDoer.markerDesign." + engine;
30
+ int maxPoint = -1;
31
+ for (int i = 3; i < args.length; i++) {
32
+ if (args[i].equals("--maxPoint") && i+1 < args.length) maxPoint = Integer.parseInt(args[++i]);
33
+ }
34
+ Object obj = Class.forName(clsName).getDeclaredConstructor().newInstance();
35
+ obj.getClass().getMethod("setInMarker", File.class).invoke(obj, new File(inMarker));
36
+ if (maxPoint >= 0) {
37
+ try { obj.getClass().getMethod("setMaxPoint", int.class).invoke(obj, maxPoint); }
38
+ catch (NoSuchMethodException e) { /* engine doesn't have setMaxPoint */ }
39
+ }
40
+ Method process = obj.getClass().getMethod("process");
41
+
42
+ // 重定向 System.err 捕获引擎结果输出
43
+ PrintStream origErr = System.err;
44
+ ByteArrayOutputStream buf = new ByteArrayOutputStream();
45
+ PrintStream capture = new PrintStream(buf, true);
46
+ String result;
47
+ try {
48
+ System.setErr(capture);
49
+ result = (String) process.invoke(obj);
50
+ } finally {
51
+ System.setErr(origErr);
52
+ capture.flush();
53
+ }
54
+ // 返回字符串为空 → 用捕获的 stderr 内容
55
+ String content = (result == null || result.trim().isEmpty()) ? buf.toString() : result;
56
+ java.io.FileWriter fw = new java.io.FileWriter(out);
57
+ fw.write(content == null ? "" : content);
58
+ fw.close();
59
+ System.err.println("[tbplot] 已保存: " + out);
60
+ System.exit(0);
61
+ }
62
+ }
@@ -0,0 +1,57 @@
1
+ import biocjava.bioDoer.markerDesign.MarkerDist;
2
+ import biocjava.bioDoer.markerDesign.MarkerFilter;
3
+ import biocjava.bioDoer.markerDesign.SampleDist;
4
+
5
+ import java.io.File;
6
+
7
+ /**
8
+ * tbcli markertools — 分子标记分析 CLI(08/31 第七十七波)
9
+ *
10
+ * 用法:
11
+ * MarkerToolsCli filter <in.marker.tab> # 标记过滤(minor allele 统计,输出 stderr)
12
+ * MarkerToolsCli dist <in.marker.tab> <maxPoint> # 标记距离计算
13
+ * MarkerToolsCli sampledist <in.marker.tab> # 样本距离计算
14
+ *
15
+ * in.marker.tab: 0/1 标记矩阵,行=样本/个体,列=标记,首行列名+首列行名
16
+ *
17
+ * 引擎: MarkerFilter/MarkerDist/SampleDist 的 setInMarker + process()(main 均硬编码演示)
18
+ */
19
+ public class MarkerToolsCli {
20
+ public static void main(String[] args) throws Exception {
21
+ if (args.length < 2) {
22
+ System.err.println("用法: MarkerToolsCli <filter|dist|sampledist> <in.marker.tab> [maxPoint]");
23
+ System.exit(1);
24
+ }
25
+ String mode = args[0];
26
+ File inFile = new File(args[1]);
27
+ if (!inFile.exists()) {
28
+ System.err.println("错误: 文件不存在: " + args[1]);
29
+ System.exit(1);
30
+ }
31
+ switch (mode) {
32
+ case "filter": {
33
+ MarkerFilter mf = new MarkerFilter();
34
+ mf.setInMarker(inFile);
35
+ mf.process();
36
+ break;
37
+ }
38
+ case "dist": {
39
+ MarkerDist md = new MarkerDist();
40
+ md.setInMarker(inFile);
41
+ if (args.length > 2) md.setMaxPoint(Integer.parseInt(args[2]));
42
+ md.process();
43
+ break;
44
+ }
45
+ case "sampledist": {
46
+ SampleDist sd = new SampleDist();
47
+ sd.setInMarker(inFile);
48
+ sd.process();
49
+ break;
50
+ }
51
+ default:
52
+ System.err.println("未知模式: " + mode + " (支持 filter|dist|sampledist)");
53
+ System.exit(1);
54
+ }
55
+ System.exit(0);
56
+ }
57
+ }
@@ -0,0 +1,27 @@
1
+ import biocjava.bioIO.BioSoftPipeServer.MEMEsuiteWrapper.MEMESuiteXMLtoTab;
2
+
3
+ import java.io.File;
4
+
5
+ /**
6
+ * tbcli mast2tab — MEME/Mast XML → tab CLI(08/31 第八十三波,工具 93)
7
+ *
8
+ * 用法: Mast2TabCli <mast|meme.xml> <out.tab>
9
+ * mast/meme.xml: MEME Suite XML 输出(mast.xml 或 meme.xml)
10
+ * out.tab: 表格化结果
11
+ *
12
+ * 引擎: MEMESuiteXMLtoTab.setInMastXML/setOutTab + process()(main 完全硬编码演示 → setter+process)
13
+ */
14
+ public class Mast2TabCli {
15
+ public static void main(String[] args) throws Exception {
16
+ if (args.length < 2) {
17
+ System.err.println("用法: Mast2TabCli <mast|meme.xml> <out.tab>");
18
+ System.exit(1);
19
+ }
20
+ MEMESuiteXMLtoTab mxt = new MEMESuiteXMLtoTab();
21
+ mxt.setInMastXML(new File(args[0]));
22
+ mxt.setOutTab(new File(args[1]));
23
+ mxt.process();
24
+ System.err.println("[tbplot] 已保存: " + args[1]);
25
+ System.exit(0);
26
+ }
27
+ }
@@ -0,0 +1,54 @@
1
+ /**
2
+ * tbplot mast — MAST motif 搜索 CLI(GUI 面板逆向接口,09/20)
3
+ *
4
+ * 用法: MastCli <sequence.fa> <motifs.meme|meme.xml> <workingDir> [--motif-to-use N] [--max-motif-pvalue 1e-4] [--max-seq-evalue 10] [--extra "..."]
5
+ *
6
+ * 接口来源:反编译 MASTGUIPanel(GUI 真实调用链):
7
+ * QuickRunMAST qrm = new QuickRunMAST();
8
+ * qrm.setSequenceFile/setMotifFile/setWorkingDir/setMaxMotifPvalue/
9
+ * setMaxSequenceEvalue/setMotifToUse;
10
+ * qrm.process(); // 内部 `mast <seq> -d <motifs> -ev <p> -mev <e> [--motif N]`
11
+ *
12
+ * 依赖系统 mast 二进制(meme-suite);产物 mast.txt/mast.xml 在 workingDir。
13
+ * MEME 管线闭环:meme(发现) → fimo(扫描) / mast(搜索) → memeViz(可视化)。
14
+ */
15
+ public class MastCli {
16
+ public static void main(String[] args) throws Exception {
17
+ String motifToUse = "";
18
+ double maxMotifP = 1e-4, maxSeqE = 10.0;
19
+ String extra = "";
20
+ java.util.ArrayList<String> pos = new java.util.ArrayList<String>();
21
+ for (int i = 0; i < args.length; i++) {
22
+ if (args[i].equals("--motif-to-use") && i+1 < args.length) motifToUse = args[++i];
23
+ else if (args[i].equals("--max-motif-pvalue") && i+1 < args.length) maxMotifP = Double.parseDouble(args[++i]);
24
+ else if (args[i].equals("--max-seq-evalue") && i+1 < args.length) maxSeqE = Double.parseDouble(args[++i]);
25
+ else if (args[i].equals("--extra") && i+1 < args.length) extra = args[++i];
26
+ else pos.add(args[i]);
27
+ }
28
+ if (pos.size() < 3) {
29
+ System.err.println("用法: MastCli <sequence.fa> <motifs.meme|meme.xml> <workingDir> [--motif-to-use N] [--max-motif-pvalue 1e-4] [--max-seq-evalue 10]");
30
+ System.exit(1);
31
+ }
32
+ java.io.File wd = new java.io.File(pos.get(2));
33
+ if (!wd.isDirectory() && !wd.mkdirs()) {
34
+ System.err.println("❌ 无法创建 workingDir: " + pos.get(2));
35
+ System.exit(1);
36
+ }
37
+ Object qrm = Class.forName("biocjava.bioIO.BioSoftPipeServer.MEMEsuiteWrapper.QuickRunMAST")
38
+ .getDeclaredConstructor().newInstance();
39
+ Class<?> c = qrm.getClass();
40
+ c.getMethod("setSequenceFile", java.io.File.class).invoke(qrm, new java.io.File(pos.get(0)));
41
+ c.getMethod("setMotifFile", java.io.File.class).invoke(qrm, new java.io.File(pos.get(1)));
42
+ c.getMethod("setWorkingDir", java.io.File.class).invoke(qrm, wd);
43
+ c.getMethod("setMaxMotifPvalue", double.class).invoke(qrm, maxMotifP);
44
+ c.getMethod("setMaxSequenceEvalue", double.class).invoke(qrm, maxSeqE);
45
+ if (!motifToUse.isEmpty()) c.getMethod("setMotifToUse", String.class).invoke(qrm, motifToUse);
46
+ if (!extra.isEmpty()) {
47
+ try { c.getMethod("setOtherParas", String.class).invoke(qrm, extra); }
48
+ catch (Exception ignore) {}
49
+ }
50
+ c.getMethod("process").invoke(qrm);
51
+ System.err.println("[tbplot] MAST 完成,结果在: " + wd.getAbsolutePath());
52
+ System.exit(0);
53
+ }
54
+ }
@@ -0,0 +1,39 @@
1
+ import biocjava.bioIO.BioSoftPipeServer.MEMEsuiteWrapper.QuickRunMAST;
2
+
3
+ import java.io.File;
4
+
5
+ /**
6
+ * tbcli mastrun — 一步法 MAST motif 扫描 CLI(08/31 第八十九波,工具 101)
7
+ *
8
+ * 用法: MastRunCli <meme.xml> <seq.fasta> <workingDir> [--motifs M] [--seqEvalue X] [--motifPvalue X] [--other "..."]
9
+ * meme.xml: MEME 输出(motif 定义)
10
+ * seq.fasta: 待扫描序列
11
+ * workingDir: 输出目录
12
+ *
13
+ * 引擎: QuickRunMAST.setMotifFile/setSequenceFile/setWorkingDir/... + process()
14
+ * (调系统 mast;与 memerun 配套——memerun 发现 motif → mastrun 扫描)
15
+ */
16
+ public class MastRunCli {
17
+ public static void main(String[] args) throws Exception {
18
+ if (args.length < 3) {
19
+ System.err.println("用法: MastRunCli <meme.xml> <seq.fasta> <workingDir> [--motifs M] [--seqEvalue X] [--motifPvalue X] [--other \"...\"]");
20
+ System.exit(1);
21
+ }
22
+ QuickRunMAST qrm = new QuickRunMAST();
23
+ qrm.setMotifFile(new File(args[0]));
24
+ qrm.setSequenceFile(new File(args[1]));
25
+ qrm.setWorkingDir(new File(args[2]));
26
+ for (int i = 3; i < args.length; i++) {
27
+ switch (args[i]) {
28
+ case "--motifs": qrm.setMotifToUse(args[++i]); break;
29
+ case "--seqEvalue": qrm.setMaxSequenceEvalue(Double.parseDouble(args[++i])); break;
30
+ case "--motifPvalue": qrm.setMaxMotifPvalue(Double.parseDouble(args[++i])); break;
31
+ case "--other": qrm.setOtherParas(args[++i]); break;
32
+ default: System.err.println("未知参数: " + args[i]); break;
33
+ }
34
+ }
35
+ qrm.process();
36
+ System.err.println("[tbplot] MAST 完成,输出目录: " + args[2]);
37
+ System.exit(0);
38
+ }
39
+ }
@@ -0,0 +1,26 @@
1
+ /**
2
+ * tbplot meme2tab — MEME/MAST XML → 表格 CLI(GUI 面板逆向接口,09/20)
3
+ *
4
+ * 用法: Meme2TabCli <meme.xml|mast.xml> <out.tab>
5
+ *
6
+ * 接口来源:反编译 MemeOrMastXmlToTabGUIPanel(GUI 真实调用链):
7
+ * MEMESuiteXMLtoTab mxt = new MEMESuiteXMLtoTab();
8
+ * mxt.setInMastXML(inXML); mxt.setOutTab(outTab); mxt.process();
9
+ * 纯逻辑无 GUI。产物:motif 域注释表(序列 × motif 位置/pvalue)。
10
+ */
11
+ public class Meme2TabCli {
12
+ public static void main(String[] args) throws Exception {
13
+ if (args.length < 2) {
14
+ System.err.println("用法: Meme2TabCli <meme.xml|mast.xml> <out.tab>");
15
+ System.exit(1);
16
+ }
17
+ Object mxt = Class.forName("biocjava.bioIO.BioSoftPipeServer.MEMEsuiteWrapper.MEMESuiteXMLtoTab")
18
+ .getDeclaredConstructor().newInstance();
19
+ Class<?> c = mxt.getClass();
20
+ c.getMethod("setInMastXML", java.io.File.class).invoke(mxt, new java.io.File(args[0]));
21
+ c.getMethod("setOutTab", java.io.File.class).invoke(mxt, new java.io.File(args[1]));
22
+ c.getMethod("process").invoke(mxt);
23
+ System.err.println("[tbplot] 已保存: " + args[1]);
24
+ System.exit(0);
25
+ }
26
+ }
@@ -0,0 +1,74 @@
1
+ /**
2
+ * tbplot meme — MEME motif 发现 CLI(GUI 面板逆向接口,09/20)
3
+ *
4
+ * 用法: MemeCli <in.fa> <workingDir> <outMemeXml> [--nmotifs N] [--minw N] [--maxw N]
5
+ * [--evt 0.05] [--mod zoops|oops|anr] [--extra "额外 meme 参数"]
6
+ *
7
+ * 接口来源:反编译 MEMEGUIPanel(GUI 真实调用链):
8
+ * QuickRunMEME qrm = new QuickRunMEME();
9
+ * qrm.setInFile/setWorkingDir/setMaxEvalue/setNumberOfMotif/
10
+ * setMiningMode/setMinMotifWidth/setMaxMotifWidth;
11
+ * qrm.process();
12
+ * 内部执行 `meme <in> -evt E -nmotifs N -minw W -maxw X -mod zoops|oops|anr`
13
+ * (cwd=workingDir,依赖系统 meme 二进制;产物 meme.xml 于 workingDir)
14
+ *
15
+ * 输出:workingDir/meme.xml 复制到 <outMemeXml>。
16
+ */
17
+ public class MemeCli {
18
+ public static void main(String[] args) throws Exception {
19
+ if (args.length < 3) {
20
+ System.err.println("用法: MemeCli <in.fa> <workingDir> <outMemeXml> [--nmotifs N] [--minw N] [--maxw N] [--evt 0.05] [--mod zoops|oops|anr] [--extra \"...\"]");
21
+ System.exit(1);
22
+ }
23
+ int nmotifs = 3, minw = 6, maxw = 50;
24
+ double evt = 0.05;
25
+ String mod = "zoops", extra = "";
26
+ for (int i = 3; i < args.length; i++) {
27
+ if (args[i].equals("--nmotifs") && i+1 < args.length) nmotifs = Integer.parseInt(args[++i]);
28
+ else if (args[i].equals("--minw") && i+1 < args.length) minw = Integer.parseInt(args[++i]);
29
+ else if (args[i].equals("--maxw") && i+1 < args.length) maxw = Integer.parseInt(args[++i]);
30
+ else if (args[i].equals("--evt") && i+1 < args.length) evt = Double.parseDouble(args[++i]);
31
+ else if (args[i].equals("--mod") && i+1 < args.length) mod = args[++i];
32
+ else if (args[i].equals("--extra") && i+1 < args.length) extra = args[++i];
33
+ }
34
+ java.io.File wd = new java.io.File(args[1]);
35
+ if (!wd.isDirectory() && !wd.mkdirs()) {
36
+ System.err.println("❌ 无法创建 workingDir: " + args[1]);
37
+ System.exit(1);
38
+ }
39
+ Object qrm = Class.forName("biocjava.bioIO.BioSoftPipeServer.MEMEsuiteWrapper.QuickRunMEME")
40
+ .getDeclaredConstructor().newInstance();
41
+ Class<?> c = qrm.getClass();
42
+ c.getMethod("setInFile", java.io.File.class).invoke(qrm, new java.io.File(args[0]));
43
+ c.getMethod("setWorkingDir", java.io.File.class).invoke(qrm, wd);
44
+ c.getMethod("setMaxEvalue", double.class).invoke(qrm, evt);
45
+ c.getMethod("setNumberOfMotif", int.class).invoke(qrm, nmotifs);
46
+ c.getMethod("setMinMotifWidth", int.class).invoke(qrm, minw);
47
+ c.getMethod("setMaxMotifWidth", int.class).invoke(qrm, maxw);
48
+ Class<?> sm = Class.forName("biocjava.bioIO.BioSoftPipeServer.MEMEsuiteWrapper.QuickRunMEME$SITEDISTRIBUTION");
49
+ Object mode = mod.equalsIgnoreCase("oops") ? Enum.valueOf((Class)sm, "OneOccurPerSeq")
50
+ : mod.equalsIgnoreCase("anr") ? Enum.valueOf((Class)sm, "AnyNumberOfOccurPerSeq")
51
+ : Enum.valueOf((Class)sm, "ZeroOrOneOccurPerSeq");
52
+ c.getMethod("setMiningMode", sm).invoke(qrm, mode);
53
+ if (!extra.isEmpty()) {
54
+ try { c.getMethod("setOtherParas", String.class).invoke(qrm, extra); }
55
+ catch (Exception ignore) { /* otherParas 图层面不可见时忽略 */ }
56
+ }
57
+ c.getMethod("process").invoke(qrm);
58
+ // meme 5.x 输出到 meme_out/ 子目录;旧版输出到 wd 根(GUI 面板是 wd 根)
59
+ java.io.File xml = new java.io.File(new java.io.File(wd, "meme_out"), "meme.xml");
60
+ if (!xml.isFile()) xml = new java.io.File(wd, "meme.xml");
61
+ if (!xml.isFile()) {
62
+ java.io.File[] anyXml = wd.listFiles((d, n) -> n.endsWith(".xml"));
63
+ if (anyXml != null && anyXml.length > 0) xml = anyXml[0];
64
+ }
65
+ if (!xml.isFile()) {
66
+ System.err.println("❌ 未找到 meme.xml(meme 运行失败?检查系统 meme 安装)");
67
+ System.exit(1);
68
+ }
69
+ java.nio.file.Files.copy(xml.toPath(), new java.io.File(args[2]).toPath(),
70
+ java.nio.file.StandardCopyOption.REPLACE_EXISTING);
71
+ System.err.println("[tbplot] meme.xml 已保存: " + args[2]);
72
+ System.exit(0);
73
+ }
74
+ }
@@ -0,0 +1,40 @@
1
+ import biocjava.bioIO.BioSoftPipeServer.MEMEsuiteWrapper.QuickRunMEME;
2
+
3
+ import java.io.File;
4
+
5
+ /**
6
+ * tbcli memerun — 一步法 MEME motif 发现 CLI(08/31 第八十八波,工具 100)
7
+ *
8
+ * 用法: MemeRunCli <in.fasta> <workingDir> [--motif N] [--minW N] [--maxW N] [--evalue X] [--mode ZeroOrOneOccurPerSeq|OneOccurPerSeq|AnyNumberOfOccurPerSeq]
9
+ * in.fasta: 未比对蛋白/核酸序列
10
+ * workingDir: 输出目录
11
+ *
12
+ * 引擎: QuickRunMEME.setInFile/setWorkingDir/... + process()(main 硬编码演示 → setter+process)
13
+ * (调系统 meme;GRAS motif 分析统一 CLI 入口)
14
+ */
15
+ public class MemeRunCli {
16
+ public static void main(String[] args) throws Exception {
17
+ if (args.length < 2) {
18
+ System.err.println("用法: MemeRunCli <in.fasta> <workingDir> [--motif N] [--minW N] [--maxW N] [--evalue X] [--mode ...]");
19
+ System.exit(1);
20
+ }
21
+ QuickRunMEME qrm = new QuickRunMEME();
22
+ qrm.setInFile(new File(args[0]));
23
+ qrm.setWorkingDir(new File(args[1]));
24
+ for (int i = 2; i < args.length; i++) {
25
+ switch (args[i]) {
26
+ case "--motif": qrm.setNumberOfMotif(Integer.parseInt(args[++i])); break;
27
+ case "--minW": qrm.setMinMotifWidth(Integer.parseInt(args[++i])); break;
28
+ case "--maxW": qrm.setMaxMotifWidth(Integer.parseInt(args[++i])); break;
29
+ case "--evalue": qrm.setMaxEvalue(Double.parseDouble(args[++i])); break;
30
+ case "--mode":
31
+ qrm.setMiningMode(QuickRunMEME.SITEDISTRIBUTION.valueOf(args[++i]));
32
+ break;
33
+ default: System.err.println("未知参数: " + args[i]); break;
34
+ }
35
+ }
36
+ qrm.process();
37
+ System.err.println("[tbplot] MEME 完成,输出目录: " + args[1]);
38
+ System.exit(0);
39
+ }
40
+ }
@@ -0,0 +1,35 @@
1
+ import biocjava.bioDoer.JIGplotToolkit.Synteny.MultipleGffViewer.FormatTranformerForMultipleGffViewer;
2
+
3
+ import java.io.File;
4
+
5
+ /**
6
+ * tbcli mggxf — 多 GFF 视图格式转换 CLI(08/31 第九十波,工具 103)
7
+ *
8
+ * 用法: MgGxfCli <inGenePair|blastTab6> <in.simplified.gff> <out.LinkedRegion> [GenePair|BlastTab6]
9
+ * inGenePair: 基因对文件(GenePair 模式)
10
+ * in.simplified.gff: 简化 GFF(chr\tgene\tstart\tend)
11
+ * out.LinkedRegion: 输出共线性区域
12
+ *
13
+ * 引擎: FormatTranformerForMultipleGffViewer.setInFile/setInGffFile/setOutFile/setInputFormat + transform()
14
+ * (main 硬编码演示 → setter+process;多物种共线性可视化的格式转换)
15
+ */
16
+ public class MgGxfCli {
17
+ public static void main(String[] args) throws Exception {
18
+ if (args.length < 3) {
19
+ System.err.println("用法: MgGxfCli <inGenePair|blastTab6> <in.simplified.gff> <out.LinkedRegion> [GenePair|BlastTab6]");
20
+ System.exit(1);
21
+ }
22
+ FormatTranformerForMultipleGffViewer.InputFormat fmt =
23
+ (args.length > 3 && args[3].equals("BlastTab6"))
24
+ ? FormatTranformerForMultipleGffViewer.InputFormat.BlastTab6
25
+ : FormatTranformerForMultipleGffViewer.InputFormat.GenePair;
26
+ FormatTranformerForMultipleGffViewer ftfmg = new FormatTranformerForMultipleGffViewer();
27
+ ftfmg.setInFile(new File(args[0]));
28
+ ftfmg.setInGffFile(new File(args[1]));
29
+ ftfmg.setOutFile(new File(args[2]));
30
+ ftfmg.setInputFormat(fmt);
31
+ ftfmg.transform();
32
+ System.err.println("[tbplot] 已保存: " + args[2]);
33
+ System.exit(0);
34
+ }
35
+ }