diff --git a/docker-compose.yml b/docker-compose.yml index e3b91868a8b86d5c6102de6b305428281d21b68e..6f9f5f1d3a5baca14a7e7900b572971c16b50263 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -12,26 +12,6 @@ services: - postgres:/data/postgres ports: - 5432:5432 - pgadmin: - image: dpage/pgadmin4 - depends_on: - - postgres - environment: - PGADMIN_DEFAULT_EMAIL: ${PGADMIN_DEFAULT_EMAIL:-pgadmin4@pgadmin.org} - PGADMIN_DEFAULT_PASSWORD: ${PGADMIN_DEFAULT_PASSWORD:-password} - volumes: - - pgadmin:/root/.pgadmin - ports: - - 5050:80 - - adminer: - image: adminer - depends_on: - - postgres - environment: - ADMINER_DEFAULT_SERVER: postgres - ports: - - 5000:8080 volumes: postgres: diff --git a/src/main/java/cz/mendelu/dnaAnalyser/analyse/cpg/CpgRepository.java b/src/main/java/cz/mendelu/dnaAnalyser/analyse/cpg/CpgRepository.java index 39d7bdcfea00ab067b9a5aff7d971d55dd229044..7291d7ac4758db39654058de4ab09ddc6e073c95 100644 --- a/src/main/java/cz/mendelu/dnaAnalyser/analyse/cpg/CpgRepository.java +++ b/src/main/java/cz/mendelu/dnaAnalyser/analyse/cpg/CpgRepository.java @@ -18,7 +18,7 @@ public interface CpgRepository extends BaseRepository<Cpg, UUID> { @Query("select a from Cpg as a join a.owner o join a.tags t where t = :tag and o.id = ?#{principal.id}") Page<Cpg> findAll(Pageable pageable, @Param("tag") String tag); - @Query("select a from Cpg as a join a.owner o where a.id = :id and o.id = ?#{principal.id}") + @Query("select a from Cpg a where a.id = :id") Optional<Cpg> findById(@Param("id") UUID id); @Query("select distinct t from Cpg as s join s.owner o join s.tags t where o.id = ?#{principal.id}") diff --git a/src/main/java/cz/mendelu/dnaAnalyser/analyse/cpg/CpgService.java b/src/main/java/cz/mendelu/dnaAnalyser/analyse/cpg/CpgService.java index 6c012e81d2be1a792cd7ada277ddb736deaf7894..9011e9c3c68d117165910fd76d88f2fc4c413534 100644 --- a/src/main/java/cz/mendelu/dnaAnalyser/analyse/cpg/CpgService.java +++ b/src/main/java/cz/mendelu/dnaAnalyser/analyse/cpg/CpgService.java @@ -1,14 +1,10 @@ package cz.mendelu.dnaAnalyser.analyse.cpg; -import cz.mendelu.dnaAnalyser.analyse.zdna.Zdna; -import cz.mendelu.dnaAnalyser.analyse.zdna.ZdnaAnalyseResult; -import cz.mendelu.dnaAnalyser.analyse.zdna.ZdnaMapper; + import cz.mendelu.dnaAnalyser.batch.BatchService; import cz.mendelu.dnaAnalyser.sequence.Sequence; import cz.mendelu.dnaAnalyser.sequence.data.SequenceData; import cz.mendelu.dnaAnalyser.sequence.data.SequenceDataRepository; -import cz.mendelu.dnaAnalyser.sequence.stream.BufferedWindow; -import cz.mendelu.dnaAnalyser.sequence.stream.Window; import cz.mendelu.dnaAnalyser.utils.analyse.service.heatmap.Heatmap; import cz.mendelu.dnaAnalyser.utils.exception.NotFoundException; import cz.mendelu.dnaAnalyser.utils.repository.BaseRepository; @@ -143,7 +139,7 @@ public class CpgService extends ModelService<Cpg> { .mapToInt(e -> e.length) .sum(); - result = analysisCpg.size() != 0 + result = !analysisCpg.isEmpty() ? totalCpgLen / analysisCpg.size() : 0; } @@ -157,4 +153,9 @@ public class CpgService extends ModelService<Cpg> { if (!orderIterator.hasNext()) return null; return orderIterator.next(); } + + public Cpg findOne(UUID id) { + return cpgRepository.findById(id) + .orElseThrow(() -> new NotFoundException(Cpg.class, id)); +} } diff --git a/src/main/java/cz/mendelu/dnaAnalyser/exporter/ExporterService.java b/src/main/java/cz/mendelu/dnaAnalyser/exporter/ExporterService.java index 191b6fa0809e4ec862a14d434def2f9e16c9547c..08bb9b0311a4b1d40a9d096a3c2c96ba2d2327cd 100644 --- a/src/main/java/cz/mendelu/dnaAnalyser/exporter/ExporterService.java +++ b/src/main/java/cz/mendelu/dnaAnalyser/exporter/ExporterService.java @@ -1,8 +1,9 @@ package cz.mendelu.dnaAnalyser.exporter; import com.opencsv.CSVWriter; +import cz.mendelu.dnaAnalyser.analyse.cpg.CpgDataSessionService; +import cz.mendelu.dnaAnalyser.analyse.cpg.CpgService; import cz.mendelu.dnaAnalyser.utils.analyse.service.AbstractDataSessionService; -import cz.mendelu.dnaAnalyser.utils.exception.NotFoundException; import cz.mendelu.dnaAnalyser.analyse.g4hunter.quadruplex.QuadruplexDataSessionService; import cz.mendelu.dnaAnalyser.analyse.rloopr.RloopDataSessionService; import org.springframework.beans.factory.annotation.Autowired; @@ -41,6 +42,11 @@ public class ExporterService { @Autowired private AnalyseRepository analyseRepository; + @Autowired + private CpgDataSessionService cpgDataSessionService; + + @Autowired + private CpgService cpgService; public String exportData(UUID id, Analysis analysis, Output format) { @@ -65,6 +71,9 @@ public class ExporterService { case RLOOP: sessionService = rloopDataSessionService; break; + case CPG: + sessionService = cpgDataSessionService; + break; default: // default to quadruplex for now sessionService = quadruplexDataSessionService; @@ -119,6 +128,13 @@ public class ExporterService { ArrayList<String> zdnaColumns = new ArrayList<>(); zdnaColumns.add("SCORE"); + + ArrayList<String> cpxColumns = new ArrayList<>(); + cpxColumns.add("GCPERC"); + cpxColumns.add("OBSERVEDTOEXPECTEDCPG"); + cpxColumns.add("LENGTH"); + + String browserHeader = "browser position "; String result = "track type=bedGraph name=\"%s\" " + "description=%s " + @@ -135,7 +151,7 @@ public class ExporterService { Integer posInGenomeStart = 0; Integer posInGenomeEnd = 0; - final String format = "%s %d %d %s\n"; + String format = "%s %d %d %s\n"; String chrom = getChromName(id); Pattern p = Pattern.compile("[A-Z][a-z].*_(chr[1-9XY]+):([0-9].+)-([0-9].+)"); // genome browser format, e.g. Human_chr8:128748315-128753680 @@ -175,6 +191,18 @@ public class ExporterService { analysisColumnMapper = zdnaColumns; break; + case CPG: + // Retrieve the second nucleotide from the Cpg service + Character secondNuc = cpgService.findOne(id).getSecondNucleotide(); + + // Set name and description based on the second nucleotide + name = "Cp" + (secondNuc != null ? secondNuc : "X") + " tracker"; + description = "\"BedGraph output of Cp" + (secondNuc != null ? secondNuc : "X") + " analysis\""; + + // Set the analysisColumnMapper based on the case + analysisColumnMapper = cpxColumns; + break; + default: name = ""; description = ""; @@ -196,6 +224,9 @@ public class ExporterService { String strand = null; int score = 0; + double gcperc = 0.0; + double observertoexpected = 0.0; + int length = 0; if (analysis == Analysis.RLOOP) { strand = rs.getString("STRAND"); @@ -214,9 +245,18 @@ public class ExporterService { score = (int) Math.ceil(rs.getDouble("SCORE") * 100); } else if (analysis == Analysis.ZDNA) { score = (int) Math.ceil(rs.getDouble("SCORE")); + } else if (analysis == Analysis.CPG) { + gcperc = rs.getDouble("gcPerc"); + observertoexpected = rs.getDouble("observedToExpectedCpG"); + length = rs.getInt("length"); + } + + if (analysis == Analysis.CPG) { + dataValue = String.format(" %.3f %.3f %d", gcperc*100, observertoexpected, length); + } else { + dataValue = String.format(" %d", score); } - dataValue = String.format(" %d", score); } catch (SQLException e) { log.error("Error fetching analysis data: {}", e);