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,66 @@
|
|
|
1
|
+
import biocjava.bioDoer.StructAnnoCompare.StructAnnoCompareConfig;
|
|
2
|
+
import biocjava.bioDoer.StructAnnoCompare.StructAnnoCompareResult;
|
|
3
|
+
import biocjava.bioDoer.StructAnnoCompare.StructAnnoCompareService;
|
|
4
|
+
|
|
5
|
+
import java.io.File;
|
|
6
|
+
import java.nio.file.Path;
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* tbplot annoCompare — 注释版本对比管线 CLI(08/31 第五十二波)
|
|
10
|
+
*
|
|
11
|
+
* 用法: StructAnnoCompareCli <before.gff3> <after.gff3> <outDir> [runName] [reciprocalOverlap] [boundaryTol] [cdsChangePct] [utrChangePct] [geneScope] [overlapMode]
|
|
12
|
+
* before/after.gff3: 同一基因组两个版本的注释
|
|
13
|
+
* outDir: 输出目录(自动建)
|
|
14
|
+
* runName: 运行名(默认 "annoCompare")
|
|
15
|
+
* reciprocalOverlap: 双向重叠阈值(默认 0.5)
|
|
16
|
+
* boundaryTol: 边界容差(默认 100)
|
|
17
|
+
* cdsChangePct / utrChangePct: CDS/UTR 变化百分比阈值(默认 0.1 / 0.1)
|
|
18
|
+
* geneScope: all|mrna_only(默认 all)
|
|
19
|
+
* overlapMode: reciprocal|any(默认 reciprocal)
|
|
20
|
+
*
|
|
21
|
+
* 产物: <runName>_change_summary.csv / _change_log.csv / tracks/*_annotation_changes.bed /
|
|
22
|
+
* curation_summary_table.csv / curation_core_metrics.csv / figures/*_curation_summary_jigplot.{png,pdf,svg} /
|
|
23
|
+
* figures/*_ABCD_single_species_jigplot.{png,pdf,svg}
|
|
24
|
+
*
|
|
25
|
+
* 引擎: StructAnnoCompareService.run(StructAnnoCompareConfig)(纯 headless,无弹窗)
|
|
26
|
+
*/
|
|
27
|
+
public class StructAnnoCompareCli {
|
|
28
|
+
public static void main(String[] args) throws Exception {
|
|
29
|
+
if (args.length < 3) {
|
|
30
|
+
System.err.println("用法: StructAnnoCompareCli <before.gff3> <after.gff3> <outDir> [runName] [reciprocalOverlap] [boundaryTol] [cdsChangePct] [utrChangePct] [geneScope] [overlapMode]");
|
|
31
|
+
System.exit(1);
|
|
32
|
+
}
|
|
33
|
+
String before = args[0];
|
|
34
|
+
String after = args[1];
|
|
35
|
+
String outDir = args[2];
|
|
36
|
+
String runName = args.length > 3 ? args[3] : "annoCompare";
|
|
37
|
+
double recOverlap = args.length > 4 ? Double.parseDouble(args[4]) : 0.5;
|
|
38
|
+
int boundaryTol = args.length > 5 ? Integer.parseInt(args[5]) : 100;
|
|
39
|
+
double cdsPct = args.length > 6 ? Double.parseDouble(args[6]) : 0.1;
|
|
40
|
+
double utrPct = args.length > 7 ? Double.parseDouble(args[7]) : 0.1;
|
|
41
|
+
String geneScope = args.length > 8 ? args[8] : "all";
|
|
42
|
+
String overlapMode = args.length > 9 ? args[9] : "reciprocal";
|
|
43
|
+
|
|
44
|
+
StructAnnoCompareConfig cfg = new StructAnnoCompareConfig();
|
|
45
|
+
cfg.setBeforeGff(Path.of(before));
|
|
46
|
+
cfg.setAfterGff(Path.of(after));
|
|
47
|
+
cfg.setOutputDir(Path.of(outDir));
|
|
48
|
+
cfg.setRunName(runName);
|
|
49
|
+
cfg.setReciprocalOverlap(recOverlap);
|
|
50
|
+
cfg.setBoundaryTol(boundaryTol);
|
|
51
|
+
cfg.setCdsChangePct(cdsPct);
|
|
52
|
+
cfg.setUtrChangePct(utrPct);
|
|
53
|
+
cfg.setGeneScope(geneScope);
|
|
54
|
+
cfg.setOverlapMode(overlapMode);
|
|
55
|
+
cfg.setGenerateVisualization(true);
|
|
56
|
+
cfg.setLogConsumer(System.err::println);
|
|
57
|
+
|
|
58
|
+
StructAnnoCompareResult r = new StructAnnoCompareService().run(cfg);
|
|
59
|
+
System.err.println("[tbplot] summary: " + r.getSummaryPath());
|
|
60
|
+
System.err.println("[tbplot] change log: " + r.getChangeLogPath() + " (" + r.getChangeLogEntries() + " 条)");
|
|
61
|
+
System.err.println("[tbplot] curation core: " + r.getCurationCoreMetricsPath());
|
|
62
|
+
if (r.getFigurePng() != null) System.err.println("[tbplot] curation figure: " + r.getFigurePng());
|
|
63
|
+
if (r.getAbcdFigurePng() != null) System.err.println("[tbplot] ABCD figure: " + r.getAbcdFigurePng());
|
|
64
|
+
System.exit(0);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* tbplot smart — SMART 域注释 CLI(插件 P00060 CLI 化)
|
|
3
|
+
*
|
|
4
|
+
* 用法: SubmitSMARTCli <in.fa> <out.txt> [--pfam] [--signalp] [--disembl] [--schnipsel] [--rep]
|
|
5
|
+
* 开关默认全开;关闭传 --no-xxx 不需要(默认全 true)
|
|
6
|
+
*
|
|
7
|
+
* ⚠️ 联网:POST 到 EMBL ismart.embl.de/smart/show_motifs.pl(约 10-60s)。
|
|
8
|
+
* 输出: 每行 query + 域位置 + 域类型(Pfam:XXX / low_complexity_region 等)。
|
|
9
|
+
*/
|
|
10
|
+
public class SubmitSMARTCli {
|
|
11
|
+
public static void main(String[] args) throws Exception {
|
|
12
|
+
if (args.length < 2) {
|
|
13
|
+
System.err.println("用法: SubmitSMARTCli <in.fa> <out.txt>");
|
|
14
|
+
System.exit(1);
|
|
15
|
+
}
|
|
16
|
+
Object s = Class.forName("BatchSMART.submitSMART").getDeclaredConstructor().newInstance();
|
|
17
|
+
Class<?> c = s.getClass();
|
|
18
|
+
c.getMethod("setInFa", java.io.File.class).invoke(s, new java.io.File(args[0]));
|
|
19
|
+
c.getMethod("setOutTab", java.io.File.class).invoke(s, new java.io.File(args[1]));
|
|
20
|
+
c.getMethod("setDo_pfam", boolean.class).invoke(s, true);
|
|
21
|
+
c.getMethod("setDo_signalp", boolean.class).invoke(s, true);
|
|
22
|
+
c.getMethod("setDo_disembl", boolean.class).invoke(s, true);
|
|
23
|
+
c.getMethod("setDo_schnipsel", boolean.class).invoke(s, true);
|
|
24
|
+
c.getMethod("setDo_rep", boolean.class).invoke(s, true);
|
|
25
|
+
c.getMethod("setFinished", boolean.class).invoke(s, false);
|
|
26
|
+
c.getMethod("process").invoke(s);
|
|
27
|
+
System.err.println("[tbplot] SMART 注释完成: " + args[1]);
|
|
28
|
+
System.exit(0);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
@@ -0,0 +1,330 @@
|
|
|
1
|
+
import biocjava.bioDoer.JIGplotToolkit.Circos.SuperCircos.JIGSuperCircos;
|
|
2
|
+
import biocjava.bioDoer.JIGplotToolkit.Circos.SuperCircos.JIGSuperCircosControl;
|
|
3
|
+
import biocjava.bioDoer.JIGplotToolkit.Circos.SuperCircos.JIGSuperTrack;
|
|
4
|
+
import biocjava.bioDoer.JIGplotToolkit.Circos.LinkObj;
|
|
5
|
+
import biocjava.bioDoer.JIGplotToolkit.Circos.chrFeature;
|
|
6
|
+
import jigplot.engine.JIGBasePanel;
|
|
7
|
+
import jigplot.engine.JIGSubPanel;
|
|
8
|
+
import jigplot.engine.JIGConstants;
|
|
9
|
+
|
|
10
|
+
import java.awt.Color;
|
|
11
|
+
import java.awt.Font;
|
|
12
|
+
import java.io.File;
|
|
13
|
+
import java.util.ArrayList;
|
|
14
|
+
import java.util.LinkedHashMap;
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* SuperCircos CLI — 多轨道环形图
|
|
18
|
+
*
|
|
19
|
+
* 用法:
|
|
20
|
+
* java -cp JAR:tbplot SuperCircosCli <config.cfg> <outFile> [width] [height]
|
|
21
|
+
*
|
|
22
|
+
* 配置格式(行导向,# 注释):
|
|
23
|
+
* [chrLen] <file> # 染色体长度文件: ChrName\tStart-End 或 ChrName\tLength
|
|
24
|
+
* [link] <file> # 连接文件: ChrA\tStartA\tEndA\tChrB\tStartB\tEndB\t[Color]
|
|
25
|
+
* [gene] <file> # 基因位置文件: Chr\tGeneName\tStart\tEnd
|
|
26
|
+
* [track] <type> <file> <startPos> <endPos> <color1> <color2> <color3> <binSize> [fillColor] [drawColor]
|
|
27
|
+
* type: Tile|Triangle|HeatMap|Point|Line|Bar|Arrow
|
|
28
|
+
* color: RGB 格式 "255,0,0" 或 颜色名 RED|ORANGE|BLUE|YELLOW|CYAN|GREEN|BLACK|WHITE|GRAY|DARK_GRAY|LIGHT_GRAY
|
|
29
|
+
* [width] <int> # 画布宽度 (默认 800)
|
|
30
|
+
* [height] <int> # 画布高度 (默认 800)
|
|
31
|
+
* [linkColor] <r,g,b> # 连线颜色
|
|
32
|
+
* [linkStroke] <float> # 连线粗细 (默认 1.0)
|
|
33
|
+
* [chrFillColor] <r,g,b> # 染色体填充色
|
|
34
|
+
* [chrLabelColor] <r,g,b> # 染色体标签色
|
|
35
|
+
* [chrLabelFont] <name> <style> <size> # 染色体标签字体
|
|
36
|
+
* [geneLabelShow] true|false # 是否显示基因标签
|
|
37
|
+
* [chrLabelShow] true|false # 是否显示染色体标签
|
|
38
|
+
* [chrBarShow] true|false # 是否显示染色体条
|
|
39
|
+
* [tickShow] true|false # 是否显示刻度
|
|
40
|
+
* [majorTickInterval] <int> # 主刻度间隔 (bp)
|
|
41
|
+
* [minorTickInterval] <int> # 次刻度间隔 (bp)
|
|
42
|
+
* [startAngle] <int> # 起始角度
|
|
43
|
+
* [endAngle] <int> # 结束角度
|
|
44
|
+
* [circlize] true|false # 是否环形
|
|
45
|
+
*/
|
|
46
|
+
public class SuperCircosCli {
|
|
47
|
+
|
|
48
|
+
public static void main(String[] args) throws Exception {
|
|
49
|
+
if (args.length < 2) {
|
|
50
|
+
System.err.println("用法: SuperCircosCli <config.cfg> <outFile> [width] [height]");
|
|
51
|
+
System.exit(1);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
String configFile = args[0];
|
|
55
|
+
String outFile = args[1];
|
|
56
|
+
int width = 800;
|
|
57
|
+
int height = 800;
|
|
58
|
+
if (args.length > 2) width = Integer.parseInt(args[2]);
|
|
59
|
+
if (args.length > 3) height = Integer.parseInt(args[3]);
|
|
60
|
+
|
|
61
|
+
// 解析配置
|
|
62
|
+
java.io.BufferedReader br = new java.io.BufferedReader(new java.io.FileReader(configFile));
|
|
63
|
+
String line;
|
|
64
|
+
|
|
65
|
+
File chrLenFile = null;
|
|
66
|
+
File linkFile = null;
|
|
67
|
+
File geneFile = null;
|
|
68
|
+
ArrayList<JIGSuperTrack> tracks = new ArrayList<JIGSuperTrack>();
|
|
69
|
+
|
|
70
|
+
Color linkColor = Color.LIGHT_GRAY;
|
|
71
|
+
float linkStroke = 1.0f;
|
|
72
|
+
Color chrFillColor = new Color(240, 240, 240);
|
|
73
|
+
Color chrLabelColor = Color.ORANGE;
|
|
74
|
+
Font chrLabelFont = new Font("Arial", Font.BOLD, 14);
|
|
75
|
+
boolean geneLabelShow = true;
|
|
76
|
+
boolean chrLabelShow = true;
|
|
77
|
+
boolean chrBarShow = true;
|
|
78
|
+
boolean tickShow = true;
|
|
79
|
+
int majorTickInterval = 10000000;
|
|
80
|
+
int minorTickInterval = 2000000;
|
|
81
|
+
int startAngle = 0;
|
|
82
|
+
int endAngle = 360;
|
|
83
|
+
boolean circlize = true;
|
|
84
|
+
|
|
85
|
+
while ((line = br.readLine()) != null) {
|
|
86
|
+
line = line.trim();
|
|
87
|
+
if (line.startsWith("#") || line.isEmpty()) continue;
|
|
88
|
+
|
|
89
|
+
String[] parts = line.split("\\s+", 2);
|
|
90
|
+
String key = parts[0];
|
|
91
|
+
String value = parts.length > 1 ? parts[1].trim() : "";
|
|
92
|
+
|
|
93
|
+
if (key.equals("[chrLen]")) {
|
|
94
|
+
chrLenFile = new File(value);
|
|
95
|
+
} else if (key.equals("[link]")) {
|
|
96
|
+
linkFile = new File(value);
|
|
97
|
+
} else if (key.equals("[gene]")) {
|
|
98
|
+
geneFile = new File(value);
|
|
99
|
+
} else if (key.equals("[track]")) {
|
|
100
|
+
// [track] <type> <file> <startPos> <endPos> <color1> <color2> <color3> <binSize> [fillColor] [drawColor]
|
|
101
|
+
String[] tParts = value.split("\\s+");
|
|
102
|
+
String trackType = tParts[0];
|
|
103
|
+
File trackFile = new File(tParts[1]);
|
|
104
|
+
int startPos = Integer.parseInt(tParts[2]);
|
|
105
|
+
int endPos = Integer.parseInt(tParts[3]);
|
|
106
|
+
Color c1 = parseColor(tParts[4]);
|
|
107
|
+
Color c2 = parseColor(tParts[5]);
|
|
108
|
+
Color c3 = parseColor(tParts[6]);
|
|
109
|
+
int binSize = Integer.parseInt(tParts[7]);
|
|
110
|
+
|
|
111
|
+
JIGSuperTrack track = new JIGSuperTrack();
|
|
112
|
+
track.setInTabFile(trackFile);
|
|
113
|
+
track.setInTrackType(parseTrackType(trackType));
|
|
114
|
+
track.setTrackStartPos(startPos);
|
|
115
|
+
track.setTrackEndPos(endPos);
|
|
116
|
+
track.setEleMentColorOne(c1);
|
|
117
|
+
track.setEleMentColorTwo(c2);
|
|
118
|
+
track.setEleMentColorThree(c3);
|
|
119
|
+
track.setBinSize(binSize);
|
|
120
|
+
|
|
121
|
+
if (tParts.length > 8 && !tParts[8].equals("-")) {
|
|
122
|
+
track.setFillColor(parseColor(tParts[8]));
|
|
123
|
+
}
|
|
124
|
+
if (tParts.length > 9 && !tParts[9].equals("-")) {
|
|
125
|
+
track.setDrawColor(parseColor(tParts[9]));
|
|
126
|
+
}
|
|
127
|
+
tracks.add(track);
|
|
128
|
+
} else if (key.equals("[width]")) {
|
|
129
|
+
width = Integer.parseInt(value);
|
|
130
|
+
} else if (key.equals("[height]")) {
|
|
131
|
+
height = Integer.parseInt(value);
|
|
132
|
+
} else if (key.equals("[linkColor]")) {
|
|
133
|
+
linkColor = parseColor(value);
|
|
134
|
+
} else if (key.equals("[linkStroke]")) {
|
|
135
|
+
linkStroke = Float.parseFloat(value);
|
|
136
|
+
} else if (key.equals("[chrFillColor]")) {
|
|
137
|
+
chrFillColor = parseColor(value);
|
|
138
|
+
} else if (key.equals("[chrLabelColor]")) {
|
|
139
|
+
chrLabelColor = parseColor(value);
|
|
140
|
+
} else if (key.equals("[chrLabelFont]")) {
|
|
141
|
+
String[] fp = value.split("\\s+");
|
|
142
|
+
String fname = fp[0];
|
|
143
|
+
int fstyle = Integer.parseInt(fp[1]);
|
|
144
|
+
int fsize = Integer.parseInt(fp[2]);
|
|
145
|
+
chrLabelFont = new Font(fname, fstyle, fsize);
|
|
146
|
+
} else if (key.equals("[geneLabelShow]")) {
|
|
147
|
+
geneLabelShow = Boolean.parseBoolean(value);
|
|
148
|
+
} else if (key.equals("[chrLabelShow]")) {
|
|
149
|
+
chrLabelShow = Boolean.parseBoolean(value);
|
|
150
|
+
} else if (key.equals("[chrBarShow]")) {
|
|
151
|
+
chrBarShow = Boolean.parseBoolean(value);
|
|
152
|
+
} else if (key.equals("[tickShow]")) {
|
|
153
|
+
tickShow = Boolean.parseBoolean(value);
|
|
154
|
+
} else if (key.equals("[majorTickInterval]")) {
|
|
155
|
+
majorTickInterval = Integer.parseInt(value);
|
|
156
|
+
} else if (key.equals("[minorTickInterval]")) {
|
|
157
|
+
minorTickInterval = Integer.parseInt(value);
|
|
158
|
+
} else if (key.equals("[startAngle]")) {
|
|
159
|
+
startAngle = Integer.parseInt(value);
|
|
160
|
+
} else if (key.equals("[endAngle]")) {
|
|
161
|
+
endAngle = Integer.parseInt(value);
|
|
162
|
+
} else if (key.equals("[circlize]")) {
|
|
163
|
+
circlize = Boolean.parseBoolean(value);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
br.close();
|
|
167
|
+
|
|
168
|
+
// 构建 SuperCircos
|
|
169
|
+
JIGSuperCircos jsc = new JIGSuperCircos();
|
|
170
|
+
|
|
171
|
+
// 读取 chrLen
|
|
172
|
+
if (chrLenFile != null) {
|
|
173
|
+
LinkedHashMap<String, long[]> chrLenMap = new LinkedHashMap<String, long[]>();
|
|
174
|
+
java.io.BufferedReader chrBr = new java.io.BufferedReader(new java.io.FileReader(chrLenFile));
|
|
175
|
+
String chrLine;
|
|
176
|
+
while ((chrLine = chrBr.readLine()) != null) {
|
|
177
|
+
if (chrLine.startsWith("#") || chrLine.trim().isEmpty()) continue;
|
|
178
|
+
String[] cols = chrLine.split("\t");
|
|
179
|
+
String[] rangeArr = cols[1].split("[-:]");
|
|
180
|
+
if (rangeArr.length < 2) {
|
|
181
|
+
chrLenMap.put(cols[0], new long[]{0, Long.parseLong(cols[1])});
|
|
182
|
+
} else {
|
|
183
|
+
chrLenMap.put(cols[0], new long[]{Long.parseLong(rangeArr[0]), Long.parseLong(rangeArr[1])});
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
chrBr.close();
|
|
187
|
+
jsc.setChrLen(chrLenMap);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
// 读取 link
|
|
191
|
+
if (linkFile != null) {
|
|
192
|
+
ArrayList<LinkObj> linkArr = new ArrayList<LinkObj>();
|
|
193
|
+
java.io.BufferedReader linkBr = new java.io.BufferedReader(new java.io.FileReader(linkFile));
|
|
194
|
+
String linkLine;
|
|
195
|
+
while ((linkLine = linkBr.readLine()) != null) {
|
|
196
|
+
if (linkLine.startsWith("#") || linkLine.trim().isEmpty()) continue;
|
|
197
|
+
String[] cols = linkLine.split("\t");
|
|
198
|
+
if (cols.length <= 5) continue;
|
|
199
|
+
LinkObj curLink = new LinkObj();
|
|
200
|
+
chrFeature fromFeature = new chrFeature();
|
|
201
|
+
fromFeature.chrName = cols[0];
|
|
202
|
+
fromFeature.startPos = Integer.parseInt(cols[1]);
|
|
203
|
+
fromFeature.endPos = Integer.parseInt(cols[2]);
|
|
204
|
+
chrFeature toFeature = new chrFeature();
|
|
205
|
+
toFeature.chrName = cols[3];
|
|
206
|
+
toFeature.startPos = Integer.parseInt(cols[4]);
|
|
207
|
+
toFeature.endPos = Integer.parseInt(cols[5]);
|
|
208
|
+
curLink.fromFeature = fromFeature;
|
|
209
|
+
curLink.toFeature = toFeature;
|
|
210
|
+
if (cols.length > 6) {
|
|
211
|
+
curLink.color = parseColor(cols[6]);
|
|
212
|
+
} else {
|
|
213
|
+
curLink.color = new Color(240, 240, 240);
|
|
214
|
+
}
|
|
215
|
+
linkArr.add(curLink);
|
|
216
|
+
}
|
|
217
|
+
linkBr.close();
|
|
218
|
+
jsc.setLinkedRegion(linkArr);
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
// 读取 gene
|
|
222
|
+
if (geneFile != null) {
|
|
223
|
+
LinkedHashMap<String, ArrayList<chrFeature>> genePosMap = new LinkedHashMap<String, ArrayList<chrFeature>>();
|
|
224
|
+
java.io.BufferedReader geneBr = new java.io.BufferedReader(new java.io.FileReader(geneFile));
|
|
225
|
+
String geneLine;
|
|
226
|
+
while ((geneLine = geneBr.readLine()) != null) {
|
|
227
|
+
if (geneLine.startsWith("#") || geneLine.trim().isEmpty()) continue;
|
|
228
|
+
String[] cols = geneLine.split("\t");
|
|
229
|
+
if (cols.length <= 3) continue;
|
|
230
|
+
chrFeature gf = new chrFeature();
|
|
231
|
+
gf.chrName = cols[0];
|
|
232
|
+
gf.featureName = cols[1];
|
|
233
|
+
gf.startPos = Integer.parseInt(cols[2]);
|
|
234
|
+
gf.endPos = Integer.parseInt(cols[3]);
|
|
235
|
+
if (genePosMap.containsKey(gf.chrName)) {
|
|
236
|
+
genePosMap.get(gf.chrName).add(gf);
|
|
237
|
+
} else {
|
|
238
|
+
ArrayList<chrFeature> arr = new ArrayList<chrFeature>();
|
|
239
|
+
arr.add(gf);
|
|
240
|
+
genePosMap.put(gf.chrName, arr);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
geneBr.close();
|
|
244
|
+
jsc.setGenePos(genePosMap);
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
// 设置 track
|
|
248
|
+
if (!tracks.isEmpty()) {
|
|
249
|
+
jsc.setTrackArr(tracks);
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
// 设置参数
|
|
253
|
+
jsc.setGraphWidth(width);
|
|
254
|
+
jsc.setGraphHeight(height);
|
|
255
|
+
jsc.setLinkColor(linkColor);
|
|
256
|
+
jsc.setLinkStrokeSize(linkStroke);
|
|
257
|
+
jsc.setChrFillColor(chrFillColor);
|
|
258
|
+
jsc.setChrLabelColor(chrLabelColor);
|
|
259
|
+
jsc.setChrLabelFont(chrLabelFont);
|
|
260
|
+
jsc.setShowGeneLabel(geneLabelShow);
|
|
261
|
+
jsc.setShowChrLabel(chrLabelShow);
|
|
262
|
+
jsc.setShowChrBar(chrBarShow);
|
|
263
|
+
jsc.setShowIntervalTick(tickShow);
|
|
264
|
+
jsc.setMajorTickInterval(majorTickInterval);
|
|
265
|
+
jsc.setMinorTickInterval(minorTickInterval);
|
|
266
|
+
jsc.setStartAngle(startAngle);
|
|
267
|
+
jsc.setEndAngle(endAngle);
|
|
268
|
+
jsc.setCirclize(circlize);
|
|
269
|
+
|
|
270
|
+
// 调用 plot 获取 JIGSubPanel[]
|
|
271
|
+
JIGSubPanel[] subPanels = jsc.plot();
|
|
272
|
+
|
|
273
|
+
// 构建 JIGBasePanel 并保存
|
|
274
|
+
JIGBasePanel basePanel = new JIGBasePanel(width, height);
|
|
275
|
+
for (JIGSubPanel sp : subPanels) {
|
|
276
|
+
basePanel.addSubPanel(sp);
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
// 保存
|
|
280
|
+
if (outFile.toLowerCase().endsWith(".svg")) {
|
|
281
|
+
basePanel.save2SVG(new java.io.File(outFile));
|
|
282
|
+
} else if (outFile.toLowerCase().endsWith(".png")) {
|
|
283
|
+
basePanel.save2PNG(new java.io.File(outFile));
|
|
284
|
+
} else if (outFile.toLowerCase().endsWith(".pdf")) {
|
|
285
|
+
basePanel.save2PDF(new java.io.File(outFile));
|
|
286
|
+
} else {
|
|
287
|
+
basePanel.save2SVG(new java.io.File(outFile + ".svg"));
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
System.err.println("SuperCircos saved: " + outFile);
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
static Color parseColor(String s) {
|
|
294
|
+
s = s.trim();
|
|
295
|
+
if (s.contains(",")) {
|
|
296
|
+
String[] rgb = s.split(",");
|
|
297
|
+
return new Color(Integer.parseInt(rgb[0].trim()), Integer.parseInt(rgb[1].trim()), Integer.parseInt(rgb[2].trim()));
|
|
298
|
+
}
|
|
299
|
+
switch (s.toUpperCase()) {
|
|
300
|
+
case "RED": return Color.RED;
|
|
301
|
+
case "ORANGE": return Color.ORANGE;
|
|
302
|
+
case "BLUE": return Color.BLUE;
|
|
303
|
+
case "YELLOW": return Color.YELLOW;
|
|
304
|
+
case "CYAN": return Color.CYAN;
|
|
305
|
+
case "GREEN": return Color.GREEN;
|
|
306
|
+
case "BLACK": return Color.BLACK;
|
|
307
|
+
case "WHITE": return Color.WHITE;
|
|
308
|
+
case "GRAY": return Color.GRAY;
|
|
309
|
+
case "DARK_GRAY": return Color.DARK_GRAY;
|
|
310
|
+
case "LIGHT_GRAY": return Color.LIGHT_GRAY;
|
|
311
|
+
case "PINK": return Color.PINK;
|
|
312
|
+
case "MAGENTA": return Color.MAGENTA;
|
|
313
|
+
default:
|
|
314
|
+
try { return Color.decode(s); } catch (Exception e) { return Color.RED; }
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
static JIGSuperTrack.TrackType parseTrackType(String s) {
|
|
319
|
+
switch (s.trim().toUpperCase()) {
|
|
320
|
+
case "TILE": return JIGSuperTrack.TrackType.Tile;
|
|
321
|
+
case "TRIANGLE": return JIGSuperTrack.TrackType.Triangle;
|
|
322
|
+
case "HEATMAP": return JIGSuperTrack.TrackType.HeatMap;
|
|
323
|
+
case "POINT": return JIGSuperTrack.TrackType.Point;
|
|
324
|
+
case "LINE": return JIGSuperTrack.TrackType.Line;
|
|
325
|
+
case "BAR": return JIGSuperTrack.TrackType.Bar;
|
|
326
|
+
case "ARROW": return JIGSuperTrack.TrackType.Arrow;
|
|
327
|
+
default: return JIGSuperTrack.TrackType.HeatMap;
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import java.io.File;
|
|
2
|
+
import java.lang.reflect.Method;
|
|
3
|
+
import java.util.ArrayList;
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* TableColManipulator CLI bridge (engine 84)
|
|
7
|
+
* 表格列选择/筛选:根据列名从表中选择列输出
|
|
8
|
+
* Usage: TableColManipCli <inTable> <outTable> <colName1> [colName2 ...] [--sep tab|comma|space] [--header true|false] [--caseSensitive true|false]
|
|
9
|
+
* inTable: 输入表格(支持 .gz);colNames: 要保留的列名(表头)
|
|
10
|
+
*/
|
|
11
|
+
public class TableColManipCli {
|
|
12
|
+
public static void main(String[] args) throws Exception {
|
|
13
|
+
if (args.length < 3) {
|
|
14
|
+
System.err.println("Usage: TableColManipCli <inTable> <outTable> <colName1> [colName2...] [--sep tab|comma|space] [--header true|false] [--caseSensitive true|false]");
|
|
15
|
+
System.exit(1);
|
|
16
|
+
}
|
|
17
|
+
String inTable = args[0];
|
|
18
|
+
String outTable = args[1];
|
|
19
|
+
String sep = "tab";
|
|
20
|
+
boolean header = true;
|
|
21
|
+
boolean caseSensitive = false;
|
|
22
|
+
ArrayList<String> selCols = new ArrayList<>();
|
|
23
|
+
// 解析参数: colNames 直到 -- 前缀
|
|
24
|
+
int i = 2;
|
|
25
|
+
while (i < args.length) {
|
|
26
|
+
switch (args[i]) {
|
|
27
|
+
case "--sep": sep = args[++i]; break;
|
|
28
|
+
case "--header": header = Boolean.parseBoolean(args[++i]); break;
|
|
29
|
+
case "--caseSensitive": caseSensitive = Boolean.parseBoolean(args[++i]); break;
|
|
30
|
+
default: selCols.add(args[i]);
|
|
31
|
+
}
|
|
32
|
+
i++;
|
|
33
|
+
}
|
|
34
|
+
if (selCols.isEmpty()) {
|
|
35
|
+
System.err.println("至少需要一个列名");
|
|
36
|
+
System.exit(1);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
Class<?> c = Class.forName("biocjava.bioDoer.Table.TableColManipulator");
|
|
40
|
+
Object o = c.getDeclaredConstructor().newInstance();
|
|
41
|
+
// ColSepType 枚举
|
|
42
|
+
Class<?> sepEnum = Class.forName("biocjava.bioDoer.Table.TableColManipulator$ColSepType");
|
|
43
|
+
String sepVal = sep.equals("comma") ? "comma" : sep.equals("space") ? "space" : "tab";
|
|
44
|
+
Object sepEnumVal = Enum.valueOf((Class) sepEnum, sepVal);
|
|
45
|
+
c.getMethod("setColumnSepType", sepEnum).invoke(o, sepEnumVal);
|
|
46
|
+
c.getMethod("setInFile", File.class).invoke(o, new File(inTable));
|
|
47
|
+
c.getMethod("setOutFile", File.class).invoke(o, new File(outTable));
|
|
48
|
+
c.getMethod("setContainHeader", boolean.class).invoke(o, header);
|
|
49
|
+
c.getMethod("setCaseSensitive", boolean.class).invoke(o, caseSensitive);
|
|
50
|
+
// setIdList 需要 ArrayList —— 传空列表
|
|
51
|
+
c.getMethod("setIdList", ArrayList.class).invoke(o, new ArrayList<String>());
|
|
52
|
+
c.getMethod("setSelectedCols", ArrayList.class).invoke(o, selCols);
|
|
53
|
+
c.getMethod("selectedLines").invoke(o);
|
|
54
|
+
System.out.println("[tbcli] TableColManipulator done: " + outTable);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import java.io.File;
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* tbplot tableCollapse — 表格按键折叠 CLI(08/29,第 63 引擎)
|
|
5
|
+
*
|
|
6
|
+
* 用法: TableCollapseCli <inTable> <keyColIndex> <outTable> [hasHeader true|false] [colSep]
|
|
7
|
+
* inTable: 输入表格;keyColIndex: 折叠键列(0 起)
|
|
8
|
+
* outTable: 按键折叠(同键行合并,值用分隔符连接)
|
|
9
|
+
* hasHeader: 是否有表头(默认 true)
|
|
10
|
+
* colSep: 分隔符(默认 \t)
|
|
11
|
+
*
|
|
12
|
+
* ⚠️ main() 硬编码路径——改走 setInTable/setKeyColumnIndex/setOutTable 等 setter + process()。
|
|
13
|
+
*/
|
|
14
|
+
public class TableCollapseCli {
|
|
15
|
+
public static void main(String[] args) throws Exception {
|
|
16
|
+
if (args.length < 3) {
|
|
17
|
+
System.err.println("用法: TableCollapseCli <inTable> <keyColIndex> <outTable> [hasHeader true|false] [colSep]");
|
|
18
|
+
System.exit(1);
|
|
19
|
+
}
|
|
20
|
+
Object o = Class.forName("biocjava.bioDoer.Table.TableCollasper")
|
|
21
|
+
.getDeclaredConstructor().newInstance();
|
|
22
|
+
Class<?> c = o.getClass();
|
|
23
|
+
c.getMethod("setInTable", File.class).invoke(o, new File(args[0]));
|
|
24
|
+
c.getMethod("setKeyColumnIndex", int.class).invoke(o, Integer.parseInt(args[1]));
|
|
25
|
+
c.getMethod("setOutTable", File.class).invoke(o, new File(args[2]));
|
|
26
|
+
boolean header = true;
|
|
27
|
+
if (args.length > 3) header = Boolean.parseBoolean(args[3]);
|
|
28
|
+
c.getMethod("setHeader", boolean.class).invoke(o, header);
|
|
29
|
+
c.getMethod("process").invoke(o);
|
|
30
|
+
System.err.println("[tbplot] 表格按键折叠完成: " + args[2]);
|
|
31
|
+
System.exit(0);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import java.io.File;
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* tbplot targetScore — miRNA 靶标打分 CLI(08/29,第 55 引擎)
|
|
5
|
+
*
|
|
6
|
+
* 用法: TargetScoreCli <in.ssearch36.m10> <outTable> [--scoreCutOff N] [--maxMismatch N] [--recCom true|false] [--revTargetSo true|false]
|
|
7
|
+
* in.m10: ssearch36 官方参数输出(-w 100 -W 25 -E 1 -m 10 -i -U <mirna.fa> <target.fa>)
|
|
8
|
+
* outTable: 靶标表(miRNA target strand beg end score miRNAseq targetseq E bits)
|
|
9
|
+
*
|
|
10
|
+
* ⚠️ 关键坑(08/29 实锤):
|
|
11
|
+
* 1. 必须 setCurAligner(Ssearch36)——默认 Fasta36 会 NPE(frame null)
|
|
12
|
+
* 2. ssearch36 必须带 -i(reverse-complement)才有 sw_frame 行
|
|
13
|
+
* 3. 完整管线:ssearch36 -i -m 10 → TargetScoreCli → 靶标表
|
|
14
|
+
*/
|
|
15
|
+
public class TargetScoreCli {
|
|
16
|
+
public static void main(String[] args) throws Exception {
|
|
17
|
+
if (args.length < 2) {
|
|
18
|
+
System.err.println("用法: TargetScoreCli <in.ssearch36.m10> <outTable> [--scoreCutOff N] [--maxMismatch N] [--recCom true|false] [--revTargetSo true|false]");
|
|
19
|
+
System.exit(1);
|
|
20
|
+
}
|
|
21
|
+
String in = args[0];
|
|
22
|
+
String out = args[1];
|
|
23
|
+
double scoreCutOff = 5.0;
|
|
24
|
+
int maxMisM = 6;
|
|
25
|
+
boolean recCom = false, revTargetSo = false;
|
|
26
|
+
for (int i = 2; i < args.length; i++) {
|
|
27
|
+
if (args[i].equals("--scoreCutOff") && i+1 < args.length) scoreCutOff = Double.parseDouble(args[++i]);
|
|
28
|
+
else if (args[i].equals("--maxMismatch") && i+1 < args.length) maxMisM = Integer.parseInt(args[++i]);
|
|
29
|
+
else if (args[i].equals("--recCom") && i+1 < args.length) recCom = Boolean.parseBoolean(args[++i]);
|
|
30
|
+
else if (args[i].equals("--revTargetSo") && i+1 < args.length) revTargetSo = Boolean.parseBoolean(args[++i]);
|
|
31
|
+
}
|
|
32
|
+
Object o = Class.forName("biocjava.bioDoer.miRNA.TargetSoEngine").getDeclaredConstructor().newInstance();
|
|
33
|
+
Class<?> c = o.getClass();
|
|
34
|
+
Class<?> alignerCls = Class.forName("biocjava.bioDoer.miRNA.TargetSoEngine$aligner");
|
|
35
|
+
c.getMethod("setCurAligner", alignerCls)
|
|
36
|
+
.invoke(o, Enum.valueOf((Class) alignerCls, "Ssearch36"));
|
|
37
|
+
c.getMethod("setInFasta36m10File", File.class).invoke(o, new File(in));
|
|
38
|
+
c.getMethod("setScoreCutOff", double.class).invoke(o, scoreCutOff);
|
|
39
|
+
c.getMethod("setTotalMaxMisM", int.class).invoke(o, maxMisM);
|
|
40
|
+
c.getMethod("setOutTable", File.class).invoke(o, new File(out));
|
|
41
|
+
c.getMethod("setGenomeIsRecCom", boolean.class).invoke(o, recCom);
|
|
42
|
+
c.getMethod("setRevTargetSo", boolean.class).invoke(o, revTargetSo);
|
|
43
|
+
c.getMethod("process").invoke(o);
|
|
44
|
+
System.err.println("[tbplot] miRNA 靶标打分完成: " + out);
|
|
45
|
+
System.exit(0);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import java.io.File;
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* tbplot tauIndex — 组织特异性 τ 指数 CLI(08/29,第 59 引擎)
|
|
5
|
+
*
|
|
6
|
+
* 用法: TauCalcCli <inExpTab> <outTAU>
|
|
7
|
+
* inExpTab: 表达矩阵(首列基因名 + 样本列)
|
|
8
|
+
* outTAU: 每基因 Preferred Sample + TAU Index(0=均匀, 1=完全组织特异)
|
|
9
|
+
*
|
|
10
|
+
* ⚠️ main() 硬编码路径——改走 setInExpTab/setOutTAU + process()。
|
|
11
|
+
* τ 指数:1 - Σ(1-x̂)/(n-1),组织表达分析的通用特异性指标。
|
|
12
|
+
*/
|
|
13
|
+
public class TauCalcCli {
|
|
14
|
+
public static void main(String[] args) throws Exception {
|
|
15
|
+
if (args.length < 2) {
|
|
16
|
+
System.err.println("用法: TauCalcCli <inExpTab> <outTAU>");
|
|
17
|
+
System.exit(1);
|
|
18
|
+
}
|
|
19
|
+
Object o = Class.forName("biocjava.bioDoer.Table.TAUCalc")
|
|
20
|
+
.getDeclaredConstructor().newInstance();
|
|
21
|
+
Class<?> c = o.getClass();
|
|
22
|
+
c.getMethod("setInExpTab", File.class).invoke(o, new File(args[0]));
|
|
23
|
+
c.getMethod("setOutTAU", File.class).invoke(o, new File(args[1]));
|
|
24
|
+
c.getMethod("process").invoke(o);
|
|
25
|
+
System.err.println("[tbplot] τ 指数计算完成: " + args[1]);
|
|
26
|
+
System.exit(0);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import biocjava.bioWeb.NCBITaxonomy.NCBITaxonomy;
|
|
2
|
+
import biocjava.bioWeb.NCBITaxonomy.Taxon;
|
|
3
|
+
|
|
4
|
+
import java.io.BufferedReader;
|
|
5
|
+
import java.io.BufferedWriter;
|
|
6
|
+
import java.io.File;
|
|
7
|
+
import java.io.FileReader;
|
|
8
|
+
import java.io.FileWriter;
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* tbplot taxparse — 物种名批量分类解析 CLI(GUI 逆向 #38,09/21)
|
|
12
|
+
*
|
|
13
|
+
* 用法: TaxonomyBatchCli <idList.txt> <out.xls>
|
|
14
|
+
* idList: 每行一个物种名(首列;其余列原样透传)
|
|
15
|
+
* out: 首列 + 9 级分类(superkingdom/kingdom/phylum/subphylum/order/
|
|
16
|
+
* family/subfamily/tribe/genus)+ 透传列
|
|
17
|
+
*
|
|
18
|
+
* 引擎: NCBITaxonomy.process(GUI 逆向:TaxonomyParserGUIPanel $3 批量循环逻辑;
|
|
19
|
+
* ⚠️ 联网 NCBI eutils esearch+efetch;注册表单次版为 tbtools tool NCBITaxonomy)
|
|
20
|
+
*/
|
|
21
|
+
public class TaxonomyBatchCli {
|
|
22
|
+
public static void main(String[] args) throws Exception {
|
|
23
|
+
if (args.length < 2) {
|
|
24
|
+
System.err.println("用法: TaxonomyBatchCli <idList.txt> <out.xls>");
|
|
25
|
+
System.exit(1);
|
|
26
|
+
}
|
|
27
|
+
File idFile = new File(args[0]);
|
|
28
|
+
File outFile = new File(args[1]);
|
|
29
|
+
if (!idFile.exists()) {
|
|
30
|
+
System.err.println("错误: 输入文件不存在: " + idFile.getAbsolutePath());
|
|
31
|
+
System.exit(2);
|
|
32
|
+
}
|
|
33
|
+
NCBITaxonomy nt = new NCBITaxonomy();
|
|
34
|
+
BufferedReader br = new BufferedReader(new FileReader(idFile));
|
|
35
|
+
BufferedWriter bw = new BufferedWriter(new FileWriter(outFile));
|
|
36
|
+
bw.write("Name\tSuperkingdom\tKingdom\tPhylum\tSubphylum\tOrder\tFamily\tSubfamily\tTribe\tGenus");
|
|
37
|
+
bw.newLine();
|
|
38
|
+
String inline;
|
|
39
|
+
int ok = 0, skip = 0;
|
|
40
|
+
while ((inline = br.readLine()) != null) {
|
|
41
|
+
if (inline.trim().isEmpty()) continue;
|
|
42
|
+
String[] columns = inline.split("\t");
|
|
43
|
+
Taxon curTaxon = nt.process(columns[0]);
|
|
44
|
+
if (!curTaxon.isExist()) {
|
|
45
|
+
System.err.println("Skipping line " + inline + " which can't be processed");
|
|
46
|
+
skip++;
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
StringBuilder sb = new StringBuilder();
|
|
50
|
+
sb.append(columns[0]).append("\t");
|
|
51
|
+
sb.append(curTaxon.getSuperkingdom()).append("\t");
|
|
52
|
+
sb.append(curTaxon.getKingdom()).append("\t");
|
|
53
|
+
sb.append(curTaxon.getPhylum()).append("\t");
|
|
54
|
+
sb.append(curTaxon.getSubphylum()).append("\t");
|
|
55
|
+
sb.append(curTaxon.getOrder()).append("\t");
|
|
56
|
+
sb.append(curTaxon.getFamily()).append("\t");
|
|
57
|
+
sb.append(curTaxon.getSubfamily()).append("\t");
|
|
58
|
+
sb.append(curTaxon.getTribe()).append("\t");
|
|
59
|
+
sb.append(curTaxon.getGenus());
|
|
60
|
+
for (int i = 1; i < columns.length; ++i) {
|
|
61
|
+
sb.append("\t").append(columns[i]);
|
|
62
|
+
}
|
|
63
|
+
bw.write(sb.toString());
|
|
64
|
+
bw.newLine();
|
|
65
|
+
ok++;
|
|
66
|
+
}
|
|
67
|
+
br.close();
|
|
68
|
+
bw.close();
|
|
69
|
+
System.err.println("[tbplot] 分类解析完成: " + ok + " 条成功" + (skip > 0 ? "," + skip + " 条跳过" : "") + " → " + outFile.getAbsolutePath());
|
|
70
|
+
System.exit(0);
|
|
71
|
+
}
|
|
72
|
+
}
|