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,58 @@
|
|
|
1
|
+
import biocjava.bioDoer.JIGplotToolkit.MACS2viz.peakDistribution;
|
|
2
|
+
import jigplot.engine.JIGBasePanel;
|
|
3
|
+
import jigplot.engine.JIGSubPanel;
|
|
4
|
+
|
|
5
|
+
import java.io.File;
|
|
6
|
+
import java.lang.reflect.Method;
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* tbplot peakdist — TBtools Peak 染色体分布图 CLI(08/29 新增,第 26 引擎)
|
|
10
|
+
*
|
|
11
|
+
* 用法: PeakDistCli <chrLen.tsv> <macs2_peak.xls> <out> [--chrHeight H] [--topLenRank N] [--width W] [--height H]
|
|
12
|
+
* chrLen.tsv: Chr\tLength(染色体长度)
|
|
13
|
+
* macs2_peak.xls: MACS2 peaks 表格(chr/start/end 列)
|
|
14
|
+
*
|
|
15
|
+
* 引擎: peakDistribution(process() 是 private,用反射 setAccessible 调用)
|
|
16
|
+
* setInChrLen + setInMACS2Peak + process() -> JIGSubPanel -> save2Graph
|
|
17
|
+
*/
|
|
18
|
+
public class PeakDistCli {
|
|
19
|
+
public static void main(String[] args) throws Exception {
|
|
20
|
+
if (args.length < 3) {
|
|
21
|
+
System.err.println("用法: PeakDistCli <chrLen.tsv> <macs2_peak.xls> <out> [--chrHeight H] [--topLenRank N] [--width W] [--height H]");
|
|
22
|
+
System.exit(1);
|
|
23
|
+
}
|
|
24
|
+
String chrLenFile = args[0];
|
|
25
|
+
String peakFile = args[1];
|
|
26
|
+
String outFile = args[2];
|
|
27
|
+
double chrHeight = 0.3;
|
|
28
|
+
int topLenRank = 12;
|
|
29
|
+
int width = 1000, height = 800;
|
|
30
|
+
for (int i = 3; i < args.length; i++) {
|
|
31
|
+
if (args[i].equals("--chrHeight") && i+1<args.length) chrHeight = Double.parseDouble(args[++i]);
|
|
32
|
+
else if (args[i].equals("--topLenRank") && i+1<args.length) topLenRank = Integer.parseInt(args[++i]);
|
|
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
|
+
}
|
|
36
|
+
|
|
37
|
+
peakDistribution pd = new peakDistribution();
|
|
38
|
+
pd.setInChrLen(new File(chrLenFile));
|
|
39
|
+
pd.setInMACS2Peak(new File(peakFile));
|
|
40
|
+
// process() 是 private,反射调用
|
|
41
|
+
Method m = peakDistribution.class.getDeclaredMethod("process");
|
|
42
|
+
m.setAccessible(true);
|
|
43
|
+
JIGSubPanel panel = (JIGSubPanel) m.invoke(pd);
|
|
44
|
+
if (panel == null) {
|
|
45
|
+
System.err.println("错误: process() 返回 null");
|
|
46
|
+
System.exit(1);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
JIGBasePanel base = new JIGBasePanel(width, height);
|
|
50
|
+
base.addSubPanel(panel);
|
|
51
|
+
String low = outFile.toLowerCase();
|
|
52
|
+
if (low.endsWith(".png")) base.save2PNG(new File(outFile));
|
|
53
|
+
else if (low.endsWith(".pdf")) base.save2PDF(new File(outFile));
|
|
54
|
+
else base.save2SVG(new File(outFile));
|
|
55
|
+
System.err.println("[tbplot] 已保存: " + outFile);
|
|
56
|
+
System.exit(0);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import biocjava.bioIO.BioSoftPipeServer.pepAln2CodonAln;
|
|
2
|
+
|
|
3
|
+
import java.io.File;
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* tbcli pep2codon — 蛋白比对回译密码子比对 CLI(08/31 第八十二波,工具 91)
|
|
7
|
+
*
|
|
8
|
+
* 用法: Pep2CodonCli <cds.fa> <pep.aln.fa> <codon.aln.out>
|
|
9
|
+
* cds.fa: CDS 序列(ID 与 pep.aln 一致)
|
|
10
|
+
* pep.aln.fa: 蛋白比对(含 gap 的比对结果)
|
|
11
|
+
* codon.aln.out: 输出密码子比对(Ka/Ks 分析输入)
|
|
12
|
+
*
|
|
13
|
+
* 引擎: pepAln2CodonAln.transformat(File, File, File) —— 静态方法直接调用(main 硬编码演示)
|
|
14
|
+
* (PairWiseKaKsCalculator 内部回译逻辑的独立版——Ka/Ks 分析刚需)
|
|
15
|
+
*/
|
|
16
|
+
public class Pep2CodonCli {
|
|
17
|
+
public static void main(String[] args) throws Exception {
|
|
18
|
+
if (args.length < 3) {
|
|
19
|
+
System.err.println("用法: Pep2CodonCli <cds.fa> <pep.aln.fa> <codon.aln.out>");
|
|
20
|
+
System.exit(1);
|
|
21
|
+
}
|
|
22
|
+
pepAln2CodonAln.transformat(new File(args[0]), new File(args[1]), new File(args[2]));
|
|
23
|
+
System.err.println("[tbplot] 已保存: " + args[2]);
|
|
24
|
+
System.exit(0);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import biocjava.bioDoer.MEME.DrawMotifPattern.DrawMotifPatternFromPfamResult;
|
|
2
|
+
import jigplot.engine.JIGBasePanel;
|
|
3
|
+
import jigplot.engine.JIGSubPanel;
|
|
4
|
+
|
|
5
|
+
import java.io.File;
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* tbcli pfammotif — Pfam 保守域模式图 CLI(08/31 第八十一波,引擎 123)
|
|
9
|
+
*
|
|
10
|
+
* 用法: PfamMotifCli <pfamscan.txt> <in.fasta> <out.svg|png|pdf> [newick.treefile]
|
|
11
|
+
* pfamscan.txt: PfamScan/pfam_scan.pl 16 列输出(seqid alnStart alnEnd envStart envEnd hmmAcc hmmName type hmmStart hmmEnd hmmLen bitscore evalue ...)
|
|
12
|
+
* in.fasta: 蛋白序列(ID 与 pfamscan 一致)
|
|
13
|
+
* newick.treefile: 可选进化树
|
|
14
|
+
*
|
|
15
|
+
* 引擎: DrawMotifPatternFromPfamResult.setInFile/setInFasta + postGraph(newick, jigPanel) → JIGSubPanel
|
|
16
|
+
* (⚠️ 委托 PfamDomainHitsTableParser,期望 PfamScan 16/15 列;可用 hmmscan --domtblout 转换)
|
|
17
|
+
*/
|
|
18
|
+
public class PfamMotifCli {
|
|
19
|
+
public static void main(String[] args) throws Exception {
|
|
20
|
+
if (args.length < 3) {
|
|
21
|
+
System.err.println("用法: PfamMotifCli <pfamscan.txt> <in.fasta> <out.svg|png|pdf> [newick.treefile]");
|
|
22
|
+
System.exit(1);
|
|
23
|
+
}
|
|
24
|
+
String newick = "";
|
|
25
|
+
if (args.length > 3) {
|
|
26
|
+
File tf = new File(args[3]);
|
|
27
|
+
if (tf.exists()) newick = new String(java.nio.file.Files.readAllBytes(tf.toPath()), "UTF-8").trim();
|
|
28
|
+
}
|
|
29
|
+
DrawMotifPatternFromPfamResult dmp = new DrawMotifPatternFromPfamResult();
|
|
30
|
+
dmp.setInFile(new File(args[0]));
|
|
31
|
+
dmp.setInFasta(new File(args[1]));
|
|
32
|
+
JIGBasePanel jigPanel = new JIGBasePanel(1200, 1000);
|
|
33
|
+
JIGSubPanel sp = dmp.postGraph(newick, jigPanel);
|
|
34
|
+
jigPanel.addSubPanel(sp);
|
|
35
|
+
String out = args[2];
|
|
36
|
+
String low = out.toLowerCase();
|
|
37
|
+
if (low.endsWith(".png")) jigPanel.save2PNG(new File(out));
|
|
38
|
+
else if (low.endsWith(".pdf")) jigPanel.save2PDF(new File(out));
|
|
39
|
+
else jigPanel.save2SVG(new File(out));
|
|
40
|
+
System.err.println("[tbplot] 已保存: " + out);
|
|
41
|
+
System.exit(0);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import biocjava.bioDoer.JIGplotToolkit.newickParser.PhyloTreeMan;
|
|
2
|
+
import biocjava.bioDoer.JIGplotToolkit.newickParser.PhyloTreeNode;
|
|
3
|
+
import biocjava.bioDoer.JIGplotToolkit.newickParser.PhyloTreeView;
|
|
4
|
+
import jigplot.engine.JIGBasePanel;
|
|
5
|
+
import jigplot.engine.JIGSubPanel;
|
|
6
|
+
|
|
7
|
+
import java.io.BufferedReader;
|
|
8
|
+
import java.io.File;
|
|
9
|
+
import java.io.FileReader;
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* tbplot phylotree — 系统发育树视图 CLI(08/31 第五十一波)
|
|
13
|
+
*
|
|
14
|
+
* 用法: PhyloTreeCli <in.nwk> <out> [vertical] [width] [height]
|
|
15
|
+
* in.nwk: Newick 树文件(支持枝长)
|
|
16
|
+
* out: .svg / .png / .pdf
|
|
17
|
+
* vertical: true=纵向(默认 false 横向)
|
|
18
|
+
*
|
|
19
|
+
* 引擎: PhyloTreeMan.build() → calcForPlotEignine() 生成 TreeTab →
|
|
20
|
+
* PhyloTreeView.showTree() 返回 JIGSubPanel
|
|
21
|
+
* (08/29 误判「需 TreeTab 格式跳过」——实际 build 直接吃 newick,
|
|
22
|
+
* calcForPlotEignine 内部自动算坐标;08/31 复核攻下)
|
|
23
|
+
*/
|
|
24
|
+
public class PhyloTreeCli {
|
|
25
|
+
public static void main(String[] args) throws Exception {
|
|
26
|
+
if (args.length < 2) {
|
|
27
|
+
System.err.println("用法: PhyloTreeCli <in.nwk> <out> [vertical] [width] [height]");
|
|
28
|
+
System.exit(1);
|
|
29
|
+
}
|
|
30
|
+
String nwkFile = args[0];
|
|
31
|
+
String outFile = args[1];
|
|
32
|
+
boolean vertical = args.length > 2 && Boolean.parseBoolean(args[2]);
|
|
33
|
+
int width = args.length > 3 ? Integer.parseInt(args[3]) : 800;
|
|
34
|
+
int height = args.length > 4 ? Integer.parseInt(args[4]) : 1400;
|
|
35
|
+
|
|
36
|
+
// 读 newick(合并多行)
|
|
37
|
+
StringBuilder sb = new StringBuilder();
|
|
38
|
+
BufferedReader br = new BufferedReader(new FileReader(nwkFile));
|
|
39
|
+
String line;
|
|
40
|
+
while ((line = br.readLine()) != null) sb.append(line.trim());
|
|
41
|
+
br.close();
|
|
42
|
+
String nwk = sb.toString().trim();
|
|
43
|
+
if (nwk.isEmpty()) {
|
|
44
|
+
System.err.println("错误: newick 为空");
|
|
45
|
+
System.exit(1);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
PhyloTreeMan ptm = new PhyloTreeMan();
|
|
49
|
+
PhyloTreeNode root = ptm.build(nwk);
|
|
50
|
+
ptm.setTranFormType(PhyloTreeMan.TreeBranchTranForm.Origin);
|
|
51
|
+
|
|
52
|
+
File tab = File.createTempFile("TBtools", ".tmpTreeTab");
|
|
53
|
+
ptm.calcForPlotEignine(root, tab);
|
|
54
|
+
|
|
55
|
+
// 枝长和为 0 → 自动降级 Cladogram(复刻 quickPlotTree 逻辑)
|
|
56
|
+
double sumBranchLength = 0.0;
|
|
57
|
+
BufferedReader br2 = new BufferedReader(new FileReader(tab));
|
|
58
|
+
String l2;
|
|
59
|
+
while ((l2 = br2.readLine()) != null) {
|
|
60
|
+
String[] cols = l2.split("\t");
|
|
61
|
+
if (cols.length > 2 && !"NaN".equals(cols[2])) {
|
|
62
|
+
try { sumBranchLength += Double.parseDouble(cols[2]); } catch (Exception e) {}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
br2.close();
|
|
66
|
+
if (sumBranchLength == 0.0) {
|
|
67
|
+
System.err.println("[tbplot] 枝长和为 0,自动转 Cladogram");
|
|
68
|
+
ptm.setTranFormType(PhyloTreeMan.TreeBranchTranForm.Cladogram);
|
|
69
|
+
ptm.calcForPlotEignine(root, tab);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
JIGBasePanel jigPanel = new JIGBasePanel(width, height);
|
|
73
|
+
PhyloTreeView ptv = new PhyloTreeView();
|
|
74
|
+
ptv.setShowBranchLabel(true);
|
|
75
|
+
ptv.setPlotAxis(true);
|
|
76
|
+
ptv.setShowNodeName(true);
|
|
77
|
+
ptv.setShowHolderNodeName(false);
|
|
78
|
+
ptv.setVertical(vertical);
|
|
79
|
+
|
|
80
|
+
JIGSubPanel treePanel = ptv.showTree(tab, jigPanel);
|
|
81
|
+
jigPanel.addSubPanel(treePanel);
|
|
82
|
+
|
|
83
|
+
String low = outFile.toLowerCase();
|
|
84
|
+
if (low.endsWith(".png")) jigPanel.save2PNG(new File(outFile));
|
|
85
|
+
else if (low.endsWith(".pdf")) jigPanel.save2PDF(new File(outFile));
|
|
86
|
+
else jigPanel.save2SVG(new File(outFile));
|
|
87
|
+
|
|
88
|
+
tab.delete();
|
|
89
|
+
System.err.println("[tbplot] 已保存: " + outFile);
|
|
90
|
+
System.exit(0);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import biocjava.bioDoer.JIGplotToolkit.BlastVisulization.ncbiPileUpPlot;
|
|
2
|
+
import jigplot.engine.JIGBasePanel;
|
|
3
|
+
import jigplot.engine.JIGSubPanel;
|
|
4
|
+
import biocjava.bioIO.BlastXml.BlastXmlReader;
|
|
5
|
+
import biocjava.bioIO.BlastXml.Iteration;
|
|
6
|
+
import java.io.File;
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* tbplot pileup — TBtools BLAST pile-up 可视化 CLI(08/29,第 44 引擎)
|
|
10
|
+
*
|
|
11
|
+
* 用法: PileUpCli <blast.xml> <out.svg> [--query NAME]
|
|
12
|
+
* blast.xml: BLAST XML 输出(BLAST+ -outfmt 5)
|
|
13
|
+
* --query: 指定 query(缺省自动选第一个)
|
|
14
|
+
*
|
|
15
|
+
* 引擎: ncbiPileUpPlot.showIteration(Iteration)(绕过 GUI 弹窗,自动选 query)
|
|
16
|
+
*/
|
|
17
|
+
public class PileUpCli {
|
|
18
|
+
public static void main(String[] args) throws Exception {
|
|
19
|
+
if (args.length < 2) {
|
|
20
|
+
System.err.println("用法: PileUpCli <blast.xml> <out.svg> [--query NAME]");
|
|
21
|
+
System.exit(1);
|
|
22
|
+
}
|
|
23
|
+
String xmlFile = args[0], out = args[1];
|
|
24
|
+
String queryName = null;
|
|
25
|
+
for (int i = 2; i < args.length; i++) {
|
|
26
|
+
if (args[i].equals("--query") && i+1 < args.length) queryName = args[++i];
|
|
27
|
+
}
|
|
28
|
+
// 读 BLAST XML,取指定/第一个 query
|
|
29
|
+
BlastXmlReader bxr = new BlastXmlReader();
|
|
30
|
+
bxr.setTargetFile(new File(xmlFile));
|
|
31
|
+
Iteration target = null;
|
|
32
|
+
while (bxr.hasNext()) {
|
|
33
|
+
Iteration iter = bxr.getNextIteration();
|
|
34
|
+
if (queryName == null || iter.getQueryDef().equals(queryName)) {
|
|
35
|
+
target = iter;
|
|
36
|
+
break;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
bxr.close();
|
|
40
|
+
if (target == null) {
|
|
41
|
+
System.err.println("错误: 未找到 query" + (queryName != null ? " " + queryName : ""));
|
|
42
|
+
System.exit(1);
|
|
43
|
+
}
|
|
44
|
+
System.err.println("绘图 query: " + target.getQueryDef() + " len=" + target.getQueryLen());
|
|
45
|
+
JIGSubPanel panel = ncbiPileUpPlot.showIteration(target);
|
|
46
|
+
JIGBasePanel base = new JIGBasePanel(900, 600);
|
|
47
|
+
base.addSubPanel(panel);
|
|
48
|
+
String low = out.toLowerCase();
|
|
49
|
+
if (low.endsWith(".png")) base.save2PNG(new File(out));
|
|
50
|
+
else if (low.endsWith(".pdf")) base.save2PDF(new File(out));
|
|
51
|
+
else base.save2SVG(new File(out));
|
|
52
|
+
System.err.println("[tbplot] 已保存: " + out);
|
|
53
|
+
System.exit(0);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import biocjava.bioIO.BioSoftPipeServer.PlantCAREResult.PlantCAREResultClassify;
|
|
2
|
+
|
|
3
|
+
import java.io.File;
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* tbplot careclassify — PlantCARE 顺式元件结果分类 CLI(GUI 逆向 #22,09/20)
|
|
7
|
+
*
|
|
8
|
+
* 用法: PlantCAREResultClassifyCli <plantcare.tab> <out.xls>
|
|
9
|
+
* in: PlantCARE 网站输出 .tab(第 8 列 = motif/site 名)
|
|
10
|
+
* out: 原行 + 追加「大类\t亚类」两列(如 TF\tMYB Binding Site)
|
|
11
|
+
*
|
|
12
|
+
* 引擎: PlantCAREResultClassify(GUI 逆向:PlantCAREResultClassifyGUIPanel $1
|
|
13
|
+
* → setInPlantCAREResultFile/setOutClassifyFile/process,main() 硬编码路径)
|
|
14
|
+
* 原理: jar 内置 97 类分类表(Phytohormone/Environment/Tissue/TF/Common),
|
|
15
|
+
* 按第 8 列 motif 名查表追加;查不到填 NA\tNA
|
|
16
|
+
*/
|
|
17
|
+
public class PlantCAREResultClassifyCli {
|
|
18
|
+
public static void main(String[] args) throws Exception {
|
|
19
|
+
if (args.length < 2) {
|
|
20
|
+
System.err.println("用法: PlantCAREResultClassifyCli <plantcare.tab> <out.xls>");
|
|
21
|
+
System.exit(1);
|
|
22
|
+
}
|
|
23
|
+
File inFile = new File(args[0]);
|
|
24
|
+
File outFile = new File(args[1]);
|
|
25
|
+
if (!inFile.exists()) {
|
|
26
|
+
System.err.println("错误: 输入文件不存在: " + inFile.getAbsolutePath());
|
|
27
|
+
System.exit(2);
|
|
28
|
+
}
|
|
29
|
+
PlantCAREResultClassify pcrc = new PlantCAREResultClassify();
|
|
30
|
+
pcrc.setInPlantCAREResultFile(inFile);
|
|
31
|
+
pcrc.setOutClassifyFile(outFile);
|
|
32
|
+
pcrc.process();
|
|
33
|
+
System.err.println("[tbplot] PlantCARE 分类完成: " + outFile.getAbsolutePath());
|
|
34
|
+
System.exit(0);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import biocjava.bioWeb.Pubmed.PubmedSearch;
|
|
2
|
+
|
|
3
|
+
import java.io.File;
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* tbplot pubmed — PubMed 文献检索汇总 CLI(GUI 逆向 #45,09/21)
|
|
7
|
+
*
|
|
8
|
+
* 用法: PubmedSearchCli <query> <out.xls>
|
|
9
|
+
* query: PubMed 检索式(如 "GRAS transcription factor plant")
|
|
10
|
+
* out: 文献汇总表(期刊/标题/年份/影响因子/DOI 等)
|
|
11
|
+
*
|
|
12
|
+
* 引擎: PubmedSearch.process(query, file)(GUI 逆向:PubmedSummaryGUIPanel $2;
|
|
13
|
+
* ⚠️ 联网 NCBI PubMed eutils;main() 硬编码演示查询)
|
|
14
|
+
*/
|
|
15
|
+
public class PubmedSearchCli {
|
|
16
|
+
public static void main(String[] args) throws Exception {
|
|
17
|
+
if (args.length < 2) {
|
|
18
|
+
System.err.println("用法: PubmedSearchCli <query> <out.xls>");
|
|
19
|
+
System.exit(1);
|
|
20
|
+
}
|
|
21
|
+
new PubmedSearch().process(args[0], new File(args[1]));
|
|
22
|
+
System.err.println("[tbplot] PubMed 检索完成: " + args[1]);
|
|
23
|
+
System.exit(0);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import biocjava.bioDoer.JIGplotToolkit.qPCRBarPlot.barPlotWithErrorBar;
|
|
2
|
+
import jigplot.engine.JIGBasePanel;
|
|
3
|
+
|
|
4
|
+
import java.awt.Window;
|
|
5
|
+
import java.io.File;
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* tbplot qpcr — TBtools qPCR 柱状图(带误差棒)CLI(08/29 重建)
|
|
9
|
+
*
|
|
10
|
+
* 用法: QpcrCli <data.txt> <out.svg/png> [width] [height]
|
|
11
|
+
* data.txt: name\tmean\tsd(每行一个样本/处理)
|
|
12
|
+
*
|
|
13
|
+
* 引擎: barPlotWithErrorBar(plot() 只弹窗不返回 panel)
|
|
14
|
+
* 方案: 窗口遍历 —— plot() 后遍历所有 java.awt.Window 找到 JIGBasePanel 再保存
|
|
15
|
+
* (参考 08/28 原 QpcrCli 的窗口遍历方案)
|
|
16
|
+
*/
|
|
17
|
+
public class QpcrCli {
|
|
18
|
+
public static void main(String[] args) throws Exception {
|
|
19
|
+
if (args.length < 2) {
|
|
20
|
+
System.err.println("用法: QpcrCli <data.txt> <outFile> [width] [height]");
|
|
21
|
+
System.exit(1);
|
|
22
|
+
}
|
|
23
|
+
String inFile = args[0];
|
|
24
|
+
String outFile = args[1];
|
|
25
|
+
|
|
26
|
+
barPlotWithErrorBar plotter = new barPlotWithErrorBar();
|
|
27
|
+
plotter.setInFile(new File(inFile));
|
|
28
|
+
plotter.plot(); // 内部 setVisible 弹窗(xvfb 下无显示但仍创建 Window)
|
|
29
|
+
|
|
30
|
+
// 窗口遍历:找 JIGBasePanel
|
|
31
|
+
JIGBasePanel panel = null;
|
|
32
|
+
Window[] windows = Window.getWindows();
|
|
33
|
+
System.err.println("[tbplot] 窗口数: " + windows.length);
|
|
34
|
+
for (Window w : windows) {
|
|
35
|
+
JIGBasePanel found = findBasePanel(w);
|
|
36
|
+
if (found != null) {
|
|
37
|
+
panel = found;
|
|
38
|
+
break;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
if (panel == null) {
|
|
42
|
+
System.err.println("错误: 未找到 JIGBasePanel(可能绘图失败)");
|
|
43
|
+
System.exit(1);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
String low = outFile.toLowerCase();
|
|
47
|
+
if (low.endsWith(".png")) {
|
|
48
|
+
panel.save2PNG(new File(outFile));
|
|
49
|
+
} else if (low.endsWith(".pdf")) {
|
|
50
|
+
panel.save2PDF(new File(outFile));
|
|
51
|
+
} else {
|
|
52
|
+
panel.save2SVG(new File(outFile));
|
|
53
|
+
}
|
|
54
|
+
System.err.println("[tbplot] 已保存: " + outFile);
|
|
55
|
+
System.exit(0);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
static JIGBasePanel findBasePanel(java.awt.Component c) {
|
|
59
|
+
if (c instanceof JIGBasePanel) return (JIGBasePanel) c;
|
|
60
|
+
if (c instanceof java.awt.Container) {
|
|
61
|
+
java.awt.Component[] comps = ((java.awt.Container) c).getComponents();
|
|
62
|
+
for (java.awt.Component comp : comps) {
|
|
63
|
+
JIGBasePanel found = findBasePanel(comp);
|
|
64
|
+
if (found != null) return found;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import java.io.File;
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* tbplot qpcrDdct — qPCR 相对定量(ΔΔCt)CLI(08/29,第 58 引擎)
|
|
5
|
+
*
|
|
6
|
+
* 用法: QpcrDdctCli <in.qpcr.tab> <out.xls>
|
|
7
|
+
* in.qpcr.tab: tab 分隔 3 列(基因名\t对照Ct\t实验Ct),同名多行取平均
|
|
8
|
+
* out.xls: 相对表达量(2^-ΔΔCt 等)
|
|
9
|
+
*
|
|
10
|
+
* ⚠️ main() 硬编码路径——改走 setInqPCRTabFile/setOutProcessedFile + process()。
|
|
11
|
+
* 多基因重复样本自动平均。TBtools 官方用于 qPCR 相对定量。
|
|
12
|
+
*/
|
|
13
|
+
public class QpcrDdctCli {
|
|
14
|
+
public static void main(String[] args) throws Exception {
|
|
15
|
+
if (args.length < 2) {
|
|
16
|
+
System.err.println("用法: QpcrDdctCli <in.qpcr.tab> <out.xls>");
|
|
17
|
+
System.exit(1);
|
|
18
|
+
}
|
|
19
|
+
Object o = Class.forName("biocjava.bioDoer.LinuxPipe.SimpleQPCRProcessser")
|
|
20
|
+
.getDeclaredConstructor().newInstance();
|
|
21
|
+
Class<?> c = o.getClass();
|
|
22
|
+
c.getMethod("setInqPCRTabFile", File.class).invoke(o, new File(args[0]));
|
|
23
|
+
c.getMethod("setOutProcessedFile", File.class).invoke(o, new File(args[1]));
|
|
24
|
+
c.getMethod("process").invoke(o);
|
|
25
|
+
System.err.println("[tbplot] qPCR 相对定量完成: " + args[1]);
|
|
26
|
+
System.exit(0);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import biocjava.bioDoer.LinuxPipe.SimpleQPCRProcessser;
|
|
2
|
+
|
|
3
|
+
import java.io.File;
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* tbcli qpcrproc — qPCR 相对表达分析 CLI(08/31 第八十七波,工具 97)
|
|
7
|
+
*
|
|
8
|
+
* 用法: QpcrProcCli <in.qpcr.tab> <out.xls>
|
|
9
|
+
* in.qpcr.tab: Sample\tRefCt\tExpCt(列1=内参基因 Ct,列2=目标基因 Ct;同样本多行求均值)
|
|
10
|
+
* out.xls: Sample\tMean\tStdev(2^-ΔΔCt 相对表达)
|
|
11
|
+
*
|
|
12
|
+
* 引擎: SimpleQPCRProcessser.setInqPCRTabFile/setOutProcessedFile + process()
|
|
13
|
+
* (main 硬编码演示 → setter+process;qPCR 数据分析,与绘图类 qpcr 互补)
|
|
14
|
+
*/
|
|
15
|
+
public class QpcrProcCli {
|
|
16
|
+
public static void main(String[] args) throws Exception {
|
|
17
|
+
if (args.length < 2) {
|
|
18
|
+
System.err.println("用法: QpcrProcCli <in.qpcr.tab> <out.xls>");
|
|
19
|
+
System.exit(1);
|
|
20
|
+
}
|
|
21
|
+
SimpleQPCRProcessser sqp = new SimpleQPCRProcessser();
|
|
22
|
+
sqp.setInqPCRTabFile(new File(args[0]));
|
|
23
|
+
sqp.setOutProcessedFile(new File(args[1]));
|
|
24
|
+
sqp.process();
|
|
25
|
+
System.err.println("[tbplot] 已保存: " + args[1]);
|
|
26
|
+
System.exit(0);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
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 qdot — Quick Genome Dot Plot CLI(插件 P00380 CLI 化)
|
|
9
|
+
*
|
|
10
|
+
* 用法: QuickGenomeDotCli <blast.tab> <in.gff> <chrLayout.txt> <out.svg> [--point-size N] [--high N] [--mid N] [--low N] [--highlight genes.txt]
|
|
11
|
+
* blast.tab: 基因对比对结果(diamond 输出,mcscanxd 已产 <g1>vs<g2>.blast)
|
|
12
|
+
* in.gff: 合并 GFF(mcscanxd 产出 <g1>vs<g2>.gff)
|
|
13
|
+
* chrLayout.txt: 染色体布局(mcscanxd 产出 *.ChrLayout.tab.xls)
|
|
14
|
+
* out: 输出 SVG/PNG/PDF
|
|
15
|
+
*
|
|
16
|
+
* 背景: 插件 QuickGenomeDotPlot.process() 尾部调用 JIGUtils.quickShow(GUI 弹窗),
|
|
17
|
+
* headless 下抛 HeadlessException(实测)。其上游 diamond blast + MCScanX 已由
|
|
18
|
+
* mcscanxd 完成——本桥直接驱动 dotdotdot 引擎(setChrLayoutFile/setGenePair/setInGff
|
|
19
|
+
* + process()→JIGSubPanel→JIGBasePanel 保存),绕开 quickShow。
|
|
20
|
+
*/
|
|
21
|
+
public class QuickGenomeDotCli {
|
|
22
|
+
public static void main(String[] args) throws Exception {
|
|
23
|
+
if (args.length < 4) {
|
|
24
|
+
System.err.println("用法: QuickGenomeDotCli <blast.tab> <in.gff> <chrLayout.txt> <out.svg> [--point-size N] [--high N] [--mid N] [--low N] [--highlight genes.txt]");
|
|
25
|
+
System.exit(1);
|
|
26
|
+
}
|
|
27
|
+
double pointSize = 2.0, high = 0.8, mid = 0.5, low = 0.1;
|
|
28
|
+
String highlight = null;
|
|
29
|
+
for (int i = 4; i < args.length; i++) {
|
|
30
|
+
if (args[i].equals("--point-size") && i+1 < args.length) pointSize = Double.parseDouble(args[++i]);
|
|
31
|
+
else if (args[i].equals("--high") && i+1 < args.length) high = Double.parseDouble(args[++i]);
|
|
32
|
+
else if (args[i].equals("--mid") && i+1 < args.length) mid = Double.parseDouble(args[++i]);
|
|
33
|
+
else if (args[i].equals("--low") && i+1 < args.length) low = Double.parseDouble(args[++i]);
|
|
34
|
+
else if (args[i].equals("--highlight") && i+1 < args.length) highlight = args[++i];
|
|
35
|
+
}
|
|
36
|
+
Object e = Class.forName("biocjava.bioDoer.JIGplotToolkit.DotPlot.dotdotdot").getDeclaredConstructor().newInstance();
|
|
37
|
+
Class<?> c = e.getClass();
|
|
38
|
+
c.getMethod("setGenePair", File.class).invoke(e, new File(args[0]));
|
|
39
|
+
c.getMethod("setInGff", File.class).invoke(e, new File(args[1]));
|
|
40
|
+
c.getMethod("setChrLayoutFile", File.class).invoke(e, new File(args[2]));
|
|
41
|
+
c.getMethod("setPointSize", double.class).invoke(e, pointSize);
|
|
42
|
+
c.getMethod("setHighConfValue", double.class).invoke(e, high);
|
|
43
|
+
c.getMethod("setMidConfValue", double.class).invoke(e, mid);
|
|
44
|
+
c.getMethod("setLowConfValue", double.class).invoke(e, low);
|
|
45
|
+
c.getMethod("setColorIndex", int.class).invoke(e, 10);
|
|
46
|
+
c.getMethod("setHighColor", java.awt.Color.class).invoke(e, java.awt.Color.RED);
|
|
47
|
+
c.getMethod("setMidColor", java.awt.Color.class).invoke(e, java.awt.Color.ORANGE);
|
|
48
|
+
c.getMethod("setLowColor", java.awt.Color.class).invoke(e, java.awt.Color.WHITE);
|
|
49
|
+
if (highlight != null) c.getMethod("setHighlightGeneFile", File.class).invoke(e, new File(highlight));
|
|
50
|
+
Method process = c.getMethod("process");
|
|
51
|
+
Object result = process.invoke(e);
|
|
52
|
+
if (!(result instanceof JIGSubPanel)) {
|
|
53
|
+
System.err.println("❌ process 未返回 JIGSubPanel");
|
|
54
|
+
System.exit(1);
|
|
55
|
+
}
|
|
56
|
+
JIGBasePanel base = new JIGBasePanel(1200, 800);
|
|
57
|
+
base.addSubPanel((JIGSubPanel) result);
|
|
58
|
+
File outf = new File(args[3]);
|
|
59
|
+
String low2 = args[3].toLowerCase();
|
|
60
|
+
if (low2.endsWith(".png")) base.save2PNG(outf);
|
|
61
|
+
else if (low2.endsWith(".pdf")) base.save2PDF(outf);
|
|
62
|
+
else base.save2SVG(outf);
|
|
63
|
+
System.err.println("[tbplot] 已保存: " + args[3]);
|
|
64
|
+
System.exit(0);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* tbplot quickAnno — Quick Protein Anno CLI(插件 P00480 CLI 化)
|
|
3
|
+
*
|
|
4
|
+
* 用法: QuickProteinAnnoCli <query.pep> <swissprotDb> <out.txt> [threads] [maxHits]
|
|
5
|
+
* query.pep: 待注释蛋白 FASTA
|
|
6
|
+
* swissprotDb: Swiss-Prot 库(FASTA 即可,diamond 自动 makedb 到工作区;
|
|
7
|
+
* 推荐用完整 UniProt Swiss-Prot 或自建库)
|
|
8
|
+
* out.txt: 注释汇总表(diamond 比对 + BlastXMLSummaryTable 取 Top N hits)
|
|
9
|
+
* threads: 线程(默认 4);maxHits: 每蛋白保留命中数(默认 10)
|
|
10
|
+
*
|
|
11
|
+
* 引擎: QuickGenomeDot.QuickProteinAnno(插件 jar)——diamond 二进制
|
|
12
|
+
* plugins/lib/bin/diamond(Linux ELF)。⚠️ 无 swissprot 库时不建议跑
|
|
13
|
+
* (几 GB 级),本桥允许用户自带库文件。
|
|
14
|
+
*/
|
|
15
|
+
public class QuickProteinAnnoCli {
|
|
16
|
+
public static void main(String[] args) throws Exception {
|
|
17
|
+
if (args.length < 3) {
|
|
18
|
+
System.err.println("用法: QuickProteinAnnoCli <query.pep> <swissprotDb> <out.txt> [threads] [maxHits]");
|
|
19
|
+
System.exit(1);
|
|
20
|
+
}
|
|
21
|
+
int threads = args.length > 3 ? Integer.parseInt(args[3]) : 4;
|
|
22
|
+
int hits = args.length > 4 ? Integer.parseInt(args[4]) : 10;
|
|
23
|
+
Object w = Class.forName("QuickGenomeDot.QuickProteinAnno").getDeclaredConstructor().newInstance();
|
|
24
|
+
Class<?> c = w.getClass();
|
|
25
|
+
c.getMethod("setInFile", java.io.File.class).invoke(w, new java.io.File(args[0]));
|
|
26
|
+
c.getMethod("setInSwissprotDb", java.io.File.class).invoke(w, new java.io.File(args[1]));
|
|
27
|
+
c.getMethod("setOutFile", java.io.File.class).invoke(w, new java.io.File(args[2]));
|
|
28
|
+
c.getMethod("setNumberOfTreads", int.class).invoke(w, threads);
|
|
29
|
+
c.getMethod("setNumberOfhit", int.class).invoke(w, hits);
|
|
30
|
+
c.getMethod("process").invoke(w);
|
|
31
|
+
System.err.println("[tbplot] 蛋白注释完成: " + args[2]);
|
|
32
|
+
System.exit(0);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import biocjava.bioIO.BioSoftPipeServer.QuickRunIQtree;
|
|
2
|
+
|
|
3
|
+
import java.io.File;
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* tbplot iqtree — IQ-TREE 最大似然建树 CLI(GUI 逆向 #28,09/20)
|
|
7
|
+
*
|
|
8
|
+
* 用法: QuickRunIQtreeCli <aln.fa> <outPrefix> [--model MFP] [--ufboot N] [--boot N]
|
|
9
|
+
* [--freerate] [--asc] [--threads N] [--redo]
|
|
10
|
+
* aln.fa: 比对后 FASTA(可用 tbplot muscle 产物)
|
|
11
|
+
* outPrefix: 输出前缀(产物 outPrefix.treefile/.iqtree/.log 等)
|
|
12
|
+
* --model: 替换模型(默认 MFP=自动选模;如 GTR+G、JTT+G)
|
|
13
|
+
* --ufboot N: 超快 bootstrap 次数(如 1000;推荐)
|
|
14
|
+
* --boot N: 标准 bootstrap 次数(与 ufboot 二选一)
|
|
15
|
+
* --freerate: +R 自由速率模型
|
|
16
|
+
* --asc: +ASC ascertainment bias 校正
|
|
17
|
+
* --threads: 线程数(默认 0=AUTO)
|
|
18
|
+
* --redo: 覆盖已有输出
|
|
19
|
+
*
|
|
20
|
+
* 引擎: QuickRunIQtree(GUI 逆向:IQtreeGUIPanel $5 StartButton 回调;
|
|
21
|
+
* 引擎拼 iqtree -s -pre -bb/-b -m -nt 调系统二进制,v2 语法兼容)
|
|
22
|
+
* 依赖: 系统 iqtree/iqtree2
|
|
23
|
+
*/
|
|
24
|
+
public class QuickRunIQtreeCli {
|
|
25
|
+
public static void main(String[] args) throws Exception {
|
|
26
|
+
if (args.length < 2) {
|
|
27
|
+
System.err.println("用法: QuickRunIQtreeCli <aln.fa> <outPrefix> [--model MFP] [--ufboot N] [--boot N] [--freerate] [--asc] [--threads N] [--redo]");
|
|
28
|
+
System.exit(1);
|
|
29
|
+
}
|
|
30
|
+
File inFile = new File(args[0]);
|
|
31
|
+
File outPrefix = new File(args[1]);
|
|
32
|
+
QuickRunIQtree qta = new QuickRunIQtree();
|
|
33
|
+
qta.setInFile(inFile);
|
|
34
|
+
qta.setOutPrefix(outPrefix);
|
|
35
|
+
qta.setModel("MFP");
|
|
36
|
+
qta.setNumberOfThread(0);
|
|
37
|
+
for (int i = 2; i < args.length; i++) {
|
|
38
|
+
switch (args[i]) {
|
|
39
|
+
case "--model": qta.setModel(args[++i]); break;
|
|
40
|
+
case "--ufboot":
|
|
41
|
+
int ub = Integer.parseInt(args[++i]);
|
|
42
|
+
if (ub > 0 && ub < 1000) {
|
|
43
|
+
System.err.println("错误: IQ-TREE 2 要求 UFBoot ≥ 1000(传了 " + ub + ",引擎会静默失败)");
|
|
44
|
+
System.exit(1);
|
|
45
|
+
}
|
|
46
|
+
qta.setUltraFastBS(true); qta.setBootStrapNum(ub); break;
|
|
47
|
+
case "--boot": qta.setUltraFastBS(false); qta.setBootStrapNum(Integer.parseInt(args[++i])); break;
|
|
48
|
+
case "--freerate": qta.setFreeRate(true); break;
|
|
49
|
+
case "--asc": qta.setAscertainmentBias(true); break;
|
|
50
|
+
case "--threads": qta.setNumberOfThread(Integer.parseInt(args[++i])); break;
|
|
51
|
+
case "--redo": qta.setRedo(true); break;
|
|
52
|
+
default:
|
|
53
|
+
System.err.println("警告: 忽略未知参数 " + args[i]);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
if (!inFile.exists()) {
|
|
57
|
+
System.err.println("错误: 输入文件不存在: " + inFile.getAbsolutePath());
|
|
58
|
+
System.exit(2);
|
|
59
|
+
}
|
|
60
|
+
qta.build();
|
|
61
|
+
File treefile = new File(outPrefix.getAbsolutePath() + ".treefile");
|
|
62
|
+
if (treefile.exists()) {
|
|
63
|
+
System.err.println("[tbplot] IQ-TREE 建树完成: " + treefile.getAbsolutePath());
|
|
64
|
+
} else {
|
|
65
|
+
System.err.println("[tbplot] IQ-TREE 完成但未找到 .treefile(查 " + outPrefix.getAbsolutePath() + ".log)");
|
|
66
|
+
}
|
|
67
|
+
System.exit(0);
|
|
68
|
+
}
|
|
69
|
+
}
|