package org.seqcode.viz.compositeplot;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.imageio.ImageIO;
import org.seqcode.data.io.FASTALoader;
import org.seqcode.data.io.RegionFileUtilities;
import org.seqcode.genome.Genome;
import org.seqcode.genome.Species;
import org.seqcode.genome.location.StrandedRegion;
import org.seqcode.genome.sequence.SequenceGenerator;
import org.seqcode.gseutils.ArgParser;
import org.seqcode.gseutils.Args;
import org.seqcode.gseutils.NotFoundException;
import org.seqcode.gseutils.Pair;
public class SequenceAlignmentFigure {
public SequenceAlignmentFigure(){}
/**
* Visualize sequences as color pixels
* @param seqs, raw sequences or FASTA sequences
* @param width, width of each base, in pixel
* @param height, height of each base, in pixel
* @param f, output file
*/
public static void visualizeSequences(List<String> seqs, int width, int height, File f){
if (seqs.size()==0)
return;
int pixheight = 0;
int maxLen = 0;
for (String s:seqs){
if (s.length()!=0 && s.charAt(0)!='>') { // ignore header line of FASTA file
pixheight += height;
if (maxLen < s.length())
maxLen = s.length();
}
}
int pixwidth = maxLen*width;
System.setProperty("java.awt.headless", "true");
BufferedImage im = new BufferedImage(pixwidth, pixheight,BufferedImage.TYPE_INT_ARGB);
Graphics g = im.getGraphics();
Graphics2D g2 = (Graphics2D)g;
g2.setColor(Color.WHITE);
g2.fillRect(0,0,pixwidth, pixheight);
int count = 0;
for (String s:seqs){
if (s.charAt(0)=='>') // ignore header line of FASTA file
continue;
char[] letters = s.toCharArray();
for (int j=0;j<letters.length;j++){
switch(letters[j]){
case 'A':
case 'a':
g.setColor(Color.RED);
break;
case 'C':
case 'c':
g.setColor(Color.BLUE);
break;
case 'G':
case 'g':
g.setColor(Color.ORANGE);
break;
case 'T':
case 't':
g.setColor(Color.GREEN);
break;
case '-':
g.setColor(Color.WHITE);
break;
default:
g.setColor(Color.GRAY);
}
g.fillRect(j*width, count*height, width, height);
}
count++;
}
try {
ImageIO.write(im,"png",f);
} catch (IOException ex) {
ex.printStackTrace();
}
}
public static void main(String[] args) {
ArgParser ap = new ArgParser(args);
if(!ap.hasKey("species")) {
System.err.println("Usage:\n " +
"SequenceAlignmentFigure \n" +
" Required: \n" +
" --species <species;version> AND --gen <sequence directory> AND" +
" --peaks <file containing stranded coordinates> OR" +
" --seq <FASTA file>\n" +
" --win <window of sequence around peaks> \n"+
" --out output filename\n" +
" --seqout sequence output filename\n" +
"");
return;
}
try {
Pair<Species, Genome> pair = Args.parseGenome(args);
Species currorg = pair.car();
Genome currgen = pair.cdr();
String outFile = ap.hasKey("out") ? ap.getKeyValue("out") : "out.png";
String seqOutFile = ap.hasKey("seqout") ? ap.getKeyValue("seqout") : null;
List<String> seqs = null;
if(ap.hasKey("peaks")){
String genomeSequencePath = ap.hasKey("gen") ? ap.getKeyValue("gen") : null;
SequenceGenerator seqgen = new SequenceGenerator(currgen);
if(genomeSequencePath != null){
seqgen.useCache(true);
seqgen.useLocalFiles(true);
seqgen.setGenomePath(genomeSequencePath);
}
String peaksFile = ap.getKeyValue("peaks");
int win = ap.hasKey("win") ? new Integer(ap.getKeyValue("win")).intValue():-1;
List<StrandedRegion> regions = RegionFileUtilities.loadStrandedRegionsFromMotifFile(currgen, peaksFile, win);
seqs = RegionFileUtilities.getSequencesForStrandedRegions(regions, seqgen);
}else if(ap.hasKey("seq")){
String seqsFile = ap.getKeyValue("seq");
FASTALoader loader = new FASTALoader();
File f = new File(seqsFile);
seqs = new ArrayList<String>();
Iterator<Pair<String, String>> it = loader.execute(f);
while(it.hasNext()){
Pair<String, String> p = it.next();
String name = p.car();
String seq = p.cdr();
seqs.add(seq);
}
}
if(seqs !=null){
SequenceAlignmentFigure fig = new SequenceAlignmentFigure();
fig.visualizeSequences(seqs, 3, 1, new File(outFile));
if(seqOutFile != null){
FileWriter fout = new FileWriter(seqOutFile);
for(String s: seqs){
fout.write(String.format("%s\n", s));
}
fout.close();
}
}
} catch (NotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}