package org.seqcode.projects.seqview.components;
import java.util.*;
import java.util.List;
import java.util.regex.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import javax.swing.border.Border;
import org.seqcode.data.core.ExptType;
import org.seqcode.data.seqdata.*;
import org.seqcode.data.seqdata.SeqLocatorMatchedAligns.SeqLMENotReplicatesException;
import org.seqcode.gseutils.Pair;
import org.seqcode.viz.components.GenericSelectPanel;
import java.sql.*;
public class SeqAlignmentSelectPanel extends GenericSelectPanel<SeqLocatorMatchedAligns> {
private SeqDataLoader seqLoader;
private TreeSet<SeqLocatorMatchedAligns> lmes;
private ArrayList<SeqAlignment> alignments;
private JComboBox jcbType;
private JTextField regexLab, regexCond, regexTarget, regexCell, regexAlign, regexRep;
private SeqAlignmentTableModel selectedModel, filteredModel;
public SeqAlignmentSelectPanel() {
try {
seqLoader = new SeqDataLoader(true, true);
} catch (Exception e) {
e.printStackTrace();
seqLoader = null;
}
lmes = new TreeSet<SeqLocatorMatchedAligns>();
alignments = new ArrayList<SeqAlignment>();
selectedModel = new SeqAlignmentTableModel();
filteredModel = new SeqAlignmentTableModel();
init(filteredModel,selectedModel);
}
public JPanel getInputsPanel() {
JPanel inputPanel = new JPanel();
inputPanel.setLayout(new GridLayout(2,7));
try {
ArrayList<String> types = new ArrayList<String>();
types.add("");
for(ExptType e : seqLoader.getMetadataLoader().loadAllExptTypes(false))
types.add(e.getName());
Collections.sort(types);
jcbType = new JComboBox(types.toArray()); jcbType.setEditable(true);
jcbType.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){filter();}});
regexLab = new JTextField(); regexLab.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){filter();}});
regexCond = new JTextField(); regexCond.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){filter();}});
regexTarget = new JTextField(); regexTarget.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){filter();}});
regexCell = new JTextField(); regexCell.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){filter();}});
regexAlign = new JTextField(); regexAlign.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){filter();}});
regexRep = new JTextField(); regexRep.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){filter();}});
Font labelFont = new Font("SansSerif", Font.PLAIN, 10);
Border paddingBorder = BorderFactory.createEmptyBorder(5,5,5,5);
JLabel labelExpt = new JLabel("ExptType"); labelExpt.setFont(labelFont); labelExpt.setBorder(paddingBorder);
JLabel labelLab = new JLabel("Lab"); labelLab.setFont(labelFont); labelLab.setBorder(paddingBorder);
JLabel labelCond = new JLabel("ExptCondition"); labelCond.setFont(labelFont); labelCond.setBorder(paddingBorder);
JLabel labelTarget = new JLabel("ExptTarget"); labelTarget.setFont(labelFont); labelTarget.setBorder(paddingBorder);
JLabel labelCell = new JLabel("CellLine"); labelCell.setFont(labelFont); labelCell.setBorder(paddingBorder);
JLabel labelAlign = new JLabel("Alignment"); labelAlign.setFont(labelFont); labelAlign.setBorder(paddingBorder);
JLabel labelRep = new JLabel("Replicate"); labelRep.setFont(labelFont); labelRep.setBorder(paddingBorder);
inputPanel.add(labelExpt);
inputPanel.add(labelLab);
inputPanel.add(labelCond);
inputPanel.add(labelTarget);
inputPanel.add(labelCell);
inputPanel.add(labelAlign);
inputPanel.add(labelRep);
inputPanel.add(jcbType);
inputPanel.add(regexLab);
inputPanel.add(regexCond);
inputPanel.add(regexTarget);
inputPanel.add(regexCell);
inputPanel.add(regexAlign);
inputPanel.add(regexRep);
} catch (SQLException e) {
e.printStackTrace();
}
return inputPanel;
}
public Collection<SeqLocatorMatchedAligns> getFilteredForSelected() {
Map<Pair<String,String>, Set<String>> reps = new HashMap<Pair<String,String>, Set<String>>();
Map<Pair<String,String>, List<SeqAlignment>> aligns = new HashMap<Pair<String,String>, List<SeqAlignment>>();
for (SeqLocatorMatchedAligns lme : super.getFilteredForSelected()) {
Collection<SeqAlignment> a = lme.aligns;
SeqLocator l = lme.locator;
Pair<String,String> key = new Pair<String,String>(l.getExptName(), l.getAlignName());
if (!reps.containsKey(key)) {
reps.put(key, new HashSet<String>());
aligns.put(key, new ArrayList<SeqAlignment>());
}
if(reps.containsKey(key)){
reps.get(key).addAll(l.getReplicates());
aligns.get(key).addAll(a);
}
}
ArrayList<SeqLocatorMatchedAligns> output = new ArrayList<SeqLocatorMatchedAligns>();
for (Pair<String,String> nv : reps.keySet()) {
try {
output.add(new SeqLocatorMatchedAligns(aligns.get(nv),
new SeqLocator(nv.car(), reps.get(nv), nv.cdr())));
} catch (SeqLMENotReplicatesException e) {
System.err.println(e.getMessage());
e.printStackTrace();
}
}
return output;
}
public void retrieveData() {
try {
synchronized(lmes) {
lmes.clear();
alignments.clear();
alignments.addAll(seqLoader.loadAllAlignments(getGenome()));
for(SeqAlignment align : alignments) {
List<SeqAlignment> a = new ArrayList<SeqAlignment>();
a.add(align);
lmes.add(new SeqLocatorMatchedAligns(a,
new SeqLocator(align.getExpt().getName(), align.getExpt().getReplicate(), align.getName())));
}
}
} catch (SQLException e) {
throw new RuntimeException(e.toString(), e);
} catch (SeqLMENotReplicatesException e1) {
System.err.println(e1.getMessage());
e1.printStackTrace();
}
}
public void updateComponents() {
selectedModel.clear();
filteredModel.clear();
synchronized(lmes) {
for (SeqLocatorMatchedAligns l : lmes) {
filteredModel.addObject(l);
}
}
}
public void info() {
int[] inds = filteredList.getSelectedRows();
for (int i = 0; i < inds.length; i++) {
SeqLocatorMatchedAligns lma = filteredModel.getObject(inds[i]);
Collection<SeqAlignment> aligns = lma.aligns;
for(SeqAlignment align : aligns){
SeqExpt expt = align.getExpt();
String info=" "+expt.getName()+";"+expt.getReplicate()+";"+align.getName();
info = info+ "\n\n SeqExpt info:\n";
info = info+ "\tID: "+expt.getDBID()+"\n";
info = info+ "\tName: "+expt.getName()+"\n";
info = info+ "\tRep: "+expt.getReplicate()+"\n";
info = info+ "\tSpecies: "+expt.getOrganism().getName()+"\n";
info = info+ "\tLab: "+expt.getLab().getName()+"\n";
info = info+ "\tExptType: "+expt.getExptType().getName()+"\n";
info = info+ "\tExptCondition: "+expt.getExptCondition().getName()+"\n";
info = info+ "\tExptTarget: "+expt.getExptTarget().getName()+"\n";
info = info+ "\tExptCellLine: "+expt.getCellLine().getName()+"\n";
info = info+ "\tReadType: "+expt.getReadType().getName()+"\n";
info = info+ "\tReadLen: "+expt.getReadLength()+"\n";
info = info+ "\tNumRead: "+expt.getNumRead()+"\n";
info = info+ "\tCollabID: "+expt.getCollabID()+"\n";
info = info+ "\tPublicSource: "+expt.getPublicSource()+"\n";
info = info+ "\tPublicDBID: "+expt.getPublicDBID()+"\n";
info = info+ "\tFQFile: "+expt.getFQFile()+"\n";
info = info+ "\tExptNote: "+expt.getExptNote()+"\n";
info = info+ " SeqAlignment info:\n";
info = info+ "\tID: "+align.getDBID()+"\n";
info = info+ "\tName: "+align.getName()+"\n";
info = info+ "\tGenome: "+align.getGenome().getVersion()+"\n";
info = info+ "\tAlignType: "+align.getAlignType().getName()+"\n";
info = info+ "\tPermissions: "+align.getPermissions()+"\n";
info = info+ "\tNumHits: "+align.getNumHits()+"\n";
info = info+ "\tTotalWeight: "+align.getTotalWeight()+"\n";
info = info+ "\tAlignDir: "+align.getAlignDir()+"\n";
info = info+ "\tAlignFile: "+align.getAlignFile()+"\n";
info = info+ "\tIDXFile: "+align.getIDXFile()+"\n";
info = info+ "\tCollabAlignID: "+align.getCollabAlignID()+"\n";
JFrame frame = new JFrame();
JTextArea textArea = new JTextArea(info);
frame.add(textArea);
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
}
}
public void filter() {
Pattern pattType=null, pattLab=null, pattCond=null, pattTarget=null, pattCell=null, pattAlign=null, pattRep=null;
//String regType = regexType.getText().trim();
String regType = (String) jcbType.getSelectedItem();
regType=regType.toLowerCase();
if(regType != null && regType.length() > 0)
pattType = Pattern.compile(regType);
String regLab = regexLab.getText().trim();
regLab = regLab.toLowerCase();
if(regLab != null && regLab.length() > 0)
pattLab = Pattern.compile(regLab);
String regCond = regexCond.getText().trim();
regCond = regCond.toLowerCase();
if(regCond != null && regCond.length() > 0)
pattCond = Pattern.compile(regCond);
String regTarget = regexTarget.getText().trim();
regTarget = regTarget.toLowerCase();
if(regTarget != null && regTarget.length() > 0)
pattTarget = Pattern.compile(regTarget);
String regCell = regexCell.getText().trim();
regCell = regCell.toLowerCase();
if(regCell != null && regCell.length() > 0)
pattCell = Pattern.compile(regCell);
String regAlign = regexAlign.getText().trim();
regAlign=regAlign.toLowerCase();
if(regAlign != null && regAlign.length() > 0)
pattAlign = Pattern.compile(regAlign);
String regRep = regexRep.getText().trim();
regRep = regRep.toLowerCase();
if(regRep != null && regRep.length() > 0)
pattRep = Pattern.compile(regRep);
synchronized(lmes) {
lmes.clear();
for (SeqAlignment align : alignments){
if( (pattType == null || pattType.matcher(align.getExpt().getExptType().getName().toLowerCase()).find()) &&
(pattLab == null || pattLab.matcher(align.getExpt().getLab().getName().toLowerCase()).find()) &&
(pattCond == null || pattCond.matcher(align.getExpt().getExptCondition().getName().toLowerCase()).find()) &&
(pattTarget == null || pattTarget.matcher(align.getExpt().getExptTarget().getName().toLowerCase()).find()) &&
(pattCell == null || pattCell.matcher(align.getExpt().getCellLine().getName().toLowerCase()).find()) &&
(pattAlign == null || pattAlign.matcher(align.getName().toLowerCase()).find()) &&
(pattRep == null || pattRep.matcher(align.getExpt().getReplicate().toLowerCase()).find())
) {
List<SeqAlignment> a = new ArrayList<SeqAlignment>();
a.add(align);
try {
lmes.add(new SeqLocatorMatchedAligns(a,
new SeqLocator(align.getExpt().getName(),
align.getExpt().getReplicate(),
align.getName())));
} catch (SeqLMENotReplicatesException e1) {
System.err.println(e1.getMessage());
e1.printStackTrace();
}
}
}
filteredModel.clear();
for (SeqLocatorMatchedAligns l : lmes) {
filteredModel.addObject(l);
}
}
}
/*
public static Collection<SeqLocator> collapseLocatorsByName(Collection<SeqLocator> locs) {
LinkedHashMap<String,Map<String,Set<String>>> map =
new LinkedHashMap<String,Map<String,Set<String>>>();
for(SeqLocator loc : locs) {
String exptName = loc.getExptName();
String alignName = loc.getAlignName();
if(!map.containsKey(exptName)) { map.put(exptName, new LinkedHashMap<String,Set<String>>()); }
if(!map.get(exptName).containsKey(alignName)) { map.get(exptName).put(alignName, new TreeSet<String>()); }
map.get(exptName).get(alignName).addAll(loc.getReplicates());
}
LinkedList<SeqLocator> collapsed = new LinkedList<SeqLocator>();
for(String exptName : map.keySet()) {
for(String alignName : map.get(exptName).keySet()) {
SeqLocator newloc = new SeqLocator(exptName, map.get(exptName).get(alignName), alignName);
collapsed.add(newloc);
}
}
return collapsed;
}*/
public void close() {
super.close();
if (seqLoader != null) {
seqLoader.close();
}
}
}