diff --git a/uk/ac/sanger/artemis/io/GFFStreamFeature.java b/uk/ac/sanger/artemis/io/GFFStreamFeature.java index 59e4aea56a93eefb5f6be591ef60f36e5df0738c..8e68ac3c0d8bbc09c0919b8e72cd5858048fc43b 100644 --- a/uk/ac/sanger/artemis/io/GFFStreamFeature.java +++ b/uk/ac/sanger/artemis/io/GFFStreamFeature.java @@ -27,8 +27,10 @@ package uk.ac.sanger.artemis.io; import java.util.Hashtable; +import java.util.HashSet; import java.util.Enumeration; import java.util.List; +import java.util.Set; import java.util.StringTokenizer; import java.util.Vector; import java.io.IOException; @@ -113,6 +115,28 @@ public class GFFStreamFeature extends SimpleDocumentFeature { "\n", "%5C" } // new-line }; + private static Set<String> attrs_to_filter = new HashSet<String>(); + + /** + * Registers an attribute not to be included in the GFF3 output for + * GFFStreamFeatures + * @param attr The GFF3 attribute to remove + **/ + public static void removeAttribute(String attr) + { + attrs_to_filter.add(attr); + } + + /** + * Registers an attribute to be included in the GFF3 output for + * GFFStreamFeatures + * @param attr The GFF3 attribute to include + **/ + public static void includeAttribute(String attr) + { + attrs_to_filter.remove(attr); + } + /** * Create a new GFFStreamFeature object. The feature should be added * to an Entry (with Entry.add()). @@ -893,6 +917,9 @@ public class GFFStreamFeature extends SimpleDocumentFeature if(lname) continue; + if(attrs_to_filter.contains(this_qualifier.getName())) + continue; + if( (this_qualifier.getName().equals("private") && System.getProperty("noprivate") != null) || (this_qualifier.getName().equals("history") && System.getProperty("nohistory") != null) ) continue; diff --git a/uk/ac/sanger/artemis/io/ReadAndWriteEntry.java b/uk/ac/sanger/artemis/io/ReadAndWriteEntry.java index 19cd5eab225c1c4c9a80d3ab7db232fce545e211..278bcaa4c96a082e7a1aa235afb7b685d509c4bb 100644 --- a/uk/ac/sanger/artemis/io/ReadAndWriteEntry.java +++ b/uk/ac/sanger/artemis/io/ReadAndWriteEntry.java @@ -42,11 +42,11 @@ import uk.ac.sanger.artemis.Options; public class ReadAndWriteEntry { - private static org.apache.log4j.Logger logger4j = + private static org.apache.log4j.Logger logger4j = org.apache.log4j.Logger.getLogger(ReadAndWriteEntry.class); private static DatabaseEntrySource ENTRY_SOURCE; - + /** * Read from the database, given a srcFeature uniquename * @param uniqueName @@ -56,7 +56,7 @@ public class ReadAndWriteEntry * @throws IOException */ public static Entry readEntryFromDatabase(final String uniqueName, - DatabaseEntrySource entry_source) + DatabaseEntrySource entry_source) throws OutOfRangeException, NoSequenceException, IOException { if(entry_source == null) @@ -71,23 +71,23 @@ public class ReadAndWriteEntry if(!entry_source.setLocation(promptUser)) return null; } - + String url = (String)entry_source.getLocation(); int index = url.indexOf("?"); - + String userName = url.substring(index+1).trim(); if(userName.startsWith("user=")) userName = userName.substring(5); - + final String srcFeatureId = getFeatureId(entry_source, uniqueName); - + final InputStreamProgressListener stream_progress_listener = - new InputStreamProgressListener() + new InputStreamProgressListener() { - public void progressMade(final InputStreamProgressEvent event) + public void progressMade(final InputStreamProgressEvent event) { final int char_count = event.getCharCount(); - if(char_count != -1) + if(char_count != -1) logger4j.debug("chars read so far: " + char_count); } public void progressMade(String progress) @@ -95,10 +95,10 @@ public class ReadAndWriteEntry logger4j.debug(progress); } }; - return entry_source.getEntry(srcFeatureId, userName, + return entry_source.getEntry(srcFeatureId, userName, stream_progress_listener); } - + /** * Read from the database, given a srcFeature uniquename * @param uniqueName @@ -107,12 +107,12 @@ public class ReadAndWriteEntry * @throws NoSequenceException * @throws IOException */ - public static Entry readEntryFromDatabase(final String uniqueName) + public static Entry readEntryFromDatabase(final String uniqueName) throws OutOfRangeException, NoSequenceException, IOException { return readEntryFromDatabase(uniqueName, null); } - + /** * Write entry to a file * @param entry @@ -120,7 +120,7 @@ public class ReadAndWriteEntry * @param flatten Flatten the gene model and combine the qualifiers if true. * If false it will write all features and qualifiers out. * @param ignore obsolete features if true - * @param force invalid qualifiers and any features with invalid keys will + * @param force invalid qualifiers and any features with invalid keys will * be quietly thrown away when saving. * @param include_diana_extensions false if writing EMBL submission format. * @param destination_type Should be one of EMBL_FORMAT, GENBANK_FORMAT, @@ -137,7 +137,7 @@ public class ReadAndWriteEntry final boolean force, final boolean include_diana_extensions, final int destination_type, - final JFrame parent) + final JFrame parent) throws IOException, EntryInformationException { GeneUtils.lazyLoadAll(entry, parent); @@ -148,15 +148,15 @@ public class ReadAndWriteEntry final FeatureVector features = entry.getAllFeatures(); for(int i=0; i<features.size(); i++) addAllKeysQualifiers(artemis_entry_information, features.elementAt(i).getEmblFeature()); - + if(entry.getEMBLEntry() instanceof GFFDocumentEntry) - addQualifierToEntryInfo(artemis_entry_information, + addQualifierToEntryInfo(artemis_entry_information, (String)PublicDBDocumentEntry.getDatabaseQualifiersToRemove()[0]); } PublicDBDocumentEntry.IGNORE_OBSOLETE_FEATURES = ignoreObsolete; - + if(destination_type == DocumentEntryFactory.EMBL_FORMAT && - (entry.getHeaderText() == null || + (entry.getHeaderText() == null || entry.getHeaderText().equals("") || entry.getHeaderText().startsWith("#"))) { @@ -169,9 +169,9 @@ public class ReadAndWriteEntry ind = name.lastIndexOf(".embl"); if(ind > -1) name = name.substring(0, ind); - + } - + int length = entry.getBases().getLength(); String header = "ID "+name+"; SV ; ; ; ; ; "+length+" BP."; if(entry.getFeatureCount() > 0) @@ -185,10 +185,10 @@ public class ReadAndWriteEntry else entry.saveStandardOnly(file, destination_type, force); } - - + + /** - * Add all keys and qualifiers for a given feature to the EntryInformation + * Add all keys and qualifiers for a given feature to the EntryInformation * @param entry_information * @param feature */ @@ -196,18 +196,18 @@ public class ReadAndWriteEntry final Feature feature) { Key new_key = feature.getKey(); - + new_key = PublicDBDocumentEntry.mapKeys(new_key); - + boolean keyAdded = false; if(!entry_information.isValidKey(new_key)) { entry_information.addKey(new_key); keyAdded = true; } - + final QualifierVector feature_qualifiers = feature.getQualifiers(); - + // check the qualifiers for(int i = 0 ; i < feature_qualifiers.size() ; ++i) { @@ -216,10 +216,10 @@ public class ReadAndWriteEntry if(!entry_information.isValidQualifier(this_qualifier_name) || !entry_information.isValidQualifier(new_key, this_qualifier_name) || - keyAdded) + keyAdded) { QualifierInfo qualifierInfo = entry_information.getQualifierInfo(this_qualifier_name); - + if(qualifierInfo == null) { KeyVector keys = new KeyVector(); @@ -234,14 +234,14 @@ public class ReadAndWriteEntry e.printStackTrace(); } } - + if(qualifierInfo.getValidKeys() != null) qualifierInfo.getValidKeys().add(new_key); } } } - + protected static void addQualifierToEntryInfo(final EntryInformation entry_information, final String qualifier_name) { @@ -257,7 +257,7 @@ public class ReadAndWriteEntry e.printStackTrace(); } } - + /** * Get feature id * @param entry_source @@ -271,7 +271,7 @@ public class ReadAndWriteEntry org.gmod.schema.sequence.Feature feature = doc.getFeatureByUniquename(srcUniqueName); return Integer.toString(feature.getFeatureId()); } - + /** * return the ENTRY_SOURCE */ @@ -287,17 +287,18 @@ public class ReadAndWriteEntry String names[]; boolean flatten = true; boolean ignoreObsolete = true; - + if( (args != null && args.length == 1 && args[0].startsWith("-h")) || (args == null || args.length < 1)) { System.out.println("-h\tshow help"); System.out.println("-f\t[y|n] flatten the gene model, default is y"); + System.out.println("-flt\tspace separated list of qualifiers to ignore (GFF only)"); System.out.println("-i\t[y|n] ignore obsolete features, default is y"); System.out.println("-s\tspace separated list of sequences to read and write out"); System.out.println("-o\t[EMBL|GFF] output format, default is EMBL"); - + // note that read_only and noprompt -D parameters redundant now System.out.println("Advanced parameters:"); System.out.println("-l\tlocation of EMBL mapping files (qualifier_mapping and key_mapping)"); @@ -310,11 +311,11 @@ public class ReadAndWriteEntry System.out.println("-p\tthe password for connecting to the Chado database"); System.out.println("-fp\t the file path (the folder you want to save the files in)"); System.out.println("-np\t[y|n] do not write out private qualifiers, default is y"); - + System.exit(0); } - - + + names = args; int format = DocumentEntryFactory.EMBL_FORMAT; boolean include_diana_extensions = true; @@ -322,9 +323,9 @@ public class ReadAndWriteEntry boolean gzip = true; boolean noprivates = true; boolean removeProductForPseudo = false; - + String filePath = ""; - + for(int i = 0; i < args.length; i++) { String key = args[i].toLowerCase(); @@ -366,7 +367,7 @@ public class ReadAndWriteEntry if(i + 1 < args.length && args[i + 1].toLowerCase().equals("y")) LocalAndRemoteFileManager.domainLoad.setSelected(true); } - + // GSV :: added these command-line parameters // note that read_only and noprompt -D parameters redundant now else if (key.equals("-u")) @@ -391,10 +392,10 @@ public class ReadAndWriteEntry filePath = args[i + 1]; } } - + // run this after all the system properties have been set UI.initalise(); - + java.util.Vector<String> files = null; for(int i = 0; i < args.length; i++) { @@ -407,6 +408,18 @@ public class ReadAndWriteEntry if(args[j].startsWith("-")) break; files.add(args[j]); + i++; + } + } + else if(args[i].toLowerCase().equals("-flt")) + { + for(int j = i + 1; j < args.length; j++) + { + if(args[j].startsWith("-")) { + break; + } + GFFStreamFeature.removeAttribute(args[j]); + i++; } } else if(args[i].startsWith("-")) @@ -426,7 +439,7 @@ public class ReadAndWriteEntry names = new String[files.size()]; files.toArray(names); } - + if(filePath.length() != 0) { filePath += "/"; @@ -437,19 +450,19 @@ public class ReadAndWriteEntry if(noprivates) System.setProperty("noprivate", "true"); - + for(int i=0;i < names.length; i++) { - + System.out.println("read :: "+names[i]+" write :: "+names[i]+suffix); logger4j.info("read :: "+names[i]+" write :: "+names[i]+suffix); - + Entry entry = ReadAndWriteEntry.readEntryFromDatabase(names[i], ENTRY_SOURCE); DocumentEntryFactory.REMOVE_PRODUCT_FROM_PSEUDOGENE = removeProductForPseudo; try { ReadAndWriteEntry.writeDatabaseEntryToFile( - entry, new File(filePath + names[i]+suffix), flatten, ignoreObsolete, + entry, new File(filePath + names[i]+suffix), flatten, ignoreObsolete, false, include_diana_extensions, format, null); System.out.println("done"); logger4j.info("done"); @@ -458,10 +471,10 @@ public class ReadAndWriteEntry { String label = "Destination format can't handle all keys/qualifiers - continue?"; boolean canContinue = UI.booleanUserInput(label, eie.getMessage()); - + if (canContinue) { - ReadAndWriteEntry.writeDatabaseEntryToFile(entry, new File(filePath + names[i] + suffix), + ReadAndWriteEntry.writeDatabaseEntryToFile(entry, new File(filePath + names[i] + suffix), flatten, ignoreObsolete, true, include_diana_extensions, format, null); System.out.println("done"); @@ -477,5 +490,5 @@ public class ReadAndWriteEntry } System.exit(0); } - + } \ No newline at end of file