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,33 @@
1
+ import biocjava.bioDoer.JJplot2Toolkit.BuildDegramdomFromTable;
2
+
3
+ import java.io.File;
4
+
5
+ /**
6
+ * tbcli degramdom — 亲子表构建 Newick 树 CLI(08/31 第七十波)
7
+ *
8
+ * 用法: DegramdomCli <in.tsv> [out.nwk]
9
+ * in.tsv: 子节点\t父节点\t枝长(每行一个父子关系;表头/空行自动跳过)
10
+ * out.nwk: 输出 Newick(可选,默认打印到 stdout)
11
+ *
12
+ * 引擎: BuildDegramdomFromTable.process() 返回 Newick 字符串(main 硬编码演示 → setter+process)
13
+ */
14
+ public class DegramdomCli {
15
+ public static void main(String[] args) throws Exception {
16
+ if (args.length < 1) {
17
+ System.err.println("用法: DegramdomCli <in.tsv> [out.nwk]");
18
+ System.exit(1);
19
+ }
20
+ BuildDegramdomFromTable bdf = new BuildDegramdomFromTable();
21
+ bdf.setInTable(new File(args[0]));
22
+ String tree = bdf.process();
23
+ if (args.length > 1) {
24
+ java.io.FileWriter fw = new java.io.FileWriter(new File(args[1]));
25
+ fw.write(tree);
26
+ fw.close();
27
+ System.err.println("[tbplot] 已保存: " + args[1]);
28
+ } else {
29
+ System.out.println(tree);
30
+ }
31
+ System.exit(0);
32
+ }
33
+ }
@@ -0,0 +1,44 @@
1
+ import biocjava.bioDoer.JIGplotToolkit.RNAseqViz.DiffExpDualHistPlot;
2
+ import jigplot.engine.JIGBasePanel;
3
+ import jigplot.engine.JIGSubPanel;
4
+
5
+ import java.io.File;
6
+
7
+ /**
8
+ * tbplot dehist — TBtools 差异表达双直方图 CLI(08/29 新增,第 27 引擎)
9
+ *
10
+ * 用法: DiffExpCli <deg.txt> <out> [width] [height]
11
+ * deg.txt: 每行至少 3 列(tab 分隔):任意ID\t值1\t值2
12
+ * 值1/值2: 两个样本/条件的数值(如表达量、Log2FC 对)
13
+ * # 开头行跳过;第 2 列必须是数字
14
+ * 引擎按 值1 vs 值2 大小分左右两个直方图
15
+ *
16
+ * 引擎: DiffExpDualHistPlot.process(File) 返回 JIGSubPanel[](双直方图)
17
+ */
18
+ public class DiffExpCli {
19
+ public static void main(String[] args) throws Exception {
20
+ if (args.length < 2) {
21
+ System.err.println("用法: DiffExpCli <deg.txt> <out> [width] [height]");
22
+ System.exit(1);
23
+ }
24
+ String inFile = args[0];
25
+ String outFile = args[1];
26
+ int width = args.length > 2 ? Integer.parseInt(args[2]) : 1000;
27
+ int height = args.length > 3 ? Integer.parseInt(args[3]) : 700;
28
+
29
+ DiffExpDualHistPlot plot = new DiffExpDualHistPlot();
30
+ JIGSubPanel[] panels = plot.process(new File(inFile));
31
+ if (panels == null || panels.length == 0) {
32
+ System.err.println("错误: process 返回空");
33
+ System.exit(1);
34
+ }
35
+ JIGBasePanel base = new JIGBasePanel(width, height);
36
+ for (JIGSubPanel p : panels) base.addSubPanel(p);
37
+ String low = outFile.toLowerCase();
38
+ if (low.endsWith(".png")) base.save2PNG(new File(outFile));
39
+ else if (low.endsWith(".pdf")) base.save2PDF(new File(outFile));
40
+ else base.save2SVG(new File(outFile));
41
+ System.err.println("[tbplot] 已保存: " + outFile + " (" + panels.length + " 面板)");
42
+ System.exit(0);
43
+ }
44
+ }
@@ -0,0 +1,53 @@
1
+ import biocjava.bioDoer.JIGplotToolkit.Dist.Distance;
2
+ import java.io.BufferedReader;
3
+ import java.io.FileReader;
4
+ import java.util.ArrayList;
5
+
6
+ /**
7
+ * tbplot distance — TBtools 距离计算 CLI(08/29,第 42 引擎)
8
+ *
9
+ * 用法: DistanceCli <in.tsv> <col1> <col2> <method>
10
+ * in.tsv: tab 分隔表;col1/col2: 列索引(从 0 开始,取两列数值)
11
+ * method: euclidean|pearson|pearsonDist
12
+ * 输出: 两列数值的距离/相关系数(所有行合并计算)
13
+ *
14
+ * 引擎: Distance 静态方法(getEuclideanDistance/getPearsonCorrelationCoefficient/getPearsonDistance)
15
+ */
16
+ public class DistanceCli {
17
+ public static void main(String[] args) throws Exception {
18
+ if (args.length < 4) {
19
+ System.err.println("用法: DistanceCli <in.tsv> <col1> <col2> <euclidean|pearson|pearsonDist>");
20
+ System.exit(1);
21
+ }
22
+ String inFile = args[0];
23
+ int c1 = Integer.parseInt(args[1]);
24
+ int c2 = Integer.parseInt(args[2]);
25
+ String method = args[3];
26
+ ArrayList<Double> v1 = new ArrayList<>(), v2 = new ArrayList<>();
27
+ BufferedReader br = new BufferedReader(new FileReader(inFile));
28
+ String line;
29
+ while ((line = br.readLine()) != null) {
30
+ if (line.startsWith("#")) continue;
31
+ String[] cols = line.split("\t");
32
+ if (cols.length <= Math.max(c1, c2)) continue;
33
+ try {
34
+ v1.add(Double.parseDouble(cols[c1]));
35
+ v2.add(Double.parseDouble(cols[c2]));
36
+ } catch (NumberFormatException e) { /* skip non-numeric */ }
37
+ }
38
+ br.close();
39
+ if (v1.size() != v2.size() || v1.isEmpty()) {
40
+ System.err.println("错误: 两列数值数量不一致或为空 (" + v1.size() + " vs " + v2.size() + ")");
41
+ System.exit(1);
42
+ }
43
+ double result;
44
+ switch (method) {
45
+ case "euclidean": result = Distance.getEuclideanDistance(v1, v2); break;
46
+ case "pearson": result = Distance.getPearsonCorrelationCoefficient(v1, v2); break;
47
+ case "pearsonDist": result = Distance.getPearsonDistance(v1, v2); break;
48
+ default: System.err.println("未知方法: " + method); System.exit(1); return;
49
+ }
50
+ System.out.println(method + "\t" + result);
51
+ System.exit(0);
52
+ }
53
+ }
@@ -0,0 +1,147 @@
1
+ import JJpolt2.Example.DualSyntenyPlotterAdvance;
2
+
3
+ import java.awt.Component;
4
+ import java.awt.Container;
5
+ import java.awt.Window;
6
+ import java.io.File;
7
+ import java.io.FileWriter;
8
+ import java.lang.reflect.Field;
9
+ import java.lang.reflect.Method;
10
+
11
+ /**
12
+ * tbplot dualsyn — TBtools 双基因组共线性图 CLI v3(08/31,旧 JJplot2 框架保存破解)
13
+ *
14
+ * 用法: DualSynCli <simplifiedGff> <collinearity> <out> [--chr1 "1,2"] [--chr2 "3,4"] [--rows N] [--gap N]
15
+ * simplifiedGff: Chr\tGeneName\tStart\tEnd(染色体名必须数字!如 1/2/3 或 "1-1")
16
+ * collinearity: MCScanX 输出(*.collinearity)
17
+ *
18
+ * 引擎: DualSyntenyPlotterAdvance(旧 JJplot2 框架)
19
+ * plot() 内部用静态工厂 prepareBackgroundCoordinateWithoutAxis 建 GUI,
20
+ * GUI 实例被内部类($5/$6/$7,含 Ljjplot2/JJplot2GUI 字段)以监听器形式挂在组件树上。
21
+ * 保存: 调 plot() 后反射深度扫描所有窗口+组件+监听器对象,提取 JJplot2GUI 实例
22
+ * → saveImageAsPNG/PDF/SVG。
23
+ */
24
+ public class DualSynCli {
25
+ public static void main(String[] args) throws Exception {
26
+ if (args.length < 3) {
27
+ System.err.println("用法: DualSynCli <simplifiedGff> <collinearity> <out> [--chr1 \"1,2\"] [--chr2 \"3,4\"] [--rows N] [--gap N]");
28
+ System.exit(1);
29
+ }
30
+ String gffFile = args[0];
31
+ String collinearFile = args[1];
32
+ String outFile = args[2];
33
+ String chr1 = null, chr2 = null;
34
+ int rows = 3, gap = 3;
35
+ for (int i = 3; i < args.length; i++) {
36
+ if (args[i].equals("--chr1") && i+1<args.length) chr1 = args[++i];
37
+ else if (args[i].equals("--chr2") && i+1<args.length) chr2 = args[++i];
38
+ else if (args[i].equals("--rows") && i+1<args.length) rows = Integer.parseInt(args[++i]);
39
+ else if (args[i].equals("--gap") && i+1<args.length) gap = Integer.parseInt(args[++i]);
40
+ }
41
+ if (chr1 == null || chr2 == null) {
42
+ System.err.println("错误: 必须提供 --chr1 和 --chr2");
43
+ System.exit(1);
44
+ }
45
+
46
+ File ctlFile = File.createTempFile("dualsyn", ".ctl");
47
+ ctlFile.deleteOnExit();
48
+ FileWriter fw = new FileWriter(ctlFile);
49
+ fw.write(rows + "\n");
50
+ fw.write(gap + "\n");
51
+ fw.write(chr1 + "\n");
52
+ fw.write(chr2 + "\n");
53
+ fw.close();
54
+
55
+ DualSyntenyPlotterAdvance dsp = new DualSyntenyPlotterAdvance();
56
+ dsp.setCtlFile(ctlFile.getAbsolutePath());
57
+ dsp.setCollinerFile(collinearFile);
58
+ dsp.setInSimplifiedGff(gffFile);
59
+ dsp.setGeneColorFile("");
60
+ dsp.plot(); // 内部 JustShowIt 创建窗口
61
+
62
+ // 反射扫描窗口树 + 监听器对象,提取 JJplot2GUI 实例
63
+ Object gui = null;
64
+ java.util.Set<Object> visited = new java.util.HashSet<>();
65
+ for (Window w : Window.getWindows()) {
66
+ gui = scan(w, visited);
67
+ if (gui != null) break;
68
+ }
69
+ if (gui == null) {
70
+ System.err.println("错误: 未找到 JJplot2GUI 实例(窗口数=" + Window.getWindows().length + ")");
71
+ System.exit(1);
72
+ }
73
+ System.err.println("[tbplot] 找到 JJplot2GUI 实例: " + gui.getClass().getName());
74
+
75
+ // headless 下 GUI 未布局(offScreenImage=3x3)→ 保存前设置目标尺寸,确保图像不糊
76
+ try {
77
+ gui.getClass().getMethod("setWidth", int.class).invoke(gui, 2400);
78
+ gui.getClass().getMethod("setHeight", int.class).invoke(gui, 900);
79
+ } catch (Exception e) { /* 非关键 */ }
80
+
81
+ String low = outFile.toLowerCase();
82
+ Method mSave;
83
+ // 正确 API: saveImageAsPNG/SVG/PDF(private,反射调用)——内部用 getAdjusteParamers 创建正确尺寸图像重绘
84
+ if (low.endsWith(".svg")) {
85
+ mSave = gui.getClass().getDeclaredMethod("saveImageAsSVG", String.class);
86
+ mSave.setAccessible(true);
87
+ mSave.invoke(gui, outFile);
88
+ } else if (low.endsWith(".pdf")) {
89
+ mSave = gui.getClass().getMethod("saveImageAsPDF", String.class);
90
+ mSave.invoke(gui, outFile);
91
+ } else {
92
+ mSave = gui.getClass().getMethod("saveImageAsPNG", String.class);
93
+ mSave.invoke(gui, outFile);
94
+ }
95
+ System.err.println("[tbplot] 已保存: " + outFile);
96
+ System.exit(0);
97
+ }
98
+
99
+ /** 深度扫描:组件树 + 所有对象字段里的监听器,找 JJplot2GUI 类型字段的值 */
100
+ static Object scan(Object obj, java.util.Set<Object> visited) {
101
+ if (obj == null || visited.contains(obj)) return null;
102
+ visited.add(obj);
103
+ Class<?> cls = obj.getClass();
104
+ // 本身是 JJplot2GUI?
105
+ if (cls.getName().equals("jjplot2.JJplot2GUI")) return obj;
106
+ // 遍历所有字段(含私有/继承)
107
+ for (Class<?> c = cls; c != null && c != Object.class; c = c.getSuperclass()) {
108
+ for (Field f : c.getDeclaredFields()) {
109
+ try {
110
+ f.setAccessible(true);
111
+ Object v = f.get(obj);
112
+ if (v == null) continue;
113
+ if (v.getClass().getName().equals("jjplot2.JJplot2GUI")) return v;
114
+ // 递归:容器/监听器/集合里的对象
115
+ if (v instanceof Container || v instanceof java.awt.event.ActionListener
116
+ || v instanceof java.awt.event.MouseListener || v instanceof java.awt.event.MouseMotionListener
117
+ || v instanceof java.util.Collection || v instanceof java.util.Map
118
+ || v.getClass().getName().startsWith("JJpolt2.Example.DualSyntenyPlotterAdvance$")) {
119
+ Object found = scan(v, visited);
120
+ if (found != null) return found;
121
+ }
122
+ } catch (Exception e) { /* ignore */ }
123
+ }
124
+ }
125
+ // 递归子组件
126
+ if (obj instanceof Container) {
127
+ for (Component comp : ((Container) obj).getComponents()) {
128
+ Object found = scan(comp, visited);
129
+ if (found != null) return found;
130
+ }
131
+ }
132
+ // 监听器数组(getListeners)
133
+ if (obj instanceof Component) {
134
+ try {
135
+ Method gL = obj.getClass().getMethod("getListeners", Class.class);
136
+ java.util.EventListener[] ls = (java.util.EventListener[]) gL.invoke(obj, java.util.EventListener.class);
137
+ if (ls != null) {
138
+ for (java.util.EventListener l : ls) {
139
+ Object found = scan(l, visited);
140
+ if (found != null) return found;
141
+ }
142
+ }
143
+ } catch (Exception e) { /* ignore */ }
144
+ }
145
+ return null;
146
+ }
147
+ }
@@ -0,0 +1,39 @@
1
+ /**
2
+ * tbplot eggnog — eggNOG-mapper 直系同源注释 CLI(GUI 面板逆向接口,09/20)
3
+ *
4
+ * 用法: EggnogCli <in.fa> -o <prefix> --output_dir <outDir> --data_dir <eggNOGdb> [--dmnd_db <db>] [--cpu N] [--evalue 0.001] [--override] [其他官方参数...]
5
+ *
6
+ * 接口来源:反编译 EggnogMapperGUIPanel.onStart()(GUI 真实调用链)——
7
+ * CliArgs cli = CliParser.parse(args);
8
+ * EmapperPipeline pipeline = new EmapperPipeline(cli);
9
+ * pipeline.run();
10
+ * GUI 传参(11 项):-m diamond -i <in.fa> -o <prefix> --output_dir <outDir>
11
+ * --data_dir <dataDir> --dmnd_db <dmndPath> --cpu <n> --evalue <e> --override
12
+ *
13
+ * ⚠️ 前置:eggNOG 数据库需先就位(TBtools GUI 的 EggnogDbProvider 走飞纪盘
14
+ * 分片下载且依赖 Swing 确认框——headless 不可用)。数据库目录结构:
15
+ * <data_dir>/<taxScope>/eggnog.db + <taxScope>.dmnd + taxa 文件
16
+ * (也可用官方 eggNOG-mapper 的 eggNOG_db 目录,经 --eggnog_db/--tax_db 指定)
17
+ */
18
+ public class EggnogCli {
19
+ public static void main(String[] args) throws Exception {
20
+ if (args.length == 0) {
21
+ System.err.println("用法: EggnogCli <in.fa> -o <prefix> --output_dir <outDir> --data_dir <eggNOGdb> [--dmnd_db <db>] [--cpu N] [--evalue 0.001] [--override]");
22
+ System.err.println(" 传参方式与 GUI 完全一致(-m diamond 为默认模式)");
23
+ System.exit(1);
24
+ }
25
+ eggnogmapper.cli.CliArgs cli = eggnogmapper.cli.CliParser.parse(args);
26
+ if (cli.help) {
27
+ eggnogmapper.cli.CliParser.printHelp();
28
+ System.exit(0);
29
+ }
30
+ if (cli.inputPath == null) {
31
+ System.err.println("❌ 缺少输入文件(-i <in.fa>)");
32
+ System.exit(1);
33
+ }
34
+ eggnogmapper.emapper.EmapperPipeline pipeline = new eggnogmapper.emapper.EmapperPipeline(cli);
35
+ pipeline.run();
36
+ System.err.println("[tbplot] eggNOG-mapper 完成");
37
+ System.exit(0);
38
+ }
39
+ }
@@ -0,0 +1,27 @@
1
+ import java.io.File;
2
+
3
+ /**
4
+ * tbplot exprCorr — 表达相关矩阵 CLI(08/29,第 60 引擎)
5
+ *
6
+ * 用法: ExprCorrCli <inFPKM> <outCorrMat>
7
+ * inFPKM: 表达矩阵(首列基因名 + 样本列)
8
+ * outCorrMat: 样本间 Pearson 相关矩阵(共表达/聚类分析输入)
9
+ *
10
+ * ⚠️ main() 硬编码路径——改走 setInFPKM/setOutCorrMat + process()。
11
+ */
12
+ public class ExprCorrCli {
13
+ public static void main(String[] args) throws Exception {
14
+ if (args.length < 2) {
15
+ System.err.println("用法: ExprCorrCli <inFPKM> <outCorrMat>");
16
+ System.exit(1);
17
+ }
18
+ Object o = Class.forName("biocjava.bioDoer.Table.ExpressionCorr")
19
+ .getDeclaredConstructor().newInstance();
20
+ Class<?> c = o.getClass();
21
+ c.getMethod("setInFPKM", File.class).invoke(o, new File(args[0]));
22
+ c.getMethod("setOutCorrMat", File.class).invoke(o, new File(args[1]));
23
+ c.getMethod("process").invoke(o);
24
+ System.err.println("[tbplot] 表达相关矩阵完成: " + args[1]);
25
+ System.exit(0);
26
+ }
27
+ }
@@ -0,0 +1,36 @@
1
+ import biocjava.bioDoer.Fasta.FastaMergerAndSpliter;
2
+
3
+ import java.io.File;
4
+ import java.util.ArrayList;
5
+
6
+ /**
7
+ * tbplot famerge — 多 FASTA 合并 CLI(GUI 逆向 #33,09/20)
8
+ *
9
+ * 用法: FastaMergerCli <out.fa> <in1.fa> <in2.fa> [in3.fa ...]
10
+ * out: 合并输出
11
+ * inN: 输入 FASTA 列表(≥1 个)
12
+ *
13
+ * 引擎: FastaMergerAndSpliter.Merge(ArrayList, String)(GUI 逆向:
14
+ * FastaMergeAndSplitGUIPanel $3 mergedStartButton 回调;
15
+ * 面板还有 QuickSpiltFasta 拆分 → 已由 fasplit direct 覆盖)
16
+ */
17
+ public class FastaMergerCli {
18
+ public static void main(String[] args) throws Exception {
19
+ if (args.length < 2) {
20
+ System.err.println("用法: FastaMergerCli <out.fa> <in1.fa> <in2.fa> [in3.fa ...]");
21
+ System.exit(1);
22
+ }
23
+ String outFile = args[0];
24
+ ArrayList<String> inList = new ArrayList<String>();
25
+ for (int i = 1; i < args.length; i++) {
26
+ if (!new File(args[i]).exists()) {
27
+ System.err.println("错误: 输入文件不存在: " + args[i]);
28
+ System.exit(2);
29
+ }
30
+ inList.add(args[i]);
31
+ }
32
+ FastaMergerAndSpliter.Merge(inList, outFile);
33
+ System.err.println("[tbplot] 合并完成: " + inList.size() + " 个文件 → " + outFile);
34
+ System.exit(0);
35
+ }
36
+ }
@@ -0,0 +1,38 @@
1
+ import biocjava.bioDoer.Fasta.Tools.FastaTable;
2
+
3
+ import java.io.File;
4
+
5
+ /**
6
+ * tbplot fa2tab / tab2fa — FASTA↔表格互转 CLI(GUI 逆向 #26,09/20)
7
+ *
8
+ * 用法: FastaTableConvertCli <fa2tab|tab2fa> <in> <out>
9
+ * fa2tab: FASTA → 表格(ID\t序列)
10
+ * tab2fa: 表格 → FASTA
11
+ *
12
+ * 引擎: FastaTable 双向静态方法(GUI 逆向:Fasta2TableGUIPanel $3
13
+ * fasta2tabRadioButton/tab2fastaRadioButton 单选,main() 无 ArgsParser)
14
+ */
15
+ public class FastaTableConvertCli {
16
+ public static void main(String[] args) throws Exception {
17
+ if (args.length < 3) {
18
+ System.err.println("用法: FastaTableConvertCli <fa2tab|tab2fa> <in> <out>");
19
+ System.exit(1);
20
+ }
21
+ String mode = args[0];
22
+ File inFile = new File(args[1]);
23
+ File outFile = new File(args[2]);
24
+ if (!inFile.exists()) {
25
+ System.err.println("错误: 输入文件不存在: " + inFile.getAbsolutePath());
26
+ System.exit(2);
27
+ }
28
+ switch (mode) {
29
+ case "fa2tab": FastaTable.fa2tab(inFile, outFile); break;
30
+ case "tab2fa": FastaTable.tab2fa(inFile, outFile); break;
31
+ default:
32
+ System.err.println("错误: 未知模式 " + mode + "(可选 fa2tab|tab2fa)");
33
+ System.exit(1);
34
+ }
35
+ System.err.println("[tbplot] FASTA↔表转换完成(" + mode + "): " + outFile.getAbsolutePath());
36
+ System.exit(0);
37
+ }
38
+ }
@@ -0,0 +1,31 @@
1
+ import biocjava.bioDoer.FileCleaner;
2
+
3
+ import java.io.File;
4
+
5
+ /**
6
+ * tbplot clearchar — 文件非法字符清理 CLI(GUI 逆向 #34,09/20)
7
+ *
8
+ * 用法: FileCleanerCli <in.txt> <out.txt>
9
+ * in: 任意文本文件
10
+ * out: 清理后文件(非可打印 ASCII/非 tab 字符替换为 _;空白行跳过)
11
+ *
12
+ * 引擎: FileCleaner.simplifyFile(GUI 逆向:InvalidCharCleanerGUIPanel $3;
13
+ * 逐行扫描,保留 tab 与 0x20~0x7E,其余→_,非法字符逐行报告 stderr)
14
+ */
15
+ public class FileCleanerCli {
16
+ public static void main(String[] args) throws Exception {
17
+ if (args.length < 2) {
18
+ System.err.println("用法: FileCleanerCli <in.txt> <out.txt>");
19
+ System.exit(1);
20
+ }
21
+ File inFile = new File(args[0]);
22
+ File outFile = new File(args[1]);
23
+ if (!inFile.exists()) {
24
+ System.err.println("错误: 输入文件不存在: " + inFile.getAbsolutePath());
25
+ System.exit(2);
26
+ }
27
+ FileCleaner.simplifyFile(inFile, outFile);
28
+ System.err.println("[tbplot] 清理完成: " + outFile.getAbsolutePath());
29
+ System.exit(0);
30
+ }
31
+ }
@@ -0,0 +1,15 @@
1
+ import biocjava.bioDoer.FileUtils.FileLineSplit;
2
+ import java.io.File;
3
+ /**
4
+ * tbcli filesplit — 文件按份数分割 CLI(工具 99)
5
+ * 用法: FileSplitCli <inFile> <numParts>
6
+ * 引擎: FileLineSplit.Split(File, int) 静态方法
7
+ */
8
+ public class FileSplitCli {
9
+ public static void main(String[] args) throws Exception {
10
+ if (args.length < 2) { System.err.println("用法: FileSplitCli <inFile> <numParts>"); System.exit(1); }
11
+ File[] parts = FileLineSplit.Split(new File(args[0]), Integer.parseInt(args[1]));
12
+ for (File p : parts) System.err.println("[tbplot] 生成: " + p.getAbsolutePath());
13
+ System.exit(0);
14
+ }
15
+ }
@@ -0,0 +1,71 @@
1
+ import java.io.File;
2
+ import java.lang.reflect.Method;
3
+
4
+ /**
5
+ * tbplot findBlockDual — 双基因组伪共线性区块搜索 CLI(08/29,第 50 引擎)
6
+ *
7
+ * 用法: FindBlockDualCli <queryGenome.fa> <query.gff> <subjectGenome.fa> <subject.gff> <queryId> <out.txt>
8
+ * queryGenome.fa / subjectGenome.fa : 两物种基因组 FASTA
9
+ * query.gff / subject.gff : 两物种 GFF/GXF 注释(含 mRNA 行)
10
+ * queryId : 查询基因 ID(mRNA ID,如 AT1G70000.2)
11
+ * out.txt : 伪共线性区块匹配结果
12
+ *
13
+ * 可选参数(默认值):
14
+ * --leftEdge N(5) --rightEdge N(5) --expand N(10) --threads N(2) --evalue 1e-5 --minIdentity 0.33 --bestHit N(10)
15
+ *
16
+ * ⚠️ FindBlockDual.main() 硬编码路径——改走完整 setter + process()。
17
+ * 内部用 blastp 找 query 侧边缘基因在 subject 侧的同源,推断共线性区块。
18
+ * ⚠️ 需真实双基因组数据验证(本地无拟南芥 TAIR10 对照数据)。
19
+ */
20
+ public class FindBlockDualCli {
21
+ public static void main(String[] args) throws Exception {
22
+ if (args.length < 6) {
23
+ System.err.println("用法: FindBlockDualCli <queryGenome.fa> <query.gff> <subjectGenome.fa> <subject.gff> <queryId> <out.txt> [--leftEdge N] [--rightEdge N] [--expand N] [--threads N] [--evalue X] [--minIdentity X] [--bestHit N]");
24
+ System.exit(1);
25
+ }
26
+ File qGenome = new File(args[0]);
27
+ File qGxf = new File(args[1]);
28
+ File sGenome = new File(args[2]);
29
+ File sGxf = new File(args[3]);
30
+ String queryId = args[4];
31
+ File out = new File(args[5]);
32
+ // 默认值(与引擎默认一致)
33
+ int left = 5, right = 5, expand = 10, threads = 2, bestHit = 10;
34
+ double evalue = 1.0e-5, minIdentity = 0.33;
35
+ for (int i = 6; i < args.length; i++) {
36
+ String a = args[i];
37
+ if (a.equals("--leftEdge") && i+1 < args.length) left = Integer.parseInt(args[++i]);
38
+ else if (a.equals("--rightEdge") && i+1 < args.length) right = Integer.parseInt(args[++i]);
39
+ else if (a.equals("--expand") && i+1 < args.length) expand = Integer.parseInt(args[++i]);
40
+ else if (a.equals("--threads") && i+1 < args.length) threads = Integer.parseInt(args[++i]);
41
+ else if (a.equals("--evalue") && i+1 < args.length) evalue = Double.parseDouble(args[++i]);
42
+ else if (a.equals("--minIdentity") && i+1 < args.length) minIdentity = Double.parseDouble(args[++i]);
43
+ else if (a.equals("--bestHit") && i+1 < args.length) bestHit = Integer.parseInt(args[++i]);
44
+ }
45
+ Object obj = Class.forName("biocjava.bioDoer.PseudoSyntenyBlock.FindBlockDual").getDeclaredConstructor().newInstance();
46
+ Class<?> cls = obj.getClass();
47
+ cls.getMethod("setInGenomeSequence_Query", File.class).invoke(obj, qGenome);
48
+ cls.getMethod("setInGxf_Query", File.class).invoke(obj, qGxf);
49
+ cls.getMethod("setInGenomeSequence_Subject", File.class).invoke(obj, sGenome);
50
+ cls.getMethod("setInGxf_Subject", File.class).invoke(obj, sGxf);
51
+ cls.getMethod("setQueryId", String.class).invoke(obj, queryId);
52
+ cls.getMethod("setOutMatchInfo", File.class).invoke(obj, out);
53
+ cls.getMethod("setLeftEdgeCount", int.class).invoke(obj, left);
54
+ cls.getMethod("setRightEdgeCount", int.class).invoke(obj, right);
55
+ cls.getMethod("setTargetEdgeExpandCount", int.class).invoke(obj, expand);
56
+ // numOfThread / evalue / minIdentity / retainBestHitNum 无公开 setter,用反射
57
+ try { cls.getMethod("setNumOfThread", int.class).invoke(obj, threads); } catch (NoSuchMethodException e) {}
58
+ try { cls.getMethod("setEvalue", double.class).invoke(obj, evalue); } catch (NoSuchMethodException e) {}
59
+ try { cls.getMethod("setSpecifiedMinIdentity", double.class).invoke(obj, minIdentity); } catch (NoSuchMethodException e) {}
60
+ try { cls.getMethod("setRetainBestHitNum", int.class).invoke(obj, bestHit); } catch (NoSuchMethodException e) {}
61
+ Method process = cls.getMethod("process");
62
+ String result = (String) process.invoke(obj);
63
+ if (result != null && !result.trim().isEmpty()) {
64
+ java.io.FileWriter fw = new java.io.FileWriter(out);
65
+ fw.write(result);
66
+ fw.close();
67
+ }
68
+ System.err.println("[tbplot] findBlockDual 完成: " + out);
69
+ System.exit(0);
70
+ }
71
+ }
@@ -0,0 +1,67 @@
1
+ import java.io.File;
2
+ import java.lang.reflect.Method;
3
+ import java.util.ArrayList;
4
+
5
+ /**
6
+ * tbplot findBlockMultiple — 多基因组伪共线性区块搜索 CLI(08/29,第 52 引擎)
7
+ *
8
+ * 用法: FindBlockMultipleCli <queryGenome.fa> <query.gff> <queryId> <out.txt> <sub1Genome.fa> <sub1.gff> [<sub2Genome.fa> <sub2.gff> ...] [--leftEdge N --rightEdge N --expand N --threads N]
9
+ * queryGenome.fa / query.gff : 查询物种基因组 + 注释
10
+ * queryId : 查询基因 ID(基因组中部,避开首个基因 get(-1) 边界 bug)
11
+ * out.txt : 区块结果(含 query + 各 subject 行)
12
+ * subNGenome.fa / subN.gff : 1 或多个比对物种(成对给出)
13
+ *
14
+ * ⚠️ main1() 硬编码路径——改走完整 setter + processMultipleGenome()。
15
+ * ⚠️ 大数据引擎:必须 -Djava.io.tmpdir=<磁盘>(/tmp=tmpfs 16G 会被 3GB 基因组 init 撑爆)。
16
+ *
17
+ * 例: FindBlockMultipleCli Cr.fa Cr.gff evm.model.Chr06.1064 out.txt Cs.fa Cs.gff Ni.fa Ni.gff
18
+ */
19
+ public class FindBlockMultipleCli {
20
+ public static void main(String[] args) throws Exception {
21
+ if (args.length < 7 || (args.length - 4) % 2 != 0) {
22
+ System.err.println("用法: FindBlockMultipleCli <queryGenome.fa> <query.gff> <queryId> <out.txt> <sub1Genome.fa> <sub1.gff> [<sub2Genome.fa> <sub2.gff> ...] [--leftEdge N --rightEdge N --expand N --threads N]");
23
+ System.exit(1);
24
+ }
25
+ File qGenome = new File(args[0]);
26
+ File qGxf = new File(args[1]);
27
+ String queryId = args[2];
28
+ File out = new File(args[3]);
29
+ ArrayList<File> subGenomes = new ArrayList<>();
30
+ ArrayList<File> subGxfs = new ArrayList<>();
31
+ int i = 4;
32
+ int left = 10, right = 10, expand = 15, threads = 8;
33
+ // 顺序解析:-- 开头=选项,否则是 subject 基因组/gff 对
34
+ while (i < args.length) {
35
+ String a = args[i];
36
+ if (a.equals("--leftEdge") && i+1 < args.length) { left = Integer.parseInt(args[++i]); i++; }
37
+ else if (a.equals("--rightEdge") && i+1 < args.length) { right = Integer.parseInt(args[++i]); i++; }
38
+ else if (a.equals("--expand") && i+1 < args.length) { expand = Integer.parseInt(args[++i]); i++; }
39
+ else if (a.equals("--threads") && i+1 < args.length) { threads = Integer.parseInt(args[++i]); i++; }
40
+ else if (a.startsWith("--")) { System.err.println("未知选项: " + a); System.exit(1); }
41
+ else {
42
+ if (i+1 >= args.length) { System.err.println("subject gff 缺失: " + a); System.exit(1); }
43
+ subGenomes.add(new File(a));
44
+ subGxfs.add(new File(args[i+1]));
45
+ i += 2;
46
+ }
47
+ }
48
+ if (subGenomes.isEmpty()) { System.err.println("至少需要一个 subject 基因组"); System.exit(1); }
49
+ Object obj = Class.forName("biocjava.bioDoer.PseudoSyntenyBlock.FindBlockMultiple")
50
+ .getDeclaredConstructor().newInstance();
51
+ Class<?> cls = obj.getClass();
52
+ cls.getMethod("setInGenomeSequence_Query", File.class).invoke(obj, qGenome);
53
+ cls.getMethod("setInGxf_Query", File.class).invoke(obj, qGxf);
54
+ cls.getMethod("setQueryId", String.class).invoke(obj, queryId);
55
+ cls.getMethod("setInSubjectGenomeFileArr", ArrayList.class).invoke(obj, subGenomes);
56
+ cls.getMethod("setInSubjectGxfFileArr", ArrayList.class).invoke(obj, subGxfs);
57
+ cls.getMethod("setOutResultFile", File.class).invoke(obj, out);
58
+ cls.getMethod("setLeftEdgeCount", int.class).invoke(obj, left);
59
+ cls.getMethod("setRightEdgeCount", int.class).invoke(obj, right);
60
+ cls.getMethod("setTargetEdgeExpandCount", int.class).invoke(obj, expand);
61
+ try { cls.getMethod("setNumOfThread", int.class).invoke(obj, threads); } catch (NoSuchMethodException e) {}
62
+ Method pm = cls.getMethod("processMultipleGenome");
63
+ pm.invoke(obj);
64
+ System.err.println("[tbplot] findBlockMultiple 完成: " + out);
65
+ System.exit(0);
66
+ }
67
+ }
@@ -0,0 +1,15 @@
1
+ import biocjava.bioDoer.JIGplotToolkit.Synteny.BloomSynteny.FindPathBySynteny;
2
+
3
+ /**
4
+ * tbcli findpath 桥 — 共线性基因块进化路径 CLI(08/31 第六十七波)
5
+ *
6
+ * 用法: FindPathCli --inGffArr <gff1,gff2,...> --inGenePairs <pairs> --inRegion <geneID> [--flankGeneNum N] [--highlightGene ID] --outGraph <out>
7
+ *
8
+ * ⚠️ FindPathBySynteny.main1 是完整 CLI,但 main 是硬编码演示 → 桥直接调 main1
9
+ */
10
+ public class FindPathCli {
11
+ public static void main(String[] args) throws Exception {
12
+ FindPathBySynteny.main1(args);
13
+ System.exit(0);
14
+ }
15
+ }
@@ -0,0 +1,33 @@
1
+ /**
2
+ * tbplot gsea — GO 预排序 GSEA 富集 CLI(插件 P00342 CLI 化)
3
+ *
4
+ * 用法: GSEAWrapperCli <go.obo> <query2go.tsv> <rank.rnk> <outDir>
5
+ * go.obo: GO OBO 数据库
6
+ * query2go.tsv: 基因→GO 注释(geneID\tGO:x,GO:y)
7
+ * rank.rnk: 预排序列表(geneID\tscore,按 score 排)
8
+ * outDir: 输出目录
9
+ *
10
+ * 引擎: GSEAWrapper.PreRankGSEA(插件 jar),setter + process()。
11
+ */
12
+ public class GSEAWrapperCli {
13
+ public static void main(String[] args) throws Exception {
14
+ if (args.length < 4) {
15
+ System.err.println("用法: GSEAWrapperCli <go.obo> <query2go.tsv> <rank.rnk> <outDir>");
16
+ System.exit(1);
17
+ }
18
+ java.io.File outDir = new java.io.File(args[3]);
19
+ if (!outDir.isDirectory() && !outDir.mkdirs()) {
20
+ System.err.println("❌ 无法创建输出目录: " + args[3]);
21
+ System.exit(1);
22
+ }
23
+ Object e = Class.forName("GSEAWrapper.PreRankGSEA").getDeclaredConstructor().newInstance();
24
+ Class<?> c = e.getClass();
25
+ c.getMethod("setInOboFile", java.io.File.class).invoke(e, new java.io.File(args[0]));
26
+ c.getMethod("setInQuery2GoFile", java.io.File.class).invoke(e, new java.io.File(args[1]));
27
+ c.getMethod("setInRankFile", java.io.File.class).invoke(e, new java.io.File(args[2]));
28
+ c.getMethod("setOutDir", java.io.File.class).invoke(e, outDir);
29
+ c.getMethod("process").invoke(e);
30
+ System.err.println("[tbplot] GSEA 完成: " + args[3]);
31
+ System.exit(0);
32
+ }
33
+ }