All Downloads are FREE. Search and download functionalities are using the official Maven repository.

eqtlmappingpipeline.binaryInteraction.ReplicateInteractions Maven / Gradle / Ivy

The newest version!
package eqtlmappingpipeline.binaryInteraction;

import au.com.bytecode.opencsv.CSVWriter;
import eqtlmappingpipeline.Main;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Writer;
import java.text.NumberFormat;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.HelpFormatter;
import org.apache.commons.cli.OptionBuilder;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;
import org.apache.commons.cli.PosixParser;
import umcg.genetica.io.binInteraction.BinaryInteractionFile;
import umcg.genetica.io.binInteraction.BinaryInteractionFileException;
import umcg.genetica.io.binInteraction.BinaryInteractionQtlZscores;
import umcg.genetica.io.binInteraction.BinaryInteractionQueryResult;
import umcg.genetica.io.binInteraction.BinaryInteractionZscores;
import umcg.genetica.io.binInteraction.gene.BinaryInteractionGene;
import umcg.genetica.io.binInteraction.variant.BinaryInteractionVariant;

/**
 *
 * @author Patrick Deelen
 */
public class ReplicateInteractions {

	private static final Options OPTIONS;

	static {

		OPTIONS = new Options();

		OptionBuilder.withArgName("path");
		OptionBuilder.hasArg();
		OptionBuilder.withDescription("Binary interaction file (must be a meta analysis)");
		OptionBuilder.withLongOpt("input");
		OptionBuilder.isRequired();
		OPTIONS.addOption(OptionBuilder.create("i"));

		OptionBuilder.withArgName("path");
		OptionBuilder.hasArg();
		OptionBuilder.withDescription("Binary interaction file to use as replication (must be a meta analysis)");
		OptionBuilder.withLongOpt("replication");
		OptionBuilder.isRequired();
		OPTIONS.addOption(OptionBuilder.create("r"));

		OptionBuilder.withArgName("path");
		OptionBuilder.hasArg();
		OptionBuilder.withDescription("Ouput prefix");
		OptionBuilder.withLongOpt("output");
		OptionBuilder.isRequired();
		OPTIONS.addOption(OptionBuilder.create("o"));

		OptionBuilder.withArgName("double");
		OptionBuilder.hasArg();
		OptionBuilder.withDescription("Minimum absolute interaction z-score");
		OptionBuilder.withLongOpt("interactionZ");
		OptionBuilder.isRequired();
		OPTIONS.addOption(OptionBuilder.create("iz"));

		OptionBuilder.withArgName("double");
		OptionBuilder.hasArg();
		OptionBuilder.withDescription("Minimum absolute replication interaction z-score");
		OptionBuilder.withLongOpt("replicationInteractionZ");
		OptionBuilder.isRequired();
		OPTIONS.addOption(OptionBuilder.create("riz"));

		OptionBuilder.withArgName("double");
		OptionBuilder.hasArg();
		OptionBuilder.withDescription("Minimum absolute interaction z-score to count covariate");
		OptionBuilder.withLongOpt("covariateInteractionZ");
		OptionBuilder.isRequired();
		OPTIONS.addOption(OptionBuilder.create("ciz"));

		OptionBuilder.withArgName("double");
		OptionBuilder.hasArg();
		OptionBuilder.withDescription("Minimum absolute replication interaction z-score to count covariate");
		OptionBuilder.withLongOpt("covariateReplicationInteractionZ");
		OptionBuilder.isRequired();
		OPTIONS.addOption(OptionBuilder.create("criz"));

		OptionBuilder.withDescription("If set match variant on chr-pos");
		OptionBuilder.withLongOpt("chrPos");
		OPTIONS.addOption(OptionBuilder.create("cp"));

		OptionBuilder.withArgName("path");
		OptionBuilder.hasArg();
		OptionBuilder.withDescription("File with covariates to include in analysis");
		OptionBuilder.withLongOpt("covariats");
		OPTIONS.addOption(OptionBuilder.create("c"));

		OptionBuilder.withArgName("path");
		OptionBuilder.hasArg();
		OptionBuilder.withDescription("File with eQTL genes to include in analysis");
		OptionBuilder.withLongOpt("genes");
		OPTIONS.addOption(OptionBuilder.create("g"));
		
		OptionBuilder.withArgName("path");
		OptionBuilder.hasArg();
		OptionBuilder.withDescription("File with covariates to test for replication");
		OptionBuilder.withLongOpt("covariatsReplication");
		OPTIONS.addOption(OptionBuilder.create("cr"));

		OptionBuilder.withArgName("path");
		OptionBuilder.hasArg();
		OptionBuilder.withDescription("File with eQTL genes to test for replication");
		OptionBuilder.withLongOpt("genesReplication");
		OPTIONS.addOption(OptionBuilder.create("gr"));

	}

	public static void main(String[] args) throws FileNotFoundException, IOException, BinaryInteractionFileException {

		final File inputInteractionFile;
		final File replicationInteractionFile;
		final double minAbsInteractionZ;
		final double minAbsReplicationInteractionZ;
		final double minAbsInteractionZCovariateCount;
		final double minAbsReplicationInteractionZCovariateCount;
		final boolean matchOnChrPos;
		final String outputPrefix;
		final File covariatesToIncludeFile;
		final File genesToIncludeFile;
		final File covariatesReplicationToIncludeFile;
		final File genesReplicationToIncludeFile;

		try {
			final CommandLine commandLine = new PosixParser().parse(OPTIONS, args, false);

			inputInteractionFile = new File(commandLine.getOptionValue("i"));
			replicationInteractionFile = new File(commandLine.getOptionValue("r"));
			outputPrefix = commandLine.getOptionValue("o");

			try {
				minAbsInteractionZ = Double.parseDouble(commandLine.getOptionValue("iz"));
			} catch (NumberFormatException ex) {
				System.out.println("Cannot not parse --interactionZ as double: " + commandLine.getOptionValue("iz"));
				System.exit(1);
				return;
			}

			try {
				minAbsReplicationInteractionZ = Double.parseDouble(commandLine.getOptionValue("riz"));
			} catch (NumberFormatException ex) {
				System.out.println("Cannot not parse --replicationInteractionZ as double: " + commandLine.getOptionValue("riz"));
				System.exit(1);
				return;
			}

			try {
				minAbsInteractionZCovariateCount = Double.parseDouble(commandLine.getOptionValue("ciz"));
			} catch (NumberFormatException ex) {
				System.out.println("Cannot not parse --covariateInteractionZ as double: " + commandLine.getOptionValue("ciz"));
				System.exit(1);
				return;
			}

			try {
				minAbsReplicationInteractionZCovariateCount = Double.parseDouble(commandLine.getOptionValue("criz"));
			} catch (NumberFormatException ex) {
				System.out.println("Cannot not parse --covariateReplicationInteractionZ as double: " + commandLine.getOptionValue("criz"));
				System.exit(1);
				return;
			}

			if (commandLine.hasOption("c")) {
				covariatesToIncludeFile = new File(commandLine.getOptionValue("c"));
			} else {
				covariatesToIncludeFile = null;
			}

			if (commandLine.hasOption("g")) {
				genesToIncludeFile = new File(commandLine.getOptionValue("g"));
			} else {
				genesToIncludeFile = null;
			}
			
			if (commandLine.hasOption("cr")) {
				covariatesReplicationToIncludeFile = new File(commandLine.getOptionValue("cr"));
			} else {
				covariatesReplicationToIncludeFile = null;
			}

			if (commandLine.hasOption("gr")) {
				genesReplicationToIncludeFile = new File(commandLine.getOptionValue("gr"));
			} else {
				genesReplicationToIncludeFile = null;
			}

			matchOnChrPos = commandLine.hasOption("cp");

		} catch (ParseException ex) {
			System.err.println("Invalid command line arguments: ");
			System.err.println(ex.getMessage());
			System.err.println();
			new HelpFormatter().printHelp(" ", OPTIONS);
			System.exit(1);
			return;
		}
		BufferedWriter logWriter = new BufferedWriter(new FileWriter(outputPrefix + "_Log.txt"));

		writeAndOut("Software version: " + Main.VERSION, logWriter);
		writeAndOut("Input file: " + inputInteractionFile.getAbsolutePath(), logWriter);
		writeAndOut("Replication file: " + replicationInteractionFile.getAbsolutePath(), logWriter);
		writeAndOut("Output prefix: " + outputPrefix, logWriter);
		writeAndOut("Min interaction z-score: " + minAbsInteractionZ, logWriter);
		writeAndOut("Min replication interaction z-score: " + minAbsReplicationInteractionZ, logWriter);
		writeAndOut("Min interaction z-score covariate counter: " + minAbsInteractionZCovariateCount, logWriter);
		writeAndOut("Min replication interaction z-score covariate counter: " + minAbsReplicationInteractionZCovariateCount, logWriter);
		if (matchOnChrPos) {
			writeAndOut("Matching variants on chr-pos", logWriter);
		}
		if (covariatesToIncludeFile != null) {
			writeAndOut("Covariates to include: " + covariatesToIncludeFile.getAbsolutePath(), logWriter);
		}
		if (genesToIncludeFile != null) {
			writeAndOut("eQTL genes to include: " + genesToIncludeFile.getAbsolutePath(), logWriter);
		}
		if (covariatesReplicationToIncludeFile != null) {
			writeAndOut("Covariates replication to include: " + covariatesReplicationToIncludeFile.getAbsolutePath(), logWriter);
		}
		if (genesReplicationToIncludeFile != null) {
			writeAndOut("eQTL genes replication to include: " + genesReplicationToIncludeFile.getAbsolutePath(), logWriter);
		}
		
		writeAndOut("", logWriter);


		final HashSet covariantsToInclude;
		if (covariatesToIncludeFile != null) {
			covariantsToInclude = new HashSet();
			BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(covariatesToIncludeFile), "UTF-8"));
			String line;
			while ((line = reader.readLine()) != null) {
				covariantsToInclude.add(line.trim());
			}
			writeAndOut("Covariates included: " + covariantsToInclude.size(), logWriter);
			writeAndOut("", logWriter);
		} else {
			covariantsToInclude = null;
		}

		final HashSet genesToInclude;
		if (genesToIncludeFile != null) {
			genesToInclude = new HashSet();
			BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(genesToIncludeFile), "UTF-8"));
			String line;
			while ((line = reader.readLine()) != null) {
				genesToInclude.add(line.trim());
			}
			writeAndOut("eQTL genes included: " + genesToInclude.size(), logWriter);
			writeAndOut("", logWriter);
		} else {
			genesToInclude = null;
		}
		
		final HashSet covariantsReplicationToInclude;
		if (covariatesReplicationToIncludeFile != null) {
			covariantsReplicationToInclude = new HashSet();
			BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(covariatesReplicationToIncludeFile), "UTF-8"));
			String line;
			while ((line = reader.readLine()) != null) {
				covariantsReplicationToInclude.add(line.trim());
			}
			writeAndOut("Covariates replication included: " + covariantsReplicationToInclude.size(), logWriter);
			writeAndOut("", logWriter);
		} else {
			covariantsReplicationToInclude = null;
		}

		final HashSet genesReplicationToInclude;
		if (genesReplicationToIncludeFile != null) {
			genesReplicationToInclude = new HashSet();
			BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(genesReplicationToIncludeFile), "UTF-8"));
			String line;
			while ((line = reader.readLine()) != null) {
				genesReplicationToInclude.add(line.trim());
			}
			writeAndOut("eQTL genes replication included: " + genesReplicationToInclude.size(), logWriter);
			writeAndOut("", logWriter);
		} else {
			genesReplicationToInclude = null;
		}

		BinaryInteractionFile inputFile = BinaryInteractionFile.load(inputInteractionFile, true);
		BinaryInteractionFile replicationFile = BinaryInteractionFile.load(replicationInteractionFile, true);

		String[] row = new String[15];

		CSVWriter replicatedSameDirectionWriter = writeHeader(new File(outputPrefix + "_ReplicatedSameDirection.txt"), row);
		CSVWriter replicatedOppositeDirectionWriter = writeHeader(new File(outputPrefix + "_ReplicatedOppositeDirection.txt"), row);
		CSVWriter notReplicatedSameDirectionWriter = writeHeader(new File(outputPrefix + "_NotReplicatedSameDirection.txt"), row);
		CSVWriter notReplicatedOppositeDirectionWriter = writeHeader(new File(outputPrefix + "_NotReplicatedOppositeDirection.txt"), row);
		CSVWriter notInReplicationWriter = writeHeader(new File(outputPrefix + "_NotInReplication.txt"), row);

		int significant = 0;
		int notSignificant = 0;
		int notTestedInReplication = 0;
		int nanReplication = 0;
		int notSignificantReplicationSameDirection = 0;
		int notSignificantReplicationOppositeDirection = 0;
		int significantReplicationOppositeDirection = 0;
		int significantReplicationSameDirection = 0;

		int reporter = 0;

		LinkedHashMap covariateCounts = new LinkedHashMap(inputFile.getCovariateCount());
		for (String covariate : inputFile.getCovariates()) {
			covariateCounts.put(covariate, new CovariateCount());
		}

		for (BinaryInteractionVariant variant : inputFile.getVariants()) {

			String variantName = variant.getName();

			BinaryInteractionVariant replicationVariant;
			boolean swap;

			if (matchOnChrPos) {
				replicationVariant = replicationFile.getVariant(variant.getChr(), variant.getPos());
			} else {
				if (replicationFile.containsVariant(variantName)) {
					replicationVariant = replicationFile.getVariant(variantName);
				} else {
					replicationVariant = null;
				}
			}

			if (replicationVariant != null) {
				if (!(variant.getRefAllele() == replicationVariant.getRefAllele() && variant.getAltAllele() == replicationVariant.getAltAllele())
						&& !(variant.getRefAllele() == replicationVariant.getAltAllele() && variant.getAltAllele() == replicationVariant.getRefAllele())) {
					System.err.println("Allele mismatch!");
				}
				swap = variant.getAltAllele() != replicationVariant.getAltAllele();
			} else {
				swap = false;
			}

			//Do loop anyway to also count not replicated

			int[] genePointers = inputFile.getVariant(variantName).getGenePointers();
			genes:
			for (int genePointer : genePointers) {

				BinaryInteractionGene gene = inputFile.getGene(genePointer);
				if (genesToInclude != null && !genesToInclude.contains(gene.getName())) {
					continue genes;
				}

				covairates:
				for (Iterator iterator = inputFile.readVariantGeneResults(variantName, gene.getName()); iterator.hasNext();) {

					BinaryInteractionQueryResult interaction = iterator.next();

					if (covariantsToInclude != null && !covariantsToInclude.contains(interaction.getCovariateName())) {
						continue covairates;
					}

					double metaInteractionZ = interaction.getInteractionZscores().getZscoreInteractionMeta();

					if (metaInteractionZ >= minAbsInteractionZ || metaInteractionZ <= -minAbsInteractionZ) {
						++significant;

						if (replicationVariant != null && replicationFile.containsInteraction(replicationVariant.getName(), gene.getName(), interaction.getCovariateName()) && (genesReplicationToInclude == null || genesReplicationToInclude.contains(interaction.getGeneName()) && (covariantsReplicationToInclude == null || covariantsToInclude.contains(interaction.getCovariateName())) )) {

							BinaryInteractionZscores replicationZscores = replicationFile.readInteractionResults(replicationVariant.getName(), gene.getName(), interaction.getCovariateName());
							double replicationInteractionZscore = replicationZscores.getZscoreInteractionMeta();

							BinaryInteractionQtlZscores replicationQtlRes = replicationFile.readQtlResults(replicationVariant.getName(), gene.getName());

							if (!Double.isNaN(replicationInteractionZscore)) {

								if (swap) {
									replicationInteractionZscore *= -1;
								}

								if (replicationInteractionZscore <= -minAbsReplicationInteractionZ || replicationInteractionZscore >= minAbsReplicationInteractionZ) {
									if (metaInteractionZ * replicationInteractionZscore >= 0) {
										++significantReplicationSameDirection;


										writeInteraction(row, variantName, gene, interaction, variant, replicationQtlRes, replicationZscores, swap, replicatedSameDirectionWriter);

									} else {
										++significantReplicationOppositeDirection;

										writeInteraction(row, variantName, gene, interaction, variant, replicationQtlRes, replicationZscores, swap, replicatedOppositeDirectionWriter);
									}
								} else {
									if (metaInteractionZ * replicationInteractionZscore >= 0) {
										++notSignificantReplicationSameDirection;
										writeInteraction(row, variantName, gene, interaction, variant, replicationQtlRes, replicationZscores, swap, notReplicatedSameDirectionWriter);
									} else {
										++notSignificantReplicationOppositeDirection;
										writeInteraction(row, variantName, gene, interaction, variant, replicationQtlRes, replicationZscores, swap, notReplicatedOppositeDirectionWriter);
									}
								}
							} else {
								writeInteraction(row, variantName, gene, interaction, variant, replicationQtlRes, replicationZscores, swap, notInReplicationWriter);
								++nanReplication;
							}

						} else {
							writeInteraction(row, variantName, gene, interaction, variant, null, null, swap, notInReplicationWriter);
							++notTestedInReplication;
						}

					} else {
						++notSignificant;
					}

					if (metaInteractionZ >= minAbsInteractionZCovariateCount || metaInteractionZ <= -minAbsInteractionZCovariateCount) {

						CovariateCount thisCovariateCounts = covariateCounts.get(interaction.getCovariateName());
						thisCovariateCounts.incrementCovariateSignificant();

						if (replicationVariant != null && replicationFile.containsInteraction(replicationVariant.getName(), gene.getName(), interaction.getCovariateName())) {

							BinaryInteractionZscores replicationZscores = replicationFile.readInteractionResults(replicationVariant.getName(), gene.getName(), interaction.getCovariateName());
							double replicationInteractionZscore = replicationZscores.getZscoreInteractionMeta();

							if (!Double.isNaN(replicationInteractionZscore)) {

								if (swap) {
									replicationInteractionZscore *= -1;
								}

								if (replicationInteractionZscore <= -minAbsReplicationInteractionZCovariateCount || replicationInteractionZscore >= minAbsReplicationInteractionZCovariateCount) {
									if (metaInteractionZ * replicationInteractionZscore >= 0) {
										thisCovariateCounts.incrementReplicatedSameDirection();

									} else {
										thisCovariateCounts.incrementReplicatedOppositeDirection();
									}
								} else {
									if (metaInteractionZ * replicationInteractionZscore >= 0) {
										thisCovariateCounts.incrementNotReplicatedSameDirection();
									} else {
										thisCovariateCounts.incrementNotReplicatedOppositeDirection();
									}
								}

							} else {
							}

						} else {
						}

					} else {
					}


				}

				++reporter;
				if (reporter % 500 == 0) {
					System.out.println("Parsed " + reporter + " of " + inputFile.getVariantGeneCombinations() + " variant-gene combinations");
				}

			}

		}

		replicatedSameDirectionWriter.close();
		replicatedOppositeDirectionWriter.close();
		notReplicatedSameDirectionWriter.close();
		notReplicatedOppositeDirectionWriter.close();
		notInReplicationWriter.close();

		writeCovaraiteCounts(new File(outputPrefix + "_CovariateCounts.txt"), covariateCounts);

		NumberFormat numberFormat = NumberFormat.getInstance();
		numberFormat.setMinimumFractionDigits(0);
		numberFormat.setMaximumFractionDigits(2);

		writeAndOut("", logWriter);
		writeAndOut("Total number of interactions: " + numberFormat.format(notSignificant + significant), logWriter);
		writeAndOut(" - Not significant: " + numberFormat.format(notSignificant) + " (" + numberFormat.format(notSignificant * 100d / (notSignificant + significant)) + "%)", logWriter);
		writeAndOut(" - Significant: " + numberFormat.format(significant) + " (" + numberFormat.format(significant * 100d / (notSignificant + significant)) + "%)", logWriter);
		writeAndOut("  * Not in replication: " + numberFormat.format(notTestedInReplication) + " (" + numberFormat.format(notTestedInReplication * 100d / significant) + "%)", logWriter);
		writeAndOut("  * NaN in replication: " + numberFormat.format(nanReplication) + " (" + numberFormat.format(nanReplication * 100d / significant) + "%)", logWriter);
		writeAndOut("  * Not significant in replication: " + numberFormat.format(notSignificantReplicationSameDirection + notSignificantReplicationOppositeDirection) + " (" + numberFormat.format((notSignificantReplicationSameDirection + notSignificantReplicationOppositeDirection) * 100d / significant) + "%)", logWriter);
		writeAndOut("   # Same direction: " + numberFormat.format(notSignificantReplicationSameDirection) + " (" + numberFormat.format(notSignificantReplicationSameDirection * 100d / (notSignificantReplicationSameDirection + notSignificantReplicationOppositeDirection)) + "%)", logWriter);
		writeAndOut("   # Opposite direction: " + numberFormat.format(notSignificantReplicationOppositeDirection) + " (" + numberFormat.format(notSignificantReplicationOppositeDirection * 100d / (notSignificantReplicationSameDirection + notSignificantReplicationOppositeDirection)) + "%)", logWriter);
		writeAndOut("  * Significant in replication: " + numberFormat.format(significantReplicationSameDirection + significantReplicationOppositeDirection) + " (" + numberFormat.format((significantReplicationSameDirection + significantReplicationOppositeDirection) * 100d / significant) + "%)", logWriter);
		writeAndOut("   # Same direction: " + numberFormat.format(significantReplicationSameDirection) + " (" + numberFormat.format(significantReplicationSameDirection * 100d / (significantReplicationSameDirection + significantReplicationOppositeDirection)) + "%)", logWriter);
		writeAndOut("   # Opposite direction: " + numberFormat.format(significantReplicationOppositeDirection) + " (" + numberFormat.format(significantReplicationOppositeDirection * 100d / (significantReplicationSameDirection + significantReplicationOppositeDirection)) + "%)", logWriter);

		logWriter.close();

	}

	private static void writeInteraction(String[] row, String variantName, BinaryInteractionGene gene, BinaryInteractionQueryResult interation, BinaryInteractionVariant variant, BinaryInteractionQtlZscores replicationQtlRes, BinaryInteractionZscores replicationZscores, boolean swap, CSVWriter interactionWriter) {
		int c = 0;
		row[c++] = variantName;
		row[c++] = gene.getName();
		row[c++] = interation.getCovariateName();
		row[c++] = variant.getChr();
		row[c++] = String.valueOf(variant.getPos());
		row[c++] = variant.getRefAllele().getAlleleAsString() + "/" + variant.getAltAllele().getAlleleAsString();
		row[c++] = variant.getAltAllele().getAlleleAsString();
		row[c++] = String.valueOf(interation.getQtlZscores().getMetaZscore());
		row[c++] = String.valueOf(interation.getInteractionZscores().getZscoreSnpMeta());
		row[c++] = String.valueOf(interation.getInteractionZscores().getZscoreCovariateMeta());
		row[c++] = String.valueOf(interation.getInteractionZscores().getZscoreInteractionMeta());
		row[c++] = replicationQtlRes == null ? "NaN" : String.valueOf(replicationQtlRes.getMetaZscore() * (swap ? -1 : 1));
		row[c++] = replicationZscores == null ? "NaN" : String.valueOf(replicationZscores.getZscoreSnpMeta() * (swap ? -1 : 1));
		row[c++] = replicationZscores == null ? "NaN" : String.valueOf(replicationZscores.getZscoreCovariateMeta());
		row[c++] = replicationZscores == null ? "NaN" : String.valueOf(replicationZscores.getZscoreInteractionMeta() * (swap ? -1 : 1));
		interactionWriter.writeNext(row);
	}

	private static CSVWriter writeHeader(File file, String[] row) throws IOException {
		CSVWriter replicatedSameDirectionWriter = new CSVWriter(new BufferedWriter(new FileWriter(file)), '\t', '\0', '\0');
		int c = 0;
		row[c++] = "Variant";
		row[c++] = "Gene";
		row[c++] = "Covariate";
		row[c++] = "Variant_chr";
		row[c++] = "Variant_pos";
		row[c++] = "Variant alleles";
		row[c++] = "Assessed_allele";
		row[c++] = "Discovery_meta_QTL";
		row[c++] = "Discovery_meta_SNP";
		row[c++] = "Discovery_meta_covariate";
		row[c++] = "Discovery_meta_interaction";
		row[c++] = "Replication_meta_QTL";
		row[c++] = "Replication_meta_SNP";
		row[c++] = "Replication_meta_covariate";
		row[c++] = "Replication_meta_interaction";
		replicatedSameDirectionWriter.writeNext(row);
		return replicatedSameDirectionWriter;
	}

	private static void writeCovaraiteCounts(File file, LinkedHashMap covariateCounts) throws IOException {

		CSVWriter covariateCountWriter = new CSVWriter(new BufferedWriter(new FileWriter(file)), '\t', '\0', '\0');
		int c = 0;
		String[] row2 = new String[6];
		row2[c++] = "Covariate";
		row2[c++] = "Significant";
		row2[c++] = "ReplicatedSameDirection";
		row2[c++] = "ReplicatedOppositeDirection";
		row2[c++] = "NotReplicateSameDirection";
		row2[c++] = "NotReplicatedOppositeDirection";
		covariateCountWriter.writeNext(row2);

		for (Map.Entry covariateEntry : covariateCounts.entrySet()) {

			CovariateCount thisCounts = covariateEntry.getValue();

			c = 0;
			row2[c++] = covariateEntry.getKey();
			row2[c++] = String.valueOf(thisCounts.getCovariateSignificant());
			row2[c++] = String.valueOf(thisCounts.getReplicatedSameDirection());
			row2[c++] = String.valueOf(thisCounts.getReplicatedOppositeDirection());
			row2[c++] = String.valueOf(thisCounts.getNotReplicatedSameDirection());
			row2[c++] = String.valueOf(thisCounts.getNotReplicatedOppositeDirection());
			covariateCountWriter.writeNext(row2);

		}

		covariateCountWriter.close();

	}

	private static void writeAndOut(String message, Writer writer) throws IOException {
		writer.append(message);
		writer.append('\n');
		System.out.println(message);
	}

	private static class CovariateCount {

		private int covariateSignificant = 0;
		private int replicatedSameDirection = 0;
		private int replicatedOppositeDirection = 0;
		private int notReplicatedSameDirection = 0;
		private int notReplicatedOppositeDirection = 0;

		public int getCovariateSignificant() {
			return covariateSignificant;
		}

		public int getReplicatedSameDirection() {
			return replicatedSameDirection;
		}

		public int getReplicatedOppositeDirection() {
			return replicatedOppositeDirection;
		}

		public int getNotReplicatedSameDirection() {
			return notReplicatedSameDirection;
		}

		public int getNotReplicatedOppositeDirection() {
			return notReplicatedOppositeDirection;
		}

		public void incrementCovariateSignificant() {
			covariateSignificant++;
		}

		public void incrementReplicatedSameDirection() {
			replicatedSameDirection++;
		}

		public void incrementReplicatedOppositeDirection() {
			replicatedOppositeDirection++;
		}

		public void incrementNotReplicatedSameDirection() {
			notReplicatedSameDirection++;
		}

		public void incrementNotReplicatedOppositeDirection() {
			notReplicatedOppositeDirection++;
		}
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy