diff --git a/backend/pom.xml b/backend/pom.xml index cc7d96026406ff4a297f9b9c2c5a4932c5139649..1d3edb9d9ba9ad779f23befeee88d0039d01913c 100644 --- a/backend/pom.xml +++ b/backend/pom.xml @@ -133,6 +133,10 @@ 1.10.19 test - + + net.sourceforge.argparse4j + argparse4j + 0.8.1 + \ No newline at end of file diff --git a/backend/src/main/java/de/thm/genomeData/sql/DBConnector.java b/backend/src/main/java/de/thm/genomeData/sql/DBConnector.java index f19f93255d2567ac960ffbf7e60ca1e354c3948b..8f233223880b77be33b84036868f6ab8521aac3d 100644 --- a/backend/src/main/java/de/thm/genomeData/sql/DBConnector.java +++ b/backend/src/main/java/de/thm/genomeData/sql/DBConnector.java @@ -27,6 +27,7 @@ import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.function.Function; import java.util.function.Predicate; +import java.util.stream.Collectors; public class DBConnector { private Connection conn; @@ -82,8 +83,10 @@ public class DBConnector { public List getAllTracks(String whereClause) { List entries = new ArrayList<>(); - if(conn == null) - throw new RuntimeException("No connection to the database"); + if(conn == null) { + logger.warn("No connection to the database"); + return Collections.emptyList(); + } String sql = "SELECT * FROM enhort_view " + whereClause; @@ -123,8 +126,12 @@ public class DBConnector { */ public SortedMap> getAllCellLines() { + SortedMap> celllines = new TreeMap<>(); + if(conn == null) + return celllines; + try { // get all cellliens without children String parents = "SELECT cell_line FROM cell_lines"; diff --git a/backend/src/main/java/de/thm/genomeData/tracks/FileLoader.java b/backend/src/main/java/de/thm/genomeData/tracks/FileLoader.java index 0e5d058675facdd38aad9265a647569c8c091b60..ca09b6ddffdf9c511704dac15bbf0d039a8cb7a7 100644 --- a/backend/src/main/java/de/thm/genomeData/tracks/FileLoader.java +++ b/backend/src/main/java/de/thm/genomeData/tracks/FileLoader.java @@ -51,8 +51,12 @@ class FileLoader implements Callable> { private final TrackEntry trackEntry; public FileLoader(TrackEntry entry) { + Path basePath; - Path basePath = BackendServer.basePath; + if(BackendServer.basePath != null) + basePath = BackendServer.basePath; + else + basePath = new File("").toPath(); this.path = basePath.resolve(new File(entry.getFilepath()).toPath()); this.assembly = Genome.Assembly.valueOf(entry.getAssembly()); @@ -194,8 +198,11 @@ class FileLoader implements Callable> { lines.close(); - if (linecount != counter) - logger.error("File " + file.getName() + " has " + counter + " lines, but db says it has " + linecount + " lines."); + if (linecount != counter && BackendServer.customtrackpath == null) + logger.warn("File " + file.getName() + " has " + counter + " lines, but db says it has " + linecount + " lines."); + + if (BackendServer.customtrackpath != null && linecount < counter) + logger.error("File " + file.getName() + " has " + counter + " lines, the current set limit is " + linecount + " lines."); // Check read files // diff --git a/backend/src/main/java/de/thm/genomeData/tracks/TrackFactory.java b/backend/src/main/java/de/thm/genomeData/tracks/TrackFactory.java index d2e45326298df8c7927145e899bba606d753d557..bcc6c579c3346078779cb5bf66f522bede4e0bfe 100644 --- a/backend/src/main/java/de/thm/genomeData/tracks/TrackFactory.java +++ b/backend/src/main/java/de/thm/genomeData/tracks/TrackFactory.java @@ -107,51 +107,48 @@ public final class TrackFactory { List allTracks; - DBConnector connector = new DBConnector(); - connector.connect(); - - if (System.getenv("HOME").contains("menzel")) { - - allTracks = connector.getAllTracks("WHERE name like '%ontigs'"); - allTracks = connector.getAllTracks(" WHERE directory like '%genetic%' and genome_assembly = 'hg19' ORDER BY lines ASC "); - /* - allTracks.addAll(connector.getAllTracks("WHERE genome_assembly = 'hg19' and directory like '%encode%HeLa%'")); - allTracks.addAll(connector.getAllTracks("WHERE genome_assembly = 'hg19' and directory like '%custom%'")); - //allTracks = connector.getAllTracks("WHERE bed_filename = 'SRX062365.05.bed'"); - //allTracks = connector.getAllTracks(" WHERE genome_assembly = 'hg19' ORDER BY lines ASC LIMIT 3000"); - */ - } else { - - //allTracks = connector.getAllTracks("WHERE (cell_line NOT like '%GM%' or cell_line like '%GM12878' or name like '%POLR%')"); - allTracks = connector.getAllTracks("WHERE (name not like '%POLR%' or name not like '%expression%')"); - /* - allTracks = connector.getAllTracks(" WHERE directory like '%genetic%' and genome_assembly = 'hg19' ORDER BY lines ASC "); - allTracks.addAll(connector.getAllTracks("WHERE cell_line like 'HeLa%'")); - allTracks.addAll(connector.getAllTracks("WHERE cell_line like 'K-562'")); - //allTracks.addAll(connector.getAllTracks("WHERE cell_line like '%PS%'")); - allTracks.addAll(connector.getAllTracks("WHERE cell_line like '%CD%'")); - allTracks.addAll(connector.getAllTracks("WHERE cell_line like '%GM12878%'")); - allTracks.addAll(connector.getAllTracks("WHERE cell_line like '%Hep-G2%'")); - allTracks.addAll(connector.getAllTracks("WHERE cell_line like '%A-549%'")); - */ - } + if (BackendServer.dbfilepath != null){ + DBConnector connector = new DBConnector(); + connector.connect(); + + if (System.getenv("HOME").contains("menzel")) { + + allTracks = connector.getAllTracks("WHERE name like '%ontigs'"); + allTracks = connector.getAllTracks(" WHERE directory like '%genetic%' and genome_assembly = 'hg19' ORDER BY lines ASC "); + /* + allTracks.addAll(connector.getAllTracks("WHERE genome_assembly = 'hg19' and directory like '%encode%HeLa%'")); + allTracks.addAll(connector.getAllTracks("WHERE genome_assembly = 'hg19' and directory like '%custom%'")); + //allTracks = connector.getAllTracks("WHERE bed_filename = 'SRX062365.05.bed'"); + //allTracks = connector.getAllTracks(" WHERE genome_assembly = 'hg19' ORDER BY lines ASC LIMIT 3000"); + */ + } else { + + //allTracks = connector.getAllTracks("WHERE (cell_line NOT like '%GM%' or cell_line like '%GM12878' or name like '%POLR%')"); + allTracks = connector.getAllTracks("WHERE (name not like '%POLR%' or name not like '%expression%')"); + /* + allTracks = connector.getAllTracks(" WHERE directory like '%genetic%' and genome_assembly = 'hg19' ORDER BY lines ASC "); + allTracks.addAll(connector.getAllTracks("WHERE cell_line like 'HeLa%'")); + allTracks.addAll(connector.getAllTracks("WHERE cell_line like 'K-562'")); + //allTracks.addAll(connector.getAllTracks("WHERE cell_line like '%PS%'")); + allTracks.addAll(connector.getAllTracks("WHERE cell_line like '%CD%'")); + allTracks.addAll(connector.getAllTracks("WHERE cell_line like '%GM12878%'")); + allTracks.addAll(connector.getAllTracks("WHERE cell_line like '%Hep-G2%'")); + allTracks.addAll(connector.getAllTracks("WHERE cell_line like '%A-549%'")); + */ + } - logger.info("Trying to load " + allTracks.size() + " tracks"); - this.tracks.addAll(loadByEntries(allTracks)); + logger.info("Trying to load " + allTracks.size() + " tracks"); + this.tracks.addAll(loadByEntries(allTracks)); + } List customTracks = new ArrayList<>(); + // Add custom tracks - if (System.getenv("HOME").contains("menzel")) { + if (BackendServer.customtrackpath != null) { try { - String customtrackpath; - - if (System.getenv("HOME").contains("menzel")) { - customtrackpath = "/home/menzel/Desktop/THM/promotion/enhort/dat/stefan/custom"; - } else { - customtrackpath = BackendServer.customtrackpath; - } + String customtrackpath = BackendServer.customtrackpath; Files.walk(Paths.get(customtrackpath)) .filter(Files::isRegularFile) diff --git a/backend/src/main/java/de/thm/run/AnalysisHelper.java b/backend/src/main/java/de/thm/run/AnalysisHelper.java index dc618aff8a3cba466a4616fa3aa772f13108616f..20d30ef16b35e5c8acd65615ff931a552a5bb1b2 100644 --- a/backend/src/main/java/de/thm/run/AnalysisHelper.java +++ b/backend/src/main/java/de/thm/run/AnalysisHelper.java @@ -145,12 +145,15 @@ class AnalysisHelper { private ResultCollector runAnalysisWithBg(Sites sites, Sites sitesBg, List tracks, boolean createLogo) throws NoTracksLeftException { + if(tracks.size() == 0){ + throw new NoTracksLeftException("There are no tracks loaded for analysis."); + } + CalcCaller multi = new CalcCaller(); ResultCollector collector = multi.execute(tracks, sites, sitesBg, createLogo); if (collector.getResults().size() == 0) { throw new NoTracksLeftException("There are no tracks left as results."); - } return collector; @@ -167,7 +170,7 @@ class AnalysisHelper { */ private ResultCollector runAnalysisWithBg(Sites sites, Sites sitesBg, BackendCommand cmd) throws NoTracksLeftException { - List runTracks; + List runTracks = new ArrayList<>(); TrackFactory trackFactory = TrackFactory.getInstance(); if (cmd.getTracks().isEmpty()) { // when using /sample on frontend @@ -176,8 +179,7 @@ class AnalysisHelper { runTracks = runTracks.stream().filter(t -> !t.getName().contains("Repeat")).collect(Collectors.toList()); //runTracks.addAll(trackFactory.getTracksByCellline("", cmd.getAssembly())); // TODO get some cell line specific tracks for sample run } catch (RuntimeException e) { - logger.warn("Error getting tracks {}", e); - runTracks = trackFactory.getTracks(Genome.Assembly.hg19); + logger.warn("Error getting tracks from database. Ignore if you are only using custom tracks.", e); } } else { // if there is a list of track ids given by command @@ -192,6 +194,7 @@ class AnalysisHelper { // always add custom tracks to run runTracks.addAll(cmd.getCustomTracks()); + System.out.println("cstom trks: " + runTracks.size()); return runAnalysisWithBg(sites, sitesBg, runTracks, cmd.isCreateLogo()); } diff --git a/backend/src/main/java/de/thm/run/BackendServer.java b/backend/src/main/java/de/thm/run/BackendServer.java index e6f724f618aa49657e8138c400b4f7ac3f2b703a..f52ccd58dac5518ecfda373fc4cb254a478dcf81 100644 --- a/backend/src/main/java/de/thm/run/BackendServer.java +++ b/backend/src/main/java/de/thm/run/BackendServer.java @@ -20,12 +20,18 @@ import de.thm.genomeData.tracks.TrackFactory; import de.thm.genomeData.tracks.Tracks; import de.thm.misc.Genome; import de.thm.precalc.SiteFactoryFactory; +import net.sourceforge.argparse4j.ArgumentParsers; +import net.sourceforge.argparse4j.inf.ArgumentParser; +import net.sourceforge.argparse4j.inf.ArgumentParserException; +import net.sourceforge.argparse4j.inf.Namespace; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.File; import java.nio.file.Path; +import static net.sourceforge.argparse4j.impl.Arguments.store; + /** * Startes the backend server for Enhort and loads the annotation tracks @@ -35,29 +41,53 @@ import java.nio.file.Path; */ public final class BackendServer { - private static final int port = 42412; + private static int port; private static final Logger logger = LoggerFactory.getLogger(BackendServer.class); public static Path basePath; public static String dbfilepath; + public static String customtrackpath; public static void main(String[] args) { logger.info("Starting Enhort backend server"); - if (args.length != 2) { - logger.error("Wrong arguments. Example call: /usr/bin/java -jar -Xmx60g -XX:StringTableSize=1000003 " + + Namespace input = null; + + ArgumentParser parser = ArgumentParsers.newFor("Enhort backend").build() + .defaultHelp(true) + .description("Enhort backend server"); + + parser.addArgument("--data-path").help("Path to data directory").action(store()); + parser.addArgument("--db").help("Path to sqlite metadata database").action(store()); + parser.addArgument("--custom").help("Path to custom files").action(store()); + parser.addArgument("-p", "--port").help("Port to listen on").setDefault(42412).action(store()); + + try { + input = parser.parseArgs(args); + } catch (ArgumentParserException e) { + parser.handleError(e); + } + + if (input == null) { + logger.error("Example call: /usr/bin/java -jar -Xmx60g -XX:StringTableSize=1000003 " + "/home/mmnz21/enhort/enhort.jar " + "/permData/gogol/sgls22/enhort " + - "/home/mmnz21/enhort/stefan.db \n" + + "/home/mmnz21/enhort/sqlitedatabase.db \n" + "where the first param is the path to the data directory and" + "the second path is the .db file"); - System.exit(1); } - basePath = new File(args[0]).toPath(); - dbfilepath = args[1]; + port = input.getInt("port"); + + if(input.getString("data_path") != null && input.getString("db") != null) { + basePath = new File(input.getString("data_path")).toPath(); + dbfilepath = input.getString("db"); + } else { + if (input.getString("custom") != null) + customtrackpath = input.getString("custom") + "/"; + } new Thread(() -> { TrackFactory tf = TrackFactory.getInstance();