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,75 @@
1
+ import biocjava.bioDoer.JIGplotToolkit.newickParser.TreeTreeTree.TreeTreeTree;
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 tree — TBtools 树+注释图 CLI(08/29 重建)
10
+ *
11
+ * 用法: TreeCli <treeMeta.config> <out> [pad] [width] [height]
12
+ * treeMeta.config: 行导向配置(# 注释):
13
+ * [TYPE]:Tree # 树类型(必须)
14
+ * [NEWICK]:<newick 同行> # Newick 树(与 [NEWICK]: 同行,允许含冒号)
15
+ * [setting] # 设置节(可选)
16
+ * [TYPE]:TextAnno/HeatMap/BarPlot/Tile/StackBar/Domain/GeneStructure/Motifs/ManualAssigned <file> ...
17
+ * pad: 面板间距(默认 20)
18
+ *
19
+ * 引擎: TreeTreeTree.showMeYourPower() 返回 ArrayList<JIGSubPanel>(各轨道)
20
+ * (GRAS 12sp 树 926 叶 + TextAnno + HeatMap 轨道验证 SVG 1.19MB,08/28)
21
+ */
22
+ public class TreeCli {
23
+ public static void main(String[] args) throws Exception {
24
+ if (args.length < 2) {
25
+ System.err.println("用法: TreeCli <treeMeta.config> <out> [pad] [width] [height]");
26
+ System.exit(1);
27
+ }
28
+ String configFile = args[0];
29
+ String outFile = args[1];
30
+ int pad = args.length > 2 ? Integer.parseInt(args[2]) : 20;
31
+ int width = args.length > 3 ? Integer.parseInt(args[3]) : 1200;
32
+ int height = args.length > 4 ? Integer.parseInt(args[4]) : 800;
33
+
34
+ // FIX(G2): TreeTreeTree 在配置解析失败时会从 System.in 读入(挂起元凶,
35
+ // WorkBuddy 报告「tree draw 挂起无响应」;本地复现:喂 .nwk 挂 30s+,
36
+ // stdin 关死即立即返回)。两道防线:
37
+ // ① 预检配置必须含 [TYPE]: 行,否则快速报错并指路 phylotree
38
+ // ② System.in 置空流,引擎任何 stdin 读立即 EOF
39
+ try {
40
+ String content = new String(java.nio.file.Files.readAllBytes(new File(configFile).toPath()));
41
+ if (!content.contains("[TYPE]:")) {
42
+ System.err.println("❌ 输入不是 TreeTab 配置(缺 [TYPE]: 行): " + configFile);
43
+ System.err.println(" 配置文件示例:");
44
+ System.err.println(" [TYPE]:Tree");
45
+ System.err.println(" [NEWICK]:((A:0.1,B:0.2):0.3,C:0.4);");
46
+ System.err.println(" 💡 如果只想直接画 newick 树: tbtools tree phylotree <in.nwk> <out.svg>");
47
+ System.exit(2);
48
+ }
49
+ } catch (java.io.IOException ioe) {
50
+ System.err.println("❌ 无法读取配置文件: " + configFile + " (" + ioe.getMessage() + ")");
51
+ System.exit(2);
52
+ }
53
+ System.setIn(new java.io.ByteArrayInputStream(new byte[0]));
54
+
55
+ TreeTreeTree ttt = new TreeTreeTree();
56
+ ttt.setInConfig(new File(configFile));
57
+ ttt.setScaleFactor(1.0);
58
+
59
+ ArrayList<JIGSubPanel> panels = ttt.showMeYourPower();
60
+ if (panels == null || panels.isEmpty()) {
61
+ System.err.println("错误: showMeYourPower 返回空");
62
+ System.exit(1);
63
+ }
64
+ System.err.println("[tbplot] 轨道面板数: " + panels.size());
65
+
66
+ JIGBasePanel base = new JIGBasePanel(width, height);
67
+ for (JIGSubPanel p : panels) base.addSubPanel(p);
68
+ String low = outFile.toLowerCase();
69
+ if (low.endsWith(".png")) base.save2PNG(new File(outFile));
70
+ else if (low.endsWith(".pdf")) base.save2PDF(new File(outFile));
71
+ else base.save2SVG(new File(outFile));
72
+ System.err.println("[tbplot] 已保存: " + outFile + " (" + panels.size() + " 轨道)");
73
+ System.exit(0);
74
+ }
75
+ }
@@ -0,0 +1,30 @@
1
+ import java.io.File;
2
+ import java.nio.file.Files;
3
+ import java.nio.charset.StandardCharsets;
4
+
5
+ /**
6
+ * tbplot treeRooting — MAD 系统发育定根 CLI(08/29,第 49 引擎)
7
+ *
8
+ * 用法: TreeRootingCli <in.nwk> <out.nwk>
9
+ * in.nwk: 未定根 NEWICK 树(单树)
10
+ * out.nwk: MAD 定根后的 NEWICK 树
11
+ *
12
+ * ⚠️ MAD.main() 硬编码输入路径(args 被覆盖)——不能直接调 main。
13
+ * 改用公开静态入口 quickMadRoot(String):NEWICK 字符串 → 定根后字符串。
14
+ * 算法引用:Tria et al. 2017, Nat Ecol Evol (MAD rooting, DOI:10.1038/s41559-017-0193)
15
+ */
16
+ public class TreeRootingCli {
17
+ public static void main(String[] args) throws Exception {
18
+ if (args.length < 2) {
19
+ System.err.println("用法: TreeRootingCli <in.nwk> <out.nwk>");
20
+ System.exit(1);
21
+ }
22
+ String in = args[0];
23
+ String out = args[1];
24
+ String nwk = new String(Files.readAllBytes(new File(in).toPath()), StandardCharsets.UTF_8).trim();
25
+ String rooted = biocjava.bioDoer.TreeRooting.MAD.quickMadRoot(nwk);
26
+ Files.write(new File(out).toPath(), (rooted + "\n").getBytes(StandardCharsets.UTF_8));
27
+ System.err.println("[tbplot] MAD 定根完成: " + out);
28
+ System.exit(0);
29
+ }
30
+ }
@@ -0,0 +1,33 @@
1
+ import biocjava.bioIO.TrimMSA.trimMSA;
2
+
3
+ import java.io.File;
4
+
5
+ /**
6
+ * tbcli trimMSA 桥 — MSA 修剪 CLI(08/31)
7
+ *
8
+ * 用法: TrimMSACli <in.aln.fa> <out.aln.fa> [ratio]
9
+ * in.aln.fa: 多序列比对 (Fasta)
10
+ * out.aln.fa: 修剪后比对
11
+ * ratio: 每列保留阈值 (默认 0.5)
12
+ *
13
+ * ⚠️ trimMSA.main 是硬编码演示路径(不走 ArgsParser)→ 桥直接用 setter + process()
14
+ */
15
+ public class TrimMSACli {
16
+ public static void main(String[] args) throws Exception {
17
+ if (args.length < 2) {
18
+ System.err.println("用法: TrimMSACli <in.aln.fa> <out.aln.fa> [ratio]");
19
+ System.exit(1);
20
+ }
21
+ String inFile = args[0];
22
+ String outFile = args[1];
23
+ float ratio = args.length > 2 ? Float.parseFloat(args[2]) : 0.5f;
24
+
25
+ trimMSA tm = new trimMSA();
26
+ tm.setInMSAfa(new File(inFile));
27
+ tm.setOutMSAfa(new File(outFile));
28
+ tm.setRatio(ratio);
29
+ tm.process();
30
+ System.err.println("[tbcli] 已保存: " + outFile + " (ratio=" + ratio + ")");
31
+ System.exit(0);
32
+ }
33
+ }
@@ -0,0 +1,44 @@
1
+ import unrootedtree.engine.UnrootedTreePanelNew;
2
+ import jigplot.engine.JIGBasePanel;
3
+
4
+ import java.io.File;
5
+
6
+ /**
7
+ * tbplot unrooted — 无根树可视化 CLI(08/31 第六十四波)
8
+ *
9
+ * 用法: UnrootedTreeCli <in.nwk> <out> [layout] [width] [height] [iterations]
10
+ * in.nwk: Newick 树文件
11
+ * out: .svg / .png / .pdf
12
+ * layout: Circular|Radial|Force-Directed|Equal Angle|N-Body|Equal-Daylight(默认 Circular)
13
+ * iterations: Force-Directed/N-Body 迭代次数(默认 200)
14
+ *
15
+ * 引擎: UnrootedTreePanelNew.loadNewickFile() → getJIGPanel() 返回 JIGBasePanel
16
+ * (独立引擎,与已判死局的 UnrootedTreeViz 无关;08/31 攻下)
17
+ */
18
+ public class UnrootedTreeCli {
19
+ public static void main(String[] args) throws Exception {
20
+ if (args.length < 2) {
21
+ System.err.println("用法: UnrootedTreeCli <in.nwk> <out> [layout] [width] [height] [iterations]");
22
+ System.exit(1);
23
+ }
24
+ String nwk = args[0];
25
+ String out = args[1];
26
+ String layout = args.length > 2 ? args[2] : "Circular";
27
+ int width = args.length > 3 ? Integer.parseInt(args[3]) : 1000;
28
+ int height = args.length > 4 ? Integer.parseInt(args[4]) : 900;
29
+ int iterations = args.length > 5 ? Integer.parseInt(args[5]) : 200;
30
+
31
+ UnrootedTreePanelNew ut = new UnrootedTreePanelNew();
32
+ ut.setLayoutType(layout);
33
+ ut.setIterations(iterations);
34
+ ut.loadNewickFile(new File(nwk));
35
+
36
+ JIGBasePanel panel = ut.getJIGPanel();
37
+ String low = out.toLowerCase();
38
+ if (low.endsWith(".png")) panel.save2PNG(new File(out));
39
+ else if (low.endsWith(".pdf")) panel.save2PDF(new File(out));
40
+ else panel.save2SVG(new File(out));
41
+ System.err.println("[tbplot] 已保存: " + out + " (layout=" + layout + ")");
42
+ System.exit(0);
43
+ }
44
+ }
@@ -0,0 +1,90 @@
1
+ import jigplot.engine.JIGBasePanel;
2
+
3
+ import java.io.File;
4
+ import java.lang.reflect.Method;
5
+ import java.util.HashSet;
6
+ import java.util.LinkedHashMap;
7
+
8
+ /**
9
+ * tbplot upset — UpSet 图 CLI(GUI 面板逆向接口,09/20)
10
+ *
11
+ * 用法: UpSetCli <set1.txt> <set2.txt> [<set3.txt>...] <out.svg> [--min-overlap N]
12
+ * [--rank1 Size|Count|Name] [--rank2 Size|Count|Name] [--rank3 Size|Count|Name]
13
+ * [--size-mode Increasing|Decreasing] [--count-mode ...] [--name-mode ...]
14
+ * [--width N] [--height N]
15
+ *
16
+ * 接口来源:反编译 QuickUpSetPlotGUIPanel(GUI 真实调用链):
17
+ * 每个文件读成 HashSet(文件名→ID 集合):
18
+ * UpSetPlotControl usp = new UpSetPlotControl();
19
+ * usp.setInSetHashMap(map); usp.setMinOverlapSetSize(N);
20
+ * usp.setFristRank/setSecondRank/setThirdRank(rankKey);
21
+ * usp.setSetSizeRankMode/setSetCountRankMode/setSetNameRankMode(rankMode);
22
+ * usp.show(); // show() = plot() + JFrame 壳(headless 崩)
23
+ * 规避:直调 plot()(public,返回 JIGBasePanel)→ save2* 保存。
24
+ */
25
+ public class UpSetCli {
26
+ public static void main(String[] args) throws Exception {
27
+ int minOverlap = 0, width = 1200, height = 800;
28
+ String rank1 = "Size", rank2 = "Count", rank3 = "Name";
29
+ String sizeMode = "Decreasing", countMode = "Decreasing", nameMode = "Increasing";
30
+ java.util.ArrayList<String> pos = new java.util.ArrayList<String>();
31
+ for (int i = 0; i < args.length; i++) {
32
+ if (args[i].equals("--min-overlap") && i+1 < args.length) minOverlap = Integer.parseInt(args[++i]);
33
+ else if (args[i].equals("--rank1") && i+1 < args.length) rank1 = args[++i];
34
+ else if (args[i].equals("--rank2") && i+1 < args.length) rank2 = args[++i];
35
+ else if (args[i].equals("--rank3") && i+1 < args.length) rank3 = args[++i];
36
+ else if (args[i].equals("--size-mode") && i+1 < args.length) sizeMode = args[++i];
37
+ else if (args[i].equals("--count-mode") && i+1 < args.length) countMode = args[++i];
38
+ else if (args[i].equals("--name-mode") && i+1 < args.length) nameMode = args[++i];
39
+ else if (args[i].equals("--width") && i+1 < args.length) width = Integer.parseInt(args[++i]);
40
+ else if (args[i].equals("--height") && i+1 < args.length) height = Integer.parseInt(args[++i]);
41
+ else pos.add(args[i]);
42
+ }
43
+ if (pos.size() < 3) {
44
+ System.err.println("用法: UpSetCli <set1.txt> <set2.txt> [<set3.txt>...] <out.svg> [--min-overlap N] [--rank1 Size|Count|Name] ...");
45
+ System.exit(1);
46
+ }
47
+ String outPath = pos.remove(pos.size() - 1);
48
+ // 读集合(文件内容每行一个 ID,集合标题 = 文件名)
49
+ LinkedHashMap<String, HashSet<String>> map = new LinkedHashMap<String, HashSet<String>>();
50
+ for (String fp : pos) {
51
+ File f = new File(fp);
52
+ HashSet<String> ids = new HashSet<String>();
53
+ java.io.BufferedReader br = new java.io.BufferedReader(new java.io.FileReader(f));
54
+ String line;
55
+ while ((line = br.readLine()) != null) {
56
+ String t = line.trim();
57
+ if (!t.isEmpty()) ids.add(t);
58
+ }
59
+ br.close();
60
+ map.put(f.getName(), ids);
61
+ }
62
+ // show() 内部实际是 new UpSetPlot()(控件的 setter 会转投到它)——
63
+ // 直接实例化 UpSetPlot:setInSetHashMap + plot() 返回 JIGBasePanel
64
+ Object usp = Class.forName("biocjava.bioDoer.JIGplotToolkit.UpSetPloter.UpSetPlot")
65
+ .getDeclaredConstructor().newInstance();
66
+ Class<?> c = usp.getClass();
67
+ c.getMethod("setInSetHashMap", LinkedHashMap.class).invoke(usp, map);
68
+ c.getMethod("setMinOverlapSetSize", int.class).invoke(usp, minOverlap);
69
+ Class<?> rk = Class.forName("biocjava.bioDoer.JIGplotToolkit.UpSetPloter.UpSetPlot$rankKey");
70
+ c.getMethod("setFristRank", rk).invoke(usp, Enum.valueOf((Class)rk, rank1));
71
+ c.getMethod("setSecondRank", rk).invoke(usp, Enum.valueOf((Class)rk, rank2));
72
+ c.getMethod("setThirdRank", rk).invoke(usp, Enum.valueOf((Class)rk, rank3));
73
+ Class<?> rm = Class.forName("biocjava.bioDoer.JIGplotToolkit.UpSetPloter.UpSetPlot$rankMode");
74
+ c.getMethod("setSetSizeRankMode", rm).invoke(usp, Enum.valueOf((Class)rm, sizeMode));
75
+ c.getMethod("setSetCountRankMode", rm).invoke(usp, Enum.valueOf((Class)rm, countMode));
76
+ c.getMethod("setSetNameRankMode", rm).invoke(usp, Enum.valueOf((Class)rm, nameMode));
77
+ Object panel = c.getMethod("plot").invoke(usp);
78
+ if (!(panel instanceof JIGBasePanel)) {
79
+ System.err.println("❌ plot 未返回 JIGBasePanel");
80
+ System.exit(1);
81
+ }
82
+ File outf = new File(outPath);
83
+ String low = outPath.toLowerCase();
84
+ if (low.endsWith(".png")) ((JIGBasePanel) panel).save2PNG(outf);
85
+ else if (low.endsWith(".pdf")) ((JIGBasePanel) panel).save2PDF(outf);
86
+ else ((JIGBasePanel) panel).save2SVG(outf);
87
+ System.err.println("[tbplot] 已保存: " + outPath);
88
+ System.exit(0);
89
+ }
90
+ }
@@ -0,0 +1,60 @@
1
+ import biocjava.bioDoer.JJplot2Toolkit.WonderfulVenn.venn5.Venn5;
2
+
3
+ import java.io.BufferedReader;
4
+ import java.io.File;
5
+ import java.io.FileReader;
6
+ import java.util.ArrayList;
7
+ import java.util.HashSet;
8
+
9
+ /**
10
+ * tbplot venn5 — TBtools 五集合韦恩图 CLI(08/29 新增,第 29 引擎)
11
+ *
12
+ * 用法: Venn5Cli <out> <setA.txt> <setB.txt> <setC.txt> <setD.txt> <setE.txt> [labelA] [labelB] [labelC] [labelD] [labelE]
13
+ * 每个 setN.txt: 每行一个成员 ID
14
+ *
15
+ * 引擎: Venn5(setInArrA~E + setTitleA~E + setOutGraph + getVennGraph)
16
+ */
17
+ public class Venn5Cli {
18
+ public static void main(String[] args) throws Exception {
19
+ if (args.length < 6) {
20
+ System.err.println("用法: Venn5Cli <out> <setA.txt> <setB.txt> <setC.txt> <setD.txt> <setE.txt> [labelA-E]");
21
+ System.exit(1);
22
+ }
23
+ String outFile = args[0];
24
+ ArrayList<HashSet<String>> sets = new ArrayList<HashSet<String>>();
25
+ for (int i = 1; i <= 5; i++) {
26
+ sets.add(readSet(args[i]));
27
+ }
28
+ String[] labels = args.length > 6 ? new String[]{args[6], args.length>7?args[7]:"B", args.length>8?args[8]:"C", args.length>9?args[9]:"D", args.length>10?args[10]:"E"} : new String[]{"A","B","C","D","E"};
29
+
30
+ Venn5 v = new Venn5();
31
+ v.setInArrA(sets.get(0));
32
+ v.setInArrB(sets.get(1));
33
+ v.setInArrC(sets.get(2));
34
+ v.setInArrD(sets.get(3));
35
+ v.setInArrE(sets.get(4));
36
+ v.setTitleA(labels[0]);
37
+ v.setTitleB(labels[1]);
38
+ v.setTitleC(labels[2]);
39
+ v.setTitleD(labels[3]);
40
+ v.setTitleE(labels[4]);
41
+ v.setOutGraph(new File(outFile));
42
+ v.getOverlap(); // 必须先计算交集,否则 maskToSet 为空 → 全部计数 0(08/31 盲测 P0 bug)
43
+ v.getVennGraph();
44
+ System.err.println("[tbplot] 已保存: " + outFile);
45
+ System.exit(0);
46
+ }
47
+
48
+ static HashSet<String> readSet(String path) throws Exception {
49
+ HashSet<String> set = new HashSet<String>();
50
+ BufferedReader br = new BufferedReader(new FileReader(path));
51
+ String line;
52
+ while ((line = br.readLine()) != null) {
53
+ line = line.trim();
54
+ if (!line.isEmpty() && !line.startsWith("#")) set.add(line);
55
+ }
56
+ br.close();
57
+ System.err.println("[tbplot] " + path + ": " + set.size() + " 成员");
58
+ return set;
59
+ }
60
+ }
@@ -0,0 +1,65 @@
1
+ import biocjava.bioDoer.JJplot2Toolkit.WonderfulVenn.venn6.Venn6;
2
+
3
+ import java.io.BufferedReader;
4
+ import java.io.File;
5
+ import java.io.FileReader;
6
+ import java.util.ArrayList;
7
+ import java.util.HashSet;
8
+
9
+ /**
10
+ * tbplot venn6 — TBtools 六集合韦恩图 CLI(08/29 新增,第 30 引擎)
11
+ *
12
+ * 用法: Venn6Cli <out> <setA.txt> ... <setF.txt> [labelA-F]
13
+ * 每个 setN.txt: 每行一个成员 ID
14
+ *
15
+ * 引擎: Venn6(setInArrA~F + setTitleA~F + setOutGraph + getVennGraph)
16
+ */
17
+ public class Venn6Cli {
18
+ public static void main(String[] args) throws Exception {
19
+ if (args.length < 7) {
20
+ System.err.println("用法: Venn6Cli <out> <setA.txt> <setB.txt> <setC.txt> <setD.txt> <setE.txt> <setF.txt> [labelA-F]");
21
+ System.exit(1);
22
+ }
23
+ String outFile = args[0];
24
+ ArrayList<HashSet<String>> sets = new ArrayList<HashSet<String>>();
25
+ for (int i = 1; i <= 6; i++) {
26
+ sets.add(readSet(args[i]));
27
+ }
28
+ String[] labels = new String[6];
29
+ for (int i = 0; i < 6; i++) {
30
+ labels[i] = args.length > 7 + i ? args[7 + i] : String.valueOf((char)('A' + i));
31
+ }
32
+
33
+ Venn6 v = new Venn6();
34
+ v.setInArrA(sets.get(0));
35
+ v.setInArrB(sets.get(1));
36
+ v.setInArrC(sets.get(2));
37
+ v.setInArrD(sets.get(3));
38
+ v.setInArrE(sets.get(4));
39
+ v.setInArrF(sets.get(5));
40
+ v.setTitleA(labels[0]);
41
+ v.setTitleB(labels[1]);
42
+ v.setTitleC(labels[2]);
43
+ v.setTitleD(labels[3]);
44
+ v.setTitleE(labels[4]);
45
+ v.setTitleF(labels[5]);
46
+ v.setOutGraph(new File(outFile));
47
+ v.getOverlap(); // 必须先计算交集,否则 maskToSet 为空 → 全部计数 0(08/31 盲测 P0 bug)
48
+ v.getVennGraph();
49
+ System.err.println("[tbplot] 已保存: " + outFile);
50
+ System.exit(0);
51
+ }
52
+
53
+ static HashSet<String> readSet(String path) throws Exception {
54
+ HashSet<String> set = new HashSet<String>();
55
+ BufferedReader br = new BufferedReader(new FileReader(path));
56
+ String line;
57
+ while ((line = br.readLine()) != null) {
58
+ line = line.trim();
59
+ if (!line.isEmpty() && !line.startsWith("#")) set.add(line);
60
+ }
61
+ br.close();
62
+ System.err.println("[tbplot] " + path + ": " + set.size() + " 成员");
63
+ return set;
64
+ }
65
+ }
@@ -0,0 +1,66 @@
1
+ import jigplot.geom.violin.ViolinPlot;
2
+
3
+ import java.io.File;
4
+ import java.util.ArrayList;
5
+
6
+ /**
7
+ * tbplot violin — 独立小提琴图 CLI(08/31 第六十五波)
8
+ *
9
+ * 用法: ViolinCli <in.tsv> <out> [width] [height]
10
+ * in.tsv: 组别\t值(每行一个观测;第一行可作表头)
11
+ * out: .svg / .png / .pdf
12
+ *
13
+ * 引擎: ViolinPlot.generate() + saveToSVG/PNG/PDF(独立引擎,非 groupedbar VIOLIN 模式)
14
+ */
15
+ public class ViolinCli {
16
+ public static void main(String[] args) throws Exception {
17
+ if (args.length < 2) {
18
+ System.err.println("用法: ViolinCli <in.tsv> <out> [width] [height]");
19
+ System.exit(1);
20
+ }
21
+ String inFile = args[0];
22
+ String out = args[1];
23
+ int width = args.length > 2 ? Integer.parseInt(args[2]) : 800;
24
+ int height = args.length > 3 ? Integer.parseInt(args[3]) : 500;
25
+
26
+ // 读取 组别\t值(跳过表头)
27
+ ArrayList<double[]> dataSets = new ArrayList<>();
28
+ ArrayList<String> labels = new ArrayList<>();
29
+ java.io.BufferedReader br = new java.io.BufferedReader(new java.io.FileReader(inFile));
30
+ String line;
31
+ java.util.LinkedHashMap<String, ArrayList<Double>> groups = new java.util.LinkedHashMap<>();
32
+ while ((line = br.readLine()) != null) {
33
+ String t = line.trim();
34
+ if (t.isEmpty() || t.startsWith("#")) continue;
35
+ String[] cols = t.split("\t");
36
+ if (cols.length < 2) continue;
37
+ String g = cols[0];
38
+ // 跳过表头(组别非数字且第一行)
39
+ try { Double.parseDouble(cols[1]); } catch (Exception e) { continue; }
40
+ groups.computeIfAbsent(g, k -> new ArrayList<>()).add(Double.parseDouble(cols[1]));
41
+ }
42
+ br.close();
43
+ for (String g : groups.keySet()) {
44
+ ArrayList<Double> vals = groups.get(g);
45
+ double[] arr = new double[vals.size()];
46
+ for (int i = 0; i < vals.size(); i++) arr[i] = vals.get(i);
47
+ dataSets.add(arr);
48
+ labels.add(g);
49
+ }
50
+ if (dataSets.isEmpty()) {
51
+ System.err.println("错误: 无数据(需 组别\t值 每行)");
52
+ System.exit(1);
53
+ }
54
+
55
+ ViolinPlot vp = new ViolinPlot(dataSets, labels.toArray(new String[0]));
56
+ vp.setTotalGraphWidth(width);
57
+ vp.setTotalGraphHeight(height);
58
+ vp.generate();
59
+
60
+ String low = out.toLowerCase();
61
+ if (low.endsWith(".pdf")) vp.saveToPDF(new File(out));
62
+ else vp.saveToSVG(new File(out));
63
+ System.err.println("[tbplot] 已保存: " + out + " (" + labels.size() + " 组)");
64
+ System.exit(0);
65
+ }
66
+ }
@@ -0,0 +1,57 @@
1
+ import java.io.File;
2
+ import java.nio.file.Files;
3
+ import java.nio.charset.StandardCharsets;
4
+ import java.util.List;
5
+
6
+ /**
7
+ * tbplot visualizePseudoBlock — 伪共线性区块可视化 CLI(08/29,第 51 引擎)
8
+ *
9
+ * 用法: VisualizeCli <inBlockOut> <outGraph.pdf> [--labels "Genome1,Genome2"]
10
+ * inBlockOut: FindBlockDual 输出(行=一个基因组区块; 基因格式 name(chr:start-end):strand[:matchIDs])
11
+ * outGraph: 输出 PDF(引擎只支持 PDF)
12
+ * --labels: 每行对应的基因组标签(默认 Genome1,Genome2,...;不传则自动加)
13
+ *
14
+ * ⚠️ main() 硬编码 13 个 queryId 循环——改直接调 visualize(File outGraph)。
15
+ * ⚠️ Visualize 输入格式要求每行 `标签:基因1\t基因2...`(第一个冒号前是标签),
16
+ * FindBlockDual 输出无标签 → 桥自动补齐(默认 Genome1/Genome2/...,或用 --labels 指定)。
17
+ *
18
+ * 例: VisualizeCli examples/data/findblockdual/block_Cr_Cs_real.out.txt out.pdf --labels "Camellia_reticulata,Camellia_sinensis"
19
+ */
20
+ public class VisualizeCli {
21
+ public static void main(String[] args) throws Exception {
22
+ if (args.length < 2) {
23
+ System.err.println("用法: VisualizeCli <inBlockOut> <outGraph.pdf> [--labels \"Genome1,Genome2\"]");
24
+ System.exit(1);
25
+ }
26
+ String in = args[0];
27
+ String out = args[1];
28
+ String labels = null;
29
+ for (int i = 2; i < args.length; i++) {
30
+ if (args[i].equals("--labels") && i+1 < args.length) labels = args[++i];
31
+ }
32
+ // 读入 FindBlockDual 输出并加标签前缀(Visualize 需要 标签:基因1\t基因2 格式)
33
+ List<String> lines = Files.readAllLines(new File(in).toPath(), StandardCharsets.UTF_8);
34
+ String[] labelArr = labels == null ? null : labels.split(",");
35
+ StringBuilder sb = new StringBuilder();
36
+ for (int i = 0; i < lines.size(); i++) {
37
+ String line = lines.get(i).trim();
38
+ if (line.isEmpty()) continue;
39
+ String label;
40
+ if (labelArr != null && i < labelArr.length) label = labelArr[i];
41
+ else label = "Genome" + (i + 1);
42
+ // 若行首已是 `单词:` 标签格式则跳过(兼容已带标签输入)
43
+ sb.append(label).append(":").append(line).append("\n");
44
+ }
45
+ File tmpIn = File.createTempFile("vpsb_in", ".tab");
46
+ Files.write(tmpIn.toPath(), sb.toString().getBytes(StandardCharsets.UTF_8));
47
+ Object obj = Class.forName("biocjava.bioDoer.PseudoSyntenyBlock.VisualizePseudoSyntenyBlock")
48
+ .getDeclaredConstructor().newInstance();
49
+ obj.getClass().getMethod("setInFindBlockResultTab", File.class)
50
+ .invoke(obj, tmpIn);
51
+ obj.getClass().getMethod("visualize", File.class)
52
+ .invoke(obj, new File(out));
53
+ tmpIn.delete();
54
+ System.err.println("[tbplot] 区块可视化完成: " + out);
55
+ System.exit(0);
56
+ }
57
+ }
@@ -0,0 +1,39 @@
1
+ import biocjava.bioDoer.JIGplotToolkit.Network.GFAGraphLayout;
2
+ import biocjava.bioDoer.JIGplotToolkit.Network.NetworkInfo;
3
+ import biocjava.bioDoer.JIGplotToolkit.Network.VizGFA;
4
+ import jigplot.engine.JIGSubPanel;
5
+ import jigplot.OtherTools.JIGUtils;
6
+
7
+ import java.io.File;
8
+
9
+ /**
10
+ * VizGFACli — TBtools GFA 网络图 CLI(子任务 A 新增)
11
+ *
12
+ * 引擎链: GFAGraphLayout.process(gfa, w, h) → NetworkInfo → VizGFA.visualize(info, w, h) → JIGSubPanel
13
+ * GFA 格式(tab 分隔):
14
+ * S\t<nodeName>\t<sequence> # 节点
15
+ * L\t<from>\t<strand1>\t<to>\t<strand2>\t<overlap> # 边
16
+ *
17
+ * 用法: VizGFACli <in.gfa> <out.svg|png> [width] [height]
18
+ */
19
+ public class VizGFACli {
20
+ public static void main(String[] args) throws Exception {
21
+ if (args.length < 2) {
22
+ System.err.println("用法: VizGFACli <in.gfa> <out> [width] [height]");
23
+ System.err.println("GFA: S 行=节点, L 行=边(tab 分隔)");
24
+ System.exit(1);
25
+ }
26
+ String gfa = args[0];
27
+ String outFile = args[1];
28
+ int w = args.length > 2 ? Integer.parseInt(args[2]) : 1200;
29
+ int h = args.length > 3 ? Integer.parseInt(args[3]) : 900;
30
+
31
+ NetworkInfo info = GFAGraphLayout.process(gfa, w, h);
32
+ JIGSubPanel panel = VizGFA.visualize(info, w, h);
33
+
34
+ File outf = new File(outFile);
35
+ JIGUtils.quickSave(outf, new JIGSubPanel[]{panel});
36
+ System.err.println("[tbplot] 已保存: " + outf + " (节点 " + info.node2Pos.size() + ", 边 " + info.nodeLinks.size() + ")");
37
+ System.exit(0);
38
+ }
39
+ }