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.
- tbtools_cli/__init__.py +18 -0
- tbtools_cli/auto_commands.py +1149 -0
- tbtools_cli/cli.py +528 -0
- tbtools_cli/cli_load.py +352 -0
- tbtools_cli/cli_rpc.py +303 -0
- tbtools_cli/cli_tools_registry.py +93 -0
- tbtools_cli/cli_top.py +1160 -0
- tbtools_cli/command_metadata.json +4606 -0
- tbtools_cli/command_spec.py +382 -0
- tbtools_cli/config.example.toml +19 -0
- tbtools_cli/config.py +43 -0
- tbtools_cli/core.py +508 -0
- tbtools_cli/errors.py +38 -0
- tbtools_cli/presets.py +100 -0
- tbtools_cli/scenarios.py +92 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/AdmixtureCli.java +91 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/AmazingMetaCli.java +78 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/AssemblyRecommandCli.java +47 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/BamIndexCli.java +31 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/BamSortCli.java +43 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/BamStateCli.java +49 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/BarPlotterCli.java +18 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/BarplotCli.java +168 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/BatchVizMotifsCli.java +47 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/BlastXmlConvertCli.java +45 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/BlatExecutorCli.java +66 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/CalcRepeatCli.java +62 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/CalculateSimilarityCli.java +34 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/CddMotifCli.java +46 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/CircleGeneViewerCli.java +81 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/CircosCli.java +76 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/ColorSchemeCli.java +29 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/CtgGroupCli.java +29 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/CubeHeatmapCli.java +70 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/DeHistCli.java +46 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/DegramdomCli.java +33 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/DiffExpCli.java +44 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/DistanceCli.java +53 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/DualSynCli.java +147 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/EggnogCli.java +39 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/ExprCorrCli.java +27 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/FastaMergerCli.java +36 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/FastaTableConvertCli.java +38 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/FileCleanerCli.java +31 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/FileSplitCli.java +15 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/FindBlockDualCli.java +71 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/FindBlockMultipleCli.java +67 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/FindPathCli.java +15 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/GSEAWrapperCli.java +33 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/GenBank2FastaCli.java +32 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/GeneDensityCli.java +38 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/GeneLocGffCli.java +140 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/GeneStructureCli.java +90 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/GenericCli.java +177 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/GetENALinksCli.java +36 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/GetSubNewickTreeCli.java +50 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/GoEnrichCli.java +42 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/GoLevelCli.java +59 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/GroupedBarCli.java +95 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/GsaDiagCli.java +45 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/GxfFilterCli.java +39 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/GxfSortCli.java +23 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/HclustCli.java +43 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/HeatmapCli.java +89 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/HmmerSuiteCli.java +47 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/JgblocksCli.java +65 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/KeggEnrichCli.java +31 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/LayoutHeatmapCli.java +90 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/MCScanXCli.java +80 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/MCScanXFastCli.java +41 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/MSACli.java +46 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/MakeMotifCli.java +39 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/MarkerDesignCli.java +62 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/MarkerToolsCli.java +57 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/Mast2TabCli.java +27 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/MastCli.java +54 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/MastRunCli.java +39 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/Meme2TabCli.java +26 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/MemeCli.java +74 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/MemeRunCli.java +40 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/MgGxfCli.java +35 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/MicroSynCli.java +118 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/MirIdentifyCli.java +55 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/MotifCli.java +75 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/MotifPatternCli.java +67 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/MotifShiftCli.java +30 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/MountainPlotCli.java +44 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/MultiSuperHeatCli.java +64 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/NeedlemanWunschCli.java +76 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/PafGC.java +15 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/PafVizCli.java +67 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/PeakDistCli.java +58 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/Pep2CodonCli.java +26 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/PfamMotifCli.java +43 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/PhyloTreeCli.java +92 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/PileUpCli.java +55 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/PlantCAREResultClassifyCli.java +36 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/PubmedSearchCli.java +25 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/QpcrCli.java +69 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/QpcrDdctCli.java +28 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/QpcrProcCli.java +28 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/QuickGenomeDotCli.java +66 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/QuickProteinAnnoCli.java +34 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/QuickRunIQtreeCli.java +69 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/QuickTrimALCli.java +67 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/RNAplotCli.java +129 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/RegionBedToGFF3Cli.java +43 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/RegionDepthCli.java +29 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/SamBamCovCli.java +33 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/SeqConverterCli.java +17 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/SeqLenTrackCli.java +41 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/SeveralSpeciesCli.java +132 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/SimpleEnricherCli.java +44 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/SimpleHmmscanCli.java +32 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/SixFrameTranlaterCli.java +35 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/StructAnnoCompareCli.java +66 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/SubmitSMARTCli.java +30 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/SuperCircosCli.java +330 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/TableColManipCli.java +56 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/TableCollapseCli.java +33 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/TargetScoreCli.java +47 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/TauCalcCli.java +28 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/TaxonomyBatchCli.java +72 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/TreeCli.java +75 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/TreeRootingCli.java +30 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/TrimMSACli.java +33 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/UnrootedTreeCli.java +44 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/UpSetCli.java +90 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/Venn5Cli.java +60 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/Venn6Cli.java +65 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/ViolinCli.java +66 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/VisualizeCli.java +57 -0
- tbtools_cli-1.2.0.data/data/tbtools_cli/bridges/VizGFACli.java +39 -0
- tbtools_cli-1.2.0.dist-info/METADATA +504 -0
- tbtools_cli-1.2.0.dist-info/RECORD +139 -0
- tbtools_cli-1.2.0.dist-info/WHEEL +5 -0
- tbtools_cli-1.2.0.dist-info/entry_points.txt +2 -0
- tbtools_cli-1.2.0.dist-info/licenses/LICENSE +21 -0
- tbtools_cli-1.2.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import biocjava.bioDoer.JIGplotToolkit.Synteny.MicroSyntenicAdvance;
|
|
2
|
+
import biocjava.bioIO.GXF.gxfTree.Region;
|
|
3
|
+
import jigplot.engine.JIGBasePanel;
|
|
4
|
+
|
|
5
|
+
import java.awt.Component;
|
|
6
|
+
import java.awt.Container;
|
|
7
|
+
import java.awt.Window;
|
|
8
|
+
import java.io.File;
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* tbplot microsyn — TBtools 双基因组微共线性图 CLI(08/29 新增,第 31 引擎)
|
|
12
|
+
*
|
|
13
|
+
* 用法: MicroSynCli <gxf1> <gxf2> <collinearity> <out>
|
|
14
|
+
* [--chr1 LG03 --start1 13207612 --end1 13990030]
|
|
15
|
+
* [--chr2 chr08 --start2 10660849 --end2 11367883]
|
|
16
|
+
* [--highlight1 chr1:start:end] [--highlight2 chr2:start:end]
|
|
17
|
+
* gxf1/gxf2: 两物种 GFF/GXF 注释
|
|
18
|
+
* collinearity: MCScanX 输出(*.collinearity 文件)
|
|
19
|
+
* 区域默认取全基因范围(若不指定则自动)
|
|
20
|
+
*
|
|
21
|
+
* 引擎: MicroSyntenicAdvance(setInGxf/setInGxf2/setCollinerFile/setRegion/setRegion2 + process)
|
|
22
|
+
* 方案: 窗口遍历 —— process() 后遍历 Window 找 JIGBasePanel 再保存
|
|
23
|
+
*/
|
|
24
|
+
public class MicroSynCli {
|
|
25
|
+
public static void main(String[] args) throws Exception {
|
|
26
|
+
if (args.length < 4) {
|
|
27
|
+
System.err.println("用法: MicroSynCli <gxf1> <gxf2> <collinearity> <out> [--chr1 C --start1 S --end1 E --chr2 C --start2 S --end2 E]");
|
|
28
|
+
System.exit(1);
|
|
29
|
+
}
|
|
30
|
+
String gxf1 = args[0];
|
|
31
|
+
String gxf2 = args[1];
|
|
32
|
+
String collinear = args[2];
|
|
33
|
+
String outFile = args[3];
|
|
34
|
+
|
|
35
|
+
String chr1 = null, chr2 = null, start1 = null, end1 = null, start2 = null, end2 = null;
|
|
36
|
+
String hl1 = null, hl2 = null;
|
|
37
|
+
for (int i = 4; i < args.length; i++) {
|
|
38
|
+
switch (args[i]) {
|
|
39
|
+
case "--chr1": chr1 = args[++i]; break;
|
|
40
|
+
case "--start1": start1 = args[++i]; break;
|
|
41
|
+
case "--end1": end1 = args[++i]; break;
|
|
42
|
+
case "--chr2": chr2 = args[++i]; break;
|
|
43
|
+
case "--start2": start2 = args[++i]; break;
|
|
44
|
+
case "--end2": end2 = args[++i]; break;
|
|
45
|
+
case "--highlight1": hl1 = args[++i]; break;
|
|
46
|
+
case "--highlight2": hl2 = args[++i]; break;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// 若未指定区域,扫描 GXF 自动取 chr 范围(简化:用基因组坐标估算——从 GXF 找最后染色体并粗略范围)
|
|
51
|
+
Region region1 = new Region();
|
|
52
|
+
if (chr1 != null && start1 != null && end1 != null) {
|
|
53
|
+
region1.setChrId(chr1); region1.setStart(start1); region1.setEnd(end1);
|
|
54
|
+
} else {
|
|
55
|
+
// 需要从 GXF 提取——先尝试让引擎自动处理:设置空 region
|
|
56
|
+
region1.setChrId(""); region1.setStart("0"); region1.setEnd("0");
|
|
57
|
+
}
|
|
58
|
+
Region region2 = new Region();
|
|
59
|
+
if (chr2 != null && start2 != null && end2 != null) {
|
|
60
|
+
region2.setChrId(chr2); region2.setStart(start2); region2.setEnd(end2);
|
|
61
|
+
} else {
|
|
62
|
+
region2.setChrId(""); region2.setStart("0"); region2.setEnd("0");
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
MicroSyntenicAdvance msa = new MicroSyntenicAdvance();
|
|
66
|
+
msa.setInGxf(new File(gxf1));
|
|
67
|
+
msa.setInGxf2(new File(gxf2));
|
|
68
|
+
msa.setCollinerFile(new File(collinear));
|
|
69
|
+
msa.setRegion(region1);
|
|
70
|
+
msa.setRegion2(region2);
|
|
71
|
+
|
|
72
|
+
if (hl1 != null) {
|
|
73
|
+
String[] p = hl1.split(":");
|
|
74
|
+
Region hl = new Region();
|
|
75
|
+
hl.setChrId(p[0]); hl.setStart(p[1]); hl.setEnd(p[2]);
|
|
76
|
+
msa.setUpHighlightRegion(hl);
|
|
77
|
+
}
|
|
78
|
+
if (hl2 != null) {
|
|
79
|
+
String[] p = hl2.split(":");
|
|
80
|
+
Region hl = new Region();
|
|
81
|
+
hl.setChrId(p[0]); hl.setStart(p[1]); hl.setEnd(p[2]);
|
|
82
|
+
msa.setDownHighlightRegion(hl);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
msa.process(); // 内部弹窗
|
|
86
|
+
|
|
87
|
+
// 窗口遍历
|
|
88
|
+
JIGBasePanel panel = null;
|
|
89
|
+
Window[] windows = Window.getWindows();
|
|
90
|
+
System.err.println("[tbplot] 窗口数: " + windows.length);
|
|
91
|
+
for (Window w : windows) {
|
|
92
|
+
JIGBasePanel found = findBasePanel(w);
|
|
93
|
+
if (found != null) { panel = found; break; }
|
|
94
|
+
}
|
|
95
|
+
if (panel == null) {
|
|
96
|
+
System.err.println("错误: 未找到 JIGBasePanel");
|
|
97
|
+
System.exit(1);
|
|
98
|
+
}
|
|
99
|
+
String low = outFile.toLowerCase();
|
|
100
|
+
if (low.endsWith(".png")) panel.save2PNG(new File(outFile));
|
|
101
|
+
else if (low.endsWith(".pdf")) panel.save2PDF(new File(outFile));
|
|
102
|
+
else panel.save2SVG(new File(outFile));
|
|
103
|
+
System.err.println("[tbplot] 已保存: " + outFile);
|
|
104
|
+
System.exit(0);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
static JIGBasePanel findBasePanel(Component c) {
|
|
108
|
+
if (c instanceof JIGBasePanel) return (JIGBasePanel) c;
|
|
109
|
+
if (c instanceof Container) {
|
|
110
|
+
Component[] comps = ((Container) c).getComponents();
|
|
111
|
+
for (Component comp : comps) {
|
|
112
|
+
JIGBasePanel found = findBasePanel(comp);
|
|
113
|
+
if (found != null) return found;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return null;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import java.io.File;
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* tbplot mirIdentify — miRNA 前体鉴定 CLI(08/29,第 78 引擎)
|
|
5
|
+
*
|
|
6
|
+
* 用法: MirIdentifyCli <inGenome.fa> <inTargetSo.tsv> <outPredict> <outChecklog> [--checkARM BOTH|FIVE|THREE] [--maxAsy N] [--maxMatureAsy N] [--maxStarAsy N] [--maxBulge N]
|
|
7
|
+
* inGenome.fa : 参考基因组(HiC_scaffold 命名,如油茶 Co_chroms.fa)
|
|
8
|
+
* inTargetSo.tsv : TargetSo 引擎输出(mirnatarget 命令产物:miRNA target strand beg end score ...)
|
|
9
|
+
* outPredict : miRNA 前体预测表;outChecklog : 检查日志表
|
|
10
|
+
*
|
|
11
|
+
* ⚠️ 前体提取需要 RNAfold(检查 PATH);基因组大(2.7GB 级)需 -Xmx>=8g + -Djava.io.tmpdir=<磁盘>
|
|
12
|
+
* ⚠️ 靶标表 subject 染色体名必须与基因组 fasta 头匹配
|
|
13
|
+
*/
|
|
14
|
+
public class MirIdentifyCli {
|
|
15
|
+
public static void main(String[] args) throws Exception {
|
|
16
|
+
if (args.length < 4) {
|
|
17
|
+
System.err.println("用法: MirIdentifyCli <inGenome.fa> <inTargetSo.tsv> <outPredict> <outChecklog> [--checkARM BOTH|FIVE|THREE] [--maxAsy N] [--maxMatureAsy N] [--maxStarAsy N] [--maxBulge N]");
|
|
18
|
+
System.exit(1);
|
|
19
|
+
}
|
|
20
|
+
File genome = new File(args[0]);
|
|
21
|
+
File target = new File(args[1]);
|
|
22
|
+
File outPredict = new File(args[2]);
|
|
23
|
+
File outChecklog = new File(args[3]);
|
|
24
|
+
String checkARM = "BOTH";
|
|
25
|
+
int maxAsy = 1, maxMatureAsy = 1, maxStarAsy = 0, maxBulge = 2;
|
|
26
|
+
for (int i = 4; i < args.length; i++) {
|
|
27
|
+
if (args[i].equals("--checkARM") && i+1 < args.length) checkARM = args[++i];
|
|
28
|
+
else if (args[i].equals("--maxAsy") && i+1 < args.length) maxAsy = Integer.parseInt(args[++i]);
|
|
29
|
+
else if (args[i].equals("--maxMatureAsy") && i+1 < args.length) maxMatureAsy = Integer.parseInt(args[++i]);
|
|
30
|
+
else if (args[i].equals("--maxStarAsy") && i+1 < args.length) maxStarAsy = Integer.parseInt(args[++i]);
|
|
31
|
+
else if (args[i].equals("--maxBulge") && i+1 < args.length) maxBulge = Integer.parseInt(args[++i]);
|
|
32
|
+
}
|
|
33
|
+
Object o = Class.forName("biocjava.bioDoer.miRNA.MIRidentifierBasedOnTargetSoResult")
|
|
34
|
+
.getDeclaredConstructor().newInstance();
|
|
35
|
+
Class<?> c = o.getClass();
|
|
36
|
+
c.getMethod("setInGenomeFile", File.class).invoke(o, genome);
|
|
37
|
+
c.getMethod("setInTargetSoResultFile", File.class).invoke(o, target);
|
|
38
|
+
c.getMethod("setOutResult", File.class).invoke(o, outPredict);
|
|
39
|
+
c.getMethod("setCheckLogResult", File.class).invoke(o, outChecklog);
|
|
40
|
+
c.getMethod("setMaxAsy", int.class).invoke(o, maxAsy);
|
|
41
|
+
c.getMethod("setMaxMatureAsy", int.class).invoke(o, maxMatureAsy);
|
|
42
|
+
c.getMethod("setMaxStarAsy", int.class).invoke(o, maxStarAsy);
|
|
43
|
+
c.getMethod("setMaxBulge", int.class).invoke(o, maxBulge);
|
|
44
|
+
// ⚠️ ARM 枚举只写 Three/Five(驼峰),BOTH=不设置(null 默认)
|
|
45
|
+
if (!checkARM.equalsIgnoreCase("BOTH")) {
|
|
46
|
+
String armVal = checkARM.equalsIgnoreCase("THREE") ? "Three" : "Five";
|
|
47
|
+
c.getMethod("setCheckARM", Class.forName("biocjava.bioIO.RNAfold.FoldStructureAnalyzer$ARM"))
|
|
48
|
+
.invoke(o, Enum.valueOf((Class) Class.forName("biocjava.bioIO.RNAfold.FoldStructureAnalyzer$ARM"), armVal));
|
|
49
|
+
}
|
|
50
|
+
// ⚠️ 引擎主流程方法名是 preict()(拼写错误),不是 process()!
|
|
51
|
+
c.getMethod("preict").invoke(o);
|
|
52
|
+
System.err.println("[tbplot] miRNA 前体鉴定完成: " + outPredict);
|
|
53
|
+
System.exit(0);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import biocjava.bioDoer.MEME.DrawMotifPattern.DrawMotifPatternFromMEMEResult;
|
|
2
|
+
import jigplot.engine.JIGBasePanel;
|
|
3
|
+
import jigplot.engine.JIGSubPanel;
|
|
4
|
+
|
|
5
|
+
import java.io.BufferedReader;
|
|
6
|
+
import java.io.File;
|
|
7
|
+
import java.io.FileReader;
|
|
8
|
+
import java.util.ArrayList;
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* tbplot motif — TBtools Motif 分布图 CLI(08/29 重建)
|
|
12
|
+
*
|
|
13
|
+
* 用法: MotifCli <meme.xml> <idList.txt> <out.svg/png> [width] [height]
|
|
14
|
+
* meme.xml: MEME suite 输出(含 motif 定义)
|
|
15
|
+
* idList.txt: 序列 ID 列表(每行一个,指定画哪些序列)
|
|
16
|
+
* outFile: 输出 SVG/PNG
|
|
17
|
+
* width/height: 画布尺寸(默认 1200x600)
|
|
18
|
+
*
|
|
19
|
+
* 引擎: DrawMotifPatternFromMEMEResult
|
|
20
|
+
* 关键: setMaxMotif 设大避免 isTooMuchMotif 弹窗(headless 卡死)
|
|
21
|
+
* postGraph(null, basePanel) 返回 JIGSubPanel(第一参数 Newick 传 null)
|
|
22
|
+
*/
|
|
23
|
+
public class MotifCli {
|
|
24
|
+
public static void main(String[] args) throws Exception {
|
|
25
|
+
if (args.length < 3) {
|
|
26
|
+
System.err.println("用法: MotifCli <meme.xml> <idList.txt> <outFile> [width] [height]");
|
|
27
|
+
System.exit(1);
|
|
28
|
+
}
|
|
29
|
+
String memeFile = args[0];
|
|
30
|
+
String idFile = args[1];
|
|
31
|
+
String outFile = args[2];
|
|
32
|
+
int width = args.length > 3 ? Integer.parseInt(args[3]) : 1200;
|
|
33
|
+
int height = args.length > 4 ? Integer.parseInt(args[4]) : 600;
|
|
34
|
+
|
|
35
|
+
// 读取 ID 列表
|
|
36
|
+
ArrayList<String> idList = new ArrayList<String>();
|
|
37
|
+
BufferedReader br = new BufferedReader(new FileReader(idFile));
|
|
38
|
+
String line;
|
|
39
|
+
while ((line = br.readLine()) != null) {
|
|
40
|
+
line = line.trim();
|
|
41
|
+
if (!line.isEmpty() && !line.startsWith("#")) idList.add(line);
|
|
42
|
+
}
|
|
43
|
+
br.close();
|
|
44
|
+
if (idList.isEmpty()) {
|
|
45
|
+
System.err.println("警告: idList 为空,将绘制全部序列");
|
|
46
|
+
}
|
|
47
|
+
System.err.println("[tbplot] 目标序列数: " + idList.size());
|
|
48
|
+
|
|
49
|
+
DrawMotifPatternFromMEMEResult drawer = new DrawMotifPatternFromMEMEResult();
|
|
50
|
+
drawer.setInFile(new File(memeFile));
|
|
51
|
+
drawer.setMaxMotif(10000); // 关键:设大避免 isTooMuchMotif → JOptionPane → headless 卡死
|
|
52
|
+
if (!idList.isEmpty()) {
|
|
53
|
+
drawer.setDefinedRankOrSubSet(idList);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
JIGBasePanel base = new JIGBasePanel(width, height);
|
|
57
|
+
JIGSubPanel panel = drawer.postGraph(null, base);
|
|
58
|
+
if (panel == null) {
|
|
59
|
+
System.err.println("错误: postGraph 返回 null");
|
|
60
|
+
System.exit(1);
|
|
61
|
+
}
|
|
62
|
+
base.addSubPanel(panel);
|
|
63
|
+
|
|
64
|
+
String low = outFile.toLowerCase();
|
|
65
|
+
if (low.endsWith(".png")) {
|
|
66
|
+
base.save2PNG(new File(outFile));
|
|
67
|
+
} else if (low.endsWith(".pdf")) {
|
|
68
|
+
base.save2PDF(new File(outFile));
|
|
69
|
+
} else {
|
|
70
|
+
base.save2SVG(new File(outFile));
|
|
71
|
+
}
|
|
72
|
+
System.err.println("[tbplot] 已保存: " + outFile);
|
|
73
|
+
System.exit(0);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import jigplot.engine.JIGBasePanel;
|
|
2
|
+
import jigplot.engine.JIGSubPanel;
|
|
3
|
+
|
|
4
|
+
import java.io.File;
|
|
5
|
+
import java.lang.reflect.Method;
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* tbplot mpattern — MEME/MAST motif 图案标注图 CLI(GUI 面板逆向接口,09/20)
|
|
9
|
+
*
|
|
10
|
+
* 用法: MotifPatternCli <mast.xml> <out.svg> [--max-motif N] [--shape RoundRect|Rect|Oval]
|
|
11
|
+
* [--line Middle|Up|Down|Splice] [--gradient] [--show-num] [--width N] [--height N]
|
|
12
|
+
*
|
|
13
|
+
* 接口来源:反编译 MemeMastMotifPatternGUIPanel(GUI 真实调用链):
|
|
14
|
+
* DrawMotifPatternFromMEMEResult dmp = new ...;
|
|
15
|
+
* dmp.setInFile(mastXml); setMaxMotif(N); setGradient/setShowMotifNum/
|
|
16
|
+
* setMotifShape(MotifShape)/setLineStyle(LineStyle); [setSeqNotationInfo...]
|
|
17
|
+
* dmp.postGraph(); // 无参版尾部 GUI 弹窗
|
|
18
|
+
* 规避:postGraph(String, JIGBasePanel) 重载返回 JIGSubPanel → 自己保存
|
|
19
|
+
* (newickString 参数传空串即可,面板由调用方提供)。
|
|
20
|
+
*/
|
|
21
|
+
public class MotifPatternCli {
|
|
22
|
+
public static void main(String[] args) throws Exception {
|
|
23
|
+
int maxMotif = 20, width = 1200, height = 600;
|
|
24
|
+
String shape = "RoundRect", line = "Middle";
|
|
25
|
+
boolean gradient = false, showNum = false;
|
|
26
|
+
java.util.ArrayList<String> pos = new java.util.ArrayList<String>();
|
|
27
|
+
for (int i = 0; i < args.length; i++) {
|
|
28
|
+
if (args[i].equals("--max-motif") && i+1 < args.length) maxMotif = Integer.parseInt(args[++i]);
|
|
29
|
+
else if (args[i].equals("--shape") && i+1 < args.length) shape = args[++i];
|
|
30
|
+
else if (args[i].equals("--line") && i+1 < args.length) line = args[++i];
|
|
31
|
+
else if (args[i].equals("--gradient")) gradient = true;
|
|
32
|
+
else if (args[i].equals("--show-num")) showNum = true;
|
|
33
|
+
else if (args[i].equals("--width") && i+1 < args.length) width = Integer.parseInt(args[++i]);
|
|
34
|
+
else if (args[i].equals("--height") && i+1 < args.length) height = Integer.parseInt(args[++i]);
|
|
35
|
+
else pos.add(args[i]);
|
|
36
|
+
}
|
|
37
|
+
if (pos.size() < 2) {
|
|
38
|
+
System.err.println("用法: MotifPatternCli <mast.xml> <out.svg> [--max-motif N] [--shape RoundRect|Rect|Oval] [--line Middle|Up|Down|Splice] [--gradient] [--show-num]");
|
|
39
|
+
System.exit(1);
|
|
40
|
+
}
|
|
41
|
+
Object dmp = Class.forName("biocjava.bioDoer.MEME.DrawMotifPattern.DrawMotifPatternFromMEMEResult")
|
|
42
|
+
.getDeclaredConstructor().newInstance();
|
|
43
|
+
Class<?> c = dmp.getClass();
|
|
44
|
+
c.getMethod("setInFile", File.class).invoke(dmp, new File(pos.get(0)));
|
|
45
|
+
c.getMethod("setMaxMotif", int.class).invoke(dmp, Math.min(maxMotif, 20));
|
|
46
|
+
c.getMethod("setGradient", boolean.class).invoke(dmp, gradient);
|
|
47
|
+
c.getMethod("setShowMotifNum", boolean.class).invoke(dmp, showNum);
|
|
48
|
+
Class<?> ms = Class.forName("biocjava.bioDoer.MEME.DrawMotifPattern.DrawMotifPatternFromMEMEResult$MotifShape");
|
|
49
|
+
c.getMethod("setMotifShape", ms).invoke(dmp, Enum.valueOf((Class)ms, shape));
|
|
50
|
+
Class<?> ls = Class.forName("biocjava.bioDoer.MEME.DrawMotifPattern.DrawMotifPatternFromMEMEResult$LineStyle");
|
|
51
|
+
c.getMethod("setLineStyle", ls).invoke(dmp, Enum.valueOf((Class)ls, line));
|
|
52
|
+
JIGBasePanel base = new JIGBasePanel(width, height);
|
|
53
|
+
Object result = c.getMethod("postGraph", String.class, JIGBasePanel.class).invoke(dmp, "", base);
|
|
54
|
+
if (!(result instanceof JIGSubPanel)) {
|
|
55
|
+
System.err.println("❌ postGraph 未返回 JIGSubPanel");
|
|
56
|
+
System.exit(1);
|
|
57
|
+
}
|
|
58
|
+
base.addSubPanel((JIGSubPanel) result);
|
|
59
|
+
File outf = new File(pos.get(1));
|
|
60
|
+
String low = pos.get(1).toLowerCase();
|
|
61
|
+
if (low.endsWith(".png")) base.save2PNG(outf);
|
|
62
|
+
else if (low.endsWith(".pdf")) base.save2PDF(outf);
|
|
63
|
+
else base.save2SVG(outf);
|
|
64
|
+
System.err.println("[tbplot] 已保存: " + pos.get(1));
|
|
65
|
+
System.exit(0);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* tbplot tfbsShift — 植物 TF 结合 motif 偏移分析 CLI(插件 P00551 CLI 化)
|
|
3
|
+
*
|
|
4
|
+
* 用法: MotifShiftCli <query.pep> <outPrefix> [threads]
|
|
5
|
+
* query.pep: 待分析植物蛋白(TF 候选)
|
|
6
|
+
* outPrefix: 输出前缀(文件,非目录)
|
|
7
|
+
* threads: 线程数(默认 4)
|
|
8
|
+
*
|
|
9
|
+
* 引擎: motfiShift.MotifShift(插件 jar)。参考数据随插件发行:
|
|
10
|
+
* plugins/lib/plantTF/ath.pep(拟南芥 TF 蛋白集)
|
|
11
|
+
* plugins/lib/plantTF/binding.motifs(MEME 4.4 格式结合 motif 库)
|
|
12
|
+
*/
|
|
13
|
+
public class MotifShiftCli {
|
|
14
|
+
public static void main(String[] args) throws Exception {
|
|
15
|
+
if (args.length < 4) {
|
|
16
|
+
System.err.println("用法: MotifShiftCli <ath.pep> <binding.motifs> <query.pep> <outPrefix> [threads]");
|
|
17
|
+
System.exit(1);
|
|
18
|
+
}
|
|
19
|
+
Object e = Class.forName("motfiShift.MotifShift").getDeclaredConstructor().newInstance();
|
|
20
|
+
Class<?> c = e.getClass();
|
|
21
|
+
c.getMethod("setAthPep", java.io.File.class).invoke(e, new java.io.File(args[0]));
|
|
22
|
+
c.getMethod("setBindingMotifInfo", java.io.File.class).invoke(e, new java.io.File(args[1]));
|
|
23
|
+
c.getMethod("setQueryPep", java.io.File.class).invoke(e, new java.io.File(args[2]));
|
|
24
|
+
c.getMethod("setOutDirAndPrefix", java.io.File.class).invoke(e, new java.io.File(args[3]));
|
|
25
|
+
c.getMethod("setNumberOfThreads", String.class).invoke(e, args.length > 4 ? args[4] : "4");
|
|
26
|
+
c.getMethod("process").invoke(e);
|
|
27
|
+
System.err.println("[tbplot] TFBS motif shift 完成: " + args[3]);
|
|
28
|
+
System.exit(0);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import java.io.BufferedReader;
|
|
2
|
+
import java.io.FileReader;
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* tbplot mountain — TBtools RNA 山峰图数据 CLI(08/29,第 43 引擎)
|
|
6
|
+
*
|
|
7
|
+
* 用法: MountainPlotCli <fold.txt> <out.tsv>
|
|
8
|
+
* fold.txt: RNA 二级结构折叠字符串(() 和 . 表示),如 ".((((..))))"
|
|
9
|
+
* out.tsv: 每碱基位置的山峰高度(位置\t高度)
|
|
10
|
+
*
|
|
11
|
+
* 引擎: MountainPlot.process() 逻辑(fold 字符串→堆积高度)
|
|
12
|
+
*/
|
|
13
|
+
public class MountainPlotCli {
|
|
14
|
+
public static void main(String[] args) throws Exception {
|
|
15
|
+
if (args.length < 2) {
|
|
16
|
+
System.err.println("用法: MountainPlotCli <fold.txt> <out.tsv>");
|
|
17
|
+
System.exit(1);
|
|
18
|
+
}
|
|
19
|
+
// 读 fold 字符串(第一行非空)
|
|
20
|
+
BufferedReader br = new BufferedReader(new FileReader(args[0]));
|
|
21
|
+
String line;
|
|
22
|
+
String fold = null;
|
|
23
|
+
while ((line = br.readLine()) != null) {
|
|
24
|
+
String t = line.trim();
|
|
25
|
+
if (!t.isEmpty() && !t.startsWith(">")) { fold = t; break; }
|
|
26
|
+
}
|
|
27
|
+
br.close();
|
|
28
|
+
if (fold == null) { System.err.println("错误: 未找到 fold 字符串"); System.exit(1); }
|
|
29
|
+
// 计算山峰高度(模仿 MountainPlot.process)
|
|
30
|
+
StringBuilder sb = new StringBuilder();
|
|
31
|
+
int cummuHeight = 0;
|
|
32
|
+
for (int i = 0; i < fold.length(); i++) {
|
|
33
|
+
char c = fold.charAt(i);
|
|
34
|
+
if (c == '(') cummuHeight++;
|
|
35
|
+
else if (c == ')') cummuHeight--;
|
|
36
|
+
sb.append(i + 1).append('\t').append(cummuHeight).append('\n');
|
|
37
|
+
}
|
|
38
|
+
java.io.FileWriter fw = new java.io.FileWriter(args[1]);
|
|
39
|
+
fw.write(sb.toString());
|
|
40
|
+
fw.close();
|
|
41
|
+
System.err.println("[tbplot] 已保存: " + args[1]);
|
|
42
|
+
System.exit(0);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import biocjava.bioDoer.SimpleEfpBrowser.generateMultipleSuperHeatMap;
|
|
2
|
+
import jigplot.engine.JIGBasePanel;
|
|
3
|
+
|
|
4
|
+
import java.io.File;
|
|
5
|
+
import java.util.ArrayList;
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* tbplot multiEfp — TBtools 多矩阵组织表达热图 CLI(engine 110,08/31 攻克)
|
|
9
|
+
*
|
|
10
|
+
* 用法: MultiSuperHeatCli <inTGA> <sample2cc> <expMat1.tsv[,expMat2.tsv,...]> <geneId> <out> [--imageWidth N] [--imageHeight N]
|
|
11
|
+
* inTGA: 底图(植物/组织示意图,必须 TrueColor RGB 非灰度)
|
|
12
|
+
* sample2cc: SampleName\tRGB 映射
|
|
13
|
+
* expMat(逗号分隔): 首列基因名 + 样本列,可多个矩阵叠加
|
|
14
|
+
* geneId: 要可视化的基因
|
|
15
|
+
* out: .svg/.pdf/.png
|
|
16
|
+
*
|
|
17
|
+
* 引擎: generateMultipleSuperHeatMap
|
|
18
|
+
* main() 硬编码了第二个矩阵路径(ExpressData1.txt)→ 不能直接用 main
|
|
19
|
+
* 核心 API 完好:setter + private initExp()(反射)+ showHeatMapOf(geneId) → JIGBasePanel → save2SVG/PNG/PDF
|
|
20
|
+
* ⚠️ 需 fake DatatypeConverter(build/javax/xml/bind/,JDK9+ jaxb hack)
|
|
21
|
+
*/
|
|
22
|
+
public class MultiSuperHeatCli {
|
|
23
|
+
public static void main(String[] args) throws Exception {
|
|
24
|
+
if (args.length < 5) {
|
|
25
|
+
System.err.println("用法: MultiSuperHeatCli <inTGA> <sample2cc> <expMat1[,expMat2,...]> <geneId> <out> [--imageWidth N] [--imageHeight N]");
|
|
26
|
+
System.exit(1);
|
|
27
|
+
}
|
|
28
|
+
String inTGA = args[0], sample2cc = args[1], expMats = args[2], geneId = args[3], outFile = args[4];
|
|
29
|
+
int W = 0, H = 0;
|
|
30
|
+
for (int i = 5; i < args.length; i++) {
|
|
31
|
+
if (args[i].equals("--imageWidth") && i+1<args.length) W = Integer.parseInt(args[++i]);
|
|
32
|
+
else if (args[i].equals("--imageHeight") && i+1<args.length) H = Integer.parseInt(args[++i]);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
generateMultipleSuperHeatMap g = new generateMultipleSuperHeatMap();
|
|
36
|
+
g.setInTGAFile(new File(inTGA));
|
|
37
|
+
g.setSampleName2CodeFile(new File(sample2cc));
|
|
38
|
+
ArrayList<File> mats = new ArrayList<>();
|
|
39
|
+
for (String m : expMats.split(",")) {
|
|
40
|
+
if (!m.trim().isEmpty()) mats.add(new File(m.trim()));
|
|
41
|
+
}
|
|
42
|
+
g.setExpressMatrixFileArr(mats);
|
|
43
|
+
g.setOutImageFile(new File(outFile));
|
|
44
|
+
if (W > 0) g.setImageWidth(W);
|
|
45
|
+
if (H > 0) g.setImageHeight(H);
|
|
46
|
+
|
|
47
|
+
// private initExp() → 反射
|
|
48
|
+
java.lang.reflect.Method init = generateMultipleSuperHeatMap.class.getDeclaredMethod("initExp");
|
|
49
|
+
init.setAccessible(true);
|
|
50
|
+
init.invoke(g);
|
|
51
|
+
|
|
52
|
+
JIGBasePanel panel = g.showHeatMapOf(geneId);
|
|
53
|
+
if (panel == null) {
|
|
54
|
+
System.err.println("错误: showHeatMapOf 返回 null(基因 " + geneId + " 是否在矩阵中?)");
|
|
55
|
+
System.exit(1);
|
|
56
|
+
}
|
|
57
|
+
String low = outFile.toLowerCase();
|
|
58
|
+
if (low.endsWith(".png")) panel.save2PNG(new File(outFile));
|
|
59
|
+
else if (low.endsWith(".pdf")) panel.save2PDF(new File(outFile));
|
|
60
|
+
else panel.save2SVG(new File(outFile));
|
|
61
|
+
System.err.println("[tbplot] 已保存: " + outFile);
|
|
62
|
+
System.exit(0);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* tbplot nwalign — Needleman-Wunsch 全局比对 CLI(GUI 面板逆向接口,09/20)
|
|
3
|
+
*
|
|
4
|
+
* 用法: NeedlemanWunschCli <seq1.fa> <seq2.fa> <out> [--protein|--dna] [--format EMBOSS|FASTA]
|
|
5
|
+
* [--gap-open 10] [--gap-extend 0.5] [--end-gap-open 10] [--end-gap-extend 0.5] [--end-weight]
|
|
6
|
+
*
|
|
7
|
+
* 接口来源:反编译 NeedlemanWunschGUIPanel(GUI 真实调用链):
|
|
8
|
+
* NeedleManWunschAlign nmwa = new NeedleManWunschAlign(SeqType.Protein|DNA);
|
|
9
|
+
* nmwa.setxId/setyId/setxSeq/setySeq/setOutFormat/setGapOpen/setGapExtension/
|
|
10
|
+
* setEndGapOpen/setEndGapExtend/setEndWeight;
|
|
11
|
+
* FileUtils.stringToFile(nmwa.align().toString(), out);
|
|
12
|
+
* 输入:两条单序列 FASTA(仅取每条的第一条序列)。
|
|
13
|
+
* 输出:EMBOSS/FASTA 格式比对文本。
|
|
14
|
+
*/
|
|
15
|
+
public class NeedlemanWunschCli {
|
|
16
|
+
public static void main(String[] args) throws Exception {
|
|
17
|
+
if (args.length < 3) {
|
|
18
|
+
System.err.println("用法: NeedlemanWunschCli <seq1.fa> <seq2.fa> <out> [--protein|--dna] [--format EMBOSS|FASTA] [--gap-open N] [--gap-extend N] [--end-gap-open N] [--end-gap-extend N] [--end-weight]");
|
|
19
|
+
System.exit(1);
|
|
20
|
+
}
|
|
21
|
+
boolean protein = false, dna = false, endWeight = false;
|
|
22
|
+
String fmt = "EMBOSS";
|
|
23
|
+
float gapOpen = 10f, gapExtend = 0.5f, endGapOpen = 10f, endGapExtend = 0.5f;
|
|
24
|
+
for (int i = 3; i < args.length; i++) {
|
|
25
|
+
if (args[i].equals("--protein")) protein = true;
|
|
26
|
+
else if (args[i].equals("--dna")) dna = true;
|
|
27
|
+
else if (args[i].equals("--format") && i+1 < args.length) fmt = args[++i].toUpperCase();
|
|
28
|
+
else if (args[i].equals("--gap-open") && i+1 < args.length) gapOpen = Float.parseFloat(args[++i]);
|
|
29
|
+
else if (args[i].equals("--gap-extend") && i+1 < args.length) gapExtend = Float.parseFloat(args[++i]);
|
|
30
|
+
else if (args[i].equals("--end-gap-open") && i+1 < args.length) endGapOpen = Float.parseFloat(args[++i]);
|
|
31
|
+
else if (args[i].equals("--end-gap-extend") && i+1 < args.length) endGapExtend = Float.parseFloat(args[++i]);
|
|
32
|
+
else if (args[i].equals("--end-weight")) endWeight = true;
|
|
33
|
+
}
|
|
34
|
+
Seq s1 = readFirst(args[0]), s2 = readFirst(args[1]);
|
|
35
|
+
Class<?> seqType = Class.forName("biocjava.bioDoer.Aligner.NeedleMan.NeedleManWunschAlign$SeqType");
|
|
36
|
+
Object tp = protein ? Enum.valueOf((Class)seqType, "Protein")
|
|
37
|
+
: dna ? Enum.valueOf((Class)seqType, "DNA")
|
|
38
|
+
: Enum.valueOf((Class)seqType, "Protein");
|
|
39
|
+
Class<?> alnCls = Class.forName("biocjava.bioDoer.Aligner.NeedleMan.NeedleManWunschAlign");
|
|
40
|
+
Object nmwa = alnCls.getConstructor(seqType).newInstance(tp);
|
|
41
|
+
Class<?> fmtCls = Class.forName("biocjava.bioDoer.Aligner.NeedleMan.NeedleManWunschAlign$ALNFORMAT");
|
|
42
|
+
Object fmtEnum = Enum.valueOf((Class)fmtCls, fmt);
|
|
43
|
+
alnCls.getMethod("setxId", String.class).invoke(nmwa, s1.id);
|
|
44
|
+
alnCls.getMethod("setyId", String.class).invoke(nmwa, s2.id);
|
|
45
|
+
alnCls.getMethod("setxSeq", String.class).invoke(nmwa, s1.seq);
|
|
46
|
+
alnCls.getMethod("setySeq", String.class).invoke(nmwa, s2.seq);
|
|
47
|
+
alnCls.getMethod("setOutFormat", fmtCls).invoke(nmwa, fmtEnum);
|
|
48
|
+
alnCls.getMethod("setGapOpen", float.class).invoke(nmwa, gapOpen);
|
|
49
|
+
alnCls.getMethod("setGapExtension", float.class).invoke(nmwa, gapExtend);
|
|
50
|
+
alnCls.getMethod("setEndGapOpen", float.class).invoke(nmwa, endGapOpen);
|
|
51
|
+
alnCls.getMethod("setEndGapExtend", float.class).invoke(nmwa, endGapExtend);
|
|
52
|
+
alnCls.getMethod("setEndWeight", boolean.class).invoke(nmwa, endWeight);
|
|
53
|
+
Object result = alnCls.getMethod("align").invoke(nmwa);
|
|
54
|
+
String text = result.toString();
|
|
55
|
+
java.io.FileWriter fw = new java.io.FileWriter(args[2]);
|
|
56
|
+
fw.write(text); fw.close();
|
|
57
|
+
System.err.println("[tbplot] 已保存: " + args[2] + " (" + text.length() + " 字符)");
|
|
58
|
+
System.exit(0);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
static class Seq { String id, seq; }
|
|
62
|
+
static Seq readFirst(String path) throws Exception {
|
|
63
|
+
java.io.BufferedReader br = new java.io.BufferedReader(new java.io.FileReader(path));
|
|
64
|
+
String id = null; StringBuilder sb = new StringBuilder(); String line;
|
|
65
|
+
while ((line = br.readLine()) != null) {
|
|
66
|
+
line = line.trim();
|
|
67
|
+
if (line.isEmpty()) continue;
|
|
68
|
+
if (line.startsWith(">")) { if (id == null) id = line.substring(1).trim(); continue; }
|
|
69
|
+
if (id != null) sb.append(line);
|
|
70
|
+
}
|
|
71
|
+
br.close();
|
|
72
|
+
if (id == null) throw new Exception("输入不是 FASTA: " + path);
|
|
73
|
+
Seq s = new Seq(); s.id = id; s.seq = sb.toString();
|
|
74
|
+
return s;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import biocjava.bioDoer.JIGplotToolkit.Paf.PafGenomeComp;
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* tbplot pafcomp — TBtools PAF 基因组比较图 CLI(08/29,第 38 引擎)
|
|
5
|
+
*
|
|
6
|
+
* 用法: PafGC <--inPaf paf> <--outGraph out> [--colorMode Target|Query|None] [--size N] [--colorSeed N] [--switchQnT] [--minLen N]
|
|
7
|
+
*
|
|
8
|
+
* ⚠️ 入口是 main1(不是 main)——main 不 setInPaf 用默认路径;main1 完整 ArgsParser + quickSave
|
|
9
|
+
*/
|
|
10
|
+
public class PafGC {
|
|
11
|
+
public static void main(String[] args) throws Exception {
|
|
12
|
+
java.lang.reflect.Method m = PafGenomeComp.class.getMethod("main1", String[].class);
|
|
13
|
+
m.invoke(null, (Object) args);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import jigplot.engine.JIGBasePanel;
|
|
2
|
+
import jigplot.engine.JIGSubPanel;
|
|
3
|
+
|
|
4
|
+
import java.io.File;
|
|
5
|
+
import java.lang.reflect.Method;
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* tbplot pafviz — PAF 基因组比对可视化 CLI(GUI 面板逆向接口,09/20)
|
|
9
|
+
*
|
|
10
|
+
* 用法: PafVizCli <in.paf> <out.svg> [--graph-size N] [--color Target|Query|None]
|
|
11
|
+
* [--seed N] [--min-len N] [--switch-qnt] [--rc-color] [--width N] [--height N]
|
|
12
|
+
*
|
|
13
|
+
* 接口来源:反编译 PAFVizGUIPanel(GUI 真实调用链):
|
|
14
|
+
* PafViz pv = new PafViz();
|
|
15
|
+
* pv.setInPaf/setGraphSize/setCurColorMode/setColorRandSeed/setMinAlnLen/
|
|
16
|
+
* setSwitchQnT/setRcColor;
|
|
17
|
+
* pv.viz_process(); // 尾部 quickShow GUI 弹窗(headless 崩)
|
|
18
|
+
* 规避:viz_process = process()(public,返回 JIGSubPanel)+ quickShow。
|
|
19
|
+
* 直调 process() 拿 panel → JIGBasePanel.save2* 保存(同 qdot/DeHist 模式)。
|
|
20
|
+
*/
|
|
21
|
+
public class PafVizCli {
|
|
22
|
+
public static void main(String[] args) throws Exception {
|
|
23
|
+
if (args.length < 2) {
|
|
24
|
+
System.err.println("用法: PafVizCli <in.paf> <out.svg> [--graph-size N] [--color Target|Query|None] [--seed N] [--min-len N] [--switch-qnt] [--rc-color] [--width N] [--height N]");
|
|
25
|
+
System.exit(1);
|
|
26
|
+
}
|
|
27
|
+
int graphSize = 600, seed = 1, minLen = 0, width = 1200, height = 800;
|
|
28
|
+
String color = "Target";
|
|
29
|
+
boolean switchQnT = false, rcColor = false;
|
|
30
|
+
for (int i = 2; i < args.length; i++) {
|
|
31
|
+
if (args[i].equals("--graph-size") && i+1 < args.length) graphSize = Integer.parseInt(args[++i]);
|
|
32
|
+
else if (args[i].equals("--color") && i+1 < args.length) color = args[++i];
|
|
33
|
+
else if (args[i].equals("--seed") && i+1 < args.length) seed = Integer.parseInt(args[++i]);
|
|
34
|
+
else if (args[i].equals("--min-len") && i+1 < args.length) minLen = Integer.parseInt(args[++i]);
|
|
35
|
+
else if (args[i].equals("--width") && i+1 < args.length) width = Integer.parseInt(args[++i]);
|
|
36
|
+
else if (args[i].equals("--height") && i+1 < args.length) height = Integer.parseInt(args[++i]);
|
|
37
|
+
else if (args[i].equals("--switch-qnt")) switchQnT = true;
|
|
38
|
+
else if (args[i].equals("--rc-color")) rcColor = true;
|
|
39
|
+
}
|
|
40
|
+
Object pv = Class.forName("biocjava.bioDoer.JIGplotToolkit.Paf.PafViz").getDeclaredConstructor().newInstance();
|
|
41
|
+
Class<?> c = pv.getClass();
|
|
42
|
+
c.getMethod("setInPaf", File.class).invoke(pv, new File(args[0]));
|
|
43
|
+
c.getMethod("setGraphSize", int.class).invoke(pv, graphSize);
|
|
44
|
+
Class<?> cm = Class.forName("biocjava.bioDoer.JIGplotToolkit.Paf.PafViz$ColorMode");
|
|
45
|
+
Object cmEnum = Enum.valueOf((Class)cm, color);
|
|
46
|
+
c.getMethod("setCurColorMode", cm).invoke(pv, cmEnum);
|
|
47
|
+
c.getMethod("setColorRandSeed", int.class).invoke(pv, seed);
|
|
48
|
+
c.getMethod("setMinAlnLen", int.class).invoke(pv, minLen);
|
|
49
|
+
c.getMethod("setSwitchQnT", boolean.class).invoke(pv, switchQnT);
|
|
50
|
+
c.getMethod("setRcColor", boolean.class).invoke(pv, rcColor);
|
|
51
|
+
Method process = c.getMethod("process");
|
|
52
|
+
Object result = process.invoke(pv);
|
|
53
|
+
if (!(result instanceof JIGSubPanel)) {
|
|
54
|
+
System.err.println("❌ process 未返回 JIGSubPanel");
|
|
55
|
+
System.exit(1);
|
|
56
|
+
}
|
|
57
|
+
JIGBasePanel base = new JIGBasePanel(width, height);
|
|
58
|
+
base.addSubPanel((JIGSubPanel) result);
|
|
59
|
+
File outf = new File(args[1]);
|
|
60
|
+
String low = args[1].toLowerCase();
|
|
61
|
+
if (low.endsWith(".png")) base.save2PNG(outf);
|
|
62
|
+
else if (low.endsWith(".pdf")) base.save2PDF(outf);
|
|
63
|
+
else base.save2SVG(outf);
|
|
64
|
+
System.err.println("[tbplot] 已保存: " + args[1]);
|
|
65
|
+
System.exit(0);
|
|
66
|
+
}
|
|
67
|
+
}
|