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,32 @@
|
|
|
1
|
+
import biocjava.bioIO.GBff.genBank2Fasta;
|
|
2
|
+
|
|
3
|
+
import java.io.File;
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* tbplot gb2fa — GenBank→FASTA 转换 CLI(GUI 逆向 #36,09/20)
|
|
7
|
+
*
|
|
8
|
+
* 用法: GenBank2FastaCli <in.gb> <out.fa>
|
|
9
|
+
*
|
|
10
|
+
* 引擎: genBank2Fasta(GUI 逆向:GenBank2FastaGUIPanel $3
|
|
11
|
+
* → setInGenBankFile/setOutFastaFile/process,main() 空实现)
|
|
12
|
+
*/
|
|
13
|
+
public class GenBank2FastaCli {
|
|
14
|
+
public static void main(String[] args) throws Exception {
|
|
15
|
+
if (args.length < 2) {
|
|
16
|
+
System.err.println("用法: GenBank2FastaCli <in.gb> <out.fa>");
|
|
17
|
+
System.exit(1);
|
|
18
|
+
}
|
|
19
|
+
File inGb = new File(args[0]);
|
|
20
|
+
File outFa = new File(args[1]);
|
|
21
|
+
if (!inGb.exists()) {
|
|
22
|
+
System.err.println("错误: 输入文件不存在: " + inGb.getAbsolutePath());
|
|
23
|
+
System.exit(2);
|
|
24
|
+
}
|
|
25
|
+
genBank2Fasta gb2f = new genBank2Fasta();
|
|
26
|
+
gb2f.setInGenBankFile(inGb);
|
|
27
|
+
gb2f.setOutFastaFile(outFa);
|
|
28
|
+
gb2f.process();
|
|
29
|
+
System.err.println("[tbplot] GenBank→FASTA 完成: " + outFa.getAbsolutePath());
|
|
30
|
+
System.exit(0);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* tbplot gdensity — 基因密度分析 CLI(GUI 面板逆向接口,09/20)
|
|
3
|
+
*
|
|
4
|
+
* 用法: GeneDensityCli <in.gff3> <out.geneRecords.bed> <binSize> [--feature <tag>] [--chrlen <file>]
|
|
5
|
+
*
|
|
6
|
+
* 接口来源:反编译 GeneDensityProfilerGUIPanel(GUI 真实调用链):
|
|
7
|
+
* GeneDensityProfiler gdpf = new GeneDensityProfiler();
|
|
8
|
+
* gdpf.setBinSize(N); setInGXF(gff); [setDefinedFeatureTag] [setChrLengthFile]
|
|
9
|
+
* gdpf.setOutGeneRecordFile(out); gdpf.process();
|
|
10
|
+
* 纯逻辑无 GUI。产物:基因记录(按 bin 划分),供染色体基因密度分布图。
|
|
11
|
+
*/
|
|
12
|
+
public class GeneDensityCli {
|
|
13
|
+
public static void main(String[] args) throws Exception {
|
|
14
|
+
String feature = "";
|
|
15
|
+
String chrlen = "";
|
|
16
|
+
java.util.ArrayList<String> pos = new java.util.ArrayList<String>();
|
|
17
|
+
for (int i = 0; i < args.length; i++) {
|
|
18
|
+
if (args[i].equals("--feature") && i+1 < args.length) feature = args[++i];
|
|
19
|
+
else if (args[i].equals("--chrlen") && i+1 < args.length) chrlen = args[++i];
|
|
20
|
+
else pos.add(args[i]);
|
|
21
|
+
}
|
|
22
|
+
if (pos.size() < 3) {
|
|
23
|
+
System.err.println("用法: GeneDensityCli <in.gff3> <out.geneRecords> <binSize> [--feature <tag>] [--chrlen <file>]");
|
|
24
|
+
System.exit(1);
|
|
25
|
+
}
|
|
26
|
+
Object gd = Class.forName("biocjava.bioDoer.GXFUtils.GeneDensityProfiler")
|
|
27
|
+
.getDeclaredConstructor().newInstance();
|
|
28
|
+
Class<?> c = gd.getClass();
|
|
29
|
+
c.getMethod("setInGXF", java.io.File.class).invoke(gd, new java.io.File(pos.get(0)));
|
|
30
|
+
c.getMethod("setOutGeneRecordFile", java.io.File.class).invoke(gd, new java.io.File(pos.get(1)));
|
|
31
|
+
c.getMethod("setBinSize", int.class).invoke(gd, Integer.parseInt(pos.get(2)));
|
|
32
|
+
if (!feature.isEmpty()) c.getMethod("setDefinedFeatureTag", String.class).invoke(gd, feature);
|
|
33
|
+
if (!chrlen.isEmpty()) c.getMethod("setChrLengthFile", java.io.File.class).invoke(gd, new java.io.File(chrlen));
|
|
34
|
+
c.getMethod("process").invoke(gd);
|
|
35
|
+
System.err.println("[tbplot] 已保存: " + pos.get(1));
|
|
36
|
+
System.exit(0);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import biocjava.bioDoer.JIGplotToolkit.GeneLocation.GeneLocation;
|
|
2
|
+
import jigplot.engine.JIGBasePanel;
|
|
3
|
+
import jigplot.engine.JIGSubPanel;
|
|
4
|
+
|
|
5
|
+
import java.io.BufferedReader;
|
|
6
|
+
import java.io.BufferedWriter;
|
|
7
|
+
import java.io.File;
|
|
8
|
+
import java.io.FileReader;
|
|
9
|
+
import java.io.FileWriter;
|
|
10
|
+
import java.util.ArrayList;
|
|
11
|
+
import java.util.HashMap;
|
|
12
|
+
import java.util.HashSet;
|
|
13
|
+
import java.util.TreeMap;
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* tbplot genelocgff — TBtools 基因染色体定位图(GFF+ID 输入)CLI(08/29 重建)
|
|
17
|
+
*
|
|
18
|
+
* 用法: GeneLocGffCli <gff3> <idList> <out> [--chrLen len.tsv] [--rename r.tsv] [--pairs p.tsv] [--color c.tsv]
|
|
19
|
+
* [--rankedChr list] [--onlyMapped true|false] [--showLabel true|false]
|
|
20
|
+
*
|
|
21
|
+
* 方案: 绕开 GeneLocationControlFromGff3AndIdList.process() 的 JFrame
|
|
22
|
+
* 复制核心逻辑: 解析 GFF(mRNA/gene 行)→ 生成 genePos 文件(featureName\tchrName\tstartPos\tendPos)
|
|
23
|
+
* + genomeLen 文件(chr\tlength)→ GeneLocation.plot() → save2Graph
|
|
24
|
+
* 参考 08/28 原 GeneLocGffCli(GRAS 75 基因/15 染色体验证 SVG 108KB)
|
|
25
|
+
*/
|
|
26
|
+
public class GeneLocGffCli {
|
|
27
|
+
public static void main(String[] args) throws Exception {
|
|
28
|
+
if (args.length < 3) {
|
|
29
|
+
System.err.println("用法: GeneLocGffCli <gff3> <idList> <out> [--chrLen len.tsv] [--rename r.tsv] [--pairs p.tsv] [--color c.tsv] [--rankedChr list] [--onlyMapped bool] [--showLabel bool]");
|
|
30
|
+
System.exit(1);
|
|
31
|
+
}
|
|
32
|
+
String gffFile = args[0];
|
|
33
|
+
String idFile = args[1];
|
|
34
|
+
String outFile = args[2];
|
|
35
|
+
|
|
36
|
+
File chrLenFile = null, renameFile = null, pairsFile = null, colorFile = null, rankedChrFile = null;
|
|
37
|
+
boolean onlyMapped = false, showLabel = true;
|
|
38
|
+
for (int i = 3; i < args.length; i++) {
|
|
39
|
+
if (args[i].equals("--chrLen") && i+1<args.length) chrLenFile = new File(args[++i]);
|
|
40
|
+
else if (args[i].equals("--rename") && i+1<args.length) renameFile = new File(args[++i]);
|
|
41
|
+
else if (args[i].equals("--pairs") && i+1<args.length) pairsFile = new File(args[++i]);
|
|
42
|
+
else if (args[i].equals("--color") && i+1<args.length) colorFile = new File(args[++i]);
|
|
43
|
+
else if (args[i].equals("--rankedChr") && i+1<args.length) rankedChrFile = new File(args[++i]);
|
|
44
|
+
else if (args[i].equals("--onlyMapped") && i+1<args.length) onlyMapped = Boolean.parseBoolean(args[++i]);
|
|
45
|
+
else if (args[i].equals("--showLabel") && i+1<args.length) showLabel = Boolean.parseBoolean(args[++i]);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// 读 ID 列表
|
|
49
|
+
HashSet<String> retainIds = new HashSet<String>();
|
|
50
|
+
BufferedReader br = new BufferedReader(new FileReader(idFile));
|
|
51
|
+
String line;
|
|
52
|
+
while ((line = br.readLine()) != null) {
|
|
53
|
+
line = line.trim();
|
|
54
|
+
if (!line.isEmpty() && !line.startsWith("#")) retainIds.add(line);
|
|
55
|
+
}
|
|
56
|
+
br.close();
|
|
57
|
+
System.err.println("[tbplot] 目标 ID 数: " + retainIds.size());
|
|
58
|
+
|
|
59
|
+
// 解析 GFF:收集 mRNA/transcript 行 (chr, start, end, id)
|
|
60
|
+
ArrayList<String[]> genes = new ArrayList<String[]>(); // {id, chr, start, end}
|
|
61
|
+
HashMap<String, Long> chrMax = new HashMap<String, Long>();
|
|
62
|
+
br = new BufferedReader(new FileReader(gffFile));
|
|
63
|
+
while ((line = br.readLine()) != null) {
|
|
64
|
+
if (line.startsWith("#")) continue;
|
|
65
|
+
String[] f = line.split("\t");
|
|
66
|
+
if (f.length < 9) continue;
|
|
67
|
+
String type = f[2];
|
|
68
|
+
if (!type.equals("mRNA") && !type.equals("transcript") && !type.equals("gene")) continue;
|
|
69
|
+
String chr = f[0];
|
|
70
|
+
long start = Long.parseLong(f[3]);
|
|
71
|
+
long end = Long.parseLong(f[4]);
|
|
72
|
+
// 提取 ID
|
|
73
|
+
String attrs = f[8];
|
|
74
|
+
String id = extractAttr(attrs, "ID");
|
|
75
|
+
if (id == null) continue;
|
|
76
|
+
if (!retainIds.isEmpty() && !retainIds.contains(id)) continue;
|
|
77
|
+
genes.add(new String[]{id, chr, String.valueOf(start), String.valueOf(end)});
|
|
78
|
+
Long cm = chrMax.get(chr);
|
|
79
|
+
if (cm == null || end > cm) chrMax.put(chr, end);
|
|
80
|
+
}
|
|
81
|
+
br.close();
|
|
82
|
+
if (genes.isEmpty()) {
|
|
83
|
+
System.err.println("错误: 没有匹配到任何基因(检查 ID 是否与 GFF 的 mRNA ID 一致)");
|
|
84
|
+
System.exit(1);
|
|
85
|
+
}
|
|
86
|
+
System.err.println("[tbplot] 匹配基因: " + genes.size() + ", 染色体: " + chrMax.size());
|
|
87
|
+
|
|
88
|
+
// 生成临时 genePos 文件
|
|
89
|
+
File genePosFile = File.createTempFile("tbplot_genePos", ".txt");
|
|
90
|
+
genePosFile.deleteOnExit();
|
|
91
|
+
BufferedWriter bw = new BufferedWriter(new FileWriter(genePosFile));
|
|
92
|
+
for (String[] g : genes) {
|
|
93
|
+
bw.write(g[0] + "\t" + g[1] + "\t" + g[2] + "\t" + g[3]);
|
|
94
|
+
bw.newLine();
|
|
95
|
+
}
|
|
96
|
+
bw.close();
|
|
97
|
+
|
|
98
|
+
// 生成 genomeLen 文件(未提供则从 GFF 推)
|
|
99
|
+
File genomeLenFile;
|
|
100
|
+
if (chrLenFile != null && chrLenFile.exists()) {
|
|
101
|
+
genomeLenFile = chrLenFile;
|
|
102
|
+
} else {
|
|
103
|
+
genomeLenFile = File.createTempFile("tbplot_genomeLen", ".txt");
|
|
104
|
+
genomeLenFile.deleteOnExit();
|
|
105
|
+
bw = new BufferedWriter(new FileWriter(genomeLenFile));
|
|
106
|
+
for (String chr : chrMax.keySet()) {
|
|
107
|
+
bw.write(chr + "\t" + chrMax.get(chr));
|
|
108
|
+
bw.newLine();
|
|
109
|
+
}
|
|
110
|
+
bw.close();
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// GeneLocation.plot()
|
|
114
|
+
GeneLocation gl = new GeneLocation();
|
|
115
|
+
gl.setInGenePosFile(genePosFile);
|
|
116
|
+
gl.setInGenomeLen(genomeLenFile);
|
|
117
|
+
if (pairsFile != null && pairsFile.exists()) gl.setGenePairinfo(pairsFile);
|
|
118
|
+
if (colorFile != null && colorFile.exists()) gl.setGeneColorMapInfo(colorFile);
|
|
119
|
+
gl.setShowGeneLabel(showLabel);
|
|
120
|
+
|
|
121
|
+
JIGSubPanel panel = gl.plot();
|
|
122
|
+
JIGBasePanel base = new JIGBasePanel(1000, 800);
|
|
123
|
+
base.addSubPanel(panel);
|
|
124
|
+
String low = outFile.toLowerCase();
|
|
125
|
+
if (low.endsWith(".png")) base.save2PNG(new File(outFile));
|
|
126
|
+
else if (low.endsWith(".pdf")) base.save2PDF(new File(outFile));
|
|
127
|
+
else base.save2SVG(new File(outFile));
|
|
128
|
+
System.err.println("[tbplot] 已保存: " + outFile);
|
|
129
|
+
System.exit(0);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
static String extractAttr(String attrs, String key) {
|
|
133
|
+
// 解析 GFF9 属性列: key=value;key2=value2
|
|
134
|
+
for (String part : attrs.split(";")) {
|
|
135
|
+
String[] kv = part.trim().split("=", 2);
|
|
136
|
+
if (kv.length == 2 && kv[0].equals(key)) return kv[1].trim();
|
|
137
|
+
}
|
|
138
|
+
return null;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import biocjava.bioDoer.MEME.DrawMotifPattern.DrawGeneStructureFromGXFfile;
|
|
2
|
+
import biocjava.bioDoer.MEME.GeneStructure.ParseGeneStructureFromGXF;
|
|
3
|
+
import jigplot.engine.JIGBasePanel;
|
|
4
|
+
import jigplot.engine.JIGSubPanel;
|
|
5
|
+
|
|
6
|
+
import java.io.BufferedReader;
|
|
7
|
+
import java.io.File;
|
|
8
|
+
import java.io.FileReader;
|
|
9
|
+
import java.util.HashSet;
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* tbplot genestructure — TBtools 基因结构图 CLI(08/29 重建)
|
|
13
|
+
*
|
|
14
|
+
* 用法: GeneStructureCli <input.gff> <idList.txt> <outFile> [genome.fa] [width] [height]
|
|
15
|
+
* input.gff: GFF/GXF 格式基因注释(含 mRNA 行)
|
|
16
|
+
* idList.txt: mRNA ID 列表(每行一个)
|
|
17
|
+
* genome.fa: 基因组序列(可选,用于显示 UTR 等)
|
|
18
|
+
* outFile: 输出 SVG/PNG
|
|
19
|
+
* width/height: 画布尺寸(默认 1200x600)
|
|
20
|
+
*
|
|
21
|
+
* 引擎: DrawGeneStructureFromGXFfile(继承 DrawMotifPatternFromMEMEResult)
|
|
22
|
+
* 核心: ParseGeneStructureFromGXF.parse(GFF) + setRetainIDList + insertSeqFromGenome
|
|
23
|
+
* 绘图: postGraph(null, basePanel) 返回 JIGSubPanel(第一参数 Newick 传 null 跳过)
|
|
24
|
+
*/
|
|
25
|
+
public class GeneStructureCli {
|
|
26
|
+
public static void main(String[] args) throws Exception {
|
|
27
|
+
if (args.length < 3) {
|
|
28
|
+
System.err.println("用法: GeneStructureCli <input.gff> <idList.txt> <outFile> [genome.fa] [width] [height]");
|
|
29
|
+
System.exit(1);
|
|
30
|
+
}
|
|
31
|
+
String gffFile = args[0];
|
|
32
|
+
String idFile = args[1];
|
|
33
|
+
String outFile = args[2];
|
|
34
|
+
File genomeFile = args.length > 3 ? new File(args[3]) : null;
|
|
35
|
+
int width = args.length > 4 ? Integer.parseInt(args[4]) : 1200;
|
|
36
|
+
int height = args.length > 5 ? Integer.parseInt(args[5]) : 600;
|
|
37
|
+
|
|
38
|
+
// 读取 mRNA ID 列表
|
|
39
|
+
HashSet<String> retainIds = new HashSet<String>();
|
|
40
|
+
BufferedReader br = new BufferedReader(new FileReader(idFile));
|
|
41
|
+
String line;
|
|
42
|
+
while ((line = br.readLine()) != null) {
|
|
43
|
+
line = line.trim();
|
|
44
|
+
if (!line.isEmpty() && !line.startsWith("#")) retainIds.add(line);
|
|
45
|
+
}
|
|
46
|
+
br.close();
|
|
47
|
+
if (retainIds.isEmpty()) {
|
|
48
|
+
System.err.println("错误: idList 为空");
|
|
49
|
+
System.exit(1);
|
|
50
|
+
}
|
|
51
|
+
System.err.println("[tbplot] mRNA ID 数: " + retainIds.size());
|
|
52
|
+
|
|
53
|
+
// 解析 GFF 构建基因结构
|
|
54
|
+
DrawGeneStructureFromGXFfile drawer = new DrawGeneStructureFromGXFfile();
|
|
55
|
+
ParseGeneStructureFromGXF parser = new ParseGeneStructureFromGXF();
|
|
56
|
+
parser.setRetainIDList(retainIds);
|
|
57
|
+
if (genomeFile != null && genomeFile.exists()) {
|
|
58
|
+
parser.insertSeqFromGenome(genomeFile);
|
|
59
|
+
}
|
|
60
|
+
parser.parse(new File(gffFile));
|
|
61
|
+
|
|
62
|
+
// 关键: 用 DrawGeneStructureFromGXFfile 的 field 来展示(通过继承的 postGraph)
|
|
63
|
+
// DrawGeneStructureFromGXFfile 需要 setInFile(GFF) 供 metaParser 使用,
|
|
64
|
+
// 但这里已直接用 ParseGeneStructureFromGXF;改用直接调用后者的数据结构
|
|
65
|
+
drawer.setInFile(new File(gffFile));
|
|
66
|
+
drawer.setMaxMotif(1000); // 避免 motif 过多弹窗
|
|
67
|
+
if (genomeFile != null && genomeFile.exists()) drawer.setInGenomeSeqFile(genomeFile);
|
|
68
|
+
|
|
69
|
+
// 用反射注入已解析的结构:DrawGeneStructureFromGXFfile 内部会重新 parse,
|
|
70
|
+
// 因此直接使用其 metaParser + postGraph 流程
|
|
71
|
+
JIGBasePanel base = new JIGBasePanel(width, height);
|
|
72
|
+
JIGSubPanel panel = drawer.postGraph(null, base);
|
|
73
|
+
if (panel == null) {
|
|
74
|
+
System.err.println("错误: postGraph 返回 null");
|
|
75
|
+
System.exit(1);
|
|
76
|
+
}
|
|
77
|
+
base.addSubPanel(panel);
|
|
78
|
+
|
|
79
|
+
String low = outFile.toLowerCase();
|
|
80
|
+
if (low.endsWith(".png")) {
|
|
81
|
+
base.save2PNG(new File(outFile));
|
|
82
|
+
} else if (low.endsWith(".pdf")) {
|
|
83
|
+
base.save2PDF(new File(outFile));
|
|
84
|
+
} else {
|
|
85
|
+
base.save2SVG(new File(outFile));
|
|
86
|
+
}
|
|
87
|
+
System.err.println("[tbplot] 已保存: " + outFile);
|
|
88
|
+
System.exit(0);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
import jigplot.engine.JIGBasePanel;
|
|
2
|
+
import jigplot.engine.JIGSubPanel;
|
|
3
|
+
import jigplot.OtherTools.JIGUtils;
|
|
4
|
+
|
|
5
|
+
import java.awt.Color;
|
|
6
|
+
import java.io.File;
|
|
7
|
+
import java.lang.reflect.Method;
|
|
8
|
+
import java.util.ArrayList;
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* GenericCli — TBtools 通用反射绘图桥(08/29 新增,根治 /tmp 清理导致桥丢失)
|
|
12
|
+
*
|
|
13
|
+
* 用反射驱动任意 TBtools 引擎,覆盖统一模式:
|
|
14
|
+
* setter(File/String/int/boolean/double/Color) → plot()/process()/makeGraph() → JIGSubPanel(JIGSubPanel[]) → save2Graph
|
|
15
|
+
*
|
|
16
|
+
* 用法:
|
|
17
|
+
* java -cp JAR:tbplot_cli GenericCli <engineClass> <method> <outFile> [--set field value ...] [--width N] [--height N]
|
|
18
|
+
*
|
|
19
|
+
* engineClass: 完整类名(如 biocjava.bioDoer.JIGplotToolkit.Synteny.MultipleSpeciesSyteny)
|
|
20
|
+
* method: 绘图方法名,可用 + 连接按序调用(如 doPCA+postGraph => 先 doPCA 再 postGraph)
|
|
21
|
+
* plot / process / makeGraph / postGraph 等,返回 JIGSubPanel(JIGSubPanel[]) 的作为结果
|
|
22
|
+
* outFile: 输出 SVG/PNG
|
|
23
|
+
* --set: 调用 set<Field>(value),类型自动推断:
|
|
24
|
+
* File -> new File(value)
|
|
25
|
+
* String -> value
|
|
26
|
+
* int -> Integer.parseInt
|
|
27
|
+
* double -> Double.parseDouble
|
|
28
|
+
* float -> Float.parseFloat
|
|
29
|
+
* boolean-> Boolean.parseBoolean
|
|
30
|
+
* Color -> 解析 "r,g,b" 或 名字(RED/GREEN/...)
|
|
31
|
+
* Enum -> Enum.valueOf(type, value)
|
|
32
|
+
* --width/--height: JIGBasePanel 尺寸(默认 1000x800)
|
|
33
|
+
*/
|
|
34
|
+
public class GenericCli {
|
|
35
|
+
public static void main(String[] args) throws Exception {
|
|
36
|
+
if (args.length < 3) {
|
|
37
|
+
System.err.println("用法: GenericCli <engineClass> <method> <outFile> [--set field value ...] [--width N] [--height N]");
|
|
38
|
+
System.err.println("例: GenericCli biocjava.bioDoer.JIGplotToolkit.Synteny.MultipleSpeciesSyteny plot out.svg --set inSimplifiedGff genes.pos --set chrLayoutFile layout.txt --set genePairInfoFile links.txt");
|
|
39
|
+
System.exit(1);
|
|
40
|
+
}
|
|
41
|
+
String engineClass = args[0];
|
|
42
|
+
String methodName = args[1];
|
|
43
|
+
String outFile = args[2];
|
|
44
|
+
int width = 1000, height = 800;
|
|
45
|
+
|
|
46
|
+
// 解析 --set / --width / --height
|
|
47
|
+
ArrayList<String[]> setters = new ArrayList<String[]>();
|
|
48
|
+
for (int i = 3; i < args.length; i++) {
|
|
49
|
+
if (args[i].equals("--set") && i + 2 < args.length) {
|
|
50
|
+
setters.add(new String[]{args[i+1], args[i+2]});
|
|
51
|
+
i += 2;
|
|
52
|
+
} else if (args[i].equals("--width") && i + 1 < args.length) {
|
|
53
|
+
width = Integer.parseInt(args[i+1]); i++;
|
|
54
|
+
} else if (args[i].equals("--height") && i + 1 < args.length) {
|
|
55
|
+
height = Integer.parseInt(args[i+1]); i++;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
Class<?> cls = Class.forName(engineClass);
|
|
60
|
+
Object engine = cls.getDeclaredConstructor().newInstance();
|
|
61
|
+
|
|
62
|
+
// 应用 setter
|
|
63
|
+
for (String[] kv : setters) {
|
|
64
|
+
String field = kv[0];
|
|
65
|
+
String value = kv[1];
|
|
66
|
+
String setterName = "set" + Character.toUpperCase(field.charAt(0)) + field.substring(1);
|
|
67
|
+
Method setter = findSetter(cls, setterName);
|
|
68
|
+
if (setter == null) {
|
|
69
|
+
System.err.println("警告: 未找到 setter " + setterName + ",跳过");
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
Class<?> ptype = setter.getParameterTypes()[0];
|
|
73
|
+
Object pval = coerce(ptype, value);
|
|
74
|
+
setter.invoke(engine, pval);
|
|
75
|
+
System.err.println("set " + field + " = " + value);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// 调用绘图方法(支持 + 连接多方法)
|
|
79
|
+
Object lastResult = null;
|
|
80
|
+
for (String mn : methodName.split("\\+")) {
|
|
81
|
+
Method method = findMethod(cls, mn.trim());
|
|
82
|
+
if (method == null) {
|
|
83
|
+
System.err.println("错误: 未找到方法 " + mn.trim() + " in " + engineClass);
|
|
84
|
+
System.exit(1);
|
|
85
|
+
}
|
|
86
|
+
Object result = method.invoke(engine);
|
|
87
|
+
if (result != null) lastResult = result;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// 收集返回的 JIGSubPanel(支持单面板 / 面板数组)
|
|
91
|
+
ArrayList<JIGSubPanel> panels = new ArrayList<JIGSubPanel>();
|
|
92
|
+
if (lastResult == null) {
|
|
93
|
+
System.err.println("错误: 方法链未返回 JIGSubPanel,无法保存");
|
|
94
|
+
System.exit(1);
|
|
95
|
+
}
|
|
96
|
+
if (lastResult instanceof JIGSubPanel) {
|
|
97
|
+
panels.add((JIGSubPanel) lastResult);
|
|
98
|
+
} else if (lastResult instanceof JIGSubPanel[]) {
|
|
99
|
+
for (JIGSubPanel p : (JIGSubPanel[]) lastResult) panels.add(p);
|
|
100
|
+
} else {
|
|
101
|
+
System.err.println("警告: 返回类型 " + lastResult.getClass() + " 不是 JIGSubPanel");
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
if (panels.isEmpty()) {
|
|
105
|
+
System.err.println("错误: 没有可保存的绘图面板");
|
|
106
|
+
System.exit(1);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
JIGSubPanel[] arr = panels.toArray(new JIGSubPanel[0]);
|
|
110
|
+
// 固定尺寸 JIGBasePanel + addSubPanel + 直接保存(参照 SuperCircosCli 成功模式,
|
|
111
|
+
// 不做 quickArrange/setSize——那些会对某些引擎产生异常尺寸)
|
|
112
|
+
JIGBasePanel base = new JIGBasePanel(width, height);
|
|
113
|
+
for (JIGSubPanel p : arr) base.addSubPanel(p);
|
|
114
|
+
File outf = new File(outFile);
|
|
115
|
+
String low = outFile.toLowerCase();
|
|
116
|
+
if (low.endsWith(".svg")) base.save2SVG(outf);
|
|
117
|
+
else if (low.endsWith(".png")) base.save2PNG(outf);
|
|
118
|
+
else if (low.endsWith(".pdf")) base.save2PDF(outf);
|
|
119
|
+
else { base.save2SVG(new File(outFile + ".svg")); }
|
|
120
|
+
System.err.println("已保存: " + outFile + " (" + panels.size() + " 面板, " + width + "x" + height + ")");
|
|
121
|
+
// 强制退出:某些引擎绘图后残留非 daemon 线程(如图例监听),
|
|
122
|
+
// 不 exit 会导致 JVM 永不退出,命令悬挂到超时
|
|
123
|
+
System.exit(0);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
static Method findSetter(Class<?> cls, String name) {
|
|
127
|
+
for (Method m : cls.getMethods()) {
|
|
128
|
+
if (m.getName().equals(name) && m.getParameterCount() == 1) return m;
|
|
129
|
+
}
|
|
130
|
+
return null;
|
|
131
|
+
}
|
|
132
|
+
static Method findMethod(Class<?> cls, String name) {
|
|
133
|
+
for (Method m : cls.getMethods()) {
|
|
134
|
+
if (m.getName().equals(name)) return m;
|
|
135
|
+
}
|
|
136
|
+
return null;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
static Object coerce(Class<?> type, String value) {
|
|
140
|
+
if (type == File.class) return new File(value);
|
|
141
|
+
if (type == String.class) return value;
|
|
142
|
+
if (type == int.class || type == Integer.class) return Integer.parseInt(value);
|
|
143
|
+
if (type == double.class || type == Double.class) return Double.parseDouble(value);
|
|
144
|
+
if (type == float.class || type == Float.class) return Float.parseFloat(value);
|
|
145
|
+
if (type == boolean.class || type == Boolean.class) return Boolean.parseBoolean(value);
|
|
146
|
+
if (type == Color.class) return parseColor(value);
|
|
147
|
+
if (type.isEnum()) return Enum.valueOf((Class<Enum>) type, value);
|
|
148
|
+
if (type == long.class || type == Long.class) return Long.parseLong(value);
|
|
149
|
+
if (type == byte.class || type == Byte.class) return Byte.parseByte(value);
|
|
150
|
+
if (type == short.class || type == Short.class) return Short.parseShort(value);
|
|
151
|
+
throw new RuntimeException("不支持的类型: " + type + " for value " + value);
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
static Color parseColor(String s) {
|
|
155
|
+
String t = s.trim().toUpperCase();
|
|
156
|
+
try {
|
|
157
|
+
String[] rgb = s.split(",");
|
|
158
|
+
if (rgb.length == 3) return new Color(Integer.parseInt(rgb[0].trim()), Integer.parseInt(rgb[1].trim()), Integer.parseInt(rgb[2].trim()));
|
|
159
|
+
} catch (Exception e) { /* fall through */ }
|
|
160
|
+
switch (t) {
|
|
161
|
+
case "RED": return Color.RED;
|
|
162
|
+
case "GREEN": return Color.GREEN;
|
|
163
|
+
case "BLUE": return Color.BLUE;
|
|
164
|
+
case "YELLOW": return Color.YELLOW;
|
|
165
|
+
case "CYAN": return Color.CYAN;
|
|
166
|
+
case "MAGENTA": return Color.MAGENTA;
|
|
167
|
+
case "ORANGE": return Color.ORANGE;
|
|
168
|
+
case "PINK": return Color.PINK;
|
|
169
|
+
case "BLACK": return Color.BLACK;
|
|
170
|
+
case "WHITE": return Color.WHITE;
|
|
171
|
+
case "GRAY": case "GREY": return Color.GRAY;
|
|
172
|
+
case "LIGHT_GRAY": case "LIGHTGREY": return Color.LIGHT_GRAY;
|
|
173
|
+
case "DARK_GRAY": case "DARKGREY": return Color.DARK_GRAY;
|
|
174
|
+
}
|
|
175
|
+
throw new RuntimeException("无法解析颜色: " + s);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import biocjava.bioIO.SRAtools.GetENALinksOfSRR;
|
|
2
|
+
|
|
3
|
+
import java.io.File;
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* tbplot srr2ena — SRR→ENA 下载链接解析 CLI(GUI 逆向 #39,09/21)
|
|
7
|
+
*
|
|
8
|
+
* 用法: GetENALinksCli <srrList.txt> <out.xls>
|
|
9
|
+
* srrList: 每行一个 SRR/ERR/DRR 号(# 开头注释跳过)
|
|
10
|
+
* out: ENA filereport TSV(study/sample/run accession + tax_id +
|
|
11
|
+
* scientific_name + instrument + layout + fastq_ftp/aspera 等 17 字段)
|
|
12
|
+
*
|
|
13
|
+
* 引擎: GetENALinksOfSRR(GUI 逆向:SRR2ENALinksGUIPanel $1 StartButton 回调
|
|
14
|
+
* → setInSRRlistFile/setOutENAinfoFile/process;⚠️ 联网 ENA portal API,
|
|
15
|
+
* 引擎自带 0~3s 随机限速)
|
|
16
|
+
*/
|
|
17
|
+
public class GetENALinksCli {
|
|
18
|
+
public static void main(String[] args) throws Exception {
|
|
19
|
+
if (args.length < 2) {
|
|
20
|
+
System.err.println("用法: GetENALinksCli <srrList.txt> <out.xls>");
|
|
21
|
+
System.exit(1);
|
|
22
|
+
}
|
|
23
|
+
File inList = new File(args[0]);
|
|
24
|
+
File outFile = new File(args[1]);
|
|
25
|
+
if (!inList.exists()) {
|
|
26
|
+
System.err.println("错误: 输入文件不存在: " + inList.getAbsolutePath());
|
|
27
|
+
System.exit(2);
|
|
28
|
+
}
|
|
29
|
+
GetENALinksOfSRR gels = new GetENALinksOfSRR();
|
|
30
|
+
gels.setInSRRlistFile(inList);
|
|
31
|
+
gels.setOutENAinfoFile(outFile);
|
|
32
|
+
gels.process();
|
|
33
|
+
System.err.println("[tbplot] ENA 链接解析完成: " + outFile.getAbsolutePath());
|
|
34
|
+
System.exit(0);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import biocjava.bioDoer.FileUtils.FileUtils;
|
|
2
|
+
import biocjava.bioDoer.JIGplotToolkit.newickParser.PhyloTreeMan;
|
|
3
|
+
|
|
4
|
+
import java.io.BufferedReader;
|
|
5
|
+
import java.io.File;
|
|
6
|
+
import java.io.FileReader;
|
|
7
|
+
import java.util.HashSet;
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* tbplot subtree — Newick 子树提取 CLI(GUI 逆向 #23,09/20)
|
|
11
|
+
*
|
|
12
|
+
* 用法: GetSubNewickTreeCli <tree.nwk> <idList.txt> <out.nwk> [--contain]
|
|
13
|
+
* tree.nwk: 完整 Newick 树
|
|
14
|
+
* idList: 要保留的叶节点 ID(每行一个)
|
|
15
|
+
* out.nwk: 提取出的子树
|
|
16
|
+
* --contain: 模糊匹配(ID 为叶名子串即保留;默认精确匹配)
|
|
17
|
+
*
|
|
18
|
+
* 引擎: PhyloTreeMan.getSubTree + nodeToNwk(GUI 逆向:GetSubNewickTreeGUIPanel $1
|
|
19
|
+
* StartButton 回调;GUI 的 quickPlotTree 预览部分已跳过)
|
|
20
|
+
*/
|
|
21
|
+
public class GetSubNewickTreeCli {
|
|
22
|
+
public static void main(String[] args) throws Exception {
|
|
23
|
+
if (args.length < 3) {
|
|
24
|
+
System.err.println("用法: GetSubNewickTreeCli <tree.nwk> <idList.txt> <out.nwk> [--contain]");
|
|
25
|
+
System.exit(1);
|
|
26
|
+
}
|
|
27
|
+
File inTree = new File(args[0]);
|
|
28
|
+
File idFile = new File(args[1]);
|
|
29
|
+
File outFile = new File(args[2]);
|
|
30
|
+
boolean contain = args.length > 3 && args[3].equals("--contain");
|
|
31
|
+
if (!inTree.exists() || !idFile.exists()) {
|
|
32
|
+
System.err.println("错误: 输入文件不存在");
|
|
33
|
+
System.exit(2);
|
|
34
|
+
}
|
|
35
|
+
String newickString = FileUtils.fileToString(inTree);
|
|
36
|
+
HashSet<String> keptNode = new HashSet<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()) keptNode.add(line);
|
|
42
|
+
}
|
|
43
|
+
br.close();
|
|
44
|
+
PhyloTreeMan ptm = new PhyloTreeMan();
|
|
45
|
+
String subNwk = ptm.nodeToNwk(ptm.getSubTree(newickString, keptNode, contain));
|
|
46
|
+
FileUtils.stringToFile(subNwk, outFile);
|
|
47
|
+
System.err.println("[tbplot] 子树提取完成: " + outFile.getAbsolutePath() + "(保留 " + keptNode.size() + " 个 ID)");
|
|
48
|
+
System.exit(0);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import java.io.File;
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* tbplot goEnrich — GO 富集分析 CLI(G4 缺口补齐,WorkBuddy 2026-09-19 报告 §8)
|
|
5
|
+
*
|
|
6
|
+
* 用法: GoEnrichCli <go.obo> <gene2go.tsv> <selectGenes.txt> <outDir>
|
|
7
|
+
* go.obo: GO 基本 OBO 数据库文件(go-basic.obo)
|
|
8
|
+
* gene2go.tsv: 背景注释,每行 geneID\tGO:0000001,GO:0000002(也兼容 ; 分隔、多列 GO)
|
|
9
|
+
* selectGenes.txt: 目标基因集(每行一个 geneID)
|
|
10
|
+
* outDir: 输出目录
|
|
11
|
+
*
|
|
12
|
+
* 输出: outDir/<selectName>.GO.Enrichment.final.xls(三本体合并显著结果表)
|
|
13
|
+
* 列: Class / GO_Name / GO_ID / GO_Level / P_value / EnrichmentScore /
|
|
14
|
+
* HitsGenesCountsInSelectedSet / HitsGenesCountsInBackground / corrected p-value(BH)
|
|
15
|
+
* (cleanMode=true 会清掉 MF/CC/BP 三个中间表,只留合并终表)
|
|
16
|
+
*
|
|
17
|
+
* ⚠️ main() 硬编码路径——改走 prepareForEnrichMent + AutoEnrichMent 方法链。
|
|
18
|
+
* cleanMode=true 清中间文件(_ParsedAllGO.xls 等)。
|
|
19
|
+
*/
|
|
20
|
+
public class GoEnrichCli {
|
|
21
|
+
public static void main(String[] args) throws Exception {
|
|
22
|
+
if (args.length < 4) {
|
|
23
|
+
System.err.println("用法: GoEnrichCli <go.obo> <gene2go.tsv> <selectGenes.txt> <outDir>");
|
|
24
|
+
System.exit(1);
|
|
25
|
+
}
|
|
26
|
+
File outDir = new File(args[3]);
|
|
27
|
+
if (!outDir.isDirectory() && !outDir.mkdirs()) {
|
|
28
|
+
System.err.println("[GoEnrichCli] ❌ 无法创建输出目录: " + args[3]);
|
|
29
|
+
System.exit(1);
|
|
30
|
+
}
|
|
31
|
+
Object e = Class.forName("biocjava.bioIO.GeneOntology.EnrichMent.GOTermEnrichment")
|
|
32
|
+
.getDeclaredConstructor().newInstance();
|
|
33
|
+
Class<?> c = e.getClass();
|
|
34
|
+
c.getMethod("setCleanMode", boolean.class).invoke(e, true);
|
|
35
|
+
c.getMethod("prepareForEnrichMent", File.class, File.class)
|
|
36
|
+
.invoke(e, new File(args[0]), new File(args[1]));
|
|
37
|
+
c.getMethod("AutoEnrichMent", File.class, String.class)
|
|
38
|
+
.invoke(e, new File(args[2]), args[3]);
|
|
39
|
+
System.err.println("[tbplot] GO 富集完成(MF/CC/BP 三表): " + args[3]);
|
|
40
|
+
System.exit(0);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* tbplot golevel — GO 层级统计 + 层级柱状图 CLI(GUI 面板逆向接口,09/20)
|
|
3
|
+
*
|
|
4
|
+
* 用法: GoLevelCli <go.obo> <gene2go.tsv> <outPrefix> [--level N] [--graph] [--width W] [--height H]
|
|
5
|
+
* go.obo: GO 本体数据库
|
|
6
|
+
* gene2go.tsv: 基因→GO 注释(geneID\tGO:x,GO:y)
|
|
7
|
+
* outPrefix: 输出前缀
|
|
8
|
+
* --level: GO 层级(默认 2,1-23)
|
|
9
|
+
* --graph: 同时画层级柱状图(默认只出统计表)
|
|
10
|
+
*
|
|
11
|
+
* 接口来源:反编译 LevelGounterGUIPanel(GUI 真实调用链):
|
|
12
|
+
* LevelCounter llg = new LevelCounter();
|
|
13
|
+
* llg.setGOdb(oboFilePath).setGene2GoFile(query2GoFilePath).init();
|
|
14
|
+
* llg.writeGo2GenesFileAtLevel(level, outTable); // 统计表 .Level2.count.xls
|
|
15
|
+
* LevelGrapher lg = new LevelGrapher(outTable, outSVG); // 直接写 SVG(无 GUI 弹窗)
|
|
16
|
+
* lg.setGraphWidth(W); lg.setGraphHeight(H); lg.makeLevelGraph();
|
|
17
|
+
*/
|
|
18
|
+
public class GoLevelCli {
|
|
19
|
+
public static void main(String[] args) throws Exception {
|
|
20
|
+
int level = 2;
|
|
21
|
+
boolean graph = false;
|
|
22
|
+
String width = "800", height = "600";
|
|
23
|
+
java.util.ArrayList<String> pos = new java.util.ArrayList<String>();
|
|
24
|
+
for (int i = 0; i < args.length; i++) {
|
|
25
|
+
if (args[i].equals("--level") && i+1 < args.length) level = Integer.parseInt(args[++i]);
|
|
26
|
+
else if (args[i].equals("--graph")) graph = true;
|
|
27
|
+
else if (args[i].equals("--width") && i+1 < args.length) width = args[++i];
|
|
28
|
+
else if (args[i].equals("--height") && i+1 < args.length) height = args[++i];
|
|
29
|
+
else pos.add(args[i]);
|
|
30
|
+
}
|
|
31
|
+
if (pos.size() < 3) {
|
|
32
|
+
System.err.println("用法: GoLevelCli <go.obo> <gene2go.tsv> <outPrefix> [--level N] [--graph] [--width W] [--height H]");
|
|
33
|
+
System.exit(1);
|
|
34
|
+
}
|
|
35
|
+
String obo = pos.get(0), gene2go = pos.get(1), outPrefix = pos.get(2);
|
|
36
|
+
String outTable = outPrefix + ".Level" + level + ".count.xls";
|
|
37
|
+
|
|
38
|
+
Object lc = Class.forName("biocjava.bioDoer.GeneOntology.Grapher.LevelCounter")
|
|
39
|
+
.getDeclaredConstructor().newInstance();
|
|
40
|
+
Class<?> c = lc.getClass();
|
|
41
|
+
c.getMethod("setGOdb", java.io.File.class).invoke(lc, new java.io.File(obo));
|
|
42
|
+
c.getMethod("setGene2GoFile", java.io.File.class).invoke(lc, new java.io.File(gene2go));
|
|
43
|
+
c.getMethod("init").invoke(lc);
|
|
44
|
+
c.getMethod("writeGo2GenesFileAtLevel", int.class, String.class).invoke(lc, level, outTable);
|
|
45
|
+
System.err.println("[tbplot] GO 层级统计表: " + outTable);
|
|
46
|
+
|
|
47
|
+
if (graph) {
|
|
48
|
+
String outSVG = outTable + ".svg";
|
|
49
|
+
Object lg = Class.forName("biocjava.bioDoer.GeneOntology.Grapher.LevelGrapher")
|
|
50
|
+
.getConstructor(String.class, String.class).newInstance(outTable, outSVG);
|
|
51
|
+
Class<?> gl = lg.getClass();
|
|
52
|
+
gl.getMethod("setGraphWidth", String.class).invoke(lg, width);
|
|
53
|
+
gl.getMethod("setGraphHeight", String.class).invoke(lg, height);
|
|
54
|
+
gl.getMethod("makeLevelGraph").invoke(lg);
|
|
55
|
+
System.err.println("[tbplot] GO 层级图: " + outSVG);
|
|
56
|
+
}
|
|
57
|
+
System.exit(0);
|
|
58
|
+
}
|
|
59
|
+
}
|