Download and install a clean eclipse-jee-2019-06
-In gradle.properties edit `jalviewjs_eclipse_root` to point to the root dir. Include up to the Eclipse.app folder if it's the macOS version.
+In gradle.properties edit `jalviewjs_eclipse_root` to point to the root dir. DO NOT include the Eclipse.app folder in the path (up to this point, but not the .app folder) if it's the macOS version.
gradle tasks of interest:
def eclipseDropinsDir
def eclipsePluginsDir
task jalviewjsEclipsePaths {
+ def eclipseRoot = jalviewjs_eclipse_root
+ if (eclipseRoot.startsWith("~")) {
+ eclipseRoot = System.getProperty("user.home") + eclipseRoot.substring(1)
+ }
if (OperatingSystem.current().isMacOsX()) {
- eclipseDropinsDir = jalviewjs_eclipse_root+"/Contents/Eclipse/dropins"
- eclipsePluginsDir = jalviewjs_eclipse_root+"/Contents/Eclipse/plugins"
- eclipseBinary = jalviewjs_eclipse_root+"/Contents/MacOS/eclipse"
- } else if (OperatingSystem.current().isWindows()) { // check this!
- eclipseDropinsDir = jalviewjs_eclipse_root+"/dropins"
- eclipsePluginsDir = jalviewjs_eclipse_root+"/plugins"
- eclipseBinary = jalviewjs_eclipse_root+"/eclipse"
+ eclipseRoot += "/Eclipse.app"
+ eclipseDropinsDir = eclipseRoot+"/Contents/Eclipse/dropins"
+ eclipsePluginsDir = eclipseRoot+"/Contents/Eclipse/plugins"
+ eclipseBinary = eclipseRoot+"/Contents/MacOS/eclipse"
+ } else if (OperatingSystem.current().isWindows()) { // check these paths!!
+ eclipseDropinsDir = eclipseRoot+"/dropins"
+ eclipsePluginsDir = eclipseRoot+"/plugins"
+ eclipseBinary = eclipseRoot+"/eclipse"
} else { // linux or unix
- eclipseDropinsDir = jalviewjs_eclipse_root+"/dropins"
- eclipsePluginsDir = jalviewjs_eclipse_root+"/plugins"
- eclipseBinary = jalviewjs_eclipse_root+"/eclipse"
+ eclipseDropinsDir = eclipseRoot+"/dropins"
+ eclipsePluginsDir = eclipseRoot+"/plugins"
+ eclipseBinary = eclipseRoot+"/eclipse"
}
+ println("ECLIPSE ROOT: "+eclipseRoot)
}
task jalviewjsEclipseCopyDropins (type: Copy) {
executable(eclipseBinary)
args(["-nosplash", "--launcher.suppressErrors", "-application", "com.seeq.eclipse.importprojects.headlessimport", "-data", tempEclipseWorkspace.getPath(), "-import", jalviewDirAbsolutePath])
- def tempdir = tempEclipseWorkspace.getPath()+"/.metadata/.plugins/org.eclipse.core.resources/.projects/jalview"
- outputs.dir(tempdir)
+ def projdir = tempEclipseWorkspace.getPath()+"/.metadata/.plugins/org.eclipse.core.resources/.projects/jalview/org.eclipse.jdt.core/"
+ inputs.file(jalviewDir+"/.project")
+ outputs.dir(projdir)
}
task jalviewjsTranspile(type: Exec) {
dev = false
-#jalviewjs_eclipse_root = /Users/bsoares/buildtools/eclipse/eclipse-jee-2019-06/Eclipse.app
-jalviewjs_eclipse_root = /home/bsoares/buildtools/eclipse/eclipse-jee-2019-06
+jalviewjs_eclipse_root = ~/buildtools/eclipse/eclipse-jee-2019-06
jalviewjs_utils_dir = utils/jalviewjs
jalviewjs_eclipse_plugins_dir = eclipse/plugins
n = RegOpt.opt(n, ignoreCase, dontMinQ);
}
n.setParent(this);
- set(Character.valueOf(o.c), n, ignoreCase, dontMinQ);
+ set(new Character(o.c), n, ignoreCase, dontMinQ);
if (ignoreCase)
{
if (o.c != o.altc)
{
- set(Character.valueOf(o.altc), n, ignoreCase, dontMinQ);
+ set(new Character(o.altc), n, ignoreCase, dontMinQ);
}
if (o.c != o.altc2 && o.altc != o.altc2)
{
- set(Character.valueOf(o.altc2), n, ignoreCase, dontMinQ);
+ set(new Character(o.altc2), n, ignoreCase, dontMinQ);
}
}
}
{
return -1;
}
- Pattern n = (Pattern) h.get(Character.valueOf(pt.src.charAt(pos)));
+ Pattern n = (Pattern) h.get(new Character(pt.src.charAt(pos)));
if (n == null)
{
return -1;
import com.stevesoft.pat.wrap.StringWrap;
+
/** Matches a Unicode punctuation character. */
class UnicodePunct extends UniValidator
{
*/
public class Regex extends RegRes implements FilenameFilter
{
+
/**
* BackRefOffset gives the identity number of the first pattern. Version 1.0
* used zero, version 1.1 uses 1 to be more compatible with perl.
{
try
{
- return getClass().getDeclaredConstructor().newInstance();
+ return getClass().newInstance();
} catch (InstantiationException ie)
{
return null;
} catch (IllegalAccessException iae)
{
return null;
- } catch (ReflectiveOperationException roe)
- {
- return null;
}
}
*
* @deprecated
*/
- @Deprecated
public int getMaxLines()
{
return max_lines;
*
* @deprecated
*/
- @Deprecated
public void setMaxLines(int ml)
{
max_lines = ml;
*
* @deprecated
*/
- @Deprecated
public char getEOLchar()
{
return EOLchar;
*
* @deprecated
*/
- @Deprecated
public void setEOLchar(char c)
{
EOLchar = c;
if (r.searchFrom(toParse, pos))
{
v.addElement(r.left().substring(pos));
- vi.addElement(Integer.valueOf(r.matchFrom() + r.charsMatched()));
+ vi.addElement(new Integer(r.matchFrom() + r.charsMatched()));
for (int i = 0; i < r.numSubs(); i++)
{
if (r.substring() != null)
{
v.addElement(r.substring(i + offset));
- vi.addElement(Integer.valueOf(r.matchFrom(i + offset)
+ vi.addElement(new Integer(r.matchFrom(i + offset)
+ r.charsMatched(i + offset)));
}
}
float[] rgbValues = new float[4];
for (int i = 0; i < rgbStrings.length; i++)
{
- Float f = Float.valueOf(rgbStrings[i]);
+ Float f = new Float(rgbStrings[i]);
rgbValues[i] = f.floatValue();
}
if (rgbStrings.length == 4)
*/
public static Integer makeModelKey(int model, int subModel)
{
- return Integer.valueOf(model * MAX_SUB_MODELS + subModel);
+ return new Integer(model * MAX_SUB_MODELS + subModel);
}
// invoked by the getResdiue (parseConnectivityReplies in
*/
public ChimeraResidue getResidue(String index)
{
- // Integer index = Integer.valueOf(residueIndex);
+ // Integer index = new Integer(residueIndex);
if (residueMap.containsKey(index))
return residueMap.get(index);
return null;
for (String chimObjName : names)
{
// get or open the corresponding models if they already exist
- List<ChimeraModel> currentModels = chimeraManager
- .getChimeraModels(chimObjName, type);
+ List<ChimeraModel> currentModels = chimeraManager.getChimeraModels(
+ chimObjName, type);
if (currentModels.size() == 0)
{
// open and return models
// Get the corresponding "real" model
if (chimeraManager.hasChimeraModel(modelNumber, subModelNumber))
{
- ChimeraModel dataModel = chimeraManager
- .getChimeraModel(modelNumber, subModelNumber);
- if (dataModel.getResidueCount() == selectedModel.getResidueCount()
- || dataModel
- .getModelType() == StructureManager.ModelType.SMILES)
+ ChimeraModel dataModel = chimeraManager.getChimeraModel(
+ modelNumber, subModelNumber);
+ if (dataModel.getResidueCount() == selectedModel
+ .getResidueCount()
+ || dataModel.getModelType() == StructureManager.ModelType.SMILES)
{
// Select the entire model
addChimSelection(dataModel);
{
for (ChimeraChain selectedChain : selectedModel.getChains())
{
- ChimeraChain dataChain = dataModel
- .getChain(selectedChain.getChainId());
+ ChimeraChain dataChain = dataModel.getChain(selectedChain
+ .getChainId());
if (selectedChain.getResidueCount() == dataChain
.getResidueCount())
{
pathList.add("/usr/local/chimera/bin/chimera");
pathList.add("/usr/local/bin/chimera");
pathList.add("/usr/bin/chimera");
- pathList.add(System.getProperty("user.home") + "/opt/bin/chimera");
}
else if (os.startsWith("Windows"))
{
private java.util.Vector cachedDeserFactories = new java.util.Vector();
- static org.apache.axis.description.OperationDesc[] _operations;
+ private static org.apache.axis.description.OperationDesc[] _operations;
static
{
}
}
+ @Override
public java.lang.String predict(vamsas.objects.simple.Sequence seq)
throws java.rmi.RemoteException
{
}
}
+ @Override
public java.lang.String predictOnMsa(
vamsas.objects.simple.Msfalignment msf)
throws java.rmi.RemoteException
}
}
+ @Override
public vamsas.objects.simple.Secstructpred getpredict(
java.lang.String job_id) throws java.rmi.RemoteException
{
}
}
+ @Override
public vamsas.objects.simple.JpredResult getresult(java.lang.String job_id)
throws java.rmi.RemoteException
{
public class MuscleWSSoapBindingStub extends org.apache.axis.client.Stub
implements ext.vamsas.MuscleWS
{
- static org.apache.axis.description.OperationDesc[] _operations;
+ private static final org.apache.axis.description.OperationDesc[] _operations;
static
{
}
}
+ @Override
public vamsas.objects.simple.WsJobId align(
vamsas.objects.simple.SequenceSet seqSet)
throws java.rmi.RemoteException
}
}
+ @Override
public vamsas.objects.simple.Alignment getalign(java.lang.String job_id)
throws java.rmi.RemoteException
{
}
}
+ @Override
public vamsas.objects.simple.MsaResult getResult(java.lang.String job_id)
throws java.rmi.RemoteException
{
}
}
+ @Override
public vamsas.objects.simple.WsJobId cancel(java.lang.String jobId)
throws java.rmi.RemoteException
{
private java.util.Vector cachedDeserFactories = new java.util.Vector();
- static org.apache.axis.description.OperationDesc[] _operations;
+ private static org.apache.axis.description.OperationDesc[] _operations;
static
{
}
}
+ @Override
public ext.vamsas.ServiceHandles getServices()
throws java.rmi.RemoteException
{
private java.util.Vector cachedDeserFactories = new java.util.Vector();
- static org.apache.axis.description.OperationDesc[] _operations;
+ private static final org.apache.axis.description.OperationDesc[] _operations;
static
{
}
}
+ @Override
public java.lang.String getDatabase() throws java.rmi.RemoteException
{
if (super.cachedEndpoint == null)
}
}
+ @Override
public vamsas.objects.simple.SeqSearchResult getResult(
java.lang.String job_id) throws java.rmi.RemoteException
{
}
}
+ @Override
public vamsas.objects.simple.WsJobId psearch(
vamsas.objects.simple.Alignment al, java.lang.String database)
throws java.rmi.RemoteException
}
}
+ @Override
public vamsas.objects.simple.WsJobId search(
vamsas.objects.simple.Sequence s, java.lang.String database)
throws java.rmi.RemoteException
}
}
+ @Override
public vamsas.objects.simple.WsJobId cancel(java.lang.String jobId)
throws java.rmi.RemoteException
{
private java.lang.Object __equalsCalc = null;
+ @Override
public synchronized boolean equals(java.lang.Object obj)
{
if (obj == null)
private boolean __hashCodeCalc = false;
+ @Override
public synchronized int hashCode()
{
if (__hashCodeCalc)
}
// Type metadata
- private static org.apache.axis.description.TypeDesc typeDesc = new org.apache.axis.description.TypeDesc(
+ private static final org.apache.axis.description.TypeDesc typeDesc = new org.apache.axis.description.TypeDesc(
ServiceHandle.class, true);
static
--- /dev/null
+/*
+BSD 3-Clause License
+
+Copyright (c) 2018, Mungo Carstairs
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+* Neither the name of the copyright holder nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+package intervalstore.api;
+
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
+public interface IntervalI
+{
+
+ /**
+ * Compare intervals by start position ascending and end position descending.
+ */
+ static Comparator<? super IntervalI> COMPARATOR_BIGENDIAN = new Comparator<IntervalI>()
+ {
+ @Override
+ public int compare(IntervalI o1, IntervalI o2)
+ {
+ int ret = Integer.signum(o1.getBegin() - o2.getBegin());
+ return (ret == 0 ? Integer.signum(o2.getEnd() - o1.getEnd()) : ret);
+ }
+ };
+
+ /**
+ * Compare intervals by start position ascending and end position ascending.
+ */
+ static Comparator<? super IntervalI> COMPARATOR_LITTLEENDIAN = new Comparator<IntervalI>()
+ {
+ @Override
+ public int compare(IntervalI o1, IntervalI o2)
+ {
+ int ret = Integer.signum(o1.getBegin() - o2.getBegin());
+ return (ret == 0 ? Integer.signum(o1.getEnd() - o2.getEnd()) : ret);
+ }
+ };
+
+ /**
+ * a comparator for sorting intervals by start position ascending
+ */
+ static Comparator<? super IntervalI> FORWARD_STRAND = new Comparator<IntervalI>()
+ {
+ @Override
+ public int compare(IntervalI o1, IntervalI o2)
+ {
+ return Integer.signum(o1.getBegin() - o2.getBegin());
+ }
+ };
+
+ /**
+ * a comparator for sorting intervals by end position descending
+ */
+ static Comparator<? super IntervalI> REVERSE_STRAND = new Comparator<IntervalI>()
+ {
+ @Override
+ public int compare(IntervalI o1, IntervalI o2)
+ {
+ return Integer.signum(o2.getEnd() - o1.getEnd());
+ }
+ };
+
+ static int NOT_CONTAINED = Integer.MIN_VALUE;
+ static int CONTAINMENT_UNKNOWN = 0;
+
+ int getBegin();
+ int getEnd();
+
+ /**
+ * Answers true if this interval contains (or matches) the given interval
+ * based solely on start and end.
+ *
+ * @param i
+ * @return
+ */
+ default boolean containsInterval(IntervalI i)
+ {
+ return i != null && i.getBegin() >= getBegin()
+ && i.getEnd() <= getEnd();
+ }
+
+
+ /**
+ * Answers true if this interval properly contains the given interval, that
+ * is, it contains it and is larger than it
+ *
+ * @param i
+ * @return
+ */
+ default boolean properlyContainsInterval(IntervalI i)
+ {
+ return containsInterval(i)
+ && (i.getBegin() > getBegin() || i.getEnd() < getEnd());
+ }
+
+ /**
+ * Slower than equalsInterval; also includes type.
+ *
+ * Ensure that subclasses override equals(Object). For example:
+ *
+ * public boolean equals(Object o) { return o != null && o instanceof XXX &&
+ * equalsInterval((XXX) i); }
+ *
+ *
+ * equalsInterval also must be overridden.
+ *
+ * public boolean equalsInterval(IntervalI i) {return ((SimpleFeature)i).start
+ * == start && ((SimpleFeature)i).end == end && ((SimpleFeature)i).description
+ * == this.description; }
+ *
+ *
+ * @param o
+ * @return true if equal, including a type check
+ */
+ @Override
+ abstract boolean equals(Object o);
+
+
+
+ /**
+ * Check that two intervals are equal, in terms of end points, descriptions,
+ * or any other distinguishing features.
+ *
+ * Used in IntervalStore in searches, since it is faster than equals(), as at
+ * that point we know that we have the correct type.
+ *
+ * @param i
+ * @return true if equal
+ */
+ abstract boolean equalsInterval(IntervalI i);
+
+ default boolean overlapsInterval(IntervalI i)
+ {
+ if (i == null)
+ {
+ return false;
+ }
+ if (i.getBegin() < getBegin())
+ {
+ return i.getEnd() >= getBegin();
+ }
+ if (i.getEnd() > getEnd())
+ {
+ return i.getBegin() <= getEnd();
+ }
+ return true; // i internal to this
+ }
+
+ /**
+ * Sorts the list by start position ascending (if forwardString==true), or by
+ * end position descending
+ *
+ * @param intervals
+ * @param forwardStrand
+ */
+ static void sortIntervals(List<? extends IntervalI> intervals,
+ final boolean forwardStrand)
+ {
+ Collections.sort(intervals,
+ forwardStrand ? FORWARD_STRAND : REVERSE_STRAND);
+ }
+
+
+}
--- /dev/null
+/*
+BSD 3-Clause License
+
+Copyright (c) 2018, Mungo Carstairs
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+* Neither the name of the copyright holder nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+package intervalstore.api;
+
+import java.util.Collection;
+import java.util.List;
+
+import intervalstore.impl.NCList;
+
+public interface IntervalStoreI<T extends IntervalI> extends Collection<T>
+{
+
+ /**
+ * Returns a (possibly empty) list of items whose extent overlaps the given
+ * range
+ *
+ * @param from
+ * start of overlap range (inclusive)
+ * @param to
+ * end of overlap range (inclusive)
+ * @return
+ */
+ List<T> findOverlaps(long from, long to);
+
+ /**
+ * Ensures that the IntervalStore is ready for findOverlap.
+ *
+ * @return true iff the data held satisfy the rules of construction of an
+ * IntervalStore.
+ *
+ */
+ boolean isValid();
+
+ /**
+ * Answers the level of nesting of intervals in the store, as
+ * <ul>
+ * <li>0 if the store is empty</li>
+ * <li>1 if all intervals are 'top level' (non nested)</li>
+ * <li>else 1 plus the depth of the enclosed NCList</li>
+ * </ul>
+ *
+ * @return
+ * @see NCList#getDepth()
+ */
+ int getDepth();
+
+ /**
+ * Return the number of top-level (not-contained) intervals.
+ *
+ * @return
+ */
+ int getWidth();
+
+ List<T> findOverlaps(long start, long end, List<T> result);
+
+ String prettyPrint();
+
+ /**
+ * Resort and rebuild links.
+ *
+ * @return
+ */
+ boolean revalidate();
+
+ IntervalI get(int i);
+
+}
\ No newline at end of file
--- /dev/null
+/*
+BSD 3-Clause License
+
+Copyright (c) 2018, Mungo Carstairs
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+* Neither the name of the copyright holder nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+package intervalstore.impl;
+
+import java.util.List;
+import java.util.function.Function;
+
+/**
+ * Provides a method to perform binary search of an ordered list for the first
+ * entry that satisfies a supplied condition
+ *
+ * @author gmcarstairs
+ */
+public final class BinarySearcher
+{
+ private BinarySearcher()
+ {
+ }
+
+ /**
+ * Performs a binary search of the list to find the index of the first entry
+ * for which the test returns true. Answers the length of the list if there is
+ * no such entry.
+ * <p>
+ * For correct behaviour, the provided list must be ordered consistent with
+ * the test, that is, any entries returning false must precede any entries
+ * returning true. Note that this means that this method is <em>not</em>
+ * usable to search for equality (to find a specific entry), as all unequal
+ * entries will answer false to the test. To do that, use
+ * <code>Collections.binarySearch</code> instead.
+ *
+ * @param list
+ * @param test
+ * @return
+ * @see java.util.Collections#binarySearch(List, Object)
+ */
+ public static <T> int findFirst(List<? extends T> list,
+ Function<T, Boolean> test)
+ {
+ int start = 0;
+ int end = list.size() - 1;
+ int matched = list.size();
+
+ while (start <= end)
+ {
+ int mid = (start + end) / 2;
+ T entry = list.get(mid);
+ boolean itsTrue = test.apply(entry);
+ if (itsTrue)
+ {
+ matched = mid;
+ end = mid - 1;
+ }
+ else
+ {
+ start = mid + 1;
+ }
+ }
+
+ return matched;
+ }
+}
--- /dev/null
+/*
+BSD 3-Clause License
+
+Copyright (c) 2018, Mungo Carstairs
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+* Neither the name of the copyright holder nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+package intervalstore.impl;
+
+import java.util.AbstractCollection;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.NoSuchElementException;
+
+import intervalstore.api.IntervalI;
+import intervalstore.api.IntervalStoreI;
+
+/**
+ * A collection class to store interval-associated data, with O(log N)
+ * performance for overlap queries, insertion and deletion (where N is the size
+ * of the store). Accepts duplicate entries but not null values.
+ *
+ * @author gmcarstairs
+ *
+ * @param <T>
+ * any type providing <code>getBegin()</code> and <code>getEnd()</code>
+ */
+public class IntervalStore<T extends IntervalI>
+ extends AbstractCollection<T> implements IntervalStoreI<T>
+{
+ /**
+ * An iterator over the intervals held in this store, with no particular
+ * ordering guaranteed. The iterator does not support the optional
+ * <code>remove</code> operation (throws
+ * <code>UnsupportedOperationException</code> if attempted).
+ *
+ * @author gmcarstairs
+ *
+ * @param <V>
+ */
+ private class IntervalIterator<V extends IntervalI> implements Iterator<V>
+ {
+ /*
+ * iterator over top level non-nested intervals
+ */
+ Iterator<? extends IntervalI> topLevelIterator;
+
+ /*
+ * iterator over NCList (if any)
+ */
+ Iterator<? extends IntervalI> nestedIterator;
+
+ /**
+ * Constructor initialises iterators over the top level list and any nested
+ * NCList
+ *
+ * @param intervalStore
+ */
+ public IntervalIterator(
+ IntervalStore<? extends IntervalI> intervalStore)
+ {
+ topLevelIterator = nonNested.iterator();
+ if (nested != null)
+ {
+ nestedIterator = nested.iterator();
+ }
+ }
+
+ @Override
+ public boolean hasNext()
+ {
+ return topLevelIterator.hasNext() ? true
+ : (nestedIterator != null && nestedIterator.hasNext());
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public V next()
+ {
+ if (topLevelIterator.hasNext())
+ {
+ return (V) topLevelIterator.next();
+ }
+ if (nestedIterator != null)
+ {
+ return (V) nestedIterator.next();
+ }
+ throw new NoSuchElementException();
+ }
+
+ }
+
+ private List<T> nonNested;
+
+ private NCList<T> nested;
+
+ /**
+ * Constructor
+ */
+ public IntervalStore()
+ {
+ nonNested = new ArrayList<>();
+ }
+
+ /**
+ * Constructor given a list of intervals. Note that the list may get sorted as
+ * a side-effect of calling this constructor.
+ */
+ public IntervalStore(List<T> intervals)
+ {
+ this();
+
+ /*
+ * partition into subranges whose root intervals
+ * have no mutual containment (if no intervals are nested,
+ * each subrange is of length 1 i.e. a single interval)
+ */
+ List<IntervalI> sublists = new NCListBuilder<T>()
+ .partitionNestedSublists(intervals);
+
+ /*
+ * add all 'subrange root intervals' (and any co-located intervals)
+ * to our top level list of 'non-nested' intervals;
+ * put aside any left over for our NCList
+ */
+ List<T> nested = new ArrayList<>();
+
+ for (IntervalI subrange : sublists)
+ {
+ int listIndex = subrange.getBegin();
+ IntervalI root = intervals.get(listIndex);
+ while (listIndex <= subrange.getEnd())
+ {
+ T t = intervals.get(listIndex);
+ if (root.equalsInterval(t))
+ {
+ nonNested.add(t);
+ }
+ else
+ {
+ nested.add(t);
+ }
+ listIndex++;
+ }
+ }
+
+ if (!nested.isEmpty())
+ {
+ this.nested = new NCList<>(nested);
+ }
+ }
+
+ /**
+ * Adds one interval to the store.
+ *
+ * @param interval
+ */
+ @Override
+ public boolean add(T interval)
+ {
+ if (interval == null)
+ {
+ return false;
+ }
+ if (!addNonNestedInterval(interval))
+ {
+ /*
+ * detected a nested interval - put it in the NCList structure
+ */
+ addNestedInterval(interval);
+ }
+ return true;
+ }
+
+ @Override
+ public boolean contains(Object entry)
+ {
+ if (listContains(nonNested, entry))
+ {
+ return true;
+ }
+
+ return nested == null ? false : nested.contains(entry);
+ }
+
+ protected boolean addNonNestedInterval(T entry)
+ {
+ synchronized (nonNested)
+ {
+ /*
+ * find the first stored interval which doesn't precede the new one
+ */
+ int insertPosition = BinarySearcher.findFirst(nonNested,
+ val -> val.getBegin() >= entry.getBegin());
+ /*
+ * fail if we detect interval enclosure
+ * - of the new interval by the one before or after it
+ * - of the next interval by the new one
+ */
+ if (insertPosition > 0)
+ {
+ if (nonNested.get(insertPosition - 1).properlyContainsInterval(entry))
+ {
+ return false;
+ }
+ }
+ if (insertPosition < nonNested.size())
+ {
+ T following = nonNested.get(insertPosition);
+ if (entry.properlyContainsInterval(following)
+ || following.properlyContainsInterval(entry))
+ {
+ return false;
+ }
+ }
+
+ /*
+ * checks passed - add the interval
+ */
+ nonNested.add(insertPosition, entry);
+
+ return true;
+ }
+ }
+
+ @Override
+ public List<T> findOverlaps(long from, long to)
+ {
+ List<T> result = new ArrayList<>();
+
+ findNonNestedOverlaps(from, to, result);
+
+ if (nested != null)
+ {
+ result.addAll(nested.findOverlaps(from, to));
+ }
+
+ return result;
+ }
+
+ @Override
+ public String prettyPrint()
+ {
+ String pp = nonNested.toString();
+ if (nested != null)
+ {
+ pp += System.lineSeparator() + nested.prettyPrint();
+ }
+ return pp;
+ }
+
+ @Override
+ public boolean isValid()
+ {
+ for (int i = 0; i < nonNested.size() - 1; i++)
+ {
+ IntervalI i1 = nonNested.get(i);
+ IntervalI i2 = nonNested.get(i + 1);
+
+ if (i2.getBegin() < i1.getBegin())
+ {
+ System.err.println("nonNested wrong start order : " + i1.toString()
+ + ", " + i2.toString());
+ return false;
+ }
+ if (i1.properlyContainsInterval(i2)
+ || i2.properlyContainsInterval(i1))
+ {
+ System.err.println("nonNested invalid containment!: "
+ + i1.toString()
+ + ", " + i2.toString());
+ return false;
+ }
+ }
+ return nested == null ? true : nested.isValid();
+ }
+
+ @Override
+ public int size()
+ {
+ int i = nonNested.size();
+ if (nested != null)
+ {
+ i += nested.size();
+ }
+ return i;
+ }
+
+ @Override
+ public synchronized boolean remove(Object o)
+ {
+ if (o == null)
+ {
+ return false;
+ }
+ try
+ {
+ @SuppressWarnings("unchecked")
+ T entry = (T) o;
+
+ /*
+ * try the non-nested positional intervals first
+ */
+ boolean removed = removeNonNested(entry);
+
+ /*
+ * if not found, try nested intervals
+ */
+ if (!removed && nested != null)
+ {
+ removed = nested.remove(entry);
+ }
+
+ return removed;
+ } catch (ClassCastException e)
+ {
+ return false;
+ }
+ }
+
+ /**
+ * Removes the given entry from the list of non-nested entries, returning true
+ * if found and removed, or false if not found. Specifically, removes the
+ * first item in the list for which <code>item.equals(entry)</code>.
+ *
+ * @param entry
+ * @return
+ */
+ protected boolean removeNonNested(T entry)
+ {
+ /*
+ * find the first interval that might match, i.e. whose
+ * start position is not less than the target range start
+ * (NB inequality test ensures the first match if any is found)
+ */
+ int startIndex = BinarySearcher.findFirst(nonNested,
+ val -> val.getBegin() >= entry.getBegin());
+
+ /*
+ * traverse intervals to look for a match
+ */
+ int from = entry.getBegin();
+ int i = startIndex;
+ int size = nonNested.size();
+ while (i < size)
+ {
+ T sf = nonNested.get(i);
+ if (sf.getBegin() > from)
+ {
+ break;
+ }
+ if (sf.equals(entry))
+ {
+ nonNested.remove(i);
+ return true;
+ }
+ i++;
+ }
+ return false;
+ }
+
+ @Override
+ public int getDepth()
+ {
+ if (size() == 0)
+ {
+ return 0;
+ }
+ return (nonNested.isEmpty() ? 0 : 1)
+ + (nested == null ? 0 : nested.getDepth());
+ }
+
+ /**
+ * Adds one interval to the NCList that can manage nested intervals (creating
+ * the NCList if necessary)
+ */
+ protected synchronized void addNestedInterval(T interval)
+ {
+ if (nested == null)
+ {
+ nested = new NCList<>();
+ }
+ nested.add(interval);
+ }
+
+ /**
+ * Answers true if the list contains the interval, else false. This method is
+ * optimised for the condition that the list is sorted on interval start
+ * position ascending, and will give unreliable results if this does not hold.
+ *
+ * @param intervals
+ * @param entry
+ * @return
+ */
+ protected boolean listContains(List<T> intervals, Object entry)
+ {
+ if (intervals == null || entry == null || !(entry instanceof IntervalI))
+ {
+ return false;
+ }
+
+ IntervalI interval = (IntervalI) entry;
+
+ /*
+ * locate the first entry in the list which does not precede the interval
+ */
+ int pos = BinarySearcher.findFirst(intervals,
+ val -> val.getBegin() >= interval.getBegin());
+ int len = intervals.size();
+ while (pos < len)
+ {
+ T sf = intervals.get(pos);
+ if (sf.getBegin() > interval.getBegin())
+ {
+ return false; // no match found
+ }
+ if (sf.equals(interval))
+ {
+ return true;
+ }
+ pos++;
+ }
+ return false;
+ }
+
+ /**
+ * Answers an iterator over the intervals in the store, with no particular
+ * ordering guaranteed. The iterator does not support the optional
+ * <code>remove</code> operation (throws
+ * <code>UnsupportedOperationException</code> if attempted).
+ */
+ @Override
+ public Iterator<T> iterator()
+ {
+ return new IntervalIterator<>(this);
+ }
+
+ @Override
+ public void clear()
+ {
+ this.nonNested.clear();
+ this.nested = new NCList<>();
+ }
+
+ /**
+ * Adds non-nested intervals to the result list that lie within the target
+ * range
+ *
+ * @param from
+ * @param to
+ * @param result
+ */
+ protected void findNonNestedOverlaps(long from, long to,
+ List<T> result)
+ {
+ /*
+ * find the first interval whose end position is
+ * after the target range start
+ */
+ int startIndex = BinarySearcher.findFirst(nonNested,
+ val -> val.getEnd() >= from);
+
+ final int startIndex1 = startIndex;
+ int i = startIndex1;
+ while (i < nonNested.size())
+ {
+ T sf = nonNested.get(i);
+ if (sf.getBegin() > to)
+ {
+ break;
+ }
+ if (sf.getBegin() <= to && sf.getEnd() >= from)
+ {
+ result.add(sf);
+ }
+ i++;
+ }
+ }
+
+ @Override
+ public String toString()
+ {
+ String s = nonNested.toString();
+ if (nested != null)
+ {
+ s = s + System.lineSeparator() + nested.toString();
+ }
+ return s;
+ }
+
+ @Override
+ public int getWidth()
+ {
+ // TODO Auto-generated method stub
+ return 0;
+ }
+
+ @Override
+ public List<T> findOverlaps(long start, long end, List<T> result)
+ {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public boolean revalidate()
+ {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ @Override
+ public IntervalI get(int i)
+ {
+ // TODO Auto-generated method stub
+ return null;
+ }
+}
--- /dev/null
+/*
+BSD 3-Clause License
+
+Copyright (c) 2018, Mungo Carstairs
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+* Neither the name of the copyright holder nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+package intervalstore.impl;
+
+import java.util.AbstractCollection;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import java.util.NoSuchElementException;
+
+import intervalstore.api.IntervalI;
+import intervalstore.impl.Range;
+
+/**
+ * An adapted implementation of NCList as described in the paper
+ *
+ * <pre>
+ * Nested Containment List (NCList): a new algorithm for accelerating
+ * interval query of genome alignment and interval databases
+ * - Alexander V. Alekseyenko, Christopher J. Lee
+ * https://doi.org/10.1093/bioinformatics/btl647
+ * </pre>
+ */
+public class NCList<T extends IntervalI> extends AbstractCollection<T>
+{
+ /**
+ * A depth-first iterator over the elements stored in the NCList
+ */
+ private class NCListIterator implements Iterator<T>
+ {
+ int subrangeIndex;
+
+ Iterator<T> nodeIterator;
+
+ /**
+ * Constructor bootstraps a pointer to an iterator over the first subrange
+ * (if any)
+ */
+ NCListIterator()
+ {
+ subrangeIndex = nextSubrange(-1);
+ }
+
+ /**
+ * Moves the subrange iterator to the next subrange, and answers its index
+ * in the list of subranges. If there are no more, sets the iterator to null
+ * and answers -1.
+ *
+ * @return
+ */
+ private int nextSubrange(int after)
+ {
+ int nextIndex = after + 1;
+ if (nextIndex < subranges.size())
+ {
+ nodeIterator = subranges.get(nextIndex).iterator();
+ return nextIndex;
+ }
+ nodeIterator = null;
+ return -1;
+ }
+
+ @Override
+ public boolean hasNext()
+ {
+ return nodeIterator != null && nodeIterator.hasNext();
+ }
+
+ /**
+ * Answers the next element returned by the current NCNode's iterator, and
+ * advances the iterator (to the next NCNode if necessary)
+ */
+ @Override
+ public T next()
+ {
+ if (nodeIterator == null || !nodeIterator.hasNext())
+ {
+ throw new NoSuchElementException();
+ }
+ T result = nodeIterator.next();
+
+ if (!nodeIterator.hasNext())
+ {
+ subrangeIndex = nextSubrange(subrangeIndex);
+ }
+ return result;
+ }
+
+ }
+
+ /*
+ * the number of interval instances represented
+ */
+ private int size;
+
+ /*
+ * a list, in start position order, of sublists of ranges ordered so
+ * that each contains (or is the same as) the one that follows it
+ */
+ private List<NCNode<T>> subranges;
+
+ /**
+ * Constructor given a list of things that are each located on a contiguous
+ * interval. Note that the constructor may reorder the list.
+ * <p>
+ * We assume here that for each range, start <= end. Behaviour for reverse
+ * ordered ranges is undefined.
+ *
+ * @param ranges
+ */
+ public NCList(List<T> ranges)
+ {
+ this();
+ build(ranges);
+ }
+
+ /**
+ * Sorts and groups ranges into sublists where each sublist represents an
+ * interval and its contained subintervals
+ *
+ * @param ranges
+ */
+ protected void build(List<T> ranges)
+ {
+ /*
+ * sort and partition into subranges
+ * which have no mutual containment
+ */
+ List<IntervalI> sublists = partitionNestedSublists(ranges);
+
+ /*
+ * convert each subrange to an NCNode consisting of a range and
+ * (possibly) its contained NCList
+ */
+ for (IntervalI sublist : sublists)
+ {
+ subranges.add(new NCNode<>(
+ ranges.subList(sublist.getBegin(), sublist.getEnd() + 1)));
+ }
+
+ size = ranges.size();
+ }
+
+ /**
+ * Default constructor
+ */
+ public NCList()
+ {
+ subranges = new ArrayList<>();
+ }
+
+ /**
+ * Sorts and traverses the ranges to identify sublists, whose start intervals
+ * are overlapping or disjoint but not mutually contained. Answers a list of
+ * start-end indices of the sorted list of ranges.
+ *
+ * @param ranges
+ * @return
+ */
+ protected List<IntervalI> partitionNestedSublists(List<T> ranges)
+ {
+ List<IntervalI> sublists = new ArrayList<>();
+
+ if (ranges.isEmpty())
+ {
+ return sublists;
+ }
+
+ /*
+ * sort by start ascending, length descending, so that
+ * contained intervals follow their containing interval
+ */
+ Collections.sort(ranges, new NCListBuilder<>().getComparator());
+
+ int listStartIndex = 0;
+
+ IntervalI lastParent = ranges.get(0);
+ boolean first = true;
+
+ for (int i = 0; i < ranges.size(); i++)
+ {
+ IntervalI nextInterval = ranges.get(i);
+ if (!first && !lastParent.properlyContainsInterval(nextInterval))
+ {
+ /*
+ * this interval is not properly contained in the parent;
+ * close off the last sublist
+ */
+ sublists.add(new Range(listStartIndex, i - 1));
+ listStartIndex = i;
+ lastParent = nextInterval;
+ }
+ first = false;
+ }
+
+ sublists.add(new Range(listStartIndex, ranges.size() - 1));
+ return sublists;
+ }
+
+ /**
+ * Adds one entry to the stored set
+ *
+ * @param entry
+ */
+ @Override
+ public synchronized boolean add(final T entry)
+ {
+ final NCNode<T> newNode = new NCNode<>(entry);
+ addNode(newNode);
+ return true;
+ }
+
+ /**
+ * Adds one NCNode to this NCList
+ * <p>
+ * This method does not update the <code>size</code> (interval count) of this
+ * NCList, as it may be used to rearrange nodes without changing their count.
+ * Callers should increment the count if needed.
+ *
+ * @param newNode
+ */
+ protected void addNode(final NCNode<T> newNode)
+ {
+ final long start = newNode.getBegin();
+ final long end = newNode.getEnd();
+ size += newNode.size();
+
+ /*
+ * cases:
+ * 1) precedes all subranges - add as NCNode on front of list
+ * 2) follows all subranges - add as NCNode on end of list
+ * 3) matches a subrange - add as a sibling in the list
+ * 4) properly enclosed by a subrange - add recursively to subrange
+ * 5) properly encloses one or more subranges - push them inside it
+ * 6) spans two subranges - insert between them
+ */
+
+ /*
+ * find the first subrange whose end does not precede entry's start
+ */
+ int candidateIndex = findFirstOverlap(start);
+
+ /*
+ * search for maximal span of subranges i-k that the new entry
+ * encloses; or a subrange that encloses the new entry
+ */
+ boolean enclosing = false;
+ int firstEnclosed = 0;
+ int lastEnclosed = 0;
+
+ for (int j = candidateIndex; j < subranges.size(); j++)
+ {
+ NCNode<T> subrange = subranges.get(j);
+
+ if (subrange.equalsInterval(newNode))
+ {
+ /*
+ * matching interval - insert adjacent
+ */
+ subranges.add(j, newNode);
+ return;
+ }
+
+ if (end < subrange.getBegin() && !enclosing)
+ {
+ /*
+ * new entry lies between subranges j-1 j
+ */
+ subranges.add(j, newNode);
+ return;
+ }
+
+ if (subrange.properlyContainsInterval(newNode))
+ {
+ /*
+ * push new entry inside this subrange as it encloses it
+ */
+ subrange.addNode(newNode);
+ return;
+ }
+
+ if (start <= subrange.getBegin())
+ {
+ if (end >= subrange.getEnd())
+ {
+ /*
+ * new entry encloses this subrange (and possibly preceding ones);
+ * continue to find the maximal list it encloses
+ */
+ if (!enclosing)
+ {
+ firstEnclosed = j;
+ }
+ lastEnclosed = j;
+ enclosing = true;
+ continue;
+ }
+ else
+ {
+ /*
+ * entry spans from before this subrange to inside it
+ */
+ if (enclosing)
+ {
+ /*
+ * entry encloses one or more preceding subranges
+ */
+ push(newNode, firstEnclosed, lastEnclosed);
+ }
+ else
+ {
+ /*
+ * entry overlaps two subranges but doesn't enclose either
+ * so just add it
+ */
+ subranges.add(j, newNode);
+ }
+ return;
+ }
+ }
+ }
+
+ /*
+ * drops through to here if new range encloses all others
+ * or overlaps the last one
+ */
+ if (enclosing)
+ {
+ push(newNode, firstEnclosed, lastEnclosed);
+ }
+ else
+ {
+ subranges.add(newNode);
+ }
+ }
+
+ @Override
+ public boolean contains(Object entry)
+ {
+ if (!(entry instanceof IntervalI))
+ {
+ return false;
+ }
+ IntervalI interval = (IntervalI) entry;
+
+ /*
+ * find the first sublist that might overlap, i.e.
+ * the first whose end position is >= from
+ */
+ int candidateIndex = findFirstOverlap(interval.getBegin());
+
+ int to = interval.getEnd();
+
+ for (int i = candidateIndex; i < subranges.size(); i++)
+ {
+ NCNode<T> candidate = subranges.get(i);
+ if (candidate.getBegin() > to)
+ {
+ /*
+ * we are past the end of our target range
+ */
+ break;
+ }
+ if (candidate.contains(interval))
+ {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Update the tree so that the new node encloses current subranges i to j
+ * (inclusive). That is, replace subranges i-j (inclusive) with a new subrange
+ * that contains them.
+ *
+ * @param node
+ * @param i
+ * @param j
+ * @throws IllegalArgumentException
+ * if any of the subranges is not contained by the node's start-end
+ * range
+ */
+ protected synchronized void push(NCNode<T> node, final int i,
+ final int j)
+ {
+ for (int k = i; k <= j; k++)
+ {
+ NCNode<T> n = subranges.get(k);
+ if (!node.containsInterval(n)) {
+ throw new IllegalArgumentException("Can't push " + n.toString()
+ + " inside " + node.toString());
+ }
+ node.addNode(n);
+ }
+
+ for (int k = j; k >= i; k--)
+ {
+ subranges.remove(k);
+ }
+ subranges.add(i, node);
+ }
+
+ /**
+ * Answers a list of contained intervals that overlap the given range
+ *
+ * @param from
+ * @param to
+ * @return
+ */
+ public List<T> findOverlaps(long from, long to)
+ {
+ List<T> result = new ArrayList<>();
+
+ findOverlaps(from, to, result);
+
+ return result;
+ }
+
+ /**
+ * Recursively searches the NCList adding any items that overlap the from-to
+ * range to the result list
+ *
+ * @param from
+ * @param to
+ * @param result
+ */
+ protected void findOverlaps(long from, long to, List<T> result)
+ {
+ /*
+ * find the first sublist that might overlap, i.e.
+ * the first whose end position is >= from
+ */
+ int candidateIndex = findFirstOverlap(from);
+
+ for (int i = candidateIndex; i < subranges.size(); i++)
+ {
+ NCNode<T> candidate = subranges.get(i);
+ if (candidate.getBegin() > to)
+ {
+ /*
+ * we are past the end of our target range
+ */
+ break;
+ }
+ candidate.findOverlaps(from, to, result);
+ }
+
+ }
+
+ /**
+ * Search subranges for the first one whose end position is not before the
+ * target range's start position, i.e. the first one that may overlap the
+ * target range. Returns the index in the list of the first such range found,
+ * or the length of the list if none found.
+ *
+ * @param from
+ * @return
+ */
+ protected int findFirstOverlap(final long from)
+ {
+ return BinarySearcher.findFirst(subranges,
+ val -> val.getEnd() >= from);
+ }
+
+ /**
+ * Formats the tree as a bracketed list e.g.
+ *
+ * <pre>
+ * [1-100 [10-30 [10-20]], 15-30 [20-20]]
+ * </pre>
+ */
+ @Override
+ public String toString()
+ {
+ return subranges.toString();
+ }
+
+ /**
+ * Answers the NCList as an indented list
+ *
+ * @return
+ */
+ public String prettyPrint()
+ {
+ StringBuilder sb = new StringBuilder(512);
+ int offset = 0;
+ int indent = 2;
+ prettyPrint(sb, offset, indent);
+ sb.append(System.lineSeparator());
+ return sb.toString();
+ }
+
+ /**
+ * @param sb
+ * @param offset
+ * @param indent
+ */
+ void prettyPrint(StringBuilder sb, int offset, int indent)
+ {
+ boolean first = true;
+ for (NCNode<T> subrange : subranges)
+ {
+ if (!first)
+ {
+ sb.append(System.lineSeparator());
+ }
+ first = false;
+ subrange.prettyPrint(sb, offset, indent);
+ }
+ }
+
+ /**
+ * Answers true if the store's structure is valid (nesting containment rules
+ * are obeyed), else false. For use in testing and debugging.
+ *
+ * @return
+ */
+ public boolean isValid()
+ {
+ int count = 0;
+ for (NCNode<T> subrange : subranges)
+ {
+ count += subrange.size();
+ }
+ if (count != size)
+ {
+ return false;
+ }
+ return isValid(Integer.MIN_VALUE, Integer.MAX_VALUE);
+ }
+
+ /**
+ * Answers true if the data held satisfy the rules of construction of an
+ * NCList bounded within the given start-end range, else false.
+ * <p>
+ * Each subrange must lie within start-end (inclusive). Subranges must be
+ * ordered by start position ascending, and within that by end position
+ * descending.
+ * <p>
+ *
+ * @param start
+ * @param end
+ * @return
+ */
+ boolean isValid(final int start, final int end)
+ {
+ NCNode<T> lastRange = null;
+
+ for (NCNode<T> subrange : subranges)
+ {
+ if (subrange.getBegin() < start)
+ {
+ System.err.println("error in NCList: range " + subrange.toString()
+ + " starts before " + end);
+ return false;
+ }
+ if (subrange.getEnd() > end)
+ {
+ System.err.println("error in NCList: range " + subrange.toString()
+ + " ends after " + end);
+ return false;
+ }
+
+ if (lastRange != null)
+ {
+ if (subrange.getBegin() < lastRange.getBegin())
+ {
+ System.err.println("error in NCList: range " + subrange.toString()
+ + " starts before " + lastRange.toString());
+ return false;
+ }
+ if (subrange.properlyContainsInterval(lastRange))
+ {
+ System.err.println("error in NCList: range " + subrange.toString()
+ + " encloses preceding: " + lastRange.toString());
+ return false;
+ }
+ if (lastRange.properlyContainsInterval(subrange))
+ {
+ System.err.println("error in NCList: range " + subrange.toString()
+ + " enclosed by preceding: " + lastRange.toString());
+ return false;
+ }
+ }
+ lastRange = subrange;
+
+ if (!subrange.isValid())
+ {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * Answers the number of intervals stored
+ *
+ * @return
+ */
+ @Override
+ public int size()
+ {
+ return size;
+ }
+
+ /**
+ * Answers a list of all entries stored, in no guaranteed order. This method
+ * is not synchronized, so is not thread-safe.
+ */
+ public List<T> getEntries()
+ {
+ List<T> result = new ArrayList<>();
+ getEntries(result);
+ return result;
+ }
+
+ /**
+ * Adds all contained entries to the given list
+ *
+ * @param result
+ */
+ void getEntries(List<T> result)
+ {
+ for (NCNode<T> subrange : subranges)
+ {
+ subrange.getEntries(result);
+ }
+ }
+
+ /**
+ * Removes the first interval <code>I</code>found that is equal to T
+ * (<code>I.equals(T)</code>). Answers true if an interval is removed, false
+ * if no match is found. This method is synchronized so thread-safe.
+ *
+ * @param entry
+ * @return
+ */
+ public synchronized boolean remove(T entry)
+ {
+ if (entry == null)
+ {
+ return false;
+ }
+ int i = findFirstOverlap(entry.getBegin());
+
+ for (; i < subranges.size(); i++)
+ {
+ NCNode<T> subrange = subranges.get(i);
+ if (subrange.getBegin() > entry.getBegin())
+ {
+ /*
+ * not found
+ */
+ return false;
+ }
+ NCList<T> subRegions = subrange.getSubRegions();
+
+ if (subrange.getRegion().equals(entry))
+ {
+ /*
+ * if the subrange is rooted on this entry, remove it,
+ * and remove and promote its subregions (if any)
+ */
+ subranges.remove(i);
+ size -= subrange.size();
+ if (subRegions != null)
+ {
+ for (NCNode<T> r : subRegions.subranges)
+ {
+ addNode(r);
+ }
+ }
+ return true;
+ }
+ else
+ {
+ if (subrange.remove(entry))
+ {
+ size--;
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Answers the depth of interval nesting of this object, where 1 means there
+ * are no nested sub-intervals
+ *
+ * @return
+ */
+ public int getDepth()
+ {
+ int subDepth = 0;
+ for (NCNode<T> subrange : subranges)
+ {
+ subDepth = Math.max(subDepth, subrange.getDepth());
+ }
+
+ return subDepth;
+ }
+
+ /**
+ * Answers an iterator over the contained intervals, with no particular order
+ * guaranteed. The iterator does not support the optional <code>remove</code>
+ * operation (throws <code>UnsupportedOperationException</code> if attempted).
+ */
+ @Override
+ public Iterator<T> iterator()
+ {
+ return new NCListIterator();
+ }
+
+ @Override
+ public synchronized void clear()
+ {
+ subranges.clear();
+ size = 0;
+ }
+}
--- /dev/null
+/*
+BSD 3-Clause License
+
+Copyright (c) 2018, Mungo Carstairs
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+* Neither the name of the copyright holder nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+package intervalstore.impl;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
+import intervalstore.api.IntervalI;
+import intervalstore.impl.Range;
+
+/**
+ * A comparator that orders ranges by either start position ascending. If
+ * position matches, ordering is by length descending. This provides the
+ * canonical ordering of intervals into subranges in order to build a nested
+ * containment list.
+ *
+ * @author gmcarstairs
+ */
+public class NCListBuilder<T extends IntervalI>
+{
+ class NCListComparator<V extends IntervalI> implements Comparator<V>
+ {
+ /**
+ * Compares two intervals in a way that will sort a list by start position
+ * ascending, then by length descending. Answers
+ * <ul>
+ * <li>a negative value if o1.begin < o2.begin</li>
+ * <li>else a positive value if o1.begin > o2.begin</li>
+ * <li>else a negative value if o1.end > o2.end</li>
+ * <li>else a positive value of o1.end < o2.end</li>
+ * <li>else zero</li
+ * </ul>
+ */
+ @Override
+ public int compare(V o1, V o2)
+ {
+ int order = Integer.compare(o1.getBegin(), o2.getBegin());
+ if (order == 0)
+ {
+ /*
+ * if tied on start position, longer length sorts to left
+ * i.e. the negation of normal ordering by length
+ */
+ order = Integer.compare(o2.getEnd(), o1.getEnd());
+ }
+ return order;
+ }
+ }
+
+ private Comparator<T> comparator = new NCListComparator<>();
+
+ /**
+ * Default constructor
+ */
+ public NCListBuilder()
+ {
+ }
+
+ /**
+ * Answers a comparator which sorts items of type T by start position
+ * ascending, and within that by end position (length) descending)
+ *
+ * @return
+ */
+ Comparator<T> getComparator()
+ {
+ return comparator;
+ }
+
+ /**
+ * Sorts and traverses the ranges to identify sublists, whose start intervals
+ * are overlapping or disjoint but not mutually contained. Answers a list of
+ * start-end indices of the sorted list of ranges.
+ *
+ * @param ranges
+ * @return
+ */
+ List<IntervalI> partitionNestedSublists(List<T> ranges)
+ {
+ List<IntervalI> sublists = new ArrayList<>();
+
+ /*
+ * sort by start ascending, length descending, so that
+ * contained intervals follow their containing interval
+ */
+ Collections.sort(ranges, comparator);
+
+ int listStartIndex = 0;
+
+ IntervalI lastParent = ranges.get(0);
+ boolean first = true;
+
+ for (int i = 0; i < ranges.size(); i++)
+ {
+ IntervalI nextInterval = ranges.get(i);
+ if (!first && !lastParent.properlyContainsInterval(nextInterval))
+ {
+ /*
+ * this interval is not properly contained in the parent;
+ * close off the last sublist
+ */
+ sublists.add(new Range(listStartIndex, i - 1));
+ listStartIndex = i;
+ lastParent = nextInterval;
+ }
+ first = false;
+ }
+
+ sublists.add(new Range(listStartIndex, ranges.size() - 1));
+ return sublists;
+ }
+}
--- /dev/null
+/*
+BSD 3-Clause License
+
+Copyright (c) 2018, Mungo Carstairs
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+* Neither the name of the copyright holder nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+package intervalstore.impl;
+
+import java.util.Iterator;
+import java.util.List;
+import java.util.NoSuchElementException;
+
+import intervalstore.api.IntervalI;
+
+/**
+ * Each node of the NCList tree consists of a range, and (optionally) the NCList
+ * of ranges it encloses
+ *
+ * @param <T>
+ */
+class NCNode<T extends IntervalI> implements IntervalI
+{
+ /**
+ * A depth-first iterator over the intervals stored in the NCNode. The
+ * optional <code>remove</code> operation is not supported.
+ *
+ * @author gmcarstairs
+ *
+ */
+ private class NCNodeIterator implements Iterator<T>
+ {
+ boolean first = true;
+ Iterator<T> subregionIterator;
+
+ @Override
+ public boolean hasNext()
+ {
+ return first
+ || (subregionIterator != null && subregionIterator.hasNext());
+ }
+
+ /**
+ * Answers the next interval - initially the top level interval for this
+ * node, thereafter the intervals returned by the NCList's iterator
+ */
+ @Override
+ public T next()
+ {
+ if (first)
+ {
+ subregionIterator = subregions == null ? null
+ : subregions.iterator();
+ first = false;
+ return region;
+ }
+ if (subregionIterator == null || !subregionIterator.hasNext())
+ {
+ throw new NoSuchElementException();
+ }
+ return subregionIterator.next();
+ }
+ }
+
+ private T region;
+
+ /*
+ * null, or an object holding contained subregions of this nodes region
+ */
+ private NCList<T> subregions;
+
+ /**
+ * Constructor given a list of ranges. The list not be empty, and should be
+ * ordered so that the first range contains all the others. If not, behaviour
+ * will likely be invalid.
+ *
+ * @param ranges
+ * @throws IllegalArgumentException
+ * if the list is empty
+ */
+ NCNode(List<T> ranges)
+ {
+ if (ranges.isEmpty())
+ {
+ throw new IllegalArgumentException("List may not be empty");
+ }
+ region = ranges.get(0);
+
+ if (ranges.size() > 1)
+ {
+ subregions = new NCList<>(ranges.subList(1, ranges.size()));
+ }
+ }
+
+ /**
+ * Constructor given a single range
+ *
+ * @param range
+ */
+ NCNode(T range)
+ {
+ region = range;
+ }
+
+ @Override
+ public int getBegin()
+ {
+ return region.getBegin();
+ }
+
+ @Override
+ public int getEnd()
+ {
+ return region.getEnd();
+ }
+
+ /**
+ * Formats the node as a bracketed list e.g.
+ *
+ * <pre>
+ * [1-100 [10-30 [10-20]], 15-30 [20-20]]
+ * </pre>
+ *
+ * where the format for each interval is as given by <code>T.toString()</code>
+ */
+ @Override
+ public String toString()
+ {
+ StringBuilder sb = new StringBuilder(10 * size());
+ sb.append(region.toString());
+ if (subregions != null)
+ {
+ sb.append(" ").append(subregions.toString());
+ }
+ return sb.toString();
+ }
+
+ void prettyPrint(StringBuilder sb, int offset, int indent)
+ {
+ for (int i = 0; i < offset; i++)
+ {
+ sb.append(" ");
+ }
+ sb.append(region.toString());
+ if (subregions != null)
+ {
+ sb.append(System.lineSeparator());
+ subregions.prettyPrint(sb, offset + 2, indent);
+ }
+ }
+
+ /**
+ * Add any ranges that overlap the from-to range to the result list
+ *
+ * @param from
+ * @param to
+ * @param result
+ */
+ void findOverlaps(long from, long to, List<T> result)
+ {
+ if (region.getBegin() <= to && region.getEnd() >= from)
+ {
+ result.add(region);
+ if (subregions != null)
+ {
+ subregions.findOverlaps(from, to, result);
+ }
+ }
+ }
+
+ /**
+ * Add one node to this node's subregions.
+ *
+ * @param entry
+ * @throws IllegalArgumentException
+ * if the added node is not contained by the node's start-end range
+ */
+ synchronized void addNode(NCNode<T> entry)
+ {
+ if (!region.containsInterval(entry))
+ {
+ throw new IllegalArgumentException(
+ String.format("adding improper subrange %d-%d to range %d-%d",
+ entry.getBegin(), entry.getEnd(), region.getBegin(),
+ region.getEnd()));
+ }
+ if (subregions == null)
+ {
+ subregions = new NCList<>();
+ }
+
+ subregions.addNode(entry);
+ }
+
+ /**
+ * Answers true if the data held satisfy the rules of construction of an
+ * NCList, else false
+ *
+ * @return
+ */
+ boolean isValid()
+ {
+ /*
+ * we don't handle reverse ranges
+ */
+ if (region != null && region.getBegin() > region.getEnd())
+ {
+ return false;
+ }
+ if (subregions == null)
+ {
+ return true;
+ }
+ if (subregions.isEmpty())
+ {
+ /*
+ * we expect empty subregions to be nulled
+ */
+ return false;
+ }
+ return subregions.isValid(getBegin(), getEnd());
+ }
+
+ /**
+ * Adds all contained entries to the given list
+ *
+ * @param entries
+ */
+ void getEntries(List<T> entries)
+ {
+ entries.add(region);
+ if (subregions != null)
+ {
+ subregions.getEntries(entries);
+ }
+ }
+
+ /**
+ * Answers true if this object contains the given entry (by object equals
+ * test), else false
+ *
+ * @param entry
+ * @return
+ */
+ boolean contains(IntervalI entry)
+ {
+ if (entry == null)
+ {
+ return false;
+ }
+ if (entry.equals(region))
+ {
+ return true;
+ }
+ return subregions == null ? false : subregions.contains(entry);
+ }
+
+ /**
+ * Answers the 'root' region modelled by this object
+ *
+ * @return
+ */
+ T getRegion()
+ {
+ return region;
+ }
+
+ /**
+ * Answers the (possibly null) contained regions within this object
+ *
+ * @return
+ */
+ NCList<T> getSubRegions()
+ {
+ return subregions;
+ }
+
+ /**
+ * Answers the (deep) size of this node i.e. the number of intervals it models
+ *
+ * @return
+ */
+ int size()
+ {
+ return subregions == null ? 1 : 1 + subregions.size();
+ }
+
+ /**
+ * Answers the depth of NCNode / NCList nesting in the data tree
+ *
+ * @return
+ */
+ int getDepth()
+ {
+ return subregions == null ? 1 : 1 + subregions.getDepth();
+ }
+
+ /**
+ * Answers an iterator over the intervals stored in this node. The iterator
+ * does not support the optional <code>remove</code> operation (throws
+ * <code>UnsupportedOperationException</code> if attempted).
+ *
+ * @return
+ */
+ public Iterator<T> iterator()
+ {
+ return new NCNodeIterator();
+ }
+
+ /**
+ * Removes the first interval found equal to the given entry. Answers true if
+ * a matching interval is found and removed, else false.
+ *
+ * @param entry
+ * @return
+ */
+ boolean remove(T entry)
+ {
+ if (region.equals(entry))
+ {
+ /*
+ * this case must be handled by NCList, to allow any
+ * children of a deleted interval to be promoted
+ */
+ throw new IllegalArgumentException("NCNode can't remove self");
+ }
+ if (subregions == null)
+ {
+ return false;
+ }
+ if (subregions.remove(entry))
+ {
+ if (subregions.isEmpty())
+ {
+ subregions = null;
+ }
+ return true;
+ }
+ return false;
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public boolean equals(Object o)
+ {
+ return o != null && o instanceof NCNode
+ && equalsInterval((NCNode<T>) o);
+ }
+
+ @Override
+ public boolean equalsInterval(IntervalI i)
+ {
+ return getBegin() == i.getBegin() && getEnd() == i.getEnd();
+
+ }
+
+}
--- /dev/null
+/*
+BSD 3-Clause License
+
+Copyright (c) 2018, Mungo Carstairs
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+* Neither the name of the copyright holder nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+package intervalstore.nonc;
+
+import java.util.AbstractCollection;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.BitSet;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Iterator;
+import java.util.List;
+import java.util.NoSuchElementException;
+
+import intervalstore.api.IntervalI;
+import intervalstore.api.IntervalStoreI;
+
+/**
+ *
+ * A second idea, doing a double binary sort for the full interval. Seemed like
+ * a good idea, but is 50% slower.
+ *
+ * A Collection class to store interval-associated data, with options for "lazy"
+ * sorting so as to speed incremental construction of the data prior to issuing
+ * a findOverlap call.
+ *
+ *
+ * Accepts duplicate entries but not null values.
+ *
+ *
+ *
+ * @author Bob Hanson 2019.08.06
+ *
+ * @param <T>
+ * any type providing <code>getBegin()</code>, <code>getEnd()</code>
+ * <code>getContainedBy()</code>, and <code>setContainedBy()</code>
+ */
+public class IntervalStore<T extends IntervalI>
+ extends AbstractCollection<T> implements IntervalStoreI<T>
+{
+
+ /**
+ * Search for the last interval that starts before or at the specified from/to
+ * range and the first interval that starts after it. In the situation that
+ * there are multiple intervals starting at from, this method returns the
+ * first of those.
+ *
+ * @param a
+ * @param from
+ * @param to
+ * @param ret
+ * @return
+ */
+ public int binaryLastIntervalSearch(long from,
+ long to, int[] ret)
+ {
+ int start = 0, start2 = 0;
+ int matched = 0;
+ int end = intervalCount - 1, end2 = intervalCount;
+ int mid, begin;
+ IntervalI e;
+ while (start <= end)
+ {
+ mid = (start + end) >>> 1;
+ e = intervals[mid];
+ begin = e.getBegin();
+ switch (Long.signum(begin - from))
+ {
+ case -1:
+ matched = mid;
+ start = mid + 1;
+ break;
+ case 0:
+ case 1:
+ end = mid - 1;
+ if (begin > to)
+ {
+ end2 = mid;
+ }
+ else
+ {
+ start2 = mid;
+ }
+ break;
+ }
+ }
+ ret[0] = end2;
+ start = Math.max(start2, end);
+ end = end2 - 1;
+
+ while (start <= end)
+ {
+ mid = (start + end) >>> 1;
+ e = intervals[mid];
+ begin = e.getBegin();
+ if (begin > to)
+ {
+ ret[0] = mid;
+ end = mid - 1;
+ }
+ else
+ {
+ start = mid + 1;
+ }
+
+ }
+ return matched;
+ }
+
+ /**
+ * My preference is for a bigendian comparison, but you may differ.
+ */
+ private Comparator<? super IntervalI> icompare;
+
+ /**
+ * bigendian is what NCList does; change icompare to switch to that
+ */
+ private boolean bigendian;
+
+ private final boolean DO_PRESORT;
+
+ private boolean isSorted;
+
+ private int minStart = Integer.MAX_VALUE, maxStart = Integer.MIN_VALUE,
+ maxEnd = Integer.MAX_VALUE;
+
+ // private Comparator<IntervalI> icompare = new IntervalComparator();
+
+ private boolean isTainted;
+
+ private int capacity = 8;
+
+ private IntervalI[] intervals = new IntervalI[capacity];
+
+ private int[] offsets;
+
+ private int[] ret = new int[1];
+
+ private int intervalCount;
+
+ private int added;
+
+ private int deleted;
+
+ private BitSet bsDeleted;
+
+ /**
+ * Constructor
+ */
+ public IntervalStore()
+ {
+ this(true);
+ }
+
+ public IntervalStore(boolean presort)
+ {
+ this(null, presort);
+ }
+
+ /**
+ * Constructor given a list of intervals. Note that the list may get sorted as
+ * a side-effect of calling this constructor.
+ */
+ public IntervalStore(List<T> intervals)
+ {
+ this(intervals, true);
+ }
+
+ /**
+ * Allows a presort option, which can speed up initial loading of individual
+ * features but will delay the first findOverlap if set to true.
+ *
+ * @param intervals
+ * @param presort
+ */
+ public IntervalStore(List<T> intervals, boolean presort)
+ {
+ this(intervals, presort, null, false);
+ }
+
+ /**
+ *
+ * @param intervals
+ * intervals to initialize with (others may still be added)
+ * @param presort
+ * whether or not to presort the list as additions are made
+ * @param comparator
+ * IntervalI.COMPARATOR_LITTLEENDIAN or
+ * IntervalI.COMPARATOR_BIGENDIAN, but this could also be one that
+ * sorts by description as well, for example.
+ * @param bigendian
+ * true if the comparator sorts [10-30] before [10-20]
+ */
+ public IntervalStore(List<T> intervals, boolean presort,
+ Comparator<? super IntervalI> comparator, boolean bigendian)
+ {
+ if (intervals != null)
+ {
+ intervals.toArray(
+ this.intervals = new IntervalI[capacity = intervalCount = intervals
+ .size()]);
+ }
+ DO_PRESORT = presort;
+ icompare = (comparator != null ? comparator
+ : bigendian ? IntervalI.COMPARATOR_BIGENDIAN
+ : IntervalI.COMPARATOR_LITTLEENDIAN);
+ this.bigendian = bigendian;
+
+ if (DO_PRESORT && intervalCount > 1)
+ {
+ sort();
+ }
+ isSorted = DO_PRESORT;
+ isTainted = true;
+ }
+
+ /**
+ * Adds one interval to the store, allowing duplicates.
+ *
+ * @param interval
+ */
+ @Override
+ public boolean add(T interval)
+ {
+ return add(interval, true);
+ }
+
+ /**
+ * Adds one interval to the store, optionally checking for duplicates.
+ *
+ * @param interval
+ * @param allowDuplicates
+ */
+ public boolean add(T interval, boolean allowDuplicates)
+ {
+ if (interval == null)
+ {
+ return false;
+ }
+
+ if (deleted > 0)
+ {
+ finalizeDeletion();
+ }
+ if (!isTainted)
+ {
+ offsets = null;
+ isTainted = true;
+ }
+
+ synchronized (intervals)
+ {
+ int index = intervalCount;
+ int start = interval.getBegin();
+
+ if (intervalCount + added + 1 >= capacity)
+ {
+ intervals = finalizeAddition(
+ new IntervalI[capacity = capacity << 1]);
+
+ }
+
+ if (DO_PRESORT && isSorted)
+ {
+ if (intervalCount == 0)
+ {
+ // ignore
+ }
+ else
+ {
+ index = findInterval(interval);
+ if (!allowDuplicates && index >= 0)
+ {
+ return false;
+ }
+ if (index < 0)
+ {
+ index = -1 - index;
+ }
+ else
+ {
+ index++;
+ }
+ }
+
+ }
+ else
+ {
+ if (!allowDuplicates && findInterval(interval) >= 0)
+ {
+ return false;
+ }
+ isSorted = false;
+ }
+
+ if (index == intervalCount)
+ {
+ intervals[intervalCount++] = interval;
+ // System.out.println("added " + intervalCount + " " + interval);
+ }
+ else
+ {
+ int pt = capacity - ++added;
+ intervals[pt] = interval;
+ // System.out.println("stashed " + pt + " " + interval + " for "
+ // + index + " " + intervals[index]);
+ if (offsets == null)
+ {
+ offsets = new int[capacity];
+ }
+
+ offsets[pt] = offsets[index];
+
+ offsets[index] = pt;
+ }
+
+ minStart = Math.min(minStart, start);
+ maxStart = Math.max(maxStart, start);
+ return true;
+ }
+ }
+
+ private IntervalI[] finalizeAddition(IntervalI[] dest)
+ {
+ if (dest == null)
+ {
+ dest = intervals;
+ }
+ if (added == 0)
+ {
+ if (intervalCount > 0 && dest != intervals)
+ {
+ System.arraycopy(intervals, 0, dest, 0, intervalCount);
+ }
+ capacity = dest.length;
+ return dest;
+ }
+
+ // array is [(intervalCount)...null...(added)]
+
+ int ntotal = intervalCount + added;
+ for (int ptShift = intervalCount + added, pt = intervalCount; pt >= 0;)
+ {
+ int pt0 = pt;
+ while (--pt >= 0 && offsets[pt] == 0)
+ {
+ ;
+ }
+ if (pt < 0)
+ {
+ pt = 0;
+ }
+ int nOK = pt0 - pt;
+ // shift upper intervals right
+ ptShift -= nOK;
+ if (nOK > 0)
+ {
+ System.arraycopy(intervals, pt, dest, ptShift, nOK);
+ }
+ if (added == 0)
+ {
+ break;
+ }
+ for (int offset = offsets[pt]; offset > 0; offset = offsets[offset])
+ {
+ dest[--ptShift] = intervals[offset];
+ --added;
+ }
+ }
+ offsets = null;
+ intervalCount = ntotal;
+ capacity = dest.length;
+ return dest;
+ }
+
+ public int binaryIdentitySearch(IntervalI interval)
+ {
+ return binaryIdentitySearch(interval, null);
+ }
+ /**
+ * for remove() and contains()
+ *
+ * @param list
+ * @param interval
+ * @param bsIgnore
+ * for deleted
+ * @return index or, if not found, -1 - "would be here"
+ */
+ public int binaryIdentitySearch(IntervalI interval, BitSet bsIgnore)
+ {
+ int start = 0;
+ int r0 = interval.getBegin();
+ int r1 = interval.getEnd();
+ int end = intervalCount - 1;
+ if (end < 0 || r0 < minStart)
+ {
+ return -1;
+ }
+ if (r0 > maxStart)
+ {
+ return -1 - intervalCount;
+ }
+ while (start <= end)
+ {
+ int mid = (start + end) >>> 1;
+ IntervalI r = intervals[mid];
+ switch (compareRange(r, r0, r1))
+ {
+ case -1:
+ start = mid + 1;
+ continue;
+ case 1:
+ end = mid - 1;
+ continue;
+ case 0:
+ IntervalI iv = intervals[mid];
+ if ((bsIgnore == null || !bsIgnore.get(mid))
+ && iv.equalsInterval(interval))
+ {
+ return mid;
+ // found one; just scan up and down now, first checking the range, but
+ // also checking other possible aspects of equivalence.
+ }
+
+ for (int i = mid; ++i <= end;)
+ {
+ if ((iv = intervals[i]).getBegin() != r0 || iv.getEnd() != r1)
+ {
+ break;
+ }
+ if ((bsIgnore == null || !bsIgnore.get(i))
+ && iv.equalsInterval(interval))
+ {
+ return i;
+ }
+ }
+ for (int i = mid; --i >= start;)
+ {
+ if ((iv = intervals[i]).getBegin() != r0 || iv.getEnd() < r1)
+ {
+ return -1 - ++i;
+ }
+ if ((bsIgnore == null || !bsIgnore.get(i))
+ && iv.equalsInterval(interval))
+ {
+ return i;
+ }
+ }
+ return -1 - start;
+ }
+ }
+ return -1 - start;
+ }
+
+ // private int binaryInsertionSearch(long from, long to)
+ // {
+ // int matched = intervalCount;
+ // int end = matched - 1;
+ // int start = matched;
+ // if (end < 0 || from > intervals[end].getEnd()
+ // || from < intervals[start = 0].getBegin())
+ // return start;
+ // while (start <= end)
+ // {
+ // int mid = (start + end) >>> 1;
+ // switch (compareRange(intervals[mid], from, to))
+ // {
+ // case 0:
+ // return mid;
+ // case 1:
+ // matched = mid;
+ // end = mid - 1;
+ // continue;
+ // case -1:
+ // start = mid + 1;
+ // continue;
+ // }
+ //
+ // }
+ // return matched;
+ // }
+
+
+ @Override
+ public void clear()
+ {
+ intervalCount = added = 0;
+ isSorted = true;
+ isTainted = true;
+ offsets = null;
+ minStart = maxEnd = Integer.MAX_VALUE;
+ maxStart = Integer.MIN_VALUE;
+ }
+ /**
+ * Compare an interval t to a from/to range for insertion purposes
+ *
+ * @param t
+ * @param from
+ * @param to
+ * @return 0 if same, 1 if start is after from, or start equals from and
+ * [bigendian: end is before to | littleendian: end is after to], else
+ * -1
+ */
+ private int compareRange(IntervalI t, long from, long to)
+ {
+ if (t == null)
+ {
+ System.out.println("???");
+ }
+ int order = Long.signum(t.getBegin() - from);
+ return (order == 0
+ ? Long.signum(bigendian ? to - t.getEnd() : t.getEnd() - to)
+ : order);
+ }
+
+ @Override
+ public boolean contains(Object entry)
+ {
+ if (entry == null || intervalCount == 0)
+ {
+ return false;
+ }
+ if (!isSorted || deleted > 0)
+ {
+ sort();
+ }
+ return (findInterval((IntervalI) entry) >= 0);
+ }
+
+ public boolean containsInterval(IntervalI outer, IntervalI inner)
+ {
+ ensureFinalized();
+ int index = binaryIdentitySearch(inner, null);
+ if (index >= 0)
+ {
+ while ((index = index - Math.abs(offsets[index])) >= 0)
+ {
+ if (intervals[index] == outer)
+ {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ private void ensureFinalized()
+ {
+ if (isTainted)
+ {
+ if (!isSorted || added > 0 || deleted > 0)
+ {
+ sort();
+ }
+ if (offsets == null || offsets.length < intervalCount)
+ {
+ offsets = new int[intervalCount];
+ }
+ linkFeatures();
+ isTainted = false;
+ }
+ }
+
+ /**
+ * Find all overlaps within the given range, inclusively.
+ *
+ * @return a list sorted in ascending order of start position
+ *
+ */
+ @Override
+ public List<T> findOverlaps(long from, long to)
+ {
+ List<T> list = findOverlaps(from, to, null);
+ Collections.reverse(list);
+ return list;
+ }
+
+ /**
+ * Find all overlaps within the given range, inclusively.
+ *
+ * @return a list sorted in descending order of start position
+ *
+ */
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public List<T> findOverlaps(long from, long to, List<T> result)
+ {
+ if (result == null)
+ {
+ result = new ArrayList<>();
+ }
+ switch (intervalCount + added)
+ {
+ case 0:
+ return result;
+ case 1:
+ IntervalI sf = intervals[0];
+ if (sf.getBegin() <= to && sf.getEnd() >= from)
+ {
+ result.add((T) sf);
+ }
+ return result;
+ }
+
+ ensureFinalized();
+
+ if (from > maxEnd || to < minStart)
+ {
+ return result;
+ }
+ int index = binaryLastIntervalSearch(from, to, ret);
+ int index1 = ret[0];
+ if (index1 < 0)
+ {
+ return result;
+ }
+
+ if (index1 > index + 1)
+ {
+ while (--index1 > index)
+ {
+ result.add((T) intervals[index1]);
+ }
+ }
+ boolean isMonotonic = false;
+ while (index >= 0)
+ {
+ IntervalI sf = intervals[index];
+ if (sf.getEnd() >= from)
+ {
+ result.add((T) sf);
+ }
+ else if (isMonotonic)
+ {
+ break;
+ }
+ int offset = offsets[index];
+ isMonotonic = (offset < 0);
+ index -= (isMonotonic ? -offset : offset);
+ }
+ return result;
+ }
+
+ @Override
+ public IntervalI get(int i)
+ {
+ if (i < 0 || i >= intervalCount + added)
+ {
+ return null;
+ }
+ ensureFinalized();
+ return intervals[i];
+ }
+
+ private int getContainedBy(int index, int begin)
+ {
+ while (index >= 0)
+ {
+ IntervalI sf = intervals[index];
+ if (sf.getEnd() >= begin)
+ {
+ // System.out.println("\nIS found " + sf0.getIndex1() + ":" + sf0
+ // + "\nFS in " + sf.getIndex1() + ":" + sf);
+ return index;
+ }
+ index -= Math.abs(offsets[index]);
+ }
+ return IntervalI.NOT_CONTAINED;
+ }
+
+ @Override
+ public int getDepth()
+ {
+ ensureFinalized();
+ if (intervalCount < 2)
+ {
+ return intervalCount;
+ }
+ int maxDepth = 1;
+ IntervalI root = null;
+ for (int i = 0; i < intervalCount; i++)
+ {
+ IntervalI element = intervals[i];
+ if (offsets[i] == IntervalI.NOT_CONTAINED)
+ {
+ root = element;
+ }
+ int depth = 1;
+ int index = i;
+ int offset;
+ while ((index = index - Math.abs(offset = offsets[index])) >= 0)
+ {
+ element = intervals[index];
+ if (++depth > maxDepth && (element == root || offset < 0))
+ {
+ maxDepth = depth;
+ break;
+ }
+ }
+ }
+ return maxDepth;
+ }
+
+ @Override
+ public int getWidth()
+ {
+ ensureFinalized();
+ int w = 0;
+ for (int i = offsets.length; --i >= 0;)
+ {
+ if (offsets[i] > 0)
+ {
+ w++;
+ }
+ }
+ return w;
+ }
+
+ @Override
+ public boolean isValid()
+ {
+ ensureFinalized();
+ return true;
+ }
+
+ /**
+ * Answers an iterator over the intervals in the store, with no particular
+ * ordering guaranteed. The iterator does not support the optional
+ * <code>remove</code> operation (throws
+ * <code>UnsupportedOperationException</code> if attempted).
+ */
+ @Override
+ public Iterator<T> iterator()
+ {
+ ensureFinalized();
+ return new Iterator<T>()
+ {
+
+ private int next;
+
+ @Override
+ public boolean hasNext()
+ {
+ return next < intervalCount;
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public T next()
+ {
+ if (next >= intervalCount)
+ {
+ throw new NoSuchElementException();
+ }
+ return (T) intervals[next++];
+ }
+
+ };
+ }
+
+ private void linkFeatures()
+ {
+ if (intervalCount == 0)
+ {
+ return;
+ }
+ maxEnd = intervals[0].getEnd();
+ offsets[0] = IntervalI.NOT_CONTAINED;
+ if (intervalCount == 1)
+ {
+ return;
+ }
+ boolean isMonotonic = true;
+ for (int i = 1; i < intervalCount; i++)
+ {
+ IntervalI sf = intervals[i];
+ int begin = sf.getBegin();
+ int index = (begin <= maxEnd ? getContainedBy(i - 1, begin) : -1);
+ // System.out.println(sf + " is contained by "
+ // + (index < 0 ? null : starts[index]));
+
+ offsets[i] = (index < 0 ? IntervalI.NOT_CONTAINED
+ : isMonotonic ? index - i : i - index);
+ isMonotonic = (sf.getEnd() > maxEnd);
+ if (isMonotonic)
+ {
+ maxEnd = sf.getEnd();
+ }
+ }
+
+ }
+
+ @Override
+ public String prettyPrint()
+ {
+ switch (intervalCount + added)
+ {
+ case 0:
+ return "";
+ case 1:
+ return intervals[0] + "\n";
+ }
+ ensureFinalized();
+ String sep = "\t";
+ StringBuffer sb = new StringBuffer();
+ for (int i = 0; i < intervalCount; i++)
+ {
+ IntervalI range = intervals[i];
+ int index = i;
+ while ((index = index - Math.abs(offsets[index])) >= 0)
+ {
+ sb.append(sep);
+ }
+ sb.append(range.toString()).append('\n');
+ }
+ return sb.toString();
+ }
+
+ @Override
+ public synchronized boolean remove(Object o)
+ {
+ // if (o == null)
+ // {
+ // throw new NullPointerException();
+ // }
+ return (o != null && intervalCount > 0
+ && removeInterval((IntervalI) o));
+ }
+
+ /**
+ * Find the interval or return where it should go, possibly into the add
+ * buffer
+ *
+ * @param interval
+ * @return index (nonnegative) or index where it would go (negative)
+ */
+
+ private int findInterval(IntervalI interval)
+ {
+
+ if (isSorted)
+ {
+ int pt = binaryIdentitySearch(interval, null);
+ // if (addPt == intervalCount || offsets[pt] == 0)
+ // return pt;
+ if (pt >= 0 || added == 0 || pt == -1 - intervalCount)
+ {
+ return pt;
+ }
+ pt = -1 - pt;
+ int start = interval.getBegin();
+ int end = interval.getEnd();
+
+ int match = pt;
+
+ while ((pt = offsets[pt]) != 0)
+ {
+ IntervalI iv = intervals[pt];
+ switch (compareRange(iv, start, end))
+ {
+ case -1:
+ break;
+ case 0:
+ if (iv.equalsInterval(interval))
+ {
+ return pt;
+ }
+ // fall through
+ case 1:
+ match = pt;
+ continue;
+ }
+ }
+ return -1 - match;
+ }
+ else
+ {
+ int i = intervalCount;
+ while (--i >= 0 && !intervals[i].equalsInterval(interval))
+ {
+ ;
+ }
+ return i;
+ }
+ }
+
+ /**
+ * Uses a binary search to find the entry and removes it if found.
+ *
+ * @param interval
+ * @return
+ */
+ protected boolean removeInterval(IntervalI interval)
+ {
+
+ if (!isSorted || added > 0)
+ {
+ sort();
+ }
+ int i = binaryIdentitySearch(interval, bsDeleted);
+ if (i < 0)
+ {
+ return false;
+ }
+ if (deleted == 0)
+ {
+ if (bsDeleted == null)
+ {
+ bsDeleted = new BitSet(intervalCount);
+ }
+ else
+ {
+ bsDeleted.clear();
+ }
+ }
+ bsDeleted.set(i);
+ deleted++;
+ return (isTainted = true);
+ }
+
+ private void finalizeDeletion()
+ {
+ if (deleted == 0)
+ {
+ return;
+ }
+
+ // ......xxx.....xxxx.....xxxxx....
+ // ......^i,pt
+ // ...... .......
+ // ............
+ for (int i = bsDeleted.nextSetBit(0), pt = i; i >= 0;)
+ {
+ i = bsDeleted.nextClearBit(i + 1);
+ int pt1 = bsDeleted.nextSetBit(i + 1);
+ if (pt1 < 0)
+ {
+ pt1 = intervalCount;
+ }
+ int n = pt1 - i;
+ System.arraycopy(intervals, i, intervals, pt, n);
+ pt += n;
+ if (pt1 == intervalCount)
+ {
+ for (i = pt1; --i >= pt;)
+ {
+ intervals[i] = null;
+ }
+ intervalCount -= deleted;
+ deleted = 0;
+ bsDeleted.clear();
+ break;
+ }
+ i = pt1;
+ }
+
+
+ }
+
+ @Override
+ public boolean revalidate()
+ {
+ isTainted = true;
+ isSorted = false;
+ ensureFinalized();
+ return true;
+ }
+
+ @Override
+ public int size()
+ {
+ return intervalCount + added - deleted;
+ }
+
+ @Override
+ public Object[] toArray()
+ {
+ ensureFinalized();
+ return super.toArray();
+ }
+
+ /**
+ * Sort intervals by start (lowest first) and end (highest first).
+ */
+ private void sort()
+ {
+ if (added > 0)
+ {
+ intervals = finalizeAddition(new IntervalI[intervalCount + added]);
+ }
+ else if (deleted > 0)
+ {
+ finalizeDeletion();
+ }
+ else
+ {
+ Arrays.sort(intervals, 0, intervalCount, icompare);
+ }
+ updateMinMaxStart();
+ isSorted = true;
+ }
+
+ private void updateMinMaxStart()
+ {
+ if (intervalCount > 0)
+ {
+ minStart = intervals[0].getBegin();
+ maxStart = intervals[intervalCount - 1].getBegin();
+ }
+ else
+ {
+ minStart = Integer.MAX_VALUE;
+ maxStart = Integer.MIN_VALUE;
+ }
+ }
+
+ @Override
+ public String toString()
+ {
+ return prettyPrint();
+ }
+
+}
import jalview.analysis.scoremodels.PIDModel;
import jalview.analysis.scoremodels.SimilarityParams;
+import jalview.bin.ApplicationSingletonProvider;
+import jalview.bin.ApplicationSingletonProvider.ApplicationSingletonI;
import jalview.datamodel.AlignmentAnnotation;
import jalview.datamodel.AlignmentI;
import jalview.datamodel.AlignmentOrder;
* from the first tobesorted position in the alignment. e.g. (a,tb2,b,tb1,c,tb3
* becomes a,tb1,tb2,tb3,b,c)
*/
-public class AlignmentSorter
+public class AlignmentSorter implements ApplicationSingletonI
{
+
+ private AlignmentSorter()
+ {
+ // private singleton
+ }
+
+ private static AlignmentSorter getInstance()
+ {
+ return (AlignmentSorter) ApplicationSingletonProvider
+ .getInstance(AlignmentSorter.class);
+ }
+
+ /**
+ * types of feature ordering: Sort by score : average score - or total score -
+ * over all features in region Sort by feature label text: (or if null -
+ * feature type text) - numerical or alphabetical Sort by feature density:
+ * based on counts - ignoring individual text or scores for each feature
+ */
+ public static final String FEATURE_SCORE = "average_score";
+
+ public static final String FEATURE_LABEL = "text";
+
+ public static final String FEATURE_DENSITY = "density";
+
/*
* todo: refactor searches to follow a basic pattern: (search property, last
* search state, current sort direction)
*/
- static boolean sortIdAscending = true;
+ boolean sortIdAscending = true;
- static int lastGroupHash = 0;
+ int lastGroupHash = 0;
- static boolean sortGroupAscending = true;
+ boolean sortGroupAscending = true;
- static AlignmentOrder lastOrder = null;
+ AlignmentOrder lastOrder = null;
- static boolean sortOrderAscending = true;
+ boolean sortOrderAscending = true;
- static TreeModel lastTree = null;
+ TreeModel lastTree = null;
- static boolean sortTreeAscending = true;
+ boolean sortTreeAscending = true;
- /*
+
+ /**
* last Annotation Label used for sort by Annotation score
*/
- private static String lastSortByAnnotation;
+ private String lastSortByAnnotation;
- /*
- * string hash of last arguments to sortByFeature
- * (sort order toggles if this is unchanged between sorts)
+ /**
+ * string hash of last arguments to sortByFeature (sort order toggles if this
+ * is unchanged between sorts)
*/
- private static String sortByFeatureCriteria;
+ private String sortByFeatureCriteria;
- private static boolean sortByFeatureAscending = true;
+ private boolean sortByFeatureAscending = true;
- private static boolean sortLengthAscending;
+ private boolean sortLengthAscending;
/**
* Sorts sequences in the alignment by Percentage Identity with the given
QuickSort.sort(ids, seqs);
- if (sortIdAscending)
+ AlignmentSorter as = getInstance();
+ if (as.sortIdAscending)
{
setReverseOrder(align, seqs);
}
setOrder(align, seqs);
}
- sortIdAscending = !sortIdAscending;
+ as.sortIdAscending = !as.sortIdAscending;
}
/**
QuickSort.sort(length, seqs);
- if (sortLengthAscending)
+ AlignmentSorter as = getInstance();
+
+ if (as.sortLengthAscending)
{
setReverseOrder(align, seqs);
}
setOrder(align, seqs);
}
- sortLengthAscending = !sortLengthAscending;
+ as.sortLengthAscending = !as.sortLengthAscending;
}
/**
// ORDERS BY GROUP SIZE
List<SequenceGroup> groups = new ArrayList<>();
- if (groups.hashCode() != lastGroupHash)
+ AlignmentSorter as = getInstance();
+
+ if (groups.hashCode() != as.lastGroupHash)
{
- sortGroupAscending = true;
- lastGroupHash = groups.hashCode();
+ as.sortGroupAscending = true;
+ as.lastGroupHash = groups.hashCode();
}
else
{
- sortGroupAscending = !sortGroupAscending;
+ as.sortGroupAscending = !as.sortGroupAscending;
}
// SORTS GROUPS BY SIZE
}
}
- if (sortGroupAscending)
+ if (as.sortGroupAscending)
{
setOrder(align, seqs);
}
// Get an ordered vector of sequences which may also be present in align
List<SequenceI> tmp = order.getOrder();
- if (lastOrder == order)
+ AlignmentSorter as = getInstance();
+
+ if (as.lastOrder == order)
{
- sortOrderAscending = !sortOrderAscending;
+ as.sortOrderAscending = !as.sortOrderAscending;
}
else
{
- sortOrderAscending = true;
+ as.sortOrderAscending = true;
}
- if (sortOrderAscending)
+ if (as.sortOrderAscending)
{
setOrder(align, tmp);
}
{
List<SequenceI> tmp = getOrderByTree(align, tree);
+ AlignmentSorter as = getInstance();
+
// tmp should properly permute align with tree.
- if (lastTree != tree)
+ if (as.lastTree != tree)
{
- sortTreeAscending = true;
- lastTree = tree;
+ as.sortTreeAscending = true;
+ as.lastTree = tree;
}
else
{
- sortTreeAscending = !sortTreeAscending;
+ as.sortTreeAscending = !as.sortTreeAscending;
}
- if (sortTreeAscending)
+ if (as.sortTreeAscending)
{
setOrder(align, tmp);
}
for (int i = 0; i < alignment.length; i++)
{
- ids[i] = (Float.valueOf(alignment[i].getName().substring(8)))
+ ids[i] = (new Float(alignment[i].getName().substring(8)))
.floatValue();
}
}
jalview.util.QuickSort.sort(scores, seqs);
- if (lastSortByAnnotation != scoreLabel)
+
+ AlignmentSorter as = getInstance();
+
+ if (as.lastSortByAnnotation != scoreLabel)
{
- lastSortByAnnotation = scoreLabel;
+ as.lastSortByAnnotation = scoreLabel;
setOrder(alignment, seqs);
}
else
}
/**
- * types of feature ordering: Sort by score : average score - or total score -
- * over all features in region Sort by feature label text: (or if null -
- * feature type text) - numerical or alphabetical Sort by feature density:
- * based on counts - ignoring individual text or scores for each feature
- */
- public static String FEATURE_SCORE = "average_score";
-
- public static String FEATURE_LABEL = "text";
-
- public static String FEATURE_DENSITY = "density";
-
- /**
* Sort sequences by feature score or density, optionally restricted by
* feature types, feature groups, or alignment start/end positions.
* <p>
}
}
+ boolean doSort = false;
+
if (FEATURE_SCORE.equals(method))
{
if (hasScores == 0)
}
}
}
- QuickSort.sortByDouble(scores, seqs, sortByFeatureAscending);
+ doSort = true;
}
else if (FEATURE_DENSITY.equals(method))
{
// System.err.println("Sorting on Density: seq "+seqs[i].getName()+
// " Feats: "+featureCount+" Score : "+scores[i]);
}
- QuickSort.sortByDouble(scores, seqs, sortByFeatureAscending);
+ doSort = true;
+ }
+ if (doSort)
+ {
+ QuickSort.sortByDouble(scores, seqs, getInstance().sortByFeatureAscending);
}
-
setOrder(alignment, seqs);
}
/*
* if resorting on the same criteria, toggle sort order
*/
- if (sortByFeatureCriteria == null
- || !scoreCriteria.equals(sortByFeatureCriteria))
+ AlignmentSorter as = getInstance();
+ if (as.sortByFeatureCriteria == null
+ || !scoreCriteria.equals(as.sortByFeatureCriteria))
{
- sortByFeatureAscending = true;
+ as.sortByFeatureAscending = true;
}
else
{
- sortByFeatureAscending = !sortByFeatureAscending;
+ as.sortByFeatureAscending = !as.sortByFeatureAscending;
}
- sortByFeatureCriteria = scoreCriteria;
+ as.sortByFeatureCriteria = scoreCriteria;
}
}
max = Math.max(max, bigtot);
- quality.addElement(Double.valueOf(bigtot));
+ quality.addElement(new Double(bigtot));
}
double newmax = -Double.MAX_VALUE;
tmp = ((max - tmp) * (size - cons2GapCounts[j])) / size;
// System.out.println(tmp+ " " + j);
- quality.setElementAt(Double.valueOf(tmp), j);
+ quality.setElementAt(new Double(tmp), j);
if (tmp > newmax)
{
import jalview.datamodel.SequenceI;
import jalview.util.DBRefUtils;
import jalview.util.MapList;
-import jalview.ws.SequenceFetcherFactory;
-import jalview.ws.seqfetcher.ASequenceFetcher;
+import jalview.ws.SequenceFetcher;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
+import intervalstore.api.IntervalI;
+
/**
* Functions for cross-referencing sequence databases.
*
private void retrieveCrossRef(List<DBRefEntry> sourceRefs, SequenceI seq,
List<DBRefEntry> xrfs, boolean fromDna, AlignedCodonFrame cf)
{
- ASequenceFetcher sftch = SequenceFetcherFactory.getSequenceFetcher();
SequenceI[] retrieved = null;
SequenceI dss = seq.getDatasetSequence() == null ? seq
: seq.getDatasetSequence();
}
try
{
- retrieved = sftch.getSequences(sourceRefs, !fromDna);
+ retrieved = SequenceFetcher.getInstance()
+ .getSequences(sourceRefs, !fromDna);
} catch (Exception e)
{
System.err.println(
private void removeAlreadyRetrievedSeqs(List<DBRefEntry> sourceRefs,
boolean fromDna)
{
- List<DBRefEntry> dbrSourceSet = new ArrayList<DBRefEntry>(sourceRefs);
+ List<DBRefEntry> dbrSourceSet = new ArrayList<>(sourceRefs);
List<SequenceI> dsSeqs = dataset.getSequences();
for (int ids = 0, nds = dsSeqs.size(); ids < nds; ids++)
{
*/
SequenceFeature newFeature = new SequenceFeature(feat)
{
+ // BH 2019.08.15 We must override equalsInterval, not
+ // equals, because that is part of the IntervalI interface,
+ // and IntervalStore may need that for proper, faster
+ // processing.
+ // @Override
+ // public boolean equals(Object o)
+ // {
+ // return super.equals(o, true);
+ // }
+ //
@Override
- public boolean equals(Object o)
+ public boolean equalsInterval(IntervalI sf)
{
- return super.equals(o, true);
+ return equals((SequenceFeature) sf, true);
}
};
+
matched.addSequenceFeature(newFeature);
}
}
import jalview.datamodel.SequenceI;
import jalview.datamodel.VisibleContigsIterator;
import jalview.util.Comparison;
+import jalview.util.Platform;
import java.util.List;
import java.util.Vector;
{
String searchString = matchCase ? theSearchString
: theSearchString.toUpperCase();
- Regex searchPattern = new Regex(searchString);
+ Regex searchPattern = Platform.newRegex(searchString, null);
searchPattern.setIgnoreCase(!matchCase);
searchResults = new SearchResults();
import java.util.StringTokenizer;
/**
- * A singleton that provides instances of genetic code translation tables
+ * A static class that provides instances of genetic code translation tables
*
* @author gmcarstairs
* @see https://www.ncbi.nlm.nih.gov/Taxonomy/Utils/wprintgc.cgi
*/
public final class GeneticCodes
{
+
+ /**
+ * As implemented, this has to be the first table defined in the data file.
+ */
+ private static GeneticCodeI standardTable;
+
+ /**
+ *
+ * @return the standard code table (table 1)
+ */
+ public static GeneticCodeI getStandardCodeTable()
+ {
+ return (standardTable == null
+ ? standardTable = codeTables.values().iterator().next()
+ : standardTable);
+ }
+
private static final int CODON_LENGTH = 3;
private static final String QUOTE = "\"";
private static final String RESOURCE_FILE = "/GeneticCodes.dat";
- private static GeneticCodes instance = new GeneticCodes();
-
- private Map<String, String> ambiguityCodes;
+ private static final Map<String, String> ambiguityCodes;
/*
* loaded code tables, with keys in order of loading
*/
- private Map<String, GeneticCodeI> codeTables;
+ private static final Map<String, GeneticCodeI> codeTables;
- /**
- * Private constructor enforces singleton
- */
- private GeneticCodes()
+ static
{
- if (instance == null)
- {
- ambiguityCodes = new HashMap<>();
+ ambiguityCodes = new HashMap<>();
- /*
- * LinkedHashMap preserves order of addition of entries,
- * so we can assume the Standard Code Table is the first
- */
- codeTables = new LinkedHashMap<>();
- loadAmbiguityCodes(AMBIGUITY_CODES_FILE);
- loadCodes(RESOURCE_FILE);
- }
+ /*
+ * LinkedHashMap preserves order of addition of entries,
+ * so we can assume the Standard Code Table is the first
+ */
+ codeTables = new LinkedHashMap<>();
+ loadAmbiguityCodes(AMBIGUITY_CODES_FILE);
+ loadCodes(RESOURCE_FILE);
}
/**
- * Returns the singleton instance of this class
- *
- * @return
+ * Private constructor enforces no instantiation
*/
- public static GeneticCodes getInstance()
+ private GeneticCodes()
{
- return instance;
}
/**
*
* @return
*/
- public Iterable<GeneticCodeI> getCodeTables()
+ public static Iterable<GeneticCodeI> getCodeTables()
{
return codeTables.values();
}
/**
- * Answers the code table with the given id
+ * Answers the code table with the given id -- test suite only
*
* @param id
* @return
*/
- public GeneticCodeI getCodeTable(String id)
+ public static GeneticCodeI getCodeTable(String id)
{
return codeTables.get(id);
}
/**
- * A convenience method that returns the standard code table (table 1). As
- * implemented, this has to be the first table defined in the data file.
- *
- * @return
- */
- public GeneticCodeI getStandardCodeTable()
- {
- return codeTables.values().iterator().next();
- }
-
- /**
* Loads the code tables from a data file
*/
- protected void loadCodes(String fileName)
+ private static void loadCodes(String fileName)
{
try
{
- InputStream is = getClass().getResourceAsStream(fileName);
+ InputStream is = GeneticCodes.class.getResourceAsStream(fileName);
if (is == null)
{
System.err.println("Resource file not found: " + fileName);
*
* @param fileName
*/
- protected void loadAmbiguityCodes(String fileName)
+ private static void loadAmbiguityCodes(String fileName)
{
try
{
- InputStream is = getClass().getResourceAsStream(fileName);
+ InputStream is = GeneticCodes.class.getResourceAsStream(fileName);
if (is == null)
{
System.err.println("Resource file not found: " + fileName);
* @return
* @throws IOException
*/
- protected String readLine(BufferedReader dataIn) throws IOException
+ private static String readLine(BufferedReader dataIn) throws IOException
{
String line = dataIn.readLine();
while (line != null && line.startsWith("#"))
* @return
* @throws IOException
*/
- protected String loadOneTable(BufferedReader dataIn) throws IOException
+ private static String loadOneTable(BufferedReader dataIn)
+ throws IOException
{
String name = null;
String id = null;
* @param name
* @param codons
*/
- protected void registerCodeTable(final String id, final String name,
+ private static void registerCodeTable(final String id, final String name,
final Map<String, String> codons)
{
codeTables.put(id, new GeneticCodeI()
* @param codeTable
* @return
*/
- protected String getAmbiguousTranslation(String codon,
+ protected static String getAmbiguousTranslation(String codon,
Map<String, String> ambiguous, GeneticCodeI codeTable)
{
if (codon.length() != CODON_LENGTH)
ambiguous.put(codon, peptide);
return peptide;
}
+
}
import jalview.datamodel.AlignmentAnnotation;
import jalview.datamodel.AlignmentI;
import jalview.datamodel.SequenceI;
+import jalview.util.Platform;
import com.stevesoft.pat.Regex;
String[] ScoreDescriptions, String regex, boolean repeat)
{
int count = 0;
- Regex pattern = new Regex(regex);
+ Regex pattern = Platform.newRegex(regex, null);
if (pattern.numSubs() > ScoreNames.length)
{
// Check that we have enough labels and descriptions for any parsed
double score = Double.NaN;
try
{
- score = Double.valueOf(sstring).doubleValue();
+ score = new Double(sstring).doubleValue();
} catch (Exception e)
{
// don't try very hard to parse if regex was wrong.
{
Hashtable sqinfo = new Hashtable();
sqinfo.put("Name", seq.getName());
- sqinfo.put("Start", Integer.valueOf(seq.getStart()));
- sqinfo.put("End", Integer.valueOf(seq.getEnd()));
+ sqinfo.put("Start", new Integer(seq.getStart()));
+ sqinfo.put("End", new Integer(seq.getEnd()));
if (seq.getDescription() != null)
{
sqinfo.put("Description", seq.getDescription());
maxResidue = "{";
}
}
- residueHash.put(MAXCOUNT, Integer.valueOf(count));
+ residueHash.put(MAXCOUNT, new Integer(count));
residueHash.put(MAXRESIDUE, maxResidue);
percentage = ((float) count * 100) / jSize;
- residueHash.put(PID_GAPS, Float.valueOf(percentage));
+ residueHash.put(PID_GAPS, new Float(percentage));
percentage = ((float) count * 100) / nongap;
- residueHash.put(PID_NOGAPS, Float.valueOf(percentage));
+ residueHash.put(PID_NOGAPS, new Float(percentage));
if (result[i] == null)
{
residueHash.put(PAIRPROFILE, pairs);
}
- residueHash.put(MAXCOUNT, Integer.valueOf(count));
+ residueHash.put(MAXCOUNT, new Integer(count));
residueHash.put(MAXRESIDUE, maxResidue);
percentage = ((float) count * 100) / jSize;
- residueHash.put(PID_GAPS, Float.valueOf(percentage));
+ residueHash.put(PID_GAPS, new Float(percentage));
percentage = ((float) count * 100) / nongap;
- residueHash.put(PID_NOGAPS, Float.valueOf(percentage));
+ residueHash.put(PID_NOGAPS, new Float(percentage));
result[bpEnd] = residueHash;
}
@Override
public ScoreModelI getInstance(AlignmentViewPanel view)
{
- FeatureDistanceModel instance;
+ FeatureDistanceModel model;
try
{
- instance = this.getClass().getDeclaredConstructor().newInstance();
- instance.configureFromAlignmentView(view);
- return instance;
+ model = this.getClass().newInstance();
+ model.configureFromAlignmentView(view);
+ return model;
} catch (InstantiationException | IllegalAccessException e)
{
System.err.println("Error in " + getClass().getName()
+ ".getInstance(): " + e.getMessage());
return null;
- } catch (ReflectiveOperationException roe)
- {
- return null;
}
}
protected Map<SeqCigar, Set<String>> findFeatureTypesAtColumn(
SeqCigar[] seqs, int columnPosition)
{
- Map<SeqCigar, Set<String>> sfap = new HashMap<>();
+ Map<SeqCigar, Set<String>> sfap = new HashMap<SeqCigar, Set<String>>();
for (SeqCigar seq : seqs)
{
int spos = seq.findPosition(columnPosition);
/*
* position is not a gap
*/
- Set<String> types = new HashSet<>();
+ Set<String> types = new HashSet<String>();
List<SequenceFeature> sfs = fr.findFeaturesAtResidue(
seq.getRefSeq(), spos);
for (SequenceFeature sf : sfs)
* score matrix (JAL-2397)
* Set this flag to true (via Groovy) for 2.10.1 behaviour
*/
- private static boolean scoreGapAsAny = false;
+ // BH 2019.05.08 was static but not ever set
+ private boolean scoreGapAsAny = false;
public static final short UNMAPPED = (short) -1;
import jalview.api.AlignmentViewPanel;
import jalview.api.analysis.ScoreModelI;
+import jalview.bin.ApplicationSingletonProvider;
+import jalview.bin.ApplicationSingletonProvider.ApplicationSingletonI;
import jalview.io.DataSourceType;
import jalview.io.FileParse;
import jalview.io.ScoreMatrixFile;
/**
* A class that can register and serve instances of ScoreModelI
*/
-public class ScoreModels
+public class ScoreModels implements ApplicationSingletonI
{
- private final ScoreMatrix BLOSUM62;
-
- private final ScoreMatrix PAM250;
-
- private final ScoreMatrix DNA;
-
- private static ScoreModels instance;
-
- private Map<String, ScoreModelI> models;
-
/**
* Answers the singleton instance of this class, with lazy initialisation
* (built-in score models are loaded on the first call to this method)
*/
public static ScoreModels getInstance()
{
- if (instance == null)
- {
- instance = new ScoreModels();
- }
- return instance;
+ return (ScoreModels) ApplicationSingletonProvider.getInstance(ScoreModels.class);
}
/**
registerScoreModel(new FeatureDistanceModel());
}
+ private final ScoreMatrix BLOSUM62;
+
+ private final ScoreMatrix PAM250;
+
+ private final ScoreMatrix DNA;
+
+ private Map<String, ScoreModelI> models;
+
/**
* Tries to load a score matrix from the given resource file, and if
* successful, registers it.
*/
public void reset()
{
- instance = new ScoreModels();
+ ApplicationSingletonProvider.removeInstance(this.getClass());
}
/**
private boolean denominateByShortestLength;
+
/**
* Constructor
*
denominateByShortestLength = shortestLength;
}
+ /**
+ * BH added a non-Groovy "standard" set for JalviewJS
+ *
+ * @param isPCA
+ */
+ public SimilarityParams(boolean isPCA)
+ {
+ includeGappedColumns = true;
+ matchGaps = !isPCA;
+ includeGaps = true;
+ denominateByShortestLength = false;
+ }
+
@Override
public boolean includeGaps()
{
--- /dev/null
+package jalview.api;
+
+/**
+ * Common methods for jalview.appletgui.AlignFrame and jalview.gui.AlignFrame in
+ * relation to JalviewJS and the JalviewLiteJSApi
+ *
+ * @author hansonr
+ *
+ */
+public interface AlignFrameI
+{
+
+}
* sub-groups, which may have their own colour schemes). A null value is used
* for no residue colour (white).
*
+ * BH Note: It is critical that any call to
+ * AlignViewportI.setGlobalColourScheme is followed closely, if not
+ * immediately, by a call to AlignPanel.repaint(true, true) so that the
+ * overview is updated. When that happens, the sequence overview color caches
+ * are cleared.
+ *
* @param cs
*/
void setGlobalColourScheme(ColourSchemeI cs);
*/
package jalview.api;
+import java.util.BitSet;
+
public interface AlignmentColsCollectionI extends Iterable<Integer>
{
/**
* @return true if there is at least 1 hidden column
*/
public boolean hasHidden();
+
+ /**
+ * Get the visible-column bitset, possibly containing hidden columns (which
+ * may or may not be hidden in the overview).
+ *
+ * @return a BitSet
+ */
+ public BitSet getOverviewBitSet();
+
+ /**
+ * Get the hidden-column bitset, (which may or may not be hidden in the
+ * overview).
+ *
+ * @return
+ */
+ BitSet getHiddenBitSet();
}
import jalview.datamodel.AlignmentI;
import jalview.structure.StructureSelectionManager;
+import java.awt.image.BufferedImage;
+
/**
* abstract interface implemented by alignment panels holding an alignment view
*
* @return displayed name for the view
*/
String getViewName();
+
+ SequenceRenderer getSequenceRenderer();
+
+ void overviewDone(BufferedImage miniMe);
+
}
Color getNoColour();
/**
- * Answers true if the feature has a single colour, i.e. if isColourByLabel()
- * and isGraduatedColour() both answer false
+ * Answers true if the feature has a single colour
*
- * @return
+ * @return true iff not (isColourByLabel() || isGraduatedColour())
*/
boolean isSimpleColour();
List<String> getFeatureGroups();
/**
- * get groups that are visible/invisible
+ * get groups that are visible/invisible -- JalviewLite only?
*
* @param visible
* @return
List<String> getGroups(boolean visible);
/**
- * Set visibility for a list of groups
+ * Set visibility for a list of groups -- JalviewLite only?
*
* @param toset
* @param visible
--- /dev/null
+package jalview.api;
+
+import jalview.datamodel.ColumnSelection;
+import jalview.datamodel.HiddenColumns;
+import jalview.datamodel.PDBEntry;
+import jalview.datamodel.SequenceGroup;
+import jalview.datamodel.SequenceI;
+import jalview.io.DataSourceType;
+import jalview.io.NewickFile;
+import jalview.javascript.JSFunctionExec;
+import jalview.javascript.MouseOverStructureListener;
+import jalview.structure.SelectionSource;
+import jalview.structure.VamsasSource;
+
+import java.applet.AppletContext;
+import java.io.IOException;
+import java.net.URL;
+import java.util.Hashtable;
+import java.util.Vector;
+
+import netscape.javascript.JSObject;
+
+public interface JalviewApp
+{
+ public String getParameter(String name);
+
+ public boolean getDefaultParameter(String name, boolean def);
+
+ public URL getDocumentBase();
+
+ public URL getCodeBase();
+
+ public void setAlignPdbStructures(boolean defaultParameter);
+
+ public void newStructureView(PDBEntry pdb, SequenceI[] seqs,
+ String[] chains, DataSourceType protocol);
+
+ public void alignedStructureView(PDBEntry[] pdb, SequenceI[][] seqs,
+ String[][] chains, String[] protocols);
+
+ public void updateForAnnotations();
+
+ public AlignViewportI getViewport();
+
+ public void setFeatureGroupState(String[] groups, boolean state);
+
+ public boolean parseFeaturesFile(String param, DataSourceType protocol);
+
+ public void newFeatureSettings();
+
+ public boolean loadScoreFile(String sScoreFile) throws IOException;
+
+ public void loadTree(NewickFile fin, String treeFile) throws IOException;
+
+ public Vector<Runnable> getJsExecQueue(JSFunctionExec jsFunctionExec);
+
+ public AppletContext getAppletContext();
+
+ public boolean isJsfallbackEnabled();
+
+ public JSObject getJSObject();
+
+ public StructureSelectionManagerProvider getStructureSelectionManagerProvider();
+
+ public void updateColoursFromMouseOver(Object source,
+ MouseOverStructureListener mouseOverStructureListener);
+
+ public Object[] getSelectionForListener(SequenceGroup seqsel, ColumnSelection colsel,
+ HiddenColumns hidden, SelectionSource source, Object alignFrame);
+
+ public String arrayToSeparatorList(String[] array);
+
+ public Hashtable<String, int[]> getJSHashes();
+
+ Hashtable<String, Hashtable<String, String[]>> getJSMessages();
+
+ public Object getFrameForSource(VamsasSource source);
+
+ public jalview.renderer.seqfeatures.FeatureRenderer getNewFeatureRenderer(
+ AlignViewportI vp);
+
+}
import jalview.analysis.TreeBuilder;
import jalview.analysis.scoremodels.PIDModel;
import jalview.analysis.scoremodels.ScoreModels;
+import jalview.api.AlignFrameI;
import jalview.api.AlignViewControllerGuiI;
import jalview.api.AlignViewControllerI;
import jalview.api.AlignViewportI;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.IOException;
-import java.io.UnsupportedEncodingException;
import java.net.URL;
import java.net.URLEncoder;
import java.util.Arrays;
import org.jmol.viewer.Viewer;
-public class AlignFrame extends EmbmenuFrame implements ActionListener,
+public class AlignFrame extends EmbmenuFrame implements AlignFrameI,
+ ActionListener,
ItemListener, KeyListener, AlignViewControllerGuiI
{
public AlignViewControllerI avc;
}
else if (source == autoCalculate)
{
- viewport.autoCalculateConsensus = autoCalculate.getState();
+ viewport.setAutoCalculateConsensusAndConservation(autoCalculate.getState());
}
else if (source == sortByTree)
{
try
{
new URL(url);
- url = URLEncoder.encode(url, "UTF-8");
+ url = URLEncoder.encode(url);
}
/*
* When we finally deprecate 1.1 compatibility, we can start to use
{
url = viewport.applet.getCodeBase() + url;
}
- catch (UnsupportedEncodingException ex)
- {
- System.err.println(
- "WARNING = IMPLEMENTATION ERROR - UNSUPPORTED ENCODING EXCEPTION FOR "
- + url);
- ex.printStackTrace();
- }
return url;
}
{
try
{
- widthScale = Float.valueOf(param).floatValue();
+ widthScale = new Float(param).floatValue();
} catch (Exception e)
{
}
{
try
{
- heightScale = Float.valueOf(param).floatValue();
+ heightScale = new Float(param).floatValue();
} catch (Exception e)
{
}
import java.awt.event.AdjustmentListener;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
+import java.awt.image.BufferedImage;
import java.beans.PropertyChangeEvent;
import java.util.List;
return av;
}
+ @Override
public SequenceRenderer getSequenceRenderer()
{
return seqPanel.seqCanvas.sr;
}
+ @Override
+ public void overviewDone(BufferedImage miniMe)
+ {
+ overviewPanel.canvas.finalizeDraw(miniMe);
+ }
+
}
import jalview.datamodel.AlignmentAnnotation;
import jalview.datamodel.SequenceGroup;
+import jalview.gui.Preferences;
import jalview.schemes.AnnotationColourGradient;
import jalview.schemes.ColourSchemeI;
import jalview.util.MessageManager;
private void setDefaultMinMax()
{
minColour.setBackground(av.applet.getDefaultColourParameter(
- "ANNOTATIONCOLOUR_MIN", Color.orange));
+ Preferences.ANNOTATIONCOLOUR_MIN, Color.orange));
maxColour.setBackground(av.applet
- .getDefaultColourParameter("ANNOTATIONCOLOUR_MAX", Color.red));
+ .getDefaultColourParameter(Preferences.ANNOTATIONCOLOUR_MAX, Color.red));
}
{
try
{
- float f = Float.valueOf(thresholdValue.getText()).floatValue();
+ float f = new Float(thresholdValue.getText()).floatValue();
slider.setValue((int) (f * 1000));
adjustmentValueChanged(null);
} catch (NumberFormatException ex)
.getAlignmentAnnotation();
// DETECT RIGHT MOUSE BUTTON IN AWT
- if ((evt.getModifiersEx()
- & InputEvent.BUTTON3_DOWN_MASK) == InputEvent.BUTTON3_DOWN_MASK)
+ if ((evt.getModifiers()
+ & InputEvent.BUTTON3_MASK) == InputEvent.BUTTON3_MASK)
{
PopupMenu popup = new PopupMenu(
}
}
- if ((evt.getModifiersEx()
- & InputEvent.BUTTON3_DOWN_MASK) == InputEvent.BUTTON3_DOWN_MASK
+ if ((evt.getModifiers()
+ & InputEvent.BUTTON3_MASK) == InputEvent.BUTTON3_MASK
&& activeRow != -1)
{
if (av.getColumnSelection() == null
*
*/
@SuppressWarnings("serial")
-public class EmbmenuFrame extends Frame
- implements MouseListener, AutoCloseable
+public class EmbmenuFrame extends Frame implements MouseListener
{
protected static final Font FONT_ARIAL_PLAIN_11 = new Font("Arial",
Font.PLAIN, 11);
/**
* map from labels to popup menus for the embedded menubar
*/
- protected Map<Label, PopupMenu> embeddedPopup = new HashMap<>();
+ protected Map<Label, PopupMenu> embeddedPopup = new HashMap<Label, PopupMenu>();
/**
* the embedded menu is built on this and should be added to the frame at the
return embeddedMenu;
}
- @Override
public void mousePressed(MouseEvent evt)
{
PopupMenu popup = null;
return embeddedPopup.get(source);
}
- @Override
public void mouseClicked(MouseEvent evt)
{
}
- @Override
public void mouseReleased(MouseEvent evt)
{
}
- @Override
public void mouseEntered(MouseEvent evt)
{
}
- @Override
public void mouseExited(MouseEvent evt)
{
}
/**
* calls destroyMenus()
*/
- @Override
- public void close()
+ public void finalize() throws Throwable
{
destroyMenus();
embeddedPopup = null;
embeddedMenu = null;
- // no close for Frame
- // super.finalize();
+ super.finalize();
}
}
{
try
{
- float f = Float.valueOf(thresholdValue.getText()).floatValue();
+ float f = new Float(thresholdValue.getText()).floatValue();
slider.setValue((int) (f * SCALE_FACTOR_1K));
adjustmentValueChanged(null);
public void mouseClicked(MouseEvent evt)
{
MyCheckbox check = (MyCheckbox) evt.getSource();
- if ((evt.getModifiersEx() & InputEvent.BUTTON3_DOWN_MASK) != 0)
+ if ((evt.getModifiers() & InputEvent.BUTTON3_MASK) != 0)
{
this.popupSort(check, fr.getMinMax(), evt.getX(), evt.getY());
}
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Frame;
-import java.awt.GraphicsEnvironment;
import java.awt.Label;
import java.awt.Panel;
+import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
*/
void init()
{
- // String fonts[] = Toolkit.getDefaultToolkit().getFontList();
- String fonts[] = GraphicsEnvironment.getLocalGraphicsEnvironment()
- .getAvailableFontFamilyNames();
+ String fonts[] = Toolkit.getDefaultToolkit().getFontList();
for (int i = 0; i < fonts.length; i++)
{
fontName.addItem(fonts[i]);
int seq = alignPanel.seqPanel.findSeq(e);
- if ((e.getModifiersEx()
- & InputEvent.BUTTON3_DOWN_MASK) == InputEvent.BUTTON3_DOWN_MASK)
+ if ((e.getModifiers()
+ & InputEvent.BUTTON3_MASK) == InputEvent.BUTTON3_MASK)
{
SequenceI sq = av.getAlignment().getSequenceAt(seq);
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Image;
+import java.awt.image.BufferedImage;
+@SuppressWarnings("serial")
public class OverviewCanvas extends Component
{
// This is set true if the alignment view changes whilst
private AlignViewport av;
+ private boolean showSequenceFeatures;
+
+ private boolean showAnnotation;
+
+ private jalview.api.FeatureRenderer featureRenderer;
+
private jalview.renderer.seqfeatures.FeatureRenderer fr;
private Frame nullFrame;
- public OverviewCanvas(OverviewDimensions overviewDims,
+ private OverviewPanel panel;
+
+ public OverviewCanvas(OverviewPanel panel,
+ OverviewDimensions overviewDims,
AlignViewport alignvp)
{
+ this.panel = panel;
od = overviewDims;
av = alignvp;
}
public void draw(boolean showSequenceFeatures, boolean showAnnotation,
- FeatureRenderer transferRenderer)
+ jalview.api.FeatureRenderer featureRenderer)
{
- miniMe = null;
+ this.showSequenceFeatures = showSequenceFeatures;
+ this.showAnnotation = showAnnotation;
+ this.featureRenderer = featureRenderer;
if (showSequenceFeatures)
{
- fr.transferSettings(transferRenderer);
+ fr.transferSettings(featureRenderer);
}
setPreferredSize(new Dimension(od.getWidth(), od.getHeight()));
- or = new OverviewRenderer(fr, od, av.getAlignment(),
+ or = new OverviewRenderer(panel.ap, fr, od, av.getAlignment(),
av.getResidueShading(), new OverviewResColourFinder());
- miniMe = nullFrame.createImage(od.getWidth(), od.getHeight());
offscreen = nullFrame.createImage(od.getWidth(), od.getHeight());
-
- miniMe = or.draw(od.getRows(av.getAlignment()),
- od.getColumns(av.getAlignment()));
-
- Graphics mg = miniMe.getGraphics();
-
- // checks for conservation annotation to make sure overview works for DNA
- // too
- if (showAnnotation)
- {
- mg.translate(0, od.getSequencesHeight());
- or.drawGraph(mg, av.getAlignmentConservationAnnotation(),
- od.getGraphHeight(), od.getColumns(av.getAlignment()));
- mg.translate(0, -od.getSequencesHeight());
- }
-
- if (restart)
- {
- restart = false;
- draw(showSequenceFeatures, showAnnotation, transferRenderer);
- }
- else
- {
- updaterunning = false;
- }
+ or.drawMiniMe();
}
@Override
@Override
public void paint(Graphics g)
{
- Graphics og = offscreen.getGraphics();
if (miniMe != null)
{
+ Graphics og = offscreen.getGraphics();
og.drawImage(miniMe, 0, 0, this);
og.setColor(Color.red);
od.drawBox(og);
g.drawImage(offscreen, 0, 0, this);
+ og.dispose();
}
}
od = null;
}
+ public void finalizeDraw(BufferedImage miniMe)
+ {
+ if (restart)
+ {
+ restart = false;
+ draw(showSequenceFeatures, showAnnotation, featureRenderer);
+ }
+ else
+ {
+ this.miniMe = miniMe;
+ // checks for conservation annotation to make sure overview works for DNA
+ // too
+ if (showAnnotation)
+ {
+ or.drawGraph(av.getAlignmentConservationAnnotation());
+ }
+ updaterunning = false;
+ repaint();
+ }
+ }
+
}
import javax.swing.SwingUtilities;
+@SuppressWarnings("serial")
public class OverviewPanel extends Panel implements Runnable,
MouseMotionListener, MouseListener, ViewportListenerI
{
- private OverviewDimensions od;
+ OverviewDimensions od;
- private OverviewCanvas oviewCanvas;
+ OverviewCanvas canvas;
private AlignViewport av;
- private AlignmentPanel ap;
+ AlignmentPanel ap;
private boolean showHidden = true;
(av.isShowAnnotation()
&& av.getSequenceConsensusHash() != null));
- oviewCanvas = new OverviewCanvas(od, av);
+ canvas = new OverviewCanvas(this, od, av);
setLayout(new BorderLayout());
- add(oviewCanvas, BorderLayout.CENTER);
+ add(canvas, BorderLayout.CENTER);
setSize(new Dimension(od.getWidth(), od.getHeight()));
@Override
public void mouseClicked(MouseEvent evt)
{
- if ((evt.getModifiersEx()
- & InputEvent.BUTTON3_DOWN_MASK) == InputEvent.BUTTON3_DOWN_MASK)
+ if ((evt.getModifiers()
+ & InputEvent.BUTTON3_MASK) == InputEvent.BUTTON3_MASK)
{
showPopupMenu(evt);
}
@Override
public void mousePressed(MouseEvent evt)
{
- if ((evt.getModifiersEx()
- & InputEvent.BUTTON3_DOWN_MASK) == InputEvent.BUTTON3_DOWN_MASK)
+ if ((evt.getModifiers()
+ & InputEvent.BUTTON3_MASK) == InputEvent.BUTTON3_MASK)
{
if (!Platform.isMac()) // BH was excluding JavaScript
{
@Override
public void mouseDragged(MouseEvent evt)
{
- if (Platform.isWinRightButton(evt))
+ if (Platform.isWinRightButton(evt))
{
- if ((evt.getModifiersEx()
- & InputEvent.BUTTON3_DOWN_MASK) == InputEvent.BUTTON3_DOWN_MASK)
- {
- showPopupMenu(evt);
- return;
- }
+ showPopupMenu(evt);
+ return;
}
if (SwingUtilities.isRightMouseButton(evt))
*/
public void updateOverviewImage()
{
- if (oviewCanvas == null)
+ if (canvas == null)
{
/*
* panel has been disposed
{
if (updateRunning)
{
- oviewCanvas.restartDraw();
+ canvas.restartDraw();
return;
}
@Override
public void run()
{
- oviewCanvas.draw(av.isShowSequenceFeatures(),
+ setBoxPosition();
+ canvas.draw(av.isShowSequenceFeatures(),
(av.isShowAnnotation()
&& av.getAlignmentConservationAnnotation() != null),
ap.seqPanel.seqCanvas.getFeatureRenderer());
- setBoxPosition();
}
/**
(av.isShowAnnotation()
&& av.getAlignmentConservationAnnotation() != null));
}
- oviewCanvas.resetOviewDims(od);
+ canvas.resetOviewDims(od);
updateOverviewImage();
}
} finally
{
av = null;
- if (oviewCanvas != null)
+ if (canvas != null)
{
- oviewCanvas.dispose();
+ canvas.dispose();
}
- oviewCanvas = null;
+ canvas = null;
ap = null;
od = null;
}
min = res;
max = res;
- if ((evt.getModifiersEx()
- & InputEvent.BUTTON3_DOWN_MASK) == InputEvent.BUTTON3_DOWN_MASK)
+ if ((evt.getModifiers()
+ & InputEvent.BUTTON3_MASK) == InputEvent.BUTTON3_MASK)
{
rightMouseButtonPressed(evt, res);
}
// For now, ignore the mouseWheel font resizing on Macs
// As the Button2_mask always seems to be true
+
if (Platform.isWinMiddleButton(evt))
{
mouseWheelPressed = true;
}
// DETECT RIGHT MOUSE BUTTON IN AWT
- if ((evt.getModifiersEx()
- & InputEvent.BUTTON3_DOWN_MASK) == InputEvent.BUTTON3_DOWN_MASK)
+ if ((evt.getModifiers()
+ & InputEvent.BUTTON3_MASK) == InputEvent.BUTTON3_MASK)
{
List<SequenceFeature> allFeatures = findFeaturesAtColumn(sequence,
sequence.findPosition(column + 1));
import java.awt.event.ItemListener;
public class TreePanel extends EmbmenuFrame
- implements ActionListener, ItemListener, AutoCloseable
+ implements ActionListener, ItemListener
{
SequenceI[] seq;
}
@Override
- public void close()
+ public void finalize() throws Throwable
{
ap = null;
av = null;
- super.close();
+ super.finalize();
}
/**
--- /dev/null
+package jalview.bin;
+
+import jalview.gui.Preferences;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Vector;
+
+/**
+ * Collection of all known applet tags from JalviewLite
+ *
+ * @author hansonr
+ *
+ */
+@SuppressWarnings("serial")
+public class AppletParams extends HashMap<String, String>
+{
+
+ private final static String[] params = { "alignpdbfiles",
+ Preferences.ANNOTATIONCOLOUR_MAX, Preferences.ANNOTATIONCOLOUR_MIN,
+ "annotations",
+ "APPLICATION_URL", "automaticScrolling", "centrecolumnlabels",
+ "debug", "defaultColour", "defaultColourNuc", "defaultColourProt",
+ "embedded", "enableSplitFrame", "externalstructureviewer", "features",
+ "file", "file2", "format", "heightScale", "hidefeaturegroups",
+ "jalviewhelpurl", "jnetfile", "jpredfile", "label", "linkLabel_",
+ "linkLabel_1", "linkURL_", "nojmol", "normaliseLogo",
+ "normaliseSequenceLogo", "oninit", "PDBFILE", "PDBSEQ",
+ "relaxedidmatch", "resolvetocodebase", "RGB", "scaleProteinAsCdna",
+ "scoreFile", "separator", "sequence", "showAnnotation", "showbutton",
+ "showConsensus", "showConsensusHistogram", "showConservation",
+ "showfeaturegroups", "showFeatureSettings", "showFullId",
+ "showGroupConsensus", "showGroupConservation", "showOccupancy",
+ "showQuality", "showSequenceLogo", "showTreeBootstraps",
+ "showTreeDistances", "showUnconserved", "showUnlinkedTreeNodes",
+ "sortBy", "sortByTree", "tree", "treeFile", "upperCase",
+ "userDefinedColour", "widthScale", "windowHeight", "windowWidth",
+ "wrap", };
+
+ public AppletParams(Map<String, String> info)
+ {
+ for (int i = params.length; --i >= 0;)
+ {
+ put(params[i], info.get(params[i]));
+ }
+ }
+
+ public String getParam(String param, String def)
+ {
+ String val = get(param);
+ return (val != null ? val : def);
+ }
+
+ // <applet
+ // code="jalview.bin.JalviewLite" width="140" height="35"
+ // archive="jalviewApplet.jar,JmolApplet-14.6.4_2016.10.26.jar,java-json.jar,json_simple-1.1.jar">
+ // <param name="permissions" value="sandbox"/>
+ // <param name="file" value="uniref50.fa"/>
+ // <param name="treeFile" value="ferredoxin.nw"/>
+ // <param name="userDefinedColour" value="C=yellow; R,K,H=FF5555;
+ // D,E=5555FF"/>
+ // <param name="sortByTree" value="True"/>
+ // <param name="showSequenceLogo" value="true"/>
+ // <param name="showGroupConsensus" value="true"/>
+ // <param name="showFullId" value="false"/>
+ // <param name="linkLabel_1" value="Uniprot"/>
+ // <param name="linkUrl_1"
+ // value="http://www.uniprot.org/uniprot/$SEQUENCE_ID$"/>
+ // <param name="linkLabel_2" value="EMBL-EBI Search"/>
+ // <param name="linkUrl_2"
+ // value="http://www.ebi.ac.uk/ebisearch/search.ebi?db=allebi&query=$SEQUENCE_ID$"/>
+ // <param name="APPLICATION_URL"
+ // value="http://www.jalview.org/services/launchApp"/>
+ // </applet>
+ //
+ public AppletParams(String outerHTML)
+ {
+ String[] tokens = outerHTML.split("<param");
+ outerHTML = tokens[0];
+ String code = getAttr(outerHTML, "code");
+ if (!code.equals("jalview.bin.JalviewLite"))
+ {
+ return;
+ }
+ for (int i = tokens.length; --i > 0;)
+ {
+ String param = tokens[i];
+ String key = getAttr(param, "name");
+ if (key != null)
+ {
+ String value = getAttr(param, "value");
+ System.out.println("AppletParams " + key + " = \"" + value + "\"");
+ put(key, value);
+ }
+ }
+ put("_width", getAttr(outerHTML, "width"));
+ put("_height", getAttr(outerHTML, "height"));
+ put("_id", getAttr(outerHTML, "id"));
+ put("_name", getAttr(outerHTML, "name"));
+ put("_archive", getAttr(outerHTML, "archive"));
+ put("_code", code);
+ }
+
+ public AppletParams()
+ {
+ // TODO Auto-generated constructor stub
+ }
+
+ public static AppletParams getAppletParams(String[] args,
+ Vector<String> vargs)
+ {
+ AppletParams appletParams = new AppletParams();
+ String resourcePath = null;
+ for (int i = args.length; --i > 0;) // > 0 is correct, not >=0
+ {
+ if (args[i].startsWith("name=\"Info.resourcePath\""))
+ {
+ resourcePath = getAttr(args[i], "value");
+ if (resourcePath.length() > 0 && !resourcePath.endsWith("/"))
+ {
+ resourcePath += "/";
+ }
+ break;
+ }
+ }
+ for (int i = 1; i < args.length; i++)
+ {
+ String arg = args[i].trim();
+ if (arg.startsWith("name="))
+ {
+ String prefName = getAttr(arg, "name");
+ String appletName = prefName.toLowerCase();
+ String argName = prefName;
+ String value = getAttr(arg, "value");
+
+ // note that Application arguments ARE case-sensitive, but
+ // Applet.getParameter() is not.
+
+ switch (appletName)
+ {
+
+ case "file":
+ argName = "open";
+ appletName = null;
+ value = resourcePath + value;
+ break;
+ case "file2":
+ argName = "open2";
+ prefName = null;
+ value = resourcePath + value;
+ break;
+ case "features":
+ case "jnetfile":
+ case "jpredfile":
+ case "pdbfile":
+ case "scorefile":
+ case "sequence":
+ // setting argName to null indicates that we want
+ // JalviewAppLoader to take care of this.
+ prefName = argName = null;
+ value = resourcePath + value;
+ break;
+ case "tree":
+ case "treefile":
+ // setting appletName to null indicates that we want
+ // Jalview.doMain to taken care of this as Jalview args
+ argName = "tree";
+ appletName = null;
+ value = resourcePath + value;
+ break;
+
+ // non-loading preferences
+
+ case "defaultcolour":
+ prefName = Preferences.DEFAULT_COLOUR;
+ break;
+ case "defaultcolournuc":
+ prefName = Preferences.DEFAULT_COLOUR_NUC;
+ break;
+ case "defaultcolourprot":
+ prefName = Preferences.DEFAULT_COLOUR_PROT;
+ break;
+ case "annotationcolour_max":
+ prefName = Preferences.ANNOTATIONCOLOUR_MAX;
+ break;
+ case "annotationcolour_min":
+ prefName = Preferences.ANNOTATIONCOLOUR_MIN;
+ break;
+ case "enablesplitframe":
+ prefName = Preferences.ENABLE_SPLIT_FRAME;
+ break;
+ case "centrecolumnlabels":
+ prefName = Preferences.CENTRE_COLUMN_LABELS;
+ break;
+ case "sortby":
+ prefName = Preferences.SORT_ALIGNMENT; // id, etc.
+ break;
+ case "normalisesequencelogo":
+ prefName = Preferences.NORMALISE_CONSENSUS_LOGO;
+ break;
+ case "relaxedidmatch":
+ prefName = Preferences.RELAXEDSEQIDMATCHING;
+ break;
+ case "scaleproteinascdna":
+ prefName = Preferences.SCALE_PROTEIN_TO_CDNA;
+ break;
+ case "userdefinedcolour":
+ argName = "colour";
+ prefName = Preferences.USER_DEFINED_COLOURS;
+ break;
+ case "wrap":
+ prefName = Preferences.WRAP_ALIGNMENT;
+ break;
+
+ // implemented; not tested:
+
+ case "oninit":
+ prefName = null;
+ break;
+ case "annotations":
+ value = resourcePath + value;
+ argName = null;
+ break;
+ case "hidefeaturegroups":
+ // TODO
+ break;
+ case "pdbseq":
+ argName = prefName = null;
+ break;
+ case "sortbytree":
+ prefName = Preferences.SORT_BY_TREE;
+ value = checkTF(value);
+ appletName = null; // taken care of by Jalview
+ break;
+ case "format":
+ break;
+ case "alignpdbfiles":
+ argName = prefName = null;
+ break;
+ case "separator":
+ break;
+
+ // TODO: probably not relevant?
+
+ case "rgb":
+ prefName = null; // TODO no background for application?
+ break;
+ case "externalstructureviewer":
+ break;
+ case "application_url":
+ break;
+ case "automaticscrolling":
+ break;
+ case "heightscale":
+ break;
+ case "jalviewhelpurl":
+ break;
+ case "label":
+ break;
+ case "linklabel_":
+ prefName = "linkLabel_";
+ break;
+ case "linklabel_1":
+ prefName = "linkLabel_1";
+ break;
+ case "linkurl_":
+ prefName = "linkURL_";
+ break;
+
+ // unknown:
+
+ case "nojmol":
+ case "normaliselogo":
+ case "resolvetocodebase":
+ case "uppercase":
+ case "widthscale":
+ case "windowheight":
+ case "windowwidth":
+ argName = prefName = null;
+ break;
+
+ // TRUE/FALSE
+
+ case "debug":
+ value = checkTF(value);
+ break;
+ case "embedded":
+ value = checkTF(value);
+ break;
+ case "showbutton":
+ value = checkTF(value);
+ break;
+ case "showannotation":
+ prefName = Preferences.SHOW_ANNOTATIONS;
+ value = checkTF(value);
+ break;
+ case "showconsensus":
+ prefName = Preferences.SHOW_CONSENSUS_LOGO;
+ value = checkTF(value);
+ break;
+ case "showconsensushistogram":
+ prefName = Preferences.SHOW_CONSENSUS_HISTOGRAM;
+ value = checkTF(value);
+ break;
+ case "showconservation":
+ prefName = Preferences.SHOW_CONSERVATION;
+ value = checkTF(value);
+ break;
+ case "showgroupconsensus":
+ prefName = Preferences.SHOW_GROUP_CONSENSUS;
+ value = checkTF(value);
+ break;
+ case "showgroupconservation":
+ prefName = Preferences.SHOW_GROUP_CONSERVATION;
+ value = checkTF(value);
+ break;
+ case "showoccupancy":
+ prefName = Preferences.SHOW_OCCUPANCY;
+ value = checkTF(value);
+ break;
+ case "showquality":
+ prefName = Preferences.SHOW_QUALITY;
+ value = checkTF(value);
+ break;
+ case "showsequencelogo":
+ prefName = Preferences.SHOW_CONSENSUS_LOGO;
+ value = checkTF(value);
+ break;
+ case "showfeaturegroups":
+ value = checkTF(value);
+ break;
+ case "showfeaturesettings":
+ value = checkTF(value);
+ break;
+ case "showfullid":
+ value = checkTF(value);
+ break;
+ case "showtreebootstraps":
+ value = checkTF(value);
+ break;
+ case "showtreedistances":
+ value = checkTF(value);
+ break;
+ case "showunconserved":
+ prefName = Preferences.SHOW_UNCONSERVED;
+ value = checkTF(value);
+ break;
+ case "showunlinkedtreenodes":
+ value = checkTF(value);
+ break;
+ default:
+ if (appletName.startsWith("pdbfile")
+ || appletName.startsWith("sequence") && Character.isDigit(
+ appletName.charAt(appletName.length() - 1)))
+ {
+ // could be pdbFile2, for example
+ prefName = argName = null;
+ value = resourcePath + value;
+ break;
+ }
+ // or one of the app preference names
+ break;
+ }
+ // put name and value into application args
+ if (value != null && argName != null)
+ {
+ vargs.add(argName);
+ if (value != "true")
+ {
+ vargs.add(value);
+ }
+ }
+ if (value == null)
+ {
+ value = "false";
+ }
+ System.out.println("AppletParams propName=" + prefName + " argName="
+ + argName + " appletName="
+ + appletName + " value=" + value);
+ if (appletName != null)
+ {
+ appletParams.put(appletName, value);
+ }
+ if (prefName != null)
+ {
+ Cache.setPropertyNoSave(prefName, value);
+ }
+ }
+ }
+ return appletParams;
+ }
+
+ /**
+ * Check for a single-argument option.
+ *
+ * @param value
+ * @return "true" or null
+ */
+ private static String checkTF(String value)
+ {
+ return (value.toLowerCase() == "true" ? "true" : null);
+ }
+
+ /**
+ * Crude applet innerHTML parser
+ *
+ * @param tag
+ * @param attr
+ * @return
+ */
+ private static String getAttr(String tag, String attr)
+ {
+ int pt = tag.indexOf(attr + "=\"");
+ if (pt < 0)
+ {
+ System.out
+ .println("AppletParams did not read " + attr + " in " + tag);
+ return null;
+ }
+ // <param name="sortByTree" value="True"/>
+ int pt1 = pt + attr.length() + 2;
+ int pt2 = tag.indexOf("\"", pt1);
+ return (pt < 0 ? null : tag.substring(pt1, pt2));
+ }
+
+ public static void main(String[] args)
+ {
+ new AppletParams("<applet\r\n"
+ + " code=\"jalview.bin.JalviewLite\" width=\"140\" height=\"35\"\r\n"
+ + " archive=\"jalviewApplet.jar,JmolApplet-14.6.4_2016.10.26.jar,java-json.jar,json_simple-1.1.jar\"> \r\n"
+ + " <param name=\"permissions\" value=\"sandbox\"/>\r\n"
+ + " <param name=\"file\" value=\"uniref50.fa\"/>\r\n"
+ + " <param name=\"treeFile\" value=\"ferredoxin.nw\"/>\r\n"
+ + " <param name=\"userDefinedColour\" value=\"C=yellow; R,K,H=FF5555; D,E=5555FF\"/>\r\n"
+ + " <param name=\"sortByTree\" value=\"True\"/>\r\n"
+ + " <param name=\"showSequenceLogo\" value=\"true\"/>\r\n"
+ + " <param name=\"showGroupConsensus\" value=\"true\"/>\r\n"
+ + " <param name=\"showFullId\" value=\"false\"/>\r\n"
+ + " <param name=\"linkLabel_1\" value=\"Uniprot\"/>\r\n"
+ + " <param name=\"linkUrl_1\" value=\"http://www.uniprot.org/uniprot/$SEQUENCE_ID$\"/>\r\n"
+ + " <param name=\"linkLabel_2\" value=\"EMBL-EBI Search\"/>\r\n"
+ + " <param name=\"linkUrl_2\" value=\"http://www.ebi.ac.uk/ebisearch/search.ebi?db=allebi&query=$SEQUENCE_ID$\"/>\r\n"
+ + " <param name=\"APPLICATION_URL\" value=\"http://www.jalview.org/services/launchApp\"/>\r\n"
+ + " </applet>");
+ }
+
+}
\ No newline at end of file
--- /dev/null
+/*
+ * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
+ * Copyright (C) $$Year-Rel$$ The Jalview Authors
+ *
+ * This file is part of Jalview.
+ *
+ * Jalview is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation, either version 3
+ * of the License, or (at your option) any later version.
+ *
+ * Jalview is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Jalview. If not, see <http://www.gnu.org/licenses/>.
+ * The Jalview Authors are detailed in the 'AUTHORS' file.
+ */
+package jalview.bin;
+
+import jalview.util.Platform;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * A class to hold singleton objects, whose scope (context) is
+ * <ul>
+ * <li>the Java runtime (JVM) when running as Java</li>
+ * <li>one 'applet', when running as JalviewJS</li>
+ * </ul>
+ * This allows separation of multiple JS applets running on the same browser
+ * page, each with their own 'singleton' instances.
+ * <p>
+ * Instance objects are held in a separate Map (keyed by Class) for each
+ * context. For Java, this is just a single static Map. For SwingJS, the map is
+ * stored as a field {@code _swingjsSingletons} of
+ * {@code Thread.currentThread.getThreadGroup()}, as a proxy for the applet.
+ * <p>
+ * Note that when an applet is stopped, its ThreadGroup is removed, allowing any
+ * singleton references to be garbage collected.
+ *
+ * @author hansonr
+ */
+public class ApplicationSingletonProvider
+{
+ /**
+ * A tagging interface to mark classes whose singleton instances may be served
+ * by {@code ApplicationSingletonProvider}, giving a distinct instance per JS
+ * 'applet'.
+ * <p>
+ * A class whose singleton should have global scope (be shared across all
+ * applets on a page) should <em>not</em> use this mechanism, but just provide
+ * a single instance (class static member) in the normal way.
+ */
+ public interface ApplicationSingletonI
+ {
+ }
+
+ /*
+ * Map used to hold singletons in JVM context
+ */
+ private static Map<Class<? extends ApplicationSingletonI>, ApplicationSingletonI> singletons = new HashMap<>();
+
+ /**
+ * private constructor for non-instantiable class
+ */
+ private ApplicationSingletonProvider()
+ {
+ }
+
+ /**
+ * Returns the singletons map for the current context (JVM for Java,
+ * ThreadGroup for JS), creating the map on the first request for each JS
+ * ThreadGroup
+ *
+ * @return
+ */
+ private static Map<Class<? extends ApplicationSingletonI>, ApplicationSingletonI> getContextMap()
+ {
+ @SuppressWarnings("unused")
+ ThreadGroup g = (Platform.isJS()
+ ? Thread.currentThread().getThreadGroup()
+ : null);
+ Map<Class<? extends ApplicationSingletonI>, ApplicationSingletonI> map = singletons;
+ /** @j2sNative map = g._swingjsSingletons; */
+ if (map == null)
+ {
+ map = new HashMap<>();
+ /** @j2sNative g._swingjsSingletons = map; */
+ }
+
+ return map;
+ }
+
+ /**
+ * Answers the singleton instance of the given class for the current context
+ * (JVM or SwingJS 'applet'). If no instance yet exists, one is created, by
+ * calling the class's no-argument constructor. Answers null if any error
+ * occurs (or occurred previously for the same class).
+ *
+ * @param c
+ * @return
+ */
+ public static ApplicationSingletonI getInstance(Class<? extends ApplicationSingletonI> c)
+ {
+ Map<Class<? extends ApplicationSingletonI>, ApplicationSingletonI> map = getContextMap();
+ if (map.containsKey(c))
+ {
+ /*
+ * singleton already created _or_ creation failed (null value stored)
+ */
+ return map.get(c);
+ }
+
+ /*
+ * create and save the singleton
+ */
+ ApplicationSingletonI o = map.get(c);
+ try
+ {
+ Constructor<? extends ApplicationSingletonI> con = c
+ .getDeclaredConstructor();
+ con.setAccessible(true);
+ o = con.newInstance();
+ } catch (IllegalAccessException | InstantiationException
+ | IllegalArgumentException | InvocationTargetException
+ | NoSuchMethodException | SecurityException e)
+ {
+ Cache.log.error("Failed to create singleton for " + c.toString()
+ + ", error was: " + e.toString());
+ e.printStackTrace();
+ }
+
+ /*
+ * store the new singleton; note that a
+ * null value is saved if construction failed
+ */
+ getContextMap().put(c, o);
+
+ return o;
+ }
+
+ /**
+ * Removes the current singleton instance of the given class from the current
+ * application context. This has the effect of ensuring that a new instance is
+ * created the next time one is requested.
+ *
+ * @param c
+ */
+ public static void removeInstance(
+ Class<? extends ApplicationSingletonI> c)
+ {
+ Map<Class<? extends ApplicationSingletonI>, ApplicationSingletonI> map = getContextMap();
+ if (map != null)
+ {
+ map.remove(c);
+ }
+ }
+}
*/
public class ArgsParser
{
- Vector<String> vargs = null;
+
+ // BH 2019 - new
+
+ public static final String NOCALCULATION = "nocalculation";
+
+ public static final String NOMENUBAR = "nomenubar";
+
+ public static final String NOSTATUS = "nostatus";
+
+ public static final String SHOWOVERVIEW = "showoverview";
+
+ //
+ public static final String ANNOTATIONS = "annotations";
+
+ public static final String COLOUR = "colour";
+
+ public static final String FEATURES = "features";
+
+ public static final String GROOVY = "groovy";
+
+ public static final String GROUPS = "groups";
+
+ public static final String HEADLESS = "headless";
+
+ public static final String JABAWS = "jabaws";
+
+ public static final String NOANNOTATION = "no-annotation";
+
+ public static final String NOANNOTATION2 = "noannotation"; // BH 2019.05.07
+
+ public static final String NODISPLAY = "nodisplay";
+
+ public static final String NOGUI = "nogui";
+
+ public static final String NONEWS = "nonews";
+
+ public static final String NOQUESTIONNAIRE = "noquestionnaire";
+
+ public static final String NOSORTBYTREE = "nosortbytree";
+
+ public static final String NOUSAGESTATS = "nousagestats";
+
+ public static final String OPEN = "open";
+
+ public static final String OPEN2 = "open2"; // BH added -- for applet
+ // compatibility; not fully
+ // implemented
+
+ public static final String PROPS = "props";
+
+ public static final String QUESTIONNAIRE = "questionnaire";
+
+ public static final String SETPROP = "setprop";
+
+ public static final String SORTBYTREE = "sortbytree";
+
+ public static final String TREE = "tree";
+
+ public static final String VDOC = "vdoc";
+
+ public static final String VSESS = "vsess";
+
+ private Vector<String> vargs = null;
+
+ private boolean isApplet;
+
+ private AppletParams appletParams;
+
+ public boolean isApplet()
+ {
+ return isApplet;
+ }
public ArgsParser(String[] args)
{
- vargs = new Vector<String>();
- for (int i = 0; i < args.length; i++)
+ vargs = new Vector<>();
+ isApplet = (args.length > 0 && args[0].startsWith("<applet"));
+ if (isApplet)
+ {
+ appletParams = AppletParams.getAppletParams(args, vargs);
+ }
+ else
{
- String arg = args[i].trim();
- if (arg.charAt(0) == '-')
+ for (int i = 0; i < args.length; i++)
{
- arg = arg.substring(1);
+ String arg = args[i].trim();
+ if (arg.charAt(0) == '-')
+ {
+ arg = arg.substring(1);
+ }
+ vargs.addElement(arg);
}
- vargs.addElement(arg);
}
}
return vargs.size();
}
+ public String getAppletValue(String key, String def)
+ {
+ String value;
+ return (appletParams == null ? null
+ : (value = appletParams.get(key.toLowerCase())) != null ? value
+ : def);
+ }
+
}
*/
package jalview.bin;
+import jalview.bin.ApplicationSingletonProvider.ApplicationSingletonI;
import jalview.datamodel.PDBEntry;
-import jalview.gui.UserDefinedColours;
+import jalview.gui.Preferences;
import jalview.schemes.ColourSchemeLoader;
import jalview.schemes.ColourSchemes;
import jalview.schemes.UserColourScheme;
import jalview.ws.sifts.SiftsSettings;
import java.awt.Color;
+import java.awt.Dimension;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
* @author $author$
* @version $Revision$
*/
-public class Cache
+public class Cache implements ApplicationSingletonI
{
+
+ private Cache()
+ {
+ // private singleton
+ }
+
+ /**
+ * In Java, this will be a static field instance, which will be
+ * application-specific; in JavaScript it will be an applet-specific instance
+ * tied to the applet's ThreadGroup.
+ *
+ * @return
+ */
+ private static Cache getInstance()
+ {
+ return (Cache) ApplicationSingletonProvider.getInstance(Cache.class);
+ }
+
/**
* property giving log4j level for CASTOR loggers
*/
public static Logger log;
/** Jalview Properties */
- public static Properties applicationProperties = new Properties()
+ // BH 2019.05.08 was static
+ @SuppressWarnings("serial")
+ private Properties applicationProperties = new Properties()
{
// override results in properties output in alphabetical order
@Override
};
/** Default file is ~/.jalview_properties */
- static String propertiesFile;
+ private String propertiesFile;
- private static boolean propsAreReadOnly = Platform.isJS();
+ /**
+ * flag to possibly allow properties to be written to a property file
+ */
+ private boolean propsAreReadOnly = Platform.isJS();
private final static String JS_PROPERTY_PREFIX = "jalview_";
jalview.bin.Cache.log = Logger.getLogger("jalview.bin.Jalview");
laxis.setLevel(Level.toLevel(
- Cache.getDefault("logs.Axis.Level", Level.INFO.toString())));
- lcastor.setLevel(Level.toLevel(Cache.getDefault("logs.Castor.Level",
- Level.INFO.toString())));
+ getDefault("logs.Axis.Level", Level.INFO.toString())));
+ lcastor.setLevel(Level.toLevel(
+ getDefault("logs.Castor.Level", Level.INFO.toString())));
lcastor = Logger.getLogger("org.exolab.castor.xml");
- lcastor.setLevel(Level.toLevel(Cache.getDefault("logs.Castor.Level",
- Level.INFO.toString())));
+ lcastor.setLevel(Level.toLevel(
+ getDefault("logs.Castor.Level", Level.INFO.toString())));
// lcastor = Logger.getLogger("org.exolab.castor.xml.Marshaller");
- // lcastor.setLevel(Level.toLevel(Cache.getDefault("logs.Castor.Level",
+ // lcastor.setLevel(Level.toLevel(getDefault("logs.Castor.Level",
// Level.INFO.toString())));
jalview.bin.Cache.log.setLevel(Level.toLevel(Cache
.getDefault("logs.Jalview.level", Level.INFO.toString())));
*/
public static void loadProperties(String propsFile)
{
+ getInstance().loadPropertiesImpl(propsFile);
+ }
+
+ private void loadPropertiesImpl(String propsFile)
+ {
propertiesFile = propsFile;
- if (propsFile == null && !propsAreReadOnly)
- {
- propertiesFile = System.getProperty("user.home") + File.separatorChar
- + ".jalview_properties";
- }
- else
+ if (!propsAreReadOnly)
{
- // don't corrupt the file we've been given.
- propsAreReadOnly = true;
+ // Java only
+ if (propsFile == null)
+ {
+ propertiesFile = System.getProperty("user.home")
+ + File.separatorChar + ".jalview_properties";
+ }
+ else
+ {
+ // don't corrupt the file we've been given.
+ propsAreReadOnly = true;
+ }
}
if (propertiesFile == null)
- { // BH 2019
+ { // BH 2019 read properties from the Info object associated with this
+ // applet
Platform.readInfoProperties(JS_PROPERTY_PREFIX,
applicationProperties);
}
}
if (authorDetails == null)
{
- applicationProperties.remove("AUTHORS");
- applicationProperties.remove("AUTHORFNAMES");
- applicationProperties.remove("YEAR");
+ applicationProperties.remove("AUTHORS");
+ applicationProperties.remove("AUTHORFNAMES");
+ applicationProperties.remove("YEAR");
}
// FIND THE VERSION NUMBER AND BUILD DATE FROM jalview.jar
}
if (buildDetails == null)
{
- applicationProperties.remove("VERSION");
+ applicationProperties.remove("VERSION");
}
String jnlpVersion = System.getProperty("jalview.version");
String codeVersion = getProperty("VERSION");
}
new BuildDetails(codeVersion, null, codeInstallation);
- SiftsSettings
- .setMapWithSifts(Cache.getDefault("MAP_WITH_SIFTS", false));
+ SiftsSettings.setMapWithSifts(getDefault("MAP_WITH_SIFTS", false));
SiftsSettings.setSiftDownloadDirectory(jalview.bin.Cache
.getDefault("sifts_download_dir", DEFAULT_SIFTS_DOWNLOAD_DIR));
SiftsSettings.setFailSafePIDThreshold(
- jalview.bin.Cache.getDefault("sifts_fail_safe_pid_threshold",
+ getDefault("sifts_fail_safe_pid_threshold",
DEFAULT_FAIL_SAFE_PID_THRESHOLD));
SiftsSettings.setCacheThresholdInDays(
- jalview.bin.Cache.getDefault("sifts_cache_threshold_in_days",
+ getDefault("sifts_cache_threshold_in_days",
DEFAULT_CACHE_THRESHOLD_IN_DAYS));
- IdOrgSettings.setUrl(getDefault("ID_ORG_HOSTURL",
+ IdOrgSettings.setUrl(getDefault(Preferences.ID_ORG_HOSTURL,
"http://www.jalview.org/services/identifiers"));
IdOrgSettings.setDownloadLocation(ID_ORG_FILE);
.println("Jalview Version: " + codeVersion + codeInstallation);
StructureImportSettings.setDefaultStructureFileFormat(jalview.bin.Cache
- .getDefault("PDB_DOWNLOAD_FORMAT", PDB_DOWNLOAD_FORMAT));
+ .getDefault(Preferences.PDB_DOWNLOAD_FORMAT, PDB_DOWNLOAD_FORMAT));
StructureImportSettings
.setDefaultPDBFileParser(DEFAULT_PDB_FILE_PARSER);
// StructureImportSettings
- // .setDefaultPDBFileParser(jalview.bin.Cache.getDefault(
+ // .setDefaultPDBFileParser(jalview.bin.getDefault(
// "DEFAULT_PDB_FILE_PARSER", DEFAULT_PDB_FILE_PARSER));
// jnlpVersion will be null if we're using InstallAnywhere
// Dont do this check if running in headless mode
- if (jnlpVersion == null && getDefault("VERSION_CHECK", true)
- && (System.getProperty("java.awt.headless") == null || System
- .getProperty("java.awt.headless").equals("false")))
+ if (jnlpVersion == null && !Jalview.isHeadlessMode()
+ && getDefault("VERSION_CHECK", true))
{
class VersionChecker extends Thread
setProperty("VERSION", codeVersion);
// LOAD USERDEFINED COLOURS
- jalview.bin.Cache
- .initUserColourSchemes(getProperty("USER_DEFINED_COLOURS"));
- jalview.io.PIRFile.useModellerOutput = Cache.getDefault("PIR_MODELLER",
- false);
+ initUserColourSchemes(getProperty(Preferences.USER_DEFINED_COLOURS));
}
-
- private static void deleteBuildProperties()
+ private void deleteBuildProperties()
{
applicationProperties.remove("LATEST_VERSION");
applicationProperties.remove("VERSION");
*/
public static String getProperty(String key)
{
- String prop = applicationProperties.getProperty(key);
- if (prop == null && Platform.isJS())
- {
- prop = applicationProperties.getProperty(Platform.getUniqueAppletID()
- + "_" + JS_PROPERTY_PREFIX + key);
- }
- return prop;
+ return getInstance().applicationProperties.getProperty(key);
}
/**
}
/**
+ * retrieve a dimension, such as for Jmol
+ *
+ * @param property
+ * @param def
+ * @return
+ */
+ public static Dimension getDefaultDim(String property, Dimension def)
+ {
+ String s = getProperty(property);
+ if (s != null)
+ {
+ if (s.indexOf(',') < 0)
+ {
+ s = s.trim().replace(' ', ',');
+ if (s.indexOf(',') < 0)
+ {
+ s += "," + s;
+ }
+ }
+ try
+ {
+ int pt = s.indexOf(",");
+ return new Dimension(Integer.parseInt(s.substring(0, pt)),
+ Integer.parseInt(s.substring(pt + 1)));
+ } catch (NumberFormatException e)
+ {
+ System.out.println("Error parsing Dimension property '" + property
+ + "' with value '" + s + "'");
+ }
+ }
+ return def;
+ }
+
+ /**
* Answers the value of the given property, or the supplied default value if
* the property is not set
*/
*/
public static Object setProperty(String key, String obj)
{
+ return getInstance().setPropertyImpl(key, obj, true);
+ }
+
+ public static void setPropertyNoSave(String key, String obj)
+ {
+ getInstance().setPropertyImpl(key, obj, false);
+ }
+
+ private Object setPropertyImpl(String key, String obj, boolean andSave)
+ {
Object oldValue = null;
try
{
oldValue = applicationProperties.setProperty(key, obj);
- if (!propsAreReadOnly)
+ if (andSave && !propsAreReadOnly && propertiesFile != null)
{
FileOutputStream out = new FileOutputStream(propertiesFile);
applicationProperties.store(out, "---JalviewX Properties File---");
/**
* remove the specified property from the jalview properties file
*
- * @param string
+ * @param key
*/
- public static void removeProperty(String string)
+ public static void removeProperty(String key)
{
- applicationProperties.remove(string);
- saveProperties();
+ getInstance().removePropertyImpl(key, true);
+ }
+
+ public static void removePropertyNoSave(String key)
+ {
+ getInstance().removePropertyImpl(key, false);
+ }
+
+ private void removePropertyImpl(String key, boolean andSave)
+ {
+ applicationProperties.remove(key);
+ if (andSave)
+ {
+ savePropertiesImpl();
+ }
+ }
+
+ public static void saveProperties()
+ {
+ getInstance().savePropertiesImpl();
}
/**
* save the properties to the jalview properties path
*/
- public static void saveProperties()
+ private void savePropertiesImpl()
{
if (!propsAreReadOnly)
{
}
}
+ private final static int UNTESTED = -1;
+
+ private final static int TRUE = 1;
+
+ private final static int FALSE = 0;
+
/**
* internal vamsas class discovery state
*/
- private static int vamsasJarsArePresent = -1;
+ private static int vamsasJarsArePresent = (Platform.isJS() ? FALSE
+ : UNTESTED);
/**
* Searches for vamsas client classes on class path.
*/
public static boolean vamsasJarsPresent()
{
- if (vamsasJarsArePresent == -1)
+ if (vamsasJarsArePresent == UNTESTED)
{
try
{
{
jalview.bin.Cache.log.debug(
"Found Vamsas Classes (uk.ac..vamsas.client.VorbaId can be loaded)");
- vamsasJarsArePresent = 1;
+ vamsasJarsArePresent = TRUE;
Logger lvclient = Logger.getLogger("uk.ac.vamsas");
lvclient.setLevel(Level.toLevel(Cache
.getDefault("logs.Vamsas.Level", Level.INFO.toString())));
}
} catch (Exception e)
{
- vamsasJarsArePresent = 0;
+ vamsasJarsArePresent = FALSE;
jalview.bin.Cache.log.debug("Vamsas Classes are not present");
}
}
- return (vamsasJarsArePresent > 0);
+ return (vamsasJarsArePresent == TRUE);
}
/**
* internal vamsas class discovery state
*/
- private static int groovyJarsArePresent = -1;
+ private static int groovyJarsArePresent = (Platform.isJS() ? FALSE
+ : UNTESTED);
/**
* Searches for vamsas client classes on class path.
*/
public static boolean groovyJarsPresent()
{
- if (groovyJarsArePresent == -1)
+ if (groovyJarsArePresent == UNTESTED)
{
try
{
{
jalview.bin.Cache.log.debug(
"Found Groovy (groovy.lang.GroovyObject can be loaded)");
- groovyJarsArePresent = 1;
+ groovyJarsArePresent = TRUE;
Logger lgclient = Logger.getLogger("groovy");
lgclient.setLevel(Level.toLevel(Cache
.getDefault("logs.Groovy.Level", Level.INFO.toString())));
}
} catch (Error e)
{
- groovyJarsArePresent = 0;
+ groovyJarsArePresent = FALSE;
jalview.bin.Cache.log.debug("Groovy Classes are not present", e);
} catch (Exception e)
{
- groovyJarsArePresent = 0;
+ groovyJarsArePresent = FALSE;
jalview.bin.Cache.log.debug("Groovy Classes are not present");
}
}
- return (groovyJarsArePresent > 0);
+ return (groovyJarsArePresent == TRUE);
}
/**
*/
protected static Object tracker = null;
- protected static Class trackerfocus = null;
+ protected static Class<?> trackerfocus = null;
- protected static Class jgoogleanalyticstracker = null;
+ protected static Class<?> jgoogleanalyticstracker = null;
/**
* Initialise the google tracker if it is not done already.
*/
public static void initGoogleTracker()
{
+
+ // TODO: SwingJS JavaScript tracker?
+
if (tracker == null)
{
if (jgoogleanalyticstracker == null)
.newInstance(new Object[]
{ "Jalview Desktop",
(vrs = jalview.bin.Cache.getProperty("VERSION") + "_"
- + jalview.bin.Cache.getDefault("BUILD_DATE",
- "unknown")),
+ + getDefault("BUILD_DATE", "unknown")),
"UA-9060947-1" });
jgoogleanalyticstracker
.getMethod("trackAsynchronously", new Class[]
}
if (value == null || value.trim().length() < 1)
{
- Cache.applicationProperties.remove(propName);
+ getInstance().applicationProperties.remove(propName);
}
else
{
- Cache.applicationProperties.setProperty(propName, value);
+ getInstance().applicationProperties.setProperty(propName, value);
}
}
{
if (coloursFound.toString().length() > 1)
{
- setProperty(UserDefinedColours.USER_DEFINED_COLOURS,
+ setProperty(Preferences.USER_DEFINED_COLOURS,
coloursFound.toString());
}
else
{
- applicationProperties
- .remove(UserDefinedColours.USER_DEFINED_COLOURS);
+ getInstance().applicationProperties
+ .remove(Preferences.USER_DEFINED_COLOURS);
}
}
}
*/
package jalview.bin;
+import jalview.api.AlignCalcWorkerI;
+import jalview.api.AlignFrameI;
+import jalview.api.AlignViewportI;
+import jalview.api.JalviewApp;
+import jalview.api.StructureSelectionManagerProvider;
+import jalview.bin.ApplicationSingletonProvider.ApplicationSingletonI;
+import jalview.datamodel.ColumnSelection;
+import jalview.datamodel.HiddenColumns;
+import jalview.datamodel.PDBEntry;
+import jalview.datamodel.SequenceGroup;
+import jalview.datamodel.SequenceI;
import jalview.ext.so.SequenceOntology;
import jalview.gui.AlignFrame;
+import jalview.gui.AlignViewport;
+import jalview.gui.AlignmentPanel;
+import jalview.gui.CalculationChooser;
import jalview.gui.Desktop;
+import jalview.gui.Preferences;
import jalview.gui.PromptUserConfig;
+import jalview.gui.StructureViewer;
import jalview.io.AppletFormatAdapter;
import jalview.io.BioJsHTMLOutput;
import jalview.io.DataSourceType;
import jalview.io.FileFormat;
import jalview.io.FileFormatException;
import jalview.io.FileFormatI;
+import jalview.io.FileFormats;
import jalview.io.FileLoader;
import jalview.io.HtmlSvgOutput;
import jalview.io.IdentifyFile;
import jalview.io.NewickFile;
import jalview.io.gff.SequenceOntologyFactory;
+import jalview.javascript.JSFunctionExec;
+import jalview.javascript.MouseOverStructureListener;
+import jalview.renderer.seqfeatures.FeatureRenderer;
import jalview.schemes.ColourSchemeI;
import jalview.schemes.ColourSchemeProperty;
+import jalview.structure.SelectionSource;
+import jalview.structure.VamsasSource;
import jalview.util.MessageManager;
import jalview.util.Platform;
import jalview.ws.jws2.Jws2Discoverer;
+import java.applet.AppletContext;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.security.Permissions;
import java.security.Policy;
import java.util.HashMap;
+import java.util.Hashtable;
import java.util.Map;
import java.util.Vector;
-import java.util.logging.ConsoleHandler;
-import java.util.logging.Level;
-import java.util.logging.Logger;
import javax.swing.LookAndFeel;
import javax.swing.UIManager;
-import com.threerings.getdown.util.LaunchUtil;
-
import groovy.lang.Binding;
import groovy.util.GroovyScriptEngine;
+import netscape.javascript.JSObject;
/**
* Main class for Jalview Application <br>
* @author $author$
* @version $Revision$
*/
-public class Jalview
+public class Jalview implements ApplicationSingletonI, JalviewJSApi
{
+
+ public static Jalview getInstance()
+ {
+ return (Jalview) ApplicationSingletonProvider
+ .getInstance(Jalview.class);
+ }
+
+ private Jalview()
+ {
+ }
+
static
{
Platform.getURLCommandArguments();
}
- // singleton instance of this class
+ private boolean headless;
- private static Jalview instance;
+ public static boolean isHeadlessMode()
+ {
+ return getInstance().headless;
+ }
private Desktop desktop;
- public static AlignFrame currentAlignFrame;
+ private AlignFrame currentAlignFrame;
+
+ public boolean isJavaAppletTag;
+
+ public String appletResourcePath;
+
+ JalviewAppLoader appLoader;
+
+ protected JSFunctionExec jsFunctionExec;
+
+ private boolean noCalculation, noMenuBar, noStatus;
+
+ private boolean noAnnotation;
+
+ public boolean getStartCalculations()
+ {
+ return !noCalculation;
+ }
+
+ public boolean getAllowMenuBar()
+ {
+ return !noMenuBar;
+ }
+
+ public boolean getShowStatus()
+ {
+ return !noStatus;
+ }
+
+ public boolean getShowAnnotation()
+ {
+ return !noAnnotation;
+ }
+
+ public static AlignFrame getCurrentAlignFrame()
+ {
+ return getInstance().currentAlignFrame;
+ }
+
+ public static void setCurrentAlignFrame(AlignFrame currentAlignFrame)
+ {
+ getInstance().currentAlignFrame = currentAlignFrame;
+ }
static
{
*/
{
// grab all the rights we can for the JVM
- Policy.setPolicy(new Policy()
- {
- @Override
- public PermissionCollection getPermissions(CodeSource codesource)
- {
- Permissions perms = new Permissions();
- perms.add(new AllPermission());
- return (perms);
- }
-
- @Override
- public void refresh()
- {
- }
- });
+ Policy.setPolicy(new Policy()
+ {
+ @Override
+ public PermissionCollection getPermissions(CodeSource codesource)
+ {
+ Permissions perms = new Permissions();
+ perms.add(new AllPermission());
+ return (perms);
+ }
+
+ @Override
+ public void refresh()
+ {
+ }
+ });
}
}
}
- public static Jalview getInstance()
- {
- return instance;
- }
-
/**
* main class for Jalview application
*
*/
public static void main(String[] args)
{
-// setLogging(); // BH - for event debugging in JavaScript
- instance = new Jalview();
- instance.doMain(args);
-}
-
- private static void logClass(String name)
- {
- // BH - for event debugging in JavaScript
- ConsoleHandler consoleHandler = new ConsoleHandler();
- consoleHandler.setLevel(Level.ALL);
- Logger logger = Logger.getLogger(name);
- logger.setLevel(Level.ALL);
- logger.addHandler(consoleHandler);
- }
-
- @SuppressWarnings("unused")
- private static void setLogging()
- {
-
- /**
- * @j2sIgnore
- *
- */
- {
- System.out.println("not in js");
- }
-
- // BH - for event debugging in JavaScript (Java mode only)
- if (!Platform.isJS())
- /**
- * Java only
- *
- * @j2sIgnore
- */
- {
- Logger.getLogger("").setLevel(Level.ALL);
- logClass("java.awt.EventDispatchThread");
- logClass("java.awt.EventQueue");
- logClass("java.awt.Component");
- logClass("java.awt.focus.Component");
- logClass("java.awt.focus.DefaultKeyboardFocusManager");
- }
-
+ // Platform.startJavaLogging();
+ getInstance().doMain(args);
}
-
-
+ @SuppressWarnings("unused")
/**
* @param args
*/
void doMain(String[] args)
{
- if (!Platform.isJS())
+ boolean isJS = Platform.isJS();
+ if (isJS)
+ {
+ Platform.setAppClass(this);
+ }
+ else
{
System.setSecurityManager(null);
}
+ System.getProperty("os.name") + " "
+ System.getProperty("os.version"));
- String appdirString = System.getProperty("getdownappdir");
- if (appdirString != null && appdirString.length() > 0)
- {
- final File appdir = new File(appdirString);
- new Thread()
- {
- @Override
- public void run()
- {
- LaunchUtil.upgradeGetdown(
- new File(appdir, "getdown-launcher-old.jar"),
- new File(appdir, "getdown-launcher.jar"),
- new File(appdir, "getdown-launcher-new.jar"));
- }
- }.start();
+ ArgsParser aparser = new ArgsParser(args);
+
+ String usrPropsFile = aparser.getValue(ArgsParser.PROPS);
+ Cache.loadProperties(usrPropsFile);
+ if (aparser.contains(ArgsParser.NODISPLAY)
+ || aparser.contains(ArgsParser.NOGUI)
+ || aparser.contains(ArgsParser.HEADLESS)
+ || "true".equals(System.getProperty("java.awt.headless")))
+ {
+ headless = true;
}
- ArgsParser aparser = new ArgsParser(args);
- boolean headless = false;
- String usrPropsFile = aparser.getValue("props");
- Cache.loadProperties(usrPropsFile); // must do this before
- if (usrPropsFile != null)
+ if (isJS)
{
+ isJavaAppletTag = aparser.isApplet();
+ if (isJavaAppletTag)
+ {
+ Preferences.setAppletDefaults();
+ Cache.loadProperties(usrPropsFile); // again, because we
+ // might be changing defaults here?
+ }
System.out.println(
- "CMD [-props " + usrPropsFile + "] executed successfully!");
+ "<Applet> found: " + aparser.getValue("Info.j2sAppletID"));
+ appletResourcePath = aparser.getValue("Info.resourcePath");
}
-
- if (!Platform.isJS())
+ else
/**
* Java only
*
* @j2sIgnore
*/
{
+ if (usrPropsFile != null)
+ {
+ System.out.println(
+ "CMD [-props " + usrPropsFile + "] executed successfully!");
+ }
+
if (aparser.contains("help") || aparser.contains("h"))
{
showUsage();
System.exit(0);
}
- if (aparser.contains("nodisplay") || aparser.contains("nogui")
- || aparser.contains("headless"))
- {
- System.setProperty("java.awt.headless", "true");
- headless = true;
- }
+
+
// anything else!
- final String jabawsUrl = aparser.getValue("jabaws");
+ final String jabawsUrl = aparser.getValue(ArgsParser.JABAWS);
if (jabawsUrl != null)
{
try
{
- Jws2Discoverer.getDiscoverer().setPreferredUrl(jabawsUrl);
+ Jws2Discoverer.getInstance().setPreferredUrl(jabawsUrl);
System.out.println(
"CMD [-jabaws " + jabawsUrl + "] executed successfully!");
} catch (MalformedURLException e)
}
}
- String defs = aparser.getValue("setprop");
+ // check for property setting
+ String defs = aparser.getValue(ArgsParser.SETPROP);
while (defs != null)
{
int p = defs.indexOf('=');
else
{
System.out.println("Executing setprop argument: " + defs);
- if (Platform.isJS())
+ if (isJS)
{
- Cache.setProperty(defs.substring(0,p), defs.substring(p+1));
+ Cache.setProperty(defs.substring(0, p), defs.substring(p + 1));
}
}
- defs = aparser.getValue("setprop");
- }
- if (System.getProperty("java.awt.headless") != null
- && System.getProperty("java.awt.headless").equals("true"))
- {
- headless = true;
+ defs = aparser.getValue(ArgsParser.SETPROP);
}
System.setProperty("http.agent",
"Jalview Desktop/" + Cache.getDefault("VERSION", "Unknown"));
try
{
- UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
+ if (!isJS && Platform.isWin())
+ {
+ UIManager.setLookAndFeel(
+ headless ? "javax.swing.plaf.metal.MetalLookAndFeel"
+ : UIManager.getSystemLookAndFeelClassName());
+// UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
+ }
} catch (Exception ex)
{
System.err.println("Unexpected Look and Feel Exception");
"Failed to set QuaQua look and feel: " + e.toString());
}
}
- if (lookAndFeel == null || !(lookAndFeel.getClass()
- .isAssignableFrom(UIManager.getLookAndFeel().getClass()))
+ if (lookAndFeel == null
+ || !(lookAndFeel.getClass().isAssignableFrom(
+ UIManager.getLookAndFeel().getClass()))
|| !UIManager.getLookAndFeel().getClass().toString()
.toLowerCase().contains("quaqua"))
{
* configure 'full' SO model if preferences say to,
* else use the default (SO Lite)
*/
- if (Cache.getDefault("USE_FULL_SO", false))
+ if (Cache.getDefault(Preferences.USE_FULL_SO, false))
{
- SequenceOntologyFactory.setInstance(new SequenceOntology());
+ SequenceOntologyFactory.setSequenceOntology(new SequenceOntology());
}
if (!headless)
{
- desktop = new Desktop()
-// {
-// // BH testing
-// @Override
-// protected void processEvent(AWTEvent e) {
-// System.out.println("Jalview.java " + e);
-// super.processEvent(e);
-// }
-// }
- ;
+ desktop = Desktop.getInstance();
desktop.setInBatchMode(true); // indicate we are starting up
-
- try
- {
- if (! Platform.isJS())
- /**
- * Java only
- *
- * @j2sIgnore
- */
- {
- JalviewTaskbar.setTaskbar(this);
- }
- } catch (Exception e)
- {
- System.out.println("Cannot set Taskbar");
- // e.printStackTrace();
- } catch (Throwable t)
- {
- System.out.println("Cannot set Taskbar");
- // t.printStackTrace();
- }
-
desktop.setVisible(true);
- if (!Platform.isJS())
+ if (!isJS)
/**
* Java only
*
*/
{
desktop.startServiceDiscovery();
- if (!aparser.contains("nousagestats"))
+ if (!aparser.contains(ArgsParser.NOUSAGESTATS))
{
startUsageStats(desktop);
}
System.err.println("CMD [-nousagestats] executed successfully!");
}
- if (!aparser.contains("noquestionnaire"))
+ if (!aparser.contains(ArgsParser.NOQUESTIONNAIRE))
{
- String url = aparser.getValue("questionnaire");
+ String url = aparser.getValue(ArgsParser.QUESTIONNAIRE);
if (url != null)
{
// Start the desktop questionnaire prompter with the specified
}
else
{
- if (Cache.getProperty("NOQUESTIONNAIRES") == null)
+ if (Cache.getProperty(Preferences.NOQUESTIONNAIRES) == null)
{
// Start the desktop questionnaire prompter with the specified
// questionnaire
.println("CMD [-noquestionnaire] executed successfully!");
}
- if (!aparser.contains("nonews"))
+ if (!aparser.contains(ArgsParser.NONEWS))
{
desktop.checkForNews();
}
}
}
- String file = null, data = null;
- FileFormatI format = null;
- DataSourceType protocol = null;
- FileLoader fileLoader = new FileLoader(!headless);
+ parseArguments(aparser, true);
+ }
+
+ /**
+ * Allow an outside entity to initiate the second half of argument parsing
+ * (only).
+ *
+ * @param args
+ * @return null is good
+ */
+ @Override
+ public Object parseArguments(String[] args)
+ {
+
+ try
+ {
+ ArgsParser aparser = new ArgsParser(args);
+ return parseArguments(aparser, false);
+ } catch (Throwable t)
+ {
+ return t;
+ }
+ }
+
+ /**
+ *
+ * @param aparser
+ * @param isStartup
+ * @return
+ */
+ private Object parseArguments(ArgsParser aparser, boolean isStartup)
+ {
+ boolean isJS = Platform.isJS();
- String groovyscript = null; // script to execute after all loading is
+ Desktop desktop = (headless ? null : Desktop.getInstance());
+ // script to execute after all loading is
// completed one way or another
// extract groovy argument and execute if necessary
- groovyscript = aparser.getValue("groovy", true);
- file = aparser.getValue("open", true);
+ String groovyscript = (isJS ? null
+ : aparser.getValue(ArgsParser.GROOVY, true));
+ String file = aparser.getValue(ArgsParser.OPEN, true);
+ // BH this here to allow split frame; not working as of 5/17/2019
+ String file2 = aparser.getValue(ArgsParser.OPEN2, true);
+ String fileFormat = (isJavaAppletTag
+ ? aparser.getAppletValue("format", null)
+ : null);
+ FileFormatI format = null;
+ DataSourceType protocol = null;
if (file == null && desktop == null)
{
System.out.println("No files to open!");
System.exit(1);
}
- String vamsasImport = aparser.getValue("vdoc");
- String vamsasSession = aparser.getValue("vsess");
- if (vamsasImport != null || vamsasSession != null)
+ boolean haveImport = checkStartVamas(aparser);
+ // Finally, deal with the remaining input data.
+ long progress = -1;
+ if (file == null && isJavaAppletTag)
{
- if (desktop == null || headless)
+ // Maybe the sequences are added as parameters
+ StringBuffer data = new StringBuffer("PASTE");
+ int i = 1;
+ while ((file = aparser.getAppletValue("sequence" + i, null)) != null)
{
- System.out.println(
- "Headless vamsas sessions not yet supported. Sorry.");
- System.exit(1);
- }
- // if we have a file, start a new session and import it.
- boolean inSession = false;
- if (vamsasImport != null)
- {
- try
- {
- DataSourceType viprotocol = AppletFormatAdapter
- .checkProtocol(vamsasImport);
- if (viprotocol == DataSourceType.FILE)
- {
- inSession = desktop.vamsasImport(new File(vamsasImport));
- }
- else if (viprotocol == DataSourceType.URL)
- {
- inSession = desktop.vamsasImport(new URL(vamsasImport));
- }
-
- } catch (Exception e)
- {
- System.err.println("Exeption when importing " + vamsasImport
- + " as a vamsas document.");
- e.printStackTrace();
- }
- if (!inSession)
- {
- System.err.println("Failed to import " + vamsasImport
- + " as a vamsas document.");
- }
- else
- {
- System.out.println("Imported Successfully into new session "
- + desktop.getVamsasApplication().getCurrentSession());
- }
+ data.append(file.toString() + "\n");
+ i++;
}
- if (vamsasSession != null)
+ if (data.length() > 5)
{
- if (vamsasImport != null)
- {
- // close the newly imported session and import the Jalview specific
- // remnants into the new session later on.
- desktop.vamsasStop_actionPerformed(null);
- }
- // now join the new session
- try
- {
- if (desktop.joinVamsasSession(vamsasSession))
- {
- System.out.println(
- "Successfully joined vamsas session " + vamsasSession);
- }
- else
- {
- System.err.println("WARNING: Failed to join vamsas session "
- + vamsasSession);
- }
- } catch (Exception e)
- {
- System.err.println(
- "ERROR: Failed to join vamsas session " + vamsasSession);
- e.printStackTrace();
- }
- if (vamsasImport != null)
- {
- // the Jalview specific remnants can now be imported into the new
- // session at the user's leisure.
- Cache.log.info(
- "Skipping Push for import of data into existing vamsas session."); // TODO:
- // enable
- // this
- // when
- // debugged
- // desktop.getVamsasApplication().push_update();
- }
+ file = data.toString();
}
}
- long progress = -1;
- // Finally, deal with the remaining input data.
+
+ String data;
+
if (file != null)
{
+
if (!headless)
{
desktop.setProgressBar(
.getString("status.processing_commandline_args"),
progress = System.currentTimeMillis());
}
- System.out.println("CMD [-open " + file + "] executed successfully!");
- if (!Platform.isJS())
- /**
- * ignore in JavaScript -- can't just file existence - could load it?
- *
- * @j2sIgnore
- */
+ if (!isJS)
+ /**
+ * ignore in JavaScript -- can't just check file existence - could load
+ * it?
+ *
+ * @j2sIgnore
+ */
{
if (!file.startsWith("http://") && !file.startsWith("https://"))
// BH 2019 added https check for Java
}
}
- protocol = AppletFormatAdapter.checkProtocol(file);
+ protocol = AppletFormatAdapter.checkProtocol(file);
try
{
- format = new IdentifyFile().identify(file, protocol);
+ format = (isJavaAppletTag && fileFormat != null
+ ? FileFormats.getInstance().forName(fileFormat)
+ : null);
+ if (format == null)
+ {
+ format = new IdentifyFile().identify(file, protocol);
+ }
} catch (FileFormatException e1)
{
// TODO ?
}
- AlignFrame af = fileLoader.LoadFileWaitTillLoaded(file, protocol,
- format);
+ if (aparser.contains(ArgsParser.NOMENUBAR))
+ {
+ noMenuBar = true;
+ System.out.println("CMD [nomenu] executed successfully!");
+ }
+
+ if (aparser.contains(ArgsParser.NOSTATUS))
+ {
+ noStatus = true;
+ System.out.println("CMD [nostatus] executed successfully!");
+ }
+
+ if (aparser.contains(ArgsParser.NOANNOTATION)
+ || aparser.contains(ArgsParser.NOANNOTATION2))
+ {
+ noAnnotation = true;
+ System.out.println("CMD no-annotation executed successfully!");
+ }
+ if (aparser.contains(ArgsParser.NOCALCULATION))
+ {
+ noCalculation = true;
+ System.out.println("CMD [nocalculation] executed successfully!");
+ }
+
+ AlignFrame af = new FileLoader(!headless).loadFileWaitTillLoaded(file,
+ protocol, format);
if (af == null)
{
System.out.println("error");
}
else
{
+ System.out
+ .println("CMD [-open " + file + "] executed successfully!");
+ if (file2 != null)
+ {
+ protocol = AppletFormatAdapter.checkProtocol(file2);
+ try
+ {
+ format = new IdentifyFile().identify(file2, protocol);
+ } catch (FileFormatException e1)
+ {
+ // TODO ?
+ }
+ AlignFrame af2 = new FileLoader(!headless)
+ .loadFileWaitTillLoaded(file2, protocol, format);
+ if (af2 == null)
+ {
+ System.out.println("error");
+ }
+ else
+ {
+ AlignViewport.openLinkedAlignmentAs(af,
+ af.getViewport().getAlignment(),
+ af2.getViewport().getAlignment(), "",
+ AlignViewport.SPLIT_FRAME);
+ System.out.println(
+ "CMD [-open2 " + file2 + "] executed successfully!");
+ }
+ }
+
setCurrentAlignFrame(af);
- data = aparser.getValue("colour", true);
+
+ // TODO: file2 How to implement file2 for the applet spit screen?
+
+ data = aparser.getValue(ArgsParser.COLOUR, true);
if (data != null)
{
data.replaceAll("%20", " ");
- ColourSchemeI cs = ColourSchemeProperty
- .getColourScheme(af.getViewport(),
- af.getViewport().getAlignment(), data);
+ ColourSchemeI cs = ColourSchemeProperty.getColourScheme(
+ af.getViewport(), af.getViewport().getAlignment(), data);
if (cs != null)
{
}
// Must maintain ability to use the groups flag
- data = aparser.getValue("groups", true);
+ data = aparser.getValue(ArgsParser.GROUPS, true);
if (data != null)
{
af.parseFeaturesFile(data,
System.out.println(
"CMD groups[-" + data + "] executed successfully!");
}
- data = aparser.getValue("features", true);
+ data = aparser.getValue(ArgsParser.FEATURES, true);
if (data != null)
{
af.parseFeaturesFile(data,
"CMD [-features " + data + "] executed successfully!");
}
- data = aparser.getValue("annotations", true);
+ data = aparser.getValue(ArgsParser.ANNOTATIONS, true);
if (data != null)
{
af.loadJalviewDataFile(data, null, null, null);
System.out.println(
"CMD [-annotations " + data + "] executed successfully!");
}
+
+ if (aparser.contains(ArgsParser.SHOWOVERVIEW))
+ {
+ af.overviewMenuItem_actionPerformed(null);
+ System.out.println("CMD [showoverview] executed successfully!");
+ }
+
// set or clear the sortbytree flag.
- if (aparser.contains("sortbytree"))
+ if (aparser.contains(ArgsParser.SORTBYTREE))
{
af.getViewport().setSortByTree(true);
if (af.getViewport().getSortByTree())
System.out.println("CMD [-sortbytree] executed successfully!");
}
}
- if (aparser.contains("no-annotation"))
+
+ boolean doUpdateAnnotation = false;
+
+ /**
+ * we do this earlier in JalviewJS because of a complication with
+ * SHOWOVERVIEW
+ *
+ * For now, just fixing this in JalviewJS.
+ *
+ *
+ * @j2sIgnore
+ *
+ */
{
- af.getViewport().setShowAnnotation(false);
- if (!af.getViewport().isShowAnnotation())
+ if (aparser.contains(ArgsParser.NOANNOTATION)
+ || aparser.contains(ArgsParser.NOANNOTATION2))
{
- System.out.println("CMD no-annotation executed successfully!");
+ af.getViewport().setShowAnnotation(false);
+ if (!af.getViewport().isShowAnnotation())
+ {
+ doUpdateAnnotation = true;
+ System.out
+ .println("CMD no-annotation executed successfully!");
+ }
}
}
- if (aparser.contains("nosortbytree"))
+ if (aparser.contains(ArgsParser.NOSORTBYTREE))
{
af.getViewport().setSortByTree(false);
if (!af.getViewport().getSortByTree())
{
+ doUpdateAnnotation = true;
System.out
.println("CMD [-nosortbytree] executed successfully!");
}
}
- data = aparser.getValue("tree", true);
+ if (doUpdateAnnotation)
+ { // BH 2019.07.24
+ af.setMenusForViewport();
+ af.alignPanel.updateLayout();
+ }
+ data = aparser.getValue(ArgsParser.TREE, true);
if (data != null)
{
try
// TODO - load PDB structure(s) to alignment JAL-629
// (associate with identical sequence in alignment, or a specified
// sequence)
- if (groovyscript != null)
+ if (isJavaAppletTag)
{
- // Execute the groovy script after we've done all the rendering stuff
- // and before any images or figures are generated.
- System.out.println("Executing script " + groovyscript);
- executeGroovyScript(groovyscript, af);
- System.out.println("CMD groovy[" + groovyscript
- + "] executed successfully!");
- groovyscript = null;
+ loadAppletParams(aparser, af);
}
- String imageName = "unnamed.png";
- while (aparser.getSize() > 1)
+ else if (!isJS)
+ /**
+ * Java only
+ *
+ * @j2sIgnore
+ */
{
- String outputFormat = aparser.nextValue();
- file = aparser.nextValue();
-
- if (outputFormat.equalsIgnoreCase("png"))
- {
- af.createPNG(new File(file));
- imageName = (new File(file)).getName();
- System.out.println("Creating PNG image: " + file);
- continue;
- }
- else if (outputFormat.equalsIgnoreCase("svg"))
+ if (groovyscript != null)
{
- File imageFile = new File(file);
- imageName = imageFile.getName();
- af.createSVG(imageFile);
- System.out.println("Creating SVG image: " + file);
- continue;
+ // Execute the groovy script after we've done all the rendering
+ // stuff
+ // and before any images or figures are generated.
+ System.out.println("Executing script " + groovyscript);
+ executeGroovyScript(groovyscript, af);
+ System.out.println("CMD groovy[" + groovyscript
+ + "] executed successfully!");
+ groovyscript = null;
}
- else if (outputFormat.equalsIgnoreCase("html"))
- {
- File imageFile = new File(file);
- imageName = imageFile.getName();
- HtmlSvgOutput htmlSVG = new HtmlSvgOutput(af.alignPanel);
- htmlSVG.exportHTML(file);
+ }
+ checkOutputFile(aparser, af, format);
+ while (aparser.getSize() > 0)
+ {
+ System.out.println("Unknown arg: " + aparser.nextValue());
+ }
+ }
+ }
+ AlignFrame startUpAlframe = null;
+ // We'll only open the default file if the desktop is visible.
+ // And the user
+ // ////////////////////
- System.out.println("Creating HTML image: " + file);
- continue;
- }
- else if (outputFormat.equalsIgnoreCase("biojsmsa"))
- {
- if (file == null)
- {
- System.err.println("The output html file must not be null");
- return;
- }
- try
- {
- BioJsHTMLOutput.refreshVersionInfo(
- BioJsHTMLOutput.BJS_TEMPLATES_LOCAL_DIRECTORY);
- } catch (URISyntaxException e)
- {
- e.printStackTrace();
- }
- BioJsHTMLOutput bjs = new BioJsHTMLOutput(af.alignPanel);
- bjs.exportHTML(file);
- System.out
- .println("Creating BioJS MSA Viwer HTML file: " + file);
- continue;
- }
- else if (outputFormat.equalsIgnoreCase("imgMap"))
- {
- af.createImageMap(new File(file), imageName);
- System.out.println("Creating image map: " + file);
- continue;
- }
- else if (outputFormat.equalsIgnoreCase("eps"))
- {
- File outputFile = new File(file);
- System.out.println(
- "Creating EPS file: " + outputFile.getAbsolutePath());
- af.createEPS(outputFile);
- continue;
- }
-
- af.saveAlignment(file, format);
- if (af.isSaveAlignmentSuccessful())
- {
- System.out.println("Written alignment in " + format
- + " format to " + file);
- }
- else
- {
- System.out.println("Error writing file " + file + " in "
- + format + " format!!");
- }
-
- }
-
- while (aparser.getSize() > 0)
- {
- System.out.println("Unknown arg: " + aparser.nextValue());
- }
- }
- }
- AlignFrame startUpAlframe = null;
- // We'll only open the default file if the desktop is visible.
- // And the user
- // ////////////////////
-
- if (!Platform.isJS() && !headless && file == null
- && vamsasImport == null
+ if (!isJS && !headless && file == null && !haveImport
&& jalview.bin.Cache.getDefault("SHOW_STARTUP_FILE", true))
/**
* Java only
}
}
- startUpAlframe = fileLoader.LoadFileWaitTillLoaded(file, protocol,
- format);
+ startUpAlframe = new FileLoader(!headless)
+ .loadFileWaitTillLoaded(file, protocol, format);
// extract groovy arguments before anything else.
}
}
desktop.setInBatchMode(false);
}
+
+ return null;
+ }
+
+ private boolean checkStartVamas(ArgsParser aparser)
+ {
+ String vamsasImport = aparser.getValue(ArgsParser.VDOC);
+ String vamsasSession = aparser.getValue(ArgsParser.VSESS);
+ if (vamsasImport == null && vamsasSession == null)
+ {
+ return false;
+ }
+ if (desktop == null || headless)
+ {
+ System.out.println(
+ "Headless vamsas sessions not yet supported. Sorry.");
+ System.exit(1);
+ }
+ boolean haveImport = (vamsasImport != null);
+ if (haveImport)
+ {
+ // if we have a file, start a new session and import it.
+ boolean inSession = false;
+ try
+ {
+ DataSourceType viprotocol = AppletFormatAdapter
+ .checkProtocol(vamsasImport);
+ if (viprotocol == DataSourceType.FILE)
+ {
+ inSession = desktop.vamsasImport(new File(vamsasImport));
+ }
+ else if (viprotocol == DataSourceType.URL)
+ {
+ inSession = desktop.vamsasImport(new URL(vamsasImport));
+ }
+
+ } catch (Exception e)
+ {
+ System.err.println("Exeption when importing " + vamsasImport
+ + " as a vamsas document.");
+ e.printStackTrace();
+ }
+ if (!inSession)
+ {
+ System.err.println("Failed to import " + vamsasImport
+ + " as a vamsas document.");
+ }
+ else
+ {
+ System.out.println("Imported Successfully into new session "
+ + desktop.getVamsasApplication().getCurrentSession());
+ }
+ }
+ if (vamsasSession != null)
+ {
+ if (vamsasImport != null)
+ {
+ // close the newly imported session and import the Jalview specific
+ // remnants into the new session later on.
+ desktop.vamsasStop_actionPerformed(null);
+ }
+ // now join the new session
+ try
+ {
+ if (desktop.joinVamsasSession(vamsasSession))
+ {
+ System.out.println(
+ "Successfully joined vamsas session " + vamsasSession);
+ }
+ else
+ {
+ System.err.println("WARNING: Failed to join vamsas session "
+ + vamsasSession);
+ }
+ } catch (Exception e)
+ {
+ System.err.println(
+ "ERROR: Failed to join vamsas session " + vamsasSession);
+ e.printStackTrace();
+ }
+ if (vamsasImport != null)
+ {
+ // the Jalview specific remnants can now be imported into the new
+ // session at the user's leisure.
+ Cache.log.info(
+ "Skipping Push for import of data into existing vamsas session.");
+ // TODO:
+ // enable
+ // this
+ // when
+ // debugged
+ // desktop.getVamsasApplication().push_update();
+ }
+ }
+ return haveImport;
+ }
+
+ private void checkOutputFile(ArgsParser aparser, AlignFrame af,
+ FileFormatI format)
+ {
+ String imageName = "unnamed.png";
+ while (aparser.getSize() > 1)
+ {
+ // PNG filename
+ // SVG filename
+ // HTML filename
+ // biojsmsa filename
+ String outputFormat = aparser.nextValue();
+ String file = aparser.nextValue();
+ System.out.println("format " + outputFormat);
+
+ if (outputFormat.equalsIgnoreCase("png"))
+ {
+ af.createPNG(new File(file));
+ imageName = (new File(file)).getName();
+ System.out.println("Creating PNG image: " + file);
+ continue;
+ }
+ else if (outputFormat.equalsIgnoreCase("svg"))
+ {
+ File imageFile = new File(file);
+ imageName = imageFile.getName();
+ af.createSVG(imageFile);
+ System.out.println("Creating SVG image: " + file);
+ continue;
+ }
+ else if (outputFormat.equalsIgnoreCase("html"))
+ {
+ File imageFile = new File(file);
+ imageName = imageFile.getName();
+ HtmlSvgOutput htmlSVG = new HtmlSvgOutput(af.alignPanel);
+ htmlSVG.exportHTML(file);
+
+ System.out.println("Creating HTML image: " + file);
+ continue;
+ }
+ else if (outputFormat.equalsIgnoreCase("biojsmsa"))
+ {
+ if (file == null)
+ {
+ System.err.println("The output html file must not be null");
+ return;
+ }
+ try
+ {
+ BioJsHTMLOutput.refreshVersionInfo(
+ BioJsHTMLOutput.BJS_TEMPLATES_LOCAL_DIRECTORY);
+ } catch (URISyntaxException e)
+ {
+ e.printStackTrace();
+ }
+ BioJsHTMLOutput bjs = new BioJsHTMLOutput(af.alignPanel);
+ bjs.exportHTML(file);
+ System.out.println("Creating BioJS MSA Viwer HTML file: " + file);
+ continue;
+ }
+ else if (outputFormat.equalsIgnoreCase("imgMap"))
+ {
+ af.createImageMap(new File(file), imageName);
+ System.out.println("Creating image map: " + file);
+ continue;
+ }
+ else if (outputFormat.equalsIgnoreCase("eps"))
+ {
+ File outputFile = new File(file);
+ System.out.println(
+ "Creating EPS file: " + outputFile.getAbsolutePath());
+ af.createEPS(outputFile);
+ continue;
+ }
+
+ af.saveAlignment(file, format);
+ if (af.isSaveAlignmentSuccessful())
+ {
+ System.out.println(
+ "Written alignment in " + format + " format to " + file);
+ }
+ else
+ {
+ System.out.println("Error writing file " + file + " in " + format
+ + " format!!");
+ }
+
+ }
}
private static void showUsage()
/**
* start a User Config prompt asking if we can log usage statistics.
*/
- PromptUserConfig prompter = new PromptUserConfig(Desktop.desktop,
- "USAGESTATS", "Jalview Usage Statistics",
+ PromptUserConfig prompter = new PromptUserConfig(
+ Desktop.getDesktopPane(), "USAGESTATS",
+ "Jalview Usage Statistics",
"Do you want to help make Jalview better by enabling "
+ "the collection of usage statistics with Google Analytics ?"
+ "\n\n(you can enable or disable usage tracking in the preferences)",
}
try
{
- Map<String, java.lang.Object> vbinding = new HashMap<>();
+ Map<String, Object> vbinding = new HashMap<>();
vbinding.put("Jalview", this);
if (af != null)
{
}
}
- public static boolean isHeadlessMode()
- {
- String isheadless = System.getProperty("java.awt.headless");
- if (isheadless != null && isheadless.equalsIgnoreCase("true"))
- {
- return true;
- }
- return false;
- }
-
public AlignFrame[] getAlignFrames()
{
return desktop == null ? new AlignFrame[] { getCurrentAlignFrame() }
*/
public void quit()
{
+ if (jsFunctionExec != null)
+ {
+ jsFunctionExec.tidyUp();
+ jsFunctionExec = null;
+ }
+
if (desktop != null)
{
desktop.quit();
}
}
- public static AlignFrame getCurrentAlignFrame()
+ /**
+ * Get the SwingJS applet ID and combine that with the frameType
+ *
+ * @param frameType
+ * "alignment", "desktop", etc., or null
+ * @return
+ */
+ public static String getAppID(String frameType)
{
- return Jalview.currentAlignFrame;
+ String id = Cache.getProperty("Info.j2sAppletID");
+ if (id == null)
+ {
+ id = "jalview";
+ }
+ return id + (frameType == null ? "" : "-" + frameType);
}
- public static void setCurrentAlignFrame(AlignFrame currentAlignFrame)
+ /**
+ * Handle all JalviewLite applet parameters
+ *
+ * @param aparser
+ * @param af
+ */
+ private void loadAppletParams(ArgsParser aparser, AlignFrame af)
{
- Jalview.currentAlignFrame = currentAlignFrame;
+ JalviewApp app = new JalviewApp()
+ {
+
+ // TODO BH 2019
+ //
+ // These are methods that are in JalviewLite that various classes call
+ // but are not in JalviewLiteJsApi. Or, even if they are, other classes
+ // call
+ // them to JalviewLite directly. Some may not be necessary, but they have
+ // to
+ // be at least mentioned here, or the classes calling them should
+ // reference
+ // JalviewLite itself.
+
+ private boolean alignPDBStructures; // From JalviewLite; not implemented
+
+ private Hashtable<String, Hashtable<String, String[]>> jsmessages;
+
+ private Hashtable<String, int[]> jshashes;
+
+ @Override
+ public String getParameter(String name)
+ {
+ return aparser.getAppletValue(name, null);
+ }
+
+ @Override
+ public boolean getDefaultParameter(String name, boolean def)
+ {
+ String stn;
+ return ((stn = getParameter(name)) == null ? def
+ : "true".equalsIgnoreCase(stn));
+ }
+
+ /**
+ * Get the applet-like document base even though this is an application.
+ */
+ @Override
+ public URL getDocumentBase()
+ {
+ return Platform.getDocumentBase();
+ }
+
+ /**
+ * Get the applet-like code base even though this is an application.
+ */
+ @Override
+ public URL getCodeBase()
+ {
+ return Platform.getCodeBase();
+ }
+
+ @Override
+ public AlignViewportI getViewport()
+ {
+ return af.getViewport();
+ }
+
+ /**
+ * features
+ *
+ */
+ @Override
+ public boolean parseFeaturesFile(String filename,
+ DataSourceType protocol)
+ {
+ return af.parseFeaturesFile(filename, protocol);
+ }
+
+ /**
+ * scorefile
+ *
+ */
+ @Override
+ public boolean loadScoreFile(String sScoreFile) throws IOException
+ {
+ af.loadJalviewDataFile(sScoreFile, null, null, null);
+ return true;
+ }
+
+ /**
+ * annotations, jpredfile, jnetfile
+ *
+ */
+ @Override
+ public void updateForAnnotations()
+ {
+ af.updateForAnnotations();
+ }
+
+ @Override
+ public void loadTree(NewickFile fin, String treeFile)
+ throws IOException
+ {
+ // n/a -- already done by standard Jalview command line processing
+ }
+
+ @Override
+ public void setAlignPdbStructures(boolean defaultParameter)
+ {
+ alignPDBStructures = true;
+ }
+
+ @Override
+ public void newStructureView(PDBEntry pdb, SequenceI[] seqs,
+ String[] chains, DataSourceType protocol)
+ {
+ StructureViewer.launchStructureViewer(af.alignPanel, pdb, seqs);
+ }
+
+ @Override
+ public void setFeatureGroupState(String[] groups, boolean state)
+ {
+ af.setFeatureGroupState(groups, state);
+ }
+
+ @Override
+ public void alignedStructureView(PDBEntry[] pdb, SequenceI[][] seqs,
+ String[][] chains, String[] protocols)
+ {
+ System.err.println(
+ "Jalview applet interface alignedStructureView not implemented");
+ }
+
+ @Override
+ public void newFeatureSettings()
+ {
+ System.err.println(
+ "Jalview applet interface newFeatureSettings not implemented");
+ }
+
+ private Vector<Runnable> jsExecQueue;
+
+ @Override
+ public Vector<Runnable> getJsExecQueue(JSFunctionExec exec)
+ {
+ jsFunctionExec = exec;
+ return (jsExecQueue == null ? (jsExecQueue = new Vector<>())
+ : jsExecQueue);
+ }
+
+ @Override
+ public AppletContext getAppletContext()
+ {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public boolean isJsfallbackEnabled()
+ {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ @Override
+ public JSObject getJSObject()
+ {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public StructureSelectionManagerProvider getStructureSelectionManagerProvider()
+ {
+ // TODO Q: what exactly is this? BH
+ return null;
+ }
+
+ @Override
+ public void updateColoursFromMouseOver(Object source,
+ MouseOverStructureListener mouseOverStructureListener)
+ {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public Object[] getSelectionForListener(SequenceGroup seqsel,
+ ColumnSelection colsel, HiddenColumns hidden,
+ SelectionSource source, Object alignFrame)
+ {
+ return appLoader.getSelectionForListener(getCurrentAlignFrame(),
+ seqsel, colsel, hidden, source, alignFrame);
+ }
+
+ @Override
+ public String arrayToSeparatorList(String[] array)
+ {
+ return appLoader.arrayToSeparatorList(array);
+ }
+
+ @Override
+ public Hashtable<String, int[]> getJSHashes()
+ {
+ return (jshashes == null ? (jshashes = new Hashtable<>())
+ : jshashes);
+ }
+
+ @Override
+ public Hashtable<String, Hashtable<String, String[]>> getJSMessages()
+ {
+ return (jsmessages == null ? (jsmessages = new Hashtable<>())
+ : jsmessages);
+ }
+
+ @Override
+ public Object getFrameForSource(VamsasSource source)
+ {
+ if (source != null)
+ {
+ AlignFrame af;
+ if (source instanceof jalview.gui.AlignViewport
+ && source == (af = getCurrentAlignFrame()).getViewport())
+ {
+ // should be valid if it just generated an event!
+ return af;
+ }
+ // TODO: ensure that if '_af' is specified along with a handler
+ // function, then only events from that alignFrame are sent to that
+ // function
+ }
+ return null;
+ }
+
+ @Override
+ public FeatureRenderer getNewFeatureRenderer(AlignViewportI vp)
+ {
+ return new jalview.gui.FeatureRenderer((AlignmentPanel) vp);
+ }
+
+ };
+
+ appLoader = new JalviewAppLoader(true);
+ appLoader.load(app);
+ }
+
+ /**
+ *
+ * @see jalview.bin.JalviewLiteJsApi#getSelectedSequences()
+ */
+ @Override
+ public String getSelectedSequences()
+ {
+ return getSelectedSequencesFrom(getCurrentAlignFrame());
+ }
+
+ /**
+ *
+ * @see jalview.bin.JalviewLiteJsApi#getSelectedSequences(java.lang.String)
+ */
+ @Override
+ public String getSelectedSequences(String sep)
+ {
+ return getSelectedSequencesFrom(getCurrentAlignFrame(), sep);
+ }
+
+ /**
+ *
+ * @see jalview.bin.JalviewLiteJsApi#getSelectedSequencesFrom(jalview.appletgui
+ * .AlignFrame)
+ */
+ @Override
+ public String getSelectedSequencesFrom(AlignFrameI alf)
+ {
+ return getSelectedSequencesFrom(alf, null);
+ }
+
+ /**
+ *
+ * @see jalview.bin.JalviewLiteJsApi#getSelectedSequencesFrom(jalview.appletgui
+ * .AlignFrame, java.lang.String)
+ */
+ @Override
+ public String getSelectedSequencesFrom(AlignFrameI alf, String sep)
+ {
+ return appLoader.getSelectedSequencesFrom(alf, sep);
+ }
+
+ /**
+ *
+ * @see jalview.bin.JalviewLiteJsApi#getSelectedSequencesFrom(jalview.appletgui
+ * .AlignFrame, java.lang.String)
+ */
+ @Override
+ public void highlight(String sequenceId, String position,
+ String alignedPosition)
+ {
+ highlightIn(getCurrentAlignFrame(), sequenceId, position,
+ alignedPosition);
+ }
+
+ @Override
+ public void highlightIn(AlignFrameI alf, String sequenceId,
+ String position, String alignedPosition)
+ {
+ appLoader.highlightIn(alf, sequenceId, position, alignedPosition);
+ }
+
+ @Override
+ public void select(String sequenceIds, String columns)
+ {
+ selectIn(getCurrentAlignFrame(), sequenceIds, columns, null);
+ }
+
+ @Override
+ public void select(String sequenceIds, String columns, String sep)
+ {
+ selectIn(getCurrentAlignFrame(), sequenceIds, columns, sep);
+ }
+
+ @Override
+ public void selectIn(AlignFrameI alf, String sequenceIds, String columns)
+ {
+ selectIn(alf, sequenceIds, columns, null);
+ }
+
+ @Override
+ public void selectIn(AlignFrameI alf, String sequenceIds, String columns,
+ String sep)
+ {
+ appLoader.selectIn(alf, sequenceIds, columns, sep);
+ }
+
+ @Override
+ public String getSelectedSequencesAsAlignment(String format,
+ String suffix)
+ {
+ return getSelectedSequencesAsAlignmentFrom(getCurrentAlignFrame(),
+ format, suffix);
+ }
+
+ @Override
+ public String getSelectedSequencesAsAlignmentFrom(AlignFrameI alf,
+ String format, String sep)
+ {
+ return appLoader.getSelectedSequencesAsAlignmentFrom(alf, format, sep);
+ }
+
+ @Override
+ public String getAlignmentOrder()
+ {
+ return getAlignmentFrom(getCurrentAlignFrame(), null);
+ }
+
+ @Override
+ public String getAlignmentOrderFrom(AlignFrameI alf)
+ {
+ return getAlignmentFrom(alf, null);
+ }
+
+ @Override
+ public String getAlignmentOrderFrom(AlignFrameI alf, String sep)
+ {
+ return appLoader.getAlignmentOrderFrom(alf, sep);
+ }
+
+ @Override
+ public String orderBy(String order, String undoName)
+ {
+ return orderBy(order, undoName, null);
+ }
+
+ @Override
+ public String orderBy(String order, String undoName, String sep)
+ {
+ return orderAlignmentBy(getCurrentAlignFrame(), order, undoName, sep);
+ }
+
+ @Override
+ public String orderAlignmentBy(AlignFrameI alf, String order,
+ String undoName, String sep)
+ {
+ return appLoader.orderAlignmentBy(alf, order, undoName, sep);
+ }
+
+ @Override
+ public String getAlignment(String format)
+ {
+ return getAlignmentFrom(null, format, null);
+ }
+
+ @Override
+ public String getAlignmentFrom(AlignFrameI alf, String format)
+ {
+ return getAlignmentFrom(alf, format, null);
+ }
+
+ @Override
+ public String getAlignment(String format, String suffix)
+ {
+ return getAlignmentFrom(getCurrentAlignFrame(), format, suffix);
+ }
+
+ @Override
+ public String getAlignmentFrom(AlignFrameI alf, String format,
+ String suffix)
+ {
+ return appLoader.getAlignmentFrom(alf, format, suffix);
+ }
+
+ @Override
+ public void loadAnnotation(String annotation)
+ {
+ loadAnnotationFrom(getCurrentAlignFrame(), annotation);
+ }
+
+ @Override
+ public void loadAnnotationFrom(AlignFrameI alf, String annotation)
+ {
+ appLoader.loadAnnotationFrom(alf, annotation);
+ }
+
+ @Override
+ public void loadFeatures(String features, boolean autoenabledisplay)
+ {
+ loadFeaturesFrom(currentAlignFrame, features, autoenabledisplay);
+ }
+
+ @Override
+ public boolean loadFeaturesFrom(AlignFrameI alf, String features,
+ boolean autoenabledisplay)
+ {
+ return appLoader.loadFeaturesFrom(alf, features, autoenabledisplay);
+ }
+
+ @Override
+ public String getFeatures(String format)
+ {
+ return getFeaturesFrom(getCurrentAlignFrame(), format);
+ }
+
+ @Override
+ public String getFeaturesFrom(AlignFrameI alf, String format)
+ {
+ return appLoader.getFeaturesFrom(alf, format);
+ }
+
+ @Override
+ public String getAnnotation()
+ {
+ return getAnnotationFrom(getCurrentAlignFrame());
+ }
+
+ @Override
+ public String getAnnotationFrom(AlignFrameI alf)
+ {
+ return appLoader.getAnnotationFrom(alf);
+ }
+
+ @Override
+ public AlignFrameI newView()
+ {
+ return newViewFrom(getCurrentAlignFrame(), null);
+ }
+
+ @Override
+ public AlignFrameI newView(String name)
+ {
+ return newViewFrom(getCurrentAlignFrame(), name);
+ }
+
+ @Override
+ public AlignFrameI newViewFrom(AlignFrameI alf)
+ {
+ return newViewFrom(alf, null);
+ }
+
+ @Override
+ public AlignFrameI newViewFrom(AlignFrameI alf, String name)
+ {
+ return appLoader.newViewFrom(alf, name);
+ }
+
+ @Override
+ public AlignFrameI loadAlignment(String text, String title)
+ {
+ return appLoader.loadAlignment(text, AlignFrame.DEFAULT_WIDTH,
+ AlignFrame.DEFAULT_HEIGHT, title);
+ }
+
+ @Override
+ public boolean addPdbFile(AlignFrameI alFrame, String sequenceId,
+ String pdbEntryString, String pdbFile)
+ {
+ return appLoader.addPdbFile(alFrame, sequenceId, pdbEntryString,
+ pdbFile);
+ }
+
+ @Override
+ public void scrollViewToIn(AlignFrameI alf, String topRow,
+ String leftHandColumn)
+ {
+ appLoader.scrollViewToIn(alf, topRow, leftHandColumn);
+ }
+
+ @Override
+ public void scrollViewToRowIn(AlignFrameI alf, String topRow)
+ {
+ appLoader.scrollViewToRowIn(alf, topRow);
+ }
+
+ @Override
+ public void scrollViewToColumnIn(AlignFrameI alf, String leftHandColumn)
+ {
+ appLoader.scrollViewToColumnIn(alf, leftHandColumn);
+ }
+
+ @Override
+ public String getFeatureGroups()
+ {
+ return getFeatureGroupsOn(getCurrentAlignFrame());
+ }
+
+ @Override
+ public String getFeatureGroupsOn(AlignFrameI alf)
+ {
+ return appLoader.getFeatureGroupsOn(alf);
+ }
+
+ @Override
+ public String getFeatureGroupsOfState(boolean visible)
+ {
+ return getFeatureGroupsOfStateOn(getCurrentAlignFrame(), visible);
+ }
+
+ @Override
+ public String getFeatureGroupsOfStateOn(AlignFrameI alf, boolean visible)
+ {
+ return appLoader.getFeatureGroupsOfStateOn(alf, visible);
+ }
+
+ @Override
+ public void setFeatureGroupStateOn(AlignFrameI alf, String groups,
+ boolean state)
+ {
+ setFeatureGroupStateOn(alf, groups, state);
+ }
+
+ @Override
+ public void setFeatureGroupState(String groups, boolean state)
+ {
+ appLoader.setFeatureGroupStateOn(getCurrentAlignFrame(), groups, state);
+ }
+
+ @Override
+ public String getSeparator()
+ {
+ return appLoader.getSeparator();
+ }
+
+ @Override
+ public void setSeparator(String separator)
+ {
+ appLoader.setSeparator(separator);
+ }
+
+ @Override
+ public String getJsMessage(String messageclass, String viewId)
+ {
+ // see http://www.jalview.org/examples/jalviewLiteJs.html
+ return null;
+ }
+
+ /**
+ * Open a new Tree panel on the desktop statically. Params are standard (not
+ * set by Groovy). No dialog is opened.
+ *
+ * @param af
+ * @param treeType
+ * @param modelName
+ * @return null, or the string "label.you_need_at_least_n_sequences" if number
+ * of sequences selected is inappropriate
+ */
+ @Override
+ public Object openTreePanel(AlignFrame af, String treeType,
+ String modelName)
+ {
+ return CalculationChooser.openTreePanel(af, treeType, modelName, null);
+ }
+
+ /**
+ * public static method for JalviewJS API to open a PCAPanel without
+ * necessarily using a dialog.
+ *
+ * @param af
+ * @param modelName
+ * @return the PCAPanel, or the string "label.you_need_at_least_n_sequences"
+ * if number of sequences selected is inappropriate
+ */
+ @Override
+ public Object openPcaPanel(AlignFrame af, String modelName)
+ {
+ return CalculationChooser.openPcaPanel(af, modelName, null);
+ }
+
+ @Override
+ public String getSelectedSequencesAsAlignment(String format,
+ boolean suffix)
+ {
+ return getSelectedSequencesAsAlignmentFrom(getCurrentAlignFrame(),
+ format, suffix);
+ }
+
+ @Override
+ public String getSelectedSequencesAsAlignmentFrom(AlignFrameI alf,
+ String format, boolean suffix)
+ {
+ return appLoader.getSelectedSequencesAsAlignmentFrom(alf, format,
+ "" + suffix);
+ }
+
+ @Override
+ public String arrayToSeparatorList(String[] array)
+ {
+ return appLoader.arrayToSeparatorList(array);
+ }
+
+ @Override
+ public String[] separatorListToArray(String list)
+ {
+ return appLoader.separatorListToArray(list);
+ }
+
+ //// probably not needed in JalviewJS -- From when Jmol and Jalview did not
+ //// have a direct connection?
+
+ @Override
+ public void setMouseoverListener(String listener)
+ {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void setMouseoverListener(AlignFrameI af, String listener)
+ {
+ // TODO Auto-generated method stub
+
}
+
+ @Override
+ public void setSelectionListener(String listener)
+ {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void setSelectionListener(AlignFrameI af, String listener)
+ {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void setStructureListener(String listener, String modelSet)
+ {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void removeJavascriptListener(AlignFrameI af, String listener)
+ {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void mouseOverStructure(String pdbResNum, String chain,
+ String pdbfile)
+ {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void showOverview()
+ {
+ currentAlignFrame.overviewMenuItem_actionPerformed(null);
+ }
+
+ public void notifyWorker(AlignCalcWorkerI worker, String status)
+ {
+ // System.out.println("Jalview worker " + worker.getClass().getSimpleName()
+ // + " " + status);
+ }
+
}
+
--- /dev/null
+package jalview.bin;
+
+import jalview.api.AlignFrameI;
+import jalview.api.JalviewApp;
+import jalview.api.StructureSelectionManagerProvider;
+import jalview.datamodel.Alignment;
+import jalview.datamodel.AlignmentI;
+import jalview.datamodel.AlignmentOrder;
+import jalview.datamodel.ColumnSelection;
+import jalview.datamodel.HiddenColumns;
+import jalview.datamodel.PDBEntry;
+import jalview.datamodel.Sequence;
+import jalview.datamodel.SequenceGroup;
+import jalview.datamodel.SequenceI;
+import jalview.gui.AlignFrame;
+import jalview.gui.AlignViewport;
+import jalview.gui.Desktop;
+import jalview.io.AnnotationFile;
+import jalview.io.AppletFormatAdapter;
+import jalview.io.DataSourceType;
+import jalview.io.FeaturesFile;
+import jalview.io.FileFormat;
+import jalview.io.FileFormatI;
+import jalview.io.FileFormats;
+import jalview.io.IdentifyFile;
+import jalview.io.JPredFile;
+import jalview.io.JnetAnnotationMaker;
+import jalview.io.NewickFile;
+import jalview.structure.SelectionSource;
+import jalview.structure.StructureSelectionManager;
+import jalview.util.HttpUtils;
+import jalview.util.MessageManager;
+
+import java.awt.EventQueue;
+import java.io.IOException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.StringTokenizer;
+import java.util.Vector;
+
+/**
+ * A class to load parameters for either JalviewLite or Jalview
+ *
+ * @author hansonr
+ *
+ */
+public class JalviewAppLoader
+{
+
+ private JalviewApp app; // Jalview or JalviewJS or JalviewLite
+
+ private boolean debug;
+
+ String separator = "\u00AC"; // JalviewLite note: the default used to
+ // be '|', but many sequence IDS include
+ // pipes.
+
+ public String getSeparator()
+ {
+ return separator;
+ }
+
+ public void setSeparator(String separator)
+ {
+ this.separator = separator;
+ }
+
+ public JalviewAppLoader(boolean debug)
+ {
+ this.debug = debug;
+ }
+
+ public void load(JalviewApp app)
+ {
+
+ this.app = app;
+
+ String sep = app.getParameter("separator");
+ if (sep != null)
+ {
+ if (sep.length() > 0)
+ {
+ separator = sep;
+ }
+ else
+ {
+ throw new Error(MessageManager
+ .getString("error.invalid_separator_parameter"));
+ }
+ }
+
+ loadTree();
+ loadScoreFile();
+ loadFeatures();
+ loadAnnotations();
+ loadJnetFile();
+ loadPdbFiles();
+ callInitCallback();
+ }
+
+ /**
+ * Load PDBFiles if any specified by parameter(s). Returns true if loaded,
+ * else false.
+ *
+ * @param loaderFrame
+ * @return
+ */
+ protected boolean loadPdbFiles()
+ {
+ boolean result = false;
+ /*
+ * <param name="alignpdbfiles" value="false/true"/> Undocumented for 2.6 -
+ * related to JAL-434
+ */
+
+ boolean doAlign = app.getDefaultParameter("alignpdbfiles", false);
+ app.setAlignPdbStructures(doAlign);
+ /*
+ * <param name="PDBfile" value="1gaq.txt PDB|1GAQ|1GAQ|A PDB|1GAQ|1GAQ|B
+ * PDB|1GAQ|1GAQ|C">
+ *
+ * <param name="PDBfile2" value="1gaq.txt A=SEQA B=SEQB C=SEQB">
+ *
+ * <param name="PDBfile3" value="1q0o Q45135_9MICO">
+ */
+
+ // Accumulate pdbs here if they are heading for the same view (if
+ // alignPdbStructures is true)
+ Vector<Object[]> pdbs = new Vector<>();
+ // create a lazy matcher if we're asked to
+ jalview.analysis.SequenceIdMatcher matcher = (app
+ .getDefaultParameter("relaxedidmatch", false))
+ ? new jalview.analysis.SequenceIdMatcher(
+ app.getViewport().getAlignment()
+ .getSequencesArray())
+ : null;
+
+ int pdbFileCount = 0;
+ String param;
+ do
+ {
+ if (pdbFileCount > 0)
+ {
+ param = app.getParameter("PDBFILE" + pdbFileCount);
+ }
+ else
+ {
+ param = app.getParameter("PDBFILE");
+ }
+
+ if (param != null)
+ {
+ PDBEntry pdb = new PDBEntry();
+
+ String seqstring;
+ SequenceI[] seqs = null;
+ String[] chains = null;
+
+ StringTokenizer st = new StringTokenizer(param, " ");
+
+ if (st.countTokens() < 2)
+ {
+ String sequence = app.getParameter("PDBSEQ");
+ if (sequence != null)
+ {
+ seqs = new SequenceI[] { matcher == null
+ ? (Sequence) app.getViewport().getAlignment()
+ .findName(sequence)
+ : matcher.findIdMatch(sequence) };
+ }
+
+ }
+ else
+ {
+ param = st.nextToken();
+ List<SequenceI> tmp = new ArrayList<>();
+ List<String> tmp2 = new ArrayList<>();
+
+ while (st.hasMoreTokens())
+ {
+ seqstring = st.nextToken();
+ StringTokenizer st2 = new StringTokenizer(seqstring, "=");
+ if (st2.countTokens() > 1)
+ {
+ // This is the chain
+ tmp2.add(st2.nextToken());
+ seqstring = st2.nextToken();
+ }
+ tmp.add(matcher == null
+ ? (Sequence) app.getViewport().getAlignment()
+ .findName(seqstring)
+ : matcher.findIdMatch(seqstring));
+ }
+
+ seqs = tmp.toArray(new SequenceI[tmp.size()]);
+ if (tmp2.size() == tmp.size())
+ {
+ chains = tmp2.toArray(new String[tmp2.size()]);
+ }
+ }
+ pdb.setId(param);
+ ret[0] = param;
+ DataSourceType protocol = resolveFileProtocol(app, ret);
+ // TODO check JAL-357 for files in a jar (CLASSLOADER)
+ pdb.setFile(ret[0]);
+
+ if (seqs != null)
+ {
+ for (int i = 0; i < seqs.length; i++)
+ {
+ if (seqs[i] != null)
+ {
+ ((Sequence) seqs[i]).addPDBId(pdb);
+ StructureSelectionManager
+ .getStructureSelectionManager(
+ (StructureSelectionManagerProvider) app)
+ .registerPDBEntry(pdb);
+ }
+ else
+ {
+ if (debug)
+ {
+ // this may not really be a problem but we give a warning
+ // anyway
+ System.err.println(
+ "Warning: Possible input parsing error: Null sequence for attachment of PDB (sequence "
+ + i + ")");
+ }
+ }
+ }
+
+ if (doAlign)
+ {
+ pdbs.addElement(new Object[] { pdb, seqs, chains, protocol });
+ }
+ else
+ {
+ app.newStructureView(pdb, seqs, chains, protocol);
+ }
+ }
+ }
+
+ pdbFileCount++;
+ } while (param != null || pdbFileCount < 10);
+ if (pdbs.size() > 0)
+ {
+ SequenceI[][] seqs = new SequenceI[pdbs.size()][];
+ PDBEntry[] pdb = new PDBEntry[pdbs.size()];
+ String[][] chains = new String[pdbs.size()][];
+ String[] protocols = new String[pdbs.size()];
+ for (int pdbsi = 0, pdbsiSize = pdbs
+ .size(); pdbsi < pdbsiSize; pdbsi++)
+ {
+ Object[] o = pdbs.elementAt(pdbsi);
+ pdb[pdbsi] = (PDBEntry) o[0];
+ seqs[pdbsi] = (SequenceI[]) o[1];
+ chains[pdbsi] = (String[]) o[2];
+ protocols[pdbsi] = (String) o[3];
+ }
+ app.alignedStructureView(pdb, seqs, chains, protocols);
+ result = true;
+ }
+ return result;
+ }
+
+ /**
+ * Load in a Jnetfile if specified by parameter. Returns true if loaded, else
+ * false.
+ *
+ * @param alignFrame
+ * @return
+ */
+ protected boolean loadJnetFile()
+ {
+ boolean result = false;
+ String param = app.getParameter("jnetfile");
+ if (param == null)
+ {
+ // jnet became jpred around 2016
+ param = app.getParameter("jpredfile");
+ }
+ if (param != null)
+ {
+ try
+ {
+ ret[0] = param;
+ DataSourceType protocol = resolveFileProtocol(app, ret);
+ JPredFile predictions = new JPredFile(ret[0], protocol);
+ JnetAnnotationMaker.add_annotation(predictions,
+ app.getViewport().getAlignment(), 0, false);
+ // false == do not add sequence profile from concise output
+ app.getViewport().getAlignment().setupJPredAlignment();
+ app.updateForAnnotations();
+ result = true;
+ } catch (Exception ex)
+ {
+ ex.printStackTrace();
+ }
+ }
+ return result;
+ }
+
+ /**
+ * Load annotations if specified by parameter. Returns true if loaded, else
+ * false.
+ *
+ * @param alignFrame
+ * @return
+ */
+ protected boolean loadAnnotations()
+ {
+ boolean result = false;
+ String param = app.getParameter("annotations");
+ if (param != null)
+ {
+ ret[0] = param;
+ DataSourceType protocol = resolveFileProtocol(app, ret);
+ param = ret[0];
+ if (new AnnotationFile().annotateAlignmentView(app.getViewport(),
+ param, protocol))
+ {
+ app.updateForAnnotations();
+ result = true;
+ }
+ else
+ {
+ System.err
+ .println("Annotations were not added from annotation file '"
+ + param + "'");
+ }
+ }
+ return result;
+ }
+
+ /**
+ * Load features file and view settings as specified by parameters. Returns
+ * true if features were loaded, else false.
+ *
+ * @param alignFrame
+ * @return
+ */
+ protected boolean loadFeatures()
+ {
+ boolean result = false;
+ // ///////////////////////////
+ // modify display of features
+ // we do this before any features have been loaded, ensuring any hidden
+ // groups are hidden when features first displayed
+ //
+ // hide specific groups
+ //
+ String param = app.getParameter("hidefeaturegroups");
+ if (param != null)
+ {
+ app.setFeatureGroupState(separatorListToArray(param, separator),
+ false);
+ // app.setFeatureGroupStateOn(newAlignFrame, param, false);
+ }
+ // show specific groups
+ param = app.getParameter("showfeaturegroups");
+ if (param != null)
+ {
+ app.setFeatureGroupState(separatorListToArray(param, separator),
+ true);
+ // app.setFeatureGroupStateOn(newAlignFrame, param, true);
+ }
+ // and now load features
+ param = app.getParameter("features");
+ if (param != null)
+ {
+ ret[0] = param;
+ DataSourceType protocol = resolveFileProtocol(app, ret);
+
+ result = app.parseFeaturesFile(ret[0], protocol);
+ }
+
+ param = app.getParameter("showFeatureSettings");
+ if (param != null && param.equalsIgnoreCase("true"))
+ {
+ app.newFeatureSettings();
+ }
+ return result;
+ }
+
+ /**
+ * Load a score file if specified by parameter. Returns true if file was
+ * loaded, else false.
+ *
+ * @param loaderFrame
+ */
+ protected boolean loadScoreFile()
+ {
+ boolean result = false;
+ String sScoreFile = app.getParameter("scoreFile");
+ if (sScoreFile != null && !"".equals(sScoreFile))
+ {
+ try
+ {
+ if (debug)
+ {
+ System.err.println(
+ "Attempting to load T-COFFEE score file from the scoreFile parameter");
+ }
+ result = app.loadScoreFile(sScoreFile);
+ if (!result)
+ {
+ System.err.println(
+ "Failed to parse T-COFFEE parameter as a valid score file ('"
+ + sScoreFile + "')");
+ }
+ } catch (Exception e)
+ {
+ System.err.printf("Cannot read score file: '%s'. Cause: %s \n",
+ sScoreFile, e.getMessage());
+ }
+ }
+ return result;
+ }
+
+ String[] ret = new String[1];
+
+ /**
+ * Load a tree for the alignment if specified by parameter. Returns true if a
+ * tree was loaded, else false.
+ *
+ * @param loaderFrame
+ * @return
+ */
+ protected boolean loadTree()
+ {
+ boolean result = false;
+ String treeFile = app.getParameter("tree");
+ if (treeFile == null)
+ {
+ treeFile = app.getParameter("treeFile");
+ }
+
+ if (treeFile != null)
+ {
+ try
+ {
+ ret[0] = treeFile;
+ NewickFile fin = new NewickFile(treeFile,
+ resolveFileProtocol(app, ret));
+ fin.parse();
+
+ if (fin.getTree() != null)
+ {
+ app.loadTree(fin, ret[0]);
+ result = true;
+ if (debug)
+ {
+ System.out.println("Successfully imported tree.");
+ }
+ }
+ else
+ {
+ if (debug)
+ {
+ System.out.println(
+ "Tree parameter did not resolve to a valid tree.");
+ }
+ }
+ } catch (Exception ex)
+ {
+ ex.printStackTrace();
+ }
+ }
+ return result;
+ }
+
+ /**
+ * form a complete URL given a path to a resource and a reference location on
+ * the same server
+ *
+ * @param targetPath
+ * - an absolute path on the same server as localref or a document
+ * located relative to localref
+ * @param localref
+ * - a URL on the same server as url
+ * @return a complete URL for the resource located by url
+ */
+ public static String resolveUrlForLocalOrAbsolute(String targetPath,
+ URL localref)
+ {
+ String resolvedPath = "";
+ if (targetPath.startsWith("/"))
+ {
+ String codebase = localref.toString();
+ String localfile = localref.getFile();
+ resolvedPath = codebase.substring(0,
+ codebase.length() - localfile.length()) + targetPath;
+ return resolvedPath;
+ }
+
+ /*
+ * get URL path and strip off any trailing file e.g.
+ * www.jalview.org/examples/index.html#applets?a=b is trimmed to
+ * www.jalview.org/examples/
+ */
+ String urlPath = localref.toString();
+ String directoryPath = urlPath;
+ int lastSeparator = directoryPath.lastIndexOf("/");
+ if (lastSeparator > 0)
+ {
+ directoryPath = directoryPath.substring(0, lastSeparator + 1);
+ }
+
+ if (targetPath.startsWith("/"))
+ {
+ /*
+ * construct absolute URL to a file on the server - this is not allowed?
+ */
+ // String localfile = localref.getFile();
+ // resolvedPath = urlPath.substring(0,
+ // urlPath.length() - localfile.length())
+ // + targetPath;
+ resolvedPath = directoryPath + targetPath.substring(1);
+ }
+ else
+ {
+ resolvedPath = directoryPath + targetPath;
+ }
+ // if (debug)
+ // {
+ // System.err.println(
+ // "resolveUrlForLocalOrAbsolute returning " + resolvedPath);
+ // }
+ return resolvedPath;
+ }
+
+ /**
+ * parse the string into a list
+ *
+ * @param list
+ * @param separator
+ * @return elements separated by separator
+ */
+ public static String[] separatorListToArray(String list, String separator)
+ {
+ // TODO use StringUtils version (slightly different...)
+ int seplen = separator.length();
+ if (list == null || list.equals("") || list.equals(separator))
+ {
+ return null;
+ }
+ Vector<String> jv = new Vector<>();
+ int cp = 0, pos;
+ while ((pos = list.indexOf(separator, cp)) > cp)
+ {
+ jv.addElement(list.substring(cp, pos));
+ cp = pos + seplen;
+ }
+ if (cp < list.length())
+ {
+ String c = list.substring(cp);
+ if (!c.equals(separator))
+ {
+ jv.addElement(c);
+ }
+ }
+ if (jv.size() > 0)
+ {
+ String[] v = new String[jv.size()];
+ for (int i = 0; i < v.length; i++)
+ {
+ v[i] = jv.elementAt(i);
+ }
+ jv.removeAllElements();
+ // if (debug)
+ // {
+ // System.err.println("Array from '" + separator
+ // + "' separated List:\n" + v.length);
+ // for (int i = 0; i < v.length; i++)
+ // {
+ // System.err.println("item " + i + " '" + v[i] + "'");
+ // }
+ // }
+ return v;
+ }
+ // if (debug)
+ // {
+ // System.err.println(
+ // "Empty Array from '" + separator + "' separated List");
+ // }
+ return null;
+ }
+
+ public static DataSourceType resolveFileProtocol(JalviewApp app,
+ String[] retPath)
+ {
+ String path = retPath[0];
+ /*
+ * is it paste data?
+ */
+ if (path.startsWith("PASTE"))
+ {
+ retPath[0] = path.substring(5);
+ return DataSourceType.PASTE;
+ }
+
+ /*
+ * is it a URL?
+ */
+ if (path.indexOf("://") >= 0)
+ {
+ return DataSourceType.URL;
+ }
+
+ /*
+ * try relative to document root
+ */
+ URL documentBase = app.getDocumentBase();
+ String withDocBase = resolveUrlForLocalOrAbsolute(path, documentBase);
+ if (HttpUtils.isValidUrl(withDocBase))
+ {
+ // if (debug)
+ // {
+ // System.err.println("Prepended document base '" + documentBase
+ // + "' to make: '" + withDocBase + "'");
+ // }
+ retPath[0] = withDocBase;
+ return DataSourceType.URL;
+ }
+
+ /*
+ * try relative to codebase (if different to document base)
+ */
+ URL codeBase = app.getCodeBase();
+ String withCodeBase = resolveUrlForLocalOrAbsolute(path, codeBase);
+ if (!withCodeBase.equals(withDocBase)
+ && HttpUtils.isValidUrl(withCodeBase))
+ {
+ // if (debug)
+ // {
+ // System.err.println("Prepended codebase '" + codeBase
+ // + "' to make: '" + withCodeBase + "'");
+ // }
+ retPath[0] = withCodeBase;
+ return DataSourceType.URL;
+ }
+
+ /*
+ * try locating by classloader; try this last so files in the directory
+ * are resolved using document base
+ */
+ if (inArchive(app.getClass(), path))
+ {
+ return DataSourceType.CLASSLOADER;
+ }
+ return null;
+ }
+
+ /**
+ * Discovers whether the given file is in the Applet Archive
+ *
+ * @param f
+ * String
+ * @return boolean
+ */
+ private static boolean inArchive(Class<?> c, String f)
+ {
+ // This might throw a security exception in certain browsers
+ // Netscape Communicator for instance.
+ try
+ {
+ boolean rtn = (c.getResourceAsStream("/" + f) != null);
+ // if (debug)
+ // {
+ // System.err.println("Resource '" + f + "' was "
+ // + (rtn ? "" : "not ") + "located by classloader.");
+ // }
+ return rtn;
+ } catch (Exception ex)
+ {
+ System.out.println("Exception checking resources: " + f + " " + ex);
+ return false;
+ }
+ }
+
+ public void callInitCallback()
+ {
+ String initjscallback = app.getParameter("oninit");
+ if (initjscallback == null)
+ {
+ return;
+ }
+ initjscallback = initjscallback.trim();
+ if (initjscallback.length() > 0)
+ {
+ // TODO
+ }
+ }
+
+ /**
+ * read sequence1...sequenceN as a raw alignment
+ *
+ * @param jalviewApp
+ * @return
+ */
+ public String getPastedSequence(JalviewApp jalviewApp)
+ {
+ StringBuffer data = new StringBuffer("PASTE");
+ int i = 1;
+ String file = null;
+ while ((file = app.getParameter("sequence" + i)) != null)
+ {
+ data.append(file.toString() + "\n");
+ i++;
+ }
+ if (data.length() > 5)
+ {
+ file = data.toString();
+ }
+ return file;
+ }
+
+ /**
+ * concatenate the list with separator
+ *
+ * @param list
+ * @param separator
+ * @return concatenated string
+ */
+ public static String arrayToSeparatorList(String[] list, String separator)
+ {
+ // TODO use StringUtils version
+ StringBuffer v = new StringBuffer();
+ if (list != null && list.length > 0)
+ {
+ for (int i = 0, iSize = list.length; i < iSize; i++)
+ {
+ if (list[i] != null)
+ {
+ if (i > 0)
+ {
+ v.append(separator);
+ }
+ v.append(list[i]);
+ }
+ }
+ // if (debug)
+ // {
+ // System.err
+ // .println("Returning '" + separator + "' separated List:\n");
+ // System.err.println(v);
+ // }
+ return v.toString();
+ }
+ // if (debug)
+ // {
+ // System.err.println(
+ // "Returning empty '" + separator + "' separated List\n");
+ // }
+ return "" + separator;
+ }
+
+ public String arrayToSeparatorList(String[] array)
+ {
+ return arrayToSeparatorList(array, separator);
+ }
+
+ public String getSelectedSequencesFrom(AlignFrameI alf, String sep)
+ {
+ StringBuffer result = new StringBuffer("");
+ if (sep == null || sep.length() == 0)
+ {
+ sep = separator; // "+0x00AC;
+ }
+ AlignViewport v = ((AlignFrame) alf).getViewport();
+ if (v.getSelectionGroup() != null)
+ {
+ SequenceI[] seqs = v.getSelectionGroup()
+ .getSequencesInOrder(v.getAlignment());
+
+ for (int i = 0; i < seqs.length; i++)
+ {
+ result.append(seqs[i].getName());
+ result.append(sep);
+ }
+ }
+
+ return result.toString();
+ }
+
+ public void setFeatureGroupStateOn(final AlignFrameI alf,
+ final String groups, boolean state)
+ {
+ java.awt.EventQueue.invokeLater(new Runnable()
+ {
+ @Override
+ public void run()
+ {
+ ((AlignFrame) alf).setFeatureGroupState(
+ separatorListToArray(groups, separator), state);
+ }
+ });
+ }
+
+ public String getFeatureGroupsOfStateOn(AlignFrameI alf, boolean visible)
+ {
+ return arrayToSeparatorList(
+ ((AlignFrame) alf).getFeatureGroupsOfState(visible));
+ }
+
+ public void scrollViewToIn(final AlignFrameI alf, final String topRow,
+ final String leftHandColumn)
+ {
+ java.awt.EventQueue.invokeLater(new Runnable()
+ {
+ @Override
+ public void run()
+ {
+ try
+ {
+ ((AlignFrame) alf).scrollTo(new Integer(topRow).intValue(),
+ new Integer(leftHandColumn).intValue());
+
+ } catch (Exception ex)
+ {
+ System.err.println("Couldn't parse integer arguments (topRow='"
+ + topRow + "' and leftHandColumn='" + leftHandColumn
+ + "')");
+ ex.printStackTrace();
+ }
+ }
+ });
+ }
+
+ public void scrollViewToRowIn(final AlignFrameI alf, final String topRow)
+ {
+
+ java.awt.EventQueue.invokeLater(new Runnable()
+ {
+ @Override
+ public void run()
+ {
+ try
+ {
+ ((AlignFrame) alf).scrollToRow(new Integer(topRow).intValue());
+
+ } catch (Exception ex)
+ {
+ System.err.println("Couldn't parse integer arguments (topRow='"
+ + topRow + "')");
+ ex.printStackTrace();
+ }
+
+ }
+ });
+ }
+
+ public void scrollViewToColumnIn(final AlignFrameI alf,
+ final String leftHandColumn)
+ {
+ java.awt.EventQueue.invokeLater(new Runnable()
+ {
+
+ @Override
+ public void run()
+ {
+ try
+ {
+ ((AlignFrame) alf)
+ .scrollToColumn(new Integer(leftHandColumn).intValue());
+
+ } catch (Exception ex)
+ {
+ System.err.println(
+ "Couldn't parse integer arguments (leftHandColumn='"
+ + leftHandColumn + "')");
+ ex.printStackTrace();
+ }
+ }
+ });
+
+ }
+
+ public boolean addPdbFile(AlignFrameI alf, String sequenceId,
+ String pdbEntryString, String pdbFile)
+ {
+ AlignFrame alFrame = (AlignFrame) alf;
+ SequenceI toaddpdb = alFrame.getViewport().getAlignment()
+ .findName(sequenceId);
+ boolean needtoadd = false;
+ if (toaddpdb != null)
+ {
+ Vector<PDBEntry> pdbe = toaddpdb.getAllPDBEntries();
+ PDBEntry pdbentry = null;
+ if (pdbe != null && pdbe.size() > 0)
+ {
+ for (int pe = 0, peSize = pdbe.size(); pe < peSize; pe++)
+ {
+ pdbentry = pdbe.elementAt(pe);
+ if (!pdbentry.getId().equals(pdbEntryString)
+ && !pdbentry.getFile().equals(pdbFile))
+ {
+ pdbentry = null;
+ }
+ else
+ {
+ continue;
+ }
+ }
+ }
+ if (pdbentry == null)
+ {
+ pdbentry = new PDBEntry();
+ pdbentry.setId(pdbEntryString);
+ pdbentry.setFile(pdbFile);
+ needtoadd = true; // add this new entry to sequence.
+ }
+ // resolve data source
+ // TODO: this code should be a refactored to an io package
+ DataSourceType protocol = AppletFormatAdapter.resolveProtocol(pdbFile,
+ FileFormat.PDB);
+ if (protocol == null)
+ {
+ return false;
+ }
+ if (needtoadd)
+ {
+ pdbentry.setProperty("protocol", protocol);
+ toaddpdb.addPDBId(pdbentry);
+ alFrame.alignPanel.getStructureSelectionManager()
+ .registerPDBEntry(pdbentry);
+ }
+ }
+ return true;
+ }
+
+ public AlignFrameI loadAlignment(String text, int width, int height,
+ String title)
+ {
+ AlignmentI al = null;
+
+ try
+ {
+ FileFormatI format = new IdentifyFile().identify(text,
+ DataSourceType.PASTE);
+ al = new AppletFormatAdapter().readFile(text, DataSourceType.PASTE,
+ format);
+ if (al.getHeight() > 0)
+ {
+ return new AlignFrame(al, width, height, title);
+ }
+ } catch (IOException ex)
+ {
+ ex.printStackTrace();
+ }
+ return null;
+ }
+
+ public String getFeatureGroupsOn(AlignFrameI alf)
+ {
+ return arrayToSeparatorList(
+ ((AlignFrame) alf).getFeatureGroups());
+ }
+
+ public void highlightIn(final AlignFrameI alf, final String sequenceId,
+ final String position, final String alignedPosition)
+ {
+ // TODO: could try to highlight in all alignments if alf==null
+ jalview.analysis.SequenceIdMatcher matcher = new jalview.analysis.SequenceIdMatcher(
+ ((AlignFrame) alf).getViewport().getAlignment()
+ .getSequencesArray());
+ final SequenceI sq = matcher.findIdMatch(sequenceId);
+ if (sq != null)
+ {
+ int apos = -1;
+ try
+ {
+ apos = new Integer(position).intValue();
+ apos--;
+ } catch (NumberFormatException ex)
+ {
+ return;
+ }
+ final int pos = apos;
+ // use vamsas listener to broadcast to all listeners in scope
+ if (alignedPosition != null && (alignedPosition.trim().length() == 0
+ || alignedPosition.toLowerCase().indexOf("false") > -1))
+ {
+ java.awt.EventQueue.invokeLater(new Runnable()
+ {
+ @Override
+ public void run()
+ {
+ StructureSelectionManager
+ .getStructureSelectionManager(Desktop.getInstance())
+ .mouseOverVamsasSequence(sq, sq.findIndex(pos), null);
+ }
+ });
+ }
+ else
+ {
+ java.awt.EventQueue.invokeLater(new Runnable()
+ {
+ @Override
+ public void run()
+ {
+ StructureSelectionManager
+ .getStructureSelectionManager(Desktop.getInstance())
+ .mouseOverVamsasSequence(sq, pos, null);
+ }
+ });
+ }
+ }
+ }
+
+ public void selectIn(final AlignFrameI alf, String sequenceIds,
+ String columns, String sep)
+ {
+ if (sep == null || sep.length() == 0)
+ {
+ sep = separator;
+ }
+ else
+ {
+ if (debug)
+ {
+ System.err.println("Selecting region using separator string '"
+ + separator + "'");
+ }
+ }
+ // deparse fields
+ String[] ids = JalviewAppLoader.separatorListToArray(sequenceIds, sep);
+ String[] cols = JalviewAppLoader.separatorListToArray(columns, sep);
+ final SequenceGroup sel = new SequenceGroup();
+ final ColumnSelection csel = new ColumnSelection();
+ AlignmentI al = ((AlignFrame) alf).getViewport().getAlignment();
+ jalview.analysis.SequenceIdMatcher matcher = new jalview.analysis.SequenceIdMatcher(
+ ((AlignFrame) alf).getViewport().getAlignment()
+ .getSequencesArray());
+ int start = 0, end = al.getWidth(), alw = al.getWidth();
+ boolean seqsfound = true;
+ if (ids != null && ids.length > 0)
+ {
+ seqsfound = false;
+ for (int i = 0; i < ids.length; i++)
+ {
+ if (ids[i].trim().length() == 0)
+ {
+ continue;
+ }
+ SequenceI sq = matcher.findIdMatch(ids[i]);
+ if (sq != null)
+ {
+ seqsfound = true;
+ sel.addSequence(sq, false);
+ }
+ }
+ }
+ boolean inseqpos = false;
+ if (cols != null && cols.length > 0)
+ {
+ boolean seset = false;
+ for (int i = 0; i < cols.length; i++)
+ {
+ String cl = cols[i].trim();
+ if (cl.length() == 0)
+ {
+ continue;
+ }
+ int p;
+ if ((p = cl.indexOf("-")) > -1)
+ {
+ int from = -1, to = -1;
+ try
+ {
+ from = new Integer(cl.substring(0, p)).intValue();
+ from--;
+ } catch (NumberFormatException ex)
+ {
+ System.err.println(
+ "ERROR: Couldn't parse first integer in range element column selection string '"
+ + cl + "' - format is 'from-to'");
+ return;
+ }
+ try
+ {
+ to = new Integer(cl.substring(p + 1)).intValue();
+ to--;
+ } catch (NumberFormatException ex)
+ {
+ System.err.println(
+ "ERROR: Couldn't parse second integer in range element column selection string '"
+ + cl + "' - format is 'from-to'");
+ return;
+ }
+ if (from >= 0 && to >= 0)
+ {
+ // valid range
+ if (from < to)
+ {
+ int t = to;
+ to = from;
+ to = t;
+ }
+ if (!seset)
+ {
+ start = from;
+ end = to;
+ seset = true;
+ }
+ else
+ {
+ // comment to prevent range extension
+ if (start > from)
+ {
+ start = from;
+ }
+ if (end < to)
+ {
+ end = to;
+ }
+ }
+ for (int r = from; r <= to; r++)
+ {
+ if (r >= 0 && r < alw)
+ {
+ csel.addElement(r);
+ }
+ }
+ if (debug)
+ {
+ System.err.println("Range '" + cl + "' deparsed as [" + from
+ + "," + to + "]");
+ }
+ }
+ else
+ {
+ System.err.println("ERROR: Invalid Range '" + cl
+ + "' deparsed as [" + from + "," + to + "]");
+ }
+ }
+ else
+ {
+ int r = -1;
+ try
+ {
+ r = new Integer(cl).intValue();
+ r--;
+ } catch (NumberFormatException ex)
+ {
+ if (cl.toLowerCase().equals("sequence"))
+ {
+ // we are in the dataset sequence's coordinate frame.
+ inseqpos = true;
+ }
+ else
+ {
+ System.err.println(
+ "ERROR: Couldn't parse integer from point selection element of column selection string '"
+ + cl + "'");
+ return;
+ }
+ }
+ if (r >= 0 && r <= alw)
+ {
+ if (!seset)
+ {
+ start = r;
+ end = r;
+ seset = true;
+ }
+ else
+ {
+ // comment to prevent range extension
+ if (start > r)
+ {
+ start = r;
+ }
+ if (end < r)
+ {
+ end = r;
+ }
+ }
+ csel.addElement(r);
+ if (debug)
+ {
+ System.err.println("Point selection '" + cl
+ + "' deparsed as [" + r + "]");
+ }
+ }
+ else
+ {
+ System.err.println("ERROR: Invalid Point selection '" + cl
+ + "' deparsed as [" + r + "]");
+ }
+ }
+ }
+ }
+ if (seqsfound)
+ {
+ // we only propagate the selection when it was the null selection, or the
+ // given sequences were found in the alignment.
+ if (inseqpos && sel.getSize() > 0)
+ {
+ // assume first sequence provides reference frame ?
+ SequenceI rs = sel.getSequenceAt(0);
+ start = rs.findIndex(start);
+ end = rs.findIndex(end);
+ List<Integer> cs = new ArrayList<>(csel.getSelected());
+ csel.clear();
+ for (Integer selectedCol : cs)
+ {
+ csel.addElement(rs.findIndex(selectedCol));
+ }
+ }
+ sel.setStartRes(start);
+ sel.setEndRes(end);
+ EventQueue.invokeLater(new Runnable()
+ {
+ @Override
+ public void run()
+ {
+ ((AlignFrame) alf).select(sel, csel, ((AlignFrame) alf)
+ .getCurrentView().getAlignment().getHiddenColumns());
+ }
+ });
+ }
+ }
+
+ public String getAlignmentOrderFrom(AlignFrameI alf, String sep)
+ {
+ AlignmentI alorder = ((AlignFrame) alf).getViewport().getAlignment();
+ String[] order = new String[alorder.getHeight()];
+ for (int i = 0; i < order.length; i++)
+ {
+ order[i] = alorder.getSequenceAt(i).getName();
+ }
+ return arrayToSeparatorList(order, sep);
+ }
+
+ public String getSelectedSequencesAsAlignmentFrom(AlignFrameI alf,
+ String format, String suffix)
+ {
+ try
+ {
+ AlignViewport vp = ((AlignFrame) alf).getViewport();
+ FileFormatI theFormat = FileFormats.getInstance().forName(format);
+ boolean seqlimits = (suffix == null
+ || suffix.equalsIgnoreCase("true"));
+ if (vp.getSelectionGroup() != null)
+ {
+ // JBPNote: getSelectionAsNewSequence behaviour has changed - this
+ // method now returns a full copy of sequence data
+ // TODO consider using getSequenceSelection instead here
+ String reply = new AppletFormatAdapter().formatSequences(theFormat,
+ new Alignment(vp.getSelectionAsNewSequence()),
+ seqlimits);
+ return reply;
+ }
+ } catch (IllegalArgumentException ex)
+ {
+ ex.printStackTrace();
+ return "Error retrieving alignment, possibly invalid format specifier: "
+ + format;
+ }
+ return "";
+ }
+
+ public String orderAlignmentBy(AlignFrameI alf, String order,
+ String undoName, String sep)
+ {
+ if (sep == null || sep.length() == 0)
+ {
+ sep = separator;
+ }
+ String[] ids = JalviewAppLoader.separatorListToArray(order, sep);
+ SequenceI[] sqs = null;
+ if (ids != null && ids.length > 0)
+ {
+ jalview.analysis.SequenceIdMatcher matcher = new jalview.analysis.SequenceIdMatcher(
+ ((AlignFrame) alf).getViewport().getAlignment()
+ .getSequencesArray());
+ int s = 0;
+ sqs = new SequenceI[ids.length];
+ for (int i = 0; i < ids.length; i++)
+ {
+ if (ids[i].trim().length() == 0)
+ {
+ continue;
+ }
+ SequenceI sq = matcher.findIdMatch(ids[i]);
+ if (sq != null)
+ {
+ sqs[s++] = sq;
+ }
+ }
+ if (s > 0)
+ {
+ SequenceI[] sqq = new SequenceI[s];
+ System.arraycopy(sqs, 0, sqq, 0, s);
+ sqs = sqq;
+ }
+ else
+ {
+ sqs = null;
+ }
+ }
+ if (sqs == null)
+ {
+ return "";
+ }
+ ;
+ final AlignmentOrder aorder = new AlignmentOrder(sqs);
+
+ if (undoName != null && undoName.trim().length() == 0)
+ {
+ undoName = null;
+ }
+ final String _undoName = undoName;
+ // TODO: deal with synchronization here: cannot raise any events until after
+ // this has returned.
+ return ((AlignFrame) alf).sortBy(aorder, _undoName) ? "true" : "";
+ }
+
+ public String getAlignmentFrom(AlignFrameI alf, String format,
+ String suffix)
+ {
+ try
+ {
+ boolean seqlimits = (suffix == null
+ || suffix.equalsIgnoreCase("true"));
+
+ FileFormatI theFormat = FileFormats.getInstance().forName(format);
+ String reply = new AppletFormatAdapter().formatSequences(theFormat,
+ ((AlignFrame) alf).getViewport().getAlignment(), seqlimits);
+ return reply;
+ } catch (IllegalArgumentException ex)
+ {
+ ex.printStackTrace();
+ return "Error retrieving alignment, possibly invalid format specifier: "
+ + format;
+ }
+ }
+
+ public void loadAnnotationFrom(AlignFrameI alf, String annotation)
+ {
+ if (new AnnotationFile().annotateAlignmentView(
+ ((AlignFrame) alf).getViewport(), annotation,
+ DataSourceType.PASTE))
+ {
+ ((AlignFrame) alf).alignPanel.fontChanged();
+ ((AlignFrame) alf).alignPanel.setScrollValues(0, 0);
+ }
+ else
+ {
+ ((AlignFrame) alf).parseFeaturesFile(annotation,
+ DataSourceType.PASTE);
+ }
+ }
+
+ public boolean loadFeaturesFrom(AlignFrameI alf, String features,
+ boolean autoenabledisplay)
+ {
+ boolean ret = ((AlignFrame) alf).parseFeaturesFile(features,
+ DataSourceType.PASTE);
+ if (!ret)
+ {
+ return false;
+ }
+ if (autoenabledisplay)
+ {
+ ((AlignFrame) alf).getViewport().setShowSequenceFeatures(true);
+ // this next was for a checkbox in JalviewLite
+ // ((AlignFrame) alf).getViewport().sequenceFeatures.setState(true);
+ }
+ return true;
+ }
+
+ public String getFeaturesFrom(AlignFrameI alf, String format)
+ {
+ AlignFrame f = ((AlignFrame) alf);
+
+ String features;
+ FeaturesFile formatter = new FeaturesFile();
+ if (format.equalsIgnoreCase("Jalview"))
+ {
+ features = formatter.printJalviewFormat(
+ f.getViewport().getAlignment().getSequencesArray(),
+ f.alignPanel.getFeatureRenderer(), true);
+ }
+ else
+ {
+ features = formatter.printGffFormat(
+ f.getViewport().getAlignment().getSequencesArray(),
+ f.alignPanel.getFeatureRenderer(), true);
+ }
+
+ if (features == null)
+ {
+ features = "";
+ }
+ return features;
+
+ }
+
+ public String getAnnotationFrom(AlignFrameI alf)
+ {
+ AlignFrame f = (AlignFrame) alf;
+ String annotation = new AnnotationFile()
+ .printAnnotationsForView(f.getViewport());
+ return annotation;
+ }
+
+ public AlignFrameI newViewFrom(AlignFrameI alf, String name)
+ {
+ return (AlignFrameI) ((AlignFrame) alf).newView(name, true);
+ }
+
+ public String[] separatorListToArray(String list)
+ {
+ return separatorListToArray(list, separator);
+ }
+
+ public Object[] getSelectionForListener(AlignFrameI currentFrame,
+ SequenceGroup seqsel, ColumnSelection colsel,
+ HiddenColumns hidden, SelectionSource source, Object alignFrame)
+ {
+ // System.err.println("Testing selection event relay to
+ // jsfunction:"+_listener);
+ String setid = "";
+ AlignFrame src = (AlignFrame) alignFrame;
+ if (source != null)
+ {
+ if (source instanceof AlignViewport
+ && ((AlignFrame) currentFrame).getViewport() == source)
+ {
+ // should be valid if it just generated an event!
+ src = (AlignFrame) currentFrame;
+
+ }
+ }
+ String[] seqs = new String[] {};
+ String[] cols = new String[] {};
+ int strt = 0, end = (src == null) ? -1
+ : src.alignPanel.av.getAlignment().getWidth();
+ if (seqsel != null && seqsel.getSize() > 0)
+ {
+ seqs = new String[seqsel.getSize()];
+ for (int i = 0; i < seqs.length; i++)
+ {
+ seqs[i] = seqsel.getSequenceAt(i).getName();
+ }
+ if (strt < seqsel.getStartRes())
+ {
+ strt = seqsel.getStartRes();
+ }
+ if (end == -1 || end > seqsel.getEndRes())
+ {
+ end = seqsel.getEndRes();
+ }
+ }
+ if (colsel != null && !colsel.isEmpty())
+ {
+ if (end == -1)
+ {
+ end = colsel.getMax() + 1;
+ }
+ cols = new String[colsel.getSelected().size()];
+ for (int i = 0; i < cols.length; i++)
+ {
+ cols[i] = "" + (1 + colsel.getSelected().get(i).intValue());
+ }
+ }
+ else
+ {
+ if (seqsel != null && seqsel.getSize() > 0)
+ {
+ // send a valid range, otherwise we send the empty selection
+ cols = new String[2];
+ cols[0] = "" + (1 + strt) + "-" + (1 + end);
+ }
+ }
+ return new Object[] { src, setid, arrayToSeparatorList(seqs),
+ arrayToSeparatorList(cols) };
+ }
+
+}
\ No newline at end of file
static {
/**
- * @j2sNative
+ * @ could do it this way:
*
- * J2S.thisApplet.__Info.args =
- * ["open","examples/uniref50.fa","features",
- * "examples/exampleFeatures.txt"];
+ * j2sNative
+ *
+ * J2S.thisApplet.__Info.args = [ "open","examples/uniref50.fa",
+ * "features","examples/exampleFeatures.txt", "noannotation" ];
*/
}
public static void main(String[] args) throws Exception
{
+ if (args.length == 0)
+ {
+ args = new String[] {
+ // "headless",
+ "open", "examples/uniref50.fa",
+ "features",
+ "examples/exampleFeatures.txt"
+ , "noannotation"
+ , "showoverview"
+ // , "png", "test-bh.png"
+ };
+ }
+
+ // String cmds = "nodisplay -open examples/uniref50.fa -sortbytree -props
+ // test/jalview/io/testProps.jvprops -colour zappo "
+ // + "-jabaws http://www.compbio.dundee.ac.uk/jabaws -nosortbytree "
+ // + "-features examples/testdata/plantfdx.features -annotations
+ // examples/testdata/plantfdx.annotations -tree
+ // examples/testdata/uniref50_test_tree";
+ // args = cmds.split(" ");
Jalview.main(args);
//showFocusTimer();
}
--- /dev/null
+package jalview.bin;
+
+import jalview.gui.AlignFrame;
+import jalview.javascript.JalviewLiteJsApi;
+
+/**
+ * JAL-3369 JalviewJS API BH 2019.07.17
+ *
+ * @author hansonr
+ *
+ */
+public interface JalviewJSApi extends JalviewLiteJsApi
+{
+
+ void showOverview();
+
+ /**
+ * process commandline arguments after the JavaScript application has started
+ *
+ * @param args
+ * @return
+ */
+ Object parseArguments(String[] args);
+
+
+ /**
+ * Open a new Tree panel on the desktop statically. Params are standard (not
+ * set by Groovy). No dialog is opened.
+ *
+ * @param af
+ * may be null
+ * @param treeType
+ * @param modelName
+ * @return null, or the string "label.you_need_at_least_n_sequences" if number
+ * of sequences selected is inappropriate
+ */
+ public Object openTreePanel(AlignFrame af, String treeType,
+ String modelName);
+
+ /**
+ * public static method for JalviewJS API to open a PCAPanel without
+ * necessarily using a dialog.
+ *
+ * @param af
+ * may be null
+ * @param modelName
+ * @return the PCAPanel, or the string "label.you_need_at_least_n_sequences"
+ * if number of sequences selected is inappropriate
+ */
+ public Object openPcaPanel(AlignFrame af, String modelName);
+
+}
package jalview.bin;
import jalview.analysis.AlignmentUtils;
+import jalview.api.AlignFrameI;
+import jalview.api.AlignViewportI;
+import jalview.api.JalviewApp;
import jalview.api.StructureSelectionManagerProvider;
import jalview.appletgui.AlignFrame;
import jalview.appletgui.AlignViewport;
import jalview.datamodel.AlignmentI;
import jalview.datamodel.AlignmentOrder;
import jalview.datamodel.ColumnSelection;
+import jalview.datamodel.HiddenColumns;
import jalview.datamodel.PDBEntry;
-import jalview.datamodel.Sequence;
import jalview.datamodel.SequenceGroup;
import jalview.datamodel.SequenceI;
import jalview.io.AnnotationFile;
import jalview.io.FileFormats;
import jalview.io.FileParse;
import jalview.io.IdentifyFile;
-import jalview.io.JPredFile;
-import jalview.io.JnetAnnotationMaker;
import jalview.io.NewickFile;
import jalview.javascript.JSFunctionExec;
import jalview.javascript.JalviewLiteJsApi;
import jalview.javascript.JsCallBack;
import jalview.javascript.MouseOverStructureListener;
+import jalview.renderer.seqfeatures.FeatureRenderer;
import jalview.structure.SelectionListener;
+import jalview.structure.SelectionSource;
import jalview.structure.StructureSelectionManager;
+import jalview.structure.VamsasSource;
import jalview.util.ColorUtils;
-import jalview.util.HttpUtils;
import jalview.util.MessageManager;
+import jalview.viewmodel.AlignmentViewport;
import java.applet.Applet;
import java.awt.Button;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.List;
-import java.util.StringTokenizer;
import java.util.Vector;
import netscape.javascript.JSObject;
* @author $author$
* @version $Revision: 1.92 $
*/
+@SuppressWarnings("serial")
public class JalviewLite extends Applet
- implements StructureSelectionManagerProvider, JalviewLiteJsApi
+ implements StructureSelectionManagerProvider, JalviewLiteJsApi,
+ JalviewApp
{
+ public JalviewLite()
+ {
+ appLoader = new JalviewAppLoader(debug);
+ }
private static final String TRUE = "true";
private static final String FALSE = "false";
return StructureSelectionManager.getStructureSelectionManager(this);
}
+ @Override
+ public StructureSelectionManagerProvider getStructureSelectionManagerProvider()
+ {
+ return this;
+ }
+
// /////////////////////////////////////////
// The following public methods may be called
// externally, eg via javascript in HTML page
* .AlignFrame)
*/
@Override
- public String getSelectedSequencesFrom(AlignFrame alf)
+ public String getSelectedSequencesFrom(AlignFrameI alf)
{
return getSelectedSequencesFrom(alf, separator); // ""+0x00AC);
}
* .AlignFrame, java.lang.String)
*/
@Override
- public String getSelectedSequencesFrom(AlignFrame alf, String sep)
+ public String getSelectedSequencesFrom(AlignFrameI alf, String sep)
{
StringBuffer result = new StringBuffer("");
if (sep == null || sep.length() == 0)
{
sep = separator; // "+0x00AC;
}
- if (alf.viewport.getSelectionGroup() != null)
+ if (((AlignFrame) alf).viewport.getSelectionGroup() != null)
{
- SequenceI[] seqs = alf.viewport.getSelectionGroup()
- .getSequencesInOrder(alf.viewport.getAlignment());
+ SequenceI[] seqs = ((AlignFrame) alf).viewport.getSelectionGroup()
+ .getSequencesInOrder(
+ ((AlignFrame) alf).viewport.getAlignment());
for (int i = 0; i < seqs.length; i++)
{
* java.lang.String, java.lang.String, java.lang.String)
*/
@Override
- public void highlightIn(final AlignFrame alf, final String sequenceId,
+ public void highlightIn(final AlignFrameI alf, final String sequenceId,
final String position, final String alignedPosition)
{
// TODO: could try to highlight in all alignments if alf==null
jalview.analysis.SequenceIdMatcher matcher = new jalview.analysis.SequenceIdMatcher(
- alf.viewport.getAlignment().getSequencesArray());
+ ((AlignFrame) alf).viewport.getAlignment().getSequencesArray());
final SequenceI sq = matcher.findIdMatch(sequenceId);
if (sq != null)
{
int apos = -1;
try
{
- apos = Integer.valueOf(position).intValue();
+ apos = new Integer(position).intValue();
apos--;
} catch (NumberFormatException ex)
{
* java.lang.String, java.lang.String)
*/
@Override
- public void selectIn(AlignFrame alf, String sequenceIds, String columns)
+ public void selectIn(AlignFrameI alf, String sequenceIds, String columns)
{
selectIn(alf, sequenceIds, columns, separator);
}
* java.lang.String, java.lang.String, java.lang.String)
*/
@Override
- public void selectIn(final AlignFrame alf, String sequenceIds,
+ public void selectIn(final AlignFrameI alf, String sequenceIds,
String columns, String sep)
{
if (sep == null || sep.length() == 0)
}
}
// deparse fields
- String[] ids = separatorListToArray(sequenceIds, sep);
- String[] cols = separatorListToArray(columns, sep);
+ String[] ids = JalviewAppLoader.separatorListToArray(sequenceIds, sep);
+ String[] cols = JalviewAppLoader.separatorListToArray(columns, sep);
final SequenceGroup sel = new SequenceGroup();
final ColumnSelection csel = new ColumnSelection();
- AlignmentI al = alf.viewport.getAlignment();
+ AlignmentI al = ((AlignFrame) alf).viewport.getAlignment();
jalview.analysis.SequenceIdMatcher matcher = new jalview.analysis.SequenceIdMatcher(
- alf.viewport.getAlignment().getSequencesArray());
+ ((AlignFrame) alf).viewport.getAlignment().getSequencesArray());
int start = 0, end = al.getWidth(), alw = al.getWidth();
boolean seqsfound = true;
if (ids != null && ids.length > 0)
int from = -1, to = -1;
try
{
- from = Integer.valueOf(cl.substring(0, p)).intValue();
+ from = new Integer(cl.substring(0, p)).intValue();
from--;
} catch (NumberFormatException ex)
{
}
try
{
- to = Integer.valueOf(cl.substring(p + 1)).intValue();
+ to = new Integer(cl.substring(p + 1)).intValue();
to--;
} catch (NumberFormatException ex)
{
int r = -1;
try
{
- r = Integer.valueOf(cl).intValue();
+ r = new Integer(cl).intValue();
r--;
} catch (NumberFormatException ex)
{
@Override
public void run()
{
- alf.select(sel, csel,
- alf.getAlignViewport().getAlignment().getHiddenColumns());
+ ((AlignFrame) alf).select(sel, csel, ((AlignFrame) alf)
+ .getAlignViewport().getAlignment().getHiddenColumns());
}
});
}
* .appletgui.AlignFrame, java.lang.String, java.lang.String)
*/
@Override
- public String getSelectedSequencesAsAlignmentFrom(AlignFrame alf,
+ public String getSelectedSequencesAsAlignmentFrom(AlignFrameI alf,
String format, String suffix)
{
try
{
FileFormatI theFormat = FileFormats.getInstance().forName(format);
boolean seqlimits = suffix.equalsIgnoreCase(TRUE);
- if (alf.viewport.getSelectionGroup() != null)
+ if (((AlignFrame) alf).viewport.getSelectionGroup() != null)
{
// JBPNote: getSelectionAsNewSequence behaviour has changed - this
// method now returns a full copy of sequence data
// TODO consider using getSequenceSelection instead here
String reply = new AppletFormatAdapter().formatSequences(theFormat,
- new Alignment(alf.viewport.getSelectionAsNewSequence()),
+ new Alignment(((AlignFrame) alf).viewport
+ .getSelectionAsNewSequence()),
seqlimits);
return reply;
}
* )
*/
@Override
- public String getAlignmentOrderFrom(AlignFrame alf)
+ public String getAlignmentOrderFrom(AlignFrameI alf)
{
return getAlignmentOrderFrom(alf, separator);
}
* , java.lang.String)
*/
@Override
- public String getAlignmentOrderFrom(AlignFrame alf, String sep)
+ public String getAlignmentOrderFrom(AlignFrameI alf, String sep)
{
- AlignmentI alorder = alf.getAlignViewport().getAlignment();
+ AlignmentI alorder = ((AlignFrame) alf).getAlignViewport()
+ .getAlignment();
String[] order = new String[alorder.getHeight()];
for (int i = 0; i < order.length; i++)
{
* java.lang.String, java.lang.String, java.lang.String)
*/
@Override
- public String orderAlignmentBy(AlignFrame alf, String order,
+ public String orderAlignmentBy(AlignFrameI alf, String order,
String undoName, String sep)
{
- String[] ids = separatorListToArray(order, sep);
+ String[] ids = JalviewAppLoader.separatorListToArray(order, sep);
SequenceI[] sqs = null;
if (ids != null && ids.length > 0)
{
jalview.analysis.SequenceIdMatcher matcher = new jalview.analysis.SequenceIdMatcher(
- alf.viewport.getAlignment().getSequencesArray());
+ ((AlignFrame) alf).viewport.getAlignment()
+ .getSequencesArray());
int s = 0;
sqs = new SequenceI[ids.length];
for (int i = 0; i < ids.length; i++)
final String _undoName = undoName;
// TODO: deal with synchronization here: cannot raise any events until after
// this has returned.
- return alf.sortBy(aorder, _undoName) ? TRUE : "";
+ return ((AlignFrame) alf).sortBy(aorder, _undoName) ? TRUE : "";
}
/*
* java.lang.String)
*/
@Override
- public String getAlignmentFrom(AlignFrame alf, String format)
+ public String getAlignmentFrom(AlignFrameI alf, String format)
{
return getAlignmentFrom(alf, format, TRUE);
}
* java.lang.String, java.lang.String)
*/
@Override
- public String getAlignmentFrom(AlignFrame alf, String format,
+ public String getAlignmentFrom(AlignFrameI alf, String format,
String suffix)
{
try
FileFormatI theFormat = FileFormats.getInstance().forName(format);
String reply = new AppletFormatAdapter().formatSequences(theFormat,
- alf.viewport.getAlignment(), seqlimits);
+ ((AlignFrame) alf).viewport.getAlignment(), seqlimits);
return reply;
} catch (IllegalArgumentException ex)
{
* , java.lang.String)
*/
@Override
- public void loadAnnotationFrom(AlignFrame alf, String annotation)
+ public void loadAnnotationFrom(AlignFrameI alf, String annotation)
{
- if (new AnnotationFile().annotateAlignmentView(alf.getAlignViewport(),
+ if (new AnnotationFile().annotateAlignmentView(
+ ((AlignFrame) alf).getAlignViewport(),
annotation, DataSourceType.PASTE))
{
- alf.alignPanel.fontChanged();
- alf.alignPanel.setScrollValues(0, 0);
+ ((AlignFrame) alf).alignPanel.fontChanged();
+ ((AlignFrame) alf).alignPanel.setScrollValues(0, 0);
}
else
{
- alf.parseFeaturesFile(annotation, DataSourceType.PASTE);
+ ((AlignFrame) alf).parseFeaturesFile(annotation,
+ DataSourceType.PASTE);
}
}
* , java.lang.String)
*/
@Override
- public boolean loadFeaturesFrom(AlignFrame alf, String features,
+ public boolean loadFeaturesFrom(AlignFrameI alf, String features,
boolean autoenabledisplay)
{
- return alf.parseFeaturesFile(features, DataSourceType.PASTE,
+ return ((AlignFrame) alf).parseFeaturesFile(features,
+ DataSourceType.PASTE,
autoenabledisplay);
}
* java.lang.String)
*/
@Override
- public String getFeaturesFrom(AlignFrame alf, String format)
+ public String getFeaturesFrom(AlignFrameI alf, String format)
{
- return alf.outputFeatures(false, format);
+ return ((AlignFrame) alf).outputFeatures(false, format);
}
/*
* )
*/
@Override
- public String getAnnotationFrom(AlignFrame alf)
+ public String getAnnotationFrom(AlignFrameI alf)
{
- return alf.outputAnnotations(false);
+ return ((AlignFrame) alf).outputAnnotations(false);
}
/*
* @see jalview.bin.JalviewLiteJsApi#newViewFrom(jalview.appletgui.AlignFrame)
*/
@Override
- public AlignFrame newViewFrom(AlignFrame alf)
+ public AlignFrame newViewFrom(AlignFrameI alf)
{
- return alf.newView(null);
+ return ((AlignFrame) alf).newView(null);
}
/*
* java.lang.String)
*/
@Override
- public AlignFrame newViewFrom(AlignFrame alf, String name)
+ public AlignFrame newViewFrom(AlignFrameI alf, String name)
{
- return alf.newView(name);
+ return ((AlignFrame) alf).newView(name);
}
/*
* , java.lang.String)
*/
@Override
- public void setMouseoverListener(AlignFrame af, String listener)
+ public void setMouseoverListener(AlignFrameI af, String listener)
{
if (listener != null)
{
}
}
jalview.javascript.MouseOverListener mol = new jalview.javascript.MouseOverListener(
- this, af, listener);
+ this, (AlignFrame) af, listener, debug);
javascriptListeners.addElement(mol);
StructureSelectionManager.getStructureSelectionManager(this)
.addStructureViewerListener(mol);
System.err.println("Added a mouseover listener for "
+ ((af == null) ? "All frames"
: "Just views for "
- + af.getAlignViewport().getSequenceSetId()));
+ + ((AlignFrame) af).getAlignViewport()
+ .getSequenceSetId()));
System.err.println("There are now " + javascriptListeners.size()
+ " listeners in total.");
}
* , java.lang.String)
*/
@Override
- public void setSelectionListener(AlignFrame af, String listener)
+ public void setSelectionListener(AlignFrameI af, String listener)
{
if (listener != null)
{
}
}
jalview.javascript.JsSelectionSender mol = new jalview.javascript.JsSelectionSender(
- this, af, listener);
+ this, (AlignFrame) af, listener, debug);
javascriptListeners.addElement(mol);
StructureSelectionManager.getStructureSelectionManager(this)
.addSelectionListener(mol);
System.err.println("Added a selection listener for "
+ ((af == null) ? "All frames"
: "Just views for "
- + af.getAlignViewport().getSequenceSetId()));
+ + ((AlignFrame) af).getAlignViewport()
+ .getSequenceSetId()));
System.err.println("There are now " + javascriptListeners.size()
+ " listeners in total.");
}
}
}
MouseOverStructureListener mol = new MouseOverStructureListener(this,
- listener, separatorListToArray(modelSet));
+ listener, separatorListToArray(modelSet), debug);
javascriptListeners.addElement(mol);
StructureSelectionManager.getStructureSelectionManager(this)
.addStructureViewerListener(mol);
* .AlignFrame, java.lang.String)
*/
@Override
- public void removeJavascriptListener(AlignFrame af, String listener)
+ public void removeJavascriptListener(AlignFrameI af, String listener)
{
if (listener != null)
{
}
if (jsFunctionExec != null)
{
- jsFunctionExec.stopQueue();
- jsFunctionExec.jvlite = null;
+ jsFunctionExec.tidyUp();
+ jsFunctionExec = null;
}
initialAlignFrame = null;
- jsFunctionExec = null;
javascriptListeners = null;
StructureSelectionManager.release(this);
}
try
{
StructureSelectionManager.getStructureSelectionManager(me)
- .mouseOverStructure(Integer.valueOf(pdbResNum).intValue(),
+ .mouseOverStructure(new Integer(pdbResNum).intValue(),
chain, pdbfile);
if (debug)
{
* java.lang.String, java.lang.String)
*/
@Override
- public void scrollViewToIn(final AlignFrame alf, final String topRow,
+ public void scrollViewToIn(final AlignFrameI alf, final String topRow,
final String leftHandColumn)
{
java.awt.EventQueue.invokeLater(new Runnable()
{
try
{
- alf.scrollTo(Integer.valueOf(topRow).intValue(),
- Integer.valueOf(leftHandColumn).intValue());
+ ((AlignFrame) alf).scrollTo(new Integer(topRow).intValue(),
+ new Integer(leftHandColumn).intValue());
} catch (Exception ex)
{
* .AlignFrame, java.lang.String)
*/
@Override
- public void scrollViewToRowIn(final AlignFrame alf, final String topRow)
+ public void scrollViewToRowIn(final AlignFrameI alf, final String topRow)
{
java.awt.EventQueue.invokeLater(new Runnable()
{
try
{
- alf.scrollToRow(Integer.valueOf(topRow).intValue());
+ ((AlignFrame) alf).scrollToRow(new Integer(topRow).intValue());
} catch (Exception ex)
{
* .AlignFrame, java.lang.String)
*/
@Override
- public void scrollViewToColumnIn(final AlignFrame alf,
+ public void scrollViewToColumnIn(final AlignFrameI alf,
final String leftHandColumn)
{
java.awt.EventQueue.invokeLater(new Runnable()
{
try
{
- alf.scrollToColumn(Integer.valueOf(leftHandColumn).intValue());
+ ((AlignFrame) alf)
+ .scrollToColumn(new Integer(leftHandColumn).intValue());
} catch (Exception ex)
{
boolean embedded = false;
- private boolean checkForJmol = true;
+ boolean checkForJmol = true;
- private boolean checkedForJmol = false; // ensure we don't check for jmol
+ boolean checkedForJmol = false; // ensure we don't check for jmol
// every time the app is re-inited
*/
public boolean useXtrnalSviewer = false;
+ public JalviewAppLoader appLoader;
+
+ public AlignFrame loaderFrame;
+
public static boolean debug = false;
static String builddate = null, version = null, installation = null;
.getString("error.invalid_separator_parameter"));
}
}
+
+ // Background color
+
int r = 255;
int g = 255;
int b = 255;
b = 255;
}
}
+ setBackground(new Color(r, g, b));
+
param = getParameter("label");
if (param != null)
{
launcher.setLabel(param);
}
- setBackground(new Color(r, g, b));
-
file = getParameter("file");
if (file == null)
{
- // Maybe the sequences are added as parameters
- StringBuffer data = new StringBuffer("PASTE");
- int i = 1;
- while ((file = getParameter("sequence" + i)) != null)
- {
- data.append(file.toString() + "\n");
- i++;
- }
- if (data.length() > 5)
- {
- file = data.toString();
- }
+ file = appLoader.getPastedSequence(this);
}
if (getDefaultParameter("enableSplitFrame", true))
{
file2 = getParameter("file2");
}
- embedded = TRUE.equalsIgnoreCase(getParameter("embedded"));
+ embedded = (TRUE.equalsIgnoreCase(getParameter("embedded"))
+ || file != null
+ && FALSE.equalsIgnoreCase(getParameter("showbutton")));
if (embedded)
{
- LoadingThread loader = new LoadingThread(file, file2, this);
- loader.start();
- }
- else if (file != null)
- {
- /*
- * Start the applet immediately or show a button to start it
- */
- if (FALSE.equalsIgnoreCase(getParameter("showbutton")))
- {
- LoadingThread loader = new LoadingThread(file, file2, this);
- loader.start();
- }
- else
- {
- add(launcher);
- launcher.addActionListener(new java.awt.event.ActionListener()
- {
- @Override
- public void actionPerformed(ActionEvent e)
- {
- LoadingThread loader = new LoadingThread(file, file2,
- JalviewLite.this);
- loader.start();
- }
- });
- }
+ startLoading();
}
- else
+ else if (file == null)
{
// jalview initialisation with no alignment. loadAlignment() method can
// still be called to open new alignments.
fileFound = false;
callInitCallback();
}
+ else
+ {
+ add(launcher);
+ launcher.addActionListener(new java.awt.event.ActionListener()
+ {
+ @Override
+ public void actionPerformed(ActionEvent e)
+ {
+ startLoading();
+ }
+ });
+ }
+ }
+
+ protected void startLoading()
+ {
+ LoadingThread loader = new LoadingThread(file, file2, this);
+ loader.start();
}
private void initLiveConnect()
}
}
- private void callInitCallback()
+ void callInitCallback()
{
String initjscallback = getParameter("oninit");
if (initjscallback == null)
try
{
// do onInit with the JS executor thread
- new JSFunctionExec(this).executeJavascriptFunction(true,
+ new JSFunctionExec(this, debug).executeJavascriptFunction(true,
initjscallback, null,
"Calling oninit callback '" + initjscallback + "'.");
} catch (Exception e)
JalviewLite applet;
- private void dbgMsg(String msg)
+ public void dbgMsg(String msg)
{
if (JalviewLite.debug)
{
*/
public String resolveFileProtocol(String path)
{
- /*
- * is it paste data?
- */
- if (path.startsWith("PASTE"))
- {
- protocol = DataSourceType.PASTE;
- return path.substring(5);
- }
- /*
- * is it a URL?
- */
- if (path.indexOf("://") != -1)
- {
- protocol = DataSourceType.URL;
- return path;
- }
-
- /*
- * try relative to document root
- */
- URL documentBase = getDocumentBase();
- String withDocBase = resolveUrlForLocalOrAbsolute(path, documentBase);
- if (HttpUtils.isValidUrl(withDocBase))
- {
- if (debug)
- {
- System.err.println("Prepended document base '" + documentBase
- + "' to make: '" + withDocBase + "'");
- }
- protocol = DataSourceType.URL;
- return withDocBase;
- }
-
- /*
- * try relative to codebase (if different to document base)
- */
- URL codeBase = getCodeBase();
- String withCodeBase = applet.resolveUrlForLocalOrAbsolute(path,
- codeBase);
- if (!withCodeBase.equals(withDocBase)
- && HttpUtils.isValidUrl(withCodeBase))
- {
- protocol = DataSourceType.URL;
- if (debug)
- {
- System.err.println("Prepended codebase '" + codeBase
- + "' to make: '" + withCodeBase + "'");
- }
- return withCodeBase;
- }
-
- /*
- * try locating by classloader; try this last so files in the directory
- * are resolved using document base
- */
- if (inArchive(path))
- {
- protocol = DataSourceType.CLASSLOADER;
- }
- return path;
+ String[] ret = new String[] { path };
+ protocol = JalviewAppLoader.resolveFileProtocol(applet, ret);
+ return ret[0];
}
public LoadingThread(String file, String file2, JalviewLite _applet)
if (newAlignFrame != null)
{
addToDisplay(newAlignFrame, newAlignFrame2);
- loadTree(newAlignFrame);
-
- loadScoreFile(newAlignFrame);
-
- loadFeatures(newAlignFrame);
-
- loadAnnotations(newAlignFrame);
-
- loadJnetFile(newAlignFrame);
-
- loadPdbFiles(newAlignFrame);
+ applet.loaderFrame = newAlignFrame;
+ appLoader.load(applet);
}
else
{
fileFound = false;
applet.remove(launcher);
applet.repaint();
+ callInitCallback();
}
- callInitCallback();
}
/**
return null;
}
- /**
- * Load PDBFiles if any specified by parameter(s). Returns true if loaded,
- * else false.
- *
- * @param alignFrame
- * @return
- */
- protected boolean loadPdbFiles(AlignFrame alignFrame)
- {
- boolean result = false;
- /*
- * <param name="alignpdbfiles" value="false/true"/> Undocumented for 2.6 -
- * related to JAL-434
- */
-
- applet.setAlignPdbStructures(
- getDefaultParameter("alignpdbfiles", false));
- /*
- * <param name="PDBfile" value="1gaq.txt PDB|1GAQ|1GAQ|A PDB|1GAQ|1GAQ|B
- * PDB|1GAQ|1GAQ|C">
- *
- * <param name="PDBfile2" value="1gaq.txt A=SEQA B=SEQB C=SEQB">
- *
- * <param name="PDBfile3" value="1q0o Q45135_9MICO">
- */
-
- int pdbFileCount = 0;
- // Accumulate pdbs here if they are heading for the same view (if
- // alignPdbStructures is true)
- Vector pdbs = new Vector();
- // create a lazy matcher if we're asked to
- jalview.analysis.SequenceIdMatcher matcher = (applet
- .getDefaultParameter("relaxedidmatch", false))
- ? new jalview.analysis.SequenceIdMatcher(
- alignFrame.getAlignViewport().getAlignment()
- .getSequencesArray())
- : null;
-
- String param;
- do
- {
- if (pdbFileCount > 0)
- {
- param = applet.getParameter("PDBFILE" + pdbFileCount);
- }
- else
- {
- param = applet.getParameter("PDBFILE");
- }
-
- if (param != null)
- {
- PDBEntry pdb = new PDBEntry();
-
- String seqstring;
- SequenceI[] seqs = null;
- String[] chains = null;
-
- StringTokenizer st = new StringTokenizer(param, " ");
-
- if (st.countTokens() < 2)
- {
- String sequence = applet.getParameter("PDBSEQ");
- if (sequence != null)
- {
- seqs = new SequenceI[] { matcher == null
- ? (Sequence) alignFrame.getAlignViewport()
- .getAlignment().findName(sequence)
- : matcher.findIdMatch(sequence) };
- }
-
- }
- else
- {
- param = st.nextToken();
- List<SequenceI> tmp = new ArrayList<>();
- List<String> tmp2 = new ArrayList<>();
-
- while (st.hasMoreTokens())
- {
- seqstring = st.nextToken();
- StringTokenizer st2 = new StringTokenizer(seqstring, "=");
- if (st2.countTokens() > 1)
- {
- // This is the chain
- tmp2.add(st2.nextToken());
- seqstring = st2.nextToken();
- }
- tmp.add(matcher == null
- ? (Sequence) alignFrame.getAlignViewport()
- .getAlignment().findName(seqstring)
- : matcher.findIdMatch(seqstring));
- }
-
- seqs = tmp.toArray(new SequenceI[tmp.size()]);
- if (tmp2.size() == tmp.size())
- {
- chains = tmp2.toArray(new String[tmp2.size()]);
- }
- }
- param = resolveFileProtocol(param);
- // TODO check JAL-357 for files in a jar (CLASSLOADER)
- pdb.setFile(param);
-
- if (seqs != null)
- {
- for (int i = 0; i < seqs.length; i++)
- {
- if (seqs[i] != null)
- {
- ((Sequence) seqs[i]).addPDBId(pdb);
- StructureSelectionManager
- .getStructureSelectionManager(applet)
- .registerPDBEntry(pdb);
- }
- else
- {
- if (JalviewLite.debug)
- {
- // this may not really be a problem but we give a warning
- // anyway
- System.err.println(
- "Warning: Possible input parsing error: Null sequence for attachment of PDB (sequence "
- + i + ")");
- }
- }
- }
-
- if (!alignPdbStructures)
- {
- alignFrame.newStructureView(applet, pdb, seqs, chains,
- protocol);
- }
- else
- {
- pdbs.addElement(new Object[] { pdb, seqs, chains, protocol });
- }
- }
- }
-
- pdbFileCount++;
- } while (param != null || pdbFileCount < 10);
- if (pdbs.size() > 0)
- {
- SequenceI[][] seqs = new SequenceI[pdbs.size()][];
- PDBEntry[] pdb = new PDBEntry[pdbs.size()];
- String[][] chains = new String[pdbs.size()][];
- String[] protocols = new String[pdbs.size()];
- for (int pdbsi = 0, pdbsiSize = pdbs
- .size(); pdbsi < pdbsiSize; pdbsi++)
- {
- Object[] o = (Object[]) pdbs.elementAt(pdbsi);
- pdb[pdbsi] = (PDBEntry) o[0];
- seqs[pdbsi] = (SequenceI[]) o[1];
- chains[pdbsi] = (String[]) o[2];
- protocols[pdbsi] = (String) o[3];
- }
- alignFrame.alignedStructureView(applet, pdb, seqs, chains,
- protocols);
- result = true;
- }
- return result;
- }
-
- /**
- * Load in a Jnetfile if specified by parameter. Returns true if loaded,
- * else false.
- *
- * @param alignFrame
- * @return
- */
- protected boolean loadJnetFile(AlignFrame alignFrame)
- {
- boolean result = false;
- String param = applet.getParameter("jnetfile");
- if (param == null)
- {
- // jnet became jpred around 2016
- param = applet.getParameter("jpredfile");
- }
- if (param != null)
- {
- try
- {
- param = resolveFileProtocol(param);
- JPredFile predictions = new JPredFile(param, protocol);
- JnetAnnotationMaker.add_annotation(predictions,
- alignFrame.viewport.getAlignment(), 0, false);
- // false == do not add sequence profile from concise output
-
- alignFrame.viewport.getAlignment().setupJPredAlignment();
-
- alignFrame.alignPanel.fontChanged();
- alignFrame.alignPanel.setScrollValues(0, 0);
- result = true;
- } catch (Exception ex)
- {
- ex.printStackTrace();
- }
- }
- return result;
- }
-
- /**
- * Load annotations if specified by parameter. Returns true if loaded, else
- * false.
- *
- * @param alignFrame
- * @return
- */
- protected boolean loadAnnotations(AlignFrame alignFrame)
- {
- boolean result = false;
- String param = applet.getParameter("annotations");
- if (param != null)
- {
- param = resolveFileProtocol(param);
-
- if (new AnnotationFile().annotateAlignmentView(alignFrame.viewport,
- param, protocol))
- {
- alignFrame.alignPanel.fontChanged();
- alignFrame.alignPanel.setScrollValues(0, 0);
- result = true;
- }
- else
- {
- System.err.println(
- "Annotations were not added from annotation file '"
- + param + "'");
- }
- }
- return result;
- }
-
- /**
- * Load features file and view settings as specified by parameters. Returns
- * true if features were loaded, else false.
- *
- * @param alignFrame
- * @return
- */
- protected boolean loadFeatures(AlignFrame alignFrame)
- {
- boolean result = false;
- // ///////////////////////////
- // modify display of features
- // we do this before any features have been loaded, ensuring any hidden
- // groups are hidden when features first displayed
- //
- // hide specific groups
- //
- String param = applet.getParameter("hidefeaturegroups");
- if (param != null)
- {
- alignFrame.setFeatureGroupState(separatorListToArray(param), false);
- // applet.setFeatureGroupStateOn(newAlignFrame, param, false);
- }
- // show specific groups
- param = applet.getParameter("showfeaturegroups");
- if (param != null)
- {
- alignFrame.setFeatureGroupState(separatorListToArray(param), true);
- // applet.setFeatureGroupStateOn(newAlignFrame, param, true);
- }
- // and now load features
- param = applet.getParameter("features");
- if (param != null)
- {
- param = resolveFileProtocol(param);
-
- result = alignFrame.parseFeaturesFile(param, protocol);
- }
-
- param = applet.getParameter("showFeatureSettings");
- if (param != null && param.equalsIgnoreCase(TRUE))
- {
- alignFrame.viewport.setShowSequenceFeatures(true);
- new FeatureSettings(alignFrame.alignPanel);
- }
- return result;
- }
-
- /**
- * Load a score file if specified by parameter. Returns true if file was
- * loaded, else false.
- *
- * @param alignFrame
- */
- protected boolean loadScoreFile(AlignFrame alignFrame)
- {
- boolean result = false;
- String sScoreFile = applet.getParameter("scoreFile");
- if (sScoreFile != null && !"".equals(sScoreFile))
- {
- try
- {
- if (debug)
- {
- System.err.println(
- "Attempting to load T-COFFEE score file from the scoreFile parameter");
- }
- result = alignFrame.loadScoreFile(sScoreFile);
- if (!result)
- {
- System.err.println(
- "Failed to parse T-COFFEE parameter as a valid score file ('"
- + sScoreFile + "')");
- }
- } catch (Exception e)
- {
- System.err.printf("Cannot read score file: '%s'. Cause: %s \n",
- sScoreFile, e.getMessage());
- }
- }
- return result;
- }
-
- /**
- * Load a tree for the alignment if specified by parameter. Returns true if
- * a tree was loaded, else false.
- *
- * @param alignFrame
- * @return
- */
- protected boolean loadTree(AlignFrame alignFrame)
- {
- boolean result = false;
- String treeFile = applet.getParameter("tree");
- if (treeFile == null)
- {
- treeFile = applet.getParameter("treeFile");
- }
-
- if (treeFile != null)
- {
- try
- {
- treeFile = resolveFileProtocol(treeFile);
- NewickFile fin = new NewickFile(treeFile, protocol);
- fin.parse();
-
- if (fin.getTree() != null)
- {
- alignFrame.loadTree(fin, treeFile);
- result = true;
- dbgMsg("Successfully imported tree.");
- }
- else
- {
- dbgMsg("Tree parameter did not resolve to a valid tree.");
- }
- } catch (Exception ex)
- {
- ex.printStackTrace();
- }
- }
- return result;
- }
-
- /**
- * Discovers whether the given file is in the Applet Archive
- *
- * @param f
- * String
- * @return boolean
- */
- boolean inArchive(String f)
- {
- // This might throw a security exception in certain browsers
- // Netscape Communicator for instance.
- try
- {
- boolean rtn = (getClass().getResourceAsStream("/" + f) != null);
- if (debug)
- {
- System.err.println("Resource '" + f + "' was "
- + (rtn ? "" : "not ") + "located by classloader.");
- }
- return rtn;
- } catch (Exception ex)
- {
- System.out.println("Exception checking resources: " + f + " " + ex);
- return false;
- }
- }
}
/**
/**
* set to enable the URL based javascript execution mechanism
*/
- public boolean jsfallbackEnabled = false;
+ private boolean jsfallbackEnabled = false;
/**
* parse the string into a list
* @param list
* @return elements separated by separator
*/
+ @Override
public String[] separatorListToArray(String list)
{
- return separatorListToArray(list, separator);
- }
-
- /**
- * parse the string into a list
- *
- * @param list
- * @param separator
- * @return elements separated by separator
- */
- public static String[] separatorListToArray(String list, String separator)
- {
- // TODO use StringUtils version (slightly different...)
- int seplen = separator.length();
- if (list == null || list.equals("") || list.equals(separator))
- {
- return null;
- }
- java.util.Vector jv = new Vector();
- int cp = 0, pos;
- while ((pos = list.indexOf(separator, cp)) > cp)
- {
- jv.addElement(list.substring(cp, pos));
- cp = pos + seplen;
- }
- if (cp < list.length())
- {
- String c = list.substring(cp);
- if (!c.equals(separator))
- {
- jv.addElement(c);
- }
- }
- if (jv.size() > 0)
- {
- String[] v = new String[jv.size()];
- for (int i = 0; i < v.length; i++)
- {
- v[i] = (String) jv.elementAt(i);
- }
- jv.removeAllElements();
- if (debug)
- {
- System.err.println("Array from '" + separator
- + "' separated List:\n" + v.length);
- for (int i = 0; i < v.length; i++)
- {
- System.err.println("item " + i + " '" + v[i] + "'");
- }
- }
- return v;
- }
- if (debug)
- {
- System.err.println(
- "Empty Array from '" + separator + "' separated List");
- }
- return null;
+ return JalviewAppLoader.separatorListToArray(list, separator);
}
/**
* @param list
* @return concatenated string
*/
+ @Override
public String arrayToSeparatorList(String[] list)
{
- return arrayToSeparatorList(list, separator);
- }
-
- /**
- * concatenate the list with separator
- *
- * @param list
- * @param separator
- * @return concatenated string
- */
- public static String arrayToSeparatorList(String[] list, String separator)
- {
- // TODO use StringUtils version
- StringBuffer v = new StringBuffer();
- if (list != null && list.length > 0)
- {
- for (int i = 0, iSize = list.length; i < iSize; i++)
- {
- if (list[i] != null)
- {
- if (i > 0)
- {
- v.append(separator);
- }
- v.append(list[i]);
- }
- }
- if (debug)
- {
- System.err
- .println("Returning '" + separator + "' separated List:\n");
- System.err.println(v);
- }
- return v.toString();
- }
- if (debug)
- {
- System.err.println(
- "Returning empty '" + separator + "' separated List\n");
- }
- return "" + separator;
+ return JalviewAppLoader.arrayToSeparatorList(list, separator);
}
/*
* )
*/
@Override
- public String getFeatureGroupsOn(AlignFrame alf)
+ public String getFeatureGroupsOn(AlignFrameI alf)
{
- String lst = arrayToSeparatorList(alf.getFeatureGroups());
+ String lst = arrayToSeparatorList(
+ ((AlignFrame) alf).getFeatureGroups());
return lst;
}
* .AlignFrame, boolean)
*/
@Override
- public String getFeatureGroupsOfStateOn(AlignFrame alf, boolean visible)
+ public String getFeatureGroupsOfStateOn(AlignFrameI alf, boolean visible)
{
- return arrayToSeparatorList(alf.getFeatureGroupsOfState(visible));
+ return arrayToSeparatorList(
+ ((AlignFrame) alf).getFeatureGroupsOfState(visible));
}
/*
* AlignFrame, java.lang.String, boolean)
*/
@Override
- public void setFeatureGroupStateOn(final AlignFrame alf,
+ public void setFeatureGroupStateOn(final AlignFrameI alf,
final String groups, boolean state)
{
final boolean st = state;// !(state==null || state.equals("") ||
@Override
public void run()
{
- alf.setFeatureGroupState(separatorListToArray(groups), st);
+ ((AlignFrame) alf)
+ .setFeatureGroupState(separatorListToArray(groups), st);
}
});
}
* the value to return otherwise
* @return true or false
*/
+ @Override
public boolean getDefaultParameter(String name, boolean def)
{
String stn;
* java.lang.String, java.lang.String, java.lang.String)
*/
@Override
- public boolean addPdbFile(AlignFrame alFrame, String sequenceId,
+ public boolean addPdbFile(AlignFrameI alFrame, String sequenceId,
String pdbEntryString, String pdbFile)
{
- return alFrame.addPdbFile(sequenceId, pdbEntryString, pdbFile);
+ return ((AlignFrame) alFrame).addPdbFile(sequenceId, pdbEntryString,
+ pdbFile);
}
- protected void setAlignPdbStructures(boolean alignPdbStructures)
+ @Override
+ public void setAlignPdbStructures(boolean alignPdbStructures)
{
this.alignPdbStructures = alignPdbStructures;
}
// callInitCallback();
}
- private Hashtable<String, long[]> jshashes = new Hashtable<>();
+ private Hashtable<String, int[]> jshashes = new Hashtable<>();
private Hashtable<String, Hashtable<String, String[]>> jsmessages = new Hashtable<>();
- public void setJsMessageSet(String messageclass, String viewId,
- String[] colcommands)
- {
- Hashtable<String, String[]> msgset = jsmessages.get(messageclass);
- if (msgset == null)
- {
- msgset = new Hashtable<>();
- jsmessages.put(messageclass, msgset);
- }
- msgset.put(viewId, colcommands);
- long[] l = new long[colcommands.length];
- for (int i = 0; i < colcommands.length; i++)
- {
- l[i] = colcommands[i].hashCode();
- }
- jshashes.put(messageclass + "|" + viewId, l);
- }
- /*
- * (non-Javadoc)
- *
- * @see jalview.bin.JalviewLiteJsApi#getJsMessage(java.lang.String,
- * java.lang.String)
- */
@Override
- public String getJsMessage(String messageclass, String viewId)
+ public Hashtable<String, int[]> getJSHashes()
{
- Hashtable<String, String[]> msgset = jsmessages.get(messageclass);
- if (msgset != null)
- {
- String[] msgs = msgset.get(viewId);
- if (msgs != null)
- {
- for (int i = 0; i < msgs.length; i++)
- {
- if (msgs[i] != null)
- {
- String m = msgs[i];
- msgs[i] = null;
- return m;
- }
- }
- }
- }
- return "";
+ return jshashes;
}
- public boolean isJsMessageSetChanged(String string, String string2,
- String[] colcommands)
+ @Override
+ public Hashtable<String, Hashtable<String, String[]>> getJSMessages()
{
- long[] l = jshashes.get(string + "|" + string2);
- if (l == null && colcommands != null)
- {
- return true;
- }
- for (int i = 0; i < colcommands.length; i++)
- {
- if (l[i] != colcommands[i].hashCode())
- {
- return true;
- }
- }
- return false;
+ return jsmessages;
}
- private Vector jsExecQueue = new Vector();
+ private Vector<Runnable> jsExecQueue = new Vector<>();
- public Vector getJsExecQueue()
+ @Override
+ public Vector<Runnable> getJsExecQueue(JSFunctionExec exec)
{
+ jsFunctionExec = exec;
return jsExecQueue;
}
- public void setExecutor(JSFunctionExec jsFunctionExec2)
- {
- jsFunctionExec = jsFunctionExec2;
- }
+ // public void setExecutor(JSFunctionExec jsFunctionExec2)
+ // {
+ // jsFunctionExec = jsFunctionExec2;
+ // }
/**
* return the given colour value parameter or the given default if parameter
}
/**
- * form a complete URL given a path to a resource and a reference location on
- * the same server
- *
- * @param targetPath
- * - an absolute path on the same server as localref or a document
- * located relative to localref
- * @param localref
- * - a URL on the same server as url
- * @return a complete URL for the resource located by url
- */
- private String resolveUrlForLocalOrAbsolute(String targetPath,
- URL localref)
- {
- String resolvedPath = "";
- if (targetPath.startsWith("/"))
- {
- String codebase = localref.toString();
- String localfile = localref.getFile();
- resolvedPath = codebase.substring(0,
- codebase.length() - localfile.length()) + targetPath;
- return resolvedPath;
- }
-
- /*
- * get URL path and strip off any trailing file e.g.
- * www.jalview.org/examples/index.html#applets?a=b is trimmed to
- * www.jalview.org/examples/
- */
- String urlPath = localref.toString();
- String directoryPath = urlPath;
- int lastSeparator = directoryPath.lastIndexOf("/");
- if (lastSeparator > 0)
- {
- directoryPath = directoryPath.substring(0, lastSeparator + 1);
- }
-
- if (targetPath.startsWith("/"))
- {
- /*
- * construct absolute URL to a file on the server - this is not allowed?
- */
- // String localfile = localref.getFile();
- // resolvedPath = urlPath.substring(0,
- // urlPath.length() - localfile.length())
- // + targetPath;
- resolvedPath = directoryPath + targetPath.substring(1);
- }
- else
- {
- resolvedPath = directoryPath + targetPath;
- }
- if (debug)
- {
- System.err.println(
- "resolveUrlForLocalOrAbsolute returning " + resolvedPath);
- }
- return resolvedPath;
- }
-
- /**
* open a URL in the browser - resolving it according to relative refs and
* coping with javascript: protocol if necessary.
*
// form valid URL
// Should really use docbase, not codebase.
URL prepend;
- url = resolveUrlForLocalOrAbsolute(url,
+ url = JalviewAppLoader.resolveUrlForLocalOrAbsolute(url,
prepend = getDefaultParameter("resolvetocodebase", false)
? getCodeBase()
: getDocumentBase());
}
}
- /**
- * bind structures in a viewer to any matching sequences in an alignFrame (use
- * sequenceIds to limit scope of search to specific sequences)
- *
- * @param alFrame
- * @param viewer
- * @param sequenceIds
- * @return TODO: consider making an exception structure for indicating when
- * binding fails public SequenceStructureBinding
- * addStructureViewInstance( AlignFrame alFrame, Object viewer, String
- * sequenceIds) {
- *
- * if (sequenceIds != null && sequenceIds.length() > 0) { return
- * alFrame.addStructureViewInstance(viewer,
- * separatorListToArray(sequenceIds)); } else { return
- * alFrame.addStructureViewInstance(viewer, null); } // return null; }
- */
+ @Override
+ public AlignViewportI getViewport()
+ {
+ return loaderFrame.getAlignViewport();
+ }
+
+ @Override
+ public void newStructureView(PDBEntry pdb, SequenceI[] seqs,
+ String[] chains, DataSourceType protocol)
+ {
+ loaderFrame.newStructureView(this, pdb, seqs, chains,
+ protocol);
+ }
+
+ @Override
+ public void alignedStructureView(PDBEntry[] pdb, SequenceI[][] seqs,
+ String[][] chains, String[] protocols)
+ {
+ loaderFrame.alignedStructureView(this, pdb, seqs, chains, protocols);
+ }
+
+ @Override
+ public void updateForAnnotations()
+ {
+ loaderFrame.alignPanel.fontChanged();
+ loaderFrame.alignPanel.setScrollValues(0, 0);
+ }
+
+ @Override
+ public void setFeatureGroupState(String[] groups, boolean state)
+ {
+ loaderFrame.setFeatureGroupState(groups, state);
+ }
+
+ @Override
+ public boolean parseFeaturesFile(String param, DataSourceType protocol)
+ {
+ return loaderFrame.parseFeaturesFile(param, protocol);
+ }
+
+ @Override
+ public void newFeatureSettings()
+ {
+ getViewport().setShowSequenceFeatures(true);
+ new FeatureSettings(loaderFrame.alignPanel);
+ }
+
+ @Override
+ public boolean loadScoreFile(String sScoreFile) throws IOException
+ {
+ return loaderFrame.loadScoreFile(sScoreFile);
+ }
+
+ @Override
+ public void loadTree(NewickFile tree, String treeFile) throws IOException
+ {
+ loaderFrame.loadTree(tree, treeFile);
+ }
+
+ @Override
+ public boolean isJsfallbackEnabled()
+ {
+ return jsfallbackEnabled;
+ }
+
+ @Override
+ public JSObject getJSObject()
+ {
+ return JSObject.getWindow(this);
+ }
+
+ @Override
+ public void updateColoursFromMouseOver(Object source,
+ MouseOverStructureListener listener)
+ {
+ }
+
+ @Override
+ public Object[] getSelectionForListener(SequenceGroup seqsel, ColumnSelection colsel,
+ HiddenColumns hidden, SelectionSource source, Object alignFrame)
+ {
+ // System.err.println("Testing selection event relay to
+ // jsfunction:"+_listener);
+ String setid = "";
+ AlignFrame src = (AlignFrame) alignFrame;
+ if (source != null)
+ {
+ if (source instanceof jalview.appletgui.AlignViewport
+ && ((jalview.appletgui.AlignViewport) source).applet.currentAlignFrame.viewport == source)
+ {
+ // should be valid if it just generated an event!
+ src = ((jalview.appletgui.AlignViewport) source).applet.currentAlignFrame;
+
+ }
+ }
+ String[] seqs = new String[] {};
+ String[] cols = new String[] {};
+ int strt = 0, end = (src == null) ? -1
+ : src.alignPanel.av.getAlignment().getWidth();
+ if (seqsel != null && seqsel.getSize() > 0)
+ {
+ seqs = new String[seqsel.getSize()];
+ for (int i = 0; i < seqs.length; i++)
+ {
+ seqs[i] = seqsel.getSequenceAt(i).getName();
+ }
+ if (strt < seqsel.getStartRes())
+ {
+ strt = seqsel.getStartRes();
+ }
+ if (end == -1 || end > seqsel.getEndRes())
+ {
+ end = seqsel.getEndRes();
+ }
+ }
+ if (colsel != null && !colsel.isEmpty())
+ {
+ if (end == -1)
+ {
+ end = colsel.getMax() + 1;
+ }
+ cols = new String[colsel.getSelected().size()];
+ for (int i = 0; i < cols.length; i++)
+ {
+ cols[i] = "" + (1 + colsel.getSelected().get(i).intValue());
+ }
+ }
+ else
+ {
+ if (seqsel != null && seqsel.getSize() > 0)
+ {
+ // send a valid range, otherwise we send the empty selection
+ cols = new String[2];
+ cols[0] = "" + (1 + strt) + "-" + (1 + end);
+ }
+ }
+ return new Object[]
+ { src, setid, arrayToSeparatorList(seqs), arrayToSeparatorList(cols) };
+ }
+
+ @Override
+ public String getJsMessage(String messageclass, String viewId)
+ {
+ return JSFunctionExec.getJsMessage(messageclass, viewId, this);
+ }
+
+ @Override
+ public Object getFrameForSource(VamsasSource source)
+ {
+ if (source != null)
+ {
+ if (source instanceof jalview.appletgui.AlignViewport
+ && ((jalview.appletgui.AlignViewport) source).applet.currentAlignFrame.viewport == source)
+ {
+ // should be valid if it just generated an event!
+ return ((jalview.appletgui.AlignViewport) source).applet.currentAlignFrame;
+
+ }
+ // TODO: ensure that if '_af' is specified along with a handler
+ // function, then only events from that alignFrame are sent to that
+ // function
+ }
+ return null;
+ }
+
+ @Override
+ public FeatureRenderer getNewFeatureRenderer(AlignViewportI vp)
+ {
+ return new jalview.appletgui.FeatureRenderer((AlignmentViewport) vp);
+ }
+
+ @Override
+ public String getSelectedSequencesAsAlignment(String format,
+ boolean suffix)
+ {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public String getSelectedSequencesAsAlignmentFrom(AlignFrameI alf,
+ String format, boolean suffix)
+ {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ // /**
+ // * bind structures in a viewer to any matching sequences in an alignFrame
+ // (use
+ // * sequenceIds to limit scope of search to specific sequences)
+ // *
+ // * @param alFrame
+ // * @param viewer
+ // * @param sequenceIds
+ // * @return TODO: consider making an exception structure for indicating when
+ // * binding fails public SequenceStructureBinding
+ // * addStructureViewInstance( AlignFrame alFrame, Object viewer, String
+ // * sequenceIds) {
+ // *
+ // * if (sequenceIds != null && sequenceIds.length() > 0) { return
+ // * alFrame.addStructureViewInstance(viewer,
+ // * separatorListToArray(sequenceIds)); } else { return
+ // * alFrame.addStructureViewInstance(viewer, null); } // return null; }
+ // */
}
+++ /dev/null
-package jalview.bin;
-
-import java.awt.Image;
-import java.awt.Taskbar;
-
-public class JalviewTaskbar
-{
- public JalviewTaskbar()
- {
- }
-
- protected static void setTaskbar(Jalview jalview)
- {
-
- if (Taskbar.isTaskbarSupported())
- {
- Taskbar tb = Taskbar.getTaskbar();
- if (tb.isSupported(Taskbar.Feature.ICON_IMAGE))
- {
- try
- {
- java.net.URL url = jalview.getClass()
- .getResource("/images/JalviewLogo_Huge.png");
- if (url != null)
- {
- Image image = java.awt.Toolkit.getDefaultToolkit()
- .createImage(url);
- tb.setIconImage(image);
- }
- } catch (Exception e)
- {
- System.out.println("Unable to setIconImage()");
- }
- }
- }
-
- }
-
-}
+++ /dev/null
-package jalview.bin;
-
-import java.io.File;
-import java.io.IOException;
-import java.lang.management.ManagementFactory;
-import java.util.ArrayList;
-
-public class Launcher
-{
-
- private final static String startClass = "jalview.bin.Jalview";
-
- private final static int maxHeapSizePerCent = 90;
-
- private final static String maxHeapSizePerCentProperty = "jvmmempc";
-
- private final static String dockIconPath = "JalviewLogo_Huge.png";
-
- public static void main(String[] args)
- {
- final String javaBin = System.getProperty("java.home") + File.separator
- + "bin" + File.separator + "java";
-
- ArrayList<String> command = new ArrayList<>();
- command.add(javaBin);
-
- String memSetting = null;
-
- boolean isAMac = System.getProperty("os.name").indexOf("Mac") > -1;
-
- for (String jvmArg : ManagementFactory.getRuntimeMXBean()
- .getInputArguments())
- {
- command.add(jvmArg);
- }
- command.add("-cp");
- command.add(ManagementFactory.getRuntimeMXBean().getClassPath());
- ArrayList<String> arguments = new ArrayList<>();
- for (String arg : args)
- {
- arguments.add(arg);
- }
-
- // add memory setting if not specified
- boolean memSet = false;
- boolean dockIcon = false;
- boolean dockName = false;
- ARG: for (int i = 0; i < command.size(); i++)
- {
- String arg = command.get(i);
- if (arg.startsWith("-Xmx"))
- {
- memSetting = arg;
- memSet = true;
- }
- else if (arg.startsWith("-Xdock:icon"))
- {
- dockIcon = true;
- }
- else if (arg.startsWith("-Xdock:name"))
- {
- dockName = true;
- }
- }
-
- if (!memSet)
- {
- long maxMemLong = -1;
- int percent = maxHeapSizePerCent;
- String jvmmempc = System.getProperty(maxHeapSizePerCentProperty);
- try
- {
- if (jvmmempc != null)
- {
- int trypercent = Integer.parseInt(jvmmempc);
- if (0 < trypercent && trypercent <= 100)
- {
- percent = trypercent;
- }
- else
- {
- System.out.println("Property '" + maxHeapSizePerCentProperty
- + "' should be in range 1..100");
- }
- }
- } catch (Exception e)
- {
- System.out.println("Error parsing " + maxHeapSizePerCentProperty
- + " '" + jvmmempc + "'");
- }
-
- try
- {
- maxMemLong = MemorySetting.memPercent(percent);
- } catch (Exception e)
- {
- e.printStackTrace();
- } catch (Throwable t)
- {
- t.printStackTrace();
- }
-
- if (maxMemLong > 0)
- {
- memSetting = "-Xmx" + Long.toString(maxMemLong);
- command.add(memSetting);
- }
- }
-
- if (isAMac)
- {
- if (!dockIcon)
- {
- command.add("-Xdock:icon=" + dockIconPath);
- }
- if (!dockName)
- {
- // -Xdock:name=... doesn't actually work :(
- // Leaving it in in case it gets fixed
- command.add("-Xdock:name=" + "Jalview");
- }
- }
-
- command.add(startClass);
- command.addAll(arguments);
-
- final ProcessBuilder builder = new ProcessBuilder(command);
-
- // System.out.println("COMMAND: " + String.join(" ", builder.command()));
- System.out.println("Running " + startClass + " with "
- + (memSetting == null ? "no memSetting" : memSetting));
-
- try
- {
- builder.inheritIO();
- Process process = builder.start();
- process.waitFor();
- } catch (IOException e)
- {
- if (e.getMessage().toLowerCase().contains("memory"))
- {
- System.out.println("Caught a memory exception: " + e.getMessage());
- // Probably the "Cannot allocate memory" error, try without the memory setting
- ArrayList<String> commandNoMem = new ArrayList<>();
- for (int i = 0; i < command.size(); i++)
- {
- if (!command.get(i).startsWith("-Xmx"))
- {
- commandNoMem.add(command.get(i));
- }
- }
- final ProcessBuilder builderNoMem = new ProcessBuilder(
- commandNoMem);
- System.out.println("NO MEM COMMAND: "
- + String.join(" ", builderNoMem.command()));
- try
- {
- builderNoMem.inheritIO();
- Process processNoMem = builderNoMem.start();
- processNoMem.waitFor();
- } catch (Exception ex)
- {
- ex.printStackTrace();
- }
- }
- else
- {
- e.printStackTrace();
- }
- } catch (Exception e)
- {
- e.printStackTrace();
- }
- // System.exit(0);
-
- }
-
-}
+++ /dev/null
-package jalview.bin;
-
-import java.lang.management.ManagementFactory;
-import java.lang.management.OperatingSystemMXBean;
-
-public class MemorySetting
-{
- public static final long leaveFreeMinMemory = 536870912; // 0.5 GB
-
- public static final long applicationMinMemory = 536870912; // 0.5 GB
-
- protected static long getPhysicalMemory()
- {
- final OperatingSystemMXBean o = ManagementFactory
- .getOperatingSystemMXBean();
-
- try
- {
- if (o instanceof com.sun.management.OperatingSystemMXBean)
- {
- final com.sun.management.OperatingSystemMXBean osb = (com.sun.management.OperatingSystemMXBean) o;
- return osb.getTotalPhysicalMemorySize();
- }
- } catch (NoClassDefFoundError e)
- {
- // com.sun.management.OperatingSystemMXBean doesn't exist in this JVM
- System.out.println("No com.sun.management.OperatingSystemMXBean");
- }
-
- // We didn't get a com.sun.management.OperatingSystemMXBean.
- return -1;
- }
-
- public static long memPercent(int percent)
- {
- long memPercent = -1;
-
- long physicalMem = getPhysicalMemory();
- if (physicalMem > applicationMinMemory)
- {
- // try and set at least applicationMinMemory and thereafter ensure
- // leaveFreeMinMemory is left for the OS
- memPercent = Math.max(applicationMinMemory,
- physicalMem - Math.max(physicalMem * (100 - percent) / 100,
- leaveFreeMinMemory));
- }
-
- return memPercent;
- }
-
-}
{
String description;
- public static int TO_LOWER = 0;
+ public final static int TO_LOWER = 0;
- public static int TO_UPPER = 1;
+ public final static int TO_UPPER = 1;
- public static int TOGGLE_CASE = 2;
+ public final static int TOGGLE_CASE = 2;
- int caseChange = -1;
+ private int caseChange;
- SequenceI[] seqs;
+ private SequenceI[] seqs;
- List<int[]> regions;
+ private List<int[]> regions;
public ChangeCaseCommand(String description, SequenceI[] seqs,
List<int[]> regions, int caseChange)
doCommand(null);
}
+ @Override
public String getDescription()
{
return description;
}
+ @Override
public int getSize()
{
return 1;
}
+ @Override
public void doCommand(AlignmentI[] views)
{
changeCase(true);
}
+ @Override
public void undoCommand(AlignmentI[] views)
{
changeCase(false);
// JBPNote this routine could also mark rows, not just columns.
// need a decent query structure to allow all types of feature searches
BitSet bs = new BitSet();
- boolean searchSelection = viewport.getSelectionGroup() != null
- && !extendCurrent;
- SequenceCollectionI sqcol = searchSelection ? viewport
- .getSelectionGroup() : viewport.getAlignment();
+ SequenceCollectionI sqcol = (viewport.getSelectionGroup() == null
+ || extendCurrent) ? viewport.getAlignment()
+ : viewport.getSelectionGroup();
int nseq = findColumnsWithFeature(featureType, sqcol, bs);
}
else
{
- String key = searchSelection ? "label.no_feature_found_selection"
- : "label.no_feature_of_type_found";
- avcg.setStatus(MessageManager.formatMessage(key,
- new String[] { featureType }));
+ avcg.setStatus(MessageManager
+ .formatMessage("label.no_feature_of_type_found", new String[]
+ { featureType }));
if (!extendCurrent)
{
cs.clear();
* @author JimP
*
*/
-public class Alignment implements AlignmentI, AutoCloseable
+public class Alignment implements AlignmentI
{
private Alignment dataset;
/**
* Make a new alignment from an array of SeqCigars
*
- * @param seqs
- * SeqCigar[]
+ * @param alseqs
*/
public Alignment(SeqCigar[] alseqs)
{
}
@Override
- public void close()
+ public void finalize() throws Throwable
{
if (getDataset() != null)
{
- try
- {
- getDataset().removeAlignmentRef();
- } catch (Throwable e)
- {
- e.printStackTrace();
- }
+ getDataset().removeAlignmentRef();
}
nullReferences();
+ super.finalize();
}
/**
return null;
}
+ private static final SequenceGroup[] noGroups = new SequenceGroup[0];
+
+ private ArrayList<SequenceGroup> temp = new ArrayList<>();
+
/*
* (non-Javadoc)
*
@Override
public SequenceGroup[] findAllGroups(SequenceI s)
{
- ArrayList<SequenceGroup> temp = new ArrayList<>();
synchronized (groups)
{
int gSize = groups.size();
+ if (gSize == 0)
+ {
+ return noGroups;
+ }
+ temp.clear();
for (int i = 0; i < gSize; i++)
{
SequenceGroup sg = groups.get(i);
}
}
+ @Override
+ public void resetColors()
+ {
+ for (int i = getHeight(); --i >= 0;)
+ {
+ sequences.get(i).resetColors();
+ }
+ // if (dataset != null)
+ // {
+ // dataset.resetColors();
+ // }
+ }
+
}
seqPos = i + startRes;
}
- sequenceMapping.put(Integer.valueOf(seqPos), annotations[i]);
+ sequenceMapping.put(new Integer(seqPos), annotations[i]);
}
}
{
for (a = sequenceRef.getStart(); a <= sequenceRef.getEnd(); a++)
{
- index = Integer.valueOf(a);
+ index = new Integer(a);
Annotation annot = sequenceMapping.get(index);
if (annot != null)
{
public HiddenColumns propagateInsertions(SequenceI profileseq,
AlignmentView input);
+ /**
+ * Remove all color already assigned to sequences, causing them to be be
+ * recalculated.
+ */
+ void resetColors();
+
}
import jalview.api.AlignmentColsCollectionI;
+import java.util.BitSet;
import java.util.Iterator;
public class AllColsCollection implements AlignmentColsCollectionI
{
return hidden.hasHiddenColumns();
}
+
+ private BitSet bsVisible;
+
+ @Override
+ public BitSet getHiddenBitSet()
+ {
+ return hidden.getBitset();
+ }
+
+ /**
+ * return ALL columns, not just the truly visible ones
+ */
+ @Override
+ public BitSet getOverviewBitSet()
+ {
+ if (bsVisible == null)
+ {
+ bsVisible = new BitSet(end + 1);
+ bsVisible.set(0, end + 1);
+ }
+ return bsVisible;
+ }
}
for (int i = 0; i < binary.length; i++)
{
- out += (Integer.valueOf(binary[i])).toString();
+ out += (new Integer(binary[i])).toString();
if (i < (binary.length - 1))
{
void remove(int col)
{
- Integer colInt = Integer.valueOf(col);
+ Integer colInt = new Integer(col);
if (selected.get(col))
{
// clear shifted bits and update List of selected columns
selected.clear(temp);
mask.set(temp - change);
- order.set(i, Integer.valueOf(temp - change));
+ order.set(i, new Integer(temp - change));
}
}
// lastly update the bitfield all at once
Integer colInt;
for (int i = start; i < end; i++)
{
- colInt = Integer.valueOf(i);
+ colInt = new Integer(i);
if (selection.contains(colInt))
{
selection.remove(colInt);
package jalview.datamodel;
import jalview.api.DBRefEntryI;
-import jalview.io.vamsas.Dbref;
import jalview.util.DBRefUtils;
import jalview.util.MapList;
private String version = "";
- private String ucversion;
+ private String ucversion = "";
private String accessionId = "";
public static final String UNIPROT = "UNIPROT";
- public static final String UP_NAME = "UNIPROT_NAME".toUpperCase();
+
+ public static final String UP_NAME = "UNIPROT_NAME";
/**
* Uniprot Knowledgebase/TrEMBL as served from EMBL protein products.
*/
public static final String EMBLCDSProduct = "EMBLCDSProtein".toUpperCase();
public static final String PDB = "PDB";
- public static final String PFAM = "PFAM";
+
+ public static final String PFAM = "PFAM";
+
public static final String RFAM = "RFAM";
public static final String GENEDB = "GeneDB".toUpperCase();
+ public static final String PFAM_FULL = "PFAM (Full)";
+
+ public static final String PFAM_SEED = "PFAM (Seed)";
+
+ public static final String RFAM_SEED = "RFAM (Seed)";
+
public static final String PDB_CANONICAL_NAME = PDB;
// CODINGDBS, DNACODINGDBS, PROTEINDBS };
//
public static final int PRIMARY_SOURCES_MASK = CODING_MASK | DNA_CODING_MASK | PROTEIN_MASK;
-
+
public static boolean isPrimarySource(String source)
{
return ((PRIMARY_SOURCES_MASK & getSourceKey(source)) != 0);
*/
private List<int[]> hiddenColumns = new ArrayList<>();
+ private BitSet hiddenBitSet;
+
+ public BitSet getBitset()
+ {
+ if (hiddenBitSet == null)
+ {
+ hiddenBitSet = new BitSet();
+ for (int[] range : hiddenColumns)
+ {
+ hiddenBitSet.set(range[0], range[1] + 1);
+ }
+ }
+ return hiddenBitSet;
+ }
/**
* Constructor
*/
prevHiddenCount);
} finally
{
+ hiddenBitSet = null;
LOCK.writeLock().unlock();
}
}
insertRangeAtOverlap(i, start, end, region);
added = true;
}
+ hiddenBitSet = null;
return added;
}
}
numColumns += region[1] - oldend;
hiddenColumns.subList(i + 1, endi + 1).clear();
+ hiddenBitSet = null;
}
/**
} finally
{
+ hiddenBitSet = null;
LOCK.writeLock().unlock();
}
}
} finally
{
+ hiddenBitSet = null;
LOCK.writeLock().unlock();
}
}
}
} finally
{
+ hiddenBitSet = null;
LOCK.writeLock().unlock();
}
}
} finally
{
+ hiddenBitSet = null;
LOCK.readLock().unlock();
}
}
for (int firstSet = tohide
.nextSetBit(start), lastSet = start; firstSet >= start
&& lastSet <= end; firstSet = tohide
- .nextSetBit(lastSet))
+ .nextSetBit(lastSet))
{
lastSet = tohide.nextClearBit(firstSet);
if (lastSet <= end)
cursor = new HiddenColumnsCursor(hiddenColumns);
} finally
{
+ hiddenBitSet = null;
LOCK.writeLock().unlock();
}
}
}
} finally
{
+ hiddenBitSet = null;
LOCK.writeLock().unlock();
}
}
{
LOCK.writeLock().lock();
- BitSet hiddenBitSet = new BitSet();
- for (int[] range : hiddenColumns)
- {
- hiddenBitSet.set(range[0], range[1] + 1);
- }
- hiddenBitSet.andNot(updates);
+ getBitset().andNot(updates);
hiddenColumns.clear();
hideColumns(hiddenBitSet);
} finally
{
+ hiddenBitSet = null;
LOCK.writeLock().unlock();
}
}
* CaseInsensitiveString, so we are in effect doing a
* case-insensitive comparison of chain codes
*/
- boolean idMatches = id == o.id
- || (id != null && id.equalsIgnoreCase(o.id));
- boolean fileMatches = file == o.file
- || (file != null && file.equals(o.file));
- boolean typeMatches = type == o.type
- || (type != null && type.equals(o.type));
- if (idMatches && fileMatches && typeMatches)
- {
- return properties == o.properties
- || (properties != null && properties.equals(o.properties));
- }
- return false;
+ return (id == o.id || (id != null && id.equalsIgnoreCase(o.id)))
+ && (file == o.file || (file != null && file.equals(o.file)))
+ && (type == o.type || (type != null && type.equals(o.type)))
+ && (properties == o.properties || (properties != null
+ && properties.equals(o.properties)));
}
/**
{
this.id = pdbId;
this.type = entryType == null ? null : entryType.toString();
- this.file = filePath;
+ this.file = (filePath == null ? null : filePath.replace('\\', '/'));
setChainCode(chain);
}
public void setFile(String f)
{
- this.file = f;
+ this.file = f.replace('\\', '/');
}
public String getFile()
{
if (this.properties == null)
{
- this.properties = new Hashtable<String, Object>();
+ this.properties = new Hashtable<>();
}
properties.put(key, value);
}
* fast lookup tables holding the index into our count
* arrays of each symbol; index 0 is reserved for gap counting
*/
- private static int[] NUC_INDEX = new int[26];
+ private final static int[] NUC_INDEX = new int[26];
+
+ private final static int[] AA_INDEX = new int[26];
- private static int[] AA_INDEX = new int[26];
static
{
for (int i = 0; i < NUCS.length(); i++)
public class SecondaryStructureAnnotation extends AlignmentAnnotation
{
- private static RNA _rna = null;
+ // was static, but that cannot work here
+
+ private RNA _rna = null;
public SecondaryStructureAnnotation(RNA rna)
{
Annotation[] ann = new Annotation[rna.getSize()];
for (int i = 0; i < ann.length; i++)
{
- ann[i] = new Annotation(_rna.getStructDBN(true), "", ' ', 0f);
+ ann[i] = new Annotation(rna.getStructDBN(true), "", ' ', 0f);
;
}
return ann;
return sequenceFeatureStore.add(sf);
}
+ /**
+ * @param sf
+ * A known feature of this featureStore
+ */
@Override
public void deleteFeature(SequenceFeature sf)
{
List<SequenceFeature> result = getFeatures().findFeatures(startPos,
endPos, types);
- if (datasetSequence != null)
- {
- result = datasetSequence.getFeatures().findFeatures(startPos, endPos,
- types);
- }
- else
- {
- result = sequenceFeatureStore.findFeatures(startPos, endPos, types);
- }
+ // if (datasetSequence != null)
+ // {
+ // result = datasetSequence.getFeatures().findFeatures(startPos, endPos,
+ // types);
+ // }
+ // else
+ // {
+ // result = sequenceFeatureStore.findFeatures(startPos, endPos, types);
+ // }
/*
* if end column is gapped, endPos may be to the right,
@Override
public void sequenceChanged()
{
+ argb = null;
changeCount++;
}
// otherwise, sequence was completely hidden
return 0;
}
+
+ private int[] argb;
+
+ @Override
+ public int getColor(int i)
+ {
+ return argb == null ? 0 : argb[i];
+ }
+
+ @Override
+ public int setColor(int i, int rgb)
+ {
+ if (argb == null)
+ {
+ argb = new int[this.sequence.length];
+ }
+ return (argb[i] = rgb);
+ }
+
+ @Override
+ public void resetColors()
+ {
+ argb = null;
+ }
+
+ /**
+ * @author Bob Hanson 2019.07.30
+ *
+ * allows passing the result ArrayList as a parameter to avoid
+ * unnecessary construction
+ * @return result (JavaScript) or new ArrayList (Java -- see FeatureRender)
+ *
+ */
+ @Override
+ public List<SequenceFeature> findFeatures(int column, String type,
+ List<SequenceFeature> result)
+ {
+ return getFeatures().findFeatures(findPosition(column - 1), type,
+ result);
+ }
+
+ /**
+ * allows early intervention for renderer if this returns false
+ */
+ @Override
+ public boolean hasFeatures(String type)
+ {
+ return getFeatures().hasFeatures(type);
+ }
+
}
import java.util.TreeMap;
import java.util.Vector;
+import intervalstore.api.IntervalI;
+
/**
* A class that models a single contiguous feature on a sequence. If flag
* 'contactFeature' is true, the start and end positions are interpreted instead
@Override
public boolean equals(Object o)
{
- return equals(o, false);
+ return (o != null && (o instanceof SequenceFeature)
+ && equalsInterval((SequenceFeature) o));
}
/**
+ * Having determined that this is in fact a SequenceFeature, now check it for
+ * equivalence. Overridden in CrossRef; used by IntervalStore (possibly).
+ */
+ @Override
+ public boolean equalsInterval(IntervalI sf)
+ {
+ return equals((SequenceFeature) sf, false);
+ }
+ /**
* Overloaded method allows the equality test to optionally ignore the
* 'Parent' attribute of a feature. This supports avoiding adding many
* superficially duplicate 'exon' or CDS features to genomic or protein
* @param ignoreParent
* @return
*/
- public boolean equals(Object o, boolean ignoreParent)
+ public boolean equals(SequenceFeature sf, boolean ignoreParent)
{
- if (o == null || !(o instanceof SequenceFeature))
- {
- return false;
- }
-
- SequenceFeature sf = (SequenceFeature) o;
boolean sameScore = Float.isNaN(score) ? Float.isNaN(sf.score)
: score == sf.score;
if (begin != sf.begin || end != sf.end || !sameScore)
{
source = theSource;
}
+
+
}
class SFSortByEnd implements Comparator<SequenceFeature>
*/
public int firstResidueOutsideIterator(Iterator<int[]> it);
+ /**
+ * @author Bob Hanson 2019.07.30
+ *
+ * get a 4-byte color, with caching
+ *
+ */
+ public int getColor(int i);
+
+ /**
+ * @author Bob Hanson 2019.07.30
+ *
+ * set a 4-byte color, with caching
+ *
+ */
+ public int setColor(int i, int argb);
+
+ /**
+ * @author Bob Hanson 2019.07.30
+ *
+ * allows resetting the color cache
+ *
+ */
+ public void resetColors();
+
+ /**
+ * allows passing the result ArrayList as a parameter to avoid unnecessary
+ * construction
+ *
+ * @author Bob Hanson 2019.07.30
+ *
+ *
+ */
+ List<SequenceFeature> findFeatures(int column, String type,
+ List<SequenceFeature> result);
+
+ /**
+ * allows early intervention for renderer if false
+ *
+ * @author Bob Hanson 2019.07.30
+ *
+ */
+ public boolean hasFeatures(String type);
}
import jalview.api.AlignmentColsCollectionI;
+import java.util.BitSet;
import java.util.Iterator;
public class VisibleColsCollection implements AlignmentColsCollectionI
HiddenColumns hidden;
+ private BitSet bsVisible;
+
public VisibleColsCollection(int s, int e, HiddenColumns h)
{
start = s;
return false;
}
+ /**
+ * Only the visible columns.
+ */
+ @Override
+ public BitSet getOverviewBitSet()
+ {
+ if (bsVisible == null)
+ {
+ bsVisible = new BitSet(end + 1);
+ }
+ bsVisible.clear();
+ bsVisible.set(start, end + 1);
+ bsVisible.andNot(hidden.getBitset());
+
+ return bsVisible;
+ }
+
+ @Override
+ public BitSet getHiddenBitSet()
+ {
+ return new BitSet();
+ }
+
}
package jalview.datamodel.features;
+import jalview.bin.ApplicationSingletonProvider;
+import jalview.bin.ApplicationSingletonProvider.ApplicationSingletonI;
+
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
/**
* A singleton class to hold the set of attributes known for each feature type
*/
-public class FeatureAttributes
+public class FeatureAttributes implements ApplicationSingletonI
{
public enum Datatype
{
Character, Number, Mixed
}
- private static FeatureAttributes instance = new FeatureAttributes();
+ public static FeatureAttributes getInstance()
+ {
+ return (FeatureAttributes) ApplicationSingletonProvider
+ .getInstance(FeatureAttributes.class);
+ }
+
+ private FeatureAttributes()
+ {
+ attributes = new HashMap<>();
+ }
/*
* map, by feature type, of a map, by attribute name, of
}
/**
- * Answers the singleton instance of this class
- *
- * @return
- */
- public static FeatureAttributes getInstance()
- {
- return instance;
- }
-
- private FeatureAttributes()
- {
- attributes = new HashMap<>();
- }
-
- /**
* Answers the attribute names known for the given feature type, in
* alphabetical order (not case sensitive), or an empty set if no attributes
* are known. An attribute name is typically 'simple' e.g. "AC", but may be
package jalview.datamodel.features;
+import jalview.bin.ApplicationSingletonProvider;
+import jalview.bin.ApplicationSingletonProvider.ApplicationSingletonI;
+
import java.util.HashMap;
import java.util.Map;
-/**
- * A singleton to hold metadata about feature attributes, keyed by a unique
- * feature source identifier
- *
- * @author gmcarstairs
- *
- */
-public class FeatureSources
+public class FeatureSources implements ApplicationSingletonI
{
- private static FeatureSources instance = new FeatureSources();
-
- private Map<String, FeatureSourceI> sources;
- /**
- * Answers the singleton instance of this class
- *
- * @return
- */
public static FeatureSources getInstance()
{
- return instance;
+ return (FeatureSources) ApplicationSingletonProvider
+ .getInstance(FeatureSources.class);
}
+ private Map<String, FeatureSourceI> sources;
+
private FeatureSources()
{
sources = new HashMap<>();
import jalview.datamodel.SequenceFeature;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
-import intervalstore.api.IntervalStoreI;
-import intervalstore.impl.BinarySearcher;
-import intervalstore.impl.IntervalStore;
-
-/**
- * A data store for a set of sequence features that supports efficient lookup of
- * features overlapping a given range. Intended for (but not limited to) storage
- * of features for one sequence and feature type.
- *
- * @author gmcarstairs
- *
- */
-public class FeatureStore
+public abstract class FeatureStore implements FeatureStoreI
{
+
+ /**
+ * track last start for quick insertion of ordered features
+ */
+ protected int lastStart = -1, lastContactStart = -1;
+
+ /**
+ * Answers the 'length' of the feature, counting 0 for non-positional features
+ * and 1 for contact features
+ *
+ * @param feature
+ * @return
+ */
+ protected static int getFeatureLength(SequenceFeature feature)
+ {
+ if (feature.isNonPositional())
+ {
+ return 0;
+ }
+ if (feature.isContactFeature())
+ {
+ return 1;
+ }
+ return 1 + feature.getEnd() - feature.getBegin();
+ }
+
+ /**
+ * Answers true if the list contains the feature, else false. This method is
+ * optimised for the condition that the list is sorted on feature start
+ * position ascending, and will give unreliable results if this does not hold.
+ *
+ * @param list
+ * @param feature
+ * @return
+ */
+ @Override
+ public boolean listContains(List<SequenceFeature> list,
+ SequenceFeature feature)
+ {
+ if (list == null || feature == null)
+ {
+ return false;
+ }
+
+ return (getEquivalentFeatureIndex(list, feature) >= 0);
+ }
+
+ /**
+ * Binary search for the index (>= 0) of a feature in a list.
+ *
+ * @param list
+ * @param feature
+ * @return index if found; -1 if not
+ */
+ protected int getEquivalentFeatureIndex(List<SequenceFeature> list,
+ SequenceFeature feature)
+ {
+
+ /*
+ * locate the first entry in the list which does not precede the feature
+ */
+ int begin = feature.begin;
+ int pos = findFirstBegin(list, begin);
+ int len = list.size();
+ while (pos < len)
+ {
+ SequenceFeature sf = list.get(pos);
+ if (sf.begin > begin)
+ {
+ return -1; // no match found
+ }
+ if (sf.equals(feature))
+ {
+ return pos;
+ }
+ pos++;
+ }
+ return -1;
+ }
+
+ /**
+ * A helper method to return the maximum of two floats, where a non-NaN value
+ * is treated as 'greater than' a NaN value (unlike Math.max which does the
+ * opposite)
+ *
+ * @param f1
+ * @param f2
+ */
+ protected static float max(float f1, float f2)
+ {
+ if (Float.isNaN(f1))
+ {
+ return Float.isNaN(f2) ? f1 : f2;
+ }
+ else
+ {
+ return Float.isNaN(f2) ? f1 : Math.max(f1, f2);
+ }
+ }
+
+ /**
+ * A helper method to return the minimum of two floats, where a non-NaN value
+ * is treated as 'less than' a NaN value (unlike Math.min which does the
+ * opposite)
+ *
+ * @param f1
+ * @param f2
+ */
+ protected static float min(float f1, float f2)
+ {
+ if (Float.isNaN(f1))
+ {
+ return Float.isNaN(f2) ? f1 : f2;
+ }
+ else
+ {
+ return Float.isNaN(f2) ? f1 : Math.min(f1, f2);
+ }
+ }
+
/*
* Non-positional features have no (zero) start/end position.
* Kept as a separate list in case this criterion changes in future.
* IntervalStore holds remaining features and provides efficient
* query for features overlapping any given interval
*/
- IntervalStoreI<SequenceFeature> features;
+ Collection<SequenceFeature> features;
/*
* Feature groups represented in stored positional features
*/
public FeatureStore()
{
- features = new IntervalStore<>();
positionalFeatureGroups = new HashSet<>();
nonPositionalFeatureGroups = new HashSet<>();
positionalMinScore = Float.NaN;
}
/**
- * Adds one sequence feature to the store, and returns true, unless the
- * feature is already contained in the store, in which case this method
- * returns false. Containment is determined by SequenceFeature.equals()
- * comparison.
+ * Add a contact feature to the lists that hold them ordered by start (first
+ * contact) and by end (second contact) position, ensuring the lists remain
+ * ordered, and returns true. This method allows duplicate features to be
+ * added, so test before calling to avoid this.
*
* @param feature
+ * @return
*/
- public boolean addFeature(SequenceFeature feature)
+ protected synchronized boolean addContactFeature(SequenceFeature feature)
{
- if (contains(feature))
+ if (contactFeatureStarts == null)
{
- return false;
+ contactFeatureStarts = new ArrayList<>();
+ contactFeatureEnds = new ArrayList<>();
}
/*
- * keep a record of feature groups
+ * insert into list sorted by start (first contact position):
+ * binary search the sorted list to find the insertion point
*/
- if (!feature.isNonPositional())
- {
- positionalFeatureGroups.add(feature.getFeatureGroup());
- }
+ contactFeatureStarts.add(
+ findFirstBegin(contactFeatureStarts, feature.begin), feature);
+ /*
+ * insert into list sorted by end (second contact position):
+ * binary search the sorted list to find the insertion point
+ */
+ contactFeatureEnds.add(findFirstEnd(contactFeatureEnds, feature.end),
+ feature);
+
+ return true;
+ }
+
+ /**
+ * Adds one sequence feature to the store, and returns true, unless the
+ * feature is already contained in the store, in which case this method
+ * returns false. Containment is determined by SequenceFeature.equals()
+ * comparison.
+ *
+ * @param feature
+ */
+
+ @Override
+ public boolean addFeature(SequenceFeature feature)
+ {
+ // if (contains(feature))
+ // {
+ // return false;
+ // }
+
+ // /*
+ // * keep a record of feature groups
+ // */
+ // if (!feature.isNonPositional())
+ // {
+ // positionalFeatureGroups.add(feature.getFeatureGroup());
+ // }
if (feature.isContactFeature())
{
+ if (containsContactFeature(feature))
+ {
+ return false;
+ }
+ positionalFeatureGroups.add(feature.getFeatureGroup());
+ if (feature.begin > lastContactStart)
+ {
+ lastContactStart = feature.begin;
+ }
addContactFeature(feature);
}
else if (feature.isNonPositional())
{
+ if (containsNonPositional(feature))
+ {
+ return false;
+ }
+
addNonPositionalFeature(feature);
}
else
{
- addNestedFeature(feature);
+ // allow for check with
+ if (checkContainsPositionalFeatureForAdd(feature)
+ || !addPositionalFeature(feature))
+ {
+ return false;
+ }
+ positionalFeatureGroups.add(feature.getFeatureGroup());
+ // addPositionalFeature(feature);
+ if (feature.begin > lastStart)
+ {
+ lastStart = feature.begin;
+ }
}
/*
return true;
}
- /**
- * Answers true if this store contains the given feature (testing by
- * SequenceFeature.equals), else false
- *
- * @param feature
- * @return
- */
- public boolean contains(SequenceFeature feature)
+ private void addFeaturesForGroup(String group,
+ Collection<SequenceFeature> sfs, List<SequenceFeature> result)
{
- if (feature.isNonPositional())
+ if (sfs == null)
{
- return nonPositionalFeatures == null ? false : nonPositionalFeatures
- .contains(feature);
+ return;
}
-
- if (feature.isContactFeature())
+ for (SequenceFeature sf : sfs)
{
- return contactFeatureStarts == null ? false : listContains(
- contactFeatureStarts, feature);
+ String featureGroup = sf.getFeatureGroup();
+ if (group == null && featureGroup == null
+ || group != null && group.equals(featureGroup))
+ {
+ result.add(sf);
+ }
}
-
- return features == null ? false : features
- .contains(feature);
}
/**
- * Answers the 'length' of the feature, counting 0 for non-positional features
- * and 1 for contact features
+ * Adds one feature to the IntervalStore that can manage nested features
+ * (creating the IntervalStore if necessary)
*
- * @param feature
- * @return
+ * @return true if added -- allowing for late checking during addition
*/
- protected static int getFeatureLength(SequenceFeature feature)
- {
- if (feature.isNonPositional())
- {
- return 0;
- }
- if (feature.isContactFeature())
- {
- return 1;
- }
- return 1 + feature.getEnd() - feature.getBegin();
- }
+ abstract protected boolean addPositionalFeature(SequenceFeature feature);
/**
* Adds the feature to the list of non-positional features (with lazy
}
/**
- * Adds one feature to the IntervalStore that can manage nested features
- * (creating the IntervalStore if necessary)
- */
- protected synchronized void addNestedFeature(SequenceFeature feature)
- {
- if (features == null)
- {
- features = new IntervalStore<>();
- }
- features.add(feature);
- }
-
- /**
- * Add a contact feature to the lists that hold them ordered by start (first
- * contact) and by end (second contact) position, ensuring the lists remain
- * ordered, and returns true. This method allows duplicate features to be
- * added, so test before calling to avoid this.
- *
- * @param feature
- * @return
- */
- protected synchronized boolean addContactFeature(SequenceFeature feature)
- {
- if (contactFeatureStarts == null)
- {
- contactFeatureStarts = new ArrayList<>();
- }
- if (contactFeatureEnds == null)
- {
- contactFeatureEnds = new ArrayList<>();
- }
-
- /*
- * insert into list sorted by start (first contact position):
- * binary search the sorted list to find the insertion point
- */
- int insertPosition = BinarySearcher.findFirst(contactFeatureStarts,
- f -> f.getBegin() >= feature.getBegin());
- contactFeatureStarts.add(insertPosition, feature);
-
-
- /*
- * insert into list sorted by end (second contact position):
- * binary search the sorted list to find the insertion point
- */
- insertPosition = BinarySearcher.findFirst(contactFeatureEnds,
- f -> f.getEnd() >= feature.getEnd());
- contactFeatureEnds.add(insertPosition, feature);
-
- return true;
- }
-
- /**
- * Answers true if the list contains the feature, else false. This method is
- * optimised for the condition that the list is sorted on feature start
- * position ascending, and will give unreliable results if this does not hold.
+ * Answers true if this store contains the given feature (testing by
+ * SequenceFeature.equals), else false
*
- * @param features
* @param feature
* @return
*/
- protected static boolean listContains(List<SequenceFeature> features,
- SequenceFeature feature)
- {
- if (features == null || feature == null)
- {
- return false;
- }
-
- /*
- * locate the first entry in the list which does not precede the feature
- */
- // int pos = binarySearch(features,
- // SearchCriterion.byFeature(feature, RangeComparator.BY_START_POSITION));
- int pos = BinarySearcher.findFirst(features,
- val -> val.getBegin() >= feature.getBegin());
- int len = features.size();
- while (pos < len)
- {
- SequenceFeature sf = features.get(pos);
- if (sf.getBegin() > feature.getBegin())
- {
- return false; // no match found
- }
- if (sf.equals(feature))
- {
- return true;
- }
- pos++;
- }
- return false;
- }
-
- /**
- * Returns a (possibly empty) list of features whose extent overlaps the given
- * range. The returned list is not ordered. Contact features are included if
- * either of the contact points lies within the range.
- *
- * @param start
- * start position of overlap range (inclusive)
- * @param end
- * end position of overlap range (inclusive)
- * @return
- */
- public List<SequenceFeature> findOverlappingFeatures(long start, long end)
+ @Override
+ public boolean contains(SequenceFeature feature)
{
- List<SequenceFeature> result = new ArrayList<>();
-
- findContactFeatures(start, end, result);
-
- if (features != null)
+ if (feature.isNonPositional())
{
- result.addAll(features.findOverlaps(start, end));
- }
-
- return result;
- }
+ return containsNonPositional(feature);
- /**
- * Adds contact features to the result list where either the second or the
- * first contact position lies within the target range
- *
- * @param from
- * @param to
- * @param result
- */
- protected void findContactFeatures(long from, long to,
- List<SequenceFeature> result)
- {
- if (contactFeatureStarts != null)
- {
- findContactStartOverlaps(from, to, result);
}
- if (contactFeatureEnds != null)
- {
- findContactEndOverlaps(from, to, result);
- }
- }
- /**
- * Adds to the result list any contact features whose end (second contact
- * point), but not start (first contact point), lies in the query from-to
- * range
- *
- * @param from
- * @param to
- * @param result
- */
- protected void findContactEndOverlaps(long from, long to,
- List<SequenceFeature> result)
- {
- /*
- * find the first contact feature (if any)
- * whose end point is not before the target range
- */
- int index = BinarySearcher.findFirst(contactFeatureEnds,
- f -> f.getEnd() >= from);
-
- while (index < contactFeatureEnds.size())
+ if (feature.isContactFeature())
{
- SequenceFeature sf = contactFeatureEnds.get(index);
- if (!sf.isContactFeature())
- {
- System.err.println("Error! non-contact feature type "
- + sf.getType() + " in contact features list");
- index++;
- continue;
- }
+ return containsContactFeature(feature);
- int begin = sf.getBegin();
- if (begin >= from && begin <= to)
- {
- /*
- * this feature's first contact position lies in the search range
- * so we don't include it in results a second time
- */
- index++;
- continue;
- }
-
- if (sf.getEnd() > to)
- {
- /*
- * this feature (and all following) has end point after the target range
- */
- break;
- }
-
- /*
- * feature has end >= from and end <= to
- * i.e. contact end point lies within overlap search range
- */
- result.add(sf);
- index++;
}
- }
- /**
- * Adds contact features whose start position lies in the from-to range to the
- * result list
- *
- * @param from
- * @param to
- * @param result
- */
- protected void findContactStartOverlaps(long from, long to,
- List<SequenceFeature> result)
- {
- int index = BinarySearcher.findFirst(contactFeatureStarts,
- f -> f.getBegin() >= from);
-
- while (index < contactFeatureStarts.size())
- {
- SequenceFeature sf = contactFeatureStarts.get(index);
- if (!sf.isContactFeature())
- {
- System.err.println("Error! non-contact feature " + sf.toString()
- + " in contact features list");
- index++;
- continue;
- }
- if (sf.getBegin() > to)
- {
- /*
- * this feature's start (and all following) follows the target range
- */
- break;
- }
+ return containsPositionalFeature(feature);
- /*
- * feature has begin >= from and begin <= to
- * i.e. contact start point lies within overlap search range
- */
- result.add(sf);
- index++;
- }
}
/**
- * Answers a list of all positional features stored, in no guaranteed order
+ * A check that can be overridden if the check is being done during the add
+ * operation itself.
*
+ * @param feature
* @return
*/
- public List<SequenceFeature> getPositionalFeatures()
+ protected boolean checkContainsPositionalFeatureForAdd(
+ SequenceFeature feature)
{
- List<SequenceFeature> result = new ArrayList<>();
-
- /*
- * add any contact features - from the list by start position
- */
- if (contactFeatureStarts != null)
- {
- result.addAll(contactFeatureStarts);
- }
-
- /*
- * add any nested features
- */
- if (features != null)
- {
- result.addAll(features);
- }
-
- return result;
+ return containsPositionalFeature(feature);
}
- /**
- * Answers a list of all contact features. If there are none, returns an
- * immutable empty list.
- *
- * @return
- */
- public List<SequenceFeature> getContactFeatures()
+ private boolean containsPositionalFeature(SequenceFeature feature)
{
- if (contactFeatureStarts == null)
- {
- return Collections.emptyList();
- }
- return new ArrayList<>(contactFeatureStarts);
- }
-
- /**
- * Answers a list of all non-positional features. If there are none, returns
- * an immutable empty list.
- *
- * @return
- */
- public List<SequenceFeature> getNonPositionalFeatures()
+ return features == null || feature.begin > lastStart ? false
+ : containsFeature(feature);
+ }
+
+ private boolean containsContactFeature(SequenceFeature feature)
{
- if (nonPositionalFeatures == null)
- {
- return Collections.emptyList();
- }
- return new ArrayList<>(nonPositionalFeatures);
+ return contactFeatureStarts != null && feature.begin <= lastContactStart
+ && listContains(contactFeatureStarts, feature);
+ }
+
+ private boolean containsNonPositional(SequenceFeature feature)
+ {
+ return nonPositionalFeatures == null ? false
+ : nonPositionalFeatures.contains(feature);
}
+ abstract protected boolean containsFeature(SequenceFeature feature);
+
/**
* Deletes the given feature from the store, returning true if it was found
* (and deleted), else false. This method makes no assumption that the feature
*
* @param sf
*/
+
+ @Override
public synchronized boolean delete(SequenceFeature sf)
{
boolean removed = false;
}
}
- boolean removedNonPositional = false;
-
/*
* if not found, try non-positional features
*/
if (!removed && nonPositionalFeatures != null)
{
- removedNonPositional = nonPositionalFeatures.remove(sf);
- removed = removedNonPositional;
+ removed = nonPositionalFeatures.remove(sf);
}
/*
*/
if (!removed && features != null)
{
- removed = features.remove(sf);
+ removed = findAndRemoveNonContactFeature(sf);
}
if (removed)
return removed;
}
- /**
- * Rescan all features to recompute any cached values after an entry has been
- * deleted. This is expected to be an infrequent event, so performance here is
- * not critical.
- */
- protected synchronized void rescanAfterDelete()
- {
- positionalFeatureGroups.clear();
- nonPositionalFeatureGroups.clear();
- totalExtent = 0;
- positionalMinScore = Float.NaN;
- positionalMaxScore = Float.NaN;
- nonPositionalMinScore = Float.NaN;
- nonPositionalMaxScore = Float.NaN;
+ abstract protected boolean findAndRemoveNonContactFeature(SequenceFeature sf);
- /*
- * scan non-positional features for groups and scores
- */
- for (SequenceFeature sf : getNonPositionalFeatures())
- {
- nonPositionalFeatureGroups.add(sf.getFeatureGroup());
- float score = sf.getScore();
- nonPositionalMinScore = min(nonPositionalMinScore, score);
- nonPositionalMaxScore = max(nonPositionalMaxScore, score);
- }
+ abstract protected void findContactFeatures(long from, long to,
+ List<SequenceFeature> result);
- /*
- * scan positional features for groups, scores and extents
- */
- for (SequenceFeature sf : getPositionalFeatures())
- {
- positionalFeatureGroups.add(sf.getFeatureGroup());
- float score = sf.getScore();
- positionalMinScore = min(positionalMinScore, score);
- positionalMaxScore = max(positionalMaxScore, score);
- totalExtent += getFeatureLength(sf);
- }
+ abstract protected int findFirstBegin(List<SequenceFeature> list,
+ long pos);
+
+ abstract protected int findFirstEnd(List<SequenceFeature> list, long pos);
+
+ @Override
+ public List<SequenceFeature> findOverlappingFeatures(long start, long end)
+ {
+ return findOverlappingFeatures(start, end, null);
}
- /**
- * A helper method to return the minimum of two floats, where a non-NaN value
- * is treated as 'less than' a NaN value (unlike Math.min which does the
- * opposite)
- *
- * @param f1
- * @param f2
- */
- protected static float min(float f1, float f2)
+ @Override
+ public List<SequenceFeature> getContactFeatures()
{
- if (Float.isNaN(f1))
- {
- return Float.isNaN(f2) ? f1 : f2;
- }
- else
- {
- return Float.isNaN(f2) ? f1 : Math.min(f1, f2);
- }
+ return getContactFeatures(new ArrayList<>());
}
/**
- * A helper method to return the maximum of two floats, where a non-NaN value
- * is treated as 'greater than' a NaN value (unlike Math.max which does the
- * opposite)
+ * Answers a list of all contact features. If there are none, returns an
+ * immutable empty list.
*
- * @param f1
- * @param f2
+ * @return
*/
- protected static float max(float f1, float f2)
+
+ @Override
+ public List<SequenceFeature> getContactFeatures(
+ List<SequenceFeature> result)
{
- if (Float.isNaN(f1))
- {
- return Float.isNaN(f2) ? f1 : f2;
- }
- else
+ if (contactFeatureStarts != null)
{
- return Float.isNaN(f2) ? f1 : Math.max(f1, f2);
+ result.addAll(contactFeatureStarts);
}
+ return result;
}
/**
- * Answers true if this store has no features, else false
+ * Answers the number of positional (or non-positional) features stored.
+ * Contact features count as 1.
*
+ * @param positional
* @return
*/
- public boolean isEmpty()
+
+ @Override
+ public int getFeatureCount(boolean positional)
{
- boolean hasFeatures = (contactFeatureStarts != null
- && !contactFeatureStarts
- .isEmpty())
- || (nonPositionalFeatures != null && !nonPositionalFeatures
- .isEmpty())
- || (features != null && features.size() > 0);
+ if (!positional)
+ {
+ return nonPositionalFeatures == null ? 0
+ : nonPositionalFeatures.size();
+ }
+
+ return (contactFeatureStarts == null ? 0 : contactFeatureStarts.size())
+ + features.size();
- return !hasFeatures;
}
/**
* @param positionalFeatures
* @return
*/
+
+ @Override
public Set<String> getFeatureGroups(boolean positionalFeatures)
{
if (positionalFeatures)
}
else
{
- return nonPositionalFeatureGroups == null ? Collections
- .<String> emptySet() : Collections
- .unmodifiableSet(nonPositionalFeatureGroups);
+ return nonPositionalFeatureGroups == null
+ ? Collections.<String> emptySet()
+ : Collections.unmodifiableSet(nonPositionalFeatureGroups);
}
}
+ @Override
+ public Collection<SequenceFeature> getFeatures()
+ {
+ return features;
+ }
+
/**
- * Answers the number of positional (or non-positional) features stored.
- * Contact features count as 1.
+ * Answers a list of all either positional or non-positional features whose
+ * feature group matches the given group (which may be null)
*
* @param positional
+ * @param group
* @return
*/
- public int getFeatureCount(boolean positional)
+
+ @Override
+ public List<SequenceFeature> getFeaturesForGroup(boolean positional,
+ String group)
{
- if (!positional)
+ List<SequenceFeature> result = new ArrayList<>();
+
+ /*
+ * if we know features don't include the target group, no need
+ * to inspect them for matches
+ */
+ if (positional && !positionalFeatureGroups.contains(group)
+ || !positional && !nonPositionalFeatureGroups.contains(group))
{
- return nonPositionalFeatures == null ? 0 : nonPositionalFeatures
- .size();
+ return result;
}
- int size = 0;
-
- if (contactFeatureStarts != null)
+ if (positional)
{
- // note a contact feature (start/end) counts as one
- size += contactFeatureStarts.size();
+ addFeaturesForGroup(group, contactFeatureStarts, result);
+ addFeaturesForGroup(group, features, result);
}
-
- if (features != null)
+ else
{
- size += features.size();
+ addFeaturesForGroup(group, nonPositionalFeatures, result);
}
-
- return size;
+ return result;
}
/**
- * Answers the total length of positional features (or zero if there are
- * none). Contact features contribute a value of 1 to the total.
+ * Answers the maximum score held for positional or non-positional features.
+ * This may be Float.NaN if there are no features, are none has a non-NaN
+ * score.
*
+ * @param positional
* @return
*/
- public int getTotalFeatureLength()
+
+ @Override
+ public float getMaximumScore(boolean positional)
{
- return totalExtent;
+ return positional ? positionalMaxScore : nonPositionalMaxScore;
}
/**
* @param positional
* @return
*/
+
+ @Override
public float getMinimumScore(boolean positional)
{
return positional ? positionalMinScore : nonPositionalMinScore;
}
+ @Override
+ public List<SequenceFeature> getNonPositionalFeatures()
+ {
+ return getNonPositionalFeatures(new ArrayList<>());
+ }
+
/**
- * Answers the maximum score held for positional or non-positional features.
- * This may be Float.NaN if there are no features, are none has a non-NaN
- * score.
+ * Answers a list of all non-positional features. If there are none, returns
+ * an immutable empty list.
*
- * @param positional
* @return
*/
- public float getMaximumScore(boolean positional)
+
+ @Override
+ public List<SequenceFeature> getNonPositionalFeatures(
+ List<SequenceFeature> result)
{
- return positional ? positionalMaxScore : nonPositionalMaxScore;
+ if (nonPositionalFeatures != null)
+ {
+ result.addAll(nonPositionalFeatures);
+ }
+ return result;
+ }
+
+ @Override
+ public List<SequenceFeature> getPositionalFeatures()
+ {
+ return getPositionalFeatures(new ArrayList<>());
}
/**
- * Answers a list of all either positional or non-positional features whose
- * feature group matches the given group (which may be null)
+ * Answers a list of all positional features stored, in no guaranteed order
*
- * @param positional
- * @param group
* @return
*/
- public List<SequenceFeature> getFeaturesForGroup(boolean positional,
- String group)
+
+ @Override
+ public List<SequenceFeature> getPositionalFeatures(
+ List<SequenceFeature> result)
{
- List<SequenceFeature> result = new ArrayList<>();
/*
- * if we know features don't include the target group, no need
- * to inspect them for matches
+ * add any contact features - from the list by start position
*/
- if (positional && !positionalFeatureGroups.contains(group)
- || !positional && !nonPositionalFeatureGroups.contains(group))
+ if (contactFeatureStarts != null)
{
- return result;
+ result.addAll(contactFeatureStarts);
}
- List<SequenceFeature> sfs = positional ? getPositionalFeatures()
- : getNonPositionalFeatures();
- for (SequenceFeature sf : sfs)
+ /*
+ * add any nested features
+ */
+ if (features != null)
{
- String featureGroup = sf.getFeatureGroup();
- if (group == null && featureGroup == null || group != null
- && group.equals(featureGroup))
+ result.addAll(features);
+ }
+
+ return result;
+ }
+
+ /**
+ * Answers the total length of positional features (or zero if there are
+ * none). Contact features contribute a value of 1 to the total.
+ *
+ * @return
+ */
+
+ @Override
+ public int getTotalFeatureLength()
+ {
+ return totalExtent;
+ }
+
+ /**
+ * Answers true if this store has no features, else false
+ *
+ * @return
+ */
+
+ @Override
+ public boolean isEmpty()
+ {
+ boolean hasFeatures = (contactFeatureStarts != null
+ && !contactFeatureStarts.isEmpty())
+ || (nonPositionalFeatures != null
+ && !nonPositionalFeatures.isEmpty())
+ || features.size() > 0;
+
+ return !hasFeatures;
+ }
+
+ /**
+ * Rescan all features to recompute any cached values after an entry has been
+ * deleted. This is expected to be an infrequent event, so performance here is
+ * not critical.
+ */
+ protected synchronized void rescanAfterDelete()
+ {
+ positionalFeatureGroups.clear();
+ nonPositionalFeatureGroups.clear();
+ totalExtent = 0;
+ positionalMinScore = Float.NaN;
+ positionalMaxScore = Float.NaN;
+ nonPositionalMinScore = Float.NaN;
+ nonPositionalMaxScore = Float.NaN;
+ /*
+ * scan non-positional features for groups and scores
+ */
+ if (nonPositionalFeatures != null)
+ {
+ List<SequenceFeature> list = nonPositionalFeatures;
+ for (int i = 0, n = list.size(); i < n; i++)
{
- result.add(sf);
+ SequenceFeature sf = list.get(i);
+ nonPositionalFeatureGroups.add(sf.getFeatureGroup());
+ float score = sf.getScore();
+ nonPositionalMinScore = min(nonPositionalMinScore, score);
+ nonPositionalMaxScore = max(nonPositionalMaxScore, score);
}
}
- return result;
+
+ /*
+ * scan positional features for groups, scores and extents
+ */
+
+ rescanPositional(contactFeatureStarts);
+ rescanPositional(features);
+ }
+
+ private void rescanPositional(Collection<SequenceFeature> sfs)
+ {
+ if (sfs == null)
+ {
+ return;
+ }
+ for (SequenceFeature sf : sfs)
+ {
+ positionalFeatureGroups.add(sf.getFeatureGroup());
+ float score = sf.getScore();
+ positionalMinScore = min(positionalMinScore, score);
+ positionalMaxScore = max(positionalMaxScore, score);
+ totalExtent += getFeatureLength(sf);
+ }
}
/**
* @param shiftBy
* @return
*/
+
+ @Override
public synchronized boolean shiftFeatures(int fromPosition, int shiftBy)
{
/*
* (Although a simple shift of all values would preserve data integrity!)
*/
boolean modified = false;
- for (SequenceFeature sf : getPositionalFeatures())
+ List<SequenceFeature> list = getPositionalFeatures();
+ for (int i = 0, n = list.size(); i < n; i++)
{
+ SequenceFeature sf = list.get(i);
if (sf.getBegin() >= fromPosition)
{
modified = true;
}
return modified;
}
+
}
--- /dev/null
+package jalview.datamodel.features;
+
+import jalview.datamodel.SequenceFeature;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Set;
+
+public interface FeatureStoreI
+{
+
+ boolean addFeature(SequenceFeature feature);
+
+ boolean contains(SequenceFeature feature);
+
+ boolean delete(SequenceFeature sf);
+
+ List<SequenceFeature> findOverlappingFeatures(long start, long end);
+
+ List<SequenceFeature> findOverlappingFeatures(long start, long end,
+ List<SequenceFeature> result);
+
+ List<SequenceFeature> getContactFeatures();
+
+ List<SequenceFeature> getContactFeatures(List<SequenceFeature> result);
+
+ int getFeatureCount(boolean positional);
+
+ Set<String> getFeatureGroups(boolean positionalFeatures);
+
+ Collection<SequenceFeature> getFeatures();
+
+ List<SequenceFeature> getFeaturesForGroup(boolean positional,
+ String group);
+
+ float getMaximumScore(boolean positional);
+
+ float getMinimumScore(boolean positional);
+
+ List<SequenceFeature> getNonPositionalFeatures();
+
+ List<SequenceFeature> getNonPositionalFeatures(
+ List<SequenceFeature> result);
+
+ List<SequenceFeature> getPositionalFeatures();
+
+ List<SequenceFeature> getPositionalFeatures(List<SequenceFeature> result);
+
+ int getTotalFeatureLength();
+
+ boolean isEmpty();
+
+ boolean shiftFeatures(int fromPosition, int shiftBy);
+
+ boolean listContains(List<SequenceFeature> features,
+ SequenceFeature feature);
+
+}
--- /dev/null
+/*
+ * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
+ * Copyright (C) $$Year-Rel$$ The Jalview Authors
+ *
+ * This file is part of Jalview.
+ *
+ * Jalview is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation, either version 3
+ * of the License, or (at your option) any later version.
+ *
+ * Jalview is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Jalview. If not, see <http://www.gnu.org/licenses/>.
+ * The Jalview Authors are detailed in the 'AUTHORS' file.
+ */
+package jalview.datamodel.features;
+
+import jalview.datamodel.SequenceFeature;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import intervalstore.api.IntervalStoreI;
+import intervalstore.impl.BinarySearcher;
+
+/**
+ * A data store for a set of sequence features that supports efficient lookup of
+ * features overlapping a given range. Intended for (but not limited to) storage
+ * of features for one sequence and feature type.
+ *
+ * @author gmcarstairs
+ *
+ */
+public class FeatureStoreImpl extends FeatureStore
+{
+
+ /**
+ * Default constructor uses NCList
+ */
+ public FeatureStoreImpl()
+ {
+ this(true);
+ }
+
+ public FeatureStoreImpl(boolean useNCList)
+ {
+ features = (useNCList ? new intervalstore.impl.IntervalStore<>()
+ : new intervalstore.nonc.IntervalStore<>(false));
+ }
+
+ /**
+ * Add a contact feature to the lists that hold them ordered by start (first
+ * contact) and by end (second contact) position, ensuring the lists remain
+ * ordered, and returns true. This method allows duplicate features to be
+ * added, so test before calling to avoid this.
+ *
+ * @param feature
+ * @return
+ */
+ @Override
+ protected synchronized boolean addContactFeature(SequenceFeature feature)
+ {
+ if (contactFeatureStarts == null)
+ {
+ contactFeatureStarts = new ArrayList<>();
+ contactFeatureEnds = new ArrayList<>();
+ }
+
+ /*
+ * insert into list sorted by start (first contact position):
+ * binary search the sorted list to find the insertion point
+ */
+ int insertPosition = findFirstBeginStatic(contactFeatureStarts,
+ feature.getBegin());
+ contactFeatureStarts.add(insertPosition, feature);
+
+ /*
+ * insert into list sorted by end (second contact position):
+ * binary search the sorted list to find the insertion point
+ */
+ insertPosition = findFirstEndStatic(contactFeatureEnds,
+ feature.getEnd());
+ contactFeatureEnds.add(insertPosition, feature);
+
+ return true;
+ }
+
+ /**
+ * Adds one feature to the IntervalStore that can manage nested features
+ * (creating the IntervalStore if necessary)
+ */
+ @Override
+ protected synchronized boolean addPositionalFeature(
+ SequenceFeature feature)
+ {
+ return features.add(feature);
+ }
+
+ /**
+ * Adds contact features to the result list where either the second or the
+ * first contact position lies within the target range
+ *
+ * @param from
+ * @param to
+ * @param result
+ */
+ @Override
+ protected void findContactFeatures(long from, long to,
+ List<SequenceFeature> result)
+ {
+ if (contactFeatureStarts != null)
+ {
+ findContactStartOverlaps(from, to, result);
+ findContactEndOverlaps(from, to, result);
+ }
+ }
+
+ @Override
+ protected boolean containsFeature(SequenceFeature feature)
+ {
+ return features.contains(feature);
+ }
+
+ /**
+ * Adds to the result list any contact features whose end (second contact
+ * point), but not start (first contact point), lies in the query from-to
+ * range
+ *
+ * @param from
+ * @param to
+ * @param result
+ */
+
+ private void findContactEndOverlaps(long from, long to,
+ List<SequenceFeature> result)
+ {
+ /*
+ * find the first contact feature (if any)
+ * whose end point is not before the target range
+ */
+ int index = findFirstEndStatic(contactFeatureEnds, from);
+
+ int n = contactFeatureEnds.size();
+ while (index < n)
+ {
+ SequenceFeature sf = contactFeatureEnds.get(index);
+ if (!sf.isContactFeature())
+ {
+ System.err.println("Error! non-contact feature type " + sf.getType()
+ + " in contact features list");
+ index++;
+ continue;
+ }
+
+ int begin = sf.getBegin();
+ if (begin >= from && begin <= to)
+ {
+ /*
+ * this feature's first contact position lies in the search range
+ * so we don't include it in results a second time
+ */
+ index++;
+ continue;
+ }
+
+ if (sf.getEnd() > to)
+ {
+ /*
+ * this feature (and all following) has end point after the target range
+ */
+ break;
+ }
+
+ /*
+ * feature has end >= from and end <= to
+ * i.e. contact end point lies within overlap search range
+ */
+ result.add(sf);
+ index++;
+ }
+ }
+
+ /**
+ * Adds contact features whose start position lies in the from-to range to the
+ * result list
+ *
+ * @param from
+ * @param to
+ * @param result
+ */
+
+ private void findContactStartOverlaps(long from, long to,
+ List<SequenceFeature> result)
+ {
+ int index = findFirstBegin(contactFeatureStarts, from);
+
+ while (index < contactFeatureStarts.size())
+ {
+ SequenceFeature sf = contactFeatureStarts.get(index);
+ if (!sf.isContactFeature())
+ {
+ System.err.println("Error! non-contact feature " + sf.toString()
+ + " in contact features list");
+ index++;
+ continue;
+ }
+ if (sf.getBegin() > to)
+ {
+ /*
+ * this feature's start (and all following) follows the target range
+ */
+ break;
+ }
+
+ /*
+ * feature has begin >= from and begin <= to
+ * i.e. contact start point lies within overlap search range
+ */
+ result.add(sf);
+ index++;
+ }
+ }
+
+ /**
+ * Returns a (possibly empty) list of features whose extent overlaps the given
+ * range. The returned list is not ordered. Contact features are included if
+ * either of the contact points lies within the range.
+ *
+ * @param start
+ * start position of overlap range (inclusive)
+ * @param end
+ * end position of overlap range (inclusive)
+ * @param result
+ * ignored
+ * @return
+ */
+
+ @Override
+ public List<SequenceFeature> findOverlappingFeatures(long start, long end,
+ List<SequenceFeature> result)
+ {
+ result = new ArrayList<>();
+ findContactFeatures(start, end, result);
+ findOverlaps(start, end, result);
+ return result;
+ }
+
+ private void findOverlaps(long start, long end,
+ List<SequenceFeature> result)
+ {
+ result.addAll(((IntervalStoreI<SequenceFeature>) features)
+ .findOverlaps(start, end));
+ }
+
+ @Override
+ protected int findFirstBegin(List<SequenceFeature> list, long pos)
+ {
+ return findFirstBeginStatic(list, pos);
+ }
+
+ /**
+ * Possibly a bit faster using a static method.
+ *
+ * @param list
+ * @param pos
+ * @return
+ */
+ private static int findFirstBeginStatic(List<SequenceFeature> list,
+ long pos)
+ {
+ return BinarySearcher.findFirst(list, f -> f.getBegin() >= pos);
+ }
+
+ @Override
+ protected int findFirstEnd(List<SequenceFeature> list, long pos)
+ {
+ return findFirstEndStatic(list, pos);
+ }
+
+ /**
+ * Possibly a bit faster using a static method.
+ *
+ * @param list
+ * @param pos
+ * @return
+ */
+ private static int findFirstEndStatic(List<SequenceFeature> list,
+ long pos)
+ {
+ return BinarySearcher.findFirst(list, f -> f.getEnd() >= pos);
+ }
+
+ @Override
+ protected boolean findAndRemoveNonContactFeature(SequenceFeature sf)
+ {
+ return features.remove(sf);
+ }
+
+}
--- /dev/null
+/*
+ * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
+ * Copyright (C) $$Year-Rel$$ The Jalview Authors
+ *
+ * This file is part of Jalview.
+ *
+ * Jalview is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation, either version 3
+ * of the License, or (at your option) any later version.
+ *
+ * Jalview is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Jalview. If not, see <http://www.gnu.org/licenses/>.
+ * The Jalview Authors are detailed in the 'AUTHORS' file.
+ */
+package jalview.datamodel.features;
+
+import jalview.datamodel.SequenceFeature;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import intervalstore.nonc.IntervalStore;
+
+/**
+ * An adaption of FeatureStore that is efficient and lightweight, accelerating
+ * processing speed in JavaScript.
+ *
+ * It could be used in Java as well, with significant acceleration, but all this
+ * is so fast anyway that it probably will not be noticed in Java to speed it up
+ * by a factor of two or three. So for now, at least, this implementation is
+ * just in JavaScript. The flag for this is in SequenceFeatures.
+ *
+ * This implementation uses the IntervalStore developed by Bob Hanson, found at
+ * https://github.com/BobHanson/IntervalStoreJ, forked from the one developed by
+ * Mungo Carstairs at https://github.com/bartongroup/IntervalStoreJ.
+ *
+ * See the discussion folder at https://github.com/BobHanson/IntervalStoreJ for
+ * details.
+ *
+ * @author gmcarstairs
+ * @author Bob Hanson 2019.08.03-2019.08.16
+ *
+ */
+public class FeatureStoreJS extends FeatureStore
+{
+ private IntervalStore<SequenceFeature> featureStore;
+
+ public FeatureStoreJS()
+ {
+ // the only reference to features field in this class -- for the superclass
+
+ // linked-list no-NCList IntervalStore with presort
+
+ features = featureStore = new IntervalStore<>(true);
+ }
+
+ /**
+ * Add a contact feature to the lists that hold them ordered by start (first
+ * contact) and by end (second contact) position, ensuring the lists remain
+ * ordered. This method allows duplicate features to be added, so test before
+ * calling to avoid this.
+ *
+ * @param feature
+ * @return true
+ */
+ @Override
+ protected synchronized boolean addContactFeature(SequenceFeature feature)
+ {
+ if (contactFeatureStarts == null)
+ {
+ contactFeatureStarts = new ArrayList<>();
+ contactFeatureEnds = new ArrayList<>();
+ }
+ contactFeatureStarts.add(
+ findFirstBegin(contactFeatureStarts, feature.begin), feature);
+ contactFeatureEnds.add(findFirstEnd(contactFeatureEnds, feature.end),
+ feature);
+ return true;
+ }
+
+
+ /**
+ * Add a feature to the IntervalStore, not allowing for duplicates.
+ *
+ *
+ * @return false if could not add it (late check for duplicate)
+ */
+ @Override
+ protected synchronized boolean addPositionalFeature(
+ SequenceFeature feature)
+ {
+ return featureStore.add(feature, false);
+ }
+
+ /**
+ * Initial check in FeatureStore.add(feature) that in other implementations
+ * does a containment check, but in this implementation just returns false to
+ * indicate that we should continue. This implementation will do this check as
+ * part of the add() method for greater efficiency (one binary search instead
+ * of two).
+ *
+ * @return false -- meaning "maybe not contained; continue adding"
+ */
+ @Override
+ protected boolean checkContainsPositionalFeatureForAdd(
+ SequenceFeature feature)
+ {
+ return false;
+ }
+
+ /**
+ * Check to see if a feature (or its equivalent based on
+ * IntervalI.equalsInterval) is already in this store. This method should be
+ * avoided except when necessary, as it involves a binary search with identity
+ * check.
+ *
+ * @return true if this feature or its equivalent (based on equalsInterval) is
+ * present already in the collection.
+ */
+ @Override
+ protected boolean containsFeature(SequenceFeature feature)
+ {
+ return featureStore.contains(feature);
+ }
+
+ @Override
+ protected boolean findAndRemoveNonContactFeature(SequenceFeature sf)
+ {
+ return featureStore.remove(sf);
+ }
+
+ /**
+ * Add contact features to the result list where either the second or the
+ * first contact position lies within the target range, inclusively.
+ *
+ * @param from
+ * @param to
+ * @param result
+ */
+ @Override
+ protected void findContactFeatures(long from, long to,
+ List<SequenceFeature> result)
+ {
+ getContactStartOverlaps(from, to, result);
+ getContactEndOverlaps(from, to, result);
+ }
+
+ /**
+ * Locate the first feature start in a standard ArrayList that is at or after
+ * this position.
+ *
+ */
+
+ @Override
+ protected int findFirstBegin(List<SequenceFeature> list, long pos)
+ {
+ int matched = list.size();
+ int end = matched - 1;
+ int start = (end < 0 || list.get(end).begin < pos ? matched : 0);
+ while (start <= end)
+ {
+ int mid = (start + end) / 2;
+ if (list.get(mid).begin >= pos)
+ {
+ matched = mid;
+ end = mid - 1;
+ }
+ else
+ {
+ start = mid + 1;
+ }
+ }
+ return matched;
+ }
+
+ /**
+ * Locate the feature end in a standard ArrayList that is after or at this
+ * position.
+ *
+ */
+
+ @Override
+ protected int findFirstEnd(List<SequenceFeature> list, long pos)
+ {
+ int matched = list.size();
+ int end = matched - 1;
+ int start = 0;
+ while (start <= end)
+ {
+ int mid = (start + end) / 2;
+ if (list.get(mid).end >= pos)
+ {
+ matched = mid;
+ end = mid - 1;
+ }
+ else
+ {
+ start = mid + 1;
+ }
+ }
+ return matched;
+ }
+
+ /**
+ * Returns a (possibly empty) list of features whose extent overlaps the given
+ * range. The returned list is ordered as follows:
+ *
+ * (1) ContactFeature starts
+ *
+ * (2) ContactFeature ends (that are not also starts)
+ *
+ * (3) noncontact SequenceFeatures, in reverse start order
+ *
+ * (This last reverse order is for efficiency in processing only.)
+ *
+ *
+ *
+ * @param start
+ * start position of overlap range (inclusive)
+ * @param end
+ * end position of overlap range (inclusive)
+ *
+ * @param result
+ * optional result list; for highest efficiency, provide this
+ * parameter
+ * @return result same as result parameter, or a new ArrayList if that is null
+ */
+
+ @Override
+ public List<SequenceFeature> findOverlappingFeatures(long start, long end,
+ List<SequenceFeature> result)
+ {
+ if (result == null)
+ {
+ result = new ArrayList<>();
+ }
+ if (contactFeatureStarts != null)
+ {
+ if (start == end)
+ {
+ getContactPointStarts(contactFeatureStarts, start, result);
+ getContactPointEnds(contactFeatureEnds, end, result);
+ }
+ else
+ {
+ findContactFeatures(start, end, result);
+ }
+ }
+ if (featureStore.size() > 0)
+ {
+ featureStore.findOverlaps(start, end, result);
+ }
+ return result;
+ }
+
+ /**
+ * Adds to the result list any contact features having end (second contact
+ * point), but not start (first contact point), in the query from-to range
+ *
+ * @param from
+ * @param to
+ * @param result
+ */
+
+ private void getContactEndOverlaps(long from, long to,
+ List<SequenceFeature> result)
+ {
+ // find the first contact feature (if any)
+ // with end point not before the target range
+
+ for (int i = findFirstEnd(contactFeatureEnds,
+ from), n = contactFeatureEnds.size(); i < n; i++)
+ {
+ SequenceFeature sf = contactFeatureEnds.get(i);
+ if (sf.begin >= from && sf.begin <= to)
+ {
+ // this feature's first contact position lies in the search range
+ // so we don't include it in results a second time
+ continue;
+ }
+
+ if (sf.end > to)
+ {
+ // this feature (and all following) has end point after the target range
+ break;
+ }
+
+ // feature has end >= from and end <= to
+ // i.e. contact end point lies within overlap search range
+ result.add(sf);
+ }
+ }
+
+ /**
+ * Binary search for contact start or end matching a specific position. This
+ * efficient search was designed specifically for rapid return for the
+ * OverviewPanel. It's implementation sped processing of that panel by 2300%.
+ *
+ * @param l
+ * @param pos
+ * @param result
+ * @param isStart
+ *
+ * @author Bob Hanson 2019.07.30
+ */
+ private void getContactPointStarts(List<SequenceFeature> l, long pos,
+ List<SequenceFeature> result)
+ {
+ int low = 0;
+ int high = l.size() - 1;
+ while (low <= high)
+ {
+ int mid = (low + high) >>> 1;
+ SequenceFeature f = l.get(mid);
+ switch (Long.signum(f.begin - pos))
+ {
+ case -1:
+ low = mid + 1;
+ continue;
+ case 1:
+ high = mid - 1;
+ continue;
+ case 0:
+ int m = mid;
+ result.add(f);
+ // could be "5" in 12345556788 ?
+ while (++mid <= high && (f = l.get(mid)) != null && f.begin == pos)
+ {
+ result.add(f);
+ }
+ while (--m >= low && (f = l.get(m)) != null && f.begin == pos)
+ {
+ result.add(f);
+ }
+ return;
+ }
+ }
+ }
+
+ private void getContactPointEnds(List<SequenceFeature> l, long pos,
+ List<SequenceFeature> result)
+ {
+ int low = 0;
+ int high = l.size() - 1;
+ while (low <= high)
+ {
+ int mid = (low + high) >>> 1;
+ SequenceFeature f = l.get(mid);
+ switch (Long.signum(f.end - pos))
+ {
+ case -1:
+ low = mid + 1;
+ continue;
+ case 1:
+ high = mid - 1;
+ continue;
+ case 0:
+ int m = mid;
+ if (f.begin != f.end)
+ {
+ result.add(f);
+ }
+ // could be "5" in 12345556788 ?
+ while (++mid <= high && (f = l.get(mid)) != null
+ && f.end == pos)
+ {
+ if (f.begin != f.end)
+ {
+ result.add(f);
+ }
+ }
+ while (--m >= low && (f = l.get(m)) != null
+ && f.end == pos)
+ {
+ if (f.begin != f.end)
+ {
+ result.add(f);
+ }
+ }
+ return;
+ }
+ }
+ }
+
+ /**
+ * Adds contact features whose start position lies in the from-to range to the
+ * result list
+ *
+ * @param from
+ * @param to
+ * @param result
+ */
+
+ private void getContactStartOverlaps(long from, long to,
+ List<SequenceFeature> result)
+ {
+ for (int i = findFirstBegin(contactFeatureStarts,
+ from), n = contactFeatureStarts.size(); i < n; i++)
+ {
+ SequenceFeature sf = contactFeatureStarts.get(i);
+ if (sf.begin > to)
+ {
+ break;
+ }
+ result.add(sf);
+ }
+ }
+}
import jalview.datamodel.SequenceFeature;
import jalview.io.gff.SequenceOntologyFactory;
import jalview.io.gff.SequenceOntologyI;
+import jalview.util.Platform;
import java.util.ArrayList;
import java.util.Arrays;
* map from feature type to structured store of features for that type
* null types are permitted (but not a good idea!)
*/
- private Map<String, FeatureStore> featureStore;
+ private Map<String, FeatureStoreI> featureStore;
+
+ /**
+ * original NCList-based IntervalStore
+ */
+ private final static int INTERVAL_STORE_NCLIST = 0;
+
+ /**
+ * linked-list deferred-sort IntervalStore - experimental only; unused
+ */
+ private final static int INTERVAL_STORE_LINKED_LIST_NO_PRESORT = 1;
+
+ /**
+ * linked-list IntervalStore option for JavaScript
+ */
+ private final static int INTERVAL_STORE_LINKED_LIST = -1;
+
+ /**
+ * mode for Java or JavaScript; can be set differently for testing, but
+ * default is LINKED_LIST for JalviewJS and NCLIST for Java
+ */
+ private final int INTERVAL_STORE_MODE = (
+ // true || //
+ Platform.isJS() ? //
+ INTERVAL_STORE_LINKED_LIST //
+ : INTERVAL_STORE_NCLIST//
+ );
/**
* Constructor
* ? wrap as a synchronized map for add and delete operations
*/
// featureStore = Collections
- // .synchronizedSortedMap(new TreeMap<String, FeatureStore>());
+ // .synchronizedSortedMap(new TreeMap<String, FeatureStoreI>());
featureStore = new TreeMap<>();
}
if (featureStore.get(type) == null)
{
- featureStore.put(type, new FeatureStore());
+ featureStore.put(type, newFeatureStore());
}
return featureStore.get(type).addFeature(sf);
}
+ private FeatureStoreI newFeatureStore()
+ {
+ switch (INTERVAL_STORE_MODE)
+ {
+ default:
+ case INTERVAL_STORE_NCLIST:
+ return new FeatureStoreImpl(true);
+ case INTERVAL_STORE_LINKED_LIST_NO_PRESORT:
+ return new FeatureStoreImpl(false);
+ case INTERVAL_STORE_LINKED_LIST:
+ return new FeatureStoreJS();
+ }
+ }
+
/**
* {@inheritDoc}
*/
String... type)
{
List<SequenceFeature> result = new ArrayList<>();
-
- for (FeatureStore featureSet : varargToTypes(type))
+ for (FeatureStoreI featureSet : varargToTypes(type))
{
- result.addAll(featureSet.findOverlappingFeatures(from, to));
+ // System.err.println("SF findFeature " + System.currentTimeMillis()
+ // + " " + from + " " + to + " "
+ // + featureSet.getPositionalFeatures().get(0).type);
+ //
+ result.addAll(featureSet.findOverlappingFeatures(from, to, null));
}
-
return result;
}
return new ArrayList<>();
}
- return getAllFeatures(featureTypes.toArray(new String[featureTypes
- .size()]));
+ return getAllFeatures(
+ featureTypes.toArray(new String[featureTypes.size()]));
}
/**
{
int result = 0;
- for (FeatureStore featureSet : varargToTypes(type))
+ for (FeatureStoreI featureSet : varargToTypes(type))
{
result += featureSet.getFeatureCount(positional);
}
{
int result = 0;
- for (FeatureStore featureSet : varargToTypes(type))
+ for (FeatureStoreI featureSet : varargToTypes(type))
{
result += featureSet.getTotalFeatureLength();
}
{
List<SequenceFeature> result = new ArrayList<>();
- for (FeatureStore featureSet : varargToTypes(type))
+ for (FeatureStoreI featureSet : varargToTypes(type))
{
- result.addAll(featureSet.getPositionalFeatures());
+ featureSet.getPositionalFeatures(result);
}
return result;
}
* @param type
* @return
*/
- protected Iterable<FeatureStore> varargToTypes(String... type)
+ protected Iterable<FeatureStoreI> varargToTypes(String... type)
{
if (type == null || type.length == 0)
{
return featureStore.values();
}
- List<FeatureStore> types = new ArrayList<>();
+ List<FeatureStoreI> types = new ArrayList<>();
List<String> args = Arrays.asList(type);
- for (Entry<String, FeatureStore> featureType : featureStore.entrySet())
+ for (Entry<String, FeatureStoreI> featureType : featureStore.entrySet())
{
if (args.contains(featureType.getKey()))
{
{
List<SequenceFeature> result = new ArrayList<>();
- for (FeatureStore featureSet : varargToTypes(type))
+ for (FeatureStoreI featureSet : varargToTypes(type))
{
- result.addAll(featureSet.getContactFeatures());
+ featureSet.getContactFeatures(result);
}
return result;
}
{
List<SequenceFeature> result = new ArrayList<>();
- for (FeatureStore featureSet : varargToTypes(type))
+ for (FeatureStoreI featureSet : varargToTypes(type))
{
- result.addAll(featureSet.getNonPositionalFeatures());
+ featureSet.getNonPositionalFeatures(result);
}
return result;
}
@Override
public boolean delete(SequenceFeature sf)
{
- for (FeatureStore featureSet : featureStore.values())
+ for (FeatureStoreI featureSet : featureStore.values())
{
if (featureSet.delete(sf))
{
@Override
public boolean hasFeatures()
{
- for (FeatureStore featureSet : featureStore.values())
+ for (FeatureStoreI featureSet : featureStore.values())
{
if (!featureSet.isEmpty())
{
{
Set<String> groups = new HashSet<>();
- for (FeatureStore featureSet : varargToTypes(type))
+ for (FeatureStoreI featureSet : varargToTypes(type))
{
groups.addAll(featureSet.getFeatureGroups(positionalFeatures));
}
{
Set<String> result = new HashSet<>();
- for (Entry<String, FeatureStore> featureType : featureStore.entrySet())
+ for (Entry<String, FeatureStoreI> featureType : featureStore.entrySet())
{
- Set<String> featureGroups = featureType.getValue().getFeatureGroups(
- positionalFeatures);
+ Set<String> featureGroups = featureType.getValue()
+ .getFeatureGroups(positionalFeatures);
for (String group : groups)
{
if (featureGroups.contains(group))
public Set<String> getFeatureTypes(String... soTerm)
{
Set<String> types = new HashSet<>();
- for (Entry<String, FeatureStore> entry : featureStore.entrySet())
+ for (Entry<String, FeatureStoreI> entry : featureStore.entrySet())
{
String type = entry.getKey();
if (!entry.getValue().isEmpty() && isOntologyTerm(type, soTerm))
{
return true;
}
- SequenceOntologyI so = SequenceOntologyFactory.getInstance();
+ SequenceOntologyI so = SequenceOntologyFactory.getSequenceOntology();
for (String term : soTerm)
{
if (type.equals(term) || so.isA(type, term))
@Override
public float getMinimumScore(String type, boolean positional)
{
- return featureStore.containsKey(type) ? featureStore.get(type)
- .getMinimumScore(positional) : Float.NaN;
+ return featureStore.containsKey(type)
+ ? featureStore.get(type).getMinimumScore(positional)
+ : Float.NaN;
}
/**
@Override
public float getMaximumScore(String type, boolean positional)
{
- return featureStore.containsKey(type) ? featureStore.get(type)
- .getMaximumScore(positional) : Float.NaN;
+ return featureStore.containsKey(type)
+ ? featureStore.get(type).getMaximumScore(positional)
+ : Float.NaN;
}
/**
String group, String... type)
{
List<SequenceFeature> result = new ArrayList<>();
- for (FeatureStore featureSet : varargToTypes(type))
+ for (FeatureStoreI featureSet : varargToTypes(type))
{
if (featureSet.getFeatureGroups(positional).contains(group))
{
public boolean shiftFeatures(int fromPosition, int shiftBy)
{
boolean modified = false;
- for (FeatureStore fs : featureStore.values())
+ for (FeatureStoreI fs : featureStore.values())
{
modified |= fs.shiftFeatures(fromPosition, shiftBy);
}
{
featureStore.clear();
}
+
+ /**
+ * Simplified find for features associated with a given position.
+ *
+ * JavaScript set to not use IntervalI, but easily testable by setting false
+ * to true in javadoc
+ *
+ * FeatureRenderer has checked already that featureStore does contain type.
+ *
+ * @author Bob Hanson 2019.07.30
+ */
+ @Override
+ public List<SequenceFeature> findFeatures(int pos, String type,
+ List<SequenceFeature> list)
+ {
+ FeatureStoreI fs = featureStore.get(type);
+ return fs.findOverlappingFeatures(pos, pos, list);
+ }
+
+ // Chrome; developer console closed
+
+ // BH 2019.08.01 useIntervalStore true, redraw false:
+ // Platform: timer mark 13.848 0.367 overviewrender 16000 pixels row:14
+ // Platform: timer mark 15.391 0.39 overviewrender 16000 pixels row:14
+ // Platform: timer mark 16.498 0.39 overviewrender 16000 pixels row:14
+ // Platform: timer mark 17.596 0.401 overviewrender 16000 pixels row:14
+ // Platform: timer mark 18.738 0.363 overviewrender 16000 pixels row:14
+ // Platform: timer mark 19.659 0.358 overviewrender 16000 pixels row:14
+ // Platform: timer mark 20.737 0.359 overviewrender 16000 pixels row:14
+ // Platform: timer mark 21.797 0.391 overviewrender 16000 pixels row:14
+ // Platform: timer mark 22.851 0.361 overviewrender 16000 pixels row:14
+ // Platform: timer mark 24.019 0.395 overviewrender 16000 pixels row:14
+
+ // BH 2019.08.01 useIntervalStore false, redraw false:
+ // Platform: timer mark 19.011 0.181 overviewrender 16000 pixels row:14
+ // Platform: timer mark 20.311 0.183 overviewrender 16000 pixels row:14
+ // Platform: timer mark 21.368 0.175 overviewrender 16000 pixels row:14
+ // Platform: timer mark 22.347 0.178 overviewrender 16000 pixels row:14
+ // Platform: timer mark 23.605 0.216 overviewrender 16000 pixels row:14
+ // Platform: timer mark 24.836 0.191 overviewrender 16000 pixels row:14
+ // Platform: timer mark 26.016 0.181 overviewrender 16000 pixels row:14
+ // Platform: timer mark 27.278 0.178 overviewrender 16000 pixels row:14
+ // Platform: timer mark 28.158 0.181 overviewrender 16000 pixels row:14
+ // Platform: timer mark 29.227 0.196 overviewrender 16000 pixels row:14
+ // Platform: timer mark 30.1 0.171 overviewrender 16000 pixels row:14
+ // Platform: timer mark 31.684 0.196 overviewrender 16000 pixels row:14
+ // Platform: timer mark 32.779 0.18 overviewrender 16000 pixels row:14
+ // Platform: timer mark 52.355 0.185 overviewrender 16000 pixels row:14
+ // Platform: timer mark 53.829 0.186 overviewrender 16000 pixels row:14
+
+ /**
+ * @author Bob Hanson 2019.08.01
+ */
+ @Override
+ public boolean hasFeatures(String type)
+ {
+ return featureStore.containsKey(type);
+ }
+
}
* Deletes all positional and non-positional features
*/
void deleteAll();
+
+ /**
+ * Point-specific parameter return for JavaScript
+ *
+ * @param pos
+ * @param type
+ * @param result
+ * @return result (JavaScript) or new ArrayList (Java -- see FeatureRender)
+ * @author Bob Hanson 2019.07.30
+ */
+ List<SequenceFeature> findFeatures(int pos, String type, List<SequenceFeature> result);
+
+ /**
+ * @author Bob Hanson 2019.08.01
+ *
+ * @param type
+ * @return true if this type is in featureStore
+ */
+ boolean hasFeatures(String type);
}
import jalview.datamodel.SequenceFeature;
import jalview.datamodel.SequenceI;
import jalview.io.gff.SequenceOntologyI;
+import jalview.util.Platform;
import java.util.ArrayList;
import java.util.List;
* or ENSMUST or similar for other species
* or CCDSnnnnn.nn with at least 3 digits
*/
- private static final Regex ACCESSION_REGEX = new Regex(
- "(ENS([A-Z]{3}|)[TG][0-9]{11}$)" + "|" + "(CCDS[0-9.]{3,}$)");
-
+ private static Regex ACCESSION_REGEX;
/*
* fetch exon features on genomic sequence (to identify the cdna regions)
* and cds and variation features (to retain)
@Override
public Regex getAccessionValidator()
{
+ if (ACCESSION_REGEX == null)
+ {
+ /*
+ * accepts ENSG/T/E/P with 11 digits
+ * or ENSMUSP or similar for other species
+ * or CCDSnnnnn.nn with at least 3 digits
+ */
+ ACCESSION_REGEX = Platform.newRegex(
+ "(ENS([A-Z]{3}|)[TG][0-9]{11}$)" + "|" + "(CCDS[0-9.]{3,}$)", null);
+ }
return ACCESSION_REGEX;
}
@Override
protected boolean retainFeature(SequenceFeature sf, String accessionId)
{
- if (SequenceOntologyFactory.getInstance().isA(sf.getType(),
+ if (SequenceOntologyFactory.getSequenceOntology().isA(sf.getType(),
SequenceOntologyI.CDS))
{
return false;
* accepts anything as we will attempt lookup of gene or
* transcript id or gene name
*/
- private static final Regex ACCESSION_REGEX = new Regex(".*");
+ private static Regex ACCESSION_REGEX;
private static final EnsemblFeatureType[] FEATURES_TO_FETCH = {
EnsemblFeatureType.gene, EnsemblFeatureType.transcript,
@Override
protected boolean retainFeature(SequenceFeature sf, String accessionId)
{
- SequenceOntologyI so = SequenceOntologyFactory.getInstance();
+ SequenceOntologyI so = SequenceOntologyFactory.getSequenceOntology();
String type = sf.getType();
if (so.isA(type, SequenceOntologyI.GENE))
{
@Override
public Regex getAccessionValidator()
{
+ if (ACCESSION_REGEX == null)
+ {
+ ACCESSION_REGEX = Platform.newRegex(".*", null);
+ }
return ACCESSION_REGEX;
}
{
return new FeatureSettingsAdapter()
{
- SequenceOntologyI so = SequenceOntologyFactory.getInstance();
+ SequenceOntologyI so = SequenceOntologyFactory.getSequenceOntology();
@Override
public boolean isFeatureDisplayed(String type)
package jalview.ext.ensembl;
+import jalview.bin.ApplicationSingletonProvider;
+import jalview.bin.ApplicationSingletonProvider.ApplicationSingletonI;
import jalview.datamodel.AlignmentI;
import jalview.datamodel.DBRefSource;
-import jalview.util.JSONUtils;
-import java.io.BufferedReader;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import org.json.simple.parser.ParseException;
-public class EnsemblInfo extends EnsemblRestClient
+public class EnsemblInfo extends EnsemblRestClient implements ApplicationSingletonI
{
+ /**
+ * On first request only, populate the lookup map by fetching the list of
+ * divisions known to EnsemblGenomes
+ *
+ */
+ private static EnsemblInfo getInstance()
+ {
+ return (EnsemblInfo) ApplicationSingletonProvider.getInstance(EnsemblInfo.class);
+ }
+
+ private EnsemblInfo()
+ {
+ // use getInstance()
+
+ /*
+ * for convenience, pre-fill ensembl.org as the domain for "ENSEMBL"
+ */
+ divisions.put(DBRefSource.ENSEMBL.toUpperCase(), ensemblDomain);
+ try
+ {
+ @SuppressWarnings("unchecked")
+ Iterator<Object> rvals = (Iterator<Object>) getJSON(
+ getDivisionsUrl(ensemblGenomesDomain), null, -1,
+ MODE_ITERATOR, null);
+ if (rvals == null)
+ {
+ return;
+ }
+ while (rvals.hasNext())
+ {
+ String division = rvals.next().toString();
+ divisions.put(division.toUpperCase(), ensemblGenomesDomain);
+ }
+ } catch (IOException | ParseException | NumberFormatException e)
+ {
+ // ignore
+ }
+ }
+
/*
* cached results of REST /info/divisions service, currently
* <pre>
* The values for EnsemblGenomes are retrieved by a REST call, that for
* Ensembl is added programmatically for convenience of lookup
*/
- private static Map<String, String> divisions;
+ private Map<String, String> divisions = new HashMap<>();
@Override
public String getDbName()
* @param division
* @return
*/
- public String getDomain(String division)
+ public static String getDomain(String division)
{
- if (divisions == null)
- {
- fetchDivisions();
- }
- return divisions.get(division.toUpperCase());
- }
-
- /**
- * On first request only, populate the lookup map by fetching the list of
- * divisions known to EnsemblGenomes.
- */
- void fetchDivisions()
- {
- divisions = new HashMap<>();
-
- /*
- * for convenience, pre-fill ensembl.org as the domain for "ENSEMBL"
- */
- divisions.put(DBRefSource.ENSEMBL.toUpperCase(), ensemblDomain);
- try
- {
- @SuppressWarnings("unchecked")
- Iterator<Object> rvals = (Iterator<Object>) getJSON(getDivisionsUrl(ensemblGenomesDomain), null, -1, MODE_ITERATOR, null);
- if (rvals == null)
- return;
- while (rvals.hasNext())
- {
- String division = rvals.next().toString();
- divisions.put(division.toUpperCase(), ensemblGenomesDomain);
- }
- } catch (IOException | ParseException | NumberFormatException e)
- {
- // ignore
- }
+ return getInstance().divisions.get(division.toUpperCase());
}
/**
*
* @return
*/
- public Set<String> getDivisions() {
- if (divisions == null)
- {
- fetchDivisions();
- }
-
- return divisions.keySet();
+ public static Set<String> getDivisions()
+ {
+ return getInstance().divisions.keySet();
}
}
import jalview.datamodel.AlignmentI;
import jalview.datamodel.DBRefSource;
import jalview.datamodel.GeneLociI;
-import jalview.util.JSONUtils;
import jalview.util.MapList;
-import java.io.BufferedReader;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import org.json.simple.parser.ParseException;
-/**
- * A client for the Ensembl REST service /map endpoint, to convert from
- * coordinates of one genome assembly to another.
- * <p>
- * Note that species and assembly identifiers passed to this class must be valid
- * in Ensembl. They are not case sensitive.
- *
- * @author gmcarstairs
- * @see https://rest.ensembl.org/documentation/info/assembly_map
- * @see https://rest.ensembl.org/info/assembly/human?content-type=text/xml
- * @see https://rest.ensembl.org/info/species?content-type=text/xml
- */
public class EnsemblMap extends EnsemblRestClient
{
private static final String MAPPED = "mapped";
{
Iterator<Object> rvals = (Iterator<Object>) getJSON(url, null, -1, MODE_ITERATOR, MAPPINGS);
if (rvals == null)
- return null;
+ {
+ return null;
+ }
while (rvals.hasNext())
{
// todo check for "mapped"
URL url = null;
try
{
- String domain = new EnsemblInfo().getDomain(division);
+ String domain = EnsemblInfo.getDomain(division);
if (domain != null)
{
url = getIdMapUrl(domain, accession, start, end, cdsOrCdna);
{
Iterator<Object> rvals = (Iterator<Object>) getJSON(url, null, -1, MODE_ITERATOR, MAPPINGS);
if (rvals == null)
- return null;
+ {
+ return null;
+ }
String assembly = null;
String chromosome = null;
int fromEnd = 0;
import jalview.datamodel.AlignmentI;
import jalview.datamodel.SequenceFeature;
import jalview.datamodel.SequenceI;
+import jalview.util.Platform;
import java.util.ArrayList;
import java.util.List;
* or ENSMUSP or similar for other species
* or CCDSnnnnn.nn with at least 3 digits
*/
- private static final Regex ACCESSION_REGEX = new Regex(
- "(ENS([A-Z]{3}|)P[0-9]{11}$)" + "|" + "(CCDS[0-9.]{3,}$)");
+ private static Regex ACCESSION_REGEX;
/**
* Default constructor (to use rest.ensembl.org)
@Override
public Regex getAccessionValidator()
{
+ if (ACCESSION_REGEX == null)
+ {
+ ACCESSION_REGEX = Platform.newRegex(
+ "(ENS([A-Z]{3}|)P[0-9]{11}$)" + "|" + "(CCDS[0-9.]{3,}$)", null);
+ }
return ACCESSION_REGEX;
}
private static final String REST_CHANGE_LOG = "https://github.com/Ensembl/ensembl-rest/wiki/Change-log";
- private static Map<String, EnsemblData> domainData;
+ private static final Map<String, EnsemblData> domainData;
private final static long AVAILABILITY_RETEST_INTERVAL = 10000L; // 10 seconds
List<SequenceI> seqs = parseSequenceJson(ids);
if (seqs == null)
- return alignment;
+ {
+ return alignment;
+ }
if (seqs.isEmpty())
{
Platform.timeCheck("ENS seqproxy", Platform.TIME_MARK);
Map<String, Object> val = (Map<String, Object>) getJSON(null, ids, -1, MODE_MAP, null);
if (val == null)
- return null;
+ {
+ return null;
+ }
Object s = val.get("desc");
String desc = s == null ? null : s.toString();
s = val.get("id");
* for sequence_variant on reverse strand, have to convert the allele
* values to their complements
*/
- if (!forwardStrand && SequenceOntologyFactory.getInstance()
+ if (!forwardStrand && SequenceOntologyFactory.getSequenceOntology()
.isA(sf.getType(), SequenceOntologyI.SEQUENCE_VARIANT))
{
reverseComplementAlleles(copy);
public static boolean isTranscript(String featureType)
{
return SequenceOntologyI.NMD_TRANSCRIPT_VARIANT.equals(featureType)
- || SequenceOntologyFactory.getInstance().isA(featureType,
+ || SequenceOntologyFactory.getSequenceOntology().isA(featureType,
SequenceOntologyI.TRANSCRIPT);
}
}
import jalview.analysis.AlignmentUtils;
import jalview.bin.Cache;
import jalview.datamodel.DBRefSource;
+import jalview.util.Platform;
import jalview.ws.seqfetcher.DbSourceProxyImpl;
import com.stevesoft.pat.Regex;
// ensemblgenomes REST service merged to ensembl 9th April 2019
protected static final String DEFAULT_ENSEMBL_GENOMES_BASEURL = DEFAULT_ENSEMBL_BASEURL;
- /*
- * accepts ENSG/T/E/P with 11 digits
- * or ENSMUSP or similar for other species
- * or CCDSnnnnn.nn with at least 3 digits
- */
- private static final Regex ACCESSION_REGEX = new Regex(
- "(ENS([A-Z]{3}|)[GTEP]{1}[0-9]{11}$)" + "|"
- + "(CCDS[0-9.]{3,}$)");
+ private static Regex ACCESSION_REGEX;
protected final String ensemblGenomesDomain;
@Override
public Regex getAccessionValidator()
{
+ if (ACCESSION_REGEX == null)
+ {
+ /*
+ * accepts ENSG/T/E/P with 11 digits
+ * or ENSMUSP or similar for other species
+ * or CCDSnnnnn.nn with at least 3 digits
+ */
+ ACCESSION_REGEX = Platform
+ .newRegex("(ENS([A-Z]{3}|)[GTEP]{1}[0-9]{11}$)" + "|"
+ + "(CCDS[0-9.]{3,}$)", null);
+ }
return ACCESSION_REGEX;
}
package jalview.ext.htsjdk;
-import java.io.Closeable;
-import java.io.File;
-import java.io.IOException;
-
import htsjdk.samtools.util.CloseableIterator;
import htsjdk.variant.variantcontext.VariantContext;
import htsjdk.variant.vcf.VCFFileReader;
import htsjdk.variant.vcf.VCFHeader;
+import java.io.Closeable;
+import java.io.File;
+import java.io.IOException;
+
/**
* A thin wrapper for htsjdk classes to read either plain, or compressed, or
* compressed and indexed VCF files
{
final CloseableIterator<VariantContext> it = reader.iterator();
- return new CloseableIterator()
+ return new CloseableIterator<VariantContext>()
{
boolean atEnd = false;
int vend = variant.getEnd();
// todo what is the undeprecated way to get
// the chromosome for the variant?
- if (chrom.equals(variant.getContig()) && (vstart <= end)
+ if (chrom.equals(variant.getChr()) && (vstart <= end)
&& (vend >= start))
{
return variant;
import java.awt.event.ComponentListener;
import java.io.File;
import java.net.URL;
+import java.security.AccessControlException;
import java.util.ArrayList;
import java.util.BitSet;
import java.util.Hashtable;
*/
private int _modelFileNameMap[];
+ // ////////////////////////////////
+ // /StructureListener
+ // @Override
+ public synchronized String[] getPdbFilex()
+ {
+ if (viewer == null)
+ {
+ return new String[0];
+ }
+ if (modelFileNames == null)
+ {
+ List<String> mset = new ArrayList<>();
+ _modelFileNameMap = new int[viewer.ms.mc];
+ String m = viewer.ms.getModelFileName(0);
+ if (m != null)
+ {
+ String filePath = m;
+ try
+ {
+ filePath = new File(m).getAbsolutePath();
+ } catch (AccessControlException x)
+ {
+ // usually not allowed to do this in applet
+ System.err.println(
+ "jmolBinding: Using local file string from Jmol: " + m);
+ }
+ if (filePath.indexOf("/file:") != -1)
+ {
+ // applet path with docroot - discard as format won't match pdbfile
+ filePath = m;
+ }
+ mset.add(filePath);
+ _modelFileNameMap[0] = 0; // filename index for first model is always 0.
+ }
+ int j = 1;
+ for (int i = 1; i < viewer.ms.mc; i++)
+ {
+ m = viewer.ms.getModelFileName(i);
+ String filePath = m;
+ if (m != null)
+ {
+ try
+ {
+ filePath = new File(m).getAbsolutePath();
+ } catch (AccessControlException x)
+ {
+ // usually not allowed to do this in applet, so keep raw handle
+ // System.err.println("jmolBinding: Using local file string from
+ // Jmol: "+m);
+ }
+ }
+
+ /*
+ * add this model unless it is read from a structure file we have
+ * already seen (example: 2MJW is an NMR structure with 10 models)
+ */
+ if (!mset.contains(filePath))
+ {
+ mset.add(filePath);
+ _modelFileNameMap[j] = i; // record the model index for the filename
+ j++;
+ }
+ }
+ modelFileNames = mset.toArray(new String[mset.size()]);
+ }
+ return modelFileNames;
+ }
+
@Override
public synchronized String[] getStructureFiles()
{
try
{
// recover PDB filename for the model hovered over.
- int mnumber = Integer.valueOf(mdlId).intValue() - 1;
+ int mnumber = new Integer(mdlId).intValue() - 1;
if (_modelFileNameMap != null)
{
int _mp = _modelFileNameMap.length - 1;
public static Iterator<Reader> getRNAMLForPDBFileAsString(String pdbfile)
throws Exception
{
- List<NameValuePair> vals = new ArrayList<>();
+ List<NameValuePair> vals = new ArrayList<NameValuePair>();
vals.add(new BasicNameValuePair("tool", "rnaview"));
vals.add(new BasicNameValuePair("data", pdbfile));
vals.add(new BasicNameValuePair("output", "rnaml"));
// return processJsonResponseFor(HttpClientUtils.doHttpUrlPost(twoDtoolsURL,
// vals));
- ArrayList<Reader> readers = new ArrayList<>();
+ ArrayList<Reader> readers = new ArrayList<Reader>();
final BufferedReader postResponse = HttpClientUtils
.doHttpUrlPost(twoDtoolsURL, vals, 0, 0);
readers.add(postResponse);
public static Iterator<Reader> processJsonResponseFor(Reader respons)
throws Exception
{
+ // BH 2019 never called?
try
{
@SuppressWarnings("unchecked")
- List<Object> responses = (List<Object>) JSONUtils.parse(respons);
- return new RvalsIterator(responses);
+ final Iterator<Object> rvals = ((List<Object>) JSONUtils.parse(respons)).iterator();
+ return new Iterator<Reader>()
+ {
+ @Override
+ public boolean hasNext()
+ {
+ return rvals.hasNext();
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public Reader next()
+ {
+ Map<String, Object> val = (Map<String, Object>) rvals.next();
+
+ Object sval = null;
+ try
+ {
+ sval = val.get("2D");
+ } catch (Exception x)
+ {
+ x.printStackTrace();
+ }
+ ;
+ if (sval == null)
+ {
+ System.err.println(
+ "DEVELOPER WARNING: Annotate3d didn't return a '2D' tag in its response. Consider checking output of server. Response was :"
+ + val.toString());
+
+ sval = "";
+ }
+ return new StringReader(sval.toString());
+
+ }
+
+ @Override
+ public void remove()
+ {
+ throw new Error(
+ MessageManager.getString("error.not_implemented_remove"));
+
+ }
+
+ @Override
+ protected Object clone() throws CloneNotSupportedException
+ {
+ throw new CloneNotSupportedException(
+ MessageManager.getString("error.not_implemented_clone"));
+ }
+
+ @Override
+ public boolean equals(Object obj)
+ {
+ return super.equals(obj);
+ }
+
+ @Override
+ protected void finalize() throws Throwable
+ {
+ while (rvals.hasNext())
+ {
+ rvals.next();
+ }
+ super.finalize();
+ }
+ };
} catch (Exception foo)
{
throw new Exception(MessageManager.getString(
"exception.couldnt_parse_responde_from_annotated3d_server"),
foo);
}
+
}
public static Iterator<Reader> getRNAMLForPDBId(String pdbid)
throws Exception
{
- List<NameValuePair> vals = new ArrayList<>();
+ List<NameValuePair> vals = new ArrayList<NameValuePair>();
vals.add(new BasicNameValuePair("tool", "rnaview"));
vals.add(new BasicNameValuePair("pdbid", pdbid));
vals.add(new BasicNameValuePair("output", "rnaml"));
+ pdbid + "&output=rnaml");
// return processJsonResponseFor(new
// InputStreamReader(geturl.openStream()));
- ArrayList<Reader> readers = new ArrayList<>();
+ ArrayList<Reader> readers = new ArrayList<Reader>();
readers.add(new InputStreamReader(geturl.openStream()));
return readers.iterator();
}
}
-
-class RvalsIterator implements Iterator<Reader>, AutoCloseable
-{
- private Iterator<Object> rvals;
-
- protected RvalsIterator(List<Object> responses)
- {
- this.rvals = responses.iterator();
- }
-
- @Override
- public boolean hasNext()
- {
- return rvals.hasNext();
- }
-
- @Override
- public Reader next()
- {
- Map<String, Object> val = (Map<String, Object>) rvals.next();
-
- Object sval = null;
- try
- {
- sval = val.get("2D");
- } catch (Exception x)
- {
- x.printStackTrace();
- }
- if (sval == null)
- {
- System.err.println(
- "DEVELOPER WARNING: Annotate3d didn't return a '2D' tag in its response. Consider checking output of server. Response was :"
- + val.toString());
-
- sval = "";
- }
- return new StringReader(sval.toString());
- }
-
- @Override
- public void remove()
- {
- throw new UnsupportedOperationException();
- }
-
- @Override
- protected Object clone() throws CloneNotSupportedException
- {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public void close()
- {
- while (rvals.hasNext())
- {
- rvals.next();
- }
- }
-}
*/
public SequenceOntology()
{
- termsFound = new ArrayList<String>();
- termsNotFound = new ArrayList<String>();
- termsByDescription = new HashMap<String, Term>();
- termIsA = new HashMap<Term, List<Term>>();
+ termsFound = new ArrayList<>();
+ termsNotFound = new ArrayList<>();
+ termsByDescription = new HashMap<>();
+ termIsA = new HashMap<>();
loadOntologyZipFile("so-xp-simple.obo");
}
*/
protected synchronized void findParents(Term childTerm)
{
- List<Term> result = new ArrayList<Term>();
+ List<Term> result = new ArrayList<>();
for (Triple triple : ontology.getTriples(childTerm, null, isA))
{
Term parent = triple.getObject();
import jalview.bin.Cache;
import jalview.datamodel.SequenceI;
import jalview.fts.api.FTSDataColumnI;
+import jalview.gui.Preferences;
import java.util.Collection;
private boolean allowEmptySequence;
private boolean allowUnpublishedEntries = Cache
- .getDefault("ALLOW_UNPUBLISHED_PDB_QUERYING", false);
+ .getDefault(Preferences.ALLOW_UNPUBLISHED_PDB_QUERYING, false);
private boolean facet;
*/
package jalview.fts.service.pdb;
+import jalview.bin.ApplicationSingletonProvider;
+import jalview.bin.ApplicationSingletonProvider.ApplicationSingletonI;
import jalview.datamodel.SequenceI;
import jalview.fts.api.FTSData;
import jalview.fts.api.FTSDataColumnI;
*
* @author tcnofoegbu
*/
-public class PDBFTSRestClient extends FTSRestClient
+public class PDBFTSRestClient extends FTSRestClient implements ApplicationSingletonI
{
-
- private static FTSRestClientI instance = null;
-
public static final String PDB_SEARCH_ENDPOINT = "https://www.ebi.ac.uk/pdbe/search/pdb/select?";
- protected PDBFTSRestClient()
+ public static FTSRestClientI getInstance()
+ {
+ return (FTSRestClientI) ApplicationSingletonProvider
+ .getInstance(PDBFTSRestClient.class);
+ }
+
+ private PDBFTSRestClient()
{
+ // singleton -- use getInstance()
}
/**
return "/fts/pdb_data_columns.txt";
}
- public static FTSRestClientI getInstance()
- {
- if (instance == null)
- {
- instance = new PDBFTSRestClient();
- }
- return instance;
- }
-
private Collection<FTSDataColumnI> allDefaultDisplayedStructureDataColumns;
public Collection<FTSDataColumnI> getAllDefaultDisplayedStructureDataColumns()
package jalview.fts.service.uniprot;
+import jalview.bin.ApplicationSingletonProvider;
+import jalview.bin.ApplicationSingletonProvider.ApplicationSingletonI;
import jalview.bin.Cache;
import jalview.fts.api.FTSData;
import jalview.fts.api.FTSDataColumnI;
import jalview.fts.core.FTSRestClient;
import jalview.fts.core.FTSRestRequest;
import jalview.fts.core.FTSRestResponse;
+import jalview.gui.Preferences;
import jalview.util.MessageManager;
import jalview.util.Platform;
import com.sun.jersey.api.client.config.DefaultClientConfig;
public class UniProtFTSRestClient extends FTSRestClient
+ implements ApplicationSingletonI
{
- private static final String DEFAULT_UNIPROT_DOMAIN = "https://www.uniprot.org";
- static
+ public static FTSRestClientI getInstance()
{
- Platform.addJ2SDirectDatabaseCall(DEFAULT_UNIPROT_DOMAIN);
+ return (FTSRestClientI) ApplicationSingletonProvider
+ .getInstance(UniProtFTSRestClient.class);
+ }
+
+ private UniProtFTSRestClient()
+ {
+ // singleton -- use getInstance()
+
+ uniprotSearchEndpoint = Cache.getDefault(Preferences.UNIPROT_DOMAIN,
+ DEFAULT_UNIPROT_DOMAIN) + "/uniprot/";
}
- private static FTSRestClientI instance = null;
+ private static final String DEFAULT_UNIPROT_DOMAIN = "https://www.uniprot.org";
public final String uniprotSearchEndpoint;
- public UniProtFTSRestClient()
+ static
{
- super();
- uniprotSearchEndpoint = Cache.getDefault("UNIPROT_DOMAIN",
- DEFAULT_UNIPROT_DOMAIN) + "/uniprot/";
+ Platform.addJ2SDirectDatabaseCall(DEFAULT_UNIPROT_DOMAIN);
}
-
@SuppressWarnings("unchecked")
@Override
public FTSRestResponse executeRequest(FTSRestRequest uniprotRestRequest)
};
}
- public static FTSRestClientI getInstance()
- {
- if (instance == null)
- {
- instance = new UniProtFTSRestClient();
- }
- return instance;
- }
-
@Override
public String getColumnDataConfigFileName()
{
+++ /dev/null
-package jalview.gui;
-
-import jalview.util.MessageManager;
-import jalview.util.Platform;
-
-import java.awt.Desktop;
-import java.awt.desktop.AboutEvent;
-import java.awt.desktop.AboutHandler;
-import java.awt.desktop.PreferencesEvent;
-import java.awt.desktop.PreferencesHandler;
-import java.awt.desktop.QuitEvent;
-import java.awt.desktop.QuitHandler;
-import java.awt.desktop.QuitResponse;
-import java.awt.desktop.QuitStrategy;
-
-import javax.swing.JOptionPane;
-
-public class APQHandlers
-{
- private static boolean setAPQHandlers = false;
-
- public APQHandlers() {
- }
-
- protected static boolean setAPQHandlers(jalview.gui.Desktop jalviewDesktop)
- {
- // flagging this test to avoid unnecessary reflection
- if (!setAPQHandlers)
- {
- // see if the Quit, About and Preferences handlers are available
- Class desktopClass = Desktop.class;
- Desktop hdesktop = Desktop.getDesktop();
-
- try
- {
- Float specversion = Float.parseFloat(
- System.getProperty("java.specification.version"));
-
- if (specversion >= 9)
- {
- if (Platform.isMac())
- {
- if (desktopClass.getDeclaredMethod("setAboutHandler",
- new Class[]
- { AboutHandler.class }) != null)
- {
-
- hdesktop.setAboutHandler(new AboutHandler()
- {
- @Override
- public void handleAbout(AboutEvent e)
- {
- jalviewDesktop.aboutMenuItem_actionPerformed(null);
- }
- });
-
- }
-
- if (desktopClass.getDeclaredMethod("setPreferencesHandler",
- new Class[]
- { PreferencesHandler.class }) != null)
- {
-
- hdesktop.setPreferencesHandler(
- new PreferencesHandler()
- {
- @Override
- public void handlePreferences(
- PreferencesEvent e)
- {
- jalviewDesktop.preferences_actionPerformed(null);
- }
- });
-
- }
-
- if (desktopClass.getDeclaredMethod("setQuitHandler",
- new Class[]
- { QuitHandler.class }) != null)
- {
-
- hdesktop.setQuitHandler(new QuitHandler()
- {
- @Override
- public void handleQuitRequestWith(
- QuitEvent e, QuitResponse r)
- {
- boolean confirmQuit = jalview.bin.Cache
- .getDefault(
- jalview.gui.Desktop.CONFIRM_KEYBOARD_QUIT,
- true);
- int n;
- if (confirmQuit)
- {
- n = JOptionPane.showConfirmDialog(null,
- MessageManager.getString("label.quit_jalview"),
- MessageManager.getString("action.quit"),
- JOptionPane.OK_CANCEL_OPTION,
- JOptionPane.PLAIN_MESSAGE, null);
- }
- else
- {
- n = JOptionPane.OK_OPTION;
- }
- if (n == JOptionPane.OK_OPTION)
- {
- System.out.println("Shortcut Quit confirmed by user");
- jalviewDesktop.quit();
- r.performQuit(); // probably won't reach this line, but just
- // in
- // case
- }
- else
- {
- r.cancelQuit();
- System.out.println("Shortcut Quit cancelled by user");
- }
- }
- });
- hdesktop.setQuitStrategy(
- QuitStrategy.CLOSE_ALL_WINDOWS);
-
- }
- }
- setAPQHandlers = true;
- }
- else
- {
- System.out.println(
- "Not going to try setting APQ Handlers as java.spec.version is "
- + specversion);
- }
-
- } catch (Exception e)
- {
- System.out.println(
- "Exception when looking for About, Preferences, Quit Handlers");
- // e.printStackTrace();
- } catch (Throwable t)
- {
- System.out.println(
- "Throwable when looking for About, Preferences, Quit Handlers");
- // t.printStackTrace();
- }
-
- }
-
- return setAPQHandlers;
- }
-
-}
this.settings = defaults;
this.isComplexAlignFile = format.isComplexAlignFile();
init(viewport.hasHiddenRows(), viewport.hasHiddenColumns());
- dialog = JvOptionPane.newOptionDialog(Desktop.desktop);
+ dialog = JvOptionPane.newOptionDialog(Desktop.getDesktopPane());
}
/**
import jalview.analysis.ParseProperties;
import jalview.analysis.SequenceIdMatcher;
import jalview.api.AlignExportSettingsI;
+import jalview.api.AlignFrameI;
import jalview.api.AlignViewControllerGuiI;
import jalview.api.AlignViewControllerI;
import jalview.api.AlignViewportI;
import jalview.api.AlignmentViewPanel;
+//from JalviewLite imports import jalview.api.FeatureRenderer;
import jalview.api.FeatureSettingsControllerI;
import jalview.api.SplitContainerI;
import jalview.api.ViewStyleI;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
+import java.awt.Dimension;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
* @version $Revision$
*/
@SuppressWarnings("serial")
-public class AlignFrame extends GAlignFrame implements DropTargetListener,
+public class AlignFrame extends GAlignFrame
+ implements AlignFrameI, DropTargetListener,
IProgressIndicator, AlignViewControllerGuiI, ColourChangeListener
{
viewport = new AlignViewport(al, hiddenColumns, sequenceSetId, viewId);
- alignPanel = new AlignmentPanel(this, viewport);
-
- addAlignmentPanel(alignPanel, true);
init();
}
{
viewport.hideSequence(hiddenSeqs);
}
- alignPanel = new AlignmentPanel(this, viewport);
- addAlignmentPanel(alignPanel, true);
init();
}
{
viewport = ap.av;
alignPanel = ap;
- addAlignmentPanel(ap, false);
init();
}
*/
void init()
{
-// setBackground(Color.white); // BH 2019
+ boolean newPanel = (alignPanel == null);
+ viewport.setShowAutocalculatedAbove(isShowAutoCalculatedAbove());
+ if (newPanel)
+ {
+ if (Platform.isJS())
+ {
+ // need to set this up front if NOANNOTATION is
+ // used in conjunction with SHOWOVERVIEW.
+
+ // I have not determined if this is appropriate for
+ // Jalview/Java, as it means we are setting this flag
+ // for all subsequent AlignFrames. For now, at least,
+ // I am setting it to be JalviewJS-only.
+
+ boolean showAnnotation = Jalview.getInstance().getShowAnnotation();
+ viewport.setShowAnnotation(showAnnotation);
+ }
+ alignPanel = new AlignmentPanel(this, viewport);
+ }
+ addAlignmentPanel(alignPanel, newPanel);
+
+ // setBackground(Color.white); // BH 2019
if (!Jalview.isHeadlessMode())
{
progressBar = new ProgressBar(this.statusPanel, this.statusBar);
+ statusPanel.setVisible(Jalview.getInstance().getShowStatus());
+ alignFrameMenuBar.setVisible(Jalview.getInstance().getAllowMenuBar());
}
avc = new jalview.controller.AlignViewController(this, viewport,
// modifyPID.setEnabled(false);
}
- String sortby = jalview.bin.Cache.getDefault("SORT_ALIGNMENT",
+ String sortby = jalview.bin.Cache.getDefault(Preferences.SORT_ALIGNMENT,
"No sort");
if (sortby.equals("Id"))
sortPairwiseMenuItem_actionPerformed(null);
}
- this.alignPanel.av
- .setShowAutocalculatedAbove(isShowAutoCalculatedAbove());
-
setMenusFromViewport(viewport);
buildSortByAnnotationScoresMenu();
calculateTree.addActionListener(new ActionListener()
});
buildColourMenu();
- if (Desktop.desktop != null)
+ if (Desktop.getDesktopPane() != null)
{
this.setDropTarget(new java.awt.dnd.DropTarget(this, this));
if (!Platform.isJS())
wrapMenuItem_actionPerformed(null);
}
- if (jalview.bin.Cache.getDefault("SHOW_OVERVIEW", false))
+ if (jalview.bin.Cache.getDefault(Preferences.SHOW_OVERVIEW, false))
{
this.overviewMenuItem_actionPerformed(null);
}
switch (evt.getKeyCode())
{
- case 27: // escape key
+ case KeyEvent.VK_ESCAPE: // escape key
deselectAllSequenceMenuItem_actionPerformed(null);
break;
{
ap.av.getAlignment().padGaps();
}
- ap.av.updateConservation(ap);
- ap.av.updateConsensus(ap);
- ap.av.updateStrucConsensus(ap);
+ if (Jalview.getInstance().getStartCalculations())
+ {
+ ap.av.updateConservation(ap);
+ ap.av.updateConsensus(ap);
+ ap.av.updateStrucConsensus(ap);
+ }
}
}
private void addServiceListeners()
{
final java.beans.PropertyChangeListener thisListener;
- Desktop.instance.addJalviewPropertyChangeListener("services",
+ Desktop.getInstance().addJalviewPropertyChangeListener("services",
thisListener = new java.beans.PropertyChangeListener()
{
@Override
public void propertyChange(PropertyChangeEvent evt)
{
- // // System.out.println("Discoverer property change.");
- // if (evt.getPropertyName().equals("services"))
{
SwingUtilities.invokeLater(new Runnable()
{
javax.swing.event.InternalFrameEvent evt)
{
// System.out.println("deregistering discoverer listener");
- Desktop.instance.removeJalviewPropertyChangeListener("services",
+ Desktop.getInstance().removeJalviewPropertyChangeListener("services",
thisListener);
closeMenuItem_actionPerformed(true);
}
/*
* Show/hide annotations only enabled if annotation panel is shown
*/
- showAllSeqAnnotations.setEnabled(annotationPanelMenuItem.getState());
- hideAllSeqAnnotations.setEnabled(annotationPanelMenuItem.getState());
- showAllAlAnnotations.setEnabled(annotationPanelMenuItem.getState());
- hideAllAlAnnotations.setEnabled(annotationPanelMenuItem.getState());
+ syncAnnotationMenuItems();
+
viewBoxesMenuItem.setSelected(av.getShowBoxes());
viewTextMenuItem.setSelected(av.getShowText());
showNonconservedMenuItem.setSelected(av.getShowUnconserved());
applyToAllGroups.setState(av.getColourAppliesToAllGroups());
showNpFeatsMenuitem.setSelected(av.isShowNPFeats());
showDbRefsMenuitem.setSelected(av.isShowDBRefs());
- autoCalculate.setSelected(av.autoCalculateConsensus);
+ autoCalculate.setSelected(av.getAutoCalculateConsensusAndConservation());
sortByTree.setSelected(av.sortByTree);
listenToViewSelections.setSelected(av.followSelection);
@Override
public void addFromFile_actionPerformed(ActionEvent e)
{
- Desktop.instance.inputLocalFileMenuItem_actionPerformed(viewport);
+ Desktop.getInstance().inputLocalFileMenuItem_actionPerformed(viewport);
}
@Override
// file is reloaded.
if (FileFormat.Jalview.equals(currentFileFormat))
{
- JInternalFrame[] frames = Desktop.desktop.getAllFrames();
+ JInternalFrame[] frames = Desktop.getDesktopPane().getAllFrames();
for (int i = 0; i < frames.length; i++)
{
if (frames[i] instanceof AlignFrame && frames[i] != this
try
{
frames[i].setSelected(true);
- Desktop.instance.closeAssociatedWindows();
+ Desktop.getInstance().closeAssociatedWindows();
} catch (java.beans.PropertyVetoException ex)
{
}
}
}
- Desktop.instance.closeAssociatedWindows();
+ Desktop.getInstance().closeAssociatedWindows();
FileLoader loader = new FileLoader();
DataSourceType protocol = fileName.startsWith("http:")
? DataSourceType.URL
: DataSourceType.FILE;
- loader.LoadFile(viewport, fileName, protocol, currentFileFormat);
+ loader.loadFile(viewport, fileName, protocol, currentFileFormat);
}
else
{
DataSourceType protocol = (fileName.startsWith("http:")
? DataSourceType.URL
: DataSourceType.FILE);
- newframe = loader.LoadFileWaitTillLoaded(fileName, protocol,
+ newframe = loader.loadFileWaitTillLoaded(fileName, protocol,
currentFileFormat);
}
else
{
- newframe = loader.LoadFileWaitTillLoaded(fileObject,
+ newframe = loader.loadFileWaitTillLoaded(fileObject,
DataSourceType.FILE, currentFileFormat);
}
@Override
public void addFromText_actionPerformed(ActionEvent e)
{
- Desktop.instance
+ Desktop.getInstance()
.inputTextboxMenuItem_actionPerformed(viewport.getAlignPanel());
}
@Override
public void addFromURL_actionPerformed(ActionEvent e)
{
- Desktop.instance.inputURLMenuItem_actionPerformed(viewport);
+ Desktop.getInstance().inputURLMenuItem_actionPerformed(viewport);
}
@Override
// todo is this (2005) test now obsolete - value is never null?
while (currentFileFormat == null)
{
- JvOptionPane.showInternalMessageDialog(Desktop.desktop,
+ JvOptionPane.showInternalMessageDialog(Desktop.getDesktopPane(),
MessageManager
.getString("label.select_file_format_before_saving"),
MessageManager.getString("label.file_format_not_specified"),
String tempFilePath = doBackup ? backupfiles.getTempFilePath() : file;
PrintWriter out = new PrintWriter(
new FileWriter(tempFilePath));
+
out.print(output);
out.close();
AlignFrame.this.setTitle(file);
StringSelection ss = new StringSelection(output);
+ Desktop d = Desktop.getInstance();
try
{
- jalview.gui.Desktop.internalCopy = true;
+ d.internalCopy = true;
// Its really worth setting the clipboard contents
// to empty before setting the large StringSelection!!
Toolkit.getDefaultToolkit().getSystemClipboard()
.setContents(new StringSelection(""), null);
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(ss,
- Desktop.instance);
+ Desktop.getInstance());
} catch (OutOfMemoryError er)
{
new OOMWarning("copying region", er);
hiddenCutoff, hiddenOffset);
}
- Desktop.jalviewClipboard = new Object[] { seqs,
+ d.jalviewClipboard = new Object[] { seqs,
viewport.getAlignment().getDataset(), hiddenColumns };
setStatus(MessageManager.formatMessage(
"label.copied_sequences_to_clipboard", new Object[]
boolean annotationAdded = false;
AlignmentI alignment = null;
- if (Desktop.jalviewClipboard != null)
+ Desktop d = Desktop.getInstance();
+
+ if (d.jalviewClipboard != null)
{
// The clipboard was filled from within Jalview, we must use the
// sequences
// And dataset from the copied alignment
- SequenceI[] newseq = (SequenceI[]) Desktop.jalviewClipboard[0];
+ SequenceI[] newseq = (SequenceI[]) d.jalviewClipboard[0];
// be doubly sure that we create *new* sequence objects.
sequences = new SequenceI[newseq.length];
for (int i = 0; i < newseq.length; i++)
if (newAlignment)
{
- if (Desktop.jalviewClipboard != null)
+ if (d.jalviewClipboard != null)
{
// dataset is inherited
- alignment.setDataset((Alignment) Desktop.jalviewClipboard[1]);
+ alignment.setDataset((Alignment) d.jalviewClipboard[1]);
}
else
{
alignment = viewport.getAlignment();
alwidth = alignment.getWidth() + 1;
// decide if we need to import sequences from an existing dataset
- boolean importDs = Desktop.jalviewClipboard != null
- && Desktop.jalviewClipboard[1] != alignment.getDataset();
+ boolean importDs = d.jalviewClipboard != null
+ && d.jalviewClipboard[1] != alignment.getDataset();
// importDs==true instructs us to copy over new dataset sequences from
// an existing alignment
Vector<SequenceI> newDs = (importDs) ? new Vector<>() : null; // used to
newGraphGroups.add(q, null);
}
newGraphGroups.set(newann.graphGroup,
- Integer.valueOf(++fgroup));
+ new Integer(++fgroup));
}
newann.graphGroup = newGraphGroups.get(newann.graphGroup)
.intValue();
newGraphGroups.add(q, null);
}
newGraphGroups.set(newann.graphGroup,
- Integer.valueOf(++fgroup));
+ new Integer(++fgroup));
}
newann.graphGroup = newGraphGroups.get(newann.graphGroup)
.intValue();
DEFAULT_HEIGHT);
String newtitle = new String("Copied sequences");
- if (Desktop.jalviewClipboard != null
- && Desktop.jalviewClipboard[2] != null)
+ if (d.jalviewClipboard != null && d.jalviewClipboard[2] != null)
{
- HiddenColumns hc = (HiddenColumns) Desktop.jalviewClipboard[2];
+ HiddenColumns hc = (HiddenColumns) d.jalviewClipboard[2];
af.viewport.setHiddenColumns(hc);
}
DEFAULT_HEIGHT);
String newtitle = new String("Flanking alignment");
- if (Desktop.jalviewClipboard != null
- && Desktop.jalviewClipboard[2] != null)
+ Desktop d = Desktop.getInstance();
+
+ if (d.jalviewClipboard != null && d.jalviewClipboard[2] != null)
{
- HiddenColumns hc = (HiddenColumns) Desktop.jalviewClipboard[2];
+ HiddenColumns hc = (HiddenColumns) d.jalviewClipboard[2];
af.viewport.setHiddenColumns(hc);
}
+ 1) == viewport.getAlignment().getWidth()) ? true : false;
if (wholeHeight && wholeWidth)
{
- JvOptionPane dialog = JvOptionPane.newOptionDialog(Desktop.desktop);
+ JvOptionPane dialog = JvOptionPane.newOptionDialog(Desktop.getDesktopPane());
dialog.setResponseHandler(0, okAction); // 0 = OK_OPTION
Object[] options = new Object[] { MessageManager.getString("action.ok"),
MessageManager.getString("action.cancel") };
@Override
public void gatherViews_actionPerformed(ActionEvent e)
{
- Desktop.instance.gatherViews(this);
+ Desktop.getInstance().gatherViews(this);
}
/**
{
final boolean setVisible = annotationPanelMenuItem.isSelected();
viewport.setShowAnnotation(setVisible);
- this.showAllSeqAnnotations.setEnabled(setVisible);
- this.hideAllSeqAnnotations.setEnabled(setVisible);
- this.showAllAlAnnotations.setEnabled(setVisible);
- this.hideAllAlAnnotations.setEnabled(setVisible);
+ syncAnnotationMenuItems();
alignPanel.updateLayout();
}
+ private void syncAnnotationMenuItems()
+ {
+ final boolean setVisible = annotationPanelMenuItem.isSelected();
+ showAllSeqAnnotations.setEnabled(setVisible);
+ hideAllSeqAnnotations.setEnabled(setVisible);
+ showAllAlAnnotations.setEnabled(setVisible);
+ hideAllAlAnnotations.setEnabled(setVisible);
+ }
+
+
@Override
public void alignmentProperties()
{
}
JInternalFrame frame = new JInternalFrame();
- final OverviewPanel overview = new OverviewPanel(alignPanel);
+
+ // BH 2019.07.26 we allow for an embedded
+ // undecorated overview with defined size
+ frame.setName(Jalview.getAppID("overview"));
+ //
+ Dimension dim = (Dimension) Platform.getEmbeddedAttribute(frame,
+ Platform.EMBEDDED_DIM);
+ if (dim != null && dim.width == 0)
+ {
+ dim = null; // hidden, not embedded
+ }
+
+ OverviewPanel overview = new OverviewPanel(alignPanel, dim);
+
frame.setContentPane(overview);
+ if (dim == null)
+ {
+ dim = new Dimension();
+ // was frame.getSize(), but that is 0,0 at this point;
+ }
+ else
+ {
+ // we are imbedding, and so we have an undecorated frame
+ // and we can set the the frame dimensions accordingly.
+ }
+ // allowing for unresizable option using, style="resize:none"
+ boolean resizable = (Platform.getEmbeddedAttribute(frame,
+ "resize") != "none");
Desktop.addInternalFrame(frame, MessageManager
.formatMessage("label.overview_params", new Object[]
- { this.getTitle() }), true, frame.getWidth(), frame.getHeight(),
- true, true);
+ { this.getTitle() }), true, dim.width, dim.height, resizable,
+ true);
frame.pack();
frame.setLayer(JLayeredPane.PALETTE_LAYER);
frame.addInternalFrameListener(
@Override
public void autoCalculate_actionPerformed(ActionEvent e)
{
- viewport.autoCalculateConsensus = autoCalculate.isSelected();
- if (viewport.autoCalculateConsensus)
+ viewport.setAutoCalculateConsensusAndConservation(autoCalculate.isSelected());
+ if (viewport.getAutoCalculateConsensusAndConservation())
{
viewport.firePropertyChange("alignment", null,
viewport.getAlignment().getSequences());
{
if (_s.getLength() < sg.getEndRes())
{
- JvOptionPane.showMessageDialog(Desktop.desktop,
+ JvOptionPane.showMessageDialog(Desktop.getDesktopPane(),
MessageManager.getString(
"label.selected_region_to_tree_may_only_contain_residues_or_gaps"),
MessageManager.getString(
viewport.setCurrentTree(showNewickTree(fin, filePath).getTree());
} catch (Exception ex)
{
- JvOptionPane.showMessageDialog(Desktop.desktop, ex.getMessage(),
+ JvOptionPane.showMessageDialog(Desktop.getDesktopPane(), ex.getMessage(),
MessageManager
.getString("label.problem_reading_tree_file"),
JvOptionPane.WARNING_MESSAGE);
}
if (fin != null && fin.hasWarningMessage())
{
- JvOptionPane.showMessageDialog(Desktop.desktop,
+ JvOptionPane.showMessageDialog(Desktop.getDesktopPane(),
fin.getWarningMessage(),
MessageManager.getString(
"label.possible_problem_with_tree_file"),
final JMenu dismenu = new JMenu("Protein Disorder");
// JAL-940 - only show secondary structure prediction services from
// the legacy server
+ Hashtable<String, Vector<ServiceHandle>> services = Discoverer
+ .getInstance().getServices();
if (// Cache.getDefault("SHOW_JWS1_SERVICES", true)
- // &&
- Discoverer.services != null && (Discoverer.services.size() > 0))
+ // &&
+ services != null && (services.size() > 0))
{
// TODO: refactor to allow list of AbstractName/Handler bindings to
// be
// No MSAWS used any more:
// Vector msaws = null; // (Vector)
// Discoverer.services.get("MsaWS");
- Vector<ServiceHandle> secstrpr = Discoverer.services
- .get("SecStrPred");
+ Vector<ServiceHandle> secstrpr = services.get("SecStrPred");
if (secstrpr != null)
{
// Add any secondary structure prediction services
webService.add(me.webServiceNoServices);
}
// TODO: move into separate menu builder class.
- boolean new_sspred = false;
+ // boolean new_sspred = false;
if (Cache.getDefault("SHOW_JWS2_SERVICES", true))
{
- Jws2Discoverer jws2servs = Jws2Discoverer.getDiscoverer();
+ Jws2Discoverer jws2servs = Jws2Discoverer.getInstance();
if (jws2servs != null)
{
if (jws2servs.hasServices())
final String errorTitle = MessageManager
.getString("label.implementation_error")
+ MessageManager.getString("label.translation_failed");
- JvOptionPane.showMessageDialog(Desktop.desktop, msg, errorTitle,
+ JvOptionPane.showMessageDialog(Desktop.getDesktopPane(), msg, errorTitle,
JvOptionPane.ERROR_MESSAGE);
return;
}
"label.select_at_least_three_bases_in_at_least_one_sequence_to_cDNA_translation");
final String errorTitle = MessageManager
.getString("label.translation_failed");
- JvOptionPane.showMessageDialog(Desktop.desktop, msg, errorTitle,
+ JvOptionPane.showMessageDialog(Desktop.getDesktopPane(), msg, errorTitle,
JvOptionPane.WARNING_MESSAGE);
}
else
if (Cache.getDefault(Preferences.ENABLE_SPLIT_FRAME, true))
{
final SequenceI[] seqs = viewport.getSelectionAsNewSequence();
- viewport.openSplitFrame(af, new Alignment(seqs));
+ AlignViewport.openSplitFrame(this, af, new Alignment(seqs));
}
else
{
{
// BH 2018
return avc.parseFeaturesFile(file, sourceType,
- Cache.getDefault("RELAXEDSEQIDMATCHING", false));
+ Cache.getDefault(Preferences.RELAXEDSEQIDMATCHING, false));
}
{
viewport.setShowSequenceFeatures(true);
showSeqFeatures.setSelected(true);
+ alignPanel.getAlignment().resetColors();
}
}
if (filesmatched.size() > 0)
{
boolean autoAssociate = Cache
- .getDefault("AUTOASSOCIATE_PDBANDSEQS", false);
+ .getDefault(Preferences.AUTOASSOCIATE_PDBANDSEQS, false);
if (!autoAssociate)
{
String msg = MessageManager.formatMessage(
// associating PDB files which have no IDs.
for (SequenceI toassoc : (SequenceI[]) fm[2])
{
- PDBEntry pe = new AssociatePdbFileWithSeq()
+ PDBEntry pe = AssociatePdbFileWithSeq
.associatePdbWithSeq(fm[0].toString(),
- (DataSourceType) fm[1], toassoc, false,
- Desktop.instance);
+ (DataSourceType) fm[1], toassoc, false);
if (pe != null)
{
System.err.println("Associated file : "
{
// some problem - if no warning its probable that the ID matching
// process didn't work
- JvOptionPane.showMessageDialog(Desktop.desktop,
+ JvOptionPane.showMessageDialog(Desktop.getDesktopPane(),
tcf.getWarningMessage() == null
? MessageManager.getString(
"label.check_file_matches_sequence_ids_alignment")
}
else
{
- new FileLoader().LoadFile(viewport, file, sourceType, format);
+ new FileLoader().loadFile(viewport, file, sourceType, format);
}
}
}
if (isAnnotation)
{
-
- alignPanel.adjustAnnotationHeight();
- viewport.updateSequenceIdColours();
- buildSortByAnnotationScoresMenu();
- alignPanel.paintAlignment(true, true);
+ updateForAnnotations();
}
} catch (Exception ex)
{
+ (format != null
? "(parsing as '" + format + "' file)"
: ""),
- oom, Desktop.desktop);
+ oom, Desktop.getDesktopPane());
}
}
/**
+ * Do all updates necessary after an annotation file such as jnet. Also called
+ * from Jalview.loadAppletParams for "annotations", "jnetFile"
+ */
+ public void updateForAnnotations()
+ {
+ alignPanel.adjustAnnotationHeight();
+ viewport.updateSequenceIdColours();
+ buildSortByAnnotationScoresMenu();
+ alignPanel.paintAlignment(true, true);
+ }
+
+ /**
* Method invoked by the ChangeListener on the tabbed pane, in other words
* when a different tabbed pane is selected by the user or programmatically.
*/
}
/**
+ * Change the display state for the given feature groups -- Added by BH from
+ * JalviewLite
+ *
+ * @param groups
+ * list of group strings
+ * @param state
+ * visible or invisible
+ */
+ public void setFeatureGroupState(String[] groups, boolean state)
+ {
+ jalview.api.FeatureRenderer fr = null;
+ viewport.setShowSequenceFeatures(true);
+ if (alignPanel != null
+ && (fr = alignPanel.getFeatureRenderer()) != null)
+ {
+
+ fr.setGroupVisibility(Arrays.asList(groups), state);
+ alignPanel.getSeqPanel().seqCanvas.repaint();
+ if (alignPanel.overviewPanel != null)
+ {
+ alignPanel.overviewPanel.updateOverviewImage();
+ }
+ }
+ }
+
+ /**
* Open the dialog for regex description parsing.
*/
@Override
@Override
public void run()
{
- final jalview.ws.SequenceFetcher sf = jalview.gui.SequenceFetcher
- .getSequenceFetcherSingleton();
javax.swing.SwingUtilities.invokeLater(new Runnable()
{
@Override
public void run()
{
- String[] dbclasses = sf.getNonAlignmentSources();
+ String[] dbclasses = jalview.ws.SequenceFetcher.getInstance()
+ .getNonAlignmentSources();
List<DbSourceProxy> otherdb;
JMenu dfetch = new JMenu();
JMenu ifetch = new JMenu();
int dbi = 0;
for (String dbclass : dbclasses)
{
- otherdb = sf.getSourceProxy(dbclass);
+ otherdb = jalview.ws.SequenceFetcher.getInstance()
+ .getSourceProxy(dbclass);
// add a single entry for this class, or submenu allowing 'fetch
// all' or pick one
if (otherdb == null || otherdb.size() < 1)
}
if (otherdb.size() == 1)
{
- final DbSourceProxy[] dassource = otherdb
- .toArray(new DbSourceProxy[0]);
DbSourceProxy src = otherdb.get(0);
+ DbSourceProxy[] dassource = new DbSourceProxy[] {
+ src };
fetchr = new JMenuItem(src.getDbSource());
fetchr.addActionListener(new ActionListener()
{
} catch (Exception ex)
{
System.err.println((ex.toString()));
- JvOptionPane.showInternalMessageDialog(Desktop.desktop,
+ JvOptionPane.showInternalMessageDialog(Desktop.getDesktopPane(),
MessageManager.getString("label.couldnt_run_groovy_script"),
MessageManager.getString("label.groovy_support_failed"),
JvOptionPane.ERROR_MESSAGE);
}
+ /**
+ * BH 2019 from JalviewLite
+ *
+ * get sequence feature groups that are hidden or shown
+ *
+ * @param visible
+ * true is visible
+ * @return list
+ */
+ public String[] getFeatureGroupsOfState(boolean visible)
+ {
+ jalview.api.FeatureRenderer fr = null;
+ if (alignPanel != null
+ && (fr = alignPanel
+ .getFeatureRenderer()) != null)
+ {
+ List<String> gps = fr.getGroups(visible);
+ String[] _gps = gps.toArray(new String[gps.size()]);
+ return _gps;
+ }
+ return null;
+ }
+
+ public void scrollTo(int row, int column)
+ {
+ alignPanel.getSeqPanel().scrollTo(row, column);
+ }
+
+ public void scrollToRow(int row)
+ {
+ alignPanel.getSeqPanel().scrollToRow(row);
+ }
+
+ public void scrollToColumn(int column)
+ {
+ alignPanel.getSeqPanel().scrollToColumn(column);
+ }
+
+ /**
+ *
+ * @return list of feature groups on the view
+ */
+ public String[] getFeatureGroups()
+ {
+ jalview.api.FeatureRenderer fr = null;
+ if (alignPanel != null
+ && (fr = alignPanel.getFeatureRenderer()) != null)
+ {
+ List<String> gps = fr.getFeatureGroups();
+ String[] _gps = gps.toArray(new String[gps.size()]);
+ return _gps;
+ }
+ return null;
+ }
+
+ public void select(SequenceGroup sel, ColumnSelection csel,
+ HiddenColumns hidden)
+ {
+ alignPanel.getSeqPanel().selection(sel, csel, hidden, null);
+ }
+
}
class PrintThread extends Thread
}
}
}
+
}
*/
private void applyViewProperties()
{
- antiAlias = Cache.getDefault("ANTI_ALIAS", false);
-
- viewStyle.setShowJVSuffix(Cache.getDefault("SHOW_JVSUFFIX", true));
- setShowAnnotation(Cache.getDefault("SHOW_ANNOTATIONS", true));
-
- setRightAlignIds(Cache.getDefault("RIGHT_ALIGN_IDS", false));
- setCentreColumnLabels(Cache.getDefault("CENTRE_COLUMN_LABELS", false));
- autoCalculateConsensus = Cache.getDefault("AUTO_CALC_CONSENSUS", true);
-
- setPadGaps(Cache.getDefault("PAD_GAPS", true));
- setShowNPFeats(Cache.getDefault("SHOW_NPFEATS_TOOLTIP", true));
- setShowDBRefs(Cache.getDefault("SHOW_DBREFS_TOOLTIP", true));
- viewStyle.setSeqNameItalics(Cache.getDefault("ID_ITALICS", true));
- viewStyle.setWrapAlignment(Cache.getDefault("WRAP_ALIGNMENT", false));
+ antiAlias = Cache.getDefault(Preferences.ANTI_ALIAS, false);
+
+ viewStyle.setShowJVSuffix(
+ Cache.getDefault(Preferences.SHOW_JVSUFFIX, true));
+ setShowAnnotation(Cache.getDefault(Preferences.SHOW_ANNOTATIONS, true));
+
+ setRightAlignIds(Cache.getDefault(Preferences.RIGHT_ALIGN_IDS, false));
+ setCentreColumnLabels(Cache.getDefault(Preferences.CENTRE_COLUMN_LABELS, false));
+ autoCalculateConsensusAndConservation = Cache.getDefault(Preferences.AUTO_CALC_CONSENSUS, true);
+
+ setPadGaps(Cache.getDefault(Preferences.PAD_GAPS, true));
+ setShowNPFeats(Cache.getDefault(Preferences.SHOW_NPFEATS_TOOLTIP, true));
+ setShowDBRefs(Cache.getDefault(Preferences.SHOW_DBREFS_TOOLTIP, true));
+ viewStyle.setSeqNameItalics(Cache.getDefault(Preferences.ID_ITALICS, true));
+ viewStyle.setWrapAlignment(
+ Cache.getDefault(Preferences.WRAP_ALIGNMENT, false));
viewStyle.setShowUnconserved(
- Cache.getDefault("SHOW_UNCONSERVED", false));
- sortByTree = Cache.getDefault("SORT_BY_TREE", false);
- followSelection = Cache.getDefault("FOLLOW_SELECTIONS", true);
+ Cache.getDefault(Preferences.SHOW_UNCONSERVED, false));
+ sortByTree = Cache.getDefault(Preferences.SORT_BY_TREE, false);
+ followSelection = Cache.getDefault(Preferences.FOLLOW_SELECTIONS, true);
sortAnnotationsBy = SequenceAnnotationOrder
.valueOf(Cache.getDefault(Preferences.SORT_ANNOTATIONS,
SequenceAnnotationOrder.NONE.name()));
{
applyViewProperties();
- String fontName = Cache.getDefault("FONT_NAME", "SansSerif");
- String fontStyle = Cache.getDefault("FONT_STYLE", Font.PLAIN + "");
- String fontSize = Cache.getDefault("FONT_SIZE", "10");
+ String fontName = Cache.getDefault(Preferences.FONT_NAME, "SansSerif");
+ String fontStyle = Cache.getDefault(Preferences.FONT_STYLE,
+ Font.PLAIN + "");
+ String fontSize = Cache.getDefault(Preferences.FONT_SIZE, "10");
int style = 0;
setFont(new Font(fontName, style, Integer.parseInt(fontSize)), true);
alignment
- .setGapCharacter(Cache.getDefault("GAP_SYMBOL", "-").charAt(0));
+ .setGapCharacter(Cache.getDefault(Preferences.GAP_SYMBOL, "-")
+ .charAt(0));
// We must set conservation and consensus before setting colour,
// as Blosum and Clustal require this to be done
{
if (!alignment.isNucleotide())
{
- showConservation = Cache.getDefault("SHOW_CONSERVATION", true);
- showQuality = Cache.getDefault("SHOW_QUALITY", true);
- showGroupConservation = Cache.getDefault("SHOW_GROUP_CONSERVATION",
- false);
+ showConservation = Cache.getDefault(Preferences.SHOW_CONSERVATION,
+ true);
+ showQuality = Cache.getDefault(Preferences.SHOW_QUALITY, true);
+ showGroupConservation = Cache
+ .getDefault(Preferences.SHOW_GROUP_CONSERVATION, false);
}
- showConsensusHistogram = Cache.getDefault("SHOW_CONSENSUS_HISTOGRAM",
- true);
- showSequenceLogo = Cache.getDefault("SHOW_CONSENSUS_LOGO", false);
- normaliseSequenceLogo = Cache.getDefault("NORMALISE_CONSENSUS_LOGO",
+ showConsensusHistogram = Cache
+ .getDefault(Preferences.SHOW_CONSENSUS_HISTOGRAM, true);
+ showSequenceLogo = Cache.getDefault(Preferences.SHOW_CONSENSUS_LOGO,
false);
- showGroupConsensus = Cache.getDefault("SHOW_GROUP_CONSENSUS", false);
- showConsensus = Cache.getDefault("SHOW_IDENTITY", true);
+
+ normaliseSequenceLogo = Cache
+ .getDefault(Preferences.NORMALISE_CONSENSUS_LOGO, false);
+ showGroupConsensus = Cache
+ .getDefault(Preferences.SHOW_GROUP_CONSENSUS, false);
+ showConsensus = Cache.getDefault(Preferences.SHOW_IDENTITY, true);
showOccupancy = Cache.getDefault(Preferences.SHOW_OCCUPANCY, true);
}
schemeName = Cache.getDefault(Preferences.DEFAULT_COLOUR,
ResidueColourScheme.NONE);
}
- ColourSchemeI colourScheme = ColourSchemeProperty
- .getColourScheme(this, alignment, schemeName);
+ ColourSchemeI colourScheme = ColourSchemeProperty.getColourScheme(this,
+ alignment, schemeName);
residueShading = new ResidueShader(colourScheme);
if (colourScheme instanceof UserColourScheme)
*/
if (align != null)
{
- StructureSelectionManager ssm = StructureSelectionManager
- .getStructureSelectionManager(Desktop.instance);
- ssm.registerMappings(align.getCodonFrames());
+ Desktop.getStructureSelectionManager()
+ .registerMappings(align.getCodonFrames());
}
/*
List<AlignedCodonFrame> mappings = al.getCodonFrames();
if (mappings != null)
{
- StructureSelectionManager ssm = StructureSelectionManager
- .getStructureSelectionManager(Desktop.instance);
+ StructureSelectionManager ssm = Desktop
+ .getStructureSelectionManager();
for (AlignedCodonFrame acf : mappings)
{
if (noReferencesTo(acf))
@Override
public void sendSelection()
{
- jalview.structure.StructureSelectionManager
- .getStructureSelectionManager(Desktop.instance)
- .sendSelection(new SequenceGroup(getSelectionGroup()),
- new ColumnSelection(getColumnSelection()),
- new HiddenColumns(getAlignment().getHiddenColumns()),
- this);
+ Desktop.getStructureSelectionManager().sendSelection(
+ new SequenceGroup(getSelectionGroup()),
+ new ColumnSelection(getColumnSelection()),
+ new HiddenColumns(getAlignment().getHiddenColumns()), this);
}
/**
@Override
public StructureSelectionManager getStructureSelectionManager()
{
- return StructureSelectionManager
- .getStructureSelectionManager(Desktop.instance);
+ return Desktop.getStructureSelectionManager();
}
@Override
firePropertyChange("alignment", null, getAlignment().getSequences());
}
+ public final static int NO_SPLIT = 0;
+
+ public final static int SPLIT_FRAME = 1;
+
+ public final static int NEW_WINDOW = 2;
+
/**
* Show a dialog with the option to open and link (cDNA <-> protein) as a new
* alignment, either as a standalone alignment or in a split frame. Returns
MessageManager.getString("label.new_window"), };
final String question = JvSwingUtils.wrapTooltip(true,
MessageManager.getString("label.open_split_window?"));
- final AlignViewport us = this;
-
+
/*
* options No, Split Window, New Window correspond to
* dialog responses 0, 1, 2 (even though JOptionPane shows them
* in reverse order)
*/
- JvOptionPane dialog = JvOptionPane.newOptionDialog(Desktop.desktop)
- .setResponseHandler(0, new Runnable()
+ JvOptionPane dialog = JvOptionPane
+ .newOptionDialog(Desktop.getDesktopPane())
+ .setResponseHandler(NO_SPLIT, new Runnable()
{
@Override
public void run()
{
- addDataToAlignment(al);
+ addDataToAlignment(al);
}
- }).setResponseHandler(1, new Runnable()
+ }).setResponseHandler(SPLIT_FRAME, new Runnable()
{
@Override
public void run()
{
- us.openLinkedAlignmentAs(al, title, true);
+ openLinkedAlignmentAs(getAlignPanel().alignFrame,
+ new Alignment(getAlignment()), al, title,
+ SPLIT_FRAME);
}
- }).setResponseHandler(2, new Runnable()
+ }).setResponseHandler(NEW_WINDOW, new Runnable()
{
@Override
public void run()
{
- us.openLinkedAlignmentAs(al, title, false);
+ openLinkedAlignmentAs(null, getAlignment(), al, title,
+ NEW_WINDOW);
}
});
- dialog.showDialog(question,
+ dialog.showDialog(question,
MessageManager.getString("label.open_split_window"),
JvOptionPane.DEFAULT_OPTION, JvOptionPane.PLAIN_MESSAGE, null,
options, options[0]);
}
- protected void openLinkedAlignmentAs(AlignmentI al, String title,
- boolean newWindowOrSplitPane)
- {
+ /**
+ * Open a split frame or a new window
+ *
+ * @param al
+ * @param title
+ * @param mode
+ * SPLIT_FRAME or NEW_WINDOW
+ */
+ public static void openLinkedAlignmentAs(AlignFrame thisFrame,
+ AlignmentI thisAlignment, AlignmentI al, String title, int mode)
+ {
/*
* Identify protein and dna alignments. Make a copy of this one if opening
* in a new split pane.
*/
- AlignmentI thisAlignment = newWindowOrSplitPane
- ? new Alignment(getAlignment())
- : getAlignment();
AlignmentI protein = al.isNucleotide() ? thisAlignment : al;
- final AlignmentI cdna = al.isNucleotide() ? al : thisAlignment;
+ AlignmentI cdna = al.isNucleotide() ? al : thisAlignment;
/*
* Map sequences. At least one should get mapped as we have already passed
// alignFrame.setFileName(file, format);
// }
- if (!newWindowOrSplitPane)
+ if (mode == NEW_WINDOW)
{
Desktop.addInternalFrame(newAlignFrame, title,
AlignFrame.DEFAULT_WIDTH, AlignFrame.DEFAULT_HEIGHT);
try
{
- newAlignFrame.setMaximum(
- jalview.bin.Cache.getDefault("SHOW_FULLSCREEN", false));
+ newAlignFrame.setMaximum(jalview.bin.Cache
+ .getDefault(Preferences.SHOW_FULLSCREEN, false));
} catch (java.beans.PropertyVetoException ex)
{
}
- if (newWindowOrSplitPane)
+ if (mode == SPLIT_FRAME)
{
al.alignAs(thisAlignment);
- protein = openSplitFrame(newAlignFrame, thisAlignment);
+ openSplitFrame(thisFrame, newAlignFrame, thisAlignment);
}
}
* cdna/protein complement alignment to show in the other split half
* @return the protein alignment in the split frame
*/
- protected AlignmentI openSplitFrame(AlignFrame newAlignFrame,
- AlignmentI complement)
+ static protected AlignmentI openSplitFrame(AlignFrame thisFrame,
+ AlignFrame newAlignFrame, AlignmentI complement)
{
/*
* Make a new frame with a copy of the alignment we are adding to. If this
*/
AlignFrame copyMe = new AlignFrame(complement, AlignFrame.DEFAULT_WIDTH,
AlignFrame.DEFAULT_HEIGHT);
- copyMe.setTitle(getAlignPanel().alignFrame.getTitle());
+ copyMe.setTitle(thisFrame.getTitle());
AlignmentI al = newAlignFrame.viewport.getAlignment();
final AlignFrame proteinFrame = al.isNucleotide() ? copyMe
import jalview.analysis.AnnotationSorter;
import jalview.api.AlignViewportI;
import jalview.api.AlignmentViewPanel;
+import jalview.api.SequenceRenderer;
import jalview.bin.Cache;
import jalview.bin.Jalview;
import jalview.datamodel.AlignmentI;
import java.awt.event.AdjustmentListener;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
+import java.awt.image.BufferedImage;
import java.awt.print.PageFormat;
import java.awt.print.Printable;
import java.awt.print.PrinterException;
import javax.swing.SwingUtilities;
/**
- * DOCUMENT ME!
+ * The main panel of an AlignFrame, containing holders for the IdPanel,
+ * SeqPanel, AnnotationLabels (a JPanel), and AnnotationPanel.
+ *
+ * Additional holders contain an IdPanelWidthAdjuster space above the idPanel,
+ * AnnotationScroller (JScrollPane for AnnotationPanel), and vertical and
+ * horizontal scrollbars.
+ *
+ *
*
* @author $author$
* @version $Revision: 1.161 $
*/
public AlignmentPanel(AlignFrame af, final AlignViewport av)
{
-// setBackground(Color.white); // BH 2019
+ setBackground(Color.white); // BH 2019
+ setOpaque(true);
alignFrame = af;
this.av = av;
setSeqPanel(new SeqPanel(av, this));
annotationScroller.setViewportView(getAnnotationPanel());
annotationSpaceFillerHolder.add(getAlabels(), BorderLayout.CENTER);
-
+ if (!av.isShowAnnotation())
+ {
+ annotationScroller.setVisible(false);
+ annotationSpaceFillerHolder.setVisible(false);
+ }
scalePanelHolder.add(getScalePanel(), BorderLayout.CENTER);
seqPanelHolder.add(getSeqPanel(), BorderLayout.CENTER);
*/
public void updateLayout()
{
- fontChanged();
+ fontChanged(); // fires repaint
setAnnotationVisible(av.isShowAnnotation());
boolean wrap = av.getWrapAlignment();
ViewportRanges ranges = av.getRanges();
if (overviewPanel != null)
{
+ getAlignment().resetColors();
overviewPanel.updateOverviewImage();
}
}
@Override
public void paintComponent(Graphics g)
{
+
invalidate(); // needed so that the id width adjuster works correctly
Dimension d = getIdPanel().getIdCanvas().getPreferredSize();
public int getVisibleIdWidth(boolean onscreen)
{
// see if rendering offscreen - check preferences and calc width accordingly
- if (!onscreen && Cache.getDefault("FIGURE_AUTOIDWIDTH", false))
+ if (!onscreen && Cache.getDefault(Preferences.FIGURE_AUTOIDWIDTH, false))
{
return calculateIdWidth(-1).width + 4;
}
Integer idwidth = null;
if (onscreen || (idwidth = Cache
- .getIntegerProperty("FIGURE_FIXEDIDWIDTH")) == null)
+ .getIntegerProperty(Preferences.FIGURE_FIXEDIDWIDTH)) == null)
{
int w = getIdPanel().getWidth();
return (w > 0 ? w : calculateIdWidth().width + 4);
{
int seqPanelWidth = getSeqPanel().seqCanvas.getWidth();
- if (System.getProperty("java.awt.headless") != null
- && System.getProperty("java.awt.headless").equals("true"))
+ if (Jalview.isHeadlessMode())
{
seqPanelWidth = alignFrame.getWidth() - getVisibleIdWidth()
- vscroll.getPreferredSize().width
return calculationDialog;
}
+ @Override
+ public SequenceRenderer getSequenceRenderer()
+ {
+ return seqPanel.seqCanvas.getSequenceRenderer();
+ }
+
+ public boolean scrollTo(int ostart, int end, int seqIndex,
+ boolean scrollToNearest, boolean redrawOverview)
+ {
+ int startv, endv, starts, ends;// , width;
+
+ int start = -1;
+ if (av.hasHiddenColumns())
+ {
+ AlignmentI al = av.getAlignment();
+ start = al.getHiddenColumns().absoluteToVisibleColumn(ostart);
+ end = al.getHiddenColumns().absoluteToVisibleColumn(end);
+ if (start == end)
+ {
+ if (!scrollToNearest && !al.getHiddenColumns().isVisible(ostart))
+ {
+ // don't scroll - position isn't visible
+ return false;
+ }
+ }
+ }
+ else
+ {
+ start = ostart;
+ }
+
+ ViewportRanges ranges = av.getRanges();
+ if (!av.getWrapAlignment())
+ {
+ /*
+ * int spos=av.getStartRes(),sqpos=av.getStartSeq(); if ((startv =
+ * av.getStartRes()) >= start) { spos=start-1; // seqIn //
+ * setScrollValues(start - 1, seqIndex); } else if ((endv =
+ * av.getEndRes()) <= end) { // setScrollValues(spos=startv + 1 + end -
+ * endv, seqIndex); spos=startv + 1 + end - endv; } else if ((starts =
+ * av.getStartSeq()) > seqIndex) { setScrollValues(av.getStartRes(),
+ * seqIndex); } else if ((ends = av.getEndSeq()) <= seqIndex) {
+ * setScrollValues(av.getStartRes(), starts + seqIndex - ends + 1); }
+ */
+
+ // below is scrolling logic up to Jalview 2.8.2
+ // if ((av.getStartRes() > end)
+ // || (av.getEndRes() < start)
+ // || ((av.getStartSeq() > seqIndex) || (av.getEndSeq() < seqIndex)))
+ // {
+ // if (start > av.getAlignment().getWidth() - hextent)
+ // {
+ // start = av.getAlignment().getWidth() - hextent;
+ // if (start < 0)
+ // {
+ // start = 0;
+ // }
+ //
+ // }
+ // if (seqIndex > av.getAlignment().getHeight() - vextent)
+ // {
+ // seqIndex = av.getAlignment().getHeight() - vextent;
+ // if (seqIndex < 0)
+ // {
+ // seqIndex = 0;
+ // }
+ // }
+ // setScrollValues(start, seqIndex);
+ // }
+ // logic copied from jalview.gui.AlignmentPanel:
+ if ((startv = ranges.getStartRes()) >= start)
+ {
+ /*
+ * Scroll left to make start of search results visible
+ */
+ setScrollValues(start - 1, seqIndex);
+ }
+ else if ((endv = ranges.getEndRes()) <= end)
+ {
+ /*
+ * Scroll right to make end of search results visible
+ */
+ setScrollValues(startv + 1 + end - endv, seqIndex);
+ }
+ else if ((starts = ranges.getStartSeq()) > seqIndex)
+ {
+ /*
+ * Scroll up to make start of search results visible
+ */
+ setScrollValues(ranges.getStartRes(), seqIndex);
+ }
+ else if ((ends = ranges.getEndSeq()) <= seqIndex)
+ {
+ /*
+ * Scroll down to make end of search results visible
+ */
+ setScrollValues(ranges.getStartRes(), starts + seqIndex - ends + 1);
+ }
+ /*
+ * Else results are already visible - no need to scroll
+ */
+ }
+ else
+ {
+ ranges.scrollToWrappedVisible(start);
+ }
+
+ paintAlignment(redrawOverview, false);
+ return true;
+ }
+
+ @Override
+ public void overviewDone(BufferedImage miniMe)
+ {
+ overviewPanel.canvas.finalizeDraw(miniMe);
+ }
+
+
+ private boolean holdRepaint = false;
+
+ public boolean getHoldRepaint()
+ {
+ return holdRepaint;
+ }
+
+ public void setHoldRepaint(boolean b)
+ {
+ if (holdRepaint == b)
+ {
+ return;
+ }
+ holdRepaint = b;
+ if (!b)
+ {
+ repaint();
+ }
+ }
+
+ @Override
+ public void repaint()
+ {
+ if (holdRepaint)
+ {
+ // System.out.println("AP repaint holding");
+ // Platform.stackTrace();
+ return;
+ }
+ super.repaint();
+ }
+
}
private void setDefaultMinMax()
{
minColour.setBackground(
- Cache.getDefaultColour("ANNOTATIONCOLOUR_MIN", Color.orange));
+ Cache.getDefaultColour(Preferences.ANNOTATIONCOLOUR_MIN, Color.orange));
maxColour.setBackground(
- Cache.getDefaultColour("ANNOTATIONCOLOUR_MAX", Color.red));
+ Cache.getDefaultColour(Preferences.ANNOTATIONCOLOUR_MAX, Color.red));
}
protected void showColourChooser(JPanel colourPanel, String titleKey)
updateView();
}
};
- JalviewColourChooser.showColourChooser(Desktop.getDesktop(), ttl,
+ JalviewColourChooser.showColourChooser(Desktop.getDesktopPane(), ttl,
colourPanel.getBackground(), listener);
}
public static final int ACTION_OPTION_SELECT = 1;
- public static int ACTION_OPTION_HIDE = 2;
+ public static final int ACTION_OPTION_HIDE = 2;
- public static String NO_GRAPH_VIEW = "0";
+ public static final String NO_GRAPH_VIEW = "0";
- public static String GRAPH_VIEW = "1";
+ public static final String GRAPH_VIEW = "1";
private int actionOption = ACTION_OPTION_SELECT;
/**
* height in pixels for allowing height adjuster to be active
*/
- private static int HEIGHT_ADJUSTER_HEIGHT = 10;
+ private static final int HEIGHT_ADJUSTER_HEIGHT = 10;
private static final Font font = new Font("Arial", Font.PLAIN, 11);
seqs, omitHidden, alignmentStartEnd);
Toolkit.getDefaultToolkit().getSystemClipboard()
- .setContents(new StringSelection(output), Desktop.instance);
+ .setContents(new StringSelection(output), Desktop.getInstance());
HiddenColumns hiddenColumns = null;
av.getAlignment().getHiddenColumns());
}
- Desktop.jalviewClipboard = new Object[] { seqs, ds, // what is the dataset
+ Desktop.getInstance().jalviewClipboard = new Object[] { seqs, ds, // what is
+ // the
+ // dataset
// of a consensus
// sequence ? need to
// flag
gg.dispose();
+
fastPaint = true;
// Call repaint on alignment panel so that repaints from other alignment
// Here we only want to fastpaint on a scroll, with resize using a normal
// paint, so scroll events are identified as changes to the horizontal or
// vertical start value.
- if (evt.getPropertyName().equals(ViewportRanges.STARTRES))
+ switch (evt.getPropertyName())
{
+ case ViewportRanges.STARTRES:
fastPaint((int) evt.getNewValue() - (int) evt.getOldValue());
- }
- else if (evt.getPropertyName().equals(ViewportRanges.STARTRESANDSEQ))
- {
+ break;
+ case ViewportRanges.STARTRESANDSEQ:
fastPaint(((int[]) evt.getNewValue())[0]
- ((int[]) evt.getOldValue())[0]);
- }
- else if (evt.getPropertyName().equals(ViewportRanges.MOVE_VIEWPORT))
- {
+ break;
+ case ViewportRanges.MOVE_VIEWPORT:
repaint();
+ break;
+ case ViewportRanges.STARTSEQ:
+ case ViewportRanges.ENDRES:
+ case ViewportRanges.ENDSEQ:
+ // ignore
+ break;
}
}
// TODO: consider waiting until the structure/view is fully loaded before
// displaying
this.getContentPane().add(renderPanel, java.awt.BorderLayout.CENTER);
+ this.invalidate();
+ this.pack();
jalview.gui.Desktop.addInternalFrame(this, jmb.getViewerTitle(),
getBounds().width, getBounds().height);
if (scriptWindow == null)
for (String s : files)
{
fileList.append(SPACE).append(QUOTE)
- .append(Platform.escapeBackslashes(s)).append(QUOTE);
+ .append(Platform.escapeString(s)).append(QUOTE);
}
String filesString = fileList.toString();
addingStructures = true; // already files loaded.
for (int c = 0; c < filesInViewer.length; c++)
{
- if (Platform.pathEquals(filesInViewer[c], file))
+ if (filesInViewer[c].equals(file))
{
file = null;
break;
}
if (errormsgs.length() > 0)
{
- JvOptionPane.showInternalMessageDialog(Desktop.desktop,
+ JvOptionPane.showInternalMessageDialog(Desktop.getDesktopPane(),
MessageManager.formatMessage(
"label.pdb_entries_couldnt_be_retrieved", new String[]
{ errormsgs.toString() }),
*
* @param type
*/
+ @Override
public void makePDBImage(ImageMaker.TYPE type)
{
int width = getWidth();
validate();
}
+ @SuppressWarnings("serial")
class RenderPanel extends JPanel
{
final Dimension currentSize = new Dimension();
+ public RenderPanel()
+ {
+ setPreferredSize(
+ Cache.getDefaultDim(Preferences.STRUCTURE_DIMENSIONS,
+ Preferences.DEFAULT_STRUCTURE_DIMENSIONS));
+ // BH 2019.07.12 suggesting 600,600; current is something like 347 x 323
+ }
+
@Override
public void paintComponent(Graphics g)
{
getSize(currentSize);
-
+ // BH: Note that this size could be slightly different from the size set
+ // prior to packing.
if (jmb != null && jmb.hasFileLoadingError())
{
g.setColor(Color.black);
* Lookup for sequence and annotation mapped to each RNA in the viewer. Using
* a linked hashmap means that order is preserved when saved to the project.
*/
- private Map<RNA, RnaModel> models = new LinkedHashMap<RNA, RnaModel>();
+ private Map<RNA, RnaModel> models = new LinkedHashMap<>();
- private Map<RNA, ShiftList> offsets = new Hashtable<RNA, ShiftList>();
+ private Map<RNA, ShiftList> offsets = new Hashtable<>();
- private Map<RNA, ShiftList> offsetsInv = new Hashtable<RNA, ShiftList>();
+ private Map<RNA, ShiftList> offsetsInv = new Hashtable<>();
private JSplitPane split;
private ReorderableJList _sideList = null;
- private static String errorOpt = "error";
+ private final static String errorOpt = "error";
@SuppressWarnings("unused")
private boolean _error;
*/
private void init()
{
- DefaultListModel<FullBackup> dlm = new DefaultListModel<FullBackup>();
+ DefaultListModel<FullBackup> dlm = new DefaultListModel<>();
int marginTools = 40;
_sideList.setPreferredSize(new Dimension(100, 0));
_sideList.addListSelectionListener(new ListSelectionListener()
{
+ @Override
public void valueChanged(ListSelectionEvent evt)
{
changeSelectedStructure_actionPerformed(evt);
{
private DefaultListModel<FullBackup> _rnalist;
- private List<RNA> _rnas = new ArrayList<RNA>();
+ private List<RNA> _rnas = new ArrayList<>();
JList _l;
*/
package jalview.gui;
-import jalview.api.StructureSelectionManagerProvider;
import jalview.datamodel.PDBEntry;
import jalview.datamodel.SequenceI;
import jalview.io.DataSourceType;
import jalview.io.StructureFile;
-import jalview.structure.StructureSelectionManager;
import jalview.util.MessageManager;
-import javax.swing.JOptionPane;
-
/**
- * GUI related routines for associating PDB files with sequences
+ * GUI related routines for associating PDB files with sequences. A single
+ * static method.
*
* @author JimP
*
public class AssociatePdbFileWithSeq
{
+ private AssociatePdbFileWithSeq()
+ {
+ // inaccessible
+ }
+
/**
- * assocate the given PDB file with
+ * Associate the given PDB file name or URL with a sequence. Do not map
+ * mouse-over events.
*
- * @param choice
+ * @param fileName
+ * or URL
+ * @param type
+ * will be DataType.FILE or DataType.URL
* @param sequence
+ * to associate
+ * @param prompt
+ * true if the user should be asked what to do if the specified file
+ * does not seem to contain PDB information (StructureChooser only)
+ * @return null if file is not found
*/
- public PDBEntry associatePdbWithSeq(String choice, DataSourceType file,
- SequenceI sequence, boolean prompt,
- StructureSelectionManagerProvider ssmp)
+ public static PDBEntry associatePdbWithSeq(String fileName,
+ DataSourceType type, SequenceI sequence, boolean prompt)
{
PDBEntry entry = new PDBEntry();
StructureFile pdbfile = null;
- pdbfile = StructureSelectionManager.getStructureSelectionManager(ssmp)
+ pdbfile = Desktop.getStructureSelectionManager()
.setMapping(false, new SequenceI[]
- { sequence }, null, choice, file);
+ { sequence }, null, fileName, type);
if (pdbfile == null)
{
// stacktrace already thrown so just return
return null;
}
- if (pdbfile.getId() == null)
- {
- String reply = null;
-
- if (prompt)
- {
- reply = JvOptionPane.showInternalInputDialog(Desktop.desktop,
- MessageManager
- .getString("label.couldnt_find_pdb_id_in_file"),
- MessageManager.getString("label.no_pdb_id_in_file"),
- JvOptionPane.QUESTION_MESSAGE);
- }
- if (reply == null)
- {
- return null;
- }
-
- entry.setId(reply);
- }
- else
+ String id = pdbfile.getId();
+ if (id == null && (id = (prompt
+ ? JvOptionPane.showInternalInputDialog(Desktop.getDesktopPane(),
+ MessageManager
+ .getString("label.couldnt_find_pdb_id_in_file"),
+ MessageManager.getString("label.no_pdb_id_in_file"),
+ JvOptionPane.QUESTION_MESSAGE)
+ : null)) == null)
{
- entry.setId(pdbfile.getId());
+ return null;
}
+ entry.setId(id);
entry.setType(PDBEntry.Type.FILE);
-
- if (pdbfile != null)
- {
- entry.setFile(choice);
- sequence.getDatasetSequence().addPDBId(entry);
- StructureSelectionManager.getStructureSelectionManager(ssmp)
- .registerPDBEntry(entry);
- }
+ entry.setFile(fileName);
+ sequence.getDatasetSequence().addPDBId(entry);
+ Desktop.getInstance().getStructureSelectionManager()
+ .registerPDBEntry(entry);
return entry;
}
}
public LaunchJvBrowserOnItem(JList listItems)
{
super("Open in Browser");
- this.putValue(MNEMONIC_KEY, Integer.valueOf(KeyEvent.VK_O));
+ this.putValue(MNEMONIC_KEY, new Integer(KeyEvent.VK_O));
this.putValue(Action.LONG_DESCRIPTION, "Open in Browser");
_listItems = listItems;
}
import javax.swing.event.InternalFrameEvent;
/**
- * A dialog where a user can choose and action Tree or PCA calculation options
+ * A dialog where a user can choose and action Tree or PCA calculation options.
+ *
+ * Allows also for dialog-free static methods openPCAPanel(...) and
+ * openTreePanel(...) for scripted use.
+ *
*/
+@SuppressWarnings("serial")
public class CalculationChooser extends JPanel
{
/*
*/
private static boolean treeMatchGaps = true;
- private static final Font VERDANA_11PT = new Font("Verdana", 0, 11);
+ private static Font VERDANA_11PT;
private static final int MIN_TREE_SELECTION = 3;
private JCheckBox shorterSequence;
- final ComboBoxTooltipRenderer renderer = new ComboBoxTooltipRenderer();
+ private static ComboBoxTooltipRenderer renderer; // BH was not static
List<String> tips = new ArrayList<>();
private PCAPanel pcaPanel;
/**
+ * Open a new Tree panel on the desktop statically. Params are standard (not
+ * set by Groovy). No dialog is opened.
+ *
+ * @param af
+ * @param treeType
+ * @param modelName
+ * @return null if successful; the string
+ * "label.you_need_at_least_n_sequences" if number of sequences
+ * selected is inappropriate
+ */
+ public static Object openTreePanel(AlignFrame af, String treeType,
+ String modelName)
+ {
+ return openTreePanel(af, treeType, modelName, null);
+ }
+
+ /**
+ * public static method for JalviewJS API to open a PCAPanel without
+ * necessarily using a dialog.
+ *
+ * @param af
+ * @param modelName
+ * @return the PCAPanel, or the string "label.you_need_at_least_n_sequences"
+ * if number of sequences selected is inappropriate
+ */
+ public static Object openPcaPanel(AlignFrame af, String modelName)
+ {
+ return openPcaPanel(af, modelName, null);
+ }
+
+ /**
* Constructor
*
* @param af
paramsPanel.add(includeGappedColumns);
paramsPanel.add(shorterSequence);
+ if (VERDANA_11PT == null)
+ {
+ VERDANA_11PT = new Font("Verdana", 0, 11);
+ }
/*
* OK / Cancel buttons
*/
*/
protected JComboBox<String> buildModelOptionsList()
{
- final JComboBox<String> scoreModelsCombo = new JComboBox<>();
+ JComboBox<String> scoreModelsCombo = new JComboBox<>();
+ if (renderer == null)
+ {
+ renderer = new ComboBoxTooltipRenderer();
+ }
scoreModelsCombo.setRenderer(renderer);
/*
* for backwards compatibility with Jalview < 2.8 (JAL-2962)
*/
if (nucleotide && forPca
- && Cache.getDefault("BLOSUM62_PCA_FOR_NUCLEOTIDE", false))
+ && Cache.getDefault(Preferences.BLOSUM62_PCA_FOR_NUCLEOTIDE,
+ false))
{
filtered.add(scoreModels.getBlosum62());
}
*/
protected void openTreePanel(String modelName, SimilarityParamsI params)
{
+ Object ret = openTreePanel(af,
+ neighbourJoining.isSelected() ? TreeBuilder.NEIGHBOUR_JOINING
+ : TreeBuilder.AVERAGE_DISTANCE,
+ modelName, params);
+ if (ret instanceof String)
+ {
+ JvOptionPane.showMessageDialog(this, // was opening on Desktop?
+ MessageManager.formatMessage(
+ (String) ret,
+ MIN_TREE_SELECTION),
+ MessageManager.getString("label.not_enough_sequences"),
+ JvOptionPane.WARNING_MESSAGE);
+
+ }
+ }
+
+ /**
+ * Open a new PCA panel on the desktop
+ *
+ * @param modelName
+ * @param params
+ */
+ protected void openPcaPanel(String modelName, SimilarityParamsI params)
+ {
+ Object ret = openPcaPanel(af, modelName, params);
+ if (ret instanceof String)
+ {
+ JvOptionPane.showInternalMessageDialog(this,
+ MessageManager.formatMessage(
+ (String) ret,
+ MIN_PCA_SELECTION),
+ MessageManager
+ .getString("label.sequence_selection_insufficient"),
+ JvOptionPane.WARNING_MESSAGE);
+ }
+ else
+ {
+ // only used for test suite
+ pcaPanel = (PCAPanel) ret;
+ }
+
+ }
+
+ /**
+ * Open a new Tree panel on the desktop statically
+ *
+ * @param af
+ * @param treeType
+ * @param modelName
+ * @param params
+ * @return null, or the string "label.you_need_at_least_n_sequences" if number
+ * of sequences selected is inappropriate
+ */
+ public static Object openTreePanel(AlignFrame af, String treeType,
+ String modelName, SimilarityParamsI params)
+ {
+
/*
* gui validation shouldn't allow insufficient sequences here, but leave
* this check in in case this method gets exposed programmatically in future
SequenceGroup sg = viewport.getSelectionGroup();
if (sg != null && sg.getSize() < MIN_TREE_SELECTION)
{
- JvOptionPane.showMessageDialog(Desktop.desktop,
- MessageManager.formatMessage(
- "label.you_need_at_least_n_sequences",
- MIN_TREE_SELECTION),
- MessageManager.getString("label.not_enough_sequences"),
- JvOptionPane.WARNING_MESSAGE);
- return;
+ return "label.you_need_at_least_n_sequences";
+ }
+
+ if (params == null)
+ {
+ params = getSimilarityParameters(false);
}
- String treeType = neighbourJoining.isSelected()
- ? TreeBuilder.NEIGHBOUR_JOINING
- : TreeBuilder.AVERAGE_DISTANCE;
af.newTreePanel(treeType, modelName, params);
+ return null;
}
/**
- * Open a new PCA panel on the desktop
+ * public static method for JalviewJS API
*
+ * @param af
* @param modelName
* @param params
+ * @return the PCAPanel, or null if number of sequences selected is
+ * inappropriate
*/
- protected void openPcaPanel(String modelName, SimilarityParamsI params)
+ public static Object openPcaPanel(AlignFrame af, String modelName,
+ SimilarityParamsI params)
{
+
AlignViewport viewport = af.getViewport();
/*
* gui validation shouldn't allow insufficient sequences here, but leave
* this check in in case this method gets exposed programmatically in future
+ *
+ *
*/
if (((viewport.getSelectionGroup() != null)
&& (viewport.getSelectionGroup().getSize() < MIN_PCA_SELECTION)
&& (viewport.getSelectionGroup().getSize() > 0))
|| (viewport.getAlignment().getHeight() < MIN_PCA_SELECTION))
{
- JvOptionPane.showInternalMessageDialog(this,
- MessageManager.formatMessage(
- "label.you_need_at_least_n_sequences",
- MIN_PCA_SELECTION),
- MessageManager
- .getString("label.sequence_selection_insufficient"),
- JvOptionPane.WARNING_MESSAGE);
- return;
+ return "label.you_need_at_least_n_sequences";
+ }
+
+ if (params == null)
+ {
+ params = getSimilarityParameters(true);
}
/*
* construct the panel and kick off its calculation thread
*/
- pcaPanel = new PCAPanel(af.alignPanel, modelName, params);
- new Thread(pcaPanel).start();
-
+ PCAPanel pcap = new PCAPanel(af.alignPanel, modelName, params);
+ new Thread(pcap).start();
+ return pcap;
}
/**
}
}
+
/**
* Returns a data bean holding parameters for similarity (or distance) model
* calculation
* @param doPCA
* @return
*/
- protected SimilarityParamsI getSimilarityParameters(boolean doPCA)
+ public static SimilarityParamsI getSimilarityParameters(
+ boolean doPCA)
{
// commented out: parameter choices read from gui widgets
// SimilarityParamsI params = new SimilarityParams(
return new SimilarityParams(includeGapGap, matchGap, includeGapResidue,
matchOnShortestLength);
+
}
/**
public PCAPanel getPcaPanel()
{
+ // only called for FreeUpMemoryTest
return pcaPanel;
}
}
if (!jmb.launchChimera())
{
- JvOptionPane.showMessageDialog(Desktop.desktop,
+ JvOptionPane.showMessageDialog(Desktop.getDesktopPane(),
MessageManager.getString("label.chimera_failed"),
MessageManager.getString("label.error_loading_file"),
JvOptionPane.ERROR_MESSAGE);
{
filePDB.add(thePdbEntry);
filePDBpos.add(Integer.valueOf(pi));
- files.append(" \"" + Platform.escapeBackslashes(file) + "\"");
+ files.append(" \"" + Platform.escapeString(file) + "\"");
}
}
} catch (OutOfMemoryError oomerror)
if (errormsgs.length() > 0)
{
- JvOptionPane.showInternalMessageDialog(Desktop.desktop,
+ JvOptionPane.showInternalMessageDialog(Desktop.getDesktopPane(),
MessageManager.formatMessage(
"label.pdb_entries_couldnt_be_retrieved", new Object[]
{ errormsgs.toString() }),
ActionListener al = radioItem.getActionListeners()[0];
radioItem.removeActionListener(al);
int option = JvOptionPane.showInternalConfirmDialog(
- Desktop.desktop,
+ Desktop.getDesktopPane(),
MessageManager
.getString("label.remove_from_default_list"),
MessageManager
static void updatePreferences()
{
StringBuilder coloursFound = new StringBuilder();
- String[] files = Cache.getProperty("USER_DEFINED_COLOURS").split("\\|");
+ String[] files = Cache.getProperty(Preferences.USER_DEFINED_COLOURS).split("\\|");
/*
* the property does not include the scheme name, it is in the file;
if (coloursFound.toString().length() > 1)
{
- Cache.setProperty("USER_DEFINED_COLOURS", coloursFound.toString());
+ Cache.setProperty(Preferences.USER_DEFINED_COLOURS, coloursFound.toString());
}
else
{
- Cache.applicationProperties.remove("USER_DEFINED_COLOURS");
+ Cache.removePropertyNoSave(Preferences.USER_DEFINED_COLOURS);
}
}
}
JComponent comp = (JComponent) super.getListCellRendererComponent(list,
value, index, isSelected, cellHasFocus);
- if (-1 < index && null != value && null != tooltips)
+ // BH 2019.07.07 restricting this to mouse moves over the selected target
+ if (isSelected && -1 < index && null != value && null != tooltips)
{
list.setToolTipText(tooltips.get(index));
}
}
quit = false; // signals the Threads that they should exit
- // Starting two seperate threads to read from the PipedInputStreams
+ // Starting two separate threads to read from the PipedInputStreams
//
reader = new Thread(this);
reader.setDaemon(true);
initConsole(false);
JalviewAppender jappender = new JalviewAppender();
jappender.setLayout(new SimpleLayout());
- JalviewAppender.setTextArea(textArea);
+ // BH 2019 JalviewAppender.setTextArea(textArea);
+ jappender.setTextArea(textArea);
org.apache.log4j.Logger.getRootLogger().addAppender(jappender);
}
import jalview.ext.ensembl.EnsemblInfo;
import jalview.ext.ensembl.EnsemblMap;
import jalview.io.gff.SequenceOntologyI;
-import jalview.structure.StructureSelectionManager;
import jalview.util.DBRefUtils;
import jalview.util.MapList;
import jalview.util.MappingUtils;
/*
* get display scheme (if any) to apply to features
*/
- FeatureSettingsModelI featureColourScheme = new SequenceFetcher()
+ FeatureSettingsModelI featureColourScheme = SequenceFetcher
+ .getInstance()
.getFeatureColourScheme(source);
AlignmentI xrefsAlignment = makeCrossReferencesAlignment(dataset,
*/
AlignFrame newFrame = new AlignFrame(xrefsAlignment,
AlignFrame.DEFAULT_WIDTH, AlignFrame.DEFAULT_HEIGHT);
- if (Cache.getDefault("HIDE_INTRONS", true))
+ if (Cache.getDefault(Preferences.HIDE_INTRONS, true))
{
newFrame.hideFeatureColumns(SequenceOntologyI.EXON, false);
}
return;
}
- Set<String> ensemblDivisions = new EnsemblInfo().getDivisions();
+ Set<String> ensemblDivisions = EnsemblInfo.getDivisions();
/*
* first look for direct dbrefs from sequence to Ensembl
copyAlignment
.setGapCharacter(alignFrame.viewport.getGapCharacter());
- StructureSelectionManager ssm = StructureSelectionManager
- .getStructureSelectionManager(Desktop.instance);
-
/*
* register any new mappings for sequence mouseover etc
* (will not duplicate any previously registered mappings)
*/
- ssm.registerMappings(dataset.getCodonFrames());
+ Desktop.getStructureSelectionManager()
+ .registerMappings(dataset.getCodonFrames());
if (copyAlignment.getHeight() <= 0)
{
.println(MessageManager.getString("label.couldnt_read_data"));
if (!Jalview.isHeadlessMode())
{
- JvOptionPane.showInternalMessageDialog(Desktop.desktop,
+ JvOptionPane.showInternalMessageDialog(Desktop.getDesktopPane(),
AppletFormatAdapter.getSupportedFormats(),
MessageManager.getString("label.couldnt_read_data"),
JvOptionPane.WARNING_MESSAGE);
} catch (IOException ex)
{
- JvOptionPane.showInternalMessageDialog(Desktop.desktop, MessageManager
+ JvOptionPane.showInternalMessageDialog(Desktop.getDesktopPane(), MessageManager
.formatMessage("label.couldnt_read_pasted_text", new String[]
{ ex.toString() }),
MessageManager.getString("label.error_parsing_text"),
try
{
af.setMaximum(
- jalview.bin.Cache.getDefault("SHOW_FULLSCREEN", false));
+ jalview.bin.Cache.getDefault(Preferences.SHOW_FULLSCREEN,
+ false));
} catch (Exception ex)
{
}
.println(MessageManager.getString("label.couldnt_read_data"));
if (!Jalview.isHeadlessMode())
{
- JvOptionPane.showInternalMessageDialog(Desktop.desktop,
+ JvOptionPane.showInternalMessageDialog(Desktop.getDesktopPane(),
AppletFormatAdapter.getSupportedFormats(),
MessageManager.getString("label.couldnt_read_data"),
JvOptionPane.WARNING_MESSAGE);
import jalview.api.AlignViewportI;
import jalview.api.AlignmentViewPanel;
+import jalview.api.StructureSelectionManagerProvider;
+import jalview.bin.ApplicationSingletonProvider;
+import jalview.bin.ApplicationSingletonProvider.ApplicationSingletonI;
import jalview.bin.Cache;
import jalview.bin.Jalview;
import jalview.gui.ImageExporter.ImageWriterI;
import jalview.io.IdentifyFile;
import jalview.io.JalviewFileChooser;
import jalview.io.JalviewFileView;
+import jalview.jbgui.GDesktop;
import jalview.jbgui.GSplitFrame;
import jalview.jbgui.GStructureViewer;
import jalview.project.Jalview2XML;
import jalview.util.Platform;
import jalview.util.UrlConstants;
import jalview.viewmodel.AlignmentViewport;
+import jalview.ws.jws1.Discoverer;
import jalview.ws.params.ParamManager;
import jalview.ws.utils.UrlDownloadClient;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileOutputStream;
-import java.io.FileWriter;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
-import java.util.HashMap;
import java.util.Hashtable;
import java.util.List;
import java.util.ListIterator;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JDesktopPane;
+import javax.swing.JFrame;
import javax.swing.JInternalFrame;
import javax.swing.JLabel;
import javax.swing.JMenuItem;
* @author $author$
* @version $Revision: 1.155 $
*/
-public class Desktop extends jalview.jbgui.GDesktop
+@SuppressWarnings("serial")
+public class Desktop extends GDesktop
implements DropTargetListener, ClipboardOwner, IProgressIndicator,
- jalview.api.StructureSelectionManagerProvider
+ StructureSelectionManagerProvider, ApplicationSingletonI
{
- private static int DEFAULT_MIN_WIDTH = 300;
- private static int DEFAULT_MIN_HEIGHT = 250;
+ private final static int DEFAULT_MIN_WIDTH = 300;
- private static int ALIGN_FRAME_DEFAULT_MIN_WIDTH = 600;
+ private final static int DEFAULT_MIN_HEIGHT = 250;
- private static int ALIGN_FRAME_DEFAULT_MIN_HEIGHT = 70;
+ private final static int ALIGN_FRAME_DEFAULT_MIN_WIDTH = 600;
- private static final String EXPERIMENTAL_FEATURES = "EXPERIMENTAL_FEATURES";
+ private final static int ALIGN_FRAME_DEFAULT_MIN_HEIGHT = 70;
- protected static final String CONFIRM_KEYBOARD_QUIT = "CONFIRM_KEYBOARD_QUIT";
-
- public static HashMap<String, FileWriter> savingFiles = new HashMap<>();
+ private final static String EXPERIMENTAL_FEATURES = "EXPERIMENTAL_FEATURES";
private JalviewChangeSupport changeSupport = new JalviewChangeSupport();
/**
* news reader - null if it was never started.
*/
- private BlogReader jvnews = null;
+ BlogReader jvnews = null;
private File projectFile;
listener);
}
- /** Singleton Desktop instance */
- public static Desktop instance;
-
- public static MyDesktopPane desktop;
+ public static MyDesktopPane getDesktopPane()
+ {
+ Desktop desktop = Desktop.getInstance();
+ return desktop == null ? null : desktop.desktopPane;
+ }
- public static MyDesktopPane getDesktop()
+ public static StructureSelectionManager getStructureSelectionManager()
{
- // BH 2018 could use currentThread() here as a reference to a
- // Hashtable<Thread, MyDesktopPane> in JavaScript
- return desktop;
+ return StructureSelectionManager
+ .getStructureSelectionManager(getInstance());
}
static int openFrameCount = 0;
static final int yOffset = 30;
- public static jalview.ws.jws1.Discoverer discoverer;
+ public Discoverer discoverer;
+
+ public Object[] jalviewClipboard;
+
+ public boolean internalCopy = false;
+
+ private static int fileLoadingCount = 0;
- public static Object[] jalviewClipboard;
+ public JInternalFrame conservationSlider;
- public static boolean internalCopy = false;
+ public JInternalFrame PIDSlider;
- static int fileLoadingCount = 0;
+ /**
+ * just an instance (for testng, probably); no actual frames
+ */
+ private boolean instanceOnly;
class MyDesktopManager implements DesktopManager
{
} catch (NullPointerException npe)
{
Point p = getMousePosition();
- instance.showPasteMenu(p.x, p.y);
+ showPasteMenu(p.x, p.y);
}
}
public void endDraggingFrame(JComponent f)
{
delegate.endDraggingFrame(f);
- desktop.repaint();
+ desktopPane.repaint();
}
@Override
public void endResizingFrame(JComponent f)
{
delegate.endResizingFrame(f);
- desktop.repaint();
+ desktopPane.repaint();
}
@Override
}
+ public MyDesktopPane desktopPane;
+
+ /**
+ * Answers an 'application scope' singleton instance of this class. Separate
+ * SwingJS 'applets' running in the same browser page will each have a
+ * distinct instance of Desktop.
+ *
+ * @return
+ */
+ public static Desktop getInstance()
+ {
+ return Jalview.isHeadlessMode() ? null
+ : (Desktop) ApplicationSingletonProvider
+ .getInstance(Desktop.class);
+ }
+
+ /**
+ * For testing.
+ *
+ * @param forInstance
+ */
+ public Desktop(boolean forInstance)
+ {
+
+ Cache.initLogger();
+ instanceOnly = true;
+ }
+
/**
- * Creates a new Desktop object.
+ * Private constructor enforces singleton pattern. It is called by reflection
+ * from ApplicationSingletonProvider.getInstance().
*/
- public Desktop()
+ @SuppressWarnings("unused")
+ private Desktop()
{
- super();
+ Cache.initLogger();
+ try
+ {
/**
* A note to implementors. It is ESSENTIAL that any activities that might
* block are spawned off as threads rather than waited for during this
* constructor.
*/
- instance = this;
if (!Platform.isJS())
{
doVamsasClientCheck();
}
-
+
doConfigureStructurePrefs();
setTitle("Jalview " + jalview.bin.Cache.getProperty("VERSION"));
- /*
- if (!Platform.isAMac())
- {
- // this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
- }
- else
- {
- this.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
- }
- */
-
- try
- {
- if (!Platform.isJS())
- /*
- * @j2sIgnore
- */
- {
- APQHandlers.setAPQHandlers(this);
- }
- } catch (Exception e)
- {
- System.out.println("Cannot set APQHandlers");
- // e.printStackTrace();
- } catch (Throwable t)
- {
- System.out.println("Cannot set APQHandlers");
- // t.printStackTrace();
- }
-
-
- addWindowListener(new WindowAdapter()
- {
-
- @Override
- public void windowClosing(WindowEvent ev)
- {
- quit();
- }
- });
-
+ setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
boolean selmemusage = jalview.bin.Cache.getDefault("SHOW_MEMUSAGE",
false);
-
boolean showjconsole = jalview.bin.Cache.getDefault("SHOW_JAVA_CONSOLE",
false);
- desktop = new MyDesktopPane(selmemusage);
-
+ desktopPane = new MyDesktopPane(selmemusage);
+
showMemusage.setSelected(selmemusage);
- desktop.setBackground(Color.white);
-
+ desktopPane.setBackground(Color.white);
getContentPane().setLayout(new BorderLayout());
// alternate config - have scrollbars - see notes in JAL-153
// JScrollPane sp = new JScrollPane();
// sp.getViewport().setView(desktop);
// getContentPane().add(sp, BorderLayout.CENTER);
-
+
// BH 2018 - just an experiment to try unclipped JInternalFrames.
if (Platform.isJS())
{
getRootPane().putClientProperty("swingjs.overflow.hidden", "false");
}
-
- getContentPane().add(desktop, BorderLayout.CENTER);
- desktop.setDragMode(JDesktopPane.OUTLINE_DRAG_MODE);
-
+
+ getContentPane().add(desktopPane, BorderLayout.CENTER);
+ desktopPane.setDragMode(JDesktopPane.OUTLINE_DRAG_MODE);
+
// This line prevents Windows Look&Feel resizing all new windows to maximum
// if previous window was maximised
- desktop.setDesktopManager(new MyDesktopManager(
+ desktopPane.setDesktopManager(new MyDesktopManager(
(Platform.isWindowsAndNotJS() ? new DefaultDesktopManager()
: Platform.isAMacAndNotJS()
? new AquaInternalFrameManager(
- desktop.getDesktopManager())
- : desktop.getDesktopManager())));
-
+ desktopPane.getDesktopManager())
+ : desktopPane.getDesktopManager())));
+
Rectangle dims = getLastKnownDimensions("");
if (dims != null)
{
int yPos = Math.max(5, (screenSize.height - 650) / 2);
setBounds(xPos, yPos, 900, 650);
}
-
+
if (!Platform.isJS())
/**
* Java only
* @j2sIgnore
*/
{
-
+
jconsole = new Console(this, showjconsole);
// add essential build information
jconsole.setHeader("Jalview Version: "
+ "Java version: " + System.getProperty("java.version") + "\n"
+ System.getProperty("os.arch") + " "
+ System.getProperty("os.name") + " "
- + System.getProperty("os.version")
- + (jalview.bin.Cache.getProperty("VERSION").equals("DEVELOPMENT")
- ? "\nJava path:"
- + System.getProperty(
- "java.home")
- + File.separator + "bin"
- + File.separator + "java"
- : ""));
-
+ + System.getProperty("os.version"));
+
showConsole(showjconsole);
-
+
showNews.setVisible(false);
-
+
experimentalFeatures.setSelected(showExperimental());
-
+
getIdentifiersOrgData();
-
+
checkURLLinks();
-
+
// Spawn a thread that shows the splashscreen
-
+
SwingUtilities.invokeLater(new Runnable()
{
@Override
new SplashScreen();
}
});
-
+
// Thread off a new instance of the file chooser - this reduces the time
- // it takes to open it later on.
+ // it
+ // takes to open it later on.
new Thread(new Runnable()
{
@Override
changeSupport.addJalviewPropertyChangeListener("services",
new PropertyChangeListener()
{
-
+
@Override
public void propertyChange(PropertyChangeEvent evt)
{
+ evt.getNewValue());
JalviewServicesChanged(evt);
}
-
+
});
-
+
}
-
- this.setDropTarget(new java.awt.dnd.DropTarget(desktop, this));
-
+
+ this.setDropTarget(new java.awt.dnd.DropTarget(desktopPane, this));
+
this.addWindowListener(new WindowAdapter()
{
@Override
quit();
}
});
-
+
MouseAdapter ma;
this.addMouseListener(ma = new MouseAdapter()
{
showPasteMenu(evt.getX(), evt.getY());
}
}
-
+
@Override
public void mouseReleased(MouseEvent evt)
{
}
}
});
- desktop.addMouseListener(ma);
-
+ desktopPane.addMouseListener(ma);
+ } catch (Throwable t)
+ {
+ t.printStackTrace();
+ }
}
/**
public void run()
{
Cache.log.debug("Downloading data from identifiers.org");
- UrlDownloadClient client = new UrlDownloadClient();
+ // UrlDownloadClient client = new UrlDownloadClient();
try
{
- client.download(IdOrgSettings.getUrl(),
+ UrlDownloadClient.download(IdOrgSettings.getUrl(),
IdOrgSettings.getDownloadLocation());
} catch (IOException e)
{
showNews(showNews.isSelected());
}
- void showNews(boolean visible)
+ protected void showNews(boolean visible)
{
Cache.log.debug((visible ? "Showing" : "Hiding") + " news.");
showNews.setSelected(visible);
public void run()
{
long now = System.currentTimeMillis();
- Desktop.instance.setProgressBar(
+ setProgressBar(
MessageManager.getString("status.refreshing_news"), now);
jvnews.refreshNews();
- Desktop.instance.setProgressBar(null, now);
+ setProgressBar(null, now);
jvnews.showNews();
}
}).start();
}
}
- void showPasteMenu(int x, int y)
+ protected void showPasteMenu(int x, int y)
{
JPopupMenu popup = new JPopupMenu();
JMenuItem item = new JMenuItem(
FileFormatI format = new IdentifyFile().identify(file,
DataSourceType.PASTE);
- new FileLoader().LoadFile(file, DataSourceType.PASTE, format);
+ new FileLoader().loadFile(file, DataSourceType.PASTE, format);
}
} catch (Exception ex)
int w, int h, boolean resizable, boolean ignoreMinSize)
{
+
// TODO: allow callers to determine X and Y position of frame (eg. via
// bounds object).
// TODO: consider fixing method to update entries in the window submenu with
// the current window title
frame.setTitle(title);
- if (frame.getWidth() < 1 || frame.getHeight() < 1)
+ if (w > 0 && (frame.getWidth() < 1 || frame.getHeight() < 1))
{
frame.setSize(w, h);
}
// A HEADLESS STATE WHEN NO DESKTOP EXISTS. MUST RETURN
// IF JALVIEW IS RUNNING HEADLESS
// ///////////////////////////////////////////////
- if (instance == null || (System.getProperty("java.awt.headless") != null
- && System.getProperty("java.awt.headless").equals("true")))
+ if (Jalview.isHeadlessMode() || Desktop.getInstance().instanceOnly)
{
return;
}
* add an entry for the new frame in the Window menu
* (and remove it when the frame is closed)
*/
- final JMenuItem menuItem = new JMenuItem(title);
+ JMenuItem menuItem = new JMenuItem(title);
frame.addInternalFrameListener(new InternalFrameAdapter()
{
@Override
public void internalFrameActivated(InternalFrameEvent evt)
{
- JInternalFrame itf = desktop.getSelectedFrame();
+ JInternalFrame itf = getDesktopPane().getSelectedFrame();
if (itf != null)
{
if (itf instanceof AlignFrame)
{
menuItem.removeActionListener(menuItem.getActionListeners()[0]);
}
- windowMenu.remove(menuItem);
+ Desktop.getInstance().windowMenu.remove(menuItem);
}
});
setKeyBindings(frame);
- desktop.add(frame);
+ getDesktopPane().add(frame);
- windowMenu.add(menuItem);
+ Desktop.getInstance().windowMenu.add(menuItem);
frame.toFront();
try
*/
private static void setKeyBindings(JInternalFrame frame)
{
- @SuppressWarnings("serial")
final Action closeAction = new AbstractAction()
{
@Override
KeyStroke ctrlWKey = KeyStroke.getKeyStroke(KeyEvent.VK_W,
InputEvent.CTRL_DOWN_MASK);
KeyStroke cmdWKey = KeyStroke.getKeyStroke(KeyEvent.VK_W,
- jalview.util.ShortcutKeyMaskExWrapper.getMenuShortcutKeyMaskEx());
+ Toolkit.getDefaultToolkit().getMenuShortcutKeyMask());
InputMap inputMap = frame
.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
{
if (!internalCopy)
{
- Desktop.jalviewClipboard = null;
+ Desktop.getInstance().jalviewClipboard = null;
}
internalCopy = false;
{
Platform.cacheFileData((File) file);
}
- new FileLoader().LoadFile(null, file, protocol, format);
+ new FileLoader().loadFile(null, file, protocol, format);
}
} catch (Exception ex)
{
String fileFormat = Cache.getProperty("DEFAULT_FILE_FORMAT");
JalviewFileChooser chooser = JalviewFileChooser
- .forRead(Cache.getProperty("LAST_DIRECTORY"), fileFormat, BackupFiles.getEnabled());
+ .forRead(Cache.getProperty("LAST_DIRECTORY"), fileFormat, true);
chooser.setFileView(new JalviewFileView());
chooser.setDialogTitle(
}
}
- new FileLoader().LoadFile(viewport, selectedFile,
+ new FileLoader().loadFile(viewport, selectedFile,
DataSourceType.FILE, format);
}
});
{
if (viewport != null)
{
- new FileLoader().LoadFile(viewport, url, DataSourceType.URL,
+ new FileLoader().loadFile(viewport, url, DataSourceType.URL,
FileFormat.Jalview);
}
else
{
- new FileLoader().LoadFile(url, DataSourceType.URL,
+ new FileLoader().loadFile(url, DataSourceType.URL,
FileFormat.Jalview);
}
}
{
String msg = MessageManager
.formatMessage("label.couldnt_locate", url);
- JvOptionPane.showInternalMessageDialog(Desktop.desktop, msg,
+ JvOptionPane.showInternalMessageDialog(Desktop.getDesktopPane(),
+ msg,
MessageManager.getString("label.url_not_found"),
JvOptionPane.WARNING_MESSAGE);
if (viewport != null)
{
- new FileLoader().LoadFile(viewport, url, DataSourceType.URL,
+ new FileLoader().loadFile(viewport, url, DataSourceType.URL,
format);
}
else
{
- new FileLoader().LoadFile(url, DataSourceType.URL, format);
+ new FileLoader().loadFile(url, DataSourceType.URL, format);
}
}
}
};
String dialogOption = MessageManager
.getString("label.input_alignment_from_url");
- JvOptionPane.newOptionDialog(desktop).setResponseHandler(0, action)
+ JvOptionPane.newOptionDialog(getDesktopPane())
+ .setResponseHandler(0, action)
.showInternalDialog(panel, dialogOption,
JvOptionPane.YES_NO_CANCEL_OPTION,
JvOptionPane.PLAIN_MESSAGE, null, options,
public void aboutMenuItem_actionPerformed(ActionEvent e)
{
// StringBuffer message = getAboutMessage(false);
- // JvOptionPane.showInternalMessageDialog(Desktop.desktop,
+ // JvOptionPane.showInternalMessageDialog(Desktop.getDesktop(),
//
// message.toString(), "About Jalview", JvOptionPane.INFORMATION_MESSAGE);
new Thread(new Runnable()
@Override
public void closeAll_actionPerformed(ActionEvent e)
{
+ if (desktopPane == null)
+ {
+ return;
+ }
// TODO show a progress bar while closing?
- JInternalFrame[] frames = desktop.getAllFrames();
+ JInternalFrame[] frames = desktopPane.getAllFrames();
for (int i = 0; i < frames.length; i++)
{
try
* reset state of singleton objects as appropriate (clear down session state
* when all windows are closed)
*/
- StructureSelectionManager ssm = StructureSelectionManager
- .getStructureSelectionManager(this);
- if (ssm != null)
- {
- ssm.resetAll();
- }
+ getStructureSelectionManager().resetAll();
}
@Override
@Override
protected void showMemusage_actionPerformed(ActionEvent e)
{
- desktop.showMemoryUsage(showMemusage.isSelected());
+ getDesktopPane().showMemoryUsage(showMemusage.isSelected());
}
/*
void reorderAssociatedWindows(boolean minimize, boolean close)
{
- JInternalFrame[] frames = desktop.getAllFrames();
+ JInternalFrame[] frames = getDesktopPane().getAllFrames();
if (frames == null || frames.length < 1)
{
return;
saveState_actionPerformed(true);
}
- private void setProjectFile(File choice)
+ protected void setProjectFile(File choice)
{
this.projectFile = choice;
}
"Jalview Project (old)" };
JalviewFileChooser chooser = new JalviewFileChooser(
Cache.getProperty("LAST_DIRECTORY"), suffix, desc,
- "Jalview Project", true, BackupFiles.getEnabled()); // last two booleans: allFiles,
+ "Jalview Project", true, true); // last two booleans: allFiles,
// allowBackupFiles
chooser.setFileView(new JalviewFileView());
chooser.setDialogTitle(MessageManager.getString("label.restore_state"));
{
Cache.log.error(
"Problems whilst loading project from " + choice, ex);
- JvOptionPane.showMessageDialog(Desktop.desktop,
+ JvOptionPane.showMessageDialog(Desktop.getDesktopPane(),
MessageManager.formatMessage(
"label.error_whilst_loading_project_from",
new Object[]
{
progressPanel = new JPanel(new GridLayout(1, 1));
totalProgressCount = 0;
- instance.getContentPane().add(progressPanel, BorderLayout.SOUTH);
+ getContentPane().add(progressPanel, BorderLayout.SOUTH);
}
JPanel thisprogress = new JPanel(new BorderLayout(10, 5));
JProgressBar progressBar = new JProgressBar();
((GridLayout) progressPanel.getLayout()).setRows(
((GridLayout) progressPanel.getLayout()).getRows() + 1);
++totalProgressCount;
- instance.validate();
+ validate();
return thisprogress;
}
*/
public static AlignmentPanel[] getAlignmentPanels(String alignmentId)
{
- if (Desktop.desktop == null)
+ if (Desktop.getDesktopPane() == null)
{
// no frames created and in headless mode
// TODO: verify that frames are recoverable when in headless mode
public static AlignmentViewport[] getViewports(String sequenceSetId)
{
List<AlignmentViewport> viewp = new ArrayList<>();
- if (desktop != null)
+ if (getDesktopPane() != null)
{
AlignFrame[] frames = Desktop.getAlignFrames();
{
source.viewport.setGatherViewsHere(true);
source.viewport.setExplodedGeometry(source.getBounds());
- JInternalFrame[] frames = desktop.getAllFrames();
+ JInternalFrame[] frames = getAllFrames();
String viewId = source.viewport.getSequenceSetId();
for (int t = 0; t < frames.length; t++)
String fle = chooser.getSelectedFile().toString();
if (!vamsasImport(chooser.getSelectedFile()))
{
- JvOptionPane.showInternalMessageDialog(Desktop.desktop,
+ JvOptionPane.showInternalMessageDialog(Desktop.getDesktopPane(),
MessageManager.formatMessage(
"label.couldnt_import_as_vamsas_session",
new Object[]
removeProgressPanel(progpanel);
if (warnmsg != null)
{
- JvOptionPane.showInternalMessageDialog(Desktop.desktop,
+ JvOptionPane.showInternalMessageDialog(Desktop.getDesktopPane(),
warnmsg, warnttl, JvOptionPane.ERROR_MESSAGE);
}
public JInternalFrame[] getAllFrames()
{
- return desktop.getAllFrames();
+ return desktopPane.getAllFrames();
}
/**
while (li.hasNext())
{
String link = li.next();
- if (link.contains(jalview.util.UrlConstants.SEQUENCE_ID)
+ if (link.contains(UrlConstants.SEQUENCE_ID)
&& !UrlConstants.isDefaultString(link))
{
check = true;
});
msgPanel.add(jcb);
- JvOptionPane.showMessageDialog(Desktop.desktop, msgPanel,
+ JvOptionPane.showMessageDialog(desktopPane, msgPanel,
MessageManager
.getString("label.SEQUENCE_ID_no_longer_used"),
JvOptionPane.WARNING_MESSAGE);
{
if (Jalview.isHeadlessMode())
{
- // Desktop.desktop is null in headless mode
- return new AlignFrame[] { Jalview.currentAlignFrame };
+ // Desktop.getDesktop() is null in headless mode
+ return new AlignFrame[] { Jalview.getCurrentAlignFrame() };
}
- JInternalFrame[] frames = Desktop.desktop.getAllFrames();
+ JInternalFrame[] frames = Desktop.getDesktopPane().getAllFrames();
if (frames == null)
{
*/
public GStructureViewer[] getJmols()
{
- JInternalFrame[] frames = Desktop.desktop.getAllFrames();
+ JInternalFrame[] frames = Desktop.getDesktopPane().getAllFrames();
if (frames == null)
{
} catch (Exception ex)
{
jalview.bin.Cache.log.error("Groovy Shell Creation failed.", ex);
- JvOptionPane.showInternalMessageDialog(Desktop.desktop,
+ JvOptionPane.showInternalMessageDialog(desktopPane,
MessageManager.getString("label.couldnt_create_groovy_shell"),
MessageManager.getString("label.groovy_support_failed"),
/**
* Open the Groovy console
*/
- void openGroovyConsole()
+ private void openGroovyConsole()
{
if (groovyConsole == null)
{
{
getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW)
.put(KeyStroke.getKeyStroke(KeyEvent.VK_Q,
- jalview.util.ShortcutKeyMaskExWrapper.getMenuShortcutKeyMaskEx()),
+ Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()),
"Quit");
getRootPane().getActionMap().put("Quit", new AbstractAction()
{
progressBarHandlers = new Hashtable<>();
}
- if (progressBars.get(Long.valueOf(id)) != null)
+ if (progressBars.get(new Long(id)) != null)
{
- JPanel panel = progressBars.remove(Long.valueOf(id));
- if (progressBarHandlers.contains(Long.valueOf(id)))
+ JPanel panel = progressBars.remove(new Long(id));
+ if (progressBarHandlers.contains(new Long(id)))
{
- progressBarHandlers.remove(Long.valueOf(id));
+ progressBarHandlers.remove(new Long(id));
}
removeProgressPanel(panel);
}
else
{
- progressBars.put(Long.valueOf(id), addProgressPanel(message));
+ progressBars.put(new Long(id), addProgressPanel(message));
}
}
final IProgressIndicatorHandler handler)
{
if (progressBarHandlers == null
- || !progressBars.containsKey(Long.valueOf(id)))
+ || !progressBars.containsKey(new Long(id)))
{
throw new Error(MessageManager.getString(
"error.call_setprogressbar_before_registering_handler"));
}
- progressBarHandlers.put(Long.valueOf(id), handler);
- final JPanel progressPanel = progressBars.get(Long.valueOf(id));
+ progressBarHandlers.put(new Long(id), handler);
+ final JPanel progressPanel = progressBars.get(new Long(id));
if (handler.canCancel())
{
JButton cancel = new JButton(
*/
public static AlignFrame getAlignFrameFor(AlignViewportI viewport)
{
- if (desktop != null)
+ if (getDesktopPane() != null)
{
AlignmentPanel[] aps = getAlignmentPanels(
viewport.getSequenceSetId());
// todo: changesupport handlers need to be transferred
if (discoverer == null)
{
- discoverer = new jalview.ws.jws1.Discoverer();
- // register PCS handler for desktop.
+ discoverer = Discoverer.getInstance();
+ // register PCS handler for getDesktop().
discoverer.addPropertyChangeListener(changeSupport);
}
// JAL-940 - disabled JWS1 service configuration - always start discoverer
if (Cache.getDefault("SHOW_JWS2_SERVICES", true))
{
- t2 = jalview.ws.jws2.Jws2Discoverer.getDiscoverer()
+ t2 = jalview.ws.jws2.Jws2Discoverer.getInstance()
.startDiscoverer(changeSupport);
}
Thread t3 = null;
{
if (evt.getNewValue() == null || evt.getNewValue() instanceof Vector)
{
- final String ermsg = jalview.ws.jws2.Jws2Discoverer.getDiscoverer()
+ final String ermsg = jalview.ws.jws2.Jws2Discoverer.getInstance()
.getErrorMessages();
if (ermsg != null)
{
*
* jd.waitForInput();
*/
- JvOptionPane.showConfirmDialog(Desktop.desktop,
+ JvOptionPane.showConfirmDialog(Desktop.getDesktopPane(),
new JLabel("<html><table width=\"450\"><tr><td>"
+ ermsg + "</td></tr></table>"
+ "<p>It may be that you have invalid JABA URLs<br/>in your web service preferences,"
}
}
- private Runnable serviceChangedDialog = null;
+ Runnable serviceChangedDialog = null;
/**
* start a thread to open a URL in the configured browser. Pops up a warning
*/
public static void showUrl(final String url)
{
- showUrl(url, Desktop.instance);
+ showUrl(url, Desktop.getInstance());
}
/**
.formatMessage("status.opening_params", new Object[]
{ url }), this.hashCode());
}
- jalview.util.BrowserLauncher.openURL(url);
+ BrowserLauncher.openURL(url);
} catch (Exception ex)
{
- JvOptionPane.showInternalMessageDialog(Desktop.desktop,
+ JvOptionPane.showInternalMessageDialog(Desktop.getDesktopPane(),
MessageManager
.getString("label.web_browser_not_found_unix"),
MessageManager.getString("label.web_browser_not_found"),
}).start();
}
- public static WsParamSetManager wsparamManager = null;
+ private WsParamSetManager wsparamManager = null;
public static ParamManager getUserParameterStore()
{
- if (wsparamManager == null)
+ Desktop d = Desktop.getInstance();
+ if (d.wsparamManager == null)
{
- wsparamManager = new WsParamSetManager();
+ d.wsparamManager = new WsParamSetManager();
}
- return wsparamManager;
+ return d.wsparamManager;
}
/**
/**
* flag indicating if dialogExecutor should try to acquire a permit
*/
- private volatile boolean dialogPause = true;
+ volatile boolean dialogPause = true;
/**
* pause the queue
*/
- private java.util.concurrent.Semaphore block = new Semaphore(0);
+ java.util.concurrent.Semaphore block = new Semaphore(0);
+
+ private groovy.ui.Console groovyConsole;
- private static groovy.ui.Console groovyConsole;
+ public StructureViewer lastTargetedView;
/**
* add another dialog thread to the queue
{
}
}
- if (instance == null)
+ if (instanceOnly)
{
return;
}
String topViewId = myTopFrame.viewport.getSequenceSetId();
String bottomViewId = myBottomFrame.viewport.getSequenceSetId();
- JInternalFrame[] frames = desktop.getAllFrames();
+ JInternalFrame[] frames = desktopPane.getAllFrames();
for (JInternalFrame frame : frames)
{
if (frame instanceof SplitFrame && frame != source)
public static groovy.ui.Console getGroovyConsole()
{
- return groovyConsole;
+ Desktop desktop = Desktop.getInstance();
+ return desktop == null ? null : desktop.groovyConsole;
}
/**
* - the payload from the drop event
* @throws Exception
*/
+ @SuppressWarnings("unchecked")
public static void transferFromDropTarget(List<Object> files,
List<DataSourceType> protocols, DropTargetDropEvent evt,
Transferable t) throws Exception
{
// Works on Windows and MacOSX
Cache.log.debug("Drop handled as javaFileListFlavor");
- for (Object file : (List) t
+ for (Object file : (List<Object>) t
.getTransferData(DataFlavor.javaFileListFlavor))
{
files.add(file);
Class<? extends StructureViewerBase> structureViewerClass)
{
List<StructureViewerBase> result = new ArrayList<>();
- JInternalFrame[] frames = Desktop.instance.getAllFrames();
+ JInternalFrame[] frames = getAllFrames();
for (JInternalFrame frame : frames)
{
}
return result;
}
+
}
*
* @param alignPanel
* @param seqs
+ * one or more Sequence if create is true; a singleton if create is
+ * false
* @param feats
+ * a list of new SequenceFeature instances if create is true,
+ * otherwise a list of known features for this sequence at this
+ * position
* @param create
* if true create a new feature, else amend or delete an existing
* feature
updateColourButton(mainPanel, colour, featureColour);
};
};
- JalviewColourChooser.showColourChooser(Desktop.getDesktop(),
+ JalviewColourChooser.showColourChooser(Desktop.getDesktopPane(),
title, featureColour.getColour(), listener);
}
else
* set dialog action handlers for OK (create/Amend) and Cancel options
* also for Delete if applicable (when amending features)
*/
- JvOptionPane dialog = JvOptionPane.newOptionDialog(Desktop.desktop)
+ JvOptionPane dialog = JvOptionPane.newOptionDialog(Desktop.getDesktopPane())
.setResponseHandler(0, okAction).setResponseHandler(2, cancelAction);
if (!forCreate)
{
{
boolean useLastDefaults = features.get(0).getType() == null;
+ @Override
public void run()
{
final String enteredType = name.getText().trim();
{
Runnable deleteAction = new Runnable()
{
+ @Override
public void run()
{
SequenceFeature sf = features.get(featureIndex);
String featureGroup = group.getText();
+ @Override
public void run()
{
final String enteredType = name.getText().trim();
*/
public class FeatureRenderer
extends jalview.renderer.seqfeatures.FeatureRenderer
+ implements jalview.api.FeatureRenderer
{
Color resBoxColour;
{
super(alignPanel.av);
this.ap = alignPanel;
- if (alignPanel.getSeqPanel() != null
- && alignPanel.getSeqPanel().seqCanvas != null
- && alignPanel.getSeqPanel().seqCanvas.fr != null)
+ SeqPanel sp = alignPanel.getSeqPanel();
+ if (sp != null && sp.seqCanvas != null && sp.seqCanvas.fr != null)
{
- transferSettings(alignPanel.getSeqPanel().seqCanvas.fr);
+ transferSettings(sp.seqCanvas.fr);
}
}
}
data[dataIndex][FILTER_COLUMN] = featureFilter == null
? new FeatureMatcherSet()
: featureFilter;
- data[dataIndex][SHOW_COLUMN] = Boolean.valueOf(
+ data[dataIndex][SHOW_COLUMN] = new Boolean(
af.getViewport().getFeaturesDisplayed().isVisible(type));
dataIndex++;
displayableTypes.remove(type);
data[dataIndex][FILTER_COLUMN] = featureFilter == null
? new FeatureMatcherSet()
: featureFilter;
- data[dataIndex][SHOW_COLUMN] = Boolean.valueOf(true);
+ data[dataIndex][SHOW_COLUMN] = new Boolean(true);
dataIndex++;
displayableTypes.remove(type);
}
import jalview.api.AlignmentViewPanel;
import jalview.api.FeatureColourI;
-import jalview.bin.Cache;
import jalview.datamodel.GraphLine;
import jalview.datamodel.features.FeatureAttributes;
import jalview.datamodel.features.FeatureAttributes.Datatype;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
+import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JRadioButton;
import javax.swing.JSlider;
import javax.swing.JTextField;
-import javax.swing.border.EmptyBorder;
import javax.swing.border.LineBorder;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
JPanel maxColour = new JPanel();
- private JComboBox<Object> threshold = new JComboBox<>();
+ private JComboBox<String> threshold = new JComboBox<>();
JSlider slider = new JSlider();
/*
* choice of option for 'colour for no value'
*/
- private JComboBox<Object> noValueCombo;
+ private JComboBox<String> noValueCombo;
/*
* choice of what to colour by text (Label or attribute)
*/
- private JComboBox<Object> colourByTextCombo;
+ private JComboBox<String> colourByTextCombo;
/*
* choice of what to colour by range (Score or attribute)
*/
- private JComboBox<Object> colourByRangeCombo;
+ private JComboBox<String> colourByRangeCombo;
private JRadioButton andFilters;
* @param withRange
* @param withText
*/
- protected JComboBox<Object> populateAttributesDropdown(
+ protected JComboBox<String> populateAttributesDropdown(
List<String[]> attNames, boolean withRange, boolean withText)
{
List<String> displayAtts = new ArrayList<>();
tooltips.add(desc == null ? "" : desc);
}
- // now convert String List to Object List for buildComboWithTooltips
- List<Object> displayAttsObjects = new ArrayList<>(displayAtts);
- JComboBox<Object> attCombo = JvSwingUtils
- .buildComboWithTooltips(displayAttsObjects, tooltips);
-
+ JComboBox<String> attCombo = JvSwingUtils
+ .buildComboWithTooltips(displayAtts, tooltips);
+
return attCombo;
}
* drop-down choice of attribute, with description as a tooltip
* if we can obtain it
*/
- final JComboBox<Object> attCombo = populateAttributesDropdown(attNames,
- true, true);
+ JComboBox<String> attCombo = populateAttributesDropdown(attNames, true,
+ true);
String filterBy = setSelectedAttribute(attCombo, filter);
JComboBox<Condition> condCombo = new JComboBox<>();
if (!patternField.isEnabled()
|| (pattern != null && pattern.trim().length() > 0))
{
- JButton removeCondition = new JButton("\u2717"); // Dingbats cursive x
- removeCondition.setBorder(new EmptyBorder(0, 0, 0, 0));
+ JButton removeCondition = new JButton("\u2717")
+ {
+ @Override
+ public void paint(Graphics g)
+ {
+ g.setColor(Color.black);
+ g.drawString("\u2717", 2, 14); // Dingbats cursive x
+ }
+ };
removeCondition.setBackground(Color.WHITE);
+ removeCondition.setOpaque(true);
removeCondition.setPreferredSize(new Dimension(23, 17));
- removeCondition.setToolTipText(
- MessageManager.getString("label.delete_condition"));
- removeCondition.setBorder(new EmptyBorder(0, 0, 0, 0));
+ removeCondition
+ .setToolTipText(MessageManager.getString("label.delete_row"));
removeCondition.addActionListener(new ActionListener()
{
@Override
* @param attCombo
* @param filter
*/
- private String setSelectedAttribute(JComboBox<Object> attCombo,
+ private String setSelectedAttribute(JComboBox<String> attCombo,
FeatureMatcherI filter)
{
String item = null;
* @param valueField
* @param filterIndex
*/
- protected boolean updateFilter(JComboBox<Object> attCombo,
+ protected boolean updateFilter(JComboBox<String> attCombo,
JComboBox<Condition> condCombo, JTextField valueField,
int filterIndex)
{
- String attName;
- try
- {
- attName = (String) attCombo.getSelectedItem();
- } catch (Exception e)
- {
- Cache.log.error("Problem casting Combo box entry to String");
- attName = attCombo.getSelectedItem().toString();
- }
+ String attName = (String) attCombo.getSelectedItem();
Condition cond = (Condition) condCombo.getSelectedItem();
String pattern = valueField.getText().trim();
*/
boolean getFocusedViewport()
{
- if (focusfixed || Desktop.desktop == null)
+ if (focusfixed || Desktop.getDesktopPane() == null)
{
if (ap != null && av != null)
{
}
// now checks further down the window stack to fix bug
// https://mantis.lifesci.dundee.ac.uk/view.php?id=36008
- JInternalFrame[] frames = Desktop.desktop.getAllFrames();
+ JInternalFrame[] frames = Desktop.getDesktopPane().getAllFrames();
for (int f = 0; f < frames.length; f++)
{
JInternalFrame alignFrame = frames[f];
{
if (ap.getOverviewPanel() != null)
{
- ap.getOverviewPanel().updateOverviewImage();
+ // changes size of rectangle
+ // BH 2019.07.29 -- updateOverviewImage forces a redraw, but all we are
+ // doing is changing the box size.
+
+ ap.getOverviewPanel().repaint();// updateOverviewImage();
}
}
}
@Override
public void defaultButton_actionPerformed()
{
- Cache.setProperty("FONT_NAME", fontName.getSelectedItem().toString());
- Cache.setProperty("FONT_STYLE", fontStyle.getSelectedIndex() + "");
- Cache.setProperty("FONT_SIZE", fontSize.getSelectedItem().toString());
- Cache.setProperty("ANTI_ALIAS",
+ Cache.setProperty(Preferences.FONT_NAME, fontName.getSelectedItem().toString());
+ Cache.setProperty(Preferences.FONT_STYLE, fontStyle.getSelectedIndex() + "");
+ Cache.setProperty(Preferences.FONT_SIZE, fontSize.getSelectedItem().toString());
+ Cache.setProperty(Preferences.ANTI_ALIAS,
Boolean.toString(smoothFont.isSelected()));
Cache.setProperty(Preferences.SCALE_PROTEIN_TO_CDNA,
Boolean.toString(scaleAsCdna.isSelected()));
@Override
public void propertyChange(PropertyChangeEvent evt)
{
+ // BH just clarifying logic
String propertyName = evt.getPropertyName();
- if (propertyName.equals(ViewportRanges.STARTSEQ)
- || (av.getWrapAlignment()
- && propertyName.equals(ViewportRanges.STARTRES)))
- {
+ switch (propertyName) {
+ case ViewportRanges.STARTSEQ:
fastPaint((int) evt.getNewValue() - (int) evt.getOldValue());
- }
- else if (propertyName.equals(ViewportRanges.STARTRESANDSEQ))
- {
+ return;
+ case ViewportRanges.STARTRES:
+ if (av.getWrapAlignment())
+ {
+ fastPaint((int) evt.getNewValue() - (int) evt.getOldValue());
+ }
+ return;
+ case ViewportRanges.STARTRESANDSEQ:
fastPaint(((int[]) evt.getNewValue())[1]
- ((int[]) evt.getOldValue())[1]);
- }
- else if (propertyName.equals(ViewportRanges.MOVE_VIEWPORT))
- {
+ return;
+ case ViewportRanges.MOVE_VIEWPORT:
repaint();
+ return;
+ case ViewportRanges.ENDRES:
+ case ViewportRanges.ENDSEQ:
+ // ignore ??
+ return;
}
+// BH 2019.07.27 was:
+// if (propertyName.equals(ViewportRanges.STARTSEQ)
+// || (av.getWrapAlignment()
+// && propertyName.equals(ViewportRanges.STARTRES)))
+// {
+// fastPaint((int) evt.getNewValue() - (int) evt.getOldValue());
+// }
+// else if (propertyName.equals(ViewportRanges.STARTRESANDSEQ))
+// {
+// fastPaint(((int[]) evt.getNewValue())[1]
+// - ((int[]) evt.getOldValue())[1]);
+// }
+// else if (propertyName.equals(ViewportRanges.MOVE_VIEWPORT))
+// {
+// repaint();
+ // }
}
}
jalview.util.BrowserLauncher.openURL(url);
} catch (Exception ex)
{
- JvOptionPane.showInternalMessageDialog(Desktop.desktop,
+ JvOptionPane.showInternalMessageDialog(Desktop.getDesktopPane(),
MessageManager.getString("label.web_browser_not_found_unix"),
MessageManager.getString("label.web_browser_not_found"),
JvOptionPane.WARNING_MESSAGE);
}
PopupMenu pop = new PopupMenu(alignPanel, sq, features,
- Preferences.getGroupURLLinks());
+ Preferences.getGroupURLLinks() // empty list; not implemented
+ );
pop.show(this, e.getX(), e.getY());
}
import java.awt.Color;
import java.awt.Cursor;
-import java.awt.Graphics;
+import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
-import java.awt.event.MouseListener;
-import java.awt.event.MouseMotionListener;
import javax.swing.JPanel;
* @author $author$
* @version $Revision$
*/
+@SuppressWarnings("serial")
public class IdwidthAdjuster extends JPanel
- implements MouseListener, MouseMotionListener
{
- boolean active = false;
int oldX = 0;
- AlignmentPanel ap;
-
/**
- * Creates a new IdwidthAdjuster object.
+ * Creates a new IdwidthAdjuster object above the id panel that can be dragged
+ * to change the panel's width
*
* @param ap
- * DOCUMENT ME!
- */
- public IdwidthAdjuster(AlignmentPanel ap)
- {
- this.ap = ap;
- setBackground(Color.white);
- addMouseListener(this);
- addMouseMotionListener(this);
- }
-
- /**
- * DOCUMENT ME!
- *
- * @param evt
- * DOCUMENT ME!
- */
- @Override
- public void mousePressed(MouseEvent evt)
- {
- oldX = evt.getX();
- }
-
- /**
- * DOCUMENT ME!
- *
- * @param evt
- * DOCUMENT ME!
- */
- @Override
- public void mouseReleased(MouseEvent evt)
- {
- active = false;
- repaint();
-
- /*
- * If in a SplitFrame with co-scaled alignments, set the other's id width to
- * match
- */
- final AlignViewportI viewport = ap.getAlignViewport();
- if (viewport.getCodingComplement() != null
- && viewport.isScaleProteinAsCdna())
- {
- viewport.getCodingComplement().setIdWidth(viewport.getIdWidth());
- SplitFrame sf = (SplitFrame) ap.alignFrame.getSplitViewContainer();
- sf.repaint();
- }
-
- }
-
- /**
- * DOCUMENT ME!
- *
- * @param evt
- * DOCUMENT ME!
- */
- @Override
- public void mouseEntered(MouseEvent evt)
- {
- active = true;
- repaint();
- }
-
- /**
- * DOCUMENT ME!
+ * The associated AlignmentPanel
*
- * @param evt
- * DOCUMENT ME!
*/
- @Override
- public void mouseExited(MouseEvent evt)
- {
- active = false;
- repaint();
- }
-
- /**
- * DOCUMENT ME!
- *
- * @param evt
- * DOCUMENT ME!
- */
- @Override
- public void mouseDragged(MouseEvent evt)
+ public IdwidthAdjuster(AlignmentPanel ap)
{
- active = true;
+ // BH 2019.07.01 no need for overridden paintComponent, especially as it was
+ // overriding paint(g) so
+ // allowing strange component painting in its place.
- final AlignViewportI viewport = ap.getAlignViewport();
- int curwidth = viewport.getIdWidth();
- int dif = evt.getX() - oldX;
-
- final int newWidth = curwidth + dif;
- if ((newWidth > 20) || (dif > 0))
- {
- viewport.setIdWidth(newWidth);
-
- ap.paintAlignment(true, false);
- }
-
- oldX = evt.getX();
- }
-
- /**
- * DOCUMENT ME!
- *
- * @param evt
- * DOCUMENT ME!
- */
- @Override
- public void mouseMoved(MouseEvent evt)
- {
- }
+ setBackground(Color.white);
+ setOpaque(true);
- /**
- * DOCUMENT ME!
- *
- * @param evt
- * DOCUMENT ME!
- */
- @Override
- public void mouseClicked(MouseEvent evt)
- {
- }
+ setCursor(Cursor.getPredefinedCursor(Cursor.W_RESIZE_CURSOR));
- /**
- * DOCUMENT ME!
- *
- * @param g
- * DOCUMENT ME!
- */
- @Override
- public void paintComponent(Graphics g)
- {
- g.setColor(Color.white);
- g.fillRect(0, 0, getWidth(), getHeight());
+ // BH 2019.07.01 MouseAdapter is cleaner - no need for fields active or ap
- if (active)
+ MouseAdapter ma = (new MouseAdapter()
{
- setCursor(Cursor.getPredefinedCursor(Cursor.W_RESIZE_CURSOR));
- }
+ @Override
+ public void mousePressed(MouseEvent evt)
+ {
+ oldX = evt.getX();
+ }
+
+ @Override
+ public void mouseDragged(MouseEvent evt)
+ {
+ AlignViewportI viewport = ap.getAlignViewport();
+ int curwidth = viewport.getIdWidth();
+ int dif = evt.getX() - oldX;
+ int newWidth = curwidth + dif;
+ if ((newWidth > 20) || (dif > 0))
+ {
+ viewport.setIdWidth(newWidth);
+ ap.paintAlignment(true, false);
+ }
+ oldX = evt.getX();
+ }
+
+ @Override
+ public void mouseReleased(MouseEvent evt)
+ {
+
+ // If in a SplitFrame with co-scaled alignments, set the other's id
+ // width to match
+
+ AlignViewportI viewport = ap.getAlignViewport();
+ if (viewport.getCodingComplement() != null
+ && viewport.isScaleProteinAsCdna())
+ {
+ viewport.getCodingComplement().setIdWidth(viewport.getIdWidth());
+ SplitFrame sf = (SplitFrame) ap.alignFrame
+ .getSplitViewContainer();
+ sf.repaint();
+ }
+
+ }
+
+ });
+ addMouseListener(ma);
+ addMouseMotionListener(ma);
}
}
public class JalviewAppender extends WriterAppender
{
- static private JTextArea jTextArea = null;
+ // BH 2019 was static
+
+ private JTextArea jTextArea = null;
/** Set the target JTextArea for the logging information to appear. */
- static public void setTextArea(JTextArea jTextArea)
+ public void setTextArea(JTextArea jTextArea)
{
- JalviewAppender.jTextArea = jTextArea;
+ this.jTextArea = jTextArea;
}
/**
* Format and then append the loggingEvent to the stored JTextArea.
*/
+ @Override
public void append(LoggingEvent loggingEvent)
{
final String message = this.layout.format(loggingEvent);
// Append formatted message to textarea using the Swing Thread.
SwingUtilities.invokeLater(new Runnable()
{
+ @Override
public void run()
{
if (jTextArea != null)
protected void initDialogFrame(Container content, boolean modal,
boolean block, String title, int width, int height)
{
-
- frame = new JDialog(Desktop.instance, modal);
+ Desktop desktop = Desktop.getInstance();
+ frame = new JDialog(desktop, modal);
frame.setTitle(title);
- if (Desktop.instance != null)
+ if (desktop != null)
{
- Rectangle deskr = Desktop.instance.getBounds();
+ Rectangle deskr = desktop.getBounds();
frame.setBounds(new Rectangle((int) (deskr.getCenterX() - width / 2),
(int) (deskr.getCenterY() - height / 2), width, height));
}
*/
public final class JvSwingUtils
{
+ public static final String HTML_PREFIX = "<html><div style=\"width:350px;white-space:pre-wrap;padding:2px;overflow-wrap:break-word;\">";
+
+
/**
* wrap a bare html safe string to around 60 characters per line using a CSS
* style class specifying word-wrap and break-word
*
* @param enclose
- * if true, add <html> wrapper tags
+ * if true, add <html> wrapper tags (currently false for only
+ * two references -- both in Jws2Discoverer --
* @param ttext
*
* @return
"Tootip text to format must not be null!");
ttext = ttext.trim();
boolean maxLengthExceeded = false;
-
- if (ttext.contains("<br>"))
+ boolean isHTML = ttext.startsWith("<html>");
+ if (isHTML)
+ {
+ ttext = ttext.substring(6);
+ }
+ if (ttext.endsWith("</html>"))
+ {
+ isHTML = true;
+ ttext = ttext.substring(0, ttext.length() - 7);
+ }
+ boolean hasBR = ttext.contains("<br>");
+ enclose |= isHTML || hasBR;
+ if (hasBR)
{
String[] htmllines = ttext.split("<br>");
for (String line : htmllines)
{
return enclose ? "<html>" + ttext + "</html>" : ttext;
}
-
- return (enclose ? "<html>" : "")
-
- // BH 2018
-
- + "<style> div.ttip {width:350px;white-space:pre-wrap;padding:2px;overflow-wrap:break-word;}</style><div class=\"ttip\">"
-
-// + "<style> p.ttip {width:350px;margin:-14px 0px -14px 0px;padding:2px;overflow-wrap:break-word;}"
-// + "</style><p class=\"ttip\">"
-
+ // BH 2018,2019
+ return (enclose
+ ? HTML_PREFIX
+ ttext
-
- + " </div>"
-// + "</p>"
- + ((enclose ? "</html>" : ""));
+ + "</div></html>"
+ : ttext);
}
* @param entries
* @param tooltips
*/
- public static JComboBox<Object> buildComboWithTooltips(
- List<Object> entries, List<String> tooltips)
+ public static JComboBox<String> buildComboWithTooltips(
+ List<String> entries, List<String> tooltips)
{
- JComboBox<Object> combo = new JComboBox<>();
+ JComboBox<String> combo = new JComboBox<>();
final ComboBoxTooltipRenderer renderer = new ComboBoxTooltipRenderer();
combo.setRenderer(renderer);
- for (Object attName : entries)
+ for (String attName : entries)
{
combo.addItem(attName);
}
ex.printStackTrace();
}
- dialog = JvOptionPane.newOptionDialog(Desktop.desktop);
+ dialog = JvOptionPane.newOptionDialog(Desktop.getDesktopPane());
}
/**
}
else
{
- Cache.applicationProperties.remove(preferencesKey);
+ Cache.removePropertyNoSave(preferencesKey);
}
}
+++ /dev/null
-/*
- * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
- * Copyright (C) $$Year-Rel$$ The Jalview Authors
- *
- * This file is part of Jalview.
- *
- * Jalview is free software: you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation, either version 3
- * of the License, or (at your option) any later version.
- *
- * Jalview is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty
- * of MERCHANTABILITY or FITNESS FOR A PARTICULAR
- * PURPOSE. See the GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with Jalview. If not, see <http://www.gnu.org/licenses/>.
- * The Jalview Authors are detailed in the 'AUTHORS' file.
- */
-package jalview.gui;
-
-import java.awt.BorderLayout;
-import java.awt.Color;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-
-import javax.swing.JButton;
-import javax.swing.JFrame;
-import javax.swing.JLabel;
-import javax.swing.JPanel;
-
-public class MenuChooser implements ActionListener
-{
- public static boolean protein;
-
- private JFrame choosemenu = new JFrame("Animation");
-
- private JButton bouton = new JButton("bouton 1");
-
- private JButton bouton2 = new JButton("bouton 2");
-
- private JPanel container = new JPanel();
-
- private JLabel label = new JLabel("Le JLabel");
-
- public MenuChooser()
- {
-
- choosemenu.setSize(300, 300);
- choosemenu.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
- choosemenu.setLocationRelativeTo(null);
-
- container.setBackground(Color.white);
- container.setLayout(new BorderLayout());
-
- // On ajoute notre Fenetre à la liste des auditeurs de notre Bouton
- bouton.addActionListener(this);
- bouton2.addActionListener(this);
-
- JPanel south = new JPanel();
- south.add(bouton);
- south.add(bouton2);
- container.add(south, BorderLayout.SOUTH);
-
- // On change la couleur de police
- label.setForeground(Color.blue);
- // Et on change l'alignement du texte grâce aux attributs static de la
- // classe JLabel
- label.setHorizontalAlignment(JLabel.CENTER);
-
- container.add(label, BorderLayout.NORTH);
-
- choosemenu.setContentPane(container);
- choosemenu.setVisible(true);
-
- }
-
- // ...
-
- // *******************************************************************************
- // LA VOILAAAAAAAAAAAAAA
- // *******************************************************************************
- /**
- * C'est la méthode qui sera appelée lors d'un clic sur notre bouton
- */
- public void actionPerformed(ActionEvent arg0)
- {
-
- if (arg0.getSource() == bouton)
- protein = false;
- label.setText("RNA menu");
-
- if (arg0.getSource() == bouton2)
- label.setText("Protein menu");
- protein = true;
- }
-
-}
public OOMWarning(String string, OutOfMemoryError oomerror)
{
- this(string, oomerror, Desktop.desktop);
+ this(string, oomerror, Desktop.getDesktopPane());
}
@Override
import jalview.api.AlignViewportI;
import jalview.bin.Cache;
+import jalview.datamodel.AlignmentI;
import jalview.renderer.OverviewRenderer;
import jalview.renderer.OverviewResColourFinder;
import jalview.viewmodel.OverviewDimensions;
import javax.swing.JPanel;
+@SuppressWarnings("serial")
public class OverviewCanvas extends JPanel
{
private static final Color TRANS_GREY = new Color(100, 100, 100, 25);
private volatile boolean updaterunning = false;
- private boolean dispose = false;
+ private boolean disposed = false;
- private BufferedImage miniMe;
-
- private BufferedImage lastMiniMe = null;
+ BufferedImage lastMiniMe = null;
// Can set different properties in this seqCanvas than
// main visible SeqCanvas
private ProgressPanel progressPanel;
- public OverviewCanvas(OverviewDimensions overviewDims,
+ private boolean showSequenceFeatures;
+
+ private boolean showAnnotation;
+
+ private jalview.api.FeatureRenderer featureRenderer;
+
+ private OverviewPanel panel;
+
+ private boolean showProgress;
+
+ public OverviewCanvas(OverviewPanel panel,
+ OverviewDimensions overviewDims,
AlignViewportI alignvp, ProgressPanel pp)
{
+ this.panel = panel;
od = overviewDims;
+ lastMiniMe = null;
av = alignvp;
progressPanel = pp;
-
+ showProgress = (pp != null);
sr = new SequenceRenderer(av);
sr.renderGaps = false;
fr = new jalview.renderer.seqfeatures.FeatureRenderer(av);
cf = new OverviewResColourFinder(useLegacy, gapCol, hiddenCol);
setSize(od.getWidth(), od.getHeight());
+ setPreferredSize(getSize()); // BH 2019.07.29 added
}
/**
public void resetOviewDims(OverviewDimensions overviewDims)
{
od = overviewDims;
+ lastMiniMe = null;
}
/**
{
if (updaterunning)
{
- restart = true;
- if (or != null)
- {
- or.setRedraw(true);
- }
+ setRestart("restartDraw");
}
else
{
updaterunning = true;
+ restart = false;
}
return restart;
}
}
+ private void setRestart(String why)
+ {
+ // System.out.println("OC restart true " + why);
+ restart = true;
+ if (or != null)
+ {
+ or.setRedraw(true);
+ }
+ }
+
/**
* Draw the overview sequences
*
* true if sequence features are to be shown
* @param showAnnotation
* true if the annotation is to be shown
- * @param transferRenderer
+ * @param featureRenderer
* the renderer to transfer feature colouring from
*/
public void draw(boolean showSequenceFeatures, boolean showAnnotation,
- FeatureRenderer transferRenderer)
+ jalview.api.FeatureRenderer featureRenderer)
{
- miniMe = null;
-
+ this.showSequenceFeatures = showSequenceFeatures;
+ this.showAnnotation = showAnnotation;
+ this.featureRenderer = featureRenderer;
if (showSequenceFeatures)
{
- fr.transferSettings(transferRenderer);
+ fr.transferSettings(featureRenderer);
}
-
setPreferredSize(new Dimension(od.getWidth(), od.getHeight()));
+ AlignmentI al = av.getAlignment();
+ or = new OverviewRenderer(panel.ap, fr, od, al, av.getResidueShading(),
+ cf, showProgress);
+ if (showProgress)
+ {
+ or.addPropertyChangeListener(progressPanel);
+ }
+ or.drawMiniMe();
+ }
- or = new OverviewRenderer(fr, od, av.getAlignment(),
- av.getResidueShading(), cf);
-
- or.addPropertyChangeListener(progressPanel);
-
- miniMe = or.draw(od.getRows(av.getAlignment()),
- od.getColumns(av.getAlignment()));
-
- Graphics mg = miniMe.getGraphics();
+ synchronized void finalizeDraw(BufferedImage miniMe)
+ {
- if (showAnnotation)
+ if (showProgress && or != null)
{
- mg.translate(0, od.getSequencesHeight());
- or.drawGraph(mg, av.getAlignmentConservationAnnotation(),
- od.getGraphHeight(), od.getColumns(av.getAlignment()));
- mg.translate(0, -od.getSequencesHeight());
+ or.removePropertyChangeListener(progressPanel);
}
-
- or.removePropertyChangeListener(progressPanel);
- or = null;
if (restart)
{
+ or = null;
restart = false;
- if (!dispose)
+ if (!disposed)
{
- draw(showSequenceFeatures, showAnnotation, transferRenderer);
+ draw(showSequenceFeatures, showAnnotation, featureRenderer);
}
}
else
{
+ if (showAnnotation && or != null)
+ {
+ or.drawGraph(av.getAlignmentConservationAnnotation());
+ }
+ or = null;
updaterunning = false;
lastMiniMe = miniMe;
+ repaint();
}
}
@Override
public void paintComponent(Graphics g)
{
- //super.paintComponent(g);
+ int w = getWidth();
+ int h = getHeight();
+ if (w == 0 || od.getBoxWidth() <= 0)
+ {
+ // BH 2019.07.27 removes two unnecessary paints, since boxwidth can be -1
+ // or 0 during early-stage painting
+ return;
+ }
+
+ boolean drawMe = (lastMiniMe != null);
if (restart)
{
- if (lastMiniMe == null)
+ if (drawMe)
{
- g.setColor(Color.white);
- g.fillRect(0, 0, getWidth(), getHeight());
+ g.drawImage(lastMiniMe, 0, 0, w, h, this);
}
else
{
- g.drawImage(lastMiniMe, 0, 0, getWidth(), getHeight(), this);
+ g.setColor(Color.white);
+ g.fillRect(0, 0, w, h);
}
g.setColor(TRANS_GREY);
- g.fillRect(0, 0, getWidth(), getHeight());
+ g.fillRect(0, 0, w, h);
+ drawMe = false;
}
- else if (lastMiniMe != null)
+ else if (drawMe)
{
// is this a resize?
- if ((getWidth() > 0) && (getHeight() > 0)
- && ((getWidth() != od.getWidth())
- || (getHeight() != od.getHeight())))
+ if (w != od.getWidth() || h != od.getHeight())
{
- // if there is annotation, scale the alignment and annotation
- // separately
- if (od.getGraphHeight() > 0
- && od.getSequencesHeight() > 0 // BH 2019
- )
- {
- BufferedImage topImage = lastMiniMe.getSubimage(0, 0,
- od.getWidth(), od.getSequencesHeight());
- BufferedImage bottomImage = lastMiniMe.getSubimage(0,
- od.getSequencesHeight(), od.getWidth(),
- od.getGraphHeight());
-
- // must be done at this point as we rely on using old width/height
- // above, and new width/height below
- od.setWidth(getWidth());
- od.setHeight(getHeight());
-
- // stick the images back together so lastMiniMe is consistent in the
- // event of a repaint - BUT probably not thread safe
- lastMiniMe = new BufferedImage(od.getWidth(), od.getHeight(),
- BufferedImage.TYPE_INT_RGB);
- Graphics lg = lastMiniMe.getGraphics();
- lg.drawImage(topImage, 0, 0, od.getWidth(),
- od.getSequencesHeight(), null);
- lg.drawImage(bottomImage, 0, od.getSequencesHeight(),
- od.getWidth(), od.getGraphHeight(), this);
- lg.dispose();
- }
- else
- {
- od.setWidth(getWidth());
- od.setHeight(getHeight());
- }
-
- // make sure the box is in the right place
- od.setBoxPosition(av.getAlignment().getHiddenSequences(),
- av.getAlignment().getHiddenColumns());
+
+ lastMiniMe = null;
+ return;
+ // // if there is annotation, scale the alignment and annotation
+ // // separately
+ // if (od.getGraphHeight() <= 0 && od.getSequencesHeight() <= 0)
+ // {
+ // od.setWidth(w);
+ // od.setHeight(h);
+ // return;
+ // }
+ // try
+ // {
+ // BufferedImage topImage = lastMiniMe.getSubimage(0, 0,
+ // od.getWidth(), od.getSequencesHeight());
+ //
+ // BufferedImage bottomImage = lastMiniMe.getSubimage(0,
+ // od.getSequencesHeight(), od.getWidth(),
+ // od.getGraphHeight());
+ //
+ // // must be done at this point as we rely on using old width/height
+ // // above, and new width/height below
+ // od.setWidth(w);
+ // od.setHeight(h);
+ //
+ // // stick the images back together so lastMiniMe is consistent in the
+ // // event of a repaint - BUT probably not thread safe
+ //
+ // // right -- this fails with fast user action.
+ //
+ // lastMiniMe = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
+ // Graphics lg = lastMiniMe.getGraphics();
+ // lg.drawImage(topImage, 0, 0, w, od.getSequencesHeight(), null);
+ // lg.drawImage(bottomImage, 0, od.getSequencesHeight(), w,
+ // od.getGraphHeight(), this);
+ // lg.dispose();
+ //
+ // } catch (RasterFormatException e)
+ // {
+ // System.out.println("OC Raster Exception " + lastMiniMe.getWidth()
+ // + "/" + w + "," + lastMiniMe.getHeight() + "/" + h + " "
+ // + od.getSequencesHeight() + " " + od.getGraphHeight());
+ // }
+ // BH 2019: removed -- this is now taken care of using vpbox in
+ // OverviewDimension
+ // // make sure the box is in the right place
+ // od.setBoxPosition(av.getAlignment().getHiddenSequences(),
+ // av.getAlignment().getHiddenColumns());
}
- // fall back to normal behaviour
- g.drawImage(lastMiniMe, 0, 0, getWidth(), getHeight(), this);
}
- else
+
+ if (drawMe)
{
- g.drawImage(lastMiniMe, 0, 0, getWidth(), getHeight(), this);
+ g.drawImage(lastMiniMe, 0, 0, w, h, this);
}
-
// draw the box
g.setColor(Color.red);
+ // System.out.println("OC paintComponent nd=" + ndraw + " nr=" + nrepaint
+ // + " np=" + ++npaint);
od.drawBox(g);
}
+ // private int ndraw, npaint, nrepaint;
+
+ // @Override
+ // public void repaint()
+ // {
+ // System.out.println("OC repaint " + (++nrepaint));
+ // super.repaint();
+ // }
public void dispose()
{
- dispose = true;
+ disposed = true;
od = null;
+ lastMiniMe = null;
synchronized (this)
{
- restart = true;
- if (or != null)
- {
- or.setRedraw(true);
- }
+ setRestart("dispose");
}
}
+
}
*/
package jalview.gui;
+import jalview.api.AlignViewportI;
+import jalview.api.AlignmentViewPanel;
import jalview.bin.Cache;
import jalview.renderer.OverviewRenderer;
import jalview.util.MessageManager;
{
protected OverviewDimensions od;
- private OverviewCanvas oviewCanvas;
+ OverviewCanvas canvas;
- protected AlignViewport av;
+ protected AlignViewportI av;
- private AlignmentPanel ap;
+ AlignmentViewPanel ap;
protected JCheckBoxMenuItem displayToggle;
protected ProgressPanel progressPanel;
+ private Dimension dim;
+
+ private boolean showProgress = !Platform.isJS(); // Jalview.getInstance().getShowStatus()
+
/**
* Creates a new OverviewPanel object.
*
* @param alPanel
* The alignment panel which is shown in the overview panel
*/
- public OverviewPanel(AlignmentPanel alPanel)
+ public OverviewPanel(AlignmentViewPanel alPanel, Dimension dim)
{
- this.av = alPanel.av;
+ this.av = alPanel.getAlignViewport();
this.ap = alPanel;
+ this.dim = dim;
showHidden = Cache.getDefault(Preferences.SHOW_OV_HIDDEN_AT_START,
false);
- if (showHidden)
- {
- od = new OverviewDimensionsShowHidden(av.getRanges(),
- (av.isShowAnnotation()
- && av.getAlignmentConservationAnnotation() != null));
- }
- else
- {
- od = new OverviewDimensionsHideHidden(av.getRanges(),
- (av.isShowAnnotation()
- && av.getAlignmentConservationAnnotation() != null));
- }
-
+ createOverviewDimensions();
setLayout(new BorderLayout());
progressPanel = new ProgressPanel(OverviewRenderer.UPDATE,
MessageManager.getString("label.oview_calc"), getWidth());
- this.add(progressPanel, BorderLayout.SOUTH);
- oviewCanvas = new OverviewCanvas(od, av, progressPanel);
-
- add(oviewCanvas, BorderLayout.CENTER);
+ if (showProgress) // BH 2019
+ {
+ add(progressPanel, BorderLayout.SOUTH);
+ }
+ canvas = new OverviewCanvas(this, od, av,
+ showProgress ? progressPanel : null);
+ canvas.setPreferredSize(canvas.getSize());
+ add(canvas, BorderLayout.CENTER);
av.getRanges().addPropertyChangeListener(this);
// without this the overview window does not size to fit the overview canvas
- setPreferredSize(new Dimension(od.getWidth(), od.getHeight()));
-
+ // BH - no,no! - This does not include the progressPanel!
+ // BH the problem was that OverviewCanvas.setPreferredSize() had not been set.
+ // setPreferredSize(new Dimension(od.getWidth(), od.getHeight()));
+
addComponentListener(new ComponentAdapter()
{
@Override
public void componentResized(ComponentEvent evt)
{
- // Resize is called on the initial display of the overview.
- // This code adjusts sizes to account for the progress bar if it has not
- // already been accounted for, which triggers another resize call for
- // the correct sizing, at which point the overview image is updated.
- // (This avoids a double recalculation of the image.)
- if (getWidth() == od.getWidth() && getHeight() == od.getHeight()
- + progressPanel.getHeight())
- {
- updateOverviewImage();
- }
- else
- {
- if ((getWidth() > 0) && (getHeight() > 0))
- {
- od.setWidth(getWidth());
- od.setHeight(getHeight() - progressPanel.getHeight());
- }
-
- setPreferredSize(new Dimension(od.getWidth(),
- od.getHeight() + progressPanel.getHeight()));
- }
+ resizePanel();
}
});
@Override
public void mousePressed(MouseEvent evt)
{
-
- if (Platform.isWinRightButton(evt)) {
- showPopupMenu(evt);
- return;
- }
- if (SwingUtilities.isRightMouseButton(evt)) {
- return;
+
+ if (Platform.isWinRightButton(evt))
+ {
+ showPopupMenu(evt);
+ return;
}
- // don't do anything if the mouse press is in the overview's box
- // (wait to see if it's a drag instead)
- // otherwise update the viewport
- if (!od.isPositionInBox(evt.getX(), evt.getY()))
- {
- draggingBox = false;
+ if (SwingUtilities.isRightMouseButton(evt))
+ {
+ return;
+ }
+ // don't do anything if the mouse press is in the overview's box
+ // (wait to see if it's a drag instead)
+ // otherwise update the viewport
+ if (!od.isPositionInBox(evt.getX(), evt.getY()))
+ {
+ draggingBox = false;
- // display drag cursor at mouse position
- setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR));
+ // display drag cursor at mouse position
+ setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR));
- od.updateViewportFromMouse(evt.getX(), evt.getY(),
- av.getAlignment().getHiddenSequences(),
- av.getAlignment().getHiddenColumns());
- getParent().setCursor(
- Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
- }
- else
- {
- draggingBox = true;
- od.setDragPoint(evt.getX(), evt.getY(),
- av.getAlignment().getHiddenSequences(),
- av.getAlignment().getHiddenColumns());
- }
+ od.updateViewportFromMouse(evt.getX(), evt.getY(),
+ av.getAlignment().getHiddenSequences(),
+ av.getAlignment().getHiddenColumns());
+ getParent().setCursor(
+ Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
+ }
+ else
+ {
+ draggingBox = true;
+ od.setDragPoint(evt.getX(), evt.getY(),
+ av.getAlignment().getHiddenSequences(),
+ av.getAlignment().getHiddenColumns());
+ }
}
@Override
});
- /*
- * Javascript does not call componentResized on initial display,
- * so do the update here
- */
- if (Platform.isJS())
+ // /*
+ // * Javascript does not call componentResized on initial display,
+ // * so do the update here
+ // */
+ // if (Platform.isJS())
+ // {
+ // updateOverviewImage();
+ // }
+ }
+
+ protected void resizePanel()
+ {
+ int ph = (progressPanel.getParent() == null ? 0
+ : progressPanel.getHeight());
+ // Resize is called on the initial display of the overview.
+ // This code adjusts sizes to account for the progress bar if it has not
+ // already been accounted for, which triggers another resize call for
+ // the correct sizing, at which point the overview image is updated.
+ // (This avoids a double recalculation of the image.)
+ if (getWidth() == od.getWidth() && getHeight() == od.getHeight() + ph)
+ {
+ if (canvas.lastMiniMe == null)
+ {
+ updateOverviewImage();
+ }
+ }
+ else
+ {
+ int w = getWidth();
+ int h = getHeight();
+ if ((w > 0) && (h > 0))
+ {
+ if (dim != null)
+ {
+ dim.setSize(w, h - ph);
+ }
+ od.setWidth(w);
+ od.setHeight(h - ph);
+ updateOverviewImage();
+ }
+ // BH 2019.07.29 this is unnecessary -- it is what layout managers are
+ // for:
+ // setPreferredSize(new Dimension(od.getWidth(), od.getHeight() +
+ // ph));
+ }
+ }
+
+ /**
+ * Create the appropriate type of OverViewDimensions, with the desired size.
+ */
+ private void createOverviewDimensions()
+ {
+ boolean showAnnotation = (av.isShowAnnotation()
+ && av.getAlignmentConservationAnnotation() != null);
+ if (showHidden)
+ {
+ od = new OverviewDimensionsShowHidden(av.getRanges(), showAnnotation,
+ dim);
+ }
+ else
{
- updateOverviewImage();
+ od = new OverviewDimensionsHideHidden(av.getRanges(), showAnnotation,
+ dim);
}
+
}
/*
*/
protected void toggleHiddenColumns()
{
- if (showHidden)
- {
- showHidden = false;
- od = new OverviewDimensionsHideHidden(av.getRanges(),
- (av.isShowAnnotation()
- && av.getAlignmentConservationAnnotation() != null));
- }
- else
- {
- showHidden = true;
- od = new OverviewDimensionsShowHidden(av.getRanges(),
- (av.isShowAnnotation()
- && av.getAlignmentConservationAnnotation() != null));
- }
- oviewCanvas.resetOviewDims(od);
+ showHidden = !showHidden;
+ createOverviewDimensions();
+ canvas.resetOviewDims(od);
updateOverviewImage();
setBoxPosition();
}
/**
- * Updates the overview image when the related alignment panel is updated
+ * Updates the overview image when the related alignment panel is updated.
+ *
+ * Cases:
+ *
+ * AlignFrame.setFeatureGroupState
+ *
+ * AlignmentPanel.paintAlignment(true,...) (117 references)
+ *
+ * OverviewPanel..componentResized() OverviewPanel.toggleHiddenColumns()
+ *
+ * PopupMenu for action.reveal_sequences, action.reveal_all
+ *
+ * SliderPanel.mouseReleased()
+ *
*/
public void updateOverviewImage()
{
- if (oviewCanvas == null)
+ if (canvas == null)
{
/*
* panel has been disposed
return;
}
+ int ph = (progressPanel.getParent() == null ? 0
+ : progressPanel.getHeight());
+
if ((getWidth() > 0) && (getHeight() > 0))
{
od.setWidth(getWidth());
- od.setHeight(getHeight() - progressPanel.getHeight());
+ od.setHeight(getHeight() - ph);
}
-
- setPreferredSize(new Dimension(od.getWidth(),
- od.getHeight() + progressPanel.getHeight()));
- if (oviewCanvas.restartDraw())
+ setPreferredSize(new Dimension(od.getWidth(), od.getHeight() + ph));
+
+ if (canvas.restartDraw())
{
return;
}
Thread thread = new Thread(this);
thread.start();
- repaint();
-
-
}
@Override
public void run()
{
- if (oviewCanvas != null)
+ if (canvas != null)
{
- oviewCanvas.draw(av.isShowSequenceFeatures(),
+ setBoxPosition();
+ canvas.draw(av.isShowSequenceFeatures(),
(av.isShowAnnotation()
&& av.getAlignmentConservationAnnotation() != null),
- ap.getSeqPanel().seqCanvas.getFeatureRenderer());
- setBoxPosition();
+ ap.getFeatureRenderer());
}
}
{
if (od != null)
{
+ od.updateBox();
int oldX = od.getBoxX();
int oldY = od.getBoxY();
int oldWidth = od.getBoxWidth();
av.getRanges().removePropertyChangeListener(this);
}
- oviewCanvas.dispose();
+ canvas.dispose();
/*
* close the parent frame (which also removes it from the
* Desktop Windows menu)
*/
- ((JInternalFrame) SwingUtilities.getAncestorOfClass(
- JInternalFrame.class, (this))).setClosed(true);
+ ((JInternalFrame) SwingUtilities
+ .getAncestorOfClass(JInternalFrame.class, (this)))
+ .setClosed(true);
} catch (PropertyVetoException e)
{
// ignore
{
progressPanel = null;
av = null;
- oviewCanvas = null;
+ canvas = null;
ap = null;
od = null;
}
// }
//
// JPanel progressPanel;
- // Long lId = Long.valueOf(id);
+ // Long lId = new Long(id);
// GridLayout layout = (GridLayout) statusPanel.getLayout();
// if (progressBars.get(lId) != null)
// {
- // progressPanel = (JPanel) progressBars.get(Long.valueOf(id));
+ // progressPanel = (JPanel) progressBars.get(new Long(id));
// statusPanel.remove(progressPanel);
// progressBars.remove(lId);
// progressPanel = null;
final IProgressIndicatorHandler handler)
{
progressBar.registerHandler(id, handler);
- // if (progressBarHandlers == null || !progressBars.contains(Long.valueOf(id)))
+ // if (progressBarHandlers == null || !progressBars.contains(new Long(id)))
// {
// throw new
// Error(MessageManager.getString("error.call_setprogressbar_before_registering_handler"));
// }
- // progressBarHandlers.put(Long.valueOf(id), handler);
- // final JPanel progressPanel = (JPanel) progressBars.get(Long.valueOf(id));
+ // progressBarHandlers.put(new Long(id), handler);
+ // final JPanel progressPanel = (JPanel) progressBars.get(new Long(id));
// if (handler.canCancel())
// {
// JButton cancel = new JButton(
{
try
{
- jalview.util.BrowserLauncher.openURL(url);
+ Platform.openURL(url);
} catch (Exception ex)
{
- JvOptionPane.showInternalMessageDialog(Desktop.desktop,
+ JvOptionPane.showInternalMessageDialog(Desktop.getDesktopPane(),
MessageManager.getString("label.web_browser_not_found_unix"),
MessageManager.getString("label.web_browser_not_found"),
JvOptionPane.WARNING_MESSAGE);
}
/**
- * add a late bound groupURL item to the given linkMenu
+ * For the popup menu on the idPanel.
+ *
+ * Add a late bound groupURL item to the given linkMenu
*
* @param linkMenu
* @param label
{
try
{
+ // Object[] { int[] { number of matches seqs },
+ // boolean[] { which matched },
+ // StringBuffer[] { segment generated from inputs },
+ // String[] { url }
+ // }
+
+ // TODO bug: urlstub is { int[], boolean[] } but constructFrom
+ // requires something else.
+
showLink(urlgenerator.constructFrom(urlstub));
} catch (UrlStringTooLongException e2)
{
* non-positional features if in the Id panel, features at the
* clicked residue if in the sequence panel
* @param groupLinks
+ * not implemented -- empty list
*/
public PopupMenu(final AlignmentPanel alignPanel, final SequenceI seq,
List<SequenceFeature> features, List<String> groupLinks)
// add any groupURLs to the groupURL submenu and make it visible
if (groupLinks != null && groupLinks.size() > 0)
{
+ // not implemented -- empty list
buildGroupURLMenu(sg, groupLinks);
}
// Add a 'show all structures' for the current selection
showOrHideMenu.add(item);
}
+ /**
+ *
+ * @param sg
+ * @param groupLinks
+ * not implemented -- empty list
+ */
private void buildGroupURLMenu(SequenceGroup sg, List<String> groupLinks)
{
}
}
}
+ if (groupLinks.size() == 0)
+ {
+ return;
+ }
// now create group links for all distinct ID/sequence sets.
boolean addMenu = false; // indicates if there are any group links to give
// to user
+
+ // not implmeented -- empty list
for (String link : groupLinks)
{
GroupUrlLink urlLink = null;
{
urlset = urlLink.makeUrlStubs(ids, seqstr,
"FromJalview" + System.currentTimeMillis(), false);
+ // { int[], boolean[] } only here
} catch (UrlStringTooLongException e)
{
}
groupLinksMenu.add(linkMenus[m]);
}
}
-
groupMenu.add(groupLinksMenu);
}
}
refresh();
};
};
- JalviewColourChooser.showColourChooser(Desktop.getDesktop(),
+ JalviewColourChooser.showColourChooser(Desktop.getDesktopPane(),
title, Color.BLUE, listener);
}
import jalview.gui.Help.HelpId;
import jalview.gui.StructureViewer.ViewerType;
import jalview.io.BackupFiles;
-import jalview.io.BackupFilesPresetEntry;
import jalview.io.FileFormatI;
import jalview.io.JalviewFileChooser;
import jalview.io.JalviewFileView;
import jalview.urls.api.UrlProviderFactoryI;
import jalview.urls.api.UrlProviderI;
import jalview.urls.desktop.DesktopUrlProviderFactory;
+import jalview.util.BrowserLauncher;
import jalview.util.MessageManager;
import jalview.util.Platform;
import jalview.util.UrlConstants;
* @author $author$
* @version $Revision$
*/
+@SuppressWarnings("serial")
public class Preferences extends GPreferences
{
- public static final String ENABLE_SPLIT_FRAME = "ENABLE_SPLIT_FRAME";
+ public static final String ADD_SS_ANN = "ADD_SS_ANN";
- public static final String SCALE_PROTEIN_TO_CDNA = "SCALE_PROTEIN_TO_CDNA";
+ public static final String ADD_TEMPFACT_ANN = "ADD_TEMPFACT_ANN";
+
+ public static final String ALLOW_UNPUBLISHED_PDB_QUERYING = "ALLOW_UNPUBLISHED_PDB_QUERYING";
+
+ public static final String ANNOTATIONCOLOUR_MAX = "ANNOTATIONCOLOUR_MAX";
+
+ public static final String ANNOTATIONCOLOUR_MIN = "ANNOTATIONCOLOUR_MIN";
+
+ public static final String ANTI_ALIAS = "ANTI_ALIAS";
+
+ public static final String AUTO_CALC_CONSENSUS = "AUTO_CALC_CONSENSUS";
+
+ public static final String AUTOASSOCIATE_PDBANDSEQS = "AUTOASSOCIATE_PDBANDSEQS";
+
+ public static final String CENTRE_COLUMN_LABELS = "CENTRE_COLUMN_LABELS";
+
+ public static final String CHIMERA_PATH = "CHIMERA_PATH";
+
+ public static final String DBREFFETCH_USEPICR = "DBREFFETCH_USEPICR";
public static final String DEFAULT_COLOUR = "DEFAULT_COLOUR";
+ public static final String DEFAULT_COLOUR_NUC = "DEFAULT_COLOUR_NUC";
+
public static final String DEFAULT_COLOUR_PROT = "DEFAULT_COLOUR_PROT";
- public static final String DEFAULT_COLOUR_NUC = "DEFAULT_COLOUR_NUC";
+ public static final String ENABLE_SPLIT_FRAME = "ENABLE_SPLIT_FRAME";
- public static final String ADD_TEMPFACT_ANN = "ADD_TEMPFACT_ANN";
+ public static final String FIGURE_AUTOIDWIDTH = "FIGURE_AUTOIDWIDTH";
- public static final String ADD_SS_ANN = "ADD_SS_ANN";
+ public static final String FIGURE_FIXEDIDWIDTH = "FIGURE_FIXEDIDWIDTH";
- public static final String USE_RNAVIEW = "USE_RNAVIEW";
+ public static final String FOLLOW_SELECTIONS = "FOLLOW_SELECTIONS";
- public static final String STRUCT_FROM_PDB = "STRUCT_FROM_PDB";
+ public static final String FONT_NAME = "FONT_NAME";
- public static final String STRUCTURE_DISPLAY = "STRUCTURE_DISPLAY";
+ public static final String FONT_SIZE = "FONT_SIZE";
- public static final String CHIMERA_PATH = "CHIMERA_PATH";
+ public static final String FONT_STYLE = "FONT_STYLE";
- public static final String SORT_ANNOTATIONS = "SORT_ANNOTATIONS";
+ public static final String GAP_COLOUR = "GAP_COLOUR";
+
+ public static final String GAP_SYMBOL = "GAP_SYMBOL";
+
+ public static final String HIDDEN_COLOUR = "HIDDEN_COLOUR";
+
+ public static final String HIDE_INTRONS = "HIDE_INTRONS";
+
+ public static final String ID_ITALICS = "ID_ITALICS";
+
+ public static final String ID_ORG_HOSTURL = "ID_ORG_HOSTURL";
+
+ public static final String MAP_WITH_SIFTS = "MAP_WITH_SIFTS";
+
+ public static final String NOQUESTIONNAIRES = "NOQUESTIONNAIRES";
+
+ public static final String NORMALISE_CONSENSUS_LOGO = "NORMALISE_CONSENSUS_LOGO";
+
+ public static final String NORMALISE_LOGO = "NORMALISE_LOGO";
+
+ public static final String PAD_GAPS = "PAD_GAPS";
+
+ public static final String PDB_DOWNLOAD_FORMAT = "PDB_DOWNLOAD_FORMAT";
+
+ public static final String QUESTIONNAIRE = "QUESTIONNAIRE";
+
+ public static final String RELAXEDSEQIDMATCHING = "RELAXEDSEQIDMATCHING";
+
+ public static final String RIGHT_ALIGN_IDS = "RIGHT_ALIGN_IDS";
+
+ public static final String SCALE_PROTEIN_TO_CDNA = "SCALE_PROTEIN_TO_CDNA";
+
+ public static final String SHOW_ANNOTATIONS = "SHOW_ANNOTATIONS";
public static final String SHOW_AUTOCALC_ABOVE = "SHOW_AUTOCALC_ABOVE";
+ public static final String SHOW_CONSENSUS = "SHOW_CONSENSUS";
+
+ public static final String SHOW_CONSENSUS_HISTOGRAM = "SHOW_CONSENSUS_HISTOGRAM";
+
+ public static final String SHOW_CONSENSUS_LOGO = "SHOW_CONSENSUS_LOGO";
+
+ public static final String SHOW_CONSERVATION = "SHOW_CONSERVATION";
+
+ public static final String SHOW_DBREFS_TOOLTIP = "SHOW_DBREFS_TOOLTIP";
+
+ public static final String SHOW_GROUP_CONSENSUS = "SHOW_GROUP_CONSENSUS";
+
+ public static final String SHOW_GROUP_CONSERVATION = "SHOW_GROUP_CONSERVATION";
+
+ public static final String SHOW_JVSUFFIX = "SHOW_JVSUFFIX";
+
+ public static final String SHOW_NPFEATS_TOOLTIP = "SHOW_NPFEATS_TOOLTIP";
+
public static final String SHOW_OCCUPANCY = "SHOW_OCCUPANCY";
public static final String SHOW_OV_HIDDEN_AT_START = "SHOW_OV_HIDDEN_AT_START";
+ public static final String SHOW_OVERVIEW = "SHOW_OVERVIEW";
+
+ public static final String SHOW_QUALITY = "SHOW_QUALITY";
+
+ public static final String SHOW_UNCONSERVED = "SHOW_UNCONSERVED";
+
+ public static final String SORT_ALIGNMENT = "SORT_ALIGNMENT";
+
+ public static final String SORT_ANNOTATIONS = "SORT_ANNOTATIONS";
+
+ public static final String SORT_BY_TREE = "SORT_BY_TREE";
+
+ public static final String STRUCT_FROM_PDB = "STRUCT_FROM_PDB";
+
+ public static final String STRUCTURE_DISPLAY = "STRUCTURE_DISPLAY";
+
+ public static final String STRUCTURE_DIMENSIONS = "STRUCTURE_DIMENSIONS";
+
+ public static final String UNIPROT_DOMAIN = "UNIPROT_DOMAIN";
+
+ public static final String USE_FULL_SO = "USE_FULL_SO";
+
public static final String USE_LEGACY_GAP = "USE_LEGACY_GAP";
- public static final String GAP_COLOUR = "GAP_COLOUR";
+ public static final String USE_RNAVIEW = "USE_RNAVIEW";
+
+ public static final String USER_DEFINED_COLOURS = "USER_DEFINED_COLOURS";
+
+ public static final String WRAP_ALIGNMENT = "WRAP_ALIGNMENT";
- public static final String HIDDEN_COLOUR = "HIDDEN_COLOUR";
private static final int MIN_FONT_SIZE = 1;
* Holds name and link separated with | character. Sequence ID must be
* $SEQUENCE_ID$ or $SEQUENCE_ID=/.possible | chars ./=$
*/
- public static UrlProviderI sequenceUrlLinks;
+ public static UrlProviderI sequenceUrlLinks; // must be nonfinal for test
- public static UrlLinkTableModel dataModel;
+ public final static UrlLinkTableModel dataModel;
/**
* Holds name and link separated with | character. Sequence IDS and Sequences
* (TODO: proper escape for using | to separate ids or sequences
*/
- public static List<String> groupURLLinks;
+ public static final List<String> groupURLLinks; // not implemented
+
+ public static final String BLOSUM62_PCA_FOR_NUCLEOTIDE = "BLOSUM62_PCA_FOR_NUCLEOTIDE";
+
+ public static final String SHOW_IDENTITY = "SHOW_IDENTITY";
+
+ public static final String SHOW_FULLSCREEN = "SHOW_FULLSCREEN";
+
+ public static final Dimension DEFAULT_STRUCTURE_DIMENSIONS = new Dimension(
+ 600, 600);
+
static
{
// get links selected to be in the menu (SEQUENCE_LINKS)
* .properties file as '|' separated strings
*/
- groupURLLinks = new ArrayList<>();
+ groupURLLinks = new ArrayList<>(); // not implemented
}
JInternalFrame frame;
wsPrefs = new WsPreferences();
wsTab.add(wsPrefs, BorderLayout.CENTER);
}
- int width = 500, height = 450;
+ int width = 500, height = 510; // BH 2019.07.12 added 60 to height
+ // (structure panel was too small anyway, and I added a default dimension
+ // for Jmol
if (Platform.isAMacAndNotJS())
{
width = 570;
- height = 480;
+ height = 540; // BH 2019.07.12 added 30
}
Desktop.addInternalFrame(frame,
/*
* Set Visual tab defaults
*/
- seqLimit.setSelected(Cache.getDefault("SHOW_JVSUFFIX", true));
- rightAlign.setSelected(Cache.getDefault("RIGHT_ALIGN_IDS", false));
- fullScreen.setSelected(Cache.getDefault("SHOW_FULLSCREEN", false));
- annotations.setSelected(Cache.getDefault("SHOW_ANNOTATIONS", true));
-
- conservation.setSelected(Cache.getDefault("SHOW_CONSERVATION", true));
- quality.setSelected(Cache.getDefault("SHOW_QUALITY", true));
- identity.setSelected(Cache.getDefault("SHOW_IDENTITY", true));
- openoverv.setSelected(Cache.getDefault("SHOW_OVERVIEW", false));
+ seqLimit.setSelected(Cache.getDefault(SHOW_JVSUFFIX, true));
+ rightAlign.setSelected(Cache.getDefault(RIGHT_ALIGN_IDS, false));
+ fullScreen.setSelected(Cache.getDefault(SHOW_FULLSCREEN, false));
+ annotations.setSelected(Cache.getDefault(SHOW_ANNOTATIONS, true));
+
+ conservation.setSelected(Cache.getDefault(SHOW_CONSERVATION, true));
+ quality.setSelected(Cache.getDefault(SHOW_QUALITY, true));
+ identity.setSelected(Cache.getDefault(SHOW_IDENTITY, true));
+ openoverv.setSelected(Cache.getDefault(SHOW_OVERVIEW, false));
showUnconserved
- .setSelected(Cache.getDefault("SHOW_UNCONSERVED", false));
+ .setSelected(Cache.getDefault(SHOW_UNCONSERVED, false));
showOccupancy.setSelected(Cache.getDefault(SHOW_OCCUPANCY, false));
showGroupConsensus
- .setSelected(Cache.getDefault("SHOW_GROUP_CONSENSUS", false));
+ .setSelected(Cache.getDefault(SHOW_GROUP_CONSENSUS, false));
showGroupConservation.setSelected(
- Cache.getDefault("SHOW_GROUP_CONSERVATION", false));
+ Cache.getDefault(SHOW_GROUP_CONSERVATION, false));
showConsensHistogram.setSelected(
- Cache.getDefault("SHOW_CONSENSUS_HISTOGRAM", true));
+ Cache.getDefault(SHOW_CONSENSUS_HISTOGRAM, true));
showConsensLogo
- .setSelected(Cache.getDefault("SHOW_CONSENSUS_LOGO", false));
+ .setSelected(Cache.getDefault(SHOW_CONSENSUS_LOGO, false));
showNpTooltip
- .setSelected(Cache.getDefault("SHOW_NPFEATS_TOOLTIP", true));
+ .setSelected(Cache.getDefault(SHOW_NPFEATS_TOOLTIP, true));
showDbRefTooltip
- .setSelected(Cache.getDefault("SHOW_DBREFS_TOOLTIP", true));
+ .setSelected(Cache.getDefault(SHOW_DBREFS_TOOLTIP, true));
String[] fonts = java.awt.GraphicsEnvironment
.getLocalGraphicsEnvironment().getAvailableFontFamilyNames();
fontStyleCB.addItem("bold");
fontStyleCB.addItem("italic");
- fontNameCB.setSelectedItem(Cache.getDefault("FONT_NAME", "SansSerif"));
- fontSizeCB.setSelectedItem(Cache.getDefault("FONT_SIZE", "10"));
+ fontNameCB.setSelectedItem(Cache.getDefault(FONT_NAME, "SansSerif"));
+ fontSizeCB.setSelectedItem(Cache.getDefault(FONT_SIZE, "10"));
fontStyleCB.setSelectedItem(
- Cache.getDefault("FONT_STYLE", Font.PLAIN + ""));
+ Cache.getDefault(FONT_STYLE, Font.PLAIN + ""));
- smoothFont.setSelected(Cache.getDefault("ANTI_ALIAS", false));
+ smoothFont.setSelected(Cache.getDefault(ANTI_ALIAS, false));
scaleProteinToCdna
.setSelected(Cache.getDefault(SCALE_PROTEIN_TO_CDNA, false));
- idItalics.setSelected(Cache.getDefault("ID_ITALICS", true));
+ idItalics.setSelected(Cache.getDefault(ID_ITALICS, true));
- wrap.setSelected(Cache.getDefault("WRAP_ALIGNMENT", false));
+ wrap.setSelected(Cache.getDefault(WRAP_ALIGNMENT, false));
gapSymbolCB.addItem("-");
gapSymbolCB.addItem(".");
- gapSymbolCB.setSelectedItem(Cache.getDefault("GAP_SYMBOL", "-"));
+ gapSymbolCB.setSelectedItem(Cache.getDefault(GAP_SYMBOL, "-"));
sortby.addItem("No sort");
sortby.addItem("Id");
sortby.addItem("Pairwise Identity");
- sortby.setSelectedItem(Cache.getDefault("SORT_ALIGNMENT", "No sort"));
+ sortby.setSelectedItem(Cache.getDefault(SORT_ALIGNMENT, "No sort"));
sortAnnBy.addItem(SequenceAnnotationOrder.NONE.toString());
sortAnnBy
newProp = Cache.getDefault(DEFAULT_COLOUR_NUC, null);
nucColour.setSelectedItem(newProp != null ? newProp : oldProp);
minColour.setBackground(
- Cache.getDefaultColour("ANNOTATIONCOLOUR_MIN", Color.orange));
+ Cache.getDefaultColour(ANNOTATIONCOLOUR_MIN, Color.orange));
maxColour.setBackground(
- Cache.getDefaultColour("ANNOTATIONCOLOUR_MAX", Color.red));
+ Cache.getDefaultColour(ANNOTATIONCOLOUR_MAX, Color.red));
/*
* Set overview panel defaults
addTempFactor.setEnabled(structSelected);
structViewer.setSelectedItem(
Cache.getDefault(STRUCTURE_DISPLAY, ViewerType.JMOL.name()));
+ Dimension d = Cache.getDefaultDim(STRUCTURE_DIMENSIONS,
+ DEFAULT_STRUCTURE_DIMENSIONS);
+ String s = d.width + "," + d.height;
+ structureDimensions.setText(s);
chimeraPath.setText(Cache.getDefault(CHIMERA_PATH, ""));
chimeraPath.addActionListener(new ActionListener()
{
}
});
- if (Cache.getDefault("MAP_WITH_SIFTS", false))
+ if (Cache.getDefault(MAP_WITH_SIFTS, false))
{
siftsMapping.setSelected(true);
}
}
SiftsSettings
- .setMapWithSifts(Cache.getDefault("MAP_WITH_SIFTS", false));
+ .setMapWithSifts(Cache.getDefault(MAP_WITH_SIFTS, false));
/*
* Set Connections tab defaults
usagestats.setSelected(Cache.getDefault("USAGESTATS", false));
// note antisense here: default is true
questionnaire
- .setSelected(Cache.getProperty("NOQUESTIONNAIRES") == null);
+ .setSelected(Cache.getProperty(NOQUESTIONNAIRES) == null);
versioncheck.setSelected(Cache.getDefault("VERSION_CHECK", true));
/*
setupOutputCombo(epsRendering, "EPS_RENDERING");
setupOutputCombo(htmlRendering, "HTML_RENDERING");
setupOutputCombo(svgRendering, "SVG_RENDERING");
- autoIdWidth.setSelected(Cache.getDefault("FIGURE_AUTOIDWIDTH", false));
+ autoIdWidth.setSelected(Cache.getDefault(FIGURE_AUTOIDWIDTH, false));
userIdWidth.setEnabled(!autoIdWidth.isSelected());
userIdWidthlabel.setEnabled(!autoIdWidth.isSelected());
- Integer wi = Cache.getIntegerProperty("FIGURE_FIXEDIDWIDTH");
+ Integer wi = Cache.getIntegerProperty(FIGURE_FIXEDIDWIDTH);
userIdWidth.setText(wi == null ? "" : wi.toString());
// TODO: refactor to use common enum via FormatAdapter and allow extension
// for new flat file formats
* Set Editing tab defaults
*/
autoCalculateConsCheck
- .setSelected(Cache.getDefault("AUTO_CALC_CONSENSUS", true));
- padGaps.setSelected(Cache.getDefault("PAD_GAPS", false));
- sortByTree.setSelected(Cache.getDefault("SORT_BY_TREE", false));
+ .setSelected(Cache.getDefault(AUTO_CALC_CONSENSUS, true));
+ padGaps.setSelected(Cache.getDefault(PAD_GAPS, false));
+ sortByTree.setSelected(Cache.getDefault(SORT_BY_TREE, false));
annotations_actionPerformed(null); // update the display of the annotation
// settings
/*
* Set Backups tab defaults
*/
- if (!Platform.isJS())
- {
- loadLastSavedBackupsOptions();
- }
+ loadLastSavedBackupsOptions();
}
/**
/*
* Save Visual settings
*/
- Cache.applicationProperties.setProperty("SHOW_JVSUFFIX",
+ Cache.setPropertyNoSave(SHOW_JVSUFFIX,
Boolean.toString(seqLimit.isSelected()));
- Cache.applicationProperties.setProperty("RIGHT_ALIGN_IDS",
+ Cache.setPropertyNoSave(RIGHT_ALIGN_IDS,
Boolean.toString(rightAlign.isSelected()));
- Cache.applicationProperties.setProperty("SHOW_FULLSCREEN",
+ Cache.setPropertyNoSave(SHOW_FULLSCREEN,
Boolean.toString(fullScreen.isSelected()));
- Cache.applicationProperties.setProperty("SHOW_OVERVIEW",
+ Cache.setPropertyNoSave(SHOW_OVERVIEW,
Boolean.toString(openoverv.isSelected()));
- Cache.applicationProperties.setProperty("SHOW_ANNOTATIONS",
+ Cache.setPropertyNoSave(SHOW_ANNOTATIONS,
Boolean.toString(annotations.isSelected()));
- Cache.applicationProperties.setProperty("SHOW_CONSERVATION",
+ Cache.setPropertyNoSave(SHOW_CONSERVATION,
Boolean.toString(conservation.isSelected()));
- Cache.applicationProperties.setProperty("SHOW_QUALITY",
+ Cache.setPropertyNoSave(SHOW_QUALITY,
Boolean.toString(quality.isSelected()));
- Cache.applicationProperties.setProperty("SHOW_IDENTITY",
+ Cache.setPropertyNoSave(SHOW_IDENTITY,
Boolean.toString(identity.isSelected()));
- Cache.applicationProperties.setProperty("GAP_SYMBOL",
+ Cache.setPropertyNoSave(GAP_SYMBOL,
gapSymbolCB.getSelectedItem().toString());
- Cache.applicationProperties.setProperty("FONT_NAME",
+ Cache.setPropertyNoSave(FONT_NAME,
fontNameCB.getSelectedItem().toString());
- Cache.applicationProperties.setProperty("FONT_STYLE",
+ Cache.setPropertyNoSave(FONT_STYLE,
fontStyleCB.getSelectedItem().toString());
- Cache.applicationProperties.setProperty("FONT_SIZE",
+ Cache.setPropertyNoSave(FONT_SIZE,
fontSizeCB.getSelectedItem().toString());
- Cache.applicationProperties.setProperty("ID_ITALICS",
+ Cache.setPropertyNoSave(ID_ITALICS,
Boolean.toString(idItalics.isSelected()));
- Cache.applicationProperties.setProperty("SHOW_UNCONSERVED",
+ Cache.setPropertyNoSave(SHOW_UNCONSERVED,
Boolean.toString(showUnconserved.isSelected()));
- Cache.applicationProperties.setProperty(SHOW_OCCUPANCY,
+ Cache.setPropertyNoSave(SHOW_OCCUPANCY,
Boolean.toString(showOccupancy.isSelected()));
- Cache.applicationProperties.setProperty("SHOW_GROUP_CONSENSUS",
+ Cache.setPropertyNoSave(SHOW_GROUP_CONSENSUS,
Boolean.toString(showGroupConsensus.isSelected()));
- Cache.applicationProperties.setProperty("SHOW_GROUP_CONSERVATION",
+ Cache.setPropertyNoSave(SHOW_GROUP_CONSERVATION,
Boolean.toString(showGroupConservation.isSelected()));
- Cache.applicationProperties.setProperty("SHOW_CONSENSUS_HISTOGRAM",
+ Cache.setPropertyNoSave(SHOW_CONSENSUS_HISTOGRAM,
Boolean.toString(showConsensHistogram.isSelected()));
- Cache.applicationProperties.setProperty("SHOW_CONSENSUS_LOGO",
+ Cache.setPropertyNoSave(SHOW_CONSENSUS_LOGO,
Boolean.toString(showConsensLogo.isSelected()));
- Cache.applicationProperties.setProperty("ANTI_ALIAS",
+ Cache.setPropertyNoSave(ANTI_ALIAS,
Boolean.toString(smoothFont.isSelected()));
- Cache.applicationProperties.setProperty(SCALE_PROTEIN_TO_CDNA,
+ Cache.setPropertyNoSave(SCALE_PROTEIN_TO_CDNA,
Boolean.toString(scaleProteinToCdna.isSelected()));
- Cache.applicationProperties.setProperty("SHOW_NPFEATS_TOOLTIP",
+ Cache.setPropertyNoSave(SHOW_NPFEATS_TOOLTIP,
Boolean.toString(showNpTooltip.isSelected()));
- Cache.applicationProperties.setProperty("SHOW_DBREFS_TOOLTIP",
+ Cache.setPropertyNoSave(SHOW_DBREFS_TOOLTIP,
Boolean.toString(showDbRefTooltip.isSelected()));
- Cache.applicationProperties.setProperty("WRAP_ALIGNMENT",
+ Cache.setPropertyNoSave(WRAP_ALIGNMENT,
Boolean.toString(wrap.isSelected()));
- Cache.applicationProperties.setProperty("STARTUP_FILE",
+ Cache.setPropertyNoSave("STARTUP_FILE",
startupFileTextfield.getText());
- Cache.applicationProperties.setProperty("SHOW_STARTUP_FILE",
+ Cache.setPropertyNoSave("SHOW_STARTUP_FILE",
Boolean.toString(startupCheckbox.isSelected()));
- Cache.applicationProperties.setProperty("SORT_ALIGNMENT",
+ Cache.setPropertyNoSave(SORT_ALIGNMENT,
sortby.getSelectedItem().toString());
// convert description of sort order to enum name for save
.forDescription(sortAnnBy.getSelectedItem().toString());
if (annSortOrder != null)
{
- Cache.applicationProperties.setProperty(SORT_ANNOTATIONS,
+ Cache.setPropertyNoSave(SORT_ANNOTATIONS,
annSortOrder.name());
}
final boolean showAutocalcFirst = sortAutocalc.getSelectedIndex() == 0;
- Cache.applicationProperties.setProperty(SHOW_AUTOCALC_ABOVE,
+ Cache.setPropertyNoSave(SHOW_AUTOCALC_ABOVE,
Boolean.valueOf(showAutocalcFirst).toString());
/*
* Save Colours settings
*/
- Cache.applicationProperties.setProperty(DEFAULT_COLOUR_PROT,
+ Cache.setPropertyNoSave(DEFAULT_COLOUR_PROT,
protColour.getSelectedItem().toString());
- Cache.applicationProperties.setProperty(DEFAULT_COLOUR_NUC,
+ Cache.setPropertyNoSave(DEFAULT_COLOUR_NUC,
nucColour.getSelectedItem().toString());
- Cache.setColourProperty("ANNOTATIONCOLOUR_MIN",
+ Cache.setColourProperty(ANNOTATIONCOLOUR_MIN,
minColour.getBackground());
- Cache.setColourProperty("ANNOTATIONCOLOUR_MAX",
+ Cache.setColourProperty(ANNOTATIONCOLOUR_MAX,
maxColour.getBackground());
/*
*/
Cache.setColourProperty(GAP_COLOUR, gapColour.getBackground());
Cache.setColourProperty(HIDDEN_COLOUR, hiddenColour.getBackground());
- Cache.applicationProperties.setProperty(USE_LEGACY_GAP,
+ Cache.setPropertyNoSave(USE_LEGACY_GAP,
Boolean.toString(useLegacyGap.isSelected()));
- Cache.applicationProperties.setProperty(SHOW_OV_HIDDEN_AT_START,
+ Cache.setPropertyNoSave(SHOW_OV_HIDDEN_AT_START,
Boolean.toString(showHiddenAtStart.isSelected()));
/*
* Save Structure settings
*/
- Cache.applicationProperties.setProperty(ADD_TEMPFACT_ANN,
+ Cache.setPropertyNoSave(ADD_TEMPFACT_ANN,
Boolean.toString(addTempFactor.isSelected()));
- Cache.applicationProperties.setProperty(ADD_SS_ANN,
+ Cache.setPropertyNoSave(ADD_SS_ANN,
Boolean.toString(addSecondaryStructure.isSelected()));
- Cache.applicationProperties.setProperty(USE_RNAVIEW,
+ Cache.setPropertyNoSave(USE_RNAVIEW,
Boolean.toString(useRnaView.isSelected()));
- Cache.applicationProperties.setProperty(STRUCT_FROM_PDB,
+ Cache.setPropertyNoSave(STRUCT_FROM_PDB,
Boolean.toString(structFromPdb.isSelected()));
- Cache.applicationProperties.setProperty(STRUCTURE_DISPLAY,
+ Cache.setPropertyNoSave(STRUCTURE_DISPLAY,
structViewer.getSelectedItem().toString());
+ Cache.setPropertyNoSave(STRUCTURE_DIMENSIONS,
+ structureDimensions.getText()); // BH 2019.07.12
Cache.setOrRemove(CHIMERA_PATH, chimeraPath.getText());
- Cache.applicationProperties.setProperty("MAP_WITH_SIFTS",
+ Cache.setPropertyNoSave(MAP_WITH_SIFTS,
Boolean.toString(siftsMapping.isSelected()));
SiftsSettings.setMapWithSifts(siftsMapping.isSelected());
/*
* Save Output settings
*/
- Cache.applicationProperties.setProperty("EPS_RENDERING",
+ Cache.setPropertyNoSave("EPS_RENDERING",
((OptionsParam) epsRendering.getSelectedItem()).getCode());
- Cache.applicationProperties.setProperty("HTML_RENDERING",
+ Cache.setPropertyNoSave("HTML_RENDERING",
((OptionsParam) htmlRendering.getSelectedItem()).getCode());
- Cache.applicationProperties.setProperty("SVG_RENDERING",
+ Cache.setPropertyNoSave("SVG_RENDERING",
((OptionsParam) svgRendering.getSelectedItem()).getCode());
- /*
- * Save Connections settings
+ if (!Platform.isJS())
+ /**
+ * @j2sNative
*/
- Cache.setOrRemove("DEFAULT_BROWSER", defaultBrowser.getText());
-
- jalview.util.BrowserLauncher.resetBrowser();
+ {
+ // Java only
+ // Save Connections settings
+ Cache.setOrRemove("DEFAULT_BROWSER", defaultBrowser.getText());
+ BrowserLauncher.resetBrowser();
+ }
// save user-defined and selected links
String menuLinks = sequenceUrlLinks.writeUrlsAsString(true);
if (menuLinks.isEmpty())
{
- Cache.applicationProperties.remove("SEQUENCE_LINKS");
+ Cache.removePropertyNoSave("SEQUENCE_LINKS");
}
else
{
- Cache.applicationProperties.setProperty("SEQUENCE_LINKS",
+ Cache.setPropertyNoSave("SEQUENCE_LINKS",
menuLinks.toString());
}
String nonMenuLinks = sequenceUrlLinks.writeUrlsAsString(false);
if (nonMenuLinks.isEmpty())
{
- Cache.applicationProperties.remove("STORED_LINKS");
+ Cache.removePropertyNoSave("STORED_LINKS");
}
else
{
- Cache.applicationProperties.setProperty("STORED_LINKS",
+ Cache.setPropertyNoSave("STORED_LINKS",
nonMenuLinks.toString());
}
- Cache.applicationProperties.setProperty("DEFAULT_URL",
+ Cache.setPropertyNoSave("DEFAULT_URL",
sequenceUrlLinks.getPrimaryUrlId());
- Cache.applicationProperties.setProperty("USE_PROXY",
+ Cache.setPropertyNoSave("USE_PROXY",
Boolean.toString(useProxy.isSelected()));
Cache.setOrRemove("PROXY_SERVER", proxyServerTB.getText());
}
if (!questionnaire.isSelected())
{
- Cache.setProperty("NOQUESTIONNAIRES", "true");
+ Cache.setProperty(NOQUESTIONNAIRES, "true");
}
else
{
// special - made easy to edit a property file to disable questionnaires
// by just adding the given line
- Cache.removeProperty("NOQUESTIONNAIRES");
+ Cache.removeProperty(NOQUESTIONNAIRES);
}
/*
* Save Output settings
*/
- Cache.applicationProperties.setProperty("BLC_JVSUFFIX",
+ Cache.setPropertyNoSave("BLC_JVSUFFIX",
Boolean.toString(blcjv.isSelected()));
- Cache.applicationProperties.setProperty("CLUSTAL_JVSUFFIX",
+ Cache.setPropertyNoSave("CLUSTAL_JVSUFFIX",
Boolean.toString(clustaljv.isSelected()));
- Cache.applicationProperties.setProperty("FASTA_JVSUFFIX",
+ Cache.setPropertyNoSave("FASTA_JVSUFFIX",
Boolean.toString(fastajv.isSelected()));
- Cache.applicationProperties.setProperty("MSF_JVSUFFIX",
+ Cache.setPropertyNoSave("MSF_JVSUFFIX",
Boolean.toString(msfjv.isSelected()));
- Cache.applicationProperties.setProperty("PFAM_JVSUFFIX",
+ Cache.setPropertyNoSave("PFAM_JVSUFFIX",
Boolean.toString(pfamjv.isSelected()));
- Cache.applicationProperties.setProperty("PILEUP_JVSUFFIX",
+ Cache.setPropertyNoSave("PILEUP_JVSUFFIX",
Boolean.toString(pileupjv.isSelected()));
- Cache.applicationProperties.setProperty("PIR_JVSUFFIX",
+ Cache.setPropertyNoSave("PIR_JVSUFFIX",
Boolean.toString(pirjv.isSelected()));
- Cache.applicationProperties.setProperty("PIR_MODELLER",
+ Cache.setPropertyNoSave("PIR_MODELLER",
Boolean.toString(modellerOutput.isSelected()));
- Cache.applicationProperties.setProperty("EXPORT_EMBBED_BIOJSON",
+ Cache.setPropertyNoSave("EXPORT_EMBBED_BIOJSON",
Boolean.toString(embbedBioJSON.isSelected()));
- jalview.io.PIRFile.useModellerOutput = modellerOutput.isSelected();
-
- Cache.applicationProperties.setProperty("FIGURE_AUTOIDWIDTH",
+ Cache.setPropertyNoSave(FIGURE_AUTOIDWIDTH,
Boolean.toString(autoIdWidth.isSelected()));
userIdWidth_actionPerformed();
- Cache.applicationProperties.setProperty("FIGURE_FIXEDIDWIDTH",
+ Cache.setPropertyNoSave("FIGURE_FIXEDIDWIDTH",
userIdWidth.getText());
/*
* Save Editing settings
*/
- Cache.applicationProperties.setProperty("AUTO_CALC_CONSENSUS",
+ Cache.setPropertyNoSave(AUTO_CALC_CONSENSUS,
Boolean.toString(autoCalculateConsCheck.isSelected()));
- Cache.applicationProperties.setProperty("SORT_BY_TREE",
+ Cache.setPropertyNoSave(SORT_BY_TREE,
Boolean.toString(sortByTree.isSelected()));
- Cache.applicationProperties.setProperty("PAD_GAPS",
+ Cache.setPropertyNoSave(PAD_GAPS,
Boolean.toString(padGaps.isSelected()));
if (!Platform.isJS())
/*
* Save Backups settings
*/
- Cache.applicationProperties.setProperty(BackupFiles.ENABLED,
- Platform.isJS() ? Boolean.FALSE.toString()
- : Boolean.toString(enableBackupFiles.isSelected()));
- if (!Platform.isJS())
- {
- int preset = getComboIntStringKey(backupfilesPresetsCombo);
- Cache.applicationProperties.setProperty(BackupFiles.NS + "_PRESET",
- Integer.toString(preset));
-
- if (preset == BackupFilesPresetEntry.BACKUPFILESSCHEMECUSTOM)
- {
- BackupFilesPresetEntry customBFPE = getBackupfilesCurrentEntry();
- BackupFilesPresetEntry.backupfilesPresetEntriesValues.put(
- BackupFilesPresetEntry.BACKUPFILESSCHEMECUSTOM, customBFPE);
- Cache.applicationProperties.setProperty(
- BackupFilesPresetEntry.CUSTOMCONFIG, customBFPE.toString());
- }
-
- BackupFilesPresetEntry savedBFPE = BackupFilesPresetEntry.backupfilesPresetEntriesValues
- .get(preset);
- Cache.applicationProperties.setProperty(
- BackupFilesPresetEntry.SAVEDCONFIG, savedBFPE.toString());
- }
+ Cache.setPropertyNoSave(BackupFiles.CONFIRM_DELETE_OLD,
+ Boolean.toString(backupfilesConfirmDelete.isSelected()));
+ Cache.setPropertyNoSave(BackupFiles.ENABLED,
+ Boolean.toString(enableBackupFiles.isSelected()));
+ Cache.setPropertyNoSave(BackupFiles.NO_MAX,
+ Boolean.toString(backupfilesKeepAll.isSelected()));
+ Cache.setPropertyNoSave(BackupFiles.REVERSE_ORDER,
+ Boolean.toString(suffixReverse.isSelected()));
+ Cache.setPropertyNoSave(BackupFiles.SUFFIX,
+ suffixTemplate.getText());
+ Cache.setPropertyNoSave(BackupFiles.ROLL_MAX,
+ Integer.toString(getSpinnerInt(backupfilesRollMaxSpinner, 4)));
+ Cache.setPropertyNoSave(BackupFiles.SUFFIX_DIGITS,
+ Integer.toString(getSpinnerInt(suffixDigitsSpinner, 3)));
+ Cache.setPropertyNoSave(BackupFiles.NS + "_PRESET",
+ Integer.toString(getComboIntStringKey(backupfilesPresetsCombo)));
Cache.saveProperties();
- Desktop.instance.doConfigureStructurePrefs();
+ Desktop.getInstance().doConfigureStructurePrefs();
try
{
frame.setClosed(true);
}
}
+ public static void setAppletDefaults()
+ {
+
+ // http://www.jalview.org/old/v2_8/examples/appletParameters.html
+
+ // showConservation true or false Default is true.
+ // showQuality true or false Default is true.
+ // showConsensus true or false Default is true.
+ // showFeatureSettings true or false Shows the feature settings window when
+ // startin
+ // showTreeBootstraps true or false (default is true) show or hide branch
+ // bootstraps
+ // showTreeDistances true or false (default is true) show or hide branch
+ // lengths
+ // showUnlinkedTreeNodes true or false (default is false) indicate if
+ // unassociated nodes should be highlighted in the tree view
+ // showUnconserved true of false (default is false) When true, only gaps and
+ // symbols different to the consensus sequence ions of the alignment
+ // showGroupConsensus true of false (default is false) When true, shows
+ // consensus annotation row for any groups on the alignment. (since 2.7)
+ // showGroupConservation true of false (default is false) When true, shows
+ // amino-acid property conservation annotation row for any groups on the
+ // showConsensusHistogram true of false (default is true) When true, shows
+ // the percentage occurence of the consensus symbol for each column as a
+ // showSequenceLogo true of false (default is false) When true, shows a
+ // sequence logo above the consensus sequence (overlaid above the Consensus
+
+ Cache.setPropertyNoSave(SHOW_CONSERVATION, "true");
+ Cache.setPropertyNoSave(SHOW_QUALITY, "false");
+ Cache.setPropertyNoSave(SHOW_CONSENSUS, "true");
+ Cache.setPropertyNoSave(SHOW_UNCONSERVED, "false");
+ Cache.setPropertyNoSave(SHOW_GROUP_CONSERVATION, "false");
+ Cache.setPropertyNoSave(SHOW_GROUP_CONSENSUS, "false");
+
+ // TODO -- just a start here
+ }
+
/**
* Do any necessary validation before saving settings. Return focus to the
* first tab which fails validation.
FileFormatI format = chooser.getSelectedFormat();
if (format != null)
{
- Cache.applicationProperties.setProperty("DEFAULT_FILE_FORMAT",
+ Cache.setPropertyNoSave("DEFAULT_FILE_FORMAT",
format.getName());
}
startupFileTextfield
boolean valid = false;
while (!valid)
{
- if (JvOptionPane.showInternalConfirmDialog(Desktop.desktop, link,
+ if (JvOptionPane.showInternalConfirmDialog(Desktop.getDesktopPane(), link,
MessageManager.getString("label.new_sequence_url_link"),
JvOptionPane.OK_CANCEL_OPTION, -1,
null) == JvOptionPane.OK_OPTION)
boolean valid = false;
while (!valid)
{
- if (JvOptionPane.showInternalConfirmDialog(Desktop.desktop, link,
+ if (JvOptionPane.showInternalConfirmDialog(Desktop.getDesktopPane(), link,
MessageManager.getString("label.edit_sequence_url_link"),
JvOptionPane.OK_CANCEL_OPTION, -1,
null) == JvOptionPane.OK_OPTION)
super.showunconserved_actionPerformed(e);
}
+ /**
+ * not implemented -- returns empty list
+ *
+ * @return
+ */
public static List<String> getGroupURLLinks()
{
return groupURLLinks;
} catch (NumberFormatException x)
{
userIdWidth.setText("");
- JvOptionPane.showInternalMessageDialog(Desktop.desktop,
+ JvOptionPane.showInternalMessageDialog(Desktop.getDesktopPane(),
MessageManager
.getString("warn.user_defined_width_requirements"),
MessageManager.getString("label.invalid_id_column_width"),
* Returns true if chimera path is to a valid executable, else show an error
* dialog.
*/
- private boolean validateChimeraPath()
+ protected boolean validateChimeraPath()
{
if (chimeraPath.getText().trim().length() > 0)
{
File f = new File(chimeraPath.getText());
if (!f.canExecute())
{
- JvOptionPane.showInternalMessageDialog(Desktop.desktop,
+ JvOptionPane.showInternalMessageDialog(Desktop.getDesktopPane(),
MessageManager.getString("label.invalid_chimera_path"),
MessageManager.getString("label.invalid_name"),
JvOptionPane.ERROR_MESSAGE);
if (!found)
{
String[] options = { "OK", "Help" };
- int showHelp = JvOptionPane.showInternalOptionDialog(Desktop.desktop,
+ int showHelp = JvOptionPane.showInternalOptionDialog(Desktop.getDesktopPane(),
JvSwingUtils.wrapTooltip(true,
MessageManager.getString("label.chimera_missing")),
"", JvOptionPane.YES_NO_OPTION, JvOptionPane.WARNING_MESSAGE,
}
}
- private class UrlListSelectionHandler implements ListSelectionListener
+ protected class UrlListSelectionHandler implements ListSelectionListener
{
@Override
}
try
{
- int reply = JvOptionPane.showConfirmDialog(Desktop.desktop, // component,
+ int reply = JvOptionPane.showConfirmDialog(Desktop.getDesktopPane(), // component,
dialogText, dialogTitle,
(allowCancel) ? JvOptionPane.YES_NO_CANCEL_OPTION
: JvOptionPane.YES_NO_OPTION,
int yDelta = yPos - mouseY;
// Check if this is a rectangle drawing drag
- if ((evt.getModifiersEx() & InputEvent.BUTTON2_DOWN_MASK) != 0)
+ if ((evt.getModifiers() & InputEvent.BUTTON2_MASK) != 0)
{
// rectx2 = evt.getX();
// recty2 = evt.getY();
* The panel containing the sequence ruler (when not in wrapped mode), and
* supports a range of mouse operations to select, hide or reveal columns.
*/
+@SuppressWarnings("serial")
public class ScalePanel extends JPanel
implements MouseMotionListener, MouseListener, ViewportListenerI
{
});
pop.add(item);
- if (av.getAlignment().getHiddenColumns().hasMultiHiddenColumnRegions())
+ if (av.getAlignment().getHiddenColumns()
+ .hasMultiHiddenColumnRegions())
{
item = new JMenuItem(MessageManager.getString("action.reveal_all"));
item.addActionListener(new ActionListener()
// todo res calculation should be a method on AlignViewport
int xCords = Math.max(0, evt.getX()); // prevent negative X coordinates
ViewportRanges ranges = av.getRanges();
- int res = (xCords / av.getCharWidth())
- + ranges.getStartRes();
+ int res = (xCords / av.getCharWidth()) + ranges.getStartRes();
res = Math.min(res, ranges.getEndRes());
if (av.hasHiddenColumns())
{
@Override
public void paintComponent(Graphics g)
{
- //super.paintComponent(g); // BH 2019
+
+ // super.paintComponent(g); // BH 2019
/*
* shouldn't get called in wrapped mode as the scale above is
gg.fillPolygon(
new int[]
- { -1 + res * avCharWidth - avCharHeight / 4,
- -1 + res * avCharWidth + avCharHeight / 4,
- -1 + res * avCharWidth }, new int[]
- { y, y, y + 2 * yOf }, 3);
+ { -1 + res * avCharWidth - avCharHeight / 4,
+ -1 + res * avCharWidth + avCharHeight / 4,
+ -1 + res * avCharWidth },
+ new int[]
+ { y, y, y + 2 * yOf }, 3);
}
}
}
@Override
public void propertyChange(PropertyChangeEvent evt)
{
- // Respond to viewport change events (e.g. alignment panel was scrolled)
- // Both scrolling and resizing change viewport ranges: scrolling changes
- // both start and end points, but resize only changes end values.
- // Here we only want to fastpaint on a scroll, with resize using a normal
- // paint, so scroll events are identified as changes to the horizontal or
- // vertical start value.
- if (evt.getPropertyName().equals(ViewportRanges.STARTRES)
- || evt.getPropertyName().equals(ViewportRanges.STARTRESANDSEQ)
- || evt.getPropertyName().equals(ViewportRanges.MOVE_VIEWPORT))
+ switch (evt.getPropertyName())
{
+ case ViewportRanges.STARTRES:
+ case ViewportRanges.STARTRESANDSEQ:
+ case ViewportRanges.MOVE_VIEWPORT:
// scroll event, repaint panel
-
- // Call repaint on alignment panel so that repaints from other alignment
- // panel components can be aggregated. Otherwise performance of the overview
- // window and others may be adversely affected.
- av.getAlignPanel().repaint();
+ // original comment:
+ // Call repaint on alignment panel so that repaints from other alignment
+ // panel components can be aggregated. Otherwise performance of the
+ // overview
+ // window and others may be adversely affected.
+
+ // TODO: check this?
+ // BH: This is actually quite strange. AlignmentPanel is taking care of
+ // all of this with fast paint, so why indirectly trigger a repaint from
+ // the ScalePanel? Where do we see this behavior necessary?
+ // I have set this to check for a trigger from some other ViewportRanges,
+ // but I don't actually think that is possible.
+
+ if (evt.getSource() != av.getRanges())
+ {
+ av.getAlignPanel().repaint();
+ }
+ break;
}
}
+ public boolean isMouseDragging()
+ {
+ return mouseDragging;
+ }
+
}
gg.copyArea(horizontal * charWidth, vertical * charHeight,
img.getWidth(), img.getHeight(), -horizontal * charWidth,
-vertical * charHeight);
-
- /** @j2sNative xxi = this.img */
-
gg.translate(transX, transY);
drawPanel(gg, startRes, endRes, startSeq, endSeq, 0);
gg.translate(-transX, -transY);
public void paintComponent(Graphics g)
{
+ if (av.getAlignPanel().getHoldRepaint())
+ {
+ return;
+ }
int charHeight = av.getCharHeight();
int charWidth = av.getCharWidth();
- int width = getWidth();
- int height = getHeight();
+ int availWidth = getWidth();
+ int availHeight = getHeight();
- width -= (width % charWidth);
- height -= (height % charHeight);
+ availWidth -= (availWidth % charWidth);
+ availHeight -= (availHeight % charHeight);
// BH 2019 can't possibly fastPaint if either width or height is 0
- if (width == 0 || height == 0)
+ if (availWidth == 0 || availHeight == 0)
{
return;
}
// img is a cached version of the last view we drew.
// If we have no img or the size has changed, make a new one.
//
- if (img == null || width != img.getWidth()
- || height != img.getHeight())
+ if (img == null || availWidth != img.getWidth()
+ || availHeight != img.getHeight())
{
- img = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
+ img = new BufferedImage(availWidth, availHeight,
+ BufferedImage.TYPE_INT_RGB);
}
Graphics2D gg = (Graphics2D) img.getGraphics();
}
gg.setColor(Color.white);
- gg.fillRect(0, 0, img.getWidth(), img.getHeight());
+ gg.fillRect(0, 0, availWidth, availHeight);
if (av.getWrapAlignment())
{
- drawWrappedPanel(gg, width, height, ranges.getStartRes());
+ drawWrappedPanel(gg, availWidth, availHeight, ranges.getStartRes());
}
else
{
}
/**
- * Returns the visible width of the canvas in residues, after allowing for
- * East or West scales (if shown)
+ * Using the current font, determine fields labelWidthEast and labelWidthWest,
+ * and return the number of residues that can fill the remaining width.
*
- * @param canvasWidth
+ * @param width
* the width in pixels (possibly including scales)
*
- * @return
+ * @return the visible width in residues, after allowing for East or West
+ * scales (if shown)
+ *
*/
- public int getWrappedCanvasWidth(int canvasWidth)
+ public int getWrappedCanvasWidth(int width)
{
int charWidth = av.getCharWidth();
FontMetrics fm = getFontMetrics(av.getFont());
- int labelWidth = 0;
-
- if (av.getScaleRightWrapped() || av.getScaleLeftWrapped())
- {
- labelWidth = getLabelWidth(fm);
- }
+ int labelWidth = (av.getScaleRightWrapped() || av.getScaleLeftWrapped()
+ ? getLabelWidth(fm)
+ : 0);
labelWidthEast = av.getScaleRightWrapped() ? labelWidth : 0;
labelWidthWest = av.getScaleLeftWrapped() ? labelWidth : 0;
- return (canvasWidth - labelWidthEast - labelWidthWest) / charWidth;
+ return (width - labelWidthEast - labelWidthWest) / charWidth;
}
/**
maxWidth = Math.max(maxWidth, alignment.getSequenceAt(i).getEnd());
}
+ // quick int log10
int length = 0;
for (int i = maxWidth; i > 0; i /= 10)
{
* window
*
* @param g
- * @param canvasWidth
+ * @param availWidth
* available width in pixels
- * @param canvasHeight
+ * @param availHeight
* available height in pixels
* @param startColumn
* the first column (0...) of the alignment to draw
*/
- public void drawWrappedPanel(Graphics g, int canvasWidth,
- int canvasHeight, final int startColumn)
+ public void drawWrappedPanel(Graphics g, int availWidth, int availHeight,
+ final int startColumn)
{
- int wrappedWidthInResidues = calculateWrappedGeometry(canvasWidth,
- canvasHeight);
+ int wrappedWidthInResidues = calculateWrappedGeometry(availWidth,
+ availHeight);
av.setWrappedWidth(wrappedWidthInResidues);
// we need to call this again to make sure the startColumn +
// wrappedWidthInResidues values are used to calculate wrappedVisibleWidths
// correctly.
- calculateWrappedGeometry(canvasWidth, canvasHeight);
+ calculateWrappedGeometry(availWidth, availHeight);
/*
* draw one width at a time (excluding any scales shown),
{
int endColumn = Math
.min(maxWidth, start + wrappedWidthInResidues - 1);
- drawWrappedWidth(g, ypos, start, endColumn, canvasHeight);
+ drawWrappedWidth(g, ypos, start, endColumn, availHeight);
ypos += wrappedRepeatHeightPx;
start += wrappedWidthInResidues;
currentWidth++;
* <li>whether scales are shown left, right or above the alignment</li>
* </ul>
*
- * @param canvasWidth
- * @param canvasHeight
+ * @param availWidth
+ * @param availHeight
* @return the number of residue columns in each width
*/
- protected int calculateWrappedGeometry(int canvasWidth, int canvasHeight)
+ protected int calculateWrappedGeometry(int availWidth, int availHeight)
{
int charHeight = av.getCharHeight();
* ensuring a part height includes at least one sequence
*/
ViewportRanges ranges = av.getRanges();
- wrappedVisibleWidths = canvasHeight / wrappedRepeatHeightPx;
- int remainder = canvasHeight % wrappedRepeatHeightPx;
+ wrappedVisibleWidths = availHeight / wrappedRepeatHeightPx;
+ int remainder = availHeight % wrappedRepeatHeightPx;
if (remainder >= (wrappedSpaceAboveAlignment + charHeight))
{
wrappedVisibleWidths++;
/*
* compute width in residues; this also sets East and West label widths
*/
- int wrappedWidthInResidues = getWrappedCanvasWidth(canvasWidth);
+ int wrappedWidthInResidues = getWrappedCanvasWidth(availWidth);
/*
* limit visibleWidths to not exceed width of alignment
public void propertyChange(PropertyChangeEvent evt)
{
String eventName = evt.getPropertyName();
- // System.err.println(">>SeqCanvas propertyChange " + eventName);
- if (eventName.equals(SequenceGroup.SEQ_GROUP_CHANGED))
- {
- fastPaint = true;
- repaint();
- return;
- }
- else if (eventName.equals(ViewportRanges.MOVE_VIEWPORT))
- {
- fastPaint = false;
- // System.err.println("!!!! fastPaint false from MOVE_VIEWPORT");
- repaint();
- return;
- }
- int scrollX = 0;
- if (eventName.equals(ViewportRanges.STARTRES)
- || eventName.equals(ViewportRanges.STARTRESANDSEQ))
- {
- // Make sure we're not trying to draw a panel
- // larger than the visible window
- if (eventName.equals(ViewportRanges.STARTRES))
- {
- scrollX = (int) evt.getNewValue() - (int) evt.getOldValue();
- }
- else
- {
- scrollX = ((int[]) evt.getNewValue())[0]
- - ((int[]) evt.getOldValue())[0];
- }
- ViewportRanges vpRanges = av.getRanges();
+ // BH 2019.07.27 removes dead code introduced in aad3650 and simplifies
+ // logic, emphasizing no check for ENDRES or ENDSEQ
- int range = vpRanges.getEndRes() - vpRanges.getStartRes() + 1;
- if (scrollX > range)
- {
- scrollX = range;
- }
- else if (scrollX < -range)
- {
- scrollX = -range;
- }
- }
// Both scrolling and resizing change viewport ranges: scrolling changes
// both start and end points, but resize only changes end values.
// Here we only want to fastpaint on a scroll, with resize using a normal
// paint, so scroll events are identified as changes to the horizontal or
// vertical start value.
- if (eventName.equals(ViewportRanges.STARTRES))
- {
- if (av.getWrapAlignment())
- {
- fastPaintWrapped(scrollX);
- }
- else
- {
- fastPaint(scrollX, 0);
- }
- }
- else if (eventName.equals(ViewportRanges.STARTSEQ))
+
+ // Make sure we're not trying to draw a panel
+ // larger than the visible window
+ int scrollX = 0;
+ int scrollY = 0;
+ switch (eventName)
{
- // scroll
+ case SequenceGroup.SEQ_GROUP_CHANGED:
+ fastPaint = true;
+ repaint();
+ return;
+ case ViewportRanges.MOVE_VIEWPORT:
+ fastPaint = false;
+ repaint();
+ return;
+ case ViewportRanges.STARTSEQ:
+ // meaning STARTOREND
+ // typically scroll, but possibly just the end changed
fastPaint(0, (int) evt.getNewValue() - (int) evt.getOldValue());
- }
- else if (eventName.equals(ViewportRanges.STARTRESANDSEQ))
- {
- if (av.getWrapAlignment())
- {
- fastPaintWrapped(scrollX);
- }
- else
+ return;
+ case ViewportRanges.ENDRES:
+ case ViewportRanges.ENDSEQ:
+ // meaning second event along with "START" -- ENDONLY,NOTSTART
+ // TODO: ignore??
+ return;
+ case ViewportRanges.STARTRES:
+ // meaning STARTOREND
+ scrollX = (int) evt.getNewValue() - (int) evt.getOldValue();
+ break;
+ case ViewportRanges.STARTRESANDSEQ:
+ scrollX = ((int[]) evt.getNewValue())[0]
+ - ((int[]) evt.getOldValue())[0];
+ scrollY = ((int[]) evt.getNewValue())[1]
+ - ((int[]) evt.getOldValue())[1];
+
+ // System.out.println("SC dx dy " + scrollX + " " + scrollY);
+
+ if (scrollX != 0 && scrollY != 0)
{
- fastPaint(scrollX, 0);
+ // all sorts of problems in JavaScript if this is commented out.
+ repaint();
+ return;
+
}
+ break;
}
- else if (eventName.equals(ViewportRanges.STARTSEQ))
+
+ ViewportRanges vpRanges = av.getRanges();
+ int range = vpRanges.getEndRes() - vpRanges.getStartRes() + 1;
+ scrollX = Math.max(Math.min(scrollX, range), -range);
+ // only STARTRES or STARTRESANDSEQ:
+ if (av.getWrapAlignment())
{
- // scroll
- fastPaint(0, (int) evt.getNewValue() - (int) evt.getOldValue());
+ fastPaintWrapped(scrollX);
}
- else if (eventName.equals(ViewportRanges.STARTRESANDSEQ))
+ else
{
- if (av.getWrapAlignment())
- {
- fastPaintWrapped(scrollX);
- }
+ fastPaint(scrollX, scrollY);
}
+
+ // BH 2019.07.27 was:
+ // if (eventName.equals(SequenceGroup.SEQ_GROUP_CHANGED))
+ // {
+ // fastPaint = true;
+ // repaint();
+ // return;
+ // }
+ // else if (eventName.equals(ViewportRanges.MOVE_VIEWPORT))
+ // {
+ // fastPaint = false;
+ // // System.err.println("!!!! fastPaint false from MOVE_VIEWPORT");
+ // repaint();
+ // return;
+ // }
+ //
+ // if (eventName.equals(ViewportRanges.STARTRES)
+ // || eventName.equals(ViewportRanges.STARTRESANDSEQ))
+ // {
+ // // Make sure we're not trying to draw a panel
+ // // larger than the visible window
+ // if (eventName.equals(ViewportRanges.STARTRES))
+ // {
+ // scrollX = (int) evt.getNewValue() - (int) evt.getOldValue();
+ // }
+ // else
+ // {
+ // scrollX = ((int[]) evt.getNewValue())[0]
+ // - ((int[]) evt.getOldValue())[0];
+ // }
+ // ViewportRanges vpRanges = av.getRanges();
+ //
+ // int range = vpRanges.getEndRes() - vpRanges.getStartRes() + 1;
+ // if (scrollX > range)
+ // {
+ // scrollX = range;
+ // }
+ // else if (scrollX < -range)
+ // {
+ // scrollX = -range;
+ // }
+ // }
+ // Both scrolling and resizing change viewport ranges: scrolling changes
+ // both start and end points, but resize only changes end values.
+ // Here we only want to fastpaint on a scroll, with resize using a normal
+ // paint, so scroll events are identified as changes to the horizontal or
+ // vertical start value.
+ // BH 2019.07.27 was:
+ // if (eventName.equals(ViewportRanges.STARTRES))
+ // {
+ // if (av.getWrapAlignment())
+ // {
+ // fastPaintWrapped(scrollX);
+ // }
+ // else
+ // {
+ // fastPaint(scrollX, 0);
+ // }
+ // }
+ // else if (eventName.equals(ViewportRanges.STARTSEQ))
+ // {
+ // // scroll
+ // fastPaint(0, (int) evt.getNewValue() - (int) evt.getOldValue());
+ // }
+ // else if (eventName.equals(ViewportRanges.STARTRESANDSEQ))
+ // {
+ // if (av.getWrapAlignment())
+ // {
+ // fastPaintWrapped(scrollX);
+ // }
+ // else
+ // {
+ // fastPaint(scrollX, 0);
+ // }
+ // }
+ //
+ // BH oops!
+ //
+ // else if (eventName.equals(ViewportRanges.STARTSEQ))
+ // {
+ // // scroll
+ // fastPaint(0, (int) evt.getNewValue() - (int) evt.getOldValue());
+ // }
+ // else if (eventName.equals(ViewportRanges.STARTRESANDSEQ))
+ // {
+ // if (av.getWrapAlignment())
+ // {
+ // fastPaintWrapped(scrollX);
+ // }
+ // }
}
/**
import javax.swing.ToolTipManager;
/**
- * DOCUMENT ME!
+ * The main scrollable region containing the alignment and just to the right of
+ * the IDPanel.
*
* @author $author$
* @version $Revision: 1.130 $
MousePos o = (MousePos) obj;
boolean b = (column == o.column && seqIndex == o.seqIndex
&& annotationIndex == o.annotationIndex);
- // System.out.println(obj + (b ? "= " : "!= ") + this);
return b;
}
SearchResultsI lastSearchResults;
/**
- * Creates a new SeqPanel object
+ * Create a new SeqPanel.
*
* @param viewport
* @param alignPanel
return;
}
- // System.out.print(y1+" "+y2+" "+fixedLeft+" "+fixedRight+"~~");
// Selection spans a hidden region
if (fixedLeft < y1 && (fixedRight > y2 || fixedRight == -1))
{
{
lastMousePosition = null;
ap.alignFrame.setStatus(" ");
+
if (av.getWrapAlignment())
{
return;
}
- if (mouseDragging && scrollThread == null)
+ /*
+ * start scrolling if mouse dragging, whether the drag started
+ * in the scale panel or this panel
+ */
+ if (ap.getScalePanel().isMouseDragging())
+ {
+ ap.getScalePanel().mouseExited(e);
+ }
+ else if (mouseDragging && scrollThread == null)
{
startScrolling(e.getPoint());
}
// if (!scrollOnce() {t.stop();}) gives compiler error :-(
scrollThread.scrollOnce();
}
- }
- });
- t.addActionListener(new ActionListener()
- {
- @Override
- public void actionPerformed(ActionEvent e)
- {
if (scrollThread == null)
{
// SeqPanel.stopScrolling called
- t.stop();
+ ((Timer) e.getSource()).stop();
}
}
});
t.start();
}
- }
- else
- {
- /*
- * Java - run in a new thread
- */
- scrollThread.start();
+ else
+ {
+ /*
+ * Java - run in a new thread
+ */
+ scrollThread.start();
+ }
}
}
{
return lastSearchResults;
}
+
+ /**
+ * scroll to the given row/column - or nearest visible location
+ *
+ * @param row
+ * @param column
+ */
+ public void scrollTo(int row, int column)
+ {
+
+ row = row < 0 ? ap.av.getRanges().getStartSeq() : row;
+ column = column < 0 ? ap.av.getRanges().getStartRes() : column;
+ ap.scrollTo(column, column, row, true, true);
+ }
+
+ /**
+ * scroll to the given row - or nearest visible location
+ *
+ * @param row
+ */
+ public void scrollToRow(int row)
+ {
+
+ row = row < 0 ? ap.av.getRanges().getStartSeq() : row;
+ ap.scrollTo(ap.av.getRanges().getStartRes(),
+ ap.av.getRanges().getStartRes(), row, true, true);
+ }
+
+ /**
+ * scroll to the given column - or nearest visible location
+ *
+ * @param column
+ */
+ public void scrollToColumn(int column)
+ {
+
+ column = column < 0 ? ap.av.getRanges().getStartRes() : column;
+ ap.scrollTo(column, column, ap.av.getRanges().getStartSeq(), true,
+ true);
+ }
+
}
* If the selected source is Uniprot or PDB, a free text search panel is opened
* instead to perform the search and selection.
*/
+@SuppressWarnings("serial")
public class SequenceFetcher extends JPanel implements Runnable
{
- private static jalview.ws.SequenceFetcher sfetch = null;
JLabel exampleAccession;
volatile boolean _isConstructing = false;
/**
- * Returns the shared instance of the SequenceFetcher client
- *
- * @return
- */
- public static jalview.ws.SequenceFetcher getSequenceFetcherSingleton()
- {
- if (sfetch == null)
- {
- sfetch = new jalview.ws.SequenceFetcher();
- }
- return sfetch;
- }
-
- /**
* Constructor given a client to receive any status or progress messages
* (currently either the Desktop, or an AlignFrame panel)
*
final String selectedDb, final String queryString)
{
this.progressIndicator = guiIndic;
- getSequenceFetcherSingleton();
+
this.guiWindow = progressIndicator;
if (progressIndicator instanceof AlignFrame)
database = new JComboBox<>();
database.setFont(JvSwingUtils.getLabelFont());
database.setPrototypeDisplayValue("ENSEMBLGENOMES ");
- String[] sources = new jalview.ws.SequenceFetcher().getSupportedDb();
+ String[] sources = jalview.ws.SequenceFetcher.getInstance()
+ .getSupportedDb();
Arrays.sort(sources, String.CASE_INSENSITIVE_ORDER);
database.addItem(MessageManager.getString("action.select_ddbb"));
for (String source : sources)
{
StringBuilder sb = new StringBuilder();
HashSet<String> hs = new HashSet<>();
- for (DbSourceProxy dbs : sfetch.getSourceProxy(db))
+ for (DbSourceProxy dbs : jalview.ws.SequenceFetcher.getInstance()
+ .getSourceProxy(db))
{
String tq = dbs.getTestQuery();
if (hs.add(tq)) // not a duplicate source
List<String> presultTitle = new ArrayList<>();
List<AlignmentI> presult = new ArrayList<>();
List<AlignmentI> aresult = new ArrayList<>();
- List<DbSourceProxy> sources = sfetch
+ List<DbSourceProxy> sources = jalview.ws.SequenceFetcher.getInstance()
.getSourceProxy((String) database.getSelectedItem());
Iterator<DbSourceProxy> proxies = sources.iterator();
String[] qries = textArea.getText().trim().split(";");
{
af.getViewport().applyFeaturesStyle(preferredFeatureColours);
}
- if (Cache.getDefault("HIDE_INTRONS", true))
+ if (Cache.getDefault(Preferences.HIDE_INTRONS, true))
{
af.hideFeatureColumns(SequenceOntologyI.EXON, false);
}
try
{
- af.setMaximum(Cache.getDefault("SHOW_FULLSCREEN", false));
+ af.setMaximum(
+ Cache.getDefault(Preferences.SHOW_FULLSCREEN, false));
} catch (Exception ex)
{
}
@Override
public void run()
{
- JvOptionPane.showInternalMessageDialog(Desktop.desktop, error,
+ JvOptionPane.showInternalMessageDialog(Desktop.getDesktopPane(), error,
MessageManager.getString("label.error_retrieving_data"),
JvOptionPane.WARNING_MESSAGE);
}
import java.awt.FontMetrics;
import java.awt.Graphics;
-import org.jfree.graphics2d.svg.SVGGraphics2D;
-import org.jibble.epsgraphics.EpsGraphics2D;
-
public class SequenceRenderer implements jalview.api.SequenceRenderer
{
final static int CHAR_TO_UPPER = 'A' - 'a';
}
graphics.setColor(av.getTextColour());
- boolean drawAllText = monospacedFont && av.getShowText() && allGroups.length == 0
- && !av.getColourText() && av.getThresholdTextColour() == 0;
-
- /*
- * EPS or SVG misaligns monospaced strings (JAL-3239)
- * so always draw these one character at a time
- */
- if (graphics instanceof EpsGraphics2D
- || graphics instanceof SVGGraphics2D)
- {
- drawAllText = false;
- }
- if (drawAllText)
+ if (monospacedFont && av.getShowText() && allGroups.length == 0
+ && !av.getColourText() && av.getThresholdTextColour() == 0)
{
if (av.isRenderGaps())
{
import jalview.renderer.ResidueShaderI;
import jalview.util.MessageManager;
-import java.awt.event.ActionEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.beans.PropertyVetoException;
* @author $author$
* @version $Revision$
*/
+@SuppressWarnings("serial")
public class SliderPanel extends GSliderPanel
{
private static final String BACKGROUND = "Background";
- static JInternalFrame conservationSlider;
-
- static JInternalFrame PIDSlider;
-
AlignmentPanel ap;
boolean forConservation = true;
*/
public static SliderPanel getSliderPanel()
{
+
+ JInternalFrame conservationSlider = Desktop
+ .getInstance().conservationSlider;
+
+ JInternalFrame PIDSlider = Desktop.getInstance().PIDSlider;
+
if (conservationSlider != null && conservationSlider.isVisible())
{
return (SliderPanel) conservationSlider.getContentPane();
{
SliderPanel sliderPanel = null;
+ JInternalFrame conservationSlider = Desktop
+ .getInstance().conservationSlider;
+
if (conservationSlider == null)
{
sliderPanel = new SliderPanel(ap, rs.getConservationInc(), true, rs);
- conservationSlider = new JInternalFrame();
+ conservationSlider = Desktop
+ .getInstance().conservationSlider = new JInternalFrame();
conservationSlider.setContentPane(sliderPanel);
conservationSlider.setLayer(JLayeredPane.PALETTE_LAYER);
}
*/
public static void hidePIDSlider()
{
+ JInternalFrame PIDSlider = Desktop.getInstance().PIDSlider;
+
if (PIDSlider != null)
{
try
{
PIDSlider.setClosed(true);
- PIDSlider = null;
+ Desktop.getInstance().PIDSlider = null;
} catch (PropertyVetoException ex)
{
}
*/
public static void hideConservationSlider()
{
+ JInternalFrame conservationSlider = Desktop
+ .getInstance().conservationSlider;
+
if (conservationSlider != null)
{
try
{
conservationSlider.setClosed(true);
- conservationSlider = null;
+ Desktop.getInstance().conservationSlider = null;
} catch (PropertyVetoException ex)
{
}
{
hidePIDSlider();
+ JInternalFrame conservationSlider = Desktop
+ .getInstance().conservationSlider;
+
if (!conservationSlider.isVisible())
{
Desktop.addInternalFrame(conservationSlider,
@Override
public void internalFrameClosed(InternalFrameEvent e)
{
- conservationSlider = null;
+ Desktop.getInstance().conservationSlider = null;
}
});
conservationSlider.setLayer(JLayeredPane.PALETTE_LAYER);
SliderPanel sliderPanel = null;
+ JInternalFrame PIDSlider = Desktop.getInstance().PIDSlider;
+
if (PIDSlider == null)
{
sliderPanel = new SliderPanel(ap, threshold, false, rs);
- PIDSlider = new JInternalFrame();
+ PIDSlider = Desktop.getInstance().PIDSlider = new JInternalFrame();
PIDSlider.setContentPane(sliderPanel);
PIDSlider.setLayer(JLayeredPane.PALETTE_LAYER);
}
{
hideConservationSlider();
+ JInternalFrame PIDSlider = Desktop.getInstance().PIDSlider;
+
if (!PIDSlider.isVisible())
{
Desktop.addInternalFrame(PIDSlider, PIDSlider.getTitle(), true,
@Override
public void internalFrameClosed(InternalFrameEvent e)
{
- PIDSlider = null;
+ Desktop.getInstance().PIDSlider = null;
}
});
PIDSlider.setLayer(JLayeredPane.PALETTE_LAYER);
public static int getConservationValue()
{
- return getValue(conservationSlider);
+ return getValue(Desktop.getInstance().conservationSlider);
}
static int getValue(JInternalFrame slider)
public static int getPIDValue()
{
- return getValue(PIDSlider);
+ return getValue(Desktop.getInstance().PIDSlider);
}
/**
public String getTitle()
{
String title = null;
+ JInternalFrame conservationSlider = Desktop
+ .getInstance().conservationSlider;
+ JInternalFrame PIDSlider = Desktop.getInstance().PIDSlider;
+
if (isForConservation())
{
if (conservationSlider != null)
*/
{
authlist = new JTextPane();
- Thread t = new Thread(this);
+ Thread t = new Thread(this, "SplashScreen");
t.start();
}
}
System.err.println("Error when loading images!");
}
} while (!mt.checkAll());
- Desktop.instance.setIconImage(logo);
+ Desktop.getInstance().setIconImage(logo);
}
} catch (Exception ex)
{
}
add(authlist, BorderLayout.CENTER);
authlist.addMouseListener(closer);
- Desktop.desktop.add(iframe);
+ Desktop.getDesktopPane().add(iframe);
refreshText();
}
@SuppressWarnings("unused")
protected boolean refreshText()
{
- String newtext = Desktop.instance.getAboutMessage(true).toString();
+ Desktop desktop = Desktop.getInstance();
+ String newtext = desktop.getAboutMessage(true).toString();
// System.err.println("Text found: \n"+newtext+"\nEnd of newtext.");
if (oldtext != newtext.length())
{
authlist.setSize(new Dimension(750, 375));
add(authlist, BorderLayout.CENTER);
revalidate();
- iframe.setBounds((Desktop.instance.getWidth() - 750) / 2,
- (Desktop.instance.getHeight() - 375) / 2, 750,
+ iframe.setBounds((desktop.getWidth() - 750) / 2,
+ (desktop.getHeight() - 375) / 2, 750,
authlist.getHeight() + iconimg.getHeight());
iframe.validate();
iframe.setVisible(true);
}
closeSplash();
- Desktop.instance.startDialogQueue();
+ Desktop.getInstance().startDialogQueue();
}
/**
// allow about 65 pixels for Desktop decorators on Windows
int newHeight = Math.min(height,
- Desktop.instance.getHeight() - DESKTOP_DECORATORS_HEIGHT);
+ Desktop.getInstance().getHeight() - DESKTOP_DECORATORS_HEIGHT);
if (newHeight != height)
{
int oldDividerLocation = getDividerLocation();
{
// TODO if CommandListener is only ever 1:1 for complementary views,
// may change broadcast pattern to direct messaging (more efficient)
- final StructureSelectionManager ssm = StructureSelectionManager
- .getStructureSelectionManager(Desktop.instance);
+ final StructureSelectionManager ssm = Desktop
+ .getStructureSelectionManager();
ssm.addCommandListener(((AlignFrame) getTopFrame()).getViewport());
ssm.addCommandListener(((AlignFrame) getBottomFrame()).getViewport());
}
public void internalFrameClosed(InternalFrameEvent evt)
{
close();
- };
+ }
});
}
* Ctrl-W / Cmd-W - close view or window
*/
KeyStroke key_cmdW = KeyStroke.getKeyStroke(KeyEvent.VK_W,
- jalview.util.ShortcutKeyMaskExWrapper.getMenuShortcutKeyMaskEx(), false);
+ Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(), false);
action = new AbstractAction()
{
@Override
* Ctrl-T / Cmd-T open new view
*/
KeyStroke key_cmdT = KeyStroke.getKeyStroke(KeyEvent.VK_T,
- jalview.util.ShortcutKeyMaskExWrapper.getMenuShortcutKeyMaskEx(), false);
+ Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(), false);
AbstractAction action = new AbstractAction()
{
@Override
*/
adjustLayout();
- final StructureSelectionManager ssm = StructureSelectionManager
- .getStructureSelectionManager(Desktop.instance);
+ final StructureSelectionManager ssm = Desktop
+ .getStructureSelectionManager();
ssm.addCommandListener(newTopPanel.av);
ssm.addCommandListener(newBottomPanel.av);
}
*/
protected void expandViews_actionPerformed()
{
- Desktop.instance.explodeViews(this);
+ Desktop.getInstance().explodeViews(this);
}
/**
*/
protected void gatherViews_actionPerformed()
{
- Desktop.instance.gatherViews(this);
+ Desktop.getInstance().gatherViews(this);
}
/**
* Ctrl-F / Cmd-F open Finder dialog, 'focused' on the right alignment
*/
KeyStroke key_cmdF = KeyStroke.getKeyStroke(KeyEvent.VK_F,
- jalview.util.ShortcutKeyMaskExWrapper.getMenuShortcutKeyMaskEx(), false);
+ Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(), false);
AbstractAction action = new AbstractAction()
{
@Override
import jalview.fts.service.pdb.PDBFTSRestClient;
import jalview.io.DataSourceType;
import jalview.jbgui.GStructureChooser;
-import jalview.structure.StructureMapping;
import jalview.structure.StructureSelectionManager;
import jalview.util.MessageManager;
-import jalview.ws.DBRefFetcher;
-import jalview.ws.sifts.SiftsSettings;
import java.awt.event.ItemEvent;
import java.util.ArrayList;
{
private static final String AUTOSUPERIMPOSE = "AUTOSUPERIMPOSE";
- private static int MAX_QLENGTH = 7820;
+ private static final int MAX_QLENGTH = 7820;
- private SequenceI selectedSequence;
+ protected SequenceI selectedSequence;
- private SequenceI[] selectedSequences;
+ public SequenceI[] selectedSequences;
private IProgressIndicator progressIndicator;
- private Collection<FTSData> discoveredStructuresSet;
+ protected Collection<FTSData> discoveredStructuresSet;
- private FTSRestRequest lastPdbRequest;
+ protected FTSRestRequest lastPdbRequest;
- private FTSRestClientI pdbRestClient;
+ protected FTSRestClientI pdbRestClient;
- private String selectedPdbFileName;
+ protected String selectedPdbFileName;
- private boolean isValidPBDEntry;
+ protected boolean isValidPBDEntry;
- private boolean cachedPDBExists;
-
- private static StructureViewer lastTargetedView = null;
+ protected boolean cachedPDBExists;
public StructureChooser(SequenceI[] selectedSeqs, SequenceI selectedSeq,
AlignmentPanel ap)
* structures may be added. If this list is empty then it, and the 'Add'
* button, are hidden.
*/
- private void discoverStructureViews()
+ protected void discoverStructureViews()
{
- if (Desktop.instance != null)
+ Desktop desktop = Desktop.getInstance();
+ if (desktop != null)
{
targetView.removeAllItems();
- if (lastTargetedView != null && !lastTargetedView.isVisible())
+ if (desktop.lastTargetedView != null
+ && !desktop.lastTargetedView.isVisible())
{
- lastTargetedView = null;
+ desktop.lastTargetedView = null;
}
int linkedViewsAt = 0;
- for (StructureViewerBase view : Desktop.instance
+ for (StructureViewerBase view : desktop
.getStructureViewers(null, null))
{
- StructureViewer viewHandler = (lastTargetedView != null
- && lastTargetedView.sview == view) ? lastTargetedView
+ StructureViewer viewHandler = (desktop.lastTargetedView != null
+ && desktop.lastTargetedView.sview == view)
+ ? desktop.lastTargetedView
: StructureViewer.reconfigure(view);
if (view.isLinkedWith(ap))
if (targetView.getItemCount() > 0)
{
targetView.setVisible(true);
- if (lastTargetedView != null)
+ if (desktop.lastTargetedView != null)
{
- targetView.setSelectedItem(lastTargetedView);
+ targetView.setSelectedItem(desktop.lastTargetedView);
}
else
{
/**
* structure viewer opened by this dialog, or null
*/
- private StructureViewer sViewer = null;
+ protected StructureViewer sViewer = null;
public void showStructures(boolean waitUntilFinished)
{
- final StructureSelectionManager ssm = ap.getStructureSelectionManager();
-
final int preferredHeight = pnl_filter.getHeight();
Runnable viewStruc = new Runnable()
}
SequenceI[] selectedSeqs = selectedSeqsToView
.toArray(new SequenceI[selectedSeqsToView.size()]);
- sViewer = launchStructureViewer(ssm, pdbEntriesToView, ap,
+ sViewer = launchStructureViewer(ap, pdbEntriesToView,
selectedSeqs);
}
else if (currentView == VIEWS_LOCAL_PDB)
}
SequenceI[] selectedSeqs = selectedSeqsToView
.toArray(new SequenceI[selectedSeqsToView.size()]);
- sViewer = launchStructureViewer(ssm, pdbEntriesToView, ap,
+ sViewer = launchStructureViewer(ap, pdbEntriesToView,
selectedSeqs);
}
else if (currentView == VIEWS_ENTER_ID)
}
PDBEntry[] pdbEntriesToView = new PDBEntry[] { pdbEntry };
- sViewer = launchStructureViewer(ssm, pdbEntriesToView, ap,
+ sViewer = launchStructureViewer(ap, pdbEntriesToView,
new SequenceI[]
{ selectedSequence });
}
{
selectedSequence = userSelectedSeq;
}
- PDBEntry fileEntry = new AssociatePdbFileWithSeq()
+ PDBEntry fileEntry = AssociatePdbFileWithSeq
.associatePdbWithSeq(selectedPdbFileName,
- DataSourceType.FILE, selectedSequence, true,
- Desktop.instance);
+ DataSourceType.FILE, selectedSequence, true);
sViewer = launchStructureViewer(
- ssm, new PDBEntry[]
- { fileEntry }, ap,
+ ap, new PDBEntry[]
+ { fileEntry },
new SequenceI[]
{ selectedSequence });
}
}
}
- private PDBEntry getFindEntry(String id, Vector<PDBEntry> pdbEntries)
+ protected PDBEntry getFindEntry(String id, Vector<PDBEntry> pdbEntries)
{
Objects.requireNonNull(id);
Objects.requireNonNull(pdbEntries);
* Answers a structure viewer (new or existing) configured to superimpose
* added structures or not according to the user's choice
*
- * @param ssm
* @return
*/
- StructureViewer getTargetedStructureViewer(
- StructureSelectionManager ssm)
+ StructureViewer getTargetedStructureViewer()
{
- Object sv = targetView.getSelectedItem();
+ final StructureSelectionManager ssm = ap.getStructureSelectionManager();
+ Object sv = (targetView == null ? null : targetView.getSelectedItem());
return sv == null ? new StructureViewer(ssm) : (StructureViewer) sv;
}
/**
* Adds PDB structures to a new or existing structure viewer
*
- * @param ssm
+ * @param ap
* @param pdbEntriesToView
- * @param alignPanel
* @param sequences
- * @return
+ * @param superimpose
+ * @return viewer
*/
- private StructureViewer launchStructureViewer(
- StructureSelectionManager ssm,
- final PDBEntry[] pdbEntriesToView,
- final AlignmentPanel alignPanel, SequenceI[] sequences)
+ protected StructureViewer launchStructureViewer(
+ AlignmentPanel ap, PDBEntry[] pdbEntriesToView,
+ SequenceI[] selectedSeqs)
{
- long progressId = sequences.hashCode();
- setProgressBar(MessageManager
- .getString("status.launching_3d_structure_viewer"), progressId);
- final StructureViewer theViewer = getTargetedStructureViewer(ssm);
boolean superimpose = chk_superpose.isSelected();
- theViewer.setSuperpose(superimpose);
-
/*
* remember user's choice of superimpose or not
*/
Cache.setProperty(AUTOSUPERIMPOSE,
Boolean.valueOf(superimpose).toString());
-
- setProgressBar(null, progressId);
- if (SiftsSettings.isMapWithSifts())
- {
- List<SequenceI> seqsWithoutSourceDBRef = new ArrayList<>();
- int p = 0;
- // TODO: skip PDBEntry:Sequence pairs where PDBEntry doesn't look like a
- // real PDB ID. For moment, we can also safely do this if there is already
- // a known mapping between the PDBEntry and the sequence.
- for (SequenceI seq : sequences)
- {
- PDBEntry pdbe = pdbEntriesToView[p++];
- if (pdbe != null && pdbe.getFile() != null)
- {
- StructureMapping[] smm = ssm.getMapping(pdbe.getFile());
- if (smm != null && smm.length > 0)
- {
- for (StructureMapping sm : smm)
- {
- if (sm.getSequence() == seq)
- {
- continue;
- }
- }
- }
- }
- if (seq.getPrimaryDBRefs().isEmpty())
- {
- seqsWithoutSourceDBRef.add(seq);
- continue;
- }
- }
- if (!seqsWithoutSourceDBRef.isEmpty())
- {
- int y = seqsWithoutSourceDBRef.size();
- setProgressBar(MessageManager.formatMessage(
- "status.fetching_dbrefs_for_sequences_without_valid_refs",
- y), progressId);
- SequenceI[] seqWithoutSrcDBRef = seqsWithoutSourceDBRef
- .toArray(new SequenceI[y]);
- DBRefFetcher dbRefFetcher = new DBRefFetcher(seqWithoutSrcDBRef);
- dbRefFetcher.fetchDBRefs(true);
-
- setProgressBar("Fetch complete.", progressId); // todo i18n
- }
- }
- if (pdbEntriesToView.length > 1)
- {
- setProgressBar(MessageManager.getString(
- "status.fetching_3d_structures_for_selected_entries"),
- progressId);
- theViewer.viewStructures(pdbEntriesToView, sequences, alignPanel);
- }
- else
- {
- setProgressBar(MessageManager.formatMessage(
- "status.fetching_3d_structures_for",
- pdbEntriesToView[0].getId()),progressId);
- theViewer.viewStructures(pdbEntriesToView[0], sequences, alignPanel);
- }
- setProgressBar(null, progressId);
- // remember the last viewer we used...
- lastTargetedView = theViewer;
- return theViewer;
+ return StructureViewer.launchStructureViewer(ap, pdbEntriesToView, selectedSeqs,
+ superimpose, getTargetedStructureViewer(), progressBar);
}
/**
protected void txt_search_ActionPerformed()
{
String text = txt_search.getText().trim();
- if (text.length() >= PDB_ID_MIN)
+ if (text.length() >= PDB_ID_MIN)
+ {
new Thread()
{
}
}.start();
}
+ }
@Override
protected void tabRefresh()
@Override
public void setProgressBar(String message, long id)
{
- progressBar.setProgressBar(message, id);
+ if (progressBar != null)
+ {
+ progressBar.setProgressBar(message, id);
+ }
}
@Override
import jalview.datamodel.PDBEntry;
import jalview.datamodel.SequenceI;
import jalview.datamodel.StructureViewerModel;
+import jalview.structure.StructureMapping;
import jalview.structure.StructureSelectionManager;
+import jalview.util.MessageManager;
+import jalview.util.Platform;
+import jalview.ws.DBRefFetcher;
+import jalview.ws.sifts.SiftsSettings;
import java.awt.Rectangle;
import java.util.ArrayList;
*/
public class StructureViewer
{
+
+ static
+ {
+ Platform.loadStaticResource("core/core_jvjmol.z.js",
+ "org.jmol.viewer.Viewer");
+ }
+
private static final String UNKNOWN_VIEWER_TYPE = "Unknown structure viewer type ";
StructureSelectionManager ssm;
superposeAdded = alignAddedStructures;
}
+ /**
+ * Launch a minimal implementation of a StructureViewer.
+ *
+ * @param alignPanel
+ * @param pdb
+ * @param seqs
+ * @return
+ */
+ public static StructureViewer launchStructureViewer(
+ AlignmentPanel alignPanel, PDBEntry pdb, SequenceI[] seqs)
+ {
+ return launchStructureViewer(alignPanel, new PDBEntry[] { pdb }, seqs,
+ false, null, null);
+ }
+
+ /**
+ * Launch a structure viewer with or without an open StructureChooser.
+ *
+ * Moved from StructureChooser to enable JalviewJS startup with structure
+ * display.
+ *
+ * @param ap
+ * @param pdbEntriesToView
+ * @param sequences
+ * @param superimpose
+ * @param theViewer
+ * @param pb
+ * @return
+ */
+ protected static StructureViewer launchStructureViewer(
+ final AlignmentPanel ap,
+ final PDBEntry[] pdbEntriesToView, SequenceI[] sequences,
+ boolean superimpose, StructureViewer theViewer,
+ IProgressIndicator pb)
+ {
+ final StructureSelectionManager ssm = ap.getStructureSelectionManager();
+ long progressId = sequences.hashCode();
+ if (pb != null)
+ {
+ pb.setProgressBar(MessageManager
+ .getString("status.launching_3d_structure_viewer"), progressId);
+ }
+ if (theViewer == null)
+ {
+ theViewer = new StructureViewer(ssm);
+ }
+ theViewer.setSuperpose(superimpose);
+
+ if (pb != null)
+ {
+ pb.setProgressBar(null, progressId);
+ }
+ if (SiftsSettings.isMapWithSifts())
+ {
+ List<SequenceI> seqsWithoutSourceDBRef = new ArrayList<>();
+ int p = 0;
+ // TODO: skip PDBEntry:Sequence pairs where PDBEntry doesn't look like a
+ // real PDB ID. For moment, we can also safely do this if there is already
+ // a known mapping between the PDBEntry and the sequence.
+ for (SequenceI seq : sequences)
+ {
+ PDBEntry pdbe = pdbEntriesToView[p++];
+ if (pdbe != null && pdbe.getFile() != null)
+ {
+ StructureMapping[] smm = ssm.getMapping(pdbe.getFile());
+ if (smm != null && smm.length > 0)
+ {
+ for (StructureMapping sm : smm)
+ {
+ if (sm.getSequence() == seq)
+ {
+ continue;
+ }
+ }
+ }
+ }
+ if (seq.getPrimaryDBRefs().isEmpty())
+ {
+ seqsWithoutSourceDBRef.add(seq);
+ continue;
+ }
+ }
+ if (!seqsWithoutSourceDBRef.isEmpty())
+ {
+ int y = seqsWithoutSourceDBRef.size();
+ if (pb != null)
+ {
+ pb.setProgressBar(MessageManager.formatMessage(
+ "status.fetching_dbrefs_for_sequences_without_valid_refs",
+ y), progressId);
+ }
+ SequenceI[] seqWithoutSrcDBRef = seqsWithoutSourceDBRef
+ .toArray(new SequenceI[y]);
+ DBRefFetcher dbRefFetcher = new DBRefFetcher(seqWithoutSrcDBRef);
+ dbRefFetcher.fetchDBRefs(true);
+
+ if (pb != null)
+ {
+ pb.setProgressBar("Fetch complete.", progressId); // todo i18n
+ }
+ }
+ }
+ if (pdbEntriesToView.length > 1)
+ {
+ if (pb != null)
+ {
+ pb.setProgressBar(MessageManager.getString(
+ "status.fetching_3d_structures_for_selected_entries"),
+ progressId);
+ }
+ theViewer.viewStructures(pdbEntriesToView, sequences, ap);
+ }
+ else
+ {
+ if (pb != null)
+ {
+ pb.setProgressBar(MessageManager.formatMessage(
+ "status.fetching_3d_structures_for",
+ pdbEntriesToView[0].getId()),progressId);
+ }
+ theViewer.viewStructures(pdbEntriesToView[0], sequences, ap);
+ }
+ if (pb != null)
+ {
+ pb.setProgressBar(null, progressId);
+ }
+ // remember the last viewer we used...
+ Desktop.getInstance().lastTargetedView = theViewer;
+ return theViewer;
+ }
+
}
*/
protected List<StructureViewerBase> getViewersFor(AlignmentPanel alp)
{
- return Desktop.instance.getStructureViewers(alp, this.getClass());
+ return Desktop.getInstance().getStructureViewers(alp, this.getClass());
}
@Override
private static final Font VERDANA_BOLD_10 = new Font("Verdana", Font.BOLD,
10);
- public static final String USER_DEFINED_COLOURS = "USER_DEFINED_COLOURS";
-
private static final String LAST_DIRECTORY = "LAST_DIRECTORY";
private static final int MY_FRAME_HEIGHT = 440;
{
if (isNoSelectionMade())
{
- JvOptionPane.showMessageDialog(Desktop.desktop,
+ JvOptionPane.showMessageDialog(Desktop.getDesktopPane(),
MessageManager
.getString("label.no_colour_selection_in_scheme"),
MessageManager.getString("label.no_colour_selection_warn"),
String[] options = new String[] { title,
MessageManager.getString("label.dont_save_changes"), };
final String question = JvSwingUtils.wrapTooltip(true, message);
- int response = JvOptionPane.showOptionDialog(Desktop.desktop,
+ int response = JvOptionPane.showOptionDialog(Desktop.getDesktopPane(),
question, title, JvOptionPane.DEFAULT_OPTION,
JvOptionPane.PLAIN_MESSAGE, null, options, options[0]);
{
if (isNoSelectionMade())
{
- JvOptionPane.showMessageDialog(Desktop.desktop,
+ JvOptionPane.showMessageDialog(Desktop.getDesktopPane(),
MessageManager
.getString("label.no_colour_selection_in_scheme"),
MessageManager.getString("label.no_colour_selection_warn"),
/**
* Loads the user-defined colour scheme from the first file listed in property
- * "USER_DEFINED_COLOURS". If this fails, returns an all-white colour scheme.
+ * Preferences.USER_DEFINED_COLOURS. If this fails, returns an all-white colour scheme.
*
* @return
*/
{
UserColourScheme ret = null;
- String colours = Cache.getProperty(USER_DEFINED_COLOURS);
+ String colours = Cache.getProperty(Preferences.USER_DEFINED_COLOURS);
if (colours != null)
{
if (colours.indexOf("|") > -1)
String name = schemeName.getText().trim();
if (name.length() < 1)
{
- JvOptionPane.showInternalMessageDialog(Desktop.desktop,
+ JvOptionPane.showInternalMessageDialog(Desktop.getDesktopPane(),
MessageManager
.getString("label.user_colour_scheme_must_have_name"),
MessageManager.getString("label.no_name_colour_scheme"),
* @j2sIgnore
*/
{
- int reply = JvOptionPane.showInternalConfirmDialog(Desktop.desktop,
+ int reply = JvOptionPane.showInternalConfirmDialog(Desktop.getDesktopPane(),
MessageManager.formatMessage(
"label.colour_scheme_exists_overwrite", new Object[]
{ name, name }),
* update the delimited list of user defined colour files in
* Jalview property USER_DEFINED_COLOURS
*/
- String defaultColours = Cache.getDefault(USER_DEFINED_COLOURS,
+ String defaultColours = Cache.getDefault(
+ Preferences.USER_DEFINED_COLOURS,
filePath);
if (defaultColours.indexOf(filePath) == -1)
{
}
defaultColours = defaultColours.concat(filePath);
}
- Cache.setProperty(USER_DEFINED_COLOURS, defaultColours);
+ Cache.setProperty(Preferences.USER_DEFINED_COLOURS, defaultColours);
/*
* construct and register the colour scheme
package jalview.gui;
import jalview.util.MessageManager;
+import jalview.util.Platform;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
-import javax.swing.JOptionPane;
-
public class UserQuestionnaireCheck implements Runnable
{
/**
return prompt;
}
+ @Override
public void run()
{
if (url == null)
try
{
// First - check to see if wee have an old questionnaire/response id pair.
- String lastq = jalview.bin.Cache.getProperty("QUESTIONNAIRE");
+ String lastq = jalview.bin.Cache.getProperty(Preferences.QUESTIONNAIRE);
if (lastq == null)
{
prompt = checkresponse(new URL(url
if (qid != null && rid != null)
{
// Update our local property cache with latest qid and rid
- jalview.bin.Cache.setProperty("QUESTIONNAIRE", qid + ":" + rid);
+ jalview.bin.Cache.setProperty(Preferences.QUESTIONNAIRE, qid + ":" + rid);
}
if (prompt)
{
+ qid + "&rid=" + rid;
jalview.bin.Cache.log
.info("Prompting user for questionnaire at " + qurl);
- int reply = JvOptionPane.showInternalConfirmDialog(Desktop.desktop,
+ int reply = JvOptionPane.showInternalConfirmDialog(Desktop.getDesktopPane(),
MessageManager.getString("label.jalview_new_questionnaire"),
MessageManager.getString("label.jalview_user_survey"),
JvOptionPane.YES_NO_OPTION, JvOptionPane.QUESTION_MESSAGE);
if (reply == JvOptionPane.YES_OPTION)
{
jalview.bin.Cache.log.debug("Opening " + qurl);
- jalview.util.BrowserLauncher.openURL(qurl);
+ Platform.openURL(qurl);
}
}
} catch (Exception e)
}
} catch (InvalidSessionDocumentException e)
{
- JvOptionPane.showInternalMessageDialog(Desktop.desktop,
+ JvOptionPane.showInternalMessageDialog(Desktop.getDesktopPane(),
MessageManager.getString(
"label.vamsas_doc_couldnt_be_opened_as_new_session"),
VamsasAppDatastore vds = new VamsasAppDatastore(doc, vobj2jv, jv2vobj,
baseProvEntry(), alRedoState);
// wander through frames
- JInternalFrame[] frames = Desktop.desktop.getAllFrames();
+ JInternalFrame[] frames = Desktop.getDesktopPane().getAllFrames();
if (frames == null)
{
Cache.log.debug(
"Asking user if the vamsas session should be stored.");
int reply = JvOptionPane.showInternalConfirmDialog(
- Desktop.desktop,
+ Desktop.getDesktopPane(),
"The current VAMSAS session has unsaved data - do you want to save it ?",
"VAMSAS Session Shutdown",
JvOptionPane.YES_NO_OPTION,
if (reply == JvOptionPane.YES_OPTION)
{
Cache.log.debug("Prompting for vamsas store filename.");
- Desktop.instance.vamsasSave_actionPerformed(null);
+ Desktop.getInstance().vamsasSave_actionPerformed(null);
Cache.log
.debug("Finished attempt at storing document.");
}
public void disableGui(boolean b)
{
- Desktop.instance.setVamsasUpdate(b);
+ Desktop.getInstance().setVamsasUpdate(b);
}
Hashtable _backup_vobj2jv;
}
try
{
- final IPickManager pm = vclient.getPickManager();
- final StructureSelectionManager ssm = StructureSelectionManager
- .getStructureSelectionManager(Desktop.instance);
- final VamsasApplication me = this;
+ IPickManager pm = vclient.getPickManager();
+ StructureSelectionManager ssm = Desktop
+ .getStructureSelectionManager();
+ VamsasApplication me = this;
pm.registerMessageHandler(new IMessageHandler()
{
String last = null;
{
type = jvobjs[o].getClass();
}
- ;
if (type != jvobjs[o].getClass())
{
send = false;
{
jvobjs[c] = null;
}
- ;
jvobjs = null;
return;
}
@Override
public void run()
{
- JvOptionPane.showInternalMessageDialog(Desktop.desktop, message,
+ JvOptionPane.showInternalMessageDialog(Desktop.getDesktopPane(), message,
title, JvOptionPane.WARNING_MESSAGE);
}
public boolean showRunDialog()
{
- frame = new JDialog(Desktop.instance, true);
+ frame = new JDialog(Desktop.getInstance(), true);
frame.setTitle(MessageManager.formatMessage("label.edit_params_for",
new String[]
{ service.getActionText() }));
- Rectangle deskr = Desktop.instance.getBounds();
+ Rectangle deskr = Desktop.getInstance().getBounds();
Dimension pref = this.getPreferredSize();
frame.setBounds(
new Rectangle((int) (deskr.getCenterX() - pref.width / 2),
dialogpanel.add(canceljob);
// JAL-1580: setMaximumSize() doesn't work, so just size for the worst case:
// check for null is for JUnit usage
- final int windowHeight = Desktop.instance == null ? 540
- : Desktop.instance.getHeight();
+ final int windowHeight = Desktop.getInstance() == null ? 540
+ : Desktop.getInstance().getHeight();
setPreferredSize(new Dimension(540, windowHeight));
add(dialogpanel, BorderLayout.SOUTH);
validate();
public static void main(String[] args)
{
jalview.ws.jws2.Jws2Discoverer disc = jalview.ws.jws2.Jws2Discoverer
- .getDiscoverer();
+ .getInstance();
int p = 0;
if (args.length > 0)
{
Vector<String> services = new Vector<>();
services.addElement(args[p++]);
- Jws2Discoverer.getDiscoverer().setServiceUrls(services);
+ Jws2Discoverer.getInstance().setServiceUrls(services);
}
try
{
chooser.setDialogTitle(MessageManager
.getString("label.choose_filename_for_param_file"));
chooser.setToolTipText(MessageManager.getString("action.save"));
- int value = chooser.showSaveDialog(Desktop.instance);
+ int value = chooser.showSaveDialog(Desktop.getInstance());
if (value == JalviewFileChooser.APPROVE_OPTION)
{
outfile = chooser.getSelectedFile();
* if (value == JalviewFileChooser.APPROVE_OPTION) { File choice =
* chooser.getSelectedFile(); jalview.bin.Cache.setProperty("LAST_DIRECTORY",
* choice.getParent()); String defaultColours = jalview.bin.Cache.getDefault(
- * "USER_DEFINED_COLOURS", choice.getPath()); if
+ * Preferences.USER_DEFINED_COLOURS, choice.getPath()); if
* (defaultColours.indexOf(choice.getPath()) == -1) { defaultColours =
* defaultColours.concat("|") .concat(choice.getPath()); } (non-Javadoc)
*
File pfile = new File(filename);
if (pfile.exists() && pfile.canWrite())
{
- if (JvOptionPane.showConfirmDialog(Desktop.instance,
+ if (JvOptionPane.showConfirmDialog(Desktop.getInstance(),
"Delete the preset's file, too ?", "Delete User Preset ?",
JvOptionPane.OK_CANCEL_OPTION) == JvOptionPane.OK_OPTION)
{
private void initFromPreferences()
{
- wsUrls = Jws2Discoverer.getDiscoverer().getServiceUrls();
+ wsUrls = Jws2Discoverer.getInstance().getServiceUrls();
if (!wsUrls.isEmpty())
{
oldUrls = new Vector<String>(wsUrls);
int r = 0;
for (String url : wsUrls)
{
- int status = Jws2Discoverer.getDiscoverer().getServerStatusFor(url);
- tdat[r][1] = Integer.valueOf(status);
+ int status = Jws2Discoverer.getInstance().getServerStatusFor(url);
+ tdat[r][1] = new Integer(status);
tdat[r++][0] = url;
}
private void updateServiceList()
{
- Jws2Discoverer.getDiscoverer().setServiceUrls(wsUrls);
+ Jws2Discoverer.getInstance().setServiceUrls(wsUrls);
}
private void updateRsbsServiceList()
boolean valid = false;
int resp = JvOptionPane.CANCEL_OPTION;
while (!valid && (resp = JvOptionPane.showInternalConfirmDialog(
- Desktop.desktop, panel, title,
+ Desktop.getDesktopPane(), panel, title,
JvOptionPane.OK_CANCEL_OPTION)) == JvOptionPane.OK_OPTION)
{
try
} catch (Exception e)
{
valid = false;
- JvOptionPane.showInternalMessageDialog(Desktop.desktop,
+ JvOptionPane.showInternalMessageDialog(Desktop.getDesktopPane(),
MessageManager.getString("label.invalid_url"));
}
}
if (valid && resp == JvOptionPane.OK_OPTION)
{
- int validate = JvOptionPane.showInternalConfirmDialog(Desktop.desktop,
+ int validate = JvOptionPane.showInternalConfirmDialog(Desktop.getDesktopPane(),
MessageManager.getString("info.validate_jabaws_server"),
MessageManager.getString("label.test_server"),
JvOptionPane.YES_NO_OPTION);
}
else
{
- int opt = JvOptionPane.showInternalOptionDialog(Desktop.desktop,
+ int opt = JvOptionPane.showInternalOptionDialog(Desktop.getDesktopPane(),
"The Server '" + foo.toString()
+ "' failed validation,\ndo you want to add it anyway? ",
"Server Validation Failed", JvOptionPane.YES_NO_OPTION,
}
else
{
- JvOptionPane.showInternalMessageDialog(Desktop.desktop,
+ JvOptionPane.showInternalMessageDialog(Desktop.getDesktopPane(),
MessageManager.getString(
"warn.server_didnt_pass_validation"));
}
if (lastrefresh != update)
{
lastrefresh = update;
- Desktop.instance.startServiceDiscovery(true); // wait around for all
+ Desktop.getInstance().startServiceDiscovery(true); // wait around for all
// threads to complete
updateList();
public void run()
{
long ct = System.currentTimeMillis();
- Desktop.instance.setProgressBar(MessageManager
+ Desktop.getInstance().setProgressBar(MessageManager
.getString("status.refreshing_web_service_menus"), ct);
if (lastrefresh != update)
{
lastrefresh = update;
- Desktop.instance.startServiceDiscovery(true);
+ Desktop.getInstance().startServiceDiscovery(true);
updateList();
}
- Desktop.instance.setProgressBar(null, ct);
+ Desktop.getInstance().setProgressBar(null, ct);
}
}).start();
@Override
protected void resetWs_actionPerformed(ActionEvent e)
{
- Jws2Discoverer.getDiscoverer().setServiceUrls(null);
- List<String> nwsUrls = Jws2Discoverer.getDiscoverer().getServiceUrls();
+ Jws2Discoverer.getInstance().setServiceUrls(null);
+ List<String> nwsUrls = Jws2Discoverer.getInstance().getServiceUrls();
if (!wsUrls.equals(nwsUrls))
{
update++;
*/
package jalview.httpserver;
+import jalview.bin.ApplicationSingletonProvider;
+import jalview.bin.ApplicationSingletonProvider.ApplicationSingletonI;
import jalview.rest.RestHandler;
import java.net.BindException;
* @author gmcarstairs
* @see http://eclipse.org/jetty/documentation/current/embedding-jetty.html
*/
-public class HttpServer
+public class HttpServer implements ApplicationSingletonI
{
/*
* 'context root' - actually just prefixed to the path for each handler for
private static final String JALVIEW_PATH = "jalview";
/*
- * Singleton instance of this server
- */
- private static HttpServer instance;
-
- /*
* The Http server
*/
private Server server;
/*
* Lookup of ContextHandler by its wrapped handler
*/
- Map<Handler, ContextHandler> myHandlers = new HashMap<Handler, ContextHandler>();
+ Map<Handler, ContextHandler> myHandlers = new HashMap<>();
/*
* The context root for the server
{
synchronized (HttpServer.class)
{
- if (instance == null)
- {
- instance = new HttpServer();
- }
- return instance;
+ return (HttpServer) ApplicationSingletonProvider.getInstance(HttpServer.class);
}
}
/**
- * Private constructor to enforce use of singleton
+ * Private constructor to enforce use of singleton; use getInstance().
*
* @throws BindException
* if no free port can be assigned
*/
private HttpServer() throws BindException
{
+ // use getInstance()
+
startServer();
/*
*/
protected void initData()
{
- seqs = new Vector<SequenceI>();
- annotations = new Vector<AlignmentAnnotation>();
- seqGroups = new ArrayList<SequenceGroup>();
+ seqs = new Vector<>();
+ annotations = new Vector<>();
+ seqGroups = new ArrayList<>();
parseCalled = false;
}
/**
- * DOCUMENT ME!
+ * Create the seqs Vector from a set of parsed sequences in an AlignFile,
+ * FeaturesFile, RnamlFile, or StockholmFile.
*
* @param s
* DOCUMENT ME!
@Override
public void setSeqs(SequenceI[] s)
{
- seqs = new Vector<SequenceI>();
+ seqs = new Vector<>();
for (int i = 0; i < s.length; i++)
{
{
if (newickStrings == null)
{
- newickStrings = new Vector<String[]>();
+ newickStrings = new Vector<>();
}
newickStrings.addElement(new String[] { treeName, newickString });
}
if (row.graphGroup > -1)
{
graphGroupSeen.set(row.graphGroup);
- Integer key = Integer.valueOf(row.graphGroup);
+ Integer key = new Integer(row.graphGroup);
if (graphGroup.containsKey(key))
{
graphGroup.put(key, graphGroup.get(key) + "\t" + row.label);
autoAnnotsKey(aa[aai], aa[aai].sequenceRef,
(aa[aai].groupRef == null ? null
: aa[aai].groupRef.getName())),
- Integer.valueOf(1));
+ new Integer(1));
}
}
}
{
displayChar = token;
// foo
- value = Float.valueOf(token).floatValue();
+ value = new Float(token).floatValue();
parsedValue = true;
continue;
} catch (NumberFormatException ex)
package jalview.io;
+import jalview.bin.Cache;
+
import java.io.File;
public class BackupFilenameParts
String filename, String base, boolean extensionMatch)
{
BackupFilenameParts bfp = new BackupFilenameParts();
- BackupFilesPresetEntry bfpe = BackupFilesPresetEntry
- .getSavedBackupEntry();
- String template = bfpe.suffix;
+ String template = Cache.getDefault(BackupFiles.SUFFIX, null);
if (template == null)
{
return bfp;
int digits;
try
{
- digits = bfpe.digits;
+ digits = Integer
+ .parseInt(Cache.getDefault(BackupFiles.SUFFIX_DIGITS, null));
} catch (Exception e)
{
return bfp;
* BackupFiles used for manipulating (naming rolling/deleting) backup/version files when an alignment or project file is saved.
* User configurable options are:
* BACKUPFILES_ENABLED - boolean flag as to whether to use this mechanism or act as before, including overwriting files as saved.
- * The rest of the options are now saved as BACKUPFILES_PRESET, BACKUPFILES_SAVED and BACKUPFILES_CUSTOM
- * (see BackupFilesPresetEntry)
+ * BACKUPFILES_SUFFIX - a template to insert after the file extension. Use '%n' to be replaced by a 0-led SUFFIX_DIGITS long integer.
+ * BACKUPFILES_NO_MAX - flag to turn off setting a maximum number of backup files to keep.
+ * BACKUPFILES_ROLL_MAX - the maximum number of backupfiles to keep for any one alignment or project file.
+ * BACKUPFILES_SUFFIX_DIGITS - the number of digits to insert replace %n with (e.g. BACKUPFILES_SUFFIX_DIGITS = 3 would make "001", "002", etc)
+ * BACKUPFILES_REVERSE_ORDER - if true then "logfile" style numbering and file rolling will occur. If false then ever-increasing version numbering will occur, but old files will still be deleted if there are more than ROLL_MAX backup files.
+ * BACKUPFILES_CONFIRM_DELETE_OLD - if true then prompt/confirm with the user when deleting older backup/version files.
*/
public class BackupFiles
public static final String ENABLED = NS + "_ENABLED";
+ public static final String SUFFIX = NS + "_SUFFIX";
+
+ public static final String NO_MAX = NS + "_NO_MAX";
+
+ public static final String ROLL_MAX = NS + "_ROLL_MAX";
+
+ public static final String SUFFIX_DIGITS = NS + "_SUFFIX_DIGITS";
+
public static final String NUM_PLACEHOLDER = "%n";
+ public static final String REVERSE_ORDER = NS + "_REVERSE_ORDER";
+
+ public static final String CONFIRM_DELETE_OLD = NS
+ + "_CONFIRM_DELETE_OLD";
+
private static final String DEFAULT_TEMP_FILE = "jalview_temp_file_" + NS;
private static final String TEMP_FILE_EXT = ".tmp";
// REVERSE_ORDER
public BackupFiles(File file)
{
+ this(file, ".bak" + NUM_PLACEHOLDER, false, 3, 3, false);
+ }
+
+ public BackupFiles(File file, String defaultSuffix, boolean defaultNoMax,
+ int defaultMax, int defaultDigits, boolean defaultReverseOrder)
+ {
classInit();
this.file = file;
- BackupFilesPresetEntry bfpe = BackupFilesPresetEntry.getSavedBackupEntry();
- this.suffix = bfpe.suffix;
- this.noMax = bfpe.keepAll;
- this.max = bfpe.rollMax;
- this.digits = bfpe.digits;
- this.reverseOrder = bfpe.reverse;
+ this.suffix = Cache.getDefault(SUFFIX, defaultSuffix);
+ this.noMax = Cache.getDefault(NO_MAX, defaultNoMax);
+ this.max = Cache.getDefault(ROLL_MAX, defaultMax);
+ this.digits = Cache.getDefault(SUFFIX_DIGITS, defaultDigits);
+ this.reverseOrder = Cache.getDefault(REVERSE_ORDER,
+ defaultReverseOrder);
// create a temp file to save new data in
File temp = null;
public static void classInit()
{
setEnabled(Cache.getDefault(ENABLED, !Platform.isJS()));
- BackupFilesPresetEntry bfpe = BackupFilesPresetEntry
- .getSavedBackupEntry();
- setConfirmDelete(bfpe.confirmDelete);
+ setConfirmDelete(Cache.getDefault(CONFIRM_DELETE_OLD, true));
}
public static void setEnabled(boolean flag)
MessageManager.getString("label.delete"),
MessageManager.getString("label.rename") };
- confirmButton = JvOptionPane.showOptionDialog(Desktop.desktop,
+ confirmButton = JvOptionPane.showOptionDialog(Desktop.getDesktopPane(),
messageSB.toString(),
MessageManager.getString("label.backupfiles_confirm_delete"),
JvOptionPane.YES_NO_OPTION, JvOptionPane.WARNING_MESSAGE,
MessageManager.getString("label.delete"),
MessageManager.getString("label.keep") };
- confirmButton = JvOptionPane.showOptionDialog(Desktop.desktop,
+ confirmButton = JvOptionPane.showOptionDialog(Desktop.getDesktopPane(),
messageSB.toString(),
MessageManager.getString("label.backupfiles_confirm_delete"),
JvOptionPane.YES_NO_OPTION, JvOptionPane.WARNING_MESSAGE,
Long.toString(df.length()) }));
}
- int confirmButton = JvOptionPane.showConfirmDialog(Desktop.desktop,
+ int confirmButton = JvOptionPane.showConfirmDialog(Desktop.getDesktopPane(),
messageSB.toString(),
MessageManager
.getString("label.backupfiles_confirm_delete"),
"label.backupfiles_confirm_save_new_saved_file_not_ok"));
}
- int confirmButton = JvOptionPane.showConfirmDialog(Desktop.desktop,
+ int confirmButton = JvOptionPane.showConfirmDialog(Desktop.getDesktopPane(),
messageSB.toString(),
MessageManager
.getString("label.backupfiles_confirm_save_file"),
+++ /dev/null
-package jalview.io;
-
-import jalview.bin.Cache;
-import jalview.util.MessageManager;
-
-import java.util.HashMap;
-import java.util.Map;
-import java.util.StringTokenizer;
-
-public class BackupFilesPresetEntry
-{
-
- public String suffix;
-
- public static final int DIGITSMIN = 1;
-
- public static final int DIGITSMAX = 6;
-
- public int digits;
-
- public boolean reverse;
-
- public boolean keepAll;
-
- public static final int ROLLMAXMIN = 1;
-
- public static final int ROLLMAXMAX = 999;
-
- public int rollMax;
-
- public boolean confirmDelete;
-
- public static final String SAVEDCONFIG = BackupFiles.NS + "_SAVED";
-
- public static final String CUSTOMCONFIG = BackupFiles.NS + "_CUSTOM";
-
- private static final String stringDelim = "\t";
-
- public static final int BACKUPFILESSCHEMECUSTOM = 0;
-
- public static final int BACKUPFILESSCHEMEDEFAULT = 1;
-
- public BackupFilesPresetEntry(String suffix, int digits, boolean reverse,
- boolean keepAll, int rollMax, boolean confirmDelete)
- {
- this.suffix = suffix == null ? "" : suffix;
- this.digits = digits < DIGITSMIN ? DIGITSMIN
- : (digits > DIGITSMAX ? DIGITSMAX : digits);
- this.reverse = reverse;
- this.keepAll = keepAll;
- this.rollMax = rollMax < ROLLMAXMIN ? ROLLMAXMIN
- : (rollMax > ROLLMAXMAX ? ROLLMAXMAX : rollMax);
- this.confirmDelete = confirmDelete;
- }
-
- public boolean equals(BackupFilesPresetEntry compare)
- {
- return suffix.equals(compare.suffix) && digits == compare.digits
- && reverse == compare.reverse && keepAll == compare.keepAll
- && rollMax == compare.rollMax
- && confirmDelete == compare.confirmDelete;
- }
-
- @Override
- public String toString()
- {
- StringBuilder sb = new StringBuilder();
- sb.append(suffix);
- sb.append(stringDelim);
- sb.append(digits);
- sb.append(stringDelim);
- sb.append(reverse);
- sb.append(stringDelim);
- sb.append(keepAll);
- sb.append(stringDelim);
- sb.append(rollMax);
- sb.append(stringDelim);
- sb.append(confirmDelete);
- return sb.toString();
- }
-
- public static BackupFilesPresetEntry createBackupFilesPresetEntry(
- String line)
- {
- if (line == null)
- {
- return null;
- }
- StringTokenizer st = new StringTokenizer(line, stringDelim);
- String suffix = null;
- int digits = 0;
- boolean reverse = false;
- boolean keepAll = false;
- int rollMax = 0;
- boolean confirmDelete = false;
-
- try
- {
- suffix = st.nextToken();
- digits = Integer.valueOf(st.nextToken());
- reverse = Boolean.valueOf(st.nextToken());
- keepAll = Boolean.valueOf(st.nextToken());
- rollMax = Integer.valueOf(st.nextToken());
- confirmDelete = Boolean.valueOf(st.nextToken());
- } catch (Exception e)
- {
- Cache.log.error("Error parsing backupfiles scheme '" + line + "'");
- }
-
- return new BackupFilesPresetEntry(suffix, digits, reverse, keepAll,
- rollMax, confirmDelete);
- }
-
- public static BackupFilesPresetEntry getSavedBackupEntry()
- {
- String savedPresetString = Cache
- .getDefault(BackupFilesPresetEntry.SAVEDCONFIG, null);
- BackupFilesPresetEntry savedPreset = BackupFilesPresetEntry
- .createBackupFilesPresetEntry(savedPresetString);
- if (savedPreset == null)
- {
- savedPreset = backupfilesPresetEntriesValues
- .get(BACKUPFILESSCHEMEDEFAULT);
- }
- return savedPreset;
- }
-
- public static final IntKeyStringValueEntry[] backupfilesPresetEntries = {
- new IntKeyStringValueEntry(BACKUPFILESSCHEMEDEFAULT,
- MessageManager.getString("label.default")),
- new IntKeyStringValueEntry(2,
- MessageManager.getString("label.single_file")),
- new IntKeyStringValueEntry(3,
- MessageManager.getString("label.keep_all_versions")),
- new IntKeyStringValueEntry(4,
- MessageManager.getString("label.rolled_backups")),
- // ...
- // IMPORTANT, keep "Custom" entry with key 0 (even though it appears last)
- new IntKeyStringValueEntry(BACKUPFILESSCHEMECUSTOM,
- MessageManager.getString("label.custom")) };
-
- public static final String[] backupfilesPresetEntryDescriptions = {
- MessageManager.getString("label.default_description"),
- MessageManager.getString("label.single_file_description"),
- MessageManager.getString("label.keep_all_versions_description"),
- MessageManager.getString("label.rolled_backups_description"),
- MessageManager.getString("label.custom_description") };
-
- public static final Map<Integer, BackupFilesPresetEntry> backupfilesPresetEntriesValues = new HashMap<Integer, BackupFilesPresetEntry>()
- {
- /**
- *
- */
- private static final long serialVersionUID = 125L;
-
- {
- put(1, new BackupFilesPresetEntry(
- ".bak" + BackupFiles.NUM_PLACEHOLDER, 3, false, false, 3,
- false));
- put(2, new BackupFilesPresetEntry("~", 1, false, false, 1, false));
- put(3, new BackupFilesPresetEntry(".v" + BackupFiles.NUM_PLACEHOLDER,
- 3, false, true, 10, true));
- put(4, new BackupFilesPresetEntry(
- "_bak." + BackupFiles.NUM_PLACEHOLDER, 1, true, false, 9,
- false));
-
- // This gets replaced by GPreferences
- put(BACKUPFILESSCHEMECUSTOM,
- new BackupFilesPresetEntry("", 0, false, false, 0, false));
- }
- };
-
-}
float score = Float.NaN;
try
{
- score = Float.valueOf(gffColumns[6]).floatValue();
+ score = new Float(gffColumns[6]).floatValue();
} catch (NumberFormatException ex)
{
sf = new SequenceFeature(ft, desc, startPos, endPos, featureGroup);
AlignViewportI av = getViewport();
if (av != null)
{
- if (av.getAlignment() != null)
+ AlignmentI a = av.getAlignment();
+ if (a != null)
{
- dataset = av.getAlignment().getDataset();
+ dataset = a.getDataset();
}
if (dataset == null)
{
// working in the applet context ?
- dataset = av.getAlignment();
+ dataset = a;
}
}
else
StringBuilder out = new StringBuilder(256);
- out.append(String.format("%s %d\n", GFF_VERSION, gffVersion == 0 ? 2 : gffVersion));
+ out.append(String.format("%s %d" + newline, GFF_VERSION,
+ gffVersion == 0 ? 2 : gffVersion));
if (!includeNonPositionalFeatures
&& (visibleColours == null || visibleColours.isEmpty()))
*/
package jalview.io;
+import jalview.bin.ApplicationSingletonProvider;
+import jalview.bin.ApplicationSingletonProvider.ApplicationSingletonI;
+
import java.util.ArrayList;
import java.util.HashSet;
import java.util.LinkedHashMap;
* @author gmcarstairs
*
*/
-public class FileFormats
+public class FileFormats implements ApplicationSingletonI
{
- private static FileFormats instance = new FileFormats();
-
- /*
- * A lookup map of file formats by upper-cased name
- */
- private static Map<String, FileFormatI> formats;
-
- /*
- * Formats in this set are capable of being identified by IdentifyFile
- */
- private static Set<FileFormatI> identifiable;
-
public static FileFormats getInstance()
{
- return instance;
+ return (FileFormats) ApplicationSingletonProvider.getInstance(FileFormats.class);
}
/**
reset();
}
+ /*
+ * A lookup map of file formats by upper-cased name
+ */
+ private Map<String, FileFormatI> formats;
+
+ /*
+ * Formats in this set are capable of being identified by IdentifyFile
+ */
+ private Set<FileFormatI> identifiable;
+
/**
* Reset to just the built-in file formats packaged with Jalview. These are
* added (and will be shown in menus) in the order of their declaration in the
*/
public synchronized void reset()
{
- formats = new LinkedHashMap<String, FileFormatI>();
- identifiable = new HashSet<FileFormatI>();
+ formats = new LinkedHashMap<>();
+ identifiable = new HashSet<>();
for (FileFormat format : FileFormat.values())
{
registerFileFormat(format, format.isIdentifiable());
*/
public List<String> getWritableFormats(boolean textOnly)
{
- List<String> l = new ArrayList<String>();
+ List<String> l = new ArrayList<>();
for (FileFormatI ff : formats.values())
{
if (ff.isWritable() && (!textOnly || ff.isTextFormat()))
*/
public List<String> getReadableFormats()
{
- List<String> l = new ArrayList<String>();
+ List<String> l = new ArrayList<>();
for (FileFormatI ff : formats.values())
{
if (ff.isReadable())
import jalview.json.binding.biojson.v1.ColourSchemeMapper;
import jalview.project.Jalview2XML;
import jalview.schemes.ColourSchemeI;
-import jalview.structure.StructureSelectionManager;
import jalview.util.MessageManager;
import jalview.util.Platform;
import jalview.ws.utils.UrlDownloadClient;
public class FileLoader implements Runnable
{
+ private File selectedFile;
+
String file;
DataSourceType protocol;
FileFormatI format;
- AlignmentFileReaderI source = null; // alternative specification of where data
- // comes
+ AlignmentFileReaderI source; // alternative specification of where data
+ // comes from
- // from
+ /**
+ * It is critical that all these fields are set, as this instance is reused.
+ *
+ * @param source
+ * @param file
+ * @param inFile
+ * @param dataSourceType
+ * @param format
+ */
+ private void setFileFields(AlignmentFileReaderI source, File file,
+ String inFile, DataSourceType dataSourceType, FileFormatI format)
+ {
+ this.source = source;
+ this.file = inFile;
+ this.selectedFile = file;
+ this.protocol = dataSourceType;
+ this.format = format;
+ }
AlignViewport viewport;
boolean raiseGUI = true;
- private File selectedFile;
-
/**
* default constructor always raised errors in GUI dialog boxes
*/
this.raiseGUI = raiseGUI;
}
- public void LoadFile(AlignViewport viewport, Object file,
+ public void loadFile(AlignViewport viewport, Object file,
DataSourceType protocol, FileFormatI format)
{
this.viewport = viewport;
this.selectedFile = (File) file;
file = selectedFile.getPath();
}
- LoadFile(file.toString(), protocol, format);
+ loadFile(file.toString(), protocol, format);
}
- public void LoadFile(String file, DataSourceType protocol,
+ public void loadFile(String file, DataSourceType protocol,
FileFormatI format)
{
this.file = file;
*/
public void LoadFile(String file, DataSourceType protocol)
{
- LoadFile(file, protocol, null);
+ loadFile(file, protocol, null);
}
/**
public AlignFrame LoadFileWaitTillLoaded(String file,
DataSourceType sourceType)
{
- return LoadFileWaitTillLoaded(file, sourceType, null);
+ return loadFileWaitTillLoaded(file, sourceType, null);
}
/**
* @param format
* @return alignFrame constructed from file contents
*/
- public AlignFrame LoadFileWaitTillLoaded(String file,
+ public AlignFrame loadFileWaitTillLoaded(String file,
DataSourceType sourceType, FileFormatI format)
{
- this.file = file;
- this.protocol = sourceType;
- this.format = format;
- return _LoadFileWaitTillLoaded();
+ setFileFields(null, null, file, sourceType, format);
+ return _loadFileWaitTillLoaded();
}
/**
* @param format
* @return alignFrame constructed from file contents
*/
- public AlignFrame LoadFileWaitTillLoaded(File file,
+ public AlignFrame loadFileWaitTillLoaded(File file,
DataSourceType sourceType, FileFormatI format)
{
- this.selectedFile = file;
- this.file = file.getPath();
- this.protocol = sourceType;
- this.format = format;
- return _LoadFileWaitTillLoaded();
+ setFileFields(null, file, null, sourceType, format);
+ return _loadFileWaitTillLoaded();
}
/**
* @param format
* @return alignFrame constructed from file contents
*/
- public AlignFrame LoadFileWaitTillLoaded(AlignmentFileReaderI source,
+ public AlignFrame loadFileWaitTillLoaded(AlignmentFileReaderI source,
FileFormatI format)
{
- this.source = source;
-
- file = source.getInFile();
- protocol = source.getDataSourceType();
- this.format = format;
- return _LoadFileWaitTillLoaded();
+ setFileFields(source, null, source.getInFile(),
+ source.getDataSourceType(), format);
+ return _loadFileWaitTillLoaded();
}
/**
*
* @return
*/
- protected AlignFrame _LoadFileWaitTillLoaded()
+ private AlignFrame _loadFileWaitTillLoaded()
{
this.run();
return alignFrame;
Runtime rt = Runtime.getRuntime();
try
{
- if (Desktop.instance != null)
+ if (Desktop.getInstance() != null)
{
- Desktop.instance.startLoading(file);
+ Desktop.getInstance().startLoading(file);
}
if (format == null)
{
if (format == null)
{
- Desktop.instance.stopLoading();
+ Desktop.getInstance().stopLoading();
System.err.println("The input file \"" + file
+ "\" has null or unidentifiable data content!");
if (!Jalview.isHeadlessMode())
{
- JvOptionPane.showInternalMessageDialog(Desktop.desktop,
+ JvOptionPane.showInternalMessageDialog(Desktop.getDesktopPane(),
MessageManager.getString("label.couldnt_read_data")
+ " in " + file + "\n"
+ AppletFormatAdapter.getSupportedFormats(),
}
// TODO: cache any stream datasources as a temporary file (eg. PDBs
// retrieved via URL)
- if (Desktop.desktop != null && Desktop.desktop.isShowMemoryUsage())
+ if (Desktop.getDesktopPane() != null && Desktop.getDesktopPane().isShowMemoryUsage())
{
System.gc();
memused = (rt.maxMemory() - rt.totalMemory() + rt.freeMemory()); // free
// We read the data anyway - it might make sense.
}
// BH 2018 switch to File object here instead of filename
+ Platform.timeCheck(null, Platform.TIME_MARK);
alignFrame = new Jalview2XML(raiseGUI).loadJalviewAlign(selectedFile == null ? file : selectedFile);
+ Platform.timeCheck("JVP loaded", Platform.TIME_MARK);
+
}
else
{
if (downloadStructureFile)
{
String structExt = format.getExtensions().split(",")[0];
- String urlLeafName = file.substring(
- file.lastIndexOf(
- System.getProperty("file.separator")),
+ int pt = file.lastIndexOf(file.indexOf('/') >= 0 ? "/"
+ : System.getProperty("file.separator"));
+ String urlLeafName = file.substring(pt,
file.lastIndexOf("."));
String tempStructureFileStr = createNamedJvTempFile(
urlLeafName, structExt);
// BH - switching to File object here so as to hold
- // ._bytes array directly
+ // .秘bytes array directly
File tempFile = new File(tempStructureFileStr);
UrlDownloadClient.download(file, tempFile);
{
// register PDB entries with desktop's structure selection
// manager
- StructureSelectionManager
- .getStructureSelectionManager(Desktop.instance)
+ Desktop.getStructureSelectionManager()
.registerPDBEntry(pdbe);
}
}
}
else
{
- if (Desktop.instance != null)
+ if (Desktop.getInstance() != null)
{
- Desktop.instance.stopLoading();
+ Desktop.getInstance().stopLoading();
}
final String errorMessage = MessageManager.getString(
"label.couldnt_load_file") + " " + title + "\n" + error;
// TODO: refactor FileLoader to be independent of Desktop / Applet GUI
// bits ?
- if (raiseGUI && Desktop.desktop != null)
+ if (raiseGUI && Desktop.getDesktopPane() != null)
{
javax.swing.SwingUtilities.invokeLater(new Runnable()
{
@Override
public void run()
{
- JvOptionPane.showInternalMessageDialog(Desktop.desktop,
+ JvOptionPane.showInternalMessageDialog(Desktop.getDesktopPane(),
errorMessage,
MessageManager
.getString("label.error_loading_file"),
@Override
public void run()
{
- JvOptionPane.showInternalMessageDialog(Desktop.desktop,
+ JvOptionPane.showInternalMessageDialog(Desktop.getDesktopPane(),
MessageManager.formatMessage(
"label.problems_opening_file", new String[]
{ file }),
@Override
public void run()
{
- JvOptionPane.showInternalMessageDialog(Desktop.desktop,
+ JvOptionPane.showInternalMessageDialog(Desktop.getDesktopPane(),
MessageManager.formatMessage(
"warn.out_of_memory_loading_file", new String[]
{ file }),
// memory
// after
// load
- if (Desktop.desktop != null && Desktop.desktop.isShowMemoryUsage())
+ if (Desktop.getDesktopPane() != null && Desktop.getDesktopPane().isShowMemoryUsage())
{
if (alignFrame != null)
{
}
}
// remove the visual delay indicator
- if (Desktop.instance != null)
+ if (Desktop.getInstance() != null)
{
- Desktop.instance.stopLoading();
+ Desktop.getInstance().stopLoading();
}
}
import jalview.datamodel.Sequence;
import jalview.datamodel.SequenceGroup;
import jalview.datamodel.SequenceI;
+import jalview.gui.Preferences;
import jalview.util.Comparison;
import java.io.File;
private void init()
{
- if (jalview.bin.Cache.getDefault("STRUCT_FROM_PDB", true))
+ if (jalview.bin.Cache.getDefault(Preferences.STRUCT_FROM_PDB, true))
{
- annotFromStructure = jalview.bin.Cache.getDefault("ADD_TEMPFACT_ANN",
+ annotFromStructure = jalview.bin.Cache.getDefault(
+ Preferences.ADD_TEMPFACT_ANN,
true);
- localSecondaryStruct = jalview.bin.Cache.getDefault("ADD_SS_ANN",
+ localSecondaryStruct = jalview.bin.Cache.getDefault(
+ Preferences.ADD_SS_ANN,
true);
- serviceSecondaryStruct = jalview.bin.Cache.getDefault("USE_RNAVIEW",
+ serviceSecondaryStruct = jalview.bin.Cache
+ .getDefault(Preferences.USE_RNAVIEW,
true);
}
else
import jalview.api.AlignExportSettingsI;
import jalview.bin.Cache;
+import jalview.bin.Jalview;
import jalview.datamodel.AlignExportSettingsAdapter;
import jalview.datamodel.AlignmentExportData;
import jalview.gui.AlignmentPanel;
import jalview.gui.IProgressIndicator;
import jalview.util.MessageManager;
+import jalview.util.Platform;
import java.io.BufferedReader;
import java.io.File;
protected void setProgressMessage(String message)
{
- if (pIndicator != null && !isHeadless())
+ if (pIndicator != null && !Jalview.isHeadlessMode())
{
pIndicator.setProgressBar(message, pSessionId);
}
}
/**
- * Answers true if HTML export is invoke in headless mode or false otherwise
- *
- * @return
- */
- protected boolean isHeadless()
- {
- return System.getProperty("java.awt.headless") != null
- && System.getProperty("java.awt.headless").equals("true");
- }
-
- /**
* This method provides implementation of consistent behaviour which should
* occur after a HTML file export. It MUST be called at the end of the
* exportHTML() method implementation.
*/
protected void exportCompleted()
{
- if (isLaunchInBrowserAfterExport() && !isHeadless())
+ if (isLaunchInBrowserAfterExport() && !Jalview.isHeadlessMode())
{
try
{
- jalview.util.BrowserLauncher
- .openURL("file:///" + getExportedFile());
+ Platform.openURL("file:///" + getExportedFile());
} catch (IOException e)
{
e.printStackTrace();
package jalview.io;
import jalview.bin.Cache;
+import jalview.bin.Jalview;
import jalview.gui.AlignmentPanel;
import jalview.gui.LineartOptions;
import jalview.gui.OOMWarning;
/*
* Prompt for character rendering style if preference is not set
*/
- if (renderStyle.equalsIgnoreCase("Prompt each time") && !isHeadless())
+ if (renderStyle.equalsIgnoreCase("Prompt each time")
+ && !Jalview.isHeadlessMode())
{
LineartOptions svgOption = new LineartOptions("HTML", textOption);
svgOption.setResponseAction(1, new Runnable()
{
for (int i = 0; !isBinary && i < data.length(); i++)
{
- char c = data.charAt(i);
+ int c = data.charAt(i);
isBinary = (c < 32 && c != '\t' && c != '\n' && c != '\r'
&& c != 5 && c != 27); // nominal binary character filter
// excluding CR, LF, tab,DEL and ^E
if (source.inFile != null)
{
String fileStr = source.inFile.getName();
- if (fileStr.contains(".jar")
- || fileStr.contains(".zip") || fileStr.contains(".jvp"))
+ if (fileStr.contains(".jar") || fileStr.contains(".zip")
+ || fileStr.contains(".jvp"))
{
// possibly a Jalview archive (but check further)
reply = FileFormat.Jalview;
+ break;
}
}
if (!lineswereskipped && data.startsWith("PK"))
+++ /dev/null
-package jalview.io;
-
-public class IntKeyStringValueEntry
-{
- public final int k;
-
- public final String v;
-
- public IntKeyStringValueEntry(int k, String v)
- {
- this.k = k;
- this.v = v;
- }
-
- @Override
- public String toString()
- {
- return v;
- }
-
-}
{
ascore = symbols.nextToken();
- Float score = Float.valueOf(ascore);
+ Float score = new Float(ascore);
scores.addElement(score);
}
seq_entries.addElement(newseq.toString());
ids.addElement(id);
- Symscores.put(id, Integer.valueOf(ids.size() - 1));
+ Symscores.put(id, new Integer(ids.size() - 1));
}
}
}
package jalview.io;
import java.io.File;
-import java.util.Hashtable;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
public class JalviewFileFilter extends FileFilter
{
- public static Hashtable suffixHash = new Hashtable();
-
private Map<String, JalviewFileFilter> filters = null;
private String description = "no description";
{
return filename.substring(i + 1).toLowerCase();
}
-
- ;
}
return "";
{
for (int j = 0; j < width; j++)
{
- float value = Float.valueOf(preds[i].getCharAt(j) + "")
+ float value = new Float(preds[i].getCharAt(j) + "")
.floatValue();
annotations[gapmap[j]] = new Annotation(
preds[i].getCharAt(j) + "", "",
{
for (int j = 0; j < width; j++)
{
- float value = Float.valueOf(preds[i].getCharAt(j) + "")
+ float value = new Float(preds[i].getCharAt(j) + "")
.floatValue();
annotations[gapmap[delMap[j]]] = new Annotation(
preds[i].getCharAt(j) + "", "",
import jalview.datamodel.DBRefEntry;
import jalview.datamodel.SequenceI;
+import jalview.util.Platform;
import java.util.List;
resCode(int v)
{
- val = Integer.valueOf(v);
+ val = new Integer(v);
field = val.toString();
}
};
+ private static Regex VALIDATION_REGEX;
+
+ private static Regex getRegex()
+ {
+ return (VALIDATION_REGEX == null
+ ? VALIDATION_REGEX = Platform
+ .newRegex("\\s*((([-0-9]+).?)|FIRST|LAST|@)", null)
+ : VALIDATION_REGEX);
+ }
+
private resCode validResidueCode(String field)
{
Integer val = null;
- Regex r = new Regex(
- "\\s*((([-0-9]+).?)|FIRST|LAST|@)");
-
+ Regex r = getRegex();
if (!r.search(field))
{
return null; // invalid
import jalview.datamodel.SequenceNode;
import jalview.util.MessageManager;
+import jalview.util.Platform;
import java.io.BufferedReader;
import java.io.File;
import com.stevesoft.pat.Regex;
+// TODO This class does not conform to Java standards for field name capitalization.
+
/**
* Parse a new hanpshire style tree Caveats: NHX files are NOT supported and the
* tree distances and topology are unreliable when they are parsed. TODO: on
*/
public class NewickFile extends FileParse
{
- SequenceNode root;
+ private SequenceNode root;
private boolean HasBootstrap = false;
private boolean RootHasDistance = false;
// File IO Flags
- boolean ReplaceUnderscores = false;
+ private boolean ReplaceUnderscores = false;
+
+ private boolean printRootInfo = true;
+
+ private static final int REGEX_PERL_NODE_REQUIRE_QUOTE = 0;
+
+ private static final int REGEX_PERL_NODE_ESCAPE_QUOTE = 1;
+
+ private static final int REGEX_PERL_NODE_UNQUOTED_WHITESPACE = 2;
+
+ private static final int REGEX_MAJOR_SYMS = 3;
+
+ private static final int REGEX_QNODE_NAME = 4;
+
+ private static final int REGEX_COMMENT = 5;
+
+ private static final int REGEX_UQNODE_NAME = 6;
- boolean printRootInfo = true;
+ private static final int REGEX_NBOOTSTRAP = 7;
+
+ private static final int REGEX_NDIST = 8;
+
+ private static final int REGEX_NO_LINES = 9;
+
+ private static final int REGEX_PERL_EXPAND_QUOTES = 10;
+
+ private static final int REGEX_MAX = 11;
+
+ private static final Regex[] REGEX = new Regex[REGEX_MAX];
+
+ private static Regex getRegex(int id)
+ {
+ if (REGEX[id] == null)
+ {
+ String code = null;
+ String code2 = null;
+ String codePerl = null;
+ switch (id)
+ {
+ case REGEX_PERL_NODE_REQUIRE_QUOTE:
+ codePerl = "m/[\\[,:'()]/";
+ break;
+ case REGEX_PERL_NODE_ESCAPE_QUOTE:
+ codePerl = "s/'/''/";
+ break;
+ case REGEX_PERL_NODE_UNQUOTED_WHITESPACE:
+ codePerl = "s/\\/w/_/";
+ break;
+ case REGEX_PERL_EXPAND_QUOTES:
+ codePerl = "s/''/'/";
+ break;
+ case REGEX_MAJOR_SYMS:
+ code = "[(\\['),;]";
+ break;
+ case REGEX_QNODE_NAME:
+ code = "'([^']|'')+'";
+ break;
+ case REGEX_COMMENT:
+ code = "]";
+ break;
+ case REGEX_UQNODE_NAME:
+ code = "\\b([^' :;\\](),]+)";
+ break;
+ case REGEX_NBOOTSTRAP:
+ code = "\\s*([0-9+]+)\\s*:";
+ break;
+ case REGEX_NDIST:
+ code = ":([-0-9Ee.+]+)";
+ break;
+ case REGEX_NO_LINES:
+ code = "\n+";
+ code2 = "";
+ break;
+ default:
+ return null;
+ }
+ return codePerl == null ? Platform.newRegex(code, code2)
+ : Platform.newRegexPerl(codePerl);
+ }
+ return REGEX[id];
+ }
- private Regex[] NodeSafeName = new Regex[] {
- new Regex().perlCode("m/[\\[,:'()]/"), // test for
- // requiring
- // quotes
- new Regex().perlCode("s/'/''/"), // escaping quote
- // characters
- new Regex().perlCode("s/\\/w/_/") // unqoted whitespace
- // transformation
- };
- char QuoteChar = '\'';
+ private char quoteChar = '\'';
/**
* Creates a new NewickFile object.
*/
public void parse() throws IOException
{
+ Platform.ensureRegex();
String nf;
{ // fill nf with complete tree file
boolean ascending = false; // flag indicating that we are leaving the
// current node
- Regex majorsyms = new Regex(
- "[(\\['),;]");
+ Regex majorsyms = getRegex(REGEX_MAJOR_SYMS); // "[(\\['),;]"
int nextcp = 0;
int ncp = cp;
// Deal with quoted fields
case '\'':
- Regex qnodename = new Regex(
- "'([^']|'')+'");
+ Regex qnodename = getRegex(REGEX_QNODE_NAME);// "'([^']|'')+'");
if (qnodename.searchFrom(nf, fcp))
{
nodename = new String(
qnodename.stringMatched().substring(1, nl - 1));
// unpack any escaped colons
- Regex xpandquotes = Regex
- .perlCode("s/''/'/");
+ Regex xpandquotes = getRegex(REGEX_PERL_EXPAND_QUOTES);
String widernodename = xpandquotes.replaceAll(nodename);
nodename = widernodename;
// jump to after end of quoted nodename
* '"+nf.substring(cp,fcp)+"'"); }
*/
// verify termination.
- Regex comment = new Regex(
- "]");
+ Regex comment = getRegex(REGEX_COMMENT); // "]"
if (comment.searchFrom(nf, fcp))
{
// Skip the comment field
+ fstring.substring(cend + 1);
}
- Regex uqnodename = new Regex(
- "\\b([^' :;\\](),]+)");
- Regex nbootstrap = new Regex(
- "\\s*([0-9+]+)\\s*:");
- Regex ndist = new Regex(
- ":([-0-9Ee.+]+)");
+ Regex uqnodename = getRegex(REGEX_UQNODE_NAME);// "\\b([^' :;\\](),]+)"
+ Regex nbootstrap = getRegex(REGEX_NBOOTSTRAP);// "\\s*([0-9+]+)\\s*:");
+ Regex ndist = getRegex(REGEX_NDIST);// ":([-0-9Ee.+]+)");
if (!parsednodename && uqnodename.search(fstring)
&& ((uqnodename.matchedFrom(1) == 0) || (fstring
{
try
{
- bootstrap = (Integer.valueOf(nbootstrap.stringMatched(1)))
+ bootstrap = (new Integer(nbootstrap.stringMatched(1)))
.intValue();
HasBootstrap = true;
} catch (Exception e)
{
try
{
- distance = (Float.valueOf(ndist.stringMatched(1))).floatValue();
+ distance = (new Float(ndist.stringMatched(1))).floatValue();
HasDistances = true;
nodehasdistance = true;
} catch (Exception e)
if (code.toLowerCase().equals("b"))
{
int v = -1;
- Float iv = Float.valueOf(value);
+ Float iv = new Float(value);
v = iv.intValue(); // jalview only does integer bootstraps
// currently
c.setBootstrap(v);
*/
char getQuoteChar()
{
- return QuoteChar;
+ return quoteChar;
}
/**
*/
char setQuoteChar(char c)
{
- char old = QuoteChar;
- QuoteChar = c;
+ char old = quoteChar;
+ quoteChar = c;
return old;
}
*/
private String nodeName(String name)
{
- if (NodeSafeName[0].search(name))
+ if (getRegex(REGEX_PERL_NODE_REQUIRE_QUOTE).search(name))
{
- return QuoteChar + NodeSafeName[1].replaceAll(name) + QuoteChar;
+ return quoteChar
+ + getRegex(REGEX_PERL_NODE_ESCAPE_QUOTE).replaceAll(name)
+ + quoteChar;
}
else
{
- return NodeSafeName[2].replaceAll(name);
+ return getRegex(REGEX_PERL_NODE_UNQUOTED_WHITESPACE).replaceAll(name);
}
}
trf.parse();
System.out.println("Original file :\n");
- Regex nonl = new Regex("\n+", "");
+ Regex nonl = getRegex(REGEX_NO_LINES);// "\n+", "");
System.out.println(nonl.replaceAll(newickfile.toString()) + "\n");
System.out.println("Parsed file.\n");
*/
package jalview.io;
+import jalview.bin.Cache;
import jalview.datamodel.Sequence;
import jalview.datamodel.SequenceI;
import jalview.util.Comparison;
import java.io.IOException;
-import java.util.Vector;
public class PIRFile extends AlignFile
{
- public static boolean useModellerOutput = false;
-
- Vector words = new Vector(); // Stores the words in a line after splitting
+ // Vector words = new Vector(); // Stores the words in a line after splitting
public PIRFile()
{
StringBuffer out = new StringBuffer();
int i = 0;
ModellerDescription md;
-
+ boolean useModellerOutput = Cache.getDefault("PIR_MODELLER", false);
while ((i < s.length) && (s[i] != null))
{
String seq = s[i].getSequenceAsString();
}
else
{
-
if (useModellerOutput)
{
out.append(">P1;" + s[i].getName());
import jalview.datamodel.Sequence;
import jalview.datamodel.SequenceI;
import jalview.util.MessageManager;
+import jalview.util.Platform;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
dataName = dataName.substring(0, b - 1);
}
b = 0;
- Regex m = new Regex("[\\/]?([-A-Za-z0-9]+)\\.?");
+ Regex m = getSafeRegex();
String mm = dataName;
while (m.searchFrom(dataName, b))
{
}
return mm;
}
+
+ private static Regex SAFE_REGEX;
+
+ private static Regex getSafeRegex()
+ {
+ return (SAFE_REGEX == null
+ ? SAFE_REGEX = Platform.newRegex("[\\/]?([-A-Za-z0-9]+)\\.?", null)
+ : SAFE_REGEX);
+ }
}
import jalview.util.Comparison;
import jalview.util.Format;
import jalview.util.MessageManager;
+import jalview.util.Platform;
import java.io.BufferedReader;
import java.io.FileReader;
{
private static final String ANNOTATION = "annotation";
-// private static final Regex OPEN_PAREN = new Regex("(<|\\[)", "(");
-//
-// private static final Regex CLOSE_PAREN = new Regex("(>|\\])", ")");
+ // WUSS extended symbols. Avoid ambiguity with protein SS annotations by using
+ // NOT_RNASS first.
- public static final Regex DETECT_BRACKETS = new Regex(
- "(<|>|\\[|\\]|\\(|\\)|\\{|\\})");
-
- // WUSS extended symbols. Avoid ambiguity with protein SS annotations by using NOT_RNASS first.
public static final String RNASS_BRACKETS = "<>[](){}AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz";
+ public static final int REGEX_STOCKHOLM = 0;
+
+ public static final int REGEX_BRACKETS = 1;
+
// use the following regex to decide an annotations (whole) line is NOT an RNA
// SS (it contains only E,H,e,h and other non-brace/non-alpha chars)
- private static final Regex NOT_RNASS = new Regex(
- "^[^<>[\\](){}A-DF-Za-df-z]*$");
+ public static final int REGEX_NOT_RNASS = 2;
+
+ private static final int REGEX_ANNOTATION = 3;
+
+ private static final int REGEX_PFAM = 4;
+
+ private static final int REGEX_RFAM = 5;
+
+ private static final int REGEX_ALIGN_END = 6;
+
+ private static final int REGEX_SPLIT_ID = 7;
+
+ private static final int REGEX_SUBTYPE = 8;
+
+ private static final int REGEX_ANNOTATION_LINE = 9;
+
+ private static final int REGEX_REMOVE_ID = 10;
+
+ private static final int REGEX_OPEN_PAREN = 11;
+
+ private static final int REGEX_CLOSE_PAREN = 12;
+
+ public static final int REGEX_MAX = 13;
+
+ private static Regex REGEX[] = new Regex[REGEX_MAX];
+
+ /**
+ * Centralize all actual Regex instantialization in Platform.
+ *
+ * @param id
+ * @return
+ */
+ private static Regex getRegex(int id)
+ {
+ if (REGEX[id] == null)
+ {
+ String pat = null, pat2 = null;
+ switch (id)
+ {
+ case REGEX_STOCKHOLM:
+ pat = "# STOCKHOLM ([\\d\\.]+)";
+ break;
+ case REGEX_BRACKETS:
+ // for reference; not used
+ pat = "(<|>|\\[|\\]|\\(|\\)|\\{|\\})";
+ break;
+ case REGEX_NOT_RNASS:
+ pat = "^[^<>[\\](){}A-DF-Za-df-z]*$";
+ break;
+ case REGEX_ANNOTATION:
+ pat = "(\\w+)\\s*(.*)";
+ break;
+ case REGEX_PFAM:
+ pat = "PF[0-9]{5}(.*)";
+ break;
+ case REGEX_RFAM:
+ pat = "RF[0-9]{5}(.*)";
+ break;
+ case REGEX_ALIGN_END:
+ pat = "^\\s*\\/\\/";
+ break;
+ case REGEX_SPLIT_ID:
+ pat = "(\\S+)\\/(\\d+)\\-(\\d+)";
+ break;
+ case REGEX_SUBTYPE:
+ pat = "(\\S+)\\s+(\\S*)\\s+(.*)";
+ break;
+ case REGEX_ANNOTATION_LINE:
+ pat = "#=(G[FSRC]?)\\s+(.*)";
+ break;
+ case REGEX_REMOVE_ID:
+ pat = "(\\S+)\\s+(\\S+)";
+ break;
+ case REGEX_OPEN_PAREN:
+ pat = "(<|\\[)";
+ pat2 = "(";
+ break;
+ case REGEX_CLOSE_PAREN:
+ pat = "(>|\\])";
+ pat2 = ")";
+ break;
+ default:
+ return null;
+ }
+ REGEX[id] = Platform.newRegex(pat, pat2);
+ }
+ return REGEX[id];
+ }
StringBuffer out; // output buffer
// First, we have to check that this file has STOCKHOLM format, i.e. the
// first line must match
- r = new Regex("# STOCKHOLM ([\\d\\.]+)");
+ r = getRegex(REGEX_STOCKHOLM);
if (!r.search(nextLine()))
{
throw new IOException(MessageManager
}
// We define some Regexes here that will be used regularily later
- rend = new Regex("^\\s*\\/\\/"); // Find the end of an alignment
- p = new Regex("(\\S+)\\/(\\d+)\\-(\\d+)"); // split sequence id in
+ rend = getRegex(REGEX_ALIGN_END);//"^\\s*\\/\\/"); // Find the end of an alignment
+ p = getRegex(REGEX_SPLIT_ID);//"(\\S+)\\/(\\d+)\\-(\\d+)"); // split sequence id in
// id/from/to
- s = new Regex("(\\S+)\\s+(\\S*)\\s+(.*)"); // Parses annotation subtype
- r = new Regex("#=(G[FSRC]?)\\s+(.*)"); // Finds any annotation line
- x = new Regex("(\\S+)\\s+(\\S+)"); // split id from sequence
+ s = getRegex(REGEX_SUBTYPE);// "(\\S+)\\s+(\\S*)\\s+(.*)"); // Parses
+ // annotation subtype
+ r = getRegex(REGEX_ANNOTATION_LINE);// "#=(G[FSRC]?)\\s+(.*)"); // Finds any
+ // annotation line
+ x = getRegex(REGEX_REMOVE_ID);// "(\\S+)\\s+(\\S+)"); // split id from
+ // sequence
// Convert all bracket types to parentheses (necessary for passing to VARNA)
- Regex openparen = new Regex("(<|\\[)", "(");
- Regex closeparen = new Regex("(>|\\])", ")");
+ Regex openparen = getRegex(REGEX_OPEN_PAREN);//"(<|\\[)", "(");
+ Regex closeparen = getRegex(REGEX_CLOSE_PAREN);//"(>|\\])", ")");
// // Detect if file is RNA by looking for bracket types
-// Regex detectbrackets = new Regex("(<|>|\\[|\\]|\\(|\\))");
+ // Regex detectbrackets = getRegex("(<|>|\\[|\\]|\\(|\\))");
rend.optimize();
p.optimize();
this.noSeqs = seqs.size();
String dbsource = null;
- Regex pf = new Regex("PF[0-9]{5}(.*)"); // Finds AC for Pfam
- Regex rf = new Regex("RF[0-9]{5}(.*)"); // Finds AC for Rfam
+ Regex pf = getRegex(REGEX_PFAM); // Finds AC for Pfam
+ Regex rf = getRegex(REGEX_RFAM); // Finds AC for Rfam
if (getAlignmentProperty("AC") != null)
{
String dbType = getAlignmentProperty("AC").toString();
*/
// Let's save the annotations, maybe we'll be able to do something
// with them later...
- Regex an = new Regex("(\\w+)\\s*(.*)");
+ Regex an = getRegex(REGEX_ANNOTATION);
if (an.search(annContent))
{
if (an.stringMatched(1).equals("NH"))
if (type.equalsIgnoreCase("secondary structure"))
{
ss = true;
- isrnass = !NOT_RNASS.search(annots); // sorry about the double negative
+ isrnass = !getRegex(REGEX_NOT_RNASS).search(annots); // sorry about the double
+ // negative
// here (it's easier for dealing with
// other non-alpha-non-brace chars)
}
while (en.hasMoreElements())
{
Object idd = en.nextElement();
- String type = (String) dataRef.remove(idd);
+ String type = dataRef.remove(idd);
out.append(new Format("%-" + (maxid - 2) + "s")
.form("#=GS " + idd.toString() + " "));
if (type.contains("PFAM") || type.contains("RFAM"))
public final static String TCOFFEE_SCORE = "TCoffeeScore";
- static Pattern SCORES_WITH_RESIDUE_NUMS = Pattern
+ private final static Pattern SCORES_WITH_RESIDUE_NUMS = Pattern
.compile("^\\d+\\s([^\\s]+)\\s+\\d+$");
/** The {@link Header} structure holder */
{
return null;
}
- List<String> result = new ArrayList<String>(scores.size());
+ List<String> result = new ArrayList<>(scores.size());
for (Map.Entry<String, StringBuilder> it : scores.entrySet())
{
result.add(it.getValue().toString());
error = true;
return;
}
- scores = new LinkedHashMap<String, StringBuilder>();
+ scores = new LinkedHashMap<>();
/*
* initilize the structure
int score;
- LinkedHashMap<String, Integer> scores = new LinkedHashMap<String, Integer>();
+ LinkedHashMap<String, Integer> scores = new LinkedHashMap<>();
public int getScoreAvg()
{
public Block(int size)
{
this.size = size;
- this.items = new HashMap<String, String>(size);
+ this.items = new HashMap<>(size);
}
String getScoresFor(String id)
{
dssmods.addElement(sequence);
}
- ;
}
if (dssmods.size() > 0)
{
(AlignmentSequence) alsref, aa[i]);
break;
}
- ;
}
}
}
// /SAVE THE TREES
// /////////////////////////////////
// FIND ANY ASSOCIATED TREES
- if (Desktop.desktop != null)
+ if (Desktop.getDesktopPane() != null)
{
- javax.swing.JInternalFrame[] frames = Desktop.instance
+ javax.swing.JInternalFrame[] frames = Desktop.getInstance()
.getAllFrames();
for (int t = 0; t < frames.length; t++)
// active
if (mappings != null)
{
- jalview.structure.StructureSelectionManager
- .getStructureSelectionManager(Desktop.instance)
+ Desktop.getStructureSelectionManager()
.registerMappings(mappings);
}
}
}
// bitfields - should be a template in j1.5
- private static int HASSECSTR = 0;
+ private static final int HASSECSTR = 0;
- private static int HASVALS = 1;
+ private static final int HASVALS = 1;
- private static int HASHPHOB = 2;
+ private static final int HASHPHOB = 2;
- private static int HASDC = 3;
+ private static final int HASDC = 3;
- private static int HASDESCSTR = 4;
+ private static final int HASDESCSTR = 4;
- private static int HASTWOSTATE = 5; // not used yet.
+ private static final int HASTWOSTATE = 5; // not used yet.
/**
* parses the AnnotationElements - if they exist - into
Float val = null;
try
{
- val = Float.valueOf(props[p].getContent());
+ val = new Float(props[p].getContent());
} catch (Exception e)
{
Cache.log.warn("Failed to parse threshold property");
int se_end = se[1 - se[2]] + (se[2] == 0 ? 1 : -1);
for (int p = se[se[2]]; p != se_end; p += se[2] == 0 ? 1 : -1)
{
- posList.add(Integer.valueOf(p));
+ posList.add(new Integer(p));
}
}
}
for (int p = 0, pSize = dseta.getPosCount(); p < pSize; p++)
{
pos = dseta.getPos(p).getI();
- posList.add(Integer.valueOf(pos));
+ posList.add(new Integer(pos));
}
}
}
{
// This must be outside the run() body as java 1.5
// will not return any value from the OptionPane to the expired thread.
- int reply = JvOptionPane.showConfirmDialog(Desktop.desktop,
+ int reply = JvOptionPane.showConfirmDialog(Desktop.getDesktopPane(),
"Automatically update suggested ids?",
"Auto replace sequence ids", JvOptionPane.YES_NO_OPTION);
package jalview.io.cache;
import jalview.bin.Cache;
+import jalview.bin.ApplicationSingletonProvider;
+import jalview.bin.ApplicationSingletonProvider.ApplicationSingletonI;
import java.util.Hashtable;
import java.util.LinkedHashSet;
/**
* A singleton class used for querying and persisting cache items.
*
+ *
* @author tcnofoegbu
*
*/
-public class AppCache
+public class AppCache implements ApplicationSingletonI
{
+
+ public static AppCache getInstance()
+ {
+ return (AppCache) ApplicationSingletonProvider.getInstance(AppCache.class);
+ }
+
+ private AppCache()
+ {
+ cacheItems = new Hashtable<>();
+ }
+
public static final String DEFAULT_LIMIT = "99";
public static final String CACHE_DELIMITER = ";";
- private static AppCache instance = null;
-
private static final String DEFAULT_LIMIT_KEY = ".DEFAULT_LIMIT";
private Hashtable<String, LinkedHashSet<String>> cacheItems;
- private AppCache()
- {
- cacheItems = new Hashtable<String, LinkedHashSet<String>>();
- }
-
/**
* Method to obtain all the cache items for a given cache key
*
LinkedHashSet<String> foundCache = cacheItems.get(cacheKey);
if (foundCache == null)
{
- foundCache = new LinkedHashSet<String>();
+ foundCache = new LinkedHashSet<>();
cacheItems.put(cacheKey, foundCache);
}
return foundCache;
}
/**
- * Returns a singleton instance of AppCache
- *
- * @return
- */
- public static AppCache getInstance()
- {
- if (instance == null)
- {
- instance = new AppCache();
- }
- return instance;
- }
-
- /**
* Method for persisting cache items for a given cache key
*
* @param cacheKey
@Override
public void run()
{
- int cacheLimit = Integer.parseInt(appCache.getCacheLimit(cacheKey));
- String userInput = getUserInput();
- if (userInput != null && !userInput.isEmpty())
- {
- LinkedHashSet<String> foundCache = appCache
- .getAllCachedItemsFor(cacheKey);
- // remove old cache item so as to place current input at the top of
- // the result
- foundCache.remove(userInput);
- foundCache.add(userInput);
- appCache.putCache(cacheKey, foundCache);
- }
+ updateCacheNow();
+ }
+ });
+ }
- String lastSearch = userInput;
- if (comboBox.getItemCount() > 0)
- {
- comboBox.removeAllItems();
- }
- Set<String> cacheItems = appCache.getAllCachedItemsFor(cacheKey);
- List<String> reversedCacheItems = new ArrayList<>();
- reversedCacheItems.addAll(cacheItems);
- cacheItems = null;
- Collections.reverse(reversedCacheItems);
- if (lastSearch.isEmpty())
- {
- comboBox.addItem("");
- }
+ /**
+ * For TestNG
+ *
+ * @author Bob Hanson 2019.08.28
+ */
+ public void updateCacheNow()
+ {
+ int cacheLimit = Integer.parseInt(appCache.getCacheLimit(cacheKey));
+ String userInput = getUserInput();
+ if (userInput != null && !userInput.isEmpty())
+ {
+ LinkedHashSet<String> foundCache = appCache
+ .getAllCachedItemsFor(cacheKey);
+ // remove old cache item so as to place current input at the top of
+ // the result
+ foundCache.remove(userInput);
+ foundCache.add(userInput);
+ appCache.putCache(cacheKey, foundCache);
+ }
- if (reversedCacheItems != null && !reversedCacheItems.isEmpty())
+ String lastSearch = userInput;
+ if (comboBox.getItemCount() > 0)
+ {
+ comboBox.removeAllItems();
+ }
+ Set<String> cacheItems = appCache.getAllCachedItemsFor(cacheKey);
+ List<String> reversedCacheItems = new ArrayList<>();
+ reversedCacheItems.addAll(cacheItems);
+ cacheItems = null;
+ Collections.reverse(reversedCacheItems);
+ if (lastSearch.isEmpty())
+ {
+ comboBox.addItem("");
+ }
+
+ if (reversedCacheItems != null && !reversedCacheItems.isEmpty())
+ {
+ LinkedHashSet<String> foundCache = appCache
+ .getAllCachedItemsFor(cacheKey);
+ boolean prune = reversedCacheItems.size() > cacheLimit;
+ int count = 1;
+ boolean limitExceeded = false;
+ for (String cacheItem : reversedCacheItems)
+ {
+ limitExceeded = (count++ > cacheLimit);
+ if (prune)
{
- LinkedHashSet<String> foundCache = appCache
- .getAllCachedItemsFor(cacheKey);
- boolean prune = reversedCacheItems.size() > cacheLimit;
- int count = 1;
- boolean limitExceeded = false;
- for (String cacheItem : reversedCacheItems)
+ if (limitExceeded)
{
- limitExceeded = (count++ > cacheLimit);
- if (prune)
- {
- if (limitExceeded)
- {
- foundCache.remove(cacheItem);
- }
- else
- {
- comboBox.addItem(cacheItem);
- }
- }
- else
- {
- comboBox.addItem(cacheItem);
- }
+ foundCache.remove(cacheItem);
}
- appCache.putCache(cacheKey, foundCache);
+ else
+ {
+ comboBox.addItem(cacheItem);
+ }
+ }
+ else
+ {
+ comboBox.addItem(cacheItem);
}
- setSelectedItem(lastSearch.isEmpty() ? "" : lastSearch);
}
- });
+ appCache.putCache(cacheKey, foundCache);
+ }
+ setSelectedItem(lastSearch.isEmpty() ? "" : lastSearch);
+
}
/**
String atts = gff[ATTRIBUTES_COL];
Map<String, List<String>> attributes = parseNameValuePairs(atts);
- SequenceOntologyI so = SequenceOntologyFactory.getInstance();
+ SequenceOntologyI so = SequenceOntologyFactory.getSequenceOntology();
if (so.isA(soTerm, SequenceOntologyI.PROTEIN_MATCH))
{
sf = processProteinMatch(attributes, seq, gff, align, newseqs,
desc = target.split(" ")[0];
}
- SequenceOntologyI so = SequenceOntologyFactory.getInstance();
+ SequenceOntologyI so = SequenceOntologyFactory.getSequenceOntology();
String type = sf.getType();
if (so.isA(type, SequenceOntologyI.SEQUENCE_VARIANT))
{
*/
public static boolean recognises(String[] columns)
{
- SequenceOntologyI so = SequenceOntologyFactory.getInstance();
+ SequenceOntologyI so = SequenceOntologyFactory.getSequenceOntology();
String type = columns[TYPE_COL];
if (so.isA(type, SequenceOntologyI.PROTEIN_MATCH)
|| (".".equals(columns[SOURCE_COL])
*/
package jalview.io.gff;
+import jalview.bin.ApplicationSingletonProvider;
+import jalview.bin.ApplicationSingletonProvider.ApplicationSingletonI;
+
/**
* A factory class that returns a model of the Sequence Ontology. By default a
- * hard-coded subset is used (for the applet, or testing), or setInstance() can
- * be used to set full Ontology data.
+ * hard-coded subset is used (for the applet, or testing), or
+ * setSequenceOntology() can be used to set full Ontology data.
*
* @author gmcarstairs
*
*/
-public class SequenceOntologyFactory
+public class SequenceOntologyFactory implements ApplicationSingletonI
{
- private static SequenceOntologyI instance;
+ /**
+ * Answers an instance of this class for the current application context. Note
+ * that this supports running two JS 'applets' on the same page, one with the
+ * full Sequence Ontology (USE_FULL_SO = true) and one with a hard-coded
+ * subset (USE_FULL_SO = false). If this is overkill, could change this method
+ * to just return a common static instance.
+ *
+ * @return
+ */
+ private static synchronized SequenceOntologyFactory getInstance()
+ {
+ return (SequenceOntologyFactory) ApplicationSingletonProvider
+ .getInstance(SequenceOntologyFactory.class);
+ }
+
+ /**
+ * Answers the configured model of the Sequence Ontology.
+ *
+ * @return
+ */
+ public static synchronized SequenceOntologyI getSequenceOntology()
+ {
+ SequenceOntologyFactory f = getInstance();
+ return (f.sequenceOntology == null
+ ? f.sequenceOntology = new SequenceOntologyLite()
+ : f.sequenceOntology);
+ }
- public static synchronized SequenceOntologyI getInstance()
+ /**
+ * For testng only
+ *
+ * @param so
+ */
+ public static void setSequenceOntology(SequenceOntologyI so)
{
- if (instance == null)
- {
- instance = new SequenceOntologyLite();
- }
- return instance;
+ getInstance().sequenceOntology = so;
}
- public static void setInstance(SequenceOntologyI so)
+ private SequenceOntologyI sequenceOntology;
+
+ private SequenceOntologyFactory()
{
- instance = so;
+ // private singleton
}
+
}
import java.util.Iterator;
import java.util.Map;
-public class DatastoreRegistry implements AutoCloseable
+public class DatastoreRegistry
{
protected static org.apache.log4j.Logger log = org.apache.log4j.Logger
.getLogger(DatastoreRegistry.class);
}
@Override
- public void close()
+ protected void finalize() throws Throwable
{
if (dsObjReg != null)
{
{
dsItemReg.clear();
}
- // super.finalize();
+ super.finalize();
}
}
int se_end = se[1 - se[2]] + (se[2] == 0 ? 1 : -1);
for (int p = se[se[2]]; p != se_end; p += se[2] == 0 ? 1 : -1)
{
- posList.add(Integer.valueOf(p));
+ posList.add(new Integer(p));
}
}
}
for (int p = 0, pSize = dseta.getPosCount(); p < pSize; p++)
{
pos = dseta.getPos(p).getI();
- posList.add(Integer.valueOf(pos));
+ posList.add(new Integer(pos));
}
}
}
for (int s = 0, sSize = range.getSegCount(); s < sSize; s++)
{
se = getSegRange(range.getSeg(s), false);
- posList.addElement(Integer.valueOf(se[0]));
- posList.addElement(Integer.valueOf(se[1]));
+ posList.addElement(new Integer(se[0]));
+ posList.addElement(new Integer(se[1]));
}
}
else if (range.getPosCount() > 0)
for (int p = 0, pSize = range.getPosCount(); p < pSize; p++)
{
pos = range.getPos(p).getI();
- posList.add(Integer.valueOf(pos));
- posList.add(Integer.valueOf(pos));
+ posList.add(new Integer(pos));
+ posList.add(new Integer(pos));
}
}
}
if (feature.otherDetails != null)
{
Iterator<String> iter = feature.otherDetails.keySet().iterator();
- Vector props = dsa.getPropertyAsReference();
+ Vector<?> props = dsa.getPropertyAsReference();
while (iter.hasNext())
{
String key = iter.next();
String featureType = dseta.getType();
if (dseta.getScoreCount() > 0)
{
- Enumeration scr = dseta.enumerateScore();
+ @SuppressWarnings("unchecked")
+ Enumeration<Score> scr = dseta.enumerateScore();
while (scr.hasMoreElements())
{
- Score score = (Score) scr.nextElement();
+ Score score = scr.nextElement();
if (score.getName().equals(featureType))
{
theScore = score.getContent();
}
if (dseta.getScoreCount() > 0)
{
- Enumeration scr = dseta.enumerateScore();
+ @SuppressWarnings("unchecked")
+ Enumeration<Score> scr = dseta.enumerateScore();
while (scr.hasMoreElements())
{
- Score score = (Score) scr.nextElement();
+ Score score = scr.nextElement();
if (!score.getName().equals(sf.getType()))
{
sf.setValue(score.getName(), "" + score.getContent());
}
}
// other details
- Enumeration props = dseta.enumerateProperty();
+ @SuppressWarnings("unchecked")
+ Enumeration<Property> props = dseta.enumerateProperty();
while (props.hasMoreElements())
{
- Property p = (Property) props.nextElement();
+ Property p = props.nextElement();
Object val = null;
if (Properties.isValid(p))
{
{
try
{
- val = Boolean.valueOf(p.getContent());
+ val = new Boolean(p.getContent());
} catch (Exception e)
{
}
{
try
{
- val = Float.valueOf(p.getContent());
+ val = new Float(p.getContent());
} catch (Exception e)
{
{
try
{
- val = Integer.valueOf(p.getContent());
+ val = new Integer(p.getContent());
} catch (Exception e)
{
}
}
}
+ @Override
public void addToDocument()
{
add(mjvmapping, from, ds);
}
+ @Override
public void addFromDocument()
{
add((SequenceMapping) vobj);
}
+ @Override
public void conflict()
{
conflict(mjvmapping, (SequenceMapping) vobj);
}
+ @Override
public void updateToDoc()
{
update(mjvmapping, (SequenceMapping) vobj);
}
+ @Override
public void updateFromDoc()
{
update((SequenceMapping) vobj, (jalview.datamodel.Mapping) jvobj);
acf.addMap(from, to, mapping);
}
bindjvvobj(mapping, sequenceMapping);
- jalview.structure.StructureSelectionManager
- .getStructureSelectionManager(Desktop.instance)
+ Desktop.getStructureSelectionManager()
.registerMapping(acf);
// Try to link up any conjugate database references in the two sequences
// matchConjugateDBRefs(from, to, mapping);
+ from.getName() + " and " + to.getName());
}
List<DBRefEntry> fdb = from.getDBRefs();
- List<DBRefEntry> tdb = new ArrayList<DBRefEntry>(to.getDBRefs());
+ List<DBRefEntry> tdb = new ArrayList<>(to.getDBRefs());
int tdblen = to.getDBRefs().size();
//
//
Integer nindx = (Integer) nodespecs.get(nname);
if (nindx == null)
{
- nindx = Integer.valueOf(1);
+ nindx = new Integer(1);
}
nname = nindx.toString() + " " + nname;
return nname;
String oval = nodespec.substring(0, nodespec.indexOf(' '));
try
{
- occurence = Integer.valueOf(oval).intValue();
+ occurence = new Integer(oval).intValue();
} catch (Exception e)
{
System.err.println("Invalid nodespec '" + nodespec + "'");
* referenced in input data has already been associated with jalview objects.
*
* @param tp
- * @param alignFrame
+ * @param loaderFrame
* @return Object[] { AlignmentView, AlignmentI - reference alignment for
* input }
*/
*/
public class VCFLoader
{
- private static final String DEFAULT_SPECIES = "homo_sapiens";
-
/**
* A class to model the mapping from sequence to VCF coordinates. Cases include
* <ul>
/*
* Lookup keys, and default values, for Preference entries that describe
- * patterns for VCF and VEP fields to capture
+ * patterns for VCF and VEP fields to capture
*/
private static final String VEP_FIELDS_PREF = "VEP_FIELDS";
private static final String DEFAULT_VEP_FIELDS = ".*";// "Allele,Consequence,IMPACT,SWISSPROT,SIFT,PolyPhen,CLIN_SIG";
/*
- * Lookup keys, and default values, for Preference entries that give
- * mappings from tokens in the 'reference' header to species or assembly
- */
- private static final String VCF_ASSEMBLY = "VCF_ASSEMBLY";
-
- private static final String DEFAULT_VCF_ASSEMBLY = "assembly19=GRCh38,hs37=GRCh37,grch37=GRCh37,grch38=GRCh38";
-
- private static final String VCF_SPECIES = "VCF_SPECIES"; // default is human
-
- /*
* keys to fields of VEP CSQ consequence data
* see https://www.ensembl.org/info/docs/tools/vep/vep_formats.html
*/
private static final String PIPE_REGEX = "\\|";
/*
+ * key for Allele Frequency output by VEP
+ * see http://www.ensembl.org/info/docs/tools/vep/vep_formats.html
+ */
+ private static final String ALLELE_FREQUENCY_KEY = "AF";
+
+ /*
* delimiter that separates multiple consequence data blocks
*/
private static final String COMMA = ",";
private VCFHeader header;
/*
- * species (as a valid Ensembl term) the VCF is for
- */
- private String vcfSpecies;
-
- /*
- * genome assembly version (as a valid Ensembl identifier) the VCF is for
- */
- private String vcfAssembly;
-
- /*
* a Dictionary of contigs (if present) referenced in the VCF file
*/
private SAMSequenceDictionary dictionary;
*/
public SequenceI loadVCFContig(String contig)
{
- VCFHeaderLine headerLine = header.getOtherHeaderLine(VCFHeader.REFERENCE_KEY);
- String ref = headerLine == null ? null : headerLine.getValue();
+ String ref = header.getOtherHeaderLine(VCFHeader.REFERENCE_KEY)
+ .getValue();
if (ref.startsWith("file://"))
{
ref = ref.substring(7);
}
- setSpeciesAndAssembly(ref);
SequenceI seq = null;
File dbFile = new File(ref);
{
HtsContigDb db = new HtsContigDb("", dbFile);
seq = db.getSequenceProxy(contig);
- loadSequenceVCF(seq);
+ loadSequenceVCF(seq, ref);
db.close();
}
else
{
VCFHeaderLine ref = header
.getOtherHeaderLine(VCFHeader.REFERENCE_KEY);
- String reference = ref.getValue();
-
- setSpeciesAndAssembly(reference);
+ String vcfAssembly = ref.getValue();
int varCount = 0;
int seqCount = 0;
*/
for (SequenceI seq : seqs)
{
- int added = loadSequenceVCF(seq);
+ int added = loadSequenceVCF(seq, vcfAssembly);
if (added > 0)
{
seqCount++;
}
/**
- * Attempts to determine and save the species and genome assembly version to
- * which the VCF data applies. This may be done by parsing the {@code reference}
- * header line, configured in a property file, or (potentially) confirmed
- * interactively by the user.
- * <p>
- * The saved values should be identifiers valid for Ensembl's REST service
- * {@code map} endpoint, so they can be used (if necessary) to retrieve the
- * mapping between VCF coordinates and sequence coordinates.
- *
- * @param reference
- * @see https://rest.ensembl.org/documentation/info/assembly_map
- * @see https://rest.ensembl.org/info/assembly/human?content-type=text/xml
- * @see https://rest.ensembl.org/info/species?content-type=text/xml
- */
- protected void setSpeciesAndAssembly(String reference)
- {
- reference = reference.toLowerCase();
- vcfSpecies = DEFAULT_SPECIES;
-
- /*
- * for a non-human species, or other assembly identifier,
- * specify as a Jalview property file entry e.g.
- * VCF_ASSEMBLY = hs37=GRCh37,assembly19=GRCh37
- * VCF_SPECIES = c_elegans=celegans
- * to map a token in the reference header to a value
- */
- String prop = Cache.getDefault(VCF_ASSEMBLY, DEFAULT_VCF_ASSEMBLY);
- for (String token : prop.split(","))
- {
- String[] tokens = token.split("=");
- if (tokens.length == 2)
- {
- if (reference.contains(tokens[0].trim().toLowerCase()))
- {
- vcfAssembly = tokens[1].trim();
- break;
- }
- }
- }
-
- prop = Cache.getProperty(VCF_SPECIES);
- if (prop != null)
- {
- for (String token : prop.split(","))
- {
- String[] tokens = token.split("=");
- if (tokens.length == 2)
- {
- if (reference.contains(tokens[0].trim().toLowerCase()))
- {
- vcfSpecies = tokens[1].trim();
- break;
- }
- }
- }
- }
- }
-
- /**
* Opens the VCF file and parses header data
*
* @param filePath
* and returns the number of variant features added
*
* @param seq
+ * @param vcfAssembly
* @return
*/
- protected int loadSequenceVCF(SequenceI seq)
+ protected int loadSequenceVCF(SequenceI seq, String vcfAssembly)
{
- VCFMap vcfMap = getVcfMap(seq);
+ VCFMap vcfMap = getVcfMap(seq, vcfAssembly);
if (vcfMap == null)
{
return 0;
* Answers a map from sequence coordinates to VCF chromosome ranges
*
* @param seq
+ * @param vcfAssembly
* @return
*/
- private VCFMap getVcfMap(SequenceI seq)
+ private VCFMap getVcfMap(SequenceI seq, String vcfAssembly)
{
/*
* simplest case: sequence has id and length matching a VCF contig
String seqRef = seqCoords.getAssemblyId();
MapList map = seqCoords.getMap();
- // note this requires the configured species to match that
- // returned with the Ensembl sequence; todo: support aliases?
- if (!vcfSpecies.equalsIgnoreCase(species))
+ if (!vcfSpeciesMatchesSequence(vcfAssembly, species))
{
- Cache.log.warn("No VCF loaded to " + seq.getName()
- + " as species not matched");
return null;
}
- if (seqRef.equalsIgnoreCase(vcfAssembly))
+ if (vcfAssemblyMatchesSequence(vcfAssembly, seqRef))
{
return new VCFMap(chromosome, map);
}
+ if (!"GRCh38".equalsIgnoreCase(seqRef) // Ensembl
+ || !vcfAssembly.contains("Homo_sapiens_assembly19")) // gnomAD
+ {
+ return null;
+ }
+
/*
- * VCF data has a different reference assembly to the sequence:
- * query Ensembl to map chromosomal coordinates from sequence to VCF
+ * map chromosomal coordinates from sequence to VCF if the VCF
+ * data has a different reference assembly to the sequence
*/
+ // TODO generalise for cases other than GRCh38 -> GRCh37 !
+ // - or get the user to choose in a dialog
+
List<int[]> toVcfRanges = new ArrayList<>();
List<int[]> fromSequenceRanges = new ArrayList<>();
+ String toRef = "GRCh37";
for (int[] range : map.getToRanges())
{
}
int[] newRange = mapReferenceRange(range, chromosome, "human", seqRef,
- vcfAssembly);
+ toRef);
if (newRange == null)
{
Cache.log.error(
String.format("Failed to map %s:%s:%s:%d:%d to %s", species,
- chromosome, seqRef, range[0], range[1],
- vcfAssembly));
+ chromosome, seqRef, range[0], range[1], toRef));
continue;
}
else
}
/**
+ * Answers true if we determine that the VCF data uses the same reference
+ * assembly as the sequence, else false
+ *
+ * @param vcfAssembly
+ * @param seqRef
+ * @return
+ */
+ private boolean vcfAssemblyMatchesSequence(String vcfAssembly,
+ String seqRef)
+ {
+ // TODO improve on this stub, which handles gnomAD and
+ // hopes for the best for other cases
+
+ if ("GRCh38".equalsIgnoreCase(seqRef) // Ensembl
+ && vcfAssembly.contains("Homo_sapiens_assembly19")) // gnomAD
+ {
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Answers true if the species inferred from the VCF reference identifier
+ * matches that for the sequence
+ *
+ * @param vcfAssembly
+ * @param speciesId
+ * @return
+ */
+ boolean vcfSpeciesMatchesSequence(String vcfAssembly, String speciesId)
+ {
+ // PROBLEM 1
+ // there are many aliases for species - how to equate one with another?
+ // PROBLEM 2
+ // VCF ##reference header is an unstructured URI - how to extract species?
+ // perhaps check if ref includes any (Ensembl) alias of speciesId??
+ // TODO ask the user to confirm this??
+
+ if (vcfAssembly.contains("Homo_sapiens") // gnomAD exome data example
+ && "HOMO_SAPIENS".equals(speciesId)) // Ensembl species id
+ {
+ return true;
+ }
+
+ if (vcfAssembly.contains("c_elegans") // VEP VCF response example
+ && "CAENORHABDITIS_ELEGANS".equals(speciesId)) // Ensembl
+ {
+ return true;
+ }
+
+ // this is not a sustainable solution...
+
+ return false;
+ }
+
+ /**
* Queries the VCF reader for any variants that overlap the mapped chromosome
* ranges of the sequence, and adds as variant features. Returns the number of
* overlapping variants found.
*/
package jalview.javascript;
-import jalview.bin.JalviewLite;
+import jalview.api.JalviewApp;
import java.net.URL;
+import java.util.Hashtable;
import java.util.Vector;
import netscape.javascript.JSObject;
public class JSFunctionExec implements Runnable
{
- public JalviewLite jvlite;
+ public JalviewApp jvlite;
- public JSFunctionExec(JalviewLite applet)
+ protected boolean debug;
+
+ public JSFunctionExec(JalviewApp applet, boolean debug)
{
jvlite = applet;
-
- jsExecQueue = jvlite.getJsExecQueue();
- jvlite.setExecutor(this);
+ this.debug = debug;
+ jsExecQueue = jvlite.getJsExecQueue(this);
}
- private Vector jsExecQueue;
+ private Vector<Runnable> jsExecQueue;
private Thread executor = null;
{
if (jsExecQueue != null)
{
- Vector<JSFunctionExec> q = null;
+ Vector<Runnable> q = null;
synchronized (jsExecQueue)
{
q = jsExecQueue;
}
if (q != null)
{
- for (JSFunctionExec jx : q)
+ for (Runnable jx : q)
{
- jx.jvlite = null;
+ ((JSFunctionExec) jx).jvlite = null;
}
q.removeAllElements();
{
if (jsExecQueue.size() > 0)
{
- Runnable r = (Runnable) jsExecQueue.elementAt(0);
+ Runnable r = jsExecQueue.elementAt(0);
jsExecQueue.removeElementAt(0);
try
{
JSObject scriptObject = null;
try
{
- scriptObject = JSObject.getWindow(jvlite);
+ scriptObject = jvlite.getJSObject();
} catch (Exception ex)
{
}
;
if (scriptObject != null)
{
- if (jvlite.debug && dbgMsg != null)
+ if (debug && dbgMsg != null)
{
System.err.println(dbgMsg);
}
// squash any malformedURLExceptions thrown by windows/safari
if (!(jex instanceof java.net.MalformedURLException))
{
- if (jvlite.debug)
+ if (debug)
{
System.err.println(jex);
}
if (jex instanceof netscape.javascript.JSException
- && jvlite.jsfallbackEnabled)
+ && jvlite.isJsfallbackEnabled())
{
jsex[0] = jex;
- if (jvlite.debug)
+ if (debug)
{
System.err.println("Falling back to javascript: url call");
}
sb.append("\"");
}
sb.append(")");
- if (jvlite.debug)
+ if (debug)
{
System.err.println(sb.toString());
}
{
if (executor == null)
{
- executor = new Thread(new JSFunctionExec(jvlite));
+ executor = new Thread(new JSFunctionExec(jvlite, debug));
executor.start();
}
synchronized (jsExecQueue)
}
}
+ public static void setJsMessageSet(String messageclass, String viewId,
+ String[] colcommands, JalviewApp app)
+ {
+ Hashtable<String, Hashtable<String, String[]>> jsmessages = app
+ .getJSMessages();
+ Hashtable<String, int[]> jshashes = app.getJSHashes();
+
+ Hashtable<String, String[]> msgset = jsmessages.get(messageclass);
+ if (msgset == null)
+ {
+ msgset = new Hashtable<>();
+ jsmessages.put(messageclass, msgset);
+ }
+ msgset.put(viewId, colcommands);
+ int[] l = new int[colcommands.length];
+ for (int i = 0; i < colcommands.length; i++)
+ {
+ l[i] = colcommands[i].hashCode();
+ }
+ jshashes.put(messageclass + "|" + viewId, l);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see jalview.bin.JalviewLiteJsApi#getJsMessage(java.lang.String,
+ * java.lang.String)
+ */
+ public static String getJsMessage(String messageclass, String viewId,
+ JalviewApp app)
+ {
+ Hashtable<String, String[]> msgset = app.getJSMessages()
+ .get(messageclass);
+ if (msgset != null)
+ {
+ String[] msgs = msgset.get(viewId);
+ if (msgs != null)
+ {
+ for (int i = 0; i < msgs.length; i++)
+ {
+ if (msgs[i] != null)
+ {
+ String m = msgs[i];
+ msgs[i] = null;
+ return m;
+ }
+ }
+ }
+ }
+ return "";
+ }
+
+ public static boolean isJsMessageSetChanged(String string, String string2,
+ String[] colcommands, JalviewApp app)
+ {
+ int[] l = app.getJSHashes().get(string + "|" + string2);
+ if (l == null && colcommands != null)
+ {
+ return true;
+ }
+ for (int i = 0; i < colcommands.length; i++)
+ {
+ if (l[i] != colcommands[i].hashCode())
+ {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public void tidyUp()
+ {
+ stopQueue();
+ jvlite = null;
+ }
+
}
/*
- * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
- * Copyright (C) $$Year-Rel$$ The Jalview Authors
+ * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$);
+ * Copyright (C); $$Year-Rel$$ The Jalview Authors
*
* This file is part of Jalview.
*
* Jalview is free software: you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation, either version 3
- * of the License, or (at your option) any later version.
+ * of the License, or (at your option); any later version.
*
* Jalview is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty
*/
package jalview.javascript;
-import jalview.appletgui.AlignFrame;
+import jalview.api.AlignFrameI;
/**
* The following public methods may be called
* externally, eg via javascript in an HTML page.
*
- * <br><em>TODO: introduce abstract interface for jalview.appletgui.AlignFrame</em><br>
+ * <br><em>TODO: introduce abstract interface for jalview.appletgui.AlignFrameI</em><br>
*
* Most function arguments are strings, which contain serialised versions of lists.
* Lists of things are separated by a separator character - either the default or a user supplied one.
/**
* @return String list of selected sequence IDs, each terminated by the
- * 'boolean not' character (""+0x00AC) or (¬)
+ * 'boolean not' character (""+0x00AC); or (¬);
*/
public abstract String getSelectedSequences();
/**
* @param alf
- * alignframe containing selection
+ * AlignFrameI containing selection
* @return String list of selected sequence IDs, each terminated by current
* default separator sequence
*
*/
- public abstract String getSelectedSequencesFrom(AlignFrame alf);
+ public abstract String getSelectedSequencesFrom(AlignFrameI alf);
/**
* get list of selected sequence IDs separated by given separator
* @return String list of selected sequence IDs, each terminated by the given
* separator
*/
- public abstract String getSelectedSequencesFrom(AlignFrame alf,
+ public abstract String getSelectedSequencesFrom(AlignFrameI alf,
String sep);
/**
* false, blank or something else - indicate if position is an
* alignment column or unaligned sequence position
*/
- public abstract void highlightIn(AlignFrame alf, String sequenceId,
+ public abstract void highlightIn(AlignFrameI alf, String sequenceId,
String position, String alignedPosition);
/**
* @param sep
* separator between toselect fields
*/
- public abstract void selectIn(AlignFrame alf, String sequenceIds,
+ public abstract void selectIn(AlignFrameI alf, String sequenceIds,
String columns);
/**
* @param sep
* separator between toselect fields
*/
- public abstract void selectIn(AlignFrame alf, String sequenceIds,
+ public abstract void selectIn(AlignFrameI alf, String sequenceIds,
String columns, String sep);
/**
- * get sequences selected in current alignFrame and return their alignment in
+ * get sequences selected in current AlignFrameI and return their alignment in
* format 'format' either with or without suffix
*
* @param alf
* @return selected sequences as flat file or empty string if there was no
* current selection
*/
- public abstract String getSelectedSequencesAsAlignmentFrom(AlignFrame alf,
+ public abstract String getSelectedSequencesAsAlignmentFrom(
+ AlignFrameI alf,
String format, String suffix);
/**
* @param alf
* @return
*/
- public abstract String getAlignmentOrderFrom(AlignFrame alf);
+ public abstract String getAlignmentOrderFrom(AlignFrameI alf);
/**
* get a sep separated list of sequence IDs reflecting the order of the
* - separator to use
* @return
*/
- public abstract String getAlignmentOrderFrom(AlignFrame alf, String sep);
+ public abstract String getAlignmentOrderFrom(AlignFrameI alf,
+ String sep);
/**
* re-order the current alignment using the given list of sequence IDs
* @return 'true' if alignment was actually reordered. empty string if
* alignment did not contain sequences.
*/
- public abstract String orderBy(String order, String undoName, String sep);
+ public abstract String orderBy(String order, String undoName,
+ String sep);
/**
* re-order the given alignment using the given list of sequence IDs separated
* @return 'true' if alignment was actually reordered. empty string if
* alignment did not contain sequences.
*/
- public abstract String orderAlignmentBy(AlignFrame alf, String order,
+ public abstract String orderAlignmentBy(AlignFrameI alf, String order,
String undoName, String sep);
/**
* get alignment as format (format names FASTA, BLC, CLUSTAL, MSF, PILEUP,
- * PFAM - see jalview.io.AppletFormatAdapter for full list)
+ * PFAM - see jalview.io.AppletFormatAdapter for full list);
*
* @param format
* @return
* @param format
* @return
*/
- public abstract String getAlignmentFrom(AlignFrame alf, String format);
+ public abstract String getAlignmentFrom(AlignFrameI alf, String format);
/**
* get alignment as format with jalview start-end sequence suffix appended
* @param suffix
* @return
*/
- public abstract String getAlignmentFrom(AlignFrame alf, String format,
+ public abstract String getAlignmentFrom(AlignFrameI alf, String format,
String suffix);
/**
* @param alf
* @param annotation
*/
- public abstract void loadAnnotationFrom(AlignFrame alf,
+ public abstract void loadAnnotationFrom(AlignFrameI alf,
String annotation);
/**
* parse the given string as a jalview feature or GFF annotation file and
- * optionally enable feature display on the current alignFrame
+ * optionally enable feature display on the current AlignFrameI
*
* @param features
* - gff or features file
/**
* parse the given string as a jalview feature or GFF annotation file and
- * optionally enable feature display on the given alignFrame.
+ * optionally enable feature display on the given AlignFrameI.
*
* @param alf
* @param features
* be parsed from the string.
* @return true if data parsed as features
*/
- public abstract boolean loadFeaturesFrom(AlignFrame alf, String features,
+ public abstract boolean loadFeaturesFrom(AlignFrameI alf, String features,
boolean autoenabledisplay);
/**
- * get the sequence features in the given format (Jalview or GFF)
+ * get the sequence features in the given format (Jalview or GFF);
*
* @param format
* @return
public abstract String getFeatures(String format);
/**
- * get the sequence features in alf in the given format (Jalview or GFF)
+ * get the sequence features in alf in the given format (Jalview or GFF);
*
* @param alf
* @param format
* @return
*/
- public abstract String getFeaturesFrom(AlignFrame alf, String format);
+ public abstract String getFeaturesFrom(AlignFrameI alf, String format);
/**
* get current alignment's annotation as an annotation file
* @param alf
* @return
*/
- public abstract String getAnnotationFrom(AlignFrame alf);
+ public abstract String getAnnotationFrom(AlignFrameI alf);
/**
- * create a new view and return the alignFrame instance
+ * create a new view and return the AlignFrameI instance
*
* @return
*/
- public abstract AlignFrame newView();
+ public abstract AlignFrameI newView();
/**
- * create a new view named name and return the alignFrame instance
+ * create a new view named name and return the AlignFrameI instance
*
* @param name
* @return
*/
- public abstract AlignFrame newView(String name);
+ public abstract AlignFrameI newView(String name);
/**
- * create a new view on alf and return the alignFrame instance
+ * create a new view on alf and return the AlignFrameI instance
*
* @param alf
* @return
*/
- public abstract AlignFrame newViewFrom(AlignFrame alf);
+ public abstract AlignFrameI newViewFrom(AlignFrameI alf);
/**
* create a new view named name on alf
* @param name
* @return
*/
- public abstract AlignFrame newViewFrom(AlignFrame alf, String name);
+ public abstract AlignFrameI newViewFrom(AlignFrameI alf, String name);
/**
*
* window title
* @return null or new alignment frame
*/
- public abstract AlignFrame loadAlignment(String text, String title);
+ public abstract AlignFrameI loadAlignment(String text, String title);
/**
* register a javascript function to handle any alignment mouseover events
*
* @param listener
* name of javascript function (called with arguments
- * [jalview.appletgui.AlignFrame,String(sequence id),String(column in
- * alignment), String(position in sequence)]
+ * [jalview.appletgui.AlignFrameI,String(sequence id);,String(column
+ * in alignment);, String(position in sequence);]
*/
public abstract void setMouseoverListener(String listener);
* register a javascript function to handle mouseover events
*
* @param af
- * (null or specific alignframe for which events are to be listened
- * for)
+ * (null or specific AlignFrameI for which events are to be listened
+ * for);
* @param listener
* name of javascript function
*/
- public abstract void setMouseoverListener(AlignFrame af, String listener);
+ public abstract void setMouseoverListener(AlignFrameI af,
+ String listener);
/**
* register a javascript function to handle any alignment selection events.
*
* @param listener
* name of javascript function (called with arguments
- * [jalview.appletgui.AlignFrame, String(sequence set id),
- * String(separator separated list of sequences which were selected),
- * String(separator separated list of column ranges (i.e. single
- * number or hyphenated range) that were selected)]
+ * [jalview.appletgui.AlignFrameI, String(sequence set id);,
+ * String(separator separated list of sequences which were
+ * selected);, String(separator separated list of column ranges (i.e.
+ * single number or hyphenated range); that were selected);]
*/
public abstract void setSelectionListener(String listener);
- public abstract void setSelectionListener(AlignFrame af, String listener);
+ public abstract void setSelectionListener(AlignFrameI af,
+ String listener);
/**
* register a javascript function to handle events normally routed to a Jmol
*
* @param listener
* - javascript function (arguments are variable, see
- * jalview.javascript.MouseOverStructureListener for full details)
+ * jalview.javascript.MouseOverStructureListener for full details);
* @param modelSet
* - separator separated list of PDB file URIs that this viewer is
* handling. These files must be in the same order they appear in
- * Jmol (e.g. first one is frame 1, second is frame 2, etc).
+ * Jmol (e.g. first one is frame 1, second is frame 2, etc);.
* @see jalview.javascript.MouseOverStructureListener
*/
public abstract void setStructureListener(String listener,
/**
* remove any callback using the given listener function and associated with
- * the given alignFrame (or null for all callbacks)
+ * the given AlignFrameI (or null for all callbacks);
*
* @param af
- * (may be null)
+ * (may be null);
* @param listener
- * (may be null)
+ * (may be null);
*/
- public abstract void removeJavascriptListener(AlignFrame af,
+ public abstract void removeJavascriptListener(AlignFrameI af,
String listener);
/**
String pdbfile);
/**
- * bind a pdb file to a sequence in the given alignFrame.
+ * bind a pdb file to a sequence in the given AlignFrameI.
*
* @param alFrame
- * - null or specific alignFrame. This specifies the dataset that
+ * - null or specific AlignFrameI. This specifies the dataset that
* will be searched for a seuqence called sequenceId
* @param sequenceId
* - sequenceId within the dataset.
* structure for indicating when PDB parsing or sequenceId location
* fails.
*/
- public abstract boolean addPdbFile(AlignFrame alFrame, String sequenceId,
+ public abstract boolean addPdbFile(AlignFrameI alFrame, String sequenceId,
String pdbEntryString, String pdbFile);
/**
* @param topRow
* @param leftHandColumn
*/
- public abstract void scrollViewToIn(AlignFrame alf, String topRow,
+ public abstract void scrollViewToIn(AlignFrameI alf, String topRow,
String leftHandColumn);
/**
* @param alf
* @param topRow
*/
- public abstract void scrollViewToRowIn(AlignFrame alf, String topRow);
+ public abstract void scrollViewToRowIn(AlignFrameI alf, String topRow);
/**
* adjust horizontal scroll to make the given column the left one in the given
* @param alf
* @param leftHandColumn
*/
- public abstract void scrollViewToColumnIn(AlignFrame alf,
+ public abstract void scrollViewToColumnIn(AlignFrameI alf,
String leftHandColumn);
/**
*
* @return
- * @see jalview.appletgui.AlignFrame#getFeatureGroups()
+ * @see jalview.appletgui.AlignFrameI#getFeatureGroups();
*/
public abstract String getFeatureGroups();
/**
* @param alf
- * alignframe to get feature groups on
+ * AlignFrameI to get feature groups on
* @return
- * @see jalview.appletgui.AlignFrame#getFeatureGroups()
+ * @see jalview.appletgui.AlignFrameI#getFeatureGroups();
*/
- public abstract String getFeatureGroupsOn(AlignFrame alf);
+ public abstract String getFeatureGroupsOn(AlignFrameI alf);
/**
* @param visible
* @return
- * @see jalview.appletgui.AlignFrame#getFeatureGroupsOfState(boolean)
+ * @see jalview.appletgui.AlignFrameI#getFeatureGroupsOfState(boolean);
*/
public abstract String getFeatureGroupsOfState(boolean visible);
* align frame to get groups of state visible
* @param visible
* @return
- * @see jalview.appletgui.AlignFrame#getFeatureGroupsOfState(boolean)
+ * @see jalview.appletgui.AlignFrameI#getFeatureGroupsOfState(boolean);
*/
- public abstract String getFeatureGroupsOfStateOn(AlignFrame alf,
+ public abstract String getFeatureGroupsOfStateOn(AlignFrameI alf,
boolean visible);
/**
* tab separated list of group names
* @param state
* true or false
- * @see jalview.appletgui.AlignFrame#setFeatureGroupState(java.lang.String[],
- * boolean)
+ * @see jalview.appletgui.AlignFrameI#setFeatureGroupState(java.lang.String[],
+ * boolean);
*/
- public abstract void setFeatureGroupStateOn(AlignFrame alf, String groups,
+ public abstract void setFeatureGroupStateOn(AlignFrameI alf,
+ String groups,
boolean state);
public abstract void setFeatureGroupState(String groups, boolean state);
*/
public abstract String getJsMessage(String messageclass, String viewId);
+ /// in http://www.jalview.org/examples/jalviewLiteJs.html but missing here
+
+ // get selected sequences as alignment as format with or without start-end
+ // suffix
+ public String getSelectedSequencesAsAlignment(String format,
+ boolean suffix);
+
+ // get selected sequences as alignment from given view as format with or
+ // without start-end suffix
+ public String getSelectedSequencesAsAlignmentFrom(AlignFrameI alf,
+ String format, boolean suffix);
+
+ public String arrayToSeparatorList(String[] array);
+
+ // get a string array from a list
+ public String[] separatorListToArray(String list);
+
+ // debug flag - controls output to standard out
+ public static boolean debug = false;
+
}
*/
package jalview.javascript;
+import jalview.api.JalviewApp;
import jalview.appletgui.AlignFrame;
-import jalview.bin.JalviewLite;
import jalview.datamodel.ColumnSelection;
import jalview.datamodel.HiddenColumns;
import jalview.datamodel.SequenceGroup;
String _listener;
- public JsSelectionSender(JalviewLite jvlite, AlignFrame af,
- String listener)
+ public JsSelectionSender(JalviewApp jvlite, AlignFrame af,
+ String listener, boolean debug)
{
- super(jvlite);
+ super(jvlite, debug);
_af = af;
_listener = listener;
}
public void selection(SequenceGroup seqsel, ColumnSelection colsel,
HiddenColumns hidden, SelectionSource source)
{
- // System.err.println("Testing selection event relay to
- // jsfunction:"+_listener);
+ Object[] info = jvlite.getSelectionForListener(seqsel, colsel, hidden, source, _af);
try
{
- String setid = "";
- AlignFrame src = _af;
- if (source != null)
- {
- if (source instanceof jalview.appletgui.AlignViewport
- && ((jalview.appletgui.AlignViewport) source).applet.currentAlignFrame.viewport == source)
- {
- // should be valid if it just generated an event!
- src = ((jalview.appletgui.AlignViewport) source).applet.currentAlignFrame;
- }
- }
- String[] seqs = new String[] {};
- String[] cols = new String[] {};
- int strt = 0, end = (src == null) ? -1
- : src.alignPanel.av.getAlignment().getWidth();
- if (seqsel != null && seqsel.getSize() > 0)
- {
- seqs = new String[seqsel.getSize()];
- for (int i = 0; i < seqs.length; i++)
- {
- seqs[i] = seqsel.getSequenceAt(i).getName();
- }
- if (strt < seqsel.getStartRes())
- {
- strt = seqsel.getStartRes();
- }
- if (end == -1 || end > seqsel.getEndRes())
- {
- end = seqsel.getEndRes();
- }
- }
- if (colsel != null && !colsel.isEmpty())
- {
- if (end == -1)
- {
- end = colsel.getMax() + 1;
- }
- cols = new String[colsel.getSelected().size()];
- for (int i = 0; i < cols.length; i++)
- {
- cols[i] = "" + (1 + colsel.getSelected().get(i).intValue());
- }
- }
- else
- {
- if (seqsel != null && seqsel.getSize() > 0)
- {
- // send a valid range, otherwise we send the empty selection
- cols = new String[2];
- cols[0] = "" + (1 + strt) + "-" + (1 + end);
- }
- ;
-
- }
System.err.println("Relaying selection to jsfunction:" + _listener);
- executeJavascriptFunction(_listener,
- new Object[]
- { src, setid, jvlite.arrayToSeparatorList(seqs),
- jvlite.arrayToSeparatorList(cols) });
+ executeJavascriptFunction(_listener, info);
+
} catch (Exception ex)
{
System.err.println(
}
}
+
}
@Override
*/
package jalview.javascript;
+import jalview.api.JalviewApp;
import jalview.appletgui.AlignFrame;
-import jalview.bin.JalviewLite;
import jalview.datamodel.SequenceI;
import jalview.structure.VamsasListener;
import jalview.structure.VamsasSource;
// + seq + " at " + index);
last = seq;
i = index;
- AlignFrame src = null;
+ Object alignFrame = jvlite.getFrameForSource(source);
try
{
- if (source != null)
- {
- if (source instanceof jalview.appletgui.AlignViewport
- && ((jalview.appletgui.AlignViewport) source).applet.currentAlignFrame.viewport == source)
- {
- // should be valid if it just generated an event!
- src = ((jalview.appletgui.AlignViewport) source).applet.currentAlignFrame;
-
- }
- // TODO: ensure that if '_af' is specified along with a handler
- // function, then only events from that alignFrame are sent to that
- // function
- }
executeJavascriptFunction(_listener,
new Object[]
- { src, seq.getDisplayId(false), "" + (1 + i),
+ { alignFrame, seq.getDisplayId(false), "" + (1 + i),
"" + seq.findPosition(i) });
} catch (Exception ex)
{
}
}
- public MouseOverListener(JalviewLite applet, AlignFrame af,
- String listener)
+ public MouseOverListener(JalviewApp applet, AlignFrame af,
+ String listener, boolean debug)
{
- super(applet);
+ super(applet, debug);
_af = af;
_listener = listener;
}
*/
package jalview.javascript;
+import jalview.api.AlignViewportI;
import jalview.api.AlignmentViewPanel;
-import jalview.api.FeatureRenderer;
+import jalview.api.JalviewApp;
import jalview.api.SequenceRenderer;
import jalview.appletgui.AlignFrame;
-import jalview.bin.JalviewLite;
import jalview.datamodel.SequenceI;
import jalview.ext.jmol.JmolCommands;
import jalview.structure.AtomSpec;
String _listenerfn;
- String[] modelSet;
+ public String[] modelSet;
- public MouseOverStructureListener(JalviewLite jalviewLite,
- String listener, String[] modelList)
+ public MouseOverStructureListener(JalviewApp app, String listener,
+ String[] modelList, boolean debug)
{
- super(jalviewLite);
+ super(app, debug);
_listenerfn = listener;
modelSet = modelList;
if (modelSet != null)
}
@Override
- public synchronized void updateColours(Object srce)
+ public synchronized void updateColours(Object source)
{
- final Object source = srce;
StructureSelectionManager ssm = StructureSelectionManager
- .getStructureSelectionManager(jvlite);
+ .getStructureSelectionManager(
+ jvlite.getStructureSelectionManagerProvider());
- if (JalviewLite.debug)
+ if (debug)
{
System.err.println(
this.getClass().getName() + " modelSet[0]: " + modelSet[0]);
ssm.reportMapping();
}
- if (source instanceof jalview.api.AlignmentViewPanel)
+ if (source instanceof AlignmentViewPanel)
{
+ AlignmentViewPanel panel = (AlignmentViewPanel) source;
SequenceI[][] sequence = new SequenceI[modelSet.length][];
for (int m = 0; m < modelSet.length; m++)
{
// }
}
- SequenceRenderer sr = ((jalview.appletgui.AlignmentPanel) source)
- .getSequenceRenderer();
- FeatureRenderer fr = ((jalview.appletgui.AlignmentPanel) source).av
- .isShowSequenceFeatures()
- ? new jalview.appletgui.FeatureRenderer(
- ((jalview.appletgui.AlignmentPanel) source).av)
- : null;
+ SequenceRenderer sr = panel.getSequenceRenderer();
+ AlignViewportI vp = panel.getAlignViewport();
+ jalview.renderer.seqfeatures.FeatureRenderer fr = vp
+ .isShowSequenceFeatures() ? jvlite.getNewFeatureRenderer(vp)
+ : null;
if (fr != null)
{
- ((jalview.appletgui.FeatureRenderer) fr).transferSettings(
- ((jalview.appletgui.AlignmentPanel) source)
- .getFeatureRenderer());
+ fr.transferSettings(panel.getFeatureRenderer());
}
- ;
// Form a colour command from the given alignment panel for each distinct
// structure
- ArrayList<String[]> ccomands = new ArrayList<String[]>();
- ArrayList<String> pdbfn = new ArrayList<String>();
+ ArrayList<String[]> ccomands = new ArrayList<>();
+ ArrayList<String> pdbfn = new ArrayList<>();
StructureMappingcommandSet[] colcommands = JmolCommands
.getColourBySequenceCommand(ssm, modelSet, sequence, sr,
(AlignmentViewPanel) source);
pdbfn.add(ccset.mapping);
}
- String mclass, mhandle;
String ccomandset[] = new String[sz];
sz = 0;
for (String[] ccset : ccomands)
System.arraycopy(ccset, 0, ccomandset, sz, ccset.length);
sz += ccset.length;
}
- if (jvlite.isJsMessageSetChanged(mclass = "colourstruct",
- mhandle = ((jalview.appletgui.AlignmentPanel) source).av
- .getViewId(),
- ccomandset))
+ String mclass = "colourstruct";
+ String mhandle = vp.getViewId();
+ if (isJsMessageSetChanged(mclass, mhandle, ccomandset, jvlite))
{
- jvlite.setJsMessageSet(mclass, mhandle, ccomandset);
+ setJsMessageSet(mclass, mhandle, ccomandset, jvlite);
// and notify javascript handler
- String st[] = new String[] { "colourstruct",
- "" + ((jalview.appletgui.AlignmentPanel) source).av.getViewId(),
+ String st[] = new String[] { mclass, mhandle,
"" + ccomandset.length, jvlite.arrayToSeparatorList(
pdbfn.toArray(new String[pdbfn.size()])) };
- try
- {
- executeJavascriptFunction(true, _listenerfn, st);
- } catch (Exception ex)
- {
- System.err.println("Couldn't execute callback with " + _listenerfn
- + " using args { " + st[0] + ", " + st[1] + ", " + st[2]
- + "," + st[3] + "}"); // + ","+st[4]+"\n");
- ex.printStackTrace();
-
- }
+ executeJavascriptFunction(true, st);
}
/*
* new Thread(new Runnable() { public void run() { // and send to
*/
}
+ jvlite.updateColoursFromMouseOver(source, this);
}
@Override
return true;
}
+ public void executeJavascriptFunction(boolean b, String[] st)
+ {
+ try
+ {
+ executeJavascriptFunction(true, _listenerfn, st);
+ } catch (Exception ex)
+ {
+ System.err.println("Couldn't execute callback with " + _listenerfn
+ + " using args { " + st[0] + ", " + st[1] + ", " + st[2] + ","
+ + st[3] + "}"); // + ","+st[4]+"\n");
+ ex.printStackTrace();
+
+ }
+ }
+
}
* methods for extracting data. [get(), contains(), probably should add keySet,
* valueSet, and entrySet].
*
- * @author hansonr Bob Hanson St. Olaf College 1/24/2019
+ * @author hansonr Bob Hanson St. Olaf College 1/24/2019+
*
*/
public class JSON {
import jalview.analysis.GeneticCodes;
import jalview.api.SplitContainerI;
import jalview.bin.Cache;
+import jalview.bin.Jalview;
import jalview.gui.JvSwingUtils;
import jalview.gui.Preferences;
import jalview.io.FileFormats;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
+import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusAdapter;
{
// for Web-page embedding using id=align-frame-div
- setName("jalview-alignment");
+ setName(Jalview.getAppID("alignment"));
jbInit();
setJMenuBar(alignFrameMenuBar);
// FIXME getDefaultToolkit throws an exception in Headless mode
KeyStroke keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_S,
- jalview.util.ShortcutKeyMaskExWrapper.getMenuShortcutKeyMaskEx()
- | jalview.util.ShortcutKeyMaskExWrapper.SHIFT_DOWN_MASK,
+ Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()
+ | KeyEvent.SHIFT_MASK,
false);
addMenuActionAndAccelerator(keyStroke, saveAs, al);
closeMenuItem.setText(MessageManager.getString("action.close"));
keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_W,
- jalview.util.ShortcutKeyMaskExWrapper.getMenuShortcutKeyMaskEx(), false);
+ Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(), false);
al = new ActionListener()
{
@Override
JMenuItem selectAllSequenceMenuItem = new JMenuItem(
MessageManager.getString("action.select_all"));
keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_A,
- jalview.util.ShortcutKeyMaskExWrapper.getMenuShortcutKeyMaskEx(), false);
+ Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(), false);
al = new ActionListener()
{
@Override
JMenuItem invertSequenceMenuItem = new JMenuItem(
MessageManager.getString("action.invert_sequence_selection"));
keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_I,
- jalview.util.ShortcutKeyMaskExWrapper.getMenuShortcutKeyMaskEx(), false);
+ Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(), false);
al = new ActionListener()
{
@Override
JMenuItem remove2LeftMenuItem = new JMenuItem(
MessageManager.getString("action.remove_left"));
keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_L,
- jalview.util.ShortcutKeyMaskExWrapper.getMenuShortcutKeyMaskEx(), false);
+ Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(), false);
al = new ActionListener()
{
@Override
JMenuItem remove2RightMenuItem = new JMenuItem(
MessageManager.getString("action.remove_right"));
keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_R,
- jalview.util.ShortcutKeyMaskExWrapper.getMenuShortcutKeyMaskEx(), false);
+ Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(), false);
al = new ActionListener()
{
@Override
JMenuItem removeGappedColumnMenuItem = new JMenuItem(
MessageManager.getString("action.remove_empty_columns"));
keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_E,
- jalview.util.ShortcutKeyMaskExWrapper.getMenuShortcutKeyMaskEx(), false);
+ Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(), false);
al = new ActionListener()
{
@Override
JMenuItem removeAllGapsMenuItem = new JMenuItem(
MessageManager.getString("action.remove_all_gaps"));
keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_E,
- jalview.util.ShortcutKeyMaskExWrapper.getMenuShortcutKeyMaskEx()
- | jalview.util.ShortcutKeyMaskExWrapper.SHIFT_DOWN_MASK,
+ Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()
+ | KeyEvent.SHIFT_MASK,
false);
al = new ActionListener()
{
JMenuItem removeRedundancyMenuItem = new JMenuItem(
MessageManager.getString("action.remove_redundancy"));
keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_D,
- jalview.util.ShortcutKeyMaskExWrapper.getMenuShortcutKeyMaskEx(), false);
+ Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(), false);
al = new ActionListener()
{
@Override
this.getContentPane().setLayout(new BorderLayout());
alignFrameMenuBar.setFont(new java.awt.Font("Verdana", 0, 11));
- statusBar.setBackground(Color.white);
+ // statusBar.setBackground(Color.white); BH 2019.08.01 -- this does nothing,
+ // as the label is not opaque
+ statusBar.setOpaque(true);// BH 2019.07.01 -- setting a label opaque avoids
+ // frame repaint in SwingJS and has no effect in
+ // Java
statusBar.setFont(new java.awt.Font("Verdana", 0, 11));
statusBar.setBorder(BorderFactory.createLineBorder(Color.black));
statusBar.setText(MessageManager.getString("label.status_bar"));
annotationPanelMenuItem
.setText(MessageManager.getString("label.show_annotations"));
annotationPanelMenuItem
- .setState(Cache.getDefault("SHOW_ANNOTATIONS", true));
+ .setState(Cache.getDefault(Preferences.SHOW_ANNOTATIONS, true));
annotationPanelMenuItem.addActionListener(new ActionListener()
{
@Override
undoMenuItem.setEnabled(false);
undoMenuItem.setText(MessageManager.getString("action.undo"));
keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_Z,
- jalview.util.ShortcutKeyMaskExWrapper.getMenuShortcutKeyMaskEx(), false);
+ Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(), false);
al = new ActionListener()
{
@Override
redoMenuItem.setEnabled(false);
redoMenuItem.setText(MessageManager.getString("action.redo"));
keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_Y,
- jalview.util.ShortcutKeyMaskExWrapper.getMenuShortcutKeyMaskEx(), false);
+ Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(), false);
al = new ActionListener()
{
@Override
JMenuItem printMenuItem = new JMenuItem(
MessageManager.getString("action.print"));
keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_P,
- jalview.util.ShortcutKeyMaskExWrapper.getMenuShortcutKeyMaskEx(), false);
+ Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(), false);
al = new ActionListener()
{
@Override
JMenuItem findMenuItem = new JMenuItem(
MessageManager.getString("action.find"));
keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_F,
- jalview.util.ShortcutKeyMaskExWrapper.getMenuShortcutKeyMaskEx(), false);
+ Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(), false);
findMenuItem.setToolTipText(JvSwingUtils.wrapTooltip(true,
MessageManager.getString("label.find_tip")));
al = new ActionListener()
JMenuItem deleteGroups = new JMenuItem(
MessageManager.getString("action.undefine_groups"));
keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_U,
- jalview.util.ShortcutKeyMaskExWrapper.getMenuShortcutKeyMaskEx(), false);
+ Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(), false);
al = new ActionListener()
{
@Override
JMenuItem createGroup = new JMenuItem(
MessageManager.getString("action.create_group"));
keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_G,
- jalview.util.ShortcutKeyMaskExWrapper.getMenuShortcutKeyMaskEx(), false);
+ Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(), false);
al = new ActionListener()
{
@Override
JMenuItem unGroup = new JMenuItem(
MessageManager.getString("action.remove_group"));
keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_G,
- jalview.util.ShortcutKeyMaskExWrapper.getMenuShortcutKeyMaskEx()
- | jalview.util.ShortcutKeyMaskExWrapper.SHIFT_DOWN_MASK,
+ Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()
+ | KeyEvent.SHIFT_MASK,
false);
al = new ActionListener()
{
copy.setText(MessageManager.getString("action.copy"));
keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_C,
- jalview.util.ShortcutKeyMaskExWrapper.getMenuShortcutKeyMaskEx(), false);
+ Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(), false);
al = new ActionListener()
{
cut.setText(MessageManager.getString("action.cut"));
keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_X,
- jalview.util.ShortcutKeyMaskExWrapper.getMenuShortcutKeyMaskEx(), false);
+ Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(), false);
al = new ActionListener()
{
@Override
JMenuItem pasteNew = new JMenuItem(
MessageManager.getString("label.to_new_alignment"));
keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_V,
- jalview.util.ShortcutKeyMaskExWrapper.getMenuShortcutKeyMaskEx()
- | jalview.util.ShortcutKeyMaskExWrapper.SHIFT_DOWN_MASK,
+ Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()
+ | KeyEvent.SHIFT_MASK,
false);
al = new ActionListener()
{
JMenuItem pasteThis = new JMenuItem(
MessageManager.getString("label.to_this_alignment"));
keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_V,
- jalview.util.ShortcutKeyMaskExWrapper.getMenuShortcutKeyMaskEx(), false);
+ Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(), false);
al = new ActionListener()
{
@Override
});
seqLimits.setText(
MessageManager.getString("label.show_sequence_limits"));
- seqLimits.setState(jalview.bin.Cache.getDefault("SHOW_JVSUFFIX", true));
+ seqLimits.setState(jalview.bin.Cache.getDefault(Preferences.SHOW_JVSUFFIX, true));
seqLimits.addActionListener(new ActionListener()
{
@Override
padGapsMenuitem.setText(MessageManager.getString("label.pad_gaps"));
padGapsMenuitem
- .setState(jalview.bin.Cache.getDefault("PAD_GAPS", false));
+ .setState(jalview.bin.Cache.getDefault(Preferences.PAD_GAPS, false));
padGapsMenuitem.addActionListener(new ActionListener()
{
@Override
showTranslation
.setText(MessageManager.getString("label.translate_cDNA"));
boolean first = true;
- for (final GeneticCodeI table : GeneticCodes.getInstance()
- .getCodeTables())
+ for (final GeneticCodeI table : GeneticCodes.getCodeTables())
{
JMenuItem item = new JMenuItem(table.getId() + " " + table.getName());
showTranslation.add(item);
autoCalculate.setText(
MessageManager.getString("label.autocalculate_consensus"));
autoCalculate.setState(
- jalview.bin.Cache.getDefault("AUTO_CALC_CONSENSUS", true));
+ jalview.bin.Cache.getDefault(Preferences.AUTO_CALC_CONSENSUS, true));
autoCalculate.addActionListener(new ActionListener()
{
@Override
sortByTree.setToolTipText("<html>" + MessageManager.getString(
"label.enable_automatically_sort_alignment_when_open_new_tree"));
sortByTree
- .setState(jalview.bin.Cache.getDefault("SORT_BY_TREE", false));
+ .setState(jalview.bin.Cache.getDefault(Preferences.SORT_BY_TREE,
+ false));
sortByTree.addActionListener(new ActionListener()
{
@Override
JMenuItem invertColSel = new JMenuItem(
MessageManager.getString("action.invert_column_selection"));
keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_I,
- jalview.util.ShortcutKeyMaskExWrapper.getMenuShortcutKeyMaskEx()
- | jalview.util.ShortcutKeyMaskExWrapper.ALT_DOWN_MASK,
+ Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()
+ | KeyEvent.ALT_MASK,
false);
al = new ActionListener()
{
JMenuItem save = new JMenuItem(MessageManager.getString("action.save"));
keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_S,
- jalview.util.ShortcutKeyMaskExWrapper.getMenuShortcutKeyMaskEx(), false);
+ Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(), false);
al = new ActionListener()
{
@Override
JMenuItem newView = new JMenuItem(
MessageManager.getString("action.new_view"));
keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_T,
- jalview.util.ShortcutKeyMaskExWrapper.getMenuShortcutKeyMaskEx(), false);
+ Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(), false);
al = new ActionListener()
{
@Override
hscrollFillerPanel.setPreferredSize(new Dimension(70, 10));
hscrollHolder.setBackground(Color.white);
annotationScroller.setBorder(null);
+ annotationScroller.setBackground(Color.BLUE);
annotationScroller.setPreferredSize(new Dimension(10, 80));
this.setPreferredSize(new Dimension(220, 166));
import jalview.gui.JvSwingUtils;
import jalview.util.MessageManager;
-import jalview.util.ShortcutKeyMaskExWrapper;
import java.awt.BorderLayout;
import java.awt.Font;
+import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
});
close.setAccelerator(javax.swing.KeyStroke.getKeyStroke(
java.awt.event.KeyEvent.VK_W,
- ShortcutKeyMaskExWrapper.getMenuShortcutKeyMaskEx(), false));
+ Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(), false));
selectAll.setText(MessageManager.getString("action.select_all"));
selectAll.setAccelerator(javax.swing.KeyStroke.getKeyStroke(
java.awt.event.KeyEvent.VK_A,
- ShortcutKeyMaskExWrapper.getMenuShortcutKeyMaskEx(), false));
+ Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(), false));
selectAll.addActionListener(new ActionListener()
{
@Override
save.setText(MessageManager.getString("action.save"));
save.setAccelerator(javax.swing.KeyStroke.getKeyStroke(
java.awt.event.KeyEvent.VK_S,
- ShortcutKeyMaskExWrapper.getMenuShortcutKeyMaskEx(), false));
+ Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(), false));
save.addActionListener(new ActionListener()
{
@Override
});
copyItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(
java.awt.event.KeyEvent.VK_C,
- ShortcutKeyMaskExWrapper.getMenuShortcutKeyMaskEx(), false));
+ Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(), false));
editMenubar.add(jMenu1);
editMenubar.add(editMenu);
selectAll.setText(MessageManager.getString("action.select_all"));
selectAll.setAccelerator(javax.swing.KeyStroke.getKeyStroke(
java.awt.event.KeyEvent.VK_A,
- jalview.util.ShortcutKeyMaskExWrapper.getMenuShortcutKeyMaskEx(), false));
+ Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(), false));
selectAll.addActionListener(new ActionListener()
{
@Override
save.setText(MessageManager.getString("action.save"));
save.setAccelerator(javax.swing.KeyStroke.getKeyStroke(
java.awt.event.KeyEvent.VK_S,
- jalview.util.ShortcutKeyMaskExWrapper.getMenuShortcutKeyMaskEx(), false));
+ Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(), false));
save.addActionListener(new ActionListener()
{
@Override
});
copyItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(
java.awt.event.KeyEvent.VK_C,
- jalview.util.ShortcutKeyMaskExWrapper.getMenuShortcutKeyMaskEx(), false));
+ Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(), false));
pasteMenu.setAccelerator(javax.swing.KeyStroke.getKeyStroke(
java.awt.event.KeyEvent.VK_V,
- jalview.util.ShortcutKeyMaskExWrapper.getMenuShortcutKeyMaskEx(), false));
+ Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(), false));
editMenubar.add(jMenu1);
editMenubar.add(editMenu);
textarea.setFont(new java.awt.Font("Monospaced", Font.PLAIN, 12));
package jalview.jbgui;
import jalview.api.AlignmentViewPanel;
+import jalview.bin.Jalview;
import jalview.io.FileFormatException;
import jalview.util.MessageManager;
import jalview.util.Platform;
import java.awt.FlowLayout;
+import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JMenuItem;
/**
- * DOCUMENT ME!
+ * abstract class super to jalview.gui.Desktop
*
- * @author $author$
- * @version $Revision$
*/
@SuppressWarnings("serial")
-public class GDesktop extends JFrame
+public abstract class GDesktop extends JFrame
{
- protected static JMenu windowMenu = new JMenu();
+ public JMenu windowMenu = new JMenu(); // BH 2019.05.07 was static
JMenuBar desktopMenubar = new JMenuBar();
protected JCheckBoxMenuItem showConsole = new JCheckBoxMenuItem();
- protected JCheckBoxMenuItem showNews = new JCheckBoxMenuItem();
+ public JCheckBoxMenuItem showNews = new JCheckBoxMenuItem();
protected JMenuItem snapShotWindow = new JMenuItem();
*/
public GDesktop()
{
- super();
try
{
jbInit();
*/
private void jbInit() throws Exception
{
- setName("jalview-desktop");
+ setName(Jalview.getAppID("desktop"));
FileMenu.setText(MessageManager.getString("action.file"));
HelpMenu.setText(MessageManager.getString("action.help"));
VamsasMenu.setText("Vamsas");
.setText(MessageManager.getString("label.load_tree_from_file"));
inputLocalFileMenuItem.setAccelerator(
javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_O,
- jalview.util.ShortcutKeyMaskExWrapper.getMenuShortcutKeyMaskEx(),
+ Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(),
false));
inputLocalFileMenuItem
.addActionListener(new java.awt.event.ActionListener()
}
});
- Float specversion = Float.parseFloat(System.getProperty("java.specification.version"));
-
desktopMenubar.add(FileMenu);
desktopMenubar.add(toolsMenu);
VamsasMenu.setVisible(false);
FileMenu.add(inputMenu);
FileMenu.add(inputSequence);
FileMenu.addSeparator();
- //FileMenu.add(saveState);
+ FileMenu.add(saveState);
FileMenu.add(saveAsState);
FileMenu.add(loadState);
FileMenu.addSeparator();
VamsasMenu.add(vamsasImport);
VamsasMenu.add(vamsasSave);
VamsasMenu.add(vamsasStop);
- if (!Platform.isMac() || specversion < 11)
- {
- toolsMenu.add(preferences);
- }
+ toolsMenu.add(preferences);
if (!Platform.isJS())
{
toolsMenu.add(showMemusage);
toolsMenu.add(showConsole);
+ }
+ if (!Platform.isJS())
+ {
toolsMenu.add(showNews);
toolsMenu.add(garbageCollect);
toolsMenu.add(groovyShell);
*/
protected void quit()
{
- //System.out.println("********** GDesktop.quit()");
}
/**
*/
package jalview.jbgui;
+import jalview.bin.Jalview;
import jalview.util.ImageMaker.TYPE;
import jalview.util.MessageManager;
private void jbInit() throws Exception
{
- setName("jalview-pca");
- this.getContentPane().setLayout(new BorderLayout());
+ setName(Jalview.getAppID("pca"));
+ getContentPane().setLayout(new BorderLayout());
JPanel jPanel2 = new JPanel();
jPanel2.setLayout(new FlowLayout());
JLabel jLabel1 = new JLabel();
import jalview.gui.StructureViewer.ViewerType;
import jalview.io.BackupFilenameParts;
import jalview.io.BackupFiles;
-import jalview.io.BackupFilesPresetEntry;
-import jalview.io.IntKeyStringValueEntry;
import jalview.util.MessageManager;
import jalview.util.Platform;
import java.awt.event.KeyListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
-import java.util.Arrays;
-import java.util.List;
+import java.util.HashMap;
+import java.util.Map;
import javax.swing.AbstractCellEditor;
import javax.swing.BorderFactory;
import javax.swing.JComboBox;
import javax.swing.JFileChooser;
import javax.swing.JLabel;
+import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
* @author $author$
* @version $Revision$
*/
+@SuppressWarnings("serial")
public class GPreferences extends JPanel
{
private static final Font LABEL_FONT = JvSwingUtils.getLabelFont();
protected JComboBox<String> structViewer = new JComboBox<>();
+ protected JTextField structureDimensions = new JTextField();
+
protected JTextField chimeraPath = new JTextField();
protected ButtonGroup mappingMethod = new ButtonGroup();
/*
* Connections tab components
*/
- protected JTable linkUrlTable = new JTable();
+ public JTable linkUrlTable = new JTable();
- protected JButton editLink = new JButton();
+ public JButton editLink = new JButton();
- protected JButton deleteLink = new JButton();
+ public JButton deleteLink = new JButton();
- protected JTextField filterTB = new JTextField();
+ public JTextField filterTB = new JTextField();
protected JButton doReset = new JButton();
protected JPanel presetsPanel = new JPanel();
- protected JLabel presetsComboLabel = new JLabel();
-
- protected JCheckBox customiseCheckbox = new JCheckBox();
-
protected JButton revertButton = new JButton();
- protected JComboBox<Object> backupfilesPresetsCombo = new JComboBox<>();
-
- private int backupfilesPresetsComboLastSelected = 0;
+ protected JComboBox<IntKeyStringValueEntry> backupfilesPresetsCombo = new JComboBox<>();
protected JPanel suffixPanel = new JPanel();
tabbedPane.add(initConnectionsTab(),
MessageManager.getString("label.connections"));
- if (!Platform.isJS())
- {
- tabbedPane.add(initBackupsTab(),
- MessageManager.getString("label.backups"));
- }
+ if (!Platform.isJS())
+ {
+ tabbedPane.add(initBackupsTab(),
+ MessageManager.getString("label.backups"));
+ }
tabbedPane.add(initLinksTab(),
MessageManager.getString("label.urllinks"));
structViewer.addItem(ViewerType.JMOL.name());
structViewer.addItem(ViewerType.CHIMERA.name());
structViewer.addActionListener(new ActionListener()
+
{
@Override
public void actionPerformed(ActionEvent e)
});
structureTab.add(structViewer);
+ // BH 2019.07.12
+ ypos += lineSpacing;
+ JLabel dimLabel = new JLabel();
+ dimLabel.setFont(new java.awt.Font("SansSerif", 0, 11));
+ dimLabel.setHorizontalAlignment(SwingConstants.LEFT);
+ dimLabel.setText(
+ MessageManager.getString("label.structure_dimensions"));
+ dimLabel.setBounds(new Rectangle(10, ypos, 140, height));
+ structureTab.add(dimLabel);
+
+ structureDimensions.setFont(LABEL_FONT);
+ structureDimensions.setBounds(new Rectangle(160, ypos, 120, height));
+ structureTab.add(structureDimensions);
+
ypos += lineSpacing;
JLabel pathLabel = new JLabel();
pathLabel.setFont(new java.awt.Font("SansSerif", 0, 11));
protected void loadLastSavedBackupsOptions()
{
- BackupFilesPresetEntry savedPreset = BackupFilesPresetEntry
- .getSavedBackupEntry();
enableBackupFiles
- .setSelected(Cache.getDefault(BackupFiles.ENABLED,
- !Platform.isJS()));
-
- BackupFilesPresetEntry backupfilesCustomEntry = BackupFilesPresetEntry
- .createBackupFilesPresetEntry(Cache
- .getDefault(BackupFilesPresetEntry.CUSTOMCONFIG, null));
- if (backupfilesCustomEntry == null)
- {
- backupfilesCustomEntry = BackupFilesPresetEntry.backupfilesPresetEntriesValues
- .get(BackupFilesPresetEntry.BACKUPFILESSCHEMEDEFAULT);
- }
- BackupFilesPresetEntry.backupfilesPresetEntriesValues.put(
- BackupFilesPresetEntry.BACKUPFILESSCHEMECUSTOM,
- backupfilesCustomEntry);
-
+ .setSelected(Cache.getDefault(BackupFiles.ENABLED, !Platform.isJS()));
setComboIntStringKey(backupfilesPresetsCombo,
- Cache.getDefault(BackupFiles.NS + "_PRESET",
- BackupFilesPresetEntry.BACKUPFILESSCHEMEDEFAULT));
-
- backupsSetOptions(savedPreset);
+ Cache.getDefault(BackupFiles.NS + "_PRESET", 1));
+ suffixTemplate.setText(Cache.getDefault(BackupFiles.SUFFIX,
+ ".bak" + BackupFiles.NUM_PLACEHOLDER));
+ suffixDigitsSpinner
+ .setValue(Cache.getDefault(BackupFiles.SUFFIX_DIGITS, 3));
+ suffixReverse.setSelected(
+ Cache.getDefault(BackupFiles.REVERSE_ORDER, false));
+ backupfilesKeepAll
+ .setSelected(Cache.getDefault(BackupFiles.NO_MAX, false));
+ backupfilesRollMaxSpinner
+ .setValue(Cache.getDefault(BackupFiles.ROLL_MAX, 3));
+ backupfilesConfirmDelete.setSelected(
+ Cache.getDefault(BackupFiles.CONFIRM_DELETE_OLD, true));
backupsOptionsSetEnabled();
updateBackupFilesExampleLabel();
}
- private boolean warnAboutSuffixReverseChange()
+ protected boolean warnAboutSuffixReverseChange()
{
- BackupFilesPresetEntry bfpe = BackupFilesPresetEntry
- .getSavedBackupEntry();
- boolean savedSuffixReverse = bfpe.reverse;
- int savedSuffixDigits = bfpe.digits;
- String savedSuffixTemplate = bfpe.suffix;
+ boolean savedSuffixReverse = Cache.getDefault(BackupFiles.REVERSE_ORDER,
+ false);
+ int savedSuffixDigits = Cache.getDefault(BackupFiles.SUFFIX_DIGITS, 3);
+ String savedSuffixTemplate = Cache.getDefault(BackupFiles.SUFFIX,
+ ".bak" + BackupFiles.NUM_PLACEHOLDER);
boolean nowSuffixReverse = suffixReverse.isSelected();
int nowSuffixDigits = getSpinnerInt(suffixDigitsSpinner, 3);
gbc.gridy++; // row 1
backupsTab.add(presetsPanel, gbc);
+ // gbc.anchor = GridBagConstraints.NORTHWEST;
// now using whole row
gbc.gridwidth = 2;
gbc.gridheight = 1;
return backupsTab;
}
+ protected static final int BACKUPFILESSCHEMECUSTOMISE = 0;
+
+ private static final IntKeyStringValueEntry[] backupfilesPresetEntries = {
+ new IntKeyStringValueEntry(1,
+ MessageManager.getString("label.default")),
+ new IntKeyStringValueEntry(2,
+ MessageManager.getString("label.single_file")),
+ new IntKeyStringValueEntry(3,
+ MessageManager.getString("label.keep_all_versions")),
+ new IntKeyStringValueEntry(4,
+ MessageManager.getString("label.rolled_backups")),
+ // ...
+ // IMPORTANT, keep "Custom" entry with key 0 (even though it appears last)
+ new IntKeyStringValueEntry(BACKUPFILESSCHEMECUSTOMISE,
+ MessageManager.getString("label.customise")) };
+
+ private static final Map<Integer, BackupFilesPresetEntry> backupfilesPresetEntriesValues = new HashMap<Integer, BackupFilesPresetEntry>()
+ {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 125L;
+
+ {
+ put(1, new BackupFilesPresetEntry(
+ ".bak" + BackupFiles.NUM_PLACEHOLDER, 3, false, false, 3,
+ false));
+ put(2, new BackupFilesPresetEntry("~", 1, false, false, 1, false));
+ put(3, new BackupFilesPresetEntry(".v" + BackupFiles.NUM_PLACEHOLDER,
+ 3, false, true, 10, true));
+ put(4, new BackupFilesPresetEntry(
+ "_bak." + BackupFiles.NUM_PLACEHOLDER, 1, true, false, 9,
+ false));
+ }
+ };
+
private JPanel initBackupsTabPresetsPanel()
{
String title = MessageManager.getString("label.schemes");
+ // TitledBorder tb = new TitledBorder(new EmptyBorder(0, 0, 0, 0), title);
+ // TitledBorder tb = new TitledBorder(title);
+ // tb.setTitleFont(LABEL_FONT);
+ // presetsPanel.setBorder(tb);
presetsPanel.setLayout(new GridBagLayout());
// "Scheme: "
gbc.gridx = 0;
gbc.gridy = 0;
+ presetsPanel.add(new JLabel(title + ":"), gbc);
- presetsComboLabel = new JLabel(title + ":");
- presetsPanel.add(presetsComboLabel, gbc);
-
- List<Object> entries = Arrays
- .asList((Object[]) BackupFilesPresetEntry.backupfilesPresetEntries);
- List<String> tooltips = Arrays.asList(
- BackupFilesPresetEntry.backupfilesPresetEntryDescriptions);
- backupfilesPresetsCombo = JvSwingUtils.buildComboWithTooltips(entries,
- tooltips);
- /*
- for (int i = 0; i < BackupFilesPresetEntry.backupfilesPresetEntries.length; i++)
+ for (int i = 0; i < backupfilesPresetEntries.length; i++)
{
- backupfilesPresetsCombo
- .addItem(BackupFilesPresetEntry.backupfilesPresetEntries[i]);
+ backupfilesPresetsCombo.addItem(backupfilesPresetEntries[i]);
}
- */
+ // put "Previously saved scheme" item in italics (it's not really
+ // selectable, as such -- it deselects itself when selected) and
+ // "Customise" in bold
+ backupfilesPresetsCombo
+ .setRenderer(new BackupFilesPresetsComboBoxRenderer());
backupfilesPresetsCombo.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
- int key = getComboIntStringKey(backupfilesPresetsCombo);
- if (!customiseCheckbox.isSelected())
- {
- backupfilesPresetsComboLastSelected = key;
- }
- if (key == BackupFilesPresetEntry.BACKUPFILESSCHEMECUSTOM)
- {
- if (customiseCheckbox.isSelected())
- {
- // got here by clicking on customiseCheckbox so don't change the values
- backupfilesCustomOptionsSetEnabled();
- }
- else
- {
- backupsTabUpdatePresets();
- backupfilesCustomOptionsSetEnabled();
- }
- }
- else
- {
- customiseCheckbox.setSelected(false);
- backupsTabUpdatePresets();
- backupfilesCustomOptionsSetEnabled();
- }
+ backupsTabUpdatePresets();
}
});
presetsPanel.add(backupfilesPresetsCombo, gbc);
revertButton.setText(MessageManager.getString("label.cancel_changes"));
- revertButton.setToolTipText(
- MessageManager.getString("label.cancel_changes_description"));
revertButton.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
- backupsSetOptions(
- BackupFilesPresetEntry.backupfilesPresetEntriesValues.get(
- BackupFilesPresetEntry.BACKUPFILESSCHEMECUSTOM));
- backupfilesCustomOptionsSetEnabled();
+ loadLastSavedBackupsOptions();
}
});
revertButton.setFont(LABEL_FONT);
- customiseCheckbox.setFont(LABEL_FONT);
- customiseCheckbox.setText(MessageManager.getString("label.customise"));
- customiseCheckbox.addActionListener(new ActionListener()
- {
- @Override
- public void actionPerformed(ActionEvent e)
- {
- int currently = getComboIntStringKey(backupfilesPresetsCombo);
- if (customiseCheckbox.isSelected())
- {
- backupfilesPresetsComboLastSelected = currently;
- setComboIntStringKey(backupfilesPresetsCombo,
- BackupFilesPresetEntry.BACKUPFILESSCHEMECUSTOM);
- }
- else
- {
- setComboIntStringKey(backupfilesPresetsCombo,
- backupfilesPresetsComboLastSelected);
-
- }
- backupfilesCustomOptionsSetEnabled();
- }
- });
- customiseCheckbox.setToolTipText(
- MessageManager.getString("label.customise_description"));
-
- // customise checkbox
- gbc.gridx = 0;
- gbc.gridy++;
- presetsPanel.add(customiseCheckbox, gbc);
-
// "Cancel changes" button (aligned with combo box above)
gbc.gridx = 1;
+ gbc.gridy++;
presetsPanel.add(revertButton, gbc);
return presetsPanel;
private JPanel initBackupsTabFilenameExamplesPanel()
{
String title = MessageManager
- .getString("label.scheme_examples");
+ .getString("label.summary_of_backups_scheme");
TitledBorder tb = new TitledBorder(title);
exampleFilesPanel.setBorder(tb);
exampleFilesPanel.setLayout(new GridBagLayout());
return exampleFilesPanel;
}
- private void backupsTabUpdatePresets()
+ protected void backupsTabUpdatePresets()
{
IntKeyStringValueEntry entry = (IntKeyStringValueEntry) backupfilesPresetsCombo
.getSelectedItem();
- int key = entry.k;
- String value = entry.v;
+ int key = entry.getKey();
+ String value = entry.getValue();
- if (BackupFilesPresetEntry.backupfilesPresetEntriesValues
- .containsKey(key))
+ // BACKUPFILESSCHEMECUSTOMISE (==0) reserved for "Custom"
+ if (key != BACKUPFILESSCHEMECUSTOMISE)
{
- backupsSetOptions(
- BackupFilesPresetEntry.backupfilesPresetEntriesValues
- .get(key));
- }
- else
- {
- Cache.log.error(
- "Preset '" + value + "' [key:" + key + "] not implemented");
+ if (backupfilesPresetEntriesValues.containsKey(key))
+ {
+ backupsSetOptions(backupfilesPresetEntriesValues.get(key));
+ }
+ else
+ {
+ System.out.println("Preset '" + value + "' not implemented");
+ }
}
- // Custom options will now be enabled when the customiseCheckbox is checked
- // (performed above)
- // backupfilesCustomOptionsSetEnabled();
+ backupfilesCustomOptionsSetEnabled();
updateBackupFilesExampleLabel();
}
- protected int getComboIntStringKey(
- JComboBox<Object> backupfilesPresetsCombo2)
+ protected int getComboIntStringKey(JComboBox<IntKeyStringValueEntry> c)
{
- IntKeyStringValueEntry e;
- try
- {
- e = (IntKeyStringValueEntry) backupfilesPresetsCombo2
- .getSelectedItem();
- } catch (Exception ex)
- {
- Cache.log.error(
- "Problem casting Combo entry to IntKeyStringValueEntry.");
- e = null;
- }
- return e != null ? e.k : 0;
+ IntKeyStringValueEntry e = (IntKeyStringValueEntry) c.getSelectedItem();
+ return e != null ? e.getKey() : 0;
}
- protected void setComboIntStringKey(
- JComboBox<Object> backupfilesPresetsCombo2,
+ protected void setComboIntStringKey(JComboBox<IntKeyStringValueEntry> c,
int key)
{
- for (int i = 0; i < backupfilesPresetsCombo2.getItemCount(); i++)
+ for (int i = 0; i < c.getItemCount(); i++)
{
- IntKeyStringValueEntry e;
- try
- {
- e = (IntKeyStringValueEntry) backupfilesPresetsCombo2.getItemAt(i);
- } catch (Exception ex)
- {
- Cache.log.error(
- "Problem casting Combo entry to IntKeyStringValueEntry. Skipping item. ");
- continue;
- }
- if (e.k == key)
+ IntKeyStringValueEntry e = c.getItemAt(i);
+ if (e.getKey() == key)
{
- backupfilesPresetsCombo2.setSelectedIndex(i);
+ c.setSelectedIndex(i);
break;
}
}
- // backupsTabUpdatePresets();
+ backupsTabUpdatePresets();
}
private JPanel initBackupsTabSuffixPanel()
{
updateBackupFilesExampleLabel();
backupfilesCustomOptionsSetEnabled();
- backupfilesRevertButtonSetEnabled(true);
}
});
- suffixTemplate.addKeyListener(new KeyListener()
+ KeyListener kl = new KeyListener()
{
@Override
public void keyReleased(KeyEvent e)
{
updateBackupFilesExampleLabel();
backupfilesCustomOptionsSetEnabled();
- backupfilesRevertButtonSetEnabled(true);
}
@Override
}
}
- });
+ };
+ suffixTemplate.addKeyListener(kl);
// digits spinner
suffixDigitsLabel
.setText(MessageManager.getString("label.index_digits"));
suffixDigitsLabel.setHorizontalAlignment(SwingConstants.LEFT);
suffixDigitsLabel.setFont(LABEL_FONT);
+ int defaultmin = 1;
+ int defaultmax = 6;
ChangeListener c = new ChangeListener()
{
@Override
public void stateChanged(ChangeEvent e)
{
- backupfilesRevertButtonSetEnabled(true);
updateBackupFilesExampleLabel();
}
};
- setIntegerSpinner(suffixDigitsSpinner, BackupFilesPresetEntry.DIGITSMIN,
- BackupFilesPresetEntry.DIGITSMAX, 3, c);
+ setIntegerSpinner(suffixDigitsSpinner, defaultmin, defaultmax, 3, c);
suffixReverse.setLabels(MessageManager.getString("label.reverse_roll"),
MessageManager.getString("label.increment_index"));
}
if (okay)
{
- backupfilesRevertButtonSetEnabled(true);
updateBackupFilesExampleLabel();
}
else
{
- boolean savedSuffixReverse = BackupFilesPresetEntry
- .getSavedBackupEntry().reverse;
+ boolean savedSuffixReverse = Cache
+ .getDefault(BackupFiles.REVERSE_ORDER, false);
suffixReverse.setSelected(savedSuffixReverse);
}
}
return suffixPanel;
}
- private boolean confirmSuffixReverseChange()
+ protected boolean confirmSuffixReverseChange()
{
boolean ret = false;
String warningMessage = MessageManager
.getString("label.warning_confirm_change_reverse");
- int confirm = JvOptionPane.showConfirmDialog(Desktop.desktop,
+ int confirm = JvOptionPane.showConfirmDialog(Desktop.getDesktopPane(),
warningMessage,
MessageManager.getString("label.change_increment_decrement"),
JvOptionPane.YES_NO_OPTION, JvOptionPane.WARNING_MESSAGE);
@Override
public void actionPerformed(ActionEvent e)
{
- backupfilesRevertButtonSetEnabled(true);
updateBackupFilesExampleLabel();
}
});
@Override
public void actionPerformed(ActionEvent e)
{
- backupfilesRevertButtonSetEnabled(true);
keepRollMaxOptionsEnabled();
updateBackupFilesExampleLabel();
}
@Override
public void stateChanged(ChangeEvent e)
{
- backupfilesRevertButtonSetEnabled(true);
updateBackupFilesExampleLabel();
}
};
- setIntegerSpinner(backupfilesRollMaxSpinner,
- BackupFilesPresetEntry.ROLLMAXMIN,
- BackupFilesPresetEntry.ROLLMAXMAX, 4, true, c);
+ setIntegerSpinner(backupfilesRollMaxSpinner, 1, 999, 4, true, c);
backupfilesConfirmDelete.setLabels(
MessageManager.getString("label.always_ask"),
MessageManager.getString("label.auto_delete"));
- backupfilesConfirmDelete.addActionListener(new ActionListener()
- {
- @Override
- public void actionPerformed(ActionEvent e)
- {
- backupfilesRevertButtonSetEnabled(true);
- }
- });
// update the enabled section
keepRollMaxOptionsEnabled();
kgbc.gridwidth = GridBagConstraints.REMAINDER;
kgbc.fill = GridBagConstraints.HORIZONTAL;
kgbc.weightx = 1.0;
+ /*
+ keepfilesPanel.add(backupfilesConfirmDelete.getTrueButton(), kgbc);
+
+ // fourth row (indented)
+ kgbc.gridy = 3;
+ keepfilesPanel.add(backupfilesConfirmDelete.getFalseButton(), kgbc);
+ */
JPanel jp = new JPanel();
jp.setLayout(new FlowLayout());
int uppersurround = 0;
StringBuilder exampleSB = new StringBuilder();
boolean firstLine = true;
- int lineNumber = 0;
if (reverse)
{
if (index == min + lowersurround && index < max - uppersurround - 1)
{
exampleSB.append("\n...");
- lineNumber++;
}
else if (index > min + lowersurround && index < max - uppersurround)
{
else
{
exampleSB.append("\n");
- lineNumber++;
}
exampleSB.append(BackupFilenameParts.getBackupFilename(index,
base, suffix, digits));
if (index == min + lowersurround && index < max - uppersurround - 1)
{
exampleSB.append("\n...");
- lineNumber++;
}
else if (index > min + lowersurround && index < max - uppersurround)
{
else
{
exampleSB.append("\n");
- lineNumber++;
}
exampleSB.append(BackupFilenameParts.getBackupFilename(index,
base, suffix, digits));
}
- // add some extra empty lines to pad out the example files box. ugh, please tell
- // me how to do this better
- int remainingLines = lowersurround + uppersurround + 1 - lineNumber;
- if (remainingLines > 0)
- {
- for (int i = 0; i < remainingLines; i++)
- {
- exampleSB.append("\n ");
- lineNumber++;
- }
- }
-
backupfilesExampleLabel.setText(exampleSB.toString());
}
i = Integer.parseInt((String) s.getValue());
} catch (Exception e)
{
- Cache.log.error(
+ System.out.println(
"Exception casting the initial value of s.getValue()");
}
}
i = (Integer) s.getValue();
} catch (Exception e)
{
- Cache.log.error("Failed casting (Integer) JSpinner s.getValue()");
+ System.out.println("Failed casting (Integer) JSpinner s.getValue()");
}
return i;
}
- private void keepRollMaxOptionsEnabled()
+ protected void keepRollMaxOptionsEnabled()
{
boolean enabled = backupfilesKeepAll.isEnabled()
&& !backupfilesKeepAll.isSelected();
backupfilesConfirmDelete.setEnabled(enabled);
}
- private void backupfilesKeepAllSetEnabled(boolean tryEnabled)
+ protected void backupfilesKeepAllSetEnabled(boolean tryEnabled)
{
boolean enabled = tryEnabled && enableBackupFiles.isSelected()
- && customiseCheckbox.isSelected()
+ && getComboIntStringKey(backupfilesPresetsCombo) == 0
&& suffixTemplate.getText()
.indexOf(BackupFiles.NUM_PLACEHOLDER) > -1;
keepfilesPanel.setEnabled(enabled);
private void backupfilesSuffixTemplateSetEnabled(boolean tryEnabled)
{
boolean enabled = tryEnabled && enableBackupFiles.isSelected()
- && customiseCheckbox.isSelected();
+ && getComboIntStringKey(backupfilesPresetsCombo) == 0;
suffixPanel.setEnabled(enabled);
suffixTemplateLabel.setEnabled(enabled);
suffixTemplate.setEnabled(enabled);
backupfilesSuffixTemplateDigitsSetEnabled();
}
- private void backupfilesRevertButtonSetEnabled(boolean tryEnabled)
- {
- boolean enabled = tryEnabled && enableBackupFiles.isSelected()
- && customiseCheckbox.isSelected() && backupfilesCustomChanged();
- revertButton.setEnabled(enabled);
- }
-
- private boolean backupfilesCustomChanged()
- {
- BackupFilesPresetEntry custom = BackupFilesPresetEntry.backupfilesPresetEntriesValues
- .get(BackupFilesPresetEntry.BACKUPFILESSCHEMECUSTOM);
- BackupFilesPresetEntry current = getBackupfilesCurrentEntry();
- return !custom.equals(current);
- }
-
- protected BackupFilesPresetEntry getBackupfilesCurrentEntry()
- {
- String suffix = suffixTemplate.getText();
- int digits = getSpinnerInt(suffixDigitsSpinner, 3);
- boolean reverse = suffixReverse.isSelected();
- boolean keepAll = backupfilesKeepAll.isSelected();
- int rollMax = getSpinnerInt(backupfilesRollMaxSpinner, 3);
- boolean confirmDelete = backupfilesConfirmDelete.isSelected();
-
- BackupFilesPresetEntry bfpe = new BackupFilesPresetEntry(suffix, digits,
- reverse, keepAll, rollMax, confirmDelete);
-
- return bfpe;
- }
-
protected void backupfilesCustomOptionsSetEnabled()
{
- boolean enabled = customiseCheckbox.isSelected();
+ int scheme = getComboIntStringKey(backupfilesPresetsCombo);
+ boolean enabled = scheme == 0 && enableBackupFiles.isSelected();
- backupfilesRevertButtonSetEnabled(enabled);
backupfilesSuffixTemplateSetEnabled(enabled);
backupfilesKeepAllSetEnabled(enabled);
}
{
boolean enabled = enableBackupFiles.isSelected();
presetsPanel.setEnabled(enabled);
- presetsComboLabel.setEnabled(enabled);
backupfilesPresetsCombo.setEnabled(enabled);
- customiseCheckbox.setEnabled(enabled);
- revertButton.setEnabled(enabled);
}
protected void backupsOptionsSetEnabled()
button.setHorizontalAlignment(SwingConstants.CENTER);
this.button.addActionListener(new ActionListener()
{
+ @SuppressWarnings("synthetic-access")
@Override
public void actionPerformed(ActionEvent e)
{
}
}
+class IntKeyStringValueEntry
+{
+ int k;
+
+ String v;
+
+ public IntKeyStringValueEntry(int k, String v)
+ {
+ this.k = k;
+ this.v = v;
+ }
+
+ @Override
+ public String toString()
+ {
+ return this.getValue();
+ }
+
+ public int getKey()
+ {
+ return k;
+ }
+
+ public String getValue()
+ {
+ return v;
+ }
+}
+
+class BackupFilesPresetEntry
+{
+ String suffix;
+
+ int digits;
+
+ boolean reverse;
+
+ boolean keepAll;
+
+ int rollMax;
+
+ boolean confirmDelete;
+
+ public BackupFilesPresetEntry(String suffix, int digits, boolean reverse,
+ boolean keepAll, int rollMax, boolean confirmDelete)
+ {
+ this.suffix = suffix;
+ this.digits = digits;
+ this.reverse = reverse;
+ this.keepAll = keepAll;
+ this.rollMax = rollMax;
+ this.confirmDelete = confirmDelete;
+ }
+}
+
+class BackupFilesPresetsComboBoxRenderer extends DefaultListCellRenderer
+{
+ /**
+ *
+ */
+ private static final long serialVersionUID = 88L;
+
+ @Override
+ public Component getListCellRendererComponent(JList<?> list, Object value,
+ int index, boolean isSelected, boolean cellHasFocus)
+ {
+ super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
+
+ try {
+ IntKeyStringValueEntry e = (IntKeyStringValueEntry) value;
+ if (e.getKey() == GPreferences.BACKUPFILESSCHEMECUSTOMISE)
+ {
+ // "Customise" item
+ this.setFont(this.getFont().deriveFont(Font.BOLD));
+ }
+ } catch (Exception e) {
+ return this;
+ }
+
+ return this;
+ }
+}
*/
package jalview.jbgui;
+import jalview.bin.Jalview;
+
import javax.swing.JInternalFrame;
@SuppressWarnings("serial")
private void jbInit() throws Exception
{
-
- setName("jalview-rnastructureviewer");
-
+ setName(Jalview.getAppID("rnastructureviewer"));
}
}
return true;
}
- JvOptionPane.showInternalMessageDialog(jalview.gui.Desktop.desktop,
+ JvOptionPane.showInternalMessageDialog(jalview.gui.Desktop.getDesktopPane(),
MessageManager.getString("warn.url_must_contain"),
MessageManager.getString("label.invalid_url"),
JvOptionPane.WARNING_MESSAGE);
public void notifyDuplicate()
{
- JvOptionPane.showInternalMessageDialog(jalview.gui.Desktop.desktop,
+ JvOptionPane.showInternalMessageDialog(jalview.gui.Desktop.getDesktopPane(),
MessageManager.getString("warn.name_cannot_be_duplicate"),
MessageManager.getString("label.invalid_name"),
JvOptionPane.WARNING_MESSAGE);
* @author $author$
* @version $Revision$
*/
+@SuppressWarnings("serial")
public class GSliderPanel extends JPanel
{
private static final Font VERDANA_11 = new java.awt.Font("Verdana", 0, 11);
protected static final int FRAME_HEIGHT = 120;
// this is used for conservation colours, PID colours and redundancy threshold
- protected JSlider slider = new JSlider();
+ public JSlider slider = new JSlider();
- protected JTextField valueField = new JTextField();
+ public JTextField valueField = new JTextField();
protected JLabel label = new JLabel();
*/
package jalview.jbgui;
+import jalview.bin.Jalview;
import jalview.util.Platform;
import java.awt.Component;
*/
public GSplitFrame(GAlignFrame top, GAlignFrame bottom)
{
- setName("jalview-splitframe");
+ setName(Jalview.getAppID("splitframe"));
this.topFrame = top;
this.bottomFrame = bottom;
protected String frameTitle = MessageManager
.getString("label.structure_chooser");
- protected JInternalFrame mainFrame = new JInternalFrame(frameTitle);
+ public JInternalFrame mainFrame = new JInternalFrame(frameTitle);
- protected JComboBox<FilterOption> cmb_filterOption = new JComboBox<>();
+ public JComboBox<FilterOption> cmb_filterOption = new JComboBox<>();
- protected AlignmentPanel ap;
+ public AlignmentPanel ap;
- protected StringBuilder errorWarning = new StringBuilder();
+ public StringBuilder errorWarning = new StringBuilder();
protected JButton btn_add;
protected JCheckBox chk_superpose = new JCheckBox(
MessageManager.getString("label.superpose_structures"));
- protected JTextField txt_search = new JTextField(14);
+ public JTextField txt_search = new JTextField(14);
protected JPanel pnl_switchableViews = new JPanel(new CardLayout());
protected CardLayout layout_switchableViews = (CardLayout) (pnl_switchableViews
.getLayout());
- protected JCheckBox chk_invertFilter = new JCheckBox(
+ public JCheckBox chk_invertFilter = new JCheckBox(
MessageManager.getString("label.invert"));
protected ImageIcon loadingImage = new ImageIcon(
protected ImageIcon warningImage = new ImageIcon(
getClass().getResource("/images/warning.gif"));
- protected JLabel lbl_loading = new JLabel(loadingImage);
+ public JLabel lbl_loading = new JLabel(loadingImage);
protected JLabel lbl_pdbManualFetchStatus = new JLabel(errorImage);
protected JLabel lbl_fromFileStatus = new JLabel(errorImage);
- protected AssociateSeqPanel idInputAssSeqPanel = new AssociateSeqPanel();
+ public AssociateSeqPanel idInputAssSeqPanel = new AssociateSeqPanel();
- protected AssociateSeqPanel fileChooserAssSeqPanel = new AssociateSeqPanel();
+ public AssociateSeqPanel fileChooserAssSeqPanel = new AssociateSeqPanel();
protected JComboBox<StructureViewer> targetView = new JComboBox<>();
- protected JTable tbl_local_pdb = new JTable();
+ public JTable tbl_local_pdb = new JTable();
protected JTabbedPane pnl_filter = new JTabbedPane();
- protected FTSDataColumnPreferences pdbDocFieldPrefs = new FTSDataColumnPreferences(
+ public FTSDataColumnPreferences pdbDocFieldPrefs = new FTSDataColumnPreferences(
PreferenceSource.STRUCTURE_CHOOSER,
PDBFTSRestClient.getInstance());
protected FTSDataColumnI[] previousWantedFields;
- protected static Map<String, Integer> tempUserPrefs = new HashMap<>();
+ public static Map<String, Integer> tempUserPrefs = new HashMap<>();
private JTable tbl_summary = new JTable()
{
}
-protected void closeAction(int preferredHeight)
+ public void closeAction(int preferredHeight)
{
// System.out.println(">>>>>>>>>> closing internal frame!!!");
// System.out.println("width : " + mainFrame.getWidth());
package jalview.jbgui;
import jalview.api.structures.JalviewStructureDisplayI;
+import jalview.bin.Jalview;
import jalview.gui.ColourMenuHelper.ColourChangeListener;
import jalview.util.ImageMaker.TYPE;
import jalview.util.MessageManager;
private void jbInit() throws Exception
{
- setName("jalview-structureviewer");
+ setName(Jalview.getAppID("structureviewer"));
JMenuBar menuBar = new JMenuBar();
this.setJMenuBar(menuBar);
*/
package jalview.jbgui;
+import jalview.bin.Jalview;
import jalview.util.ImageMaker.TYPE;
import jalview.util.MessageManager;
private void jbInit() throws Exception
{
- setName("jalview-tree");
+ setName(Jalview.getAppID("tree"));
this.getContentPane().setLayout(borderLayout1);
this.setBackground(Color.white);
this.setFont(new java.awt.Font("Verdana", 0, 12));
import jalview.analysis.PCA;
import jalview.analysis.scoremodels.ScoreModels;
import jalview.analysis.scoremodels.SimilarityParams;
+import jalview.api.AlignmentViewPanel;
import jalview.api.FeatureColourI;
import jalview.api.ViewStyleI;
import jalview.api.analysis.ScoreModelI;
import jalview.schemes.FeatureColour;
import jalview.schemes.ResidueProperties;
import jalview.schemes.UserColourScheme;
-import jalview.structure.StructureSelectionManager;
import jalview.structures.models.AAStructureBindingModel;
import jalview.util.Format;
import jalview.util.MessageManager;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
-import java.lang.reflect.InvocationTargetException;
import java.math.BigInteger;
import java.net.MalformedURLException;
import java.net.URL;
* core method for storing state for a set of AlignFrames.
*
* @param frames
- * - frames involving all data to be exported (including containing
- * splitframes)
+ * - frames involving all data to be exported (including those
+ * contained in splitframes, though not the split frames themselves)
* @param jout
* - project output stream
*/
private void saveAllFrames(List<AlignFrame> frames, JarOutputStream jout)
{
+
Hashtable<String, AlignFrame> dsses = new Hashtable<>();
/*
for (int i = frames.size() - 1; i > -1; i--)
{
AlignFrame af = frames.get(i);
+ AlignViewport vp = af.getViewport();
// skip ?
if (skipList != null && skipList
- .containsKey(af.getViewport().getSequenceSetId()))
+ .containsKey(vp.getSequenceSetId()))
{
continue;
}
String shortName = makeFilename(af, shortNames);
- int apSize = af.getAlignPanels().size();
-
+ AlignmentI alignment = vp.getAlignment();
+ List<? extends AlignmentViewPanel> panels = af.getAlignPanels();
+ int apSize = panels.size();
for (int ap = 0; ap < apSize; ap++)
- {
- AlignmentPanel apanel = (AlignmentPanel) af.getAlignPanels()
- .get(ap);
+ {
+ AlignmentPanel apanel = (AlignmentPanel) panels.get(ap);
String fileName = apSize == 1 ? shortName : ap + shortName;
if (!fileName.endsWith(".xml"))
{
}
saveState(apanel, fileName, jout, viewIds);
-
- String dssid = getDatasetIdRef(
- af.getViewport().getAlignment().getDataset());
+ }
+ if (apSize > 0)
+ {
+ // BH moved next bit out of inner loop, not that it really matters.
+ // so we are testing to make sure we actually have an alignment,
+ // apparently.
+ String dssid = getDatasetIdRef(alignment.getDataset());
if (!dsses.containsKey(dssid))
{
+ // We have not already covered this data by reference from another
+ // frame.
dsses.put(dssid, af);
}
}
}
}
+ /**
+ * Each AlignFrame has a single data set associated with it. Note that none of
+ * these frames are split frames, because Desktop.getAlignFrames() collects
+ * top and bottom separately here.
+ *
+ * @param dsses
+ * @param fileName
+ * @param jout
+ */
private void writeDatasetFor(Hashtable<String, AlignFrame> dsses,
String fileName, JarOutputStream jout)
{
+ // Note that in saveAllFrames we have associated each specific dataset to
+ // ONE of its associated frames.
+
for (String dssids : dsses.keySet())
{
AlignFrame _af = dsses.get(dssids);
* only view *should* be coped with sensibly.
*/
// This must have been loaded, is it still visible?
- JInternalFrame[] frames = Desktop.desktop.getAllFrames();
+ JInternalFrame[] frames = Desktop.getDesktopPane().getAllFrames();
String matchedFile = null;
for (int f = frames.length - 1; f > -1; f--)
{
{
// FIND ANY ASSOCIATED TREES
// NOT IMPLEMENTED FOR HEADLESS STATE AT PRESENT
- if (Desktop.desktop != null)
+ if (Desktop.getDesktopPane() != null)
{
- JInternalFrame[] frames = Desktop.desktop.getAllFrames();
+ JInternalFrame[] frames = Desktop.getDesktopPane().getAllFrames();
for (int t = 0; t < frames.length; t++)
{
/*
* save PCA viewers
*/
- if (!storeDS && Desktop.desktop != null)
+ if (!storeDS && Desktop.getDesktopPane() != null)
{
- for (JInternalFrame frame : Desktop.desktop.getAllFrames())
+ for (JInternalFrame frame : Desktop.getDesktopPane().getAllFrames())
{
if (frame instanceof PCAPanel)
{
// using save and then load
try
{
- fileName = fileName.replace('\\', '/');
+ fileName = fileName.replace('\\', '/');
System.out.println("Writing jar entry " + fileName);
JarEntry entry = new JarEntry(fileName);
jout.putNextEntry(entry);
final SequenceI jds, List<String> viewIds, AlignmentPanel ap,
boolean storeDataset)
{
- if (Desktop.desktop == null)
+ if (Desktop.getDesktopPane() == null)
{
return;
}
- JInternalFrame[] frames = Desktop.desktop.getAllFrames();
+ JInternalFrame[] frames = Desktop.getDesktopPane().getAllFrames();
for (int f = frames.length - 1; f > -1; f--)
{
if (frames[f] instanceof AppVarna)
if (calcIdParam.getVersion().equals("1.0"))
{
final String[] calcIds = calcIdParam.getServiceURL().toArray(new String[0]);
- Jws2Instance service = Jws2Discoverer.getDiscoverer()
+ Jws2Instance service = Jws2Discoverer.getInstance()
.getPreferredServiceFor(calcIds);
if (service != null)
{
{
try
{
- SwingUtilities.invokeAndWait(new Runnable()
+ // BH 2019 -- can't wait
+ SwingUtilities.invokeLater(new Runnable()
{
@Override
public void run()
return af;
}
- @SuppressWarnings("unused")
- private jarInputStreamProvider createjarInputStreamProvider(final Object ofile) throws MalformedURLException {
+ @SuppressWarnings("unused")
+ private jarInputStreamProvider createjarInputStreamProvider(final Object ofile) throws MalformedURLException {
- // BH 2018 allow for bytes already attached to File object
- try {
- String file = (ofile instanceof File ? ((File) ofile).getCanonicalPath() : ofile.toString());
+ // BH 2018 allow for bytes already attached to File object
+ try {
+ String file = (ofile instanceof File ? ((File) ofile).getCanonicalPath() : ofile.toString());
byte[] bytes = Platform.isJS() ? Platform.getFileBytes((File) ofile)
: null;
- URL url = null;
- errorMessage = null;
- uniqueSetSuffix = null;
- seqRefIds = null;
- viewportsAdded.clear();
- frefedSequence = null;
-
- if (file.startsWith("http://")) {
- url = new URL(file);
- }
- final URL _url = url;
- return new jarInputStreamProvider() {
-
- @Override
- public JarInputStream getJarInputStream() throws IOException {
- if (bytes != null) {
-// System.out.println("Jalview2XML: opening byte jarInputStream for bytes.length=" + bytes.length);
- return new JarInputStream(new ByteArrayInputStream(bytes));
- }
- if (_url != null) {
-// System.out.println("Jalview2XML: opening url jarInputStream for " + _url);
- return new JarInputStream(_url.openStream());
- } else {
-// System.out.println("Jalview2XML: opening file jarInputStream for " + file);
- return new JarInputStream(new FileInputStream(file));
- }
- }
-
- @Override
- public String getFilename() {
- return file;
- }
- };
- } catch (IOException e) {
- e.printStackTrace();
- return null;
- }
- }
+ URL url = null;
+ errorMessage = null;
+ uniqueSetSuffix = null;
+ seqRefIds = null;
+ viewportsAdded.clear();
+ frefedSequence = null;
+
+ if (file.startsWith("http://")) {
+ url = new URL(file);
+ }
+ final URL _url = url;
+ return new jarInputStreamProvider() {
+
+ @Override
+ public JarInputStream getJarInputStream() throws IOException {
+ if (bytes != null) {
+// System.out.println("Jalview2XML: opening byte jarInputStream for bytes.length=" + bytes.length);
+ return new JarInputStream(new ByteArrayInputStream(bytes));
+ }
+ if (_url != null) {
+// System.out.println("Jalview2XML: opening url jarInputStream for " + _url);
+ return new JarInputStream(_url.openStream());
+ } else {
+// System.out.println("Jalview2XML: opening file jarInputStream for " + file);
+ return new JarInputStream(new FileInputStream(file));
+ }
+ }
+
+ @Override
+ public String getFilename() {
+ return file;
+ }
+ };
+ } catch (IOException e) {
+ e.printStackTrace();
+ return null;
+ }
+ }
/**
* Recover jalview session from a jalview project archive. Caller may
IdentityHashMap<AlignmentI, AlignmentI> importedDatasets = new IdentityHashMap<>();
Map<String, AlignFrame> gatherToThisFrame = new HashMap<>();
final String file = jprovider.getFilename();
+
+ List<AlignFrame> alignFrames = new ArrayList<>();
+
try
{
JarInputStream jin = null;
JarEntry jarentry = null;
int entryCount = 1;
+
+ // Look for all the entry names ending with ".xml"
+ // This includes all panels and at least one frame.
+// Platform.timeCheck(null, Platform.TIME_MARK);
do
{
jin = jprovider.getJarInputStream();
{
jarentry = jin.getNextJarEntry();
}
+ String name = (jarentry == null ? null : jarentry.getName());
- if (jarentry != null && jarentry.getName().endsWith(".xml"))
+// System.out.println("Jalview2XML opening " + name);
+ if (name != null && name.endsWith(".xml"))
{
+
+ // DataSet for.... is read last.
+
+
+ // The question here is what to do with the two
+ // .xml files in the jvp file.
+ // Some number of them, "...Dataset for...", will be the
+ // Only AlignPanels and will have Viewport.
+ // One or more will be the source data, with the DBRefs.
+ //
+ // JVP file writing (above) ensures tha the AlignPanels are written
+ // first, then all relevant datasets (which are
+ // Jalview.datamodel.Alignment).
+ //
+
+// Platform.timeCheck("Jalview2XML JAXB " + name, Platform.TIME_MARK);
JAXBContext jc = JAXBContext
.newInstance("jalview.xml.binding.jalview");
XMLStreamReader streamReader = XMLInputFactory.newInstance()
javax.xml.bind.Unmarshaller um = jc.createUnmarshaller();
JAXBElement<JalviewModel> jbe = um
.unmarshal(streamReader, JalviewModel.class);
- JalviewModel object = jbe.getValue();
+ JalviewModel model = jbe.getValue();
if (true) // !skipViewport(object))
{
- _af = loadFromObject(object, file, true, jprovider);
- if (_af != null && object.getViewport().size() > 0)
- // getJalviewModelSequence().getViewportCount() > 0)
+ // Q: Do we have to load from the model, even if it
+ // does not have a viewport, could we discover that early on?
+ // Q: Do we need to load this object?
+ _af = loadFromObject(model, file, true, jprovider);
+// Platform.timeCheck("Jalview2XML.loadFromObject",
+ // Platform.TIME_MARK);
+
+ if (_af != null)
+ {
+ alignFrames.add(_af);
+ }
+ if (_af != null && model.getViewport().size() > 0)
{
+
+ // That is, this is one of the AlignmentPanel models
if (af == null)
{
// store a reference to the first view
af.getViewport().getAlignment().getDataset());
}
}
+// Platform.timeCheck("JAXB " + name, Platform.TIME_MARK);
entryCount++;
}
else if (jarentry != null)
entryCount++;
}
} while (jarentry != null);
+// Platform.timeCheck("JAXB loop exit", Platform.TIME_MARK);
resolveFrefedSequences();
+// Platform.timeCheck("JAXB resolveFrefed", Platform.TIME_MARK);
+
} catch (IOException ex)
{
ex.printStackTrace();
{
// used to attempt to parse as V1 castor-generated xml
}
- if (Desktop.instance != null)
+ if (Desktop.getInstance() != null)
{
- Desktop.instance.stopLoading();
+ Desktop.getInstance().stopLoading();
}
if (af != null)
{
errorMessage = "Out of memory loading jalview XML file";
System.err.println("Out of memory whilst loading jalview XML file");
e.printStackTrace();
+ } finally
+ {
+ for (AlignFrame alf : alignFrames)
+ {
+ alf.alignPanel.setHoldRepaint(false);
+ }
+
}
/*
*/
for (AlignFrame fr : gatherToThisFrame.values())
{
- Desktop.instance.gatherViews(fr);
+ Desktop.getInstance().gatherViews(fr);
}
restoreSplitFrames();
{
if (ds.getCodonFrames() != null)
{
- StructureSelectionManager
- .getStructureSelectionManager(Desktop.instance)
+ Desktop.getStructureSelectionManager()
.registerMappings(ds.getCodonFrames());
}
}
reportErrors();
}
- if (Desktop.instance != null)
+ if (Desktop.getInstance() != null)
{
- Desktop.instance.stopLoading();
+ Desktop.getInstance().stopLoading();
}
return af;
*/
for (SplitFrame sf : gatherTo)
{
- Desktop.instance.gatherViews(sf);
+ Desktop.getInstance().gatherViews(sf);
}
splitFrameCandidates.clear();
@Override
public void run()
{
- JvOptionPane.showInternalMessageDialog(Desktop.desktop,
+ JvOptionPane.showInternalMessageDialog(Desktop.getDesktopPane(),
finalErrorMessage,
"Error " + (saving ? "saving" : "loading")
+ " Jalview file",
}
/**
- * Load alignment frame from jalview XML DOM object
+ * Load alignment frame from jalview XML DOM object. For a DOM object that
+ * includes one or more Viewport elements (one with a title that does NOT
+ * contain "Dataset for"), create the frame.
*
* @param jalviewModel
* DOM
AlignFrame loadFromObject(JalviewModel jalviewModel, String file,
boolean loadTreesAndStructures, jarInputStreamProvider jprovider)
{
+
+// Platform.timeCheck("Jalview2XML.loadFromObject0", Platform.TIME_MARK);
+
SequenceSet vamsasSet = jalviewModel.getVamsasModel().getSequenceSet().get(0);
List<Sequence> vamsasSeqs = vamsasSet.getSequence();
+
// JalviewModelSequence jms = object.getJalviewModelSequence();
// Viewport view = (jms.getViewportCount() > 0) ? jms.getViewport(0)
: view.getId() + uniqueSetSuffix);
}
+// Platform.timeCheck("Jalview2XML.loadFromObject1", Platform.TIME_MARK);
// ////////////////////////////////
// LOAD SEQUENCES
SequenceI tmpSeq = seqRefIds.get(seqId);
if (tmpSeq != null)
{
+ //
if (!incompleteSeqs.containsKey(seqId))
{
// may not need this check, but keep it for at least 2.9,1 release
}
}
+// Platform.timeCheck("Jalview2XML.loadFromObject-seq",
+// Platform.TIME_MARK);
// /
// Create the alignment object from the sequence set
// ///////////////////////////////
recoverDatasetFor(vamsasSet, al, isdsal, uniqueSeqSetId);
}
+// Platform.timeCheck("Jalview2XML.loadFromObject-align",
+// Platform.TIME_MARK);
if (referenceseqForView != null)
{
al.setSeqrep(referenceseqForView);
al.setProperty(ssp.getKey(), ssp.getValue());
}
+// Platform.timeCheck("Jalview2XML.loadFromObject-setseqprop",
+// Platform.TIME_MARK);
// ///////////////////////////////
Hashtable pdbloaded = new Hashtable(); // TODO nothing writes to this??
// now, for 2.10 projects, this is also done if the xml doc includes
// dataset sequences not actually present in any particular view.
//
+// Platform.timeCheck("J2XML features0", Platform.TIME_RESET);
for (int i = 0; i < vamsasSeqs.size(); i++)
{
JSeq jseq = jseqs.get(i);
}
// adds feature to datasequence's feature set (since Jalview 2.10)
+// Platform.timeCheck(null, Platform.TIME_SET);
al.getSequenceAt(i).addSequenceFeature(sf);
+// Platform.timeCheck(null, Platform.TIME_MARK);
}
}
if (vamsasSeqs.get(i).getDBRef().size() > 0)
{
entry.setProperty(prop.getName(), prop.getValue());
}
- StructureSelectionManager
- .getStructureSelectionManager(Desktop.instance)
+ Desktop.getStructureSelectionManager()
.registerPDBEntry(entry);
// adds PDBEntry to datasequence's set (since Jalview 2.10)
if (al.getSequenceAt(i).getDatasetSequence() != null)
}
}
}
+
}
+
+// Platform.timeCheck("features done", Platform.TIME_GET);
+// Platform.timeCheck("Jalview2XML.loadFromObject-endmultiview",
+// Platform.TIME_MARK);
} // end !multipleview
// ///////////////////////////////
al.addCodonFrame(cf);
}
}
+// Platform.timeCheck("Jalview2XML.loadFromObject-seqmap",
+// Platform.TIME_MARK);
}
// ////////////////////////////////
}
// Construct new annotation from model.
List<AnnotationElement> ae = annotation.getAnnotationElement();
+// System.err.println(
+// "Jalview2XML processing " + ae.size() + " annotations");
+
jalview.datamodel.Annotation[] anot = null;
java.awt.Color firstColour = null;
int anpos;
}
}
}
+ // create the new AlignmentAnnotation
jalview.datamodel.AlignmentAnnotation jaa = null;
if (annotation.isGraph())
jaa._linecolour = firstColour;
}
// register new annotation
+ // Annotation graphs such as Conservation will not have id.
if (annotation.getId() != null)
{
annotationIds.put(annotation.getId(), jaa);
al.addAnnotation(jaa);
}
}
+// Platform.timeCheck("Jalview2XML.loadFromObject-annot",
+// Platform.TIME_MARK);
}
// ///////////////////////
// LOAD GROUPS
jGroup.getAnnotationColours(), null, al, jalviewModel, false));
}
}
+// Platform.timeCheck("Jalview2XML.loadFromObject-groups",
+// Platform.TIME_MARK);
}
if (view == null)
{
// ///////////////////////////////
// LOAD VIEWPORT
- AlignFrame af = null;
- AlignViewport av = null;
// now check to see if we really need to create a new viewport.
if (multipleView && viewportsAdded.size() == 0)
{
}
}
+// Platform.timeCheck("Jalview2XML.loadFromObject-viewport",
+// Platform.TIME_MARK);
}
/**
* indicate that annotation colours are applied across all groups (pre
boolean doGroupAnnColour = Jalview2XML.isVersionStringLaterThan("2.8.1",
jalviewModel.getVersion());
+ AlignFrame af = null;
AlignmentPanel ap = null;
- boolean isnewview = true;
+ AlignViewport av = null;
if (viewId != null)
{
// Check to see if this alignment already has a view id == viewId
{
for (int v = 0; v < views.length; v++)
{
- if (views[v].av.getViewId().equalsIgnoreCase(viewId))
+ ap = views[v];
+ av = ap.av;
+ if (av.getViewId().equalsIgnoreCase(viewId))
{
// recover the existing alignpanel, alignframe, viewport
- af = views[v].alignFrame;
- av = views[v].av;
- ap = views[v];
+ af = ap.alignFrame;
+ break;
// TODO: could even skip resetting view settings if we don't want to
// change the local settings from other jalview processes
- isnewview = false;
}
}
}
}
- if (isnewview)
+ if (af == null)
{
af = loadViewport(file, jseqs, hiddenSeqs, al, jalviewModel, view,
uniqueSeqSetId, viewId, autoAlan);
av = af.getViewport();
+ // note that this only retrieves the most recently accessed
+ // tab of an AlignFrame.
ap = af.alignPanel;
}
*
* Not done if flag is false (when this method is used for New View)
*/
+ final AlignFrame af0 = af;
+ final AlignViewport av0 = av;
+ final AlignmentPanel ap0 = ap;
+// Platform.timeCheck("Jalview2XML.loadFromObject-beforetree",
+// Platform.TIME_MARK);
if (loadTreesAndStructures)
{
- loadTrees(jalviewModel, view, af, av, ap);
- loadPCAViewers(jalviewModel, ap);
- loadPDBStructures(jprovider, jseqs, af, ap);
- loadRnaViewers(jprovider, jseqs, ap);
+ if (!jalviewModel.getTree().isEmpty())
+ {
+ SwingUtilities.invokeLater(new Runnable()
+ {
+ @Override
+ public void run()
+ {
+// Platform.timeCheck(null, Platform.TIME_MARK);
+ loadTrees(jalviewModel, view, af0, av0, ap0);
+// Platform.timeCheck("Jalview2XML.loadTrees", Platform.TIME_MARK);
+ }
+ });
+ }
+ if (!jalviewModel.getPcaViewer().isEmpty())
+ {
+ SwingUtilities.invokeLater(new Runnable()
+ {
+ @Override
+ public void run()
+ {
+// Platform.timeCheck(null, Platform.TIME_MARK);
+ loadPCAViewers(jalviewModel, ap0);
+// Platform.timeCheck("Jalview2XML.loadPCA", Platform.TIME_MARK);
+ }
+ });
+ }
+ SwingUtilities.invokeLater(new Runnable()
+ {
+ @Override
+ public void run()
+ {
+// Platform.timeCheck(null, Platform.TIME_MARK);
+ loadPDBStructures(jprovider, jseqs, af0, ap0);
+// Platform.timeCheck("Jalview2XML.loadPDB", Platform.TIME_MARK);
+ }
+ });
+ SwingUtilities.invokeLater(new Runnable()
+ {
+ @Override
+ public void run()
+ {
+ loadRnaViewers(jprovider, jseqs, ap0);
+ }
+ });
}
// and finally return.
+ // but do not set holdRepaint true just yet, because this could be the
+ // initial frame with just its dataset.
return af;
}
* @param jseqs
* @param ap
*/
- private void loadRnaViewers(jarInputStreamProvider jprovider,
+ protected void loadRnaViewers(jarInputStreamProvider jprovider,
List<JSeq> jseqs, AlignmentPanel ap)
{
/*
int height = safeInt(structureState.getHeight());
// Probably don't need to do this anymore...
- // Desktop.desktop.getComponentAt(x, y);
+ // Desktop.getDesktop().getComponentAt(x, y);
// TODO: NOW: check that this recovers the PDB file correctly.
String pdbFile = loadPDBFile(jprovider, pdbid.getId(),
pdbid.getFile());
String reformatedOldFilename = oldfilenam.replaceAll("/", "\\\\");
filedat = oldFiles.get(new File(reformatedOldFilename));
}
- newFileLoc.append(Platform.escapeBackslashes(filedat.getFilePath()));
+ newFileLoc.append(Platform.escapeString(filedat.getFilePath()));
pdbfilenames.add(filedat.getFilePath());
pdbids.add(filedat.getPdbId());
seqmaps.add(filedat.getSeqList().toArray(new SequenceI[0]));
final AlignFrame alf = af;
final Rectangle rect = new Rectangle(svattrib.getX(), svattrib.getY(),
svattrib.getWidth(), svattrib.getHeight());
- try
- {
- javax.swing.SwingUtilities.invokeAndWait(new Runnable()
+ // try
+ // {
+ javax.swing.SwingUtilities.invokeLater(new Runnable()
{
@Override
public void run()
}
}
});
- } catch (InvocationTargetException ex)
- {
- warn("Unexpected error when opening Jmol view.", ex);
-
- } catch (InterruptedException e)
- {
- // e.printStackTrace();
- }
+ // } catch (InvocationTargetException ex)
+ // {
+ // warn("Unexpected error when opening Jmol view.", ex);
+ //
+ // } catch (InterruptedException e)
+ // {
+ // // e.printStackTrace();
+ // }
}
{
try
{
- frames = Desktop.desktop.getAllFrames();
+ frames = Desktop.getDesktopPane().getAllFrames();
} catch (ArrayIndexOutOfBoundsException e)
{
// occasional No such child exceptions are thrown here...
{
AlignFrame af = null;
af = new AlignFrame(al, safeInt(view.getWidth()),
- safeInt(view.getHeight()), uniqueSeqSetId, viewId)
+ safeInt(view.getHeight()), uniqueSeqSetId, viewId)
// {
-//
-// @Override
-// protected void processKeyEvent(java.awt.event.KeyEvent e) {
-// System.out.println("Jalview2XML AF " + e);
-// super.processKeyEvent(e);
-//
-// }
-//
+//
+// @Override
+// protected void processKeyEvent(java.awt.event.KeyEvent e) {
+// System.out.println("Jalview2XML AF " + e);
+// super.processKeyEvent(e);
+//
+// }
+//
// }
;
-
+ af.alignPanel.setHoldRepaint(true);
af.setFileName(file, FileFormat.Jalview);
final AlignViewport viewport = af.getViewport();
viewport.setViewName(view.getViewName());
af.setInitialTabVisible();
}
- af.setBounds(safeInt(view.getXpos()), safeInt(view.getYpos()),
- safeInt(view.getWidth()), safeInt(view.getHeight()));
+ int x = safeInt(view.getXpos());
+ int y = safeInt(view.getYpos());
+ int w = safeInt(view.getWidth());
+ int h = safeInt(view.getHeight());
+ // // BH we cannot let the title bar go off the top
+ // if (Platform.isJS())
+ // {
+ // x = Math.max(50 - w, x);
+ // y = Math.max(0, y);
+ // }
+
+ af.setBounds(x, y, w, h);
// startSeq set in af.alignPanel.updateLayout below
af.alignPanel.updateLayout();
ColourSchemeI cs = null;
}
else
{
- featureOrder.put(featureType, Float.valueOf(
+ featureOrder.put(featureType, new Float(
fs / jm.getFeatureSettings().getSetting().size()));
}
if (safeBoolean(setting.isDisplay()))
for (int gs = 0; gs < jm.getFeatureSettings().getGroup().size(); gs++)
{
Group grp = jm.getFeatureSettings().getGroup().get(gs);
- fgtable.put(grp.getName(), Boolean.valueOf(grp.isDisplay()));
+ fgtable.put(grp.getName(), new Boolean(grp.isDisplay()));
}
// FeatureRendererSettings frs = new FeatureRendererSettings(renderOrder,
// fgtable, featureColours, jms.getFeatureSettings().hasTransparency() ?
SequenceI[] dsseqs = new SequenceI[dseqs.size()];
dseqs.copyInto(dsseqs);
ds = new jalview.datamodel.Alignment(dsseqs);
- debug("Created new dataset " + vamsasSet.getDatasetId()
- + " for alignment " + System.identityHashCode(al));
+// debug("Jalview2XML Created new dataset " + vamsasSet.getDatasetId()
+// + " for alignment " + System.identityHashCode(al));
addDatasetRef(vamsasSet.getDatasetId(), ds);
}
// set the dataset for the newly imported alignment.
import jalview.api.AlignmentColsCollectionI;
import jalview.api.AlignmentRowsCollectionI;
+import jalview.api.AlignmentViewPanel;
import jalview.api.RendererListenerI;
import jalview.datamodel.AlignmentAnnotation;
import jalview.datamodel.AlignmentI;
import jalview.datamodel.SequenceGroup;
import jalview.datamodel.SequenceI;
import jalview.renderer.seqfeatures.FeatureColourFinder;
-import jalview.renderer.seqfeatures.FeatureRenderer;
+import jalview.util.Platform;
import jalview.viewmodel.OverviewDimensions;
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
+import java.awt.image.DataBufferInt;
+import java.awt.image.WritableRaster;
import java.beans.PropertyChangeSupport;
+import java.util.BitSet;
+import java.util.Iterator;
+
+import javax.swing.Timer;
public class OverviewRenderer
{
// image to render on
private BufferedImage miniMe;
- // raw number of pixels to allocate to each column
+ /**
+ * Number of pixelsPerCol;
+ */
private float pixelsPerCol;
+ /**
+ * Number of visible columns per pixel.
+ *
+ */
+ private float colsPerPixel;
+
// raw number of pixels to allocate to each row
private float pixelsPerSeq;
private OverviewResColourFinder resColFinder;
- public OverviewRenderer(FeatureRenderer fr, OverviewDimensions od,
- AlignmentI alignment,
- ResidueShaderI resshader, OverviewResColourFinder colFinder)
+ private boolean showProgress;
+
+ private AlignmentViewPanel panel;
+
+ // private int sequencesHeight;
+
+ public OverviewRenderer(AlignmentViewPanel panel,
+ jalview.api.FeatureRenderer fr, OverviewDimensions od,
+ AlignmentI alignment, ResidueShaderI resshader,
+ OverviewResColourFinder colFinder)
{
- finder = new FeatureColourFinder(fr);
- resColFinder = colFinder;
+ this(panel, fr, od, alignment, resshader, colFinder, true);
+ }
+ /**
+ * @param panel
+ * @param fr
+ * @param od
+ * @param alignment
+ * @param resshader
+ * @param colFinder
+ * @param shwoProgress
+ * possibly not, in JavaScript and for testng
+ */
+ public OverviewRenderer(AlignmentViewPanel panel,
+ jalview.api.FeatureRenderer fr, OverviewDimensions od,
+ AlignmentI alignment, ResidueShaderI resshader,
+ OverviewResColourFinder colFinder, boolean showProgress)
+ {
+ {
+ this.panel = panel;
+ finder = new FeatureColourFinder(fr);
al = alignment;
shader = resshader;
+ resColFinder = colFinder;
+ this.showProgress = showProgress;
- pixelsPerCol = od.getPixelsPerCol();
- pixelsPerSeq = od.getPixelsPerSeq();
+ w = od.getWidth();
+ h = od.getHeight();
+ rows = od.getRows(alignment);
+ cols = od.getColumns(alignment);
graphHeight = od.getGraphHeight();
- miniMe = new BufferedImage(od.getWidth(), od.getHeight(),
- BufferedImage.TYPE_INT_RGB);
+ alignmentHeight = od.getSequencesHeight();
+
+ pixelsPerSeq = od.getPixelsPerSeq();
+ pixelsPerCol = od.getPixelsPerCol();
+ colsPerPixel = Math.max(1, 1f / pixelsPerCol);
+ }
}
+ final static int STATE_INIT = 0;
+ final static int STATE_NEXT = 1;
+ final static int STATE_DONE = 2;
+
+ int state;
+
+ boolean isJS = Platform.isJS();
+
+ Timer timer;
+ int delay = (isJS ? 1 : 0);
+
+ int seqIndex;
+
+ int pixelRow;
+
+ private Integer row;
+
/**
- * Draw alignment rows and columns onto an image
+ * Draw alignment rows and columns onto an image. This method is asynchronous
+ * in JavaScript and interruptible in Java.
+ *
+ * Whether hidden rows or columns are drawn depends upon the type of
+ * collection.
*
- * @param rit
- * Iterator over rows to be drawn
- * @param cit
- * Iterator over columns to be drawn
+ * Updated to skip through high-density sequences, where columns/pixels > 1.
+ *
+ * When the process is complete, the image is passed to the AlignmentViewPanel
+ * provided by the constructor.
+ *
+ * @param rows
+ * collection of rows to be drawn
+ * @param cols
+ * collection of columns to be drawn
* @return image containing the drawing
+ *
+ * @author Bob Hanson 2019.07.30
*/
- public BufferedImage draw(AlignmentRowsCollectionI rows,
- AlignmentColsCollectionI cols)
+ public void drawMiniMe()
{
- int rgbcolor = Color.white.getRGB();
- int seqIndex = 0;
- int pixelRow = 0;
- int alignmentHeight = miniMe.getHeight() - graphHeight;
- int totalPixels = miniMe.getWidth() * alignmentHeight;
+ state = STATE_INIT;
+ mainLoop();
+ }
- int lastRowUpdate = 0;
- int lastUpdate = 0;
- changeSupport.firePropertyChange(UPDATE, -1, 0);
+ protected void mainLoop()
+ {
+ out: while (!redraw)
+ {
+ switch (state)
+ {
+ case STATE_INIT:
+ init();
+ state = STATE_NEXT;
+ continue;
+ case STATE_NEXT:
+ if (!rowIterator.hasNext())
+ {
+ state = STATE_DONE;
+ continue;
+ }
+ nextRow();
+ if (!loop())
+ {
+ // Java
+ continue;
+ }
+ // JavaScript
+ return;
+ case STATE_DONE:
+ break out;
+ }
+ // Java will continue without a timeout
+ }
+ done();
+ }
- for (int alignmentRow : rows)
+ private void init()
+ {
+ rowIterator = rows.iterator();
+ seqIndex = 0;
+ pixelRow = 0;
+ lastRowUpdate = 0;
+ lastUpdate = 0;
+ totalPixels = w * alignmentHeight;
+
+ if (showProgress)
+ {
+ changeSupport.firePropertyChange(UPDATE, -1, 0);
+ }
+
+ miniMe = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
+ WritableRaster raster = miniMe.getRaster();
+ DataBufferInt db = (DataBufferInt) raster.getDataBuffer();
+ pixels = db.getBankData()[0];
+ bscol = cols.getOverviewBitSet();
+ Platform.timeCheck(null, Platform.TIME_MARK);
+ }
+
+ private void nextRow()
+ {
+ row = rowIterator.next();
+ // get details of this alignment row
+ SequenceI seq = rows.getSequence(row);
+
+ // rate limiting step when rendering overview for lots of groups
+ SequenceGroup[] allGroups = al.findAllGroups(seq);
+
+ // calculate where this row extends to in pixels
+ int endRow = Math.min(Math.round((++seqIndex) * pixelsPerSeq), h);
+ for (int pixelCol = 0, colNext = 0, pixelEnd = 0, icol = bscol
+ .nextSetBit(0); icol >= 0; icol = getNextCol(icol, pixelEnd))
{
if (redraw)
{
break;
}
-
- // get details of this alignment row
- SequenceI seq = rows.getSequence(alignmentRow);
-
- // rate limiting step when rendering overview for lots of groups
- SequenceGroup[] allGroups = al.findAllGroups(seq);
-
- // calculate where this row extends to in pixels
- int endRow = Math.min(Math.round((seqIndex + 1) * pixelsPerSeq) - 1,
- miniMe.getHeight() - 1);
-
- int colIndex = 0;
- int pixelCol = 0;
- for (int alignmentCol : cols)
+
+ ++colNext;
+ pixelEnd = getNextPixel(colNext, colNext);
+
+ if (pixelCol == pixelEnd)
{
- if (redraw)
- {
- break;
- }
-
- // calculate where this column extends to in pixels
- int endCol = Math.min(Math.round((colIndex + 1) * pixelsPerCol) - 1,
- miniMe.getWidth() - 1);
-
- // don't do expensive colour determination if we're not going to use it
- // NB this is important to avoid performance issues in the overview
- // panel
- if (pixelCol <= endCol)
+ break;
+ }
+ else if (pixelCol < pixelEnd)
+ {
+ int rgb = getColumnColourFromSequence(allGroups, seq, icol);
+ // fill in the appropriate number of pixels
+ // System.out.println(
+ // "OR colNext=" + colNext + " " + pixelCol
+ // + "-" + pixelEnd + " icol=" + icol + " " + rgb + " "
+ // + pixelsPerCol);
+ for (int row = pixelRow; row < endRow; ++row)
{
- rgbcolor = getColumnColourFromSequence(allGroups, seq,
- alignmentCol);
-
- // fill in the appropriate number of pixels
- for (int row = pixelRow; row <= endRow; ++row)
+ for (int col = pixelCol; col < pixelEnd; ++col)
{
- for (int col = pixelCol; col <= endCol; ++col)
- {
- miniMe.setRGB(col, row, rgbcolor);
- }
+ // BH 2019.07.27 was:
+ //
+ // miniMe.setRGB(col, row, rgbcolor);
+ //
+ // but just directly writing to the int[] pixel buffer
+ // is three times faster by my experimentation
+ pixels[row * w + col] = rgb;
+ ndone++;
}
-
- // store last update value
+ }
+ pixelCol = pixelEnd;
+ // store last update value
+ if (showProgress)
+ {
lastUpdate = sendProgressUpdate(
- (pixelCol + 1) * (endRow - pixelRow), totalPixels,
- lastRowUpdate, lastUpdate);
-
- pixelCol = endCol + 1;
+ pixelEnd * (endRow - 1 - pixelRow),
+ totalPixels, lastRowUpdate, lastUpdate);
}
- colIndex++;
}
- if (pixelRow != endRow + 1)
+ }
+ if (pixelRow < endRow)
+ {
+ pixelRow = endRow;
+ // store row offset and last update value
+ if (showProgress)
{
- // store row offset and last update value
- lastRowUpdate = sendProgressUpdate(endRow + 1, alignmentHeight, 0,
+ // BH 2019.07.29 was (old) endRow + 1 (now endRow), but should be
+ // pixelRow + 1, surely
+ lastRowUpdate = sendProgressUpdate(endRow, alignmentHeight, 0,
lastUpdate);
lastUpdate = lastRowUpdate;
- pixelRow = endRow + 1;
}
- seqIndex++;
}
+ }
- overlayHiddenRegions(rows, cols);
- // final update to progress bar if present
- if (redraw)
+ /**
+ * The next column is either the next set bit (when there are multiple pixels
+ * per column) or the next set bit for the column that aligns with the next
+ * pixel (when there are more columns than pixels).
+ *
+ * @param icol
+ * @param pixel
+ * @return
+ */
+ private int getNextCol(int icol, int pixel)
+ {
+ return bscol.nextSetBit(
+ pixelsPerCol >= 1 ? icol + 1 : (int) (pixel * colsPerPixel));
+ }
+
+ private int getNextPixel(int icol, int pixel)
+ {
+ return Math.min(
+ pixelsPerCol >= 1 || pixel == 0
+ ? Math.round(icol * pixelsPerCol)
+ : pixel,
+ w);
+ }
+
+ private ActionListener listener = new ActionListener()
+ {
+ @Override
+ public void actionPerformed(ActionEvent e)
{
- sendProgressUpdate(pixelRow - 1, alignmentHeight, 0, 0);
+ mainLoop();
+ }
+
+ };
+
+ private boolean loop()
+ {
+ if (delay <= 0)
+ {
+ return false;
+ }
+ if (timer == null)
+ {
+ timer = new Timer(delay, listener);
+ timer.setRepeats(false);
+ timer.start();
}
else
{
- sendProgressUpdate(alignmentHeight, miniMe.getHeight(), 0, 0);
+ timer.restart();
}
- return miniMe;
+ return true;
}
+ private void done()
+ {
+ if (!redraw)
+ {
+ Platform.timeCheck(
+ "overviewrender " + ndone + " pixels row:" + row + " redraw:"
+ + redraw,
+ Platform.TIME_MARK);
+ }
+
+ overlayHiddenRegions();
+ if (showProgress)
+ {
+ // final update to progress bar if present
+ if (redraw)
+ {
+ // aborted in Java
+ // BH was pixelRow - 1, but that could go negative
+ sendProgressUpdate(pixelRow, alignmentHeight, 0, 0);
+ }
+ else
+ {
+ // sendProgressUpdate(alignmentHeight, miniMe.getHeight(), 0, 0);
+ sendProgressUpdate(1, 1, 0, 0);
+ }
+ }
+ panel.overviewDone(miniMe);
+ }
+
+ int ndone = 0;
+
+ private AlignmentRowsCollectionI rows;
+
+ private AlignmentColsCollectionI cols;
+
+ Iterator<Integer> rowIterator;
+
+ int alignmentHeight;
+
+ int totalPixels;
+
+ int lastRowUpdate;
+
+ int lastUpdate;
+
+ int[] pixels;
+
+ BitSet bscol;
+
+ int w, h;
+
/*
* Calculate progress update value and fire event
* @param rowOffset number of rows to offset calculation by
* column position to get colour for
* @return colour of sequence at this position, as RGB
*/
- int getColumnColourFromSequence(SequenceGroup[] allGroups,
- SequenceI seq, int lastcol)
+ int getColumnColourFromSequence(SequenceGroup[] allGroups, SequenceI seq,
+ int icol)
{
- Color color = resColFinder.GAP_COLOUR;
-
- if ((seq != null) && (seq.getLength() > lastcol))
- {
- color = resColFinder.getResidueColour(true, shader, allGroups, seq,
- lastcol, finder);
- }
-
- return color.getRGB();
+ return (seq == null || icol >= seq.getLength()
+ ? resColFinder.GAP_COLOUR
+ : resColFinder.getResidueColourInt(true, shader, allGroups, seq,
+ icol, finder));
}
/**
* Overlay the hidden regions on the overview image
*
- * @param rows
- * collection of rows the overview is built over
- * @param cols
- * collection of columns the overview is built over
*/
- private void overlayHiddenRegions(AlignmentRowsCollectionI rows,
- AlignmentColsCollectionI cols)
+ private void overlayHiddenRegions()
{
if (cols.hasHidden() || rows.hasHidden())
{
- BufferedImage mask = buildHiddenImage(rows, cols, miniMe.getWidth(),
- miniMe.getHeight());
+ BufferedImage mask = buildHiddenImage();
Graphics2D g = (Graphics2D) miniMe.getGraphics();
g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER,
TRANSPARENCY));
g.drawImage(mask, 0, 0, miniMe.getWidth(), miniMe.getHeight(), null);
+ g.dispose();
}
}
* height of overview in pixels
* @return BufferedImage containing mask of hidden regions
*/
- private BufferedImage buildHiddenImage(AlignmentRowsCollectionI rows,
- AlignmentColsCollectionI cols, int width, int height)
+ private BufferedImage buildHiddenImage()
{
// new masking image
- BufferedImage hiddenImage = new BufferedImage(width, height,
+ BufferedImage hiddenImage = new BufferedImage(w, h,
BufferedImage.TYPE_INT_ARGB);
- int colIndex = 0;
- int pixelCol = 0;
-
Color hidden = resColFinder.getHiddenColour();
Graphics2D g2d = (Graphics2D) hiddenImage.getGraphics();
+ g2d.setColor(hidden);
// set background to transparent
// g2d.setComposite(AlphaComposite.Clear);
// g2d.fillRect(0, 0, width, height);
// set next colour to opaque
g2d.setComposite(AlphaComposite.Src);
- for (int alignmentCol : cols)
+ // System.out.println(cols.getClass().getName());
+ if (cols.hasHidden())
{
- if (redraw)
- {
- break;
- }
-
- // calculate where this column extends to in pixels
- int endCol = Math.min(Math.round((colIndex + 1) * pixelsPerCol) - 1,
- hiddenImage.getWidth() - 1);
-
- if (pixelCol <= endCol)
+ // AllColsCollection only
+ BitSet bs = cols.getHiddenBitSet();
+ for (int pixelCol = -1, icol2 = 0, icol = bs
+ .nextSetBit(0); icol >= 0; icol = bs.nextSetBit(icol2))
{
- // determine the colour based on the sequence and column position
- if (cols.isHidden(alignmentCol))
+ if (redraw)
{
- g2d.setColor(hidden);
- g2d.fillRect(pixelCol, 0, endCol - pixelCol + 1, height);
+ break;
+ }
+ icol2 = bs.nextClearBit(icol + 1);
+ int pixelEnd = getNextPixel(icol2, 0);
+ if (pixelEnd > pixelCol)
+ {
+ pixelCol = getNextPixel(icol, 0);
+ g2d.fillRect(pixelCol, 0, Math.max(1, pixelEnd - pixelCol),
+ h);
+ pixelCol = pixelEnd;
}
-
- pixelCol = endCol + 1;
}
- colIndex++;
-
}
-
- int seqIndex = 0;
- int pixelRow = 0;
- for (int alignmentRow : rows)
+ if (rows.hasHidden())
{
- if (redraw)
+ int seqIndex = 0;
+ int pixelRow = 0;
+ for (int alignmentRow : rows)
{
- break;
- }
+ if (redraw)
+ {
+ break;
+ }
- // calculate where this row extends to in pixels
- int endRow = Math.min(Math.round((seqIndex + 1) * pixelsPerSeq) - 1,
- miniMe.getHeight() - 1);
+ // calculate where this row extends to in pixels
+ int endRow = Math.min(Math.round((++seqIndex) * pixelsPerSeq),
+ h);
- // get details of this alignment row
- if (rows.isHidden(alignmentRow))
- {
- g2d.setColor(hidden);
- g2d.fillRect(0, pixelRow, width, endRow - pixelRow + 1);
+ // get details of this alignment row
+ if (rows.isHidden(alignmentRow))
+ {
+ g2d.fillRect(0, pixelRow, w, endRow - 1 - pixelRow);
+ }
+ pixelRow = endRow;
}
- pixelRow = endRow + 1;
- seqIndex++;
}
-
+ g2d.dispose();
return hiddenImage;
}
/**
* Draw the alignment annotation in the overview panel
*
- * @param g
- * the graphics object to draw on
* @param anno
* alignment annotation information
- * @param y
- * y-position for the annotation graph
- * @param cols
- * the collection of columns used in the overview panel
*/
- public void drawGraph(Graphics g, AlignmentAnnotation anno, int y,
- AlignmentColsCollectionI cols)
+ public void drawGraph(AlignmentAnnotation anno)
{
+ int y = graphHeight;
+ Graphics g = miniMe.getGraphics();
+ g.translate(0, alignmentHeight);
+
Annotation[] annotations = anno.annotations;
+ float max = anno.graphMax;
g.setColor(Color.white);
- g.fillRect(0, 0, miniMe.getWidth(), y);
+ g.fillRect(0, 0, w, y);
- int height;
- int colIndex = 0;
- int pixelCol = 0;
- for (int alignmentCol : cols)
+ for (int pixelCol = 0, colNext = 0, pixelEnd = 0, len = annotations.length, icol = bscol
+ .nextSetBit(0); icol >= 0
+ && icol < len; icol = getNextCol(icol, pixelEnd))
{
if (redraw)
{
- changeSupport.firePropertyChange(UPDATE, MAX_PROGRESS - 1, 0);
+ if (showProgress)
+ {
+ changeSupport.firePropertyChange(UPDATE, MAX_PROGRESS - 1, 0);
+ }
break;
}
- if (alignmentCol >= annotations.length)
+ ++colNext;
+ pixelEnd = getNextPixel(colNext, colNext);
+ Annotation ann = annotations[icol];
+ if (ann != null)
{
- break; // no more annotations to draw here
+ Color color = ann.colour;
+ g.setColor(color == null ? Color.black : color);
+ int height = Math.min(y, (int) ((ann.value / max) * y));
+ g.fillRect(pixelCol, y - height, Math.max(1, pixelEnd - pixelCol),
+ height);
}
- else
- {
- int endCol = Math.min(Math.round((colIndex + 1) * pixelsPerCol) - 1,
- miniMe.getWidth() - 1);
-
- if (annotations[alignmentCol] != null)
- {
- if (annotations[alignmentCol].colour == null)
- {
- g.setColor(Color.black);
- }
- else
- {
- g.setColor(annotations[alignmentCol].colour);
- }
-
- height = (int) ((annotations[alignmentCol].value / anno.graphMax)
- * y);
- if (height > y)
- {
- height = y;
- }
+ pixelCol = pixelEnd;
+ }
- g.fillRect(pixelCol, y - height, endCol - pixelCol + 1, height);
- }
+ g.translate(0, -alignmentHeight);
+ g.dispose();
- pixelCol = endCol + 1;
- colIndex++;
- }
+ if (showProgress)
+ {
+ changeSupport.firePropertyChange(UPDATE, MAX_PROGRESS - 1,
+ MAX_PROGRESS);
}
- changeSupport.firePropertyChange(UPDATE, MAX_PROGRESS - 1,
- MAX_PROGRESS);
+
}
/**
import jalview.datamodel.SequenceGroup;
import jalview.datamodel.SequenceI;
+import jalview.renderer.seqfeatures.FeatureColourFinder;
import jalview.util.Comparison;
import java.awt.Color;
public class OverviewResColourFinder extends ResidueColourFinder
{
- final Color GAP_COLOUR; // default colour to use at gaps
+ final int GAP_COLOUR; // default colour to use at gaps
- final Color RESIDUE_COLOUR; // default colour to use at residues
+ final int RESIDUE_COLOUR; // default colour to use at residues
final Color HIDDEN_COLOUR; // colour for hidden regions
{
if (useLegacyColouring)
{
- GAP_COLOUR = Color.white;
- RESIDUE_COLOUR = Color.lightGray;
- HIDDEN_COLOUR = hiddenCol;
+ GAP_COLOUR = Color.white.getRGB();
+ RESIDUE_COLOUR = Color.lightGray.getRGB();
}
else
{
- GAP_COLOUR = gapCol;
- RESIDUE_COLOUR = Color.white;
- HIDDEN_COLOUR = hiddenCol;
+ GAP_COLOUR = gapCol.getRGB();
+ RESIDUE_COLOUR = Color.white.getRGB();
}
+ HIDDEN_COLOUR = hiddenCol;
}
@Override
+ /**
+ * for Test suite only.
+ */
public Color getBoxColour(ResidueShaderI shader, SequenceI seq, int i)
{
- Color resBoxColour = RESIDUE_COLOUR;
- char currentChar = seq.getCharAt(i);
+ return new Color(getBoxColourInt(shader, seq, i));
+ }
+ public int getBoxColourInt(ResidueShaderI shader, SequenceI seq, int i)
+ {
+ char currentChar = seq.getCharAt(i);
// In the overview window, gaps are coloured grey, unless the colour scheme
// specifies a gap colour, in which case gaps honour the colour scheme
// settings
- if (shader.getColourScheme() != null)
+ boolean isGap = Comparison.isGap(currentChar);
+ if (shader.getColourScheme() == null)
{
- if (Comparison.isGap(currentChar)
- && (!shader.getColourScheme().hasGapColour()))
- {
- resBoxColour = GAP_COLOUR;
- }
- else
- {
- resBoxColour = shader.findColour(currentChar, i, seq);
- }
+ return (isGap ? GAP_COLOUR : RESIDUE_COLOUR);
}
- else if (Comparison.isGap(currentChar))
+ return (isGap && !shader.getColourScheme().hasGapColour() ? GAP_COLOUR
+ : shader.findColourInt(currentChar, i, seq));
+ }
+
+ /**
+ * For test suite only.
+ */
+ @Override
+ public Color getResidueColour(boolean showBoxes, ResidueShaderI shader,
+ SequenceGroup[] allGroups, final SequenceI seq, int i,
+ FeatureColourFinder finder)
+ {
+ return new Color(getResidueColourInt(showBoxes, shader, allGroups, seq,
+ i, finder));
+ }
+
+
+ public int getResidueColourInt(boolean showBoxes, ResidueShaderI shader,
+ SequenceGroup[] allGroups, final SequenceI seq, int i,
+ FeatureColourFinder finder)
+ {
+
+ int c = seq.getColor(i);
+ if (c != 0)
{
- resBoxColour = GAP_COLOUR;
+ return c;
}
- return resBoxColour;
+ int col = getResidueBoxColourInt(showBoxes, shader, allGroups, seq, i);
+
+ // if there's a FeatureColourFinder we might override the residue colour
+ // here with feature colouring
+ return seq.setColor(i,
+ finder == null || finder.noFeaturesDisplayed() ? col
+ : finder.findFeatureColourInt(col, seq, i));
}
/**
- * {@inheritDoc} In the overview, the showBoxes setting is ignored, as the
- * overview displays the colours regardless.
+ * For test suite only.
*/
@Override
protected Color getResidueBoxColour(boolean showBoxes,
- ResidueShaderI shader,
- SequenceGroup[] allGroups, SequenceI seq, int i)
+ ResidueShaderI shader, SequenceGroup[] allGroups, SequenceI seq,
+ int i)
+ {
+ return new Color(
+ getResidueBoxColourInt(showBoxes, shader, allGroups, seq, i));
+ }
+
+ /**
+ * In the overview, the showBoxes setting is ignored, as the overview displays
+ * the colours regardless.
+ */
+ protected int getResidueBoxColourInt(boolean showBoxes,
+ ResidueShaderI shader, SequenceGroup[] allGroups, SequenceI seq,
+ int i)
{
- ResidueShaderI currentShader;
SequenceGroup currentSequenceGroup = getCurrentSequenceGroup(allGroups,
i);
- if (currentSequenceGroup != null)
- {
- currentShader = currentSequenceGroup.getGroupColourScheme();
- }
- else
- {
- currentShader = shader;
- }
-
- return getBoxColour(currentShader, seq, i);
+ ResidueShaderI currentShader = (currentSequenceGroup == null ? shader
+ : currentSequenceGroup.getGroupColourScheme());
+ return getBoxColourInt(currentShader, seq, i);
}
/**
public SequenceGroup getCurrentSequenceGroup(SequenceGroup[] allGroups,
int res)
{
- if (allGroups == null)
+ int n;
+ if (allGroups == null || (n = allGroups.length) == 0)
{
return null;
}
- for (int i = 0; i < allGroups.length; i++)
+ for (int i = 0; i < n; i++)
{
if ((allGroups[i].getStartRes() <= res)
&& (allGroups[i].getEndRes() >= res))
return colour;
}
+ @Override
+ public int findColourInt(char symbol, int position, SequenceI seq)
+ {
+ if (colourScheme == null)
+ {
+ return -1;// Color.white; // Colour is 'None'
+ }
+
+ /*
+ * get 'base' colour
+ */
+ ProfileI profile = consensus == null ? null : consensus.get(position);
+ String modalResidue = profile == null ? null
+ : profile.getModalResidue();
+ float pid = profile == null ? 0f
+ : profile.getPercentageIdentity(ignoreGaps);
+ int colour = colourScheme
+ .findColour(symbol, position, seq, modalResidue, pid).getRGB();
+
+ /*
+ * apply PID threshold and consensus fading if in force
+ */
+ if (!Comparison.isGap(symbol))
+ {
+ colour = adjustColourInt(symbol, position, colour);
+ }
+
+ return colour;
+ }
+
/**
* Adjusts colour by applying thresholding or conservation shading, if in
* force. That is
return colour;
}
+ protected int adjustColourInt(char symbol, int column, int colour)
+ {
+ if (!aboveThreshold(symbol, column))
+ {
+ colour = -1;// Color.white;
+ }
+
+ if (conservationColouring)
+ {
+ colour = applyConservationInt(colour, column);
+ }
+ return colour;
+ }
+
/**
* Answers true if there is a consensus profile for the specified column, and
* the given residue matches the consensus (or joint consensus) residue for
return ColorUtils.bleachColour(currentColour, bleachFactor);
}
+ protected int applyConservationInt(int currentColour, int column)
+ {
+ if (conservation == null || conservation.length <= column)
+ {
+ return currentColour;
+ }
+ char conservationScore = conservation[column];
+
+ /*
+ * if residues are fully conserved (* or 11), or all properties
+ * are conserved (+ or 10), leave colour unchanged
+ */
+ if (conservationScore == '*' || conservationScore == '+'
+ || conservationScore == (char) 10
+ || conservationScore == (char) 11)
+ {
+ return currentColour;
+ }
+
+ if (Comparison.isGap(conservationScore))
+ {
+ return -1;// Color.white;
+ }
+
+ /*
+ * convert score 0-9 to a bleaching factor 1.1 - 0.2
+ */
+ float bleachFactor = (11 - (conservationScore - '0')) / 10f;
+
+ /*
+ * scale this up by 0-5 (percentage slider / 20)
+ * as a result, scores of: 0 1 2 3 4 5 6 7 8 9
+ * fade to white at slider value: 18 20 22 25 29 33 40 50 67 100%
+ */
+ bleachFactor *= (conservationIncrement / 20f);
+
+ return ColorUtils.bleachColourInt(currentColour, bleachFactor);
+ }
+
/**
* @see jalview.renderer.ResidueShaderI#getColourScheme()
*/
public abstract void setColourScheme(ColourSchemeI cs);
+ int findColourInt(char symbol, int position, SequenceI seq);
+
}
\ No newline at end of file
*/
private BufferedImage offscreenImage;
+ private Graphics goff;
+
/**
* Constructor
*
{
featureRenderer = fr;
offscreenImage = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB);
+ goff = offscreenImage.getGraphics();
}
/**
*/
if (featureRenderer.getTransparency() != 1f)
{
- g = offscreenImage.getGraphics();
+ g = goff;
if (defaultColour != null)
{
offscreenImage.setRGB(0, 0, defaultColour.getRGB());
return c;
}
+ public int findFeatureColourInt(int defaultColour, SequenceI seq,
+ int column)
+ {
+ // if (noFeaturesDisplayed())
+ // {
+ // return defaultColour;
+ // }
+
+ Graphics g = null;
+
+ /*
+ * if transparency applies, provide a notional 1x1 graphics context
+ * that has been primed with the default colour
+ */
+ if (featureRenderer.getTransparency() != 1f)
+ {
+ g = goff;
+ if (defaultColour != 0)
+ {
+ offscreenImage.setRGB(0, 0, defaultColour);
+ }
+ }
+
+ Color c = featureRenderer.findFeatureColour(seq, column + 1, g);
+ if (c == null)
+ {
+ return defaultColour;
+ }
+
+ if (g != null)
+ {
+ return offscreenImage.getRGB(0, 0);
+ }
+ return c.getRGB();
+ }
/**
* Answers true if feature display is turned off, or there are no features
* configured to be visible
*
* @return
*/
- boolean noFeaturesDisplayed()
+ public boolean noFeaturesDisplayed()
{
if (featureRenderer == null
|| !featureRenderer.getViewport().isShowSequenceFeatures())
import jalview.datamodel.SequenceFeature;
import jalview.datamodel.SequenceI;
import jalview.util.Comparison;
+import jalview.util.Platform;
import jalview.viewmodel.seqfeatures.FeatureRendererModel;
import java.awt.AlphaComposite;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
+import java.util.ArrayList;
import java.util.List;
public class FeatureRenderer extends FeatureRendererModel
int pady = (y1 + charHeight) - charHeight / 5;
FontMetrics fm = g.getFontMetrics();
+ char s = '\0';
for (int i = featureStart; i <= featureEnd; i++)
{
- char s = seq.getCharAt(i);
- if (Comparison.isGap(s))
+ // colourOnly is just for Overview -- no need to check this again
+
+ if (!colourOnly && Comparison.isGap(s = seq.getCharAt(i)))
{
continue;
}
g.fillRect((i - start) * charWidth, y1, charWidth, charHeight);
- if (colourOnly || !validCharWidth)
+ if (colourOnly)
+ {
+ return true;
+ }
+
+ if (!validCharWidth)
{
continue;
}
}
/**
+ *
+ * BH - this method is never called?
+ *
* Renders the sequence using the given SCORE feature colour between the given
* start and end columns. Returns true if at least one column is drawn, else
* false (the feature range does not overlap the start and end positions).
@Override
public Color findFeatureColour(SequenceI seq, int column, Graphics g)
{
- if (!av.isShowSequenceFeatures())
- {
- return null;
- }
+ // BH 2019.08.01
+ // this is already checked in FeatureColorFinder
+ // if (!av.isShowSequenceFeatures())
+ // {
+ // return null;
+ // }
// column is 'base 1' but getCharAt is an array index (ie from 0)
if (Comparison.isGap(seq.getCharAt(column - 1)))
* applies), or null if no feature is drawn in the range given.
*
* @param g
- * the graphics context to draw on (may be null if colourOnly==true)
+ * the graphics context to draw on (may be null only if t == 1 from
+ * colourOnly==true)
* @param seq
* @param start
* start column
final SequenceI seq, int start, int end, int y1,
boolean colourOnly)
{
+ // from SeqCanvas and OverviewRender
/*
* if columns are all gapped, or sequence has no features, nothing to do
*/
- ContiguousI visiblePositions = seq.findPositions(start + 1, end + 1);
- if (visiblePositions == null || !seq.getFeatures().hasFeatures())
+ ContiguousI visiblePositions;
+ if (!seq.getFeatures().hasFeatures() || (visiblePositions = seq
+ .findPositions(start + 1, end + 1)) == null)
{
return null;
}
+ int vp0 = visiblePositions.getBegin();
+ int vp1 = visiblePositions.getEnd();
+
updateFeatures();
- if (transparency != 1f && g != null)
+ if (transparency != 1f) // g cannot be null here if trans == 1f - BH // && g
+ // != null)
{
- Graphics2D g2 = (Graphics2D) g;
- g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER,
+ ((Graphics2D) g).setComposite(
+ AlphaComposite.getInstance(AlphaComposite.SRC_OVER,
transparency));
}
/*
* iterate over features in ordering of their rendering (last is on top)
*/
- for (int renderIndex = 0; renderIndex < renderOrder.length; renderIndex++)
+ for (int renderIndex = 0, n = renderOrder.length; renderIndex < n; renderIndex++)
{
String type = renderOrder[renderIndex];
- if (!showFeatureOfType(type))
+ if (!seq.hasFeatures(type) || !showFeatureOfType(type))
{
continue;
}
FeatureColourI fc = getFeatureStyle(type);
- List<SequenceFeature> overlaps = seq.getFeatures().findFeatures(
- visiblePositions.getBegin(), visiblePositions.getEnd(), type);
+ List<SequenceFeature> overlaps = seq.getFeatures().findFeatures(vp0,
+ vp1, type);
- if (fc.isSimpleColour())
+ // colourOnly (i.e. Overview) can only be here if translucent, so
+ // there is no need to check for filtering
+ if (!colourOnly && fc.isSimpleColour())
{
filterFeaturesForDisplay(overlaps);
}
- for (SequenceFeature sf : overlaps)
+ for (int i = overlaps.size(); --i >= 0;)
{
+ SequenceFeature sf = overlaps.get(i);
Color featureColour = getColor(sf, fc);
if (featureColour == null)
{
* restrict to visible positions (or if a contact feature,
* to a single position)
*/
- int visibleStart = sf.getBegin();
- if (visibleStart < visiblePositions.getBegin())
+ int sf0 = sf.getBegin();
+ int sf1 = sf.getEnd();
+ int visibleStart = sf0;
+ if (visibleStart < vp0)
{
- visibleStart = sf.isContactFeature() ? sf.getEnd()
- : visiblePositions.getBegin();
+ visibleStart = sf.isContactFeature() ? sf1 : vp0;
}
- int visibleEnd = sf.getEnd();
- if (visibleEnd > visiblePositions.getEnd())
+ int visibleEnd = sf1;
+ if (visibleEnd > vp1)
{
- visibleEnd = sf.isContactFeature() ? sf.getBegin()
- : visiblePositions.getEnd();
+ visibleEnd = sf.isContactFeature() ? sf0 : vp1;
}
int featureStartCol = seq.findIndex(visibleStart);
- int featureEndCol = sf.begin == sf.end ? featureStartCol : seq
- .findIndex(visibleEnd);
+ int featureEndCol = (sf.begin == sf.end ? featureStartCol
+ : seq.findIndex(visibleEnd));
// Color featureColour = getColour(sequenceFeature);
else
{
*/
- boolean drawn = renderFeature(g, seq,
- featureStartCol - 1,
- featureEndCol - 1, featureColour,
- start, end, y1, colourOnly);
- if (drawn)
- {
- drawnColour = featureColour;
- }
+ boolean drawn = renderFeature(g, seq, featureStartCol - 1,
+ featureEndCol - 1, featureColour, start, end, y1,
+ colourOnly);
+ if (drawn)
+ {
+ drawnColour = featureColour;
+ }
/*}*/
}
}
}
- if (transparency != 1.0f && g != null)
+ if (transparency != 1.0f)
{
/*
* reset transparency
*/
- Graphics2D g2 = (Graphics2D) g;
- g2.setComposite(NO_TRANSPARENCY);
+ ((Graphics2D) g).setComposite(NO_TRANSPARENCY);
}
return drawnColour;
findAllFeatures();
}
+ private List<SequenceFeature> overlaps = (Platform.isJS()
+ ? new ArrayList<>()
+ : null);
+
/**
* Returns the sequence feature colour rendered at the given column position,
* or null if none found. The feature of highest render order (i.e. on top) is
* colour for features enclosing a gapped column. Check for gap before calling
* if different behaviour is wanted.
*
+ * BH 2019.07.30
+ *
+ * Adds a result ArrayList to parameters in order to avoid an unnecessary
+ * construction of that for every pixel checked.
+ *
+ *
* @param seq
* @param column
* (1..)
* @return
*/
- Color findFeatureColour(SequenceI seq, int column)
+ private Color findFeatureColour(SequenceI seq, int column)
{
/*
* check for new feature added while processing
* inspect features in reverse renderOrder (the last in the array is
* displayed on top) until we find one that is rendered at the position
*/
- for (int renderIndex = renderOrder.length
- - 1; renderIndex >= 0; renderIndex--)
+ for (int renderIndex = renderOrder.length; --renderIndex >= 0;)
{
String type = renderOrder[renderIndex];
- if (!showFeatureOfType(type))
+ if (!seq.hasFeatures(type) || !showFeatureOfType(type))
{
continue;
}
- List<SequenceFeature> overlaps = seq.findFeatures(column, column,
- type);
- for (SequenceFeature sequenceFeature : overlaps)
+ if (overlaps != null)
{
- if (!featureGroupNotShown(sequenceFeature))
+ overlaps.clear();
+ }
+ List<SequenceFeature> list = seq.findFeatures(column, type, overlaps);
+ if (list.size() > 0)
+ {
+ for (int i = 0, n = list.size(); i < n; i++)
{
- Color col = getColour(sequenceFeature);
+ SequenceFeature sf = list.get(i);
+ if (featureGroupNotShown(sf))
+ {
+ continue;
+ }
+ Color col = getColour(sf);
if (col != null)
{
return col;
*/
package jalview.rest;
+import jalview.bin.ApplicationSingletonProvider;
+import jalview.bin.ApplicationSingletonProvider.ApplicationSingletonI;
import jalview.httpserver.AbstractRequestHandler;
import java.io.IOException;
import javax.servlet.http.HttpServletResponse;
/**
- * A simple handler to process (or delegate) HTTP requests on /jalview/rest
+ * A simple handler to process (or delegate) HTTP requests on /jalview/rest.
*/
public class RestHandler extends AbstractRequestHandler
+ implements ApplicationSingletonI
{
private static final String MY_PATH = "rest";
private static final String MY_NAME = "Rest";
/**
- * Singleton instance of this class
- */
- private static RestHandler instance = null;
-
- /**
* Returns the singleton instance of this class
*
* @return
{
synchronized (RestHandler.class)
{
- if (instance == null)
- {
- instance = new RestHandler();
- }
+ return (RestHandler) ApplicationSingletonProvider.getInstance(RestHandler.class);
}
- return instance;
}
/**
if (annotation.isRNA())
{
// reset colour palette
- ColourSchemeProperty.resetRnaHelicesShading();
- ColourSchemeProperty.initRnaHelicesShading(1 + (int) aamax);
+ ColourSchemes.resetRnaHelicesShading();
+ ColourSchemes.initRnaHelicesShading(1 + (int) aamax);
}
}
}
if (rna)
{
- ColourSchemeProperty.initRnaHelicesShading(1 + (int) aamax);
+ ColourSchemes.initRnaHelicesShading(1 + (int) aamax);
}
}
}
{
if (ann.isRNA())
{
- result = ColourSchemeProperty.rnaHelices[(int) aj.value];
+ result = ColourSchemes.getInstance().rnaHelices[(int) aj.value];
}
else
{
import jalview.api.AlignViewportI;
import jalview.datamodel.AnnotatedCollectionI;
-import jalview.util.ColorUtils;
-
-import java.awt.Color;
/**
* ColourSchemeProperty binds names to hardwired colourschemes and tries to deal
public class ColourSchemeProperty
{
+ private ColourSchemeProperty()
+ {
+ // requires static call to getColourScheme(...).
+ }
+
/**
* Returns a colour scheme for the given name, with which the given data may
* be coloured. The name is not case-sensitive, and may be one of
return ucs;
}
- public static Color rnaHelices[] = null;
-
- public static void initRnaHelicesShading(int n)
- {
- int j = 0;
- if (rnaHelices == null)
- {
- rnaHelices = new Color[n + 1];
- }
- else if (rnaHelices != null && rnaHelices.length <= n)
- {
- Color[] t = new Color[n + 1];
- System.arraycopy(rnaHelices, 0, t, 0, rnaHelices.length);
- j = rnaHelices.length;
- rnaHelices = t;
- }
- else
- {
- return;
- }
- // Generate random colors and store
- for (; j <= n; j++)
- {
- rnaHelices[j] = ColorUtils.generateRandomColor(Color.white);
- }
- }
-
- /**
- * delete the existing cached RNA helices colours
- */
- public static void resetRnaHelicesShading()
- {
- rnaHelices = null;
- }
-
/**
* Returns the name of the colour scheme (or "None" if it is null)
*
package jalview.schemes;
import jalview.api.AlignViewportI;
+import jalview.bin.ApplicationSingletonProvider;
+import jalview.bin.ApplicationSingletonProvider.ApplicationSingletonI;
import jalview.datamodel.AnnotatedCollectionI;
import jalview.datamodel.SequenceCollectionI;
import jalview.datamodel.SequenceI;
+import jalview.util.ColorUtils;
+import java.awt.Color;
import java.util.LinkedHashMap;
import java.util.Map;
-public class ColourSchemes
+public class ColourSchemes implements ApplicationSingletonI
{
- /*
- * singleton instance of this class
- */
- private static ColourSchemes instance = new ColourSchemes();
-
- /*
- * a map from scheme name (lower-cased) to an instance of it
- */
- private Map<String, ColourSchemeI> schemes;
/**
* Returns the singleton instance of this class
*/
public static ColourSchemes getInstance()
{
- return instance;
+ return (ColourSchemes) ApplicationSingletonProvider
+ .getInstance(ColourSchemes.class);
}
private ColourSchemes()
}
/**
+ * ColourSchemeProperty "static"
+ */
+ public Color[] rnaHelices = null;
+
+ /**
+ * delete the existing cached RNA helices colours
+ */
+ public static void resetRnaHelicesShading()
+ {
+ getInstance().rnaHelices = null;
+ }
+
+ public static void initRnaHelicesShading(int n)
+ {
+ int i = 0;
+ ColourSchemes j = getInstance();
+
+ if (j.rnaHelices == null)
+ {
+ j.rnaHelices = new Color[n + 1];
+ }
+ else if (j.rnaHelices != null && j.rnaHelices.length <= n)
+ {
+ Color[] t = new Color[n + 1];
+ System.arraycopy(j.rnaHelices, 0, t, 0, j.rnaHelices.length);
+ i = j.rnaHelices.length;
+ j.rnaHelices = t;
+ }
+ else
+ {
+ return;
+ }
+ // Generate random colors and store
+ for (; i <= n; i++)
+ {
+ j.rnaHelices[i] = ColorUtils.generateRandomColor(Color.white);
+ }
+ }
+
+ /**
+ * a map from scheme name (lower-cased) to an instance of it
+ */
+ private Map<String, ColourSchemeI> schemes;
+
+ /**
* Loads an instance of each standard or user-defined colour scheme
*
* @return
{
try
{
- registerColourScheme(
- cs.getSchemeClass().getDeclaredConstructor().newInstance());
+ registerColourScheme(cs.getSchemeClass().newInstance());
} catch (InstantiationException | IllegalAccessException e)
{
System.err.println("Error instantiating colour scheme for "
+ cs.toString() + " " + e.getMessage());
e.printStackTrace();
- } catch (ReflectiveOperationException roe)
- {
- roe.printStackTrace();
}
}
}
/**
* @deprecated Use {@link #isConserved(int[][],int,int,boolean)} instead
*/
- @Deprecated
public boolean isConserved(int[][] cons2, int col, int size)
{
- System.out.println("DEPRECATED!!!!");
return isConserved(cons2, col, size, true);
}
tot += cons2[col][mask[i]];
}
- if (tot > ((threshold * size) / 100))
+ if ((double) tot > ((threshold * size) / 100))
{
// System.out.println("True conserved "+tot+" from "+threshold+" out of
// "+size+" : "+maskstr);
{
if (minval.length() > 0)
{
- min = Float.valueOf(minval).floatValue();
+ min = new Float(minval).floatValue();
}
} catch (Exception e)
{
{
if (maxval.length() > 0)
{
- max = Float.valueOf(maxval).floatValue();
+ max = new Float(maxval).floatValue();
}
} catch (Exception e)
{
{
gcol.nextToken();
tval = gcol.nextToken();
- featureColour.setThreshold(Float.valueOf(tval).floatValue());
+ featureColour.setThreshold(new Float(tval).floatValue());
} catch (Exception e)
{
System.err.println("Couldn't parse threshold value as a float: ("
{
super(ResidueProperties.nucleotideIndex);
this.annotation = annotation;
- ColourSchemeProperty.resetRnaHelicesShading();
+ ColourSchemes.resetRnaHelicesShading();
refresh();
}
public RNAHelicesColour(AnnotatedCollectionI alignment)
{
super(ResidueProperties.nucleotideIndex);
- ColourSchemeProperty.resetRnaHelicesShading();
+ ColourSchemes.resetRnaHelicesShading();
alignmentChanged(alignment, null);
}
}
}
- ColourSchemeProperty.initRnaHelicesShading(numHelix);
+ ColourSchemes.initRnaHelicesShading(numHelix);
}
}
currentHelix = positionsToHelix.get(j);
if (currentHelix != null)
{
- currentColour = ColourSchemeProperty.rnaHelices[Integer
+ currentColour = ColourSchemes.getInstance().rnaHelices[Integer
.parseInt(currentHelix)];
}
return currentColour;
* Color.white, // R Color.white, // Y Color.white, // N Color.white, // Gap
*/
- public static String STOP = "STOP";
+ public static final String STOP = "STOP";
- public static List<String> STOP_CODONS = Arrays.asList("TGA", "TAA", "TAG");
+ public static final List<String> STOP_CODONS = Arrays.asList("TGA", "TAA",
+ "TAG");
- public static String START = "ATG";
+ public static final String START = "ATG";
// Stores residue codes/names and colours and other things
- public static Map<String, Map<String, Integer>> propHash = new Hashtable<>();
+ public static final Map<String, Map<String, Integer>> propHash = new Hashtable<>();
- public static Map<String, Integer> hydrophobic = new Hashtable<>();
+ public static final Map<String, Integer> hydrophobic = new Hashtable<>();
- public static Map<String, Integer> polar = new Hashtable<>();
+ public static final Map<String, Integer> polar = new Hashtable<>();
- public static Map<String, Integer> small = new Hashtable<>();
+ public static final Map<String, Integer> small = new Hashtable<>();
- public static Map<String, Integer> positive = new Hashtable<>();
+ public static final Map<String, Integer> positive = new Hashtable<>();
- public static Map<String, Integer> negative = new Hashtable<>();
+ public static final Map<String, Integer> negative = new Hashtable<>();
- public static Map<String, Integer> charged = new Hashtable<>();
+ public static final Map<String, Integer> charged = new Hashtable<>();
- public static Map<String, Integer> aromatic = new Hashtable<>();
+ public static final Map<String, Integer> aromatic = new Hashtable<>();
- public static Map<String, Integer> aliphatic = new Hashtable<>();
+ public static final Map<String, Integer> aliphatic = new Hashtable<>();
- public static Map<String, Integer> tiny = new Hashtable<>();
+ public static final Map<String, Integer> tiny = new Hashtable<>();
- public static Map<String, Integer> proline = new Hashtable<>();
+ public static final Map<String, Integer> proline = new Hashtable<>();
static
{
public static String codonTranslate(String lccodon)
{
- String peptide = GeneticCodes.getInstance().getStandardCodeTable()
- .translate(lccodon);
+ String peptide = GeneticCodes.getStandardCodeTable().translate(lccodon);
if ("*".equals(peptide))
{
return "STOP";
* lookup of (A-Z) alternative secondary structure symbols'
* equivalents in DSSP3 notation
*/
- private static char[] toDssp3State;
+ private final static char[] toDssp3State;
static
{
toDssp3State = new char[9]; // for 'A'-'I'; extend if needed
*/
package jalview.structure;
+import jalview.bin.ApplicationSingletonProvider;
+import jalview.bin.ApplicationSingletonProvider.ApplicationSingletonI;
import jalview.datamodel.PDBEntry;
import jalview.datamodel.PDBEntry.Type;
* @author tcofoegbu
*
*/
-public class StructureImportSettings
+public class StructureImportSettings implements ApplicationSingletonI
{
+
+ private StructureImportSettings()
+ {
+ // private singleton
+ }
+
+ private static StructureImportSettings getInstance()
+ {
+ return (StructureImportSettings) ApplicationSingletonProvider
+ .getInstance(StructureImportSettings.class);
+ }
+
/**
* set to true to add derived sequence annotations (temp factor read from
* file, or computed secondary structure) to the alignment
*/
- private static boolean visibleChainAnnotation = false;
+ private boolean visibleChainAnnotation = false;
/**
* Set true to predict secondary structure (using JMol for protein, Annotate3D
* for RNA)
*/
- private static boolean processSecStr = false;
+ private boolean processSecStr = false;
/**
* Set true (with predictSecondaryStructure=true) to predict secondary
* structure using an external service (currently Annotate3D for RNA only)
*/
- private static boolean externalSecondaryStructure = false;
+ private boolean externalSecondaryStructure = false;
- private static boolean showSeqFeatures = true;
+ private boolean showSeqFeatures = true;
public enum StructureParser
{
* Determines the default file format for structure files to be downloaded
* from the PDB sequence fetcher. Possible options include: PDB|mmCIF
*/
- private static PDBEntry.Type defaultStructureFileFormat = Type.PDB;
+ private PDBEntry.Type defaultStructureFileFormat = Type.PDB;
/**
* Determines the parser used for parsing PDB format file. Possible options
* are : JMolParser|JalveiwParser
*/
- private static StructureParser defaultPDBFileParser = StructureParser.JMOL_PARSER;
+ private StructureParser defaultPDBFileParser = StructureParser.JMOL_PARSER;
public static void addSettings(boolean addAlignmentAnnotations,
boolean processSecStr, boolean externalSecStr)
{
- StructureImportSettings.visibleChainAnnotation = addAlignmentAnnotations;
- StructureImportSettings.processSecStr = processSecStr;
- StructureImportSettings.externalSecondaryStructure = externalSecStr;
- StructureImportSettings.showSeqFeatures = true;
+ StructureImportSettings s = getInstance();
+ s.visibleChainAnnotation = addAlignmentAnnotations;
+ s.processSecStr = processSecStr;
+ s.externalSecondaryStructure = externalSecStr;
+ s.showSeqFeatures = true;
}
public static boolean isVisibleChainAnnotation()
{
- return visibleChainAnnotation;
+ return getInstance().visibleChainAnnotation;
}
public static void setVisibleChainAnnotation(
boolean visibleChainAnnotation)
{
- StructureImportSettings.visibleChainAnnotation = visibleChainAnnotation;
+ getInstance().visibleChainAnnotation = visibleChainAnnotation;
}
public static boolean isProcessSecondaryStructure()
{
- return processSecStr;
+ return getInstance().processSecStr;
}
public static void setProcessSecondaryStructure(
boolean processSecondaryStructure)
{
- StructureImportSettings.processSecStr = processSecondaryStructure;
+ getInstance().processSecStr = processSecondaryStructure;
}
public static boolean isExternalSecondaryStructure()
{
- return externalSecondaryStructure;
+ return getInstance().externalSecondaryStructure;
}
public static void setExternalSecondaryStructure(
boolean externalSecondaryStructure)
{
- StructureImportSettings.externalSecondaryStructure = externalSecondaryStructure;
+ getInstance().externalSecondaryStructure = externalSecondaryStructure;
}
public static boolean isShowSeqFeatures()
{
- return showSeqFeatures;
+ return getInstance().showSeqFeatures;
}
public static void setShowSeqFeatures(boolean showSeqFeatures)
{
- StructureImportSettings.showSeqFeatures = showSeqFeatures;
+ getInstance().showSeqFeatures = showSeqFeatures;
}
public static PDBEntry.Type getDefaultStructureFileFormat()
{
- return defaultStructureFileFormat;
+ return getInstance().defaultStructureFileFormat;
}
public static void setDefaultStructureFileFormat(
String defaultStructureFileFormat)
{
- StructureImportSettings.defaultStructureFileFormat = PDBEntry.Type
+ getInstance().defaultStructureFileFormat = PDBEntry.Type
.valueOf(defaultStructureFileFormat.toUpperCase());
}
public static String getDefaultPDBFileParser()
{
- return defaultPDBFileParser.toString();
+ return getInstance().defaultPDBFileParser.toString();
}
public static void setDefaultPDBFileParser(
StructureParser defaultPDBFileParser)
{
- StructureImportSettings.defaultPDBFileParser = defaultPDBFileParser;
+ getInstance().defaultPDBFileParser = defaultPDBFileParser;
}
public static void setDefaultPDBFileParser(String defaultPDBFileParser)
{
- StructureImportSettings.defaultPDBFileParser = StructureParser
+ getInstance().defaultPDBFileParser = StructureParser
.valueOf(defaultPDBFileParser.toUpperCase());
}
import jalview.analysis.AlignSeq;
import jalview.api.StructureSelectionManagerProvider;
+import jalview.bin.ApplicationSingletonProvider;
+import jalview.bin.ApplicationSingletonProvider.ApplicationSingletonI;
import jalview.commands.CommandI;
import jalview.commands.EditCommand;
import jalview.commands.OrderCommand;
import jalview.io.StructureFile;
import jalview.util.MappingUtils;
import jalview.util.MessageManager;
-import jalview.util.Platform;
import jalview.ws.sifts.SiftsClient;
import jalview.ws.sifts.SiftsException;
import jalview.ws.sifts.SiftsSettings;
import mc_view.PDBChain;
import mc_view.PDBfile;
-public class StructureSelectionManager
+public class StructureSelectionManager implements ApplicationSingletonI
{
public final static String NEWLINE = System.lineSeparator();
- static IdentityHashMap<StructureSelectionManagerProvider, StructureSelectionManager> instances;
-
private List<StructureMapping> mappings = new ArrayList<>();
private boolean processSecondaryStructure = false;
private List<SelectionListener> sel_listeners = new ArrayList<>();
+ /*
+ * instances of this class scoped by some context class
+ */
+ private IdentityHashMap<StructureSelectionManagerProvider, StructureSelectionManager> structureSelections;
+
+ /**
+ * Answers an instance of this class for the current application (Java or JS
+ * 'applet') scope
+ *
+ * @return
+ */
+ private static StructureSelectionManager getInstance()
+ {
+ return (StructureSelectionManager) ApplicationSingletonProvider
+ .getInstance(StructureSelectionManager.class);
+ }
+
+ /**
+ * Answers an instance of this class for the current application (Java or JS
+ * 'applet') scope, and scoped to the specified context
+ *
+ * @param context
+ * @return
+ */
+ public static StructureSelectionManager getStructureSelectionManager(
+ StructureSelectionManagerProvider context)
+ {
+ return getInstance().getInstanceForContext(context);
+ }
+
+ /**
+ * Answers an instance of this class scoped to the given context. The instance
+ * is created on the first request for the context, thereafter the same
+ * instance is returned. Note that the context may be null (this is the case
+ * when running headless without a Desktop).
+ *
+ * @param context
+ * @return
+ */
+ StructureSelectionManager getInstanceForContext(
+ StructureSelectionManagerProvider context)
+ {
+ StructureSelectionManager instance = structureSelections.get(context);
+ if (instance == null)
+ {
+ instance = new StructureSelectionManager();
+ structureSelections.put(context, instance);
+ }
+ return instance;
+ }
+
+ /**
+ * Removes the instance associated with this provider
+ *
+ * @param provider
+ */
+
+ public static void release(StructureSelectionManagerProvider provider)
+ {
+ getInstance().structureSelections.remove(provider);
+ }
+
+ /**
+ * Private constructor as all 'singleton' instances are managed here or by
+ * ApplicationSingletonProvider
+ */
+ private StructureSelectionManager()
+ {
+ structureSelections = new IdentityHashMap<>();
+ }
+
/**
* @return true if will try to use external services for processing secondary
* structure
|| pdbIdFileName.containsKey(idOrFile);
}
- private static StructureSelectionManager nullProvider = null;
-
- public static StructureSelectionManager getStructureSelectionManager(
- StructureSelectionManagerProvider context)
- {
- if (context == null)
- {
- if (nullProvider == null)
- {
- if (instances != null)
- {
- throw new Error(MessageManager.getString(
- "error.implementation_error_structure_selection_manager_null"),
- new NullPointerException(MessageManager
- .getString("exception.ssm_context_is_null")));
- }
- else
- {
- nullProvider = new StructureSelectionManager();
- }
- return nullProvider;
- }
- }
- if (instances == null)
- {
- instances = new java.util.IdentityHashMap<>();
- }
- StructureSelectionManager instance = instances.get(context);
- if (instance == null)
- {
- if (nullProvider != null)
- {
- instance = nullProvider;
- }
- else
- {
- instance = new StructureSelectionManager();
- }
- instances.put(context, instance);
- }
- return instance;
- }
-
/**
* flag controlling whether SeqMappings are relayed from received sequence
* mouse over events to other sequences
return relaySeqMappings;
}
- Vector listeners = new Vector();
+ Vector<Object> listeners = new Vector<>();
/**
* register a listener for alignment sequence mouseover events
* Import structure data and register a structure mapping for broadcasting
* colouring, mouseovers and selection events (convenience wrapper).
*
+ * This is the standard entry point.
+ *
* @param sequence
* - one or more sequences to be mapped to pdbFile
* @param targetChains
* broadcasting colouring, mouseovers and selection events (convenience
* wrapper).
*
+ *
+ *
* @param forStructureView
- * when true, record the mapping for use in mouseOvers
+ * when true (testng only), record the mapping for use in mouseOvers
+ * (testng only)
* @param sequence
* - one or more sequences to be mapped to pdbFile
* @param targetChains
* mapping operation
* @return null or the structure data parsed as a pdb file
*/
- synchronized public StructureFile computeMapping(
+ synchronized private StructureFile computeMapping(
boolean forStructureView, SequenceI[] sequenceArray,
String[] targetChainIds, String pdbFile, DataSourceType sourceType,
IProgressIndicator progress)
{
ds = ds.getDatasetSequence();
}
- ;
if (ds.getAnnotation() != null)
{
for (AlignmentAnnotation ala : ds.getAnnotation())
StringBuilder sb = new StringBuilder(64);
for (StructureMapping sm : mappings)
{
- if (Platform.pathEquals(sm.pdbfile, pdbfile)
- && seqs.contains(sm.sequence))
+ if (sm.pdbfile.equals(pdbfile) && seqs.contains(sm.sequence))
{
sb.append(sm.mappingDetails);
sb.append(NEWLINE);
}
/**
- * Resets this object to its initial state by removing all registered
- * listeners, codon mappings, PDB file mappings
+ * Reset this object to its initial state by removing all registered
+ * listeners, codon mappings, PDB file mappings.
+ *
+ * Called only by Desktop and testng.
+ *
*/
public void resetAll()
{
- if (mappings != null)
- {
- mappings.clear();
- }
- if (seqmappings != null)
- {
- seqmappings.clear();
- }
- if (sel_listeners != null)
- {
- sel_listeners.clear();
- }
- if (listeners != null)
- {
- listeners.clear();
- }
- if (commandListeners != null)
- {
- commandListeners.clear();
- }
- if (view_listeners != null)
- {
- view_listeners.clear();
- }
- if (pdbFileNameId != null)
- {
- pdbFileNameId.clear();
- }
- if (pdbIdFileName != null)
- {
- pdbIdFileName.clear();
- }
+ mappings.clear();
+ seqmappings.clear();
+ sel_listeners.clear();
+ listeners.clear();
+ commandListeners.clear();
+ view_listeners.clear();
+ pdbFileNameId.clear();
+ pdbIdFileName.clear();
}
public void addSelectionListener(SelectionListener selecter)
{
slis.viewPosition(startRes, endRes, startSeq, endSeq, source);
}
- ;
}
}
}
-
- /**
- * release all references associated with this manager provider
- *
- * @param jalviewLite
- */
- public static void release(StructureSelectionManagerProvider jalviewLite)
- {
- // synchronized (instances)
- {
- if (instances == null)
- {
- return;
- }
- StructureSelectionManager mnger = (instances.get(jalviewLite));
- if (mnger != null)
- {
- instances.remove(jalviewLite);
- try
- {
- /* bsoares 2019-03-20 finalize deprecated, no apparent external
- * resources to close
- */
- // mnger.finalize();
- } catch (Throwable x)
- {
- }
- }
- }
- }
-
+
public void registerPDBEntry(PDBEntry pdbentry)
{
if (pdbentry.getFile() != null
{ Integer.valueOf(pe).toString() }));
}
final String nullChain = "TheNullChain";
- List<SequenceI> s = new ArrayList<SequenceI>();
- List<String> c = new ArrayList<String>();
+ List<SequenceI> s = new ArrayList<>();
+ List<String> c = new ArrayList<>();
if (getChains() == null)
{
setChains(new String[getPdbCount()][]);
public synchronized PDBEntry[] addSequenceAndChain(PDBEntry[] pdbe,
SequenceI[][] seq, String[][] chns)
{
- List<PDBEntry> v = new ArrayList<PDBEntry>();
- List<int[]> rtn = new ArrayList<int[]>();
+ List<PDBEntry> v = new ArrayList<>();
+ List<int[]> rtn = new ArrayList<>();
for (int i = 0; i < getPdbCount(); i++)
{
v.add(getPdbEntry(i));
}
/**
- * Returns a readable description of all mappings for the wrapped pdbfile to
- * any mapped sequences
*
- * @param pdbfile
- * @param seqs
- * @return
+ * @return a readable description of all mappings for the wrapped pdbfile to
+ * any mapped sequences
+ *
*/
public String printMappings()
{
package jalview.urls;
+import jalview.bin.ApplicationSingletonProvider;
+import jalview.bin.ApplicationSingletonProvider.ApplicationSingletonI;
+
/**
* Holds settings for identifiers.org e.g. url, download location
- *
- * @author $author$
- * @version $Revision$
*/
-public class IdOrgSettings
+public class IdOrgSettings implements ApplicationSingletonI
{
- private static String url;
+ private String url;
- private static String location;
+ private String location;
+
+ private static IdOrgSettings getInstance()
+ {
+ return (IdOrgSettings) ApplicationSingletonProvider
+ .getInstance(IdOrgSettings.class);
+ }
public static void setUrl(String seturl)
{
- url = seturl;
+ getInstance().url = seturl;
}
public static void setDownloadLocation(String setloc)
{
- location = setloc;
+ getInstance().location = setloc;
}
public static String getUrl()
{
- return url;
+ return getInstance().url;
}
public static String getDownloadLocation()
{
- return location;
+ return getInstance().location;
+ }
+
+ private IdOrgSettings()
+ {
+ // private singleton
}
}
{
// NOTE: THIS WILL FAIL IN SWINGJS BECAUSE IT INVOLVES A FILE READER
+ System.out.println("IDentifiersURL " + idFileName);
FileReader reader = new FileReader(idFileName);
String key = "";
Map<String, Object> obj = (Map<String, Object>) JSONUtils.parse(reader);
}
} catch (IOException | ParseException e)
{
- // unnecessary e.printStackTrace();
+ // unnecessary
+ e.printStackTrace();
// Note how in JavaScript we can grab the first bytes from any file reader.
// Typical report here is "NetworkError" because the file does not exist.
// "https://." is coming from System.getProperty("user.home"), but this could
import java.lang.reflect.Method;
/**
- * BrowserLauncher is a class that provides one static method, openURL, which
- * opens the default web browser for the current user of the system to the given
- * URL. It may support other protocols depending on the system -- mailto, ftp,
+ * BrowserLauncher is a class that provides two static methods:
+ *
+ * openURL(String url), which opens the default web browser for the current user
+ * of the system to the given URL, and
+ *
+ * resetBrowser(), which allows switching browsers in Java.
+ *
+ * openURL may support other protocols depending on the system -- mailto, ftp,
* etc. -- but that has not been rigorously tested and is not guaranteed to
* work.
* <p>
* "mailto:ejalbert@cs.stanford.edu">ejalbert@cs.stanford.edu</a>)
* @version 1.4b1 (Released June 20, 2001)
*/
+/*
+ *
+ * SwingJS note: Do not use methods in this class directly. Use
+ *
+ * Platform.openURL(String url) only.
+ *
+ * JavaScript does not see this class.
+ */
public class BrowserLauncher
{
/**
private static boolean loadedWithoutErrors;
/** The com.apple.mrj.MRJFileUtils class */
- private static Class mrjFileUtilsClass;
+ private static Class<?> mrjFileUtilsClass;
/** The com.apple.mrj.MRJOSType class */
- private static Class mrjOSTypeClass;
+ private static Class<?> mrjOSTypeClass;
/** The com.apple.MacOS.AEDesc class */
- private static Class aeDescClass;
+ private static Class<?> aeDescClass;
/** The <init>(int) method of com.apple.MacOS.AETarget */
- private static Constructor aeTargetConstructor;
+ private static Constructor<?> aeTargetConstructor;
/** The <init>(int, int, int) method of com.apple.MacOS.AppleEvent */
- private static Constructor appleEventConstructor;
+ private static Constructor<?> appleEventConstructor;
/** The <init>(String) method of com.apple.MacOS.AEDesc */
- private static Constructor aeDescConstructor;
+ private static Constructor<?> aeDescConstructor;
/** The findFolder method of com.apple.mrj.MRJFileUtils */
private static Method findFolder;
loadedWithoutErrors = true;
- if (!Platform.isJS())
- /**
- * Java only
- *
- * @j2sIgnore
- *
- */
- {
String osName = System.getProperty("os.name");
if (osName.startsWith("Mac OS"))
{ // if we haven't hit any errors yet
loadedWithoutErrors = loadClasses();
}
- }
}
/**
private static boolean loadClasses()
{
- if (!Platform.isJS())
- /**
- * Java only
- *
- * @j2sIgnore
- *
- */
- {
switch (jvm)
{
case MRJ_2_0:
try
{
- Class aeTargetClass = Class.forName("com.apple.MacOS.AETarget");
- Class osUtilsClass = Class.forName("com.apple.MacOS.OSUtils");
- Class appleEventClass = Class.forName("com.apple.MacOS.AppleEvent");
- Class aeClass = Class.forName("com.apple.MacOS.ae");
+ Class<?> aeTargetClass = Class.forName("com.apple.MacOS.AETarget");
+ Class<?> osUtilsClass = Class.forName("com.apple.MacOS.OSUtils");
+ Class<?> appleEventClass = Class
+ .forName("com.apple.MacOS.AppleEvent");
+ Class<?> aeClass = Class.forName("com.apple.MacOS.ae");
aeDescClass = Class.forName("com.apple.MacOS.AEDesc");
aeTargetConstructor = aeTargetClass
try
{
- Class linker = Class.forName("com.apple.mrj.jdirect.Linker");
- Constructor constructor = linker
+ Class<?> linker = Class.forName("com.apple.mrj.jdirect.Linker");
+ Constructor<?> constructor = linker
.getConstructor(new Class[]
{ Class.class });
linkage = constructor
break;
}
- }
return true;
}
*/
private static Object locateBrowser()
{
- if (!Platform.isJS())
- /**
- * Java only
- *
- * @j2sIgnore
- *
- */
- {
if (browser != null)
{
return browser;
break;
}
-
- }
-
return browser;
-
}
/**
*/
public static void openURL(String url) throws IOException
{
-
if (Platform.isJS())
{
Platform.openURL(url);
return;
}
- else
- /**
- * Java only
- *
- * @j2sIgnore
- */
- {
-
if (!loadedWithoutErrors)
{
throw new IOException(MessageManager
break;
default:
-
// This should never occur, but if it does, we'll try the simplest thing
// possible
Runtime.getRuntime().exec(new String[] { (String) browser, url });
-
break;
}
- }
}
}
}
+ public static int bleachColourInt(int colour, float bleachFactor)
+ {
+ if (bleachFactor >= 1f)
+ {
+ return -1;// Color.WHITE;
+ }
+ if (bleachFactor <= -1f)
+ {
+ return 0xFF000000;// Color.BLACK;
+ }
+ if (bleachFactor == 0f)
+ {
+ return colour;
+ }
+
+ int red = (colour >> 16) & 0xFF;// getRed();
+ int green = (colour >> 8) & 0xFF;// colour.getGreen();
+ int blue = colour & 0xFF;// .getBlue();
+
+ if (bleachFactor > 0)
+ {
+ red += (255 - red) * bleachFactor;
+ green += (255 - green) * bleachFactor;
+ blue += (255 - blue) * bleachFactor;
+ }
+ else
+ {
+ float factor = 1 + bleachFactor;
+ red *= factor;
+ green *= factor;
+ blue *= factor;
+ }
+ return 0xFF000000 | (red << 16) | (green << 8) | blue;// new Color(red,
+ // green, blue);
+ }
+
/**
* Parses a string into a Color, where the accepted formats are
* <ul>
col = new Color(value);
} catch (NumberFormatException ex)
{
+ col = Platform.getColorFromName(colour);
}
if (col == null)
*/
public static Color getAWTColorFromName(String name)
{
- if (name == null)
- {
- return null;
- }
- Color col = null;
- name = name.toLowerCase();
-
- // or make a static map; or use reflection on the field name
- switch (name)
- {
- case "black":
- col = Color.black;
- break;
- case "blue":
- col = Color.blue;
- break;
- case "cyan":
- col = Color.cyan;
- break;
- case "darkgray":
- col = Color.darkGray;
- break;
- case "gray":
- col = Color.gray;
- break;
- case "green":
- col = Color.green;
- break;
- case "lightgray":
- col = Color.lightGray;
- break;
- case "magenta":
- col = Color.magenta;
- break;
- case "orange":
- col = Color.orange;
- break;
- case "pink":
- col = Color.pink;
- break;
- case "red":
- col = Color.red;
- break;
- case "white":
- col = Color.white;
- break;
- case "yellow":
- col = Color.yellow;
- break;
- }
-
- return col;
+ return Platform.getColorFromName(name); // BH 2019 -- allows for wide range
+ // of JavaScript colors (for
+ // JavaScript only)
}
}
import java.util.HashSet;
import java.util.List;
import java.util.Map;
-import java.util.Set;
import com.stevesoft.pat.Regex;
}
// BH TODO (what?)
- HashSet<String> srcs = new HashSet<String>();
+ HashSet<String> srcs = new HashSet<>();
for (String src : sources)
{
srcs.add(src.toUpperCase());
}
int nrefs = dbrefs.size();
- List<DBRefEntry> res = new ArrayList<DBRefEntry>();
+ List<DBRefEntry> res = new ArrayList<>();
for (int ib = 0; ib < nrefs; ib++)
{
DBRefEntry dbr = dbrefs.get(ib);
* @return
*/
public static List<DBRefEntry> searchRefs(List<DBRefEntry> refs, String accId) {
- List<DBRefEntry> rfs = new ArrayList<DBRefEntry>();
+ List<DBRefEntry> rfs = new ArrayList<>();
if (refs == null || accId == null) {
return rfs;
}
* @return
*/
static List<DBRefEntry> searchRefs(List<DBRefEntry> refs, DBRefEntry entry, DbRefComp comparator, int mode) {
- List<DBRefEntry> rfs = new ArrayList<DBRefEntry>();
+ List<DBRefEntry> rfs = new ArrayList<>();
if (refs == null || entry == null) {
return rfs;
}
return matches;
}
+ private static Regex PARSE_REGEX;
+
+ private static Regex getParseRegex()
+ {
+ return (PARSE_REGEX == null ? PARSE_REGEX = Platform.newRegex(
+ "([0-9][0-9A-Za-z]{3})\\s*(.?)\\s*;\\s*([0-9]+)-([0-9]+)", null)
+ : PARSE_REGEX);
+ }
/**
* Parses a DBRefEntry and adds it to the sequence, also a PDBEntry if the
* database is PDB.
/*
* Check for PFAM style stockhom PDB accession id citation e.g. "1WRI A; 7-80;"
*/
- Regex r = new com.stevesoft.pat.Regex("([0-9][0-9A-Za-z]{3})\\s*(.?)\\s*;\\s*([0-9]+)-([0-9]+)");
+ Regex r = getParseRegex();
if (r.search(acn.trim())) {
String pdbid = r.stringMatched(1);
String chaincode = r.stringMatched(2);
* @return
*/
public static List<DBRefEntry> searchRefsForSource(List<DBRefEntry> dbRefs, String source) {
- List<DBRefEntry> matches = new ArrayList<DBRefEntry>();
+ List<DBRefEntry> matches = new ArrayList<>();
if (dbRefs != null && source != null) {
for (DBRefEntry dbref : dbRefs) {
if (source.equalsIgnoreCase(dbref.getSource())) {
bsSelect.set(0, dbrefs.size());
if (!selectRefsBS(dbrefs, isProtein ? DBRefSource.PROTEIN_MASK : DBRefSource.DNA_CODING_MASK, bsSelect))
- return;
+ {
+ return;
+ }
// selfs.addAll(selfArray);
// }
DBRefEntry p = pr.get(ip);
for (int i = bsSelect.nextSetBit(0); i >= 0; i = bsSelect.nextSetBit(i + 1)) {
if (dbrefs.get(i) == p)
- bsSelect.clear(i);
+ {
+ bsSelect.clear(i);
+ }
}
// while (selfs.contains(p))
// {
// TODO: promote transcript refs ??
}
if (keys == 0 || !selectRefsBS(dbrefs, keys, bsSelect))
- return;
+ {
+ return;
+ }
// if (candidates != null)
{
for (int ic = bsSelect.nextSetBit(0); ic >= 0; ic = bsSelect.nextSetBit(ic + 1))
*/
package jalview.util;
-import jalview.datamodel.Sequence;
import jalview.datamodel.SequenceI;
import java.util.Hashtable;
+import com.stevesoft.pat.Regex;
+
+/**
+ * This class is not implemented because Preferences never puts anything in
+ * groupURLLinks.
+ *
+ * @author hansonr
+ *
+ */
public class GroupUrlLink
{
+ @SuppressWarnings("serial")
public class UrlStringTooLongException extends Exception
{
public UrlStringTooLongException(int lng)
private String invalidMessage = null;
/**
- * tokens that can be replaced in the URL.
- */
- private static String[] tokens;
-
- /**
* position of each token (which can appear once only) in the url
*/
private int[] segs;
* contains tokens in the order they appear in the URL template.
*/
private String[] mtch;
- static
- {
- if (tokens == null)
- {
- tokens = new String[] { "SEQUENCEIDS", "SEQUENCES", "DATASETID" };
- }
- }
-
- /**
- * test for GroupURLType bitfield (with default tokens)
- */
- public static final int SEQUENCEIDS = 1;
-
- /**
- * test for GroupURLType bitfield (with default tokens)
- */
- public static final int SEQUENCES = 2;
/**
- * test for GroupURLType bitfield (with default tokens)
+ * tokens that can be replaced in the URL.
*/
- public static final int DATASETID = 4;
-
+ private static final String[] tokens = new String[] { "SEQUENCEIDS",
+ "SEQUENCES", "DATASETID" };
+
+ // /**
+ // * test for GroupURLType bitfield (with default tokens)
+ // */
+ // private static final int SEQUENCEIDS = 1;
+ //
+ // /**
+ // * test for GroupURLType bitfield (with default tokens)
+ // */
+ // private static final int SEQUENCES = 2;
+ //
+ // /**
+ // * test for GroupURLType bitfield (with default tokens)
+ // */
+ // private static final int DATASETID = 4;
+ //
// private int idseg = -1, seqseg = -1;
/**
+ *
+ * called by PopupMenu.buildGroupURLMenu()
+ *
* parse the given linkString of the form '<label>|<url>|separator
* char[|optional sequence separator char]' into parts. url may contain a
* string $SEQUENCEIDS<=optional regex=>$ where <=optional regex=> must be of
regexReplace[pass] = link.substring(ptok[pass] + mlength, p);
try
{
- com.stevesoft.pat.Regex rg = com.stevesoft.pat.Regex
- .perlCode("/" + regexReplace[pass] + "/");
+ Regex rg = Platform.newRegexPerl("/" + regexReplace[pass] + "/");
if (rg == null)
{
invalidMessage = "Invalid Regular Expression : '"
}
/**
+ *
+ * called by PopupMenu.addShowLink()
+ *
* @return the url_prefix
*/
public String getUrl_prefix()
}
/**
+ * called by PopupMenu.buildGroupURLMenu()
+ *
* @return the target
*/
public String getTarget()
}
/**
+ *
+ * called by PopupMenu.buildGroupURLMenu()
+ *
* @return the label
*/
public String getLabel()
}
/**
- * @return the sequence ID regexReplace
- */
- public String getIDRegexReplace()
- {
- return _replaceFor(tokens[0]);
- }
-
- private String _replaceFor(String token)
- {
- for (int i = 0; i < mtch.length; i++)
- {
- if (segs[i] > -1 && mtch[i].equals(token))
- {
- return regexReplace[i];
- }
- }
- return null;
- }
-
- /**
- * @return the sequence ID regexReplace
- */
- public String getSeqRegexReplace()
- {
- return _replaceFor(tokens[1]);
- }
-
- /**
+ *
+ * called by PopupMenu.buildGroupURLMenu()
+ *
* @return the invalidMessage
*/
public String getInvalidMessage()
}
/**
+ * called by PopupMenu.buildGroupURLMenu()
+ *
* Check if URL string was parsed properly.
*
* @return boolean - if false then <code>getInvalidMessage</code> returns an
}
/**
- * return one or more URL strings by applying regex to the given idstring
*
- * @param idstrings
- * array of id strings to pass to service
- * @param seqstrings
- * array of seq strings to pass to service
+ * called by PopupMenu.buildGroupURLMenu()
+ *
+ * This method is never called, because PopupMenu.buildGroupMenu() is never
+ * called. It relates to the popup menu for the idPanel.
+ *
+ * @param ids
+ * @param seqstr
+ * @param string
* @param onlyIfMatches
- * - when true url strings are only made if regex is defined and
- * matches for all qualified tokens in groupURL - TODO: consider if
- * onlyIfMatches is really a useful parameter!
- * @return null or Object[] { int[] { number of seqs substituted},boolean[] {
- * which seqs were substituted }, StringBuffer[] { substituted lists
- * for each token }, String[] { url } }
+ * @return URL stub objects ready to pass to constructFrom in the form of
+ * Object[] { int[], boolean[], Hashtable<String, String[]>,
+ * boolean[] }
* @throws UrlStringTooLongException
*/
- public Object[] makeUrls(String[] idstrings, String[] seqstrings,
- String dsstring, boolean onlyIfMatches)
- throws UrlStringTooLongException
+ public Object[] makeUrlStubs(String[] ids, String[] seqstr, String string,
+ boolean onlyIfMatches) throws UrlStringTooLongException
{
- Hashtable rstrings = replacementArgs(idstrings, seqstrings, dsstring);
- return makeUrls(rstrings, onlyIfMatches);
+ Hashtable<String, String[]> rstrings = replacementArgs(ids, seqstr,
+ string);
+ boolean createFullURL = false;
+ Object[] stubs = makeUrlsIf(createFullURL, rstrings, onlyIfMatches);
+ // stubs is just { int[] boolean[] }
+ return stubs == null ? null
+ : new Object[]
+ { stubs[0], stubs[1], rstrings,
+ new boolean[]
+ { onlyIfMatches } }; // int[] boolean[] Hashtable boolean[]
}
/**
* @param dsstring
* @return
*/
- private Hashtable replacementArgs(String[] idstrings, String[] seqstrings,
- String dsstring)
+ private Hashtable<String, String[]> replacementArgs(String[] idstrings,
+ String[] seqstrings, String dsstring)
{
- Hashtable rstrings = new Hashtable();
+ Hashtable<String, String[]> rstrings = new Hashtable<>();
rstrings.put(tokens[0], idstrings);
rstrings.put(tokens[1], seqstrings);
rstrings.put(tokens[2], new String[] { dsstring });
return rstrings;
}
- public Object[] makeUrls(Hashtable repstrings, boolean onlyIfMatches)
- throws UrlStringTooLongException
- {
- return makeUrlsIf(true, repstrings, onlyIfMatches);
- }
-
/**
+ * Called from PopupMenu.addShowLink action listener
*
- * @param ids
- * @param seqstr
- * @param string
- * @param b
- * @return URL stub objects ready to pass to constructFrom
- * @throws UrlStringTooLongException
- */
- public Object[] makeUrlStubs(String[] ids, String[] seqstr, String string,
- boolean b) throws UrlStringTooLongException
- {
- Hashtable rstrings = replacementArgs(ids, seqstr, string);
- Object[] stubs = makeUrlsIf(false, rstrings, b);
- if (stubs != null)
- {
- return new Object[] { stubs[0], stubs[1], rstrings,
- new boolean[]
- { b } };
- }
- // TODO Auto-generated method stub
- return null;
- }
-
- /**
* generate the URL for the given URL stub object array returned from
* makeUrlStubs
*
* @param stubs
- * @return URL string.
+ * Object[] { int[] { number of matches seqs }, boolean[] { which
+ * matched }, (if createFullUrl also has StringBuffer[] { segment
+ * generated from inputs that is used in URL }, String[] { url })}
+ * @return URL string
* @throws UrlStringTooLongException
*/
+ @SuppressWarnings("unchecked")
public String constructFrom(Object[] stubs)
throws UrlStringTooLongException
{
- Object[] results = makeUrlsIf(true, (Hashtable) stubs[2],
- ((boolean[]) stubs[3])[0]);
- return ((String[]) results[3])[0];
+ // Object[] {
+ // int[] { number of matches seqs },
+ // boolean[] { which matched }
+ // }
+
+ boolean createFullURL = true;
+ Hashtable<String, String[]> repstrings = (Hashtable<String, String[]>) stubs[2];
+ boolean onlyIfMatches = ((boolean[]) stubs[3])[0];
+ String url = ((String[]) makeUrlsIf(createFullURL, repstrings,
+ onlyIfMatches)[3])[0];
+ return url;
}
/**
* }, String[] { url })}
* @throws UrlStringTooLongException
*/
- protected Object[] makeUrlsIf(boolean createFullUrl, Hashtable repstrings,
+ private Object[] makeUrlsIf(boolean createFullUrl,
+ Hashtable<String, String[]> repstrings,
boolean onlyIfMatches) throws UrlStringTooLongException
{
int pass = 0;
int mins = 0, maxs = 0; // allowed two values, 1 or n-sequences.
for (int i = 0; i < mtch.length; i++)
{
- idseq[i] = (String[]) repstrings.get(mtch[i]);
+ idseq[i] = repstrings.get(mtch[i]);
if (idseq[i].length >= 1)
{
if (mins == 0 && idseq[i].length == 1)
// iterate through input, collating segments to be inserted into url
StringBuffer matched[] = new StringBuffer[idseq.length];
// and precompile regexes
- com.stevesoft.pat.Regex[] rgxs = new com.stevesoft.pat.Regex[matched.length];
+ Regex[] rgxs = new Regex[matched.length];
for (pass = 0; pass < matched.length; pass++)
{
matched[pass] = new StringBuffer();
if (regexReplace[pass] != null)
{
- rgxs[pass] = com.stevesoft.pat.Regex
- .perlCode("/" + regexReplace[pass] + "/");
+ rgxs[pass] = Platform.newRegexPerl("/" + regexReplace[pass] + "/");
}
else
{
{
// just return the essential info about what the URL would be generated
// from
- return new Object[] { new int[] { seqsmatched }, thismatched };
+ return new Object[] { new int[] { seqsmatched }, thismatched // boolean[]
+ };
}
// otherwise, create the URL completely.
}
}
- return new Object[] { new int[] { seqsmatched }, thismatched, matched,
+ // full return
+ return new Object[] { new int[] { seqsmatched }, thismatched, // boolean[]
+ matched, // StringBuffer[]
new String[]
{ submiturl.toString() } };
}
/**
*
+ * Called by PopupMenu.addShowLinks()
+ *
* @param urlstub
* @return number of distinct sequence (id or seuqence) replacements predicted
* for this stub
}
/**
+ * called by PopupMenu.buildGroupURLMenu()
+ *
* get token types present in this url as a bitfield indicating presence of
* each token from tokens (LSB->MSB).
*
return r;
}
+ /**
+ * called by PopupMenu.buildGroupURLMenu()
+ *
+ * covenience method to generate the id and sequence string vector from a set
+ * of seuqences using each sequence's getName() and getSequenceAsString()
+ * method
+ *
+ * @param seqs
+ * @return String[][] {{sequence ids},{sequence strings}}
+ */
+ public static String[][] formStrings(SequenceI[] seqs)
+ {
+ String[][] idset = new String[2][seqs.length];
+ for (int i = 0; i < seqs.length; i++)
+ {
+ idset[0][i] = seqs[i].getName();
+ idset[1][i] = seqs[i].getSequenceAsString();
+ }
+ return idset;
+ }
+
+ // commented out test code
+ //
+ // /**
+ // *
+ // * @param argv
+ // * @j2sIgnore
+ // */
+ // public static void main(String argv[])
+ // {
+ // // note - JAL-1383 - these services are all dead
+ // String[] links = new String[] {
+ // "EnVision2|IDS|http://www.ebi.ac.uk/enfin-srv/envision2/pages/linkin.jsf?workflow=Enfin%20Default%20Workflow&datasetName=linkInDatasetFromJalview&input=$SEQUENCEIDS$&inputType=0|,",
+ // "EnVision2|Seqs|http://www.ebi.ac.uk/enfin-srv/envision2/pages/linkin.jsf?workflow=Enfin%20Default%20Workflow&datasetName=linkInDatasetFromJalview&input=$SEQUENCES$&inputType=1|,",
+ // "EnVision2|IDS|http://www.ebi.ac.uk/enfin-srv/envision2/pages/linkin.jsf?workflow=Enfin%20Default%20Workflow&datasetName=$DATASETID$&input=$SEQUENCEIDS$&inputType=0|,",
+ // "EnVision2|Seqs|http://www.ebi.ac.uk/enfin-srv/envision2/pages/linkin.jsf?workflow=Enfin%20Default%20Workflow&datasetName=$DATASETID$&input=$SEQUENCES$&inputType=1|,",
+ // "EnVision2|IDS|http://www.ebi.ac.uk/enfin-srv/envision2/pages/linkin.jsf?workflow=$SEQUENCEIDS$&datasetName=linkInDatasetFromJalview&input=$SEQUENCEIDS$&inputType=0|,",
+ // "EnVision2|Seqs|http://www.ebi.ac.uk/enfin-srv/envision2/pages/linkin.jsf?workflow=$SEQUENCEIDS$&datasetName=$DATASETID$&input=$SEQUENCES$&inputType=1|,",
+ // "EnVision2
+ // Seqs|http://www.ebi.ac.uk/enfin-srv/envision2/pages/linkin.jsf?workflow=Default&datasetName=JalviewSeqs$DATASETID$&input=$SEQUENCES=/([a-zA-Z]+)/=$&inputType=1|,",
+ // "EnVision2
+ // Seqs|http://www.ebi.ac.uk/enfin-srv/envision2/pages/linkin.jsf?workflow=Default&datasetName=JalviewSeqs$DATASETID$&input=$SEQUENCES=/[A-Za-z]+/=$&inputType=1|,"
+ // /*
+ // *
+ // http://www.ebi.ac.uk/enfin-srv/envision2/pages/linkin.jsf?input=P38389,P38398
+ // * &inputType=0&workflow=Enfin%20Default%20Workflow&datasetName=
+ // * linkInDatasetFromPRIDE
+ // */
+ // };
+ //
+ // SequenceI[] seqs = new SequenceI[] {
+ // new Sequence("StupidLabel:gi|9234|pdb|102L|A",
+ // "asdiasdpasdpadpwpadasdpaspdw"), };
+ // String[][] seqsandids = formStrings(seqs);
+ // for (int i = 0; i < links.length; i++)
+ // {
+ // GroupUrlLink ul = new GroupUrlLink(links[i]);
+ // if (ul.isValid())
+ // {
+ // System.out.println("\n\n\n");
+ // System.out.println(
+ // "Link " + i + " " + links[i] + " : " + ul.toString());
+ // System.out.println(" pref : " + ul.getUrl_prefix());
+ // System.out.println(" IdReplace : " + ul.getIDRegexReplace());
+ // System.out.println(" SeqReplace : " + ul.getSeqRegexReplace());
+ // System.out.println(" Suffixes : " + ul.getUrl_suffix());
+ //
+ // System.out.println(
+ // "<insert input id and sequence strings here> Without onlyIfMatches:");
+ // Object[] urls;
+ // try
+ // {
+ // urls = ul.makeUrls(seqsandids[0], seqsandids[1], "mydataset",
+ // false);
+ // testUrls(ul, seqsandids, urls);
+ // } catch (UrlStringTooLongException ex)
+ // {
+ // System.out.println("too long exception " + ex);
+ // }
+ // System.out.println(
+ // "<insert input id and sequence strings here> With onlyIfMatches set:");
+ // try
+ // {
+ // urls = ul.makeUrls(seqsandids[0], seqsandids[1], "mydataset",
+ // true);
+ // testUrls(ul, seqsandids, urls);
+ // } catch (UrlStringTooLongException ex)
+ // {
+ // System.out.println("too long exception " + ex);
+ // }
+ // }
+ // else
+ // {
+ // System.err.println("Invalid URLLink : " + links[i] + " : "
+ // + ul.getInvalidMessage());
+ // }
+ // }
+ // }
+ // /**
+ // * @return the sequence ID regexReplace
+ // */
+ // private String getIDRegexReplace()
+ // {
+ // String token = tokens[0];
+ // for (int i = 0; i < mtch.length; i++)
+ // {
+ // if (segs[i] > -1 && mtch[i].equals(token))
+ // {
+ // return regexReplace[i];
+ // }
+ // }
+ // return null;
+ // }
+ //
+ // /**
+ // * @return the sequence ID regexReplace
+ // */
+ // private String getSeqRegexReplace()
+ // {
+ // return _replaceFor(tokens[1]);
+ // }
+ //
+ // /**
+ // * report stats about the generated url string given an input set
+ // *
+ // * @param ul
+ // * @param idstring
+ // * @param url
+ // */
+ // private static void testUrls(GroupUrlLink ul, String[][] idstring,
+ // Object[] url)
+ // {
+ //
+ // if (url == null)
+ // {
+ // System.out.println("Created NO urls.");
+ // }
+ // else
+ // {
+ // System.out.println("Created a url from " + ((int[]) url[0])[0]
+ // + "out of " + idstring[0].length + " sequences.");
+ // System.out.println("Sequences that did not match:");
+ // for (int sq = 0; sq < idstring[0].length; sq++)
+ // {
+ // if (!((boolean[]) url[1])[sq])
+ // {
+ // System.out.println("Seq " + sq + ": " + idstring[0][sq] + "\t: "
+ // + idstring[1][sq]);
+ // }
+ // }
+ // System.out.println("Sequences that DID match:");
+ // for (int sq = 0; sq < idstring[0].length; sq++)
+ // {
+ // if (((boolean[]) url[1])[sq])
+ // {
+ // System.out.println("Seq " + sq + ": " + idstring[0][sq] + "\t: "
+ // + idstring[1][sq]);
+ // }
+ // }
+ // System.out.println("The generated URL:");
+ // System.out.println(((String[]) url[3])[0]);
+ // }
+ // }
+ //
+ // public void setLabel(String newlabel)
+ // {
+ // this.label = newlabel;
+ // }
+ // /**
+ // * return one or more URL strings by applying regex to the given idstring
+ // *
+ // * @param idstrings
+ // * array of id strings to pass to service
+ // * @param seqstrings
+ // * array of seq strings to pass to service
+ // * @param onlyIfMatches
+ // * - when true url strings are only made if regex is defined and
+ // * matches for all qualified tokens in groupURL - TODO: consider if
+ // * onlyIfMatches is really a useful parameter!
+ // * @return null or Object[] { int[] { number of seqs substituted},boolean[]
+ // {
+ // * which seqs were substituted }, StringBuffer[] { substituted lists
+ // * for each token }, String[] { url } }
+ // * @throws UrlStringTooLongException
+ // */
+ // private Object[] makeUrls(String[] idstrings, String[] seqstrings,
+ // String dsstring, boolean onlyIfMatches)
+ // throws UrlStringTooLongException
+ // {
+ // Hashtable<String, String[]> rstrings = replacementArgs(idstrings,
+ // seqstrings, dsstring);
+ // return makeUrls(rstrings, onlyIfMatches);
+ // }
+ //
+ // /**
+ // *
+ // * @param repstrings
+ // * @param onlyIfMatches
+ // * @return Object[] {int[], boolean[], StringBuffer[], String[] }
+ // * @throws UrlStringTooLongException
+ // */
+ // private Object[] makeUrls(Hashtable<String, String[]> repstrings,
+ // boolean onlyIfMatches)
+ // throws UrlStringTooLongException
+ // {
+ // return makeUrlsIf(true, repstrings, onlyIfMatches);
+ // }
+ //
+
@Override
public String toString()
{
return result.toString();
}
- /**
- * report stats about the generated url string given an input set
- *
- * @param ul
- * @param idstring
- * @param url
- */
- private static void testUrls(GroupUrlLink ul, String[][] idstring,
- Object[] url)
- {
-
- if (url == null)
- {
- System.out.println("Created NO urls.");
- }
- else
- {
- System.out.println("Created a url from " + ((int[]) url[0])[0]
- + "out of " + idstring[0].length + " sequences.");
- System.out.println("Sequences that did not match:");
- for (int sq = 0; sq < idstring[0].length; sq++)
- {
- if (!((boolean[]) url[1])[sq])
- {
- System.out.println("Seq " + sq + ": " + idstring[0][sq] + "\t: "
- + idstring[1][sq]);
- }
- }
- System.out.println("Sequences that DID match:");
- for (int sq = 0; sq < idstring[0].length; sq++)
- {
- if (((boolean[]) url[1])[sq])
- {
- System.out.println("Seq " + sq + ": " + idstring[0][sq] + "\t: "
- + idstring[1][sq]);
- }
- }
- System.out.println("The generated URL:");
- System.out.println(((String[]) url[3])[0]);
- }
- }
-
- /**
- *
- * @param argv
- * @j2sIgnore
- */
- public static void main(String argv[])
- {
- // note - JAL-1383 - these services are all dead
- String[] links = new String[] {
- "EnVision2|IDS|http://www.ebi.ac.uk/enfin-srv/envision2/pages/linkin.jsf?workflow=Enfin%20Default%20Workflow&datasetName=linkInDatasetFromJalview&input=$SEQUENCEIDS$&inputType=0|,",
- "EnVision2|Seqs|http://www.ebi.ac.uk/enfin-srv/envision2/pages/linkin.jsf?workflow=Enfin%20Default%20Workflow&datasetName=linkInDatasetFromJalview&input=$SEQUENCES$&inputType=1|,",
- "EnVision2|IDS|http://www.ebi.ac.uk/enfin-srv/envision2/pages/linkin.jsf?workflow=Enfin%20Default%20Workflow&datasetName=$DATASETID$&input=$SEQUENCEIDS$&inputType=0|,",
- "EnVision2|Seqs|http://www.ebi.ac.uk/enfin-srv/envision2/pages/linkin.jsf?workflow=Enfin%20Default%20Workflow&datasetName=$DATASETID$&input=$SEQUENCES$&inputType=1|,",
- "EnVision2|IDS|http://www.ebi.ac.uk/enfin-srv/envision2/pages/linkin.jsf?workflow=$SEQUENCEIDS$&datasetName=linkInDatasetFromJalview&input=$SEQUENCEIDS$&inputType=0|,",
- "EnVision2|Seqs|http://www.ebi.ac.uk/enfin-srv/envision2/pages/linkin.jsf?workflow=$SEQUENCEIDS$&datasetName=$DATASETID$&input=$SEQUENCES$&inputType=1|,",
- "EnVision2 Seqs|http://www.ebi.ac.uk/enfin-srv/envision2/pages/linkin.jsf?workflow=Default&datasetName=JalviewSeqs$DATASETID$&input=$SEQUENCES=/([a-zA-Z]+)/=$&inputType=1|,",
- "EnVision2 Seqs|http://www.ebi.ac.uk/enfin-srv/envision2/pages/linkin.jsf?workflow=Default&datasetName=JalviewSeqs$DATASETID$&input=$SEQUENCES=/[A-Za-z]+/=$&inputType=1|,"
- /*
- * http://www.ebi.ac.uk/enfin-srv/envision2/pages/linkin.jsf?input=P38389,P38398
- * &inputType=0&workflow=Enfin%20Default%20Workflow&datasetName=
- * linkInDatasetFromPRIDE
- */
- };
-
- SequenceI[] seqs = new SequenceI[] {
- new Sequence("StupidLabel:gi|9234|pdb|102L|A",
- "asdiasdpasdpadpwpadasdpaspdw"), };
- String[][] seqsandids = formStrings(seqs);
- for (int i = 0; i < links.length; i++)
- {
- GroupUrlLink ul = new GroupUrlLink(links[i]);
- if (ul.isValid())
- {
- System.out.println("\n\n\n");
- System.out.println(
- "Link " + i + " " + links[i] + " : " + ul.toString());
- System.out.println(" pref : " + ul.getUrl_prefix());
- System.out.println(" IdReplace : " + ul.getIDRegexReplace());
- System.out.println(" SeqReplace : " + ul.getSeqRegexReplace());
- System.out.println(" Suffixes : " + ul.getUrl_suffix());
-
- System.out.println(
- "<insert input id and sequence strings here> Without onlyIfMatches:");
- Object[] urls;
- try
- {
- urls = ul.makeUrls(seqsandids[0], seqsandids[1], "mydataset",
- false);
- testUrls(ul, seqsandids, urls);
- } catch (UrlStringTooLongException ex)
- {
- System.out.println("too long exception " + ex);
- }
- System.out.println(
- "<insert input id and sequence strings here> With onlyIfMatches set:");
- try
- {
- urls = ul.makeUrls(seqsandids[0], seqsandids[1], "mydataset",
- true);
- testUrls(ul, seqsandids, urls);
- } catch (UrlStringTooLongException ex)
- {
- System.out.println("too long exception " + ex);
- }
- }
- else
- {
- System.err.println("Invalid URLLink : " + links[i] + " : "
- + ul.getInvalidMessage());
- }
- }
- }
-
- /**
- * covenience method to generate the id and sequence string vector from a set
- * of seuqences using each sequence's getName() and getSequenceAsString()
- * method
- *
- * @param seqs
- * @return String[][] {{sequence ids},{sequence strings}}
- */
- public static String[][] formStrings(SequenceI[] seqs)
- {
- String[][] idset = new String[2][seqs.length];
- for (int i = 0; i < seqs.length; i++)
- {
- idset[0][i] = seqs[i].getName();
- idset[1][i] = seqs[i].getSequenceAsString();
- }
- return idset;
- }
-
- public void setLabel(String newlabel)
- {
- this.label = newlabel;
- }
-
}
private static ResourceBundle rb;
- private static Logger log = Logger
+ private final static Logger log = Logger
.getLogger(MessageManager.class.getCanonicalName());
- private static Locale loc;
+ private final static Locale loc;
- private static Set<String> reportedMissing = new HashSet<>();
+ private final static Set<String> reportedMissing = new HashSet<>();
static
{
+ loc = Locale.getDefault();
try
{
- /* Localize Java dialogs */
- loc = Locale.getDefault();
- // Locale.setDefault(loc);
/* Getting messages for GV */
log.info("Getting messages for lang: " + loc);
Control control = Control.getControl(Control.FORMAT_PROPERTIES);
import jalview.javascript.json.JSON;
+import java.awt.Color;
import java.awt.Toolkit;
import java.awt.event.MouseEvent;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
+import java.net.MalformedURLException;
import java.net.URL;
import java.util.Properties;
+import java.util.logging.ConsoleHandler;
+import java.util.logging.Level;
+import java.util.logging.Logger;
import javax.swing.SwingUtilities;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
+import com.stevesoft.pat.Regex;
+
/**
* System platform information used by Applet and Application
*
private static Boolean isNoJSMac = null, isNoJSWin = null, isMac = null,
isWin = null;
- private static Boolean isHeadless = null;
+ // private static Boolean isHeadless = null;
/**
* added to group mouse events into Windows and nonWindows (mac, unix, linux)
return (isNoJSWin == null ? (isNoJSWin = !isJS && isWin()) : isNoJSWin);
}
- /**
- *
- * @return true if we are running in non-interactive no UI mode
- */
- public static boolean isHeadless()
- {
- if (isHeadless == null)
- {
- isHeadless = "true".equals(System.getProperty("java.awt.headless"));
- }
- return isHeadless;
- }
+ // /**
+ // *
+ // * @return true if we are running in non-interactive no UI mode
+ // */
+ // public static boolean isHeadless()
+ // {
+ // if (isHeadless == null)
+ // {
+ // isHeadless = "true".equals(System.getProperty("java.awt.headless"));
+ // }
+ // return isHeadless;
+ // }
/**
*
}
/**
- * Answers the input with every backslash replaced with a double backslash (an
- * 'escaped' single backslash)
+ * escape a string according to the local platform's escape character
*
- * @param s
- * @return
+ * @param file
+ * @return escaped file
*/
- public static String escapeBackslashes(String s)
+ public static String escapeString(String file)
{
- return s == null ? null : s.replace("\\", "\\\\");
+ StringBuffer f = new StringBuffer();
+ int p = 0, lastp = 0;
+ while ((p = file.indexOf('\\', lastp)) > -1)
+ {
+ f.append(file.subSequence(lastp, p));
+ f.append("\\\\");
+ lastp = p + 1;
+ }
+ f.append(file.substring(lastp));
+ return f.toString();
}
/**
*/
protected static boolean isControlDown(MouseEvent e, boolean aMac)
{
- if (aMac)
- {
- /*
- * answer false for right mouse button
- */
- if (e.isPopupTrigger())
- {
- return false;
- }
- return (jalview.util.ShortcutKeyMaskExWrapper.getMenuShortcutKeyMaskEx() // .getMenuShortcutKeyMaskEx()
- & e.getModifiersEx()) != 0; // getModifiers()) != 0;
- }
- return e.isControlDown();
- }
+ if (!aMac)
+ {
+ return e.isControlDown();
+ }
+ // answer false for right mouse button
+ // shortcut key will be META for a Mac
+ return !e.isPopupTrigger()
+ && (Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()
+ & e.getModifiers()) != 0;
+ // could we use e.isMetaDown() here?
+ }
// BH: I don't know about that previous method. Here is what SwingJS uses.
// Notice the distinction in mouse events. (BUTTON3_MASK == META)
public static long time, mark, set, duration;
+ /**
+ * typical usage:
+ *
+ * Platform.timeCheck(null, Platform.TIME_MARK);
+ *
+ * ...
+ *
+ * Platform.timeCheck("some message", Platform.TIME_MARK);
+ *
+ * reset...[set/mark]n...get
+ *
+ * @param msg
+ * @param mode
+ */
public static void timeCheck(String msg, int mode)
{
long t = System.currentTimeMillis();
{
case TIME_RESET:
time = mark = t;
+ duration = 0;
if (msg != null)
{
System.err.println("Platform: timer reset\t\t\t" + msg);
case TIME_MARK:
if (set > 0)
{
+ // total time between set/mark points
duration += (t - set);
}
else
case TIME_GET:
if (msg != null)
{
- System.err.println("Platform: timer dur\t" + ((t - time) / 1000f)
+ System.err.println("Platform: timer get\t" + ((t - time) / 1000f)
+ "\t" + ((duration) / 1000f) + "\t" + msg);
}
set = 0;
public static byte[] getFileBytes(File f)
{
- return /** @j2sNative f && f._bytes || */
+ // TODO temporary doubling of 秘bytes and _bytes;
+ // just remove _bytes when new transpiler has been installed
+ return /** @j2sNative f && (f.秘bytes || f._bytes) || */
null;
}
}
@SuppressWarnings("unused")
byte[] bytes = getFileAsBytes(urlstring);
+ // TODO temporary doubling of 秘bytes and _bytes;
+ // just remove _bytes when new transpiler has been installed
/**
- * @j2sNative f._bytes = bytes;
+ * @j2sNative f.秘bytes = f._bytes = bytes;
*/
return true;
}
* @param url
* @return true if window has been opened
*/
- public static boolean openURL(String url)
+ public static boolean openURL(String url) throws IOException
{
if (!isJS())
{
+ BrowserLauncher.openURL(url);
return false;
}
/**
@SuppressWarnings("unused")
ThreadGroup g = Thread.currentThread().getThreadGroup();
/**
- * @j2sNative return g.html5Applet._uniqueId;
+ * @j2sNative return g.秘html5Applet._uniqueId;
*
*/
return null;
String id = getUniqueAppletID();
String key = "", value = "";
/**
- * @j2sNative var info = g.html5Applet.__Info || {}; for (var key in info) {
- * if (key.indexOf(prefix) == 0) { value = "" + info[key];
+ * @j2sNative var info = g.秘html5Applet.__Info || {}; for (var key in info)
+ * { if (key.indexOf(prefix) == 0) { value = "" + info[key];
*/
System.out.println(
"Platform id=" + id + " reading Info." + key + " = " + value);
- p.put(id + "_" + key, value);
+ p.put(key, value);
/**
* @j2sNative
}
+ public static URL getDocumentBase()
+ {
+ try
+ {
+ if (isJS())
+ {
+ @SuppressWarnings("unused")
+ Object g = Thread.currentThread().getThreadGroup();
+ return new URL(/**
+ * @j2sNative g.秘html5Applet._appletPanel.appletDocumentBase
+ * ||
+ */
+ "");
+ }
+ } catch (MalformedURLException e)
+ {
+ }
+ return null;
+ }
+
+ public static URL getCodeBase()
+ {
+ try
+ {
+ if (isJS())
+ {
+ @SuppressWarnings("unused")
+ Object g = Thread.currentThread().getThreadGroup();
+ return new URL(/**
+ * @j2sNative g.秘html5Applet._appletPanel.appletCodeBase
+ * ||
+ */
+ "");
+ }
+ } catch (MalformedURLException e)
+ {
+ }
+ return null;
+ }
+
/**
- * A (case sensitive) file path comparator that ignores the difference between /
- * and \
+ * load a resource -- probably a core file -- if and only if a particular
+ * class has not been instantialized. We use a String here because if we used
+ * a .class object, that reference itself would simply load the class, and we
+ * want the core package to include that as well.
*
- * @param path1
- * @param path2
- * @return
+ * @param resourcePath
+ * @param className
+ */
+ public static void loadStaticResource(Object resourcePath,
+ String className)
+ {
+ /**
+ *
+ * @j2sNative if (!swingjs.JSUtil.isClassLoaded$S(className))
+ * swingjs.JSUtil.loadStaticResource$S(resourcePath);
+ */
+ }
+
+ public static void ensureRegex()
+ {
+ loadStaticResource("core/core_stevesoft.z.js",
+ "com.stevesoft.pat.Regex");
+ }
+
+ public static Regex newRegex(String searchString, String replaceString)
+ {
+ ensureRegex();
+ return (replaceString == null ? new Regex(searchString)
+ : new Regex(searchString, replaceString));
+ }
+
+ public static Regex newRegexPerl(String code)
+ {
+ ensureRegex();
+ return Regex.perlCode(code);
+ }
+
+ /**
+ * @param c
*/
- public static boolean pathEquals(String path1, String path2)
+ public static Color getColorFromName(String name)
{
- if (path1 == null)
+ if (name == null)
{
- return path2 == null;
+ return null;
}
- if (path2 == null)
+ /**
+ * @j2sNative
+ *
+ * return swingjs.JSUtil.getColorFromName$S(name);
+ */
{
- return false;
+ // or make a static map; or use reflection on the field name
+ switch (name.toLowerCase())
+ {
+ case "black":
+ return Color.black;
+ case "blue":
+ return Color.blue;
+ case "cyan":
+ return Color.cyan;
+ case "darkgray":
+ return Color.darkGray;
+ case "gray":
+ return Color.gray;
+ case "green":
+ return Color.green;
+ case "lightgray":
+ return Color.lightGray;
+ case "magenta":
+ return Color.magenta;
+ case "orange":
+ return Color.orange;
+ case "pink":
+ return Color.pink;
+ case "red":
+ return Color.red;
+ case "white":
+ return Color.white;
+ case "yellow":
+ return Color.yellow;
+ default:
+ return null;
+ }
+
+ }
+ }
+
+ /**
+ * Initialize Java debug logging. A representative sample -- adapt as desired.
+ */
+ public static void startJavaLogging()
+ {
+ /**
+ * @j2sIgnore
+ */
+ {
+ logClass("java.awt.EventDispatchThread", "java.awt.EventQueue",
+ "java.awt.Component", "java.awt.focus.Component",
+ "java.awt.event.Component",
+ "java.awt.focus.DefaultKeyboardFocusManager");
+ }
+ }
+
+ /**
+ * Initiate Java logging for a given class. Only for Java, not JavaScript;
+ * Allows debugging of complex event processing.
+ *
+ * @param className
+ */
+ public static void logClass(String... classNames)
+ {
+ /**
+ * @j2sIgnore
+ *
+ *
+ */
+ {
+ Logger rootLogger = Logger.getLogger("");
+ rootLogger.setLevel(Level.ALL);
+ ConsoleHandler consoleHandler = new ConsoleHandler();
+ consoleHandler.setLevel(Level.ALL);
+ for (int i = classNames.length; --i >= 0;)
+ {
+ Logger logger = Logger.getLogger(classNames[i]);
+ logger.setLevel(Level.ALL);
+ logger.addHandler(consoleHandler);
+ }
+ }
+ }
+
+ /**
+ * Set the "app" property of the HTML5 applet object, for example,
+ * "testApplet.app", to point to the Jalview instance. This will be the object
+ * that page developers use that is similar to the original Java applet object
+ * that was accessed via LiveConnect.
+ *
+ * @param j
+ */
+ public static void setAppClass(Object j)
+ {
+ if (!isJS())
+ {
+ return;
+ }
+ @SuppressWarnings("unused")
+ Thread t = Thread.currentThread();
+ /**
+ * Set up "testApplet.app" to be this instance
+ *
+ * @j2sNative
+ *
+ * try {self[t.name].app = j}catch(e){}
+ */
+ }
+
+ public final static String EMBEDDED_DIM = "dim";
+
+ /**
+ *
+ * If this frame Is this frame embedded in a web page, return a known type.
+ *
+ * @param frame
+ * a JFrame or JInternalFrame
+ * @param type
+ * @return null if frame is not embedded.
+ */
+ public static Object getEmbeddedAttribute(Object frame, String type)
+ {
+ if (!isJS())
+ {
+ return null;
+ }
+ return (/** swingjs@j2sNative || frame.ui.getEmbedded(type) */
+ null);
+ }
+
+ public static void stackTrace()
+ {
+ try
+ {
+ throw new NullPointerException();
+ } catch (Exception e)
+ {
+ e.printStackTrace();
}
- String p1 = path1.replace('\\', '/');
- String p2 = path2.replace('\\', '/');
- return p1.equals(p2);
+
}
+
}
+++ /dev/null
-package jalview.util;
-
-import java.awt.Toolkit;
-import java.awt.event.KeyEvent;
-
-public class ShortcutKeyMaskExWrapper
-{
-
- private static boolean init = false;
-
- private static final Float specversion = Float
- .parseFloat(System.getProperty("java.specification.version"));
-
- private static final float modern = 11;
-
- public static int SHIFT_DOWN_MASK = KeyEvent.SHIFT_DOWN_MASK;
-
- public static int ALT_DOWN_MASK = KeyEvent.ALT_DOWN_MASK;
-
- public ShortcutKeyMaskExWrapper()
- {
- }
-
- private static void init()
- {
- if (init)
- {
- return;
- }
- if (specversion < modern)
- {
- SHIFT_DOWN_MASK = KeyEvent.SHIFT_MASK;
- ALT_DOWN_MASK = KeyEvent.ALT_MASK;
- }
- else
- {
- SHIFT_DOWN_MASK = KeyEvent.SHIFT_DOWN_MASK;
- ALT_DOWN_MASK = KeyEvent.ALT_DOWN_MASK;
- }
-
- init = true;
- }
-
- public static int getMenuShortcutKeyMaskEx()
- {
- init();
- if (specversion < modern)
- {
- return Toolkit.getDefaultToolkit().getMenuShortcutKeyMask();
- }
- else
- {
- return Toolkit.getDefaultToolkit().getMenuShortcutKeyMaskEx();
- }
- }
-
-}
import java.util.Map;
import java.util.Vector;
+import com.stevesoft.pat.Regex;
+
/**
* A helper class to parse URL Link strings taken from applet parameters or
* jalview properties file using the com.stevesoft.pat.Regex implementation.
{
if (regexReplace != null)
{
- com.stevesoft.pat.Regex rg = com.stevesoft.pat.Regex
- .perlCode("/" + regexReplace + "/");
+ Regex rg = Platform.newRegexPerl("/" + regexReplace + "/");
if (rg.search(idstring))
{
int ns = rg.numSubs();
{
// Extract Regex and suffix
urlSuffix = link.substring(p + endDelimiter.length());
- regexReplace = link.substring(sqidPos + startLength, p);
- try
- {
- com.stevesoft.pat.Regex rg = com.stevesoft.pat.Regex
- .perlCode("/" + regexReplace + "/");
- if (rg == null)
- {
- invalidMessage = "Invalid Regular Expression : '" + regexReplace
- + "'\n";
- }
- } catch (Exception e)
- {
- invalidMessage = "Invalid Regular Expression : '" + regexReplace
- + "'\n";
- }
+ testRegexPerl(
+ regexReplace = link.substring(sqidPos + startLength, p));
}
else
{
return p;
}
+ private void testRegexPerl(String r)
+ {
+ Regex rg = null;
+ try
+ {
+ rg = Platform.newRegexPerl("/" + r + "/");
+ } catch (Exception e)
+ {
+ }
+ if (rg == null)
+ {
+ invalidMessage = "Invalid Regular Expression : '" + r + "'\n";
+ }
+ }
+
/**
* Create a set of URL links for a sequence
*
protected ColumnSelection colSel = new ColumnSelection();
- public boolean autoCalculateConsensus = true;
+ protected boolean autoCalculateConsensusAndConservation = true;
+
+ public boolean getAutoCalculateConsensusAndConservation()
+ { // BH 2019.07.24
+ return autoCalculateConsensusAndConservation;
+ }
+
+ public void setAutoCalculateConsensusAndConservation(boolean b)
+ {
+ autoCalculateConsensusAndConservation = b;
+ }
protected boolean autoCalculateStrucConsensus = true;
+ public boolean getAutoCalculateStrucConsensus()
+ { // BH 2019.07.24
+ return autoCalculateStrucConsensus;
+ }
+
+ public void setAutoCalculateStrucConsensus(boolean b)
+ {
+ autoCalculateStrucConsensus = b;
+ }
+
protected boolean ignoreGapsInConsensusCalculation = false;
protected ResidueShaderI residueShading = new ResidueShader();
// see note in mantis : issue number 8585
if (alignment.isNucleotide()
|| (conservation == null && quality == null)
- || !autoCalculateConsensus)
+ || !autoCalculateConsensusAndConservation)
{
return;
}
public void updateConsensus(final AlignmentViewPanel ap)
{
// see note in mantis : issue number 8585
- if (consensus == null || !autoCalculateConsensus)
+ if (consensus == null || !autoCalculateConsensusAndConservation)
{
return;
}
{
alignment.padGaps();
}
- if (autoCalculateConsensus)
+ if (autoCalculateConsensusAndConservation)
{
updateConsensus(ap);
}
- if (hconsensus != null && autoCalculateConsensus)
+ if (hconsensus != null && autoCalculateConsensusAndConservation)
{
updateConservation(ap);
}
import jalview.datamodel.HiddenColumns;
import jalview.datamodel.HiddenSequences;
+import java.awt.Dimension;
import java.awt.Graphics;
+import java.awt.Rectangle;
public abstract class OverviewDimensions
{
protected float heightRatio;
+ private Rectangle vpbox = new Rectangle();
+
/**
* Create an OverviewDimensions object
*
* true if the annotation panel is to be shown, false otherwise
*/
public OverviewDimensions(ViewportRanges ranges,
- boolean showAnnotationPanel)
+ boolean showAnnotationPanel, Dimension dim)
{
+ if (!showAnnotationPanel)
+ {
+ graphHeight = 0;
+ }
+
// scale the initial size of overviewpanel to shape of alignment
float initialScale = (float) ranges.getAbsoluteAlignmentWidth()
/ (float) ranges.getAbsoluteAlignmentHeight();
- if (!showAnnotationPanel)
+ if (dim != null)
{
- graphHeight = 0;
+ width = dim.width;
+ sequencesHeight = dim.height;
+ return;
}
-
if (ranges.getAbsoluteAlignmentWidth() > ranges
.getAbsoluteAlignmentHeight())
{
*/
public void drawBox(Graphics g)
{
+ // System.out.println("OD drawBox " + boxX + " " + boxY + " " + boxWidth
+ // + " " + boxHeight);
+ updateBox();
g.drawRect(boxX, boxY, boxWidth, boxHeight);
g.drawRect(boxX + 1, boxY + 1, boxWidth - 2, boxHeight - 2);
}
public void setHeight(int h)
{
+ // BH 2019 problem was that component.resize() can come
+ // after setBoxPosition().
+ // Solution was to move setting of box dimensions to paint
sequencesHeight = h - graphHeight;
heightRatio = (float) alheight / sequencesHeight;
}
int vpheight)
{
resetAlignmentDims();
+ vpbox = new Rectangle(startRes, startSeq, vpwidth, vpheight);
+ updateBox();
+ }
+ public void updateBox()
+ {
// boxX, boxY is the x,y location equivalent to startRes, startSeq
- int xPos = Math.min(startRes, alwidth - vpwidth + 1);
+ int xPos = Math.min(vpbox.x, alwidth - vpbox.width + 1);
boxX = Math.round(xPos / widthRatio);
- boxY = Math.round(startSeq / heightRatio);
+ boxY = Math.round(vpbox.y / heightRatio);
// boxWidth is the width in residues translated to pixels
- boxWidth = Math.round(vpwidth / widthRatio);
+ boxWidth = Math.max(1, Math.round(vpbox.width / widthRatio));
// boxHeight is the height in sequences translated to pixels
- boxHeight = Math.round(vpheight / heightRatio);
+ boxHeight = Math.max(1, Math.round(vpbox.height / heightRatio));
}
/**
import jalview.datamodel.VisibleColsCollection;
import jalview.datamodel.VisibleRowsCollection;
+import java.awt.Dimension;
+
public class OverviewDimensionsHideHidden extends OverviewDimensions
{
private ViewportRanges ranges;
public OverviewDimensionsHideHidden(ViewportRanges vpranges,
boolean showAnnotationPanel)
{
- super(vpranges, showAnnotationPanel);
+ this(vpranges, showAnnotationPanel, null);
+ }
+
+ public OverviewDimensionsHideHidden(ViewportRanges vpranges,
+ boolean showAnnotationPanel, Dimension dim)
+ {
+ super(vpranges, showAnnotationPanel, dim);
ranges = vpranges;
resetAlignmentDims();
}
import jalview.datamodel.HiddenColumns;
import jalview.datamodel.HiddenSequences;
+import java.awt.Dimension;
+
public class OverviewDimensionsShowHidden extends OverviewDimensions
{
private ViewportRanges ranges;
private int ydiff; // when dragging, difference in alignment units between
// start sequence and original mouse click position
+ public OverviewDimensionsShowHidden(ViewportRanges vpranges,
+ boolean showAnnotationPanel)
+ {
+ this(vpranges, showAnnotationPanel, null);
+ }
+
/**
* Create an OverviewDimensions object
*
* true if the annotation panel is to be shown, false otherwise
*/
public OverviewDimensionsShowHidden(ViewportRanges vpranges,
- boolean showAnnotationPanel)
+ boolean showAnnotationPanel, Dimension dim)
{
- super(vpranges, showAnnotationPanel);
+ super(vpranges, showAnnotationPanel, dim);
ranges = vpranges;
resetAlignmentDims();
}
int oldstartres = oldvalues[0];
int oldendres = oldvalues[1];
+ if (oldstartres == startRes && oldendres == endRes)
+ {
+ return; // BH 2019.07.27 standard check for no changes
+ }
+
+ // listeners include:
+
+ // jalview.gui.SeqCanvas[,0,0,568x90,layout=java.awt.BorderLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=9,maximumSize=,minimumSize=,preferredSize=]
+ // STARTRES, STARTRESANDSEQ
+ // jalview.gui.IdCanvas[,0,0,112x90,layout=java.awt.BorderLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=9,maximumSize=,minimumSize=,preferredSize=java.awt.Dimension[width=112,height=0]]
+ // jalview.gui.ScalePanel[,0,0,594x17,layout=java.awt.FlowLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=9,maximumSize=,minimumSize=,preferredSize=]
+ // jalview.gui.AnnotationPanel[,0,0,0x162,alignmentX=0.0,alignmentY=0.0,border=,flags=9,maximumSize=,minimumSize=,preferredSize=java.awt.Dimension[width=1,height=162]]
+ // jalview.gui.AlignmentPanel[,0,0,706x133,layout=java.awt.BorderLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=16777225,maximumSize=,minimumSize=,preferredSize=java.awt.Dimension[width=220,height=166]]
+ // jalview.gui.OverviewPanel[,0,0,543x135,layout=java.awt.BorderLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=9,maximumSize=,minimumSize=,preferredSize=java.awt.Dimension[width=543,height=135]]
+
+
+ // "STARTRES" is a misnomer here -- really "STARTORENDRES"
+ // note that this could be "no change" if the range is just being expanded
changeSupport.firePropertyChange(STARTRES, oldstartres, startRes);
if (oldstartres == startRes)
{
- // event won't be fired if start positions are same
- // fire an event for the end positions in case they changed
+ // No listener cares about this
+ // "ENDRES" is a misnomer here -- really "ENDONLYRES"
+ // BH 2019.07.27 adds end change check
+ // fire only if only the end is changed
changeSupport.firePropertyChange(ENDRES, oldendres, endRes);
}
}
*/
public void setStartSeq(int seq)
{
- int startseq = seq;
int height = getViewportHeight();
- if (startseq + height - 1 > getVisibleAlignmentHeight() - 1)
- {
- startseq = getVisibleAlignmentHeight() - height;
- }
+ int startseq = Math.min(seq, getVisibleAlignmentHeight() - height);
+ // BH 2019.07.27 cosmetic only -- was:
+ // if (startseq + height - 1 > getVisibleAlignmentHeight() - 1)
+ // {
+ // startseq = getVisibleAlignmentHeight() - height;
+ // }
setStartEndSeq(startseq, startseq + height - 1);
}
int oldstartseq = oldvalues[0];
int oldendseq = oldvalues[1];
+ if (oldstartseq == startSeq && oldendseq == endSeq)
+ {
+ return; // BH 2019.07.27 standard check for no changes
+ }
+
+ // "STARTSEQ" is a misnomer here -- really "STARTORENDSEQ"
changeSupport.firePropertyChange(STARTSEQ, oldstartseq, startSeq);
if (oldstartseq == startSeq)
{
- // event won't be fired if start positions are the same
- // fire in case the end positions changed
+ // Note that all listeners ignore this - could be removed, or there is a
+ // bug.
+ // "ENDSEQ" is a misnomer here -- really "ENDONLYSEQ"
+ // additional fire, only if only the end is changed
changeSupport.firePropertyChange(ENDSEQ, oldendseq, endSeq);
}
}
*/
public void setStartResAndSeq(int res, int seq)
{
+ // from Overview only
int width = getViewportWidth();
int[] oldresvalues = updateStartEndRes(res, res + width - 1);
}
int[] oldseqvalues = updateStartEndSeq(startseq, startseq + height - 1);
- int[] old = new int[] { oldresvalues[0], oldseqvalues[0] };
- int[] newresseq = new int[] { startRes, startSeq };
- changeSupport.firePropertyChange(STARTRESANDSEQ, old, newresseq);
+ int[] oldvalues = new int[] { oldresvalues[0], oldseqvalues[0] };
+ int[] newvalues = new int[] { startRes, startSeq };
+ changeSupport.firePropertyChange(STARTRESANDSEQ, oldvalues, newvalues);
}
/**
}
/**
- * Set the viewport location so that a position is visible
+ * Set the viewport location so that a position is visible. From
+ * SeqPanel.scrollToVisible(true) only, from AlignFrame keyboard actions
+ * SeqPanel.scrollCursor[Row(VK_S)/Column(VK_C)/RowAndColumn(VK_ENTER,COMMA)/Position(VK_P)]
+ *
*
* @param x
* column to be visible: absolute position in alignment
{
featureOrder = new Hashtable<>();
}
- featureOrder.put(type, Float.valueOf(position));
+ featureOrder.put(type, new Float(position));
return position;
}
}
if (newGroupsVisible)
{
- featureGroups.put(group, Boolean.valueOf(true));
+ featureGroups.put(group, new Boolean(true));
return true;
}
return false;
@Override
public void setGroupVisibility(String group, boolean visible)
{
- featureGroups.put(group, Boolean.valueOf(visible));
+ featureGroups.put(group, new Boolean(visible));
}
@Override
for (String gst : toset)
{
Boolean st = featureGroups.get(gst);
- featureGroups.put(gst, Boolean.valueOf(visible));
+ featureGroups.put(gst, new Boolean(visible));
if (st != null)
{
rdrw = rdrw || (visible != st.booleanValue());
*/
protected boolean featureGroupNotShown(final SequenceFeature sequenceFeature)
{
+ Boolean b;
return featureGroups != null
&& sequenceFeature.featureGroup != null
- && sequenceFeature.featureGroup.length() != 0
- && featureGroups.containsKey(sequenceFeature.featureGroup)
- && !featureGroups.get(sequenceFeature.featureGroup)
- .booleanValue();
+ && sequenceFeature.featureGroup.length() > 0
+ && (b = featureGroups.get(sequenceFeature.featureGroup)) != null
+ && !b.booleanValue();
}
/**
import jalview.api.AlignCalcManagerI;
import jalview.api.AlignCalcWorkerI;
+import jalview.bin.Jalview;
import jalview.datamodel.AlignmentAnnotation;
import java.util.ArrayList;
public class AlignCalcManager implements AlignCalcManagerI
{
+ public static final String STARTED = "started";
+
+ public static final String FINISHED = "finished";
+
/*
* list of registered workers
*/
.synchronizedList(new ArrayList<AlignCalcWorkerI>());
updating = Collections.synchronizedMap(
new Hashtable<Class<? extends AlignCalcWorkerI>, List<AlignCalcWorkerI>>());
- canUpdate = new HashSet<AlignCalcWorkerI>();
+ canUpdate = new HashSet<>();
}
@Override
{
synchronized (updating)
{
+ Jalview.getInstance().notifyWorker(worker, STARTED);
List<AlignCalcWorkerI> upd = updating.get(worker.getClass());
if (upd == null)
{
{
synchronized (inProgress)
{
+ Jalview.getInstance().notifyWorker(worker, FINISHED);
// System.err.println("Worker " + worker + " marked as complete.");
inProgress.remove(worker);
List<AlignCalcWorkerI> upd = updating.get(worker.getClass());
public List<AlignCalcWorkerI> getRegisteredWorkersOfClass(
Class<? extends AlignCalcWorkerI> workerClass)
{
- List<AlignCalcWorkerI> workingClass = new ArrayList<AlignCalcWorkerI>();
+ List<AlignCalcWorkerI> workingClass = new ArrayList<>();
synchronized (canUpdate)
{
for (AlignCalcWorkerI worker : canUpdate)
public void removeRegisteredWorkersOfClass(
Class<? extends AlignCalcWorkerI> typeToRemove)
{
- List<AlignCalcWorkerI> removable = new ArrayList<AlignCalcWorkerI>();
- Set<AlignCalcWorkerI> toremovannot = new HashSet<AlignCalcWorkerI>();
+ List<AlignCalcWorkerI> removable = new ArrayList<>();
+ Set<AlignCalcWorkerI> toremovannot = new HashSet<>();
synchronized (restartable)
{
for (AlignCalcWorkerI worker : restartable)
* first just find those to remove (to avoid
* ConcurrentModificationException)
*/
- List<AlignCalcWorkerI> toRemove = new ArrayList<AlignCalcWorkerI>();
+ List<AlignCalcWorkerI> toRemove = new ArrayList<>();
for (AlignCalcWorkerI worker : restartable)
{
if (worker.involves(ann))
import jalview.gui.FeatureSettings;
import jalview.gui.IProgressIndicator;
import jalview.gui.OOMWarning;
+import jalview.gui.Preferences;
import jalview.util.DBRefUtils;
import jalview.util.MessageManager;
import jalview.ws.seqfetcher.DbSourceProxy;
}
this.dataset = ds;
// TODO Jalview 2.5 lots of this code should be in the gui package!
- sfetcher = jalview.gui.SequenceFetcher.getSequenceFetcherSingleton();
+ sfetcher = SequenceFetcher.getInstance();
// set default behaviour for transferring excess sequence data to the
// dataset
trimDsSeqs = Cache.getDefault(TRIM_RETRIEVED_SEQUENCES, true);
}
try
{
- if (Cache.getDefault("DBREFFETCH_USEPICR", false))
+ if (Cache.getDefault(Preferences.DBREFFETCH_USEPICR, false))
{
picrClient = new AccessionMapperServiceLocator()
.getAccessionMapperPort();
{
int n;
if (sequencesArray == null || (n = sequencesArray.length) == 0)
- return sequencesArray;
+ {
+ return sequencesArray;
+ }
ArrayList<SequenceI> nseq = new ArrayList<>();
for (int i = 0;i < n; i++)
{
*/
package jalview.ws;
+import jalview.bin.ApplicationSingletonProvider;
+import jalview.bin.ApplicationSingletonProvider.ApplicationSingletonI;
+import jalview.datamodel.DBRefSource;
import jalview.ext.ensembl.EnsemblGene;
-import jalview.ws.dbsources.EmblCdsSource;
-import jalview.ws.dbsources.EmblSource;
-import jalview.ws.dbsources.Pdb;
-import jalview.ws.dbsources.PfamFull;
-import jalview.ws.dbsources.PfamSeed;
-import jalview.ws.dbsources.RfamSeed;
import jalview.ws.dbsources.Uniprot;
import jalview.ws.seqfetcher.ASequenceFetcher;
import jalview.ws.seqfetcher.DbSourceProxy;
import java.util.List;
/**
- * This implements the run-time discovery of sequence database clients.
+ * Thread safe construction of database proxies. This implements the run-time
+ * discovery of sequence database clients.
*
+ * TODO: extend to a configurable database plugin mechanism where classes are
+ * instantiated by reflection and queried for their DbRefSource and version
+ * association.
*/
-public class SequenceFetcher extends ASequenceFetcher
+public class SequenceFetcher extends ASequenceFetcher implements ApplicationSingletonI
{
+ /*
+ * set a mock fetcher here for testing only - reset to null afterwards
+ */
+ private static SequenceFetcher mockFetcher;
+
+ /**
+ * Returns a new SequenceFetcher singleton, or a mock object if one has been
+ * set.
+ *
+ * @return
+ */
+ public static SequenceFetcher getInstance()
+ {
+ return mockFetcher != null ? mockFetcher
+ : (SequenceFetcher) ApplicationSingletonProvider
+ .getInstance(SequenceFetcher.class);
+ }
+
/**
- * Thread safe construction of database proxies TODO: extend to a configurable
- * database plugin mechanism where classes are instantiated by reflection and
- * queried for their DbRefSource and version association.
+ * Set the instance object to use (intended for unit testing with mock
+ * objects).
+ *
+ * Be sure to reset to null in the tearDown method of any tests!
+ *
+ * @param sf
+ */
+ public static void setSequenceFetcher(SequenceFetcher sf)
+ {
+ mockFetcher = sf;
+ }
+
+ /**
+ *
+ * This public constructor is only is for use by testng to anonymously
+ * subclass SequenceFetcher.
+ *
*
*/
public SequenceFetcher()
{
- addDBRefSourceImpl(EnsemblGene.class);
- // addDBRefSourceImpl(EnsemblGenomes.class);
- addDBRefSourceImpl(EmblSource.class);
- addDBRefSourceImpl(EmblCdsSource.class);
- addDBRefSourceImpl(Uniprot.class);
- addDBRefSourceImpl(Pdb.class);
- addDBRefSourceImpl(PfamFull.class);
- addDBRefSourceImpl(PfamSeed.class);
- addDBRefSourceImpl(RfamSeed.class);
+ addAllDatabases();
+ }
+
+ public void addAllDatabases()
+ {
+ addDBRefSourceImpl(EnsemblGene.class); // includes EnsemblGenomes.class
+ addDBRefSourceImpl(Uniprot.class); // includes UniprotName.class
+ // addDBRefSourceImpl(EmblSource.class);
+ // addDBRefSourceImpl(EmblCdsSource.class);
+ // addDBRefSourceImpl(Pdb.class);
+ // addDBRefSourceImpl(PfamFull.class);
+ // addDBRefSourceImpl(PfamSeed.class);
+ // addDBRefSourceImpl(RfamSeed.class);
+ addDBRefSourceImpl(DBRefSource.EMBL,
+ "jalview.ws.dbsources.EmblSource");
+ addDBRefSourceImpl(DBRefSource.EMBLCDS,
+ "jalview.ws.dbsources.EmblCdsSource");
+ addDBRefSourceImpl(DBRefSource.PDB, "jalview.ws.dbsources.Pdb");
+ addDBRefSourceImpl(DBRefSource.PFAM_FULL,
+ "jalview.ws.dbsources.PfamFull");
+ addDBRefSourceImpl(DBRefSource.PFAM_SEED,
+ "jalview.ws.dbsources.PfamSeed");
+ addDBRefSourceImpl(DBRefSource.RFAM_SEED,
+ "jalview.ws.dbsources.RfamSeed");
}
/**
- * return an ordered list of database sources excluding alignment only databases
+ * return an ordered list of database sources excluding alignment only
+ * databases
*/
public String[] getNonAlignmentSources()
{
String[] srcs = this.getSupportedDb();
List<String> src = new ArrayList<>();
-
- for (int i = 0; i < srcs.length; i++)
+ outer: for (int i = 0; i < srcs.length; i++)
{
- boolean accept = true;
for (DbSourceProxy dbs : getSourceProxy(srcs[i]))
{
// Skip the alignment databases for the moment - they're not useful for
// verifying a single sequence against its reference source
if (dbs.isAlignmentSource())
{
- accept = false;
- break;
+ continue outer;
}
}
- if (accept)
- {
- src.add(srcs[i]);
- }
+ src.add(srcs[i]);
}
Collections.sort(src, String.CASE_INSENSITIVE_ORDER);
return src.toArray(new String[src.size()]);
*/
package jalview.ws;
-import jalview.ws.seqfetcher.ASequenceFetcher;
-
public class SequenceFetcherFactory
{
-
- private static SequenceFetcher instance;
-
- /**
- * Returns a new SequenceFetcher object, or a mock object if one has been set
- *
- * @return
- */
- public static ASequenceFetcher getSequenceFetcher()
- {
- return instance == null ? new SequenceFetcher() : instance;
- }
-
- /**
- * Set the instance object to use (intended for unit testing with mock
- * objects).
- *
- * Be sure to reset to null in the tearDown method of any tests!
- *
- * @param sf
- */
- public static void setSequenceFetcher(SequenceFetcher sf)
- {
- instance = sf;
- }
+ // BH the two methods in this class merged into SequenceFetcher
}
import jalview.datamodel.AlignmentI;
import jalview.datamodel.DBRefSource;
+import jalview.util.Platform;
import com.stevesoft.pat.Regex;
public class EmblCdsSource extends EmblXmlSource
{
+ private Regex ACCESSION_REGEX = null;
+
public EmblCdsSource()
{
super();
@Override
public Regex getAccessionValidator()
{
- return new Regex("^[A-Z]+[0-9]+");
+ if (ACCESSION_REGEX == null)
+ {
+ ACCESSION_REGEX = Platform.newRegex("^[A-Z]+[0-9]+", null);
+ }
+ return ACCESSION_REGEX;
}
@Override
import jalview.datamodel.AlignmentI;
import jalview.datamodel.DBRefSource;
+import jalview.util.Platform;
import com.stevesoft.pat.Regex;
public class EmblSource extends EmblXmlSource
{
+ private static Regex ACCESSION_REGEX;
+
public EmblSource()
{
super();
@Override
public Regex getAccessionValidator()
{
- return new Regex("^[A-Z]+[0-9]+");
+ if (ACCESSION_REGEX == null)
+ {
+ ACCESSION_REGEX = Platform.newRegex("^[A-Z]+[0-9]+", null);
+ }
+ return ACCESSION_REGEX;
}
/*
import jalview.io.PDBFeatureSettings;
import jalview.structure.StructureImportSettings;
import jalview.util.MessageManager;
+import jalview.util.Platform;
import jalview.ws.ebi.EBIFetchClient;
import java.io.File;
private static final int PDB_ID_LENGTH = 4;
+ private static Regex ACCESSION_REGEX;
+
public Pdb()
{
super();
@Override
public Regex getAccessionValidator()
{
- return new Regex("([1-9][0-9A-Za-z]{3}):?([ _A-Za-z0-9]?)");
+ if (ACCESSION_REGEX == null)
+ {
+ ACCESSION_REGEX = Platform
+ .newRegex("([1-9][0-9A-Za-z]{3}):?([ _A-Za-z0-9]?)", null);
+ }
+ return ACCESSION_REGEX;
}
/*
fileFormat);
if (pdbAlignment != null)
{
- List<SequenceI> toremove = new ArrayList<SequenceI>();
+ List<SequenceI> toremove = new ArrayList<>();
for (SequenceI pdbcs : pdbAlignment.getSequences())
{
String chid = null;
*/
package jalview.ws.dbsources;
+import jalview.datamodel.DBRefSource;
+
/**
* flyweight class specifying retrieval of Full family alignments from PFAM
*
@Override
public String getDbName()
{
- return "PFAM (Full)";
+ return DBRefSource.PFAM_FULL;
}
@Override
*/
package jalview.ws.dbsources;
+import jalview.datamodel.DBRefSource;
+
/**
* flyweight class specifying retrieval of Seed alignments from PFAM
*
@Override
public String getDbName()
{
- return "PFAM (Seed)";
+ return DBRefSource.PFAM_SEED;
}
@Override
import jalview.datamodel.Sequence;
import jalview.datamodel.SequenceFeature;
import jalview.datamodel.SequenceI;
+import jalview.gui.Preferences;
import jalview.schemes.ResidueProperties;
+import jalview.util.Platform;
import jalview.util.StringUtils;
import jalview.ws.seqfetcher.DbSourceProxyImpl;
-import jalview.xml.binding.embl.ROOT;
import jalview.xml.binding.uniprot.DbReferenceType;
import jalview.xml.binding.uniprot.Entry;
import jalview.xml.binding.uniprot.FeatureType;
private static final String BAR_DELIMITER = "|";
+ private static Regex ACCESSION_REGEX;
+
/**
* Constructor
*/
private String getDomain()
{
- return Cache.getDefault("UNIPROT_DOMAIN", DEFAULT_UNIPROT_DOMAIN);
+ return Cache.getDefault(Preferences.UNIPROT_DOMAIN, DEFAULT_UNIPROT_DOMAIN);
}
/*
@Override
public Regex getAccessionValidator()
{
- return new Regex("([A-Z]+[0-9]+[A-Z0-9]+|[A-Z0-9]+_[A-Z0-9]+)");
+ if (ACCESSION_REGEX == null)
+ {
+ ACCESSION_REGEX = Platform
+ .newRegex("([A-Z]+[0-9]+[A-Z0-9]+|[A-Z0-9]+_[A-Z0-9]+)", null);
+ }
+ return ACCESSION_REGEX;
}
/*
*/
package jalview.ws.jws1;
+import jalview.bin.ApplicationSingletonProvider;
+import jalview.bin.ApplicationSingletonProvider.ApplicationSingletonI;
import jalview.gui.JvOptionPane;
import jalview.util.MessageManager;
import ext.vamsas.ServiceHandle;
import ext.vamsas.ServiceHandles;
-public class Discoverer implements Runnable
+public class Discoverer implements Runnable, ApplicationSingletonI
{
- ext.vamsas.IRegistry registry; // the root registry service.
+
+ public static Discoverer getInstance()
+ {
+ return (Discoverer) ApplicationSingletonProvider.getInstance(Discoverer.class);
+ }
+
+ private Discoverer()
+ {
+ // use getInstance()
+ }
+
+ private java.net.URL RootServiceURL = null;
+
+ private Vector<URL> ServiceURLList = null;
+
+ private boolean reallyDiscoverServices = true;
+
+ private Hashtable<String, Vector<ServiceHandle>> services = null;
+
+ public Hashtable<String, Vector<ServiceHandle>> getServices()
+ {
+ return services;
+ }
+
+ private Vector<ServiceHandle> serviceList = null;
+
+ // private ext.vamsas.IRegistry registry; // the root registry service.
+
private java.beans.PropertyChangeSupport changeSupport = new java.beans.PropertyChangeSupport(
this);
return server;
}
- static private java.net.URL RootServiceURL = null;
-
- static public Vector<URL> ServiceURLList = null;
-
- static private boolean reallyDiscoverServices = true;
-
- public static java.util.Hashtable<String, Vector<ServiceHandle>> services = null;
- // stored by
- // abstractServiceType
- // string
-
- public static java.util.Vector<ServiceHandle> serviceList = null;
-
static private Vector<URL> getDiscoveryURLS()
{
Vector<URL> urls = new Vector<>();
{
jalview.bin.Cache.log
.debug("(Re)-Initialising the discovery URL list.");
+ Discoverer d = getInstance();
try
{
- reallyDiscoverServices = jalview.bin.Cache
+ d.reallyDiscoverServices = jalview.bin.Cache
.getDefault("DISCOVERY_START", false);
- if (reallyDiscoverServices)
+ if (d.reallyDiscoverServices)
{
- ServiceURLList = getDiscoveryURLS();
+ d.ServiceURLList = getDiscoveryURLS();
}
else
{
jalview.bin.Cache.log.debug("Setting default services");
- services = new Hashtable<>();
+ d.services = new Hashtable<>();
// Muscle, Clustal and JPred.
ServiceHandle[] defServices = { new ServiceHandle("MsaWS",
"Edgar, Robert C. (2004), MUSCLE: multiple sequence alignment "
+ "\ndoi://10.1093/nar/gkv332",
"http://www.compbio.dundee.ac.uk/JalviewWS/services/jpred",
"JPred Secondary Structure Prediction") };
- services = new Hashtable<>();
- serviceList = new Vector<>();
- buildServiceLists(defServices, serviceList, services);
+ d.services = new Hashtable<>();
+ d.serviceList = new Vector<>();
+ buildServiceLists(defServices, d.serviceList, d.services);
}
} catch (Exception e)
{
System.err.println(
"jalview.rootRegistry is not a proper url!\nWas set to "
- + RootServiceURL + "\n" + e);
+ + d.RootServiceURL + "\n" + e);
}
}
// JBPNote - should do this a better way!
if (f.getFaultReason().indexOf("(407)") > -1)
{
- if (jalview.gui.Desktop.desktop != null)
+ if (jalview.gui.Desktop.getDesktopPane() != null)
{
- JvOptionPane.showMessageDialog(jalview.gui.Desktop.desktop,
+ JvOptionPane.showMessageDialog(jalview.gui.Desktop.getDesktopPane(),
MessageManager.getString("label.set_proxy_settings"),
MessageManager
.getString("label.proxy_authorization_failed"),
cat.add(sh[i]);
if (sh[i].getAbstractName().equals("Registry"))
{
- for (int s = 0, sUrls = ServiceURLList.size(); s < sUrls; s++)
+ Vector<URL> list = getInstance().ServiceURLList;
+ for (int s = 0, sUrls = list.size(); s < sUrls; s++)
{
java.net.URL disc_serv = null;
try
{
disc_serv = new java.net.URL(sh[i].getEndpointURL());
- if (!ServiceURLList.contains(disc_serv))
+ if (!list.contains(disc_serv))
{
jalview.bin.Cache.log.debug(
"Adding new discovery service at " + disc_serv);
- ServiceURLList.add(disc_serv);
+ list.add(disc_serv);
seenNewDiscovery = true;
}
} catch (Exception e)
} catch (Exception ex)
{
- JvOptionPane.showMessageDialog(Desktop.desktop,
+ JvOptionPane.showMessageDialog(Desktop.getDesktopPane(),
MessageManager.formatMessage(
"label.secondary_structure_prediction_service_couldnt_be_located",
new String[]
alignFrame = _alignFrame;
if (!sh.getAbstractName().equals("MsaWS"))
{
- JvOptionPane.showMessageDialog(Desktop.desktop,
+ JvOptionPane.showMessageDialog(Desktop.getDesktopPane(),
MessageManager.formatMessage(
"label.service_called_is_not_msa_service",
new String[]
if ((wsInfo = setWebService(sh)) == null)
{
- JvOptionPane.showMessageDialog(Desktop.desktop, MessageManager
+ JvOptionPane.showMessageDialog(Desktop.getDesktopPane(), MessageManager
.formatMessage("label.msa_service_is_unknown", new String[]
{ sh.getName() }),
MessageManager.getString("label.internal_jalview_error"),
// name to service client name
if (!sh.getAbstractName().equals(this.getServiceActionKey()))
{
- JvOptionPane.showMessageDialog(Desktop.desktop,
+ JvOptionPane.showMessageDialog(Desktop.getDesktopPane(),
MessageManager.formatMessage(
"label.service_called_is_not_seq_search_service",
new String[]
if ((wsInfo = setWebService(sh)) == null)
{
- JvOptionPane.showMessageDialog(Desktop.desktop,
+ JvOptionPane.showMessageDialog(Desktop.getDesktopPane(),
MessageManager.formatMessage(
"label.seq_search_service_is_unknown", new String[]
{ sh.getName() }),
return CALC_ID;
}
- private static String CALC_ID = "jabaws2.AACon";
+ private final static String CALC_ID = "jabaws2.AACon";
public static AlignAnalysisUIText getAlignAnalysisUITest()
{
private static final String RANGE = "RANGE";
- String typeName;
+ private String typeName;
- String methodName;
+ private String methodName;
- String groupName;
+ // private String groupName;
AlignFrame af;
- public AADisorderClient(Jws2Instance sh, AlignFrame alignFrame,
- WsParamSetI thePreset, List<Argument> paramset)
- {
- super(sh, alignFrame, thePreset, paramset);
- af = alignFrame;
- typeName = sh.action;
- methodName = sh.serviceType;
+ private final static Map<String, Map<String, String[]>> featureMap;
- submitGaps = false;
- alignedSeqs = false;
- nucleotidesAllowed = false;
- proteinAllowed = true;
- bySequence = true;
- }
+ private final static Map<String, Map<String, Map<String, Object>>> annotMap;
- @Override
- public String getServiceActionText()
- {
- return "Submitting amino acid sequences for disorder prediction.";
- }
+ private final static String DONTCOMBINE = "DONTCOMBINE";
- @Override
- boolean checkValidInputSeqs(boolean dynamic, List<FastaSequence> seqs)
- {
- return (seqs.size() > 0);
- }
-
- private static Map<String, Map<String, String[]>> featureMap;
+ private final static String INVISIBLE = "INVISIBLE";
- private static Map<String, Map<String, Map<String, Object>>> annotMap;
-
- private static String DONTCOMBINE = "DONTCOMBINE";
-
- private static String INVISIBLE = "INVISIBLE";
static
{
// TODO: turn this into some kind of configuration file that's a bit easier
amap.get("JRonn").put(RANGE, new float[] { 0, 1 });
}
+ public AADisorderClient(Jws2Instance sh, AlignFrame alignFrame,
+ WsParamSetI thePreset, List<Argument> paramset)
+ {
+ super(sh, alignFrame, thePreset, paramset);
+ af = alignFrame;
+ typeName = sh.action;
+ methodName = sh.serviceType;
+
+ submitGaps = false;
+ alignedSeqs = false;
+ nucleotidesAllowed = false;
+ proteinAllowed = true;
+ bySequence = true;
+ }
+
+ @Override
+ public String getServiceActionText()
+ {
+ return "Submitting amino acid sequences for disorder prediction.";
+ }
+
+ @Override
+ boolean checkValidInputSeqs(boolean dynamic, List<FastaSequence> seqs)
+ {
+ return (seqs.size() > 0);
+ }
+
@Override
public void updateResultAnnotation(boolean immediate)
{
if (vals.hasNext())
{
val = vals.next().floatValue();
- sf = new SequenceFeature(type[0], type[1],
- base + rn.from, base + rn.to, val, methodName);
+ sf = new SequenceFeature(type[0], type[1], base + rn.from,
+ base + rn.to, val, methodName);
}
else
{
- sf = new SequenceFeature(type[0], type[1],
- base + rn.from, base + rn.to, methodName);
+ sf = new SequenceFeature(type[0], type[1], base + rn.from,
+ base + rn.to, methodName);
}
dseq.addSequenceFeature(sf);
if (last != val && !Float.isNaN(last))
{
// check service is actually in the list of currently avaialable
// services
- if (!Jws2Discoverer.getDiscoverer().getServices().contains(service))
+ if (!Jws2Discoverer.getInstance().getServices().contains(service))
{
// it isn't ..
service = null;
if (service == null)
{
// get the default service for AACon
- service = Jws2Discoverer.getDiscoverer().getPreferredServiceFor(null,
+ service = Jws2Discoverer.getInstance().getPreferredServiceFor(null,
aaui.getServiceType());
}
if (service == null)
package jalview.ws.jws2;
import jalview.bin.Cache;
+import jalview.bin.ApplicationSingletonProvider;
+import jalview.bin.ApplicationSingletonProvider.ApplicationSingletonI;
import jalview.gui.AlignFrame;
import jalview.gui.Desktop;
import jalview.gui.JvSwingUtils;
* @author JimP
*
*/
-public class Jws2Discoverer implements Runnable, WSMenuEntryProviderI
+public class Jws2Discoverer
+ implements Runnable, WSMenuEntryProviderI, ApplicationSingletonI
{
+
+ /**
+ * Returns the singleton instance of this class.
+ *
+ * @return
+ */
+ public static Jws2Discoverer getInstance()
+ {
+ return (Jws2Discoverer) ApplicationSingletonProvider
+ .getInstance(Jws2Discoverer.class);
+ }
+
+ /**
+ * Private constructor enforces use of singleton via getDiscoverer()
+ */
+ private Jws2Discoverer()
+ {
+ // use getInstance();
+ }
+
public static final String COMPBIO_JABAWS = "http://www.compbio.dundee.ac.uk/jabaws";
/*
private final static String JWS2HOSTURLS = "JWS2HOSTURLS";
/*
- * Singleton instance
- */
- private static Jws2Discoverer discoverer;
-
- /*
* Override for testing only
*/
private static List<String> testUrls = null;
// preferred url has precedence over others
private String preferredUrl;
- private PropertyChangeSupport changeSupport = new PropertyChangeSupport(
+ protected PropertyChangeSupport changeSupport = new PropertyChangeSupport(
this);
private Vector<String> invalidServiceUrls = null;
protected Vector<Jws2Instance> services;
/**
- * Private constructor enforces use of singleton via getDiscoverer()
- */
- private Jws2Discoverer()
- {
- }
-
- /**
* change listeners are notified of "services" property changes
*
* @param listener
oldthread = Thread.currentThread();
try
{
- Class foo = getClass().getClassLoader()
+ getClass().getClassLoader()
.loadClass("compbio.ws.client.Jws2Client");
} catch (ClassNotFoundException e)
{
testUrls.add(url);
}
}
- Thread runner = getDiscoverer()
+ Thread runner = getInstance()
.startDiscoverer(new PropertyChangeListener()
{
@Override
public void propertyChange(PropertyChangeEvent evt)
{
- if (getDiscoverer().services != null)
+ if (getInstance().services != null)
{
System.out.println("Changesupport: There are now "
- + getDiscoverer().services.size() + " services");
+ + getInstance().services.size() + " services");
int i = 1;
- for (Jws2Instance instance : getDiscoverer().services)
+ for (Jws2Instance instance : getInstance().services)
{
System.out.println("Service " + i++ + " "
+ instance.getClass() + "@" + instance.getHost()
}
}
- /**
- * Returns the singleton instance of this class.
- *
- * @return
- */
- public static Jws2Discoverer getDiscoverer()
- {
- if (discoverer == null)
- {
- discoverer = new Jws2Discoverer();
- }
- return discoverer;
- }
-
public boolean hasServices()
{
return !running && services != null && services.size() > 0;
if (!(sh.service instanceof MsaWS))
{
// redundant at mo - but may change
- JvOptionPane.showMessageDialog(Desktop.desktop,
+ JvOptionPane.showMessageDialog(Desktop.getDesktopPane(),
MessageManager.formatMessage(
"label.service_called_is_not_msa_service",
new String[]
server = (MsaWS) sh.service;
if ((wsInfo = setWebService(sh, false)) == null)
{
- JvOptionPane.showMessageDialog(Desktop.desktop, MessageManager
+ JvOptionPane.showMessageDialog(Desktop.getDesktopPane(), MessageManager
.formatMessage("label.msa_service_is_unknown", new String[]
{ sh.serviceType }),
MessageManager.getString("label.internal_jalview_error"),
// The Score objects contain a set of size one containing the range and
// an ArrayList<float> of size one containing the probabilty
basePairs.put(score.getRanges().first(),
- Float.valueOf(score.getScores().get(0)));
+ new Float(score.getScores().get(0)));
}
for (int i = 0, ri = 0, iEnd = struct.length(); i < iEnd; i++, ri++)
// dan changed! dan test. comment out if conditional
// if (alignFrame.getViewport().getAlignment().isNucleotide())
// {
- // JvOptionPane.showMessageDialog(Desktop.desktop, sh.serviceType
+ // JvOptionPane.showMessageDialog(Desktop.getDesktop(), sh.serviceType
// + " can only be used\nfor amino acid alignments.",
// "Wrong type of sequences!", JvOptionPane.WARNING_MESSAGE);
// return;
@Override
public void actionPerformed(ActionEvent arg0)
{
- Desktop.instance.showUrl(service.docUrl);
+ Desktop.getInstance().showUrl(service.docUrl);
}
});
annotservice.setToolTipText(
import compbio.metadata.PresetManager;
import compbio.metadata.RunnerConfig;
-public class Jws2Instance implements AutoCloseable
+public class Jws2Instance
{
public String hosturl;
}
@Override
- public void close()
+ protected void finalize() throws Throwable
{
if (service != null)
{
// ignore
}
}
- // super.finalize();
+ super.finalize();
}
public ParamDatastoreI getParamStore()
try
{
paramStore = new JabaParamStore(this,
- (Desktop.instance != null ? Desktop.getUserParameterStore()
+ (Desktop.getInstance() != null ? Desktop.getUserParameterStore()
: null));
} catch (Exception ex)
{
*/
package jalview.ws.jws2.jabaws2;
+import jalview.bin.ApplicationSingletonProvider;
+import jalview.bin.ApplicationSingletonProvider.ApplicationSingletonI;
import jalview.ws.jws2.AAConClient;
import jalview.ws.jws2.RNAalifoldClient;
import jalview.ws.uimodel.AlignAnalysisUIText;
import compbio.data.msa.JABAService;
-public class Jws2InstanceFactory
+public class Jws2InstanceFactory implements ApplicationSingletonI
{
- private static HashMap<String, AlignAnalysisUIText> aaConGUI;
- private static HashSet<String> ignoreGUI;
+ private Jws2InstanceFactory()
+ {
+ // private singleton
+ }
+
+ private static Jws2InstanceFactory getInstance()
+ {
+ return (Jws2InstanceFactory) ApplicationSingletonProvider
+ .getInstance(Jws2InstanceFactory.class);
+ }
+
+ private HashMap<String, AlignAnalysisUIText> aaConGUI;
+
+ private HashSet<String> ignoreGUI;
private static String category_rewrite(String cat_name)
{
: cat_name;
}
- private static void init()
+ private void init()
{
if (aaConGUI == null)
{
- aaConGUI = new HashMap<String, AlignAnalysisUIText>();
+ aaConGUI = new HashMap<>();
aaConGUI.put(compbio.ws.client.Services.AAConWS.toString(),
AAConClient.getAlignAnalysisUITest());
aaConGUI.put(compbio.ws.client.Services.RNAalifoldWS.toString(),
RNAalifoldClient.getAlignAnalysisUITest());
// ignore list for JABAWS services not supported in jalview ...
- ignoreGUI = new HashSet<String>();
+ ignoreGUI = new HashSet<>();
}
}
*/
public static boolean ignoreService(String serviceType)
{
- init();
- return (ignoreGUI.contains(serviceType.toString()));
+ getInstance().init();
+ return (getInstance().ignoreGUI.contains(serviceType.toString()));
}
/**
String serviceType, String name, String description,
JABAService service)
{
- init();
+ getInstance().init();
Jws2Instance svc = new Jws2Instance(jwsservers, serviceType,
category_rewrite(name), description, service);
- svc.aaui = aaConGUI.get(serviceType.toString());
+ svc.aaui = getInstance().aaConGUI.get(serviceType.toString());
return svc;
}
*
*/
-public class HttpResultSet extends FileParse implements AutoCloseable
+public class HttpResultSet extends FileParse
{
private HttpRequestBase cachedRequest;
*/
public List<DataProvider> createResultDataProviders()
{
- List<DataProvider> dp = new ArrayList<>();
+ List<DataProvider> dp = new ArrayList<DataProvider>();
for (JvDataType type : restJob.rsd.getResultDataTypes())
{
dp.add(new SimpleDataProvider(type, this, null));
*/
public Object[] parseResultSet() throws Exception, Error
{
- List<DataProvider> dp = new ArrayList<>();
+ List<DataProvider> dp = new ArrayList<DataProvider>();
Object[] results = null;
if (en == null)
}
@Override
- public void close()
+ protected void finalize() throws Throwable
{
dataIn = null;
cachedRequest = null;
} catch (Error ex)
{
}
- // no finalize for FileParse
- // super.close();
+ super.finalize();
}
/**
package jalview.ws.rest;
import jalview.bin.Cache;
+import jalview.bin.ApplicationSingletonProvider;
+import jalview.bin.ApplicationSingletonProvider.ApplicationSingletonI;
import jalview.datamodel.AlignmentView;
import jalview.gui.AlignFrame;
import jalview.gui.AlignViewport;
*
*/
public class RestClient extends WSClient
- implements WSClientI, WSMenuEntryProviderI
+ implements WSClientI, WSMenuEntryProviderI, ApplicationSingletonI
{
- RestServiceDescription service;
+ public static final String RSBS_SERVICES = "RSBS_SERVICES";
- public RestClient(RestServiceDescription rsd)
- {
- service = rsd;
- }
+ RestServiceDescription service;
/**
* parent alignframe for this job
*/
AlignViewport av;
+ boolean headless = false;
+
+ protected Vector<String> services = null;
+
+ private static RestClient getInstance()
+ {
+ return (RestClient) ApplicationSingletonProvider.getInstance(RestClient.class);
+ }
+
+ public static RestClient makeShmmrRestClient()
+ {
+ String action = "Analysis",
+ description = "Sequence Harmony and Multi-Relief (Brandt et al. 2010)",
+ name = MessageManager.getString("label.multiharmony");
+ Hashtable<String, InputType> iparams = new Hashtable<>();
+ // jalview.ws.rest.params.JobConstant toolp;
+ // toolp = new jalview.ws.rest.JobConstant("tool","jalview");
+ // iparams.put(toolp.token, toolp);
+ // toolp = new jalview.ws.rest.params.JobConstant("mbjob[method]","shmr");
+ // iparams.put(toolp.token, toolp);
+ // toolp = new
+ // jalview.ws.rest.params.JobConstant("mbjob[description]","step 1");
+ // iparams.put(toolp.token, toolp);
+ // toolp = new jalview.ws.rest.params.JobConstant("start_search","1");
+ // iparams.put(toolp.token, toolp);
+ // toolp = new jalview.ws.rest.params.JobConstant("blast","0");
+ // iparams.put(toolp.token, toolp);
+
+ jalview.ws.rest.params.Alignment aliinput = new jalview.ws.rest.params.Alignment();
+ // SHMR server has a 65K limit for content pasted into the 'ali' parameter,
+ // so we always upload our files.
+ aliinput.token = "ali_file";
+ aliinput.writeAsFile = true;
+ iparams.put(aliinput.token, aliinput);
+ jalview.ws.rest.params.SeqGroupIndexVector sgroups = new jalview.ws.rest.params.SeqGroupIndexVector();
+ sgroups.setMinsize(2);
+ sgroups.min = 2;// need at least two group defined to make a partition
+ iparams.put("groups", sgroups);
+ sgroups.token = "groups";
+ sgroups.sep = " ";
+ RestServiceDescription shmrService = new RestServiceDescription(action,
+ description, name,
+ "http://zeus.few.vu.nl/programs/shmrwww/index.php?tool=jalview", // ?tool=jalview&mbjob[method]=shmr&mbjob[description]=step1",
+ "?tool=jalview", iparams, true, false, '-');
+ // a priori knowledge of the data returned from the service
+ shmrService.addResultDatatype(JvDataType.ANNOTATION);
+ return new RestClient(shmrService);
+ }
+
+ public static RestClient[] getRestClients()
+ {
+ RestClient c = getInstance();
+
+ if (c.services == null)
+ {
+ c.services = new Vector<>();
+ try
+ {
+ for (RestServiceDescription descr : RestServiceDescription
+ .parseDescriptions(
+ jalview.bin.Cache.getDefault(RSBS_SERVICES,
+ makeShmmrRestClient().service.toString())))
+ {
+ c.services.add(descr.toString());
+ }
+ } catch (Exception ex)
+ {
+ System.err.println(
+ "Serious - RSBS descriptions in user preferences are corrupt!");
+ ex.printStackTrace();
+ }
+
+ }
+ RestClient[] lst = new RestClient[c.services.size()];
+ int i = 0;
+ for (String svc : c.services)
+ {
+ lst[i++] = new RestClient(new RestServiceDescription(svc));
+ }
+ return lst;
+ }
+
+ public static Vector<String> getRsbsDescriptions()
+ {
+ Vector<String> rsbsDescrs = new Vector<>();
+ for (RestClient rsbs : getRestClients())
+ {
+ rsbsDescrs.add(rsbs.getRestDescription().toString());
+ }
+ return rsbsDescrs;
+ }
+
+ public static void setRsbsServices(Vector<String> rsbsUrls)
+ {
+ if (rsbsUrls != null)
+ {
+ // TODO: consider validating services ?
+ RestClient c = getInstance();
+ c.services = new Vector<>(rsbsUrls);
+ StringBuffer sprop = new StringBuffer();
+ for (String s : c.services)
+ {
+ sprop.append(s);
+ }
+ Cache.setProperty(RSBS_SERVICES, sprop.toString());
+ }
+ else
+ {
+ Cache.removeProperty(RSBS_SERVICES);
+ }
+ }
+
/**
* get the alignFrame for the associated input data if it exists.
*
return jalview.gui.Desktop.getAlignFrameFor(av);
}
+ private RestClient()
+ {
+
+ }
+
+ public RestClient(RestServiceDescription rsd)
+ {
+ service = rsd;
+ }
+
public RestClient(RestServiceDescription service2, AlignFrame alignFrame)
{
this(service2, alignFrame, false);
}
- boolean headless = false;
-
public RestClient(RestServiceDescription service2, AlignFrame alignFrame,
boolean nogui)
{
else
{
// TODO: try to tell the user why the job couldn't be started.
- JvOptionPane.showMessageDialog(Desktop.desktop,
+ JvOptionPane.showMessageDialog(Desktop.getDesktopPane(),
(jobsthread.hasWarnings() ? jobsthread.getWarnings()
: MessageManager.getString(
"label.job_couldnt_be_started_check_input")),
}
}
- public static RestClient makeShmmrRestClient()
- {
- String action = "Analysis",
- description = "Sequence Harmony and Multi-Relief (Brandt et al. 2010)",
- name = MessageManager.getString("label.multiharmony");
- Hashtable<String, InputType> iparams = new Hashtable<String, InputType>();
- jalview.ws.rest.params.JobConstant toolp;
- // toolp = new jalview.ws.rest.JobConstant("tool","jalview");
- // iparams.put(toolp.token, toolp);
- // toolp = new jalview.ws.rest.params.JobConstant("mbjob[method]","shmr");
- // iparams.put(toolp.token, toolp);
- // toolp = new
- // jalview.ws.rest.params.JobConstant("mbjob[description]","step 1");
- // iparams.put(toolp.token, toolp);
- // toolp = new jalview.ws.rest.params.JobConstant("start_search","1");
- // iparams.put(toolp.token, toolp);
- // toolp = new jalview.ws.rest.params.JobConstant("blast","0");
- // iparams.put(toolp.token, toolp);
-
- jalview.ws.rest.params.Alignment aliinput = new jalview.ws.rest.params.Alignment();
- // SHMR server has a 65K limit for content pasted into the 'ali' parameter,
- // so we always upload our files.
- aliinput.token = "ali_file";
- aliinput.writeAsFile = true;
- iparams.put(aliinput.token, aliinput);
- jalview.ws.rest.params.SeqGroupIndexVector sgroups = new jalview.ws.rest.params.SeqGroupIndexVector();
- sgroups.setMinsize(2);
- sgroups.min = 2;// need at least two group defined to make a partition
- iparams.put("groups", sgroups);
- sgroups.token = "groups";
- sgroups.sep = " ";
- RestServiceDescription shmrService = new RestServiceDescription(action,
- description, name,
- "http://zeus.few.vu.nl/programs/shmrwww/index.php?tool=jalview", // ?tool=jalview&mbjob[method]=shmr&mbjob[description]=step1",
- "?tool=jalview", iparams, true, false, '-');
- // a priori knowledge of the data returned from the service
- shmrService.addResultDatatype(JvDataType.ANNOTATION);
- return new RestClient(shmrService);
- }
-
public AlignmentPanel recoverAlignPanelForView()
{
AlignmentPanel[] aps = Desktop
return true;
}
- protected static Vector<String> services = null;
-
- public static final String RSBS_SERVICES = "RSBS_SERVICES";
-
- public static RestClient[] getRestClients()
- {
- if (services == null)
- {
- services = new Vector<String>();
- try
- {
- for (RestServiceDescription descr : RestServiceDescription
- .parseDescriptions(
- jalview.bin.Cache.getDefault(RSBS_SERVICES,
- makeShmmrRestClient().service.toString())))
- {
- services.add(descr.toString());
- }
- } catch (Exception ex)
- {
- System.err.println(
- "Serious - RSBS descriptions in user preferences are corrupt!");
- ex.printStackTrace();
- }
-
- }
- RestClient[] lst = new RestClient[services.size()];
- int i = 0;
- for (String svc : services)
- {
- lst[i++] = new RestClient(new RestServiceDescription(svc));
- }
- return lst;
- }
-
public String getAction()
{
return service.details.Action;
return service;
}
- public static Vector<String> getRsbsDescriptions()
- {
- Vector<String> rsbsDescrs = new Vector<String>();
- for (RestClient rsbs : getRestClients())
- {
- rsbsDescrs.add(rsbs.getRestDescription().toString());
- }
- return rsbsDescrs;
- }
-
- public static void setRsbsServices(Vector<String> rsbsUrls)
- {
- if (rsbsUrls != null)
- {
- // TODO: consider validating services ?
- services = new Vector<String>(rsbsUrls);
- StringBuffer sprop = new StringBuffer();
- for (String s : services)
- {
- sprop.append(s);
- }
- Cache.setProperty(RSBS_SERVICES, sprop.toString());
- }
- else
- {
- Cache.removeProperty(RSBS_SERVICES);
- }
- }
-
}
import java.util.Hashtable;
import java.util.List;
import java.util.Map;
+import java.util.Map.Entry;
import java.util.Stack;
import java.util.Vector;
/*
* set of databases we can retrieve entries from
*/
- protected Hashtable<String, Map<String, DbSourceProxy>> fetchableDbs;
+ protected Hashtable<String, Map<String, DbSourceProxyRoot>> fetchableDbs;
/*
* comparator to sort by tier (0/1/2) and name
*/
protected ASequenceFetcher()
{
- super();
-
/*
* comparator to sort proxies by tier and name
*/
public List<DbSourceProxy> getSourceProxy(String db)
{
db = DBRefUtils.getCanonicalName(db);
- Map<String, DbSourceProxy> dblist = fetchableDbs.get(db);
+ Map<String, DbSourceProxyRoot> dblist = fetchableDbs.get(db);
if (dblist == null)
{
return new ArrayList<>();
/*
* sort so that primary sources precede secondary
*/
- List<DbSourceProxy> dbs = new ArrayList<>(dblist.values());
+ List<DbSourceProxy> dbs = new ArrayList<>();
+ for (Entry<String, DbSourceProxyRoot> entry : dblist.entrySet())
+ {
+ DbSourceProxyRoot proxy = entry.getValue();
+ if (proxy instanceof DbRoot)
+ {
+ proxy = setProxy((DbRoot) proxy, dblist);
+ }
+ dbs.add((DbSourceProxy) proxy);
+ }
Collections.sort(dbs, proxyComparator);
return dbs;
}
+ class DbRoot implements DbSourceProxyRoot
+ {
+
+ private String sourceName;
+
+ private String className;
+
+ DbRoot(String sourceName, String className)
+ {
+ this.sourceName = sourceName;
+ this.className = className;
+ }
+
+ @Override
+ public String getDbSource()
+ {
+ return sourceName;
+ }
+
+ /**
+ * lazy class creation
+ *
+ * @return the actual proxy object
+ */
+ public DbSourceProxy getProxy()
+ {
+ try
+ {
+ System.err.println("ASeqFetch " + className);
+ return (DbSourceProxy) Class.forName(className).newInstance();
+ } catch (Exception e)
+ {
+ // Serious problems if this happens.
+ throw new Error(MessageManager.getString(
+ "error.dbrefsource_implementation_exception"), e);
+ }
+ }
+
+ }
+
/**
* constructs an instance of the proxy and registers it as a valid dbrefsource
*
- * @param dbSourceProxy
+ * @param dbSourceProxyClass
* reference for class implementing
* jalview.ws.seqfetcher.DbSourceProxy
*/
protected void addDBRefSourceImpl(
- Class<? extends DbSourceProxy> dbSourceProxy)
+ Class<? extends DbSourceProxy> dbSourceProxyClass)
throws IllegalArgumentException
{
DbSourceProxy proxy = null;
try
{
- DbSourceProxy proxyObj = dbSourceProxy.getConstructor().newInstance();
- proxy = proxyObj;
+ proxy = dbSourceProxyClass.getConstructor().newInstance();
} catch (IllegalArgumentException e)
{
throw e;
addDbRefSourceImpl(proxy);
}
+ public void addDBRefSourceImpl(String sourceName, String className)
+ {
+ addDbRefSourceImpl(new DbRoot(sourceName, className));
+ }
+
/**
* add the properly initialised DbSourceProxy object 'proxy' to the list of
* sequence fetchers
*
* @param proxy
*/
- protected void addDbRefSourceImpl(DbSourceProxy proxy)
+ void addDbRefSourceImpl(DbSourceProxyRoot proxy)
{
if (proxy != null)
{
{
fetchableDbs = new Hashtable<>();
}
- Map<String, DbSourceProxy> slist = fetchableDbs
- .get(proxy.getDbSource());
+ String key = proxy.getDbSource();
+ Map<String, DbSourceProxyRoot> slist = fetchableDbs.get(key);
if (slist == null)
{
- fetchableDbs.put(proxy.getDbSource(),
- slist = new Hashtable<>());
+ fetchableDbs.put(key, slist = new Hashtable<>());
+ }
+ if (proxy instanceof DbRoot)
+ {
+ slist.put("", proxy);
+ }
+ else
+ {
+ slist.put(((DbSourceProxy) proxy).getDbName(), proxy);
}
- slist.put(proxy.getDbName(), proxy);
}
}
/**
* select sources which are implemented by instances of the given class
*
- * @param class
+ * @param class1
* that implements DbSourceProxy
* @return null or vector of source names for fetchers
*/
- public String[] getDbInstances(Class class1)
+ public String[] getDbInstances(Class<?> class1)
{
if (!DbSourceProxy.class.isAssignableFrom(class1))
{
{
return null;
}
- String[] sources = null;
Vector<String> src = new Vector<>();
- Enumeration<String> dbs = fetchableDbs.keys();
- while (dbs.hasMoreElements())
+ for (String dbSource : fetchableDbs.keySet())
{
- String dbn = dbs.nextElement();
- for (DbSourceProxy dbp : fetchableDbs.get(dbn).values())
+ Map<String, DbSourceProxyRoot> dblist = fetchableDbs.get(dbSource);
+ for (Entry<String, DbSourceProxyRoot> entry : dblist.entrySet())
{
- if (class1.isAssignableFrom(dbp.getClass()))
+ DbSourceProxyRoot proxy = entry.getValue();
+ if (proxy instanceof DbRoot)
{
- src.addElement(dbn);
+ proxy = setProxy((DbRoot) proxy, dblist);
+ }
+ Class<?> c = proxy.getClass();
+ if (class1 == c || class1.isAssignableFrom(c))
+ {
+ src.addElement(dbSource);
}
}
}
+ String[] sources = null;
if (src.size() > 0)
{
src.copyInto(sources = new String[src.size()]);
return sources;
}
- public DbSourceProxy[] getDbSourceProxyInstances(Class class1)
+ private DbSourceProxyRoot setProxy(DbRoot root,
+ Map<String, DbSourceProxyRoot> dblist)
+ {
+ DbSourceProxy proxy = root.getProxy();
+ // Time to create the actual proxy
+ dblist.remove("");
+ dblist.put(proxy.getDbName(), proxy);
+ return proxy;
+ }
+
+ public DbSourceProxy[] getDbSourceProxyInstances(Class<?> class1)
{
+ if (fetchableDbs == null)
+ {
+ return null;
+ }
List<DbSourceProxy> prlist = new ArrayList<>();
- for (String fetchable : getSupportedDb())
+ for (String fetchable : fetchableDbs.keySet())
{
for (DbSourceProxy pr : getSourceProxy(fetchable))
{
*
* @author JimP
*/
-public interface DbSourceProxy
+public interface DbSourceProxy extends DbSourceProxyRoot
{
/**
- *
- * @return source string constant used for this DB source
- */
- String getDbSource();
-
- /**
* Short meaningful name for this data source for display in menus or
* selection boxes.
*
--- /dev/null
+package jalview.ws.seqfetcher;
+
+public interface DbSourceProxyRoot
+{
+ /**
+ *
+ * @return source string constant used for this DB source
+ */
+ String getDbSource();
+
+}
*/
private static File mockSiftsFile;
+ private static final int BUFFER_SIZE = 4096;
+
+ public static final int UNASSIGNED = Integer.MIN_VALUE;
+
+ private static final int PDB_RES_POS = 0;
+
+ private static final int PDB_ATOM_POS = 1;
+
+ private static final int PDBE_POS = 2;
+
+ private static final String NOT_OBSERVED = "Not_Observed";
+
+ protected static final String SIFTS_FTP_BASE_URL = "http://ftp.ebi.ac.uk/pub/databases/msd/sifts/xml/";
+
+ protected final static String NEWLINE = System.lineSeparator();
+
private Entry siftsEntry;
private StructureFile pdb;
*/
private jalview.datamodel.Mapping seqFromPdbMapping;
- private static final int BUFFER_SIZE = 4096;
-
- public static final int UNASSIGNED = Integer.MIN_VALUE;
-
- private static final int PDB_RES_POS = 0;
-
- private static final int PDB_ATOM_POS = 1;
-
- private static final int PDBE_POS = 2;
-
- private static final String NOT_OBSERVED = "Not_Observed";
-
- private static final String SIFTS_FTP_BASE_URL = "http://ftp.ebi.ac.uk/pub/databases/msd/sifts/xml/";
-
- private final static String NEWLINE = System.lineSeparator();
-
private String curSourceDBRef;
private HashSet<String> curDBRefAccessionIdsString;
@Override
public HashSet<String> getAllMappingAccession()
{
- HashSet<String> accessions = new HashSet<String>();
+ HashSet<String> accessions = new HashSet<>();
List<Entity> entities = siftsEntry.getEntity();
for (Entity entity : entities)
{
entity = getEntityById(entityId);
String originalSeq = AlignSeq.extractGaps(
jalview.util.Comparison.GapChars, seq.getSequenceAsString());
- HashMap<Integer, int[]> mapping = new HashMap<Integer, int[]>();
+ HashMap<Integer, int[]> mapping = new HashMap<>();
DBRefEntryI sourceDBRef;
sourceDBRef = getValidSourceDBRef(seq);
// TODO ensure sequence start/end is in the same coordinate system and
seqCoordSys = CoordinateSys.PDB;
}
- HashSet<String> dbRefAccessionIdsString = new HashSet<String>();
+ HashSet<String> dbRefAccessionIdsString = new HashSet<>();
for (DBRefEntry dbref : seq.getDBRefs())
{
dbRefAccessionIdsString.add(dbref.getAccessionId().toLowerCase());
curDBRefAccessionIdsString = dbRefAccessionIdsString;
curSourceDBRef = sourceDBRef.getAccessionId();
- TreeMap<Integer, String> resNumMap = new TreeMap<Integer, String>();
+ TreeMap<Integer, String> resNumMap = new TreeMap<>();
List<Segment> segments = entity.getSegment();
SegmentHelperPojo shp = new SegmentHelperPojo(seq, mapping, resNumMap,
omitNonObserved, nonObservedShiftIndex,pdbeNonObserved);
}
if (!isObserved)
{
- ++pdbeNonObservedCount;
+ ++pdbeNonObservedCount; // TODO this value is never used
}
- if (seqCoordSys == seqCoordSys.PDB) // FIXME: is seqCoordSys ever PDBe
+ if (seqCoordSys == CoordinateSys.PDB) // FIXME: is seqCoordSys ever PDBe
// ???
{
// if the sequence has a primary reference to the PDB, then we are
private Set<String> getResidueAnnotaitons(Residue residue,
ResidueDetailType type)
{
- HashSet<String> foundAnnotations = new HashSet<String>();
+ HashSet<String> foundAnnotations = new HashSet<>();
List<ResidueDetail> resDetails = residue.getResidueDetail();
for (ResidueDetail resDetail : resDetails)
{
public int resCount;
+ protected SiftsEntitySortPojo()
+ {
+ }
+
@Override
public int compareTo(SiftsEntitySortPojo o)
{
{
return pdbeNonObserved;
}
+
public SequenceI getSeq()
{
return seq;
*/
package jalview.ws.sifts;
+import jalview.bin.ApplicationSingletonProvider;
+import jalview.bin.ApplicationSingletonProvider.ApplicationSingletonI;
+
import java.util.Objects;
-public class SiftsSettings
+public class SiftsSettings implements ApplicationSingletonI
{
- private static boolean mapWithSifts = false;
- private static String siftDownloadDirectory;
+ /**
+ * public only for testng
+ *
+ * @return
+ */
+ public static SiftsSettings getInstance()
+ {
+ return (SiftsSettings) ApplicationSingletonProvider
+ .getInstance(SiftsSettings.class);
+ }
+
+ private SiftsSettings()
+ {
+ // singleton; use getInstance()
+ }
+
+ private boolean mapWithSifts = false;
+
+ private String siftDownloadDirectory;
- private static int cacheThresholdInDays;
+ private int cacheThresholdInDays;
- private static int failSafePIDThreshold;
+ private int failSafePIDThreshold;
public static boolean isMapWithSifts()
{
- return mapWithSifts;
+ return getInstance().mapWithSifts;
}
public static void setMapWithSifts(boolean mapWithSifts)
{
- SiftsSettings.mapWithSifts = mapWithSifts;
+ getInstance().mapWithSifts = mapWithSifts;
}
public static String getSiftDownloadDirectory()
{
- return siftDownloadDirectory;
+ return getInstance().siftDownloadDirectory;
}
public static void setSiftDownloadDirectory(String siftDownloadDirectory)
{
- SiftsSettings.siftDownloadDirectory = siftDownloadDirectory;
+ getInstance().siftDownloadDirectory = siftDownloadDirectory;
}
public static int getCacheThresholdInDays()
{
- return cacheThresholdInDays;
+ return getInstance().cacheThresholdInDays;
}
public static void setCacheThresholdInDays(String cacheThresholdInDays)
{
Objects.requireNonNull(cacheThresholdInDays);
- SiftsSettings.cacheThresholdInDays = Integer
+ getInstance().cacheThresholdInDays = Integer
.valueOf(cacheThresholdInDays);
}
public static int getFailSafePIDThreshold()
{
- return failSafePIDThreshold;
+ return getInstance().failSafePIDThreshold;
}
public static void setFailSafePIDThreshold(String failSafePIDThreshold)
{
Objects.requireNonNull(failSafePIDThreshold);
- SiftsSettings.failSafePIDThreshold = Integer
+ getInstance().failSafePIDThreshold = Integer
.valueOf(failSafePIDThreshold);
}
}
+++ /dev/null
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a>
-// Any modifications to this file will be lost upon recompilation of the source schema.
-// Generated on: 2018.09.18 at 01:33:02 PM BST
-//
-
-
-package jalview.xml.binding.jalview;
-
-import java.util.ArrayList;
-import java.util.List;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlID;
-import javax.xml.bind.annotation.XmlSchemaType;
-import javax.xml.bind.annotation.XmlType;
-import javax.xml.bind.annotation.XmlValue;
-import javax.xml.bind.annotation.adapters.CollapsedStringAdapter;
-import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
-import javax.xml.datatype.XMLGregorianCalendar;
-
-
-/**
- * <p>Java class for JalviewModelType complex type.
- *
- * <p>The following schema fragment specifies the expected content contained within this class.
- *
- * <pre>
- * <complexType name="JalviewModelType">
- * <complexContent>
- * <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- * <sequence>
- * <element name="creationDate" type="{http://www.w3.org/2001/XMLSchema}dateTime"/>
- * <element name="version" type="{http://www.w3.org/2001/XMLSchema}string"/>
- * <element name="vamsasModel" type="{www.vamsas.ac.uk/jalview/version2}VAMSAS"/>
- * <sequence>
- * <element name="JSeq" maxOccurs="unbounded" minOccurs="0">
- * <complexType>
- * <complexContent>
- * <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- * <sequence>
- * <element name="features" type="{www.jalview.org}feature" maxOccurs="unbounded" minOccurs="0"/>
- * <element name="pdbids" maxOccurs="unbounded" minOccurs="0">
- * <complexType>
- * <complexContent>
- * <extension base="{www.jalview.org}pdbentry">
- * <sequence>
- * <element name="structureState" maxOccurs="unbounded" minOccurs="0">
- * <complexType>
- * <simpleContent>
- * <extension base="<http://www.w3.org/2001/XMLSchema>string">
- * <attGroup ref="{www.jalview.org}swingwindow"/>
- * <attribute name="visible" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- * <attribute name="viewId" type="{http://www.w3.org/2001/XMLSchema}string" />
- * <attribute name="alignwithAlignPanel" type="{http://www.w3.org/2001/XMLSchema}boolean" default="true" />
- * <attribute name="colourwithAlignPanel" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />
- * <attribute name="colourByJmol" type="{http://www.w3.org/2001/XMLSchema}boolean" default="true" />
- * <attribute name="type" type="{http://www.w3.org/2001/XMLSchema}string" />
- * </extension>
- * </simpleContent>
- * </complexType>
- * </element>
- * </sequence>
- * </extension>
- * </complexContent>
- * </complexType>
- * </element>
- * <element name="hiddenSequences" type="{http://www.w3.org/2001/XMLSchema}int" maxOccurs="unbounded" minOccurs="0"/>
- * <element name="rnaViewer" maxOccurs="unbounded" minOccurs="0">
- * <complexType>
- * <complexContent>
- * <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- * <sequence>
- * <element name="secondaryStructure" maxOccurs="unbounded">
- * <complexType>
- * <complexContent>
- * <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- * <attribute name="title" type="{http://www.w3.org/2001/XMLSchema}string" />
- * <attribute name="annotationId" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
- * <attribute name="gapped" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- * <attribute name="viewerState" type="{http://www.w3.org/2001/XMLSchema}string" />
- * </restriction>
- * </complexContent>
- * </complexType>
- * </element>
- * </sequence>
- * <attGroup ref="{www.jalview.org}swingwindow"/>
- * <attribute name="title" type="{http://www.w3.org/2001/XMLSchema}string" />
- * <attribute name="viewId" type="{http://www.w3.org/2001/XMLSchema}string" />
- * <attribute name="dividerLocation" type="{http://www.w3.org/2001/XMLSchema}int" />
- * <attribute name="selectedRna" type="{http://www.w3.org/2001/XMLSchema}int" />
- * </restriction>
- * </complexContent>
- * </complexType>
- * </element>
- * </sequence>
- * <attribute name="colour" type="{http://www.w3.org/2001/XMLSchema}int" />
- * <attribute name="start" use="required" type="{http://www.w3.org/2001/XMLSchema}int" />
- * <attribute name="end" use="required" type="{http://www.w3.org/2001/XMLSchema}int" />
- * <attribute name="id" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
- * <attribute name="hidden" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- * <attribute name="viewreference" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- * </restriction>
- * </complexContent>
- * </complexType>
- * </element>
- * <element name="JGroup" maxOccurs="unbounded" minOccurs="0">
- * <complexType>
- * <complexContent>
- * <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- * <sequence>
- * <element name="seq" type="{http://www.w3.org/2001/XMLSchema}string" maxOccurs="unbounded"/>
- * <element name="annotationColours" type="{www.jalview.org}AnnotationColourScheme" minOccurs="0"/>
- * </sequence>
- * <attribute name="start" type="{http://www.w3.org/2001/XMLSchema}int" />
- * <attribute name="end" type="{http://www.w3.org/2001/XMLSchema}int" />
- * <attribute name="name" type="{http://www.w3.org/2001/XMLSchema}string" />
- * <attribute name="colour" type="{http://www.w3.org/2001/XMLSchema}string" />
- * <attribute name="consThreshold" type="{http://www.w3.org/2001/XMLSchema}int" />
- * <attribute name="pidThreshold" type="{http://www.w3.org/2001/XMLSchema}int" />
- * <attribute name="outlineColour" type="{http://www.w3.org/2001/XMLSchema}int" />
- * <attribute name="displayBoxes" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- * <attribute name="displayText" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- * <attribute name="colourText" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- * <attribute name="textCol1" type="{http://www.w3.org/2001/XMLSchema}int" />
- * <attribute name="textCol2" type="{http://www.w3.org/2001/XMLSchema}int" />
- * <attribute name="textColThreshold" type="{http://www.w3.org/2001/XMLSchema}int" />
- * <attribute name="showUnconserved" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- * <attribute name="ignoreGapsinConsensus" type="{http://www.w3.org/2001/XMLSchema}boolean" default="true" />
- * <attribute name="showConsensusHistogram" type="{http://www.w3.org/2001/XMLSchema}boolean" default="true" />
- * <attribute name="showSequenceLogo" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />
- * <attribute name="normaliseSequenceLogo" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />
- * <attribute name="id" type="{http://www.w3.org/2001/XMLSchema}string" />
- * </restriction>
- * </complexContent>
- * </complexType>
- * </element>
- * <element name="Viewport" maxOccurs="unbounded" minOccurs="0">
- * <complexType>
- * <complexContent>
- * <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- * <sequence>
- * <element name="AnnotationColours" type="{www.jalview.org}AnnotationColourScheme" minOccurs="0"/>
- * <element name="hiddenColumns" maxOccurs="unbounded" minOccurs="0">
- * <complexType>
- * <complexContent>
- * <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- * <attribute name="start" type="{http://www.w3.org/2001/XMLSchema}int" />
- * <attribute name="end" type="{http://www.w3.org/2001/XMLSchema}int" />
- * </restriction>
- * </complexContent>
- * </complexType>
- * </element>
- * <element name="calcIdParam" maxOccurs="unbounded" minOccurs="0">
- * <complexType>
- * <complexContent>
- * <extension base="{www.jalview.org/xml/wsparamset}WebServiceParameterSet">
- * <attribute name="calcId" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
- * <attribute name="needsUpdate" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />
- * <attribute name="autoUpdate" use="required" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- * </extension>
- * </complexContent>
- * </complexType>
- * </element>
- * </sequence>
- * <attGroup ref="{www.jalview.org}swingwindow"/>
- * <attribute name="conservationSelected" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- * <attribute name="pidSelected" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- * <attribute name="bgColour" type="{http://www.w3.org/2001/XMLSchema}string" />
- * <attribute name="consThreshold" type="{http://www.w3.org/2001/XMLSchema}int" />
- * <attribute name="pidThreshold" type="{http://www.w3.org/2001/XMLSchema}int" />
- * <attribute name="title" type="{http://www.w3.org/2001/XMLSchema}string" />
- * <attribute name="showFullId" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- * <attribute name="rightAlignIds" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- * <attribute name="showText" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- * <attribute name="showColourText" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- * <attribute name="showUnconserved" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />
- * <attribute name="showBoxes" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- * <attribute name="wrapAlignment" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- * <attribute name="renderGaps" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- * <attribute name="showSequenceFeatures" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- * <attribute name="showNPfeatureTooltip" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- * <attribute name="showDbRefTooltip" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- * <attribute name="followHighlight" type="{http://www.w3.org/2001/XMLSchema}boolean" default="true" />
- * <attribute name="followSelection" type="{http://www.w3.org/2001/XMLSchema}boolean" default="true" />
- * <attribute name="showAnnotation" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- * <attribute name="centreColumnLabels" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />
- * <attribute name="showGroupConservation" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />
- * <attribute name="showGroupConsensus" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />
- * <attribute name="showConsensusHistogram" type="{http://www.w3.org/2001/XMLSchema}boolean" default="true" />
- * <attribute name="showSequenceLogo" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />
- * <attribute name="normaliseSequenceLogo" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />
- * <attribute name="ignoreGapsinConsensus" type="{http://www.w3.org/2001/XMLSchema}boolean" default="true" />
- * <attribute name="startRes" type="{http://www.w3.org/2001/XMLSchema}int" />
- * <attribute name="startSeq" type="{http://www.w3.org/2001/XMLSchema}int" />
- * <attribute name="fontName" type="{http://www.w3.org/2001/XMLSchema}string" />
- * <attribute name="fontSize" type="{http://www.w3.org/2001/XMLSchema}int" />
- * <attribute name="fontStyle" type="{http://www.w3.org/2001/XMLSchema}int" />
- * <attribute name="scaleProteinAsCdna" type="{http://www.w3.org/2001/XMLSchema}boolean" default="true" />
- * <attribute name="viewName" type="{http://www.w3.org/2001/XMLSchema}string" />
- * <attribute name="sequenceSetId" type="{http://www.w3.org/2001/XMLSchema}string" />
- * <attribute name="gatheredViews" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- * <attribute name="textCol1" type="{http://www.w3.org/2001/XMLSchema}int" />
- * <attribute name="textCol2" type="{http://www.w3.org/2001/XMLSchema}int" />
- * <attribute name="textColThreshold" type="{http://www.w3.org/2001/XMLSchema}int" />
- * <attribute name="id" type="{http://www.w3.org/2001/XMLSchema}ID" />
- * <attribute name="complementId" type="{http://www.w3.org/2001/XMLSchema}string" />
- * </restriction>
- * </complexContent>
- * </complexType>
- * </element>
- * <element name="UserColours" maxOccurs="unbounded" minOccurs="0">
- * <complexType>
- * <complexContent>
- * <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- * <sequence>
- * <element name="UserColourScheme" type="{www.jalview.org/colours}JalviewUserColours"/>
- * </sequence>
- * <attribute name="id" type="{http://www.w3.org/2001/XMLSchema}string" />
- * </restriction>
- * </complexContent>
- * </complexType>
- * </element>
- * <element name="tree" maxOccurs="unbounded" minOccurs="0">
- * <complexType>
- * <complexContent>
- * <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- * <sequence minOccurs="0">
- * <element name="title" type="{http://www.w3.org/2001/XMLSchema}string"/>
- * <element name="newick" type="{http://www.w3.org/2001/XMLSchema}string"/>
- * </sequence>
- * <attGroup ref="{www.jalview.org}swingwindow"/>
- * <attribute name="fontName" type="{http://www.w3.org/2001/XMLSchema}string" />
- * <attribute name="fontSize" type="{http://www.w3.org/2001/XMLSchema}int" />
- * <attribute name="fontStyle" type="{http://www.w3.org/2001/XMLSchema}int" />
- * <attribute name="threshold" type="{http://www.w3.org/2001/XMLSchema}float" />
- * <attribute name="showBootstrap" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- * <attribute name="showDistances" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- * <attribute name="markUnlinked" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- * <attribute name="fitToWindow" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- * <attribute name="currentTree" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- * <attribute name="id" type="{http://www.w3.org/2001/XMLSchema}ID" />
- * </restriction>
- * </complexContent>
- * </complexType>
- * </element>
- * <element name="FeatureSettings" minOccurs="0">
- * <complexType>
- * <complexContent>
- * <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- * <sequence>
- * <element name="setting" maxOccurs="unbounded" minOccurs="0">
- * <complexType>
- * <complexContent>
- * <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- * <sequence>
- * <element name="attributeName" type="{http://www.w3.org/2001/XMLSchema}string" maxOccurs="2" minOccurs="0"/>
- * <element name="matcherSet" type="{www.jalview.org/colours}FeatureMatcherSet" minOccurs="0"/>
- * </sequence>
- * <attribute name="type" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
- * <attribute name="colour" use="required" type="{http://www.w3.org/2001/XMLSchema}int" />
- * <attribute name="display" use="required" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- * <attribute name="order" type="{http://www.w3.org/2001/XMLSchema}float" />
- * <attribute name="mincolour" type="{http://www.w3.org/2001/XMLSchema}int" />
- * <attribute name="noValueColour" type="{www.jalview.org/colours}NoValueColour" default="Min" />
- * <attribute name="threshold" type="{http://www.w3.org/2001/XMLSchema}float" />
- * <attribute name="threshstate" type="{http://www.w3.org/2001/XMLSchema}int" />
- * <attribute name="max" type="{http://www.w3.org/2001/XMLSchema}float" />
- * <attribute name="min" type="{http://www.w3.org/2001/XMLSchema}float" />
- * <attribute name="colourByLabel" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- * <attribute name="autoScale" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- * </restriction>
- * </complexContent>
- * </complexType>
- * </element>
- * <element name="group" maxOccurs="unbounded" minOccurs="0">
- * <complexType>
- * <complexContent>
- * <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- * <attribute name="name" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
- * <attribute name="display" use="required" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- * </restriction>
- * </complexContent>
- * </complexType>
- * </element>
- * </sequence>
- * </restriction>
- * </complexContent>
- * </complexType>
- * </element>
- * </sequence>
- * </sequence>
- * </restriction>
- * </complexContent>
- * </complexType>
- * </pre>
- *
- *
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "JalviewModelType", namespace = "www.jalview.org", propOrder = {
- "creationDate",
- "version",
- "vamsasModel",
- "jSeq",
- "jGroup",
- "viewport",
- "userColours",
- "tree",
- "featureSettings"
-})
-public class JalviewModelType {
-
- @XmlElement(required = true)
- @XmlSchemaType(name = "dateTime")
- protected XMLGregorianCalendar creationDate;
- @XmlElement(required = true)
- protected String version;
- @XmlElement(required = true)
- protected VAMSAS vamsasModel;
- @XmlElement(name = "JSeq")
- protected List<JalviewModelType.JSeq> jSeq;
- @XmlElement(name = "JGroup")
- protected List<JalviewModelType.JGroup> jGroup;
- @XmlElement(name = "Viewport")
- protected List<JalviewModelType.Viewport> viewport;
- @XmlElement(name = "UserColours")
- protected List<JalviewModelType.UserColours> userColours;
- protected List<JalviewModelType.Tree> tree;
- @XmlElement(name = "FeatureSettings")
- protected JalviewModelType.FeatureSettings featureSettings;
-
- /**
- * Gets the value of the creationDate property.
- *
- * @return
- * possible object is
- * {@link XMLGregorianCalendar }
- *
- */
- public XMLGregorianCalendar getCreationDate() {
- return creationDate;
- }
-
- /**
- * Sets the value of the creationDate property.
- *
- * @param value
- * allowed object is
- * {@link XMLGregorianCalendar }
- *
- */
- public void setCreationDate(XMLGregorianCalendar value) {
- this.creationDate = value;
- }
-
- /**
- * Gets the value of the version property.
- *
- * @return
- * possible object is
- * {@link String }
- *
- */
- public String getVersion() {
- return version;
- }
-
- /**
- * Sets the value of the version property.
- *
- * @param value
- * allowed object is
- * {@link String }
- *
- */
- public void setVersion(String value) {
- this.version = value;
- }
-
- /**
- * Gets the value of the vamsasModel property.
- *
- * @return
- * possible object is
- * {@link VAMSAS }
- *
- */
- public VAMSAS getVamsasModel() {
- return vamsasModel;
- }
-
- /**
- * Sets the value of the vamsasModel property.
- *
- * @param value
- * allowed object is
- * {@link VAMSAS }
- *
- */
- public void setVamsasModel(VAMSAS value) {
- this.vamsasModel = value;
- }
-
- /**
- * Gets the value of the jSeq property.
- *
- * <p>
- * This accessor method returns a reference to the live list,
- * not a snapshot. Therefore any modification you make to the
- * returned list will be present inside the JAXB object.
- * This is why there is not a <CODE>set</CODE> method for the jSeq property.
- *
- * <p>
- * For example, to add a new item, do as follows:
- * <pre>
- * getJSeq().add(newItem);
- * </pre>
- *
- *
- * <p>
- * Objects of the following type(s) are allowed in the list
- * {@link JalviewModelType.JSeq }
- *
- *
- */
- public List<JalviewModelType.JSeq> getJSeq() {
- if (jSeq == null) {
- jSeq = new ArrayList<JalviewModelType.JSeq>();
- }
- return this.jSeq;
- }
-
- /**
- * Gets the value of the jGroup property.
- *
- * <p>
- * This accessor method returns a reference to the live list,
- * not a snapshot. Therefore any modification you make to the
- * returned list will be present inside the JAXB object.
- * This is why there is not a <CODE>set</CODE> method for the jGroup property.
- *
- * <p>
- * For example, to add a new item, do as follows:
- * <pre>
- * getJGroup().add(newItem);
- * </pre>
- *
- *
- * <p>
- * Objects of the following type(s) are allowed in the list
- * {@link JalviewModelType.JGroup }
- *
- *
- */
- public List<JalviewModelType.JGroup> getJGroup() {
- if (jGroup == null) {
- jGroup = new ArrayList<JalviewModelType.JGroup>();
- }
- return this.jGroup;
- }
-
- /**
- * Gets the value of the viewport property.
- *
- * <p>
- * This accessor method returns a reference to the live list,
- * not a snapshot. Therefore any modification you make to the
- * returned list will be present inside the JAXB object.
- * This is why there is not a <CODE>set</CODE> method for the viewport property.
- *
- * <p>
- * For example, to add a new item, do as follows:
- * <pre>
- * getViewport().add(newItem);
- * </pre>
- *
- *
- * <p>
- * Objects of the following type(s) are allowed in the list
- * {@link JalviewModelType.Viewport }
- *
- *
- */
- public List<JalviewModelType.Viewport> getViewport() {
- if (viewport == null) {
- viewport = new ArrayList<JalviewModelType.Viewport>();
- }
- return this.viewport;
- }
-
- /**
- * Gets the value of the userColours property.
- *
- * <p>
- * This accessor method returns a reference to the live list,
- * not a snapshot. Therefore any modification you make to the
- * returned list will be present inside the JAXB object.
- * This is why there is not a <CODE>set</CODE> method for the userColours property.
- *
- * <p>
- * For example, to add a new item, do as follows:
- * <pre>
- * getUserColours().add(newItem);
- * </pre>
- *
- *
- * <p>
- * Objects of the following type(s) are allowed in the list
- * {@link JalviewModelType.UserColours }
- *
- *
- */
- public List<JalviewModelType.UserColours> getUserColours() {
- if (userColours == null) {
- userColours = new ArrayList<JalviewModelType.UserColours>();
- }
- return this.userColours;
- }
-
- /**
- * Gets the value of the tree property.
- *
- * <p>
- * This accessor method returns a reference to the live list,
- * not a snapshot. Therefore any modification you make to the
- * returned list will be present inside the JAXB object.
- * This is why there is not a <CODE>set</CODE> method for the tree property.
- *
- * <p>
- * For example, to add a new item, do as follows:
- * <pre>
- * getTree().add(newItem);
- * </pre>
- *
- *
- * <p>
- * Objects of the following type(s) are allowed in the list
- * {@link JalviewModelType.Tree }
- *
- *
- */
- public List<JalviewModelType.Tree> getTree() {
- if (tree == null) {
- tree = new ArrayList<JalviewModelType.Tree>();
- }
- return this.tree;
- }
-
- /**
- * Gets the value of the featureSettings property.
- *
- * @return
- * possible object is
- * {@link JalviewModelType.FeatureSettings }
- *
- */
- public JalviewModelType.FeatureSettings getFeatureSettings() {
- return featureSettings;
- }
-
- /**
- * Sets the value of the featureSettings property.
- *
- * @param value
- * allowed object is
- * {@link JalviewModelType.FeatureSettings }
- *
- */
- public void setFeatureSettings(JalviewModelType.FeatureSettings value) {
- this.featureSettings = value;
- }
-
-
- /**
- * <p>Java class for anonymous complex type.
- *
- * <p>The following schema fragment specifies the expected content contained within this class.
- *
- * <pre>
- * <complexType>
- * <complexContent>
- * <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- * <sequence>
- * <element name="setting" maxOccurs="unbounded" minOccurs="0">
- * <complexType>
- * <complexContent>
- * <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- * <sequence>
- * <element name="attributeName" type="{http://www.w3.org/2001/XMLSchema}string" maxOccurs="2" minOccurs="0"/>
- * <element name="matcherSet" type="{www.jalview.org/colours}FeatureMatcherSet" minOccurs="0"/>
- * </sequence>
- * <attribute name="type" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
- * <attribute name="colour" use="required" type="{http://www.w3.org/2001/XMLSchema}int" />
- * <attribute name="display" use="required" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- * <attribute name="order" type="{http://www.w3.org/2001/XMLSchema}float" />
- * <attribute name="mincolour" type="{http://www.w3.org/2001/XMLSchema}int" />
- * <attribute name="noValueColour" type="{www.jalview.org/colours}NoValueColour" default="Min" />
- * <attribute name="threshold" type="{http://www.w3.org/2001/XMLSchema}float" />
- * <attribute name="threshstate" type="{http://www.w3.org/2001/XMLSchema}int" />
- * <attribute name="max" type="{http://www.w3.org/2001/XMLSchema}float" />
- * <attribute name="min" type="{http://www.w3.org/2001/XMLSchema}float" />
- * <attribute name="colourByLabel" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- * <attribute name="autoScale" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- * </restriction>
- * </complexContent>
- * </complexType>
- * </element>
- * <element name="group" maxOccurs="unbounded" minOccurs="0">
- * <complexType>
- * <complexContent>
- * <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- * <attribute name="name" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
- * <attribute name="display" use="required" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- * </restriction>
- * </complexContent>
- * </complexType>
- * </element>
- * </sequence>
- * </restriction>
- * </complexContent>
- * </complexType>
- * </pre>
- *
- *
- */
- @XmlAccessorType(XmlAccessType.FIELD)
- @XmlType(name = "", propOrder = {
- "setting",
- "group"
- })
- public static class FeatureSettings {
-
- @XmlElement(namespace = "www.jalview.org")
- protected List<JalviewModelType.FeatureSettings.Setting> setting;
- @XmlElement(namespace = "www.jalview.org")
- protected List<JalviewModelType.FeatureSettings.Group> group;
-
- /**
- * Gets the value of the setting property.
- *
- * <p>
- * This accessor method returns a reference to the live list,
- * not a snapshot. Therefore any modification you make to the
- * returned list will be present inside the JAXB object.
- * This is why there is not a <CODE>set</CODE> method for the setting property.
- *
- * <p>
- * For example, to add a new item, do as follows:
- * <pre>
- * getSetting().add(newItem);
- * </pre>
- *
- *
- * <p>
- * Objects of the following type(s) are allowed in the list
- * {@link JalviewModelType.FeatureSettings.Setting }
- *
- *
- */
- public List<JalviewModelType.FeatureSettings.Setting> getSetting() {
- if (setting == null) {
- setting = new ArrayList<JalviewModelType.FeatureSettings.Setting>();
- }
- return this.setting;
- }
-
- /**
- * Gets the value of the group property.
- *
- * <p>
- * This accessor method returns a reference to the live list,
- * not a snapshot. Therefore any modification you make to the
- * returned list will be present inside the JAXB object.
- * This is why there is not a <CODE>set</CODE> method for the group property.
- *
- * <p>
- * For example, to add a new item, do as follows:
- * <pre>
- * getGroup().add(newItem);
- * </pre>
- *
- *
- * <p>
- * Objects of the following type(s) are allowed in the list
- * {@link JalviewModelType.FeatureSettings.Group }
- *
- *
- */
- public List<JalviewModelType.FeatureSettings.Group> getGroup() {
- if (group == null) {
- group = new ArrayList<JalviewModelType.FeatureSettings.Group>();
- }
- return this.group;
- }
-
-
- /**
- * <p>Java class for anonymous complex type.
- *
- * <p>The following schema fragment specifies the expected content contained within this class.
- *
- * <pre>
- * <complexType>
- * <complexContent>
- * <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- * <attribute name="name" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
- * <attribute name="display" use="required" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- * </restriction>
- * </complexContent>
- * </complexType>
- * </pre>
- *
- *
- */
- @XmlAccessorType(XmlAccessType.FIELD)
- @XmlType(name = "")
- public static class Group {
-
- @XmlAttribute(name = "name", required = true)
- protected String name;
- @XmlAttribute(name = "display", required = true)
- protected boolean display;
-
- /**
- * Gets the value of the name property.
- *
- * @return
- * possible object is
- * {@link String }
- *
- */
- public String getName() {
- return name;
- }
-
- /**
- * Sets the value of the name property.
- *
- * @param value
- * allowed object is
- * {@link String }
- *
- */
- public void setName(String value) {
- this.name = value;
- }
-
- /**
- * Gets the value of the display property.
- *
- */
- public boolean isDisplay() {
- return display;
- }
-
- /**
- * Sets the value of the display property.
- *
- */
- public void setDisplay(boolean value) {
- this.display = value;
- }
-
- }
-
-
- /**
- * <p>Java class for anonymous complex type.
- *
- * <p>The following schema fragment specifies the expected content contained within this class.
- *
- * <pre>
- * <complexType>
- * <complexContent>
- * <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- * <sequence>
- * <element name="attributeName" type="{http://www.w3.org/2001/XMLSchema}string" maxOccurs="2" minOccurs="0"/>
- * <element name="matcherSet" type="{www.jalview.org/colours}FeatureMatcherSet" minOccurs="0"/>
- * </sequence>
- * <attribute name="type" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
- * <attribute name="colour" use="required" type="{http://www.w3.org/2001/XMLSchema}int" />
- * <attribute name="display" use="required" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- * <attribute name="order" type="{http://www.w3.org/2001/XMLSchema}float" />
- * <attribute name="mincolour" type="{http://www.w3.org/2001/XMLSchema}int" />
- * <attribute name="noValueColour" type="{www.jalview.org/colours}NoValueColour" default="Min" />
- * <attribute name="threshold" type="{http://www.w3.org/2001/XMLSchema}float" />
- * <attribute name="threshstate" type="{http://www.w3.org/2001/XMLSchema}int" />
- * <attribute name="max" type="{http://www.w3.org/2001/XMLSchema}float" />
- * <attribute name="min" type="{http://www.w3.org/2001/XMLSchema}float" />
- * <attribute name="colourByLabel" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- * <attribute name="autoScale" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- * </restriction>
- * </complexContent>
- * </complexType>
- * </pre>
- *
- *
- */
- @XmlAccessorType(XmlAccessType.FIELD)
- @XmlType(name = "", propOrder = {
- "attributeName",
- "matcherSet"
- })
- public static class Setting {
-
- @XmlElement(namespace = "www.jalview.org")
- protected List<String> attributeName;
- @XmlElement(namespace = "www.jalview.org")
- protected FeatureMatcherSet matcherSet;
- @XmlAttribute(name = "type", required = true)
- protected String type;
- @XmlAttribute(name = "colour", required = true)
- protected int colour;
- @XmlAttribute(name = "display", required = true)
- protected boolean display;
- @XmlAttribute(name = "order")
- protected Float order;
- @XmlAttribute(name = "mincolour")
- protected Integer mincolour;
- @XmlAttribute(name = "noValueColour")
- protected NoValueColour noValueColour;
- @XmlAttribute(name = "threshold")
- protected Float threshold;
- @XmlAttribute(name = "threshstate")
- protected Integer threshstate;
- @XmlAttribute(name = "max")
- protected Float max;
- @XmlAttribute(name = "min")
- protected Float min;
- @XmlAttribute(name = "colourByLabel")
- protected Boolean colourByLabel;
- @XmlAttribute(name = "autoScale")
- protected Boolean autoScale;
-
- /**
- * Gets the value of the attributeName property.
- *
- * <p>
- * This accessor method returns a reference to the live list,
- * not a snapshot. Therefore any modification you make to the
- * returned list will be present inside the JAXB object.
- * This is why there is not a <CODE>set</CODE> method for the attributeName property.
- *
- * <p>
- * For example, to add a new item, do as follows:
- * <pre>
- * getAttributeName().add(newItem);
- * </pre>
- *
- *
- * <p>
- * Objects of the following type(s) are allowed in the list
- * {@link String }
- *
- *
- */
- public List<String> getAttributeName() {
- if (attributeName == null) {
- attributeName = new ArrayList<String>();
- }
- return this.attributeName;
- }
-
- /**
- * Gets the value of the matcherSet property.
- *
- * @return
- * possible object is
- * {@link FeatureMatcherSet }
- *
- */
- public FeatureMatcherSet getMatcherSet() {
- return matcherSet;
- }
-
- /**
- * Sets the value of the matcherSet property.
- *
- * @param value
- * allowed object is
- * {@link FeatureMatcherSet }
- *
- */
- public void setMatcherSet(FeatureMatcherSet value) {
- this.matcherSet = value;
- }
-
- /**
- * Gets the value of the type property.
- *
- * @return
- * possible object is
- * {@link String }
- *
- */
- public String getType() {
- return type;
- }
-
- /**
- * Sets the value of the type property.
- *
- * @param value
- * allowed object is
- * {@link String }
- *
- */
- public void setType(String value) {
- this.type = value;
- }
-
- /**
- * Gets the value of the colour property.
- *
- */
- public int getColour() {
- return colour;
- }
-
- /**
- * Sets the value of the colour property.
- *
- */
- public void setColour(int value) {
- this.colour = value;
- }
-
- /**
- * Gets the value of the display property.
- *
- */
- public boolean isDisplay() {
- return display;
- }
-
- /**
- * Sets the value of the display property.
- *
- */
- public void setDisplay(boolean value) {
- this.display = value;
- }
-
- /**
- * Gets the value of the order property.
- *
- * @return
- * possible object is
- * {@link Float }
- *
- */
- public Float getOrder() {
- return order;
- }
-
- /**
- * Sets the value of the order property.
- *
- * @param value
- * allowed object is
- * {@link Float }
- *
- */
- public void setOrder(Float value) {
- this.order = value;
- }
-
- /**
- * Gets the value of the mincolour property.
- *
- * @return
- * possible object is
- * {@link Integer }
- *
- */
- public Integer getMincolour() {
- return mincolour;
- }
-
- /**
- * Sets the value of the mincolour property.
- *
- * @param value
- * allowed object is
- * {@link Integer }
- *
- */
- public void setMincolour(Integer value) {
- this.mincolour = value;
- }
-
- /**
- * Gets the value of the noValueColour property.
- *
- * @return
- * possible object is
- * {@link NoValueColour }
- *
- */
- public NoValueColour getNoValueColour() {
- if (noValueColour == null) {
- return NoValueColour.MIN;
- } else {
- return noValueColour;
- }
- }
-
- /**
- * Sets the value of the noValueColour property.
- *
- * @param value
- * allowed object is
- * {@link NoValueColour }
- *
- */
- public void setNoValueColour(NoValueColour value) {
- this.noValueColour = value;
- }
-
- /**
- * Gets the value of the threshold property.
- *
- * @return
- * possible object is
- * {@link Float }
- *
- */
- public Float getThreshold() {
- return threshold;
- }
-
- /**
- * Sets the value of the threshold property.
- *
- * @param value
- * allowed object is
- * {@link Float }
- *
- */
- public void setThreshold(Float value) {
- this.threshold = value;
- }
-
- /**
- * Gets the value of the threshstate property.
- *
- * @return
- * possible object is
- * {@link Integer }
- *
- */
- public Integer getThreshstate() {
- return threshstate;
- }
-
- /**
- * Sets the value of the threshstate property.
- *
- * @param value
- * allowed object is
- * {@link Integer }
- *
- */
- public void setThreshstate(Integer value) {
- this.threshstate = value;
- }
-
- /**
- * Gets the value of the max property.
- *
- * @return
- * possible object is
- * {@link Float }
- *
- */
- public Float getMax() {
- return max;
- }
-
- /**
- * Sets the value of the max property.
- *
- * @param value
- * allowed object is
- * {@link Float }
- *
- */
- public void setMax(Float value) {
- this.max = value;
- }
-
- /**
- * Gets the value of the min property.
- *
- * @return
- * possible object is
- * {@link Float }
- *
- */
- public Float getMin() {
- return min;
- }
-
- /**
- * Sets the value of the min property.
- *
- * @param value
- * allowed object is
- * {@link Float }
- *
- */
- public void setMin(Float value) {
- this.min = value;
- }
-
- /**
- * Gets the value of the colourByLabel property.
- *
- * @return
- * possible object is
- * {@link Boolean }
- *
- */
- public Boolean isColourByLabel() {
- return colourByLabel;
- }
-
- /**
- * Sets the value of the colourByLabel property.
- *
- * @param value
- * allowed object is
- * {@link Boolean }
- *
- */
- public void setColourByLabel(Boolean value) {
- this.colourByLabel = value;
- }
-
- /**
- * Gets the value of the autoScale property.
- *
- * @return
- * possible object is
- * {@link Boolean }
- *
- */
- public Boolean isAutoScale() {
- return autoScale;
- }
-
- /**
- * Sets the value of the autoScale property.
- *
- * @param value
- * allowed object is
- * {@link Boolean }
- *
- */
- public void setAutoScale(Boolean value) {
- this.autoScale = value;
- }
-
- }
-
- }
-
-
- /**
- * <p>Java class for anonymous complex type.
- *
- * <p>The following schema fragment specifies the expected content contained within this class.
- *
- * <pre>
- * <complexType>
- * <complexContent>
- * <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- * <sequence>
- * <element name="seq" type="{http://www.w3.org/2001/XMLSchema}string" maxOccurs="unbounded"/>
- * <element name="annotationColours" type="{www.jalview.org}AnnotationColourScheme" minOccurs="0"/>
- * </sequence>
- * <attribute name="start" type="{http://www.w3.org/2001/XMLSchema}int" />
- * <attribute name="end" type="{http://www.w3.org/2001/XMLSchema}int" />
- * <attribute name="name" type="{http://www.w3.org/2001/XMLSchema}string" />
- * <attribute name="colour" type="{http://www.w3.org/2001/XMLSchema}string" />
- * <attribute name="consThreshold" type="{http://www.w3.org/2001/XMLSchema}int" />
- * <attribute name="pidThreshold" type="{http://www.w3.org/2001/XMLSchema}int" />
- * <attribute name="outlineColour" type="{http://www.w3.org/2001/XMLSchema}int" />
- * <attribute name="displayBoxes" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- * <attribute name="displayText" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- * <attribute name="colourText" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- * <attribute name="textCol1" type="{http://www.w3.org/2001/XMLSchema}int" />
- * <attribute name="textCol2" type="{http://www.w3.org/2001/XMLSchema}int" />
- * <attribute name="textColThreshold" type="{http://www.w3.org/2001/XMLSchema}int" />
- * <attribute name="showUnconserved" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- * <attribute name="ignoreGapsinConsensus" type="{http://www.w3.org/2001/XMLSchema}boolean" default="true" />
- * <attribute name="showConsensusHistogram" type="{http://www.w3.org/2001/XMLSchema}boolean" default="true" />
- * <attribute name="showSequenceLogo" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />
- * <attribute name="normaliseSequenceLogo" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />
- * <attribute name="id" type="{http://www.w3.org/2001/XMLSchema}string" />
- * </restriction>
- * </complexContent>
- * </complexType>
- * </pre>
- *
- *
- */
- @XmlAccessorType(XmlAccessType.FIELD)
- @XmlType(name = "", propOrder = {
- "seq",
- "annotationColours"
- })
- public static class JGroup {
-
- @XmlElement(namespace = "www.jalview.org", required = true)
- protected List<String> seq;
- @XmlElement(namespace = "www.jalview.org")
- protected AnnotationColourScheme annotationColours;
- @XmlAttribute(name = "start")
- protected Integer start;
- @XmlAttribute(name = "end")
- protected Integer end;
- @XmlAttribute(name = "name")
- protected String name;
- @XmlAttribute(name = "colour")
- protected String colour;
- @XmlAttribute(name = "consThreshold")
- protected Integer consThreshold;
- @XmlAttribute(name = "pidThreshold")
- protected Integer pidThreshold;
- @XmlAttribute(name = "outlineColour")
- protected Integer outlineColour;
- @XmlAttribute(name = "displayBoxes")
- protected Boolean displayBoxes;
- @XmlAttribute(name = "displayText")
- protected Boolean displayText;
- @XmlAttribute(name = "colourText")
- protected Boolean colourText;
- @XmlAttribute(name = "textCol1")
- protected Integer textCol1;
- @XmlAttribute(name = "textCol2")
- protected Integer textCol2;
- @XmlAttribute(name = "textColThreshold")
- protected Integer textColThreshold;
- @XmlAttribute(name = "showUnconserved")
- protected Boolean showUnconserved;
- @XmlAttribute(name = "ignoreGapsinConsensus")
- protected Boolean ignoreGapsinConsensus;
- @XmlAttribute(name = "showConsensusHistogram")
- protected Boolean showConsensusHistogram;
- @XmlAttribute(name = "showSequenceLogo")
- protected Boolean showSequenceLogo;
- @XmlAttribute(name = "normaliseSequenceLogo")
- protected Boolean normaliseSequenceLogo;
- @XmlAttribute(name = "id")
- protected String id;
-
- /**
- * Gets the value of the seq property.
- *
- * <p>
- * This accessor method returns a reference to the live list,
- * not a snapshot. Therefore any modification you make to the
- * returned list will be present inside the JAXB object.
- * This is why there is not a <CODE>set</CODE> method for the seq property.
- *
- * <p>
- * For example, to add a new item, do as follows:
- * <pre>
- * getSeq().add(newItem);
- * </pre>
- *
- *
- * <p>
- * Objects of the following type(s) are allowed in the list
- * {@link String }
- *
- *
- */
- public List<String> getSeq() {
- if (seq == null) {
- seq = new ArrayList<String>();
- }
- return this.seq;
- }
-
- /**
- * Gets the value of the annotationColours property.
- *
- * @return
- * possible object is
- * {@link AnnotationColourScheme }
- *
- */
- public AnnotationColourScheme getAnnotationColours() {
- return annotationColours;
- }
-
- /**
- * Sets the value of the annotationColours property.
- *
- * @param value
- * allowed object is
- * {@link AnnotationColourScheme }
- *
- */
- public void setAnnotationColours(AnnotationColourScheme value) {
- this.annotationColours = value;
- }
-
- /**
- * Gets the value of the start property.
- *
- * @return
- * possible object is
- * {@link Integer }
- *
- */
- public Integer getStart() {
- return start;
- }
-
- /**
- * Sets the value of the start property.
- *
- * @param value
- * allowed object is
- * {@link Integer }
- *
- */
- public void setStart(Integer value) {
- this.start = value;
- }
-
- /**
- * Gets the value of the end property.
- *
- * @return
- * possible object is
- * {@link Integer }
- *
- */
- public Integer getEnd() {
- return end;
- }
-
- /**
- * Sets the value of the end property.
- *
- * @param value
- * allowed object is
- * {@link Integer }
- *
- */
- public void setEnd(Integer value) {
- this.end = value;
- }
-
- /**
- * Gets the value of the name property.
- *
- * @return
- * possible object is
- * {@link String }
- *
- */
- public String getName() {
- return name;
- }
-
- /**
- * Sets the value of the name property.
- *
- * @param value
- * allowed object is
- * {@link String }
- *
- */
- public void setName(String value) {
- this.name = value;
- }
-
- /**
- * Gets the value of the colour property.
- *
- * @return
- * possible object is
- * {@link String }
- *
- */
- public String getColour() {
- return colour;
- }
-
- /**
- * Sets the value of the colour property.
- *
- * @param value
- * allowed object is
- * {@link String }
- *
- */
- public void setColour(String value) {
- this.colour = value;
- }
-
- /**
- * Gets the value of the consThreshold property.
- *
- * @return
- * possible object is
- * {@link Integer }
- *
- */
- public Integer getConsThreshold() {
- return consThreshold;
- }
-
- /**
- * Sets the value of the consThreshold property.
- *
- * @param value
- * allowed object is
- * {@link Integer }
- *
- */
- public void setConsThreshold(Integer value) {
- this.consThreshold = value;
- }
-
- /**
- * Gets the value of the pidThreshold property.
- *
- * @return
- * possible object is
- * {@link Integer }
- *
- */
- public Integer getPidThreshold() {
- return pidThreshold;
- }
-
- /**
- * Sets the value of the pidThreshold property.
- *
- * @param value
- * allowed object is
- * {@link Integer }
- *
- */
- public void setPidThreshold(Integer value) {
- this.pidThreshold = value;
- }
-
- /**
- * Gets the value of the outlineColour property.
- *
- * @return
- * possible object is
- * {@link Integer }
- *
- */
- public Integer getOutlineColour() {
- return outlineColour;
- }
-
- /**
- * Sets the value of the outlineColour property.
- *
- * @param value
- * allowed object is
- * {@link Integer }
- *
- */
- public void setOutlineColour(Integer value) {
- this.outlineColour = value;
- }
-
- /**
- * Gets the value of the displayBoxes property.
- *
- * @return
- * possible object is
- * {@link Boolean }
- *
- */
- public Boolean isDisplayBoxes() {
- return displayBoxes;
- }
-
- /**
- * Sets the value of the displayBoxes property.
- *
- * @param value
- * allowed object is
- * {@link Boolean }
- *
- */
- public void setDisplayBoxes(Boolean value) {
- this.displayBoxes = value;
- }
-
- /**
- * Gets the value of the displayText property.
- *
- * @return
- * possible object is
- * {@link Boolean }
- *
- */
- public Boolean isDisplayText() {
- return displayText;
- }
-
- /**
- * Sets the value of the displayText property.
- *
- * @param value
- * allowed object is
- * {@link Boolean }
- *
- */
- public void setDisplayText(Boolean value) {
- this.displayText = value;
- }
-
- /**
- * Gets the value of the colourText property.
- *
- * @return
- * possible object is
- * {@link Boolean }
- *
- */
- public Boolean isColourText() {
- return colourText;
- }
-
- /**
- * Sets the value of the colourText property.
- *
- * @param value
- * allowed object is
- * {@link Boolean }
- *
- */
- public void setColourText(Boolean value) {
- this.colourText = value;
- }
-
- /**
- * Gets the value of the textCol1 property.
- *
- * @return
- * possible object is
- * {@link Integer }
- *
- */
- public Integer getTextCol1() {
- return textCol1;
- }
-
- /**
- * Sets the value of the textCol1 property.
- *
- * @param value
- * allowed object is
- * {@link Integer }
- *
- */
- public void setTextCol1(Integer value) {
- this.textCol1 = value;
- }
-
- /**
- * Gets the value of the textCol2 property.
- *
- * @return
- * possible object is
- * {@link Integer }
- *
- */
- public Integer getTextCol2() {
- return textCol2;
- }
-
- /**
- * Sets the value of the textCol2 property.
- *
- * @param value
- * allowed object is
- * {@link Integer }
- *
- */
- public void setTextCol2(Integer value) {
- this.textCol2 = value;
- }
-
- /**
- * Gets the value of the textColThreshold property.
- *
- * @return
- * possible object is
- * {@link Integer }
- *
- */
- public Integer getTextColThreshold() {
- return textColThreshold;
- }
-
- /**
- * Sets the value of the textColThreshold property.
- *
- * @param value
- * allowed object is
- * {@link Integer }
- *
- */
- public void setTextColThreshold(Integer value) {
- this.textColThreshold = value;
- }
-
- /**
- * Gets the value of the showUnconserved property.
- *
- * @return
- * possible object is
- * {@link Boolean }
- *
- */
- public Boolean isShowUnconserved() {
- return showUnconserved;
- }
-
- /**
- * Sets the value of the showUnconserved property.
- *
- * @param value
- * allowed object is
- * {@link Boolean }
- *
- */
- public void setShowUnconserved(Boolean value) {
- this.showUnconserved = value;
- }
-
- /**
- * Gets the value of the ignoreGapsinConsensus property.
- *
- * @return
- * possible object is
- * {@link Boolean }
- *
- */
- public boolean isIgnoreGapsinConsensus() {
- if (ignoreGapsinConsensus == null) {
- return true;
- } else {
- return ignoreGapsinConsensus;
- }
- }
-
- /**
- * Sets the value of the ignoreGapsinConsensus property.
- *
- * @param value
- * allowed object is
- * {@link Boolean }
- *
- */
- public void setIgnoreGapsinConsensus(Boolean value) {
- this.ignoreGapsinConsensus = value;
- }
-
- /**
- * Gets the value of the showConsensusHistogram property.
- *
- * @return
- * possible object is
- * {@link Boolean }
- *
- */
- public boolean isShowConsensusHistogram() {
- if (showConsensusHistogram == null) {
- return true;
- } else {
- return showConsensusHistogram;
- }
- }
-
- /**
- * Sets the value of the showConsensusHistogram property.
- *
- * @param value
- * allowed object is
- * {@link Boolean }
- *
- */
- public void setShowConsensusHistogram(Boolean value) {
- this.showConsensusHistogram = value;
- }
-
- /**
- * Gets the value of the showSequenceLogo property.
- *
- * @return
- * possible object is
- * {@link Boolean }
- *
- */
- public boolean isShowSequenceLogo() {
- if (showSequenceLogo == null) {
- return false;
- } else {
- return showSequenceLogo;
- }
- }
-
- /**
- * Sets the value of the showSequenceLogo property.
- *
- * @param value
- * allowed object is
- * {@link Boolean }
- *
- */
- public void setShowSequenceLogo(Boolean value) {
- this.showSequenceLogo = value;
- }
-
- /**
- * Gets the value of the normaliseSequenceLogo property.
- *
- * @return
- * possible object is
- * {@link Boolean }
- *
- */
- public boolean isNormaliseSequenceLogo() {
- if (normaliseSequenceLogo == null) {
- return false;
- } else {
- return normaliseSequenceLogo;
- }
- }
-
- /**
- * Sets the value of the normaliseSequenceLogo property.
- *
- * @param value
- * allowed object is
- * {@link Boolean }
- *
- */
- public void setNormaliseSequenceLogo(Boolean value) {
- this.normaliseSequenceLogo = value;
- }
-
- /**
- * Gets the value of the id property.
- *
- * @return
- * possible object is
- * {@link String }
- *
- */
- public String getId() {
- return id;
- }
-
- /**
- * Sets the value of the id property.
- *
- * @param value
- * allowed object is
- * {@link String }
- *
- */
- public void setId(String value) {
- this.id = value;
- }
-
- }
-
-
- /**
- * <p>Java class for anonymous complex type.
- *
- * <p>The following schema fragment specifies the expected content contained within this class.
- *
- * <pre>
- * <complexType>
- * <complexContent>
- * <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- * <sequence>
- * <element name="features" type="{www.jalview.org}feature" maxOccurs="unbounded" minOccurs="0"/>
- * <element name="pdbids" maxOccurs="unbounded" minOccurs="0">
- * <complexType>
- * <complexContent>
- * <extension base="{www.jalview.org}pdbentry">
- * <sequence>
- * <element name="structureState" maxOccurs="unbounded" minOccurs="0">
- * <complexType>
- * <simpleContent>
- * <extension base="<http://www.w3.org/2001/XMLSchema>string">
- * <attGroup ref="{www.jalview.org}swingwindow"/>
- * <attribute name="visible" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- * <attribute name="viewId" type="{http://www.w3.org/2001/XMLSchema}string" />
- * <attribute name="alignwithAlignPanel" type="{http://www.w3.org/2001/XMLSchema}boolean" default="true" />
- * <attribute name="colourwithAlignPanel" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />
- * <attribute name="colourByJmol" type="{http://www.w3.org/2001/XMLSchema}boolean" default="true" />
- * <attribute name="type" type="{http://www.w3.org/2001/XMLSchema}string" />
- * </extension>
- * </simpleContent>
- * </complexType>
- * </element>
- * </sequence>
- * </extension>
- * </complexContent>
- * </complexType>
- * </element>
- * <element name="hiddenSequences" type="{http://www.w3.org/2001/XMLSchema}int" maxOccurs="unbounded" minOccurs="0"/>
- * <element name="rnaViewer" maxOccurs="unbounded" minOccurs="0">
- * <complexType>
- * <complexContent>
- * <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- * <sequence>
- * <element name="secondaryStructure" maxOccurs="unbounded">
- * <complexType>
- * <complexContent>
- * <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- * <attribute name="title" type="{http://www.w3.org/2001/XMLSchema}string" />
- * <attribute name="annotationId" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
- * <attribute name="gapped" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- * <attribute name="viewerState" type="{http://www.w3.org/2001/XMLSchema}string" />
- * </restriction>
- * </complexContent>
- * </complexType>
- * </element>
- * </sequence>
- * <attGroup ref="{www.jalview.org}swingwindow"/>
- * <attribute name="title" type="{http://www.w3.org/2001/XMLSchema}string" />
- * <attribute name="viewId" type="{http://www.w3.org/2001/XMLSchema}string" />
- * <attribute name="dividerLocation" type="{http://www.w3.org/2001/XMLSchema}int" />
- * <attribute name="selectedRna" type="{http://www.w3.org/2001/XMLSchema}int" />
- * </restriction>
- * </complexContent>
- * </complexType>
- * </element>
- * </sequence>
- * <attribute name="colour" type="{http://www.w3.org/2001/XMLSchema}int" />
- * <attribute name="start" use="required" type="{http://www.w3.org/2001/XMLSchema}int" />
- * <attribute name="end" use="required" type="{http://www.w3.org/2001/XMLSchema}int" />
- * <attribute name="id" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
- * <attribute name="hidden" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- * <attribute name="viewreference" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- * </restriction>
- * </complexContent>
- * </complexType>
- * </pre>
- *
- *
- */
- @XmlAccessorType(XmlAccessType.FIELD)
- @XmlType(name = "", propOrder = {
- "features",
- "pdbids",
- "hiddenSequences",
- "rnaViewer"
- })
- public static class JSeq {
-
- @XmlElement(namespace = "www.jalview.org")
- protected List<Feature> features;
- @XmlElement(namespace = "www.jalview.org")
- protected List<JalviewModelType.JSeq.Pdbids> pdbids;
- @XmlElement(namespace = "www.jalview.org", type = Integer.class)
- protected List<Integer> hiddenSequences;
- @XmlElement(namespace = "www.jalview.org")
- protected List<JalviewModelType.JSeq.RnaViewer> rnaViewer;
- @XmlAttribute(name = "colour")
- protected Integer colour;
- @XmlAttribute(name = "start", required = true)
- protected int start;
- @XmlAttribute(name = "end", required = true)
- protected int end;
- @XmlAttribute(name = "id", required = true)
- protected String id;
- @XmlAttribute(name = "hidden")
- protected Boolean hidden;
- @XmlAttribute(name = "viewreference")
- protected Boolean viewreference;
-
- /**
- * Gets the value of the features property.
- *
- * <p>
- * This accessor method returns a reference to the live list,
- * not a snapshot. Therefore any modification you make to the
- * returned list will be present inside the JAXB object.
- * This is why there is not a <CODE>set</CODE> method for the features property.
- *
- * <p>
- * For example, to add a new item, do as follows:
- * <pre>
- * getFeatures().add(newItem);
- * </pre>
- *
- *
- * <p>
- * Objects of the following type(s) are allowed in the list
- * {@link Feature }
- *
- *
- */
- public List<Feature> getFeatures() {
- if (features == null) {
- features = new ArrayList<Feature>();
- }
- return this.features;
- }
-
- /**
- * Gets the value of the pdbids property.
- *
- * <p>
- * This accessor method returns a reference to the live list,
- * not a snapshot. Therefore any modification you make to the
- * returned list will be present inside the JAXB object.
- * This is why there is not a <CODE>set</CODE> method for the pdbids property.
- *
- * <p>
- * For example, to add a new item, do as follows:
- * <pre>
- * getPdbids().add(newItem);
- * </pre>
- *
- *
- * <p>
- * Objects of the following type(s) are allowed in the list
- * {@link JalviewModelType.JSeq.Pdbids }
- *
- *
- */
- public List<JalviewModelType.JSeq.Pdbids> getPdbids() {
- if (pdbids == null) {
- pdbids = new ArrayList<JalviewModelType.JSeq.Pdbids>();
- }
- return this.pdbids;
- }
-
- /**
- * Gets the value of the hiddenSequences property.
- *
- * <p>
- * This accessor method returns a reference to the live list,
- * not a snapshot. Therefore any modification you make to the
- * returned list will be present inside the JAXB object.
- * This is why there is not a <CODE>set</CODE> method for the hiddenSequences property.
- *
- * <p>
- * For example, to add a new item, do as follows:
- * <pre>
- * getHiddenSequences().add(newItem);
- * </pre>
- *
- *
- * <p>
- * Objects of the following type(s) are allowed in the list
- * {@link Integer }
- *
- *
- */
- public List<Integer> getHiddenSequences() {
- if (hiddenSequences == null) {
- hiddenSequences = new ArrayList<Integer>();
- }
- return this.hiddenSequences;
- }
-
- /**
- * Gets the value of the rnaViewer property.
- *
- * <p>
- * This accessor method returns a reference to the live list,
- * not a snapshot. Therefore any modification you make to the
- * returned list will be present inside the JAXB object.
- * This is why there is not a <CODE>set</CODE> method for the rnaViewer property.
- *
- * <p>
- * For example, to add a new item, do as follows:
- * <pre>
- * getRnaViewer().add(newItem);
- * </pre>
- *
- *
- * <p>
- * Objects of the following type(s) are allowed in the list
- * {@link JalviewModelType.JSeq.RnaViewer }
- *
- *
- */
- public List<JalviewModelType.JSeq.RnaViewer> getRnaViewer() {
- if (rnaViewer == null) {
- rnaViewer = new ArrayList<JalviewModelType.JSeq.RnaViewer>();
- }
- return this.rnaViewer;
- }
-
- /**
- * Gets the value of the colour property.
- *
- * @return
- * possible object is
- * {@link Integer }
- *
- */
- public Integer getColour() {
- return colour;
- }
-
- /**
- * Sets the value of the colour property.
- *
- * @param value
- * allowed object is
- * {@link Integer }
- *
- */
- public void setColour(Integer value) {
- this.colour = value;
- }
-
- /**
- * Gets the value of the start property.
- *
- */
- public int getStart() {
- return start;
- }
-
- /**
- * Sets the value of the start property.
- *
- */
- public void setStart(int value) {
- this.start = value;
- }
-
- /**
- * Gets the value of the end property.
- *
- */
- public int getEnd() {
- return end;
- }
-
- /**
- * Sets the value of the end property.
- *
- */
- public void setEnd(int value) {
- this.end = value;
- }
-
- /**
- * Gets the value of the id property.
- *
- * @return
- * possible object is
- * {@link String }
- *
- */
- public String getId() {
- return id;
- }
-
- /**
- * Sets the value of the id property.
- *
- * @param value
- * allowed object is
- * {@link String }
- *
- */
- public void setId(String value) {
- this.id = value;
- }
-
- /**
- * Gets the value of the hidden property.
- *
- * @return
- * possible object is
- * {@link Boolean }
- *
- */
- public Boolean isHidden() {
- return hidden;
- }
-
- /**
- * Sets the value of the hidden property.
- *
- * @param value
- * allowed object is
- * {@link Boolean }
- *
- */
- public void setHidden(Boolean value) {
- this.hidden = value;
- }
-
- /**
- * Gets the value of the viewreference property.
- *
- * @return
- * possible object is
- * {@link Boolean }
- *
- */
- public Boolean isViewreference() {
- return viewreference;
- }
-
- /**
- * Sets the value of the viewreference property.
- *
- * @param value
- * allowed object is
- * {@link Boolean }
- *
- */
- public void setViewreference(Boolean value) {
- this.viewreference = value;
- }
-
-
- /**
- * <p>Java class for anonymous complex type.
- *
- * <p>The following schema fragment specifies the expected content contained within this class.
- *
- * <pre>
- * <complexType>
- * <complexContent>
- * <extension base="{www.jalview.org}pdbentry">
- * <sequence>
- * <element name="structureState" maxOccurs="unbounded" minOccurs="0">
- * <complexType>
- * <simpleContent>
- * <extension base="<http://www.w3.org/2001/XMLSchema>string">
- * <attGroup ref="{www.jalview.org}swingwindow"/>
- * <attribute name="visible" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- * <attribute name="viewId" type="{http://www.w3.org/2001/XMLSchema}string" />
- * <attribute name="alignwithAlignPanel" type="{http://www.w3.org/2001/XMLSchema}boolean" default="true" />
- * <attribute name="colourwithAlignPanel" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />
- * <attribute name="colourByJmol" type="{http://www.w3.org/2001/XMLSchema}boolean" default="true" />
- * <attribute name="type" type="{http://www.w3.org/2001/XMLSchema}string" />
- * </extension>
- * </simpleContent>
- * </complexType>
- * </element>
- * </sequence>
- * </extension>
- * </complexContent>
- * </complexType>
- * </pre>
- *
- *
- */
- @XmlAccessorType(XmlAccessType.FIELD)
- @XmlType(name = "", propOrder = {
- "structureState"
- })
- public static class Pdbids
- extends Pdbentry
- {
-
- @XmlElement(namespace = "www.jalview.org")
- protected List<JalviewModelType.JSeq.Pdbids.StructureState> structureState;
-
- /**
- * Gets the value of the structureState property.
- *
- * <p>
- * This accessor method returns a reference to the live list,
- * not a snapshot. Therefore any modification you make to the
- * returned list will be present inside the JAXB object.
- * This is why there is not a <CODE>set</CODE> method for the structureState property.
- *
- * <p>
- * For example, to add a new item, do as follows:
- * <pre>
- * getStructureState().add(newItem);
- * </pre>
- *
- *
- * <p>
- * Objects of the following type(s) are allowed in the list
- * {@link JalviewModelType.JSeq.Pdbids.StructureState }
- *
- *
- */
- public List<JalviewModelType.JSeq.Pdbids.StructureState> getStructureState() {
- if (structureState == null) {
- structureState = new ArrayList<JalviewModelType.JSeq.Pdbids.StructureState>();
- }
- return this.structureState;
- }
-
-
- /**
- * <p>Java class for anonymous complex type.
- *
- * <p>The following schema fragment specifies the expected content contained within this class.
- *
- * <pre>
- * <complexType>
- * <simpleContent>
- * <extension base="<http://www.w3.org/2001/XMLSchema>string">
- * <attGroup ref="{www.jalview.org}swingwindow"/>
- * <attribute name="visible" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- * <attribute name="viewId" type="{http://www.w3.org/2001/XMLSchema}string" />
- * <attribute name="alignwithAlignPanel" type="{http://www.w3.org/2001/XMLSchema}boolean" default="true" />
- * <attribute name="colourwithAlignPanel" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />
- * <attribute name="colourByJmol" type="{http://www.w3.org/2001/XMLSchema}boolean" default="true" />
- * <attribute name="type" type="{http://www.w3.org/2001/XMLSchema}string" />
- * </extension>
- * </simpleContent>
- * </complexType>
- * </pre>
- *
- *
- */
- @XmlAccessorType(XmlAccessType.FIELD)
- @XmlType(name = "", propOrder = {
- "value"
- })
- public static class StructureState {
-
- @XmlValue
- protected String value;
- @XmlAttribute(name = "visible")
- protected Boolean visible;
- @XmlAttribute(name = "viewId")
- protected String viewId;
- @XmlAttribute(name = "alignwithAlignPanel")
- protected Boolean alignwithAlignPanel;
- @XmlAttribute(name = "colourwithAlignPanel")
- protected Boolean colourwithAlignPanel;
- @XmlAttribute(name = "colourByJmol")
- protected Boolean colourByJmol;
- @XmlAttribute(name = "type")
- protected String type;
- @XmlAttribute(name = "width")
- protected Integer width;
- @XmlAttribute(name = "height")
- protected Integer height;
- @XmlAttribute(name = "xpos")
- protected Integer xpos;
- @XmlAttribute(name = "ypos")
- protected Integer ypos;
-
- /**
- * Gets the value of the value property.
- *
- * @return
- * possible object is
- * {@link String }
- *
- */
- public String getValue() {
- return value;
- }
-
- /**
- * Sets the value of the value property.
- *
- * @param value
- * allowed object is
- * {@link String }
- *
- */
- public void setValue(String value) {
- this.value = value;
- }
-
- /**
- * Gets the value of the visible property.
- *
- * @return
- * possible object is
- * {@link Boolean }
- *
- */
- public Boolean isVisible() {
- return visible;
- }
-
- /**
- * Sets the value of the visible property.
- *
- * @param value
- * allowed object is
- * {@link Boolean }
- *
- */
- public void setVisible(Boolean value) {
- this.visible = value;
- }
-
- /**
- * Gets the value of the viewId property.
- *
- * @return
- * possible object is
- * {@link String }
- *
- */
- public String getViewId() {
- return viewId;
- }
-
- /**
- * Sets the value of the viewId property.
- *
- * @param value
- * allowed object is
- * {@link String }
- *
- */
- public void setViewId(String value) {
- this.viewId = value;
- }
-
- /**
- * Gets the value of the alignwithAlignPanel property.
- *
- * @return
- * possible object is
- * {@link Boolean }
- *
- */
- public boolean isAlignwithAlignPanel() {
- if (alignwithAlignPanel == null) {
- return true;
- } else {
- return alignwithAlignPanel;
- }
- }
-
- /**
- * Sets the value of the alignwithAlignPanel property.
- *
- * @param value
- * allowed object is
- * {@link Boolean }
- *
- */
- public void setAlignwithAlignPanel(Boolean value) {
- this.alignwithAlignPanel = value;
- }
-
- /**
- * Gets the value of the colourwithAlignPanel property.
- *
- * @return
- * possible object is
- * {@link Boolean }
- *
- */
- public boolean isColourwithAlignPanel() {
- if (colourwithAlignPanel == null) {
- return false;
- } else {
- return colourwithAlignPanel;
- }
- }
-
- /**
- * Sets the value of the colourwithAlignPanel property.
- *
- * @param value
- * allowed object is
- * {@link Boolean }
- *
- */
- public void setColourwithAlignPanel(Boolean value) {
- this.colourwithAlignPanel = value;
- }
-
- /**
- * Gets the value of the colourByJmol property.
- *
- * @return
- * possible object is
- * {@link Boolean }
- *
- */
- public boolean isColourByJmol() {
- if (colourByJmol == null) {
- return true;
- } else {
- return colourByJmol;
- }
- }
-
- /**
- * Sets the value of the colourByJmol property.
- *
- * @param value
- * allowed object is
- * {@link Boolean }
- *
- */
- public void setColourByJmol(Boolean value) {
- this.colourByJmol = value;
- }
-
- /**
- * Gets the value of the type property.
- *
- * @return
- * possible object is
- * {@link String }
- *
- */
- public String getType() {
- return type;
- }
-
- /**
- * Sets the value of the type property.
- *
- * @param value
- * allowed object is
- * {@link String }
- *
- */
- public void setType(String value) {
- this.type = value;
- }
-
- /**
- * Gets the value of the width property.
- *
- * @return
- * possible object is
- * {@link Integer }
- *
- */
- public Integer getWidth() {
- return width;
- }
-
- /**
- * Sets the value of the width property.
- *
- * @param value
- * allowed object is
- * {@link Integer }
- *
- */
- public void setWidth(Integer value) {
- this.width = value;
- }
-
- /**
- * Gets the value of the height property.
- *
- * @return
- * possible object is
- * {@link Integer }
- *
- */
- public Integer getHeight() {
- return height;
- }
-
- /**
- * Sets the value of the height property.
- *
- * @param value
- * allowed object is
- * {@link Integer }
- *
- */
- public void setHeight(Integer value) {
- this.height = value;
- }
-
- /**
- * Gets the value of the xpos property.
- *
- * @return
- * possible object is
- * {@link Integer }
- *
- */
- public Integer getXpos() {
- return xpos;
- }
-
- /**
- * Sets the value of the xpos property.
- *
- * @param value
- * allowed object is
- * {@link Integer }
- *
- */
- public void setXpos(Integer value) {
- this.xpos = value;
- }
-
- /**
- * Gets the value of the ypos property.
- *
- * @return
- * possible object is
- * {@link Integer }
- *
- */
- public Integer getYpos() {
- return ypos;
- }
-
- /**
- * Sets the value of the ypos property.
- *
- * @param value
- * allowed object is
- * {@link Integer }
- *
- */
- public void setYpos(Integer value) {
- this.ypos = value;
- }
-
- }
-
- }
-
-
- /**
- * <p>Java class for anonymous complex type.
- *
- * <p>The following schema fragment specifies the expected content contained within this class.
- *
- * <pre>
- * <complexType>
- * <complexContent>
- * <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- * <sequence>
- * <element name="secondaryStructure" maxOccurs="unbounded">
- * <complexType>
- * <complexContent>
- * <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- * <attribute name="title" type="{http://www.w3.org/2001/XMLSchema}string" />
- * <attribute name="annotationId" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
- * <attribute name="gapped" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- * <attribute name="viewerState" type="{http://www.w3.org/2001/XMLSchema}string" />
- * </restriction>
- * </complexContent>
- * </complexType>
- * </element>
- * </sequence>
- * <attGroup ref="{www.jalview.org}swingwindow"/>
- * <attribute name="title" type="{http://www.w3.org/2001/XMLSchema}string" />
- * <attribute name="viewId" type="{http://www.w3.org/2001/XMLSchema}string" />
- * <attribute name="dividerLocation" type="{http://www.w3.org/2001/XMLSchema}int" />
- * <attribute name="selectedRna" type="{http://www.w3.org/2001/XMLSchema}int" />
- * </restriction>
- * </complexContent>
- * </complexType>
- * </pre>
- *
- *
- */
- @XmlAccessorType(XmlAccessType.FIELD)
- @XmlType(name = "", propOrder = {
- "secondaryStructure"
- })
- public static class RnaViewer {
-
- @XmlElement(namespace = "www.jalview.org", required = true)
- protected List<JalviewModelType.JSeq.RnaViewer.SecondaryStructure> secondaryStructure;
- @XmlAttribute(name = "title")
- protected String title;
- @XmlAttribute(name = "viewId")
- protected String viewId;
- @XmlAttribute(name = "dividerLocation")
- protected Integer dividerLocation;
- @XmlAttribute(name = "selectedRna")
- protected Integer selectedRna;
- @XmlAttribute(name = "width")
- protected Integer width;
- @XmlAttribute(name = "height")
- protected Integer height;
- @XmlAttribute(name = "xpos")
- protected Integer xpos;
- @XmlAttribute(name = "ypos")
- protected Integer ypos;
-
- /**
- * Gets the value of the secondaryStructure property.
- *
- * <p>
- * This accessor method returns a reference to the live list,
- * not a snapshot. Therefore any modification you make to the
- * returned list will be present inside the JAXB object.
- * This is why there is not a <CODE>set</CODE> method for the secondaryStructure property.
- *
- * <p>
- * For example, to add a new item, do as follows:
- * <pre>
- * getSecondaryStructure().add(newItem);
- * </pre>
- *
- *
- * <p>
- * Objects of the following type(s) are allowed in the list
- * {@link JalviewModelType.JSeq.RnaViewer.SecondaryStructure }
- *
- *
- */
- public List<JalviewModelType.JSeq.RnaViewer.SecondaryStructure> getSecondaryStructure() {
- if (secondaryStructure == null) {
- secondaryStructure = new ArrayList<JalviewModelType.JSeq.RnaViewer.SecondaryStructure>();
- }
- return this.secondaryStructure;
- }
-
- /**
- * Gets the value of the title property.
- *
- * @return
- * possible object is
- * {@link String }
- *
- */
- public String getTitle() {
- return title;
- }
-
- /**
- * Sets the value of the title property.
- *
- * @param value
- * allowed object is
- * {@link String }
- *
- */
- public void setTitle(String value) {
- this.title = value;
- }
-
- /**
- * Gets the value of the viewId property.
- *
- * @return
- * possible object is
- * {@link String }
- *
- */
- public String getViewId() {
- return viewId;
- }
-
- /**
- * Sets the value of the viewId property.
- *
- * @param value
- * allowed object is
- * {@link String }
- *
- */
- public void setViewId(String value) {
- this.viewId = value;
- }
-
- /**
- * Gets the value of the dividerLocation property.
- *
- * @return
- * possible object is
- * {@link Integer }
- *
- */
- public Integer getDividerLocation() {
- return dividerLocation;
- }
-
- /**
- * Sets the value of the dividerLocation property.
- *
- * @param value
- * allowed object is
- * {@link Integer }
- *
- */
- public void setDividerLocation(Integer value) {
- this.dividerLocation = value;
- }
-
- /**
- * Gets the value of the selectedRna property.
- *
- * @return
- * possible object is
- * {@link Integer }
- *
- */
- public Integer getSelectedRna() {
- return selectedRna;
- }
-
- /**
- * Sets the value of the selectedRna property.
- *
- * @param value
- * allowed object is
- * {@link Integer }
- *
- */
- public void setSelectedRna(Integer value) {
- this.selectedRna = value;
- }
-
- /**
- * Gets the value of the width property.
- *
- * @return
- * possible object is
- * {@link Integer }
- *
- */
- public Integer getWidth() {
- return width;
- }
-
- /**
- * Sets the value of the width property.
- *
- * @param value
- * allowed object is
- * {@link Integer }
- *
- */
- public void setWidth(Integer value) {
- this.width = value;
- }
-
- /**
- * Gets the value of the height property.
- *
- * @return
- * possible object is
- * {@link Integer }
- *
- */
- public Integer getHeight() {
- return height;
- }
-
- /**
- * Sets the value of the height property.
- *
- * @param value
- * allowed object is
- * {@link Integer }
- *
- */
- public void setHeight(Integer value) {
- this.height = value;
- }
-
- /**
- * Gets the value of the xpos property.
- *
- * @return
- * possible object is
- * {@link Integer }
- *
- */
- public Integer getXpos() {
- return xpos;
- }
-
- /**
- * Sets the value of the xpos property.
- *
- * @param value
- * allowed object is
- * {@link Integer }
- *
- */
- public void setXpos(Integer value) {
- this.xpos = value;
- }
-
- /**
- * Gets the value of the ypos property.
- *
- * @return
- * possible object is
- * {@link Integer }
- *
- */
- public Integer getYpos() {
- return ypos;
- }
-
- /**
- * Sets the value of the ypos property.
- *
- * @param value
- * allowed object is
- * {@link Integer }
- *
- */
- public void setYpos(Integer value) {
- this.ypos = value;
- }
-
-
- /**
- * <p>Java class for anonymous complex type.
- *
- * <p>The following schema fragment specifies the expected content contained within this class.
- *
- * <pre>
- * <complexType>
- * <complexContent>
- * <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- * <attribute name="title" type="{http://www.w3.org/2001/XMLSchema}string" />
- * <attribute name="annotationId" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
- * <attribute name="gapped" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- * <attribute name="viewerState" type="{http://www.w3.org/2001/XMLSchema}string" />
- * </restriction>
- * </complexContent>
- * </complexType>
- * </pre>
- *
- *
- */
- @XmlAccessorType(XmlAccessType.FIELD)
- @XmlType(name = "")
- public static class SecondaryStructure {
-
- @XmlAttribute(name = "title")
- protected String title;
- @XmlAttribute(name = "annotationId", required = true)
- protected String annotationId;
- @XmlAttribute(name = "gapped")
- protected Boolean gapped;
- @XmlAttribute(name = "viewerState")
- protected String viewerState;
-
- /**
- * Gets the value of the title property.
- *
- * @return
- * possible object is
- * {@link String }
- *
- */
- public String getTitle() {
- return title;
- }
-
- /**
- * Sets the value of the title property.
- *
- * @param value
- * allowed object is
- * {@link String }
- *
- */
- public void setTitle(String value) {
- this.title = value;
- }
-
- /**
- * Gets the value of the annotationId property.
- *
- * @return
- * possible object is
- * {@link String }
- *
- */
- public String getAnnotationId() {
- return annotationId;
- }
-
- /**
- * Sets the value of the annotationId property.
- *
- * @param value
- * allowed object is
- * {@link String }
- *
- */
- public void setAnnotationId(String value) {
- this.annotationId = value;
- }
-
- /**
- * Gets the value of the gapped property.
- *
- * @return
- * possible object is
- * {@link Boolean }
- *
- */
- public Boolean isGapped() {
- return gapped;
- }
-
- /**
- * Sets the value of the gapped property.
- *
- * @param value
- * allowed object is
- * {@link Boolean }
- *
- */
- public void setGapped(Boolean value) {
- this.gapped = value;
- }
-
- /**
- * Gets the value of the viewerState property.
- *
- * @return
- * possible object is
- * {@link String }
- *
- */
- public String getViewerState() {
- return viewerState;
- }
-
- /**
- * Sets the value of the viewerState property.
- *
- * @param value
- * allowed object is
- * {@link String }
- *
- */
- public void setViewerState(String value) {
- this.viewerState = value;
- }
-
- }
-
- }
-
- }
-
-
- /**
- * <p>Java class for anonymous complex type.
- *
- * <p>The following schema fragment specifies the expected content contained within this class.
- *
- * <pre>
- * <complexType>
- * <complexContent>
- * <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- * <sequence minOccurs="0">
- * <element name="title" type="{http://www.w3.org/2001/XMLSchema}string"/>
- * <element name="newick" type="{http://www.w3.org/2001/XMLSchema}string"/>
- * </sequence>
- * <attGroup ref="{www.jalview.org}swingwindow"/>
- * <attribute name="fontName" type="{http://www.w3.org/2001/XMLSchema}string" />
- * <attribute name="fontSize" type="{http://www.w3.org/2001/XMLSchema}int" />
- * <attribute name="fontStyle" type="{http://www.w3.org/2001/XMLSchema}int" />
- * <attribute name="threshold" type="{http://www.w3.org/2001/XMLSchema}float" />
- * <attribute name="showBootstrap" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- * <attribute name="showDistances" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- * <attribute name="markUnlinked" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- * <attribute name="fitToWindow" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- * <attribute name="currentTree" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- * <attribute name="id" type="{http://www.w3.org/2001/XMLSchema}ID" />
- * </restriction>
- * </complexContent>
- * </complexType>
- * </pre>
- *
- *
- */
- @XmlAccessorType(XmlAccessType.FIELD)
- @XmlType(name = "", propOrder = {
- "title",
- "newick"
- })
- public static class Tree {
-
- @XmlElement(namespace = "www.jalview.org")
- protected String title;
- @XmlElement(namespace = "www.jalview.org")
- protected String newick;
- @XmlAttribute(name = "fontName")
- protected String fontName;
- @XmlAttribute(name = "fontSize")
- protected Integer fontSize;
- @XmlAttribute(name = "fontStyle")
- protected Integer fontStyle;
- @XmlAttribute(name = "threshold")
- protected Float threshold;
- @XmlAttribute(name = "showBootstrap")
- protected Boolean showBootstrap;
- @XmlAttribute(name = "showDistances")
- protected Boolean showDistances;
- @XmlAttribute(name = "markUnlinked")
- protected Boolean markUnlinked;
- @XmlAttribute(name = "fitToWindow")
- protected Boolean fitToWindow;
- @XmlAttribute(name = "currentTree")
- protected Boolean currentTree;
- @XmlAttribute(name = "id")
- @XmlJavaTypeAdapter(CollapsedStringAdapter.class)
- @XmlID
- @XmlSchemaType(name = "ID")
- protected String id;
- @XmlAttribute(name = "width")
- protected Integer width;
- @XmlAttribute(name = "height")
- protected Integer height;
- @XmlAttribute(name = "xpos")
- protected Integer xpos;
- @XmlAttribute(name = "ypos")
- protected Integer ypos;
-
- /**
- * Gets the value of the title property.
- *
- * @return
- * possible object is
- * {@link String }
- *
- */
- public String getTitle() {
- return title;
- }
-
- /**
- * Sets the value of the title property.
- *
- * @param value
- * allowed object is
- * {@link String }
- *
- */
- public void setTitle(String value) {
- this.title = value;
- }
-
- /**
- * Gets the value of the newick property.
- *
- * @return
- * possible object is
- * {@link String }
- *
- */
- public String getNewick() {
- return newick;
- }
-
- /**
- * Sets the value of the newick property.
- *
- * @param value
- * allowed object is
- * {@link String }
- *
- */
- public void setNewick(String value) {
- this.newick = value;
- }
-
- /**
- * Gets the value of the fontName property.
- *
- * @return
- * possible object is
- * {@link String }
- *
- */
- public String getFontName() {
- return fontName;
- }
-
- /**
- * Sets the value of the fontName property.
- *
- * @param value
- * allowed object is
- * {@link String }
- *
- */
- public void setFontName(String value) {
- this.fontName = value;
- }
-
- /**
- * Gets the value of the fontSize property.
- *
- * @return
- * possible object is
- * {@link Integer }
- *
- */
- public Integer getFontSize() {
- return fontSize;
- }
-
- /**
- * Sets the value of the fontSize property.
- *
- * @param value
- * allowed object is
- * {@link Integer }
- *
- */
- public void setFontSize(Integer value) {
- this.fontSize = value;
- }
-
- /**
- * Gets the value of the fontStyle property.
- *
- * @return
- * possible object is
- * {@link Integer }
- *
- */
- public Integer getFontStyle() {
- return fontStyle;
- }
-
- /**
- * Sets the value of the fontStyle property.
- *
- * @param value
- * allowed object is
- * {@link Integer }
- *
- */
- public void setFontStyle(Integer value) {
- this.fontStyle = value;
- }
-
- /**
- * Gets the value of the threshold property.
- *
- * @return
- * possible object is
- * {@link Float }
- *
- */
- public Float getThreshold() {
- return threshold;
- }
-
- /**
- * Sets the value of the threshold property.
- *
- * @param value
- * allowed object is
- * {@link Float }
- *
- */
- public void setThreshold(Float value) {
- this.threshold = value;
- }
-
- /**
- * Gets the value of the showBootstrap property.
- *
- * @return
- * possible object is
- * {@link Boolean }
- *
- */
- public Boolean isShowBootstrap() {
- return showBootstrap;
- }
-
- /**
- * Sets the value of the showBootstrap property.
- *
- * @param value
- * allowed object is
- * {@link Boolean }
- *
- */
- public void setShowBootstrap(Boolean value) {
- this.showBootstrap = value;
- }
-
- /**
- * Gets the value of the showDistances property.
- *
- * @return
- * possible object is
- * {@link Boolean }
- *
- */
- public Boolean isShowDistances() {
- return showDistances;
- }
-
- /**
- * Sets the value of the showDistances property.
- *
- * @param value
- * allowed object is
- * {@link Boolean }
- *
- */
- public void setShowDistances(Boolean value) {
- this.showDistances = value;
- }
-
- /**
- * Gets the value of the markUnlinked property.
- *
- * @return
- * possible object is
- * {@link Boolean }
- *
- */
- public Boolean isMarkUnlinked() {
- return markUnlinked;
- }
-
- /**
- * Sets the value of the markUnlinked property.
- *
- * @param value
- * allowed object is
- * {@link Boolean }
- *
- */
- public void setMarkUnlinked(Boolean value) {
- this.markUnlinked = value;
- }
-
- /**
- * Gets the value of the fitToWindow property.
- *
- * @return
- * possible object is
- * {@link Boolean }
- *
- */
- public Boolean isFitToWindow() {
- return fitToWindow;
- }
-
- /**
- * Sets the value of the fitToWindow property.
- *
- * @param value
- * allowed object is
- * {@link Boolean }
- *
- */
- public void setFitToWindow(Boolean value) {
- this.fitToWindow = value;
- }
-
- /**
- * Gets the value of the currentTree property.
- *
- * @return
- * possible object is
- * {@link Boolean }
- *
- */
- public Boolean isCurrentTree() {
- return currentTree;
- }
-
- /**
- * Sets the value of the currentTree property.
- *
- * @param value
- * allowed object is
- * {@link Boolean }
- *
- */
- public void setCurrentTree(Boolean value) {
- this.currentTree = value;
- }
-
- /**
- * Gets the value of the id property.
- *
- * @return
- * possible object is
- * {@link String }
- *
- */
- public String getId() {
- return id;
- }
-
- /**
- * Sets the value of the id property.
- *
- * @param value
- * allowed object is
- * {@link String }
- *
- */
- public void setId(String value) {
- this.id = value;
- }
-
- /**
- * Gets the value of the width property.
- *
- * @return
- * possible object is
- * {@link Integer }
- *
- */
- public Integer getWidth() {
- return width;
- }
-
- /**
- * Sets the value of the width property.
- *
- * @param value
- * allowed object is
- * {@link Integer }
- *
- */
- public void setWidth(Integer value) {
- this.width = value;
- }
-
- /**
- * Gets the value of the height property.
- *
- * @return
- * possible object is
- * {@link Integer }
- *
- */
- public Integer getHeight() {
- return height;
- }
-
- /**
- * Sets the value of the height property.
- *
- * @param value
- * allowed object is
- * {@link Integer }
- *
- */
- public void setHeight(Integer value) {
- this.height = value;
- }
-
- /**
- * Gets the value of the xpos property.
- *
- * @return
- * possible object is
- * {@link Integer }
- *
- */
- public Integer getXpos() {
- return xpos;
- }
-
- /**
- * Sets the value of the xpos property.
- *
- * @param value
- * allowed object is
- * {@link Integer }
- *
- */
- public void setXpos(Integer value) {
- this.xpos = value;
- }
-
- /**
- * Gets the value of the ypos property.
- *
- * @return
- * possible object is
- * {@link Integer }
- *
- */
- public Integer getYpos() {
- return ypos;
- }
-
- /**
- * Sets the value of the ypos property.
- *
- * @param value
- * allowed object is
- * {@link Integer }
- *
- */
- public void setYpos(Integer value) {
- this.ypos = value;
- }
-
- }
-
-
- /**
- * <p>Java class for anonymous complex type.
- *
- * <p>The following schema fragment specifies the expected content contained within this class.
- *
- * <pre>
- * <complexType>
- * <complexContent>
- * <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- * <sequence>
- * <element name="UserColourScheme" type="{www.jalview.org/colours}JalviewUserColours"/>
- * </sequence>
- * <attribute name="id" type="{http://www.w3.org/2001/XMLSchema}string" />
- * </restriction>
- * </complexContent>
- * </complexType>
- * </pre>
- *
- *
- */
- @XmlAccessorType(XmlAccessType.FIELD)
- @XmlType(name = "", propOrder = {
- "userColourScheme"
- })
- public static class UserColours {
-
- @XmlElement(name = "UserColourScheme", namespace = "www.jalview.org", required = true)
- protected JalviewUserColours userColourScheme;
- @XmlAttribute(name = "id")
- protected String id;
-
- /**
- * Gets the value of the userColourScheme property.
- *
- * @return
- * possible object is
- * {@link JalviewUserColours }
- *
- */
- public JalviewUserColours getUserColourScheme() {
- return userColourScheme;
- }
-
- /**
- * Sets the value of the userColourScheme property.
- *
- * @param value
- * allowed object is
- * {@link JalviewUserColours }
- *
- */
- public void setUserColourScheme(JalviewUserColours value) {
- this.userColourScheme = value;
- }
-
- /**
- * Gets the value of the id property.
- *
- * @return
- * possible object is
- * {@link String }
- *
- */
- public String getId() {
- return id;
- }
-
- /**
- * Sets the value of the id property.
- *
- * @param value
- * allowed object is
- * {@link String }
- *
- */
- public void setId(String value) {
- this.id = value;
- }
-
- }
-
-
- /**
- * <p>Java class for anonymous complex type.
- *
- * <p>The following schema fragment specifies the expected content contained within this class.
- *
- * <pre>
- * <complexType>
- * <complexContent>
- * <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- * <sequence>
- * <element name="AnnotationColours" type="{www.jalview.org}AnnotationColourScheme" minOccurs="0"/>
- * <element name="hiddenColumns" maxOccurs="unbounded" minOccurs="0">
- * <complexType>
- * <complexContent>
- * <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- * <attribute name="start" type="{http://www.w3.org/2001/XMLSchema}int" />
- * <attribute name="end" type="{http://www.w3.org/2001/XMLSchema}int" />
- * </restriction>
- * </complexContent>
- * </complexType>
- * </element>
- * <element name="calcIdParam" maxOccurs="unbounded" minOccurs="0">
- * <complexType>
- * <complexContent>
- * <extension base="{www.jalview.org/xml/wsparamset}WebServiceParameterSet">
- * <attribute name="calcId" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
- * <attribute name="needsUpdate" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />
- * <attribute name="autoUpdate" use="required" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- * </extension>
- * </complexContent>
- * </complexType>
- * </element>
- * </sequence>
- * <attGroup ref="{www.jalview.org}swingwindow"/>
- * <attribute name="conservationSelected" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- * <attribute name="pidSelected" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- * <attribute name="bgColour" type="{http://www.w3.org/2001/XMLSchema}string" />
- * <attribute name="consThreshold" type="{http://www.w3.org/2001/XMLSchema}int" />
- * <attribute name="pidThreshold" type="{http://www.w3.org/2001/XMLSchema}int" />
- * <attribute name="title" type="{http://www.w3.org/2001/XMLSchema}string" />
- * <attribute name="showFullId" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- * <attribute name="rightAlignIds" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- * <attribute name="showText" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- * <attribute name="showColourText" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- * <attribute name="showUnconserved" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />
- * <attribute name="showBoxes" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- * <attribute name="wrapAlignment" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- * <attribute name="renderGaps" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- * <attribute name="showSequenceFeatures" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- * <attribute name="showNPfeatureTooltip" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- * <attribute name="showDbRefTooltip" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- * <attribute name="followHighlight" type="{http://www.w3.org/2001/XMLSchema}boolean" default="true" />
- * <attribute name="followSelection" type="{http://www.w3.org/2001/XMLSchema}boolean" default="true" />
- * <attribute name="showAnnotation" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- * <attribute name="centreColumnLabels" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />
- * <attribute name="showGroupConservation" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />
- * <attribute name="showGroupConsensus" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />
- * <attribute name="showConsensusHistogram" type="{http://www.w3.org/2001/XMLSchema}boolean" default="true" />
- * <attribute name="showSequenceLogo" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />
- * <attribute name="normaliseSequenceLogo" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />
- * <attribute name="ignoreGapsinConsensus" type="{http://www.w3.org/2001/XMLSchema}boolean" default="true" />
- * <attribute name="startRes" type="{http://www.w3.org/2001/XMLSchema}int" />
- * <attribute name="startSeq" type="{http://www.w3.org/2001/XMLSchema}int" />
- * <attribute name="fontName" type="{http://www.w3.org/2001/XMLSchema}string" />
- * <attribute name="fontSize" type="{http://www.w3.org/2001/XMLSchema}int" />
- * <attribute name="fontStyle" type="{http://www.w3.org/2001/XMLSchema}int" />
- * <attribute name="scaleProteinAsCdna" type="{http://www.w3.org/2001/XMLSchema}boolean" default="true" />
- * <attribute name="viewName" type="{http://www.w3.org/2001/XMLSchema}string" />
- * <attribute name="sequenceSetId" type="{http://www.w3.org/2001/XMLSchema}string" />
- * <attribute name="gatheredViews" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- * <attribute name="textCol1" type="{http://www.w3.org/2001/XMLSchema}int" />
- * <attribute name="textCol2" type="{http://www.w3.org/2001/XMLSchema}int" />
- * <attribute name="textColThreshold" type="{http://www.w3.org/2001/XMLSchema}int" />
- * <attribute name="id" type="{http://www.w3.org/2001/XMLSchema}ID" />
- * <attribute name="complementId" type="{http://www.w3.org/2001/XMLSchema}string" />
- * </restriction>
- * </complexContent>
- * </complexType>
- * </pre>
- *
- *
- */
- @XmlAccessorType(XmlAccessType.FIELD)
- @XmlType(name = "", propOrder = {
- "annotationColours",
- "hiddenColumns",
- "calcIdParam"
- })
- public static class Viewport {
-
- @XmlElement(name = "AnnotationColours", namespace = "www.jalview.org")
- protected AnnotationColourScheme annotationColours;
- @XmlElement(namespace = "www.jalview.org")
- protected List<JalviewModelType.Viewport.HiddenColumns> hiddenColumns;
- @XmlElement(namespace = "www.jalview.org")
- protected List<JalviewModelType.Viewport.CalcIdParam> calcIdParam;
- @XmlAttribute(name = "conservationSelected")
- protected Boolean conservationSelected;
- @XmlAttribute(name = "pidSelected")
- protected Boolean pidSelected;
- @XmlAttribute(name = "bgColour")
- protected String bgColour;
- @XmlAttribute(name = "consThreshold")
- protected Integer consThreshold;
- @XmlAttribute(name = "pidThreshold")
- protected Integer pidThreshold;
- @XmlAttribute(name = "title")
- protected String title;
- @XmlAttribute(name = "showFullId")
- protected Boolean showFullId;
- @XmlAttribute(name = "rightAlignIds")
- protected Boolean rightAlignIds;
- @XmlAttribute(name = "showText")
- protected Boolean showText;
- @XmlAttribute(name = "showColourText")
- protected Boolean showColourText;
- @XmlAttribute(name = "showUnconserved")
- protected Boolean showUnconserved;
- @XmlAttribute(name = "showBoxes")
- protected Boolean showBoxes;
- @XmlAttribute(name = "wrapAlignment")
- protected Boolean wrapAlignment;
- @XmlAttribute(name = "renderGaps")
- protected Boolean renderGaps;
- @XmlAttribute(name = "showSequenceFeatures")
- protected Boolean showSequenceFeatures;
- @XmlAttribute(name = "showNPfeatureTooltip")
- protected Boolean showNPfeatureTooltip;
- @XmlAttribute(name = "showDbRefTooltip")
- protected Boolean showDbRefTooltip;
- @XmlAttribute(name = "followHighlight")
- protected Boolean followHighlight;
- @XmlAttribute(name = "followSelection")
- protected Boolean followSelection;
- @XmlAttribute(name = "showAnnotation")
- protected Boolean showAnnotation;
- @XmlAttribute(name = "centreColumnLabels")
- protected Boolean centreColumnLabels;
- @XmlAttribute(name = "showGroupConservation")
- protected Boolean showGroupConservation;
- @XmlAttribute(name = "showGroupConsensus")
- protected Boolean showGroupConsensus;
- @XmlAttribute(name = "showConsensusHistogram")
- protected Boolean showConsensusHistogram;
- @XmlAttribute(name = "showSequenceLogo")
- protected Boolean showSequenceLogo;
- @XmlAttribute(name = "normaliseSequenceLogo")
- protected Boolean normaliseSequenceLogo;
- @XmlAttribute(name = "ignoreGapsinConsensus")
- protected Boolean ignoreGapsinConsensus;
- @XmlAttribute(name = "startRes")
- protected Integer startRes;
- @XmlAttribute(name = "startSeq")
- protected Integer startSeq;
- @XmlAttribute(name = "fontName")
- protected String fontName;
- @XmlAttribute(name = "fontSize")
- protected Integer fontSize;
- @XmlAttribute(name = "fontStyle")
- protected Integer fontStyle;
- @XmlAttribute(name = "scaleProteinAsCdna")
- protected Boolean scaleProteinAsCdna;
- @XmlAttribute(name = "viewName")
- protected String viewName;
- @XmlAttribute(name = "sequenceSetId")
- protected String sequenceSetId;
- @XmlAttribute(name = "gatheredViews")
- protected Boolean gatheredViews;
- @XmlAttribute(name = "textCol1")
- protected Integer textCol1;
- @XmlAttribute(name = "textCol2")
- protected Integer textCol2;
- @XmlAttribute(name = "textColThreshold")
- protected Integer textColThreshold;
- @XmlAttribute(name = "id")
- @XmlJavaTypeAdapter(CollapsedStringAdapter.class)
- @XmlID
- @XmlSchemaType(name = "ID")
- protected String id;
- @XmlAttribute(name = "complementId")
- protected String complementId;
- @XmlAttribute(name = "width")
- protected Integer width;
- @XmlAttribute(name = "height")
- protected Integer height;
- @XmlAttribute(name = "xpos")
- protected Integer xpos;
- @XmlAttribute(name = "ypos")
- protected Integer ypos;
-
- /**
- * Gets the value of the annotationColours property.
- *
- * @return
- * possible object is
- * {@link AnnotationColourScheme }
- *
- */
- public AnnotationColourScheme getAnnotationColours() {
- return annotationColours;
- }
-
- /**
- * Sets the value of the annotationColours property.
- *
- * @param value
- * allowed object is
- * {@link AnnotationColourScheme }
- *
- */
- public void setAnnotationColours(AnnotationColourScheme value) {
- this.annotationColours = value;
- }
-
- /**
- * Gets the value of the hiddenColumns property.
- *
- * <p>
- * This accessor method returns a reference to the live list,
- * not a snapshot. Therefore any modification you make to the
- * returned list will be present inside the JAXB object.
- * This is why there is not a <CODE>set</CODE> method for the hiddenColumns property.
- *
- * <p>
- * For example, to add a new item, do as follows:
- * <pre>
- * getHiddenColumns().add(newItem);
- * </pre>
- *
- *
- * <p>
- * Objects of the following type(s) are allowed in the list
- * {@link JalviewModelType.Viewport.HiddenColumns }
- *
- *
- */
- public List<JalviewModelType.Viewport.HiddenColumns> getHiddenColumns() {
- if (hiddenColumns == null) {
- hiddenColumns = new ArrayList<JalviewModelType.Viewport.HiddenColumns>();
- }
- return this.hiddenColumns;
- }
-
- /**
- * Gets the value of the calcIdParam property.
- *
- * <p>
- * This accessor method returns a reference to the live list,
- * not a snapshot. Therefore any modification you make to the
- * returned list will be present inside the JAXB object.
- * This is why there is not a <CODE>set</CODE> method for the calcIdParam property.
- *
- * <p>
- * For example, to add a new item, do as follows:
- * <pre>
- * getCalcIdParam().add(newItem);
- * </pre>
- *
- *
- * <p>
- * Objects of the following type(s) are allowed in the list
- * {@link JalviewModelType.Viewport.CalcIdParam }
- *
- *
- */
- public List<JalviewModelType.Viewport.CalcIdParam> getCalcIdParam() {
- if (calcIdParam == null) {
- calcIdParam = new ArrayList<JalviewModelType.Viewport.CalcIdParam>();
- }
- return this.calcIdParam;
- }
-
- /**
- * Gets the value of the conservationSelected property.
- *
- * @return
- * possible object is
- * {@link Boolean }
- *
- */
- public Boolean isConservationSelected() {
- return conservationSelected;
- }
-
- /**
- * Sets the value of the conservationSelected property.
- *
- * @param value
- * allowed object is
- * {@link Boolean }
- *
- */
- public void setConservationSelected(Boolean value) {
- this.conservationSelected = value;
- }
-
- /**
- * Gets the value of the pidSelected property.
- *
- * @return
- * possible object is
- * {@link Boolean }
- *
- */
- public Boolean isPidSelected() {
- return pidSelected;
- }
-
- /**
- * Sets the value of the pidSelected property.
- *
- * @param value
- * allowed object is
- * {@link Boolean }
- *
- */
- public void setPidSelected(Boolean value) {
- this.pidSelected = value;
- }
-
- /**
- * Gets the value of the bgColour property.
- *
- * @return
- * possible object is
- * {@link String }
- *
- */
- public String getBgColour() {
- return bgColour;
- }
-
- /**
- * Sets the value of the bgColour property.
- *
- * @param value
- * allowed object is
- * {@link String }
- *
- */
- public void setBgColour(String value) {
- this.bgColour = value;
- }
-
- /**
- * Gets the value of the consThreshold property.
- *
- * @return
- * possible object is
- * {@link Integer }
- *
- */
- public Integer getConsThreshold() {
- return consThreshold;
- }
-
- /**
- * Sets the value of the consThreshold property.
- *
- * @param value
- * allowed object is
- * {@link Integer }
- *
- */
- public void setConsThreshold(Integer value) {
- this.consThreshold = value;
- }
-
- /**
- * Gets the value of the pidThreshold property.
- *
- * @return
- * possible object is
- * {@link Integer }
- *
- */
- public Integer getPidThreshold() {
- return pidThreshold;
- }
-
- /**
- * Sets the value of the pidThreshold property.
- *
- * @param value
- * allowed object is
- * {@link Integer }
- *
- */
- public void setPidThreshold(Integer value) {
- this.pidThreshold = value;
- }
-
- /**
- * Gets the value of the title property.
- *
- * @return
- * possible object is
- * {@link String }
- *
- */
- public String getTitle() {
- return title;
- }
-
- /**
- * Sets the value of the title property.
- *
- * @param value
- * allowed object is
- * {@link String }
- *
- */
- public void setTitle(String value) {
- this.title = value;
- }
-
- /**
- * Gets the value of the showFullId property.
- *
- * @return
- * possible object is
- * {@link Boolean }
- *
- */
- public Boolean isShowFullId() {
- return showFullId;
- }
-
- /**
- * Sets the value of the showFullId property.
- *
- * @param value
- * allowed object is
- * {@link Boolean }
- *
- */
- public void setShowFullId(Boolean value) {
- this.showFullId = value;
- }
-
- /**
- * Gets the value of the rightAlignIds property.
- *
- * @return
- * possible object is
- * {@link Boolean }
- *
- */
- public Boolean isRightAlignIds() {
- return rightAlignIds;
- }
-
- /**
- * Sets the value of the rightAlignIds property.
- *
- * @param value
- * allowed object is
- * {@link Boolean }
- *
- */
- public void setRightAlignIds(Boolean value) {
- this.rightAlignIds = value;
- }
-
- /**
- * Gets the value of the showText property.
- *
- * @return
- * possible object is
- * {@link Boolean }
- *
- */
- public Boolean isShowText() {
- return showText;
- }
-
- /**
- * Sets the value of the showText property.
- *
- * @param value
- * allowed object is
- * {@link Boolean }
- *
- */
- public void setShowText(Boolean value) {
- this.showText = value;
- }
-
- /**
- * Gets the value of the showColourText property.
- *
- * @return
- * possible object is
- * {@link Boolean }
- *
- */
- public Boolean isShowColourText() {
- return showColourText;
- }
-
- /**
- * Sets the value of the showColourText property.
- *
- * @param value
- * allowed object is
- * {@link Boolean }
- *
- */
- public void setShowColourText(Boolean value) {
- this.showColourText = value;
- }
-
- /**
- * Gets the value of the showUnconserved property.
- *
- * @return
- * possible object is
- * {@link Boolean }
- *
- */
- public boolean isShowUnconserved() {
- if (showUnconserved == null) {
- return false;
- } else {
- return showUnconserved;
- }
- }
-
- /**
- * Sets the value of the showUnconserved property.
- *
- * @param value
- * allowed object is
- * {@link Boolean }
- *
- */
- public void setShowUnconserved(Boolean value) {
- this.showUnconserved = value;
- }
-
- /**
- * Gets the value of the showBoxes property.
- *
- * @return
- * possible object is
- * {@link Boolean }
- *
- */
- public Boolean isShowBoxes() {
- return showBoxes;
- }
-
- /**
- * Sets the value of the showBoxes property.
- *
- * @param value
- * allowed object is
- * {@link Boolean }
- *
- */
- public void setShowBoxes(Boolean value) {
- this.showBoxes = value;
- }
-
- /**
- * Gets the value of the wrapAlignment property.
- *
- * @return
- * possible object is
- * {@link Boolean }
- *
- */
- public Boolean isWrapAlignment() {
- return wrapAlignment;
- }
-
- /**
- * Sets the value of the wrapAlignment property.
- *
- * @param value
- * allowed object is
- * {@link Boolean }
- *
- */
- public void setWrapAlignment(Boolean value) {
- this.wrapAlignment = value;
- }
-
- /**
- * Gets the value of the renderGaps property.
- *
- * @return
- * possible object is
- * {@link Boolean }
- *
- */
- public Boolean isRenderGaps() {
- return renderGaps;
- }
-
- /**
- * Sets the value of the renderGaps property.
- *
- * @param value
- * allowed object is
- * {@link Boolean }
- *
- */
- public void setRenderGaps(Boolean value) {
- this.renderGaps = value;
- }
-
- /**
- * Gets the value of the showSequenceFeatures property.
- *
- * @return
- * possible object is
- * {@link Boolean }
- *
- */
- public Boolean isShowSequenceFeatures() {
- return showSequenceFeatures;
- }
-
- /**
- * Sets the value of the showSequenceFeatures property.
- *
- * @param value
- * allowed object is
- * {@link Boolean }
- *
- */
- public void setShowSequenceFeatures(Boolean value) {
- this.showSequenceFeatures = value;
- }
-
- /**
- * Gets the value of the showNPfeatureTooltip property.
- *
- * @return
- * possible object is
- * {@link Boolean }
- *
- */
- public Boolean isShowNPfeatureTooltip() {
- return showNPfeatureTooltip;
- }
-
- /**
- * Sets the value of the showNPfeatureTooltip property.
- *
- * @param value
- * allowed object is
- * {@link Boolean }
- *
- */
- public void setShowNPfeatureTooltip(Boolean value) {
- this.showNPfeatureTooltip = value;
- }
-
- /**
- * Gets the value of the showDbRefTooltip property.
- *
- * @return
- * possible object is
- * {@link Boolean }
- *
- */
- public Boolean isShowDbRefTooltip() {
- return showDbRefTooltip;
- }
-
- /**
- * Sets the value of the showDbRefTooltip property.
- *
- * @param value
- * allowed object is
- * {@link Boolean }
- *
- */
- public void setShowDbRefTooltip(Boolean value) {
- this.showDbRefTooltip = value;
- }
-
- /**
- * Gets the value of the followHighlight property.
- *
- * @return
- * possible object is
- * {@link Boolean }
- *
- */
- public boolean isFollowHighlight() {
- if (followHighlight == null) {
- return true;
- } else {
- return followHighlight;
- }
- }
-
- /**
- * Sets the value of the followHighlight property.
- *
- * @param value
- * allowed object is
- * {@link Boolean }
- *
- */
- public void setFollowHighlight(Boolean value) {
- this.followHighlight = value;
- }
-
- /**
- * Gets the value of the followSelection property.
- *
- * @return
- * possible object is
- * {@link Boolean }
- *
- */
- public boolean isFollowSelection() {
- if (followSelection == null) {
- return true;
- } else {
- return followSelection;
- }
- }
-
- /**
- * Sets the value of the followSelection property.
- *
- * @param value
- * allowed object is
- * {@link Boolean }
- *
- */
- public void setFollowSelection(Boolean value) {
- this.followSelection = value;
- }
-
- /**
- * Gets the value of the showAnnotation property.
- *
- * @return
- * possible object is
- * {@link Boolean }
- *
- */
- public Boolean isShowAnnotation() {
- return showAnnotation;
- }
-
- /**
- * Sets the value of the showAnnotation property.
- *
- * @param value
- * allowed object is
- * {@link Boolean }
- *
- */
- public void setShowAnnotation(Boolean value) {
- this.showAnnotation = value;
- }
-
- /**
- * Gets the value of the centreColumnLabels property.
- *
- * @return
- * possible object is
- * {@link Boolean }
- *
- */
- public boolean isCentreColumnLabels() {
- if (centreColumnLabels == null) {
- return false;
- } else {
- return centreColumnLabels;
- }
- }
-
- /**
- * Sets the value of the centreColumnLabels property.
- *
- * @param value
- * allowed object is
- * {@link Boolean }
- *
- */
- public void setCentreColumnLabels(Boolean value) {
- this.centreColumnLabels = value;
- }
-
- /**
- * Gets the value of the showGroupConservation property.
- *
- * @return
- * possible object is
- * {@link Boolean }
- *
- */
- public boolean isShowGroupConservation() {
- if (showGroupConservation == null) {
- return false;
- } else {
- return showGroupConservation;
- }
- }
-
- /**
- * Sets the value of the showGroupConservation property.
- *
- * @param value
- * allowed object is
- * {@link Boolean }
- *
- */
- public void setShowGroupConservation(Boolean value) {
- this.showGroupConservation = value;
- }
-
- /**
- * Gets the value of the showGroupConsensus property.
- *
- * @return
- * possible object is
- * {@link Boolean }
- *
- */
- public boolean isShowGroupConsensus() {
- if (showGroupConsensus == null) {
- return false;
- } else {
- return showGroupConsensus;
- }
- }
-
- /**
- * Sets the value of the showGroupConsensus property.
- *
- * @param value
- * allowed object is
- * {@link Boolean }
- *
- */
- public void setShowGroupConsensus(Boolean value) {
- this.showGroupConsensus = value;
- }
-
- /**
- * Gets the value of the showConsensusHistogram property.
- *
- * @return
- * possible object is
- * {@link Boolean }
- *
- */
- public boolean isShowConsensusHistogram() {
- if (showConsensusHistogram == null) {
- return true;
- } else {
- return showConsensusHistogram;
- }
- }
-
- /**
- * Sets the value of the showConsensusHistogram property.
- *
- * @param value
- * allowed object is
- * {@link Boolean }
- *
- */
- public void setShowConsensusHistogram(Boolean value) {
- this.showConsensusHistogram = value;
- }
-
- /**
- * Gets the value of the showSequenceLogo property.
- *
- * @return
- * possible object is
- * {@link Boolean }
- *
- */
- public boolean isShowSequenceLogo() {
- if (showSequenceLogo == null) {
- return false;
- } else {
- return showSequenceLogo;
- }
- }
-
- /**
- * Sets the value of the showSequenceLogo property.
- *
- * @param value
- * allowed object is
- * {@link Boolean }
- *
- */
- public void setShowSequenceLogo(Boolean value) {
- this.showSequenceLogo = value;
- }
-
- /**
- * Gets the value of the normaliseSequenceLogo property.
- *
- * @return
- * possible object is
- * {@link Boolean }
- *
- */
- public boolean isNormaliseSequenceLogo() {
- if (normaliseSequenceLogo == null) {
- return false;
- } else {
- return normaliseSequenceLogo;
- }
- }
-
- /**
- * Sets the value of the normaliseSequenceLogo property.
- *
- * @param value
- * allowed object is
- * {@link Boolean }
- *
- */
- public void setNormaliseSequenceLogo(Boolean value) {
- this.normaliseSequenceLogo = value;
- }
-
- /**
- * Gets the value of the ignoreGapsinConsensus property.
- *
- * @return
- * possible object is
- * {@link Boolean }
- *
- */
- public boolean isIgnoreGapsinConsensus() {
- if (ignoreGapsinConsensus == null) {
- return true;
- } else {
- return ignoreGapsinConsensus;
- }
- }
-
- /**
- * Sets the value of the ignoreGapsinConsensus property.
- *
- * @param value
- * allowed object is
- * {@link Boolean }
- *
- */
- public void setIgnoreGapsinConsensus(Boolean value) {
- this.ignoreGapsinConsensus = value;
- }
-
- /**
- * Gets the value of the startRes property.
- *
- * @return
- * possible object is
- * {@link Integer }
- *
- */
- public Integer getStartRes() {
- return startRes;
- }
-
- /**
- * Sets the value of the startRes property.
- *
- * @param value
- * allowed object is
- * {@link Integer }
- *
- */
- public void setStartRes(Integer value) {
- this.startRes = value;
- }
-
- /**
- * Gets the value of the startSeq property.
- *
- * @return
- * possible object is
- * {@link Integer }
- *
- */
- public Integer getStartSeq() {
- return startSeq;
- }
-
- /**
- * Sets the value of the startSeq property.
- *
- * @param value
- * allowed object is
- * {@link Integer }
- *
- */
- public void setStartSeq(Integer value) {
- this.startSeq = value;
- }
-
- /**
- * Gets the value of the fontName property.
- *
- * @return
- * possible object is
- * {@link String }
- *
- */
- public String getFontName() {
- return fontName;
- }
-
- /**
- * Sets the value of the fontName property.
- *
- * @param value
- * allowed object is
- * {@link String }
- *
- */
- public void setFontName(String value) {
- this.fontName = value;
- }
-
- /**
- * Gets the value of the fontSize property.
- *
- * @return
- * possible object is
- * {@link Integer }
- *
- */
- public Integer getFontSize() {
- return fontSize;
- }
-
- /**
- * Sets the value of the fontSize property.
- *
- * @param value
- * allowed object is
- * {@link Integer }
- *
- */
- public void setFontSize(Integer value) {
- this.fontSize = value;
- }
-
- /**
- * Gets the value of the fontStyle property.
- *
- * @return
- * possible object is
- * {@link Integer }
- *
- */
- public Integer getFontStyle() {
- return fontStyle;
- }
-
- /**
- * Sets the value of the fontStyle property.
- *
- * @param value
- * allowed object is
- * {@link Integer }
- *
- */
- public void setFontStyle(Integer value) {
- this.fontStyle = value;
- }
-
- /**
- * Gets the value of the scaleProteinAsCdna property.
- *
- * @return
- * possible object is
- * {@link Boolean }
- *
- */
- public boolean isScaleProteinAsCdna() {
- if (scaleProteinAsCdna == null) {
- return true;
- } else {
- return scaleProteinAsCdna;
- }
- }
-
- /**
- * Sets the value of the scaleProteinAsCdna property.
- *
- * @param value
- * allowed object is
- * {@link Boolean }
- *
- */
- public void setScaleProteinAsCdna(Boolean value) {
- this.scaleProteinAsCdna = value;
- }
-
- /**
- * Gets the value of the viewName property.
- *
- * @return
- * possible object is
- * {@link String }
- *
- */
- public String getViewName() {
- return viewName;
- }
-
- /**
- * Sets the value of the viewName property.
- *
- * @param value
- * allowed object is
- * {@link String }
- *
- */
- public void setViewName(String value) {
- this.viewName = value;
- }
-
- /**
- * Gets the value of the sequenceSetId property.
- *
- * @return
- * possible object is
- * {@link String }
- *
- */
- public String getSequenceSetId() {
- return sequenceSetId;
- }
-
- /**
- * Sets the value of the sequenceSetId property.
- *
- * @param value
- * allowed object is
- * {@link String }
- *
- */
- public void setSequenceSetId(String value) {
- this.sequenceSetId = value;
- }
-
- /**
- * Gets the value of the gatheredViews property.
- *
- * @return
- * possible object is
- * {@link Boolean }
- *
- */
- public Boolean isGatheredViews() {
- return gatheredViews;
- }
-
- /**
- * Sets the value of the gatheredViews property.
- *
- * @param value
- * allowed object is
- * {@link Boolean }
- *
- */
- public void setGatheredViews(Boolean value) {
- this.gatheredViews = value;
- }
-
- /**
- * Gets the value of the textCol1 property.
- *
- * @return
- * possible object is
- * {@link Integer }
- *
- */
- public Integer getTextCol1() {
- return textCol1;
- }
-
- /**
- * Sets the value of the textCol1 property.
- *
- * @param value
- * allowed object is
- * {@link Integer }
- *
- */
- public void setTextCol1(Integer value) {
- this.textCol1 = value;
- }
-
- /**
- * Gets the value of the textCol2 property.
- *
- * @return
- * possible object is
- * {@link Integer }
- *
- */
- public Integer getTextCol2() {
- return textCol2;
- }
-
- /**
- * Sets the value of the textCol2 property.
- *
- * @param value
- * allowed object is
- * {@link Integer }
- *
- */
- public void setTextCol2(Integer value) {
- this.textCol2 = value;
- }
-
- /**
- * Gets the value of the textColThreshold property.
- *
- * @return
- * possible object is
- * {@link Integer }
- *
- */
- public Integer getTextColThreshold() {
- return textColThreshold;
- }
-
- /**
- * Sets the value of the textColThreshold property.
- *
- * @param value
- * allowed object is
- * {@link Integer }
- *
- */
- public void setTextColThreshold(Integer value) {
- this.textColThreshold = value;
- }
-
- /**
- * Gets the value of the id property.
- *
- * @return
- * possible object is
- * {@link String }
- *
- */
- public String getId() {
- return id;
- }
-
- /**
- * Sets the value of the id property.
- *
- * @param value
- * allowed object is
- * {@link String }
- *
- */
- public void setId(String value) {
- this.id = value;
- }
-
- /**
- * Gets the value of the complementId property.
- *
- * @return
- * possible object is
- * {@link String }
- *
- */
- public String getComplementId() {
- return complementId;
- }
-
- /**
- * Sets the value of the complementId property.
- *
- * @param value
- * allowed object is
- * {@link String }
- *
- */
- public void setComplementId(String value) {
- this.complementId = value;
- }
-
- /**
- * Gets the value of the width property.
- *
- * @return
- * possible object is
- * {@link Integer }
- *
- */
- public Integer getWidth() {
- return width;
- }
-
- /**
- * Sets the value of the width property.
- *
- * @param value
- * allowed object is
- * {@link Integer }
- *
- */
- public void setWidth(Integer value) {
- this.width = value;
- }
-
- /**
- * Gets the value of the height property.
- *
- * @return
- * possible object is
- * {@link Integer }
- *
- */
- public Integer getHeight() {
- return height;
- }
-
- /**
- * Sets the value of the height property.
- *
- * @param value
- * allowed object is
- * {@link Integer }
- *
- */
- public void setHeight(Integer value) {
- this.height = value;
- }
-
- /**
- * Gets the value of the xpos property.
- *
- * @return
- * possible object is
- * {@link Integer }
- *
- */
- public Integer getXpos() {
- return xpos;
- }
-
- /**
- * Sets the value of the xpos property.
- *
- * @param value
- * allowed object is
- * {@link Integer }
- *
- */
- public void setXpos(Integer value) {
- this.xpos = value;
- }
-
- /**
- * Gets the value of the ypos property.
- *
- * @return
- * possible object is
- * {@link Integer }
- *
- */
- public Integer getYpos() {
- return ypos;
- }
-
- /**
- * Sets the value of the ypos property.
- *
- * @param value
- * allowed object is
- * {@link Integer }
- *
- */
- public void setYpos(Integer value) {
- this.ypos = value;
- }
-
-
- /**
- * <p>Java class for anonymous complex type.
- *
- * <p>The following schema fragment specifies the expected content contained within this class.
- *
- * <pre>
- * <complexType>
- * <complexContent>
- * <extension base="{www.jalview.org/xml/wsparamset}WebServiceParameterSet">
- * <attribute name="calcId" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
- * <attribute name="needsUpdate" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />
- * <attribute name="autoUpdate" use="required" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- * </extension>
- * </complexContent>
- * </complexType>
- * </pre>
- *
- *
- */
- @XmlAccessorType(XmlAccessType.FIELD)
- @XmlType(name = "")
- public static class CalcIdParam
- extends WebServiceParameterSet
- {
-
- @XmlAttribute(name = "calcId", required = true)
- protected String calcId;
- @XmlAttribute(name = "needsUpdate")
- protected Boolean needsUpdate;
- @XmlAttribute(name = "autoUpdate", required = true)
- protected boolean autoUpdate;
-
- /**
- * Gets the value of the calcId property.
- *
- * @return
- * possible object is
- * {@link String }
- *
- */
- public String getCalcId() {
- return calcId;
- }
-
- /**
- * Sets the value of the calcId property.
- *
- * @param value
- * allowed object is
- * {@link String }
- *
- */
- public void setCalcId(String value) {
- this.calcId = value;
- }
-
- /**
- * Gets the value of the needsUpdate property.
- *
- * @return
- * possible object is
- * {@link Boolean }
- *
- */
- public boolean isNeedsUpdate() {
- if (needsUpdate == null) {
- return false;
- } else {
- return needsUpdate;
- }
- }
-
- /**
- * Sets the value of the needsUpdate property.
- *
- * @param value
- * allowed object is
- * {@link Boolean }
- *
- */
- public void setNeedsUpdate(Boolean value) {
- this.needsUpdate = value;
- }
-
- /**
- * Gets the value of the autoUpdate property.
- *
- */
- public boolean isAutoUpdate() {
- return autoUpdate;
- }
-
- /**
- * Sets the value of the autoUpdate property.
- *
- */
- public void setAutoUpdate(boolean value) {
- this.autoUpdate = value;
- }
-
- }
-
-
- /**
- * <p>Java class for anonymous complex type.
- *
- * <p>The following schema fragment specifies the expected content contained within this class.
- *
- * <pre>
- * <complexType>
- * <complexContent>
- * <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- * <attribute name="start" type="{http://www.w3.org/2001/XMLSchema}int" />
- * <attribute name="end" type="{http://www.w3.org/2001/XMLSchema}int" />
- * </restriction>
- * </complexContent>
- * </complexType>
- * </pre>
- *
- *
- */
- @XmlAccessorType(XmlAccessType.FIELD)
- @XmlType(name = "")
- public static class HiddenColumns {
-
- @XmlAttribute(name = "start")
- protected Integer start;
- @XmlAttribute(name = "end")
- protected Integer end;
-
- /**
- * Gets the value of the start property.
- *
- * @return
- * possible object is
- * {@link Integer }
- *
- */
- public Integer getStart() {
- return start;
- }
-
- /**
- * Sets the value of the start property.
- *
- * @param value
- * allowed object is
- * {@link Integer }
- *
- */
- public void setStart(Integer value) {
- this.start = value;
- }
-
- /**
- * Gets the value of the end property.
- *
- * @return
- * possible object is
- * {@link Integer }
- *
- */
- public Integer getEnd() {
- return end;
- }
-
- /**
- * Sets the value of the end property.
- *
- * @param value
- * allowed object is
- * {@link Integer }
- *
- */
- public void setEnd(Integer value) {
- this.end = value;
- }
-
- }
-
- }
-
-}
public class PDBfile extends StructureFile
{
- private static String CALC_ID_PREFIX = "JalviewPDB";
+ private final static String CALC_ID_PREFIX = "JalviewPDB";
public PDBfile(boolean addAlignmentAnnotations,
boolean predictSecondaryStructure, boolean externalSecStr)
setId(safeName(getDataName()));
setChains(new Vector<PDBChain>());
- List<SequenceI> rna = new ArrayList<SequenceI>();
- List<SequenceI> prot = new ArrayList<SequenceI>();
+ List<SequenceI> rna = new ArrayList<>();
+ List<SequenceI> prot = new ArrayList<>();
PDBChain tmpchain;
String line = null;
boolean modelFlag = false;
boolean terFlag = false;
String lastID = "";
- int indexx = 0;
+ // int indexx = 0;
String atomnam = null;
try
{
*
*/
public class EpsGraphics2D extends java.awt.Graphics2D
- implements AutoCloseable
{
public static final String VERSION = "0.8.8";
* OutputStream is automatically flushed before being closed. If you forget to
* do this, the file may be incomplete.
*/
- @Override
public void close() throws IOException
{
flush();
* Draws a 3D rectangle outline. If it is raised, light appears to come from
* the top left.
*/
- @Override
public void draw3DRect(int x, int y, int width, int height, boolean raised)
{
Color originalColor = getColor();
* Fills a 3D rectangle. If raised, it has bright fill and light appears to
* come from the top left.
*/
- @Override
public void fill3DRect(int x, int y, int width, int height, boolean raised)
{
Color originalColor = getColor();
/**
* Draws a Shape on the EPS document.
*/
- @Override
public void draw(Shape s)
{
draw(s, "stroke");
/**
* Draws an Image on the EPS document.
*/
- @Override
public boolean drawImage(Image img, AffineTransform xform,
ImageObserver obs)
{
/**
* Draws a BufferedImage on the EPS document.
*/
- @Override
public void drawImage(BufferedImage img, BufferedImageOp op, int x, int y)
{
BufferedImage img1 = op.filter(img, null);
/**
* Draws a RenderedImage on the EPS document.
*/
- @Override
public void drawRenderedImage(RenderedImage img, AffineTransform xform)
{
Hashtable properties = new Hashtable();
/**
* Draws a RenderableImage by invoking its createDefaultRendering method.
*/
- @Override
public void drawRenderableImage(RenderableImage img, AffineTransform xform)
{
drawRenderedImage(img.createDefaultRendering(), xform);
/**
* Draws a string at (x,y)
*/
- @Override
public void drawString(String str, int x, int y)
{
drawString(str, (float) x, (float) y);
/**
* Draws a string at (x,y)
*/
- @Override
public void drawString(String s, float x, float y)
{
if (s != null && s.length() > 0)
* Draws the characters of an AttributedCharacterIterator, starting from
* (x,y).
*/
- @Override
public void drawString(AttributedCharacterIterator iterator, int x, int y)
{
drawString(iterator, (float) x, (float) y);
* Draws the characters of an AttributedCharacterIterator, starting from
* (x,y).
*/
- @Override
public void drawString(AttributedCharacterIterator iterator, float x,
float y)
{
/**
* Draws a GlyphVector at (x,y)
*/
- @Override
public void drawGlyphVector(GlyphVector g, float x, float y)
{
Shape shape = g.getOutline(x, y);
/**
* Fills a Shape on the EPS document.
*/
- @Override
public void fill(Shape s)
{
draw(s, "fill");
* Checks whether or not the specified Shape intersects the specified
* Rectangle, which is in device space.
*/
- @Override
public boolean hit(Rectangle rect, Shape s, boolean onStroke)
{
return s.intersects(rect);
/**
* Returns the device configuration associated with this EpsGraphics2D object.
*/
- @Override
public GraphicsConfiguration getDeviceConfiguration()
{
GraphicsConfiguration gc = null;
* Sets the Composite to be used by this EpsGraphics2D. EpsGraphics2D does not
* make use of these.
*/
- @Override
public void setComposite(Composite comp)
{
_composite = comp;
* Sets the Paint attribute for the EpsGraphics2D object. Only Paint objects
* of type Color are respected by EpsGraphics2D.
*/
- @Override
public void setPaint(Paint paint)
{
_paint = paint;
* Sets the stroke. Only accepts BasicStroke objects (or subclasses of
* BasicStroke).
*/
- @Override
public void setStroke(Stroke s)
{
if (s instanceof BasicStroke)
/**
* Sets a rendering hint. These are not used by EpsGraphics2D.
*/
- @Override
public void setRenderingHint(RenderingHints.Key hintKey, Object hintValue)
{
// Do nothing.
* Returns the value of a single preference for the rendering algorithms.
* Rendering hints are not used by EpsGraphics2D.
*/
- @Override
public Object getRenderingHint(RenderingHints.Key hintKey)
{
return null;
/**
* Sets the rendering hints. These are ignored by EpsGraphics2D.
*/
- @Override
public void setRenderingHints(Map hints)
{
// Do nothing.
/**
* Adds rendering hints. These are ignored by EpsGraphics2D.
*/
- @Override
public void addRenderingHints(Map hints)
{
// Do nothing.
/**
* Returns the preferences for the rendering algorithms.
*/
- @Override
public RenderingHints getRenderingHints()
{
return new RenderingHints(null);
* Translates the origin of the EpsGraphics2D context to the point (x,y) in
* the current coordinate system.
*/
- @Override
public void translate(int x, int y)
{
translate((double) x, (double) y);
* Concatenates the current EpsGraphics2D Transformation with a translation
* transform.
*/
- @Override
public void translate(double tx, double ty)
{
transform(AffineTransform.getTranslateInstance(tx, ty));
/**
* Concatenates the current EpsGraphics2D Transform with a rotation transform.
*/
- @Override
public void rotate(double theta)
{
rotate(theta, 0, 0);
* Concatenates the current EpsGraphics2D Transform with a translated rotation
* transform.
*/
- @Override
public void rotate(double theta, double x, double y)
{
transform(AffineTransform.getRotateInstance(theta, x, y));
* Concatenates the current EpsGraphics2D Transform with a scaling
* transformation.
*/
- @Override
public void scale(double sx, double sy)
{
transform(AffineTransform.getScaleInstance(sx, sy));
/**
* Concatenates the current EpsGraphics2D Transform with a shearing transform.
*/
- @Override
public void shear(double shx, double shy)
{
transform(AffineTransform.getShearInstance(shx, shy));
* Composes an AffineTransform object with the Transform in this EpsGraphics2D
* according to the rule last-specified-first-applied.
*/
- @Override
public void transform(AffineTransform Tx)
{
_transform.concatenate(Tx);
/**
* Sets the AffineTransform to be used by this EpsGraphics2D.
*/
- @Override
public void setTransform(AffineTransform Tx)
{
if (Tx == null)
/**
* Gets the AffineTransform used by this EpsGraphics2D.
*/
- @Override
public AffineTransform getTransform()
{
return new AffineTransform(_transform);
/**
* Returns the current Paint of the EpsGraphics2D object.
*/
- @Override
public Paint getPaint()
{
return _paint;
/**
* returns the current Composite of the EpsGraphics2D object.
*/
- @Override
public Composite getComposite()
{
return _composite;
/**
* Sets the background color to be used by the clearRect method.
*/
- @Override
public void setBackground(Color color)
{
if (color == null)
/**
* Gets the background color that is used by the clearRect method.
*/
- @Override
public Color getBackground()
{
return _backgroundColor;
* Returns the Stroke currently used. Guaranteed to be an instance of
* BasicStroke.
*/
- @Override
public Stroke getStroke()
{
return _stroke;
* Intersects the current clip with the interior of the specified Shape and
* sets the clip to the resulting intersection.
*/
- @Override
public void clip(Shape s)
{
if (_clip == null)
/**
* Returns the FontRenderContext.
*/
- @Override
public FontRenderContext getFontRenderContext()
{
return _fontRenderContext;
/**
* Returns a new Graphics object that is identical to this EpsGraphics2D.
*/
- @Override
public Graphics create()
{
return new EpsGraphics2D(this);
* Returns an EpsGraphics2D object based on this Graphics object, but with a
* new translation and clip area.
*/
- @Override
public Graphics create(int x, int y, int width, int height)
{
Graphics g = create();
* Returns the current Color. This will be a default value (black) until it is
* changed using the setColor method.
*/
- @Override
public Color getColor()
{
return _color;
/**
* Sets the Color to be used when drawing all future shapes, text, etc.
*/
- @Override
public void setColor(Color c)
{
if (c == null)
* Sets the paint mode of this EpsGraphics2D object to overwrite the
* destination EpsDocument with the current color.
*/
- @Override
public void setPaintMode()
{
// Do nothing - paint mode is the only method supported anyway.
* <b><i><font color="red">Not implemented</font></i></b> - performs no
* action.
*/
- @Override
public void setXORMode(Color c1)
{
methodNotSupported();
/**
* Returns the Font currently being used.
*/
- @Override
public Font getFont()
{
return _font;
/**
* Sets the Font to be used in future text.
*/
- @Override
public void setFont(Font font)
{
if (font == null)
font = Font.decode(null);
}
_font = font;
- append("/" + _font.getPSName() + " findfont " + (_font.getSize())
+ append("/" + _font.getPSName() + " findfont " + ((int) _font.getSize())
+ " scalefont setfont");
}
/**
* Gets the font metrics of the current font.
*/
- @Override
public FontMetrics getFontMetrics()
{
return getFontMetrics(getFont());
/**
* Gets the font metrics for the specified font.
*/
- @Override
public FontMetrics getFontMetrics(Font f)
{
BufferedImage image = new BufferedImage(1, 1,
/**
* Returns the bounding rectangle of the current clipping area.
*/
- @Override
public Rectangle getClipBounds()
{
if (_clip == null)
/**
* Intersects the current clip with the specified rectangle.
*/
- @Override
public void clipRect(int x, int y, int width, int height)
{
clip(new Rectangle(x, y, width, height));
/**
* Sets the current clip to the rectangle specified by the given coordinates.
*/
- @Override
public void setClip(int x, int y, int width, int height)
{
setClip(new Rectangle(x, y, width, height));
/**
* Gets the current clipping area.
*/
- @Override
public Shape getClip()
{
if (_clip == null)
/**
* Sets the current clipping area to an arbitrary clip shape.
*/
- @Override
public void setClip(Shape clip)
{
if (clip != null)
* <b><i><font color="red">Not implemented</font></i></b> - performs no
* action.
*/
- @Override
public void copyArea(int x, int y, int width, int height, int dx, int dy)
{
methodNotSupported();
/**
* Draws a straight line from (x1,y1) to (x2,y2).
*/
- @Override
public void drawLine(int x1, int y1, int x2, int y2)
{
Shape shape = new Line2D.Float(x1, y1, x2, y2);
/**
* Fills a rectangle with top-left corner placed at (x,y).
*/
- @Override
public void fillRect(int x, int y, int width, int height)
{
Shape shape = new Rectangle(x, y, width, height);
/**
* Draws a rectangle with top-left corner placed at (x,y).
*/
- @Override
public void drawRect(int x, int y, int width, int height)
{
Shape shape = new Rectangle(x, y, width, height);
* Clears a rectangle with top-left corner placed at (x,y) using the current
* background color.
*/
- @Override
public void clearRect(int x, int y, int width, int height)
{
Color originalColor = getColor();
/**
* Draws a rounded rectangle.
*/
- @Override
public void drawRoundRect(int x, int y, int width, int height,
int arcWidth, int arcHeight)
{
/**
* Fills a rounded rectangle.
*/
- @Override
public void fillRoundRect(int x, int y, int width, int height,
int arcWidth, int arcHeight)
{
/**
* Draws an oval.
*/
- @Override
public void drawOval(int x, int y, int width, int height)
{
Shape shape = new Ellipse2D.Float(x, y, width, height);
/**
* Fills an oval.
*/
- @Override
public void fillOval(int x, int y, int width, int height)
{
Shape shape = new Ellipse2D.Float(x, y, width, height);
/**
* Draws an arc.
*/
- @Override
public void drawArc(int x, int y, int width, int height, int startAngle,
int arcAngle)
{
/**
* Fills an arc.
*/
- @Override
public void fillArc(int x, int y, int width, int height, int startAngle,
int arcAngle)
{
/**
* Draws a polyline.
*/
- @Override
public void drawPolyline(int[] xPoints, int[] yPoints, int nPoints)
{
if (nPoints > 0)
/**
* Draws a polygon made with the specified points.
*/
- @Override
public void drawPolygon(int[] xPoints, int[] yPoints, int nPoints)
{
Shape shape = new Polygon(xPoints, yPoints, nPoints);
/**
* Draws a polygon.
*/
- @Override
public void drawPolygon(Polygon p)
{
draw(p);
/**
* Fills a polygon made with the specified points.
*/
- @Override
public void fillPolygon(int[] xPoints, int[] yPoints, int nPoints)
{
Shape shape = new Polygon(xPoints, yPoints, nPoints);
/**
* Fills a polygon.
*/
- @Override
public void fillPolygon(Polygon p)
{
draw(p, "fill");
/**
* Draws the specified characters, starting from (x,y)
*/
- @Override
public void drawChars(char[] data, int offset, int length, int x, int y)
{
String string = new String(data, offset, length);
/**
* Draws the specified bytes, starting from (x,y)
*/
- @Override
public void drawBytes(byte[] data, int offset, int length, int x, int y)
{
String string = new String(data, offset, length);
/**
* Draws an image.
*/
- @Override
public boolean drawImage(Image img, int x, int y, ImageObserver observer)
{
return drawImage(img, x, y, Color.white, observer);
/**
* Draws an image.
*/
- @Override
public boolean drawImage(Image img, int x, int y, int width, int height,
ImageObserver observer)
{
/**
* Draws an image.
*/
- @Override
public boolean drawImage(Image img, int x, int y, Color bgcolor,
ImageObserver observer)
{
/**
* Draws an image.
*/
- @Override
public boolean drawImage(Image img, int x, int y, int width, int height,
Color bgcolor, ImageObserver observer)
{
/**
* Draws an image.
*/
- @Override
public boolean drawImage(Image img, int dx1, int dy1, int dx2, int dy2,
int sx1, int sy1, int sx2, int sy2, ImageObserver observer)
{
/**
* Draws an image.
*/
- @Override
public boolean drawImage(Image img, int dx1, int dy1, int dx2, int dy2,
int sx1, int sy1, int sx2, int sy2, Color bgcolor,
ImageObserver observer)
* only remaining EpsGraphics2D instance pointing at a EpsDocument object,
* then the EpsDocument object shall become eligible for garbage collection.
*/
- @Override
public void dispose()
{
_document = null;
}
- /* bsoares 2019-03-20
- * finalize is now deprecated. Implementing AutoCloseable instead
/**
* Finalizes the object.
- @Override
+ */
public void finalize()
{
super.finalize();
}
- */
/**
* Returns the entire contents of the EPS document, complete with headers and
* bounding box. The returned String is suitable for being written directly to
* disk as an EPS file.
*/
- @Override
public String toString()
{
StringWriter writer = new StringWriter();
* Returns true if the specified rectangular area might intersect the current
* clipping area.
*/
- @Override
public boolean hitClip(int x, int y, int width, int height)
{
if (_clip == null)
/**
* Returns the bounding rectangle of the current clipping area.
*/
- @Override
public Rectangle getClipBounds(Rectangle r)
{
if (_clip == null)
{
_hashCode += getMatrix().hashCode();
}
- _hashCode += Float.valueOf(getExp()).hashCode();
- _hashCode += Boolean.valueOf(isEchofilter()).hashCode();
+ _hashCode += new Float(getExp()).hashCode();
+ _hashCode += new Boolean(isEchofilter()).hashCode();
if (getFilter() != null)
{
_hashCode += getFilter().hashCode();
_hashCode += getOutformat().hashCode();
}
_hashCode += getTopcombon();
- _hashCode += Boolean.valueOf(isAsync()).hashCode();
+ _hashCode += new Boolean(isAsync()).hashCode();
if (getEmail() != null)
{
_hashCode += getEmail().hashCode();
setAttachments(_call);
java.lang.Object _resp = _call.invoke(new java.lang.Object[] {
sequence, searchDatabases, taxonId,
- java.lang.Boolean.valueOf(onlyActive) });
+ new java.lang.Boolean(onlyActive) });
if (_resp instanceof java.rmi.RemoteException)
{
setAttachments(_call);
java.lang.Object _resp = _call.invoke(new java.lang.Object[] {
accession, ac_version, searchDatabases, taxonId,
- java.lang.Boolean.valueOf(onlyActive) });
+ new java.lang.Boolean(onlyActive) });
if (_resp instanceof java.rmi.RemoteException)
{
--- /dev/null
+<!DOCTYPE html>
+<html>
+<head>
+<title>SwingJS test Jalview</title>
+<meta charset="utf-8" />
+<script src="swingjs/swingjs2.js"></script>
+<script src="swingjs/JalviewApplet.js"></script>
+<script>
+if (!self.SwingJS)alert('swingjs2.js was not found. It needs to be in swingjs folder in the same directory as ' + document.location.href)
+JalviewInfo = {
+ code: null,
+ main: "jalview.bin.Jalview",
+ core: "NONE",
+ //core:"_jalview",
+ resourcePath: "examples",
+ readyFunction: null,
+ serverURL: 'https://chemapps.stolaf.edu/jmol/jsmol/php/jsmol.php',
+ j2sPath: 'swingjs/j2s',
+ console:'sysout',
+ startButton:'Start Jalview',
+ hideDesktop:true,
+ embedInternalFrames:false,
+ idPrefix:'%ID%',
+ allowjavascript: true
+}
+</script>
+</head>
+<body>
+<!-- content template start
+JalviewApplet.js will add divs such as these:
+<div id="jalview0-desktop-div" style="width:0px;display:none"></div>
+<div id="jalview0-alignment-div" style="width:0px;display:none"></div>
+ -->
+<p align="left">
+<h2>JalviewJS Button Examples</h2>
+Try out JalviewJS by pressing one of the buttons below.
+<a target="_blank" href="http://www.jalview.org/examples/applets.html">Original Java</a> (requires SeaMonkey browser)
+</p>
+<p> </p><div align="center">
+ <p align="center">
+ <h2>Ferredoxins, chloroplast precursor related UniRef50
+ cluster</h2>
+ <br /> (15 sequences x 150 residues)
+ </p>
+ <table width="90%">
+ <tr>
+ <td width="10%" valign="center">
+ <applet
+ code="jalview.bin.JalviewLite" width="140" height="35"
+ archive="jalviewApplet.jar,JmolApplet-14.6.4_2016.10.26.jar,java-json.jar,json_simple-1.1.jar">
+ <param name="permissions" value="sandbox"/>
+ <param name="file" value="uniref50.fa"/>
+ <param name="treeFile" value="ferredoxin.nw"/>
+ <param name="userDefinedColour" value="C=yellow; R,K,H=FF5555; D,E=5555FF"/>
+ <param name="sortByTree" value="True"/>
+ <param name="showSequenceLogo" value="true"/>
+ <param name="showGroupConsensus" value="true"/>
+ <param name="showFullId" value="false"/>
+ <param name="linkLabel_1" value="Uniprot"/>
+ <param name="linkUrl_1" value="http://www.uniprot.org/uniprot/$SEQUENCE_ID$"/>
+ <param name="linkLabel_2" value="EMBL-EBI Search"/>
+ <param name="linkUrl_2" value="http://www.ebi.ac.uk/ebisearch/search.ebi?db=allebi&query=$SEQUENCE_ID$"/>
+ <param name="APPLICATION_URL" value="http://www.jalview.org/services/launchApp"/>
+ </applet>
+</td>
+ <td valign="center">User Defined Colours, loads an associated
+ Newick format tree file which is used to sort the alignment, and
+ group consensus and sequence logos are shown below the alignment.</td>
+ </tr>
+ <tr>
+ <td width="10%" valign="center"><applet
+ code="jalview.bin.JalviewLite" width="140" height="35"
+ archive="jalviewApplet.jar,JmolApplet-14.6.4_2016.10.26.jar,java-json.jar,json_simple-1.1.jar">
+<param name="permissions" value="sandbox"/>
+<param name="file" value="uniref50.fa"/>
+<param name="features" value="exampleFeatures.txt"/>
+<param name="showFullId" value="false"/>
+<param name="windowHeight" value="500"/>
+<param name="windowWidth" value="650"/>
+<param name="showFeatureSettings" value="true"/>
+<param name="wrap" value="true"/>
+<param name="showAnnotation" value="false"/>
+ <param name="linkLabel_1" value="Uniprot"/>
+ <param name="linkUrl_1"
+ value="http://www.uniprot.org/uniprot/$SEQUENCE_ID$"/>
+ <param name="linkLabel_2" value="EMBL-EBI Search"/>
+ <param name="linkUrl_2"
+ value="http://www.ebi.ac.uk/ebisearch/search.ebi?db=allebi&query=$SEQUENCE_ID$"/>
+ <param name="APPLICATION_URL"
+ value="http://www.jalview.org/services/launchApp"/>
+</applet>
+</td>
+ <td valign="center">Displays a features file on the alignment</td>
+ </tr>
+ <tr>
+ <td width="10%" valign="center"><applet
+ code="jalview.bin.JalviewLite" width="140" height="35"
+ archive="jalviewApplet.jar,JmolApplet-14.6.4_2016.10.26.jar,java-json.jar,json_simple-1.1.jar">
+<param name="permissions" value="sandbox"/>
+<param name="file" value="uniref50.fa"/>
+<param name="showFullId" value="false"/>
+<param name="windowHeight" value="500"/>
+<param name="windowWidth" value="650"/>
+<param name="wrap" value="true"/>
+<param name="debug" value="true"/>
+<param name="showAnnotation" value="false"/>
+<param name="defaultColour" value="Strand Propensity"/>
+<param name="PDBfile" value="1gaq.txt FER1_MAIZE"/>
+ <param name="linkLabel_1" value="Uniprot"/>
+ <param name="linkUrl_1"
+ value="http://www.uniprot.org/uniprot/$SEQUENCE_ID$"/>
+ <param name="linkLabel_2" value="EMBL-EBI Search"/>
+ <param name="linkUrl_2"
+ value="http://www.ebi.ac.uk/ebisearch/search.ebi?db=allebi&query=$SEQUENCE_ID$"/>
+ <param name="APPLICATION_URL"
+ value="http://www.jalview.org/services/launchApp"/>
+</applet>
+</td>
+ <td valign="center">Associates PDB file 1GAQ with sequence
+ FER1_MAIZE</td>
+ </tr>
+ <tr>
+ <td width="10%" valign="center"><applet
+ code="jalview.bin.JalviewLite" width="140" height="35"
+ archive="jalviewApplet.jar,JmolApplet-14.6.4_2016.10.26.jar,java-json.jar,json_simple-1.1.jar">
+<param name="permissions" value="sandbox"/>
+<param name="file" value="jpred_msa.fasta"/>
+<param name="jnetfile" value="jpred_msa.seq.concise"/>
+<param name="showFullId" value="false"/>
+<param name="windowHeight" value="515"/>
+<param name="windowWidth" value="650"/>
+<param name="showAnnotation" value="true"/>
+<param name="defaultColour" value="Clustal"/>
+ <param name="linkLabel_1" value="Uniprot"/>
+ <param name="linkUrl_1"
+ value="http://www.uniprot.org/uniprot/$SEQUENCE_ID$"/>
+ <param name="linkLabel_2" value="EMBL-EBI Search"/>
+ <param name="linkUrl_2"
+ value="http://www.ebi.ac.uk/ebisearch/search.ebi?db=allebi&query=$SEQUENCE_ID$"/>
+ <param name="APPLICATION_URL"
+ value="http://www.jalview.org/services/launchApp"/>
+</applet>
+ </td>
+ <td valign="middle">Displays a Multiple Sequence Alignment
+ Based JPred Prediction for a Sequence</td>
+ </tr>
+ </table>
+ <p>
+ <h2>RF00031 RFAM Alignment with per sequence secondary
+ structure</h2>
+ </p>
+ <table width="90%">
+ <tr>
+ <td width="10%" valign="center"><applet
+ code="jalview.bin.JalviewLite" width="140" height="35"
+ archive="jalviewApplet.jar,JmolApplet-14.6.4_2016.10.26.jar,java-json.jar,json_simple-1.1.jar">
+<param name="permissions" value="sandbox"/>
+<param name="file" value="RF00031_folded.stk"/>
+<param name="showFullId" value="false"/>
+<param name="windowHeight" value="515"/>
+<param name="windowWidth" value="650"/>
+<param name="showAnnotation" value="true"/>
+<param name="defaultColour" value="Purine/Pyrimidine"/>
+ <param name="APPLICATION_URL"
+ value="http://www.jalview.org/services/launchApp"/>
+</applet>
+</td>
+ <td valign="center">Displays an RFAM RNA fold family with
+ secondary structure annotation</td>
+ </tr>
+ </table>
+ <p>
+ <h2>Linked Protein and cDNA alignments for a family of Steroid Receptors</h2>
+ </p>
+ <table width="90%">
+ <tr>
+ <td width="10%" valign="center">
+<applet
+ code="jalview.bin.JalviewLite" width="140" height="35"
+ archive="jalviewApplet.jar,JmolApplet-14.6.4_2016.10.26.jar,java-json.jar,json_simple-1.1.jar">
+<param name="permissions" value="sandbox"/>
+<param name="file2" value="estrogenReceptorCdna_frag.fa"/>
+<param name="file" value="estrogenReceptorProtein_frag.fa"/>
+<param name="enableSplitFrame" value="true"/>
+<param name="scaleProteinAsCdna" value="true"/>
+<param name="showFullId" value="false"/>
+<param name="windowHeight" value="300"/>
+<param name="windowWidth" value="800"/>
+<param name="showAnnotation" value="true"/>
+<param name="showSequenceLogo" value="true"/>
+<param name="defaultColourNuc" value="Purine/Pyrimidine"/>
+<param name="defaultColourProt" value="Clustal"/>
+ <param name="APPLICATION_URL"
+ value="http://www.jalview.org/services/launchApp"/>
+</applet>
+</td>
+ <td valign="center">Displays a split window view showing aligned protein
+ and a reconstructed cDNA alignment.<br />Proteins were aligned with <a
+ href="http://www.drive5.com/muscle">Muscle</a> (version 3.8.31,
+ via the Jalview Desktop).<br />Data retrieved from Uniprot and
+ ENA, after Thornton, Need and Crews, <a
+ href="http://dx.doi.org/10.1126/science.1086185">Science 19
+ September 2003: 301 (5640), 1714-1717</a>
+ </td>
+ </tr>
+ </table>
+</div>
+<div id="sysout" style="width:500px;height:300px;background:yellow;overflow:auto"></div>
+
+</body>
+</html>
+<!--
+ * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
+ * Copyright (C) $$Year-Rel$$ The Jalview Authors
+ *
+ * This file is part of Jalview.
+ *
+ * Jalview is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
+ *
+ * Jalview is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with Jalview. If not, see <http://www.gnu.org/licenses/>.
+ * The Jalview Authors are detailed in the 'AUTHORS' file.
+-->
+
--- /dev/null
+<!DOCTYPE html>
+<html>
+<head>
+<title>SwingJS test Jalview</title>
+<meta charset="utf-8" />
+<script src="swingjs/swingjs2.js"></script>
+<script src="swingjs/JalviewApplet.js"></script>
+<script>
+if (!self.SwingJS)alert('swingjs2.js was not found. It needs to be in swingjs folder in the same directory as ' + document.location.href)
+JalviewInfo = {
+ code: null,
+ main: "jalview.bin.Jalview",
+ //core: "NONE",
+ core:"_jalview",
+ resourcePath: "examples",
+ readyFunction: null,
+ serverURL: 'https://chemapps.stolaf.edu/jmol/jsmol/php/jsmol.php',
+ j2sPath: 'swingjs/j2s',
+ console:'sysout',
+ startButton:'Start Jalview',
+ hideDesktop:true,
+ embedInternalFrames:false,
+ idPrefix:'%ID%',
+ allowJavascript: true
+}
+</script>
+</head>
+<body>
+<!-- content template start
+JalviewApplet.js will add divs such as these:
+<div id="jalview0-desktop-div" style="width:0px;display:none"></div>
+<div id="jalview0-alignment-div" style="width:0px;display:none"></div>
+ -->
+<p align="left">
+<h2>JalviewJS Button Examples</h2>
+Try out JalviewJS by pressing one of the buttons below.
+<a target="_blank" href="http://www.jalview.org/examples/applets.html">Original Java</a> (requires SeaMonkey browser)
+</p>
+<p> </p><div align="center">
+ <p align="center">
+ <h2>Ferredoxins, chloroplast precursor related UniRef50
+ cluster</h2>
+ <br /> (15 sequences x 150 residues)
+ </p>
+ <table width="90%">
+ <tr>
+ <td width="10%" valign="center">
+ <applet
+ code="jalview.bin.JalviewLite" width="140" height="35"
+ archive="jalviewApplet.jar,JmolApplet-14.6.4_2016.10.26.jar,java-json.jar,json_simple-1.1.jar">
+ <param name="permissions" value="sandbox"/>
+ <param name="file" value="uniref50.fa"/>
+ <param name="treeFile" value="ferredoxin.nw"/>
+ <param name="userDefinedColour" value="C=yellow; R,K,H=FF5555; D,E=5555FF"/>
+ <param name="sortByTree" value="True"/>
+ <param name="showSequenceLogo" value="true"/>
+ <param name="showGroupConsensus" value="true"/>
+ <param name="showFullId" value="false"/>
+ <param name="linkLabel_1" value="Uniprot"/>
+ <param name="linkUrl_1" value="http://www.uniprot.org/uniprot/$SEQUENCE_ID$"/>
+ <param name="linkLabel_2" value="EMBL-EBI Search"/>
+ <param name="linkUrl_2" value="http://www.ebi.ac.uk/ebisearch/search.ebi?db=allebi&query=$SEQUENCE_ID$"/>
+ <param name="APPLICATION_URL" value="http://www.jalview.org/services/launchApp"/>
+ </applet>
+</td>
+ <td valign="center">User Defined Colours, loads an associated
+ Newick format tree file which is used to sort the alignment, and
+ group consensus and sequence logos are shown below the alignment.</td>
+ </tr>
+ <tr>
+ <td width="10%" valign="center"><applet
+ code="jalview.bin.JalviewLite" width="140" height="35"
+ archive="jalviewApplet.jar,JmolApplet-14.6.4_2016.10.26.jar,java-json.jar,json_simple-1.1.jar">
+<param name="permissions" value="sandbox"/>
+<param name="file" value="uniref50.fa"/>
+<param name="features" value="exampleFeatures.txt"/>
+<param name="showFullId" value="false"/>
+<param name="windowHeight" value="500"/>
+<param name="windowWidth" value="650"/>
+<param name="showFeatureSettings" value="true"/>
+<param name="wrap" value="true"/>
+<param name="showAnnotation" value="false"/>
+ <param name="linkLabel_1" value="Uniprot"/>
+ <param name="linkUrl_1"
+ value="http://www.uniprot.org/uniprot/$SEQUENCE_ID$"/>
+ <param name="linkLabel_2" value="EMBL-EBI Search"/>
+ <param name="linkUrl_2"
+ value="http://www.ebi.ac.uk/ebisearch/search.ebi?db=allebi&query=$SEQUENCE_ID$"/>
+ <param name="APPLICATION_URL"
+ value="http://www.jalview.org/services/launchApp"/>
+</applet>
+</td>
+ <td valign="center">Displays a features file on the alignment</td>
+ </tr>
+ <tr>
+ <td width="10%" valign="center"><applet
+ code="jalview.bin.JalviewLite" width="140" height="35"
+ archive="jalviewApplet.jar,JmolApplet-14.6.4_2016.10.26.jar,java-json.jar,json_simple-1.1.jar">
+<param name="permissions" value="sandbox"/>
+<param name="file" value="uniref50.fa"/>
+<param name="showFullId" value="false"/>
+<param name="windowHeight" value="500"/>
+<param name="windowWidth" value="650"/>
+<param name="wrap" value="true"/>
+<param name="debug" value="true"/>
+<param name="showAnnotation" value="false"/>
+<param name="defaultColour" value="Strand Propensity"/>
+<param name="PDBfile" value="1gaq.txt FER1_MAIZE"/>
+ <param name="linkLabel_1" value="Uniprot"/>
+ <param name="linkUrl_1"
+ value="http://www.uniprot.org/uniprot/$SEQUENCE_ID$"/>
+ <param name="linkLabel_2" value="EMBL-EBI Search"/>
+ <param name="linkUrl_2"
+ value="http://www.ebi.ac.uk/ebisearch/search.ebi?db=allebi&query=$SEQUENCE_ID$"/>
+ <param name="APPLICATION_URL"
+ value="http://www.jalview.org/services/launchApp"/>
+</applet>
+</td>
+ <td valign="center">Associates PDB file 1GAQ with sequence
+ FER1_MAIZE</td>
+ </tr>
+ <tr>
+ <td width="10%" valign="center"><applet
+ code="jalview.bin.JalviewLite" width="140" height="35"
+ archive="jalviewApplet.jar,JmolApplet-14.6.4_2016.10.26.jar,java-json.jar,json_simple-1.1.jar">
+<param name="permissions" value="sandbox"/>
+<param name="file" value="jpred_msa.fasta"/>
+<param name="jnetfile" value="jpred_msa.seq.concise"/>
+<param name="showFullId" value="false"/>
+<param name="windowHeight" value="515"/>
+<param name="windowWidth" value="650"/>
+<param name="showAnnotation" value="true"/>
+<param name="defaultColour" value="Clustal"/>
+ <param name="linkLabel_1" value="Uniprot"/>
+ <param name="linkUrl_1"
+ value="http://www.uniprot.org/uniprot/$SEQUENCE_ID$"/>
+ <param name="linkLabel_2" value="EMBL-EBI Search"/>
+ <param name="linkUrl_2"
+ value="http://www.ebi.ac.uk/ebisearch/search.ebi?db=allebi&query=$SEQUENCE_ID$"/>
+ <param name="APPLICATION_URL"
+ value="http://www.jalview.org/services/launchApp"/>
+</applet>
+ </td>
+ <td valign="middle">Displays a Multiple Sequence Alignment
+ Based JPred Prediction for a Sequence</td>
+ </tr>
+ </table>
+ <p>
+ <h2>RF00031 RFAM Alignment with per sequence secondary
+ structure</h2>
+ </p>
+ <table width="90%">
+ <tr>
+ <td width="10%" valign="center"><applet
+ code="jalview.bin.JalviewLite" width="140" height="35"
+ archive="jalviewApplet.jar,JmolApplet-14.6.4_2016.10.26.jar,java-json.jar,json_simple-1.1.jar">
+<param name="permissions" value="sandbox"/>
+<param name="file" value="RF00031_folded.stk"/>
+<param name="showFullId" value="false"/>
+<param name="windowHeight" value="515"/>
+<param name="windowWidth" value="650"/>
+<param name="showAnnotation" value="true"/>
+<param name="defaultColour" value="Purine/Pyrimidine"/>
+ <param name="APPLICATION_URL"
+ value="http://www.jalview.org/services/launchApp"/>
+</applet>
+</td>
+ <td valign="center">Displays an RFAM RNA fold family with
+ secondary structure annotation</td>
+ </tr>
+ </table>
+ <p>
+ <h2>Linked Protein and cDNA alignments for a family of Steroid Receptors</h2>
+ </p>
+ <table width="90%">
+ <tr>
+ <td width="10%" valign="center">
+<applet
+ code="jalview.bin.JalviewLite" width="140" height="35"
+ archive="jalviewApplet.jar,JmolApplet-14.6.4_2016.10.26.jar,java-json.jar,json_simple-1.1.jar">
+<param name="permissions" value="sandbox"/>
+<param name="file2" value="estrogenReceptorCdna_frag.fa"/>
+<param name="file" value="estrogenReceptorProtein_frag.fa"/>
+<param name="enableSplitFrame" value="true"/>
+<param name="scaleProteinAsCdna" value="true"/>
+<param name="showFullId" value="false"/>
+<param name="windowHeight" value="300"/>
+<param name="windowWidth" value="800"/>
+<param name="showAnnotation" value="true"/>
+<param name="showSequenceLogo" value="true"/>
+<param name="defaultColourNuc" value="Purine/Pyrimidine"/>
+<param name="defaultColourProt" value="Clustal"/>
+ <param name="APPLICATION_URL"
+ value="http://www.jalview.org/services/launchApp"/>
+</applet>
+</td>
+ <td valign="center">Displays a split window view showing aligned protein
+ and a reconstructed cDNA alignment.<br />Proteins were aligned with <a
+ href="http://www.drive5.com/muscle">Muscle</a> (version 3.8.31,
+ via the Jalview Desktop).<br />Data retrieved from Uniprot and
+ ENA, after Thornton, Need and Crews, <a
+ href="http://dx.doi.org/10.1126/science.1086185">Science 19
+ September 2003: 301 (5640), 1714-1717</a>
+ </td>
+ </tr>
+ </table>
+</div>
+<div id="sysout" style="width:500px;height:300px;background:yellow;overflow:auto"></div>
+
+</body>
+</html>
+<!--
+ * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
+ * Copyright (C) $$Year-Rel$$ The Jalview Authors
+ *
+ * This file is part of Jalview.
+ *
+ * Jalview is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
+ *
+ * Jalview is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with Jalview. If not, see <http://www.gnu.org/licenses/>.
+ * The Jalview Authors are detailed in the 'AUTHORS' file.
+-->
+
--- /dev/null
+/**
+ * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
+ * Copyright (C) $$Year-Rel$$ The Jalview Authors
+ *
+ * This file is part of Jalview.
+ *
+ * Jalview is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
+ *
+ * Jalview is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with Jalview. If not, see <http://www.gnu.org/licenses/>.
+ * The Jalview Authors are detailed in the 'AUTHORS' file.
+ */
+#nav #navInner
+{
+margin-top:0x;
+}
+
+
+#sddm
+{
+ position:relative;
+ top:0;
+}
+
+
+#sddm li a.download-right
+{
+position:absolute;
+top:28px;
+left:270px;
+}
+
+#sddm li
+{
+padding-top:30px;
+padding-bottom:30px;
+}
+
+#sddm div
+{ position: absolute;
+ visibility: hidden;
+ margin: 0;
+ padding: 0;
+ top:80px;
+ z-index:9999;
+ width:0;
+ display:none;
+}
+
+
+ #sddm div a
+ { position: relative;
+ display: block;
+ margin: 0;
+ padding:8px;
+ width: 200px;
+ white-space: nowrap;
+ text-align: left;
+ text-decoration: none;
+ background: #555;
+ color: #fff;
+ border: 1px solid #000000;
+ background: #555;
+ z-index:100;
+ left:-1100px;
+ }
+
+
+#nav
+{
+position:relative;
+z-index:2;
+ clear:both;
+ float:left;
+ width:100%; /* width of whole page */
+}
+
+#content
+{
+position:relative;
+z-index:2;
+ clear:both;
+ float:left;
+ width:100%; /* width of whole page */
+}
--- /dev/null
+/**
+ * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
+ * Copyright (C) $$Year-Rel$$ The Jalview Authors
+ *
+ * This file is part of Jalview.
+ *
+ * Jalview is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
+ *
+ * Jalview is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with Jalview. If not, see <http://www.gnu.org/licenses/>.
+ * The Jalview Authors are detailed in the 'AUTHORS' file.
+ */
+#sddm
+{
+ position:relative;
+ top:0;
+}
+
+
+#sddm li a.download-right
+{
+position:relative;
+left:0;
+}
+
+#sddm li
+{
+padding-top:30px;
+padding-bottom:30px;
+}
+
+#sddm div
+{ position: absolute;
+ visibility: hidden;
+ margin: 0;
+ padding: 0;
+ background: #555;
+ border: 1px solid #000000;
+ top:80px;
+ z-index:9999;
+ width:120px;
+}
+
+
+ #sddm div a
+ { position: relative;
+ display: block;
+ margin: 0;
+ padding:8px;
+ width: 200px;
+ white-space: nowrap;
+ text-align: left;
+ text-decoration: none;
+ background: #555;
+ color: #fff;
+ border: 1px solid #000000;
+ background: #555;
+ z-index:100;
+ left:-80px;
+ }
+
+
+#nav
+{
+position:relative;
+z-index:2;
+ clear:both;
+ float:left;
+ width:100%; /* width of whole page */
+}
+
+#content
+{
+position:relative;
+z-index:2;
+ clear:both;
+ float:left;
+ width:100%; /* width of whole page */
+}
--- /dev/null
+/**
+ * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
+ * Copyright (C) $$Year-Rel$$ The Jalview Authors
+ *
+ * This file is part of Jalview.
+ *
+ * Jalview is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
+ *
+ * Jalview is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with Jalview. If not, see <http://www.gnu.org/licenses/>.
+ * The Jalview Authors are detailed in the 'AUTHORS' file.
+ */
+/* http://meyerweb.com/eric/tools/css/reset/
+
+ v2.0 | 20110126
+
+ License: none (public domain)
+
+*/
+
+
+
+html, body, div, span, applet, object, iframe,
+
+h1, h2, h3, h4, h5, h6, p, blockquote, pre,
+
+a, abbr, acronym, address, big, cite, code,
+
+del, dfn, em, img, ins, kbd, q, s, samp,
+
+small, strike, strong, sub, sup, tt, var,
+
+b, u, i, center,
+
+dl, dt, dd, ol, ul, li,
+
+fieldset, form, label, legend,
+
+table, caption, tbody, tfoot, thead, tr, th, td,
+
+article, aside, canvas, details, embed,
+
+figure, figcaption, footer, header, hgroup,
+
+menu, nav, output, ruby, section, summary,
+
+time, mark, audio, video {
+
+ margin: 0;
+
+ padding: 0;
+
+ border: 0;
+
+ font-size: 100%;
+
+ font: inherit;
+
+ vertical-align: baseline;
+
+}
+
+/* HTML5 display-role reset for older browsers */
+
+article, aside, details, figcaption, figure,
+
+footer, header, hgroup, menu, nav, section {
+
+ display: block;
+
+}
+
+body {
+
+ line-height: 1;
+
+}
+
+ol, ul {
+
+ list-style: none;
+
+}
+
+blockquote, q {
+
+ quotes: none;
+
+}
+
+blockquote:before, blockquote:after,
+
+q:before, q:after {
+
+ content: '';
+
+ content: none;
+
+}
+
+table {
+
+ border-collapse: collapse;
+
+ border-spacing: 0;
+
+}
--- /dev/null
+/**
+ * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
+ * Copyright (C) $$Year-Rel$$ The Jalview Authors
+ *
+ * This file is part of Jalview.
+ *
+ * Jalview is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
+ *
+ * Jalview is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with Jalview. If not, see <http://www.gnu.org/licenses/>.
+ * The Jalview Authors are detailed in the 'AUTHORS' file.
+ */
+@import url(http://fonts.googleapis.com/css?family=Lato);
+@import url(http://fonts.googleapis.com/css?family=Oswald);
+
+/*****************
+HTML 5 Elements
+******************/
+new
+
+
+article, aside, details, figcaption, figure,
+footer, header, hgroup, menu, nav, section
+{
+ display: block;
+}
+
+
+.clearfix:after
+ {
+ visibility: hidden;
+ display: block;
+ font-size: 0;
+ content: " ";
+ clear: both;
+ height: 0;
+}
+
+
+/****************
+Body
+****************/
+
+body
+
+{
+ font: 76% arial,Helvetica,sans-serif;
+ text-align:left;
+ background:#fff;
+ color:#000;
+ border-top: 20px solid #555555;
+}
+
+
+
+/*********************
+Page Wrapper
+********************/
+
+#pageWrap
+
+{
+ width: 960px;
+ margin: 0 auto;
+ position:relative;
+}
+
+/**********************
+HEADER
+************************/
+
+#header
+{
+ display: block;
+ height: 180px;
+ margin: 0 auto 8px;
+ width: 960px;
+ position:relative;
+}
+
+#logo a
+{
+ background-image: url("../images/logo.jpg");
+ background-repeat: no-repeat;
+ height: 87px;
+ left: 0;
+ position: absolute;
+ top: 50px;
+ width: 361px;
+ margin-bottom:50px;
+}
+
+#buttons
+{
+height:88px;
+width:252px;
+float:right;
+ right: 0;
+ position: absolute;
+ top: 50px;
+}
+
+#buttons li
+{
+margin-bottom:10px;
+}
+
+#buttons #applet a
+{
+ background-image: url("../images/applet.jpg");
+ background-repeat: no-repeat;
+ height:50px;
+ width:250px;
+ position: absolute;
+ opacity: 1;
+ transition: opacity .25s ease-in-out;
+ -moz-transition: opacity .25s ease-in-out;
+ -webkit-transition: opacity .25s ease-in-out;
+ text-shadow: 2px 2px 10px #000000;
+}
+
+#buttons #desktop a
+{
+ background-image: url("../images/desk.jpg");
+ background-repeat: no-repeat;
+ height:50px;
+ width:250px;
+ position: absolute;
+ top:45px;
+ opacity: 1;
+ transition: opacity .25s ease-in-out;
+ -moz-transition: opacity .25s ease-in-out;
+ -webkit-transition: opacity .25s ease-in-out;
+ text-shadow: 2px 2px 10px #000000;
+}
+
+#buttons #applet a:hover
+{
+ opacity: 0.8;
+}
+
+#buttons #desktop a:hover
+{
+ opacity: 0.8;
+}
+
+/*****************************
+NAV
+*********************************/
+#nav
+{
+width:100%;
+max-width:100%;
+color:#fff;
+background:#555;
+height:80px;
+}
+
+#navInner
+{
+width:960px;
+margin:0 auto;
+position:relative;
+}
+
+
+#sddm
+{ margin: 0;
+ padding: 0;
+ z-index: 30;
+ position:relative;
+ top:27px;
+}
+
+#sddm li
+{ margin: 0;
+ padding:0;
+ list-style: none;
+ float: left;
+}
+
+#sddm li a
+{
+ color: #FFFFFF;
+ font-size: 13pt;
+ padding: 27px 15px 25px;
+ text-align: center;
+ text-decoration: none;
+ font-family: 'Lato',sans-serif;
+}
+
+#sddm li a.community:hover
+{
+background:#F78E1E;
+}
+
+#sddm li a.development:hover
+{
+background:#AEBF45;
+}
+
+#sddm li a.training:hover
+{
+background:#009DDC;
+}
+
+#sddm li a.download-right
+{
+float:right;
+position:relative;
+left:345px;
+display:block;
+clear:left;
+ margin-top: -27px;
+ padding: 27px 15px 25px;
+}
+
+
+ul#sddm li a:hover
+{
+ text-decoration: none;
+ background:#0083A9;
+}
+
+#sddm div
+{ position: absolute;
+ visibility: hidden;
+ margin: 0;
+ padding: 0;
+ background: #555;
+ border: 1px solid #000000;
+ top:50px;
+}
+
+ #sddm div a
+ { position: relative;
+ display: block;
+ margin: 0;
+ padding:8px;
+ width: 200px;
+ white-space: nowrap;
+ text-align: center;
+ text-decoration: none;
+ background: #555;
+ color: #fff;
+ border: 1px solid #000000;
+ background: #555;
+ }
+
+
+
+/*****************************
+CONTENT
+*****************************/
+
+#content
+{
+ font-size: 10pt;
+ height: auto;
+ width: 710px;
+ padding-top:23px;
+ padding-bottom:12px;
+ overflow-x:auto;
+ overflow-y:hidden;
+}
+#content h1
+{
+ padding-top:29px;
+ font-size: 15pt;
+ font-style: bold;
+}
+#content h2
+{
+ padding-top:27px;
+ font-size: 13pt;
+ font-style: bold;
+}
+#content h3
+{
+ padding-top:25px;
+ font-size: 12pt;
+ font-style: bold italic;
+}
+#content pre
+{
+ font-family: monospace;
+}
+#sideNav
+{
+width:200px;
+float:left;
+padding-top:29px;
+margin-right:50px;
+}
+#content ul
+{
+ list-style-type: disc;
+}
+#content li
+{
+ margin-left: 11px;
+ padding-bottom:11px;
+}
+
+#sideNav li
+{
+ height: 40px;
+ list-style-image: none;
+ list-style-type: none;
+ margin-bottom: 20px;
+}
+
+#sideNav a
+{
+ color: #555555;
+ display: block;
+ font-size: 13pt;
+ padding: 8px 0 0 15px;
+ text-decoration: none;
+}
+
+#sideNav a:hover
+{
+ text-decoration: underline;
+}
+#sideNav .about-nav-title
+{
+background: url("../images/normal-arrow-3-normal.png") no-repeat scroll 0 0 transparent;
+ color: #FFFFFF;
+ font-family: 'Lato',sans-serif;
+ font-size: 18pt;
+ font-weight: normal;
+ height: 40px;
+ margin-bottom: 20px;
+ padding-left: 5px;
+}
+
+#sideNav .jvlite-nav-title
+{
+background: url("../images/jvlite-arrow-3-small.png") no-repeat scroll 0 0 transparent;
+ color: #FFFFFF;
+ font-family: 'Lato',sans-serif;
+ font-size: 18pt;
+ font-weight: normal;
+ height: 40px;
+ margin-bottom: 20px;
+ padding-left: 5px;
+}
+
+#sideNav .jvlite-nav-small
+{
+background: url("../images/jvlite-arrow-3-small.png") no-repeat scroll 0 0 transparent;
+ color: #FFFFFF;
+ font-family: 'Lato',sans-serif;
+ font-size: 18pt;
+ font-weight: normal;
+ height: 40px;
+ margin-bottom: 20px;
+ padding-left: 0px;
+}
+
+#sideNav .com-nav-title
+{
+background: url("../images/com-arrow-3-small.png") no-repeat scroll 0 0 transparent;
+ color: #FFFFFF;
+ font-family: 'Lato',sans-serif;
+ font-size: 18pt;
+ font-weight: normal;
+ height: 40px;
+ margin-bottom: 20px;
+ padding-left: 5px;
+}
+
+#sideNav .dev-nav-title
+{
+background: url("../images/dev-arrow-3-normal.png") no-repeat scroll 0 0 transparent;
+ color: #FFFFFF;
+ font-family: 'Lato',sans-serif;
+ font-size: 18pt;
+ font-weight: normal;
+ height: 40px;
+ margin-bottom: 20px;
+ padding-left: 5px;
+}
+
+#sideNav .train-nav-title
+{
+background: url("../images/train-arrow-3-normal.png") no-repeat scroll 0 0 transparent;
+ color: #FFFFFF;
+ font-family: 'Lato',sans-serif;
+ font-size: 18pt;
+ font-weight: normal;
+ height: 40px;
+ margin-bottom: 20px;
+ padding-left: 5px;
+}
+
+#content .borderTable td
+{
+ border: 1px solid black;
+}
+#content .borderTable tr
+{
+ border-bottom: 2px solid black;
+}
+
+td
+{
+ vertical-align: middle;
+}
+
+/********************************
+FOOTER
+***********************************/
+
+#footer
+{
+max-width:100%;
+width:100%;
+color:#fff;
+background:#555;
+height:140px;
+padding-top:10px;
+clear:both;
+}
+#innerFooter a
+{
+ color: #EEEEEE;
+ visited: #DDDDDD;
+
+}
+
+#innerFooter
+{
+width:960px;
+margin:0 auto;
+height:140px;
+padding-top:10px;
+}
+
+
+#copyright
+{
+float:left;
+}
+
+#cite
+{
+float:right;
+width:555px;
+}
--- /dev/null
+HEADER OXIDOREDUCTASE/ELECTRON TRANSPORT 08-MAY-00 1GAQ
+ATOM 2 CA GLU A 19 20.491 30.713 36.290 1.00 74.29 C
+ATOM 11 CA SER A 20 24.056 29.774 37.264 1.00 72.09 C
+ATOM 17 CA LYS A 21 27.517 31.289 37.563 1.00 70.09 C
+ATOM 26 CA LYS A 22 28.794 27.865 36.481 1.00 68.64 C
+ATOM 35 CA GLN A 23 29.484 26.806 32.884 1.00 70.46 C
+ATOM 44 CA GLU A 24 26.420 25.175 31.360 1.00 72.08 C
+ATOM 53 CA GLU A 25 26.736 26.049 27.683 1.00 70.43 C
+ATOM 62 CA GLY A 26 28.299 22.912 26.233 1.00 63.14 C
+ATOM 66 CA VAL A 27 26.863 20.704 28.982 1.00 54.50 C
+ATOM 73 CA VAL A 28 25.030 17.390 28.655 1.00 48.32 C
+ATOM 80 CA THR A 29 23.728 14.677 30.991 1.00 44.86 C
+ATOM 87 CA ASN A 30 22.327 11.164 30.703 1.00 45.42 C
+ATOM 95 CA LEU A 31 23.332 10.459 27.102 1.00 45.42 C
+ATOM 103 CA TYR A 32 23.549 6.898 28.380 1.00 45.88 C
+ATOM 115 CA LYS A 33 21.656 5.321 31.262 1.00 47.27 C
+ATOM 124 CA PRO A 34 21.991 2.046 33.248 1.00 48.99 C
+ATOM 131 CA LYS A 35 19.339 0.560 30.970 1.00 52.75 C
+ATOM 140 CA GLU A 36 21.580 0.855 27.886 1.00 53.33 C
+ATOM 149 CA PRO A 37 25.154 2.015 28.678 1.00 47.54 C
+ATOM 156 CA TYR A 38 27.929 2.872 26.249 1.00 41.98 C
+ATOM 168 CA VAL A 39 30.355 -0.017 25.909 1.00 41.48 C
+ATOM 175 CA GLY A 40 33.823 1.485 25.966 1.00 37.59 C
+ATOM 179 CA ARG A 41 37.165 -0.277 26.122 1.00 39.77 C
+ATOM 190 CA CYS A 42 40.148 -0.029 28.442 1.00 36.51 C
+ATOM 196 CA LEU A 43 43.095 1.441 26.554 1.00 36.13 C
+ATOM 204 CA LEU A 44 45.231 2.023 29.649 1.00 33.55 C
+ATOM 212 CA ASN A 45 45.140 1.026 33.307 1.00 27.79 C
+ATOM 220 CA THR A 46 48.056 1.800 35.617 1.00 28.75 C
+ATOM 227 CA LYS A 47 48.542 1.776 39.388 1.00 30.31 C
+ATOM 236 CA ILE A 48 49.564 5.317 40.376 1.00 31.32 C
+ATOM 244 CA THR A 49 50.339 4.682 44.059 1.00 37.62 C
+ATOM 251 CA GLY A 50 53.585 3.317 45.460 1.00 44.49 C
+ATOM 255 CA ASP A 51 53.706 -0.448 46.087 1.00 52.89 C
+ATOM 263 CA ASP A 52 53.910 0.545 49.751 1.00 55.23 C
+ATOM 271 CA ALA A 53 50.816 2.767 50.056 1.00 53.34 C
+ATOM 276 CA PRO A 54 47.904 1.940 52.405 1.00 50.60 C
+ATOM 283 CA GLY A 55 45.420 1.579 49.561 1.00 50.35 C
+ATOM 287 CA GLU A 56 46.098 1.286 45.836 1.00 42.53 C
+ATOM 296 CA THR A 57 44.534 3.816 43.480 1.00 41.14 C
+ATOM 303 CA TRP A 58 44.540 3.423 39.708 1.00 35.60 C
+ATOM 317 CA HIS A 59 44.468 5.853 36.796 1.00 31.89 C
+ATOM 327 CA MET A 60 42.658 4.227 33.866 1.00 31.65 C
+ATOM 335 CA VAL A 61 41.716 5.345 30.350 1.00 30.43 C
+ATOM 342 CA PHE A 62 38.669 4.172 28.360 1.00 34.36 C
+ATOM 353 CA SER A 63 37.657 4.908 24.772 1.00 34.69 C
+ATOM 359 CA THR A 64 34.448 6.828 23.951 1.00 36.96 C
+ATOM 366 CA GLU A 65 34.691 7.644 20.254 1.00 40.08 C
+ATOM 375 CA GLY A 66 33.742 11.183 21.285 1.00 40.22 C
+ATOM 379 CA LYS A 67 30.272 9.763 22.003 1.00 41.93 C
+ATOM 388 CA ILE A 68 30.279 11.116 25.577 1.00 41.52 C
+ATOM 396 CA PRO A 69 30.791 14.926 25.537 1.00 42.35 C
+ATOM 403 CA TYR A 70 31.228 15.232 29.299 1.00 39.84 C
+ATOM 415 CA ARG A 71 32.639 18.451 30.768 1.00 44.14 C
+ATOM 426 CA GLU A 72 35.122 19.278 33.515 1.00 43.82 C
+ATOM 435 CA GLY A 73 33.472 18.458 36.835 1.00 41.97 C
+ATOM 439 CA GLN A 74 30.929 15.874 35.657 1.00 37.19 C
+ATOM 448 CA SER A 75 31.285 12.124 36.138 1.00 38.28 C
+ATOM 454 CA ILE A 76 30.458 8.792 34.539 1.00 36.84 C
+ATOM 462 CA GLY A 77 28.983 5.620 35.918 1.00 35.39 C
+ATOM 466 CA VAL A 78 30.311 2.108 35.530 1.00 32.05 C
+ATOM 473 CA ILE A 79 28.458 -1.201 35.591 1.00 32.67 C
+ATOM 481 CA ALA A 80 30.745 -4.018 36.644 1.00 35.36 C
+ATOM 486 CA ASP A 81 30.359 -7.373 34.872 1.00 38.72 C
+ATOM 494 CA GLY A 82 28.308 -10.332 36.110 1.00 45.79 C
+ATOM 498 CA VAL A 83 25.820 -10.242 39.001 1.00 52.24 C
+ATOM 505 CA ASP A 84 25.838 -10.250 42.834 1.00 60.54 C
+ATOM 513 CA LYS A 85 25.014 -13.158 45.196 1.00 66.72 C
+ATOM 522 CA ASN A 86 21.414 -13.062 43.904 1.00 67.37 C
+ATOM 530 CA GLY A 87 21.724 -13.423 40.136 1.00 64.74 C
+ATOM 534 CA LYS A 88 20.971 -9.733 39.570 1.00 61.12 C
+ATOM 543 CA PRO A 89 23.054 -7.201 37.561 1.00 54.68 C
+ATOM 550 CA HIS A 90 25.224 -4.957 39.755 1.00 44.44 C
+ATOM 560 CA LYS A 91 23.940 -1.433 40.260 1.00 40.48 C
+ATOM 569 CA VAL A 92 25.803 1.546 38.843 1.00 38.45 C
+ATOM 576 CA ARG A 93 28.709 2.986 40.828 1.00 38.93 C
+ATOM 587 CA LEU A 94 29.778 6.584 40.096 1.00 34.37 C
+ATOM 595 CA TYR A 95 33.309 7.878 39.513 1.00 30.27 C
+ATOM 607 CA SER A 96 34.425 11.475 39.057 1.00 29.44 C
+ATOM 613 CA ILE A 97 36.029 12.090 35.662 1.00 27.61 C
+ATOM 621 CA ALA A 98 39.769 12.693 36.069 1.00 31.12 C
+ATOM 626 CA SER A 99 40.393 13.712 32.475 1.00 32.42 C
+ATOM 632 CA SER A 100 39.566 17.142 31.059 1.00 36.14 C
+ATOM 638 CA ALA A 101 37.097 17.367 28.154 1.00 41.07 C
+ATOM 643 CA ILE A 102 39.764 16.549 25.527 1.00 47.65 C
+ATOM 651 CA GLY A 103 41.172 13.692 27.599 1.00 46.77 C
+ATOM 655 CA ASP A 104 44.730 12.612 28.289 1.00 43.82 C
+ATOM 663 CA PHE A 105 45.115 12.065 24.522 1.00 41.52 C
+ATOM 674 CA GLY A 106 43.862 15.455 23.328 1.00 41.66 C
+ATOM 678 CA ASP A 107 41.355 13.883 20.926 1.00 40.90 C
+ATOM 686 CA SER A 108 38.132 14.250 22.954 1.00 42.95 C
+ATOM 692 CA LYS A 109 37.967 10.535 22.224 1.00 44.74 C
+ATOM 701 CA THR A 110 38.731 9.184 25.704 1.00 41.09 C
+ATOM 708 CA VAL A 111 37.728 9.519 29.374 1.00 39.03 C
+ATOM 715 CA SER A 112 39.912 8.705 32.399 1.00 37.17 C
+ATOM 721 CA LEU A 113 39.098 7.476 35.935 1.00 32.10 C
+ATOM 729 CA CYS A 114 40.964 7.578 39.261 1.00 30.65 C
+ATOM 735 CA VAL A 115 39.724 4.459 41.060 1.00 33.45 C
+ATOM 742 CA LYS A 116 40.668 3.524 44.628 1.00 34.75 C
+ATOM 751 CA ARG A 117 40.376 -0.250 45.123 1.00 32.85 C
+ATOM 762 CA LEU A 118 38.137 -1.094 48.077 1.00 30.50 C
+ATOM 770 CA ILE A 119 39.376 -3.752 50.459 1.00 34.34 C
+ATOM 778 CA TYR A 120 38.699 -4.266 54.125 1.00 31.39 C
+ATOM 790 CA THR A 121 38.264 -7.086 56.567 1.00 28.83 C
+ATOM 797 CA ASN A 122 34.792 -7.477 58.109 1.00 26.51 C
+ATOM 805 CA ASP A 123 33.626 -8.382 61.634 1.00 31.58 C
+ATOM 813 CA ALA A 124 34.191 -12.077 60.901 1.00 27.84 C
+ATOM 818 CA GLY A 125 37.759 -11.844 59.728 1.00 32.39 C
+ATOM 822 CA GLU A 126 36.809 -12.146 56.073 1.00 35.82 C
+ATOM 831 CA ILE A 127 38.655 -9.932 53.598 1.00 38.42 C
+ATOM 839 CA VAL A 128 36.025 -8.261 51.421 1.00 33.73 C
+ATOM 846 CA LYS A 129 36.482 -6.484 48.090 1.00 31.87 C
+ATOM 855 CA GLY A 130 34.363 -3.680 46.686 1.00 26.91 C
+ATOM 859 CA VAL A 131 32.680 -5.051 43.569 1.00 27.89 C
+ATOM 866 CA CYS A 132 33.074 -2.246 41.018 1.00 28.46 C
+ATOM 872 CA SER A 133 36.266 -0.553 42.213 1.00 31.33 C
+ATOM 878 CA ASN A 134 37.861 -3.983 41.984 1.00 30.29 C
+ATOM 886 CA PHE A 135 36.318 -4.795 38.623 1.00 31.48 C
+ATOM 897 CA LEU A 136 37.926 -1.553 37.520 1.00 27.81 C
+ATOM 905 CA CYS A 137 41.417 -1.976 38.955 1.00 25.91 C
+ATOM 911 CA ASP A 138 41.605 -5.419 37.338 1.00 30.22 C
+ATOM 919 CA LEU A 139 40.462 -4.306 33.874 1.00 32.69 C
+ATOM 927 CA GLN A 140 42.851 -5.511 31.186 1.00 36.80 C
+ATOM 936 CA PRO A 141 43.380 -3.220 28.170 1.00 36.16 C
+ATOM 943 CA GLY A 142 40.864 -4.420 25.586 1.00 31.10 C
+ATOM 947 CA ASP A 143 38.129 -5.298 28.055 1.00 30.62 C
+ATOM 955 CA ASN A 144 34.690 -3.847 27.645 1.00 33.52 C
+ATOM 963 CA VAL A 145 33.430 -1.522 30.361 1.00 37.08 C
+ATOM 970 CA GLN A 146 29.817 -0.374 30.523 1.00 37.65 C
+ATOM 979 CA ILE A 147 29.547 3.413 31.045 1.00 30.95 C
+ATOM 987 CA THR A 148 26.637 5.791 31.832 1.00 29.95 C
+ATOM 994 CA GLY A 149 26.297 9.581 31.843 1.00 32.81 C
+ATOM 998 CA PRO A 150 27.785 12.148 31.800 1.00 34.98 C
+ATOM 1005 CA VAL A 151 26.376 12.668 35.275 1.00 36.53 C
+ATOM 1012 CA GLY A 152 26.196 15.756 37.474 1.00 43.09 C
+ATOM 1016 CA LYS A 153 26.048 19.528 37.068 1.00 48.37 C
+ATOM 1025 CA GLU A 154 26.921 20.540 40.633 1.00 49.70 C
+ATOM 1034 CA MET A 155 30.710 20.266 40.235 1.00 47.30 C
+ATOM 1042 CA LEU A 156 30.882 22.020 36.869 1.00 50.36 C
+ATOM 1050 CA MET A 157 33.362 24.883 36.404 1.00 55.29 C
+ATOM 1058 CA PRO A 158 32.521 28.612 36.605 1.00 54.88 C
+ATOM 1065 CA LYS A 159 32.291 30.776 33.464 1.00 54.92 C
+ATOM 1074 CA ASP A 160 34.497 33.503 34.939 1.00 57.22 C
+ATOM 1082 CA PRO A 161 38.055 32.687 33.759 1.00 58.62 C
+ATOM 1089 CA ASN A 162 39.524 35.240 36.163 1.00 60.44 C
+ATOM 1097 CA ALA A 163 37.814 33.910 39.279 1.00 55.80 C
+ATOM 1102 CA THR A 164 39.596 32.487 42.316 1.00 51.04 C
+ATOM 1109 CA ILE A 165 38.966 28.771 42.756 1.00 50.26 C
+ATOM 1117 CA ILE A 166 39.774 26.773 45.885 1.00 47.54 C
+ATOM 1125 CA MET A 167 39.883 23.014 45.324 1.00 46.38 C
+ATOM 1133 CA LEU A 168 39.700 20.963 48.522 1.00 42.18 C
+ATOM 1141 CA ALA A 169 40.377 17.316 47.770 1.00 36.41 C
+ATOM 1146 CA THR A 170 41.005 14.086 49.622 1.00 32.98 C
+ATOM 1153 CA GLY A 171 42.027 10.802 48.014 1.00 31.36 C
+ATOM 1157 CA THR A 172 40.386 10.037 44.680 1.00 30.48 C
+ATOM 1164 CA GLY A 173 38.640 13.335 45.359 1.00 33.99 C
+ATOM 1168 CA ILE A 174 41.418 15.036 43.394 1.00 35.66 C
+ATOM 1176 CA ALA A 175 39.758 13.585 40.300 1.00 36.00 C
+ATOM 1181 CA PRO A 176 37.445 16.385 39.155 1.00 39.41 C
+ATOM 1188 CA PHE A 177 40.109 18.971 39.976 1.00 43.21 C
+ATOM 1199 CA ARG A 178 42.726 17.119 37.955 1.00 41.09 C
+ATOM 1210 CA SER A 179 40.235 17.536 35.124 1.00 39.92 C
+ATOM 1216 CA PHE A 180 39.808 21.204 36.009 1.00 39.23 C
+ATOM 1227 CA LEU A 181 43.528 21.949 35.995 1.00 39.50 C
+ATOM 1235 CA TRP A 182 44.305 20.081 32.770 1.00 41.47 C
+ATOM 1249 CA LYS A 183 42.141 22.654 30.972 1.00 48.08 C
+ATOM 1258 CA MET A 184 43.477 25.547 33.062 1.00 52.79 C
+ATOM 1266 CA PHE A 185 47.102 25.043 32.014 1.00 57.35 C
+ATOM 1277 CA PHE A 186 48.075 21.921 30.051 1.00 55.98 C
+ATOM 1288 CA GLU A 187 45.758 23.173 27.297 1.00 54.44 C
+ATOM 1297 CA LYS A 188 44.908 26.236 25.196 1.00 51.29 C
+ATOM 1306 CA HIS A 189 41.395 27.080 24.003 1.00 51.35 C
+ATOM 1316 CA ASP A 190 40.108 29.972 21.873 1.00 54.30 C
+ATOM 1324 CA ASP A 191 37.199 30.481 24.249 1.00 53.95 C
+ATOM 1332 CA TYR A 192 38.816 29.937 27.634 1.00 50.68 C
+ATOM 1344 CA LYS A 193 41.916 31.388 29.230 1.00 51.00 C
+ATOM 1353 CA PHE A 194 42.322 30.967 32.956 1.00 52.09 C
+ATOM 1364 CA ASN A 195 43.672 34.234 34.312 1.00 56.46 C
+ATOM 1372 CA GLY A 196 42.616 34.078 37.969 1.00 57.17 C
+ATOM 1376 CA LEU A 197 43.874 31.920 40.843 1.00 57.92 C
+ATOM 1384 CA GLY A 198 43.549 28.151 41.086 1.00 56.67 C
+ATOM 1388 CA TRP A 199 44.258 26.886 44.592 1.00 51.55 C
+ATOM 1402 CA LEU A 200 44.411 23.170 45.379 1.00 49.17 C
+ATOM 1410 CA PHE A 201 44.558 21.335 48.709 1.00 48.60 C
+ATOM 1421 CA LEU A 202 45.122 17.570 48.598 1.00 45.34 C
+ATOM 1429 CA GLY A 203 44.885 15.480 51.742 1.00 48.55 C
+ATOM 1433 CA VAL A 204 46.225 11.936 51.755 1.00 50.23 C
+ATOM 1440 CA PRO A 205 47.942 9.740 54.365 1.00 51.51 C
+ATOM 1447 CA THR A 206 51.284 9.148 52.648 1.00 50.21 C
+ATOM 1454 CA SER A 207 53.551 10.483 49.894 1.00 49.38 C
+ATOM 1460 CA SER A 208 53.267 7.061 48.259 1.00 43.49 C
+ATOM 1466 CA SER A 209 49.588 8.049 48.093 1.00 42.57 C
+ATOM 1472 CA LEU A 210 49.990 11.424 46.364 1.00 42.65 C
+ATOM 1480 CA LEU A 211 48.121 11.446 43.035 1.00 39.33 C
+ATOM 1488 CA TYR A 212 49.516 13.214 39.935 1.00 40.89 C
+ATOM 1500 CA LYS A 213 52.128 15.234 41.873 1.00 45.88 C
+ATOM 1509 CA GLU A 214 54.518 15.406 38.899 1.00 53.22 C
+ATOM 1518 CA GLU A 215 51.680 16.911 36.889 1.00 55.16 C
+ATOM 1527 CA PHE A 216 50.757 19.475 39.514 1.00 60.55 C
+ATOM 1538 CA GLY A 217 54.488 20.153 39.524 1.00 66.64 C
+ATOM 1542 CA LYS A 218 54.575 21.110 35.850 1.00 68.86 C
+ATOM 1551 CA MET A 219 51.398 23.159 36.265 1.00 66.97 C
+ATOM 1559 CA LYS A 220 53.138 25.090 39.061 1.00 65.97 C
+ATOM 1568 CA GLU A 221 55.654 26.250 36.459 1.00 70.02 C
+ATOM 1577 CA ARG A 222 53.584 26.507 33.294 1.00 73.48 C
+ATOM 1588 CA ALA A 223 52.005 29.449 35.175 1.00 76.21 C
+ATOM 1593 CA PRO A 224 53.272 29.877 38.804 1.00 79.25 C
+ATOM 1600 CA GLU A 225 51.296 33.124 39.020 1.00 81.84 C
+ATOM 1609 CA ASN A 226 47.873 31.528 38.622 1.00 78.84 C
+ATOM 1617 CA PHE A 227 48.418 28.176 40.350 1.00 75.28 C
+ATOM 1628 CA ARG A 228 49.090 27.305 43.996 1.00 72.05 C
+ATOM 1639 CA VAL A 229 49.165 23.724 45.323 1.00 68.82 C
+ATOM 1646 CA ASP A 230 49.258 22.581 48.958 1.00 66.54 C
+ATOM 1654 CA TYR A 231 49.605 18.943 49.968 1.00 60.31 C
+ATOM 1666 CA ALA A 232 48.551 17.560 53.332 1.00 57.39 C
+ATOM 1671 CA VAL A 233 50.260 14.228 53.945 1.00 57.14 C
+ATOM 1678 CA SER A 234 48.465 13.579 57.244 1.00 60.81 C
+ATOM 1684 CA ARG A 235 50.959 11.010 58.514 1.00 60.74 C
+ATOM 1695 CA GLU A 236 54.268 12.594 57.481 1.00 59.17 C
+ATOM 1704 CA GLN A 237 53.494 16.197 58.450 1.00 59.62 C
+ATOM 1713 CA THR A 238 52.590 18.236 61.521 1.00 63.18 C
+ATOM 1720 CA ASN A 239 52.019 21.937 62.188 1.00 66.71 C
+ATOM 1728 CA ALA A 240 52.096 23.767 65.537 1.00 70.06 C
+ATOM 1733 CA ALA A 241 51.302 21.400 68.410 1.00 72.44 C
+ATOM 1738 CA GLY A 242 52.383 18.324 66.438 1.00 72.38 C
+ATOM 1742 CA GLU A 243 48.826 18.169 65.110 1.00 69.71 C
+ATOM 1751 CA ARG A 244 48.674 15.776 62.148 1.00 67.21 C
+ATOM 1762 CA MET A 245 48.712 17.796 58.933 1.00 64.20 C
+ATOM 1770 CA TYR A 246 45.246 17.082 57.556 1.00 60.65 C
+ATOM 1782 CA ILE A 247 43.617 18.437 54.409 1.00 62.98 C
+ATOM 1790 CA GLN A 248 42.035 21.001 56.761 1.00 64.64 C
+ATOM 1799 CA THR A 249 45.057 21.461 59.009 1.00 63.37 C
+ATOM 1806 CA ARG A 250 46.891 22.664 55.903 1.00 62.47 C
+ATOM 1817 CA MET A 251 44.123 25.201 55.251 1.00 63.35 C
+ATOM 1825 CA ALA A 252 44.571 26.305 58.854 1.00 65.73 C
+ATOM 1830 CA GLU A 253 47.973 27.809 58.076 1.00 65.97 C
+ATOM 1839 CA TYR A 254 46.267 30.063 55.517 1.00 65.83 C
+ATOM 1851 CA LYS A 255 42.991 30.559 57.379 1.00 70.30 C
+ATOM 1860 CA GLU A 256 43.578 34.326 57.320 1.00 73.73 C
+ATOM 1869 CA GLU A 257 44.189 34.738 53.593 1.00 71.52 C
+ATOM 1878 CA LEU A 258 41.459 32.202 52.893 1.00 73.38 C
+ATOM 1886 CA TRP A 259 38.790 34.074 54.853 1.00 76.72 C
+ATOM 1900 CA GLU A 260 39.721 37.275 53.006 1.00 78.61 C
+ATOM 1909 CA LEU A 261 38.580 35.553 49.815 1.00 75.71 C
+ATOM 1917 CA LEU A 262 35.391 33.881 51.047 1.00 73.74 C
+ATOM 1925 CA LYS A 263 33.562 37.165 50.535 1.00 73.64 C
+ATOM 1934 CA LYS A 264 34.299 38.143 46.954 1.00 72.48 C
+ATOM 1943 CA ASP A 265 31.954 37.554 43.993 1.00 69.65 C
+ATOM 1951 CA ASN A 266 34.660 35.649 42.106 1.00 65.06 C
+ATOM 1959 CA THR A 267 35.835 33.117 44.683 1.00 58.24 C
+ATOM 1966 CA TYR A 268 34.459 29.646 43.909 1.00 51.04 C
+ATOM 1978 CA VAL A 269 35.192 26.827 46.382 1.00 44.95 C
+ATOM 1985 CA TYR A 270 35.012 23.150 45.368 1.00 44.96 C
+ATOM 1997 CA MET A 271 35.162 20.122 47.656 1.00 41.72 C
+ATOM 2005 CA CYS A 272 35.314 16.468 46.632 1.00 37.19 C
+ATOM 2011 CA GLY A 273 36.343 13.080 47.951 1.00 37.65 C
+ATOM 2015 CA LEU A 274 36.040 10.886 51.020 1.00 39.39 C
+ATOM 2023 CA LYS A 275 33.076 12.283 52.955 1.00 44.86 C
+ATOM 2032 CA GLY A 276 34.322 13.183 56.400 1.00 49.16 C
+ATOM 2036 CA MET A 277 36.932 15.608 55.168 1.00 53.30 C
+ATOM 2044 CA GLU A 278 33.917 17.921 55.165 1.00 56.74 C
+ATOM 2053 CA LYS A 279 33.531 18.089 58.947 1.00 59.30 C
+ATOM 2062 CA GLY A 280 36.982 19.413 59.776 1.00 58.94 C
+ATOM 2066 CA ILE A 281 36.705 22.048 57.063 1.00 61.43 C
+ATOM 2074 CA ASP A 282 33.453 23.402 58.515 1.00 67.06 C
+ATOM 2082 CA ASP A 283 35.050 23.189 61.972 1.00 74.12 C
+ATOM 2090 CA ILE A 284 37.991 25.422 61.040 1.00 78.49 C
+ATOM 2098 CA MET A 285 35.456 27.566 59.201 1.00 82.25 C
+ATOM 2106 CA VAL A 286 32.941 27.959 62.027 1.00 83.44 C
+ATOM 2113 CA SER A 287 35.610 29.113 64.469 1.00 83.43 C
+ATOM 2119 CA LEU A 288 36.927 31.601 61.887 1.00 85.53 C
+ATOM 2127 CA ALA A 289 33.506 33.025 60.970 1.00 86.85 C
+ATOM 2132 CA GLU A 290 31.841 32.696 64.387 1.00 89.26 C
+ATOM 2141 CA LYS A 291 34.438 35.312 65.347 1.00 88.73 C
+ATOM 2150 CA ASP A 292 33.635 37.891 62.652 1.00 88.03 C
+ATOM 2158 CA GLY A 293 30.219 37.450 61.081 1.00 87.88 C
+ATOM 2162 CA ILE A 294 27.319 35.051 61.511 1.00 84.61 C
+ATOM 2170 CA ASP A 295 27.665 31.329 62.188 1.00 82.45 C
+ATOM 2178 CA TRP A 296 29.539 29.627 59.355 1.00 80.12 C
+ATOM 2192 CA PHE A 297 26.527 27.452 58.512 1.00 78.99 C
+ATOM 2203 CA ASP A 298 24.167 30.241 57.486 1.00 76.37 C
+ATOM 2211 CA TYR A 299 27.074 31.748 55.561 1.00 74.07 C
+ATOM 2223 CA LYS A 300 27.679 28.620 53.473 1.00 74.31 C
+ATOM 2232 CA LYS A 301 24.059 29.146 52.464 1.00 75.97 C
+ATOM 2241 CA GLN A 302 24.921 32.563 51.018 1.00 75.38 C
+ATOM 2250 CA LEU A 303 27.896 31.099 49.155 1.00 72.10 C
+ATOM 2258 CA LYS A 304 25.917 28.207 47.690 1.00 72.08 C
+ATOM 2267 CA ARG A 305 23.595 31.021 46.594 1.00 74.82 C
+ATOM 2278 CA GLY A 306 26.071 32.136 43.958 1.00 71.84 C
+ATOM 2282 CA ASP A 307 27.505 28.682 43.220 1.00 67.23 C
+ATOM 2290 CA GLN A 308 30.620 29.291 45.346 1.00 60.18 C
+ATOM 2299 CA TRP A 309 30.585 26.177 47.537 1.00 52.25 C
+ATOM 2313 CA ASN A 310 29.894 22.997 45.597 1.00 45.03 C
+ATOM 2321 CA VAL A 311 30.327 19.716 47.403 1.00 39.13 C
+ATOM 2328 CA GLU A 312 30.507 16.190 46.110 1.00 35.17 C
+ATOM 2337 CA VAL A 313 31.761 13.957 48.861 1.00 30.12 C
+ATOM 2344 CA TYR A 314 31.112 10.230 49.021 1.00 28.23 C
+ATOM 2358 CA ALA B 1 2.311 24.702 44.475 1.00 74.17 C
+ATOM 2363 CA THR B 2 3.590 24.207 48.055 1.00 74.76 C
+ATOM 2370 CA TYR B 3 3.069 20.876 49.837 1.00 73.52 C
+ATOM 2382 CA ASN B 4 3.748 19.874 53.435 1.00 75.75 C
+ATOM 2390 CA VAL B 5 6.618 17.399 53.868 1.00 75.95 C
+ATOM 2397 CA LYS B 6 7.769 15.523 56.983 1.00 77.70 C
+ATOM 2406 CA LEU B 7 11.351 14.325 57.458 1.00 78.91 C
+ATOM 2414 CA ILE B 8 11.807 11.511 59.985 1.00 81.00 C
+ATOM 2422 CA THR B 9 15.560 12.046 60.247 1.00 87.49 C
+ATOM 2429 CA PRO B 10 17.662 9.793 62.539 1.00 92.94 C
+ATOM 2436 CA GLU B 11 18.161 13.147 64.282 1.00 96.61 C
+ATOM 2445 CA GLY B 12 14.579 14.154 65.041 1.00 97.52 C
+ATOM 2449 CA GLU B 13 11.602 14.823 62.748 1.00 96.90 C
+ATOM 2458 CA VAL B 14 11.547 17.892 60.480 1.00 96.63 C
+ATOM 2465 CA GLU B 15 8.340 19.701 59.440 1.00 94.86 C
+ATOM 2474 CA LEU B 16 9.471 21.479 56.254 1.00 91.55 C
+ATOM 2482 CA GLN B 17 7.281 23.141 53.598 1.00 89.75 C
+ATOM 2491 CA VAL B 18 8.485 22.069 50.145 1.00 87.92 C
+ATOM 2498 CA PRO B 19 6.906 23.558 46.964 1.00 86.35 C
+ATOM 2505 CA ASP B 20 5.990 21.744 43.717 1.00 86.29 C
+ATOM 2513 CA ASP B 21 8.578 22.751 41.083 1.00 83.78 C
+ATOM 2521 CA VAL B 22 11.385 22.401 43.639 1.00 80.98 C
+ATOM 2528 CA TYR B 23 13.439 19.280 44.481 1.00 77.04 C
+ATOM 2540 CA ILE B 24 13.212 18.196 48.120 1.00 76.45 C
+ATOM 2548 CA LEU B 25 16.959 18.133 48.851 1.00 75.15 C
+ATOM 2556 CA ASP B 26 17.154 21.745 47.689 1.00 75.80 C
+ATOM 2564 CA GLN B 27 14.616 22.906 50.280 1.00 76.31 C
+ATOM 2573 CA ALA B 28 16.562 20.957 52.914 1.00 78.86 C
+ATOM 2578 CA GLU B 29 19.698 23.011 52.198 1.00 81.51 C
+ATOM 2587 CA GLU B 30 17.491 26.106 52.510 1.00 83.25 C
+ATOM 2596 CA ASP B 31 15.857 25.933 55.935 1.00 81.92 C
+ATOM 2604 CA GLY B 32 19.280 24.859 57.151 1.00 79.08 C
+ATOM 2608 CA ILE B 33 18.621 21.130 57.157 1.00 76.93 C
+ATOM 2616 CA ASP B 34 21.528 18.731 56.618 1.00 73.53 C
+ATOM 2624 CA LEU B 35 20.738 15.738 54.421 1.00 67.74 C
+ATOM 2632 CA PRO B 36 23.138 13.391 52.547 1.00 65.90 C
+ATOM 2639 CA TYR B 37 23.916 14.226 48.912 1.00 64.85 C
+ATOM 2651 CA SER B 38 26.659 13.373 46.412 1.00 62.58 C
+ATOM 2657 CA CYS B 39 26.193 13.603 42.652 1.00 60.99 C
+ATOM 2663 CA ARG B 40 22.908 15.441 43.251 1.00 58.35 C
+ATOM 2674 CA ALA B 41 21.699 14.108 39.886 1.00 56.38 C
+ATOM 2679 CA GLY B 42 19.886 10.955 40.991 1.00 56.66 C
+ATOM 2683 CA SER B 43 22.465 8.336 40.010 1.00 58.55 C
+ATOM 2689 CA CYS B 44 23.548 7.052 43.447 1.00 56.27 C
+ATOM 2695 CA SER B 45 22.057 5.987 46.791 1.00 58.20 C
+ATOM 2701 CA SER B 46 23.574 8.773 48.890 1.00 59.13 C
+ATOM 2707 CA CYS B 47 20.220 10.475 49.517 1.00 65.64 C
+ATOM 2713 CA ALA B 48 17.911 7.436 49.610 1.00 69.71 C
+ATOM 2718 CA GLY B 49 14.733 7.635 51.681 1.00 73.09 C
+ATOM 2722 CA LYS B 50 11.712 5.340 52.183 1.00 73.77 C
+ATOM 2731 CA VAL B 51 8.551 7.412 51.568 1.00 76.51 C
+ATOM 2738 CA VAL B 52 5.237 7.081 53.429 1.00 78.85 C
+ATOM 2745 CA SER B 53 2.180 9.376 53.647 1.00 79.57 C
+ATOM 2751 CA GLY B 54 2.118 10.991 50.218 1.00 76.32 C
+ATOM 2755 CA SER B 55 3.577 10.944 46.726 1.00 76.31 C
+ATOM 2761 CA VAL B 56 6.436 12.592 44.828 1.00 77.50 C
+ATOM 2768 CA ASP B 57 7.691 12.960 41.243 1.00 76.83 C
+ATOM 2776 CA GLN B 58 11.150 11.483 40.555 1.00 76.66 C
+ATOM 2785 CA SER B 59 10.976 10.827 36.792 1.00 80.19 C
+ATOM 2791 CA ASP B 60 14.688 11.644 36.510 1.00 83.51 C
+ATOM 2799 CA GLN B 61 15.175 8.137 37.916 1.00 85.74 C
+ATOM 2808 CA SER B 62 18.644 7.080 36.699 1.00 85.85 C
+ATOM 2814 CA TYR B 63 19.324 5.049 39.852 1.00 84.49 C
+ATOM 2826 CA LEU B 64 15.683 4.296 40.629 1.00 89.06 C
+ATOM 2834 CA ASP B 65 15.356 0.604 39.742 1.00 92.21 C
+ATOM 2842 CA ASP B 66 12.421 -1.791 39.331 1.00 92.35 C
+ATOM 2850 CA GLY B 67 10.747 -2.542 42.659 1.00 89.07 C
+ATOM 2854 CA GLN B 68 12.336 0.632 44.010 1.00 88.41 C
+ATOM 2863 CA ILE B 69 9.483 2.828 42.742 1.00 86.11 C
+ATOM 2871 CA ALA B 70 7.060 0.441 44.446 1.00 81.10 C
+ATOM 2876 CA ASP B 71 8.985 -0.310 47.648 1.00 76.82 C
+ATOM 2884 CA GLY B 72 8.653 3.423 48.186 1.00 73.00 C
+ATOM 2888 CA TRP B 73 12.342 4.386 48.095 1.00 67.93 C
+ATOM 2902 CA VAL B 74 13.052 8.007 47.136 1.00 63.84 C
+ATOM 2909 CA LEU B 75 16.093 9.940 45.892 1.00 58.37 C
+ATOM 2917 CA THR B 76 15.524 13.198 47.826 1.00 55.82 C
+ATOM 2924 CA CYS B 77 17.941 15.109 45.556 1.00 58.23 C
+ATOM 2930 CA HIS B 78 15.777 14.389 42.513 1.00 64.55 C
+ATOM 2940 CA ALA B 79 12.108 14.429 43.512 1.00 68.40 C
+ATOM 2945 CA TYR B 80 9.442 17.152 43.581 1.00 69.69 C
+ATOM 2957 CA PRO B 81 6.414 16.584 45.842 1.00 71.39 C
+ATOM 2964 CA THR B 82 3.015 16.014 44.179 1.00 73.67 C
+ATOM 2971 CA SER B 83 1.278 15.771 47.557 1.00 76.90 C
+ATOM 2977 CA ASP B 84 1.940 16.119 51.289 1.00 75.20 C
+ATOM 2985 CA VAL B 85 4.840 13.765 52.050 1.00 71.37 C
+ATOM 2992 CA VAL B 86 6.363 11.824 54.956 1.00 70.12 C
+ATOM 2999 CA ILE B 87 9.770 10.300 54.188 1.00 74.18 C
+ATOM 3007 CA GLU B 88 12.211 8.403 56.410 1.00 78.53 C
+ATOM 3012 CA THR B 89 15.541 9.964 55.407 1.00 79.79 C
+ATOM 3019 CA HIS B 90 19.062 8.538 55.881 1.00 79.40 C
+ATOM 3029 CA LYS B 91 17.584 5.099 55.099 1.00 84.52 C
+ATOM 3038 CA GLU B 92 20.016 2.596 53.549 1.00 91.64 C
+ATOM 3047 CA GLU B 93 20.192 -0.858 51.981 1.00 98.97 C
+ATOM 3056 CA GLU B 94 23.321 -2.924 51.298 1.00106.32 C
+ATOM 3065 CA LEU B 95 22.104 -6.552 51.453 1.00111.32 C
+ATOM 3073 CA THR B 96 18.778 -8.417 51.866 1.00116.01 C
+ATOM 3080 CA GLY B 97 18.877 -11.302 49.394 1.00116.63 C
+ATOM 3084 CA ALA B 98 22.056 -9.833 47.910 1.00116.02 C
+ATOM 3091 CA GLU C 19 26.080 -2.480 15.294 1.00 73.96 C
+ATOM 3100 CA SER C 20 23.405 0.198 14.956 1.00 67.27 C
+ATOM 3106 CA LYS C 21 22.937 3.927 15.380 1.00 59.27 C
+ATOM 3115 CA LYS C 22 19.198 3.481 15.874 1.00 58.42 C
+ATOM 3124 CA GLN C 23 17.251 3.141 19.137 1.00 59.89 C
+ATOM 3133 CA GLU C 24 17.931 -0.276 20.610 1.00 62.66 C
+ATOM 3142 CA GLU C 25 16.850 -0.453 24.226 1.00 64.27 C
+ATOM 3151 CA GLY C 26 13.211 -0.817 25.116 1.00 61.78 C
+ATOM 3155 CA VAL C 27 12.703 -2.073 21.582 1.00 58.37 C
+ATOM 3162 CA VAL C 28 10.779 -5.347 21.485 1.00 54.17 C
+ATOM 3169 CA THR C 29 9.481 -7.339 18.549 1.00 52.79 C
+ATOM 3176 CA ASN C 30 6.670 -9.775 17.786 1.00 51.30 C
+ATOM 3184 CA LEU C 31 4.863 -9.997 21.112 1.00 51.05 C
+ATOM 3192 CA TYR C 32 1.766 -11.297 19.327 1.00 50.51 C
+ATOM 3204 CA LYS C 33 1.373 -13.532 16.266 1.00 49.49 C
+ATOM 3213 CA PRO C 34 -1.609 -14.150 13.925 1.00 50.98 C
+ATOM 3220 CA LYS C 35 -2.450 -17.248 16.011 1.00 55.46 C
+ATOM 3229 CA GLU C 36 -2.977 -15.400 19.288 1.00 53.79 C
+ATOM 3238 CA PRO C 37 -3.251 -11.638 18.607 1.00 49.32 C
+ATOM 3245 CA TYR C 38 -3.674 -9.050 21.318 1.00 46.76 C
+ATOM 3257 CA VAL C 39 -7.276 -7.947 21.418 1.00 43.68 C
+ATOM 3264 CA GLY C 40 -7.415 -4.194 21.922 1.00 41.62 C
+ATOM 3268 CA ARG C 41 -10.273 -1.719 21.954 1.00 40.07 C
+ATOM 3279 CA CYS C 42 -11.026 1.064 19.477 1.00 36.37 C
+ATOM 3285 CA LEU C 43 -11.330 4.206 21.583 1.00 31.09 C
+ATOM 3293 CA LEU C 44 -11.337 6.671 18.673 1.00 28.46 C
+ATOM 3301 CA ASN C 45 -11.792 6.653 14.923 1.00 26.74 C
+ATOM 3309 CA THR C 46 -11.954 9.920 13.013 1.00 25.29 C
+ATOM 3316 CA LYS C 47 -11.667 10.775 9.352 1.00 21.50 C
+ATOM 3325 CA ILE C 48 -8.895 13.355 9.121 1.00 19.33 C
+ATOM 3333 CA THR C 49 -9.125 14.281 5.442 1.00 20.38 C
+ATOM 3340 CA GLY C 50 -11.630 16.676 3.855 1.00 20.12 C
+ATOM 3344 CA ASP C 51 -14.895 15.345 2.412 1.00 21.75 C
+ATOM 3352 CA ASP C 52 -13.889 16.693 -0.999 1.00 21.19 C
+ATOM 3360 CA ALA C 53 -10.651 14.683 -0.749 1.00 21.06 C
+ATOM 3365 CA PRO C 54 -10.036 11.974 -3.413 1.00 21.39 C
+ATOM 3372 CA GLY C 55 -9.982 9.067 -0.977 1.00 24.42 C
+ATOM 3376 CA GLU C 56 -10.374 9.298 2.857 1.00 22.08 C
+ATOM 3385 CA THR C 57 -7.723 8.611 5.517 1.00 20.31 C
+ATOM 3392 CA TRP C 58 -8.541 7.849 9.162 1.00 19.33 C
+ATOM 3406 CA HIS C 59 -6.758 8.520 12.438 1.00 22.68 C
+ATOM 3416 CA MET C 60 -7.645 5.951 15.108 1.00 27.16 C
+ATOM 3424 CA VAL C 61 -6.672 5.224 18.723 1.00 29.32 C
+ATOM 3431 CA PHE C 62 -6.669 1.704 20.220 1.00 34.23 C
+ATOM 3442 CA SER C 63 -6.102 0.643 23.847 1.00 37.05 C
+ATOM 3448 CA THR C 64 -3.096 -1.517 24.798 1.00 41.86 C
+ATOM 3455 CA GLU C 65 -3.169 -1.652 28.621 1.00 48.33 C
+ATOM 3464 CA GLY C 66 0.537 -0.885 28.318 1.00 52.45 C
+ATOM 3468 CA LYS C 67 0.955 -4.385 26.891 1.00 54.14 C
+ATOM 3477 CA ILE C 68 2.429 -3.211 23.570 1.00 51.52 C
+ATOM 3485 CA PRO C 69 5.602 -1.279 24.487 1.00 49.85 C
+ATOM 3492 CA TYR C 70 6.523 -0.180 20.967 1.00 44.48 C
+ATOM 3504 CA ARG C 71 9.185 2.353 19.993 1.00 40.96 C
+ATOM 3515 CA GLU C 72 8.727 5.317 17.688 1.00 33.49 C
+ATOM 3524 CA GLY C 73 8.913 3.876 14.164 1.00 30.16 C
+ATOM 3528 CA GLN C 74 7.423 0.399 14.427 1.00 31.26 C
+ATOM 3537 CA SER C 75 4.187 -0.913 12.966 1.00 33.65 C
+ATOM 3543 CA ILE C 76 1.454 -3.212 14.278 1.00 33.75 C
+ATOM 3551 CA GLY C 77 -0.295 -5.923 12.356 1.00 34.32 C
+ATOM 3555 CA VAL C 78 -4.060 -6.111 12.164 1.00 36.67 C
+ATOM 3562 CA ILE C 79 -6.137 -9.230 11.507 1.00 41.91 C
+ATOM 3570 CA ALA C 80 -9.427 -8.086 10.024 1.00 44.06 C
+ATOM 3575 CA ASP C 81 -12.530 -9.927 11.224 1.00 47.03 C
+ATOM 3583 CA GLY C 82 -13.972 -12.487 8.829 1.00 53.52 C
+ATOM 3587 CA VAL C 83 -12.521 -14.951 6.324 1.00 62.57 C
+ATOM 3594 CA ASP C 84 -11.856 -14.200 2.630 1.00 71.97 C
+ATOM 3602 CA LYS C 85 -12.935 -17.403 0.861 1.00 76.86 C
+ATOM 3611 CA ASN C 86 -13.690 -18.960 4.253 1.00 76.52 C
+ATOM 3619 CA GLY C 87 -10.006 -19.837 4.066 1.00 76.22 C
+ATOM 3623 CA LYS C 88 -8.802 -19.138 7.616 1.00 71.60 C
+ATOM 3632 CA PRO C 89 -8.651 -15.577 8.944 1.00 64.14 C
+ATOM 3639 CA HIS C 90 -7.547 -12.649 6.805 1.00 52.35 C
+ATOM 3649 CA LYS C 91 -3.753 -12.529 6.474 1.00 46.81 C
+ATOM 3658 CA VAL C 92 -2.180 -9.868 8.686 1.00 43.48 C
+ATOM 3665 CA ARG C 93 -1.491 -6.414 7.232 1.00 36.99 C
+ATOM 3676 CA LEU C 94 0.983 -3.882 8.601 1.00 32.95 C
+ATOM 3684 CA TYR C 95 0.340 -0.239 9.510 1.00 24.84 C
+ATOM 3696 CA SER C 96 3.003 2.101 10.803 1.00 23.32 C
+ATOM 3702 CA ILE C 97 2.244 3.502 14.236 1.00 24.12 C
+ATOM 3710 CA ALA C 98 1.243 7.179 13.932 1.00 22.32 C
+ATOM 3715 CA SER C 99 1.572 7.636 17.676 1.00 25.69 C
+ATOM 3721 CA SER C 100 4.752 7.924 19.726 1.00 28.83 C
+ATOM 3727 CA ALA C 101 5.741 5.521 22.508 1.00 35.61 C
+ATOM 3732 CA ILE C 102 3.906 7.635 25.079 1.00 38.39 C
+ATOM 3740 CA GLY C 103 0.899 7.826 22.742 1.00 31.93 C
+ATOM 3744 CA ASP C 104 -1.803 10.384 21.986 1.00 28.77 C
+ATOM 3752 CA PHE C 105 -3.050 10.293 25.607 1.00 37.05 C
+ATOM 3763 CA GLY C 106 0.503 10.389 26.967 1.00 39.36 C
+ATOM 3767 CA ASP C 107 -0.221 7.437 29.266 1.00 41.44 C
+ATOM 3775 CA SER C 108 1.566 4.766 27.217 1.00 42.18 C
+ATOM 3781 CA LYS C 109 -1.747 2.877 27.156 1.00 42.45 C
+ATOM 3790 CA THR C 110 -2.698 3.586 23.515 1.00 38.10 C
+ATOM 3797 CA VAL C 111 -1.603 2.971 19.906 1.00 32.79 C
+ATOM 3804 CA SER C 112 -2.671 5.020 16.872 1.00 29.60 C
+ATOM 3810 CA LEU C 113 -2.713 4.324 13.126 1.00 25.68 C
+ATOM 3818 CA CYS C 114 -3.142 6.498 9.999 1.00 24.23 C
+ATOM 3824 CA VAL C 115 -5.345 4.496 7.641 1.00 22.80 C
+ATOM 3831 CA LYS C 116 -6.221 5.196 4.015 1.00 22.11 C
+ATOM 3840 CA ARG C 117 -9.458 3.521 2.955 1.00 25.68 C
+ATOM 3851 CA LEU C 118 -8.447 1.440 -0.100 1.00 28.80 C
+ATOM 3859 CA ILE C 119 -11.140 1.661 -2.792 1.00 31.75 C
+ATOM 3867 CA TYR C 120 -10.086 0.716 -6.312 1.00 32.93 C
+ATOM 3879 CA THR C 121 -11.388 -0.733 -9.598 1.00 36.84 C
+ATOM 3886 CA ASN C 122 -10.258 -4.257 -10.546 1.00 36.90 C
+ATOM 3894 CA ASP C 123 -9.574 -5.562 -14.056 1.00 45.45 C
+ATOM 3902 CA ALA C 124 -13.196 -6.758 -14.269 1.00 44.66 C
+ATOM 3907 CA GLY C 125 -14.207 -3.102 -14.023 1.00 45.49 C
+ATOM 3911 CA GLU C 126 -16.059 -3.511 -10.722 1.00 45.54 C
+ATOM 3920 CA ILE C 127 -15.507 -1.321 -7.638 1.00 39.70 C
+ATOM 3928 CA VAL C 128 -13.846 -3.171 -4.762 1.00 38.09 C
+ATOM 3935 CA LYS C 129 -12.759 -2.512 -1.198 1.00 33.77 C
+ATOM 3944 CA GLY C 130 -9.566 -3.363 0.599 1.00 31.98 C
+ATOM 3948 CA VAL C 131 -10.443 -5.797 3.385 1.00 33.16 C
+ATOM 3955 CA CYS C 132 -8.241 -4.645 6.257 1.00 29.97 C
+ATOM 3961 CA SER C 133 -8.238 -0.898 5.607 1.00 30.67 C
+ATOM 3967 CA ASN C 134 -12.022 -0.902 5.268 1.00 30.35 C
+ATOM 3975 CA PHE C 135 -12.375 -2.946 8.424 1.00 29.86 C
+ATOM 3986 CA LEU C 136 -10.223 -0.334 10.195 1.00 29.42 C
+ATOM 3994 CA CYS C 137 -11.779 2.834 8.813 1.00 32.27 C
+ATOM 4000 CA ASP C 138 -15.116 1.280 9.724 1.00 34.29 C
+ATOM 4008 CA LEU C 139 -14.287 0.699 13.399 1.00 37.51 C
+ATOM 4016 CA GLN C 140 -16.635 2.170 16.028 1.00 43.76 C
+ATOM 4025 CA PRO C 141 -15.630 3.032 19.581 1.00 42.77 C
+ATOM 4032 CA GLY C 142 -16.082 -0.210 21.478 1.00 42.83 C
+ATOM 4036 CA ASP C 143 -15.117 -2.625 18.696 1.00 40.91 C
+ATOM 4044 CA ASN C 144 -12.182 -4.947 19.288 1.00 45.66 C
+ATOM 4052 CA VAL C 145 -9.056 -5.146 17.145 1.00 46.95 C
+ATOM 4059 CA GLN C 146 -6.707 -8.107 16.606 1.00 48.69 C
+ATOM 4068 CA ILE C 147 -3.249 -6.538 17.123 1.00 46.84 C
+ATOM 4076 CA THR C 148 -0.010 -8.392 16.264 1.00 46.26 C
+ATOM 4083 CA GLY C 149 3.543 -7.117 16.634 1.00 45.60 C
+ATOM 4087 CA PRO C 150 5.248 -4.818 17.394 1.00 44.97 C
+ATOM 4094 CA VAL C 151 7.423 -5.293 14.321 1.00 44.50 C
+ATOM 4101 CA GLY C 152 10.289 -3.716 12.438 1.00 45.33 C
+ATOM 4105 CA LYS C 153 13.599 -2.161 13.435 1.00 48.64 C
+ATOM 4114 CA GLU C 154 14.166 -0.437 10.074 1.00 48.20 C
+ATOM 4123 CA MET C 155 12.437 2.888 10.737 1.00 41.77 C
+ATOM 4131 CA LEU C 156 13.839 3.081 14.267 1.00 38.27 C
+ATOM 4139 CA MET C 157 15.076 6.540 15.308 1.00 34.29 C
+ATOM 4147 CA PRO C 158 18.782 7.419 15.339 1.00 34.05 C
+ATOM 4154 CA LYS C 159 20.262 7.521 18.845 1.00 35.82 C
+ATOM 4163 CA ASP C 160 22.076 10.792 18.273 1.00 35.95 C
+ATOM 4171 CA PRO C 161 19.683 13.401 19.809 1.00 35.63 C
+ATOM 4178 CA ASN C 162 21.563 15.948 17.758 1.00 33.92 C
+ATOM 4186 CA ALA C 163 21.028 14.172 14.487 1.00 30.82 C
+ATOM 4191 CA THR C 164 19.693 15.722 11.305 1.00 25.18 C
+ATOM 4198 CA ILE C 165 16.617 13.601 10.636 1.00 19.91 C
+ATOM 4206 CA ILE C 166 15.351 13.978 7.060 1.00 13.76 C
+ATOM 4214 CA MET C 167 11.843 12.550 6.703 1.00 14.98 C
+ATOM 4222 CA LEU C 168 10.385 11.831 3.251 1.00 16.64 C
+ATOM 4230 CA ALA C 169 6.747 10.808 3.007 1.00 15.85 C
+ATOM 4235 CA THR C 170 3.765 10.346 0.737 1.00 14.23 C
+ATOM 4242 CA GLY C 171 0.255 9.724 2.035 1.00 13.78 C
+ATOM 4246 CA THR C 172 -0.103 7.560 5.139 1.00 17.62 C
+ATOM 4253 CA GLY C 173 3.646 7.343 4.821 1.00 17.20 C
+ATOM 4257 CA ILE C 174 3.469 10.213 7.270 1.00 15.91 C
+ATOM 4265 CA ALA C 175 2.586 7.783 10.110 1.00 15.63 C
+ATOM 4270 CA PRO C 176 6.023 6.933 11.582 1.00 17.04 C
+ATOM 4277 CA PHE C 177 7.215 10.514 11.327 1.00 18.21 C
+ATOM 4288 CA ARG C 178 4.268 11.745 13.359 1.00 22.35 C
+ATOM 4299 CA SER C 179 5.563 9.289 15.983 1.00 25.22 C
+ATOM 4305 CA PHE C 180 9.139 10.593 15.614 1.00 25.98 C
+ATOM 4316 CA LEU C 181 7.925 14.180 15.767 1.00 29.12 C
+ATOM 4324 CA TRP C 182 5.625 13.641 18.714 1.00 31.35 C
+ATOM 4338 CA LYS C 183 8.488 12.385 20.871 1.00 30.92 C
+ATOM 4347 CA MET C 184 10.841 15.050 19.503 1.00 24.85 C
+ATOM 4355 CA PHE C 185 8.741 18.202 20.114 1.00 22.97 C
+ATOM 4366 CA PHE C 186 5.604 17.337 22.076 1.00 27.77 C
+ATOM 4377 CA GLU C 187 7.117 15.432 25.009 1.00 37.71 C
+ATOM 4386 CA LYS C 188 9.542 15.977 27.878 1.00 53.59 C
+ATOM 4395 CA HIS C 189 12.355 13.416 28.180 1.00 63.67 C
+ATOM 4405 CA ASP C 190 15.318 13.181 30.569 1.00 66.93 C
+ATOM 4413 CA ASP C 191 17.480 11.106 28.238 1.00 59.79 C
+ATOM 4421 CA TYR C 192 16.190 12.725 25.047 1.00 51.96 C
+ATOM 4433 CA LYS C 193 16.700 16.406 24.324 1.00 47.01 C
+ATOM 4442 CA PHE C 194 16.580 16.471 20.530 1.00 39.85 C
+ATOM 4453 CA ASN C 195 18.572 19.494 19.409 1.00 37.52 C
+ATOM 4461 CA GLY C 196 19.361 18.548 15.845 1.00 32.08 C
+ATOM 4465 CA LEU C 197 17.310 19.266 12.766 1.00 28.26 C
+ATOM 4473 CA GLY C 198 14.051 17.526 11.928 1.00 25.05 C
+ATOM 4477 CA TRP C 199 13.211 18.137 8.269 1.00 19.81 C
+ATOM 4491 CA LEU C 200 9.908 16.742 7.059 1.00 13.86 C
+ATOM 4499 CA PHE C 201 8.855 16.521 3.429 1.00 14.83 C
+ATOM 4510 CA LEU C 202 5.288 15.361 2.717 1.00 16.12 C
+ATOM 4518 CA GLY C 203 3.701 14.731 -0.681 1.00 13.79 C
+ATOM 4522 CA VAL C 204 -0.051 14.414 -1.182 1.00 11.75 C
+ATOM 4529 CA PRO C 205 -2.113 15.264 -4.308 1.00 14.66 C
+ATOM 4536 CA THR C 206 -4.553 17.737 -2.778 1.00 16.37 C
+ATOM 4543 CA SER C 207 -4.756 20.169 0.120 1.00 18.01 C
+ATOM 4549 CA SER C 208 -7.780 18.225 1.280 1.00 17.59 C
+ATOM 4555 CA SER C 209 -5.452 15.198 1.550 1.00 16.19 C
+ATOM 4561 CA LEU C 210 -2.972 16.940 3.860 1.00 14.22 C
+ATOM 4569 CA LEU C 211 -2.255 14.980 7.059 1.00 14.43 C
+ATOM 4577 CA TYR C 212 -1.624 16.449 10.549 1.00 18.94 C
+ATOM 4589 CA LYS C 213 -0.818 19.896 9.150 1.00 22.61 C
+ATOM 4598 CA GLU C 214 -2.039 21.572 12.352 1.00 25.73 C
+ATOM 4607 CA GLU C 215 0.152 19.413 14.514 1.00 19.23 C
+ATOM 4616 CA PHE C 216 3.216 20.178 12.439 1.00 17.80 C
+ATOM 4627 CA GLY C 217 2.478 23.890 12.512 1.00 19.90 C
+ATOM 4631 CA LYS C 218 2.578 24.001 16.294 1.00 25.54 C
+ATOM 4640 CA MET C 219 5.810 22.021 16.188 1.00 26.79 C
+ATOM 4648 CA LYS C 220 7.224 24.606 13.819 1.00 31.85 C
+ATOM 4657 CA GLU C 221 6.071 27.341 16.219 1.00 38.62 C
+ATOM 4666 CA ARG C 222 7.760 25.760 19.233 1.00 39.10 C
+ATOM 4677 CA ALA C 223 11.124 24.971 17.668 1.00 35.43 C
+ATOM 4682 CA PRO C 224 11.696 27.100 14.528 1.00 32.99 C
+ATOM 4689 CA GLU C 225 15.425 26.331 14.360 1.00 33.87 C
+ATOM 4698 CA ASN C 226 15.038 22.591 14.986 1.00 30.46 C
+ATOM 4706 CA PHE C 227 12.088 21.755 12.732 1.00 24.98 C
+ATOM 4717 CA ARG C 228 11.351 22.384 9.075 1.00 19.87 C
+ATOM 4728 CA VAL C 229 8.435 21.010 7.118 1.00 14.21 C
+ATOM 4735 CA ASP C 230 7.739 21.452 3.398 1.00 12.26 C
+ATOM 4743 CA TYR C 231 4.627 20.147 1.722 1.00 14.42 C
+ATOM 4755 CA ALA C 232 4.334 19.003 -1.872 1.00 9.99 C
+ATOM 4760 CA VAL C 233 0.778 19.232 -3.168 1.00 10.49 C
+ATOM 4767 CA SER C 234 1.043 17.769 -6.694 1.00 19.00 C
+ATOM 4773 CA ARG C 235 -2.240 19.042 -8.206 1.00 23.13 C
+ATOM 4784 CA GLU C 236 -2.069 22.459 -6.578 1.00 17.58 C
+ATOM 4793 CA GLN C 237 1.546 23.511 -6.623 1.00 15.89 C
+ATOM 4802 CA THR C 238 4.202 24.018 -9.275 1.00 17.86 C
+ATOM 4809 CA ASN C 239 7.922 24.800 -9.182 1.00 15.15 C
+ATOM 4817 CA ALA C 240 9.558 27.791 -10.892 1.00 21.51 C
+ATOM 4822 CA ALA C 241 9.475 25.887 -14.174 1.00 24.05 C
+ATOM 4827 CA GLY C 242 5.741 25.110 -13.938 1.00 26.25 C
+ATOM 4831 CA GLU C 243 5.999 21.359 -13.153 1.00 25.92 C
+ATOM 4840 CA ARG C 244 3.679 19.536 -10.704 1.00 24.04 C
+ATOM 4851 CA MET C 245 5.076 19.643 -7.174 1.00 18.58 C
+ATOM 4859 CA TYR C 246 5.784 16.047 -6.100 1.00 14.16 C
+ATOM 4871 CA ILE C 247 7.910 15.343 -3.034 1.00 16.78 C
+ATOM 4879 CA GLN C 248 11.089 15.070 -5.120 1.00 18.72 C
+ATOM 4888 CA THR C 249 10.168 18.255 -6.921 1.00 20.93 C
+ATOM 4895 CA ARG C 250 9.962 20.031 -3.567 1.00 19.25 C
+ATOM 4906 CA MET C 251 13.275 18.471 -2.561 1.00 19.40 C
+ATOM 4914 CA ALA C 252 14.910 19.812 -5.760 1.00 20.48 C
+ATOM 4919 CA GLU C 253 14.456 23.418 -4.569 1.00 18.19 C
+ATOM 4928 CA TYR C 254 16.804 22.515 -1.673 1.00 17.80 C
+ATOM 4940 CA LYS C 255 19.038 20.415 -3.902 1.00 20.66 C
+ATOM 4949 CA GLU C 256 22.452 21.603 -2.682 1.00 16.05 C
+ATOM 4958 CA GLU C 257 21.544 21.914 0.993 1.00 15.89 C
+ATOM 4967 CA LEU C 258 20.377 18.297 0.919 1.00 20.74 C
+ATOM 4975 CA TRP C 259 23.388 16.939 -0.965 1.00 23.45 C
+ATOM 4989 CA GLU C 260 25.645 18.669 1.563 1.00 24.08 C
+ATOM 4998 CA LEU C 261 23.573 17.378 4.477 1.00 24.74 C
+ATOM 5006 CA LEU C 262 24.020 13.928 2.938 1.00 26.14 C
+ATOM 5014 CA LYS C 263 27.792 14.091 3.402 1.00 25.40 C
+ATOM 5023 CA LYS C 264 27.457 14.521 7.176 1.00 31.47 C
+ATOM 5032 CA ASP C 265 27.877 11.474 9.425 1.00 35.31 C
+ATOM 5040 CA ASN C 266 24.934 12.482 11.620 1.00 29.63 C
+ATOM 5048 CA THR C 267 22.321 12.795 8.832 1.00 28.00 C
+ATOM 5055 CA TYR C 268 19.556 10.160 8.808 1.00 27.00 C
+ATOM 5067 CA VAL C 269 17.143 9.903 5.884 1.00 24.65 C
+ATOM 5074 CA TYR C 270 13.890 8.016 6.276 1.00 23.37 C
+ATOM 5086 CA MET C 271 11.373 7.327 3.518 1.00 18.93 C
+ATOM 5094 CA CYS C 272 7.834 6.074 4.043 1.00 18.24 C
+ATOM 5100 CA GLY C 273 4.784 5.874 1.826 1.00 22.39 C
+ATOM 5104 CA LEU C 274 3.837 4.483 -1.568 1.00 26.95 C
+ATOM 5112 CA LYS C 275 6.305 2.384 -3.532 1.00 32.36 C
+ATOM 5121 CA GLY C 276 7.741 4.199 -6.514 1.00 37.46 C
+ATOM 5125 CA MET C 277 7.714 7.455 -4.608 1.00 28.76 C
+ATOM 5133 CA GLU C 278 11.430 6.639 -4.425 1.00 32.22 C
+ATOM 5142 CA LYS C 279 12.017 6.321 -8.153 1.00 29.94 C
+ATOM 5151 CA GLY C 280 11.317 10.057 -8.293 1.00 24.18 C
+ATOM 5155 CA ILE C 281 13.766 10.673 -5.460 1.00 23.68 C
+ATOM 5163 CA ASP C 282 16.431 8.365 -6.934 1.00 26.58 C
+ATOM 5171 CA ASP C 283 16.211 10.530 -10.054 1.00 28.70 C
+ATOM 5179 CA ILE C 284 17.089 13.937 -8.538 1.00 27.28 C
+ATOM 5187 CA MET C 285 19.706 12.222 -6.388 1.00 27.45 C
+ATOM 5195 CA VAL C 286 21.377 10.712 -9.470 1.00 30.74 C
+ATOM 5202 CA SER C 287 21.619 14.159 -11.061 1.00 32.14 C
+ATOM 5208 CA LEU C 288 23.240 15.463 -7.873 1.00 34.20 C
+ATOM 5216 CA ALA C 289 25.801 12.653 -7.874 1.00 40.16 C
+ATOM 5221 CA GLU C 290 26.837 12.825 -11.536 1.00 41.84 C
+ATOM 5230 CA LYS C 291 27.855 16.387 -10.793 1.00 43.17 C
+ATOM 5239 CA ASP C 292 30.299 15.115 -8.139 1.00 41.84 C
+ATOM 5247 CA GLY C 293 31.237 12.232 -10.420 1.00 46.12 C
+ATOM 5251 CA ILE C 294 30.053 9.669 -7.864 1.00 45.54 C
+ATOM 5259 CA ASP C 295 27.399 6.998 -8.480 1.00 41.14 C
+ATOM 5267 CA TRP C 296 24.222 7.605 -6.479 1.00 30.67 C
+ATOM 5281 CA PHE C 297 23.381 3.910 -6.151 1.00 31.97 C
+ATOM 5292 CA ASP C 298 26.856 2.916 -4.907 1.00 38.12 C
+ATOM 5300 CA TYR C 299 26.671 5.875 -2.540 1.00 39.05 C
+ATOM 5312 CA LYS C 300 23.196 4.971 -1.294 1.00 41.63 C
+ATOM 5321 CA LYS C 301 24.542 1.489 -0.577 1.00 43.40 C
+ATOM 5330 CA GLN C 302 27.207 3.064 1.608 1.00 43.79 C
+ATOM 5339 CA LEU C 303 24.476 5.181 3.238 1.00 41.51 C
+ATOM 5347 CA LYS C 304 22.138 2.343 4.264 1.00 45.18 C
+ATOM 5356 CA ARG C 305 25.322 0.535 5.256 1.00 46.65 C
+ATOM 5367 CA GLY C 306 25.613 3.181 7.945 1.00 40.29 C
+ATOM 5371 CA ASP C 307 21.954 3.487 8.940 1.00 41.21 C
+ATOM 5379 CA GLN C 308 21.463 6.730 7.023 1.00 35.55 C
+ATOM 5388 CA TRP C 309 18.961 5.674 4.361 1.00 31.22 C
+ATOM 5402 CA ASN C 310 16.018 3.728 5.752 1.00 31.61 C
+ATOM 5410 CA VAL C 311 13.120 2.841 3.452 1.00 32.13 C
+ATOM 5417 CA GLU C 312 9.705 1.332 4.261 1.00 31.51 C
+ATOM 5426 CA VAL C 313 7.466 1.606 1.209 1.00 26.39 C
+ATOM 5433 CA TYR C 314 4.403 -0.343 0.111 1.00 25.42 C
--- /dev/null
+HEADER RNA 29-MAR-06 2GIS
+TITLE STRUCTURE OF THE S-ADENOSYLMETHIONINE RIBOSWITCH MRNA
+TITLE 2 REGULATORY ELEMENT
+COMPND MOL_ID: 1;
+COMPND 2 MOLECULE: SAM-I RIBOSWITCH;
+COMPND 3 CHAIN: A;
+COMPND 4 ENGINEERED: YES
+SOURCE MOL_ID: 1;
+SOURCE 2 SYNTHETIC: YES;
+SOURCE 3 OTHER_DETAILS: THIS SEQUENCE WAS ENGINEERED BASED ON THE
+SOURCE 4 SAM-I RIBOSWITCH FROM THE METF-METH OPERON IN
+SOURCE 5 THERMOANAEROBACTER TENGCONGENSIS
+KEYWDS MRNA, RIBOSWITCH, S-ADENOSYLMETHIONINE, SAM, RNA-LIGAND
+KEYWDS 2 COMPLEX
+EXPDTA X-RAY DIFFRACTION
+AUTHOR R.K.MONTANGE,R.T.BATEY
+REVDAT 2 24-FEB-09 2GIS 1 VERSN
+REVDAT 1 04-JUL-06 2GIS 0
+JRNL AUTH R.K.MONTANGE,R.T.BATEY
+JRNL TITL STRUCTURE OF THE S-ADENOSYLMETHIONINE RIBOSWITCH
+JRNL TITL 2 REGULATORY MRNA ELEMENT.
+JRNL REF NATURE V. 441 1172 2006
+JRNL REFN ISSN 0028-0836
+JRNL PMID 16810258
+JRNL DOI 10.1038/NATURE04819
+REMARK 1
+REMARK 2
+REMARK 2 RESOLUTION. 2.90 ANGSTROMS.
+REMARK 3
+REMARK 3 REFINEMENT.
+REMARK 3 PROGRAM : CNS 1.1
+REMARK 3 AUTHORS : BRUNGER,ADAMS,CLORE,DELANO,GROS,GROSSE-
+REMARK 3 : KUNSTLEVE,JIANG,KUSZEWSKI,NILGES, PANNU,
+REMARK 3 : READ,RICE,SIMONSON,WARREN
+REMARK 3
+REMARK 3 REFINEMENT TARGET : ENGH & HUBER
+REMARK 3
+REMARK 3 DATA USED IN REFINEMENT.
+REMARK 3 RESOLUTION RANGE HIGH (ANGSTROMS) : 2.90
+REMARK 3 RESOLUTION RANGE LOW (ANGSTROMS) : 49.32
+REMARK 3 DATA CUTOFF (SIGMA(F)) : 0.000
+REMARK 3 DATA CUTOFF HIGH (ABS(F)) : 441185.100
+REMARK 3 DATA CUTOFF LOW (ABS(F)) : 0.0000
+REMARK 3 COMPLETENESS (WORKING+TEST) (%) : 99.3
+REMARK 3 NUMBER OF REFLECTIONS : 13415
+REMARK 3
+REMARK 3 FIT TO DATA USED IN REFINEMENT.
+REMARK 3 CROSS-VALIDATION METHOD : THROUGHOUT
+REMARK 3 FREE R VALUE TEST SET SELECTION : RANDOM
+REMARK 3 R VALUE (WORKING SET) : 0.266
+REMARK 3 FREE R VALUE : 0.289
+REMARK 3 FREE R VALUE TEST SET SIZE (%) : 7.400
+REMARK 3 FREE R VALUE TEST SET COUNT : 999
+REMARK 3 ESTIMATED ERROR OF FREE R VALUE : 0.009
+REMARK 3
+REMARK 3 FIT IN THE HIGHEST RESOLUTION BIN.
+REMARK 3 TOTAL NUMBER OF BINS USED : 6
+REMARK 3 BIN RESOLUTION RANGE HIGH (A) : 2.90
+REMARK 3 BIN RESOLUTION RANGE LOW (A) : 3.08
+REMARK 3 BIN COMPLETENESS (WORKING+TEST) (%) : 98.90
+REMARK 3 REFLECTIONS IN BIN (WORKING SET) : 2056
+REMARK 3 BIN R VALUE (WORKING SET) : 0.4270
+REMARK 3 BIN FREE R VALUE : 0.4160
+REMARK 3 BIN FREE R VALUE TEST SET SIZE (%) : 7.30
+REMARK 3 BIN FREE R VALUE TEST SET COUNT : 162
+REMARK 3 ESTIMATED ERROR OF BIN FREE R VALUE : 0.033
+REMARK 3
+REMARK 3 NUMBER OF NON-HYDROGEN ATOMS USED IN REFINEMENT.
+REMARK 3 PROTEIN ATOMS : 0
+REMARK 3 NUCLEIC ACID ATOMS : 2029
+REMARK 3 HETEROGEN ATOMS : 57
+REMARK 3 SOLVENT ATOMS : 88
+REMARK 3
+REMARK 3 B VALUES.
+REMARK 3 FROM WILSON PLOT (A**2) : 139.30
+REMARK 3 MEAN B VALUE (OVERALL, A**2) : 69.60
+REMARK 3 OVERALL ANISOTROPIC B VALUE.
+REMARK 3 B11 (A**2) : 11.87000
+REMARK 3 B22 (A**2) : 11.87000
+REMARK 3 B33 (A**2) : -23.74000
+REMARK 3 B12 (A**2) : 0.00000
+REMARK 3 B13 (A**2) : 0.00000
+REMARK 3 B23 (A**2) : 0.00000
+REMARK 3
+REMARK 3 ESTIMATED COORDINATE ERROR.
+REMARK 3 ESD FROM LUZZATI PLOT (A) : 0.39
+REMARK 3 ESD FROM SIGMAA (A) : 0.39
+REMARK 3 LOW RESOLUTION CUTOFF (A) : 5.00
+REMARK 3
+REMARK 3 CROSS-VALIDATED ESTIMATED COORDINATE ERROR.
+REMARK 3 ESD FROM C-V LUZZATI PLOT (A) : 0.48
+REMARK 3 ESD FROM C-V SIGMAA (A) : 0.35
+REMARK 3
+REMARK 3 RMS DEVIATIONS FROM IDEAL VALUES.
+REMARK 3 BOND LENGTHS (A) : 0.010
+REMARK 3 BOND ANGLES (DEGREES) : 1.60
+REMARK 3 DIHEDRAL ANGLES (DEGREES) : 17.30
+REMARK 3 IMPROPER ANGLES (DEGREES) : 2.31
+REMARK 3
+REMARK 3 ISOTROPIC THERMAL MODEL : RESTRAINED
+REMARK 3
+REMARK 3 ISOTROPIC THERMAL FACTOR RESTRAINTS. RMS SIGMA
+REMARK 3 MAIN-CHAIN BOND (A**2) : 1.380 ; 1.500
+REMARK 3 MAIN-CHAIN ANGLE (A**2) : 2.560 ; 2.000
+REMARK 3 SIDE-CHAIN BOND (A**2) : 1.630 ; 2.000
+REMARK 3 SIDE-CHAIN ANGLE (A**2) : 2.610 ; 2.500
+REMARK 3
+REMARK 3 BULK SOLVENT MODELING.
+REMARK 3 METHOD USED : FLAT MODEL
+REMARK 3 KSOL : 0.88
+REMARK 3 BSOL : 300.00
+REMARK 3
+REMARK 3 NCS MODEL : NULL
+REMARK 3
+REMARK 3 NCS RESTRAINTS. RMS SIGMA/WEIGHT
+REMARK 3 GROUP 1 POSITIONAL (A) : NULL ; NULL
+REMARK 3 GROUP 1 B-FACTOR (A**2) : NULL ; NULL
+REMARK 3
+REMARK 3 PARAMETER FILE 1 : DNA-RNA_REP.PARAM
+REMARK 3 PARAMETER FILE 2 : ION2.PARAM
+REMARK 3 PARAMETER FILE 3 : SAM3.PARAM
+REMARK 3 PARAMETER FILE 4 : WATER_REP.PARAM
+REMARK 3 PARAMETER FILE 5 : NULL
+REMARK 3 TOPOLOGY FILE 1 : DNA-RNA_REP.TOP
+REMARK 3 TOPOLOGY FILE 2 : ION2.TOP
+REMARK 3 TOPOLOGY FILE 3 : SAM3.TOP
+REMARK 3 TOPOLOGY FILE 4 : WATER_REP.TOP
+REMARK 3 TOPOLOGY FILE 5 : NULL
+REMARK 3
+REMARK 3 OTHER REFINEMENT REMARKS: NULL
+REMARK 4
+REMARK 4 2GIS COMPLIES WITH FORMAT V. 3.15, 01-DEC-08
+REMARK 100
+REMARK 100 THIS ENTRY HAS BEEN PROCESSED BY RCSB ON 14-APR-06.
+REMARK 100 THE RCSB ID CODE IS RCSB037170.
+REMARK 200
+REMARK 200 EXPERIMENTAL DETAILS
+REMARK 200 EXPERIMENT TYPE : X-RAY DIFFRACTION
+REMARK 200 DATE OF DATA COLLECTION : 11-NOV-05
+REMARK 200 TEMPERATURE (KELVIN) : 100
+REMARK 200 PH : NULL
+REMARK 200 NUMBER OF CRYSTALS USED : 1
+REMARK 200
+REMARK 200 SYNCHROTRON (Y/N) : Y
+REMARK 200 RADIATION SOURCE : ALS
+REMARK 200 BEAMLINE : 8.2.1
+REMARK 200 X-RAY GENERATOR MODEL : NULL
+REMARK 200 MONOCHROMATIC OR LAUE (M/L) : M
+REMARK 200 WAVELENGTH OR RANGE (A) : 1.10532, 1.10573
+REMARK 200 MONOCHROMATOR : NULL
+REMARK 200 OPTICS : NULL
+REMARK 200
+REMARK 200 DETECTOR TYPE : CCD
+REMARK 200 DETECTOR MANUFACTURER : ADSC QUANTUM 315
+REMARK 200 INTENSITY-INTEGRATION SOFTWARE : BOS
+REMARK 200 DATA SCALING SOFTWARE : D*TREK
+REMARK 200
+REMARK 200 NUMBER OF UNIQUE REFLECTIONS : 14940
+REMARK 200 RESOLUTION RANGE HIGH (A) : 2.900
+REMARK 200 RESOLUTION RANGE LOW (A) : 49.320
+REMARK 200 REJECTION CRITERIA (SIGMA(I)) : 3.000
+REMARK 200
+REMARK 200 OVERALL.
+REMARK 200 COMPLETENESS FOR RANGE (%) : 99.6
+REMARK 200 DATA REDUNDANCY : 14.640
+REMARK 200 R MERGE (I) : 0.07200
+REMARK 200 R SYM (I) : NULL
+REMARK 200 <I/SIGMA(I)> FOR THE DATA SET : 17.9000
+REMARK 200
+REMARK 200 IN THE HIGHEST RESOLUTION SHELL.
+REMARK 200 HIGHEST RESOLUTION SHELL, RANGE HIGH (A) : 2.90
+REMARK 200 HIGHEST RESOLUTION SHELL, RANGE LOW (A) : 3.08
+REMARK 200 COMPLETENESS FOR SHELL (%) : 99.9
+REMARK 200 DATA REDUNDANCY IN SHELL : 11.74
+REMARK 200 R MERGE FOR SHELL (I) : 0.42600
+REMARK 200 R SYM FOR SHELL (I) : NULL
+REMARK 200 <I/SIGMA(I)> FOR SHELL : 4.400
+REMARK 200
+REMARK 200 DIFFRACTION PROTOCOL: MAD
+REMARK 200 METHOD USED TO DETERMINE THE STRUCTURE: MAD
+REMARK 200 SOFTWARE USED: CNS
+REMARK 200 STARTING MODEL: NULL
+REMARK 200
+REMARK 200 REMARK: NULL
+REMARK 280
+REMARK 280 CRYSTAL
+REMARK 280 SOLVENT CONTENT, VS (%): 52.20
+REMARK 280 MATTHEWS COEFFICIENT, VM (ANGSTROMS**3/DA): 2.57
+REMARK 280
+REMARK 280 CRYSTALLIZATION CONDITIONS: NULL
+REMARK 290
+REMARK 290 CRYSTALLOGRAPHIC SYMMETRY
+REMARK 290 SYMMETRY OPERATORS FOR SPACE GROUP: P 43 21 2
+REMARK 290
+REMARK 290 SYMOP SYMMETRY
+REMARK 290 NNNMMM OPERATOR
+REMARK 290 1555 X,Y,Z
+REMARK 290 2555 -X,-Y,Z+1/2
+REMARK 290 3555 -Y+1/2,X+1/2,Z+3/4
+REMARK 290 4555 Y+1/2,-X+1/2,Z+1/4
+REMARK 290 5555 -X+1/2,Y+1/2,-Z+3/4
+REMARK 290 6555 X+1/2,-Y+1/2,-Z+1/4
+REMARK 290 7555 Y,X,-Z
+REMARK 290 8555 -Y,-X,-Z+1/2
+REMARK 290
+REMARK 290 WHERE NNN -> OPERATOR NUMBER
+REMARK 290 MMM -> TRANSLATION VECTOR
+REMARK 290
+REMARK 290 CRYSTALLOGRAPHIC SYMMETRY TRANSFORMATIONS
+REMARK 290 THE FOLLOWING TRANSFORMATIONS OPERATE ON THE ATOM/HETATM
+REMARK 290 RECORDS IN THIS ENTRY TO PRODUCE CRYSTALLOGRAPHICALLY
+REMARK 290 RELATED MOLECULES.
+REMARK 290 SMTRY1 1 1.000000 0.000000 0.000000 0.00000
+REMARK 290 SMTRY2 1 0.000000 1.000000 0.000000 0.00000
+REMARK 290 SMTRY3 1 0.000000 0.000000 1.000000 0.00000
+REMARK 290 SMTRY1 2 -1.000000 0.000000 0.000000 0.00000
+REMARK 290 SMTRY2 2 0.000000 -1.000000 0.000000 0.00000
+REMARK 290 SMTRY3 2 0.000000 0.000000 1.000000 79.48350
+REMARK 290 SMTRY1 3 0.000000 -1.000000 0.000000 31.45050
+REMARK 290 SMTRY2 3 1.000000 0.000000 0.000000 31.45050
+REMARK 290 SMTRY3 3 0.000000 0.000000 1.000000 119.22525
+REMARK 290 SMTRY1 4 0.000000 1.000000 0.000000 31.45050
+REMARK 290 SMTRY2 4 -1.000000 0.000000 0.000000 31.45050
+REMARK 290 SMTRY3 4 0.000000 0.000000 1.000000 39.74175
+REMARK 290 SMTRY1 5 -1.000000 0.000000 0.000000 31.45050
+REMARK 290 SMTRY2 5 0.000000 1.000000 0.000000 31.45050
+REMARK 290 SMTRY3 5 0.000000 0.000000 -1.000000 119.22525
+REMARK 290 SMTRY1 6 1.000000 0.000000 0.000000 31.45050
+REMARK 290 SMTRY2 6 0.000000 -1.000000 0.000000 31.45050
+REMARK 290 SMTRY3 6 0.000000 0.000000 -1.000000 39.74175
+REMARK 290 SMTRY1 7 0.000000 1.000000 0.000000 0.00000
+REMARK 290 SMTRY2 7 1.000000 0.000000 0.000000 0.00000
+REMARK 290 SMTRY3 7 0.000000 0.000000 -1.000000 0.00000
+REMARK 290 SMTRY1 8 0.000000 -1.000000 0.000000 0.00000
+REMARK 290 SMTRY2 8 -1.000000 0.000000 0.000000 0.00000
+REMARK 290 SMTRY3 8 0.000000 0.000000 -1.000000 79.48350
+REMARK 290
+REMARK 290 REMARK: NULL
+REMARK 300
+REMARK 300 BIOMOLECULE: 1
+REMARK 300 SEE REMARK 350 FOR THE AUTHOR PROVIDED AND/OR PROGRAM
+REMARK 300 GENERATED ASSEMBLY INFORMATION FOR THE STRUCTURE IN
+REMARK 300 THIS ENTRY. THE REMARK MAY ALSO PROVIDE INFORMATION ON
+REMARK 300 BURIED SURFACE AREA.
+REMARK 350
+REMARK 350 COORDINATES FOR A COMPLETE MULTIMER REPRESENTING THE KNOWN
+REMARK 350 BIOLOGICALLY SIGNIFICANT OLIGOMERIZATION STATE OF THE
+REMARK 350 MOLECULE CAN BE GENERATED BY APPLYING BIOMT TRANSFORMATIONS
+REMARK 350 GIVEN BELOW. BOTH NON-CRYSTALLOGRAPHIC AND
+REMARK 350 CRYSTALLOGRAPHIC OPERATIONS ARE GIVEN.
+REMARK 350
+REMARK 350 BIOMOLECULE: 1
+REMARK 350 AUTHOR DETERMINED BIOLOGICAL UNIT: MONOMERIC
+REMARK 350 APPLY THE FOLLOWING TO CHAINS: A
+REMARK 350 BIOMT1 1 1.000000 0.000000 0.000000 0.00000
+REMARK 350 BIOMT2 1 0.000000 1.000000 0.000000 0.00000
+REMARK 350 BIOMT3 1 0.000000 0.000000 1.000000 0.00000
+REMARK 500
+REMARK 500 GEOMETRY AND STEREOCHEMISTRY
+REMARK 500 SUBTOPIC: CLOSE CONTACTS IN SAME ASYMMETRIC UNIT
+REMARK 500
+REMARK 500 THE FOLLOWING ATOMS ARE IN CLOSE CONTACT.
+REMARK 500
+REMARK 500 ATM1 RES C SSEQI ATM2 RES C SSEQI DISTANCE
+REMARK 500 O2' A A 20 O4' G A 21 2.13
+REMARK 500 O2' A A 20 OP2 G A 21 2.18
+REMARK 500
+REMARK 500 REMARK: NULL
+REMARK 500
+REMARK 500 GEOMETRY AND STEREOCHEMISTRY
+REMARK 500 SUBTOPIC: CLOSE CONTACTS
+REMARK 500
+REMARK 500 THE FOLLOWING ATOMS THAT ARE RELATED BY CRYSTALLOGRAPHIC
+REMARK 500 SYMMETRY ARE IN CLOSE CONTACT. AN ATOM LOCATED WITHIN 0.15
+REMARK 500 ANGSTROMS OF A SYMMETRY RELATED ATOM IS ASSUMED TO BE ON A
+REMARK 500 SPECIAL POSITION AND IS, THEREFORE, LISTED IN REMARK 375
+REMARK 500 INSTEAD OF REMARK 500. ATOMS WITH NON-BLANK ALTERNATE
+REMARK 500 LOCATION INDICATORS ARE NOT INCLUDED IN THE CALCULATIONS.
+REMARK 500
+REMARK 500 DISTANCE CUTOFF:
+REMARK 500 2.2 ANGSTROMS FOR CONTACTS NOT INVOLVING HYDROGEN ATOMS
+REMARK 500 1.6 ANGSTROMS FOR CONTACTS INVOLVING HYDROGEN ATOMS
+REMARK 500
+REMARK 500 ATM1 RES C SSEQI ATM2 RES C SSEQI SSYMOP DISTANCE
+REMARK 500 N3 IRI A 201 N3 IRI A 201 7555 1.02
+REMARK 500 IR IRI A 201 N3 IRI A 201 7555 2.10
+REMARK 500
+REMARK 500 REMARK: NULL
+REMARK 500
+REMARK 500 GEOMETRY AND STEREOCHEMISTRY
+REMARK 500 SUBTOPIC: COVALENT BOND LENGTHS
+REMARK 500
+REMARK 500 THE STEREOCHEMICAL PARAMETERS OF THE FOLLOWING RESIDUES
+REMARK 500 HAVE VALUES WHICH DEVIATE FROM EXPECTED VALUES BY MORE
+REMARK 500 THAN 6*RMSD (M=MODEL NUMBER; RES=RESIDUE NAME; C=CHAIN
+REMARK 500 IDENTIFIER; SSEQ=SEQUENCE NUMBER; I=INSERTION CODE).
+REMARK 500
+REMARK 500 STANDARD TABLE:
+REMARK 500 FORMAT: (10X,I3,1X,2(A3,1X,A1,I4,A1,1X,A4,3X),1X,F6.3)
+REMARK 500
+REMARK 500 EXPECTED VALUES PROTEIN: ENGH AND HUBER, 1999
+REMARK 500 EXPECTED VALUES NUCLEIC ACID: CLOWNEY ET AL 1996
+REMARK 500
+REMARK 500 M RES CSSEQI ATM1 RES CSSEQI ATM2 DEVIATION
+REMARK 500 G A 1 P G A 1 OP3 -0.078
+REMARK 500
+REMARK 500 REMARK: NULL
+REMARK 500
+REMARK 500 GEOMETRY AND STEREOCHEMISTRY
+REMARK 500 SUBTOPIC: COVALENT BOND ANGLES
+REMARK 500
+REMARK 500 THE STEREOCHEMICAL PARAMETERS OF THE FOLLOWING RESIDUES
+REMARK 500 HAVE VALUES WHICH DEVIATE FROM EXPECTED VALUES BY MORE
+REMARK 500 THAN 6*RMSD (M=MODEL NUMBER; RES=RESIDUE NAME; C=CHAIN
+REMARK 500 IDENTIFIER; SSEQ=SEQUENCE NUMBER; I=INSERTION CODE).
+REMARK 500
+REMARK 500 STANDARD TABLE:
+REMARK 500 FORMAT: (10X,I3,1X,A3,1X,A1,I4,A1,3(1X,A4,2X),12X,F5.1)
+REMARK 500
+REMARK 500 EXPECTED VALUES PROTEIN: ENGH AND HUBER, 1999
+REMARK 500 EXPECTED VALUES NUCLEIC ACID: CLOWNEY ET AL 1996
+REMARK 500
+REMARK 500 M RES CSSEQI ATM1 ATM2 ATM3
+REMARK 500 A A 9 C2' - C3' - O3' ANGL. DEV. = 12.3 DEGREES
+REMARK 500 A A 33 C2' - C3' - O3' ANGL. DEV. = 12.6 DEGREES
+REMARK 500 G A 50 C4' - C3' - O3' ANGL. DEV. = 13.7 DEGREES
+REMARK 500 G A 50 C2' - C3' - O3' ANGL. DEV. = 10.0 DEGREES
+REMARK 500 G A 50 N9 - C1' - C2' ANGL. DEV. = -8.2 DEGREES
+REMARK 500 U A 63 C2' - C3' - O3' ANGL. DEV. = 15.3 DEGREES
+REMARK 500 G A 74 C4' - C3' - O3' ANGL. DEV. = 12.7 DEGREES
+REMARK 500 G A 74 C2' - C3' - O3' ANGL. DEV. = 11.3 DEGREES
+REMARK 500 G A 74 N9 - C1' - C2' ANGL. DEV. = -7.3 DEGREES
+REMARK 500
+REMARK 500 REMARK: NULL
+REMARK 500
+REMARK 500 GEOMETRY AND STEREOCHEMISTRY
+REMARK 500 SUBTOPIC: PLANAR GROUPS
+REMARK 500
+REMARK 500 PLANAR GROUPS IN THE FOLLOWING RESIDUES HAVE A TOTAL
+REMARK 500 RMS DISTANCE OF ALL ATOMS FROM THE BEST-FIT PLANE
+REMARK 500 BY MORE THAN AN EXPECTED VALUE OF 6*RMSD, WITH AN
+REMARK 500 RMSD 0.02 ANGSTROMS, OR AT LEAST ONE ATOM HAS
+REMARK 500 AN RMSD GREATER THAN THIS VALUE
+REMARK 500 (M=MODEL NUMBER; RES=RESIDUE NAME; C=CHAIN IDENTIFIER;
+REMARK 500 SSEQ=SEQUENCE NUMBER; I=INSERTION CODE).
+REMARK 500
+REMARK 500 M RES CSSEQI RMS TYPE
+REMARK 500 G A 19 0.05 SIDE_CHAIN
+REMARK 500 G A 35 0.06 SIDE_CHAIN
+REMARK 500 G A 50 0.07 SIDE_CHAIN
+REMARK 500 U A 67 0.08 SIDE_CHAIN
+REMARK 500 G A 74 0.08 SIDE_CHAIN
+REMARK 500
+REMARK 500 REMARK: NULL
+REMARK 620
+REMARK 620 METAL COORDINATION
+REMARK 620 (M=MODEL NUMBER; RES=RESIDUE NAME; C=CHAIN IDENTIFIER;
+REMARK 620 SSEQ=SEQUENCE NUMBER; I=INSERTION CODE):
+REMARK 620
+REMARK 620 COORDINATION ANGLES FOR: M RES CSSEQI METAL
+REMARK 620 MG A 205 MG
+REMARK 620 N RES CSSEQI ATOM
+REMARK 620 1 A A 10 OP2
+REMARK 620 2 U A 63 O3' 95.0
+REMARK 620 3 U A 64 OP2 133.2 53.2
+REMARK 620 N 1 2
+REMARK 620
+REMARK 620 COORDINATION ANGLES FOR: M RES CSSEQI METAL
+REMARK 620 MG A 206 MG
+REMARK 620 N RES CSSEQI ATOM
+REMARK 620 1 A A 84 O5'
+REMARK 620 2 A A 84 O3' 115.5
+REMARK 620 3 A A 85 OP2 130.4 63.5
+REMARK 620 4 A A 84 OP1 62.8 164.4 130.5
+REMARK 620 N 1 2 3
+REMARK 800
+REMARK 800 SITE
+REMARK 800 SITE_IDENTIFIER: AC1
+REMARK 800 EVIDENCE_CODE: SOFTWARE
+REMARK 800 SITE_DESCRIPTION: BINDING SITE FOR RESIDUE MG A 205
+REMARK 800 SITE_IDENTIFIER: AC2
+REMARK 800 EVIDENCE_CODE: SOFTWARE
+REMARK 800 SITE_DESCRIPTION: BINDING SITE FOR RESIDUE MG A 206
+REMARK 800 SITE_IDENTIFIER: AC3
+REMARK 800 EVIDENCE_CODE: SOFTWARE
+REMARK 800 SITE_DESCRIPTION: BINDING SITE FOR RESIDUE IRI A 201
+REMARK 800 SITE_IDENTIFIER: AC4
+REMARK 800 EVIDENCE_CODE: SOFTWARE
+REMARK 800 SITE_DESCRIPTION: BINDING SITE FOR RESIDUE IRI A 202
+REMARK 800 SITE_IDENTIFIER: AC5
+REMARK 800 EVIDENCE_CODE: SOFTWARE
+REMARK 800 SITE_DESCRIPTION: BINDING SITE FOR RESIDUE IRI A 203
+REMARK 800 SITE_IDENTIFIER: AC6
+REMARK 800 EVIDENCE_CODE: SOFTWARE
+REMARK 800 SITE_DESCRIPTION: BINDING SITE FOR RESIDUE IRI A 204
+REMARK 800 SITE_IDENTIFIER: AC7
+REMARK 800 EVIDENCE_CODE: SOFTWARE
+REMARK 800 SITE_DESCRIPTION: BINDING SITE FOR RESIDUE SAM A 301
+DBREF 2GIS A 1 94 PDB 2GIS 2GIS 1 94
+SEQRES 1 A 94 G G C U U A U C A A G A G
+SEQRES 2 A 94 A G G U G G A G G G A C U
+SEQRES 3 A 94 G G C C C G A U G A A A C
+SEQRES 4 A 94 C C G G C A A C C A G A A
+SEQRES 5 A 94 A U G G U G C C A A U U C
+SEQRES 6 A 94 C U G C A G C G G A A A C
+SEQRES 7 A 94 G U U G A A A G A U G A G
+SEQRES 8 A 94 C C A
+HET MG A 205 1
+HET MG A 206 1
+HET IRI A 201 7
+HET IRI A 202 7
+HET IRI A 203 7
+HET IRI A 204 7
+HET SAM A 301 27
+HETNAM MG MAGNESIUM ION
+HETNAM IRI IRIDIUM HEXAMMINE ION
+HETNAM SAM S-ADENOSYLMETHIONINE
+FORMUL 2 MG 2(MG 2+)
+FORMUL 4 IRI 4(H18 IR N6 3+)
+FORMUL 8 SAM C15 H22 N6 O5 S
+FORMUL 9 HOH *88(H2 O)
+LINK MG MG A 205 OP2 A A 10 1555 1555 2.88
+LINK MG MG A 205 O3' U A 63 1555 1555 2.88
+LINK MG MG A 205 OP2 U A 64 1555 1555 2.42
+LINK MG MG A 206 O5' A A 84 1555 1555 1.93
+LINK MG MG A 206 O3' A A 84 1555 1555 2.35
+LINK MG MG A 206 OP2 A A 85 1555 1555 2.46
+LINK MG MG A 206 OP1 A A 84 1555 1555 2.71
+SITE 1 AC1 4 A A 9 A A 10 U A 63 U A 64
+SITE 1 AC2 2 A A 84 A A 85
+SITE 1 AC3 5 C A 31 G A 32 A A 33 U A 34
+SITE 2 AC3 5 HOH A 448
+SITE 1 AC4 6 G A 15 G A 16 U A 17 G A 18
+SITE 2 AC4 6 A A 36 A A 38
+SITE 1 AC5 6 G A 23 C A 25 U A 26 G A 27
+SITE 2 AC5 6 G A 28 C A 29
+SITE 1 AC6 6 U A 4 U A 5 A A 6 U A 88
+SITE 2 AC6 6 G A 89 HOH A 475
+SITE 1 AC7 11 U A 7 G A 11 A A 45 A A 46
+SITE 2 AC7 11 C A 47 U A 57 G A 58 C A 59
+SITE 3 AC7 11 U A 88 G A 89 HOH A 437
+CRYST1 62.901 62.901 158.967 90.00 90.00 90.00 P 43 21 2 8
+ORIGX1 1.000000 0.000000 0.000000 0.00000
+ORIGX2 0.000000 1.000000 0.000000 0.00000
+ORIGX3 0.000000 0.000000 1.000000 0.00000
+SCALE1 0.015898 0.000000 0.000000 0.00000
+SCALE2 0.000000 0.015898 0.000000 0.00000
+SCALE3 0.000000 0.000000 0.006291 0.00000
+ATOM 1 OP3 G A 1 66.836 54.358 31.023 1.00 83.72 O
+ATOM 2 P G A 1 66.932 54.717 32.506 1.00 83.64 P
+ATOM 3 OP1 G A 1 68.009 55.754 32.789 1.00 83.61 O
+ATOM 4 OP2 G A 1 65.585 55.074 33.126 1.00 82.16 O
+ATOM 5 O5' G A 1 67.440 53.379 33.287 1.00 79.65 O
+ATOM 6 C5' G A 1 68.672 52.742 32.913 1.00 73.57 C
+ATOM 7 C4' G A 1 69.247 51.962 34.076 1.00 70.37 C
+ATOM 8 O4' G A 1 69.770 52.884 35.073 1.00 66.83 O
+ATOM 9 C3' G A 1 68.269 51.092 34.851 1.00 68.85 C
+ATOM 10 O3' G A 1 68.072 49.836 34.215 1.00 68.87 O
+ATOM 11 C2' G A 1 68.974 50.952 36.194 1.00 66.89 C
+ATOM 12 O2' G A 1 70.032 50.011 36.151 1.00 66.32 O
+ATOM 13 C1' G A 1 69.560 52.353 36.371 1.00 64.13 C
+ATOM 14 N9 G A 1 68.630 53.226 37.076 1.00 60.62 N
+ATOM 15 C8 G A 1 67.918 54.269 36.547 1.00 60.07 C
+ATOM 16 N7 G A 1 67.123 54.838 37.412 1.00 59.30 N
+ATOM 17 C5 G A 1 67.331 54.130 38.585 1.00 57.00 C
+ATOM 18 C6 G A 1 66.738 54.282 39.860 1.00 55.77 C
+ATOM 19 O6 G A 1 65.881 55.106 40.221 1.00 56.93 O
+ATOM 20 N1 G A 1 67.233 53.352 40.767 1.00 54.01 N
+ATOM 21 C2 G A 1 68.178 52.396 40.480 1.00 55.22 C
+ATOM 22 N2 G A 1 68.526 51.581 41.489 1.00 54.38 N
+ATOM 23 N3 G A 1 68.740 52.247 39.288 1.00 56.29 N
+ATOM 24 C4 G A 1 68.270 53.140 38.397 1.00 57.86 C
+ATOM 25 P G A 2 66.612 49.156 34.222 1.00 69.18 P
+ATOM 26 OP1 G A 2 66.706 47.977 33.323 1.00 70.02 O
+ATOM 27 OP2 G A 2 65.566 50.194 33.985 1.00 68.86 O
+ATOM 28 O5' G A 2 66.442 48.597 35.701 1.00 66.97 O
+ATOM 29 C5' G A 2 67.276 47.544 36.152 1.00 62.30 C
+ATOM 30 C4' G A 2 67.252 47.457 37.651 1.00 59.60 C
+ATOM 31 O4' G A 2 67.506 48.784 38.198 1.00 56.42 O
+ATOM 32 C3' G A 2 65.898 47.105 38.233 1.00 59.17 C
+ATOM 33 O3' G A 2 65.645 45.711 38.175 1.00 60.55 O
+ATOM 34 C2' G A 2 66.007 47.655 39.650 1.00 56.90 C
+ATOM 35 O2' G A 2 66.780 46.829 40.499 1.00 57.29 O
+ATOM 36 C1' G A 2 66.787 48.946 39.405 1.00 54.02 C
+ATOM 37 N9 G A 2 65.942 50.127 39.299 1.00 50.64 N
+ATOM 38 C8 G A 2 65.753 50.932 38.206 1.00 50.83 C
+ATOM 39 N7 G A 2 64.944 51.936 38.442 1.00 50.61 N
+ATOM 40 C5 G A 2 64.573 51.774 39.768 1.00 48.72 C
+ATOM 41 C6 G A 2 63.723 52.556 40.584 1.00 48.85 C
+ATOM 42 O6 G A 2 63.108 53.584 40.289 1.00 50.52 O
+ATOM 43 N1 G A 2 63.627 52.034 41.866 1.00 48.14 N
+ATOM 44 C2 G A 2 64.268 50.902 42.311 1.00 47.93 C
+ATOM 45 N2 G A 2 64.035 50.543 43.580 1.00 47.56 N
+ATOM 46 N3 G A 2 65.071 50.172 41.568 1.00 48.14 N
+ATOM 47 C4 G A 2 65.177 50.661 40.312 1.00 49.83 C
+ATOM 48 P C A 3 64.129 45.193 38.109 1.00 60.96 P
+ATOM 49 OP1 C A 3 64.118 43.738 37.817 1.00 60.20 O
+ATOM 50 OP2 C A 3 63.355 46.126 37.249 1.00 61.70 O
+ATOM 51 O5' C A 3 63.587 45.427 39.585 1.00 60.54 O
+ATOM 52 C5' C A 3 63.884 44.512 40.626 1.00 55.75 C
+ATOM 53 C4' C A 3 63.184 44.934 41.889 1.00 53.73 C
+ATOM 54 O4' C A 3 63.549 46.312 42.172 1.00 52.44 O
+ATOM 55 C3' C A 3 61.674 45.025 41.777 1.00 53.43 C
+ATOM 56 O3' C A 3 61.022 43.789 41.941 1.00 55.57 O
+ATOM 57 C2' C A 3 61.321 45.978 42.898 1.00 51.46 C
+ATOM 58 O2' C A 3 61.402 45.337 44.151 1.00 52.96 O
+ATOM 59 C1' C A 3 62.458 46.978 42.787 1.00 49.83 C
+ATOM 60 N1 C A 3 62.072 48.135 41.979 1.00 46.39 N
+ATOM 61 C2 C A 3 61.207 49.065 42.547 1.00 45.76 C
+ATOM 62 O2 C A 3 60.800 48.861 43.692 1.00 47.45 O
+ATOM 63 N3 C A 3 60.831 50.152 41.837 1.00 43.39 N
+ATOM 64 C4 C A 3 61.290 50.323 40.602 1.00 44.39 C
+ATOM 65 N4 C A 3 60.911 51.413 39.948 1.00 44.48 N
+ATOM 66 C5 C A 3 62.168 49.382 39.986 1.00 45.55 C
+ATOM 67 C6 C A 3 62.534 48.309 40.707 1.00 46.04 C
+ATOM 68 P U A 4 59.622 43.553 41.204 1.00 57.98 P
+ATOM 69 OP1 U A 4 59.364 42.082 41.244 1.00 57.52 O
+ATOM 70 OP2 U A 4 59.681 44.265 39.900 1.00 59.29 O
+ATOM 71 O5' U A 4 58.561 44.348 42.088 1.00 53.55 O
+ATOM 72 C5' U A 4 58.363 44.011 43.446 1.00 53.36 C
+ATOM 73 C4' U A 4 57.410 44.981 44.081 1.00 55.02 C
+ATOM 74 O4' U A 4 57.989 46.313 44.050 1.00 55.96 O
+ATOM 75 C3' U A 4 56.097 45.142 43.346 1.00 57.18 C
+ATOM 76 O3' U A 4 55.179 44.108 43.677 1.00 60.33 O
+ATOM 77 C2' U A 4 55.642 46.516 43.814 1.00 54.53 C
+ATOM 78 O2' U A 4 55.165 46.437 45.140 1.00 55.14 O
+ATOM 79 C1' U A 4 56.967 47.272 43.829 1.00 52.98 C
+ATOM 80 N1 U A 4 57.269 47.986 42.580 1.00 49.42 N
+ATOM 81 C2 U A 4 56.614 49.174 42.350 1.00 47.24 C
+ATOM 82 O2 U A 4 55.771 49.612 43.103 1.00 45.38 O
+ATOM 83 N3 U A 4 56.978 49.829 41.207 1.00 46.59 N
+ATOM 84 C4 U A 4 57.903 49.416 40.282 1.00 48.90 C
+ATOM 85 O4 U A 4 58.117 50.111 39.282 1.00 50.34 O
+ATOM 86 C5 U A 4 58.523 48.162 40.580 1.00 48.98 C
+ATOM 87 C6 U A 4 58.187 47.505 41.691 1.00 49.39 C
+ATOM 88 P U A 5 54.205 43.531 42.537 1.00 60.31 P
+ATOM 89 OP1 U A 5 53.567 42.301 43.067 1.00 60.80 O
+ATOM 90 OP2 U A 5 54.982 43.466 41.269 1.00 61.31 O
+ATOM 91 O5' U A 5 53.102 44.672 42.382 1.00 57.62 O
+ATOM 92 C5' U A 5 52.176 44.937 43.427 1.00 56.18 C
+ATOM 93 C4' U A 5 51.450 46.221 43.143 1.00 55.97 C
+ATOM 94 O4' U A 5 52.432 47.275 43.039 1.00 55.58 O
+ATOM 95 C3' U A 5 50.695 46.272 41.826 1.00 56.58 C
+ATOM 96 O3' U A 5 49.393 45.733 41.981 1.00 58.63 O
+ATOM 97 C2' U A 5 50.663 47.767 41.536 1.00 55.50 C
+ATOM 98 O2' U A 5 49.696 48.452 42.301 1.00 56.71 O
+ATOM 99 C1' U A 5 52.048 48.188 42.023 1.00 54.24 C
+ATOM 100 N1 U A 5 53.071 48.125 40.974 1.00 50.31 N
+ATOM 101 C2 U A 5 53.197 49.208 40.124 1.00 48.81 C
+ATOM 102 O2 U A 5 52.488 50.194 40.204 1.00 48.14 O
+ATOM 103 N3 U A 5 54.188 49.091 39.181 1.00 47.64 N
+ATOM 104 C4 U A 5 55.044 48.019 39.011 1.00 49.86 C
+ATOM 105 O4 U A 5 55.897 48.060 38.122 1.00 53.10 O
+ATOM 106 C5 U A 5 54.843 46.933 39.930 1.00 49.29 C
+ATOM 107 C6 U A 5 53.886 47.020 40.854 1.00 48.98 C
+ATOM 108 P A A 6 48.651 45.080 40.719 1.00 60.24 P
+ATOM 109 OP1 A A 6 47.527 44.256 41.233 1.00 60.47 O
+ATOM 110 OP2 A A 6 49.696 44.440 39.882 1.00 58.91 O
+ATOM 111 O5' A A 6 48.047 46.341 39.956 1.00 56.95 O
+ATOM 112 C5' A A 6 47.050 47.139 40.571 1.00 55.21 C
+ATOM 113 C4' A A 6 46.808 48.385 39.760 1.00 56.41 C
+ATOM 114 O4' A A 6 47.992 49.219 39.787 1.00 56.16 O
+ATOM 115 C3' A A 6 46.574 48.148 38.285 1.00 57.58 C
+ATOM 116 O3' A A 6 45.232 47.755 38.032 1.00 59.85 O
+ATOM 117 C2' A A 6 46.960 49.491 37.679 1.00 55.59 C
+ATOM 118 O2' A A 6 45.980 50.474 37.905 1.00 56.04 O
+ATOM 119 C1' A A 6 48.163 49.859 38.536 1.00 53.99 C
+ATOM 120 N9 A A 6 49.425 49.404 37.958 1.00 52.37 N
+ATOM 121 C8 A A 6 50.091 48.223 38.172 1.00 52.73 C
+ATOM 122 N7 A A 6 51.212 48.119 37.495 1.00 50.40 N
+ATOM 123 C5 A A 6 51.282 49.309 36.791 1.00 48.95 C
+ATOM 124 C6 A A 6 52.220 49.810 35.895 1.00 49.10 C
+ATOM 125 N6 A A 6 53.319 49.157 35.543 1.00 49.07 N
+ATOM 126 N1 A A 6 51.991 51.030 35.360 1.00 49.55 N
+ATOM 127 C2 A A 6 50.892 51.689 35.721 1.00 49.92 C
+ATOM 128 N3 A A 6 49.936 51.324 36.564 1.00 51.13 N
+ATOM 129 C4 A A 6 50.192 50.108 37.068 1.00 50.04 C
+ATOM 130 P U A 7 44.942 46.678 36.880 1.00 60.77 P
+ATOM 131 OP1 U A 7 43.556 46.166 37.041 1.00 62.34 O
+ATOM 132 OP2 U A 7 46.083 45.727 36.862 1.00 60.86 O
+ATOM 133 O5' U A 7 45.014 47.576 35.575 1.00 58.27 O
+ATOM 134 C5' U A 7 44.309 48.807 35.537 1.00 56.31 C
+ATOM 135 C4' U A 7 44.796 49.660 34.396 1.00 55.63 C
+ATOM 136 O4' U A 7 46.124 50.175 34.690 1.00 53.71 O
+ATOM 137 C3' U A 7 44.989 48.897 33.106 1.00 55.41 C
+ATOM 138 O3' U A 7 43.761 48.723 32.432 1.00 57.39 O
+ATOM 139 C2' U A 7 45.975 49.781 32.356 1.00 54.03 C
+ATOM 140 O2' U A 7 45.344 50.895 31.752 1.00 54.05 O
+ATOM 141 C1' U A 7 46.877 50.253 33.497 1.00 51.60 C
+ATOM 142 N1 U A 7 48.069 49.414 33.644 1.00 48.98 N
+ATOM 143 C2 U A 7 49.147 49.744 32.880 1.00 47.41 C
+ATOM 144 O2 U A 7 49.125 50.684 32.101 1.00 50.13 O
+ATOM 145 N3 U A 7 50.245 48.941 33.048 1.00 44.70 N
+ATOM 146 C4 U A 7 50.360 47.854 33.884 1.00 44.88 C
+ATOM 147 O4 U A 7 51.421 47.226 33.925 1.00 43.14 O
+ATOM 148 C5 U A 7 49.192 47.568 34.642 1.00 45.41 C
+ATOM 149 C6 U A 7 48.109 48.343 34.502 1.00 48.51 C
+ATOM 150 P C A 8 43.662 47.638 31.261 1.00 59.85 P
+ATOM 151 OP1 C A 8 42.278 47.710 30.723 1.00 61.02 O
+ATOM 152 OP2 C A 8 44.188 46.346 31.770 1.00 59.29 O
+ATOM 153 O5' C A 8 44.678 48.182 30.158 1.00 58.48 O
+ATOM 154 C5' C A 8 44.351 49.334 29.392 1.00 56.82 C
+ATOM 155 C4' C A 8 45.288 49.473 28.222 1.00 58.23 C
+ATOM 156 O4' C A 8 46.602 49.835 28.707 1.00 57.92 O
+ATOM 157 C3' C A 8 45.519 48.211 27.410 1.00 58.66 C
+ATOM 158 O3' C A 8 44.512 48.077 26.413 1.00 61.50 O
+ATOM 159 C2' C A 8 46.870 48.491 26.771 1.00 57.69 C
+ATOM 160 O2' C A 8 46.744 49.342 25.647 1.00 56.83 O
+ATOM 161 C1' C A 8 47.593 49.232 27.896 1.00 56.12 C
+ATOM 162 N1 C A 8 48.418 48.363 28.744 1.00 53.94 N
+ATOM 163 C2 C A 8 49.783 48.292 28.489 1.00 52.97 C
+ATOM 164 O2 C A 8 50.251 48.967 27.565 1.00 54.92 O
+ATOM 165 N3 C A 8 50.560 47.493 29.251 1.00 50.44 N
+ATOM 166 C4 C A 8 50.013 46.784 30.242 1.00 49.28 C
+ATOM 167 N4 C A 8 50.812 46.013 30.966 1.00 47.57 N
+ATOM 168 C5 C A 8 48.619 46.840 30.530 1.00 50.26 C
+ATOM 169 C6 C A 8 47.865 47.635 29.762 1.00 52.95 C
+ATOM 170 P A A 9 44.220 46.636 25.756 1.00 62.39 P
+ATOM 171 OP1 A A 9 43.364 45.868 26.691 1.00 62.54 O
+ATOM 172 OP2 A A 9 45.505 46.055 25.302 1.00 62.79 O
+ATOM 173 O5' A A 9 43.321 46.991 24.492 1.00 64.20 O
+ATOM 174 C5' A A 9 43.849 46.942 23.173 1.00 69.12 C
+ATOM 175 C4' A A 9 42.837 47.488 22.188 1.00 71.94 C
+ATOM 176 O4' A A 9 41.791 46.511 21.961 1.00 74.83 O
+ATOM 177 C3' A A 9 42.121 48.739 22.656 1.00 71.21 C
+ATOM 178 O3' A A 9 42.375 49.964 21.965 1.00 68.03 O
+ATOM 179 C2' A A 9 40.779 48.297 23.235 1.00 73.66 C
+ATOM 180 O2' A A 9 39.714 49.146 22.861 1.00 73.60 O
+ATOM 181 C1' A A 9 40.588 46.912 22.594 1.00 77.57 C
+ATOM 182 N9 A A 9 40.229 45.843 23.530 1.00 83.33 N
+ATOM 183 C8 A A 9 40.530 45.749 24.869 1.00 84.98 C
+ATOM 184 N7 A A 9 40.113 44.636 25.429 1.00 87.16 N
+ATOM 185 C5 A A 9 39.485 43.954 24.394 1.00 88.00 C
+ATOM 186 C6 A A 9 38.840 42.694 24.335 1.00 89.06 C
+ATOM 187 N6 A A 9 38.726 41.864 25.379 1.00 88.96 N
+ATOM 188 N1 A A 9 38.314 42.312 23.147 1.00 89.43 N
+ATOM 189 C2 A A 9 38.439 43.138 22.097 1.00 89.45 C
+ATOM 190 N3 A A 9 39.028 44.337 22.025 1.00 88.20 N
+ATOM 191 C4 A A 9 39.536 44.692 23.221 1.00 86.70 C
+ATOM 192 P A A 10 41.514 50.352 20.666 1.00 61.47 P
+ATOM 193 OP1 A A 10 40.725 49.160 20.325 1.00 65.15 O
+ATOM 194 OP2 A A 10 42.447 50.920 19.669 1.00 65.52 O
+ATOM 195 O5' A A 10 40.538 51.510 21.159 1.00 61.29 O
+ATOM 196 C5' A A 10 39.126 51.356 21.085 1.00 61.12 C
+ATOM 197 C4' A A 10 38.435 52.547 21.702 1.00 61.27 C
+ATOM 198 O4' A A 10 38.545 52.487 23.140 1.00 61.33 O
+ATOM 199 C3' A A 10 39.017 53.894 21.326 1.00 60.56 C
+ATOM 200 O3' A A 10 38.418 54.348 20.136 1.00 62.31 O
+ATOM 201 C2' A A 10 38.590 54.770 22.486 1.00 60.01 C
+ATOM 202 O2' A A 10 37.262 55.220 22.354 1.00 61.63 O
+ATOM 203 C1' A A 10 38.702 53.795 23.654 1.00 60.36 C
+ATOM 204 N9 A A 10 39.993 53.847 24.327 1.00 60.66 N
+ATOM 205 C8 A A 10 40.916 52.837 24.411 1.00 60.47 C
+ATOM 206 N7 A A 10 41.969 53.145 25.124 1.00 62.84 N
+ATOM 207 C5 A A 10 41.727 54.453 25.533 1.00 62.66 C
+ATOM 208 C6 A A 10 42.457 55.346 26.339 1.00 62.24 C
+ATOM 209 N6 A A 10 43.621 55.042 26.911 1.00 63.38 N
+ATOM 210 N1 A A 10 41.939 56.573 26.545 1.00 62.82 N
+ATOM 211 C2 A A 10 40.765 56.873 25.983 1.00 62.56 C
+ATOM 212 N3 A A 10 39.981 56.121 25.217 1.00 62.85 N
+ATOM 213 C4 A A 10 40.523 54.905 25.030 1.00 62.24 C
+ATOM 214 P G A 11 39.283 55.186 19.092 1.00 64.09 P
+ATOM 215 OP1 G A 11 38.517 55.279 17.830 1.00 67.46 O
+ATOM 216 OP2 G A 11 40.632 54.579 19.093 1.00 65.72 O
+ATOM 217 O5' G A 11 39.385 56.634 19.737 1.00 64.27 O
+ATOM 218 C5' G A 11 38.238 57.286 20.263 1.00 65.57 C
+ATOM 219 C4' G A 11 38.672 58.430 21.142 1.00 66.04 C
+ATOM 220 O4' G A 11 39.266 57.913 22.356 1.00 66.05 O
+ATOM 221 C3' G A 11 39.753 59.293 20.527 1.00 66.30 C
+ATOM 222 O3' G A 11 39.131 60.294 19.737 1.00 68.41 O
+ATOM 223 C2' G A 11 40.417 59.895 21.755 1.00 65.85 C
+ATOM 224 O2' G A 11 39.667 60.970 22.273 1.00 68.84 O
+ATOM 225 C1' G A 11 40.345 58.737 22.749 1.00 65.15 C
+ATOM 226 N9 G A 11 41.537 57.901 22.820 1.00 64.75 N
+ATOM 227 C8 G A 11 41.777 56.766 22.093 1.00 63.49 C
+ATOM 228 N7 G A 11 42.910 56.195 22.394 1.00 64.89 N
+ATOM 229 C5 G A 11 43.455 57.007 23.378 1.00 64.88 C
+ATOM 230 C6 G A 11 44.666 56.884 24.103 1.00 64.13 C
+ATOM 231 O6 G A 11 45.526 55.999 24.029 1.00 64.41 O
+ATOM 232 N1 G A 11 44.830 57.926 25.000 1.00 64.36 N
+ATOM 233 C2 G A 11 43.947 58.946 25.189 1.00 65.00 C
+ATOM 234 N2 G A 11 44.297 59.851 26.098 1.00 68.08 N
+ATOM 235 N3 G A 11 42.807 59.069 24.535 1.00 65.84 N
+ATOM 236 C4 G A 11 42.627 58.071 23.645 1.00 65.62 C
+ATOM 237 P A A 12 39.589 60.508 18.216 1.00 72.17 P
+ATOM 238 OP1 A A 12 38.441 61.088 17.469 1.00 72.28 O
+ATOM 239 OP2 A A 12 40.202 59.237 17.756 1.00 71.67 O
+ATOM 240 O5' A A 12 40.736 61.612 18.310 1.00 73.09 O
+ATOM 241 C5' A A 12 40.436 62.931 18.755 1.00 74.99 C
+ATOM 242 C4' A A 12 41.689 63.630 19.220 1.00 76.06 C
+ATOM 243 O4' A A 12 42.252 62.910 20.347 1.00 75.60 O
+ATOM 244 C3' A A 12 42.811 63.640 18.200 1.00 77.69 C
+ATOM 245 O3' A A 12 42.666 64.736 17.314 1.00 84.06 O
+ATOM 246 C2' A A 12 44.049 63.806 19.063 1.00 76.03 C
+ATOM 247 O2' A A 12 44.266 65.155 19.407 1.00 74.27 O
+ATOM 248 C1' A A 12 43.669 62.990 20.300 1.00 75.72 C
+ATOM 249 N9 A A 12 44.223 61.636 20.328 1.00 75.30 N
+ATOM 250 C8 A A 12 44.108 60.649 19.388 1.00 74.14 C
+ATOM 251 N7 A A 12 44.736 59.544 19.705 1.00 74.09 N
+ATOM 252 C5 A A 12 45.300 59.823 20.941 1.00 74.63 C
+ATOM 253 C6 A A 12 46.096 59.060 21.819 1.00 74.42 C
+ATOM 254 N6 A A 12 46.478 57.808 21.578 1.00 72.95 N
+ATOM 255 N1 A A 12 46.490 59.638 22.971 1.00 74.65 N
+ATOM 256 C2 A A 12 46.104 60.888 23.220 1.00 74.97 C
+ATOM 257 N3 A A 12 45.361 61.704 22.480 1.00 75.87 N
+ATOM 258 C4 A A 12 44.989 61.105 21.338 1.00 75.00 C
+ATOM 259 P G A 13 42.588 64.456 15.747 1.00 89.08 P
+ATOM 260 OP1 G A 13 41.214 63.997 15.432 1.00 89.24 O
+ATOM 261 OP2 G A 13 43.757 63.599 15.410 1.00 88.56 O
+ATOM 262 O5' G A 13 42.840 65.858 15.051 1.00 92.85 O
+ATOM 263 C5' G A 13 43.609 65.918 13.855 1.00 99.27 C
+ATOM 264 C4' G A 13 44.119 67.311 13.644 1.00103.14 C
+ATOM 265 O4' G A 13 44.653 67.791 14.898 1.00103.90 O
+ATOM 266 C3' G A 13 45.283 67.411 12.672 1.00105.04 C
+ATOM 267 O3' G A 13 44.800 67.565 11.345 1.00108.37 O
+ATOM 268 C2' G A 13 45.964 68.692 13.125 1.00105.26 C
+ATOM 269 O2' G A 13 45.315 69.841 12.618 1.00104.89 O
+ATOM 270 C1' G A 13 45.756 68.625 14.639 1.00104.73 C
+ATOM 271 N9 G A 13 46.891 68.187 15.441 1.00104.87 N
+ATOM 272 C8 G A 13 47.268 66.915 15.809 1.00104.80 C
+ATOM 273 N7 G A 13 48.320 66.902 16.586 1.00104.77 N
+ATOM 274 C5 G A 13 48.654 68.244 16.726 1.00104.42 C
+ATOM 275 C6 G A 13 49.696 68.877 17.464 1.00103.88 C
+ATOM 276 O6 G A 13 50.565 68.363 18.184 1.00102.76 O
+ATOM 277 N1 G A 13 49.657 70.262 17.305 1.00104.10 N
+ATOM 278 C2 G A 13 48.734 70.949 16.541 1.00104.31 C
+ATOM 279 N2 G A 13 48.843 72.280 16.483 1.00103.88 N
+ATOM 280 N3 G A 13 47.769 70.373 15.873 1.00104.42 N
+ATOM 281 C4 G A 13 47.787 69.036 16.008 1.00104.66 C
+ATOM 282 P A A 14 44.891 66.334 10.322 1.00111.53 P
+ATOM 283 OP1 A A 14 43.610 65.588 10.429 1.00111.71 O
+ATOM 284 OP2 A A 14 46.174 65.631 10.568 1.00111.96 O
+ATOM 285 O5' A A 14 44.952 67.015 8.880 1.00113.37 O
+ATOM 286 C5' A A 14 46.163 67.595 8.388 1.00115.63 C
+ATOM 287 C4' A A 14 45.863 68.602 7.295 1.00117.25 C
+ATOM 288 O4' A A 14 45.362 67.887 6.140 1.00118.63 O
+ATOM 289 C3' A A 14 44.811 69.629 7.703 1.00117.39 C
+ATOM 290 O3' A A 14 45.367 70.922 7.924 1.00115.58 O
+ATOM 291 C2' A A 14 43.702 69.579 6.645 1.00118.52 C
+ATOM 292 O2' A A 14 43.661 70.767 5.878 1.00117.82 O
+ATOM 293 C1' A A 14 44.122 68.423 5.730 1.00119.51 C
+ATOM 294 N9 A A 14 43.165 67.322 5.573 1.00120.87 N
+ATOM 295 C8 A A 14 43.339 66.006 5.934 1.00121.79 C
+ATOM 296 N7 A A 14 42.327 65.231 5.622 1.00122.72 N
+ATOM 297 C5 A A 14 41.418 66.095 5.023 1.00122.75 C
+ATOM 298 C6 A A 14 40.141 65.887 4.464 1.00122.97 C
+ATOM 299 N6 A A 14 39.545 64.692 4.404 1.00123.09 N
+ATOM 300 N1 A A 14 39.493 66.962 3.957 1.00122.70 N
+ATOM 301 C2 A A 14 40.097 68.157 4.010 1.00122.76 C
+ATOM 302 N3 A A 14 41.296 68.477 4.503 1.00122.66 N
+ATOM 303 C4 A A 14 41.914 67.389 4.999 1.00122.06 C
+ATOM 304 P G A 15 46.313 71.178 9.199 1.00114.09 P
+ATOM 305 OP1 G A 15 47.669 70.679 8.842 1.00113.11 O
+ATOM 306 OP2 G A 15 45.634 70.652 10.411 1.00113.63 O
+ATOM 307 O5' G A 15 46.392 72.765 9.299 1.00110.78 O
+ATOM 308 C5' G A 15 47.622 73.436 9.083 1.00106.55 C
+ATOM 309 C4' G A 15 47.841 74.474 10.147 1.00104.29 C
+ATOM 310 O4' G A 15 47.457 73.923 11.434 1.00103.66 O
+ATOM 311 C3' G A 15 49.285 74.901 10.335 1.00103.12 C
+ATOM 312 O3' G A 15 49.677 75.893 9.400 1.00102.02 O
+ATOM 313 C2' G A 15 49.282 75.408 11.769 1.00102.62 C
+ATOM 314 O2' G A 15 48.760 76.718 11.867 1.00102.61 O
+ATOM 315 C1' G A 15 48.341 74.398 12.438 1.00102.79 C
+ATOM 316 N9 G A 15 49.064 73.248 12.975 1.00102.03 N
+ATOM 317 C8 G A 15 48.919 71.930 12.610 1.00101.72 C
+ATOM 318 N7 G A 15 49.732 71.131 13.246 1.00101.59 N
+ATOM 319 C5 G A 15 50.453 71.971 14.085 1.00101.16 C
+ATOM 320 C6 G A 15 51.487 71.679 15.022 1.00101.10 C
+ATOM 321 O6 G A 15 51.994 70.575 15.304 1.00101.15 O
+ATOM 322 N1 G A 15 51.932 72.833 15.662 1.00100.41 N
+ATOM 323 C2 G A 15 51.449 74.098 15.432 1.00 99.93 C
+ATOM 324 N2 G A 15 51.999 75.086 16.142 1.00 99.94 N
+ATOM 325 N3 G A 15 50.493 74.377 14.567 1.00100.17 N
+ATOM 326 C4 G A 15 50.045 73.278 13.935 1.00100.88 C
+ATOM 327 P G A 16 51.026 75.682 8.551 1.00101.42 P
+ATOM 328 OP1 G A 16 50.682 75.731 7.109 1.00102.83 O
+ATOM 329 OP2 G A 16 51.725 74.492 9.095 1.00101.20 O
+ATOM 330 O5' G A 16 51.919 76.949 8.908 1.00100.66 O
+ATOM 331 C5' G A 16 53.321 76.916 8.702 1.00100.34 C
+ATOM 332 C4' G A 16 54.036 77.485 9.896 1.00100.56 C
+ATOM 333 O4' G A 16 53.436 76.981 11.111 1.00 99.81 O
+ATOM 334 C3' G A 16 55.491 77.080 9.985 1.00101.38 C
+ATOM 335 O3' G A 16 56.265 77.979 9.201 1.00103.43 O
+ATOM 336 C2' G A 16 55.778 77.206 11.477 1.00100.28 C
+ATOM 337 O2' G A 16 56.066 78.524 11.885 1.00101.05 O
+ATOM 338 C1' G A 16 54.443 76.770 12.086 1.00 99.62 C
+ATOM 339 N9 G A 16 54.369 75.375 12.509 1.00 98.45 N
+ATOM 340 C8 G A 16 53.508 74.423 12.025 1.00 97.73 C
+ATOM 341 N7 G A 16 53.644 73.266 12.608 1.00 96.93 N
+ATOM 342 C5 G A 16 54.659 73.463 13.530 1.00 96.67 C
+ATOM 343 C6 G A 16 55.243 72.561 14.451 1.00 96.34 C
+ATOM 344 O6 G A 16 54.965 71.373 14.646 1.00 96.14 O
+ATOM 345 N1 G A 16 56.247 73.169 15.195 1.00 96.64 N
+ATOM 346 C2 G A 16 56.637 74.479 15.071 1.00 97.14 C
+ATOM 347 N2 G A 16 57.623 74.875 15.890 1.00 96.62 N
+ATOM 348 N3 G A 16 56.099 75.334 14.211 1.00 97.69 N
+ATOM 349 C4 G A 16 55.123 74.760 13.478 1.00 97.40 C
+ATOM 350 P U A 17 57.613 77.465 8.504 1.00105.06 P
+ATOM 351 OP1 U A 17 58.306 78.633 7.898 1.00106.21 O
+ATOM 352 OP2 U A 17 57.264 76.299 7.656 1.00105.45 O
+ATOM 353 O5' U A 17 58.481 76.978 9.742 1.00104.29 O
+ATOM 354 C5' U A 17 59.030 77.934 10.631 1.00105.27 C
+ATOM 355 C4' U A 17 60.024 77.281 11.542 1.00106.09 C
+ATOM 356 O4' U A 17 59.313 76.526 12.556 1.00106.80 O
+ATOM 357 C3' U A 17 60.896 76.236 10.865 1.00106.38 C
+ATOM 358 O3' U A 17 61.999 76.794 10.166 1.00105.97 O
+ATOM 359 C2' U A 17 61.333 75.377 12.039 1.00107.09 C
+ATOM 360 O2' U A 17 62.390 75.956 12.777 1.00107.37 O
+ATOM 361 C1' U A 17 60.062 75.368 12.886 1.00107.53 C
+ATOM 362 N1 U A 17 59.249 74.171 12.641 1.00108.23 N
+ATOM 363 C2 U A 17 59.727 72.987 13.165 1.00108.78 C
+ATOM 364 O2 U A 17 60.774 72.918 13.788 1.00108.71 O
+ATOM 365 N3 U A 17 58.941 71.889 12.933 1.00109.36 N
+ATOM 366 C4 U A 17 57.756 71.849 12.242 1.00109.57 C
+ATOM 367 O4 U A 17 57.161 70.773 12.132 1.00109.52 O
+ATOM 368 C5 U A 17 57.327 73.116 11.719 1.00109.14 C
+ATOM 369 C6 U A 17 58.072 74.209 11.933 1.00108.45 C
+ATOM 370 P G A 18 62.500 76.096 8.807 1.00105.66 P
+ATOM 371 OP1 G A 18 63.661 76.851 8.267 1.00106.51 O
+ATOM 372 OP2 G A 18 61.283 75.919 7.968 1.00105.50 O
+ATOM 373 O5' G A 18 63.018 74.668 9.285 1.00103.99 O
+ATOM 374 C5' G A 18 64.021 74.559 10.291 1.00102.43 C
+ATOM 375 C4' G A 18 64.199 73.117 10.695 1.00101.12 C
+ATOM 376 O4' G A 18 62.949 72.618 11.238 1.00100.63 O
+ATOM 377 C3' G A 18 64.527 72.165 9.556 1.00100.12 C
+ATOM 378 O3' G A 18 65.928 72.132 9.335 1.00 99.74 O
+ATOM 379 C2' G A 18 64.031 70.830 10.098 1.00 99.32 C
+ATOM 380 O2' G A 18 64.952 70.220 10.976 1.00 98.70 O
+ATOM 381 C1' G A 18 62.774 71.261 10.858 1.00 99.21 C
+ATOM 382 N9 G A 18 61.557 71.174 10.058 1.00 97.34 N
+ATOM 383 C8 G A 18 61.041 72.135 9.221 1.00 96.69 C
+ATOM 384 N7 G A 18 59.926 71.773 8.650 1.00 96.07 N
+ATOM 385 C5 G A 18 59.693 70.496 9.136 1.00 95.84 C
+ATOM 386 C6 G A 18 58.632 69.595 8.875 1.00 95.53 C
+ATOM 387 O6 G A 18 57.654 69.753 8.139 1.00 94.90 O
+ATOM 388 N1 G A 18 58.790 68.401 9.575 1.00 95.75 N
+ATOM 389 C2 G A 18 59.837 68.113 10.420 1.00 95.59 C
+ATOM 390 N2 G A 18 59.815 66.907 10.994 1.00 95.41 N
+ATOM 391 N3 G A 18 60.830 68.947 10.676 1.00 95.69 N
+ATOM 392 C4 G A 18 60.695 70.110 10.004 1.00 96.38 C
+ATOM 393 P G A 19 66.529 72.627 7.927 1.00100.83 P
+ATOM 394 OP1 G A 19 67.023 74.021 8.096 1.00101.74 O
+ATOM 395 OP2 G A 19 65.531 72.332 6.866 1.00 99.87 O
+ATOM 396 O5' G A 19 67.784 71.666 7.719 1.00 98.72 O
+ATOM 397 C5' G A 19 67.715 70.548 6.836 1.00 95.36 C
+ATOM 398 C4' G A 19 67.006 69.387 7.504 1.00 92.73 C
+ATOM 399 O4' G A 19 65.677 69.803 7.898 1.00 92.37 O
+ATOM 400 C3' G A 19 66.784 68.160 6.634 1.00 90.61 C
+ATOM 401 O3' G A 19 67.898 67.278 6.715 1.00 88.58 O
+ATOM 402 C2' G A 19 65.571 67.513 7.282 1.00 90.73 C
+ATOM 403 O2' G A 19 65.939 66.784 8.435 1.00 91.75 O
+ATOM 404 C1' G A 19 64.761 68.740 7.698 1.00 90.64 C
+ATOM 405 N9 G A 19 63.754 69.219 6.755 1.00 88.83 N
+ATOM 406 C8 G A 19 63.909 70.246 5.855 1.00 87.97 C
+ATOM 407 N7 G A 19 62.804 70.558 5.236 1.00 87.34 N
+ATOM 408 C5 G A 19 61.865 69.664 5.732 1.00 87.12 C
+ATOM 409 C6 G A 19 60.486 69.532 5.442 1.00 86.28 C
+ATOM 410 O6 G A 19 59.791 70.206 4.678 1.00 85.66 O
+ATOM 411 N1 G A 19 59.914 68.489 6.154 1.00 86.49 N
+ATOM 412 C2 G A 19 60.577 67.680 7.038 1.00 87.60 C
+ATOM 413 N2 G A 19 59.838 66.725 7.615 1.00 88.67 N
+ATOM 414 N3 G A 19 61.863 67.797 7.332 1.00 87.70 N
+ATOM 415 C4 G A 19 62.442 68.805 6.647 1.00 87.88 C
+ATOM 416 P A A 20 67.943 65.983 5.777 1.00 86.58 P
+ATOM 417 OP1 A A 20 69.331 65.483 5.704 1.00 86.40 O
+ATOM 418 OP2 A A 20 67.232 66.383 4.539 1.00 86.39 O
+ATOM 419 O5' A A 20 67.063 64.896 6.537 1.00 85.63 O
+ATOM 420 C5' A A 20 67.650 63.993 7.479 1.00 83.85 C
+ATOM 421 C4' A A 20 66.922 62.667 7.448 1.00 82.33 C
+ATOM 422 O4' A A 20 65.507 62.890 7.680 1.00 81.16 O
+ATOM 423 C3' A A 20 66.983 61.952 6.114 1.00 81.89 C
+ATOM 424 O3' A A 20 68.221 61.231 6.041 1.00 83.05 O
+ATOM 425 C2' A A 20 65.712 61.108 6.103 1.00 81.15 C
+ATOM 426 O2' A A 20 65.786 59.824 6.656 1.00 83.37 O
+ATOM 427 C1' A A 20 64.744 61.986 6.902 1.00 80.09 C
+ATOM 428 N9 A A 20 63.779 62.755 6.122 1.00 77.26 N
+ATOM 429 C8 A A 20 63.909 64.014 5.592 1.00 76.84 C
+ATOM 430 N7 A A 20 62.844 64.431 4.955 1.00 76.08 N
+ATOM 431 C5 A A 20 61.958 63.373 5.068 1.00 75.98 C
+ATOM 432 C6 A A 20 60.651 63.184 4.598 1.00 75.86 C
+ATOM 433 N6 A A 20 59.982 64.094 3.882 1.00 76.10 N
+ATOM 434 N1 A A 20 60.045 62.012 4.888 1.00 75.42 N
+ATOM 435 C2 A A 20 60.720 61.100 5.602 1.00 76.18 C
+ATOM 436 N3 A A 20 61.952 61.161 6.096 1.00 76.33 N
+ATOM 437 C4 A A 20 62.522 62.336 5.786 1.00 76.27 C
+ATOM 438 P G A 21 68.416 59.835 6.842 1.00 83.99 P
+ATOM 439 OP1 G A 21 69.871 59.617 7.084 1.00 82.93 O
+ATOM 440 OP2 G A 21 67.632 58.787 6.129 1.00 85.06 O
+ATOM 441 O5' G A 21 67.758 60.103 8.267 1.00 81.30 O
+ATOM 442 C5' G A 21 67.378 59.027 9.123 1.00 78.72 C
+ATOM 443 C4' G A 21 66.027 59.321 9.725 1.00 78.10 C
+ATOM 444 O4' G A 21 65.080 59.521 8.640 1.00 78.26 O
+ATOM 445 C3' G A 21 65.380 58.242 10.572 1.00 76.75 C
+ATOM 446 O3' G A 21 65.797 58.230 11.918 1.00 75.15 O
+ATOM 447 C2' G A 21 63.914 58.615 10.469 1.00 77.51 C
+ATOM 448 O2' G A 21 63.635 59.759 11.250 1.00 78.02 O
+ATOM 449 C1' G A 21 63.821 58.986 8.994 1.00 78.22 C
+ATOM 450 N9 G A 21 63.595 57.775 8.211 1.00 78.46 N
+ATOM 451 C8 G A 21 64.527 57.004 7.558 1.00 78.61 C
+ATOM 452 N7 G A 21 64.008 55.947 6.988 1.00 79.65 N
+ATOM 453 C5 G A 21 62.651 56.035 7.272 1.00 79.52 C
+ATOM 454 C6 G A 21 61.569 55.176 6.920 1.00 79.20 C
+ATOM 455 O6 G A 21 61.593 54.121 6.262 1.00 77.93 O
+ATOM 456 N1 G A 21 60.362 55.653 7.420 1.00 79.94 N
+ATOM 457 C2 G A 21 60.211 56.801 8.162 1.00 80.08 C
+ATOM 458 N2 G A 21 58.978 57.110 8.559 1.00 80.92 N
+ATOM 459 N3 G A 21 61.202 57.597 8.494 1.00 79.71 N
+ATOM 460 C4 G A 21 62.383 57.161 8.020 1.00 79.25 C
+ATOM 461 P G A 22 65.553 56.907 12.788 1.00 75.22 P
+ATOM 462 OP1 G A 22 66.079 57.154 14.161 1.00 76.23 O
+ATOM 463 OP2 G A 22 66.048 55.739 12.002 1.00 74.26 O
+ATOM 464 O5' G A 22 63.966 56.780 12.860 1.00 74.14 O
+ATOM 465 C5' G A 22 63.189 57.768 13.513 1.00 71.88 C
+ATOM 466 C4' G A 22 61.736 57.364 13.541 1.00 70.11 C
+ATOM 467 O4' G A 22 61.245 57.258 12.173 1.00 69.75 O
+ATOM 468 C3' G A 22 61.479 55.972 14.091 1.00 69.37 C
+ATOM 469 O3' G A 22 61.441 55.892 15.497 1.00 68.01 O
+ATOM 470 C2' G A 22 60.128 55.634 13.493 1.00 69.71 C
+ATOM 471 O2' G A 22 59.080 56.284 14.172 1.00 69.55 O
+ATOM 472 C1' G A 22 60.269 56.226 12.097 1.00 70.83 C
+ATOM 473 N9 G A 22 60.698 55.184 11.167 1.00 71.65 N
+ATOM 474 C8 G A 22 61.942 54.973 10.631 1.00 71.65 C
+ATOM 475 N7 G A 22 61.995 53.916 9.865 1.00 72.21 N
+ATOM 476 C5 G A 22 60.704 53.408 9.890 1.00 71.92 C
+ATOM 477 C6 G A 22 60.149 52.278 9.247 1.00 71.25 C
+ATOM 478 O6 G A 22 60.704 51.471 8.496 1.00 71.85 O
+ATOM 479 N1 G A 22 58.797 52.130 9.550 1.00 71.46 N
+ATOM 480 C2 G A 22 58.071 52.964 10.362 1.00 71.45 C
+ATOM 481 N2 G A 22 56.779 52.662 10.534 1.00 71.19 N
+ATOM 482 N3 G A 22 58.578 54.021 10.962 1.00 72.00 N
+ATOM 483 C4 G A 22 59.891 54.181 10.684 1.00 72.15 C
+ATOM 484 P G A 23 61.563 54.455 16.191 1.00 67.32 P
+ATOM 485 OP1 G A 23 61.633 54.663 17.661 1.00 67.78 O
+ATOM 486 OP2 G A 23 62.665 53.751 15.493 1.00 67.92 O
+ATOM 487 O5' G A 23 60.178 53.745 15.842 1.00 66.55 O
+ATOM 488 C5' G A 23 58.959 54.370 16.209 1.00 66.95 C
+ATOM 489 C4' G A 23 57.770 53.491 15.901 1.00 66.33 C
+ATOM 490 O4' G A 23 57.553 53.426 14.460 1.00 66.90 O
+ATOM 491 C3' G A 23 57.922 52.034 16.291 1.00 66.34 C
+ATOM 492 O3' G A 23 57.682 51.787 17.656 1.00 69.23 O
+ATOM 493 C2' G A 23 56.884 51.359 15.412 1.00 64.38 C
+ATOM 494 O2' G A 23 55.584 51.547 15.920 1.00 61.23 O
+ATOM 495 C1' G A 23 57.037 52.146 14.114 1.00 64.35 C
+ATOM 496 N9 G A 23 57.967 51.457 13.227 1.00 63.89 N
+ATOM 497 C8 G A 23 59.306 51.697 13.043 1.00 63.75 C
+ATOM 498 N7 G A 23 59.868 50.849 12.223 1.00 64.11 N
+ATOM 499 C5 G A 23 58.831 50.010 11.833 1.00 62.97 C
+ATOM 500 C6 G A 23 58.825 48.887 10.958 1.00 62.43 C
+ATOM 501 O6 G A 23 59.769 48.388 10.326 1.00 63.41 O
+ATOM 502 N1 G A 23 57.556 48.332 10.852 1.00 61.36 N
+ATOM 503 C2 G A 23 56.437 48.785 11.502 1.00 60.60 C
+ATOM 504 N2 G A 23 55.296 48.112 11.268 1.00 60.05 N
+ATOM 505 N3 G A 23 56.431 49.822 12.322 1.00 61.58 N
+ATOM 506 C4 G A 23 57.652 50.383 12.437 1.00 62.69 C
+ATOM 507 P A A 24 58.081 50.365 18.262 1.00 70.89 P
+ATOM 508 OP1 A A 24 58.882 49.647 17.244 1.00 73.17 O
+ATOM 509 OP2 A A 24 56.848 49.740 18.787 1.00 72.21 O
+ATOM 510 O5' A A 24 59.039 50.727 19.478 1.00 71.11 O
+ATOM 511 C5' A A 24 60.110 51.657 19.320 1.00 70.21 C
+ATOM 512 C4' A A 24 61.356 51.123 19.985 1.00 68.55 C
+ATOM 513 O4' A A 24 61.028 50.722 21.337 1.00 67.16 O
+ATOM 514 C3' A A 24 61.944 49.873 19.358 1.00 69.42 C
+ATOM 515 O3' A A 24 62.824 50.253 18.304 1.00 71.85 O
+ATOM 516 C2' A A 24 62.695 49.249 20.531 1.00 67.92 C
+ATOM 517 O2' A A 24 63.935 49.871 20.803 1.00 69.68 O
+ATOM 518 C1' A A 24 61.752 49.558 21.688 1.00 64.41 C
+ATOM 519 N9 A A 24 60.780 48.506 21.963 1.00 60.75 N
+ATOM 520 C8 A A 24 59.468 48.471 21.572 1.00 59.22 C
+ATOM 521 N7 A A 24 58.812 47.425 22.015 1.00 59.13 N
+ATOM 522 C5 A A 24 59.761 46.720 22.737 1.00 58.33 C
+ATOM 523 C6 A A 24 59.689 45.530 23.474 1.00 58.17 C
+ATOM 524 N6 A A 24 58.567 44.818 23.625 1.00 58.76 N
+ATOM 525 N1 A A 24 60.816 45.090 24.067 1.00 58.32 N
+ATOM 526 C2 A A 24 61.931 45.814 23.930 1.00 60.28 C
+ATOM 527 N3 A A 24 62.122 46.959 23.277 1.00 61.00 N
+ATOM 528 C4 A A 24 60.983 47.364 22.697 1.00 60.30 C
+ATOM 529 P C A 25 63.295 49.164 17.228 1.00 72.52 P
+ATOM 530 OP1 C A 25 64.442 49.734 16.487 1.00 70.92 O
+ATOM 531 OP2 C A 25 62.101 48.674 16.477 1.00 74.42 O
+ATOM 532 O5' C A 25 63.825 47.968 18.134 1.00 71.83 O
+ATOM 533 C5' C A 25 65.165 47.952 18.598 1.00 72.62 C
+ATOM 534 C4' C A 25 65.485 46.606 19.185 1.00 74.39 C
+ATOM 535 O4' C A 25 64.558 46.356 20.273 1.00 73.10 O
+ATOM 536 C3' C A 25 65.263 45.426 18.250 1.00 76.56 C
+ATOM 537 O3' C A 25 66.392 45.192 17.419 1.00 81.10 O
+ATOM 538 C2' C A 25 65.043 44.274 19.223 1.00 74.88 C
+ATOM 539 O2' C A 25 66.249 43.738 19.735 1.00 75.19 O
+ATOM 540 C1' C A 25 64.261 44.972 20.335 1.00 72.77 C
+ATOM 541 N1 C A 25 62.813 44.801 20.227 1.00 71.71 N
+ATOM 542 C2 C A 25 62.260 43.662 20.760 1.00 71.83 C
+ATOM 543 O2 C A 25 63.013 42.827 21.270 1.00 73.95 O
+ATOM 544 N3 C A 25 60.927 43.481 20.711 1.00 70.88 N
+ATOM 545 C4 C A 25 60.155 44.391 20.139 1.00 69.84 C
+ATOM 546 N4 C A 25 58.841 44.155 20.123 1.00 70.13 N
+ATOM 547 C5 C A 25 60.695 45.576 19.562 1.00 69.41 C
+ATOM 548 C6 C A 25 62.022 45.740 19.626 1.00 70.68 C
+ATOM 549 P U A 26 66.238 44.250 16.126 1.00 85.16 P
+ATOM 550 OP1 U A 26 67.594 43.929 15.605 1.00 84.53 O
+ATOM 551 OP2 U A 26 65.243 44.884 15.235 1.00 85.22 O
+ATOM 552 O5' U A 26 65.582 42.908 16.686 1.00 83.10 O
+ATOM 553 C5' U A 26 66.404 41.853 17.168 1.00 83.06 C
+ATOM 554 C4' U A 26 65.751 40.520 16.911 1.00 82.90 C
+ATOM 555 O4' U A 26 64.618 40.350 17.795 1.00 83.33 O
+ATOM 556 C3' U A 26 65.164 40.371 15.525 1.00 82.05 C
+ATOM 557 O3' U A 26 66.184 39.990 14.616 1.00 81.59 O
+ATOM 558 C2' U A 26 64.113 39.289 15.737 1.00 82.83 C
+ATOM 559 O2' U A 26 64.643 37.983 15.780 1.00 83.21 O
+ATOM 560 C1' U A 26 63.594 39.639 17.129 1.00 83.33 C
+ATOM 561 N1 U A 26 62.387 40.475 17.115 1.00 84.07 N
+ATOM 562 C2 U A 26 61.168 39.833 17.084 1.00 84.45 C
+ATOM 563 O2 U A 26 61.060 38.619 17.070 1.00 84.31 O
+ATOM 564 N3 U A 26 60.076 40.662 17.073 1.00 84.96 N
+ATOM 565 C4 U A 26 60.082 42.039 17.090 1.00 85.37 C
+ATOM 566 O4 U A 26 59.012 42.648 17.081 1.00 85.84 O
+ATOM 567 C5 U A 26 61.383 42.627 17.120 1.00 84.60 C
+ATOM 568 C6 U A 26 62.465 41.842 17.132 1.00 84.27 C
+ATOM 569 P G A 27 66.132 40.515 13.104 1.00 81.65 P
+ATOM 570 OP1 G A 27 67.350 40.038 12.413 1.00 83.23 O
+ATOM 571 OP2 G A 27 65.837 41.963 13.132 1.00 82.55 O
+ATOM 572 O5' G A 27 64.885 39.731 12.503 1.00 80.51 O
+ATOM 573 C5' G A 27 64.935 38.317 12.376 1.00 78.28 C
+ATOM 574 C4' G A 27 63.552 37.741 12.178 1.00 77.67 C
+ATOM 575 O4' G A 27 62.747 38.009 13.362 1.00 77.49 O
+ATOM 576 C3' G A 27 62.728 38.306 11.023 1.00 76.44 C
+ATOM 577 O3' G A 27 63.058 37.664 9.795 1.00 75.91 O
+ATOM 578 C2' G A 27 61.311 37.972 11.470 1.00 76.07 C
+ATOM 579 O2' G A 27 61.007 36.613 11.242 1.00 74.28 O
+ATOM 580 C1' G A 27 61.397 38.227 12.979 1.00 76.21 C
+ATOM 581 N9 G A 27 61.016 39.598 13.319 1.00 74.43 N
+ATOM 582 C8 G A 27 61.838 40.697 13.410 1.00 74.12 C
+ATOM 583 N7 G A 27 61.190 41.800 13.682 1.00 73.38 N
+ATOM 584 C5 G A 27 59.863 41.404 13.788 1.00 72.40 C
+ATOM 585 C6 G A 27 58.695 42.162 14.067 1.00 71.55 C
+ATOM 586 O6 G A 27 58.592 43.386 14.280 1.00 70.85 O
+ATOM 587 N1 G A 27 57.559 41.356 14.086 1.00 70.35 N
+ATOM 588 C2 G A 27 57.544 40.002 13.863 1.00 70.15 C
+ATOM 589 N2 G A 27 56.350 39.400 13.926 1.00 68.30 N
+ATOM 590 N3 G A 27 58.623 39.288 13.598 1.00 71.70 N
+ATOM 591 C4 G A 27 59.740 40.047 13.577 1.00 72.98 C
+ATOM 592 P G A 28 62.365 38.133 8.409 1.00 76.89 P
+ATOM 593 OP1 G A 28 62.160 36.878 7.623 1.00 77.47 O
+ATOM 594 OP2 G A 28 63.124 39.269 7.796 1.00 75.40 O
+ATOM 595 O5' G A 28 60.924 38.672 8.823 1.00 76.26 O
+ATOM 596 C5' G A 28 60.164 39.487 7.926 1.00 73.92 C
+ATOM 597 C4' G A 28 58.705 39.462 8.314 1.00 71.92 C
+ATOM 598 O4' G A 28 58.573 39.835 9.714 1.00 71.54 O
+ATOM 599 C3' G A 28 57.811 40.439 7.565 1.00 70.88 C
+ATOM 600 O3' G A 28 57.367 39.868 6.331 1.00 69.61 O
+ATOM 601 C2' G A 28 56.656 40.616 8.546 1.00 70.99 C
+ATOM 602 O2' G A 28 55.717 39.557 8.480 1.00 71.07 O
+ATOM 603 C1' G A 28 57.387 40.587 9.894 1.00 71.11 C
+ATOM 604 N9 G A 28 57.746 41.916 10.380 1.00 70.31 N
+ATOM 605 C8 G A 28 58.962 42.543 10.281 1.00 70.75 C
+ATOM 606 N7 G A 28 58.958 43.747 10.782 1.00 70.48 N
+ATOM 607 C5 G A 28 57.663 43.920 11.251 1.00 69.56 C
+ATOM 608 C6 G A 28 57.055 45.027 11.906 1.00 69.08 C
+ATOM 609 O6 G A 28 57.557 46.119 12.224 1.00 68.50 O
+ATOM 610 N1 G A 28 55.724 44.771 12.202 1.00 69.21 N
+ATOM 611 C2 G A 28 55.060 43.608 11.915 1.00 69.07 C
+ATOM 612 N2 G A 28 53.767 43.555 12.280 1.00 68.80 N
+ATOM 613 N3 G A 28 55.616 42.572 11.315 1.00 69.71 N
+ATOM 614 C4 G A 28 56.906 42.797 11.014 1.00 69.55 C
+ATOM 615 P C A 29 57.271 40.780 5.008 1.00 67.90 P
+ATOM 616 OP1 C A 29 56.896 39.914 3.864 1.00 70.57 O
+ATOM 617 OP2 C A 29 58.508 41.596 4.940 1.00 69.03 O
+ATOM 618 O5' C A 29 56.055 41.759 5.299 1.00 66.35 O
+ATOM 619 C5' C A 29 54.758 41.248 5.567 1.00 62.83 C
+ATOM 620 C4' C A 29 53.946 42.279 6.308 1.00 62.09 C
+ATOM 621 O4' C A 29 54.537 42.496 7.619 1.00 59.41 O
+ATOM 622 C3' C A 29 53.949 43.661 5.684 1.00 62.50 C
+ATOM 623 O3' C A 29 53.018 43.803 4.618 1.00 64.25 O
+ATOM 624 C2' C A 29 53.618 44.546 6.876 1.00 61.37 C
+ATOM 625 O2' C A 29 52.234 44.525 7.187 1.00 61.74 O
+ATOM 626 C1' C A 29 54.421 43.860 7.981 1.00 59.52 C
+ATOM 627 N1 C A 29 55.777 44.424 8.092 1.00 59.57 N
+ATOM 628 C2 C A 29 55.950 45.631 8.772 1.00 59.50 C
+ATOM 629 O2 C A 29 54.973 46.175 9.280 1.00 60.54 O
+ATOM 630 N3 C A 29 57.180 46.174 8.858 1.00 59.71 N
+ATOM 631 C4 C A 29 58.225 45.562 8.299 1.00 59.10 C
+ATOM 632 N4 C A 29 59.412 46.152 8.405 1.00 56.50 N
+ATOM 633 C5 C A 29 58.091 44.321 7.607 1.00 59.16 C
+ATOM 634 C6 C A 29 56.856 43.790 7.529 1.00 59.74 C
+ATOM 635 P C A 30 53.015 45.164 3.761 1.00 65.71 P
+ATOM 636 OP1 C A 30 51.995 45.078 2.682 1.00 66.48 O
+ATOM 637 OP2 C A 30 54.428 45.487 3.422 1.00 64.15 O
+ATOM 638 O5' C A 30 52.539 46.252 4.817 1.00 66.68 O
+ATOM 639 C5' C A 30 52.834 47.619 4.624 1.00 66.07 C
+ATOM 640 C4' C A 30 52.552 48.383 5.883 1.00 64.24 C
+ATOM 641 O4' C A 30 53.379 47.875 6.961 1.00 63.99 O
+ATOM 642 C3' C A 30 52.853 49.863 5.817 1.00 63.38 C
+ATOM 643 O3' C A 30 51.704 50.500 5.285 1.00 63.48 O
+ATOM 644 C2' C A 30 53.060 50.195 7.287 1.00 63.64 C
+ATOM 645 O2' C A 30 51.818 50.289 7.955 1.00 63.72 O
+ATOM 646 C1' C A 30 53.793 48.945 7.782 1.00 63.35 C
+ATOM 647 N1 C A 30 55.243 49.051 7.628 1.00 63.96 N
+ATOM 648 C2 C A 30 55.945 49.948 8.418 1.00 64.30 C
+ATOM 649 O2 C A 30 55.330 50.610 9.257 1.00 66.15 O
+ATOM 650 N3 C A 30 57.280 50.073 8.250 1.00 64.07 N
+ATOM 651 C4 C A 30 57.909 49.334 7.339 1.00 63.26 C
+ATOM 652 N4 C A 30 59.218 49.497 7.206 1.00 63.72 N
+ATOM 653 C5 C A 30 57.220 48.395 6.526 1.00 63.27 C
+ATOM 654 C6 C A 30 55.897 48.284 6.704 1.00 64.28 C
+ATOM 655 P C A 31 51.870 51.754 4.306 1.00 64.41 P
+ATOM 656 OP1 C A 31 50.528 52.130 3.784 1.00 63.20 O
+ATOM 657 OP2 C A 31 52.983 51.484 3.365 1.00 63.17 O
+ATOM 658 O5' C A 31 52.369 52.895 5.282 1.00 63.89 O
+ATOM 659 C5' C A 31 51.578 53.280 6.382 1.00 63.36 C
+ATOM 660 C4' C A 31 52.287 54.339 7.160 1.00 63.12 C
+ATOM 661 O4' C A 31 53.352 53.730 7.927 1.00 63.91 O
+ATOM 662 C3' C A 31 53.003 55.344 6.284 1.00 61.70 C
+ATOM 663 O3' C A 31 52.113 56.345 5.844 1.00 61.08 O
+ATOM 664 C2' C A 31 54.052 55.885 7.231 1.00 62.18 C
+ATOM 665 O2' C A 31 53.483 56.788 8.145 1.00 62.99 O
+ATOM 666 C1' C A 31 54.443 54.622 7.990 1.00 63.19 C
+ATOM 667 N1 C A 31 55.620 53.977 7.410 1.00 63.84 N
+ATOM 668 C2 C A 31 56.831 54.589 7.597 1.00 63.43 C
+ATOM 669 O2 C A 31 56.855 55.634 8.245 1.00 64.84 O
+ATOM 670 N3 C A 31 57.946 54.041 7.081 1.00 63.21 N
+ATOM 671 C4 C A 31 57.872 52.902 6.402 1.00 64.27 C
+ATOM 672 N4 C A 31 59.010 52.390 5.922 1.00 64.98 N
+ATOM 673 C5 C A 31 56.633 52.238 6.190 1.00 65.15 C
+ATOM 674 C6 C A 31 55.535 52.809 6.707 1.00 64.47 C
+ATOM 675 P G A 32 52.458 57.185 4.523 1.00 62.37 P
+ATOM 676 OP1 G A 32 51.396 58.213 4.397 1.00 60.41 O
+ATOM 677 OP2 G A 32 52.715 56.238 3.403 1.00 60.94 O
+ATOM 678 O5' G A 32 53.835 57.910 4.866 1.00 63.18 O
+ATOM 679 C5' G A 32 53.847 59.093 5.641 1.00 62.39 C
+ATOM 680 C4' G A 32 55.228 59.676 5.680 1.00 63.39 C
+ATOM 681 O4' G A 32 56.105 58.751 6.367 1.00 64.76 O
+ATOM 682 C3' G A 32 55.889 59.815 4.326 1.00 64.49 C
+ATOM 683 O3' G A 32 55.509 60.970 3.617 1.00 65.91 O
+ATOM 684 C2' G A 32 57.362 59.837 4.675 1.00 65.04 C
+ATOM 685 O2' G A 32 57.780 61.102 5.143 1.00 64.75 O
+ATOM 686 C1' G A 32 57.404 58.811 5.800 1.00 64.89 C
+ATOM 687 N9 G A 32 57.744 57.503 5.264 1.00 66.38 N
+ATOM 688 C8 G A 32 56.907 56.435 5.060 1.00 68.11 C
+ATOM 689 N7 G A 32 57.510 55.412 4.521 1.00 69.20 N
+ATOM 690 C5 G A 32 58.823 55.836 4.361 1.00 68.47 C
+ATOM 691 C6 G A 32 59.932 55.175 3.806 1.00 69.12 C
+ATOM 692 O6 G A 32 59.980 54.056 3.304 1.00 71.60 O
+ATOM 693 N1 G A 32 61.076 55.961 3.856 1.00 69.48 N
+ATOM 694 C2 G A 32 61.139 57.234 4.358 1.00 69.13 C
+ATOM 695 N2 G A 32 62.336 57.831 4.314 1.00 68.48 N
+ATOM 696 N3 G A 32 60.103 57.870 4.863 1.00 68.83 N
+ATOM 697 C4 G A 32 58.984 57.116 4.833 1.00 67.70 C
+ATOM 698 P A A 33 55.228 60.837 2.054 1.00 67.60 P
+ATOM 699 OP1 A A 33 53.763 60.625 1.905 1.00 65.92 O
+ATOM 700 OP2 A A 33 56.180 59.801 1.567 1.00 67.33 O
+ATOM 701 O5' A A 33 55.593 62.258 1.434 1.00 67.76 O
+ATOM 702 C5' A A 33 56.865 62.878 1.641 1.00 69.76 C
+ATOM 703 C4' A A 33 56.994 64.038 0.684 1.00 71.33 C
+ATOM 704 O4' A A 33 58.204 64.805 0.937 1.00 71.47 O
+ATOM 705 C3' A A 33 57.125 63.544 -0.740 1.00 72.06 C
+ATOM 706 O3' A A 33 56.034 63.736 -1.619 1.00 74.07 O
+ATOM 707 C2' A A 33 58.602 63.589 -1.112 1.00 71.79 C
+ATOM 708 O2' A A 33 58.810 64.058 -2.429 1.00 71.97 O
+ATOM 709 C1' A A 33 59.144 64.615 -0.110 1.00 70.81 C
+ATOM 710 N9 A A 33 60.441 64.313 0.492 1.00 69.50 N
+ATOM 711 C8 A A 33 61.506 65.166 0.616 1.00 69.12 C
+ATOM 712 N7 A A 33 62.547 64.634 1.211 1.00 68.67 N
+ATOM 713 C5 A A 33 62.140 63.340 1.497 1.00 68.66 C
+ATOM 714 C6 A A 33 62.789 62.260 2.126 1.00 67.48 C
+ATOM 715 N6 A A 33 64.024 62.321 2.622 1.00 67.34 N
+ATOM 716 N1 A A 33 62.112 61.104 2.236 1.00 66.36 N
+ATOM 717 C2 A A 33 60.863 61.047 1.756 1.00 68.99 C
+ATOM 718 N3 A A 33 60.140 61.993 1.155 1.00 68.41 N
+ATOM 719 C4 A A 33 60.845 63.127 1.054 1.00 69.05 C
+ATOM 720 P U A 34 55.824 65.152 -2.328 1.00 74.88 P
+ATOM 721 OP1 U A 34 55.020 64.908 -3.544 1.00 76.95 O
+ATOM 722 OP2 U A 34 57.139 65.818 -2.430 1.00 77.84 O
+ATOM 723 O5' U A 34 54.926 65.989 -1.318 1.00 78.42 O
+ATOM 724 C5' U A 34 54.185 65.351 -0.295 1.00 81.29 C
+ATOM 725 C4' U A 34 52.728 65.677 -0.440 1.00 83.18 C
+ATOM 726 O4' U A 34 52.277 65.244 -1.744 1.00 85.09 O
+ATOM 727 C3' U A 34 51.830 64.944 0.538 1.00 84.70 C
+ATOM 728 O3' U A 34 51.739 65.734 1.721 1.00 86.22 O
+ATOM 729 C2' U A 34 50.492 64.920 -0.195 1.00 85.34 C
+ATOM 730 O2' U A 34 49.750 66.116 -0.048 1.00 86.46 O
+ATOM 731 C1' U A 34 50.941 64.780 -1.652 1.00 85.85 C
+ATOM 732 N1 U A 34 50.856 63.449 -2.274 1.00 86.02 N
+ATOM 733 C2 U A 34 49.694 62.731 -2.110 1.00 86.35 C
+ATOM 734 O2 U A 34 48.760 63.134 -1.441 1.00 86.70 O
+ATOM 735 N3 U A 34 49.663 61.521 -2.759 1.00 86.83 N
+ATOM 736 C4 U A 34 50.662 60.967 -3.534 1.00 86.45 C
+ATOM 737 O4 U A 34 50.500 59.849 -4.031 1.00 85.04 O
+ATOM 738 C5 U A 34 51.837 61.771 -3.643 1.00 86.54 C
+ATOM 739 C6 U A 34 51.894 62.951 -3.021 1.00 85.75 C
+ATOM 740 P G A 35 52.152 65.101 3.133 1.00 86.03 P
+ATOM 741 OP1 G A 35 53.057 63.962 2.842 1.00 87.58 O
+ATOM 742 OP2 G A 35 50.900 64.870 3.900 1.00 86.93 O
+ATOM 743 O5' G A 35 52.992 66.243 3.851 1.00 82.44 O
+ATOM 744 C5' G A 35 53.697 65.970 5.055 1.00 82.21 C
+ATOM 745 C4' G A 35 54.954 65.202 4.743 1.00 80.34 C
+ATOM 746 O4' G A 35 55.443 65.620 3.455 1.00 81.24 O
+ATOM 747 C3' G A 35 56.105 65.432 5.709 1.00 80.16 C
+ATOM 748 O3' G A 35 56.017 64.446 6.733 1.00 78.85 O
+ATOM 749 C2' G A 35 57.326 65.138 4.843 1.00 81.09 C
+ATOM 750 O2' G A 35 57.613 63.762 4.756 1.00 84.00 O
+ATOM 751 C1' G A 35 56.852 65.607 3.468 1.00 81.14 C
+ATOM 752 N9 G A 35 57.345 66.850 2.883 1.00 80.09 N
+ATOM 753 C8 G A 35 56.599 67.774 2.191 1.00 79.74 C
+ATOM 754 N7 G A 35 57.324 68.703 1.637 1.00 79.94 N
+ATOM 755 C5 G A 35 58.624 68.394 2.016 1.00 78.91 C
+ATOM 756 C6 G A 35 59.843 69.026 1.693 1.00 78.16 C
+ATOM 757 O6 G A 35 60.033 70.005 0.961 1.00 79.05 O
+ATOM 758 N1 G A 35 60.919 68.399 2.305 1.00 76.96 N
+ATOM 759 C2 G A 35 60.834 67.298 3.114 1.00 77.37 C
+ATOM 760 N2 G A 35 61.990 66.850 3.623 1.00 76.36 N
+ATOM 761 N3 G A 35 59.702 66.685 3.407 1.00 78.05 N
+ATOM 762 C4 G A 35 58.645 67.280 2.825 1.00 78.58 C
+ATOM 763 P A A 36 56.302 64.840 8.264 1.00 76.30 P
+ATOM 764 OP1 A A 36 54.975 64.874 8.942 1.00 75.67 O
+ATOM 765 OP2 A A 36 57.180 66.045 8.282 1.00 77.08 O
+ATOM 766 O5' A A 36 57.155 63.624 8.842 1.00 72.20 O
+ATOM 767 C5' A A 36 56.630 62.304 8.880 1.00 69.65 C
+ATOM 768 C4' A A 36 57.735 61.338 9.196 1.00 67.97 C
+ATOM 769 O4' A A 36 58.775 61.499 8.202 1.00 68.85 O
+ATOM 770 C3' A A 36 58.432 61.569 10.525 1.00 67.41 C
+ATOM 771 O3' A A 36 57.747 60.830 11.524 1.00 67.02 O
+ATOM 772 C2' A A 36 59.815 60.974 10.276 1.00 67.37 C
+ATOM 773 O2' A A 36 59.886 59.573 10.441 1.00 66.90 O
+ATOM 774 C1' A A 36 60.045 61.341 8.808 1.00 67.53 C
+ATOM 775 N9 A A 36 60.752 62.600 8.641 1.00 66.76 N
+ATOM 776 C8 A A 36 60.375 63.652 7.852 1.00 67.45 C
+ATOM 777 N7 A A 36 61.191 64.671 7.908 1.00 66.96 N
+ATOM 778 C5 A A 36 62.172 64.259 8.794 1.00 66.08 C
+ATOM 779 C6 A A 36 63.311 64.889 9.276 1.00 66.19 C
+ATOM 780 N6 A A 36 63.665 66.125 8.928 1.00 67.40 N
+ATOM 781 N1 A A 36 64.087 64.205 10.142 1.00 66.85 N
+ATOM 782 C2 A A 36 63.716 62.966 10.495 1.00 66.08 C
+ATOM 783 N3 A A 36 62.657 62.268 10.111 1.00 65.19 N
+ATOM 784 C4 A A 36 61.917 62.982 9.248 1.00 65.98 C
+ATOM 785 P A A 37 57.509 61.470 12.975 1.00 68.44 P
+ATOM 786 OP1 A A 37 56.864 60.414 13.806 1.00 68.71 O
+ATOM 787 OP2 A A 37 56.818 62.771 12.773 1.00 66.15 O
+ATOM 788 O5' A A 37 58.982 61.698 13.553 1.00 69.51 O
+ATOM 789 C5' A A 37 59.702 60.597 14.106 1.00 72.39 C
+ATOM 790 C4' A A 37 61.083 61.004 14.590 1.00 73.88 C
+ATOM 791 O4' A A 37 61.842 61.585 13.493 1.00 74.64 O
+ATOM 792 C3' A A 37 61.133 62.080 15.665 1.00 75.34 C
+ATOM 793 O3' A A 37 60.948 61.522 16.963 1.00 77.76 O
+ATOM 794 C2' A A 37 62.544 62.635 15.506 1.00 74.93 C
+ATOM 795 O2' A A 37 63.525 61.813 16.108 1.00 73.93 O
+ATOM 796 C1' A A 37 62.730 62.569 13.995 1.00 75.06 C
+ATOM 797 N9 A A 37 62.515 63.833 13.299 1.00 76.44 N
+ATOM 798 C8 A A 37 61.475 64.214 12.492 1.00 77.47 C
+ATOM 799 N7 A A 37 61.604 65.421 12.002 1.00 77.88 N
+ATOM 800 C5 A A 37 62.808 65.868 12.528 1.00 78.70 C
+ATOM 801 C6 A A 37 63.516 67.076 12.386 1.00 79.68 C
+ATOM 802 N6 A A 37 63.093 68.103 11.641 1.00 80.75 N
+ATOM 803 N1 A A 37 64.689 67.195 13.045 1.00 80.31 N
+ATOM 804 C2 A A 37 65.112 66.167 13.792 1.00 80.01 C
+ATOM 805 N3 A A 37 64.538 64.987 14.002 1.00 79.09 N
+ATOM 806 C4 A A 37 63.376 64.900 13.332 1.00 78.07 C
+ATOM 807 P A A 38 60.393 62.448 18.155 1.00 79.26 P
+ATOM 808 OP1 A A 38 60.704 61.769 19.430 1.00 80.61 O
+ATOM 809 OP2 A A 38 58.991 62.817 17.844 1.00 79.34 O
+ATOM 810 O5' A A 38 61.291 63.760 18.070 1.00 79.38 O
+ATOM 811 C5' A A 38 62.553 63.820 18.730 1.00 81.15 C
+ATOM 812 C4' A A 38 63.073 65.228 18.704 1.00 81.79 C
+ATOM 813 O4' A A 38 63.352 65.593 17.331 1.00 81.63 O
+ATOM 814 C3' A A 38 62.094 66.283 19.177 1.00 82.49 C
+ATOM 815 O3' A A 38 62.076 66.412 20.583 1.00 84.40 O
+ATOM 816 C2' A A 38 62.616 67.524 18.479 1.00 82.22 C
+ATOM 817 O2' A A 38 63.767 68.030 19.123 1.00 83.01 O
+ATOM 818 C1' A A 38 62.993 66.945 17.115 1.00 80.98 C
+ATOM 819 N9 A A 38 61.822 66.947 16.243 1.00 78.84 N
+ATOM 820 C8 A A 38 60.905 65.942 16.088 1.00 78.39 C
+ATOM 821 N7 A A 38 59.915 66.249 15.289 1.00 77.70 N
+ATOM 822 C5 A A 38 60.210 67.540 14.875 1.00 77.24 C
+ATOM 823 C6 A A 38 59.546 68.437 14.018 1.00 77.01 C
+ATOM 824 N6 A A 38 58.390 68.170 13.407 1.00 76.37 N
+ATOM 825 N1 A A 38 60.117 69.640 13.812 1.00 77.26 N
+ATOM 826 C2 A A 38 61.268 69.918 14.433 1.00 77.25 C
+ATOM 827 N3 A A 38 61.981 69.165 15.263 1.00 77.22 N
+ATOM 828 C4 A A 38 61.391 67.974 15.444 1.00 77.56 C
+ATOM 829 P C A 39 60.743 66.942 21.298 1.00 86.61 P
+ATOM 830 OP1 C A 39 60.919 66.819 22.766 1.00 87.75 O
+ATOM 831 OP2 C A 39 59.580 66.302 20.641 1.00 86.54 O
+ATOM 832 O5' C A 39 60.712 68.487 20.936 1.00 86.18 O
+ATOM 833 C5' C A 39 61.720 69.347 21.428 1.00 85.71 C
+ATOM 834 C4' C A 39 61.518 70.740 20.903 1.00 86.21 C
+ATOM 835 O4' C A 39 61.657 70.721 19.457 1.00 85.21 O
+ATOM 836 C3' C A 39 60.124 71.312 21.113 1.00 86.52 C
+ATOM 837 O3' C A 39 59.927 71.874 22.399 1.00 87.69 O
+ATOM 838 C2' C A 39 60.063 72.379 20.039 1.00 86.39 C
+ATOM 839 O2' C A 39 60.788 73.527 20.422 1.00 87.59 O
+ATOM 840 C1' C A 39 60.782 71.680 18.888 1.00 85.69 C
+ATOM 841 N1 C A 39 59.790 71.009 18.040 1.00 85.17 N
+ATOM 842 C2 C A 39 59.112 71.781 17.103 1.00 85.98 C
+ATOM 843 O2 C A 39 59.424 72.977 16.983 1.00 88.51 O
+ATOM 844 N3 C A 39 58.140 71.218 16.353 1.00 85.49 N
+ATOM 845 C4 C A 39 57.847 69.928 16.510 1.00 84.91 C
+ATOM 846 N4 C A 39 56.868 69.416 15.759 1.00 84.63 N
+ATOM 847 C5 C A 39 58.543 69.105 17.445 1.00 84.88 C
+ATOM 848 C6 C A 39 59.503 69.681 18.179 1.00 84.74 C
+ATOM 849 P C A 40 58.440 71.960 23.004 1.00 87.52 P
+ATOM 850 OP1 C A 40 58.530 72.443 24.403 1.00 87.13 O
+ATOM 851 OP2 C A 40 57.789 70.663 22.722 1.00 88.65 O
+ATOM 852 O5' C A 40 57.724 73.076 22.125 1.00 87.10 O
+ATOM 853 C5' C A 40 58.160 74.423 22.184 1.00 87.69 C
+ATOM 854 C4' C A 40 57.305 75.294 21.301 1.00 88.35 C
+ATOM 855 O4' C A 40 57.424 74.836 19.927 1.00 88.43 O
+ATOM 856 C3' C A 40 55.811 75.229 21.578 1.00 89.15 C
+ATOM 857 O3' C A 40 55.427 76.080 22.652 1.00 89.80 O
+ATOM 858 C2' C A 40 55.221 75.672 20.247 1.00 89.22 C
+ATOM 859 O2' C A 40 55.242 77.071 20.063 1.00 90.74 O
+ATOM 860 C1' C A 40 56.184 75.016 19.259 1.00 89.11 C
+ATOM 861 N1 C A 40 55.680 73.714 18.791 1.00 89.08 N
+ATOM 862 C2 C A 40 54.720 73.712 17.784 1.00 88.89 C
+ATOM 863 O2 C A 40 54.357 74.800 17.312 1.00 88.07 O
+ATOM 864 N3 C A 40 54.214 72.537 17.349 1.00 88.17 N
+ATOM 865 C4 C A 40 54.640 71.394 17.881 1.00 87.25 C
+ATOM 866 N4 C A 40 54.111 70.259 17.420 1.00 86.84 N
+ATOM 867 C5 C A 40 55.627 71.365 18.910 1.00 87.49 C
+ATOM 868 C6 C A 40 56.118 72.537 19.329 1.00 88.37 C
+ATOM 869 P C A 41 54.296 75.590 23.687 1.00 91.70 P
+ATOM 870 OP1 C A 41 54.317 76.506 24.848 1.00 92.23 O
+ATOM 871 OP2 C A 41 54.484 74.132 23.905 1.00 92.16 O
+ATOM 872 O5' C A 41 52.921 75.809 22.911 1.00 89.93 O
+ATOM 873 C5' C A 41 52.470 77.118 22.601 1.00 89.57 C
+ATOM 874 C4' C A 41 51.643 77.101 21.344 1.00 89.19 C
+ATOM 875 O4' C A 41 52.410 76.440 20.301 1.00 89.84 O
+ATOM 876 C3' C A 41 50.360 76.288 21.406 1.00 88.65 C
+ATOM 877 O3' C A 41 49.269 76.984 21.992 1.00 87.24 O
+ATOM 878 C2' C A 41 50.117 75.978 19.940 1.00 89.20 C
+ATOM 879 O2' C A 41 49.606 77.084 19.234 1.00 90.10 O
+ATOM 880 C1' C A 41 51.538 75.698 19.463 1.00 89.86 C
+ATOM 881 N1 C A 41 51.817 74.263 19.619 1.00 90.67 N
+ATOM 882 C2 C A 41 51.094 73.376 18.829 1.00 90.46 C
+ATOM 883 O2 C A 41 50.292 73.835 18.017 1.00 90.97 O
+ATOM 884 N3 C A 41 51.280 72.049 18.972 1.00 90.17 N
+ATOM 885 C4 C A 41 52.155 71.592 19.865 1.00 91.13 C
+ATOM 886 N4 C A 41 52.292 70.264 19.975 1.00 91.98 N
+ATOM 887 C5 C A 41 52.927 72.476 20.683 1.00 91.06 C
+ATOM 888 C6 C A 41 52.730 73.795 20.523 1.00 90.74 C
+ATOM 889 P G A 42 48.270 76.196 22.975 1.00 87.44 P
+ATOM 890 OP1 G A 42 47.291 77.141 23.567 1.00 89.10 O
+ATOM 891 OP2 G A 42 49.134 75.380 23.871 1.00 88.78 O
+ATOM 892 O5' G A 42 47.474 75.205 22.013 1.00 86.64 O
+ATOM 893 C5' G A 42 46.541 75.702 21.061 1.00 83.77 C
+ATOM 894 C4' G A 42 45.922 74.562 20.279 1.00 82.63 C
+ATOM 895 O4' G A 42 46.960 73.869 19.533 1.00 81.47 O
+ATOM 896 C3' G A 42 45.236 73.476 21.096 1.00 81.18 C
+ATOM 897 O3' G A 42 43.883 73.838 21.383 1.00 79.00 O
+ATOM 898 C2' G A 42 45.304 72.282 20.150 1.00 81.50 C
+ATOM 899 O2' G A 42 44.294 72.313 19.164 1.00 82.78 O
+ATOM 900 C1' G A 42 46.671 72.484 19.489 1.00 81.61 C
+ATOM 901 N9 G A 42 47.741 71.774 20.181 1.00 81.64 N
+ATOM 902 C8 G A 42 48.763 72.326 20.911 1.00 81.07 C
+ATOM 903 N7 G A 42 49.539 71.435 21.463 1.00 81.18 N
+ATOM 904 C5 G A 42 49.003 70.221 21.061 1.00 81.25 C
+ATOM 905 C6 G A 42 49.410 68.898 21.358 1.00 81.50 C
+ATOM 906 O6 G A 42 50.354 68.526 22.067 1.00 81.74 O
+ATOM 907 N1 G A 42 48.589 67.959 20.740 1.00 81.55 N
+ATOM 908 C2 G A 42 47.512 68.257 19.943 1.00 81.83 C
+ATOM 909 N2 G A 42 46.847 67.214 19.438 1.00 82.10 N
+ATOM 910 N3 G A 42 47.119 69.488 19.664 1.00 81.24 N
+ATOM 911 C4 G A 42 47.904 70.414 20.254 1.00 81.41 C
+ATOM 912 P G A 43 43.122 73.181 22.637 1.00 79.16 P
+ATOM 913 OP1 G A 43 41.728 73.681 22.656 1.00 80.54 O
+ATOM 914 OP2 G A 43 43.981 73.361 23.831 1.00 80.58 O
+ATOM 915 O5' G A 43 43.054 71.627 22.294 1.00 78.89 O
+ATOM 916 C5' G A 43 42.267 71.158 21.205 1.00 76.22 C
+ATOM 917 C4' G A 43 42.432 69.665 21.035 1.00 73.95 C
+ATOM 918 O4' G A 43 43.825 69.361 20.731 1.00 73.16 O
+ATOM 919 C3' G A 43 42.147 68.845 22.284 1.00 72.25 C
+ATOM 920 O3' G A 43 40.760 68.556 22.410 1.00 70.37 O
+ATOM 921 C2' G A 43 42.934 67.568 22.021 1.00 72.79 C
+ATOM 922 O2' G A 43 42.252 66.676 21.167 1.00 72.66 O
+ATOM 923 C1' G A 43 44.169 68.108 21.301 1.00 73.72 C
+ATOM 924 N9 G A 43 45.326 68.263 22.176 1.00 74.90 N
+ATOM 925 C8 G A 43 45.959 69.425 22.531 1.00 75.68 C
+ATOM 926 N7 G A 43 46.978 69.231 23.326 1.00 76.53 N
+ATOM 927 C5 G A 43 47.014 67.856 23.511 1.00 76.40 C
+ATOM 928 C6 G A 43 47.904 67.046 24.278 1.00 77.11 C
+ATOM 929 O6 G A 43 48.872 67.395 24.964 1.00 77.75 O
+ATOM 930 N1 G A 43 47.576 65.697 24.188 1.00 77.74 N
+ATOM 931 C2 G A 43 46.535 65.187 23.456 1.00 77.07 C
+ATOM 932 N2 G A 43 46.377 63.863 23.507 1.00 75.92 N
+ATOM 933 N3 G A 43 45.705 65.927 22.731 1.00 77.52 N
+ATOM 934 C4 G A 43 46.002 67.244 22.807 1.00 76.21 C
+ATOM 935 P C A 44 40.195 67.977 23.797 1.00 69.28 P
+ATOM 936 OP1 C A 44 38.714 67.902 23.774 1.00 70.40 O
+ATOM 937 OP2 C A 44 40.874 68.768 24.857 1.00 71.31 O
+ATOM 938 O5' C A 44 40.754 66.488 23.872 1.00 68.86 O
+ATOM 939 C5' C A 44 40.391 65.506 22.905 1.00 66.43 C
+ATOM 940 C4' C A 44 41.060 64.188 23.236 1.00 63.86 C
+ATOM 941 O4' C A 44 42.501 64.360 23.212 1.00 61.55 O
+ATOM 942 C3' C A 44 40.764 63.664 24.631 1.00 62.52 C
+ATOM 943 O3' C A 44 39.610 62.844 24.610 1.00 63.93 O
+ATOM 944 C2' C A 44 41.970 62.790 24.921 1.00 61.24 C
+ATOM 945 O2' C A 44 41.822 61.512 24.348 1.00 60.87 O
+ATOM 946 C1' C A 44 43.089 63.572 24.232 1.00 60.02 C
+ATOM 947 N1 C A 44 43.846 64.470 25.117 1.00 57.66 N
+ATOM 948 C2 C A 44 44.654 63.921 26.119 1.00 56.64 C
+ATOM 949 O2 C A 44 44.654 62.698 26.294 1.00 55.06 O
+ATOM 950 N3 C A 44 45.410 64.740 26.872 1.00 56.82 N
+ATOM 951 C4 C A 44 45.372 66.056 26.665 1.00 57.91 C
+ATOM 952 N4 C A 44 46.153 66.830 27.420 1.00 58.97 N
+ATOM 953 C5 C A 44 44.533 66.641 25.676 1.00 57.75 C
+ATOM 954 C6 C A 44 43.788 65.821 24.938 1.00 57.21 C
+ATOM 955 P A A 45 38.915 62.435 25.990 1.00 67.24 P
+ATOM 956 OP1 A A 45 37.920 61.357 25.739 1.00 66.87 O
+ATOM 957 OP2 A A 45 38.473 63.720 26.574 1.00 68.09 O
+ATOM 958 O5' A A 45 40.101 61.855 26.886 1.00 64.88 O
+ATOM 959 C5' A A 45 40.493 60.486 26.806 1.00 61.73 C
+ATOM 960 C4' A A 45 41.533 60.188 27.856 1.00 60.43 C
+ATOM 961 O4' A A 45 42.672 61.053 27.651 1.00 58.62 O
+ATOM 962 C3' A A 45 41.106 60.425 29.294 1.00 60.22 C
+ATOM 963 O3' A A 45 40.583 59.206 29.787 1.00 62.36 O
+ATOM 964 C2' A A 45 42.432 60.692 29.984 1.00 58.55 C
+ATOM 965 O2' A A 45 43.085 59.476 30.257 1.00 60.38 O
+ATOM 966 C1' A A 45 43.194 61.456 28.902 1.00 57.88 C
+ATOM 967 N9 A A 45 43.076 62.911 28.943 1.00 57.39 N
+ATOM 968 C8 A A 45 42.160 63.673 28.261 1.00 56.72 C
+ATOM 969 N7 A A 45 42.351 64.962 28.378 1.00 55.38 N
+ATOM 970 C5 A A 45 43.445 65.058 29.218 1.00 55.87 C
+ATOM 971 C6 A A 45 44.141 66.154 29.716 1.00 56.96 C
+ATOM 972 N6 A A 45 43.820 67.421 29.438 1.00 57.41 N
+ATOM 973 N1 A A 45 45.196 65.909 30.525 1.00 57.38 N
+ATOM 974 C2 A A 45 45.510 64.636 30.807 1.00 56.39 C
+ATOM 975 N3 A A 45 44.925 63.522 30.402 1.00 56.23 N
+ATOM 976 C4 A A 45 43.888 63.803 29.596 1.00 56.50 C
+ATOM 977 P A A 46 39.689 59.199 31.111 1.00 66.16 P
+ATOM 978 OP1 A A 46 39.133 57.830 31.270 1.00 64.50 O
+ATOM 979 OP2 A A 46 38.779 60.365 30.994 1.00 65.42 O
+ATOM 980 O5' A A 46 40.701 59.506 32.306 1.00 67.24 O
+ATOM 981 C5' A A 46 41.462 58.484 32.965 1.00 66.66 C
+ATOM 982 C4' A A 46 42.341 59.140 34.004 1.00 66.99 C
+ATOM 983 O4' A A 46 43.028 60.224 33.349 1.00 67.35 O
+ATOM 984 C3' A A 46 41.625 59.765 35.195 1.00 67.72 C
+ATOM 985 O3' A A 46 41.669 58.959 36.376 1.00 68.21 O
+ATOM 986 C2' A A 46 42.564 60.890 35.577 1.00 69.03 C
+ATOM 987 O2' A A 46 43.607 60.394 36.401 1.00 72.13 O
+ATOM 988 C1' A A 46 43.082 61.336 34.209 1.00 66.39 C
+ATOM 989 N9 A A 46 42.276 62.348 33.564 1.00 62.89 N
+ATOM 990 C8 A A 46 41.084 62.169 32.918 1.00 62.52 C
+ATOM 991 N7 A A 46 40.653 63.243 32.308 1.00 62.67 N
+ATOM 992 C5 A A 46 41.614 64.200 32.605 1.00 62.01 C
+ATOM 993 C6 A A 46 41.747 65.544 32.251 1.00 61.96 C
+ATOM 994 N6 A A 46 40.877 66.192 31.482 1.00 64.57 N
+ATOM 995 N1 A A 46 42.823 66.214 32.714 1.00 62.07 N
+ATOM 996 C2 A A 46 43.697 65.565 33.480 1.00 62.26 C
+ATOM 997 N3 A A 46 43.684 64.298 33.881 1.00 63.14 N
+ATOM 998 C4 A A 46 42.603 63.665 33.400 1.00 62.84 C
+ATOM 999 P C A 47 42.413 57.528 36.388 1.00 67.72 P
+ATOM 1000 OP1 C A 47 42.629 56.988 35.028 1.00 70.69 O
+ATOM 1001 OP2 C A 47 41.663 56.714 37.372 1.00 70.77 O
+ATOM 1002 O5' C A 47 43.856 57.748 37.034 1.00 64.73 O
+ATOM 1003 C5' C A 47 44.558 56.596 37.540 1.00 62.38 C
+ATOM 1004 C4' C A 47 46.022 56.881 37.836 1.00 60.75 C
+ATOM 1005 O4' C A 47 46.726 57.283 36.632 1.00 57.34 O
+ATOM 1006 C3' C A 47 46.301 58.002 38.819 1.00 61.65 C
+ATOM 1007 O3' C A 47 46.215 57.517 40.147 1.00 66.33 O
+ATOM 1008 C2' C A 47 47.730 58.398 38.472 1.00 58.98 C
+ATOM 1009 O2' C A 47 48.710 57.539 39.015 1.00 59.79 O
+ATOM 1010 C1' C A 47 47.729 58.226 36.961 1.00 56.15 C
+ATOM 1011 N1 C A 47 47.460 59.483 36.270 1.00 52.42 N
+ATOM 1012 C2 C A 47 48.401 60.504 36.371 1.00 52.13 C
+ATOM 1013 O2 C A 47 49.423 60.304 37.044 1.00 51.95 O
+ATOM 1014 N3 C A 47 48.179 61.672 35.738 1.00 50.89 N
+ATOM 1015 C4 C A 47 47.062 61.832 35.031 1.00 51.44 C
+ATOM 1016 N4 C A 47 46.861 62.994 34.431 1.00 52.10 N
+ATOM 1017 C5 C A 47 46.091 60.804 34.911 1.00 51.28 C
+ATOM 1018 C6 C A 47 46.326 59.658 35.541 1.00 51.11 C
+ATOM 1019 P C A 48 45.766 58.513 41.317 1.00 69.35 P
+ATOM 1020 OP1 C A 48 45.485 57.695 42.529 1.00 67.22 O
+ATOM 1021 OP2 C A 48 44.703 59.395 40.751 1.00 67.82 O
+ATOM 1022 O5' C A 48 47.058 59.411 41.569 1.00 67.80 O
+ATOM 1023 C5' C A 48 48.244 58.859 42.135 1.00 66.18 C
+ATOM 1024 C4' C A 48 49.242 59.962 42.373 1.00 65.53 C
+ATOM 1025 O4' C A 48 49.635 60.527 41.099 1.00 62.77 O
+ATOM 1026 C3' C A 48 48.679 61.145 43.136 1.00 66.13 C
+ATOM 1027 O3' C A 48 48.741 60.923 44.527 1.00 71.49 O
+ATOM 1028 C2' C A 48 49.582 62.286 42.698 1.00 63.22 C
+ATOM 1029 O2' C A 48 50.818 62.332 43.383 1.00 63.14 O
+ATOM 1030 C1' C A 48 49.807 61.927 41.231 1.00 60.44 C
+ATOM 1031 N1 C A 48 48.843 62.587 40.347 1.00 55.14 N
+ATOM 1032 C2 C A 48 49.088 63.893 39.966 1.00 54.49 C
+ATOM 1033 O2 C A 48 50.090 64.465 40.414 1.00 55.34 O
+ATOM 1034 N3 C A 48 48.233 64.509 39.125 1.00 52.59 N
+ATOM 1035 C4 C A 48 47.161 63.865 38.679 1.00 51.17 C
+ATOM 1036 N4 C A 48 46.362 64.510 37.843 1.00 50.44 N
+ATOM 1037 C5 C A 48 46.871 62.531 39.070 1.00 52.11 C
+ATOM 1038 C6 C A 48 47.732 61.933 39.898 1.00 54.08 C
+ATOM 1039 P A A 49 47.654 61.613 45.471 1.00 74.04 P
+ATOM 1040 OP1 A A 49 47.893 61.129 46.859 1.00 75.80 O
+ATOM 1041 OP2 A A 49 46.338 61.389 44.821 1.00 75.26 O
+ATOM 1042 O5' A A 49 48.017 63.156 45.395 1.00 72.61 O
+ATOM 1043 C5' A A 49 49.222 63.621 45.964 1.00 73.43 C
+ATOM 1044 C4' A A 49 49.383 65.087 45.696 1.00 74.37 C
+ATOM 1045 O4' A A 49 49.425 65.301 44.263 1.00 73.83 O
+ATOM 1046 C3' A A 49 48.229 65.975 46.115 1.00 76.55 C
+ATOM 1047 O3' A A 49 48.233 66.240 47.513 1.00 80.22 O
+ATOM 1048 C2' A A 49 48.525 67.223 45.299 1.00 75.25 C
+ATOM 1049 O2' A A 49 49.601 67.966 45.824 1.00 76.33 O
+ATOM 1050 C1' A A 49 48.953 66.608 43.969 1.00 73.01 C
+ATOM 1051 N9 A A 49 47.835 66.511 43.031 1.00 71.22 N
+ATOM 1052 C8 A A 49 47.031 65.426 42.781 1.00 71.73 C
+ATOM 1053 N7 A A 49 46.081 65.663 41.907 1.00 70.51 N
+ATOM 1054 C5 A A 49 46.280 66.989 41.550 1.00 69.33 C
+ATOM 1055 C6 A A 49 45.599 67.839 40.664 1.00 69.09 C
+ATOM 1056 N6 A A 49 44.545 67.453 39.944 1.00 69.34 N
+ATOM 1057 N1 A A 49 46.044 69.110 40.540 1.00 69.39 N
+ATOM 1058 C2 A A 49 47.106 69.484 41.260 1.00 70.23 C
+ATOM 1059 N3 A A 49 47.833 68.775 42.123 1.00 70.98 N
+ATOM 1060 C4 A A 49 47.360 67.522 42.226 1.00 69.91 C
+ATOM 1061 P G A 50 46.846 66.209 48.339 1.00 82.72 P
+ATOM 1062 OP1 G A 50 47.164 66.087 49.785 1.00 82.86 O
+ATOM 1063 OP2 G A 50 45.964 65.198 47.703 1.00 81.94 O
+ATOM 1064 O5' G A 50 46.219 67.654 48.091 1.00 81.41 O
+ATOM 1065 C5' G A 50 45.935 68.105 46.777 1.00 84.37 C
+ATOM 1066 C4' G A 50 45.652 69.584 46.784 1.00 86.37 C
+ATOM 1067 O4' G A 50 45.672 70.042 45.399 1.00 85.92 O
+ATOM 1068 C3' G A 50 44.276 69.971 47.302 1.00 88.18 C
+ATOM 1069 O3' G A 50 43.942 70.325 48.632 1.00 92.03 O
+ATOM 1070 C2' G A 50 43.367 70.206 46.117 1.00 86.73 C
+ATOM 1071 O2' G A 50 42.687 71.428 46.274 1.00 86.89 O
+ATOM 1072 C1' G A 50 44.351 70.323 44.948 1.00 84.88 C
+ATOM 1073 N9 G A 50 43.925 69.272 44.029 1.00 81.15 N
+ATOM 1074 C8 G A 50 44.114 67.917 44.173 1.00 79.88 C
+ATOM 1075 N7 G A 50 43.441 67.213 43.306 1.00 79.00 N
+ATOM 1076 C5 G A 50 42.810 68.160 42.516 1.00 78.27 C
+ATOM 1077 C6 G A 50 41.925 67.995 41.442 1.00 78.52 C
+ATOM 1078 O6 G A 50 41.491 66.941 40.959 1.00 78.22 O
+ATOM 1079 N1 G A 50 41.521 69.220 40.921 1.00 78.77 N
+ATOM 1080 C2 G A 50 41.922 70.445 41.387 1.00 78.84 C
+ATOM 1081 N2 G A 50 41.425 71.512 40.756 1.00 79.59 N
+ATOM 1082 N3 G A 50 42.748 70.610 42.398 1.00 78.54 N
+ATOM 1083 C4 G A 50 43.143 69.435 42.917 1.00 78.68 C
+ATOM 1084 P A A 51 42.880 69.415 49.453 1.00 96.02 P
+ATOM 1085 OP1 A A 51 42.446 70.195 50.660 1.00 95.76 O
+ATOM 1086 OP2 A A 51 43.467 68.046 49.625 1.00 96.17 O
+ATOM 1087 O5' A A 51 41.609 69.253 48.500 1.00 94.71 O
+ATOM 1088 C5' A A 51 40.743 68.118 48.626 1.00 93.44 C
+ATOM 1089 C4' A A 51 39.313 68.526 48.358 1.00 92.36 C
+ATOM 1090 O4' A A 51 38.931 69.502 49.358 1.00 90.16 O
+ATOM 1091 C3' A A 51 39.090 69.216 47.018 1.00 92.54 C
+ATOM 1092 O3' A A 51 38.742 68.280 46.002 1.00 96.31 O
+ATOM 1093 C2' A A 51 37.939 70.159 47.316 1.00 90.20 C
+ATOM 1094 O2' A A 51 36.698 69.487 47.304 1.00 89.63 O
+ATOM 1095 C1' A A 51 38.293 70.602 48.737 1.00 86.88 C
+ATOM 1096 N9 A A 51 39.245 71.707 48.758 1.00 82.36 N
+ATOM 1097 C8 A A 51 40.528 71.680 49.247 1.00 80.40 C
+ATOM 1098 N7 A A 51 41.164 72.817 49.124 1.00 78.33 N
+ATOM 1099 C5 A A 51 40.236 73.652 48.517 1.00 77.49 C
+ATOM 1100 C6 A A 51 40.296 74.995 48.117 1.00 75.83 C
+ATOM 1101 N6 A A 51 41.375 75.764 48.279 1.00 75.08 N
+ATOM 1102 N1 A A 51 39.199 75.530 47.539 1.00 76.02 N
+ATOM 1103 C2 A A 51 38.118 74.757 47.382 1.00 77.71 C
+ATOM 1104 N3 A A 51 37.939 73.479 47.718 1.00 78.31 N
+ATOM 1105 C4 A A 51 39.049 72.981 48.287 1.00 79.42 C
+ATOM 1106 P A A 52 39.515 68.317 44.596 1.00 97.90 P
+ATOM 1107 OP1 A A 52 39.960 66.929 44.294 1.00 98.51 O
+ATOM 1108 OP2 A A 52 40.520 69.410 44.687 1.00 97.41 O
+ATOM 1109 O5' A A 52 38.395 68.749 43.546 1.00 98.75 O
+ATOM 1110 C5' A A 52 38.737 69.495 42.378 1.00100.86 C
+ATOM 1111 C4' A A 52 37.985 70.804 42.367 1.00101.84 C
+ATOM 1112 O4' A A 52 38.002 71.359 43.705 1.00100.72 O
+ATOM 1113 C3' A A 52 38.535 71.905 41.465 1.00102.80 C
+ATOM 1114 O3' A A 52 37.991 71.808 40.147 1.00105.83 O
+ATOM 1115 C2' A A 52 38.020 73.163 42.155 1.00101.22 C
+ATOM 1116 O2' A A 52 36.680 73.455 41.831 1.00102.17 O
+ATOM 1117 C1' A A 52 38.111 72.767 43.631 1.00 99.83 C
+ATOM 1118 N9 A A 52 39.367 73.140 44.269 1.00 97.90 N
+ATOM 1119 C8 A A 52 40.197 72.318 44.981 1.00 96.81 C
+ATOM 1120 N7 A A 52 41.251 72.923 45.460 1.00 96.75 N
+ATOM 1121 C5 A A 52 41.110 74.232 45.031 1.00 96.25 C
+ATOM 1122 C6 A A 52 41.900 75.370 45.216 1.00 95.31 C
+ATOM 1123 N6 A A 52 43.037 75.365 45.910 1.00 94.72 N
+ATOM 1124 N1 A A 52 41.481 76.527 44.657 1.00 95.37 N
+ATOM 1125 C2 A A 52 40.338 76.521 43.962 1.00 96.12 C
+ATOM 1126 N3 A A 52 39.505 75.511 43.719 1.00 96.85 N
+ATOM 1127 C4 A A 52 39.955 74.381 44.291 1.00 97.01 C
+ATOM 1128 P A A 53 38.666 72.624 38.930 1.00108.87 P
+ATOM 1129 OP1 A A 53 37.810 72.491 37.721 1.00108.36 O
+ATOM 1130 OP2 A A 53 40.093 72.223 38.866 1.00109.37 O
+ATOM 1131 O5' A A 53 38.606 74.150 39.369 1.00107.46 O
+ATOM 1132 C5' A A 53 38.058 75.137 38.499 1.00107.85 C
+ATOM 1133 C4' A A 53 38.929 76.365 38.509 1.00108.27 C
+ATOM 1134 O4' A A 53 39.209 76.699 39.891 1.00108.81 O
+ATOM 1135 C3' A A 53 40.298 76.243 37.854 1.00108.40 C
+ATOM 1136 O3' A A 53 40.239 76.517 36.456 1.00107.76 O
+ATOM 1137 C2' A A 53 41.086 77.317 38.590 1.00108.67 C
+ATOM 1138 O2' A A 53 40.806 78.618 38.112 1.00108.67 O
+ATOM 1139 C1' A A 53 40.542 77.152 40.011 1.00109.27 C
+ATOM 1140 N9 A A 53 41.277 76.108 40.718 1.00109.89 N
+ATOM 1141 C8 A A 53 41.033 74.758 40.673 1.00110.42 C
+ATOM 1142 N7 A A 53 41.870 74.045 41.382 1.00110.63 N
+ATOM 1143 C5 A A 53 42.720 74.990 41.938 1.00110.94 C
+ATOM 1144 C6 A A 53 43.826 74.875 42.795 1.00111.51 C
+ATOM 1145 N6 A A 53 44.285 73.710 43.257 1.00112.10 N
+ATOM 1146 N1 A A 53 44.452 76.014 43.167 1.00111.76 N
+ATOM 1147 C2 A A 53 43.988 77.184 42.703 1.00111.34 C
+ATOM 1148 N3 A A 53 42.958 77.419 41.892 1.00110.90 N
+ATOM 1149 C4 A A 53 42.361 76.266 41.542 1.00110.47 C
+ATOM 1150 P U A 54 40.720 75.399 35.403 1.00107.30 P
+ATOM 1151 OP1 U A 54 40.655 75.985 34.040 1.00107.24 O
+ATOM 1152 OP2 U A 54 39.952 74.165 35.708 1.00107.10 O
+ATOM 1153 O5' U A 54 42.250 75.138 35.772 1.00104.79 O
+ATOM 1154 C5' U A 54 43.228 76.148 35.560 1.00101.43 C
+ATOM 1155 C4' U A 54 44.377 75.983 36.522 1.00 99.06 C
+ATOM 1156 O4' U A 54 43.865 75.376 37.739 1.00 98.18 O
+ATOM 1157 C3' U A 54 45.481 75.031 36.092 1.00 98.11 C
+ATOM 1158 O3' U A 54 46.453 75.676 35.281 1.00 97.57 O
+ATOM 1159 C2' U A 54 46.093 74.631 37.424 1.00 97.54 C
+ATOM 1160 O2' U A 54 46.934 75.633 37.945 1.00 98.55 O
+ATOM 1161 C1' U A 54 44.850 74.523 38.300 1.00 96.75 C
+ATOM 1162 N1 U A 54 44.348 73.146 38.309 1.00 95.04 N
+ATOM 1163 C2 U A 54 44.996 72.251 39.131 1.00 93.99 C
+ATOM 1164 O2 U A 54 45.921 72.575 39.851 1.00 94.77 O
+ATOM 1165 N3 U A 54 44.524 70.966 39.077 1.00 92.33 N
+ATOM 1166 C4 U A 54 43.489 70.502 38.302 1.00 92.24 C
+ATOM 1167 O4 U A 54 43.181 69.316 38.357 1.00 90.91 O
+ATOM 1168 C5 U A 54 42.859 71.495 37.488 1.00 93.43 C
+ATOM 1169 C6 U A 54 43.298 72.754 37.521 1.00 94.21 C
+ATOM 1170 P G A 55 47.525 74.791 34.471 1.00 97.86 P
+ATOM 1171 OP1 G A 55 48.367 75.702 33.647 1.00 97.40 O
+ATOM 1172 OP2 G A 55 46.754 73.696 33.816 1.00 97.86 O
+ATOM 1173 O5' G A 55 48.459 74.154 35.595 1.00 93.42 O
+ATOM 1174 C5' G A 55 49.390 74.964 36.297 1.00 88.24 C
+ATOM 1175 C4' G A 55 50.177 74.134 37.278 1.00 84.14 C
+ATOM 1176 O4' G A 55 49.264 73.510 38.217 1.00 83.46 O
+ATOM 1177 C3' G A 55 50.899 72.957 36.664 1.00 82.28 C
+ATOM 1178 O3' G A 55 52.132 73.333 36.107 1.00 79.65 O
+ATOM 1179 C2' G A 55 51.068 72.020 37.846 1.00 82.45 C
+ATOM 1180 O2' G A 55 52.130 72.351 38.713 1.00 84.02 O
+ATOM 1181 C1' G A 55 49.743 72.224 38.567 1.00 82.65 C
+ATOM 1182 N9 G A 55 48.800 71.227 38.088 1.00 81.63 N
+ATOM 1183 C8 G A 55 47.779 71.396 37.188 1.00 81.42 C
+ATOM 1184 N7 G A 55 47.143 70.286 36.929 1.00 81.40 N
+ATOM 1185 C5 G A 55 47.781 69.334 37.714 1.00 79.68 C
+ATOM 1186 C6 G A 55 47.541 67.944 37.855 1.00 79.26 C
+ATOM 1187 O6 G A 55 46.695 67.247 37.288 1.00 77.42 O
+ATOM 1188 N1 G A 55 48.419 67.366 38.763 1.00 79.31 N
+ATOM 1189 C2 G A 55 49.404 68.036 39.442 1.00 79.67 C
+ATOM 1190 N2 G A 55 50.148 67.311 40.283 1.00 79.56 N
+ATOM 1191 N3 G A 55 49.642 69.324 39.310 1.00 79.52 N
+ATOM 1192 C4 G A 55 48.797 69.905 38.440 1.00 80.03 C
+ATOM 1193 P G A 56 52.789 72.392 35.004 1.00 78.55 P
+ATOM 1194 OP1 G A 56 54.080 72.967 34.550 1.00 77.49 O
+ATOM 1195 OP2 G A 56 51.707 72.125 34.021 1.00 80.25 O
+ATOM 1196 O5' G A 56 53.090 71.050 35.801 1.00 75.12 O
+ATOM 1197 C5' G A 56 54.067 71.039 36.829 1.00 69.26 C
+ATOM 1198 C4' G A 56 54.371 69.628 37.263 1.00 65.32 C
+ATOM 1199 O4' G A 56 53.188 69.046 37.881 1.00 62.82 O
+ATOM 1200 C3' G A 56 54.686 68.665 36.136 1.00 63.79 C
+ATOM 1201 O3' G A 56 56.038 68.731 35.713 1.00 65.54 O
+ATOM 1202 C2' G A 56 54.375 67.320 36.769 1.00 62.66 C
+ATOM 1203 O2' G A 56 55.428 66.873 37.601 1.00 62.67 O
+ATOM 1204 C1' G A 56 53.141 67.657 37.609 1.00 60.08 C
+ATOM 1205 N9 G A 56 51.901 67.352 36.905 1.00 55.37 N
+ATOM 1206 C8 G A 56 51.122 68.217 36.174 1.00 55.74 C
+ATOM 1207 N7 G A 56 50.106 67.629 35.599 1.00 52.72 N
+ATOM 1208 C5 G A 56 50.214 66.302 35.990 1.00 50.91 C
+ATOM 1209 C6 G A 56 49.406 65.204 35.675 1.00 49.97 C
+ATOM 1210 O6 G A 56 48.416 65.180 34.958 1.00 50.77 O
+ATOM 1211 N1 G A 56 49.854 64.038 36.284 1.00 48.77 N
+ATOM 1212 C2 G A 56 50.958 63.951 37.093 1.00 50.36 C
+ATOM 1213 N2 G A 56 51.234 62.732 37.591 1.00 48.97 N
+ATOM 1214 N3 G A 56 51.734 64.983 37.392 1.00 51.51 N
+ATOM 1215 C4 G A 56 51.304 66.118 36.809 1.00 51.89 C
+ATOM 1216 P U A 57 56.393 68.380 34.188 1.00 68.18 P
+ATOM 1217 OP1 U A 57 57.633 67.563 34.126 1.00 68.19 O
+ATOM 1218 OP2 U A 57 56.289 69.634 33.385 1.00 68.11 O
+ATOM 1219 O5' U A 57 55.175 67.458 33.751 1.00 66.24 O
+ATOM 1220 C5' U A 57 55.324 66.486 32.736 1.00 62.03 C
+ATOM 1221 C4' U A 57 55.340 65.129 33.360 1.00 59.74 C
+ATOM 1222 O4' U A 57 54.232 65.038 34.289 1.00 57.88 O
+ATOM 1223 C3' U A 57 55.156 63.959 32.420 1.00 58.61 C
+ATOM 1224 O3' U A 57 56.382 63.599 31.803 1.00 58.26 O
+ATOM 1225 C2' U A 57 54.620 62.895 33.370 1.00 58.38 C
+ATOM 1226 O2' U A 57 55.622 62.306 34.173 1.00 58.99 O
+ATOM 1227 C1' U A 57 53.699 63.732 34.261 1.00 56.63 C
+ATOM 1228 N1 U A 57 52.361 63.811 33.672 1.00 55.20 N
+ATOM 1229 C2 U A 57 51.624 62.655 33.644 1.00 55.04 C
+ATOM 1230 O2 U A 57 52.044 61.605 34.100 1.00 55.79 O
+ATOM 1231 N3 U A 57 50.387 62.767 33.057 1.00 53.93 N
+ATOM 1232 C4 U A 57 49.831 63.906 32.503 1.00 53.12 C
+ATOM 1233 O4 U A 57 48.707 63.850 32.010 1.00 53.57 O
+ATOM 1234 C5 U A 57 50.660 65.073 32.575 1.00 52.60 C
+ATOM 1235 C6 U A 57 51.868 64.988 33.148 1.00 54.55 C
+ATOM 1236 P G A 58 56.449 63.448 30.205 1.00 60.26 P
+ATOM 1237 OP1 G A 58 57.754 62.807 29.877 1.00 60.58 O
+ATOM 1238 OP2 G A 58 56.111 64.754 29.597 1.00 58.54 O
+ATOM 1239 O5' G A 58 55.268 62.426 29.875 1.00 57.10 O
+ATOM 1240 C5' G A 58 55.312 61.107 30.387 1.00 55.69 C
+ATOM 1241 C4' G A 58 54.029 60.369 30.093 1.00 55.43 C
+ATOM 1242 O4' G A 58 52.921 61.007 30.791 1.00 55.24 O
+ATOM 1243 C3' G A 58 53.589 60.368 28.636 1.00 54.18 C
+ATOM 1244 O3' G A 58 54.246 59.338 27.923 1.00 53.96 O
+ATOM 1245 C2' G A 58 52.097 60.092 28.757 1.00 54.41 C
+ATOM 1246 O2' G A 58 51.846 58.731 29.012 1.00 57.23 O
+ATOM 1247 C1' G A 58 51.737 60.887 30.012 1.00 53.85 C
+ATOM 1248 N9 G A 58 51.267 62.217 29.656 1.00 53.03 N
+ATOM 1249 C8 G A 58 51.950 63.400 29.767 1.00 52.08 C
+ATOM 1250 N7 G A 58 51.278 64.419 29.308 1.00 51.44 N
+ATOM 1251 C5 G A 58 50.074 63.877 28.879 1.00 50.05 C
+ATOM 1252 C6 G A 58 48.951 64.496 28.292 1.00 50.75 C
+ATOM 1253 O6 G A 58 48.794 65.685 28.008 1.00 53.29 O
+ATOM 1254 N1 G A 58 47.939 63.583 28.022 1.00 50.16 N
+ATOM 1255 C2 G A 58 48.003 62.239 28.270 1.00 51.00 C
+ATOM 1256 N2 G A 58 46.914 61.522 27.924 1.00 50.63 N
+ATOM 1257 N3 G A 58 49.053 61.641 28.814 1.00 52.48 N
+ATOM 1258 C4 G A 58 50.045 62.521 29.095 1.00 51.88 C
+ATOM 1259 P C A 59 54.759 59.607 26.431 1.00 53.17 P
+ATOM 1260 OP1 C A 59 55.673 58.491 26.089 1.00 55.70 O
+ATOM 1261 OP2 C A 59 55.228 61.001 26.296 1.00 53.99 O
+ATOM 1262 O5' C A 59 53.445 59.435 25.560 1.00 54.08 O
+ATOM 1263 C5' C A 59 52.793 58.183 25.522 1.00 52.32 C
+ATOM 1264 C4' C A 59 51.386 58.359 25.064 1.00 52.96 C
+ATOM 1265 O4' C A 59 50.695 59.217 26.007 1.00 53.34 O
+ATOM 1266 C3' C A 59 51.248 59.093 23.746 1.00 54.55 C
+ATOM 1267 O3' C A 59 51.430 58.198 22.670 1.00 56.10 O
+ATOM 1268 C2' C A 59 49.826 59.625 23.841 1.00 54.97 C
+ATOM 1269 O2' C A 59 48.860 58.610 23.649 1.00 56.71 O
+ATOM 1270 C1' C A 59 49.766 60.033 25.310 1.00 55.15 C
+ATOM 1271 N1 C A 59 50.164 61.434 25.444 1.00 55.90 N
+ATOM 1272 C2 C A 59 49.218 62.407 25.156 1.00 56.55 C
+ATOM 1273 O2 C A 59 48.077 62.055 24.858 1.00 59.12 O
+ATOM 1274 N3 C A 59 49.563 63.702 25.209 1.00 56.90 N
+ATOM 1275 C4 C A 59 50.800 64.045 25.557 1.00 56.99 C
+ATOM 1276 N4 C A 59 51.083 65.348 25.606 1.00 57.32 N
+ATOM 1277 C5 C A 59 51.793 63.071 25.874 1.00 56.89 C
+ATOM 1278 C6 C A 59 51.433 61.787 25.809 1.00 56.91 C
+ATOM 1279 P C A 60 52.117 58.708 21.315 1.00 58.55 P
+ATOM 1280 OP1 C A 60 52.566 57.477 20.623 1.00 60.10 O
+ATOM 1281 OP2 C A 60 53.091 59.805 21.572 1.00 59.59 O
+ATOM 1282 O5' C A 60 50.930 59.382 20.504 1.00 58.02 O
+ATOM 1283 C5' C A 60 49.699 58.712 20.311 1.00 58.31 C
+ATOM 1284 C4' C A 60 48.692 59.668 19.729 1.00 60.59 C
+ATOM 1285 O4' C A 60 48.367 60.687 20.711 1.00 61.17 O
+ATOM 1286 C3' C A 60 49.215 60.451 18.536 1.00 61.75 C
+ATOM 1287 O3' C A 60 48.977 59.710 17.353 1.00 62.05 O
+ATOM 1288 C2' C A 60 48.336 61.689 18.549 1.00 62.65 C
+ATOM 1289 O2' C A 60 47.085 61.451 17.947 1.00 65.68 O
+ATOM 1290 C1' C A 60 48.151 61.920 20.050 1.00 62.43 C
+ATOM 1291 N1 C A 60 49.075 62.919 20.594 1.00 63.39 N
+ATOM 1292 C2 C A 60 48.741 64.252 20.458 1.00 63.93 C
+ATOM 1293 O2 C A 60 47.699 64.537 19.859 1.00 66.02 O
+ATOM 1294 N3 C A 60 49.552 65.196 20.975 1.00 64.43 N
+ATOM 1295 C4 C A 60 50.669 64.837 21.602 1.00 64.08 C
+ATOM 1296 N4 C A 60 51.437 65.800 22.106 1.00 64.35 N
+ATOM 1297 C5 C A 60 51.045 63.476 21.743 1.00 63.45 C
+ATOM 1298 C6 C A 60 50.228 62.556 21.229 1.00 63.91 C
+ATOM 1299 P A A 61 50.069 59.698 16.181 1.00 61.03 P
+ATOM 1300 OP1 A A 61 51.287 59.065 16.739 1.00 62.45 O
+ATOM 1301 OP2 A A 61 50.159 61.053 15.587 1.00 61.91 O
+ATOM 1302 O5' A A 61 49.427 58.698 15.124 1.00 60.51 O
+ATOM 1303 C5' A A 61 49.093 57.375 15.519 1.00 59.15 C
+ATOM 1304 C4' A A 61 48.325 56.663 14.432 1.00 57.25 C
+ATOM 1305 O4' A A 61 49.094 56.675 13.204 1.00 57.46 O
+ATOM 1306 C3' A A 61 48.113 55.187 14.715 1.00 56.35 C
+ATOM 1307 O3' A A 61 46.952 54.985 15.510 1.00 54.37 O
+ATOM 1308 C2' A A 61 47.924 54.610 13.325 1.00 56.77 C
+ATOM 1309 O2' A A 61 46.606 54.782 12.860 1.00 58.82 O
+ATOM 1310 C1' A A 61 48.893 55.462 12.506 1.00 56.45 C
+ATOM 1311 N9 A A 61 50.194 54.840 12.299 1.00 55.64 N
+ATOM 1312 C8 A A 61 51.375 55.127 12.934 1.00 56.06 C
+ATOM 1313 N7 A A 61 52.390 54.419 12.503 1.00 56.16 N
+ATOM 1314 C5 A A 61 51.836 53.608 11.524 1.00 55.20 C
+ATOM 1315 C6 A A 61 52.389 52.642 10.683 1.00 53.69 C
+ATOM 1316 N6 A A 61 53.685 52.311 10.692 1.00 53.61 N
+ATOM 1317 N1 A A 61 51.563 52.015 9.819 1.00 52.98 N
+ATOM 1318 C2 A A 61 50.275 52.347 9.811 1.00 52.85 C
+ATOM 1319 N3 A A 61 49.634 53.243 10.552 1.00 53.34 N
+ATOM 1320 C4 A A 61 50.484 53.847 11.397 1.00 55.08 C
+ATOM 1321 P A A 62 46.873 53.710 16.473 1.00 53.92 P
+ATOM 1322 OP1 A A 62 45.603 53.723 17.227 1.00 56.55 O
+ATOM 1323 OP2 A A 62 48.168 53.615 17.202 1.00 53.63 O
+ATOM 1324 O5' A A 62 46.816 52.489 15.470 1.00 54.86 O
+ATOM 1325 C5' A A 62 45.702 52.292 14.626 1.00 53.89 C
+ATOM 1326 C4' A A 62 45.976 51.126 13.735 1.00 54.46 C
+ATOM 1327 O4' A A 62 47.097 51.468 12.878 1.00 54.59 O
+ATOM 1328 C3' A A 62 46.438 49.885 14.479 1.00 53.52 C
+ATOM 1329 O3' A A 62 45.316 49.126 14.908 1.00 51.33 O
+ATOM 1330 C2' A A 62 47.214 49.158 13.396 1.00 54.74 C
+ATOM 1331 O2' A A 62 46.297 48.519 12.537 1.00 56.57 O
+ATOM 1332 C1' A A 62 47.893 50.323 12.664 1.00 54.85 C
+ATOM 1333 N9 A A 62 49.247 50.628 13.130 1.00 55.09 N
+ATOM 1334 C8 A A 62 49.610 51.419 14.192 1.00 55.06 C
+ATOM 1335 N7 A A 62 50.908 51.497 14.377 1.00 55.94 N
+ATOM 1336 C5 A A 62 51.434 50.706 13.369 1.00 54.99 C
+ATOM 1337 C6 A A 62 52.743 50.373 13.029 1.00 53.85 C
+ATOM 1338 N6 A A 62 53.812 50.830 13.683 1.00 52.77 N
+ATOM 1339 N1 A A 62 52.928 49.550 11.980 1.00 53.74 N
+ATOM 1340 C2 A A 62 51.858 49.111 11.318 1.00 54.27 C
+ATOM 1341 N3 A A 62 50.576 49.358 11.532 1.00 53.66 N
+ATOM 1342 C4 A A 62 50.426 50.169 12.589 1.00 55.03 C
+ATOM 1343 P U A 63 45.533 47.735 15.702 1.00 53.62 P
+ATOM 1344 OP1 U A 63 46.808 47.065 15.295 1.00 52.97 O
+ATOM 1345 OP2 U A 63 44.239 46.994 15.593 1.00 51.06 O
+ATOM 1346 O5' U A 63 45.691 48.165 17.223 1.00 51.23 O
+ATOM 1347 C5' U A 63 44.669 48.915 17.849 1.00 53.41 C
+ATOM 1348 C4' U A 63 44.630 48.623 19.322 1.00 54.01 C
+ATOM 1349 O4' U A 63 44.185 47.260 19.517 1.00 55.92 O
+ATOM 1350 C3' U A 63 46.012 48.682 19.940 1.00 54.73 C
+ATOM 1351 O3' U A 63 46.420 49.839 20.679 1.00 51.79 O
+ATOM 1352 C2' U A 63 46.533 47.253 20.033 1.00 54.94 C
+ATOM 1353 O2' U A 63 47.210 46.942 21.223 1.00 56.33 O
+ATOM 1354 C1' U A 63 45.234 46.451 20.007 1.00 57.13 C
+ATOM 1355 N1 U A 63 45.287 45.226 19.207 1.00 60.34 N
+ATOM 1356 C2 U A 63 45.138 44.028 19.869 1.00 61.56 C
+ATOM 1357 O2 U A 63 44.930 43.959 21.059 1.00 61.71 O
+ATOM 1358 N3 U A 63 45.231 42.914 19.079 1.00 64.02 N
+ATOM 1359 C4 U A 63 45.442 42.883 17.712 1.00 64.85 C
+ATOM 1360 O4 U A 63 45.492 41.795 17.125 1.00 65.14 O
+ATOM 1361 C5 U A 63 45.570 44.173 17.102 1.00 64.42 C
+ATOM 1362 C6 U A 63 45.489 45.272 17.855 1.00 62.18 C
+ATOM 1363 P U A 64 46.459 49.804 22.269 1.00 47.09 P
+ATOM 1364 OP1 U A 64 45.474 48.814 22.740 1.00 49.72 O
+ATOM 1365 OP2 U A 64 46.277 51.213 22.644 1.00 53.47 O
+ATOM 1366 O5' U A 64 47.944 49.291 22.621 1.00 48.05 O
+ATOM 1367 C5' U A 64 49.095 50.077 22.297 1.00 47.89 C
+ATOM 1368 C4' U A 64 50.371 49.234 22.232 1.00 47.96 C
+ATOM 1369 O4' U A 64 50.790 48.792 23.553 1.00 49.48 O
+ATOM 1370 C3' U A 64 50.175 47.926 21.478 1.00 49.78 C
+ATOM 1371 O3' U A 64 50.580 48.044 20.115 1.00 52.62 O
+ATOM 1372 C2' U A 64 51.262 47.014 22.015 1.00 48.66 C
+ATOM 1373 O2' U A 64 52.403 47.113 21.200 1.00 52.21 O
+ATOM 1374 C1' U A 64 51.487 47.568 23.418 1.00 47.24 C
+ATOM 1375 N1 U A 64 51.309 46.702 24.587 1.00 44.75 N
+ATOM 1376 C2 U A 64 52.389 45.900 24.918 1.00 43.26 C
+ATOM 1377 O2 U A 64 53.425 45.886 24.269 1.00 39.02 O
+ATOM 1378 N3 U A 64 52.214 45.120 26.034 1.00 42.01 N
+ATOM 1379 C4 U A 64 51.096 45.064 26.839 1.00 44.23 C
+ATOM 1380 O4 U A 64 51.140 44.403 27.873 1.00 46.83 O
+ATOM 1381 C5 U A 64 50.012 45.904 26.423 1.00 44.86 C
+ATOM 1382 C6 U A 64 50.152 46.679 25.333 1.00 46.40 C
+ATOM 1383 P C A 65 51.326 49.377 19.562 1.00 51.71 P
+ATOM 1384 OP1 C A 65 52.793 49.248 19.702 1.00 52.59 O
+ATOM 1385 OP2 C A 65 50.663 50.616 20.021 1.00 54.65 O
+ATOM 1386 O5' C A 65 50.956 49.256 18.023 1.00 51.76 O
+ATOM 1387 C5' C A 65 49.594 49.033 17.666 1.00 51.17 C
+ATOM 1388 C4' C A 65 49.473 47.942 16.630 1.00 50.61 C
+ATOM 1389 O4' C A 65 50.228 48.336 15.457 1.00 51.33 O
+ATOM 1390 C3' C A 65 50.034 46.584 17.008 1.00 50.04 C
+ATOM 1391 O3' C A 65 49.065 45.811 17.703 1.00 50.23 O
+ATOM 1392 C2' C A 65 50.312 45.974 15.645 1.00 50.59 C
+ATOM 1393 O2' C A 65 49.128 45.495 15.051 1.00 52.19 O
+ATOM 1394 C1' C A 65 50.793 47.192 14.856 1.00 50.72 C
+ATOM 1395 N1 C A 65 52.250 47.341 14.829 1.00 49.53 N
+ATOM 1396 C2 C A 65 52.951 46.590 13.916 1.00 49.03 C
+ATOM 1397 O2 C A 65 52.317 45.825 13.179 1.00 48.88 O
+ATOM 1398 N3 C A 65 54.296 46.704 13.849 1.00 49.20 N
+ATOM 1399 C4 C A 65 54.933 47.538 14.661 1.00 49.64 C
+ATOM 1400 N4 C A 65 56.250 47.644 14.526 1.00 48.30 N
+ATOM 1401 C5 C A 65 54.241 48.311 15.632 1.00 50.78 C
+ATOM 1402 C6 C A 65 52.905 48.188 15.676 1.00 49.60 C
+ATOM 1403 P C A 66 49.544 44.611 18.663 1.00 48.93 P
+ATOM 1404 OP1 C A 66 48.423 44.178 19.537 1.00 48.42 O
+ATOM 1405 OP2 C A 66 50.819 45.058 19.272 1.00 50.19 O
+ATOM 1406 O5' C A 66 49.908 43.433 17.666 1.00 49.16 O
+ATOM 1407 C5' C A 66 48.903 42.780 16.909 1.00 49.92 C
+ATOM 1408 C4' C A 66 49.538 41.774 15.989 1.00 50.54 C
+ATOM 1409 O4' C A 66 50.440 42.461 15.091 1.00 50.00 O
+ATOM 1410 C3' C A 66 50.440 40.788 16.695 1.00 51.95 C
+ATOM 1411 O3' C A 66 49.688 39.704 17.173 1.00 55.18 O
+ATOM 1412 C2' C A 66 51.380 40.343 15.597 1.00 51.22 C
+ATOM 1413 O2' C A 66 50.802 39.365 14.770 1.00 54.36 O
+ATOM 1414 C1' C A 66 51.558 41.640 14.822 1.00 49.83 C
+ATOM 1415 N1 C A 66 52.765 42.358 15.216 1.00 49.69 N
+ATOM 1416 C2 C A 66 53.962 41.892 14.740 1.00 49.58 C
+ATOM 1417 O2 C A 66 53.950 40.868 14.055 1.00 52.02 O
+ATOM 1418 N3 C A 66 55.105 42.549 15.034 1.00 48.70 N
+ATOM 1419 C4 C A 66 55.067 43.641 15.795 1.00 49.07 C
+ATOM 1420 N4 C A 66 56.224 44.276 16.032 1.00 50.40 N
+ATOM 1421 C5 C A 66 53.843 44.135 16.335 1.00 50.89 C
+ATOM 1422 C6 C A 66 52.720 43.464 16.021 1.00 49.92 C
+ATOM 1423 P U A 67 50.160 38.971 18.505 1.00 60.57 P
+ATOM 1424 OP1 U A 67 49.141 37.934 18.832 1.00 59.64 O
+ATOM 1425 OP2 U A 67 50.501 40.029 19.500 1.00 60.62 O
+ATOM 1426 O5' U A 67 51.540 38.286 18.096 1.00 58.02 O
+ATOM 1427 C5' U A 67 51.590 37.228 17.156 1.00 57.98 C
+ATOM 1428 C4' U A 67 53.024 36.859 16.894 1.00 60.31 C
+ATOM 1429 O4' U A 67 53.725 38.007 16.350 1.00 60.03 O
+ATOM 1430 C3' U A 67 53.814 36.475 18.130 1.00 62.18 C
+ATOM 1431 O3' U A 67 53.645 35.077 18.330 1.00 67.36 O
+ATOM 1432 C2' U A 67 55.243 36.786 17.716 1.00 60.43 C
+ATOM 1433 O2' U A 67 55.790 35.730 16.969 1.00 60.29 O
+ATOM 1434 C1' U A 67 55.052 38.027 16.836 1.00 59.24 C
+ATOM 1435 N1 U A 67 55.230 39.310 17.518 1.00 58.88 N
+ATOM 1436 C2 U A 67 56.440 39.956 17.379 1.00 58.64 C
+ATOM 1437 O2 U A 67 57.395 39.461 16.803 1.00 60.38 O
+ATOM 1438 N3 U A 67 56.493 41.205 17.945 1.00 57.00 N
+ATOM 1439 C4 U A 67 55.490 41.839 18.634 1.00 56.08 C
+ATOM 1440 O4 U A 67 55.624 43.017 18.919 1.00 57.14 O
+ATOM 1441 C5 U A 67 54.299 41.077 18.794 1.00 56.32 C
+ATOM 1442 C6 U A 67 54.210 39.869 18.243 1.00 58.50 C
+ATOM 1443 P G A 68 54.230 34.371 19.646 1.00 71.64 P
+ATOM 1444 OP1 G A 68 53.897 32.933 19.519 1.00 71.19 O
+ATOM 1445 OP2 G A 68 53.751 35.126 20.834 1.00 71.67 O
+ATOM 1446 O5' G A 68 55.806 34.568 19.513 1.00 71.77 O
+ATOM 1447 C5' G A 68 56.659 33.491 19.142 1.00 75.69 C
+ATOM 1448 C4' G A 68 58.091 33.830 19.491 1.00 79.27 C
+ATOM 1449 O4' G A 68 58.380 35.132 18.918 1.00 79.57 O
+ATOM 1450 C3' G A 68 58.385 34.004 20.980 1.00 81.28 C
+ATOM 1451 O3' G A 68 58.787 32.812 21.679 1.00 83.11 O
+ATOM 1452 C2' G A 68 59.584 34.943 20.956 1.00 82.22 C
+ATOM 1453 O2' G A 68 60.802 34.283 20.671 1.00 84.89 O
+ATOM 1454 C1' G A 68 59.236 35.853 19.782 1.00 81.50 C
+ATOM 1455 N9 G A 68 58.575 37.093 20.173 1.00 81.29 N
+ATOM 1456 C8 G A 68 57.250 37.289 20.478 1.00 81.20 C
+ATOM 1457 N7 G A 68 56.970 38.535 20.755 1.00 80.75 N
+ATOM 1458 C5 G A 68 58.186 39.194 20.627 1.00 80.02 C
+ATOM 1459 C6 G A 68 58.516 40.567 20.783 1.00 80.22 C
+ATOM 1460 O6 G A 68 57.767 41.520 21.044 1.00 80.59 O
+ATOM 1461 N1 G A 68 59.875 40.791 20.584 1.00 80.75 N
+ATOM 1462 C2 G A 68 60.798 39.828 20.258 1.00 80.78 C
+ATOM 1463 N2 G A 68 62.075 40.236 20.108 1.00 79.89 N
+ATOM 1464 N3 G A 68 60.496 38.555 20.089 1.00 80.70 N
+ATOM 1465 C4 G A 68 59.185 38.312 20.288 1.00 80.39 C
+ATOM 1466 P C A 69 59.229 31.475 20.876 1.00 84.26 P
+ATOM 1467 OP1 C A 69 60.580 31.681 20.282 1.00 80.96 O
+ATOM 1468 OP2 C A 69 58.112 30.992 20.017 1.00 83.67 O
+ATOM 1469 O5' C A 69 59.373 30.393 22.036 1.00 81.95 O
+ATOM 1470 C5' C A 69 60.304 30.567 23.099 1.00 78.18 C
+ATOM 1471 C4' C A 69 59.612 30.374 24.428 1.00 76.05 C
+ATOM 1472 O4' C A 69 58.981 31.619 24.844 1.00 74.44 O
+ATOM 1473 C3' C A 69 58.468 29.372 24.406 1.00 75.69 C
+ATOM 1474 O3' C A 69 58.908 28.028 24.532 1.00 76.59 O
+ATOM 1475 C2' C A 69 57.624 29.805 25.597 1.00 74.75 C
+ATOM 1476 O2' C A 69 58.123 29.297 26.823 1.00 74.80 O
+ATOM 1477 C1' C A 69 57.768 31.329 25.529 1.00 73.22 C
+ATOM 1478 N1 C A 69 56.654 31.993 24.829 1.00 70.35 N
+ATOM 1479 C2 C A 69 55.423 32.067 25.471 1.00 69.49 C
+ATOM 1480 O2 C A 69 55.308 31.549 26.584 1.00 69.27 O
+ATOM 1481 N3 C A 69 54.392 32.698 24.862 1.00 67.72 N
+ATOM 1482 C4 C A 69 54.563 33.232 23.651 1.00 68.13 C
+ATOM 1483 N4 C A 69 53.526 33.851 23.091 1.00 69.40 N
+ATOM 1484 C5 C A 69 55.807 33.158 22.964 1.00 66.89 C
+ATOM 1485 C6 C A 69 56.816 32.536 23.584 1.00 68.40 C
+ATOM 1486 P A A 70 57.971 26.841 23.990 1.00 76.83 P
+ATOM 1487 OP1 A A 70 58.699 25.566 24.172 1.00 76.97 O
+ATOM 1488 OP2 A A 70 57.496 27.236 22.638 1.00 78.32 O
+ATOM 1489 O5' A A 70 56.735 26.838 24.986 1.00 73.56 O
+ATOM 1490 C5' A A 70 56.921 26.420 26.317 1.00 71.88 C
+ATOM 1491 C4' A A 70 55.660 26.599 27.107 1.00 70.52 C
+ATOM 1492 O4' A A 70 55.305 28.006 27.120 1.00 70.13 O
+ATOM 1493 C3' A A 70 54.435 25.933 26.512 1.00 70.69 C
+ATOM 1494 O3' A A 70 54.363 24.549 26.820 1.00 72.81 O
+ATOM 1495 C2' A A 70 53.305 26.731 27.143 1.00 69.29 C
+ATOM 1496 O2' A A 70 53.075 26.359 28.482 1.00 69.16 O
+ATOM 1497 C1' A A 70 53.893 28.138 27.128 1.00 68.11 C
+ATOM 1498 N9 A A 70 53.470 28.894 25.952 1.00 64.00 N
+ATOM 1499 C8 A A 70 54.178 29.247 24.834 1.00 62.02 C
+ATOM 1500 N7 A A 70 53.474 29.925 23.959 1.00 60.61 N
+ATOM 1501 C5 A A 70 52.220 30.021 24.544 1.00 60.84 C
+ATOM 1502 C6 A A 70 51.013 30.616 24.123 1.00 60.96 C
+ATOM 1503 N6 A A 70 50.866 31.271 22.968 1.00 61.70 N
+ATOM 1504 N1 A A 70 49.944 30.517 24.947 1.00 58.65 N
+ATOM 1505 C2 A A 70 50.089 29.880 26.111 1.00 58.26 C
+ATOM 1506 N3 A A 70 51.171 29.287 26.616 1.00 60.01 N
+ATOM 1507 C4 A A 70 52.208 29.393 25.770 1.00 61.17 C
+ATOM 1508 P G A 71 53.262 23.639 26.088 1.00 73.21 P
+ATOM 1509 OP1 G A 71 53.410 22.249 26.575 1.00 75.65 O
+ATOM 1510 OP2 G A 71 53.327 23.913 24.628 1.00 74.68 O
+ATOM 1511 O5' G A 71 51.889 24.194 26.658 1.00 73.13 O
+ATOM 1512 C5' G A 71 51.545 23.948 28.006 1.00 73.66 C
+ATOM 1513 C4' G A 71 50.085 24.200 28.222 1.00 74.68 C
+ATOM 1514 O4' G A 71 49.834 25.619 28.061 1.00 74.96 O
+ATOM 1515 C3' G A 71 49.168 23.560 27.196 1.00 74.87 C
+ATOM 1516 O3' G A 71 48.900 22.193 27.431 1.00 77.06 O
+ATOM 1517 C2' G A 71 47.926 24.423 27.302 1.00 74.74 C
+ATOM 1518 O2' G A 71 47.160 24.095 28.450 1.00 73.45 O
+ATOM 1519 C1' G A 71 48.557 25.807 27.466 1.00 74.47 C
+ATOM 1520 N9 G A 71 48.732 26.500 26.190 1.00 73.18 N
+ATOM 1521 C8 G A 71 49.893 26.651 25.465 1.00 72.22 C
+ATOM 1522 N7 G A 71 49.730 27.362 24.379 1.00 71.34 N
+ATOM 1523 C5 G A 71 48.381 27.690 24.382 1.00 70.99 C
+ATOM 1524 C6 G A 71 47.614 28.457 23.459 1.00 70.89 C
+ATOM 1525 O6 G A 71 47.990 29.025 22.425 1.00 70.62 O
+ATOM 1526 N1 G A 71 46.279 28.535 23.845 1.00 70.13 N
+ATOM 1527 C2 G A 71 45.746 27.955 24.973 1.00 71.44 C
+ATOM 1528 N2 G A 71 44.437 28.147 25.177 1.00 71.27 N
+ATOM 1529 N3 G A 71 46.448 27.240 25.840 1.00 70.99 N
+ATOM 1530 C4 G A 71 47.749 27.153 25.486 1.00 71.48 C
+ATOM 1531 P C A 72 48.570 21.242 26.182 1.00 78.06 P
+ATOM 1532 OP1 C A 72 48.427 19.843 26.654 1.00 79.10 O
+ATOM 1533 OP2 C A 72 49.597 21.571 25.154 1.00 77.70 O
+ATOM 1534 O5' C A 72 47.129 21.735 25.716 1.00 76.34 O
+ATOM 1535 C5' C A 72 46.020 21.583 26.588 1.00 74.73 C
+ATOM 1536 C4' C A 72 44.789 22.243 26.020 1.00 74.94 C
+ATOM 1537 O4' C A 72 44.999 23.681 25.940 1.00 74.18 O
+ATOM 1538 C3' C A 72 44.435 21.873 24.594 1.00 74.74 C
+ATOM 1539 O3' C A 72 43.818 20.614 24.463 1.00 77.63 O
+ATOM 1540 C2' C A 72 43.573 23.046 24.163 1.00 72.71 C
+ATOM 1541 O2' C A 72 42.275 23.012 24.727 1.00 72.93 O
+ATOM 1542 C1' C A 72 44.345 24.199 24.789 1.00 70.56 C
+ATOM 1543 N1 C A 72 45.366 24.656 23.839 1.00 65.60 N
+ATOM 1544 C2 C A 72 44.983 25.549 22.825 1.00 62.36 C
+ATOM 1545 O2 C A 72 43.796 25.935 22.781 1.00 60.28 O
+ATOM 1546 N3 C A 72 45.908 25.962 21.926 1.00 58.47 N
+ATOM 1547 C4 C A 72 47.160 25.518 22.012 1.00 58.31 C
+ATOM 1548 N4 C A 72 48.035 25.941 21.095 1.00 57.64 N
+ATOM 1549 C5 C A 72 47.575 24.616 23.042 1.00 58.81 C
+ATOM 1550 C6 C A 72 46.656 24.215 23.923 1.00 61.58 C
+ATOM 1551 P G A 73 44.246 19.681 23.238 1.00 79.51 P
+ATOM 1552 OP1 G A 73 43.644 18.340 23.446 1.00 79.13 O
+ATOM 1553 OP2 G A 73 45.725 19.817 23.084 1.00 78.76 O
+ATOM 1554 O5' G A 73 43.539 20.372 21.992 1.00 77.35 O
+ATOM 1555 C5' G A 73 42.142 20.629 22.020 1.00 74.33 C
+ATOM 1556 C4' G A 73 41.738 21.509 20.863 1.00 72.37 C
+ATOM 1557 O4' G A 73 42.458 22.769 20.932 1.00 70.30 O
+ATOM 1558 C3' G A 73 42.087 21.020 19.470 1.00 72.08 C
+ATOM 1559 O3' G A 73 41.194 20.013 19.012 1.00 72.84 O
+ATOM 1560 C2' G A 73 41.929 22.305 18.670 1.00 70.65 C
+ATOM 1561 O2' G A 73 40.567 22.611 18.440 1.00 71.39 O
+ATOM 1562 C1' G A 73 42.536 23.329 19.632 1.00 67.90 C
+ATOM 1563 N9 G A 73 43.929 23.628 19.311 1.00 64.50 N
+ATOM 1564 C8 G A 73 45.070 23.161 19.922 1.00 62.79 C
+ATOM 1565 N7 G A 73 46.169 23.599 19.359 1.00 61.48 N
+ATOM 1566 C5 G A 73 45.722 24.411 18.322 1.00 61.69 C
+ATOM 1567 C6 G A 73 46.448 25.169 17.342 1.00 59.71 C
+ATOM 1568 O6 G A 73 47.679 25.276 17.188 1.00 57.76 O
+ATOM 1569 N1 G A 73 45.588 25.842 16.485 1.00 59.01 N
+ATOM 1570 C2 G A 73 44.216 25.798 16.549 1.00 61.75 C
+ATOM 1571 N2 G A 73 43.552 26.506 15.635 1.00 62.68 N
+ATOM 1572 N3 G A 73 43.537 25.106 17.443 1.00 62.36 N
+ATOM 1573 C4 G A 73 44.344 24.442 18.288 1.00 62.76 C
+ATOM 1574 P G A 74 41.787 18.637 18.416 1.00 74.17 P
+ATOM 1575 OP1 G A 74 40.716 17.600 18.506 1.00 74.30 O
+ATOM 1576 OP2 G A 74 43.117 18.392 19.042 1.00 71.62 O
+ATOM 1577 O5' G A 74 42.045 18.934 16.875 1.00 72.80 O
+ATOM 1578 C5' G A 74 42.905 19.983 16.477 1.00 71.35 C
+ATOM 1579 C4' G A 74 42.600 20.383 15.067 1.00 68.80 C
+ATOM 1580 O4' G A 74 43.028 21.760 14.917 1.00 69.15 O
+ATOM 1581 C3' G A 74 43.339 19.614 13.992 1.00 68.58 C
+ATOM 1582 O3' G A 74 42.846 18.468 13.299 1.00 71.01 O
+ATOM 1583 C2' G A 74 44.522 20.455 13.553 1.00 67.98 C
+ATOM 1584 O2' G A 74 44.576 20.558 12.143 1.00 68.13 O
+ATOM 1585 C1' G A 74 44.203 21.839 14.136 1.00 66.63 C
+ATOM 1586 N9 G A 74 45.323 22.134 15.022 1.00 63.24 N
+ATOM 1587 C8 G A 74 45.492 21.692 16.311 1.00 60.66 C
+ATOM 1588 N7 G A 74 46.701 21.882 16.760 1.00 60.19 N
+ATOM 1589 C5 G A 74 47.349 22.547 15.729 1.00 60.81 C
+ATOM 1590 C6 G A 74 48.677 23.004 15.635 1.00 61.76 C
+ATOM 1591 O6 G A 74 49.584 22.902 16.473 1.00 65.71 O
+ATOM 1592 N1 G A 74 48.918 23.642 14.418 1.00 60.45 N
+ATOM 1593 C2 G A 74 47.989 23.822 13.425 1.00 58.92 C
+ATOM 1594 N2 G A 74 48.406 24.479 12.330 1.00 58.54 N
+ATOM 1595 N3 G A 74 46.741 23.391 13.503 1.00 58.36 N
+ATOM 1596 C4 G A 74 46.494 22.764 14.674 1.00 60.52 C
+ATOM 1597 P A A 75 43.733 17.113 13.257 1.00 71.98 P
+ATOM 1598 OP1 A A 75 43.102 16.200 12.276 1.00 73.52 O
+ATOM 1599 OP2 A A 75 43.955 16.648 14.649 1.00 72.26 O
+ATOM 1600 O5' A A 75 45.151 17.547 12.672 1.00 68.58 O
+ATOM 1601 C5' A A 75 46.255 16.653 12.710 1.00 65.94 C
+ATOM 1602 C4' A A 75 47.133 16.874 11.504 1.00 65.49 C
+ATOM 1603 O4' A A 75 46.434 16.429 10.319 1.00 66.68 O
+ATOM 1604 C3' A A 75 47.472 18.333 11.260 1.00 65.46 C
+ATOM 1605 O3' A A 75 48.720 18.628 11.864 1.00 64.21 O
+ATOM 1606 C2' A A 75 47.592 18.420 9.750 1.00 64.16 C
+ATOM 1607 O2' A A 75 48.875 18.031 9.336 1.00 65.40 O
+ATOM 1608 C1' A A 75 46.555 17.396 9.295 1.00 64.67 C
+ATOM 1609 N9 A A 75 45.227 17.950 9.094 1.00 64.06 N
+ATOM 1610 C8 A A 75 44.138 17.744 9.898 1.00 64.00 C
+ATOM 1611 N7 A A 75 43.056 18.349 9.486 1.00 66.17 N
+ATOM 1612 C5 A A 75 43.463 19.001 8.332 1.00 65.71 C
+ATOM 1613 C6 A A 75 42.781 19.821 7.424 1.00 65.96 C
+ATOM 1614 N6 A A 75 41.490 20.141 7.546 1.00 67.52 N
+ATOM 1615 N1 A A 75 43.476 20.311 6.375 1.00 66.21 N
+ATOM 1616 C2 A A 75 44.770 19.991 6.260 1.00 66.15 C
+ATOM 1617 N3 A A 75 45.520 19.231 7.050 1.00 66.38 N
+ATOM 1618 C4 A A 75 44.799 18.763 8.080 1.00 64.69 C
+ATOM 1619 P A A 76 48.870 19.950 12.740 1.00 62.82 P
+ATOM 1620 OP1 A A 76 50.069 19.832 13.600 1.00 63.15 O
+ATOM 1621 OP2 A A 76 47.539 20.165 13.362 1.00 59.79 O
+ATOM 1622 O5' A A 76 49.159 21.073 11.650 1.00 60.99 O
+ATOM 1623 C5' A A 76 50.435 21.172 11.023 1.00 58.74 C
+ATOM 1624 C4' A A 76 50.317 21.995 9.775 1.00 57.81 C
+ATOM 1625 O4' A A 76 49.237 21.437 8.991 1.00 57.97 O
+ATOM 1626 C3' A A 76 49.940 23.455 9.967 1.00 56.91 C
+ATOM 1627 O3' A A 76 51.121 24.238 10.118 1.00 57.19 O
+ATOM 1628 C2' A A 76 49.263 23.779 8.643 1.00 56.44 C
+ATOM 1629 O2' A A 76 50.201 24.001 7.608 1.00 54.76 O
+ATOM 1630 C1' A A 76 48.515 22.475 8.363 1.00 55.29 C
+ATOM 1631 N9 A A 76 47.162 22.417 8.897 1.00 53.64 N
+ATOM 1632 C8 A A 76 46.775 21.938 10.128 1.00 53.02 C
+ATOM 1633 N7 A A 76 45.476 21.937 10.309 1.00 53.29 N
+ATOM 1634 C5 A A 76 44.974 22.466 9.127 1.00 53.22 C
+ATOM 1635 C6 A A 76 43.668 22.715 8.684 1.00 53.02 C
+ATOM 1636 N6 A A 76 42.582 22.451 9.400 1.00 52.94 N
+ATOM 1637 N1 A A 76 43.513 23.251 7.456 1.00 54.02 N
+ATOM 1638 C2 A A 76 44.606 23.509 6.723 1.00 53.06 C
+ATOM 1639 N3 A A 76 45.885 23.312 7.024 1.00 53.73 N
+ATOM 1640 C4 A A 76 46.004 22.782 8.255 1.00 54.00 C
+ATOM 1641 P A A 77 51.041 25.690 10.808 1.00 57.22 P
+ATOM 1642 OP1 A A 77 52.362 26.338 10.668 1.00 56.31 O
+ATOM 1643 OP2 A A 77 50.451 25.502 12.167 1.00 57.57 O
+ATOM 1644 O5' A A 77 50.023 26.495 9.880 1.00 57.05 O
+ATOM 1645 C5' A A 77 50.484 27.150 8.697 1.00 55.43 C
+ATOM 1646 C4' A A 77 49.318 27.660 7.869 1.00 55.21 C
+ATOM 1647 O4' A A 77 48.395 26.566 7.621 1.00 55.90 O
+ATOM 1648 C3' A A 77 48.457 28.764 8.470 1.00 54.93 C
+ATOM 1649 O3' A A 77 48.994 30.044 8.166 1.00 55.04 O
+ATOM 1650 C2' A A 77 47.149 28.572 7.719 1.00 55.16 C
+ATOM 1651 O2' A A 77 47.237 29.094 6.409 1.00 54.30 O
+ATOM 1652 C1' A A 77 47.068 27.048 7.639 1.00 54.33 C
+ATOM 1653 N9 A A 77 46.406 26.464 8.801 1.00 53.13 N
+ATOM 1654 C8 A A 77 46.987 26.001 9.955 1.00 52.87 C
+ATOM 1655 N7 A A 77 46.127 25.506 10.817 1.00 53.79 N
+ATOM 1656 C5 A A 77 44.899 25.658 10.187 1.00 52.32 C
+ATOM 1657 C6 A A 77 43.586 25.329 10.578 1.00 52.60 C
+ATOM 1658 N6 A A 77 43.286 24.748 11.739 1.00 55.40 N
+ATOM 1659 N1 A A 77 42.580 25.618 9.722 1.00 52.52 N
+ATOM 1660 C2 A A 77 42.887 26.202 8.552 1.00 52.91 C
+ATOM 1661 N3 A A 77 44.085 26.561 8.072 1.00 52.18 N
+ATOM 1662 C4 A A 77 45.056 26.256 8.949 1.00 52.16 C
+ATOM 1663 P C A 78 49.484 31.004 9.354 1.00 55.69 P
+ATOM 1664 OP1 C A 78 49.843 32.325 8.764 1.00 54.67 O
+ATOM 1665 OP2 C A 78 50.489 30.262 10.161 1.00 56.60 O
+ATOM 1666 O5' C A 78 48.186 31.175 10.259 1.00 54.42 O
+ATOM 1667 C5' C A 78 47.035 31.822 9.746 1.00 53.71 C
+ATOM 1668 C4' C A 78 45.790 31.247 10.370 1.00 53.69 C
+ATOM 1669 O4' C A 78 45.943 29.803 10.457 1.00 54.25 O
+ATOM 1670 C3' C A 78 45.529 31.646 11.808 1.00 53.72 C
+ATOM 1671 O3' C A 78 44.893 32.906 11.911 1.00 53.94 O
+ATOM 1672 C2' C A 78 44.636 30.518 12.292 1.00 53.88 C
+ATOM 1673 O2' C A 78 43.308 30.647 11.805 1.00 54.27 O
+ATOM 1674 C1' C A 78 45.305 29.325 11.623 1.00 52.32 C
+ATOM 1675 N1 C A 78 46.318 28.721 12.494 1.00 50.20 N
+ATOM 1676 C2 C A 78 45.883 27.995 13.596 1.00 48.56 C
+ATOM 1677 O2 C A 78 44.666 27.900 13.787 1.00 47.16 O
+ATOM 1678 N3 C A 78 46.789 27.419 14.418 1.00 48.57 N
+ATOM 1679 C4 C A 78 48.092 27.546 14.162 1.00 50.34 C
+ATOM 1680 N4 C A 78 48.958 26.946 14.992 1.00 49.92 N
+ATOM 1681 C5 C A 78 48.571 28.290 13.040 1.00 51.43 C
+ATOM 1682 C6 C A 78 47.654 28.859 12.238 1.00 49.99 C
+ATOM 1683 P G A 79 45.068 33.757 13.257 1.00 52.92 P
+ATOM 1684 OP1 G A 79 44.602 35.126 12.971 1.00 55.12 O
+ATOM 1685 OP2 G A 79 46.464 33.538 13.738 1.00 54.61 O
+ATOM 1686 O5' G A 79 44.053 33.066 14.268 1.00 52.03 O
+ATOM 1687 C5' G A 79 42.681 32.970 13.939 1.00 52.92 C
+ATOM 1688 C4' G A 79 41.965 32.101 14.936 1.00 53.20 C
+ATOM 1689 O4' G A 79 42.600 30.794 14.948 1.00 54.24 O
+ATOM 1690 C3' G A 79 42.120 32.560 16.371 1.00 54.77 C
+ATOM 1691 O3' G A 79 41.208 33.586 16.721 1.00 56.81 O
+ATOM 1692 C2' G A 79 41.863 31.284 17.147 1.00 54.49 C
+ATOM 1693 O2' G A 79 40.484 31.015 17.176 1.00 56.96 O
+ATOM 1694 C1' G A 79 42.546 30.252 16.255 1.00 53.50 C
+ATOM 1695 N9 G A 79 43.889 29.889 16.704 1.00 51.11 N
+ATOM 1696 C8 G A 79 45.106 30.274 16.195 1.00 50.11 C
+ATOM 1697 N7 G A 79 46.120 29.761 16.851 1.00 48.60 N
+ATOM 1698 C5 G A 79 45.529 28.995 17.849 1.00 47.30 C
+ATOM 1699 C6 G A 79 46.111 28.202 18.879 1.00 46.07 C
+ATOM 1700 O6 G A 79 47.321 28.008 19.130 1.00 45.96 O
+ATOM 1701 N1 G A 79 45.139 27.600 19.665 1.00 43.73 N
+ATOM 1702 C2 G A 79 43.785 27.738 19.492 1.00 48.40 C
+ATOM 1703 N2 G A 79 42.983 27.078 20.352 1.00 51.24 N
+ATOM 1704 N3 G A 79 43.236 28.469 18.544 1.00 49.81 N
+ATOM 1705 C4 G A 79 44.158 29.064 17.767 1.00 49.45 C
+ATOM 1706 P U A 80 41.696 34.744 17.718 1.00 57.91 P
+ATOM 1707 OP1 U A 80 40.668 35.811 17.699 1.00 58.33 O
+ATOM 1708 OP2 U A 80 43.105 35.066 17.387 1.00 55.86 O
+ATOM 1709 O5' U A 80 41.666 34.031 19.139 1.00 59.76 O
+ATOM 1710 C5' U A 80 40.441 33.510 19.646 1.00 60.84 C
+ATOM 1711 C4' U A 80 40.693 32.611 20.834 1.00 61.61 C
+ATOM 1712 O4' U A 80 41.480 31.465 20.405 1.00 61.05 O
+ATOM 1713 C3' U A 80 41.535 33.217 21.943 1.00 62.84 C
+ATOM 1714 O3' U A 80 40.767 34.025 22.818 1.00 67.34 O
+ATOM 1715 C2' U A 80 42.082 31.983 22.640 1.00 61.11 C
+ATOM 1716 O2' U A 80 41.107 31.381 23.464 1.00 61.83 O
+ATOM 1717 C1' U A 80 42.354 31.067 21.450 1.00 58.89 C
+ATOM 1718 N1 U A 80 43.737 31.189 20.978 1.00 55.50 N
+ATOM 1719 C2 U A 80 44.688 30.431 21.622 1.00 53.56 C
+ATOM 1720 O2 U A 80 44.415 29.688 22.539 1.00 54.05 O
+ATOM 1721 N3 U A 80 45.971 30.581 21.159 1.00 50.66 N
+ATOM 1722 C4 U A 80 46.386 31.399 20.140 1.00 50.72 C
+ATOM 1723 O4 U A 80 47.579 31.424 19.832 1.00 49.30 O
+ATOM 1724 C5 U A 80 45.339 32.157 19.520 1.00 52.21 C
+ATOM 1725 C6 U A 80 44.078 32.027 19.950 1.00 54.00 C
+ATOM 1726 P U A 81 41.512 35.096 23.759 1.00 69.99 P
+ATOM 1727 OP1 U A 81 40.440 35.890 24.422 1.00 70.01 O
+ATOM 1728 OP2 U A 81 42.570 35.792 22.973 1.00 68.74 O
+ATOM 1729 O5' U A 81 42.243 34.197 24.853 1.00 69.66 O
+ATOM 1730 C5' U A 81 41.492 33.546 25.869 1.00 69.69 C
+ATOM 1731 C4' U A 81 42.411 32.874 26.858 1.00 70.12 C
+ATOM 1732 O4' U A 81 43.154 31.827 26.185 1.00 70.30 O
+ATOM 1733 C3' U A 81 43.492 33.765 27.442 1.00 71.48 C
+ATOM 1734 O3' U A 81 43.008 34.521 28.543 1.00 73.23 O
+ATOM 1735 C2' U A 81 44.548 32.755 27.868 1.00 71.16 C
+ATOM 1736 O2' U A 81 44.243 32.119 29.088 1.00 72.71 O
+ATOM 1737 C1' U A 81 44.455 31.733 26.740 1.00 69.65 C
+ATOM 1738 N1 U A 81 45.445 32.005 25.694 1.00 67.60 N
+ATOM 1739 C2 U A 81 46.694 31.456 25.857 1.00 67.36 C
+ATOM 1740 O2 U A 81 46.984 30.751 26.806 1.00 69.28 O
+ATOM 1741 N3 U A 81 47.595 31.762 24.873 1.00 65.88 N
+ATOM 1742 C4 U A 81 47.377 32.543 23.770 1.00 64.36 C
+ATOM 1743 O4 U A 81 48.298 32.741 22.977 1.00 63.94 O
+ATOM 1744 C5 U A 81 46.053 33.070 23.668 1.00 66.08 C
+ATOM 1745 C6 U A 81 45.152 32.786 24.610 1.00 67.30 C
+ATOM 1746 P G A 82 43.833 35.803 29.047 1.00 74.81 P
+ATOM 1747 OP1 G A 82 43.043 36.432 30.132 1.00 76.99 O
+ATOM 1748 OP2 G A 82 44.213 36.612 27.861 1.00 76.87 O
+ATOM 1749 O5' G A 82 45.157 35.176 29.671 1.00 72.53 O
+ATOM 1750 C5' G A 82 45.067 34.297 30.782 1.00 72.61 C
+ATOM 1751 C4' G A 82 46.398 33.635 31.056 1.00 73.05 C
+ATOM 1752 O4' G A 82 46.808 32.836 29.908 1.00 72.32 O
+ATOM 1753 C3' G A 82 47.550 34.606 31.244 1.00 73.03 C
+ATOM 1754 O3' G A 82 47.600 35.046 32.591 1.00 73.81 O
+ATOM 1755 C2' G A 82 48.762 33.750 30.917 1.00 71.15 C
+ATOM 1756 O2' G A 82 49.183 32.982 32.016 1.00 71.55 O
+ATOM 1757 C1' G A 82 48.219 32.851 29.809 1.00 70.45 C
+ATOM 1758 N9 G A 82 48.606 33.304 28.483 1.00 69.22 N
+ATOM 1759 C8 G A 82 47.862 34.024 27.586 1.00 68.93 C
+ATOM 1760 N7 G A 82 48.523 34.307 26.494 1.00 68.74 N
+ATOM 1761 C5 G A 82 49.772 33.732 26.686 1.00 66.17 C
+ATOM 1762 C6 G A 82 50.914 33.717 25.853 1.00 65.71 C
+ATOM 1763 O6 G A 82 51.064 34.234 24.737 1.00 67.39 O
+ATOM 1764 N1 G A 82 51.960 33.015 26.437 1.00 65.06 N
+ATOM 1765 C2 G A 82 51.910 32.409 27.667 1.00 65.49 C
+ATOM 1766 N2 G A 82 53.019 31.776 28.066 1.00 66.07 N
+ATOM 1767 N3 G A 82 50.854 32.422 28.450 1.00 65.40 N
+ATOM 1768 C4 G A 82 49.832 33.098 27.902 1.00 67.06 C
+ATOM 1769 P A A 83 48.714 36.110 33.037 1.00 75.74 P
+ATOM 1770 OP1 A A 83 48.454 36.457 34.461 1.00 76.19 O
+ATOM 1771 OP2 A A 83 48.787 37.192 32.017 1.00 75.92 O
+ATOM 1772 O5' A A 83 50.084 35.306 32.950 1.00 73.07 O
+ATOM 1773 C5' A A 83 51.311 35.996 32.798 1.00 71.48 C
+ATOM 1774 C4' A A 83 52.389 35.042 32.352 1.00 72.32 C
+ATOM 1775 O4' A A 83 52.006 34.431 31.092 1.00 71.90 O
+ATOM 1776 C3' A A 83 53.717 35.706 32.044 1.00 72.39 C
+ATOM 1777 O3' A A 83 54.479 35.854 33.223 1.00 73.75 O
+ATOM 1778 C2' A A 83 54.367 34.722 31.088 1.00 71.88 C
+ATOM 1779 O2' A A 83 55.011 33.652 31.742 1.00 73.47 O
+ATOM 1780 C1' A A 83 53.158 34.234 30.289 1.00 70.66 C
+ATOM 1781 N9 A A 83 52.993 34.981 29.046 1.00 68.56 N
+ATOM 1782 C8 A A 83 51.908 35.688 28.594 1.00 67.12 C
+ATOM 1783 N7 A A 83 52.100 36.253 27.425 1.00 66.12 N
+ATOM 1784 C5 A A 83 53.397 35.888 27.088 1.00 66.03 C
+ATOM 1785 C6 A A 83 54.198 36.164 25.971 1.00 66.42 C
+ATOM 1786 N6 A A 83 53.795 36.897 24.937 1.00 66.62 N
+ATOM 1787 N1 A A 83 55.448 35.651 25.951 1.00 66.47 N
+ATOM 1788 C2 A A 83 55.854 34.913 26.993 1.00 65.81 C
+ATOM 1789 N3 A A 83 55.194 34.582 28.094 1.00 66.02 N
+ATOM 1790 C4 A A 83 53.956 35.106 28.078 1.00 66.63 C
+ATOM 1791 P A A 84 55.352 37.173 33.429 1.00 74.69 P
+ATOM 1792 OP1 A A 84 56.069 37.043 34.725 1.00 74.75 O
+ATOM 1793 OP2 A A 84 54.440 38.322 33.207 1.00 72.53 O
+ATOM 1794 O5' A A 84 56.405 37.108 32.237 1.00 72.08 O
+ATOM 1795 C5' A A 84 57.422 36.109 32.201 1.00 70.69 C
+ATOM 1796 C4' A A 84 58.311 36.343 31.007 1.00 69.31 C
+ATOM 1797 O4' A A 84 57.606 35.966 29.799 1.00 68.54 O
+ATOM 1798 C3' A A 84 58.703 37.790 30.786 1.00 69.05 C
+ATOM 1799 O3' A A 84 59.818 38.159 31.581 1.00 71.70 O
+ATOM 1800 C2' A A 84 58.992 37.827 29.289 1.00 67.78 C
+ATOM 1801 O2' A A 84 60.283 37.385 28.923 1.00 68.74 O
+ATOM 1802 C1' A A 84 57.912 36.881 28.759 1.00 66.10 C
+ATOM 1803 N9 A A 84 56.685 37.615 28.467 1.00 62.63 N
+ATOM 1804 C8 A A 84 55.570 37.709 29.260 1.00 60.97 C
+ATOM 1805 N7 A A 84 54.624 38.454 28.752 1.00 60.47 N
+ATOM 1806 C5 A A 84 55.149 38.877 27.539 1.00 58.77 C
+ATOM 1807 C6 A A 84 54.633 39.693 26.524 1.00 57.48 C
+ATOM 1808 N6 A A 84 53.422 40.254 26.573 1.00 58.08 N
+ATOM 1809 N1 A A 84 55.411 39.919 25.444 1.00 57.00 N
+ATOM 1810 C2 A A 84 56.628 39.354 25.400 1.00 57.46 C
+ATOM 1811 N3 A A 84 57.223 38.568 26.295 1.00 58.36 N
+ATOM 1812 C4 A A 84 56.419 38.367 27.352 1.00 59.63 C
+ATOM 1813 P A A 85 60.045 39.705 31.960 1.00 72.98 P
+ATOM 1814 OP1 A A 85 61.385 39.797 32.591 1.00 74.48 O
+ATOM 1815 OP2 A A 85 58.855 40.226 32.685 1.00 72.40 O
+ATOM 1816 O5' A A 85 60.110 40.435 30.548 1.00 70.44 O
+ATOM 1817 C5' A A 85 61.253 40.307 29.714 1.00 66.23 C
+ATOM 1818 C4' A A 85 61.044 41.084 28.441 1.00 64.90 C
+ATOM 1819 O4' A A 85 59.882 40.545 27.748 1.00 62.64 O
+ATOM 1820 C3' A A 85 60.699 42.549 28.626 1.00 62.94 C
+ATOM 1821 O3' A A 85 61.844 43.363 28.835 1.00 63.23 O
+ATOM 1822 C2' A A 85 59.984 42.868 27.322 1.00 61.52 C
+ATOM 1823 O2' A A 85 60.881 43.020 26.246 1.00 61.55 O
+ATOM 1824 C1' A A 85 59.174 41.592 27.113 1.00 58.58 C
+ATOM 1825 N9 A A 85 57.869 41.712 27.755 1.00 55.06 N
+ATOM 1826 C8 A A 85 57.468 41.210 28.962 1.00 53.46 C
+ATOM 1827 N7 A A 85 56.235 41.526 29.280 1.00 53.24 N
+ATOM 1828 C5 A A 85 55.794 42.281 28.202 1.00 51.20 C
+ATOM 1829 C6 A A 85 54.571 42.927 27.926 1.00 51.15 C
+ATOM 1830 N6 A A 85 53.514 42.908 28.743 1.00 50.33 N
+ATOM 1831 N1 A A 85 54.469 43.605 26.763 1.00 51.08 N
+ATOM 1832 C2 A A 85 55.521 43.623 25.939 1.00 49.66 C
+ATOM 1833 N3 A A 85 56.712 43.057 26.085 1.00 51.02 N
+ATOM 1834 C4 A A 85 56.787 42.396 27.253 1.00 52.63 C
+ATOM 1835 P G A 86 61.717 44.687 29.747 1.00 63.01 P
+ATOM 1836 OP1 G A 86 63.080 45.233 29.962 1.00 63.49 O
+ATOM 1837 OP2 G A 86 60.860 44.331 30.912 1.00 62.23 O
+ATOM 1838 O5' G A 86 60.926 45.717 28.830 1.00 60.62 O
+ATOM 1839 C5' G A 86 61.397 46.003 27.524 1.00 57.16 C
+ATOM 1840 C4' G A 86 60.338 46.713 26.717 1.00 54.53 C
+ATOM 1841 O4' G A 86 59.166 45.857 26.587 1.00 53.07 O
+ATOM 1842 C3' G A 86 59.774 47.960 27.371 1.00 53.14 C
+ATOM 1843 O3' G A 86 60.618 49.084 27.216 1.00 51.63 O
+ATOM 1844 C2' G A 86 58.432 48.112 26.672 1.00 52.73 C
+ATOM 1845 O2' G A 86 58.570 48.629 25.368 1.00 50.58 O
+ATOM 1846 C1' G A 86 57.994 46.657 26.559 1.00 51.72 C
+ATOM 1847 N9 G A 86 57.100 46.230 27.628 1.00 50.07 N
+ATOM 1848 C8 G A 86 57.353 45.289 28.594 1.00 50.13 C
+ATOM 1849 N7 G A 86 56.333 45.083 29.386 1.00 49.23 N
+ATOM 1850 C5 G A 86 55.355 45.948 28.923 1.00 48.44 C
+ATOM 1851 C6 G A 86 54.036 46.158 29.377 1.00 50.00 C
+ATOM 1852 O6 G A 86 53.447 45.603 30.304 1.00 52.45 O
+ATOM 1853 N1 G A 86 53.379 47.127 28.628 1.00 49.28 N
+ATOM 1854 C2 G A 86 53.924 47.806 27.575 1.00 48.05 C
+ATOM 1855 N2 G A 86 53.121 48.698 27.001 1.00 46.91 N
+ATOM 1856 N3 G A 86 55.161 47.618 27.128 1.00 47.93 N
+ATOM 1857 C4 G A 86 55.814 46.677 27.847 1.00 48.84 C
+ATOM 1858 P A A 87 60.528 50.278 28.276 1.00 48.22 P
+ATOM 1859 OP1 A A 87 61.493 51.324 27.903 1.00 50.47 O
+ATOM 1860 OP2 A A 87 60.599 49.663 29.612 1.00 48.71 O
+ATOM 1861 O5' A A 87 59.072 50.870 28.036 1.00 47.96 O
+ATOM 1862 C5' A A 87 58.810 51.665 26.888 1.00 45.52 C
+ATOM 1863 C4' A A 87 57.420 52.245 26.944 1.00 45.17 C
+ATOM 1864 O4' A A 87 56.474 51.163 27.023 1.00 44.86 O
+ATOM 1865 C3' A A 87 57.104 53.065 28.183 1.00 47.55 C
+ATOM 1866 O3' A A 87 57.553 54.398 28.043 1.00 48.74 O
+ATOM 1867 C2' A A 87 55.590 52.985 28.257 1.00 45.69 C
+ATOM 1868 O2' A A 87 54.966 53.829 27.315 1.00 46.31 O
+ATOM 1869 C1' A A 87 55.363 51.547 27.819 1.00 43.13 C
+ATOM 1870 N9 A A 87 55.242 50.601 28.918 1.00 40.51 N
+ATOM 1871 C8 A A 87 56.174 49.711 29.374 1.00 40.58 C
+ATOM 1872 N7 A A 87 55.738 48.948 30.344 1.00 41.86 N
+ATOM 1873 C5 A A 87 54.439 49.376 30.546 1.00 38.70 C
+ATOM 1874 C6 A A 87 53.436 48.953 31.422 1.00 38.67 C
+ATOM 1875 N6 A A 87 53.591 47.957 32.293 1.00 38.56 N
+ATOM 1876 N1 A A 87 52.246 49.589 31.368 1.00 40.88 N
+ATOM 1877 C2 A A 87 52.088 50.575 30.477 1.00 41.68 C
+ATOM 1878 N3 A A 87 52.958 51.054 29.589 1.00 40.58 N
+ATOM 1879 C4 A A 87 54.126 50.402 29.681 1.00 39.79 C
+ATOM 1880 P U A 88 58.198 55.136 29.302 1.00 48.29 P
+ATOM 1881 OP1 U A 88 58.993 56.266 28.738 1.00 47.03 O
+ATOM 1882 OP2 U A 88 58.870 54.083 30.122 1.00 47.21 O
+ATOM 1883 O5' U A 88 56.917 55.689 30.075 1.00 47.92 O
+ATOM 1884 C5' U A 88 56.127 56.707 29.482 1.00 47.38 C
+ATOM 1885 C4' U A 88 54.808 56.850 30.197 1.00 47.01 C
+ATOM 1886 O4' U A 88 54.078 55.598 30.095 1.00 47.37 O
+ATOM 1887 C3' U A 88 54.903 57.067 31.692 1.00 47.34 C
+ATOM 1888 O3' U A 88 55.161 58.407 32.052 1.00 47.14 O
+ATOM 1889 C2' U A 88 53.536 56.615 32.152 1.00 46.01 C
+ATOM 1890 O2' U A 88 52.617 57.604 31.753 1.00 46.16 O
+ATOM 1891 C1' U A 88 53.334 55.384 31.278 1.00 44.84 C
+ATOM 1892 N1 U A 88 53.835 54.171 31.938 1.00 43.85 N
+ATOM 1893 C2 U A 88 53.089 53.677 32.974 1.00 44.35 C
+ATOM 1894 O2 U A 88 52.073 54.213 33.349 1.00 47.48 O
+ATOM 1895 N3 U A 88 53.572 52.538 33.563 1.00 42.79 N
+ATOM 1896 C4 U A 88 54.705 51.864 33.226 1.00 43.22 C
+ATOM 1897 O4 U A 88 55.018 50.851 33.858 1.00 44.99 O
+ATOM 1898 C5 U A 88 55.436 52.443 32.140 1.00 43.46 C
+ATOM 1899 C6 U A 88 54.985 53.554 31.549 1.00 43.73 C
+ATOM 1900 P G A 89 56.009 58.702 33.383 1.00 46.16 P
+ATOM 1901 OP1 G A 89 56.494 60.099 33.290 1.00 45.41 O
+ATOM 1902 OP2 G A 89 56.980 57.592 33.512 1.00 42.04 O
+ATOM 1903 O5' G A 89 54.938 58.588 34.557 1.00 45.55 O
+ATOM 1904 C5' G A 89 53.772 59.397 34.546 1.00 45.93 C
+ATOM 1905 C4' G A 89 52.792 58.945 35.610 1.00 47.23 C
+ATOM 1906 O4' G A 89 52.385 57.568 35.369 1.00 48.15 O
+ATOM 1907 C3' G A 89 53.329 58.926 37.034 1.00 47.10 C
+ATOM 1908 O3' G A 89 53.245 60.232 37.593 1.00 48.88 O
+ATOM 1909 C2' G A 89 52.396 57.933 37.723 1.00 46.50 C
+ATOM 1910 O2' G A 89 51.145 58.503 38.102 1.00 44.07 O
+ATOM 1911 C1' G A 89 52.178 56.906 36.608 1.00 45.89 C
+ATOM 1912 N9 G A 89 53.064 55.750 36.658 1.00 43.74 N
+ATOM 1913 C8 G A 89 54.217 55.571 35.944 1.00 43.64 C
+ATOM 1914 N7 G A 89 54.781 54.412 36.166 1.00 43.02 N
+ATOM 1915 C5 G A 89 53.952 53.797 37.091 1.00 41.41 C
+ATOM 1916 C6 G A 89 54.056 52.525 37.720 1.00 41.45 C
+ATOM 1917 O6 G A 89 54.923 51.659 37.572 1.00 42.99 O
+ATOM 1918 N1 G A 89 53.011 52.301 38.601 1.00 40.30 N
+ATOM 1919 C2 G A 89 51.997 53.182 38.846 1.00 43.16 C
+ATOM 1920 N2 G A 89 51.077 52.782 39.723 1.00 44.32 N
+ATOM 1921 N3 G A 89 51.887 54.375 38.271 1.00 43.05 N
+ATOM 1922 C4 G A 89 52.893 54.612 37.411 1.00 41.85 C
+ATOM 1923 P A A 90 54.261 60.673 38.754 1.00 49.33 P
+ATOM 1924 OP1 A A 90 53.796 62.025 39.132 1.00 50.89 O
+ATOM 1925 OP2 A A 90 55.663 60.483 38.318 1.00 50.02 O
+ATOM 1926 O5' A A 90 53.920 59.654 39.935 1.00 48.11 O
+ATOM 1927 C5' A A 90 52.697 59.783 40.661 1.00 46.82 C
+ATOM 1928 C4' A A 90 52.547 58.662 41.657 1.00 46.54 C
+ATOM 1929 O4' A A 90 52.472 57.405 40.938 1.00 46.05 O
+ATOM 1930 C3' A A 90 53.729 58.460 42.584 1.00 48.87 C
+ATOM 1931 O3' A A 90 53.706 59.332 43.695 1.00 53.87 O
+ATOM 1932 C2' A A 90 53.565 57.013 43.002 1.00 47.31 C
+ATOM 1933 O2' A A 90 52.561 56.871 43.985 1.00 50.65 O
+ATOM 1934 C1' A A 90 53.097 56.384 41.694 1.00 43.08 C
+ATOM 1935 N9 A A 90 54.200 55.832 40.911 1.00 39.20 N
+ATOM 1936 C8 A A 90 54.964 56.432 39.942 1.00 37.90 C
+ATOM 1937 N7 A A 90 55.882 55.642 39.432 1.00 35.96 N
+ATOM 1938 C5 A A 90 55.706 54.448 40.111 1.00 34.77 C
+ATOM 1939 C6 A A 90 56.367 53.206 40.038 1.00 37.49 C
+ATOM 1940 N6 A A 90 57.370 52.939 39.203 1.00 40.40 N
+ATOM 1941 N1 A A 90 55.950 52.227 40.865 1.00 37.63 N
+ATOM 1942 C2 A A 90 54.933 52.484 41.695 1.00 37.37 C
+ATOM 1943 N3 A A 90 54.233 53.606 41.850 1.00 35.09 N
+ATOM 1944 C4 A A 90 54.677 54.554 41.023 1.00 35.63 C
+ATOM 1945 P G A 91 55.092 59.795 44.359 1.00 56.70 P
+ATOM 1946 OP1 G A 91 54.771 60.922 45.270 1.00 57.70 O
+ATOM 1947 OP2 G A 91 56.117 59.995 43.298 1.00 55.05 O
+ATOM 1948 O5' G A 91 55.497 58.514 45.213 1.00 54.40 O
+ATOM 1949 C5' G A 91 54.652 58.066 46.257 1.00 55.05 C
+ATOM 1950 C4' G A 91 55.146 56.755 46.819 1.00 57.40 C
+ATOM 1951 O4' G A 91 54.959 55.689 45.845 1.00 57.63 O
+ATOM 1952 C3' G A 91 56.630 56.703 47.121 1.00 58.60 C
+ATOM 1953 O3' G A 91 56.928 57.302 48.366 1.00 62.00 O
+ATOM 1954 C2' G A 91 56.905 55.208 47.110 1.00 57.65 C
+ATOM 1955 O2' G A 91 56.449 54.586 48.296 1.00 61.81 O
+ATOM 1956 C1' G A 91 56.021 54.752 45.950 1.00 56.16 C
+ATOM 1957 N9 G A 91 56.782 54.738 44.704 1.00 51.72 N
+ATOM 1958 C8 G A 91 56.926 55.756 43.791 1.00 49.57 C
+ATOM 1959 N7 G A 91 57.738 55.451 42.813 1.00 47.94 N
+ATOM 1960 C5 G A 91 58.138 54.151 43.090 1.00 47.47 C
+ATOM 1961 C6 G A 91 59.021 53.291 42.388 1.00 48.13 C
+ATOM 1962 O6 G A 91 59.639 53.516 41.342 1.00 49.59 O
+ATOM 1963 N1 G A 91 59.152 52.056 43.022 1.00 46.53 N
+ATOM 1964 C2 G A 91 58.509 51.695 44.184 1.00 45.93 C
+ATOM 1965 N2 G A 91 58.759 50.457 44.657 1.00 43.94 N
+ATOM 1966 N3 G A 91 57.678 52.491 44.842 1.00 46.16 N
+ATOM 1967 C4 G A 91 57.544 53.693 44.244 1.00 48.37 C
+ATOM 1968 P C A 92 58.460 57.535 48.781 1.00 65.24 P
+ATOM 1969 OP1 C A 92 58.483 58.295 50.060 1.00 65.63 O
+ATOM 1970 OP2 C A 92 59.219 58.050 47.604 1.00 65.80 O
+ATOM 1971 O5' C A 92 58.959 56.063 49.081 1.00 61.36 O
+ATOM 1972 C5' C A 92 60.332 55.789 49.189 1.00 58.00 C
+ATOM 1973 C4' C A 92 60.583 54.344 48.883 1.00 54.97 C
+ATOM 1974 O4' C A 92 59.894 53.989 47.667 1.00 54.29 O
+ATOM 1975 C3' C A 92 62.029 54.026 48.617 1.00 55.01 C
+ATOM 1976 O3' C A 92 62.681 53.819 49.854 1.00 55.30 O
+ATOM 1977 C2' C A 92 61.934 52.781 47.754 1.00 53.19 C
+ATOM 1978 O2' C A 92 61.752 51.585 48.477 1.00 54.48 O
+ATOM 1979 C1' C A 92 60.689 53.090 46.926 1.00 52.53 C
+ATOM 1980 N1 C A 92 61.028 53.742 45.664 1.00 49.85 N
+ATOM 1981 C2 C A 92 61.710 53.010 44.726 1.00 49.42 C
+ATOM 1982 O2 C A 92 61.987 51.826 44.989 1.00 51.77 O
+ATOM 1983 N3 C A 92 62.054 53.592 43.561 1.00 49.14 N
+ATOM 1984 C4 C A 92 61.722 54.858 43.328 1.00 49.22 C
+ATOM 1985 N4 C A 92 62.086 55.389 42.166 1.00 49.50 N
+ATOM 1986 C5 C A 92 61.004 55.632 44.276 1.00 49.21 C
+ATOM 1987 C6 C A 92 60.683 55.041 45.421 1.00 49.19 C
+ATOM 1988 P C A 93 64.095 54.516 50.109 1.00 55.71 P
+ATOM 1989 OP1 C A 93 64.369 54.474 51.568 1.00 57.76 O
+ATOM 1990 OP2 C A 93 64.088 55.822 49.397 1.00 55.38 O
+ATOM 1991 O5' C A 93 65.104 53.533 49.376 1.00 55.30 O
+ATOM 1992 C5' C A 93 65.215 52.186 49.814 1.00 55.96 C
+ATOM 1993 C4' C A 93 66.119 51.421 48.893 1.00 57.33 C
+ATOM 1994 O4' C A 93 65.506 51.340 47.586 1.00 56.23 O
+ATOM 1995 C3' C A 93 67.453 52.093 48.646 1.00 58.35 C
+ATOM 1996 O3' C A 93 68.358 51.720 49.676 1.00 60.91 O
+ATOM 1997 C2' C A 93 67.859 51.519 47.295 1.00 56.28 C
+ATOM 1998 O2' C A 93 68.444 50.245 47.419 1.00 56.69 O
+ATOM 1999 C1' C A 93 66.505 51.408 46.587 1.00 53.87 C
+ATOM 2000 N1 C A 93 66.164 52.519 45.689 1.00 50.29 N
+ATOM 2001 C2 C A 93 66.553 52.449 44.357 1.00 48.90 C
+ATOM 2002 O2 C A 93 67.196 51.459 43.974 1.00 49.47 O
+ATOM 2003 N3 C A 93 66.219 53.459 43.516 1.00 47.11 N
+ATOM 2004 C4 C A 93 65.528 54.508 43.973 1.00 45.79 C
+ATOM 2005 N4 C A 93 65.205 55.474 43.112 1.00 47.26 N
+ATOM 2006 C5 C A 93 65.134 54.610 45.330 1.00 45.95 C
+ATOM 2007 C6 C A 93 65.467 53.599 46.149 1.00 48.81 C
+ATOM 2008 P A A 94 69.700 52.565 49.893 1.00 63.26 P
+ATOM 2009 OP1 A A 94 70.472 51.929 51.000 1.00 63.03 O
+ATOM 2010 OP2 A A 94 69.311 54.001 49.989 1.00 63.37 O
+ATOM 2011 O5' A A 94 70.490 52.381 48.519 1.00 61.77 O
+ATOM 2012 C5' A A 94 71.326 51.253 48.283 1.00 61.29 C
+ATOM 2013 C4' A A 94 72.146 51.475 47.027 1.00 62.44 C
+ATOM 2014 O4' A A 94 71.241 51.538 45.895 1.00 61.92 O
+ATOM 2015 C3' A A 94 72.937 52.778 46.954 1.00 63.29 C
+ATOM 2016 O3' A A 94 74.230 52.643 47.539 1.00 63.03 O
+ATOM 2017 C2' A A 94 73.070 52.992 45.454 1.00 63.82 C
+ATOM 2018 O2' A A 94 74.136 52.237 44.902 1.00 65.97 O
+ATOM 2019 C1' A A 94 71.721 52.471 44.948 1.00 62.06 C
+ATOM 2020 N9 A A 94 70.717 53.521 44.818 1.00 60.30 N
+ATOM 2021 C8 A A 94 69.962 54.073 45.821 1.00 60.55 C
+ATOM 2022 N7 A A 94 69.162 55.030 45.415 1.00 59.61 N
+ATOM 2023 C5 A A 94 69.401 55.106 44.053 1.00 59.00 C
+ATOM 2024 C6 A A 94 68.872 55.924 43.063 1.00 58.81 C
+ATOM 2025 N6 A A 94 67.974 56.874 43.310 1.00 59.79 N
+ATOM 2026 N1 A A 94 69.307 55.745 41.796 1.00 58.99 N
+ATOM 2027 C2 A A 94 70.230 54.798 41.564 1.00 59.88 C
+ATOM 2028 N3 A A 94 70.812 53.965 42.421 1.00 59.48 N
+ATOM 2029 C4 A A 94 70.348 54.174 43.666 1.00 59.71 C
+TER 2030 A A 94
+HETATM 2031 MG MG A 205 44.673 52.089 21.066 1.00 52.79 MG
+HETATM 2032 MG MG A 206 57.959 37.961 33.008 1.00 75.51 MG
+HETATM 2033 IR IRI A 201 53.885 56.740 -0.635 1.00 98.98 IR
+HETATM 2034 N1 IRI A 201 52.485 58.054 -1.822 1.00 97.67 N
+HETATM 2035 N2 IRI A 201 54.266 58.382 0.816 1.00 98.55 N
+HETATM 2036 N3 IRI A 201 55.233 55.348 0.506 1.00 98.59 N
+HETATM 2037 N4 IRI A 201 53.497 55.076 -2.135 1.00 99.01 N
+HETATM 2038 N5 IRI A 201 52.127 56.049 0.598 1.00 98.22 N
+HETATM 2039 N6 IRI A 201 55.669 57.413 -1.820 1.00 99.00 N
+HETATM 2040 IR IRI A 202 53.580 69.128 10.808 1.00 85.21 IR
+HETATM 2041 N1 IRI A 202 51.863 70.294 9.931 1.00 85.46 N
+HETATM 2042 N2 IRI A 202 53.979 70.743 12.294 1.00 85.76 N
+HETATM 2043 N3 IRI A 202 55.263 67.867 11.657 1.00 84.55 N
+HETATM 2044 N4 IRI A 202 53.191 67.483 9.307 1.00 85.84 N
+HETATM 2045 N5 IRI A 202 52.135 68.142 12.244 1.00 85.61 N
+HETATM 2046 N6 IRI A 202 55.040 70.069 9.391 1.00 85.28 N
+HETATM 2047 IR IRI A 203 61.715 45.974 13.576 1.00 89.54 IR
+HETATM 2048 N1 IRI A 203 60.528 47.751 14.317 1.00 90.96 N
+HETATM 2049 N2 IRI A 203 60.570 44.590 14.901 1.00 90.31 N
+HETATM 2050 N3 IRI A 203 62.943 44.257 12.747 1.00 91.15 N
+HETATM 2051 N4 IRI A 203 62.898 47.359 12.224 1.00 90.58 N
+HETATM 2052 N5 IRI A 203 60.217 45.694 11.915 1.00 90.65 N
+HETATM 2053 N6 IRI A 203 63.229 46.280 15.197 1.00 90.26 N
+HETATM 2054 IR IRI A 204 58.679 49.493 35.312 1.00 49.00 IR
+HETATM 2055 N1 IRI A 204 57.796 50.488 33.496 1.00 51.75 N
+HETATM 2056 N2 IRI A 204 56.792 49.834 36.443 1.00 50.76 N
+HETATM 2057 N3 IRI A 204 59.668 48.489 37.085 1.00 53.82 N
+HETATM 2058 N4 IRI A 204 60.576 49.136 34.184 1.00 51.33 N
+HETATM 2059 N5 IRI A 204 57.947 47.503 34.598 1.00 53.62 N
+HETATM 2060 N6 IRI A 204 59.488 51.435 36.079 1.00 53.26 N
+HETATM 2061 N SAM A 301 48.661 58.442 29.234 1.00 71.76 N
+HETATM 2062 CA SAM A 301 48.892 57.767 27.953 1.00 71.83 C
+HETATM 2063 C SAM A 301 47.728 58.043 27.018 1.00 73.09 C
+HETATM 2064 O SAM A 301 47.747 57.608 25.870 1.00 74.98 O
+HETATM 2065 OXT SAM A 301 46.793 58.755 27.385 1.00 73.14 O
+HETATM 2066 CB SAM A 301 49.051 56.247 28.156 1.00 70.42 C
+HETATM 2067 CG SAM A 301 49.924 55.993 29.384 1.00 68.18 C
+HETATM 2068 SD SAM A 301 50.180 54.222 29.811 1.00 68.57 S
+HETATM 2069 CE SAM A 301 49.547 53.321 28.362 1.00 68.16 C
+HETATM 2070 C5' SAM A 301 48.781 54.097 30.945 1.00 63.51 C
+HETATM 2071 C4' SAM A 301 49.142 54.393 32.411 1.00 61.14 C
+HETATM 2072 O4' SAM A 301 49.826 55.679 32.483 1.00 59.00 O
+HETATM 2073 C3' SAM A 301 47.793 54.604 33.049 1.00 59.63 C
+HETATM 2074 O3' SAM A 301 47.357 53.395 33.671 1.00 61.69 O
+HETATM 2075 C2' SAM A 301 48.045 55.680 34.098 1.00 58.07 C
+HETATM 2076 O2' SAM A 301 48.258 55.128 35.392 1.00 60.89 O
+HETATM 2077 C1' SAM A 301 49.315 56.473 33.618 1.00 56.29 C
+HETATM 2078 N9 SAM A 301 49.019 57.807 33.055 1.00 52.35 N
+HETATM 2079 C8 SAM A 301 49.941 58.804 32.897 1.00 49.96 C
+HETATM 2080 N7 SAM A 301 49.391 59.863 32.379 1.00 49.17 N
+HETATM 2081 C5 SAM A 301 48.084 59.618 32.158 1.00 49.87 C
+HETATM 2082 C6 SAM A 301 47.000 60.356 31.619 1.00 49.12 C
+HETATM 2083 N6 SAM A 301 47.179 61.649 31.181 1.00 49.12 N
+HETATM 2084 N1 SAM A 301 45.794 59.770 31.541 1.00 48.62 N
+HETATM 2085 C2 SAM A 301 45.596 58.512 31.950 1.00 48.26 C
+HETATM 2086 N3 SAM A 301 46.578 57.797 32.476 1.00 48.84 N
+HETATM 2087 C4 SAM A 301 47.821 58.293 32.591 1.00 50.12 C
+HETATM 2088 O HOH A 401 57.434 67.701 5.730 1.00 62.83 O
+HETATM 2089 O HOH A 402 66.189 60.895 3.390 1.00102.86 O
+HETATM 2090 O HOH A 403 41.692 28.822 12.775 1.00 79.78 O
+HETATM 2091 O HOH A 404 58.520 32.372 29.001 1.00 87.70 O
+HETATM 2092 O HOH A 405 41.683 78.187 34.648 1.00 90.77 O
+HETATM 2093 O HOH A 406 39.116 52.800 26.854 1.00 47.35 O
+HETATM 2094 O HOH A 407 60.473 27.307 22.789 1.00 55.76 O
+HETATM 2095 O HOH A 408 66.992 61.289 13.604 1.00 74.35 O
+HETATM 2096 O HOH A 409 54.344 44.338 21.904 1.00 44.49 O
+HETATM 2097 O HOH A 410 44.691 72.338 12.049 1.00 50.99 O
+HETATM 2098 O HOH A 411 40.751 63.603 43.590 1.00 89.83 O
+HETATM 2099 O HOH A 412 53.645 41.356 9.844 1.00 90.63 O
+HETATM 2100 O HOH A 413 59.949 37.796 24.955 1.00 70.80 O
+HETATM 2101 O HOH A 415 51.339 54.431 20.373 1.00 76.96 O
+HETATM 2102 O HOH A 416 37.653 77.331 42.105 1.00104.47 O
+HETATM 2103 O HOH A 417 52.864 38.162 12.617 1.00 80.23 O
+HETATM 2104 O HOH A 418 70.042 75.630 9.251 1.00 96.14 O
+HETATM 2105 O HOH A 419 57.849 36.827 16.245 1.00 55.25 O
+HETATM 2106 O HOH A 420 51.199 53.647 16.824 1.00 68.61 O
+HETATM 2107 O HOH A 421 46.270 42.361 39.422 1.00 86.08 O
+HETATM 2108 O HOH A 422 39.748 46.501 33.723 1.00 90.52 O
+HETATM 2109 O HOH A 423 55.402 30.310 22.335 1.00153.77 O
+HETATM 2110 O HOH A 424 62.850 37.633 36.622 1.00 93.90 O
+HETATM 2111 O HOH A 425 52.620 28.934 10.172 1.00 66.53 O
+HETATM 2112 O HOH A 426 46.043 72.059 15.009 1.00 81.11 O
+HETATM 2113 O HOH A 427 44.504 24.559 13.975 1.00 95.67 O
+HETATM 2114 O HOH A 428 64.390 51.541 8.357 1.00 96.89 O
+HETATM 2115 O HOH A 429 62.387 43.098 34.217 1.00 62.96 O
+HETATM 2116 O HOH A 430 40.781 42.498 19.177 1.00 95.04 O
+HETATM 2117 O HOH A 431 51.714 28.135 30.983 1.00 99.10 O
+HETATM 2118 O HOH A 432 56.277 41.684 42.172 1.00 76.07 O
+HETATM 2119 O HOH A 433 71.383 70.114 4.691 1.00115.24 O
+HETATM 2120 O HOH A 434 43.954 36.036 19.243 1.00 60.36 O
+HETATM 2121 O HOH A 435 42.927 80.090 37.718 1.00 93.62 O
+HETATM 2122 O HOH A 436 57.157 36.207 23.849 1.00 66.99 O
+HETATM 2123 O HOH A 437 50.487 54.395 35.797 1.00115.03 O
+HETATM 2124 O HOH A 438 42.557 37.639 16.483 1.00104.97 O
+HETATM 2125 O HOH A 439 52.517 25.349 8.099 1.00 83.24 O
+HETATM 2126 O HOH A 440 43.812 69.893 17.618 1.00 74.07 O
+HETATM 2127 O HOH A 441 42.386 49.215 25.612 1.00 87.62 O
+HETATM 2128 O HOH A 442 43.738 47.793 12.611 1.00 97.20 O
+HETATM 2129 O HOH A 443 56.851 56.881 11.453 1.00 65.45 O
+HETATM 2130 O HOH A 444 41.494 28.883 24.574 1.00 68.68 O
+HETATM 2131 O HOH A 445 66.299 67.845 11.185 1.00119.36 O
+HETATM 2132 O HOH A 446 44.327 43.962 37.114 1.00 59.00 O
+HETATM 2133 O HOH A 447 55.964 29.615 20.081 1.00 95.39 O
+HETATM 2134 O HOH A 448 57.973 59.050 -2.009 1.00109.16 O
+HETATM 2135 O HOH A 449 59.402 59.312 31.449 1.00 68.84 O
+HETATM 2136 O HOH A 450 43.007 16.103 21.017 1.00106.73 O
+HETATM 2137 O HOH A 451 42.422 49.150 15.212 1.00 78.44 O
+HETATM 2138 O HOH A 452 70.835 47.923 38.230 1.00 80.61 O
+HETATM 2139 O HOH A 453 61.705 64.436 22.275 1.00 84.32 O
+HETATM 2140 O HOH A 454 46.943 51.613 25.671 1.00 73.11 O
+HETATM 2141 O HOH A 455 54.648 46.163 19.618 1.00 62.24 O
+HETATM 2142 O HOH A 456 38.484 46.751 20.701 1.00 56.54 O
+HETATM 2143 O HOH A 457 60.794 35.462 31.358 1.00109.99 O
+HETATM 2144 O HOH A 458 44.895 54.912 35.019 1.00 81.53 O
+HETATM 2145 O HOH A 459 60.469 54.509 19.865 1.00 78.35 O
+HETATM 2146 O HOH A 460 40.557 49.152 31.709 1.00 94.98 O
+HETATM 2147 O HOH A 461 49.564 72.961 7.126 1.00127.46 O
+HETATM 2148 O HOH A 462 38.911 32.924 24.206 1.00 94.52 O
+HETATM 2149 O HOH A 463 44.840 67.115 17.805 1.00 64.28 O
+HETATM 2150 O HOH A 464 59.959 60.408 29.152 1.00 87.28 O
+HETATM 2151 O HOH A 465 47.480 63.127 48.379 1.00106.79 O
+HETATM 2152 O HOH A 466 41.379 47.530 27.555 1.00 63.18 O
+HETATM 2153 O HOH A 467 55.256 41.519 33.323 1.00 88.02 O
+HETATM 2154 O HOH A 468 46.278 35.257 34.883 1.00103.21 O
+HETATM 2155 O HOH A 469 50.168 44.685 11.400 1.00 84.54 O
+HETATM 2156 O HOH A 470 55.140 23.817 9.150 1.00 80.25 O
+HETATM 2157 O HOH A 471 59.853 74.716 4.618 1.00 98.69 O
+HETATM 2158 O HOH A 472 50.122 40.345 41.076 1.00 96.48 O
+HETATM 2159 O HOH A 473 65.972 41.974 36.431 1.00117.24 O
+HETATM 2160 O HOH A 474 55.172 63.267 37.006 1.00103.99 O
+HETATM 2161 O HOH A 475 57.260 52.484 35.826 1.00 36.48 O
+HETATM 2162 O HOH A 476 47.778 19.952 7.533 1.00 98.79 O
+HETATM 2163 O HOH A 477 61.467 73.402 3.421 1.00 91.53 O
+HETATM 2164 O HOH A 478 58.411 68.300 -1.259 1.00 79.23 O
+HETATM 2165 O HOH A 479 41.220 45.034 19.654 1.00104.86 O
+HETATM 2166 O HOH A 480 55.599 58.758 22.542 1.00 99.09 O
+HETATM 2167 O HOH A 481 53.744 43.835 45.686 1.00120.41 O
+HETATM 2168 O HOH A 482 59.195 65.528 18.099 1.00 79.51 O
+HETATM 2169 O HOH A 483 61.286 41.409 39.993 1.00 90.87 O
+HETATM 2170 O HOH A 484 49.047 34.291 16.948 1.00101.95 O
+HETATM 2171 O HOH A 485 51.730 71.388 25.674 1.00 52.14 O
+HETATM 2172 O HOH A 486 49.629 29.507 20.165 1.00 58.18 O
+HETATM 2173 O HOH A 487 39.919 50.462 26.232 1.00 67.53 O
+HETATM 2174 O HOH A 488 64.965 67.977 4.650 1.00 80.20 O
+HETATM 2175 O HOH A 489 48.890 37.269 24.529 1.00 49.39 O
+CONECT 194 2031
+CONECT 1351 2031
+CONECT 1365 2031
+CONECT 1792 2032
+CONECT 1794 2032
+CONECT 1799 2032
+CONECT 1815 2032
+CONECT 2031 194 1351 1365
+CONECT 2032 1792 1794 1799 1815
+CONECT 2033 2034 2035 2036 2037
+CONECT 2033 2038 2039
+CONECT 2034 2033
+CONECT 2035 2033
+CONECT 2036 2033
+CONECT 2037 2033
+CONECT 2038 2033
+CONECT 2039 2033
+CONECT 2040 2041 2042 2043 2044
+CONECT 2040 2045 2046
+CONECT 2041 2040
+CONECT 2042 2040
+CONECT 2043 2040
+CONECT 2044 2040
+CONECT 2045 2040
+CONECT 2046 2040
+CONECT 2047 2048 2049 2050 2051
+CONECT 2047 2052 2053
+CONECT 2048 2047
+CONECT 2049 2047
+CONECT 2050 2047
+CONECT 2051 2047
+CONECT 2052 2047
+CONECT 2053 2047
+CONECT 2054 2055 2056 2057 2058
+CONECT 2054 2059 2060
+CONECT 2055 2054
+CONECT 2056 2054
+CONECT 2057 2054
+CONECT 2058 2054
+CONECT 2059 2054
+CONECT 2060 2054
+CONECT 2061 2062
+CONECT 2062 2061 2063 2066
+CONECT 2063 2062 2064 2065
+CONECT 2064 2063
+CONECT 2065 2063
+CONECT 2066 2062 2067
+CONECT 2067 2066 2068
+CONECT 2068 2067 2069 2070
+CONECT 2069 2068
+CONECT 2070 2068 2071
+CONECT 2071 2070 2072 2073
+CONECT 2072 2071 2077
+CONECT 2073 2071 2074 2075
+CONECT 2074 2073
+CONECT 2075 2073 2076 2077
+CONECT 2076 2075
+CONECT 2077 2072 2075 2078
+CONECT 2078 2077 2079 2087
+CONECT 2079 2078 2080
+CONECT 2080 2079 2081
+CONECT 2081 2080 2082 2087
+CONECT 2082 2081 2083 2084
+CONECT 2083 2082
+CONECT 2084 2082 2085
+CONECT 2085 2084 2086
+CONECT 2086 2085 2087
+CONECT 2087 2078 2081 2086
+MASTER 373 0 7 0 0 0 13 6 2174 1 68 8
+END
--- /dev/null
+HEADER ELECTRON TRANSPORT 06-FEB-13 3W5V
+TITLE CROSS-LINKED COMPLEX BETWEEN FERREDOXIN AND FERREDOXIN-NADP+ REDUCTASE
+COMPND MOL_ID: 1;
+COMPND 2 MOLECULE: FERREDOXIN;
+COMPND 3 CHAIN: A, C;
+COMPND 4 FRAGMENT: UNP RESIDUES 42-355;
+COMPND 5 SYNONYM: FERREDOXIN--NADP REDUCTASE, LEAF ISOZYME,
+COMPND 6 FERREDOXINFERREDOXIN--NADP REDUCTASE, LEAF ISOZYME, UNCHARACTERIZED
+COMPND 7 PROTEIN;
+COMPND 8 ENGINEERED: YES;
+COMPND 9 MUTATION: YES;
+COMPND 10 MOL_ID: 2;
+COMPND 11 MOLECULE: FERREDOXIN-1, CHLOROPLASTIC;
+COMPND 12 CHAIN: B, D;
+COMPND 13 FRAGMENT: UNP RESIDUES 53-150;
+COMPND 14 SYNONYM: FERREDOXIN I, FD I;
+COMPND 15 ENGINEERED: YES;
+COMPND 16 MUTATION: YES
+SOURCE MOL_ID: 1;
+SOURCE 2 ORGANISM_SCIENTIFIC: ZEA MAYS;
+SOURCE 3 ORGANISM_COMMON: MAIZE;
+SOURCE 4 ORGANISM_TAXID: 4577;
+SOURCE 5 GENE: L-FNRI, ZEAMMB73_343560;
+SOURCE 6 EXPRESSION_SYSTEM: ESCHERICHIA COLI;
+SOURCE 7 EXPRESSION_SYSTEM_TAXID: 562;
+SOURCE 8 EXPRESSION_SYSTEM_VECTOR_TYPE: PLASMID;
+SOURCE 9 MOL_ID: 2;
+SOURCE 10 ORGANISM_SCIENTIFIC: ZEA MAYS;
+SOURCE 11 ORGANISM_COMMON: MAIZE;
+SOURCE 12 ORGANISM_TAXID: 4577;
+SOURCE 13 GENE: FDX1, PFD1;
+SOURCE 14 EXPRESSION_SYSTEM: ESCHERICHIA COLI;
+SOURCE 15 EXPRESSION_SYSTEM_TAXID: 562;
+SOURCE 16 EXPRESSION_SYSTEM_VECTOR_TYPE: PLASMID
+KEYWDS ELECTRON TRANSFER COMPLEX, ELECTRON TRANSPORT
+EXPDTA X-RAY DIFFRACTION
+AUTHOR Y.KIMATA-ARIGA,H.KUBOTA-KAWAI,N.MURAKI,T.HASE,G.KURISU
+REVDAT 1 19-JUN-13 3W5V 0
+JRNL AUTH Y.KIMATA-ARIGA,H.KUBOTA-KAWAI,Y.-H.LEE,N.MURAKI,T.IKEGAMI,
+JRNL AUTH 2 G.KURISU,T.HASE
+JRNL TITL CONCENTRATION-DEPENDENT OLIGOMERIZATION OF CROSS-LINKED
+JRNL TITL 2 COMPLEXES BETWEEN FERREDOXIN AND FERREDOXIN-NADP(+)
+JRNL TITL 3 REDUCTASE
+JRNL REF BIOCHEM.BIOPHYS.RES.COMMUN. V. 434 867 2013
+JRNL REFN ISSN 0006-291X
+JRNL PMID 23618857
+JRNL DOI 10.1016/J.BBRC.2013.04.033
+REMARK 2
+REMARK 2 RESOLUTION. 3.81 ANGSTROMS.
+REMARK 3
+REMARK 3 REFINEMENT.
+REMARK 3 PROGRAM : REFMAC 5.6.0117
+REMARK 3 AUTHORS : MURSHUDOV,VAGIN,DODSON
+REMARK 3
+REMARK 3 REFINEMENT TARGET : MAXIMUM LIKELIHOOD
+REMARK 3
+REMARK 3 DATA USED IN REFINEMENT.
+REMARK 3 RESOLUTION RANGE HIGH (ANGSTROMS) : 3.81
+REMARK 3 RESOLUTION RANGE LOW (ANGSTROMS) : 35.67
+REMARK 3 DATA CUTOFF (SIGMA(F)) : NULL
+REMARK 3 COMPLETENESS FOR RANGE (%) : 98.3
+REMARK 3 NUMBER OF REFLECTIONS : 13076
+REMARK 3
+REMARK 3 FIT TO DATA USED IN REFINEMENT.
+REMARK 3 CROSS-VALIDATION METHOD : THROUGHOUT
+REMARK 3 FREE R VALUE TEST SET SELECTION : RANDOM
+REMARK 3 R VALUE (WORKING + TEST SET) : 0.279
+REMARK 3 R VALUE (WORKING SET) : 0.277
+REMARK 3 FREE R VALUE : 0.306
+REMARK 3 FREE R VALUE TEST SET SIZE (%) : 5.000
+REMARK 3 FREE R VALUE TEST SET COUNT : 683
+REMARK 3
+REMARK 3 FIT IN THE HIGHEST RESOLUTION BIN.
+REMARK 3 TOTAL NUMBER OF BINS USED : 20
+REMARK 3 BIN RESOLUTION RANGE HIGH (A) : 3.81
+REMARK 3 BIN RESOLUTION RANGE LOW (A) : 3.90
+REMARK 3 REFLECTION IN BIN (WORKING SET) : 878
+REMARK 3 BIN COMPLETENESS (WORKING+TEST) (%) : 93.74
+REMARK 3 BIN R VALUE (WORKING SET) : 0.5870
+REMARK 3 BIN FREE R VALUE SET COUNT : 51
+REMARK 3 BIN FREE R VALUE : 0.6500
+REMARK 3
+REMARK 3 NUMBER OF NON-HYDROGEN ATOMS USED IN REFINEMENT.
+REMARK 3 PROTEIN ATOMS : 6176
+REMARK 3 NUCLEIC ACID ATOMS : 0
+REMARK 3 HETEROGEN ATOMS : 114
+REMARK 3 SOLVENT ATOMS : 0
+REMARK 3
+REMARK 3 B VALUES.
+REMARK 3 FROM WILSON PLOT (A**2) : NULL
+REMARK 3 MEAN B VALUE (OVERALL, A**2) : 39.99
+REMARK 3 OVERALL ANISOTROPIC B VALUE.
+REMARK 3 B11 (A**2) : -0.01000
+REMARK 3 B22 (A**2) : 0.12000
+REMARK 3 B33 (A**2) : -0.07000
+REMARK 3 B12 (A**2) : -0.00000
+REMARK 3 B13 (A**2) : 0.07000
+REMARK 3 B23 (A**2) : -0.00000
+REMARK 3
+REMARK 3 ESTIMATED OVERALL COORDINATE ERROR.
+REMARK 3 ESU BASED ON R VALUE (A): NULL
+REMARK 3 ESU BASED ON FREE R VALUE (A): 0.827
+REMARK 3 ESU BASED ON MAXIMUM LIKELIHOOD (A): 0.920
+REMARK 3 ESU FOR B VALUES BASED ON MAXIMUM LIKELIHOOD (A**2): 73.326
+REMARK 3
+REMARK 3 CORRELATION COEFFICIENTS.
+REMARK 3 CORRELATION COEFFICIENT FO-FC : 0.949
+REMARK 3 CORRELATION COEFFICIENT FO-FC FREE : 0.942
+REMARK 3
+REMARK 3 RMS DEVIATIONS FROM IDEAL VALUES COUNT RMS WEIGHT
+REMARK 3 BOND LENGTHS REFINED ATOMS (A): 6430 ; 0.010 ; 0.020
+REMARK 3 BOND LENGTHS OTHERS (A): NULL ; NULL ; NULL
+REMARK 3 BOND ANGLES REFINED ATOMS (DEGREES): 8708 ; 1.361 ; 1.989
+REMARK 3 BOND ANGLES OTHERS (DEGREES): NULL ; NULL ; NULL
+REMARK 3 TORSION ANGLES, PERIOD 1 (DEGREES): 782 ; 6.280 ; 5.000
+REMARK 3 TORSION ANGLES, PERIOD 2 (DEGREES): 286 ;37.739 ;25.315
+REMARK 3 TORSION ANGLES, PERIOD 3 (DEGREES): 1124 ;17.100 ;15.000
+REMARK 3 TORSION ANGLES, PERIOD 4 (DEGREES): 24 ;13.428 ;15.000
+REMARK 3 CHIRAL-CENTER RESTRAINTS (A**3): 932 ; 0.084 ; 0.200
+REMARK 3 GENERAL PLANES REFINED ATOMS (A): 4820 ; 0.005 ; 0.021
+REMARK 3 GENERAL PLANES OTHERS (A): NULL ; NULL ; NULL
+REMARK 3 NON-BONDED CONTACTS REFINED ATOMS (A): NULL ; NULL ; NULL
+REMARK 3 NON-BONDED CONTACTS OTHERS (A): NULL ; NULL ; NULL
+REMARK 3 NON-BONDED TORSION REFINED ATOMS (A): NULL ; NULL ; NULL
+REMARK 3 NON-BONDED TORSION OTHERS (A): NULL ; NULL ; NULL
+REMARK 3 H-BOND (X...Y) REFINED ATOMS (A): NULL ; NULL ; NULL
+REMARK 3 H-BOND (X...Y) OTHERS (A): NULL ; NULL ; NULL
+REMARK 3 POTENTIAL METAL-ION REFINED ATOMS (A): NULL ; NULL ; NULL
+REMARK 3 POTENTIAL METAL-ION OTHERS (A): NULL ; NULL ; NULL
+REMARK 3 SYMMETRY VDW REFINED ATOMS (A): NULL ; NULL ; NULL
+REMARK 3 SYMMETRY VDW OTHERS (A): NULL ; NULL ; NULL
+REMARK 3 SYMMETRY H-BOND REFINED ATOMS (A): NULL ; NULL ; NULL
+REMARK 3 SYMMETRY H-BOND OTHERS (A): NULL ; NULL ; NULL
+REMARK 3 SYMMETRY METAL-ION REFINED ATOMS (A): NULL ; NULL ; NULL
+REMARK 3 SYMMETRY METAL-ION OTHERS (A): NULL ; NULL ; NULL
+REMARK 3
+REMARK 3 ISOTROPIC THERMAL FACTOR RESTRAINTS. COUNT RMS WEIGHT
+REMARK 3 MAIN-CHAIN BOND REFINED ATOMS (A**2): NULL ; NULL ; NULL
+REMARK 3 MAIN-CHAIN BOND OTHER ATOMS (A**2): NULL ; NULL ; NULL
+REMARK 3 MAIN-CHAIN ANGLE REFINED ATOMS (A**2): NULL ; NULL ; NULL
+REMARK 3 SIDE-CHAIN BOND REFINED ATOMS (A**2): NULL ; NULL ; NULL
+REMARK 3 SIDE-CHAIN ANGLE REFINED ATOMS (A**2): NULL ; NULL ; NULL
+REMARK 3
+REMARK 3 ANISOTROPIC THERMAL FACTOR RESTRAINTS. COUNT RMS WEIGHT
+REMARK 3 RIGID-BOND RESTRAINTS (A**2): NULL ; NULL ; NULL
+REMARK 3 SPHERICITY; FREE ATOMS (A**2): NULL ; NULL ; NULL
+REMARK 3 SPHERICITY; BONDED ATOMS (A**2): NULL ; NULL ; NULL
+REMARK 3
+REMARK 3 NCS RESTRAINTS STATISTICS
+REMARK 3 NUMBER OF DIFFERENT NCS GROUPS : NULL
+REMARK 3
+REMARK 3 TLS DETAILS
+REMARK 3 NUMBER OF TLS GROUPS : NULL
+REMARK 3
+REMARK 3 BULK SOLVENT MODELLING.
+REMARK 3 METHOD USED : MASK
+REMARK 3 PARAMETERS FOR MASK CALCULATION
+REMARK 3 VDW PROBE RADIUS : 1.20
+REMARK 3 ION PROBE RADIUS : 0.80
+REMARK 3 SHRINKAGE RADIUS : 0.80
+REMARK 3
+REMARK 3 OTHER REFINEMENT REMARKS: HYDROGENS HAVE BEEN USED IF PRESENT IN
+REMARK 3 THE INPUT
+REMARK 4
+REMARK 4 3W5V COMPLIES WITH FORMAT V. 3.30, 13-JUL-11
+REMARK 100
+REMARK 100 THIS ENTRY HAS BEEN PROCESSED BY PDBJ ON 15-FEB-13.
+REMARK 100 THE RCSB ID CODE IS RCSB095924.
+REMARK 200
+REMARK 200 EXPERIMENTAL DETAILS
+REMARK 200 EXPERIMENT TYPE : X-RAY DIFFRACTION
+REMARK 200 DATE OF DATA COLLECTION : 24-JUL-11
+REMARK 200 TEMPERATURE (KELVIN) : 100
+REMARK 200 PH : 7.5
+REMARK 200 NUMBER OF CRYSTALS USED : 1
+REMARK 200
+REMARK 200 SYNCHROTRON (Y/N) : Y
+REMARK 200 RADIATION SOURCE : SPRING-8
+REMARK 200 BEAMLINE : BL44XU
+REMARK 200 X-RAY GENERATOR MODEL : NULL
+REMARK 200 MONOCHROMATIC OR LAUE (M/L) : M
+REMARK 200 WAVELENGTH OR RANGE (A) : 0.90000
+REMARK 200 MONOCHROMATOR : NULL
+REMARK 200 OPTICS : NULL
+REMARK 200
+REMARK 200 DETECTOR TYPE : CCD
+REMARK 200 DETECTOR MANUFACTURER : RAYONIX MX225HE
+REMARK 200 INTENSITY-INTEGRATION SOFTWARE : HKL-2000
+REMARK 200 DATA SCALING SOFTWARE : HKL-2000
+REMARK 200
+REMARK 200 NUMBER OF UNIQUE REFLECTIONS : 13803
+REMARK 200 RESOLUTION RANGE HIGH (A) : 3.800
+REMARK 200 RESOLUTION RANGE LOW (A) : 50.000
+REMARK 200 REJECTION CRITERIA (SIGMA(I)) : NULL
+REMARK 200
+REMARK 200 OVERALL.
+REMARK 200 COMPLETENESS FOR RANGE (%) : NULL
+REMARK 200 DATA REDUNDANCY : NULL
+REMARK 200 R MERGE (I) : NULL
+REMARK 200 R SYM (I) : NULL
+REMARK 200 <I/SIGMA(I)> FOR THE DATA SET : NULL
+REMARK 200
+REMARK 200 IN THE HIGHEST RESOLUTION SHELL.
+REMARK 200 HIGHEST RESOLUTION SHELL, RANGE HIGH (A) : NULL
+REMARK 200 HIGHEST RESOLUTION SHELL, RANGE LOW (A) : NULL
+REMARK 200 COMPLETENESS FOR SHELL (%) : NULL
+REMARK 200 DATA REDUNDANCY IN SHELL : NULL
+REMARK 200 R MERGE FOR SHELL (I) : NULL
+REMARK 200 R SYM FOR SHELL (I) : NULL
+REMARK 200 <I/SIGMA(I)> FOR SHELL : NULL
+REMARK 200
+REMARK 200 DIFFRACTION PROTOCOL: SINGLE WAVELENGTH
+REMARK 200 METHOD USED TO DETERMINE THE STRUCTURE: MOLECULAR REPLACEMENT
+REMARK 200 SOFTWARE USED: PHASER
+REMARK 200 STARTING MODEL: 1GAW, 3B2F
+REMARK 200
+REMARK 200 REMARK: NULL
+REMARK 280
+REMARK 280 CRYSTAL
+REMARK 280 SOLVENT CONTENT, VS (%): 68.66
+REMARK 280 MATTHEWS COEFFICIENT, VM (ANGSTROMS**3/DA): 3.92
+REMARK 280
+REMARK 280 CRYSTALLIZATION CONDITIONS: 8% PEG 8000, 20% ETHYLENE GLYCOL,
+REMARK 280 100MM BIS-TRIS, PH 7.5, VAPOR DIFFUSION, HANGING DROP,
+REMARK 280 TEMPERATURE 277K
+REMARK 290
+REMARK 290 CRYSTALLOGRAPHIC SYMMETRY
+REMARK 290 SYMMETRY OPERATORS FOR SPACE GROUP: P 1 21 1
+REMARK 290
+REMARK 290 SYMOP SYMMETRY
+REMARK 290 NNNMMM OPERATOR
+REMARK 290 1555 X,Y,Z
+REMARK 290 2555 -X,Y+1/2,-Z
+REMARK 290
+REMARK 290 WHERE NNN -> OPERATOR NUMBER
+REMARK 290 MMM -> TRANSLATION VECTOR
+REMARK 290
+REMARK 290 CRYSTALLOGRAPHIC SYMMETRY TRANSFORMATIONS
+REMARK 290 THE FOLLOWING TRANSFORMATIONS OPERATE ON THE ATOM/HETATM
+REMARK 290 RECORDS IN THIS ENTRY TO PRODUCE CRYSTALLOGRAPHICALLY
+REMARK 290 RELATED MOLECULES.
+REMARK 290 SMTRY1 1 1.000000 0.000000 0.000000 0.00000
+REMARK 290 SMTRY2 1 0.000000 1.000000 0.000000 0.00000
+REMARK 290 SMTRY3 1 0.000000 0.000000 1.000000 0.00000
+REMARK 290 SMTRY1 2 -1.000000 0.000000 0.000000 0.00000
+REMARK 290 SMTRY2 2 0.000000 1.000000 0.000000 60.17250
+REMARK 290 SMTRY3 2 0.000000 0.000000 -1.000000 0.00000
+REMARK 290
+REMARK 290 REMARK: NULL
+REMARK 300
+REMARK 300 BIOMOLECULE: 1, 2
+REMARK 300 SEE REMARK 350 FOR THE AUTHOR PROVIDED AND/OR PROGRAM
+REMARK 300 GENERATED ASSEMBLY INFORMATION FOR THE STRUCTURE IN
+REMARK 300 THIS ENTRY. THE REMARK MAY ALSO PROVIDE INFORMATION ON
+REMARK 300 BURIED SURFACE AREA.
+REMARK 350
+REMARK 350 COORDINATES FOR A COMPLETE MULTIMER REPRESENTING THE KNOWN
+REMARK 350 BIOLOGICALLY SIGNIFICANT OLIGOMERIZATION STATE OF THE
+REMARK 350 MOLECULE CAN BE GENERATED BY APPLYING BIOMT TRANSFORMATIONS
+REMARK 350 GIVEN BELOW. BOTH NON-CRYSTALLOGRAPHIC AND
+REMARK 350 CRYSTALLOGRAPHIC OPERATIONS ARE GIVEN.
+REMARK 350
+REMARK 350 BIOMOLECULE: 1
+REMARK 350 AUTHOR DETERMINED BIOLOGICAL UNIT: DIMERIC
+REMARK 350 SOFTWARE DETERMINED QUATERNARY STRUCTURE: DIMERIC
+REMARK 350 SOFTWARE USED: PISA
+REMARK 350 TOTAL BURIED SURFACE AREA: 1370 ANGSTROM**2
+REMARK 350 SURFACE AREA OF THE COMPLEX: 19220 ANGSTROM**2
+REMARK 350 CHANGE IN SOLVENT FREE ENERGY: -28.0 KCAL/MOL
+REMARK 350 APPLY THE FOLLOWING TO CHAINS: A, D
+REMARK 350 BIOMT1 1 1.000000 0.000000 0.000000 0.00000
+REMARK 350 BIOMT2 1 0.000000 1.000000 0.000000 0.00000
+REMARK 350 BIOMT3 1 0.000000 0.000000 1.000000 0.00000
+REMARK 350
+REMARK 350 BIOMOLECULE: 2
+REMARK 350 AUTHOR DETERMINED BIOLOGICAL UNIT: DIMERIC
+REMARK 350 SOFTWARE DETERMINED QUATERNARY STRUCTURE: DIMERIC
+REMARK 350 SOFTWARE USED: PISA
+REMARK 350 TOTAL BURIED SURFACE AREA: 1640 ANGSTROM**2
+REMARK 350 SURFACE AREA OF THE COMPLEX: 18950 ANGSTROM**2
+REMARK 350 CHANGE IN SOLVENT FREE ENERGY: -28.0 KCAL/MOL
+REMARK 350 APPLY THE FOLLOWING TO CHAINS: C, B
+REMARK 350 BIOMT1 1 1.000000 0.000000 0.000000 0.00000
+REMARK 350 BIOMT2 1 0.000000 1.000000 0.000000 0.00000
+REMARK 350 BIOMT3 1 0.000000 0.000000 1.000000 0.00000
+REMARK 465
+REMARK 465 MISSING RESIDUES
+REMARK 465 THE FOLLOWING RESIDUES WERE NOT LOCATED IN THE
+REMARK 465 EXPERIMENT. (M=MODEL NUMBER; RES=RESIDUE NAME; C=CHAIN
+REMARK 465 IDENTIFIER; SSSEQ=SEQUENCE NUMBER; I=INSERTION CODE.)
+REMARK 465
+REMARK 465 M RES C SSSEQI
+REMARK 465 ILE A 1
+REMARK 465 ARG A 2
+REMARK 465 ALA A 3
+REMARK 465 GLN A 4
+REMARK 465 ALA A 5
+REMARK 465 SER A 6
+REMARK 465 ALA A 7
+REMARK 465 VAL A 8
+REMARK 465 GLU A 9
+REMARK 465 ALA A 10
+REMARK 465 PRO A 11
+REMARK 465 ALA A 12
+REMARK 465 THR A 13
+REMARK 465 ALA A 14
+REMARK 465 LYS A 15
+REMARK 465 ALA A 16
+REMARK 465 LYS A 17
+REMARK 465 GLY B 97
+REMARK 465 ALA B 98
+REMARK 465 ILE C 1
+REMARK 465 ARG C 2
+REMARK 465 ALA C 3
+REMARK 465 GLN C 4
+REMARK 465 ALA C 5
+REMARK 465 SER C 6
+REMARK 465 ALA C 7
+REMARK 465 VAL C 8
+REMARK 465 GLU C 9
+REMARK 465 ALA C 10
+REMARK 465 PRO C 11
+REMARK 465 ALA C 12
+REMARK 465 THR C 13
+REMARK 465 ALA C 14
+REMARK 465 LYS C 15
+REMARK 465 ALA C 16
+REMARK 465 LYS C 17
+REMARK 465 GLY D 97
+REMARK 465 ALA D 98
+REMARK 500
+REMARK 500 GEOMETRY AND STEREOCHEMISTRY
+REMARK 500 SUBTOPIC: CLOSE CONTACTS IN SAME ASYMMETRIC UNIT
+REMARK 500
+REMARK 500 THE FOLLOWING ATOMS ARE IN CLOSE CONTACT.
+REMARK 500
+REMARK 500 ATM1 RES C SSEQI ATM2 RES C SSEQI DISTANCE
+REMARK 500 SG CYS B 47 FE1 FES B 101 1.79
+REMARK 500 SG CYS B 44 FE2 FES B 101 1.83
+REMARK 500 O LEU C 94 C9A FAD C 401 2.17
+REMARK 500
+REMARK 500 REMARK: NULL
+REMARK 500
+REMARK 500 GEOMETRY AND STEREOCHEMISTRY
+REMARK 500 SUBTOPIC: COVALENT BOND ANGLES
+REMARK 500
+REMARK 500 THE STEREOCHEMICAL PARAMETERS OF THE FOLLOWING RESIDUES
+REMARK 500 HAVE VALUES WHICH DEVIATE FROM EXPECTED VALUES BY MORE
+REMARK 500 THAN 6*RMSD (M=MODEL NUMBER; RES=RESIDUE NAME; C=CHAIN
+REMARK 500 IDENTIFIER; SSEQ=SEQUENCE NUMBER; I=INSERTION CODE).
+REMARK 500
+REMARK 500 STANDARD TABLE:
+REMARK 500 FORMAT: (10X,I3,1X,A3,1X,A1,I4,A1,3(1X,A4,2X),12X,F5.1)
+REMARK 500
+REMARK 500 EXPECTED VALUES PROTEIN: ENGH AND HUBER, 1999
+REMARK 500 EXPECTED VALUES NUCLEIC ACID: CLOWNEY ET AL 1996
+REMARK 500
+REMARK 500 M RES CSSEQI ATM1 ATM2 ATM3
+REMARK 500 CYS C 19 CA - CB - SG ANGL. DEV. = 8.7 DEGREES
+REMARK 500
+REMARK 500 REMARK: NULL
+REMARK 500
+REMARK 500 GEOMETRY AND STEREOCHEMISTRY
+REMARK 500 SUBTOPIC: TORSION ANGLES
+REMARK 500
+REMARK 500 TORSION ANGLES OUTSIDE THE EXPECTED RAMACHANDRAN REGIONS:
+REMARK 500 (M=MODEL NUMBER; RES=RESIDUE NAME; C=CHAIN IDENTIFIER;
+REMARK 500 SSEQ=SEQUENCE NUMBER; I=INSERTION CODE).
+REMARK 500
+REMARK 500 STANDARD TABLE:
+REMARK 500 FORMAT:(10X,I3,1X,A3,1X,A1,I4,A1,4X,F7.2,3X,F7.2)
+REMARK 500
+REMARK 500 EXPECTED VALUES: GJ KLEYWEGT AND TA JONES (1996). PHI/PSI-
+REMARK 500 CHOLOGY: RAMACHANDRAN REVISITED. STRUCTURE 4, 1395 - 1400
+REMARK 500
+REMARK 500 M RES CSSEQI PSI PHI
+REMARK 500 GLN A 23 109.52 -58.82
+REMARK 500 ASN A 45 92.65 172.03
+REMARK 500 GLU A 56 115.31 72.23
+REMARK 500 PRO A 69 74.20 -68.96
+REMARK 500 GLU A 72 109.91 -44.80
+REMARK 500 THR A 172 20.52 -73.87
+REMARK 500 ASN A 195 42.91 -167.55
+REMARK 500 TYR A 212 12.59 54.24
+REMARK 500 GLU A 236 5.02 -155.90
+REMARK 500 LYS A 255 -16.18 -46.64
+REMARK 500 GLU A 256 -80.11 -72.63
+REMARK 500 LYS A 300 -71.41 -59.56
+REMARK 500 LYS A 301 -58.26 -27.03
+REMARK 500 ASP A 307 19.54 53.46
+REMARK 500 ILE B 8 79.93 -101.73
+REMARK 500 ASP B 20 4.98 -66.21
+REMARK 500 SER B 38 -78.01 -148.14
+REMARK 500 ALA B 41 19.26 -151.32
+REMARK 500 ASP B 60 15.91 96.95
+REMARK 500 SER B 62 -6.27 -143.09
+REMARK 500 GLN C 23 105.40 -59.16
+REMARK 500 ASN C 45 93.14 173.52
+REMARK 500 GLU C 56 118.79 69.25
+REMARK 500 GLN C 74 -173.82 -67.66
+REMARK 500 ILE C 127 102.10 -59.16
+REMARK 500 VAL C 131 -72.25 -48.59
+REMARK 500 ASN C 195 41.36 -161.84
+REMARK 500 TYR C 212 11.89 53.93
+REMARK 500 GLU C 236 1.48 -151.37
+REMARK 500 LYS C 255 -11.94 -45.29
+REMARK 500 GLU C 256 -78.15 -77.12
+REMARK 500 LYS C 301 -58.19 -29.78
+REMARK 500 ASP C 307 17.60 52.66
+REMARK 500 LEU D 16 162.38 179.37
+REMARK 500 ASP D 20 3.82 -67.10
+REMARK 500 SER D 38 -81.95 -149.47
+REMARK 500 ALA D 41 17.72 -150.42
+REMARK 500 ASP D 60 12.76 97.38
+REMARK 500 SER D 62 -9.08 -144.78
+REMARK 500
+REMARK 500 REMARK: NULL
+REMARK 620
+REMARK 620 METAL COORDINATION
+REMARK 620 (M=MODEL NUMBER; RES=RESIDUE NAME; C=CHAIN IDENTIFIER;
+REMARK 620 SSEQ=SEQUENCE NUMBER; I=INSERTION CODE):
+REMARK 620
+REMARK 620 COORDINATION ANGLES FOR: M RES CSSEQI METAL
+REMARK 620 FES D 101 FE2
+REMARK 620 N RES CSSEQI ATOM
+REMARK 620 1 CYS D 44 SG
+REMARK 620 2 FES D 101 S1 125.9
+REMARK 620 3 FES D 101 S2 95.5 93.6
+REMARK 620 4 CYS D 39 SG 140.2 77.5 116.4
+REMARK 620 N 1 2 3
+REMARK 620
+REMARK 620 COORDINATION ANGLES FOR: M RES CSSEQI METAL
+REMARK 620 FES D 101 FE1
+REMARK 620 N RES CSSEQI ATOM
+REMARK 620 1 CYS D 47 SG
+REMARK 620 2 FES D 101 S1 126.0
+REMARK 620 3 FES D 101 S2 106.4 93.2
+REMARK 620 4 CYS D 77 SG 126.8 80.4 118.3
+REMARK 620 N 1 2 3
+REMARK 620
+REMARK 620 COORDINATION ANGLES FOR: M RES CSSEQI METAL
+REMARK 620 FES B 101 FE2
+REMARK 620 N RES CSSEQI ATOM
+REMARK 620 1 CYS B 39 SG
+REMARK 620 2 FES B 101 S1 86.8
+REMARK 620 3 FES B 101 S2 116.1 91.6
+REMARK 620 N 1 2
+REMARK 620
+REMARK 620 COORDINATION ANGLES FOR: M RES CSSEQI METAL
+REMARK 620 FES B 101 FE1
+REMARK 620 N RES CSSEQI ATOM
+REMARK 620 1 CYS B 77 SG
+REMARK 620 2 FES B 101 S1 88.1
+REMARK 620 3 FES B 101 S2 109.5 92.2
+REMARK 620 N 1 2
+REMARK 800
+REMARK 800 SITE
+REMARK 800 SITE_IDENTIFIER: AC1
+REMARK 800 EVIDENCE_CODE: SOFTWARE
+REMARK 800 SITE_DESCRIPTION: BINDING SITE FOR RESIDUE FAD A 401
+REMARK 800
+REMARK 800 SITE_IDENTIFIER: AC2
+REMARK 800 EVIDENCE_CODE: SOFTWARE
+REMARK 800 SITE_DESCRIPTION: BINDING SITE FOR RESIDUE FES B 101
+REMARK 800
+REMARK 800 SITE_IDENTIFIER: AC3
+REMARK 800 EVIDENCE_CODE: SOFTWARE
+REMARK 800 SITE_DESCRIPTION: BINDING SITE FOR RESIDUE FAD C 401
+REMARK 800
+REMARK 800 SITE_IDENTIFIER: AC4
+REMARK 800 EVIDENCE_CODE: SOFTWARE
+REMARK 800 SITE_DESCRIPTION: BINDING SITE FOR RESIDUE FES D 101
+REMARK 900
+REMARK 900 RELATED ENTRIES
+REMARK 900 RELATED ID: 3W5U RELATED DB: PDB
+REMARK 900 SIMILAR COMPLEX WITH A DISTINCT CROSS-LINKAGE
+REMARK 900 RELATED ID: 1GAW RELATED DB: PDB
+REMARK 900 FERREDOXIN-NADP+ REDUCTASE
+REMARK 900 RELATED ID: 3B2F RELATED DB: PDB
+REMARK 900 FERREDOXIN
+DBREF 3W5V A 1 314 UNP Q9SLP6 Q9SLP6_MAIZE 42 355
+DBREF 3W5V B 1 98 UNP P27787 FER1_MAIZE 53 150
+DBREF 3W5V C 1 314 UNP Q9SLP6 Q9SLP6_MAIZE 42 355
+DBREF 3W5V D 1 98 UNP P27787 FER1_MAIZE 53 150
+SEQADV 3W5V CYS A 19 UNP Q9SLP6 GLU 60 ENGINEERED MUTATION
+SEQADV 3W5V CYS B 70 UNP P27787 ALA 122 ENGINEERED MUTATION
+SEQADV 3W5V CYS C 19 UNP Q9SLP6 GLU 60 ENGINEERED MUTATION
+SEQADV 3W5V CYS D 70 UNP P27787 ALA 122 ENGINEERED MUTATION
+SEQRES 1 A 314 ILE ARG ALA GLN ALA SER ALA VAL GLU ALA PRO ALA THR
+SEQRES 2 A 314 ALA LYS ALA LYS LYS CYS SER LYS LYS GLN GLU GLU GLY
+SEQRES 3 A 314 VAL VAL THR ASN LEU TYR LYS PRO LYS GLU PRO TYR VAL
+SEQRES 4 A 314 GLY ARG CYS LEU LEU ASN THR LYS ILE THR GLY ASP ASP
+SEQRES 5 A 314 ALA PRO GLY GLU THR TRP HIS MET VAL PHE SER THR GLU
+SEQRES 6 A 314 GLY LYS ILE PRO TYR ARG GLU GLY GLN SER ILE GLY VAL
+SEQRES 7 A 314 ILE ALA ASP GLY VAL ASP LYS ASN GLY LYS PRO HIS LYS
+SEQRES 8 A 314 VAL ARG LEU TYR SER ILE ALA SER SER ALA ILE GLY ASP
+SEQRES 9 A 314 PHE GLY ASP SER LYS THR VAL SER LEU CYS VAL LYS ARG
+SEQRES 10 A 314 LEU ILE TYR THR ASN ASP ALA GLY GLU ILE VAL LYS GLY
+SEQRES 11 A 314 VAL CYS SER ASN PHE LEU CYS ASP LEU GLN PRO GLY ASP
+SEQRES 12 A 314 ASN VAL GLN ILE THR GLY PRO VAL GLY LYS GLU MET LEU
+SEQRES 13 A 314 MET PRO LYS ASP PRO ASN ALA THR ILE ILE MET LEU ALA
+SEQRES 14 A 314 THR GLY THR GLY ILE ALA PRO PHE ARG SER PHE LEU TRP
+SEQRES 15 A 314 LYS MET PHE PHE GLU LYS HIS ASP ASP TYR LYS PHE ASN
+SEQRES 16 A 314 GLY LEU GLY TRP LEU PHE LEU GLY VAL PRO THR SER SER
+SEQRES 17 A 314 SER LEU LEU TYR LYS GLU GLU PHE GLY LYS MET LYS GLU
+SEQRES 18 A 314 ARG ALA PRO GLU ASN PHE ARG VAL ASP TYR ALA VAL SER
+SEQRES 19 A 314 ARG GLU GLN THR ASN ALA ALA GLY GLU ARG MET TYR ILE
+SEQRES 20 A 314 GLN THR ARG MET ALA GLU TYR LYS GLU GLU LEU TRP GLU
+SEQRES 21 A 314 LEU LEU LYS LYS ASP ASN THR TYR VAL TYR MET CYS GLY
+SEQRES 22 A 314 LEU LYS GLY MET GLU LYS GLY ILE ASP ASP ILE MET VAL
+SEQRES 23 A 314 SER LEU ALA GLU LYS ASP GLY ILE ASP TRP PHE ASP TYR
+SEQRES 24 A 314 LYS LYS GLN LEU LYS ARG GLY ASP GLN TRP ASN VAL GLU
+SEQRES 25 A 314 VAL TYR
+SEQRES 1 B 98 ALA THR TYR ASN VAL LYS LEU ILE THR PRO GLU GLY GLU
+SEQRES 2 B 98 VAL GLU LEU GLN VAL PRO ASP ASP VAL TYR ILE LEU ASP
+SEQRES 3 B 98 GLN ALA GLU GLU ASP GLY ILE ASP LEU PRO TYR SER CYS
+SEQRES 4 B 98 ARG ALA GLY SER CYS SER SER CYS ALA GLY LYS VAL VAL
+SEQRES 5 B 98 SER GLY SER VAL ASP GLN SER ASP GLN SER TYR LEU ASP
+SEQRES 6 B 98 ASP GLY GLN ILE CYS ASP GLY TRP VAL LEU THR CYS HIS
+SEQRES 7 B 98 ALA TYR PRO THR SER ASP VAL VAL ILE GLU THR HIS LYS
+SEQRES 8 B 98 GLU GLU GLU LEU THR GLY ALA
+SEQRES 1 C 314 ILE ARG ALA GLN ALA SER ALA VAL GLU ALA PRO ALA THR
+SEQRES 2 C 314 ALA LYS ALA LYS LYS CYS SER LYS LYS GLN GLU GLU GLY
+SEQRES 3 C 314 VAL VAL THR ASN LEU TYR LYS PRO LYS GLU PRO TYR VAL
+SEQRES 4 C 314 GLY ARG CYS LEU LEU ASN THR LYS ILE THR GLY ASP ASP
+SEQRES 5 C 314 ALA PRO GLY GLU THR TRP HIS MET VAL PHE SER THR GLU
+SEQRES 6 C 314 GLY LYS ILE PRO TYR ARG GLU GLY GLN SER ILE GLY VAL
+SEQRES 7 C 314 ILE ALA ASP GLY VAL ASP LYS ASN GLY LYS PRO HIS LYS
+SEQRES 8 C 314 VAL ARG LEU TYR SER ILE ALA SER SER ALA ILE GLY ASP
+SEQRES 9 C 314 PHE GLY ASP SER LYS THR VAL SER LEU CYS VAL LYS ARG
+SEQRES 10 C 314 LEU ILE TYR THR ASN ASP ALA GLY GLU ILE VAL LYS GLY
+SEQRES 11 C 314 VAL CYS SER ASN PHE LEU CYS ASP LEU GLN PRO GLY ASP
+SEQRES 12 C 314 ASN VAL GLN ILE THR GLY PRO VAL GLY LYS GLU MET LEU
+SEQRES 13 C 314 MET PRO LYS ASP PRO ASN ALA THR ILE ILE MET LEU ALA
+SEQRES 14 C 314 THR GLY THR GLY ILE ALA PRO PHE ARG SER PHE LEU TRP
+SEQRES 15 C 314 LYS MET PHE PHE GLU LYS HIS ASP ASP TYR LYS PHE ASN
+SEQRES 16 C 314 GLY LEU GLY TRP LEU PHE LEU GLY VAL PRO THR SER SER
+SEQRES 17 C 314 SER LEU LEU TYR LYS GLU GLU PHE GLY LYS MET LYS GLU
+SEQRES 18 C 314 ARG ALA PRO GLU ASN PHE ARG VAL ASP TYR ALA VAL SER
+SEQRES 19 C 314 ARG GLU GLN THR ASN ALA ALA GLY GLU ARG MET TYR ILE
+SEQRES 20 C 314 GLN THR ARG MET ALA GLU TYR LYS GLU GLU LEU TRP GLU
+SEQRES 21 C 314 LEU LEU LYS LYS ASP ASN THR TYR VAL TYR MET CYS GLY
+SEQRES 22 C 314 LEU LYS GLY MET GLU LYS GLY ILE ASP ASP ILE MET VAL
+SEQRES 23 C 314 SER LEU ALA GLU LYS ASP GLY ILE ASP TRP PHE ASP TYR
+SEQRES 24 C 314 LYS LYS GLN LEU LYS ARG GLY ASP GLN TRP ASN VAL GLU
+SEQRES 25 C 314 VAL TYR
+SEQRES 1 D 98 ALA THR TYR ASN VAL LYS LEU ILE THR PRO GLU GLY GLU
+SEQRES 2 D 98 VAL GLU LEU GLN VAL PRO ASP ASP VAL TYR ILE LEU ASP
+SEQRES 3 D 98 GLN ALA GLU GLU ASP GLY ILE ASP LEU PRO TYR SER CYS
+SEQRES 4 D 98 ARG ALA GLY SER CYS SER SER CYS ALA GLY LYS VAL VAL
+SEQRES 5 D 98 SER GLY SER VAL ASP GLN SER ASP GLN SER TYR LEU ASP
+SEQRES 6 D 98 ASP GLY GLN ILE CYS ASP GLY TRP VAL LEU THR CYS HIS
+SEQRES 7 D 98 ALA TYR PRO THR SER ASP VAL VAL ILE GLU THR HIS LYS
+SEQRES 8 D 98 GLU GLU GLU LEU THR GLY ALA
+HET FAD A 401 53
+HET FES B 101 4
+HET FAD C 401 53
+HET FES D 101 4
+HETNAM FAD FLAVIN-ADENINE DINUCLEOTIDE
+HETNAM FES FE2/S2 (INORGANIC) CLUSTER
+FORMUL 5 FAD 2(C27 H33 N9 O15 P2)
+FORMUL 6 FES 2(FE2 S2)
+HELIX 1 1 GLY A 130 ASP A 138 1 9
+HELIX 2 2 ILE A 174 PHE A 186 1 13
+HELIX 3 3 TYR A 212 ALA A 223 1 12
+HELIX 4 4 TYR A 246 GLU A 253 1 8
+HELIX 5 5 TYR A 254 LEU A 262 1 9
+HELIX 6 6 GLY A 276 GLU A 290 1 15
+HELIX 7 7 ASP A 295 GLY A 306 1 12
+HELIX 8 8 TYR B 23 ASP B 31 1 9
+HELIX 9 9 ASP B 65 CYS B 70 1 6
+HELIX 10 10 CYS B 77 ALA B 79 5 3
+HELIX 11 11 LYS B 91 THR B 96 1 6
+HELIX 12 12 GLY C 130 ASP C 138 1 9
+HELIX 13 13 ILE C 174 PHE C 186 1 13
+HELIX 14 14 TYR C 212 ALA C 223 1 12
+HELIX 15 15 TYR C 246 GLU C 253 1 8
+HELIX 16 16 TYR C 254 LEU C 262 1 9
+HELIX 17 17 GLY C 276 GLU C 290 1 15
+HELIX 18 18 ASP C 295 GLY C 306 1 12
+HELIX 19 19 TYR D 23 ASP D 31 1 9
+HELIX 20 20 ASP D 65 ASP D 71 1 7
+HELIX 21 21 CYS D 77 ALA D 79 5 3
+HELIX 22 22 LYS D 91 THR D 96 1 6
+SHEET 1 A 6 THR A 46 LYS A 47 0
+SHEET 2 A 6 THR A 57 SER A 63 -1 O HIS A 59 N THR A 46
+SHEET 3 A 6 TYR A 38 CYS A 42 -1 N ARG A 41 O SER A 63
+SHEET 4 A 6 ASN A 144 VAL A 151 -1 O ILE A 147 N TYR A 38
+SHEET 5 A 6 SER A 75 ILE A 79 -1 N GLY A 77 O THR A 148
+SHEET 6 A 6 ARG A 93 SER A 96 -1 O TYR A 95 N ILE A 76
+SHEET 1 B 3 THR A 46 LYS A 47 0
+SHEET 2 B 3 THR A 57 SER A 63 -1 O HIS A 59 N THR A 46
+SHEET 3 B 3 THR A 110 LYS A 116 -1 O LEU A 113 N MET A 60
+SHEET 1 C 2 ILE A 119 THR A 121 0
+SHEET 2 C 2 ILE A 127 LYS A 129 -1 O VAL A 128 N TYR A 120
+SHEET 1 D 5 PHE A 227 VAL A 233 0
+SHEET 2 D 5 LEU A 197 VAL A 204 1 N GLY A 198 O ARG A 228
+SHEET 3 D 5 THR A 164 THR A 170 1 N MET A 167 O PHE A 201
+SHEET 4 D 5 THR A 267 LEU A 274 1 O TYR A 270 N ILE A 166
+SHEET 5 D 5 TRP A 309 TYR A 314 1 O ASN A 310 N MET A 271
+SHEET 1 E 5 GLY B 12 PRO B 19 0
+SHEET 2 E 5 THR B 2 THR B 9 -1 N LEU B 7 O VAL B 14
+SHEET 3 E 5 VAL B 85 GLU B 88 1 O ILE B 87 N ILE B 8
+SHEET 4 E 5 ALA B 48 SER B 53 -1 N VAL B 52 O VAL B 86
+SHEET 5 E 5 TRP B 73 LEU B 75 -1 O VAL B 74 N GLY B 49
+SHEET 1 F 2 VAL B 56 ASP B 57 0
+SHEET 2 F 2 TYR B 80 PRO B 81 -1 O TYR B 80 N ASP B 57
+SHEET 1 G 6 THR C 46 LYS C 47 0
+SHEET 2 G 6 THR C 57 SER C 63 -1 O HIS C 59 N THR C 46
+SHEET 3 G 6 TYR C 38 CYS C 42 -1 N ARG C 41 O SER C 63
+SHEET 4 G 6 ASN C 144 VAL C 151 -1 O VAL C 145 N GLY C 40
+SHEET 5 G 6 SER C 75 ILE C 79 -1 N GLY C 77 O THR C 148
+SHEET 6 G 6 ARG C 93 SER C 96 -1 O TYR C 95 N ILE C 76
+SHEET 1 H 3 THR C 46 LYS C 47 0
+SHEET 2 H 3 THR C 57 SER C 63 -1 O HIS C 59 N THR C 46
+SHEET 3 H 3 THR C 110 LYS C 116 -1 O VAL C 111 N PHE C 62
+SHEET 1 I 2 ILE C 119 THR C 121 0
+SHEET 2 I 2 ILE C 127 LYS C 129 -1 O VAL C 128 N TYR C 120
+SHEET 1 J 5 PHE C 227 VAL C 233 0
+SHEET 2 J 5 LEU C 197 VAL C 204 1 N GLY C 198 O ARG C 228
+SHEET 3 J 5 THR C 164 THR C 170 1 N MET C 167 O PHE C 201
+SHEET 4 J 5 THR C 267 LEU C 274 1 O TYR C 268 N THR C 164
+SHEET 5 J 5 TRP C 309 TYR C 314 1 O ASN C 310 N MET C 271
+SHEET 1 K 5 GLY D 12 PRO D 19 0
+SHEET 2 K 5 THR D 2 THR D 9 -1 N LEU D 7 O VAL D 14
+SHEET 3 K 5 VAL D 85 THR D 89 1 O ILE D 87 N ILE D 8
+SHEET 4 K 5 ALA D 48 SER D 53 -1 N VAL D 52 O VAL D 86
+SHEET 5 K 5 TRP D 73 LEU D 75 -1 O VAL D 74 N GLY D 49
+SHEET 1 L 2 VAL D 56 ASP D 57 0
+SHEET 2 L 2 TYR D 80 PRO D 81 -1 O TYR D 80 N ASP D 57
+SSBOND 1 CYS A 19 CYS D 70 1555 1555 2.02
+SSBOND 2 CYS B 70 CYS C 19 1555 1555 2.03
+LINK SG CYS D 44 FE2 FES D 101 1555 1555 1.91
+LINK SG CYS D 47 FE1 FES D 101 1555 1555 1.95
+LINK SG CYS B 39 FE2 FES B 101 1555 1555 1.96
+LINK SG CYS D 39 FE2 FES D 101 1555 1555 2.15
+LINK SG CYS B 77 FE1 FES B 101 1555 1555 2.35
+LINK SG CYS D 77 FE1 FES D 101 1555 1555 2.61
+CISPEP 1 GLY A 149 PRO A 150 0 -1.95
+CISPEP 2 GLY C 149 PRO C 150 0 -1.62
+SITE 1 AC1 15 ARG A 93 LEU A 94 TYR A 95 SER A 96
+SITE 2 AC1 15 CYS A 114 LYS A 116 LEU A 118 TYR A 120
+SITE 3 AC1 15 GLY A 130 VAL A 131 CYS A 132 SER A 133
+SITE 4 AC1 15 THR A 172 TYR A 314 SER B 38
+SITE 1 AC2 9 SER B 38 CYS B 39 ARG B 40 GLY B 42
+SITE 2 AC2 9 SER B 43 CYS B 44 CYS B 47 LEU B 75
+SITE 3 AC2 9 CYS B 77
+SITE 1 AC3 17 GLY A 242 ARG A 244 ARG C 93 LEU C 94
+SITE 2 AC3 17 TYR C 95 SER C 96 CYS C 114 VAL C 115
+SITE 3 AC3 17 LYS C 116 LEU C 118 TYR C 120 GLY C 130
+SITE 4 AC3 17 VAL C 131 CYS C 132 SER C 133 THR C 172
+SITE 5 AC3 17 TYR C 314
+SITE 1 AC4 9 SER D 38 CYS D 39 ARG D 40 GLY D 42
+SITE 2 AC4 9 SER D 43 CYS D 44 CYS D 47 LEU D 75
+SITE 3 AC4 9 CYS D 77
+CRYST1 75.170 120.345 84.577 90.00 109.70 90.00 P 1 21 1 4
+ORIGX1 1.000000 0.000000 0.000000 0.00000
+ORIGX2 0.000000 1.000000 0.000000 0.00000
+ORIGX3 0.000000 0.000000 1.000000 0.00000
+SCALE1 0.013303 0.000000 0.004764 0.00000
+SCALE2 0.000000 0.008309 0.000000 0.00000
+SCALE3 0.000000 0.000000 0.012559 0.00000
+MTRIX1 1 1.000000 0.000000 0.000000 0.00000 1
+MTRIX2 1 0.000000 1.000000 0.000000 0.00000 1
+MTRIX3 1 0.000000 0.000000 1.000000 0.00000 1
+MTRIX1 2 -0.900585 -0.360692 0.242586 -93.40076 1
+MTRIX2 2 -0.323557 0.183576 -0.928230 33.09570 1
+MTRIX3 2 0.290273 -0.914440 -0.282030 74.35553 1
+ATOM 1 N LYS A 18 -28.790 -18.357 17.844 1.00 40.00 N
+ATOM 2 CA LYS A 18 -27.990 -18.527 19.103 1.00 40.00 C
+ATOM 3 C LYS A 18 -28.888 -18.264 20.328 1.00 40.00 C
+ATOM 4 O LYS A 18 -29.482 -17.177 20.452 1.00 40.00 O
+ATOM 5 CB LYS A 18 -26.767 -17.582 19.138 1.00 40.00 C
+ATOM 6 CG LYS A 18 -26.359 -16.919 17.814 1.00 40.00 C
+ATOM 7 CD LYS A 18 -27.280 -15.776 17.366 1.00 40.00 C
+ATOM 8 CE LYS A 18 -27.659 -14.804 18.485 1.00 40.00 C
+ATOM 9 NZ LYS A 18 -26.567 -13.860 18.840 1.00 40.00 N
+ATOM 10 N CYS A 19 -29.018 -19.251 21.219 1.00 40.00 N
+ATOM 11 CA CYS A 19 -29.736 -19.000 22.469 1.00 40.00 C
+ATOM 12 C CYS A 19 -28.765 -18.475 23.517 1.00 40.00 C
+ATOM 13 O CYS A 19 -27.614 -18.928 23.642 1.00 40.00 O
+ATOM 14 CB CYS A 19 -30.569 -20.193 22.949 1.00 40.00 C
+ATOM 15 SG CYS A 19 -29.784 -21.807 22.816 1.00 40.00 S
+ATOM 16 N SER A 20 -29.241 -17.468 24.227 1.00 40.00 N
+ATOM 17 CA SER A 20 -28.405 -16.691 25.110 1.00 40.00 C
+ATOM 18 C SER A 20 -28.651 -17.107 26.557 1.00 40.00 C
+ATOM 19 O SER A 20 -29.707 -17.666 26.874 1.00 40.00 O
+ATOM 20 CB SER A 20 -28.692 -15.201 24.887 1.00 40.00 C
+ATOM 21 OG SER A 20 -28.226 -14.386 25.948 1.00 40.00 O
+ATOM 22 N LYS A 21 -27.671 -16.835 27.422 1.00 40.00 N
+ATOM 23 CA LYS A 21 -27.776 -17.131 28.847 1.00 40.00 C
+ATOM 24 C LYS A 21 -28.469 -16.016 29.608 1.00 40.00 C
+ATOM 25 O LYS A 21 -28.576 -16.083 30.831 1.00 40.00 O
+ATOM 26 CB LYS A 21 -26.396 -17.388 29.438 1.00 40.00 C
+ATOM 27 CG LYS A 21 -25.693 -18.583 28.818 1.00 40.00 C
+ATOM 28 CD LYS A 21 -24.275 -18.744 29.338 1.00 40.00 C
+ATOM 29 CE LYS A 21 -23.428 -19.521 28.345 1.00 40.00 C
+ATOM 30 NZ LYS A 21 -22.039 -19.714 28.839 1.00 40.00 N
+ATOM 31 N LYS A 22 -28.949 -15.011 28.867 1.00 40.00 N
+ATOM 32 CA LYS A 22 -29.640 -13.820 29.400 1.00 40.00 C
+ATOM 33 C LYS A 22 -31.095 -13.782 28.970 1.00 40.00 C
+ATOM 34 O LYS A 22 -31.378 -13.969 27.792 1.00 40.00 O
+ATOM 35 CB LYS A 22 -28.976 -12.554 28.871 1.00 40.00 C
+ATOM 36 CG LYS A 22 -27.457 -12.569 28.929 1.00 40.00 C
+ATOM 37 CD LYS A 22 -26.889 -11.294 28.334 1.00 40.00 C
+ATOM 38 CE LYS A 22 -25.393 -11.184 28.564 1.00 40.00 C
+ATOM 39 NZ LYS A 22 -24.847 -9.966 27.905 1.00 40.00 N
+ATOM 40 N GLN A 23 -32.010 -13.517 29.901 1.00 40.00 N
+ATOM 41 CA GLN A 23 -33.443 -13.632 29.609 1.00 40.00 C
+ATOM 42 C GLN A 23 -33.847 -12.730 28.472 1.00 40.00 C
+ATOM 43 O GLN A 23 -33.873 -11.517 28.638 1.00 40.00 O
+ATOM 44 CB GLN A 23 -34.285 -13.288 30.821 1.00 40.00 C
+ATOM 45 CG GLN A 23 -34.161 -14.283 31.949 1.00 40.00 C
+ATOM 46 CD GLN A 23 -34.707 -13.739 33.250 1.00 40.00 C
+ATOM 47 OE1 GLN A 23 -35.821 -13.197 33.293 1.00 40.00 O
+ATOM 48 NE2 GLN A 23 -33.926 -13.876 34.327 1.00 40.00 N
+ATOM 49 N GLU A 24 -34.168 -13.327 27.322 1.00 40.00 N
+ATOM 50 CA GLU A 24 -34.463 -12.550 26.110 1.00 40.00 C
+ATOM 51 C GLU A 24 -35.961 -12.512 25.779 1.00 40.00 C
+ATOM 52 O GLU A 24 -36.399 -11.866 24.824 1.00 40.00 O
+ATOM 53 CB GLU A 24 -33.599 -13.030 24.929 1.00 40.00 C
+ATOM 54 CG GLU A 24 -32.098 -12.852 25.188 1.00 40.00 C
+ATOM 55 CD GLU A 24 -31.292 -12.380 23.983 1.00 40.00 C
+ATOM 56 OE1 GLU A 24 -31.884 -11.756 23.060 1.00 40.00 O
+ATOM 57 OE2 GLU A 24 -30.056 -12.619 23.976 1.00 40.00 O
+ATOM 58 N GLU A 25 -36.735 -13.170 26.630 1.00 40.00 N
+ATOM 59 CA GLU A 25 -38.162 -13.331 26.437 1.00 40.00 C
+ATOM 60 C GLU A 25 -38.996 -12.123 26.887 1.00 40.00 C
+ATOM 61 O GLU A 25 -39.035 -11.786 28.066 1.00 40.00 O
+ATOM 62 CB GLU A 25 -38.616 -14.588 27.179 1.00 40.00 C
+ATOM 63 CG GLU A 25 -40.121 -14.836 27.137 1.00 40.00 C
+ATOM 64 CD GLU A 25 -40.633 -15.707 28.283 1.00 40.00 C
+ATOM 65 OE1 GLU A 25 -41.875 -15.854 28.414 1.00 40.00 O
+ATOM 66 OE2 GLU A 25 -39.806 -16.243 29.060 1.00 40.00 O
+ATOM 67 N GLY A 26 -39.692 -11.503 25.943 1.00 40.00 N
+ATOM 68 CA GLY A 26 -40.566 -10.364 26.242 1.00 40.00 C
+ATOM 69 C GLY A 26 -39.886 -9.008 26.056 1.00 40.00 C
+ATOM 70 O GLY A 26 -40.544 -7.959 25.948 1.00 40.00 O
+ATOM 71 N VAL A 27 -38.559 -9.036 26.018 1.00 40.00 N
+ATOM 72 CA VAL A 27 -37.749 -7.848 25.849 1.00 40.00 C
+ATOM 73 C VAL A 27 -38.078 -7.122 24.552 1.00 40.00 C
+ATOM 74 O VAL A 27 -37.933 -7.683 23.480 1.00 40.00 O
+ATOM 75 CB VAL A 27 -36.277 -8.254 25.799 1.00 40.00 C
+ATOM 76 CG1 VAL A 27 -35.391 -7.024 25.762 1.00 40.00 C
+ATOM 77 CG2 VAL A 27 -35.947 -9.134 26.990 1.00 40.00 C
+ATOM 78 N VAL A 28 -38.508 -5.874 24.640 1.00 40.00 N
+ATOM 79 CA VAL A 28 -38.799 -5.109 23.432 1.00 40.00 C
+ATOM 80 C VAL A 28 -37.718 -4.048 23.188 1.00 40.00 C
+ATOM 81 O VAL A 28 -37.091 -3.598 24.138 1.00 40.00 O
+ATOM 82 CB VAL A 28 -40.218 -4.495 23.498 1.00 40.00 C
+ATOM 83 CG1 VAL A 28 -41.217 -5.521 24.018 1.00 40.00 C
+ATOM 84 CG2 VAL A 28 -40.254 -3.255 24.379 1.00 40.00 C
+ATOM 85 N THR A 29 -37.477 -3.665 21.934 1.00 40.00 N
+ATOM 86 CA THR A 29 -36.574 -2.537 21.657 1.00 40.00 C
+ATOM 87 C THR A 29 -37.134 -1.489 20.708 1.00 40.00 C
+ATOM 88 O THR A 29 -38.044 -1.749 19.930 1.00 40.00 O
+ATOM 89 CB THR A 29 -35.197 -2.967 21.126 1.00 40.00 C
+ATOM 90 OG1 THR A 29 -35.354 -4.108 20.293 1.00 40.00 O
+ATOM 91 CG2 THR A 29 -34.287 -3.330 22.251 1.00 40.00 C
+ATOM 92 N ASN A 30 -36.557 -0.296 20.803 1.00 40.00 N
+ATOM 93 CA ASN A 30 -36.905 0.869 19.986 1.00 40.00 C
+ATOM 94 C ASN A 30 -38.395 1.116 19.727 1.00 40.00 C
+ATOM 95 O ASN A 30 -38.775 1.572 18.647 1.00 40.00 O
+ATOM 96 CB ASN A 30 -36.064 0.893 18.710 1.00 40.00 C
+ATOM 97 CG ASN A 30 -34.598 1.154 19.000 1.00 40.00 C
+ATOM 98 OD1 ASN A 30 -34.152 2.307 19.007 1.00 40.00 O
+ATOM 99 ND2 ASN A 30 -33.841 0.081 19.259 1.00 40.00 N
+ATOM 100 N LEU A 31 -39.213 0.838 20.749 1.00 40.00 N
+ATOM 101 CA LEU A 31 -40.649 1.101 20.729 1.00 40.00 C
+ATOM 102 C LEU A 31 -40.994 2.576 20.443 1.00 40.00 C
+ATOM 103 O LEU A 31 -41.929 2.844 19.702 1.00 40.00 O
+ATOM 104 CB LEU A 31 -41.297 0.630 22.027 1.00 40.00 C
+ATOM 105 CG LEU A 31 -42.459 -0.352 21.899 1.00 40.00 C
+ATOM 106 CD1 LEU A 31 -43.174 -0.478 23.228 1.00 40.00 C
+ATOM 107 CD2 LEU A 31 -43.458 0.073 20.839 1.00 40.00 C
+ATOM 108 N TYR A 32 -40.253 3.522 21.021 1.00 40.00 N
+ATOM 109 CA TYR A 32 -40.294 4.924 20.569 1.00 40.00 C
+ATOM 110 C TYR A 32 -38.899 5.382 20.108 1.00 40.00 C
+ATOM 111 O TYR A 32 -37.879 5.020 20.708 1.00 40.00 O
+ATOM 112 CB TYR A 32 -40.812 5.870 21.655 1.00 40.00 C
+ATOM 113 CG TYR A 32 -42.199 5.587 22.193 1.00 40.00 C
+ATOM 114 CD1 TYR A 32 -42.442 4.480 23.014 1.00 40.00 C
+ATOM 115 CD2 TYR A 32 -43.259 6.450 21.924 1.00 40.00 C
+ATOM 116 CE1 TYR A 32 -43.703 4.225 23.533 1.00 40.00 C
+ATOM 117 CE2 TYR A 32 -44.528 6.205 22.437 1.00 40.00 C
+ATOM 118 CZ TYR A 32 -44.743 5.091 23.246 1.00 40.00 C
+ATOM 119 OH TYR A 32 -45.992 4.821 23.773 1.00 40.00 O
+ATOM 120 N LYS A 33 -38.867 6.178 19.039 1.00 40.00 N
+ATOM 121 CA LYS A 33 -37.616 6.691 18.445 1.00 40.00 C
+ATOM 122 C LYS A 33 -37.626 8.235 18.464 1.00 40.00 C
+ATOM 123 O LYS A 33 -38.688 8.830 18.665 1.00 40.00 O
+ATOM 124 CB LYS A 33 -37.440 6.174 16.999 1.00 40.00 C
+ATOM 125 CG LYS A 33 -37.289 4.652 16.831 1.00 40.00 C
+ATOM 126 CD LYS A 33 -37.474 4.221 15.363 1.00 40.00 C
+ATOM 127 CE LYS A 33 -37.663 2.713 15.168 1.00 40.00 C
+ATOM 128 NZ LYS A 33 -39.025 2.239 15.551 1.00 40.00 N
+ATOM 129 N PRO A 34 -36.447 8.887 18.267 1.00 40.00 N
+ATOM 130 CA PRO A 34 -36.280 10.366 18.253 1.00 40.00 C
+ATOM 131 C PRO A 34 -37.264 11.186 17.397 1.00 40.00 C
+ATOM 132 O PRO A 34 -37.515 12.357 17.704 1.00 40.00 O
+ATOM 133 CB PRO A 34 -34.857 10.543 17.725 1.00 40.00 C
+ATOM 134 CG PRO A 34 -34.140 9.335 18.228 1.00 40.00 C
+ATOM 135 CD PRO A 34 -35.135 8.203 18.237 1.00 40.00 C
+ATOM 136 N LYS A 35 -37.800 10.578 16.340 1.00 40.00 N
+ATOM 137 CA LYS A 35 -38.849 11.199 15.530 1.00 40.00 C
+ATOM 138 C LYS A 35 -40.211 11.280 16.256 1.00 40.00 C
+ATOM 139 O LYS A 35 -40.899 12.304 16.167 1.00 40.00 O
+ATOM 140 CB LYS A 35 -39.004 10.472 14.188 1.00 40.00 C
+ATOM 141 CG LYS A 35 -39.985 9.302 14.206 1.00 40.00 C
+ATOM 142 CD LYS A 35 -39.803 8.387 13.013 1.00 40.00 C
+ATOM 143 CE LYS A 35 -38.570 7.518 13.187 1.00 40.00 C
+ATOM 144 NZ LYS A 35 -38.127 6.952 11.883 1.00 40.00 N
+ATOM 145 N GLU A 36 -40.605 10.205 16.950 1.00 40.00 N
+ATOM 146 CA GLU A 36 -41.873 10.179 17.706 1.00 40.00 C
+ATOM 147 C GLU A 36 -41.734 9.676 19.153 1.00 40.00 C
+ATOM 148 O GLU A 36 -42.177 8.560 19.475 1.00 40.00 O
+ATOM 149 CB GLU A 36 -42.958 9.405 16.952 1.00 40.00 C
+ATOM 150 CG GLU A 36 -43.620 10.221 15.850 1.00 40.00 C
+ATOM 151 CD GLU A 36 -44.885 9.573 15.306 1.00 40.00 C
+ATOM 152 OE1 GLU A 36 -44.957 9.388 14.068 1.00 40.00 O
+ATOM 153 OE2 GLU A 36 -45.805 9.247 16.103 1.00 40.00 O
+ATOM 154 N PRO A 37 -41.128 10.514 20.032 1.00 40.00 N
+ATOM 155 CA PRO A 37 -40.925 10.163 21.443 1.00 40.00 C
+ATOM 156 C PRO A 37 -42.210 10.182 22.254 1.00 40.00 C
+ATOM 157 O PRO A 37 -43.074 11.034 22.044 1.00 40.00 O
+ATOM 158 CB PRO A 37 -39.998 11.277 21.952 1.00 40.00 C
+ATOM 159 CG PRO A 37 -40.282 12.447 21.069 1.00 40.00 C
+ATOM 160 CD PRO A 37 -40.593 11.860 19.720 1.00 40.00 C
+ATOM 161 N TYR A 38 -42.330 9.250 23.186 1.00 40.00 N
+ATOM 162 CA TYR A 38 -43.392 9.337 24.168 1.00 40.00 C
+ATOM 163 C TYR A 38 -43.159 10.548 25.084 1.00 40.00 C
+ATOM 164 O TYR A 38 -42.049 10.781 25.576 1.00 40.00 O
+ATOM 165 CB TYR A 38 -43.482 8.045 24.982 1.00 40.00 C
+ATOM 166 CG TYR A 38 -44.433 8.147 26.140 1.00 40.00 C
+ATOM 167 CD1 TYR A 38 -45.807 7.979 25.963 1.00 40.00 C
+ATOM 168 CD2 TYR A 38 -43.956 8.434 27.413 1.00 40.00 C
+ATOM 169 CE1 TYR A 38 -46.677 8.086 27.029 1.00 40.00 C
+ATOM 170 CE2 TYR A 38 -44.811 8.535 28.486 1.00 40.00 C
+ATOM 171 CZ TYR A 38 -46.164 8.366 28.293 1.00 40.00 C
+ATOM 172 OH TYR A 38 -46.982 8.477 29.393 1.00 40.00 O
+ATOM 173 N VAL A 39 -44.201 11.331 25.306 1.00 40.00 N
+ATOM 174 CA VAL A 39 -44.064 12.412 26.249 1.00 40.00 C
+ATOM 175 C VAL A 39 -44.601 11.918 27.577 1.00 40.00 C
+ATOM 176 O VAL A 39 -45.771 11.562 27.697 1.00 40.00 O
+ATOM 177 CB VAL A 39 -44.717 13.720 25.754 1.00 40.00 C
+ATOM 178 CG1 VAL A 39 -44.727 14.770 26.847 1.00 40.00 C
+ATOM 179 CG2 VAL A 39 -43.955 14.261 24.551 1.00 40.00 C
+ATOM 180 N GLY A 40 -43.702 11.848 28.551 1.00 40.00 N
+ATOM 181 CA GLY A 40 -44.030 11.417 29.907 1.00 40.00 C
+ATOM 182 C GLY A 40 -44.064 12.579 30.875 1.00 40.00 C
+ATOM 183 O GLY A 40 -44.082 13.734 30.467 1.00 40.00 O
+ATOM 184 N ARG A 41 -44.072 12.288 32.167 1.00 40.00 N
+ATOM 185 CA ARG A 41 -44.154 13.375 33.120 1.00 40.00 C
+ATOM 186 C ARG A 41 -43.387 13.136 34.402 1.00 40.00 C
+ATOM 187 O ARG A 41 -43.339 12.001 34.897 1.00 40.00 O
+ATOM 188 CB ARG A 41 -45.603 13.674 33.447 1.00 40.00 C
+ATOM 189 CG ARG A 41 -45.807 15.073 33.989 1.00 40.00 C
+ATOM 190 CD ARG A 41 -47.283 15.412 34.094 1.00 40.00 C
+ATOM 191 NE ARG A 41 -47.922 15.509 32.782 1.00 40.00 N
+ATOM 192 CZ ARG A 41 -48.022 16.630 32.072 1.00 40.00 C
+ATOM 193 NH1 ARG A 41 -47.520 17.772 32.542 1.00 40.00 N
+ATOM 194 NH2 ARG A 41 -48.619 16.605 30.883 1.00 40.00 N
+ATOM 195 N CYS A 42 -42.816 14.228 34.934 1.00 40.00 N
+ATOM 196 CA CYS A 42 -41.958 14.215 36.133 1.00 40.00 C
+ATOM 197 C CYS A 42 -42.762 14.117 37.430 1.00 40.00 C
+ATOM 198 O CYS A 42 -43.594 14.964 37.730 1.00 40.00 O
+ATOM 199 CB CYS A 42 -41.034 15.446 36.156 1.00 40.00 C
+ATOM 200 SG CYS A 42 -39.841 15.488 37.524 1.00 40.00 S
+ATOM 201 N LEU A 43 -42.502 13.070 38.196 1.00 40.00 N
+ATOM 202 CA LEU A 43 -43.235 12.832 39.417 1.00 40.00 C
+ATOM 203 C LEU A 43 -42.380 13.251 40.604 1.00 40.00 C
+ATOM 204 O LEU A 43 -42.809 14.064 41.421 1.00 40.00 O
+ATOM 205 CB LEU A 43 -43.630 11.351 39.513 1.00 40.00 C
+ATOM 206 CG LEU A 43 -44.789 10.752 38.693 1.00 40.00 C
+ATOM 207 CD1 LEU A 43 -45.023 11.410 37.337 1.00 40.00 C
+ATOM 208 CD2 LEU A 43 -44.591 9.248 38.532 1.00 40.00 C
+ATOM 209 N LEU A 44 -41.174 12.687 40.682 1.00 40.00 N
+ATOM 210 CA LEU A 44 -40.198 13.000 41.731 1.00 40.00 C
+ATOM 211 C LEU A 44 -38.964 13.607 41.105 1.00 40.00 C
+ATOM 212 O LEU A 44 -38.890 13.762 39.886 1.00 40.00 O
+ATOM 213 CB LEU A 44 -39.783 11.741 42.516 1.00 40.00 C
+ATOM 214 CG LEU A 44 -40.797 11.112 43.474 1.00 40.00 C
+ATOM 215 CD1 LEU A 44 -40.100 10.077 44.349 1.00 40.00 C
+ATOM 216 CD2 LEU A 44 -41.502 12.174 44.316 1.00 40.00 C
+ATOM 217 N ASN A 45 -38.003 13.943 41.960 1.00 40.00 N
+ATOM 218 CA ASN A 45 -36.712 14.492 41.563 1.00 40.00 C
+ATOM 219 C ASN A 45 -36.006 14.916 42.840 1.00 40.00 C
+ATOM 220 O ASN A 45 -36.197 16.022 43.330 1.00 40.00 O
+ATOM 221 CB ASN A 45 -36.854 15.678 40.576 1.00 40.00 C
+ATOM 222 CG ASN A 45 -35.547 16.018 39.854 1.00 40.00 C
+ATOM 223 OD1 ASN A 45 -34.512 15.390 40.083 1.00 40.00 O
+ATOM 224 ND2 ASN A 45 -35.596 17.017 38.969 1.00 40.00 N
+ATOM 225 N THR A 46 -35.206 14.016 43.389 1.00 40.00 N
+ATOM 226 CA THR A 46 -34.545 14.249 44.664 1.00 40.00 C
+ATOM 227 C THR A 46 -33.023 14.198 44.497 1.00 40.00 C
+ATOM 228 O THR A 46 -32.503 13.253 43.909 1.00 40.00 O
+ATOM 229 CB THR A 46 -34.994 13.176 45.676 1.00 40.00 C
+ATOM 230 OG1 THR A 46 -36.415 13.026 45.596 1.00 40.00 O
+ATOM 231 CG2 THR A 46 -34.581 13.531 47.102 1.00 40.00 C
+ATOM 232 N LYS A 47 -32.302 15.202 44.993 1.00 40.00 N
+ATOM 233 CA LYS A 47 -30.850 15.085 45.060 1.00 40.00 C
+ATOM 234 C LYS A 47 -30.584 13.942 46.019 1.00 40.00 C
+ATOM 235 O LYS A 47 -31.277 13.796 47.022 1.00 40.00 O
+ATOM 236 CB LYS A 47 -30.183 16.378 45.549 1.00 40.00 C
+ATOM 237 CG LYS A 47 -28.695 16.463 45.219 1.00 40.00 C
+ATOM 238 CD LYS A 47 -28.118 17.866 45.326 1.00 40.00 C
+ATOM 239 CE LYS A 47 -27.205 17.999 46.525 1.00 40.00 C
+ATOM 240 NZ LYS A 47 -26.233 19.097 46.295 1.00 40.00 N
+ATOM 241 N ILE A 48 -29.610 13.108 45.687 1.00 40.00 N
+ATOM 242 CA ILE A 48 -29.268 11.956 46.527 1.00 40.00 C
+ATOM 243 C ILE A 48 -27.803 11.960 47.021 1.00 40.00 C
+ATOM 244 O ILE A 48 -27.420 11.140 47.860 1.00 40.00 O
+ATOM 245 CB ILE A 48 -29.630 10.625 45.839 1.00 40.00 C
+ATOM 246 CG1 ILE A 48 -29.110 10.621 44.405 1.00 40.00 C
+ATOM 247 CG2 ILE A 48 -31.138 10.426 45.842 1.00 40.00 C
+ATOM 248 CD1 ILE A 48 -28.765 9.252 43.880 1.00 40.00 C
+ATOM 249 N THR A 49 -26.995 12.881 46.488 1.00 40.00 N
+ATOM 250 CA THR A 49 -25.672 13.207 47.045 1.00 40.00 C
+ATOM 251 C THR A 49 -25.827 14.275 48.159 1.00 40.00 C
+ATOM 252 O THR A 49 -26.760 15.104 48.119 1.00 40.00 O
+ATOM 253 CB THR A 49 -24.658 13.706 45.963 1.00 40.00 C
+ATOM 254 OG1 THR A 49 -25.212 14.791 45.208 1.00 40.00 O
+ATOM 255 CG2 THR A 49 -24.258 12.608 45.001 1.00 40.00 C
+ATOM 256 N GLY A 50 -24.925 14.246 49.150 1.00 40.00 N
+ATOM 257 CA GLY A 50 -24.826 15.302 50.191 1.00 40.00 C
+ATOM 258 C GLY A 50 -24.474 16.671 49.608 1.00 40.00 C
+ATOM 259 O GLY A 50 -24.331 16.813 48.387 1.00 40.00 O
+ATOM 260 N ASP A 51 -24.336 17.692 50.450 1.00 40.00 N
+ATOM 261 CA ASP A 51 -24.119 19.048 49.917 1.00 40.00 C
+ATOM 262 C ASP A 51 -22.654 19.324 49.611 1.00 40.00 C
+ATOM 263 O ASP A 51 -22.311 20.122 48.725 1.00 40.00 O
+ATOM 264 CB ASP A 51 -24.703 20.088 50.863 1.00 40.00 C
+ATOM 265 CG ASP A 51 -26.211 20.175 50.759 1.00 40.00 C
+ATOM 266 OD1 ASP A 51 -26.905 19.754 51.714 1.00 40.00 O
+ATOM 267 OD2 ASP A 51 -26.699 20.651 49.706 1.00 40.00 O
+ATOM 268 N ASP A 52 -21.808 18.624 50.357 1.00 40.00 N
+ATOM 269 CA ASP A 52 -20.368 18.673 50.201 1.00 40.00 C
+ATOM 270 C ASP A 52 -19.892 17.891 48.971 1.00 40.00 C
+ATOM 271 O ASP A 52 -18.757 18.073 48.514 1.00 40.00 O
+ATOM 272 CB ASP A 52 -19.698 18.150 51.478 1.00 40.00 C
+ATOM 273 CG ASP A 52 -20.384 16.909 52.048 1.00 40.00 C
+ATOM 274 OD1 ASP A 52 -21.637 16.813 52.034 1.00 40.00 O
+ATOM 275 OD2 ASP A 52 -19.648 16.030 52.535 1.00 40.00 O
+ATOM 276 N ALA A 53 -20.771 17.037 48.439 1.00 40.00 N
+ATOM 277 CA ALA A 53 -20.493 16.213 47.250 1.00 40.00 C
+ATOM 278 C ALA A 53 -19.982 16.975 46.023 1.00 40.00 C
+ATOM 279 O ALA A 53 -20.568 17.984 45.608 1.00 40.00 O
+ATOM 280 CB ALA A 53 -21.718 15.397 46.877 1.00 40.00 C
+ATOM 281 N PRO A 54 -18.885 16.478 45.434 1.00 40.00 N
+ATOM 282 CA PRO A 54 -18.259 17.121 44.284 1.00 40.00 C
+ATOM 283 C PRO A 54 -19.181 17.402 43.079 1.00 40.00 C
+ATOM 284 O PRO A 54 -19.044 18.441 42.428 1.00 40.00 O
+ATOM 285 CB PRO A 54 -17.130 16.140 43.902 1.00 40.00 C
+ATOM 286 CG PRO A 54 -17.359 14.899 44.711 1.00 40.00 C
+ATOM 287 CD PRO A 54 -18.076 15.354 45.938 1.00 40.00 C
+ATOM 288 N GLY A 55 -20.116 16.500 42.796 1.00 40.00 N
+ATOM 289 CA GLY A 55 -20.763 16.496 41.487 1.00 40.00 C
+ATOM 290 C GLY A 55 -22.252 16.748 41.411 1.00 40.00 C
+ATOM 291 O GLY A 55 -22.731 17.305 40.418 1.00 40.00 O
+ATOM 292 N GLU A 56 -22.985 16.328 42.443 1.00 40.00 N
+ATOM 293 CA GLU A 56 -24.454 16.432 42.468 1.00 40.00 C
+ATOM 294 C GLU A 56 -25.172 15.432 41.517 1.00 40.00 C
+ATOM 295 O GLU A 56 -25.052 15.505 40.284 1.00 40.00 O
+ATOM 296 CB GLU A 56 -24.912 17.888 42.236 1.00 40.00 C
+ATOM 297 CG GLU A 56 -26.414 18.093 42.298 1.00 40.00 C
+ATOM 298 CD GLU A 56 -26.820 19.539 42.179 1.00 40.00 C
+ATOM 299 OE1 GLU A 56 -26.457 20.334 43.065 1.00 40.00 O
+ATOM 300 OE2 GLU A 56 -27.520 19.867 41.207 1.00 40.00 O
+ATOM 301 N THR A 57 -25.931 14.515 42.119 1.00 40.00 N
+ATOM 302 CA THR A 57 -26.616 13.446 41.399 1.00 40.00 C
+ATOM 303 C THR A 57 -28.043 13.255 41.921 1.00 40.00 C
+ATOM 304 O THR A 57 -28.260 13.062 43.114 1.00 40.00 O
+ATOM 305 CB THR A 57 -25.803 12.142 41.502 1.00 40.00 C
+ATOM 306 OG1 THR A 57 -24.613 12.272 40.718 1.00 40.00 O
+ATOM 307 CG2 THR A 57 -26.590 10.956 41.008 1.00 40.00 C
+ATOM 308 N TRP A 58 -29.004 13.307 41.004 1.00 40.00 N
+ATOM 309 CA TRP A 58 -30.434 13.245 41.326 1.00 40.00 C
+ATOM 310 C TRP A 58 -31.092 11.933 40.947 1.00 40.00 C
+ATOM 311 O TRP A 58 -30.743 11.335 39.923 1.00 40.00 O
+ATOM 312 CB TRP A 58 -31.155 14.372 40.595 1.00 40.00 C
+ATOM 313 CG TRP A 58 -30.775 15.755 41.046 1.00 40.00 C
+ATOM 314 CD1 TRP A 58 -29.567 16.415 40.844 1.00 40.00 C
+ATOM 315 CD2 TRP A 58 -31.608 16.703 41.794 1.00 40.00 C
+ATOM 316 NE1 TRP A 58 -29.598 17.670 41.396 1.00 40.00 N
+ATOM 317 CE2 TRP A 58 -30.791 17.903 41.983 1.00 40.00 C
+ATOM 318 CE3 TRP A 58 -32.898 16.677 42.304 1.00 40.00 C
+ATOM 319 CZ2 TRP A 58 -31.266 19.011 42.654 1.00 40.00 C
+ATOM 320 CZ3 TRP A 58 -33.366 17.799 42.984 1.00 40.00 C
+ATOM 321 CH2 TRP A 58 -32.571 18.939 43.153 1.00 40.00 C
+ATOM 322 N HIS A 59 -32.068 11.481 41.743 1.00 40.00 N
+ATOM 323 CA HIS A 59 -32.878 10.310 41.378 1.00 40.00 C
+ATOM 324 C HIS A 59 -34.281 10.627 40.983 1.00 40.00 C
+ATOM 325 O HIS A 59 -35.088 11.090 41.798 1.00 40.00 O
+ATOM 326 CB HIS A 59 -32.942 9.314 42.493 1.00 40.00 C
+ATOM 327 CG HIS A 59 -33.793 8.133 42.160 1.00 40.00 C
+ATOM 328 ND1 HIS A 59 -33.340 7.113 41.424 1.00 40.00 N
+ATOM 329 CD2 HIS A 59 -35.113 7.849 42.457 1.00 40.00 C
+ATOM 330 CE1 HIS A 59 -34.306 6.200 41.283 1.00 40.00 C
+ATOM 331 NE2 HIS A 59 -35.393 6.652 41.913 1.00 40.00 N
+ATOM 332 N MET A 60 -34.603 10.320 39.737 1.00 40.00 N
+ATOM 333 CA MET A 60 -35.849 10.782 39.170 1.00 40.00 C
+ATOM 334 C MET A 60 -36.703 9.667 38.610 1.00 40.00 C
+ATOM 335 O MET A 60 -36.186 8.702 38.054 1.00 40.00 O
+ATOM 336 CB MET A 60 -35.592 11.852 38.110 1.00 40.00 C
+ATOM 337 CG MET A 60 -34.631 11.461 37.002 1.00 40.00 C
+ATOM 338 SD MET A 60 -34.024 12.965 36.220 1.00 40.00 S
+ATOM 339 CE MET A 60 -32.764 13.417 37.401 1.00 40.00 C
+ATOM 340 N VAL A 61 -38.018 9.838 38.761 1.00 40.00 N
+ATOM 341 CA VAL A 61 -39.025 8.875 38.324 1.00 40.00 C
+ATOM 342 C VAL A 61 -40.008 9.534 37.337 1.00 40.00 C
+ATOM 343 O VAL A 61 -40.361 10.707 37.491 1.00 40.00 O
+ATOM 344 CB VAL A 61 -39.796 8.278 39.531 1.00 40.00 C
+ATOM 345 CG1 VAL A 61 -40.247 6.862 39.218 1.00 40.00 C
+ATOM 346 CG2 VAL A 61 -38.928 8.259 40.786 1.00 40.00 C
+ATOM 347 N PHE A 62 -40.438 8.783 36.322 1.00 40.00 N
+ATOM 348 CA PHE A 62 -41.399 9.295 35.336 1.00 40.00 C
+ATOM 349 C PHE A 62 -42.632 8.416 35.114 1.00 40.00 C
+ATOM 350 O PHE A 62 -42.584 7.179 35.279 1.00 40.00 O
+ATOM 351 CB PHE A 62 -40.738 9.530 33.976 1.00 40.00 C
+ATOM 352 CG PHE A 62 -39.466 10.322 34.031 1.00 40.00 C
+ATOM 353 CD1 PHE A 62 -39.434 11.591 34.586 1.00 40.00 C
+ATOM 354 CD2 PHE A 62 -38.298 9.804 33.482 1.00 40.00 C
+ATOM 355 CE1 PHE A 62 -38.251 12.320 34.613 1.00 40.00 C
+ATOM 356 CE2 PHE A 62 -37.111 10.527 33.504 1.00 40.00 C
+ATOM 357 CZ PHE A 62 -37.087 11.788 34.071 1.00 40.00 C
+ATOM 358 N SER A 63 -43.720 9.080 34.713 1.00 40.00 N
+ATOM 359 CA SER A 63 -44.963 8.426 34.328 1.00 40.00 C
+ATOM 360 C SER A 63 -44.881 7.967 32.874 1.00 40.00 C
+ATOM 361 O SER A 63 -44.475 8.728 31.981 1.00 40.00 O
+ATOM 362 CB SER A 63 -46.127 9.389 34.494 1.00 40.00 C
+ATOM 363 OG SER A 63 -45.875 10.568 33.749 1.00 40.00 O
+ATOM 364 N THR A 64 -45.292 6.714 32.667 1.00 40.00 N
+ATOM 365 CA THR A 64 -45.090 5.974 31.416 1.00 40.00 C
+ATOM 366 C THR A 64 -46.394 5.421 30.855 1.00 40.00 C
+ATOM 367 O THR A 64 -46.471 5.081 29.676 1.00 40.00 O
+ATOM 368 CB THR A 64 -44.178 4.749 31.645 1.00 40.00 C
+ATOM 369 OG1 THR A 64 -44.864 3.776 32.443 1.00 40.00 O
+ATOM 370 CG2 THR A 64 -42.914 5.139 32.379 1.00 40.00 C
+ATOM 371 N GLU A 65 -47.399 5.326 31.730 1.00 40.00 N
+ATOM 372 CA GLU A 65 -48.696 4.680 31.462 1.00 40.00 C
+ATOM 373 C GLU A 65 -48.599 3.163 31.192 1.00 40.00 C
+ATOM 374 O GLU A 65 -49.466 2.597 30.527 1.00 40.00 O
+ATOM 375 CB GLU A 65 -49.451 5.382 30.329 1.00 40.00 C
+ATOM 376 CG GLU A 65 -49.692 6.869 30.531 1.00 40.00 C
+ATOM 377 CD GLU A 65 -50.340 7.504 29.309 1.00 40.00 C
+ATOM 378 OE1 GLU A 65 -51.537 7.226 29.062 1.00 40.00 O
+ATOM 379 OE2 GLU A 65 -49.658 8.276 28.588 1.00 40.00 O
+ATOM 380 N GLY A 66 -47.560 2.510 31.719 1.00 40.00 N
+ATOM 381 CA GLY A 66 -47.309 1.087 31.443 1.00 40.00 C
+ATOM 382 C GLY A 66 -46.930 0.849 29.990 1.00 40.00 C
+ATOM 383 O GLY A 66 -46.709 -0.298 29.569 1.00 40.00 O
+ATOM 384 N LYS A 67 -46.842 1.958 29.244 1.00 40.00 N
+ATOM 385 CA LYS A 67 -46.648 1.973 27.779 1.00 40.00 C
+ATOM 386 C LYS A 67 -45.213 1.614 27.318 1.00 40.00 C
+ATOM 387 O LYS A 67 -44.925 1.554 26.100 1.00 40.00 O
+ATOM 388 CB LYS A 67 -47.116 3.324 27.173 1.00 40.00 C
+ATOM 389 CG LYS A 67 -48.639 3.472 27.026 1.00 40.00 C
+ATOM 390 CD LYS A 67 -49.052 4.687 26.184 1.00 40.00 C
+ATOM 391 CE LYS A 67 -50.562 4.731 25.952 1.00 40.00 C
+ATOM 392 NZ LYS A 67 -50.995 5.959 25.222 1.00 40.00 N
+ATOM 393 N ILE A 68 -44.325 1.383 28.289 1.00 40.00 N
+ATOM 394 CA ILE A 68 -42.946 1.039 27.993 1.00 40.00 C
+ATOM 395 C ILE A 68 -42.532 -0.130 28.856 1.00 40.00 C
+ATOM 396 O ILE A 68 -41.862 0.072 29.858 1.00 40.00 O
+ATOM 397 CB ILE A 68 -41.987 2.225 28.214 1.00 40.00 C
+ATOM 398 CG1 ILE A 68 -42.425 3.445 27.375 1.00 40.00 C
+ATOM 399 CG2 ILE A 68 -40.573 1.789 27.864 1.00 40.00 C
+ATOM 400 CD1 ILE A 68 -41.767 4.769 27.724 1.00 40.00 C
+ATOM 401 N PRO A 69 -42.935 -1.360 28.467 1.00 40.00 N
+ATOM 402 CA PRO A 69 -42.637 -2.574 29.235 1.00 40.00 C
+ATOM 403 C PRO A 69 -41.153 -2.886 29.178 1.00 40.00 C
+ATOM 404 O PRO A 69 -40.732 -3.803 28.469 1.00 40.00 O
+ATOM 405 CB PRO A 69 -43.440 -3.661 28.513 1.00 40.00 C
+ATOM 406 CG PRO A 69 -43.521 -3.179 27.109 1.00 40.00 C
+ATOM 407 CD PRO A 69 -43.632 -1.679 27.205 1.00 40.00 C
+ATOM 408 N TYR A 70 -40.374 -2.099 29.916 1.00 40.00 N
+ATOM 409 CA TYR A 70 -38.932 -2.248 29.950 1.00 40.00 C
+ATOM 410 C TYR A 70 -38.521 -3.405 30.817 1.00 40.00 C
+ATOM 411 O TYR A 70 -39.291 -3.900 31.639 1.00 40.00 O
+ATOM 412 CB TYR A 70 -38.248 -0.961 30.424 1.00 40.00 C
+ATOM 413 CG TYR A 70 -38.543 -0.511 31.851 1.00 40.00 C
+ATOM 414 CD1 TYR A 70 -37.698 -0.855 32.907 1.00 40.00 C
+ATOM 415 CD2 TYR A 70 -39.644 0.302 32.135 1.00 40.00 C
+ATOM 416 CE1 TYR A 70 -37.958 -0.421 34.204 1.00 40.00 C
+ATOM 417 CE2 TYR A 70 -39.911 0.739 33.428 1.00 40.00 C
+ATOM 418 CZ TYR A 70 -39.067 0.380 34.456 1.00 40.00 C
+ATOM 419 OH TYR A 70 -39.345 0.822 35.732 1.00 40.00 O
+ATOM 420 N ARG A 71 -37.290 -3.834 30.622 1.00 40.00 N
+ATOM 421 CA ARG A 71 -36.788 -4.906 31.416 1.00 40.00 C
+ATOM 422 C ARG A 71 -35.400 -4.586 31.972 1.00 40.00 C
+ATOM 423 O ARG A 71 -34.612 -3.855 31.350 1.00 40.00 O
+ATOM 424 CB ARG A 71 -36.835 -6.212 30.626 1.00 40.00 C
+ATOM 425 CG ARG A 71 -37.151 -7.440 31.477 1.00 40.00 C
+ATOM 426 CD ARG A 71 -38.593 -7.499 31.989 1.00 40.00 C
+ATOM 427 NE ARG A 71 -39.564 -7.907 30.961 1.00 40.00 N
+ATOM 428 CZ ARG A 71 -39.833 -9.170 30.595 1.00 40.00 C
+ATOM 429 NH1 ARG A 71 -39.198 -10.204 31.151 1.00 40.00 N
+ATOM 430 NH2 ARG A 71 -40.742 -9.409 29.646 1.00 40.00 N
+ATOM 431 N GLU A 72 -35.148 -5.133 33.167 1.00 40.00 N
+ATOM 432 CA GLU A 72 -33.984 -4.850 34.010 1.00 40.00 C
+ATOM 433 C GLU A 72 -32.664 -4.822 33.253 1.00 40.00 C
+ATOM 434 O GLU A 72 -32.184 -5.860 32.796 1.00 40.00 O
+ATOM 435 CB GLU A 72 -33.909 -5.874 35.151 1.00 40.00 C
+ATOM 436 CG GLU A 72 -34.974 -5.723 36.237 1.00 40.00 C
+ATOM 437 CD GLU A 72 -36.307 -6.390 35.907 1.00 40.00 C
+ATOM 438 OE1 GLU A 72 -36.381 -7.150 34.918 1.00 40.00 O
+ATOM 439 OE2 GLU A 72 -37.294 -6.163 36.649 1.00 40.00 O
+ATOM 440 N GLY A 73 -32.090 -3.628 33.120 1.00 40.00 N
+ATOM 441 CA GLY A 73 -30.760 -3.483 32.542 1.00 40.00 C
+ATOM 442 C GLY A 73 -30.753 -2.563 31.359 1.00 40.00 C
+ATOM 443 O GLY A 73 -29.710 -2.106 30.888 1.00 40.00 O
+ATOM 444 N GLN A 74 -31.942 -2.286 30.878 1.00 40.00 N
+ATOM 445 CA GLN A 74 -32.066 -1.431 29.740 1.00 40.00 C
+ATOM 446 C GLN A 74 -31.752 0.006 30.134 1.00 40.00 C
+ATOM 447 O GLN A 74 -31.291 0.275 31.245 1.00 40.00 O
+ATOM 448 CB GLN A 74 -33.454 -1.578 29.124 1.00 40.00 C
+ATOM 449 CG GLN A 74 -33.702 -2.957 28.517 1.00 40.00 C
+ATOM 450 CD GLN A 74 -35.029 -3.062 27.790 1.00 40.00 C
+ATOM 451 OE1 GLN A 74 -36.094 -3.173 28.407 1.00 40.00 O
+ATOM 452 NE2 GLN A 74 -34.968 -3.039 26.464 1.00 40.00 N
+ATOM 453 N SER A 75 -31.998 0.921 29.208 1.00 40.00 N
+ATOM 454 CA SER A 75 -31.564 2.287 29.334 1.00 40.00 C
+ATOM 455 C SER A 75 -32.503 3.069 28.459 1.00 40.00 C
+ATOM 456 O SER A 75 -33.016 2.531 27.491 1.00 40.00 O
+ATOM 457 CB SER A 75 -30.145 2.404 28.774 1.00 40.00 C
+ATOM 458 OG SER A 75 -29.446 1.152 28.823 1.00 40.00 O
+ATOM 459 N ILE A 76 -32.737 4.333 28.764 1.00 40.00 N
+ATOM 460 CA ILE A 76 -33.582 5.116 27.866 1.00 40.00 C
+ATOM 461 C ILE A 76 -32.987 6.420 27.366 1.00 40.00 C
+ATOM 462 O ILE A 76 -31.976 6.922 27.874 1.00 40.00 O
+ATOM 463 CB ILE A 76 -34.985 5.384 28.439 1.00 40.00 C
+ATOM 464 CG1 ILE A 76 -34.904 6.188 29.731 1.00 40.00 C
+ATOM 465 CG2 ILE A 76 -35.734 4.084 28.648 1.00 40.00 C
+ATOM 466 CD1 ILE A 76 -36.182 6.935 30.059 1.00 40.00 C
+ATOM 467 N GLY A 77 -33.654 6.959 26.356 1.00 40.00 N
+ATOM 468 CA GLY A 77 -33.234 8.179 25.712 1.00 40.00 C
+ATOM 469 C GLY A 77 -34.017 9.371 26.197 1.00 40.00 C
+ATOM 470 O GLY A 77 -35.193 9.273 26.550 1.00 40.00 O
+ATOM 471 N VAL A 78 -33.335 10.505 26.214 1.00 40.00 N
+ATOM 472 CA VAL A 78 -33.906 11.744 26.675 1.00 40.00 C
+ATOM 473 C VAL A 78 -33.591 12.832 25.662 1.00 40.00 C
+ATOM 474 O VAL A 78 -32.420 13.150 25.391 1.00 40.00 O
+ATOM 475 CB VAL A 78 -33.358 12.145 28.065 1.00 40.00 C
+ATOM 476 CG1 VAL A 78 -33.909 13.507 28.478 1.00 40.00 C
+ATOM 477 CG2 VAL A 78 -33.709 11.096 29.116 1.00 40.00 C
+ATOM 478 N ILE A 79 -34.661 13.376 25.091 1.00 40.00 N
+ATOM 479 CA ILE A 79 -34.580 14.580 24.271 1.00 40.00 C
+ATOM 480 C ILE A 79 -34.788 15.791 25.173 1.00 40.00 C
+ATOM 481 O ILE A 79 -35.906 16.045 25.671 1.00 40.00 O
+ATOM 482 CB ILE A 79 -35.621 14.597 23.124 1.00 40.00 C
+ATOM 483 CG1 ILE A 79 -35.448 13.361 22.215 1.00 40.00 C
+ATOM 484 CG2 ILE A 79 -35.524 15.914 22.347 1.00 40.00 C
+ATOM 485 CD1 ILE A 79 -36.684 12.946 21.435 1.00 40.00 C
+ATOM 486 N ALA A 80 -33.687 16.513 25.384 1.00 40.00 N
+ATOM 487 CA ALA A 80 -33.678 17.749 26.175 1.00 40.00 C
+ATOM 488 C ALA A 80 -34.479 18.867 25.493 1.00 40.00 C
+ATOM 489 O ALA A 80 -34.510 18.977 24.250 1.00 40.00 O
+ATOM 490 CB ALA A 80 -32.243 18.203 26.469 1.00 40.00 C
+ATOM 491 N ASP A 81 -35.138 19.677 26.321 1.00 40.00 N
+ATOM 492 CA ASP A 81 -35.970 20.754 25.819 1.00 40.00 C
+ATOM 493 C ASP A 81 -35.108 21.891 25.296 1.00 40.00 C
+ATOM 494 O ASP A 81 -34.049 22.214 25.866 1.00 40.00 O
+ATOM 495 CB ASP A 81 -36.970 21.232 26.880 1.00 40.00 C
+ATOM 496 CG ASP A 81 -38.255 20.401 26.888 1.00 40.00 C
+ATOM 497 OD1 ASP A 81 -38.262 19.276 26.330 1.00 40.00 O
+ATOM 498 OD2 ASP A 81 -39.267 20.875 27.451 1.00 40.00 O
+ATOM 499 N GLY A 82 -35.569 22.472 24.190 1.00 40.00 N
+ATOM 500 CA GLY A 82 -34.833 23.508 23.487 1.00 40.00 C
+ATOM 501 C GLY A 82 -34.290 22.996 22.171 1.00 40.00 C
+ATOM 502 O GLY A 82 -34.594 21.870 21.739 1.00 40.00 O
+ATOM 503 N VAL A 83 -33.485 23.839 21.535 1.00 40.00 N
+ATOM 504 CA VAL A 83 -32.905 23.536 20.227 1.00 40.00 C
+ATOM 505 C VAL A 83 -31.386 23.798 20.223 1.00 40.00 C
+ATOM 506 O VAL A 83 -30.876 24.560 21.064 1.00 40.00 O
+ATOM 507 CB VAL A 83 -33.655 24.261 19.053 1.00 40.00 C
+ATOM 508 CG1 VAL A 83 -35.043 23.648 18.824 1.00 40.00 C
+ATOM 509 CG2 VAL A 83 -33.746 25.777 19.262 1.00 40.00 C
+ATOM 510 N ASP A 84 -30.668 23.138 19.307 1.00 40.00 N
+ATOM 511 CA ASP A 84 -29.243 23.408 19.089 1.00 40.00 C
+ATOM 512 C ASP A 84 -29.095 24.738 18.338 1.00 40.00 C
+ATOM 513 O ASP A 84 -30.096 25.440 18.107 1.00 40.00 O
+ATOM 514 CB ASP A 84 -28.555 22.244 18.344 1.00 40.00 C
+ATOM 515 CG ASP A 84 -29.096 22.025 16.935 1.00 40.00 C
+ATOM 516 OD1 ASP A 84 -28.631 21.099 16.258 1.00 40.00 O
+ATOM 517 OD2 ASP A 84 -29.980 22.766 16.487 1.00 40.00 O
+ATOM 518 N LYS A 85 -27.864 25.084 17.957 1.00 40.00 N
+ATOM 519 CA LYS A 85 -27.621 26.282 17.146 1.00 40.00 C
+ATOM 520 C LYS A 85 -28.473 26.388 15.855 1.00 40.00 C
+ATOM 521 O LYS A 85 -28.785 27.511 15.407 1.00 40.00 O
+ATOM 522 CB LYS A 85 -26.147 26.380 16.790 1.00 40.00 C
+ATOM 523 CG LYS A 85 -25.591 25.135 16.115 1.00 40.00 C
+ATOM 524 CD LYS A 85 -24.194 25.391 15.588 1.00 40.00 C
+ATOM 525 CE LYS A 85 -23.360 26.152 16.612 1.00 40.00 C
+ATOM 526 NZ LYS A 85 -23.672 25.752 18.019 1.00 40.00 N
+ATOM 527 N ASN A 86 -28.851 25.228 15.287 1.00 40.00 N
+ATOM 528 CA ASN A 86 -29.528 25.119 13.963 1.00 40.00 C
+ATOM 529 C ASN A 86 -31.074 25.049 13.961 1.00 40.00 C
+ATOM 530 O ASN A 86 -31.683 24.652 12.947 1.00 40.00 O
+ATOM 531 CB ASN A 86 -28.973 23.914 13.184 1.00 40.00 C
+ATOM 532 CG ASN A 86 -27.496 24.057 12.830 1.00 40.00 C
+ATOM 533 OD1 ASN A 86 -26.940 23.182 12.170 1.00 40.00 O
+ATOM 534 ND2 ASN A 86 -26.856 25.147 13.257 1.00 40.00 N
+ATOM 535 N GLY A 87 -31.690 25.441 15.086 1.00 40.00 N
+ATOM 536 CA GLY A 87 -33.138 25.295 15.311 1.00 40.00 C
+ATOM 537 C GLY A 87 -33.572 23.838 15.505 1.00 40.00 C
+ATOM 538 O GLY A 87 -34.777 23.552 15.696 1.00 40.00 O
+ATOM 539 N LYS A 88 -32.582 22.927 15.467 1.00 40.00 N
+ATOM 540 CA LYS A 88 -32.770 21.461 15.542 1.00 40.00 C
+ATOM 541 C LYS A 88 -32.750 20.935 16.979 1.00 40.00 C
+ATOM 542 O LYS A 88 -32.002 21.463 17.816 1.00 40.00 O
+ATOM 543 CB LYS A 88 -31.682 20.740 14.738 1.00 40.00 C
+ATOM 544 CG LYS A 88 -31.854 20.847 13.238 1.00 40.00 C
+ATOM 545 CD LYS A 88 -30.580 20.423 12.547 1.00 40.00 C
+ATOM 546 CE LYS A 88 -30.614 20.780 11.076 1.00 40.00 C
+ATOM 547 NZ LYS A 88 -29.401 20.226 10.412 1.00 40.00 N
+ATOM 548 N PRO A 89 -33.551 19.873 17.265 1.00 40.00 N
+ATOM 549 CA PRO A 89 -33.560 19.337 18.638 1.00 40.00 C
+ATOM 550 C PRO A 89 -32.130 19.033 19.111 1.00 40.00 C
+ATOM 551 O PRO A 89 -31.192 18.976 18.297 1.00 40.00 O
+ATOM 552 CB PRO A 89 -34.381 18.036 18.523 1.00 40.00 C
+ATOM 553 CG PRO A 89 -35.116 18.116 17.223 1.00 40.00 C
+ATOM 554 CD PRO A 89 -34.361 19.059 16.327 1.00 40.00 C
+ATOM 555 N HIS A 90 -31.957 18.865 20.417 1.00 40.00 N
+ATOM 556 CA HIS A 90 -30.689 18.342 20.936 1.00 40.00 C
+ATOM 557 C HIS A 90 -30.642 16.854 20.637 1.00 40.00 C
+ATOM 558 O HIS A 90 -31.658 16.255 20.244 1.00 40.00 O
+ATOM 559 CB HIS A 90 -30.518 18.644 22.437 1.00 40.00 C
+ATOM 560 CG HIS A 90 -30.581 20.127 22.779 1.00 40.00 C
+ATOM 561 ND1 HIS A 90 -29.625 21.003 22.399 1.00 40.00 N
+ATOM 562 CD2 HIS A 90 -31.538 20.873 23.483 1.00 40.00 C
+ATOM 563 CE1 HIS A 90 -29.949 22.245 22.831 1.00 40.00 C
+ATOM 564 NE2 HIS A 90 -31.120 22.165 23.493 1.00 40.00 N
+ATOM 565 N LYS A 91 -29.473 16.234 20.796 1.00 40.00 N
+ATOM 566 CA LYS A 91 -29.331 14.806 20.482 1.00 40.00 C
+ATOM 567 C LYS A 91 -29.667 13.918 21.692 1.00 40.00 C
+ATOM 568 O LYS A 91 -29.379 14.267 22.838 1.00 40.00 O
+ATOM 569 CB LYS A 91 -27.929 14.515 19.914 1.00 40.00 C
+ATOM 570 CG LYS A 91 -27.882 13.452 18.813 1.00 40.00 C
+ATOM 571 CD LYS A 91 -28.185 13.974 17.411 1.00 40.00 C
+ATOM 572 CE LYS A 91 -26.907 14.289 16.635 1.00 40.00 C
+ATOM 573 NZ LYS A 91 -27.166 15.339 15.604 1.00 40.00 N
+ATOM 574 N VAL A 92 -30.307 12.786 21.416 1.00 40.00 N
+ATOM 575 CA VAL A 92 -30.689 11.803 22.429 1.00 40.00 C
+ATOM 576 C VAL A 92 -29.541 11.474 23.366 1.00 40.00 C
+ATOM 577 O VAL A 92 -28.484 11.042 22.928 1.00 40.00 O
+ATOM 578 CB VAL A 92 -31.156 10.494 21.760 1.00 40.00 C
+ATOM 579 CG1 VAL A 92 -31.308 9.366 22.770 1.00 40.00 C
+ATOM 580 CG2 VAL A 92 -32.464 10.722 21.036 1.00 40.00 C
+ATOM 581 N ARG A 93 -29.736 11.689 24.656 1.00 40.00 N
+ATOM 582 CA ARG A 93 -28.787 11.168 25.618 1.00 40.00 C
+ATOM 583 C ARG A 93 -29.381 9.936 26.265 1.00 40.00 C
+ATOM 584 O ARG A 93 -30.591 9.826 26.421 1.00 40.00 O
+ATOM 585 CB ARG A 93 -28.426 12.213 26.668 1.00 40.00 C
+ATOM 586 CG ARG A 93 -27.177 13.021 26.352 1.00 40.00 C
+ATOM 587 CD ARG A 93 -27.400 13.906 25.150 1.00 40.00 C
+ATOM 588 NE ARG A 93 -26.626 15.133 25.226 1.00 40.00 N
+ATOM 589 CZ ARG A 93 -26.703 16.119 24.338 1.00 40.00 C
+ATOM 590 NH1 ARG A 93 -27.517 16.021 23.289 1.00 40.00 N
+ATOM 591 NH2 ARG A 93 -25.963 17.211 24.499 1.00 40.00 N
+ATOM 592 N LEU A 94 -28.529 9.001 26.643 1.00 40.00 N
+ATOM 593 CA LEU A 94 -29.027 7.768 27.204 1.00 40.00 C
+ATOM 594 C LEU A 94 -28.708 7.629 28.673 1.00 40.00 C
+ATOM 595 O LEU A 94 -27.617 7.998 29.129 1.00 40.00 O
+ATOM 596 CB LEU A 94 -28.463 6.587 26.439 1.00 40.00 C
+ATOM 597 CG LEU A 94 -28.893 6.493 24.976 1.00 40.00 C
+ATOM 598 CD1 LEU A 94 -28.234 5.277 24.332 1.00 40.00 C
+ATOM 599 CD2 LEU A 94 -30.406 6.428 24.827 1.00 40.00 C
+ATOM 600 N TYR A 95 -29.680 7.099 29.409 1.00 40.00 N
+ATOM 601 CA TYR A 95 -29.533 6.926 30.843 1.00 40.00 C
+ATOM 602 C TYR A 95 -30.029 5.551 31.267 1.00 40.00 C
+ATOM 603 O TYR A 95 -31.121 5.129 30.892 1.00 40.00 O
+ATOM 604 CB TYR A 95 -30.274 8.062 31.574 1.00 40.00 C
+ATOM 605 CG TYR A 95 -29.678 9.428 31.276 1.00 40.00 C
+ATOM 606 CD1 TYR A 95 -28.523 9.869 31.947 1.00 40.00 C
+ATOM 607 CD2 TYR A 95 -30.238 10.261 30.301 1.00 40.00 C
+ATOM 608 CE1 TYR A 95 -27.957 11.108 31.666 1.00 40.00 C
+ATOM 609 CE2 TYR A 95 -29.678 11.501 30.017 1.00 40.00 C
+ATOM 610 CZ TYR A 95 -28.536 11.915 30.700 1.00 40.00 C
+ATOM 611 OH TYR A 95 -27.951 13.132 30.436 1.00 40.00 O
+ATOM 612 N SER A 96 -29.188 4.852 32.030 1.00 40.00 N
+ATOM 613 CA SER A 96 -29.441 3.478 32.434 1.00 40.00 C
+ATOM 614 C SER A 96 -30.620 3.475 33.347 1.00 40.00 C
+ATOM 615 O SER A 96 -30.680 4.268 34.269 1.00 40.00 O
+ATOM 616 CB SER A 96 -28.242 2.913 33.186 1.00 40.00 C
+ATOM 617 OG SER A 96 -27.015 3.360 32.632 1.00 40.00 O
+ATOM 618 N ILE A 97 -31.561 2.578 33.097 1.00 40.00 N
+ATOM 619 CA ILE A 97 -32.782 2.575 33.869 1.00 40.00 C
+ATOM 620 C ILE A 97 -32.546 2.089 35.280 1.00 40.00 C
+ATOM 621 O ILE A 97 -32.032 0.990 35.500 1.00 40.00 O
+ATOM 622 CB ILE A 97 -33.883 1.756 33.198 1.00 40.00 C
+ATOM 623 CG1 ILE A 97 -34.219 2.376 31.841 1.00 40.00 C
+ATOM 624 CG2 ILE A 97 -35.114 1.715 34.091 1.00 40.00 C
+ATOM 625 CD1 ILE A 97 -34.996 1.463 30.933 1.00 40.00 C
+ATOM 626 N ALA A 98 -32.951 2.928 36.224 1.00 40.00 N
+ATOM 627 CA ALA A 98 -32.674 2.712 37.625 1.00 40.00 C
+ATOM 628 C ALA A 98 -33.733 1.884 38.321 1.00 40.00 C
+ATOM 629 O ALA A 98 -33.386 1.093 39.192 1.00 40.00 O
+ATOM 630 CB ALA A 98 -32.493 4.042 38.330 1.00 40.00 C
+ATOM 631 N SER A 99 -35.009 2.059 37.957 1.00 40.00 N
+ATOM 632 CA SER A 99 -36.078 1.250 38.572 1.00 40.00 C
+ATOM 633 C SER A 99 -36.173 -0.154 37.983 1.00 40.00 C
+ATOM 634 O SER A 99 -35.708 -0.389 36.876 1.00 40.00 O
+ATOM 635 CB SER A 99 -37.439 1.950 38.506 1.00 40.00 C
+ATOM 636 OG SER A 99 -37.670 2.505 37.233 1.00 40.00 O
+ATOM 637 N SER A 100 -36.767 -1.084 38.728 1.00 40.00 N
+ATOM 638 CA SER A 100 -37.017 -2.428 38.218 1.00 40.00 C
+ATOM 639 C SER A 100 -38.166 -2.382 37.222 1.00 40.00 C
+ATOM 640 O SER A 100 -38.791 -1.351 37.052 1.00 40.00 O
+ATOM 641 CB SER A 100 -37.387 -3.366 39.357 1.00 40.00 C
+ATOM 642 OG SER A 100 -38.731 -3.151 39.748 1.00 40.00 O
+ATOM 643 N ALA A 101 -38.464 -3.506 36.587 1.00 40.00 N
+ATOM 644 CA ALA A 101 -39.560 -3.574 35.631 1.00 40.00 C
+ATOM 645 C ALA A 101 -40.817 -2.937 36.207 1.00 40.00 C
+ATOM 646 O ALA A 101 -41.525 -2.174 35.545 1.00 40.00 O
+ATOM 647 CB ALA A 101 -39.829 -5.026 35.256 1.00 40.00 C
+ATOM 648 N ILE A 102 -41.054 -3.239 37.472 1.00 40.00 N
+ATOM 649 CA ILE A 102 -42.299 -2.917 38.129 1.00 40.00 C
+ATOM 650 C ILE A 102 -42.355 -1.438 38.499 1.00 40.00 C
+ATOM 651 O ILE A 102 -43.403 -0.918 38.896 1.00 40.00 O
+ATOM 652 CB ILE A 102 -42.472 -3.800 39.381 1.00 40.00 C
+ATOM 653 CG1 ILE A 102 -41.786 -5.167 39.177 1.00 40.00 C
+ATOM 654 CG2 ILE A 102 -43.949 -3.957 39.721 1.00 40.00 C
+ATOM 655 CD1 ILE A 102 -42.319 -6.004 38.026 1.00 40.00 C
+ATOM 656 N GLY A 103 -41.219 -0.764 38.345 1.00 40.00 N
+ATOM 657 CA GLY A 103 -41.067 0.630 38.746 1.00 40.00 C
+ATOM 658 C GLY A 103 -40.758 0.734 40.222 1.00 40.00 C
+ATOM 659 O GLY A 103 -40.701 -0.274 40.947 1.00 40.00 O
+ATOM 660 N ASP A 104 -40.554 1.962 40.672 1.00 40.00 N
+ATOM 661 CA ASP A 104 -40.362 2.218 42.095 1.00 40.00 C
+ATOM 662 C ASP A 104 -41.646 2.044 42.909 1.00 40.00 C
+ATOM 663 O ASP A 104 -41.615 1.767 44.112 1.00 40.00 O
+ATOM 664 CB ASP A 104 -39.807 3.623 42.301 1.00 40.00 C
+ATOM 665 CG ASP A 104 -38.379 3.741 41.857 1.00 40.00 C
+ATOM 666 OD1 ASP A 104 -37.629 2.735 41.974 1.00 40.00 O
+ATOM 667 OD2 ASP A 104 -38.015 4.846 41.398 1.00 40.00 O
+ATOM 668 N PHE A 105 -42.782 2.210 42.251 1.00 40.00 N
+ATOM 669 CA PHE A 105 -44.036 2.109 42.953 1.00 40.00 C
+ATOM 670 C PHE A 105 -44.558 0.697 42.851 1.00 40.00 C
+ATOM 671 O PHE A 105 -45.513 0.355 43.526 1.00 40.00 O
+ATOM 672 CB PHE A 105 -45.046 3.121 42.414 1.00 40.00 C
+ATOM 673 CG PHE A 105 -44.503 4.518 42.311 1.00 40.00 C
+ATOM 674 CD1 PHE A 105 -43.559 4.986 43.233 1.00 40.00 C
+ATOM 675 CD2 PHE A 105 -44.938 5.379 41.303 1.00 40.00 C
+ATOM 676 CE1 PHE A 105 -43.049 6.280 43.137 1.00 40.00 C
+ATOM 677 CE2 PHE A 105 -44.437 6.676 41.201 1.00 40.00 C
+ATOM 678 CZ PHE A 105 -43.492 7.130 42.118 1.00 40.00 C
+ATOM 679 N GLY A 106 -43.925 -0.126 42.018 1.00 40.00 N
+ATOM 680 CA GLY A 106 -44.315 -1.525 41.884 1.00 40.00 C
+ATOM 681 C GLY A 106 -45.626 -1.729 41.145 1.00 40.00 C
+ATOM 682 O GLY A 106 -46.351 -2.689 41.409 1.00 40.00 O
+ATOM 683 N ASP A 107 -45.917 -0.836 40.205 1.00 40.00 N
+ATOM 684 CA ASP A 107 -47.158 -0.895 39.444 1.00 40.00 C
+ATOM 685 C ASP A 107 -46.914 -0.878 37.932 1.00 40.00 C
+ATOM 686 O ASP A 107 -47.855 -0.914 37.157 1.00 40.00 O
+ATOM 687 CB ASP A 107 -48.078 0.264 39.848 1.00 40.00 C
+ATOM 688 CG ASP A 107 -47.636 1.607 39.256 1.00 40.00 C
+ATOM 689 OD1 ASP A 107 -46.415 1.871 39.206 1.00 40.00 O
+ATOM 690 OD2 ASP A 107 -48.511 2.401 38.839 1.00 40.00 O
+ATOM 691 N SER A 108 -45.649 -0.801 37.530 1.00 40.00 N
+ATOM 692 CA SER A 108 -45.237 -0.830 36.119 1.00 40.00 C
+ATOM 693 C SER A 108 -45.753 0.328 35.243 1.00 40.00 C
+ATOM 694 O SER A 108 -45.887 0.174 34.033 1.00 40.00 O
+ATOM 695 CB SER A 108 -45.573 -2.184 35.491 1.00 40.00 C
+ATOM 696 OG SER A 108 -44.964 -3.235 36.213 1.00 40.00 O
+ATOM 697 N LYS A 109 -46.022 1.480 35.858 1.00 40.00 N
+ATOM 698 CA LYS A 109 -46.450 2.704 35.149 1.00 40.00 C
+ATOM 699 C LYS A 109 -45.403 3.816 35.304 1.00 40.00 C
+ATOM 700 O LYS A 109 -45.703 5.018 35.218 1.00 40.00 O
+ATOM 701 CB LYS A 109 -47.790 3.192 35.709 1.00 40.00 C
+ATOM 702 CG LYS A 109 -48.906 2.154 35.719 1.00 40.00 C
+ATOM 703 CD LYS A 109 -49.242 1.651 34.318 1.00 40.00 C
+ATOM 704 CE LYS A 109 -50.562 0.893 34.262 1.00 40.00 C
+ATOM 705 NZ LYS A 109 -51.743 1.801 34.275 1.00 40.00 N
+ATOM 706 N THR A 110 -44.164 3.378 35.520 1.00 40.00 N
+ATOM 707 CA THR A 110 -43.132 4.200 36.133 1.00 40.00 C
+ATOM 708 C THR A 110 -41.740 3.770 35.740 1.00 40.00 C
+ATOM 709 O THR A 110 -41.391 2.581 35.825 1.00 40.00 O
+ATOM 710 CB THR A 110 -43.176 4.086 37.673 1.00 40.00 C
+ATOM 711 OG1 THR A 110 -42.773 2.762 38.086 1.00 40.00 O
+ATOM 712 CG2 THR A 110 -44.582 4.402 38.198 1.00 40.00 C
+ATOM 713 N VAL A 111 -40.942 4.758 35.352 1.00 40.00 N
+ATOM 714 CA VAL A 111 -39.539 4.547 35.046 1.00 40.00 C
+ATOM 715 C VAL A 111 -38.681 5.464 35.922 1.00 40.00 C
+ATOM 716 O VAL A 111 -39.092 6.584 36.201 1.00 40.00 O
+ATOM 717 CB VAL A 111 -39.270 4.819 33.558 1.00 40.00 C
+ATOM 718 CG1 VAL A 111 -39.332 6.304 33.259 1.00 40.00 C
+ATOM 719 CG2 VAL A 111 -37.935 4.229 33.131 1.00 40.00 C
+ATOM 720 N SER A 112 -37.500 4.993 36.344 1.00 40.00 N
+ATOM 721 CA SER A 112 -36.612 5.768 37.210 1.00 40.00 C
+ATOM 722 C SER A 112 -35.195 5.904 36.669 1.00 40.00 C
+ATOM 723 O SER A 112 -34.578 4.915 36.265 1.00 40.00 O
+ATOM 724 CB SER A 112 -36.581 5.142 38.589 1.00 40.00 C
+ATOM 725 OG SER A 112 -37.902 4.802 38.978 1.00 40.00 O
+ATOM 726 N LEU A 113 -34.700 7.146 36.678 1.00 40.00 N
+ATOM 727 CA LEU A 113 -33.350 7.495 36.226 1.00 40.00 C
+ATOM 728 C LEU A 113 -32.426 7.979 37.334 1.00 40.00 C
+ATOM 729 O LEU A 113 -32.875 8.519 38.340 1.00 40.00 O
+ATOM 730 CB LEU A 113 -33.423 8.601 35.188 1.00 40.00 C
+ATOM 731 CG LEU A 113 -33.742 8.182 33.763 1.00 40.00 C
+ATOM 732 CD1 LEU A 113 -33.598 9.386 32.853 1.00 40.00 C
+ATOM 733 CD2 LEU A 113 -32.802 7.078 33.325 1.00 40.00 C
+ATOM 734 N CYS A 114 -31.127 7.812 37.125 1.00 40.00 N
+ATOM 735 CA CYS A 114 -30.134 8.284 38.069 1.00 40.00 C
+ATOM 736 C CYS A 114 -29.172 9.188 37.325 1.00 40.00 C
+ATOM 737 O CYS A 114 -28.409 8.728 36.475 1.00 40.00 O
+ATOM 738 CB CYS A 114 -29.409 7.100 38.680 1.00 40.00 C
+ATOM 739 SG CYS A 114 -28.053 7.523 39.784 1.00 40.00 S
+ATOM 740 N VAL A 115 -29.225 10.479 37.626 1.00 40.00 N
+ATOM 741 CA VAL A 115 -28.500 11.460 36.823 1.00 40.00 C
+ATOM 742 C VAL A 115 -27.558 12.344 37.630 1.00 40.00 C
+ATOM 743 O VAL A 115 -27.969 13.010 38.587 1.00 40.00 O
+ATOM 744 CB VAL A 115 -29.450 12.373 36.020 1.00 40.00 C
+ATOM 745 CG1 VAL A 115 -28.696 13.063 34.888 1.00 40.00 C
+ATOM 746 CG2 VAL A 115 -30.614 11.582 35.463 1.00 40.00 C
+ATOM 747 N LYS A 116 -26.291 12.354 37.219 1.00 40.00 N
+ATOM 748 CA LYS A 116 -25.312 13.297 37.734 1.00 40.00 C
+ATOM 749 C LYS A 116 -25.303 14.521 36.826 1.00 40.00 C
+ATOM 750 O LYS A 116 -25.272 14.409 35.591 1.00 40.00 O
+ATOM 751 CB LYS A 116 -23.925 12.667 37.794 1.00 40.00 C
+ATOM 752 CG LYS A 116 -22.913 13.470 38.580 1.00 40.00 C
+ATOM 753 CD LYS A 116 -21.544 13.277 37.972 1.00 40.00 C
+ATOM 754 CE LYS A 116 -20.591 14.385 38.372 1.00 40.00 C
+ATOM 755 NZ LYS A 116 -19.921 14.036 39.646 1.00 40.00 N
+ATOM 756 N ARG A 117 -25.360 15.685 37.466 1.00 40.00 N
+ATOM 757 CA ARG A 117 -25.310 16.981 36.805 1.00 40.00 C
+ATOM 758 C ARG A 117 -23.893 17.241 36.254 1.00 40.00 C
+ATOM 759 O ARG A 117 -22.926 17.397 37.016 1.00 40.00 O
+ATOM 760 CB ARG A 117 -25.724 18.062 37.817 1.00 40.00 C
+ATOM 761 CG ARG A 117 -26.222 19.356 37.206 1.00 40.00 C
+ATOM 762 CD ARG A 117 -26.411 20.435 38.260 1.00 40.00 C
+ATOM 763 NE ARG A 117 -27.721 20.374 38.908 1.00 40.00 N
+ATOM 764 CZ ARG A 117 -28.829 20.947 38.438 1.00 40.00 C
+ATOM 765 NH1 ARG A 117 -28.806 21.629 37.299 1.00 40.00 N
+ATOM 766 NH2 ARG A 117 -29.968 20.835 39.110 1.00 40.00 N
+ATOM 767 N LEU A 118 -23.767 17.254 34.928 1.00 40.00 N
+ATOM 768 CA LEU A 118 -22.479 17.524 34.289 1.00 40.00 C
+ATOM 769 C LEU A 118 -22.130 19.002 34.438 1.00 40.00 C
+ATOM 770 O LEU A 118 -22.697 19.844 33.730 1.00 40.00 O
+ATOM 771 CB LEU A 118 -22.512 17.118 32.798 1.00 40.00 C
+ATOM 772 CG LEU A 118 -21.355 17.468 31.845 1.00 40.00 C
+ATOM 773 CD1 LEU A 118 -20.050 16.822 32.286 1.00 40.00 C
+ATOM 774 CD2 LEU A 118 -21.666 17.083 30.406 1.00 40.00 C
+ATOM 775 N ILE A 119 -21.237 19.320 35.381 1.00 40.00 N
+ATOM 776 CA ILE A 119 -20.637 20.668 35.454 1.00 40.00 C
+ATOM 777 C ILE A 119 -19.129 20.613 35.733 1.00 40.00 C
+ATOM 778 O ILE A 119 -18.690 20.060 36.746 1.00 40.00 O
+ATOM 779 CB ILE A 119 -21.336 21.634 36.455 1.00 40.00 C
+ATOM 780 CG1 ILE A 119 -22.827 21.824 36.124 1.00 40.00 C
+ATOM 781 CG2 ILE A 119 -20.641 22.992 36.423 1.00 40.00 C
+ATOM 782 CD1 ILE A 119 -23.622 22.615 37.146 1.00 40.00 C
+ATOM 783 N TYR A 120 -18.358 21.178 34.803 1.00 40.00 N
+ATOM 784 CA TYR A 120 -16.898 21.312 34.919 1.00 40.00 C
+ATOM 785 C TYR A 120 -16.486 22.749 34.631 1.00 40.00 C
+ATOM 786 O TYR A 120 -17.273 23.525 34.095 1.00 40.00 O
+ATOM 787 CB TYR A 120 -16.127 20.328 33.992 1.00 40.00 C
+ATOM 788 CG TYR A 120 -16.482 20.331 32.489 1.00 40.00 C
+ATOM 789 CD1 TYR A 120 -17.665 19.724 32.018 1.00 40.00 C
+ATOM 790 CD2 TYR A 120 -15.617 20.891 31.532 1.00 40.00 C
+ATOM 791 CE1 TYR A 120 -17.991 19.699 30.659 1.00 40.00 C
+ATOM 792 CE2 TYR A 120 -15.940 20.867 30.164 1.00 40.00 C
+ATOM 793 CZ TYR A 120 -17.128 20.265 29.732 1.00 40.00 C
+ATOM 794 OH TYR A 120 -17.481 20.224 28.390 1.00 40.00 O
+ATOM 795 N THR A 121 -15.264 23.097 35.025 1.00 40.00 N
+ATOM 796 CA THR A 121 -14.608 24.343 34.610 1.00 40.00 C
+ATOM 797 C THR A 121 -13.546 23.922 33.568 1.00 40.00 C
+ATOM 798 O THR A 121 -12.801 22.960 33.812 1.00 40.00 O
+ATOM 799 CB THR A 121 -14.024 25.127 35.848 1.00 40.00 C
+ATOM 800 OG1 THR A 121 -15.065 25.870 36.507 1.00 40.00 O
+ATOM 801 CG2 THR A 121 -12.909 26.121 35.477 1.00 40.00 C
+ATOM 802 N ASN A 122 -13.515 24.577 32.397 1.00 40.00 N
+ATOM 803 CA ASN A 122 -12.383 24.390 31.444 1.00 40.00 C
+ATOM 804 C ASN A 122 -11.133 25.248 31.785 1.00 40.00 C
+ATOM 805 O ASN A 122 -11.107 25.916 32.834 1.00 40.00 O
+ATOM 806 CB ASN A 122 -12.798 24.456 29.939 1.00 40.00 C
+ATOM 807 CG ASN A 122 -13.401 25.803 29.513 1.00 40.00 C
+ATOM 808 OD1 ASN A 122 -12.796 26.869 29.669 1.00 40.00 O
+ATOM 809 ND2 ASN A 122 -14.586 25.741 28.912 1.00 40.00 N
+ATOM 810 N ASP A 123 -10.105 25.215 30.925 1.00 40.00 N
+ATOM 811 CA ASP A 123 -8.842 25.962 31.178 1.00 40.00 C
+ATOM 812 C ASP A 123 -8.906 27.528 31.050 1.00 40.00 C
+ATOM 813 O ASP A 123 -7.963 28.247 31.453 1.00 40.00 O
+ATOM 814 CB ASP A 123 -7.632 25.339 30.423 1.00 40.00 C
+ATOM 815 CG ASP A 123 -7.922 25.017 28.942 1.00 40.00 C
+ATOM 816 OD1 ASP A 123 -8.986 25.411 28.394 1.00 40.00 O
+ATOM 817 OD2 ASP A 123 -7.046 24.360 28.326 1.00 40.00 O
+ATOM 818 N ALA A 124 -10.021 28.041 30.517 1.00 40.00 N
+ATOM 819 CA ALA A 124 -10.295 29.487 30.481 1.00 40.00 C
+ATOM 820 C ALA A 124 -11.108 30.011 31.708 1.00 40.00 C
+ATOM 821 O ALA A 124 -11.480 31.195 31.749 1.00 40.00 O
+ATOM 822 CB ALA A 124 -10.959 29.865 29.155 1.00 40.00 C
+ATOM 823 N GLY A 125 -11.349 29.135 32.700 1.00 40.00 N
+ATOM 824 CA GLY A 125 -12.114 29.457 33.926 1.00 40.00 C
+ATOM 825 C GLY A 125 -13.628 29.297 33.788 1.00 40.00 C
+ATOM 826 O GLY A 125 -14.375 29.486 34.768 1.00 40.00 O
+ATOM 827 N GLU A 126 -14.052 28.912 32.574 1.00 40.00 N
+ATOM 828 CA GLU A 126 -15.458 28.920 32.097 1.00 40.00 C
+ATOM 829 C GLU A 126 -16.289 27.700 32.509 1.00 40.00 C
+ATOM 830 O GLU A 126 -16.063 26.596 32.002 1.00 40.00 O
+ATOM 831 CB GLU A 126 -15.495 29.041 30.559 1.00 40.00 C
+ATOM 832 CG GLU A 126 -14.751 30.247 29.999 1.00 40.00 C
+ATOM 833 CD GLU A 126 -14.203 30.032 28.593 1.00 40.00 C
+ATOM 834 OE1 GLU A 126 -13.985 28.867 28.172 1.00 40.00 O
+ATOM 835 OE2 GLU A 126 -13.960 31.055 27.912 1.00 40.00 O
+ATOM 836 N ILE A 127 -17.258 27.922 33.406 1.00 40.00 N
+ATOM 837 CA ILE A 127 -18.194 26.882 33.880 1.00 40.00 C
+ATOM 838 C ILE A 127 -19.071 26.318 32.736 1.00 40.00 C
+ATOM 839 O ILE A 127 -19.987 26.998 32.234 1.00 40.00 O
+ATOM 840 CB ILE A 127 -19.036 27.368 35.107 1.00 40.00 C
+ATOM 841 CG1 ILE A 127 -18.186 27.333 36.389 1.00 40.00 C
+ATOM 842 CG2 ILE A 127 -20.310 26.546 35.298 1.00 40.00 C
+ATOM 843 CD1 ILE A 127 -18.945 27.614 37.674 1.00 40.00 C
+ATOM 844 N VAL A 128 -18.751 25.079 32.330 1.00 40.00 N
+ATOM 845 CA VAL A 128 -19.491 24.319 31.302 1.00 40.00 C
+ATOM 846 C VAL A 128 -20.505 23.383 31.972 1.00 40.00 C
+ATOM 847 O VAL A 128 -20.198 22.706 32.961 1.00 40.00 O
+ATOM 848 CB VAL A 128 -18.553 23.472 30.397 1.00 40.00 C
+ATOM 849 CG1 VAL A 128 -19.304 22.932 29.185 1.00 40.00 C
+ATOM 850 CG2 VAL A 128 -17.339 24.274 29.947 1.00 40.00 C
+ATOM 851 N LYS A 129 -21.714 23.361 31.421 1.00 40.00 N
+ATOM 852 CA LYS A 129 -22.788 22.508 31.928 1.00 40.00 C
+ATOM 853 C LYS A 129 -23.339 21.556 30.837 1.00 40.00 C
+ATOM 854 O LYS A 129 -23.557 21.965 29.685 1.00 40.00 O
+ATOM 855 CB LYS A 129 -23.926 23.366 32.503 1.00 40.00 C
+ATOM 856 CG LYS A 129 -23.519 24.435 33.513 1.00 40.00 C
+ATOM 857 CD LYS A 129 -24.732 25.009 34.254 1.00 40.00 C
+ATOM 858 CE LYS A 129 -25.698 25.765 33.340 1.00 40.00 C
+ATOM 859 NZ LYS A 129 -26.987 26.080 34.018 1.00 40.00 N
+ATOM 860 N GLY A 130 -23.569 20.295 31.204 1.00 40.00 N
+ATOM 861 CA GLY A 130 -24.160 19.319 30.286 1.00 40.00 C
+ATOM 862 C GLY A 130 -25.624 19.575 29.974 1.00 40.00 C
+ATOM 863 O GLY A 130 -26.442 19.695 30.883 1.00 40.00 O
+ATOM 864 N VAL A 131 -25.944 19.649 28.682 1.00 40.00 N
+ATOM 865 CA VAL A 131 -27.308 19.894 28.208 1.00 40.00 C
+ATOM 866 C VAL A 131 -28.322 18.985 28.914 1.00 40.00 C
+ATOM 867 O VAL A 131 -29.124 19.445 29.733 1.00 40.00 O
+ATOM 868 CB VAL A 131 -27.416 19.720 26.667 1.00 40.00 C
+ATOM 869 CG1 VAL A 131 -28.848 19.929 26.179 1.00 40.00 C
+ATOM 870 CG2 VAL A 131 -26.471 20.671 25.946 1.00 40.00 C
+ATOM 871 N CYS A 132 -28.266 17.694 28.612 1.00 40.00 N
+ATOM 872 CA CYS A 132 -29.274 16.755 29.085 1.00 40.00 C
+ATOM 873 C CYS A 132 -29.195 16.559 30.596 1.00 40.00 C
+ATOM 874 O CYS A 132 -30.220 16.564 31.274 1.00 40.00 O
+ATOM 875 CB CYS A 132 -29.141 15.419 28.356 1.00 40.00 C
+ATOM 876 SG CYS A 132 -30.708 14.639 27.945 1.00 40.00 S
+ATOM 877 N SER A 133 -27.976 16.420 31.119 1.00 40.00 N
+ATOM 878 CA SER A 133 -27.757 16.172 32.546 1.00 40.00 C
+ATOM 879 C SER A 133 -28.342 17.269 33.407 1.00 40.00 C
+ATOM 880 O SER A 133 -28.935 17.008 34.455 1.00 40.00 O
+ATOM 881 CB SER A 133 -26.268 16.081 32.842 1.00 40.00 C
+ATOM 882 OG SER A 133 -25.647 17.327 32.581 1.00 40.00 O
+ATOM 883 N ASN A 134 -28.145 18.502 32.956 1.00 40.00 N
+ATOM 884 CA ASN A 134 -28.660 19.668 33.663 1.00 40.00 C
+ATOM 885 C ASN A 134 -30.156 19.861 33.442 1.00 40.00 C
+ATOM 886 O ASN A 134 -30.871 20.219 34.376 1.00 40.00 O
+ATOM 887 CB ASN A 134 -27.860 20.932 33.315 1.00 40.00 C
+ATOM 888 CG ASN A 134 -26.510 20.972 34.019 1.00 40.00 C
+ATOM 889 OD1 ASN A 134 -26.403 21.436 35.159 1.00 40.00 O
+ATOM 890 ND2 ASN A 134 -25.473 20.477 33.345 1.00 40.00 N
+ATOM 891 N PHE A 135 -30.627 19.601 32.223 1.00 40.00 N
+ATOM 892 CA PHE A 135 -32.054 19.635 31.944 1.00 40.00 C
+ATOM 893 C PHE A 135 -32.812 18.734 32.932 1.00 40.00 C
+ATOM 894 O PHE A 135 -33.855 19.124 33.475 1.00 40.00 O
+ATOM 895 CB PHE A 135 -32.319 19.235 30.486 1.00 40.00 C
+ATOM 896 CG PHE A 135 -33.754 18.869 30.201 1.00 40.00 C
+ATOM 897 CD1 PHE A 135 -34.766 19.830 30.267 1.00 40.00 C
+ATOM 898 CD2 PHE A 135 -34.099 17.554 29.860 1.00 40.00 C
+ATOM 899 CE1 PHE A 135 -36.087 19.483 30.009 1.00 40.00 C
+ATOM 900 CE2 PHE A 135 -35.420 17.203 29.596 1.00 40.00 C
+ATOM 901 CZ PHE A 135 -36.415 18.171 29.669 1.00 40.00 C
+ATOM 902 N LEU A 136 -32.253 17.554 33.193 1.00 40.00 N
+ATOM 903 CA LEU A 136 -32.944 16.525 33.959 1.00 40.00 C
+ATOM 904 C LEU A 136 -32.970 16.775 35.450 1.00 40.00 C
+ATOM 905 O LEU A 136 -34.036 16.712 36.064 1.00 40.00 O
+ATOM 906 CB LEU A 136 -32.378 15.140 33.650 1.00 40.00 C
+ATOM 907 CG LEU A 136 -32.822 14.638 32.268 1.00 40.00 C
+ATOM 908 CD1 LEU A 136 -31.982 13.460 31.773 1.00 40.00 C
+ATOM 909 CD2 LEU A 136 -34.317 14.322 32.236 1.00 40.00 C
+ATOM 910 N CYS A 137 -31.809 17.073 36.032 1.00 40.00 N
+ATOM 911 CA CYS A 137 -31.756 17.422 37.449 1.00 40.00 C
+ATOM 912 C CYS A 137 -32.649 18.637 37.738 1.00 40.00 C
+ATOM 913 O CYS A 137 -33.182 18.764 38.846 1.00 40.00 O
+ATOM 914 CB CYS A 137 -30.318 17.712 37.879 1.00 40.00 C
+ATOM 915 SG CYS A 137 -29.191 16.300 37.890 1.00 40.00 S
+ATOM 916 N ASP A 138 -32.810 19.499 36.720 1.00 40.00 N
+ATOM 917 CA ASP A 138 -33.585 20.761 36.787 1.00 40.00 C
+ATOM 918 C ASP A 138 -35.098 20.568 36.736 1.00 40.00 C
+ATOM 919 O ASP A 138 -35.859 21.534 36.878 1.00 40.00 O
+ATOM 920 CB ASP A 138 -33.183 21.726 35.649 1.00 40.00 C
+ATOM 921 CG ASP A 138 -31.939 22.562 35.977 1.00 40.00 C
+ATOM 922 OD1 ASP A 138 -31.361 22.413 37.082 1.00 40.00 O
+ATOM 923 OD2 ASP A 138 -31.532 23.376 35.113 1.00 40.00 O
+ATOM 924 N LEU A 139 -35.535 19.333 36.528 1.00 40.00 N
+ATOM 925 CA LEU A 139 -36.950 19.092 36.343 1.00 40.00 C
+ATOM 926 C LEU A 139 -37.750 19.113 37.634 1.00 40.00 C
+ATOM 927 O LEU A 139 -37.335 18.564 38.659 1.00 40.00 O
+ATOM 928 CB LEU A 139 -37.195 17.809 35.564 1.00 40.00 C
+ATOM 929 CG LEU A 139 -36.862 17.934 34.072 1.00 40.00 C
+ATOM 930 CD1 LEU A 139 -37.016 16.572 33.412 1.00 40.00 C
+ATOM 931 CD2 LEU A 139 -37.685 18.996 33.341 1.00 40.00 C
+ATOM 932 N GLN A 140 -38.901 19.776 37.556 1.00 40.00 N
+ATOM 933 CA GLN A 140 -39.833 19.898 38.671 1.00 40.00 C
+ATOM 934 C GLN A 140 -40.996 18.939 38.501 1.00 40.00 C
+ATOM 935 O GLN A 140 -41.377 18.616 37.362 1.00 40.00 O
+ATOM 936 CB GLN A 140 -40.372 21.334 38.787 1.00 40.00 C
+ATOM 937 CG GLN A 140 -39.315 22.396 39.072 1.00 40.00 C
+ATOM 938 CD GLN A 140 -38.353 22.014 40.195 1.00 40.00 C
+ATOM 939 OE1 GLN A 140 -37.207 22.469 40.215 1.00 40.00 O
+ATOM 940 NE2 GLN A 140 -38.813 21.174 41.132 1.00 40.00 N
+ATOM 941 N PRO A 141 -41.569 18.478 39.630 1.00 40.00 N
+ATOM 942 CA PRO A 141 -42.819 17.730 39.510 1.00 40.00 C
+ATOM 943 C PRO A 141 -43.761 18.392 38.480 1.00 40.00 C
+ATOM 944 O PRO A 141 -44.050 19.592 38.570 1.00 40.00 O
+ATOM 945 CB PRO A 141 -43.397 17.789 40.934 1.00 40.00 C
+ATOM 946 CG PRO A 141 -42.201 17.931 41.827 1.00 40.00 C
+ATOM 947 CD PRO A 141 -41.064 18.512 41.020 1.00 40.00 C
+ATOM 948 N GLY A 142 -44.179 17.627 37.477 1.00 40.00 N
+ATOM 949 CA GLY A 142 -45.208 18.090 36.557 1.00 40.00 C
+ATOM 950 C GLY A 142 -44.722 18.481 35.192 1.00 40.00 C
+ATOM 951 O GLY A 142 -45.525 18.641 34.262 1.00 40.00 O
+ATOM 952 N ASP A 143 -43.407 18.641 35.072 1.00 40.00 N
+ATOM 953 CA ASP A 143 -42.783 18.922 33.783 1.00 40.00 C
+ATOM 954 C ASP A 143 -42.959 17.749 32.808 1.00 40.00 C
+ATOM 955 O ASP A 143 -43.105 16.583 33.218 1.00 40.00 O
+ATOM 956 CB ASP A 143 -41.302 19.261 33.969 1.00 40.00 C
+ATOM 957 CG ASP A 143 -41.083 20.453 34.884 1.00 40.00 C
+ATOM 958 OD1 ASP A 143 -41.995 20.805 35.670 1.00 40.00 O
+ATOM 959 OD2 ASP A 143 -39.979 21.032 34.816 1.00 40.00 O
+ATOM 960 N ASN A 144 -42.968 18.072 31.519 1.00 40.00 N
+ATOM 961 CA ASN A 144 -42.992 17.047 30.502 1.00 40.00 C
+ATOM 962 C ASN A 144 -41.600 16.581 30.099 1.00 40.00 C
+ATOM 963 O ASN A 144 -40.657 17.385 30.092 1.00 40.00 O
+ATOM 964 CB ASN A 144 -43.770 17.526 29.292 1.00 40.00 C
+ATOM 965 CG ASN A 144 -45.229 17.149 29.371 1.00 40.00 C
+ATOM 966 OD1 ASN A 144 -46.048 17.607 28.575 1.00 40.00 O
+ATOM 967 ND2 ASN A 144 -45.564 16.290 30.331 1.00 40.00 N
+ATOM 968 N VAL A 145 -41.487 15.275 29.795 1.00 40.00 N
+ATOM 969 CA VAL A 145 -40.241 14.627 29.301 1.00 40.00 C
+ATOM 970 C VAL A 145 -40.498 13.830 28.001 1.00 40.00 C
+ATOM 971 O VAL A 145 -41.399 12.974 27.938 1.00 40.00 O
+ATOM 972 CB VAL A 145 -39.573 13.668 30.343 1.00 40.00 C
+ATOM 973 CG1 VAL A 145 -38.104 13.472 30.015 1.00 40.00 C
+ATOM 974 CG2 VAL A 145 -39.690 14.179 31.771 1.00 40.00 C
+ATOM 975 N GLN A 146 -39.703 14.116 26.970 1.00 40.00 N
+ATOM 976 CA GLN A 146 -39.768 13.348 25.725 1.00 40.00 C
+ATOM 977 C GLN A 146 -38.863 12.123 25.831 1.00 40.00 C
+ATOM 978 O GLN A 146 -37.657 12.249 26.089 1.00 40.00 O
+ATOM 979 CB GLN A 146 -39.365 14.214 24.536 1.00 40.00 C
+ATOM 980 CG GLN A 146 -40.338 15.340 24.214 1.00 40.00 C
+ATOM 981 CD GLN A 146 -39.825 16.229 23.096 1.00 40.00 C
+ATOM 982 OE1 GLN A 146 -38.720 16.781 23.178 1.00 40.00 O
+ATOM 983 NE2 GLN A 146 -40.625 16.374 22.040 1.00 40.00 N
+ATOM 984 N ILE A 147 -39.448 10.942 25.624 1.00 40.00 N
+ATOM 985 CA ILE A 147 -38.804 9.665 25.987 1.00 40.00 C
+ATOM 986 C ILE A 147 -38.645 8.662 24.828 1.00 40.00 C
+ATOM 987 O ILE A 147 -39.631 8.250 24.203 1.00 40.00 O
+ATOM 988 CB ILE A 147 -39.548 9.004 27.177 1.00 40.00 C
+ATOM 989 CG1 ILE A 147 -39.446 9.898 28.412 1.00 40.00 C
+ATOM 990 CG2 ILE A 147 -38.992 7.619 27.480 1.00 40.00 C
+ATOM 991 CD1 ILE A 147 -40.486 9.620 29.468 1.00 40.00 C
+ATOM 992 N THR A 148 -37.393 8.276 24.564 1.00 40.00 N
+ATOM 993 CA THR A 148 -37.063 7.238 23.575 1.00 40.00 C
+ATOM 994 C THR A 148 -36.675 5.904 24.234 1.00 40.00 C
+ATOM 995 O THR A 148 -36.190 5.870 25.367 1.00 40.00 O
+ATOM 996 CB THR A 148 -35.922 7.680 22.625 1.00 40.00 C
+ATOM 997 OG1 THR A 148 -34.740 7.978 23.376 1.00 40.00 O
+ATOM 998 CG2 THR A 148 -36.321 8.908 21.832 1.00 40.00 C
+ATOM 999 N GLY A 149 -36.882 4.803 23.525 1.00 40.00 N
+ATOM 1000 CA GLY A 149 -36.491 3.508 24.057 1.00 40.00 C
+ATOM 1001 C GLY A 149 -37.626 2.503 24.097 1.00 40.00 C
+ATOM 1002 O GLY A 149 -38.636 2.684 23.402 1.00 40.00 O
+ATOM 1003 N PRO A 150 -37.462 1.418 24.884 1.00 40.00 N
+ATOM 1004 CA PRO A 150 -36.271 1.117 25.663 1.00 40.00 C
+ATOM 1005 C PRO A 150 -35.124 0.669 24.768 1.00 40.00 C
+ATOM 1006 O PRO A 150 -35.361 0.262 23.629 1.00 40.00 O
+ATOM 1007 CB PRO A 150 -36.723 -0.025 26.572 1.00 40.00 C
+ATOM 1008 CG PRO A 150 -37.820 -0.691 25.850 1.00 40.00 C
+ATOM 1009 CD PRO A 150 -38.472 0.349 24.987 1.00 40.00 C
+ATOM 1010 N VAL A 151 -33.896 0.753 25.273 1.00 40.00 N
+ATOM 1011 CA VAL A 151 -32.719 0.495 24.458 1.00 40.00 C
+ATOM 1012 C VAL A 151 -31.702 -0.353 25.218 1.00 40.00 C
+ATOM 1013 O VAL A 151 -31.580 -0.231 26.434 1.00 40.00 O
+ATOM 1014 CB VAL A 151 -32.095 1.825 23.975 1.00 40.00 C
+ATOM 1015 CG1 VAL A 151 -30.744 1.599 23.326 1.00 40.00 C
+ATOM 1016 CG2 VAL A 151 -33.011 2.522 22.981 1.00 40.00 C
+ATOM 1017 N GLY A 152 -30.991 -1.217 24.491 1.00 40.00 N
+ATOM 1018 CA GLY A 152 -29.925 -2.036 25.060 1.00 40.00 C
+ATOM 1019 C GLY A 152 -30.393 -3.446 25.327 1.00 40.00 C
+ATOM 1020 O GLY A 152 -31.478 -3.664 25.858 1.00 40.00 O
+ATOM 1021 N LYS A 153 -29.577 -4.408 24.934 1.00 40.00 N
+ATOM 1022 CA LYS A 153 -29.853 -5.785 25.250 1.00 40.00 C
+ATOM 1023 C LYS A 153 -28.638 -6.265 25.976 1.00 40.00 C
+ATOM 1024 O LYS A 153 -28.606 -7.381 26.486 1.00 40.00 O
+ATOM 1025 CB LYS A 153 -30.011 -6.611 23.978 1.00 40.00 C
+ATOM 1026 CG LYS A 153 -31.176 -6.229 23.063 1.00 40.00 C
+ATOM 1027 CD LYS A 153 -32.425 -7.104 23.259 1.00 40.00 C
+ATOM 1028 CE LYS A 153 -32.369 -8.463 22.555 1.00 40.00 C
+ATOM 1029 NZ LYS A 153 -32.662 -8.406 21.096 1.00 40.00 N
+ATOM 1030 N GLU A 154 -27.627 -5.406 26.011 1.00 40.00 N
+ATOM 1031 CA GLU A 154 -26.322 -5.791 26.493 1.00 40.00 C
+ATOM 1032 C GLU A 154 -26.320 -6.129 27.976 1.00 40.00 C
+ATOM 1033 O GLU A 154 -25.576 -6.999 28.422 1.00 40.00 O
+ATOM 1034 CB GLU A 154 -25.314 -4.692 26.182 1.00 40.00 C
+ATOM 1035 CG GLU A 154 -23.885 -5.029 26.586 1.00 40.00 C
+ATOM 1036 CD GLU A 154 -23.215 -6.101 25.726 1.00 40.00 C
+ATOM 1037 OE1 GLU A 154 -23.919 -6.833 24.987 1.00 40.00 O
+ATOM 1038 OE2 GLU A 154 -21.964 -6.212 25.791 1.00 40.00 O
+ATOM 1039 N MET A 155 -27.176 -5.468 28.735 1.00 40.00 N
+ATOM 1040 CA MET A 155 -27.100 -5.586 30.173 1.00 40.00 C
+ATOM 1041 C MET A 155 -28.265 -6.311 30.831 1.00 40.00 C
+ATOM 1042 O MET A 155 -28.585 -6.055 31.983 1.00 40.00 O
+ATOM 1043 CB MET A 155 -26.916 -4.199 30.767 1.00 40.00 C
+ATOM 1044 CG MET A 155 -25.592 -3.569 30.387 1.00 40.00 C
+ATOM 1045 SD MET A 155 -24.208 -4.601 30.890 1.00 40.00 S
+ATOM 1046 CE MET A 155 -23.855 -3.957 32.519 1.00 40.00 C
+ATOM 1047 N LEU A 156 -28.885 -7.236 30.114 1.00 40.00 N
+ATOM 1048 CA LEU A 156 -30.019 -7.981 30.657 1.00 40.00 C
+ATOM 1049 C LEU A 156 -29.555 -9.015 31.666 1.00 40.00 C
+ATOM 1050 O LEU A 156 -28.435 -9.513 31.581 1.00 40.00 O
+ATOM 1051 CB LEU A 156 -30.803 -8.666 29.535 1.00 40.00 C
+ATOM 1052 CG LEU A 156 -31.392 -7.809 28.402 1.00 40.00 C
+ATOM 1053 CD1 LEU A 156 -31.667 -8.655 27.163 1.00 40.00 C
+ATOM 1054 CD2 LEU A 156 -32.645 -7.064 28.852 1.00 40.00 C
+ATOM 1055 N MET A 157 -30.430 -9.342 32.614 1.00 40.00 N
+ATOM 1056 CA MET A 157 -30.103 -10.273 33.701 1.00 40.00 C
+ATOM 1057 C MET A 157 -29.798 -11.657 33.171 1.00 40.00 C
+ATOM 1058 O MET A 157 -30.134 -11.954 32.028 1.00 40.00 O
+ATOM 1059 CB MET A 157 -31.268 -10.385 34.683 1.00 40.00 C
+ATOM 1060 CG MET A 157 -31.984 -9.081 34.977 1.00 40.00 C
+ATOM 1061 SD MET A 157 -32.949 -9.217 36.492 1.00 40.00 S
+ATOM 1062 CE MET A 157 -31.623 -9.401 37.693 1.00 40.00 C
+ATOM 1063 N PRO A 158 -29.171 -12.517 33.992 1.00 40.00 N
+ATOM 1064 CA PRO A 158 -29.047 -13.891 33.544 1.00 40.00 C
+ATOM 1065 C PRO A 158 -30.374 -14.620 33.665 1.00 40.00 C
+ATOM 1066 O PRO A 158 -31.252 -14.187 34.424 1.00 40.00 O
+ATOM 1067 CB PRO A 158 -28.024 -14.492 34.514 1.00 40.00 C
+ATOM 1068 CG PRO A 158 -27.307 -13.324 35.072 1.00 40.00 C
+ATOM 1069 CD PRO A 158 -28.378 -12.286 35.202 1.00 40.00 C
+ATOM 1070 N LYS A 159 -30.509 -15.703 32.900 1.00 40.00 N
+ATOM 1071 CA LYS A 159 -31.654 -16.586 33.000 1.00 40.00 C
+ATOM 1072 C LYS A 159 -31.562 -17.326 34.319 1.00 40.00 C
+ATOM 1073 O LYS A 159 -32.563 -17.456 35.026 1.00 40.00 O
+ATOM 1074 CB LYS A 159 -31.701 -17.558 31.811 1.00 40.00 C
+ATOM 1075 CG LYS A 159 -32.395 -16.993 30.569 1.00 40.00 C
+ATOM 1076 CD LYS A 159 -32.161 -17.807 29.290 1.00 40.00 C
+ATOM 1077 CE LYS A 159 -32.824 -17.144 28.076 1.00 40.00 C
+ATOM 1078 NZ LYS A 159 -32.295 -17.566 26.743 1.00 40.00 N
+ATOM 1079 N ASP A 160 -30.342 -17.763 34.647 1.00 40.00 N
+ATOM 1080 CA ASP A 160 -30.024 -18.511 35.873 1.00 40.00 C
+ATOM 1081 C ASP A 160 -30.443 -17.784 37.170 1.00 40.00 C
+ATOM 1082 O ASP A 160 -29.834 -16.772 37.527 1.00 40.00 O
+ATOM 1083 CB ASP A 160 -28.512 -18.812 35.898 1.00 40.00 C
+ATOM 1084 CG ASP A 160 -28.103 -19.795 37.012 1.00 40.00 C
+ATOM 1085 OD1 ASP A 160 -28.936 -20.156 37.876 1.00 40.00 O
+ATOM 1086 OD2 ASP A 160 -26.923 -20.214 37.018 1.00 40.00 O
+ATOM 1087 N PRO A 161 -31.470 -18.301 37.894 1.00 40.00 N
+ATOM 1088 CA PRO A 161 -31.816 -17.616 39.142 1.00 40.00 C
+ATOM 1089 C PRO A 161 -30.994 -18.138 40.329 1.00 40.00 C
+ATOM 1090 O PRO A 161 -31.324 -17.842 41.479 1.00 40.00 O
+ATOM 1091 CB PRO A 161 -33.316 -17.925 39.314 1.00 40.00 C
+ATOM 1092 CG PRO A 161 -33.562 -19.173 38.515 1.00 40.00 C
+ATOM 1093 CD PRO A 161 -32.334 -19.480 37.678 1.00 40.00 C
+ATOM 1094 N ASN A 162 -29.946 -18.916 40.039 1.00 40.00 N
+ATOM 1095 CA ASN A 162 -28.958 -19.364 41.037 1.00 40.00 C
+ATOM 1096 C ASN A 162 -27.577 -18.861 40.649 1.00 40.00 C
+ATOM 1097 O ASN A 162 -26.542 -19.424 41.035 1.00 40.00 O
+ATOM 1098 CB ASN A 162 -28.957 -20.894 41.175 1.00 40.00 C
+ATOM 1099 CG ASN A 162 -30.085 -21.402 42.057 1.00 40.00 C
+ATOM 1100 OD1 ASN A 162 -30.552 -22.526 41.897 1.00 40.00 O
+ATOM 1101 ND2 ASN A 162 -30.530 -20.573 42.990 1.00 40.00 N
+ATOM 1102 N ALA A 163 -27.593 -17.778 39.882 1.00 40.00 N
+ATOM 1103 CA ALA A 163 -26.399 -17.218 39.296 1.00 40.00 C
+ATOM 1104 C ALA A 163 -25.562 -16.502 40.331 1.00 40.00 C
+ATOM 1105 O ALA A 163 -26.089 -15.955 41.293 1.00 40.00 O
+ATOM 1106 CB ALA A 163 -26.782 -16.256 38.186 1.00 40.00 C
+ATOM 1107 N THR A 164 -24.252 -16.536 40.128 1.00 40.00 N
+ATOM 1108 CA THR A 164 -23.336 -15.630 40.792 1.00 40.00 C
+ATOM 1109 C THR A 164 -23.306 -14.371 39.923 1.00 40.00 C
+ATOM 1110 O THR A 164 -22.897 -14.440 38.765 1.00 40.00 O
+ATOM 1111 CB THR A 164 -21.917 -16.230 40.866 1.00 40.00 C
+ATOM 1112 OG1 THR A 164 -21.967 -17.553 41.413 1.00 40.00 O
+ATOM 1113 CG2 THR A 164 -21.015 -15.375 41.723 1.00 40.00 C
+ATOM 1114 N ILE A 165 -23.755 -13.234 40.458 1.00 40.00 N
+ATOM 1115 CA ILE A 165 -23.834 -12.001 39.653 1.00 40.00 C
+ATOM 1116 C ILE A 165 -22.952 -10.868 40.148 1.00 40.00 C
+ATOM 1117 O ILE A 165 -23.278 -10.153 41.097 1.00 40.00 O
+ATOM 1118 CB ILE A 165 -25.264 -11.490 39.519 1.00 40.00 C
+ATOM 1119 CG1 ILE A 165 -26.149 -12.615 39.020 1.00 40.00 C
+ATOM 1120 CG2 ILE A 165 -25.302 -10.323 38.548 1.00 40.00 C
+ATOM 1121 CD1 ILE A 165 -27.609 -12.407 39.330 1.00 40.00 C
+ATOM 1122 N ILE A 166 -21.843 -10.686 39.461 1.00 40.00 N
+ATOM 1123 CA ILE A 166 -20.872 -9.724 39.883 1.00 40.00 C
+ATOM 1124 C ILE A 166 -21.085 -8.444 39.139 1.00 40.00 C
+ATOM 1125 O ILE A 166 -21.057 -8.407 37.915 1.00 40.00 O
+ATOM 1126 CB ILE A 166 -19.470 -10.250 39.643 1.00 40.00 C
+ATOM 1127 CG1 ILE A 166 -19.293 -11.513 40.474 1.00 40.00 C
+ATOM 1128 CG2 ILE A 166 -18.435 -9.195 40.002 1.00 40.00 C
+ATOM 1129 CD1 ILE A 166 -18.232 -12.451 39.951 1.00 40.00 C
+ATOM 1130 N MET A 167 -21.278 -7.393 39.915 1.00 40.00 N
+ATOM 1131 CA MET A 167 -21.655 -6.109 39.399 1.00 40.00 C
+ATOM 1132 C MET A 167 -20.611 -5.075 39.777 1.00 40.00 C
+ATOM 1133 O MET A 167 -20.463 -4.734 40.949 1.00 40.00 O
+ATOM 1134 CB MET A 167 -22.996 -5.741 39.998 1.00 40.00 C
+ATOM 1135 CG MET A 167 -24.031 -6.839 39.870 1.00 40.00 C
+ATOM 1136 SD MET A 167 -25.494 -6.488 40.852 1.00 40.00 S
+ATOM 1137 CE MET A 167 -25.129 -7.461 42.309 1.00 40.00 C
+ATOM 1138 N LEU A 168 -19.872 -4.592 38.788 1.00 40.00 N
+ATOM 1139 CA LEU A 168 -18.912 -3.532 39.030 1.00 40.00 C
+ATOM 1140 C LEU A 168 -19.503 -2.220 38.588 1.00 40.00 C
+ATOM 1141 O LEU A 168 -19.976 -2.106 37.463 1.00 40.00 O
+ATOM 1142 CB LEU A 168 -17.610 -3.782 38.279 1.00 40.00 C
+ATOM 1143 CG LEU A 168 -16.800 -5.023 38.621 1.00 40.00 C
+ATOM 1144 CD1 LEU A 168 -17.060 -5.544 40.029 1.00 40.00 C
+ATOM 1145 CD2 LEU A 168 -17.153 -6.076 37.604 1.00 40.00 C
+ATOM 1146 N ALA A 169 -19.472 -1.228 39.472 1.00 40.00 N
+ATOM 1147 CA ALA A 169 -20.097 0.055 39.185 1.00 40.00 C
+ATOM 1148 C ALA A 169 -19.341 1.233 39.745 1.00 40.00 C
+ATOM 1149 O ALA A 169 -18.823 1.186 40.846 1.00 40.00 O
+ATOM 1150 CB ALA A 169 -21.526 0.070 39.696 1.00 40.00 C
+ATOM 1151 N THR A 170 -19.307 2.306 38.977 1.00 40.00 N
+ATOM 1152 CA THR A 170 -18.687 3.535 39.415 1.00 40.00 C
+ATOM 1153 C THR A 170 -19.607 4.684 39.100 1.00 40.00 C
+ATOM 1154 O THR A 170 -19.853 4.979 37.941 1.00 40.00 O
+ATOM 1155 CB THR A 170 -17.395 3.797 38.648 1.00 40.00 C
+ATOM 1156 OG1 THR A 170 -17.645 3.597 37.251 1.00 40.00 O
+ATOM 1157 CG2 THR A 170 -16.275 2.866 39.120 1.00 40.00 C
+ATOM 1158 N GLY A 171 -20.112 5.340 40.128 1.00 40.00 N
+ATOM 1159 CA GLY A 171 -20.984 6.480 39.922 1.00 40.00 C
+ATOM 1160 C GLY A 171 -22.345 6.077 39.397 1.00 40.00 C
+ATOM 1161 O GLY A 171 -22.928 5.114 39.882 1.00 40.00 O
+ATOM 1162 N THR A 172 -22.840 6.807 38.394 1.00 40.00 N
+ATOM 1163 CA THR A 172 -24.168 6.566 37.829 1.00 40.00 C
+ATOM 1164 C THR A 172 -24.191 5.311 36.969 1.00 40.00 C
+ATOM 1165 O THR A 172 -25.068 5.140 36.114 1.00 40.00 O
+ATOM 1166 CB THR A 172 -24.680 7.759 37.003 1.00 40.00 C
+ATOM 1167 OG1 THR A 172 -23.932 7.871 35.791 1.00 40.00 O
+ATOM 1168 CG2 THR A 172 -24.555 9.031 37.770 1.00 40.00 C
+ATOM 1169 N GLY A 173 -23.205 4.441 37.203 1.00 40.00 N
+ATOM 1170 CA GLY A 173 -23.184 3.107 36.618 1.00 40.00 C
+ATOM 1171 C GLY A 173 -23.761 2.079 37.575 1.00 40.00 C
+ATOM 1172 O GLY A 173 -23.717 0.878 37.317 1.00 40.00 O
+ATOM 1173 N ILE A 174 -24.298 2.558 38.689 1.00 40.00 N
+ATOM 1174 CA ILE A 174 -24.989 1.708 39.623 1.00 40.00 C
+ATOM 1175 C ILE A 174 -26.422 1.505 39.155 1.00 40.00 C
+ATOM 1176 O ILE A 174 -27.036 0.492 39.469 1.00 40.00 O
+ATOM 1177 CB ILE A 174 -25.006 2.340 41.012 1.00 40.00 C
+ATOM 1178 CG1 ILE A 174 -25.696 1.427 42.023 1.00 40.00 C
+ATOM 1179 CG2 ILE A 174 -25.708 3.687 40.968 1.00 40.00 C
+ATOM 1180 CD1 ILE A 174 -24.779 0.452 42.722 1.00 40.00 C
+ATOM 1181 N ALA A 175 -26.942 2.467 38.393 1.00 40.00 N
+ATOM 1182 CA ALA A 175 -28.350 2.472 37.936 1.00 40.00 C
+ATOM 1183 C ALA A 175 -28.978 1.118 37.523 1.00 40.00 C
+ATOM 1184 O ALA A 175 -29.980 0.692 38.113 1.00 40.00 O
+ATOM 1185 CB ALA A 175 -28.541 3.508 36.834 1.00 40.00 C
+ATOM 1186 N PRO A 176 -28.405 0.446 36.506 1.00 40.00 N
+ATOM 1187 CA PRO A 176 -28.979 -0.821 36.128 1.00 40.00 C
+ATOM 1188 C PRO A 176 -29.001 -1.785 37.302 1.00 40.00 C
+ATOM 1189 O PRO A 176 -29.996 -2.462 37.517 1.00 40.00 O
+ATOM 1190 CB PRO A 176 -28.018 -1.318 35.053 1.00 40.00 C
+ATOM 1191 CG PRO A 176 -26.742 -0.599 35.287 1.00 40.00 C
+ATOM 1192 CD PRO A 176 -27.202 0.746 35.710 1.00 40.00 C
+ATOM 1193 N PHE A 177 -27.917 -1.824 38.068 1.00 40.00 N
+ATOM 1194 CA PHE A 177 -27.815 -2.737 39.188 1.00 40.00 C
+ATOM 1195 C PHE A 177 -28.808 -2.421 40.279 1.00 40.00 C
+ATOM 1196 O PHE A 177 -29.149 -3.290 41.066 1.00 40.00 O
+ATOM 1197 CB PHE A 177 -26.427 -2.711 39.774 1.00 40.00 C
+ATOM 1198 CG PHE A 177 -25.363 -3.037 38.795 1.00 40.00 C
+ATOM 1199 CD1 PHE A 177 -25.354 -4.253 38.159 1.00 40.00 C
+ATOM 1200 CD2 PHE A 177 -24.355 -2.125 38.514 1.00 40.00 C
+ATOM 1201 CE1 PHE A 177 -24.357 -4.565 37.253 1.00 40.00 C
+ATOM 1202 CE2 PHE A 177 -23.349 -2.428 37.609 1.00 40.00 C
+ATOM 1203 CZ PHE A 177 -23.349 -3.655 36.975 1.00 40.00 C
+ATOM 1204 N ARG A 178 -29.264 -1.177 40.347 1.00 40.00 N
+ATOM 1205 CA ARG A 178 -30.387 -0.878 41.213 1.00 40.00 C
+ATOM 1206 C ARG A 178 -31.491 -1.749 40.691 1.00 40.00 C
+ATOM 1207 O ARG A 178 -32.012 -2.615 41.393 1.00 40.00 O
+ATOM 1208 CB ARG A 178 -30.816 0.584 41.112 1.00 40.00 C
+ATOM 1209 CG ARG A 178 -32.073 0.903 41.917 1.00 40.00 C
+ATOM 1210 CD ARG A 178 -32.270 2.396 42.117 1.00 40.00 C
+ATOM 1211 NE ARG A 178 -33.134 2.685 43.252 1.00 40.00 N
+ATOM 1212 CZ ARG A 178 -34.451 2.752 43.177 1.00 40.00 C
+ATOM 1213 NH1 ARG A 178 -35.055 2.562 42.031 1.00 40.00 N
+ATOM 1214 NH2 ARG A 178 -35.159 3.014 44.244 1.00 40.00 N
+ATOM 1215 N SER A 179 -31.796 -1.527 39.418 1.00 40.00 N
+ATOM 1216 CA SER A 179 -32.868 -2.202 38.734 1.00 40.00 C
+ATOM 1217 C SER A 179 -32.804 -3.698 38.985 1.00 40.00 C
+ATOM 1218 O SER A 179 -33.817 -4.321 39.261 1.00 40.00 O
+ATOM 1219 CB SER A 179 -32.779 -1.893 37.249 1.00 40.00 C
+ATOM 1220 OG SER A 179 -34.041 -2.036 36.652 1.00 40.00 O
+ATOM 1221 N PHE A 180 -31.600 -4.253 38.919 1.00 40.00 N
+ATOM 1222 CA PHE A 180 -31.374 -5.661 39.180 1.00 40.00 C
+ATOM 1223 C PHE A 180 -31.828 -6.057 40.556 1.00 40.00 C
+ATOM 1224 O PHE A 180 -32.624 -6.960 40.717 1.00 40.00 O
+ATOM 1225 CB PHE A 180 -29.891 -5.973 39.116 1.00 40.00 C
+ATOM 1226 CG PHE A 180 -29.360 -6.178 37.735 1.00 40.00 C
+ATOM 1227 CD1 PHE A 180 -29.923 -5.529 36.644 1.00 40.00 C
+ATOM 1228 CD2 PHE A 180 -28.253 -7.000 37.532 1.00 40.00 C
+ATOM 1229 CE1 PHE A 180 -29.410 -5.719 35.370 1.00 40.00 C
+ATOM 1230 CE2 PHE A 180 -27.726 -7.189 36.265 1.00 40.00 C
+ATOM 1231 CZ PHE A 180 -28.308 -6.546 35.182 1.00 40.00 C
+ATOM 1232 N LEU A 181 -31.294 -5.391 41.562 1.00 40.00 N
+ATOM 1233 CA LEU A 181 -31.458 -5.874 42.922 1.00 40.00 C
+ATOM 1234 C LEU A 181 -32.908 -5.764 43.372 1.00 40.00 C
+ATOM 1235 O LEU A 181 -33.454 -6.696 43.972 1.00 40.00 O
+ATOM 1236 CB LEU A 181 -30.486 -5.162 43.868 1.00 40.00 C
+ATOM 1237 CG LEU A 181 -29.032 -5.571 43.605 1.00 40.00 C
+ATOM 1238 CD1 LEU A 181 -28.107 -4.381 43.767 1.00 40.00 C
+ATOM 1239 CD2 LEU A 181 -28.590 -6.735 44.482 1.00 40.00 C
+ATOM 1240 N TRP A 182 -33.536 -4.639 43.041 1.00 40.00 N
+ATOM 1241 CA TRP A 182 -34.936 -4.420 43.360 1.00 40.00 C
+ATOM 1242 C TRP A 182 -35.714 -5.656 43.072 1.00 40.00 C
+ATOM 1243 O TRP A 182 -36.352 -6.212 43.961 1.00 40.00 O
+ATOM 1244 CB TRP A 182 -35.484 -3.251 42.553 1.00 40.00 C
+ATOM 1245 CG TRP A 182 -35.496 -1.952 43.315 1.00 40.00 C
+ATOM 1246 CD1 TRP A 182 -34.406 -1.225 43.766 1.00 40.00 C
+ATOM 1247 CD2 TRP A 182 -36.668 -1.171 43.732 1.00 40.00 C
+ATOM 1248 NE1 TRP A 182 -34.811 -0.085 44.416 1.00 40.00 N
+ATOM 1249 CE2 TRP A 182 -36.150 0.007 44.432 1.00 40.00 C
+ATOM 1250 CE3 TRP A 182 -38.040 -1.323 43.597 1.00 40.00 C
+ATOM 1251 CZ2 TRP A 182 -36.983 0.964 44.976 1.00 40.00 C
+ATOM 1252 CZ3 TRP A 182 -38.873 -0.346 44.147 1.00 40.00 C
+ATOM 1253 CH2 TRP A 182 -38.354 0.768 44.821 1.00 40.00 C
+ATOM 1254 N LYS A 183 -35.635 -6.108 41.823 1.00 40.00 N
+ATOM 1255 CA LYS A 183 -36.297 -7.331 41.379 1.00 40.00 C
+ATOM 1256 C LYS A 183 -35.870 -8.531 42.241 1.00 40.00 C
+ATOM 1257 O LYS A 183 -36.711 -9.311 42.690 1.00 40.00 O
+ATOM 1258 CB LYS A 183 -35.992 -7.581 39.890 1.00 40.00 C
+ATOM 1259 CG LYS A 183 -37.109 -8.256 39.101 1.00 40.00 C
+ATOM 1260 CD LYS A 183 -36.589 -9.063 37.907 1.00 40.00 C
+ATOM 1261 CE LYS A 183 -37.747 -9.737 37.168 1.00 40.00 C
+ATOM 1262 NZ LYS A 183 -37.304 -10.815 36.228 1.00 40.00 N
+ATOM 1263 N MET A 184 -34.569 -8.643 42.497 1.00 40.00 N
+ATOM 1264 CA MET A 184 -34.015 -9.798 43.171 1.00 40.00 C
+ATOM 1265 C MET A 184 -34.423 -9.892 44.607 1.00 40.00 C
+ATOM 1266 O MET A 184 -34.765 -10.964 45.071 1.00 40.00 O
+ATOM 1267 CB MET A 184 -32.510 -9.758 43.129 1.00 40.00 C
+ATOM 1268 CG MET A 184 -31.963 -9.985 41.749 1.00 40.00 C
+ATOM 1269 SD MET A 184 -30.327 -9.277 41.642 1.00 40.00 S
+ATOM 1270 CE MET A 184 -29.404 -10.476 42.602 1.00 40.00 C
+ATOM 1271 N PHE A 185 -34.379 -8.780 45.318 1.00 40.00 N
+ATOM 1272 CA PHE A 185 -34.528 -8.853 46.753 1.00 40.00 C
+ATOM 1273 C PHE A 185 -35.754 -8.174 47.294 1.00 40.00 C
+ATOM 1274 O PHE A 185 -36.326 -8.600 48.295 1.00 40.00 O
+ATOM 1275 CB PHE A 185 -33.291 -8.308 47.422 1.00 40.00 C
+ATOM 1276 CG PHE A 185 -32.094 -9.156 47.209 1.00 40.00 C
+ATOM 1277 CD1 PHE A 185 -32.001 -10.402 47.808 1.00 40.00 C
+ATOM 1278 CD2 PHE A 185 -31.062 -8.722 46.401 1.00 40.00 C
+ATOM 1279 CE1 PHE A 185 -30.887 -11.204 47.619 1.00 40.00 C
+ATOM 1280 CE2 PHE A 185 -29.943 -9.516 46.204 1.00 40.00 C
+ATOM 1281 CZ PHE A 185 -29.851 -10.761 46.816 1.00 40.00 C
+ATOM 1282 N PHE A 186 -36.165 -7.107 46.642 1.00 40.00 N
+ATOM 1283 CA PHE A 186 -37.333 -6.423 47.127 1.00 40.00 C
+ATOM 1284 C PHE A 186 -38.630 -7.064 46.639 1.00 40.00 C
+ATOM 1285 O PHE A 186 -39.640 -7.017 47.338 1.00 40.00 O
+ATOM 1286 CB PHE A 186 -37.274 -4.937 46.782 1.00 40.00 C
+ATOM 1287 CG PHE A 186 -36.399 -4.133 47.708 1.00 40.00 C
+ATOM 1288 CD1 PHE A 186 -35.872 -4.705 48.872 1.00 40.00 C
+ATOM 1289 CD2 PHE A 186 -36.134 -2.790 47.433 1.00 40.00 C
+ATOM 1290 CE1 PHE A 186 -35.077 -3.959 49.721 1.00 40.00 C
+ATOM 1291 CE2 PHE A 186 -35.348 -2.035 48.284 1.00 40.00 C
+ATOM 1292 CZ PHE A 186 -34.818 -2.621 49.427 1.00 40.00 C
+ATOM 1293 N GLU A 187 -38.596 -7.695 45.465 1.00 40.00 N
+ATOM 1294 CA GLU A 187 -39.835 -8.139 44.812 1.00 40.00 C
+ATOM 1295 C GLU A 187 -40.097 -9.663 44.850 1.00 40.00 C
+ATOM 1296 O GLU A 187 -39.163 -10.483 44.870 1.00 40.00 O
+ATOM 1297 CB GLU A 187 -39.912 -7.568 43.386 1.00 40.00 C
+ATOM 1298 CG GLU A 187 -39.751 -6.050 43.341 1.00 40.00 C
+ATOM 1299 CD GLU A 187 -39.603 -5.467 41.937 1.00 40.00 C
+ATOM 1300 OE1 GLU A 187 -39.112 -6.152 41.010 1.00 40.00 O
+ATOM 1301 OE2 GLU A 187 -39.976 -4.287 41.758 1.00 40.00 O
+ATOM 1302 N LYS A 188 -41.384 -10.015 44.892 1.00 40.00 N
+ATOM 1303 CA LYS A 188 -41.835 -11.410 44.841 1.00 40.00 C
+ATOM 1304 C LYS A 188 -42.450 -11.734 43.488 1.00 40.00 C
+ATOM 1305 O LYS A 188 -43.497 -11.191 43.111 1.00 40.00 O
+ATOM 1306 CB LYS A 188 -42.854 -11.706 45.944 1.00 40.00 C
+ATOM 1307 CG LYS A 188 -42.292 -11.621 47.350 1.00 40.00 C
+ATOM 1308 CD LYS A 188 -41.264 -12.715 47.616 1.00 40.00 C
+ATOM 1309 CE LYS A 188 -40.557 -12.486 48.939 1.00 40.00 C
+ATOM 1310 NZ LYS A 188 -41.537 -12.398 50.057 1.00 40.00 N
+ATOM 1311 N HIS A 189 -41.783 -12.615 42.756 1.00 40.00 N
+ATOM 1312 CA HIS A 189 -42.287 -13.057 41.473 1.00 40.00 C
+ATOM 1313 C HIS A 189 -42.439 -14.536 41.503 1.00 40.00 C
+ATOM 1314 O HIS A 189 -41.630 -15.261 42.110 1.00 40.00 O
+ATOM 1315 CB HIS A 189 -41.360 -12.634 40.347 1.00 40.00 C
+ATOM 1316 CG HIS A 189 -41.238 -11.139 40.200 1.00 40.00 C
+ATOM 1317 ND1 HIS A 189 -41.884 -10.451 39.237 1.00 40.00 N
+ATOM 1318 CD2 HIS A 189 -40.527 -10.197 40.954 1.00 40.00 C
+ATOM 1319 CE1 HIS A 189 -41.594 -9.135 39.356 1.00 40.00 C
+ATOM 1320 NE2 HIS A 189 -40.765 -8.981 40.410 1.00 40.00 N
+ATOM 1321 N ASP A 190 -43.504 -14.989 40.854 1.00 40.00 N
+ATOM 1322 CA ASP A 190 -43.826 -16.400 40.798 1.00 40.00 C
+ATOM 1323 C ASP A 190 -42.862 -17.081 39.840 1.00 40.00 C
+ATOM 1324 O ASP A 190 -42.321 -18.151 40.136 1.00 40.00 O
+ATOM 1325 CB ASP A 190 -45.288 -16.569 40.382 1.00 40.00 C
+ATOM 1326 CG ASP A 190 -46.225 -15.766 41.267 1.00 40.00 C
+ATOM 1327 OD1 ASP A 190 -46.339 -16.128 42.461 1.00 40.00 O
+ATOM 1328 OD2 ASP A 190 -46.816 -14.762 40.788 1.00 40.00 O
+ATOM 1329 N ASP A 191 -42.616 -16.423 38.711 1.00 40.00 N
+ATOM 1330 CA ASP A 191 -41.725 -16.951 37.689 1.00 40.00 C
+ATOM 1331 C ASP A 191 -40.269 -16.761 38.047 1.00 40.00 C
+ATOM 1332 O ASP A 191 -39.390 -17.377 37.451 1.00 40.00 O
+ATOM 1333 CB ASP A 191 -42.020 -16.300 36.337 1.00 40.00 C
+ATOM 1334 CG ASP A 191 -42.157 -14.789 36.423 1.00 40.00 C
+ATOM 1335 OD1 ASP A 191 -42.994 -14.294 37.216 1.00 40.00 O
+ATOM 1336 OD2 ASP A 191 -41.441 -14.097 35.670 1.00 40.00 O
+ATOM 1337 N TYR A 192 -40.013 -15.905 39.025 1.00 40.00 N
+ATOM 1338 CA TYR A 192 -38.642 -15.551 39.353 1.00 40.00 C
+ATOM 1339 C TYR A 192 -38.371 -15.389 40.841 1.00 40.00 C
+ATOM 1340 O TYR A 192 -38.819 -14.429 41.479 1.00 40.00 O
+ATOM 1341 CB TYR A 192 -38.207 -14.292 38.595 1.00 40.00 C
+ATOM 1342 CG TYR A 192 -36.711 -14.097 38.595 1.00 40.00 C
+ATOM 1343 CD1 TYR A 192 -35.879 -14.961 37.880 1.00 40.00 C
+ATOM 1344 CD2 TYR A 192 -36.126 -13.065 39.314 1.00 40.00 C
+ATOM 1345 CE1 TYR A 192 -34.505 -14.793 37.878 1.00 40.00 C
+ATOM 1346 CE2 TYR A 192 -34.753 -12.886 39.315 1.00 40.00 C
+ATOM 1347 CZ TYR A 192 -33.944 -13.753 38.597 1.00 40.00 C
+ATOM 1348 OH TYR A 192 -32.572 -13.589 38.590 1.00 40.00 O
+ATOM 1349 N LYS A 193 -37.632 -16.351 41.382 1.00 40.00 N
+ATOM 1350 CA LYS A 193 -37.067 -16.235 42.716 1.00 40.00 C
+ATOM 1351 C LYS A 193 -35.578 -16.517 42.586 1.00 40.00 C
+ATOM 1352 O LYS A 193 -35.160 -17.556 42.064 1.00 40.00 O
+ATOM 1353 CB LYS A 193 -37.739 -17.189 43.706 1.00 40.00 C
+ATOM 1354 CG LYS A 193 -39.248 -17.018 43.822 1.00 40.00 C
+ATOM 1355 CD LYS A 193 -39.896 -18.271 44.398 1.00 40.00 C
+ATOM 1356 CE LYS A 193 -39.597 -19.530 43.581 1.00 40.00 C
+ATOM 1357 NZ LYS A 193 -40.161 -19.482 42.194 1.00 40.00 N
+ATOM 1358 N PHE A 194 -34.786 -15.550 43.027 1.00 40.00 N
+ATOM 1359 CA PHE A 194 -33.336 -15.647 43.003 1.00 40.00 C
+ATOM 1360 C PHE A 194 -32.839 -16.492 44.187 1.00 40.00 C
+ATOM 1361 O PHE A 194 -33.509 -16.589 45.216 1.00 40.00 O
+ATOM 1362 CB PHE A 194 -32.735 -14.234 43.027 1.00 40.00 C
+ATOM 1363 CG PHE A 194 -31.242 -14.211 42.988 1.00 40.00 C
+ATOM 1364 CD1 PHE A 194 -30.561 -14.520 41.815 1.00 40.00 C
+ATOM 1365 CD2 PHE A 194 -30.515 -13.886 44.127 1.00 40.00 C
+ATOM 1366 CE1 PHE A 194 -29.178 -14.510 41.782 1.00 40.00 C
+ATOM 1367 CE2 PHE A 194 -29.131 -13.866 44.103 1.00 40.00 C
+ATOM 1368 CZ PHE A 194 -28.461 -14.176 42.926 1.00 40.00 C
+ATOM 1369 N ASN A 195 -31.678 -17.121 44.035 1.00 40.00 N
+ATOM 1370 CA ASN A 195 -31.084 -17.861 45.126 1.00 40.00 C
+ATOM 1371 C ASN A 195 -29.640 -18.233 44.826 1.00 40.00 C
+ATOM 1372 O ASN A 195 -29.204 -19.354 45.068 1.00 40.00 O
+ATOM 1373 CB ASN A 195 -31.923 -19.099 45.442 1.00 40.00 C
+ATOM 1374 CG ASN A 195 -31.707 -19.606 46.855 1.00 40.00 C
+ATOM 1375 OD1 ASN A 195 -31.873 -20.802 47.144 1.00 40.00 O
+ATOM 1376 ND2 ASN A 195 -31.330 -18.697 47.749 1.00 40.00 N
+ATOM 1377 N GLY A 196 -28.901 -17.285 44.273 1.00 40.00 N
+ATOM 1378 CA GLY A 196 -27.467 -17.455 44.073 1.00 40.00 C
+ATOM 1379 C GLY A 196 -26.718 -16.521 45.006 1.00 40.00 C
+ATOM 1380 O GLY A 196 -27.026 -16.439 46.205 1.00 40.00 O
+ATOM 1381 N LEU A 197 -25.741 -15.803 44.454 1.00 40.00 N
+ATOM 1382 CA LEU A 197 -25.001 -14.805 45.216 1.00 40.00 C
+ATOM 1383 C LEU A 197 -24.844 -13.486 44.470 1.00 40.00 C
+ATOM 1384 O LEU A 197 -24.182 -13.425 43.430 1.00 40.00 O
+ATOM 1385 CB LEU A 197 -23.627 -15.340 45.582 1.00 40.00 C
+ATOM 1386 CG LEU A 197 -22.745 -14.288 46.248 1.00 40.00 C
+ATOM 1387 CD1 LEU A 197 -23.057 -14.173 47.735 1.00 40.00 C
+ATOM 1388 CD2 LEU A 197 -21.284 -14.619 46.015 1.00 40.00 C
+ATOM 1389 N GLY A 198 -25.440 -12.432 45.018 1.00 40.00 N
+ATOM 1390 CA GLY A 198 -25.305 -11.104 44.440 1.00 40.00 C
+ATOM 1391 C GLY A 198 -24.190 -10.298 45.084 1.00 40.00 C
+ATOM 1392 O GLY A 198 -24.344 -9.800 46.200 1.00 40.00 O
+ATOM 1393 N TRP A 199 -23.064 -10.169 44.385 1.00 40.00 N
+ATOM 1394 CA TRP A 199 -21.941 -9.382 44.886 1.00 40.00 C
+ATOM 1395 C TRP A 199 -21.843 -8.076 44.161 1.00 40.00 C
+ATOM 1396 O TRP A 199 -21.849 -8.043 42.925 1.00 40.00 O
+ATOM 1397 CB TRP A 199 -20.639 -10.146 44.725 1.00 40.00 C
+ATOM 1398 CG TRP A 199 -19.601 -9.819 45.772 1.00 40.00 C
+ATOM 1399 CD1 TRP A 199 -19.549 -8.704 46.601 1.00 40.00 C
+ATOM 1400 CD2 TRP A 199 -18.403 -10.606 46.118 1.00 40.00 C
+ATOM 1401 NE1 TRP A 199 -18.453 -8.756 47.421 1.00 40.00 N
+ATOM 1402 CE2 TRP A 199 -17.724 -9.869 47.178 1.00 40.00 C
+ATOM 1403 CE3 TRP A 199 -17.853 -11.811 45.675 1.00 40.00 C
+ATOM 1404 CZ2 TRP A 199 -16.549 -10.333 47.755 1.00 40.00 C
+ATOM 1405 CZ3 TRP A 199 -16.668 -12.271 46.267 1.00 40.00 C
+ATOM 1406 CH2 TRP A 199 -16.033 -11.549 47.282 1.00 40.00 C
+ATOM 1407 N LEU A 200 -21.745 -6.989 44.922 1.00 40.00 N
+ATOM 1408 CA LEU A 200 -21.708 -5.662 44.342 1.00 40.00 C
+ATOM 1409 C LEU A 200 -20.494 -4.892 44.774 1.00 40.00 C
+ATOM 1410 O LEU A 200 -20.218 -4.785 45.961 1.00 40.00 O
+ATOM 1411 CB LEU A 200 -22.951 -4.868 44.729 1.00 40.00 C
+ATOM 1412 CG LEU A 200 -22.899 -3.357 44.467 1.00 40.00 C
+ATOM 1413 CD1 LEU A 200 -22.604 -3.017 43.015 1.00 40.00 C
+ATOM 1414 CD2 LEU A 200 -24.198 -2.711 44.901 1.00 40.00 C
+ATOM 1415 N PHE A 201 -19.795 -4.330 43.796 1.00 40.00 N
+ATOM 1416 CA PHE A 201 -18.699 -3.401 44.043 1.00 40.00 C
+ATOM 1417 C PHE A 201 -19.060 -2.019 43.493 1.00 40.00 C
+ATOM 1418 O PHE A 201 -19.343 -1.874 42.302 1.00 40.00 O
+ATOM 1419 CB PHE A 201 -17.404 -3.936 43.412 1.00 40.00 C
+ATOM 1420 CG PHE A 201 -16.817 -5.124 44.137 1.00 40.00 C
+ATOM 1421 CD1 PHE A 201 -17.472 -6.354 44.161 1.00 40.00 C
+ATOM 1422 CD2 PHE A 201 -15.600 -5.011 44.804 1.00 40.00 C
+ATOM 1423 CE1 PHE A 201 -16.926 -7.439 44.837 1.00 40.00 C
+ATOM 1424 CE2 PHE A 201 -15.049 -6.094 45.481 1.00 40.00 C
+ATOM 1425 CZ PHE A 201 -15.712 -7.308 45.495 1.00 40.00 C
+ATOM 1426 N LEU A 202 -19.081 -1.012 44.362 1.00 40.00 N
+ATOM 1427 CA LEU A 202 -19.356 0.348 43.915 1.00 40.00 C
+ATOM 1428 C LEU A 202 -18.323 1.363 44.359 1.00 40.00 C
+ATOM 1429 O LEU A 202 -18.145 1.606 45.548 1.00 40.00 O
+ATOM 1430 CB LEU A 202 -20.732 0.818 44.351 1.00 40.00 C
+ATOM 1431 CG LEU A 202 -20.907 2.333 44.162 1.00 40.00 C
+ATOM 1432 CD1 LEU A 202 -21.056 2.749 42.701 1.00 40.00 C
+ATOM 1433 CD2 LEU A 202 -22.085 2.826 44.977 1.00 40.00 C
+ATOM 1434 N GLY A 203 -17.688 1.989 43.377 1.00 40.00 N
+ATOM 1435 CA GLY A 203 -16.596 2.912 43.622 1.00 40.00 C
+ATOM 1436 C GLY A 203 -17.015 4.335 43.367 1.00 40.00 C
+ATOM 1437 O GLY A 203 -17.647 4.631 42.347 1.00 40.00 O
+ATOM 1438 N VAL A 204 -16.654 5.207 44.308 1.00 40.00 N
+ATOM 1439 CA VAL A 204 -16.982 6.638 44.261 1.00 40.00 C
+ATOM 1440 C VAL A 204 -15.888 7.537 44.858 1.00 40.00 C
+ATOM 1441 O VAL A 204 -14.970 7.041 45.526 1.00 40.00 O
+ATOM 1442 CB VAL A 204 -18.310 6.950 44.998 1.00 40.00 C
+ATOM 1443 CG1 VAL A 204 -19.514 6.676 44.101 1.00 40.00 C
+ATOM 1444 CG2 VAL A 204 -18.390 6.202 46.325 1.00 40.00 C
+ATOM 1445 N PRO A 205 -15.989 8.866 44.613 1.00 40.00 N
+ATOM 1446 CA PRO A 205 -15.120 9.837 45.278 1.00 40.00 C
+ATOM 1447 C PRO A 205 -15.268 9.916 46.814 1.00 40.00 C
+ATOM 1448 O PRO A 205 -14.289 9.735 47.535 1.00 40.00 O
+ATOM 1449 CB PRO A 205 -15.518 11.179 44.617 1.00 40.00 C
+ATOM 1450 CG PRO A 205 -16.813 10.933 43.903 1.00 40.00 C
+ATOM 1451 CD PRO A 205 -16.745 9.493 43.503 1.00 40.00 C
+ATOM 1452 N THR A 206 -16.478 10.178 47.297 1.00 40.00 N
+ATOM 1453 CA THR A 206 -16.685 10.568 48.689 1.00 40.00 C
+ATOM 1454 C THR A 206 -17.681 9.641 49.358 1.00 40.00 C
+ATOM 1455 O THR A 206 -18.304 8.828 48.696 1.00 40.00 O
+ATOM 1456 CB THR A 206 -17.222 12.022 48.791 1.00 40.00 C
+ATOM 1457 OG1 THR A 206 -18.350 12.190 47.921 1.00 40.00 O
+ATOM 1458 CG2 THR A 206 -16.152 13.053 48.412 1.00 40.00 C
+ATOM 1459 N SER A 207 -17.823 9.758 50.674 1.00 40.00 N
+ATOM 1460 CA SER A 207 -18.925 9.108 51.374 1.00 40.00 C
+ATOM 1461 C SER A 207 -20.210 9.890 51.163 1.00 40.00 C
+ATOM 1462 O SER A 207 -21.279 9.429 51.552 1.00 40.00 O
+ATOM 1463 CB SER A 207 -18.637 8.974 52.868 1.00 40.00 C
+ATOM 1464 OG SER A 207 -17.909 7.786 53.146 1.00 40.00 O
+ATOM 1465 N SER A 208 -20.089 11.073 50.556 1.00 40.00 N
+ATOM 1466 CA SER A 208 -21.235 11.913 50.171 1.00 40.00 C
+ATOM 1467 C SER A 208 -21.745 11.619 48.749 1.00 40.00 C
+ATOM 1468 O SER A 208 -22.867 12.000 48.396 1.00 40.00 O
+ATOM 1469 CB SER A 208 -20.900 13.405 50.313 1.00 40.00 C
+ATOM 1470 OG SER A 208 -19.921 13.819 49.373 1.00 40.00 O
+ATOM 1471 N SER A 209 -20.916 10.955 47.939 1.00 40.00 N
+ATOM 1472 CA SER A 209 -21.310 10.485 46.595 1.00 40.00 C
+ATOM 1473 C SER A 209 -21.835 9.021 46.607 1.00 40.00 C
+ATOM 1474 O SER A 209 -22.129 8.444 45.554 1.00 40.00 O
+ATOM 1475 CB SER A 209 -20.139 10.620 45.597 1.00 40.00 C
+ATOM 1476 OG SER A 209 -19.661 11.949 45.489 1.00 40.00 O
+ATOM 1477 N LEU A 210 -21.965 8.438 47.797 1.00 40.00 N
+ATOM 1478 CA LEU A 210 -22.286 7.027 47.947 1.00 40.00 C
+ATOM 1479 C LEU A 210 -23.788 6.758 47.786 1.00 40.00 C
+ATOM 1480 O LEU A 210 -24.528 6.776 48.772 1.00 40.00 O
+ATOM 1481 CB LEU A 210 -21.807 6.579 49.321 1.00 40.00 C
+ATOM 1482 CG LEU A 210 -21.345 5.146 49.534 1.00 40.00 C
+ATOM 1483 CD1 LEU A 210 -20.037 4.862 48.806 1.00 40.00 C
+ATOM 1484 CD2 LEU A 210 -21.198 4.942 51.035 1.00 40.00 C
+ATOM 1485 N LEU A 211 -24.227 6.483 46.555 1.00 40.00 N
+ATOM 1486 CA LEU A 211 -25.658 6.410 46.215 1.00 40.00 C
+ATOM 1487 C LEU A 211 -26.446 5.237 46.859 1.00 40.00 C
+ATOM 1488 O LEU A 211 -25.908 4.160 47.082 1.00 40.00 O
+ATOM 1489 CB LEU A 211 -25.823 6.424 44.690 1.00 40.00 C
+ATOM 1490 CG LEU A 211 -24.971 7.372 43.831 1.00 40.00 C
+ATOM 1491 CD1 LEU A 211 -25.086 6.992 42.370 1.00 40.00 C
+ATOM 1492 CD2 LEU A 211 -25.331 8.838 43.997 1.00 40.00 C
+ATOM 1493 N TYR A 212 -27.709 5.486 47.194 1.00 40.00 N
+ATOM 1494 CA TYR A 212 -28.674 4.449 47.591 1.00 40.00 C
+ATOM 1495 C TYR A 212 -28.276 3.519 48.735 1.00 40.00 C
+ATOM 1496 O TYR A 212 -28.945 2.514 48.956 1.00 40.00 O
+ATOM 1497 CB TYR A 212 -29.064 3.587 46.378 1.00 40.00 C
+ATOM 1498 CG TYR A 212 -29.405 4.350 45.104 1.00 40.00 C
+ATOM 1499 CD1 TYR A 212 -30.723 4.713 44.807 1.00 40.00 C
+ATOM 1500 CD2 TYR A 212 -28.413 4.678 44.180 1.00 40.00 C
+ATOM 1501 CE1 TYR A 212 -31.031 5.401 43.643 1.00 40.00 C
+ATOM 1502 CE2 TYR A 212 -28.708 5.367 43.015 1.00 40.00 C
+ATOM 1503 CZ TYR A 212 -30.013 5.726 42.749 1.00 40.00 C
+ATOM 1504 OH TYR A 212 -30.284 6.412 41.582 1.00 40.00 O
+ATOM 1505 N LYS A 213 -27.215 3.856 49.463 1.00 40.00 N
+ATOM 1506 CA LYS A 213 -26.605 2.952 50.469 1.00 40.00 C
+ATOM 1507 C LYS A 213 -27.572 2.268 51.483 1.00 40.00 C
+ATOM 1508 O LYS A 213 -27.448 1.060 51.756 1.00 40.00 O
+ATOM 1509 CB LYS A 213 -25.441 3.669 51.184 1.00 40.00 C
+ATOM 1510 CG LYS A 213 -24.832 2.963 52.398 1.00 40.00 C
+ATOM 1511 CD LYS A 213 -24.096 3.974 53.280 1.00 40.00 C
+ATOM 1512 CE LYS A 213 -23.843 3.473 54.696 1.00 40.00 C
+ATOM 1513 NZ LYS A 213 -22.624 2.627 54.814 1.00 40.00 N
+ATOM 1514 N GLU A 214 -28.522 3.039 52.022 1.00 40.00 N
+ATOM 1515 CA GLU A 214 -29.479 2.553 53.036 1.00 40.00 C
+ATOM 1516 C GLU A 214 -30.404 1.516 52.429 1.00 40.00 C
+ATOM 1517 O GLU A 214 -30.997 0.713 53.140 1.00 40.00 O
+ATOM 1518 CB GLU A 214 -30.344 3.682 53.632 1.00 40.00 C
+ATOM 1519 CG GLU A 214 -29.854 5.109 53.424 1.00 40.00 C
+ATOM 1520 CD GLU A 214 -29.645 5.459 51.958 1.00 40.00 C
+ATOM 1521 OE1 GLU A 214 -30.340 4.896 51.077 1.00 40.00 O
+ATOM 1522 OE2 GLU A 214 -28.759 6.292 51.684 1.00 40.00 O
+ATOM 1523 N GLU A 215 -30.550 1.559 51.111 1.00 40.00 N
+ATOM 1524 CA GLU A 215 -31.352 0.576 50.425 1.00 40.00 C
+ATOM 1525 C GLU A 215 -30.596 -0.732 50.453 1.00 40.00 C
+ATOM 1526 O GLU A 215 -31.072 -1.713 51.022 1.00 40.00 O
+ATOM 1527 CB GLU A 215 -31.652 1.023 49.002 1.00 40.00 C
+ATOM 1528 CG GLU A 215 -32.550 2.247 48.954 1.00 40.00 C
+ATOM 1529 CD GLU A 215 -32.960 2.613 47.550 1.00 40.00 C
+ATOM 1530 OE1 GLU A 215 -32.902 1.742 46.661 1.00 40.00 O
+ATOM 1531 OE2 GLU A 215 -33.349 3.779 47.339 1.00 40.00 O
+ATOM 1532 N PHE A 216 -29.393 -0.727 49.887 1.00 40.00 N
+ATOM 1533 CA PHE A 216 -28.559 -1.920 49.871 1.00 40.00 C
+ATOM 1534 C PHE A 216 -28.381 -2.455 51.277 1.00 40.00 C
+ATOM 1535 O PHE A 216 -28.292 -3.665 51.485 1.00 40.00 O
+ATOM 1536 CB PHE A 216 -27.200 -1.626 49.257 1.00 40.00 C
+ATOM 1537 CG PHE A 216 -27.274 -0.936 47.931 1.00 40.00 C
+ATOM 1538 CD1 PHE A 216 -27.761 -1.595 46.814 1.00 40.00 C
+ATOM 1539 CD2 PHE A 216 -26.845 0.376 47.794 1.00 40.00 C
+ATOM 1540 CE1 PHE A 216 -27.825 -0.955 45.585 1.00 40.00 C
+ATOM 1541 CE2 PHE A 216 -26.900 1.019 46.569 1.00 40.00 C
+ATOM 1542 CZ PHE A 216 -27.391 0.354 45.461 1.00 40.00 C
+ATOM 1543 N GLY A 217 -28.331 -1.544 52.239 1.00 40.00 N
+ATOM 1544 CA GLY A 217 -28.376 -1.933 53.630 1.00 40.00 C
+ATOM 1545 C GLY A 217 -29.563 -2.849 53.858 1.00 40.00 C
+ATOM 1546 O GLY A 217 -29.391 -4.018 54.214 1.00 40.00 O
+ATOM 1547 N LYS A 218 -30.765 -2.325 53.612 1.00 40.00 N
+ATOM 1548 CA LYS A 218 -32.014 -3.035 53.899 1.00 40.00 C
+ATOM 1549 C LYS A 218 -32.033 -4.391 53.233 1.00 40.00 C
+ATOM 1550 O LYS A 218 -32.654 -5.320 53.730 1.00 40.00 O
+ATOM 1551 CB LYS A 218 -33.234 -2.204 53.484 1.00 40.00 C
+ATOM 1552 CG LYS A 218 -33.508 -1.019 54.412 1.00 40.00 C
+ATOM 1553 CD LYS A 218 -34.755 -0.213 54.053 1.00 40.00 C
+ATOM 1554 CE LYS A 218 -34.466 0.952 53.109 1.00 40.00 C
+ATOM 1555 NZ LYS A 218 -35.689 1.772 52.869 1.00 40.00 N
+ATOM 1556 N MET A 219 -31.313 -4.501 52.123 1.00 40.00 N
+ATOM 1557 CA MET A 219 -31.187 -5.759 51.394 1.00 40.00 C
+ATOM 1558 C MET A 219 -30.257 -6.715 52.110 1.00 40.00 C
+ATOM 1559 O MET A 219 -30.664 -7.813 52.486 1.00 40.00 O
+ATOM 1560 CB MET A 219 -30.666 -5.503 49.986 1.00 40.00 C
+ATOM 1561 CG MET A 219 -31.499 -4.500 49.219 1.00 40.00 C
+ATOM 1562 SD MET A 219 -31.269 -4.665 47.449 1.00 40.00 S
+ATOM 1563 CE MET A 219 -32.434 -3.439 46.849 1.00 40.00 C
+ATOM 1564 N LYS A 220 -29.009 -6.278 52.285 1.00 40.00 N
+ATOM 1565 CA LYS A 220 -28.010 -7.009 53.056 1.00 40.00 C
+ATOM 1566 C LYS A 220 -28.624 -7.451 54.365 1.00 40.00 C
+ATOM 1567 O LYS A 220 -28.229 -8.468 54.931 1.00 40.00 O
+ATOM 1568 CB LYS A 220 -26.777 -6.133 53.334 1.00 40.00 C
+ATOM 1569 CG LYS A 220 -25.688 -6.776 54.193 1.00 40.00 C
+ATOM 1570 CD LYS A 220 -25.117 -8.007 53.517 1.00 40.00 C
+ATOM 1571 CE LYS A 220 -24.068 -8.675 54.376 1.00 40.00 C
+ATOM 1572 NZ LYS A 220 -23.592 -9.900 53.678 1.00 40.00 N
+ATOM 1573 N GLU A 221 -29.603 -6.686 54.831 1.00 40.00 N
+ATOM 1574 CA GLU A 221 -30.260 -6.993 56.077 1.00 40.00 C
+ATOM 1575 C GLU A 221 -31.314 -8.096 55.940 1.00 40.00 C
+ATOM 1576 O GLU A 221 -31.514 -8.889 56.875 1.00 40.00 O
+ATOM 1577 CB GLU A 221 -30.867 -5.738 56.666 1.00 40.00 C
+ATOM 1578 CG GLU A 221 -31.057 -5.839 58.160 1.00 40.00 C
+ATOM 1579 CD GLU A 221 -32.118 -4.892 58.654 1.00 40.00 C
+ATOM 1580 OE1 GLU A 221 -32.139 -3.737 58.177 1.00 40.00 O
+ATOM 1581 OE2 GLU A 221 -32.930 -5.301 59.513 1.00 40.00 O
+ATOM 1582 N ARG A 222 -31.983 -8.164 54.791 1.00 40.00 N
+ATOM 1583 CA ARG A 222 -32.971 -9.222 54.591 1.00 40.00 C
+ATOM 1584 C ARG A 222 -32.480 -10.386 53.733 1.00 40.00 C
+ATOM 1585 O ARG A 222 -33.196 -11.366 53.568 1.00 40.00 O
+ATOM 1586 CB ARG A 222 -34.301 -8.669 54.090 1.00 40.00 C
+ATOM 1587 CG ARG A 222 -34.164 -7.635 53.000 1.00 40.00 C
+ATOM 1588 CD ARG A 222 -35.456 -6.860 52.895 1.00 40.00 C
+ATOM 1589 NE ARG A 222 -36.524 -7.716 52.387 1.00 40.00 N
+ATOM 1590 CZ ARG A 222 -37.757 -7.302 52.097 1.00 40.00 C
+ATOM 1591 NH1 ARG A 222 -38.101 -6.025 52.277 1.00 40.00 N
+ATOM 1592 NH2 ARG A 222 -38.652 -8.171 51.625 1.00 40.00 N
+ATOM 1593 N ALA A 223 -31.262 -10.290 53.204 1.00 40.00 N
+ATOM 1594 CA ALA A 223 -30.637 -11.435 52.533 1.00 40.00 C
+ATOM 1595 C ALA A 223 -29.128 -11.479 52.745 1.00 40.00 C
+ATOM 1596 O ALA A 223 -28.356 -11.283 51.805 1.00 40.00 O
+ATOM 1597 CB ALA A 223 -30.966 -11.437 51.056 1.00 40.00 C
+ATOM 1598 N PRO A 224 -28.707 -11.758 53.986 1.00 40.00 N
+ATOM 1599 CA PRO A 224 -27.305 -11.668 54.373 1.00 40.00 C
+ATOM 1600 C PRO A 224 -26.340 -12.503 53.515 1.00 40.00 C
+ATOM 1601 O PRO A 224 -25.296 -11.985 53.109 1.00 40.00 O
+ATOM 1602 CB PRO A 224 -27.306 -12.142 55.836 1.00 40.00 C
+ATOM 1603 CG PRO A 224 -28.593 -12.858 56.024 1.00 40.00 C
+ATOM 1604 CD PRO A 224 -29.559 -12.193 55.105 1.00 40.00 C
+ATOM 1605 N GLU A 225 -26.681 -13.764 53.235 1.00 40.00 N
+ATOM 1606 CA GLU A 225 -25.782 -14.660 52.480 1.00 40.00 C
+ATOM 1607 C GLU A 225 -25.941 -14.552 50.960 1.00 40.00 C
+ATOM 1608 O GLU A 225 -25.012 -14.894 50.215 1.00 40.00 O
+ATOM 1609 CB GLU A 225 -25.928 -16.120 52.927 1.00 40.00 C
+ATOM 1610 CG GLU A 225 -27.322 -16.710 52.744 1.00 40.00 C
+ATOM 1611 CD GLU A 225 -28.098 -16.815 54.046 1.00 40.00 C
+ATOM 1612 OE1 GLU A 225 -28.088 -15.849 54.845 1.00 40.00 O
+ATOM 1613 OE2 GLU A 225 -28.725 -17.876 54.269 1.00 40.00 O
+ATOM 1614 N ASN A 226 -27.114 -14.073 50.521 1.00 40.00 N
+ATOM 1615 CA ASN A 226 -27.470 -13.925 49.090 1.00 40.00 C
+ATOM 1616 C ASN A 226 -27.034 -12.602 48.471 1.00 40.00 C
+ATOM 1617 O ASN A 226 -27.124 -12.393 47.255 1.00 40.00 O
+ATOM 1618 CB ASN A 226 -28.975 -14.084 48.921 1.00 40.00 C
+ATOM 1619 CG ASN A 226 -29.481 -15.365 49.527 1.00 40.00 C
+ATOM 1620 OD1 ASN A 226 -29.251 -16.453 48.987 1.00 40.00 O
+ATOM 1621 ND2 ASN A 226 -30.154 -15.250 50.671 1.00 40.00 N
+ATOM 1622 N PHE A 227 -26.562 -11.719 49.340 1.00 40.00 N
+ATOM 1623 CA PHE A 227 -26.097 -10.412 48.955 1.00 40.00 C
+ATOM 1624 C PHE A 227 -24.800 -10.078 49.674 1.00 40.00 C
+ATOM 1625 O PHE A 227 -24.652 -10.328 50.879 1.00 40.00 O
+ATOM 1626 CB PHE A 227 -27.157 -9.375 49.295 1.00 40.00 C
+ATOM 1627 CG PHE A 227 -26.880 -8.011 48.735 1.00 40.00 C
+ATOM 1628 CD1 PHE A 227 -26.245 -7.858 47.498 1.00 40.00 C
+ATOM 1629 CD2 PHE A 227 -27.293 -6.875 49.425 1.00 40.00 C
+ATOM 1630 CE1 PHE A 227 -26.000 -6.600 46.977 1.00 40.00 C
+ATOM 1631 CE2 PHE A 227 -27.062 -5.611 48.905 1.00 40.00 C
+ATOM 1632 CZ PHE A 227 -26.413 -5.472 47.680 1.00 40.00 C
+ATOM 1633 N ARG A 228 -23.864 -9.522 48.909 1.00 40.00 N
+ATOM 1634 CA ARG A 228 -22.584 -9.059 49.423 1.00 40.00 C
+ATOM 1635 C ARG A 228 -22.272 -7.732 48.757 1.00 40.00 C
+ATOM 1636 O ARG A 228 -22.294 -7.626 47.537 1.00 40.00 O
+ATOM 1637 CB ARG A 228 -21.477 -10.086 49.144 1.00 40.00 C
+ATOM 1638 CG ARG A 228 -21.620 -11.404 49.909 1.00 40.00 C
+ATOM 1639 CD ARG A 228 -20.396 -12.290 49.734 1.00 40.00 C
+ATOM 1640 NE ARG A 228 -19.180 -11.627 50.216 1.00 40.00 N
+ATOM 1641 CZ ARG A 228 -17.948 -12.142 50.157 1.00 40.00 C
+ATOM 1642 NH1 ARG A 228 -17.728 -13.352 49.626 1.00 40.00 N
+ATOM 1643 NH2 ARG A 228 -16.925 -11.436 50.633 1.00 40.00 N
+ATOM 1644 N VAL A 229 -22.021 -6.708 49.557 1.00 40.00 N
+ATOM 1645 CA VAL A 229 -21.687 -5.419 48.996 1.00 40.00 C
+ATOM 1646 C VAL A 229 -20.295 -5.054 49.403 1.00 40.00 C
+ATOM 1647 O VAL A 229 -19.782 -5.530 50.416 1.00 40.00 O
+ATOM 1648 CB VAL A 229 -22.580 -4.289 49.509 1.00 40.00 C
+ATOM 1649 CG1 VAL A 229 -22.712 -3.220 48.439 1.00 40.00 C
+ATOM 1650 CG2 VAL A 229 -23.938 -4.815 49.931 1.00 40.00 C
+ATOM 1651 N ASP A 230 -19.700 -4.188 48.601 1.00 40.00 N
+ATOM 1652 CA ASP A 230 -18.407 -3.619 48.879 1.00 40.00 C
+ATOM 1653 C ASP A 230 -18.415 -2.248 48.233 1.00 40.00 C
+ATOM 1654 O ASP A 230 -18.835 -2.102 47.085 1.00 40.00 O
+ATOM 1655 CB ASP A 230 -17.298 -4.490 48.279 1.00 40.00 C
+ATOM 1656 CG ASP A 230 -16.973 -5.704 49.136 1.00 40.00 C
+ATOM 1657 OD1 ASP A 230 -16.034 -5.598 49.948 1.00 40.00 O
+ATOM 1658 OD2 ASP A 230 -17.648 -6.752 49.015 1.00 40.00 O
+ATOM 1659 N TYR A 231 -17.982 -1.234 48.966 1.00 40.00 N
+ATOM 1660 CA TYR A 231 -17.850 0.083 48.370 1.00 40.00 C
+ATOM 1661 C TYR A 231 -16.393 0.463 48.281 1.00 40.00 C
+ATOM 1662 O TYR A 231 -15.554 -0.159 48.918 1.00 40.00 O
+ATOM 1663 CB TYR A 231 -18.571 1.102 49.200 1.00 40.00 C
+ATOM 1664 CG TYR A 231 -19.999 0.764 49.485 1.00 40.00 C
+ATOM 1665 CD1 TYR A 231 -20.342 -0.075 50.543 1.00 40.00 C
+ATOM 1666 CD2 TYR A 231 -21.017 1.318 48.725 1.00 40.00 C
+ATOM 1667 CE1 TYR A 231 -21.667 -0.360 50.825 1.00 40.00 C
+ATOM 1668 CE2 TYR A 231 -22.346 1.044 49.000 1.00 40.00 C
+ATOM 1669 CZ TYR A 231 -22.666 0.205 50.050 1.00 40.00 C
+ATOM 1670 OH TYR A 231 -23.986 -0.065 50.331 1.00 40.00 O
+ATOM 1671 N ALA A 232 -16.088 1.480 47.485 1.00 40.00 N
+ATOM 1672 CA ALA A 232 -14.719 1.959 47.359 1.00 40.00 C
+ATOM 1673 C ALA A 232 -14.712 3.481 47.249 1.00 40.00 C
+ATOM 1674 O ALA A 232 -14.956 4.045 46.177 1.00 40.00 O
+ATOM 1675 CB ALA A 232 -14.020 1.311 46.171 1.00 40.00 C
+ATOM 1676 N VAL A 233 -14.452 4.139 48.375 1.00 40.00 N
+ATOM 1677 CA VAL A 233 -14.387 5.593 48.420 1.00 40.00 C
+ATOM 1678 C VAL A 233 -12.940 6.018 48.170 1.00 40.00 C
+ATOM 1679 O VAL A 233 -12.092 5.940 49.065 1.00 40.00 O
+ATOM 1680 CB VAL A 233 -14.890 6.143 49.768 1.00 40.00 C
+ATOM 1681 CG1 VAL A 233 -15.344 7.574 49.603 1.00 40.00 C
+ATOM 1682 CG2 VAL A 233 -16.033 5.301 50.309 1.00 40.00 C
+ATOM 1683 N SER A 234 -12.660 6.453 46.944 1.00 40.00 N
+ATOM 1684 CA SER A 234 -11.289 6.780 46.530 1.00 40.00 C
+ATOM 1685 C SER A 234 -10.607 7.838 47.424 1.00 40.00 C
+ATOM 1686 O SER A 234 -9.396 7.754 47.685 1.00 40.00 O
+ATOM 1687 CB SER A 234 -11.255 7.177 45.046 1.00 40.00 C
+ATOM 1688 OG SER A 234 -11.900 8.418 44.799 1.00 40.00 O
+ATOM 1689 N ARG A 235 -11.404 8.794 47.917 1.00 40.00 N
+ATOM 1690 CA ARG A 235 -10.918 9.949 48.687 1.00 40.00 C
+ATOM 1691 C ARG A 235 -11.096 9.871 50.200 1.00 40.00 C
+ATOM 1692 O ARG A 235 -11.116 10.918 50.862 1.00 40.00 O
+ATOM 1693 CB ARG A 235 -11.632 11.209 48.232 1.00 40.00 C
+ATOM 1694 CG ARG A 235 -11.318 11.648 46.835 1.00 40.00 C
+ATOM 1695 CD ARG A 235 -11.957 12.997 46.690 1.00 40.00 C
+ATOM 1696 NE ARG A 235 -11.945 13.453 45.316 1.00 40.00 N
+ATOM 1697 CZ ARG A 235 -12.796 14.350 44.829 1.00 40.00 C
+ATOM 1698 NH1 ARG A 235 -13.742 14.873 45.610 1.00 40.00 N
+ATOM 1699 NH2 ARG A 235 -12.710 14.718 43.556 1.00 40.00 N
+ATOM 1700 N GLU A 236 -11.238 8.660 50.746 1.00 40.00 N
+ATOM 1701 CA GLU A 236 -11.512 8.488 52.176 1.00 40.00 C
+ATOM 1702 C GLU A 236 -11.080 7.147 52.705 1.00 40.00 C
+ATOM 1703 O GLU A 236 -11.354 6.799 53.852 1.00 40.00 O
+ATOM 1704 CB GLU A 236 -12.993 8.654 52.465 1.00 40.00 C
+ATOM 1705 CG GLU A 236 -13.464 10.092 52.463 1.00 40.00 C
+ATOM 1706 CD GLU A 236 -14.932 10.191 52.757 1.00 40.00 C
+ATOM 1707 OE1 GLU A 236 -15.373 9.527 53.725 1.00 40.00 O
+ATOM 1708 OE2 GLU A 236 -15.633 10.922 52.020 1.00 40.00 O
+ATOM 1709 N GLN A 237 -10.435 6.375 51.849 1.00 40.00 N
+ATOM 1710 CA GLN A 237 -9.888 5.092 52.244 1.00 40.00 C
+ATOM 1711 C GLN A 237 -8.631 4.851 51.429 1.00 40.00 C
+ATOM 1712 O GLN A 237 -8.480 5.381 50.319 1.00 40.00 O
+ATOM 1713 CB GLN A 237 -10.882 3.950 51.988 1.00 40.00 C
+ATOM 1714 CG GLN A 237 -12.212 4.036 52.720 1.00 40.00 C
+ATOM 1715 CD GLN A 237 -13.285 3.197 52.056 1.00 40.00 C
+ATOM 1716 OE1 GLN A 237 -13.250 2.955 50.849 1.00 40.00 O
+ATOM 1717 NE2 GLN A 237 -14.249 2.751 52.843 1.00 40.00 N
+ATOM 1718 N THR A 238 -7.720 4.075 52.005 1.00 40.00 N
+ATOM 1719 CA THR A 238 -6.615 3.488 51.262 1.00 40.00 C
+ATOM 1720 C THR A 238 -6.430 2.047 51.743 1.00 40.00 C
+ATOM 1721 O THR A 238 -7.001 1.637 52.766 1.00 40.00 O
+ATOM 1722 CB THR A 238 -5.293 4.290 51.380 1.00 40.00 C
+ATOM 1723 OG1 THR A 238 -4.833 4.265 52.730 1.00 40.00 O
+ATOM 1724 CG2 THR A 238 -5.450 5.752 50.914 1.00 40.00 C
+ATOM 1725 N ASN A 239 -5.656 1.277 50.983 1.00 40.00 N
+ATOM 1726 CA ASN A 239 -5.400 -0.120 51.313 1.00 40.00 C
+ATOM 1727 C ASN A 239 -4.243 -0.263 52.295 1.00 40.00 C
+ATOM 1728 O ASN A 239 -3.701 0.753 52.772 1.00 40.00 O
+ATOM 1729 CB ASN A 239 -5.166 -0.965 50.041 1.00 40.00 C
+ATOM 1730 CG ASN A 239 -4.091 -0.390 49.119 1.00 40.00 C
+ATOM 1731 OD1 ASN A 239 -3.859 0.815 49.079 1.00 40.00 O
+ATOM 1732 ND2 ASN A 239 -3.445 -1.266 48.355 1.00 40.00 N
+ATOM 1733 N ALA A 240 -3.885 -1.519 52.600 1.00 40.00 N
+ATOM 1734 CA ALA A 240 -2.667 -1.830 53.349 1.00 40.00 C
+ATOM 1735 C ALA A 240 -1.430 -1.258 52.637 1.00 40.00 C
+ATOM 1736 O ALA A 240 -0.485 -0.809 53.291 1.00 40.00 O
+ATOM 1737 CB ALA A 240 -2.531 -3.324 53.563 1.00 40.00 C
+ATOM 1738 N ALA A 241 -1.459 -1.237 51.306 1.00 40.00 N
+ATOM 1739 CA ALA A 241 -0.391 -0.616 50.521 1.00 40.00 C
+ATOM 1740 C ALA A 241 -0.400 0.954 50.457 1.00 40.00 C
+ATOM 1741 O ALA A 241 0.414 1.565 49.752 1.00 40.00 O
+ATOM 1742 CB ALA A 241 -0.351 -1.244 49.137 1.00 40.00 C
+ATOM 1743 N GLY A 242 -1.297 1.597 51.206 1.00 40.00 N
+ATOM 1744 CA GLY A 242 -1.349 3.070 51.279 1.00 40.00 C
+ATOM 1745 C GLY A 242 -1.703 3.838 49.998 1.00 40.00 C
+ATOM 1746 O GLY A 242 -1.227 4.970 49.782 1.00 40.00 O
+ATOM 1747 N GLU A 243 -2.551 3.229 49.161 1.00 40.00 N
+ATOM 1748 CA GLU A 243 -2.998 3.815 47.882 1.00 40.00 C
+ATOM 1749 C GLU A 243 -4.501 4.007 47.915 1.00 40.00 C
+ATOM 1750 O GLU A 243 -5.203 3.246 48.595 1.00 40.00 O
+ATOM 1751 CB GLU A 243 -2.682 2.876 46.718 1.00 40.00 C
+ATOM 1752 CG GLU A 243 -1.593 1.855 47.014 1.00 40.00 C
+ATOM 1753 CD GLU A 243 -1.617 0.674 46.063 1.00 40.00 C
+ATOM 1754 OE1 GLU A 243 -1.472 0.898 44.843 1.00 40.00 O
+ATOM 1755 OE2 GLU A 243 -1.763 -0.479 46.531 1.00 40.00 O
+ATOM 1756 N ARG A 244 -4.988 5.000 47.162 1.00 40.00 N
+ATOM 1757 CA ARG A 244 -6.425 5.328 47.105 1.00 40.00 C
+ATOM 1758 C ARG A 244 -7.339 4.144 46.701 1.00 40.00 C
+ATOM 1759 O ARG A 244 -7.059 3.420 45.729 1.00 40.00 O
+ATOM 1760 CB ARG A 244 -6.657 6.517 46.186 1.00 40.00 C
+ATOM 1761 CG ARG A 244 -6.320 7.850 46.813 1.00 40.00 C
+ATOM 1762 CD ARG A 244 -6.601 8.952 45.797 1.00 40.00 C
+ATOM 1763 NE ARG A 244 -6.305 10.309 46.284 1.00 40.00 N
+ATOM 1764 CZ ARG A 244 -6.022 11.360 45.506 1.00 40.00 C
+ATOM 1765 NH1 ARG A 244 -5.966 11.247 44.176 1.00 40.00 N
+ATOM 1766 NH2 ARG A 244 -5.768 12.532 46.074 1.00 40.00 N
+ATOM 1767 N MET A 245 -8.423 3.953 47.458 1.00 40.00 N
+ATOM 1768 CA MET A 245 -9.300 2.807 47.257 1.00 40.00 C
+ATOM 1769 C MET A 245 -10.158 2.997 46.025 1.00 40.00 C
+ATOM 1770 O MET A 245 -11.228 3.604 46.072 1.00 40.00 O
+ATOM 1771 CB MET A 245 -10.171 2.550 48.484 1.00 40.00 C
+ATOM 1772 CG MET A 245 -10.926 1.225 48.435 1.00 40.00 C
+ATOM 1773 SD MET A 245 -9.869 -0.242 48.406 1.00 40.00 S
+ATOM 1774 CE MET A 245 -9.239 -0.262 50.089 1.00 40.00 C
+ATOM 1775 N TYR A 246 -9.662 2.489 44.909 1.00 40.00 N
+ATOM 1776 CA TYR A 246 -10.440 2.475 43.689 1.00 40.00 C
+ATOM 1777 C TYR A 246 -11.153 1.148 43.600 1.00 40.00 C
+ATOM 1778 O TYR A 246 -10.849 0.221 44.368 1.00 40.00 O
+ATOM 1779 CB TYR A 246 -9.548 2.732 42.479 1.00 40.00 C
+ATOM 1780 CG TYR A 246 -8.975 4.122 42.523 1.00 40.00 C
+ATOM 1781 CD1 TYR A 246 -9.821 5.240 42.564 1.00 40.00 C
+ATOM 1782 CD2 TYR A 246 -7.592 4.333 42.563 1.00 40.00 C
+ATOM 1783 CE1 TYR A 246 -9.310 6.528 42.625 1.00 40.00 C
+ATOM 1784 CE2 TYR A 246 -7.071 5.626 42.630 1.00 40.00 C
+ATOM 1785 CZ TYR A 246 -7.936 6.720 42.659 1.00 40.00 C
+ATOM 1786 OH TYR A 246 -7.435 8.007 42.715 1.00 40.00 O
+ATOM 1787 N ILE A 247 -12.121 1.060 42.688 1.00 40.00 N
+ATOM 1788 CA ILE A 247 -12.915 -0.157 42.544 1.00 40.00 C
+ATOM 1789 C ILE A 247 -11.998 -1.369 42.495 1.00 40.00 C
+ATOM 1790 O ILE A 247 -12.138 -2.305 43.288 1.00 40.00 O
+ATOM 1791 CB ILE A 247 -13.869 -0.105 41.332 1.00 40.00 C
+ATOM 1792 CG1 ILE A 247 -14.676 -1.397 41.278 1.00 40.00 C
+ATOM 1793 CG2 ILE A 247 -13.127 0.175 40.027 1.00 40.00 C
+ATOM 1794 CD1 ILE A 247 -16.070 -1.219 40.729 1.00 40.00 C
+ATOM 1795 N GLN A 248 -11.026 -1.297 41.592 1.00 40.00 N
+ATOM 1796 CA GLN A 248 -10.024 -2.336 41.429 1.00 40.00 C
+ATOM 1797 C GLN A 248 -9.315 -2.681 42.736 1.00 40.00 C
+ATOM 1798 O GLN A 248 -9.077 -3.859 43.012 1.00 40.00 O
+ATOM 1799 CB GLN A 248 -9.009 -1.953 40.339 1.00 40.00 C
+ATOM 1800 CG GLN A 248 -8.233 -0.661 40.564 1.00 40.00 C
+ATOM 1801 CD GLN A 248 -8.895 0.546 39.935 1.00 40.00 C
+ATOM 1802 OE1 GLN A 248 -10.113 0.687 39.968 1.00 40.00 O
+ATOM 1803 NE2 GLN A 248 -8.088 1.429 39.361 1.00 40.00 N
+ATOM 1804 N THR A 249 -9.002 -1.650 43.528 1.00 40.00 N
+ATOM 1805 CA THR A 249 -8.272 -1.790 44.790 1.00 40.00 C
+ATOM 1806 C THR A 249 -9.101 -2.584 45.799 1.00 40.00 C
+ATOM 1807 O THR A 249 -8.594 -3.504 46.443 1.00 40.00 O
+ATOM 1808 CB THR A 249 -7.877 -0.416 45.391 1.00 40.00 C
+ATOM 1809 OG1 THR A 249 -7.721 0.559 44.350 1.00 40.00 O
+ATOM 1810 CG2 THR A 249 -6.580 -0.521 46.181 1.00 40.00 C
+ATOM 1811 N ARG A 250 -10.379 -2.241 45.919 1.00 40.00 N
+ATOM 1812 CA ARG A 250 -11.274 -2.991 46.784 1.00 40.00 C
+ATOM 1813 C ARG A 250 -11.442 -4.433 46.302 1.00 40.00 C
+ATOM 1814 O ARG A 250 -11.462 -5.370 47.114 1.00 40.00 O
+ATOM 1815 CB ARG A 250 -12.637 -2.309 46.868 1.00 40.00 C
+ATOM 1816 CG ARG A 250 -13.690 -3.110 47.640 1.00 40.00 C
+ATOM 1817 CD ARG A 250 -13.400 -3.138 49.131 1.00 40.00 C
+ATOM 1818 NE ARG A 250 -13.244 -1.771 49.632 1.00 40.00 N
+ATOM 1819 CZ ARG A 250 -12.578 -1.426 50.734 1.00 40.00 C
+ATOM 1820 NH1 ARG A 250 -11.990 -2.350 51.478 1.00 40.00 N
+ATOM 1821 NH2 ARG A 250 -12.495 -0.147 51.096 1.00 40.00 N
+ATOM 1822 N MET A 251 -11.581 -4.591 44.982 1.00 40.00 N
+ATOM 1823 CA MET A 251 -11.716 -5.901 44.350 1.00 40.00 C
+ATOM 1824 C MET A 251 -10.500 -6.738 44.665 1.00 40.00 C
+ATOM 1825 O MET A 251 -10.630 -7.863 45.142 1.00 40.00 O
+ATOM 1826 CB MET A 251 -11.836 -5.759 42.844 1.00 40.00 C
+ATOM 1827 CG MET A 251 -13.208 -5.348 42.370 1.00 40.00 C
+ATOM 1828 SD MET A 251 -13.105 -4.663 40.713 1.00 40.00 S
+ATOM 1829 CE MET A 251 -12.752 -6.110 39.727 1.00 40.00 C
+ATOM 1830 N ALA A 252 -9.322 -6.165 44.410 1.00 40.00 N
+ATOM 1831 CA ALA A 252 -8.037 -6.812 44.677 1.00 40.00 C
+ATOM 1832 C ALA A 252 -8.004 -7.464 46.059 1.00 40.00 C
+ATOM 1833 O ALA A 252 -7.259 -8.424 46.283 1.00 40.00 O
+ATOM 1834 CB ALA A 252 -6.892 -5.818 44.521 1.00 40.00 C
+ATOM 1835 N GLU A 253 -8.829 -6.949 46.971 1.00 40.00 N
+ATOM 1836 CA GLU A 253 -8.964 -7.513 48.315 1.00 40.00 C
+ATOM 1837 C GLU A 253 -9.618 -8.899 48.324 1.00 40.00 C
+ATOM 1838 O GLU A 253 -9.644 -9.574 49.354 1.00 40.00 O
+ATOM 1839 CB GLU A 253 -9.750 -6.566 49.219 1.00 40.00 C
+ATOM 1840 CG GLU A 253 -9.057 -5.250 49.498 1.00 40.00 C
+ATOM 1841 CD GLU A 253 -9.732 -4.479 50.608 1.00 40.00 C
+ATOM 1842 OE1 GLU A 253 -9.069 -3.587 51.176 1.00 40.00 O
+ATOM 1843 OE2 GLU A 253 -10.913 -4.765 50.917 1.00 40.00 O
+ATOM 1844 N TYR A 254 -10.143 -9.320 47.182 1.00 40.00 N
+ATOM 1845 CA TYR A 254 -10.752 -10.626 47.082 1.00 40.00 C
+ATOM 1846 C TYR A 254 -10.238 -11.339 45.856 1.00 40.00 C
+ATOM 1847 O TYR A 254 -10.873 -12.280 45.382 1.00 40.00 O
+ATOM 1848 CB TYR A 254 -12.256 -10.492 46.941 1.00 40.00 C
+ATOM 1849 CG TYR A 254 -12.975 -9.750 48.035 1.00 40.00 C
+ATOM 1850 CD1 TYR A 254 -13.483 -10.434 49.136 1.00 40.00 C
+ATOM 1851 CD2 TYR A 254 -13.205 -8.364 47.942 1.00 40.00 C
+ATOM 1852 CE1 TYR A 254 -14.183 -9.770 50.131 1.00 40.00 C
+ATOM 1853 CE2 TYR A 254 -13.905 -7.684 48.936 1.00 40.00 C
+ATOM 1854 CZ TYR A 254 -14.395 -8.397 50.030 1.00 40.00 C
+ATOM 1855 OH TYR A 254 -15.099 -7.767 51.034 1.00 40.00 O
+ATOM 1856 N LYS A 255 -9.098 -10.893 45.337 1.00 40.00 N
+ATOM 1857 CA LYS A 255 -8.579 -11.415 44.072 1.00 40.00 C
+ATOM 1858 C LYS A 255 -8.622 -12.944 44.015 1.00 40.00 C
+ATOM 1859 O LYS A 255 -8.538 -13.537 42.939 1.00 40.00 O
+ATOM 1860 CB LYS A 255 -7.174 -10.866 43.782 1.00 40.00 C
+ATOM 1861 CG LYS A 255 -6.121 -11.123 44.859 1.00 40.00 C
+ATOM 1862 CD LYS A 255 -4.916 -10.193 44.690 1.00 40.00 C
+ATOM 1863 CE LYS A 255 -3.747 -10.562 45.606 1.00 40.00 C
+ATOM 1864 NZ LYS A 255 -2.946 -11.712 45.095 1.00 40.00 N
+ATOM 1865 N GLU A 256 -8.787 -13.554 45.194 1.00 40.00 N
+ATOM 1866 CA GLU A 256 -8.911 -15.009 45.376 1.00 40.00 C
+ATOM 1867 C GLU A 256 -10.266 -15.532 44.890 1.00 40.00 C
+ATOM 1868 O GLU A 256 -10.347 -16.062 43.771 1.00 40.00 O
+ATOM 1869 CB GLU A 256 -8.694 -15.414 46.852 1.00 40.00 C
+ATOM 1870 CG GLU A 256 -7.734 -14.537 47.657 1.00 40.00 C
+ATOM 1871 CD GLU A 256 -6.288 -14.625 47.185 1.00 40.00 C
+ATOM 1872 OE1 GLU A 256 -5.925 -15.636 46.534 1.00 40.00 O
+ATOM 1873 OE2 GLU A 256 -5.514 -13.676 47.473 1.00 40.00 O
+ATOM 1874 N GLU A 257 -11.317 -15.377 45.719 1.00 40.00 N
+ATOM 1875 CA GLU A 257 -12.663 -15.916 45.405 1.00 40.00 C
+ATOM 1876 C GLU A 257 -13.055 -15.502 44.012 1.00 40.00 C
+ATOM 1877 O GLU A 257 -13.594 -16.294 43.245 1.00 40.00 O
+ATOM 1878 CB GLU A 257 -13.785 -15.444 46.349 1.00 40.00 C
+ATOM 1879 CG GLU A 257 -13.543 -15.588 47.828 1.00 40.00 C
+ATOM 1880 CD GLU A 257 -12.964 -14.318 48.403 1.00 40.00 C
+ATOM 1881 OE1 GLU A 257 -11.737 -14.089 48.225 1.00 40.00 O
+ATOM 1882 OE2 GLU A 257 -13.746 -13.549 49.018 1.00 40.00 O
+ATOM 1883 N LEU A 258 -12.781 -14.241 43.703 1.00 40.00 N
+ATOM 1884 CA LEU A 258 -13.121 -13.680 42.415 1.00 40.00 C
+ATOM 1885 C LEU A 258 -12.502 -14.525 41.308 1.00 40.00 C
+ATOM 1886 O LEU A 258 -13.221 -15.147 40.528 1.00 40.00 O
+ATOM 1887 CB LEU A 258 -12.701 -12.204 42.338 1.00 40.00 C
+ATOM 1888 CG LEU A 258 -13.248 -11.262 43.435 1.00 40.00 C
+ATOM 1889 CD1 LEU A 258 -12.801 -9.832 43.172 1.00 40.00 C
+ATOM 1890 CD2 LEU A 258 -14.767 -11.313 43.604 1.00 40.00 C
+ATOM 1891 N TRP A 259 -11.178 -14.597 41.274 1.00 40.00 N
+ATOM 1892 CA TRP A 259 -10.516 -15.402 40.268 1.00 40.00 C
+ATOM 1893 C TRP A 259 -11.031 -16.805 40.217 1.00 40.00 C
+ATOM 1894 O TRP A 259 -11.203 -17.390 39.143 1.00 40.00 O
+ATOM 1895 CB TRP A 259 -9.031 -15.432 40.503 1.00 40.00 C
+ATOM 1896 CG TRP A 259 -8.376 -16.315 39.492 1.00 40.00 C
+ATOM 1897 CD1 TRP A 259 -7.599 -17.441 39.725 1.00 40.00 C
+ATOM 1898 CD2 TRP A 259 -8.479 -16.208 38.024 1.00 40.00 C
+ATOM 1899 NE1 TRP A 259 -7.192 -18.002 38.540 1.00 40.00 N
+ATOM 1900 CE2 TRP A 259 -7.690 -17.314 37.478 1.00 40.00 C
+ATOM 1901 CE3 TRP A 259 -9.110 -15.325 37.139 1.00 40.00 C
+ATOM 1902 CZ2 TRP A 259 -7.554 -17.516 36.100 1.00 40.00 C
+ATOM 1903 CZ3 TRP A 259 -8.967 -15.537 35.758 1.00 40.00 C
+ATOM 1904 CH2 TRP A 259 -8.207 -16.605 35.252 1.00 40.00 C
+ATOM 1905 N GLU A 260 -11.264 -17.352 41.399 1.00 40.00 N
+ATOM 1906 CA GLU A 260 -11.913 -18.634 41.538 1.00 40.00 C
+ATOM 1907 C GLU A 260 -13.270 -18.638 40.847 1.00 40.00 C
+ATOM 1908 O GLU A 260 -13.471 -19.364 39.865 1.00 40.00 O
+ATOM 1909 CB GLU A 260 -12.072 -18.983 43.018 1.00 40.00 C
+ATOM 1910 CG GLU A 260 -10.772 -19.396 43.679 1.00 40.00 C
+ATOM 1911 CD GLU A 260 -10.094 -20.535 42.938 1.00 40.00 C
+ATOM 1912 OE1 GLU A 260 -8.957 -20.310 42.443 1.00 40.00 O
+ATOM 1913 OE2 GLU A 260 -10.711 -21.636 42.832 1.00 40.00 O
+ATOM 1914 N LEU A 261 -14.183 -17.811 41.360 1.00 40.00 N
+ATOM 1915 CA LEU A 261 -15.549 -17.695 40.834 1.00 40.00 C
+ATOM 1916 C LEU A 261 -15.559 -17.431 39.325 1.00 40.00 C
+ATOM 1917 O LEU A 261 -16.569 -17.639 38.647 1.00 40.00 O
+ATOM 1918 CB LEU A 261 -16.319 -16.599 41.581 1.00 40.00 C
+ATOM 1919 CG LEU A 261 -16.818 -16.923 42.989 1.00 40.00 C
+ATOM 1920 CD1 LEU A 261 -16.672 -15.716 43.908 1.00 40.00 C
+ATOM 1921 CD2 LEU A 261 -18.251 -17.440 42.951 1.00 40.00 C
+ATOM 1922 N LEU A 262 -14.412 -17.000 38.811 1.00 40.00 N
+ATOM 1923 CA LEU A 262 -14.270 -16.685 37.403 1.00 40.00 C
+ATOM 1924 C LEU A 262 -14.189 -17.905 36.531 1.00 40.00 C
+ATOM 1925 O LEU A 262 -14.233 -17.802 35.303 1.00 40.00 O
+ATOM 1926 CB LEU A 262 -13.038 -15.823 37.160 1.00 40.00 C
+ATOM 1927 CG LEU A 262 -13.352 -14.325 37.180 1.00 40.00 C
+ATOM 1928 CD1 LEU A 262 -12.166 -13.531 36.670 1.00 40.00 C
+ATOM 1929 CD2 LEU A 262 -14.587 -13.993 36.351 1.00 40.00 C
+ATOM 1930 N LYS A 263 -14.059 -19.064 37.157 1.00 40.00 N
+ATOM 1931 CA LYS A 263 -13.965 -20.294 36.389 1.00 40.00 C
+ATOM 1932 C LYS A 263 -15.279 -21.094 36.432 1.00 40.00 C
+ATOM 1933 O LYS A 263 -15.423 -22.083 35.717 1.00 40.00 O
+ATOM 1934 CB LYS A 263 -12.705 -21.079 36.792 1.00 40.00 C
+ATOM 1935 CG LYS A 263 -11.428 -20.242 36.621 1.00 40.00 C
+ATOM 1936 CD LYS A 263 -10.148 -20.962 37.024 1.00 40.00 C
+ATOM 1937 CE LYS A 263 -9.915 -20.920 38.534 1.00 40.00 C
+ATOM 1938 NZ LYS A 263 -8.674 -21.639 38.953 1.00 40.00 N
+ATOM 1939 N LYS A 264 -16.243 -20.627 37.232 1.00 40.00 N
+ATOM 1940 CA LYS A 264 -17.583 -21.228 37.295 1.00 40.00 C
+ATOM 1941 C LYS A 264 -18.421 -20.900 36.064 1.00 40.00 C
+ATOM 1942 O LYS A 264 -18.123 -19.967 35.316 1.00 40.00 O
+ATOM 1943 CB LYS A 264 -18.328 -20.819 38.573 1.00 40.00 C
+ATOM 1944 CG LYS A 264 -17.896 -21.589 39.813 1.00 40.00 C
+ATOM 1945 CD LYS A 264 -18.712 -21.197 41.037 1.00 40.00 C
+ATOM 1946 CE LYS A 264 -18.562 -22.206 42.175 1.00 40.00 C
+ATOM 1947 NZ LYS A 264 -17.171 -22.350 42.699 1.00 40.00 N
+ATOM 1948 N ASP A 265 -19.468 -21.692 35.871 1.00 40.00 N
+ATOM 1949 CA ASP A 265 -20.310 -21.614 34.686 1.00 40.00 C
+ATOM 1950 C ASP A 265 -21.506 -20.747 34.935 1.00 40.00 C
+ATOM 1951 O ASP A 265 -22.216 -20.366 34.006 1.00 40.00 O
+ATOM 1952 CB ASP A 265 -20.819 -23.001 34.298 1.00 40.00 C
+ATOM 1953 CG ASP A 265 -19.878 -23.728 33.354 1.00 40.00 C
+ATOM 1954 OD1 ASP A 265 -19.949 -24.981 33.312 1.00 40.00 O
+ATOM 1955 OD2 ASP A 265 -19.075 -23.052 32.654 1.00 40.00 O
+ATOM 1956 N ASN A 266 -21.741 -20.454 36.201 1.00 40.00 N
+ATOM 1957 CA ASN A 266 -22.913 -19.694 36.580 1.00 40.00 C
+ATOM 1958 C ASN A 266 -22.515 -18.385 37.265 1.00 40.00 C
+ATOM 1959 O ASN A 266 -23.265 -17.830 38.077 1.00 40.00 O
+ATOM 1960 CB ASN A 266 -23.782 -20.546 37.489 1.00 40.00 C
+ATOM 1961 CG ASN A 266 -23.079 -20.908 38.782 1.00 40.00 C
+ATOM 1962 OD1 ASN A 266 -21.837 -20.970 38.849 1.00 40.00 O
+ATOM 1963 ND2 ASN A 266 -23.870 -21.139 39.824 1.00 40.00 N
+ATOM 1964 N THR A 267 -21.319 -17.908 36.933 1.00 40.00 N
+ATOM 1965 CA THR A 267 -20.837 -16.625 37.409 1.00 40.00 C
+ATOM 1966 C THR A 267 -20.857 -15.624 36.240 1.00 40.00 C
+ATOM 1967 O THR A 267 -20.141 -15.803 35.259 1.00 40.00 O
+ATOM 1968 CB THR A 267 -19.432 -16.772 38.031 1.00 40.00 C
+ATOM 1969 OG1 THR A 267 -19.489 -17.674 39.147 1.00 40.00 O
+ATOM 1970 CG2 THR A 267 -18.919 -15.445 38.514 1.00 40.00 C
+ATOM 1971 N TYR A 268 -21.697 -14.591 36.338 1.00 40.00 N
+ATOM 1972 CA TYR A 268 -21.846 -13.602 35.259 1.00 40.00 C
+ATOM 1973 C TYR A 268 -21.443 -12.208 35.721 1.00 40.00 C
+ATOM 1974 O TYR A 268 -21.956 -11.691 36.713 1.00 40.00 O
+ATOM 1975 CB TYR A 268 -23.285 -13.578 34.721 1.00 40.00 C
+ATOM 1976 CG TYR A 268 -23.874 -14.943 34.418 1.00 40.00 C
+ATOM 1977 CD1 TYR A 268 -24.509 -15.681 35.413 1.00 40.00 C
+ATOM 1978 CD2 TYR A 268 -23.801 -15.496 33.136 1.00 40.00 C
+ATOM 1979 CE1 TYR A 268 -25.050 -16.931 35.149 1.00 40.00 C
+ATOM 1980 CE2 TYR A 268 -24.342 -16.752 32.864 1.00 40.00 C
+ATOM 1981 CZ TYR A 268 -24.969 -17.461 33.879 1.00 40.00 C
+ATOM 1982 OH TYR A 268 -25.521 -18.700 33.652 1.00 40.00 O
+ATOM 1983 N VAL A 269 -20.528 -11.597 34.989 1.00 40.00 N
+ATOM 1984 CA VAL A 269 -19.997 -10.311 35.387 1.00 40.00 C
+ATOM 1985 C VAL A 269 -20.635 -9.174 34.620 1.00 40.00 C
+ATOM 1986 O VAL A 269 -20.812 -9.251 33.404 1.00 40.00 O
+ATOM 1987 CB VAL A 269 -18.490 -10.248 35.150 1.00 40.00 C
+ATOM 1988 CG1 VAL A 269 -18.001 -8.821 35.268 1.00 40.00 C
+ATOM 1989 CG2 VAL A 269 -17.771 -11.126 36.148 1.00 40.00 C
+ATOM 1990 N TYR A 270 -20.950 -8.106 35.339 1.00 40.00 N
+ATOM 1991 CA TYR A 270 -21.510 -6.931 34.724 1.00 40.00 C
+ATOM 1992 C TYR A 270 -20.739 -5.711 35.194 1.00 40.00 C
+ATOM 1993 O TYR A 270 -20.550 -5.508 36.386 1.00 40.00 O
+ATOM 1994 CB TYR A 270 -22.992 -6.798 35.083 1.00 40.00 C
+ATOM 1995 CG TYR A 270 -23.941 -7.857 34.507 1.00 40.00 C
+ATOM 1996 CD1 TYR A 270 -24.091 -9.107 35.114 1.00 40.00 C
+ATOM 1997 CD2 TYR A 270 -24.726 -7.584 33.383 1.00 40.00 C
+ATOM 1998 CE1 TYR A 270 -24.967 -10.059 34.602 1.00 40.00 C
+ATOM 1999 CE2 TYR A 270 -25.605 -8.530 32.865 1.00 40.00 C
+ATOM 2000 CZ TYR A 270 -25.725 -9.769 33.475 1.00 40.00 C
+ATOM 2001 OH TYR A 270 -26.603 -10.714 32.966 1.00 40.00 O
+ATOM 2002 N MET A 271 -20.289 -4.908 34.242 1.00 40.00 N
+ATOM 2003 CA MET A 271 -19.529 -3.706 34.528 1.00 40.00 C
+ATOM 2004 C MET A 271 -20.259 -2.507 33.939 1.00 40.00 C
+ATOM 2005 O MET A 271 -20.636 -2.524 32.762 1.00 40.00 O
+ATOM 2006 CB MET A 271 -18.133 -3.825 33.920 1.00 40.00 C
+ATOM 2007 CG MET A 271 -17.120 -2.855 34.488 1.00 40.00 C
+ATOM 2008 SD MET A 271 -15.619 -2.784 33.511 1.00 40.00 S
+ATOM 2009 CE MET A 271 -14.777 -4.264 34.022 1.00 40.00 C
+ATOM 2010 N CYS A 272 -20.459 -1.475 34.756 1.00 40.00 N
+ATOM 2011 CA CYS A 272 -21.139 -0.257 34.306 1.00 40.00 C
+ATOM 2012 C CYS A 272 -20.628 1.035 34.944 1.00 40.00 C
+ATOM 2013 O CYS A 272 -20.347 1.079 36.137 1.00 40.00 O
+ATOM 2014 CB CYS A 272 -22.635 -0.376 34.547 1.00 40.00 C
+ATOM 2015 SG CYS A 272 -23.569 0.962 33.788 1.00 40.00 S
+ATOM 2016 N GLY A 273 -20.520 2.088 34.140 1.00 40.00 N
+ATOM 2017 CA GLY A 273 -20.152 3.397 34.654 1.00 40.00 C
+ATOM 2018 C GLY A 273 -19.260 4.248 33.775 1.00 40.00 C
+ATOM 2019 O GLY A 273 -19.592 4.570 32.634 1.00 40.00 O
+ATOM 2020 N LEU A 274 -18.115 4.613 34.328 1.00 40.00 N
+ATOM 2021 CA LEU A 274 -17.276 5.636 33.744 1.00 40.00 C
+ATOM 2022 C LEU A 274 -16.165 5.022 32.930 1.00 40.00 C
+ATOM 2023 O LEU A 274 -15.307 4.310 33.460 1.00 40.00 O
+ATOM 2024 CB LEU A 274 -16.690 6.527 34.846 1.00 40.00 C
+ATOM 2025 CG LEU A 274 -17.668 7.296 35.753 1.00 40.00 C
+ATOM 2026 CD1 LEU A 274 -17.084 7.563 37.144 1.00 40.00 C
+ATOM 2027 CD2 LEU A 274 -18.161 8.582 35.075 1.00 40.00 C
+ATOM 2028 N LYS A 275 -16.182 5.308 31.635 1.00 40.00 N
+ATOM 2029 CA LYS A 275 -15.110 4.893 30.758 1.00 40.00 C
+ATOM 2030 C LYS A 275 -13.784 5.099 31.464 1.00 40.00 C
+ATOM 2031 O LYS A 275 -13.462 6.203 31.882 1.00 40.00 O
+ATOM 2032 CB LYS A 275 -15.141 5.716 29.481 1.00 40.00 C
+ATOM 2033 CG LYS A 275 -14.125 5.272 28.446 1.00 40.00 C
+ATOM 2034 CD LYS A 275 -14.314 6.044 27.151 1.00 40.00 C
+ATOM 2035 CE LYS A 275 -13.537 5.406 26.012 1.00 40.00 C
+ATOM 2036 NZ LYS A 275 -14.084 5.851 24.697 1.00 40.00 N
+ATOM 2037 N GLY A 276 -13.027 4.028 31.623 1.00 40.00 N
+ATOM 2038 CA GLY A 276 -11.723 4.140 32.245 1.00 40.00 C
+ATOM 2039 C GLY A 276 -11.553 3.188 33.402 1.00 40.00 C
+ATOM 2040 O GLY A 276 -10.442 2.704 33.659 1.00 40.00 O
+ATOM 2041 N MET A 277 -12.651 2.912 34.095 1.00 40.00 N
+ATOM 2042 CA MET A 277 -12.606 2.010 35.231 1.00 40.00 C
+ATOM 2043 C MET A 277 -11.976 0.674 34.851 1.00 40.00 C
+ATOM 2044 O MET A 277 -11.239 0.079 35.648 1.00 40.00 O
+ATOM 2045 CB MET A 277 -14.001 1.804 35.806 1.00 40.00 C
+ATOM 2046 CG MET A 277 -15.014 1.300 34.800 1.00 40.00 C
+ATOM 2047 SD MET A 277 -16.700 1.372 35.412 1.00 40.00 S
+ATOM 2048 CE MET A 277 -16.685 0.097 36.673 1.00 40.00 C
+ATOM 2049 N GLU A 278 -12.244 0.227 33.622 1.00 40.00 N
+ATOM 2050 CA GLU A 278 -11.842 -1.117 33.188 1.00 40.00 C
+ATOM 2051 C GLU A 278 -10.357 -1.269 32.888 1.00 40.00 C
+ATOM 2052 O GLU A 278 -9.843 -2.390 32.941 1.00 40.00 O
+ATOM 2053 CB GLU A 278 -12.694 -1.658 32.018 1.00 40.00 C
+ATOM 2054 CG GLU A 278 -12.296 -1.187 30.627 1.00 40.00 C
+ATOM 2055 CD GLU A 278 -12.872 0.175 30.297 1.00 40.00 C
+ATOM 2056 OE1 GLU A 278 -12.496 1.172 30.967 1.00 40.00 O
+ATOM 2057 OE2 GLU A 278 -13.706 0.238 29.366 1.00 40.00 O
+ATOM 2058 N LYS A 279 -9.660 -0.177 32.569 1.00 40.00 N
+ATOM 2059 CA LYS A 279 -8.212 -0.286 32.558 1.00 40.00 C
+ATOM 2060 C LYS A 279 -7.795 -0.758 33.957 1.00 40.00 C
+ATOM 2061 O LYS A 279 -7.112 -1.784 34.103 1.00 40.00 O
+ATOM 2062 CB LYS A 279 -7.505 1.016 32.187 1.00 40.00 C
+ATOM 2063 CG LYS A 279 -6.016 0.777 31.946 1.00 40.00 C
+ATOM 2064 CD LYS A 279 -5.170 2.013 32.187 1.00 40.00 C
+ATOM 2065 CE LYS A 279 -3.696 1.641 32.262 1.00 40.00 C
+ATOM 2066 NZ LYS A 279 -2.802 2.831 32.123 1.00 40.00 N
+ATOM 2067 N GLY A 280 -8.255 -0.027 34.977 1.00 40.00 N
+ATOM 2068 CA GLY A 280 -8.025 -0.384 36.381 1.00 40.00 C
+ATOM 2069 C GLY A 280 -8.230 -1.862 36.659 1.00 40.00 C
+ATOM 2070 O GLY A 280 -7.353 -2.528 37.224 1.00 40.00 O
+ATOM 2071 N ILE A 281 -9.378 -2.375 36.228 1.00 40.00 N
+ATOM 2072 CA ILE A 281 -9.752 -3.760 36.472 1.00 40.00 C
+ATOM 2073 C ILE A 281 -8.942 -4.768 35.671 1.00 40.00 C
+ATOM 2074 O ILE A 281 -8.450 -5.746 36.224 1.00 40.00 O
+ATOM 2075 CB ILE A 281 -11.248 -3.961 36.232 1.00 40.00 C
+ATOM 2076 CG1 ILE A 281 -12.034 -3.295 37.373 1.00 40.00 C
+ATOM 2077 CG2 ILE A 281 -11.554 -5.443 36.100 1.00 40.00 C
+ATOM 2078 CD1 ILE A 281 -13.545 -3.366 37.257 1.00 40.00 C
+ATOM 2079 N ASP A 282 -8.808 -4.524 34.373 1.00 40.00 N
+ATOM 2080 CA ASP A 282 -8.007 -5.375 33.507 1.00 40.00 C
+ATOM 2081 C ASP A 282 -6.603 -5.585 34.080 1.00 40.00 C
+ATOM 2082 O ASP A 282 -6.097 -6.705 34.113 1.00 40.00 O
+ATOM 2083 CB ASP A 282 -7.920 -4.789 32.087 1.00 40.00 C
+ATOM 2084 CG ASP A 282 -9.233 -4.907 31.303 1.00 40.00 C
+ATOM 2085 OD1 ASP A 282 -10.134 -5.677 31.712 1.00 40.00 O
+ATOM 2086 OD2 ASP A 282 -9.360 -4.225 30.260 1.00 40.00 O
+ATOM 2087 N ASP A 283 -5.992 -4.499 34.547 1.00 40.00 N
+ATOM 2088 CA ASP A 283 -4.645 -4.522 35.128 1.00 40.00 C
+ATOM 2089 C ASP A 283 -4.515 -5.520 36.289 1.00 40.00 C
+ATOM 2090 O ASP A 283 -3.503 -6.219 36.422 1.00 40.00 O
+ATOM 2091 CB ASP A 283 -4.257 -3.103 35.585 1.00 40.00 C
+ATOM 2092 CG ASP A 283 -4.122 -2.106 34.412 1.00 40.00 C
+ATOM 2093 OD1 ASP A 283 -3.766 -2.519 33.286 1.00 40.00 O
+ATOM 2094 OD2 ASP A 283 -4.365 -0.895 34.618 1.00 40.00 O
+ATOM 2095 N ILE A 284 -5.563 -5.575 37.108 1.00 40.00 N
+ATOM 2096 CA ILE A 284 -5.652 -6.488 38.241 1.00 40.00 C
+ATOM 2097 C ILE A 284 -5.841 -7.940 37.786 1.00 40.00 C
+ATOM 2098 O ILE A 284 -5.338 -8.881 38.424 1.00 40.00 O
+ATOM 2099 CB ILE A 284 -6.804 -6.068 39.192 1.00 40.00 C
+ATOM 2100 CG1 ILE A 284 -6.615 -4.616 39.679 1.00 40.00 C
+ATOM 2101 CG2 ILE A 284 -6.982 -7.056 40.351 1.00 40.00 C
+ATOM 2102 CD1 ILE A 284 -5.211 -4.234 40.122 1.00 40.00 C
+ATOM 2103 N MET A 285 -6.565 -8.110 36.680 1.00 40.00 N
+ATOM 2104 CA MET A 285 -6.879 -9.438 36.145 1.00 40.00 C
+ATOM 2105 C MET A 285 -5.707 -10.059 35.414 1.00 40.00 C
+ATOM 2106 O MET A 285 -5.577 -11.284 35.359 1.00 40.00 O
+ATOM 2107 CB MET A 285 -8.084 -9.361 35.213 1.00 40.00 C
+ATOM 2108 CG MET A 285 -9.386 -9.147 35.960 1.00 40.00 C
+ATOM 2109 SD MET A 285 -9.690 -10.513 37.113 1.00 40.00 S
+ATOM 2110 CE MET A 285 -10.320 -9.624 38.535 1.00 40.00 C
+ATOM 2111 N VAL A 286 -4.871 -9.188 34.855 1.00 40.00 N
+ATOM 2112 CA VAL A 286 -3.674 -9.576 34.127 1.00 40.00 C
+ATOM 2113 C VAL A 286 -2.762 -10.434 35.006 1.00 40.00 C
+ATOM 2114 O VAL A 286 -2.376 -11.540 34.608 1.00 40.00 O
+ATOM 2115 CB VAL A 286 -2.942 -8.318 33.586 1.00 40.00 C
+ATOM 2116 CG1 VAL A 286 -1.493 -8.624 33.224 1.00 40.00 C
+ATOM 2117 CG2 VAL A 286 -3.685 -7.751 32.382 1.00 40.00 C
+ATOM 2118 N SER A 287 -2.455 -9.927 36.203 1.00 40.00 N
+ATOM 2119 CA SER A 287 -1.558 -10.603 37.144 1.00 40.00 C
+ATOM 2120 C SER A 287 -2.140 -11.898 37.733 1.00 40.00 C
+ATOM 2121 O SER A 287 -1.383 -12.821 38.055 1.00 40.00 O
+ATOM 2122 CB SER A 287 -1.099 -9.636 38.247 1.00 40.00 C
+ATOM 2123 OG SER A 287 -2.195 -9.006 38.890 1.00 40.00 O
+ATOM 2124 N LEU A 288 -3.473 -11.953 37.854 1.00 40.00 N
+ATOM 2125 CA LEU A 288 -4.223 -13.151 38.296 1.00 40.00 C
+ATOM 2126 C LEU A 288 -4.275 -14.282 37.253 1.00 40.00 C
+ATOM 2127 O LEU A 288 -4.320 -15.474 37.594 1.00 40.00 O
+ATOM 2128 CB LEU A 288 -5.659 -12.768 38.688 1.00 40.00 C
+ATOM 2129 CG LEU A 288 -5.948 -12.379 40.139 1.00 40.00 C
+ATOM 2130 CD1 LEU A 288 -7.365 -11.839 40.269 1.00 40.00 C
+ATOM 2131 CD2 LEU A 288 -5.730 -13.572 41.064 1.00 40.00 C
+ATOM 2132 N ALA A 289 -4.287 -13.878 35.985 1.00 40.00 N
+ATOM 2133 CA ALA A 289 -4.353 -14.795 34.847 1.00 40.00 C
+ATOM 2134 C ALA A 289 -3.032 -15.533 34.634 1.00 40.00 C
+ATOM 2135 O ALA A 289 -3.012 -16.760 34.670 1.00 40.00 O
+ATOM 2136 CB ALA A 289 -4.777 -14.053 33.578 1.00 40.00 C
+ATOM 2137 N GLU A 290 -1.946 -14.781 34.422 1.00 40.00 N
+ATOM 2138 CA GLU A 290 -0.595 -15.328 34.234 1.00 40.00 C
+ATOM 2139 C GLU A 290 -0.115 -16.168 35.429 1.00 40.00 C
+ATOM 2140 O GLU A 290 0.921 -16.827 35.337 1.00 40.00 O
+ATOM 2141 CB GLU A 290 0.394 -14.194 33.952 1.00 40.00 C
+ATOM 2142 CG GLU A 290 0.355 -13.097 35.020 1.00 40.00 C
+ATOM 2143 CD GLU A 290 1.393 -12.002 34.827 1.00 40.00 C
+ATOM 2144 OE1 GLU A 290 2.601 -12.325 34.822 1.00 40.00 O
+ATOM 2145 OE2 GLU A 290 1.008 -10.814 34.709 1.00 40.00 O
+ATOM 2146 N LYS A 291 -0.859 -16.123 36.542 1.00 40.00 N
+ATOM 2147 CA LYS A 291 -0.677 -17.060 37.665 1.00 40.00 C
+ATOM 2148 C LYS A 291 -0.925 -18.505 37.250 1.00 40.00 C
+ATOM 2149 O LYS A 291 -0.148 -19.394 37.604 1.00 40.00 O
+ATOM 2150 CB LYS A 291 -1.628 -16.755 38.827 1.00 40.00 C
+ATOM 2151 CG LYS A 291 -1.201 -15.620 39.723 1.00 40.00 C
+ATOM 2152 CD LYS A 291 0.220 -15.786 40.223 1.00 40.00 C
+ATOM 2153 CE LYS A 291 0.657 -14.493 40.875 1.00 40.00 C
+ATOM 2154 NZ LYS A 291 -0.456 -13.928 41.697 1.00 40.00 N
+ATOM 2155 N ASP A 292 -2.029 -18.726 36.527 1.00 40.00 N
+ATOM 2156 CA ASP A 292 -2.407 -20.051 35.993 1.00 40.00 C
+ATOM 2157 C ASP A 292 -1.778 -20.331 34.627 1.00 40.00 C
+ATOM 2158 O ASP A 292 -2.083 -21.354 33.996 1.00 40.00 O
+ATOM 2159 CB ASP A 292 -3.931 -20.169 35.863 1.00 40.00 C
+ATOM 2160 CG ASP A 292 -4.652 -19.995 37.185 1.00 40.00 C
+ATOM 2161 OD1 ASP A 292 -4.061 -19.435 38.144 1.00 40.00 O
+ATOM 2162 OD2 ASP A 292 -5.829 -20.419 37.257 1.00 40.00 O
+ATOM 2163 N GLY A 293 -0.909 -19.416 34.185 1.00 40.00 N
+ATOM 2164 CA GLY A 293 -0.314 -19.435 32.837 1.00 40.00 C
+ATOM 2165 C GLY A 293 -1.218 -18.920 31.714 1.00 40.00 C
+ATOM 2166 O GLY A 293 -0.947 -19.171 30.527 1.00 40.00 O
+ATOM 2167 N ILE A 294 -2.272 -18.186 32.096 1.00 40.00 N
+ATOM 2168 CA ILE A 294 -3.351 -17.744 31.188 1.00 40.00 C
+ATOM 2169 C ILE A 294 -3.151 -16.293 30.669 1.00 40.00 C
+ATOM 2170 O ILE A 294 -2.731 -15.398 31.425 1.00 40.00 O
+ATOM 2171 CB ILE A 294 -4.756 -17.942 31.856 1.00 40.00 C
+ATOM 2172 CG1 ILE A 294 -5.002 -19.429 32.192 1.00 40.00 C
+ATOM 2173 CG2 ILE A 294 -5.884 -17.397 30.981 1.00 40.00 C
+ATOM 2174 CD1 ILE A 294 -6.184 -19.697 33.107 1.00 40.00 C
+ATOM 2175 N ASP A 295 -3.411 -16.083 29.373 1.00 40.00 N
+ATOM 2176 CA ASP A 295 -3.548 -14.731 28.830 1.00 40.00 C
+ATOM 2177 C ASP A 295 -4.981 -14.224 28.989 1.00 40.00 C
+ATOM 2178 O ASP A 295 -5.954 -14.825 28.500 1.00 40.00 O
+ATOM 2179 CB ASP A 295 -3.102 -14.615 27.370 1.00 40.00 C
+ATOM 2180 CG ASP A 295 -3.338 -13.206 26.794 1.00 40.00 C
+ATOM 2181 OD1 ASP A 295 -3.307 -13.036 25.556 1.00 40.00 O
+ATOM 2182 OD2 ASP A 295 -3.563 -12.257 27.574 1.00 40.00 O
+ATOM 2183 N TRP A 296 -5.066 -13.080 29.659 1.00 40.00 N
+ATOM 2184 CA TRP A 296 -6.314 -12.498 30.133 1.00 40.00 C
+ATOM 2185 C TRP A 296 -7.316 -12.203 29.050 1.00 40.00 C
+ATOM 2186 O TRP A 296 -8.456 -12.674 29.108 1.00 40.00 O
+ATOM 2187 CB TRP A 296 -6.003 -11.250 30.969 1.00 40.00 C
+ATOM 2188 CG TRP A 296 -7.190 -10.364 31.254 1.00 40.00 C
+ATOM 2189 CD1 TRP A 296 -7.320 -9.012 30.967 1.00 40.00 C
+ATOM 2190 CD2 TRP A 296 -8.467 -10.740 31.884 1.00 40.00 C
+ATOM 2191 NE1 TRP A 296 -8.546 -8.541 31.365 1.00 40.00 N
+ATOM 2192 CE2 TRP A 296 -9.281 -9.522 31.922 1.00 40.00 C
+ATOM 2193 CE3 TRP A 296 -8.994 -11.916 32.396 1.00 40.00 C
+ATOM 2194 CZ2 TRP A 296 -10.558 -9.505 32.459 1.00 40.00 C
+ATOM 2195 CZ3 TRP A 296 -10.286 -11.887 32.932 1.00 40.00 C
+ATOM 2196 CH2 TRP A 296 -11.045 -10.708 32.965 1.00 40.00 C
+ATOM 2197 N PHE A 297 -6.896 -11.441 28.045 1.00 40.00 N
+ATOM 2198 CA PHE A 297 -7.820 -10.958 27.031 1.00 40.00 C
+ATOM 2199 C PHE A 297 -8.493 -12.110 26.298 1.00 40.00 C
+ATOM 2200 O PHE A 297 -9.658 -12.006 25.930 1.00 40.00 O
+ATOM 2201 CB PHE A 297 -7.132 -9.947 26.112 1.00 40.00 C
+ATOM 2202 CG PHE A 297 -6.670 -8.710 26.844 1.00 40.00 C
+ATOM 2203 CD1 PHE A 297 -5.410 -8.668 27.455 1.00 40.00 C
+ATOM 2204 CD2 PHE A 297 -7.506 -7.596 26.972 1.00 40.00 C
+ATOM 2205 CE1 PHE A 297 -4.987 -7.534 28.152 1.00 40.00 C
+ATOM 2206 CE2 PHE A 297 -7.085 -6.458 27.667 1.00 40.00 C
+ATOM 2207 CZ PHE A 297 -5.824 -6.425 28.256 1.00 40.00 C
+ATOM 2208 N ASP A 298 -7.783 -13.229 26.167 1.00 40.00 N
+ATOM 2209 CA ASP A 298 -8.319 -14.437 25.529 1.00 40.00 C
+ATOM 2210 C ASP A 298 -9.290 -15.176 26.406 1.00 40.00 C
+ATOM 2211 O ASP A 298 -10.206 -15.832 25.919 1.00 40.00 O
+ATOM 2212 CB ASP A 298 -7.189 -15.366 25.159 1.00 40.00 C
+ATOM 2213 CG ASP A 298 -6.196 -14.707 24.252 1.00 40.00 C
+ATOM 2214 OD1 ASP A 298 -5.434 -15.452 23.612 1.00 40.00 O
+ATOM 2215 OD2 ASP A 298 -6.175 -13.449 24.170 1.00 40.00 O
+ATOM 2216 N TYR A 299 -9.069 -15.079 27.707 1.00 40.00 N
+ATOM 2217 CA TYR A 299 -10.021 -15.585 28.667 1.00 40.00 C
+ATOM 2218 C TYR A 299 -11.202 -14.625 28.747 1.00 40.00 C
+ATOM 2219 O TYR A 299 -12.342 -15.051 28.940 1.00 40.00 O
+ATOM 2220 CB TYR A 299 -9.351 -15.732 30.026 1.00 40.00 C
+ATOM 2221 CG TYR A 299 -10.108 -16.593 31.022 1.00 40.00 C
+ATOM 2222 CD1 TYR A 299 -10.252 -17.974 30.834 1.00 40.00 C
+ATOM 2223 CD2 TYR A 299 -10.653 -16.032 32.180 1.00 40.00 C
+ATOM 2224 CE1 TYR A 299 -10.930 -18.761 31.765 1.00 40.00 C
+ATOM 2225 CE2 TYR A 299 -11.332 -16.813 33.117 1.00 40.00 C
+ATOM 2226 CZ TYR A 299 -11.470 -18.173 32.905 1.00 40.00 C
+ATOM 2227 OH TYR A 299 -12.141 -18.936 33.832 1.00 40.00 O
+ATOM 2228 N LYS A 300 -10.915 -13.333 28.578 1.00 40.00 N
+ATOM 2229 CA LYS A 300 -11.937 -12.285 28.554 1.00 40.00 C
+ATOM 2230 C LYS A 300 -12.916 -12.553 27.430 1.00 40.00 C
+ATOM 2231 O LYS A 300 -14.065 -12.931 27.672 1.00 40.00 O
+ATOM 2232 CB LYS A 300 -11.297 -10.898 28.377 1.00 40.00 C
+ATOM 2233 CG LYS A 300 -12.301 -9.742 28.322 1.00 40.00 C
+ATOM 2234 CD LYS A 300 -11.662 -8.388 27.996 1.00 40.00 C
+ATOM 2235 CE LYS A 300 -11.327 -7.569 29.245 1.00 40.00 C
+ATOM 2236 NZ LYS A 300 -10.991 -6.153 28.917 1.00 40.00 N
+ATOM 2237 N LYS A 301 -12.438 -12.354 26.205 1.00 40.00 N
+ATOM 2238 CA LYS A 301 -13.154 -12.733 25.006 1.00 40.00 C
+ATOM 2239 C LYS A 301 -14.095 -13.901 25.279 1.00 40.00 C
+ATOM 2240 O LYS A 301 -15.305 -13.796 25.083 1.00 40.00 O
+ATOM 2241 CB LYS A 301 -12.149 -13.165 23.950 1.00 40.00 C
+ATOM 2242 CG LYS A 301 -11.372 -12.036 23.309 1.00 40.00 C
+ATOM 2243 CD LYS A 301 -10.036 -12.541 22.773 1.00 40.00 C
+ATOM 2244 CE LYS A 301 -9.474 -11.659 21.667 1.00 40.00 C
+ATOM 2245 NZ LYS A 301 -9.623 -10.192 21.906 1.00 40.00 N
+ATOM 2246 N GLN A 302 -13.520 -15.006 25.748 1.00 40.00 N
+ATOM 2247 CA GLN A 302 -14.242 -16.259 25.962 1.00 40.00 C
+ATOM 2248 C GLN A 302 -15.452 -16.119 26.882 1.00 40.00 C
+ATOM 2249 O GLN A 302 -16.534 -16.633 26.591 1.00 40.00 O
+ATOM 2250 CB GLN A 302 -13.280 -17.305 26.515 1.00 40.00 C
+ATOM 2251 CG GLN A 302 -13.917 -18.647 26.825 1.00 40.00 C
+ATOM 2252 CD GLN A 302 -13.017 -19.509 27.674 1.00 40.00 C
+ATOM 2253 OE1 GLN A 302 -13.421 -19.966 28.745 1.00 40.00 O
+ATOM 2254 NE2 GLN A 302 -11.780 -19.722 27.213 1.00 40.00 N
+ATOM 2255 N LEU A 303 -15.262 -15.427 27.996 1.00 40.00 N
+ATOM 2256 CA LEU A 303 -16.354 -15.194 28.913 1.00 40.00 C
+ATOM 2257 C LEU A 303 -17.409 -14.397 28.201 1.00 40.00 C
+ATOM 2258 O LEU A 303 -18.594 -14.648 28.369 1.00 40.00 O
+ATOM 2259 CB LEU A 303 -15.872 -14.425 30.129 1.00 40.00 C
+ATOM 2260 CG LEU A 303 -14.750 -15.113 30.898 1.00 40.00 C
+ATOM 2261 CD1 LEU A 303 -13.966 -14.082 31.692 1.00 40.00 C
+ATOM 2262 CD2 LEU A 303 -15.284 -16.233 31.787 1.00 40.00 C
+ATOM 2263 N LYS A 304 -16.962 -13.439 27.393 1.00 40.00 N
+ATOM 2264 CA LYS A 304 -17.874 -12.588 26.639 1.00 40.00 C
+ATOM 2265 C LYS A 304 -18.707 -13.447 25.712 1.00 40.00 C
+ATOM 2266 O LYS A 304 -19.932 -13.366 25.752 1.00 40.00 O
+ATOM 2267 CB LYS A 304 -17.133 -11.497 25.861 1.00 40.00 C
+ATOM 2268 CG LYS A 304 -16.518 -10.423 26.738 1.00 40.00 C
+ATOM 2269 CD LYS A 304 -15.816 -9.347 25.930 1.00 40.00 C
+ATOM 2270 CE LYS A 304 -16.647 -8.076 25.838 1.00 40.00 C
+ATOM 2271 NZ LYS A 304 -15.861 -6.953 25.250 1.00 40.00 N
+ATOM 2272 N ARG A 305 -18.052 -14.284 24.903 1.00 40.00 N
+ATOM 2273 CA ARG A 305 -18.775 -15.237 24.062 1.00 40.00 C
+ATOM 2274 C ARG A 305 -19.781 -15.994 24.912 1.00 40.00 C
+ATOM 2275 O ARG A 305 -20.893 -16.262 24.467 1.00 40.00 O
+ATOM 2276 CB ARG A 305 -17.836 -16.218 23.361 1.00 40.00 C
+ATOM 2277 CG ARG A 305 -17.602 -15.931 21.881 1.00 40.00 C
+ATOM 2278 CD ARG A 305 -16.864 -17.080 21.181 1.00 40.00 C
+ATOM 2279 NE ARG A 305 -15.444 -17.174 21.566 1.00 40.00 N
+ATOM 2280 CZ ARG A 305 -14.917 -18.103 22.373 1.00 40.00 C
+ATOM 2281 NH1 ARG A 305 -15.684 -19.064 22.893 1.00 40.00 N
+ATOM 2282 NH2 ARG A 305 -13.610 -18.072 22.660 1.00 40.00 N
+ATOM 2283 N GLY A 306 -19.403 -16.312 26.147 1.00 40.00 N
+ATOM 2284 CA GLY A 306 -20.336 -16.937 27.074 1.00 40.00 C
+ATOM 2285 C GLY A 306 -21.323 -15.966 27.709 1.00 40.00 C
+ATOM 2286 O GLY A 306 -22.011 -16.332 28.665 1.00 40.00 O
+ATOM 2287 N ASP A 307 -21.400 -14.736 27.194 1.00 40.00 N
+ATOM 2288 CA ASP A 307 -22.252 -13.696 27.777 1.00 40.00 C
+ATOM 2289 C ASP A 307 -21.947 -13.530 29.255 1.00 40.00 C
+ATOM 2290 O ASP A 307 -22.772 -13.011 30.004 1.00 40.00 O
+ATOM 2291 CB ASP A 307 -23.736 -14.043 27.621 1.00 40.00 C
+ATOM 2292 CG ASP A 307 -24.146 -14.239 26.187 1.00 40.00 C
+ATOM 2293 OD1 ASP A 307 -23.858 -13.364 25.341 1.00 40.00 O
+ATOM 2294 OD2 ASP A 307 -24.781 -15.272 25.913 1.00 40.00 O
+ATOM 2295 N GLN A 308 -20.772 -13.995 29.675 1.00 40.00 N
+ATOM 2296 CA GLN A 308 -20.417 -14.016 31.090 1.00 40.00 C
+ATOM 2297 C GLN A 308 -19.707 -12.733 31.512 1.00 40.00 C
+ATOM 2298 O GLN A 308 -19.525 -12.476 32.703 1.00 40.00 O
+ATOM 2299 CB GLN A 308 -19.618 -15.288 31.445 1.00 40.00 C
+ATOM 2300 CG GLN A 308 -20.503 -16.538 31.592 1.00 40.00 C
+ATOM 2301 CD GLN A 308 -19.745 -17.843 31.852 1.00 40.00 C
+ATOM 2302 OE1 GLN A 308 -19.205 -18.069 32.936 1.00 40.00 O
+ATOM 2303 NE2 GLN A 308 -19.741 -18.725 30.863 1.00 40.00 N
+ATOM 2304 N TRP A 309 -19.348 -11.914 30.525 1.00 40.00 N
+ATOM 2305 CA TRP A 309 -18.743 -10.606 30.762 1.00 40.00 C
+ATOM 2306 C TRP A 309 -19.429 -9.588 29.935 1.00 40.00 C
+ATOM 2307 O TRP A 309 -19.490 -9.721 28.708 1.00 40.00 O
+ATOM 2308 CB TRP A 309 -17.304 -10.628 30.340 1.00 40.00 C
+ATOM 2309 CG TRP A 309 -16.536 -9.401 30.745 1.00 40.00 C
+ATOM 2310 CD1 TRP A 309 -16.325 -8.230 30.014 1.00 40.00 C
+ATOM 2311 CD2 TRP A 309 -15.808 -9.206 31.991 1.00 40.00 C
+ATOM 2312 NE1 TRP A 309 -15.533 -7.348 30.712 1.00 40.00 N
+ATOM 2313 CE2 TRP A 309 -15.189 -7.870 31.906 1.00 40.00 C
+ATOM 2314 CE3 TRP A 309 -15.602 -9.983 33.132 1.00 40.00 C
+ATOM 2315 CZ2 TRP A 309 -14.410 -7.356 32.928 1.00 40.00 C
+ATOM 2316 CZ3 TRP A 309 -14.819 -9.453 34.162 1.00 40.00 C
+ATOM 2317 CH2 TRP A 309 -14.239 -8.169 34.061 1.00 40.00 C
+ATOM 2318 N ASN A 310 -19.928 -8.545 30.598 1.00 40.00 N
+ATOM 2319 CA ASN A 310 -20.834 -7.571 29.971 1.00 40.00 C
+ATOM 2320 C ASN A 310 -20.569 -6.108 30.408 1.00 40.00 C
+ATOM 2321 O ASN A 310 -20.638 -5.790 31.596 1.00 40.00 O
+ATOM 2322 CB ASN A 310 -22.298 -7.989 30.218 1.00 40.00 C
+ATOM 2323 CG ASN A 310 -22.550 -9.477 29.950 1.00 40.00 C
+ATOM 2324 OD1 ASN A 310 -22.310 -9.986 28.847 1.00 40.00 O
+ATOM 2325 ND2 ASN A 310 -23.048 -10.178 30.963 1.00 40.00 N
+ATOM 2326 N VAL A 311 -20.276 -5.232 29.441 1.00 40.00 N
+ATOM 2327 CA VAL A 311 -19.674 -3.910 29.698 1.00 40.00 C
+ATOM 2328 C VAL A 311 -20.449 -2.734 29.105 1.00 40.00 C
+ATOM 2329 O VAL A 311 -20.713 -2.683 27.917 1.00 40.00 O
+ATOM 2330 CB VAL A 311 -18.239 -3.851 29.132 1.00 40.00 C
+ATOM 2331 CG1 VAL A 311 -17.594 -2.513 29.430 1.00 40.00 C
+ATOM 2332 CG2 VAL A 311 -17.387 -4.978 29.689 1.00 40.00 C
+ATOM 2333 N GLU A 312 -20.760 -1.757 29.932 1.00 40.00 N
+ATOM 2334 CA GLU A 312 -21.562 -0.642 29.506 1.00 40.00 C
+ATOM 2335 C GLU A 312 -20.966 0.609 30.137 1.00 40.00 C
+ATOM 2336 O GLU A 312 -21.380 0.997 31.224 1.00 40.00 O
+ATOM 2337 CB GLU A 312 -22.976 -0.879 30.028 1.00 40.00 C
+ATOM 2338 CG GLU A 312 -24.017 0.174 29.690 1.00 40.00 C
+ATOM 2339 CD GLU A 312 -25.082 -0.356 28.756 1.00 40.00 C
+ATOM 2340 OE1 GLU A 312 -24.693 -0.818 27.662 1.00 40.00 O
+ATOM 2341 OE2 GLU A 312 -26.294 -0.316 29.114 1.00 40.00 O
+ATOM 2342 N VAL A 313 -19.977 1.231 29.498 1.00 40.00 N
+ATOM 2343 CA VAL A 313 -19.362 2.434 30.091 1.00 40.00 C
+ATOM 2344 C VAL A 313 -19.471 3.659 29.212 1.00 40.00 C
+ATOM 2345 O VAL A 313 -19.553 3.532 28.011 1.00 40.00 O
+ATOM 2346 CB VAL A 313 -17.887 2.230 30.497 1.00 40.00 C
+ATOM 2347 CG1 VAL A 313 -17.780 1.254 31.663 1.00 40.00 C
+ATOM 2348 CG2 VAL A 313 -17.043 1.778 29.318 1.00 40.00 C
+ATOM 2349 N TYR A 314 -19.471 4.843 29.820 1.00 40.00 N
+ATOM 2350 CA TYR A 314 -19.621 6.099 29.083 1.00 40.00 C
+ATOM 2351 C TYR A 314 -18.769 7.202 29.668 1.00 40.00 C
+ATOM 2352 O TYR A 314 -18.195 7.056 30.748 1.00 40.00 O
+ATOM 2353 CB TYR A 314 -21.079 6.553 29.038 1.00 40.00 C
+ATOM 2354 CG TYR A 314 -21.819 6.413 30.341 1.00 40.00 C
+ATOM 2355 CD1 TYR A 314 -21.944 7.475 31.212 1.00 40.00 C
+ATOM 2356 CD2 TYR A 314 -22.406 5.212 30.698 1.00 40.00 C
+ATOM 2357 CE1 TYR A 314 -22.631 7.340 32.413 1.00 40.00 C
+ATOM 2358 CE2 TYR A 314 -23.089 5.064 31.897 1.00 40.00 C
+ATOM 2359 CZ TYR A 314 -23.206 6.127 32.753 1.00 40.00 C
+ATOM 2360 OH TYR A 314 -23.903 5.960 33.936 1.00 40.00 O
+ATOM 2361 OXT TYR A 314 -18.642 8.263 29.059 1.00 40.00 O
+TER 2362 TYR A 314
+ATOM 2363 N ALA B 1 -53.291 -14.159 81.934 1.00 40.00 N
+ATOM 2364 CA ALA B 1 -52.106 -13.577 81.238 1.00 40.00 C
+ATOM 2365 C ALA B 1 -51.069 -13.092 82.240 1.00 40.00 C
+ATOM 2366 O ALA B 1 -51.414 -12.674 83.342 1.00 40.00 O
+ATOM 2367 CB ALA B 1 -52.535 -12.439 80.327 1.00 40.00 C
+ATOM 2368 N THR B 2 -49.799 -13.152 81.850 1.00 40.00 N
+ATOM 2369 CA THR B 2 -48.690 -12.696 82.696 1.00 40.00 C
+ATOM 2370 C THR B 2 -47.816 -11.746 81.869 1.00 40.00 C
+ATOM 2371 O THR B 2 -47.528 -12.035 80.713 1.00 40.00 O
+ATOM 2372 CB THR B 2 -47.873 -13.900 83.257 1.00 40.00 C
+ATOM 2373 OG1 THR B 2 -48.706 -14.689 84.122 1.00 40.00 O
+ATOM 2374 CG2 THR B 2 -46.631 -13.451 84.045 1.00 40.00 C
+ATOM 2375 N TYR B 3 -47.415 -10.615 82.456 1.00 40.00 N
+ATOM 2376 CA TYR B 3 -46.621 -9.595 81.748 1.00 40.00 C
+ATOM 2377 C TYR B 3 -45.389 -9.150 82.549 1.00 40.00 C
+ATOM 2378 O TYR B 3 -45.362 -9.266 83.784 1.00 40.00 O
+ATOM 2379 CB TYR B 3 -47.468 -8.354 81.437 1.00 40.00 C
+ATOM 2380 CG TYR B 3 -48.872 -8.592 80.913 1.00 40.00 C
+ATOM 2381 CD1 TYR B 3 -49.920 -8.921 81.780 1.00 40.00 C
+ATOM 2382 CD2 TYR B 3 -49.165 -8.435 79.564 1.00 40.00 C
+ATOM 2383 CE1 TYR B 3 -51.207 -9.116 81.313 1.00 40.00 C
+ATOM 2384 CE2 TYR B 3 -50.454 -8.627 79.090 1.00 40.00 C
+ATOM 2385 CZ TYR B 3 -51.469 -8.966 79.974 1.00 40.00 C
+ATOM 2386 OH TYR B 3 -52.758 -9.163 79.537 1.00 40.00 O
+ATOM 2387 N ASN B 4 -44.382 -8.625 81.843 1.00 40.00 N
+ATOM 2388 CA ASN B 4 -43.164 -8.113 82.484 1.00 40.00 C
+ATOM 2389 C ASN B 4 -43.332 -6.746 83.138 1.00 40.00 C
+ATOM 2390 O ASN B 4 -43.884 -5.810 82.547 1.00 40.00 O
+ATOM 2391 CB ASN B 4 -41.967 -8.071 81.519 1.00 40.00 C
+ATOM 2392 CG ASN B 4 -40.730 -7.419 82.145 1.00 40.00 C
+ATOM 2393 OD1 ASN B 4 -40.209 -7.886 83.170 1.00 40.00 O
+ATOM 2394 ND2 ASN B 4 -40.260 -6.329 81.534 1.00 40.00 N
+ATOM 2395 N VAL B 5 -42.831 -6.649 84.367 1.00 40.00 N
+ATOM 2396 CA VAL B 5 -42.800 -5.390 85.098 1.00 40.00 C
+ATOM 2397 C VAL B 5 -41.394 -5.073 85.574 1.00 40.00 C
+ATOM 2398 O VAL B 5 -40.709 -5.913 86.165 1.00 40.00 O
+ATOM 2399 CB VAL B 5 -43.747 -5.378 86.310 1.00 40.00 C
+ATOM 2400 CG1 VAL B 5 -43.828 -3.968 86.876 1.00 40.00 C
+ATOM 2401 CG2 VAL B 5 -45.135 -5.889 85.927 1.00 40.00 C
+ATOM 2402 N LYS B 6 -40.995 -3.839 85.305 1.00 40.00 N
+ATOM 2403 CA LYS B 6 -39.669 -3.343 85.612 1.00 40.00 C
+ATOM 2404 C LYS B 6 -39.817 -2.233 86.647 1.00 40.00 C
+ATOM 2405 O LYS B 6 -40.451 -1.210 86.383 1.00 40.00 O
+ATOM 2406 CB LYS B 6 -39.025 -2.818 84.324 1.00 40.00 C
+ATOM 2407 CG LYS B 6 -37.626 -2.237 84.463 1.00 40.00 C
+ATOM 2408 CD LYS B 6 -37.094 -1.703 83.132 1.00 40.00 C
+ATOM 2409 CE LYS B 6 -36.805 -2.811 82.123 1.00 40.00 C
+ATOM 2410 NZ LYS B 6 -35.913 -2.359 81.016 1.00 40.00 N
+ATOM 2411 N LEU B 7 -39.244 -2.441 87.827 1.00 40.00 N
+ATOM 2412 CA LEU B 7 -39.395 -1.482 88.903 1.00 40.00 C
+ATOM 2413 C LEU B 7 -38.138 -0.714 89.101 1.00 40.00 C
+ATOM 2414 O LEU B 7 -37.073 -1.294 89.283 1.00 40.00 O
+ATOM 2415 CB LEU B 7 -39.777 -2.172 90.199 1.00 40.00 C
+ATOM 2416 CG LEU B 7 -41.164 -2.805 90.153 1.00 40.00 C
+ATOM 2417 CD1 LEU B 7 -41.447 -3.576 91.437 1.00 40.00 C
+ATOM 2418 CD2 LEU B 7 -42.225 -1.744 89.896 1.00 40.00 C
+ATOM 2419 N ILE B 8 -38.280 0.604 89.057 1.00 40.00 N
+ATOM 2420 CA ILE B 8 -37.173 1.519 89.306 1.00 40.00 C
+ATOM 2421 C ILE B 8 -37.271 2.090 90.730 1.00 40.00 C
+ATOM 2422 O ILE B 8 -37.755 3.216 90.945 1.00 40.00 O
+ATOM 2423 CB ILE B 8 -37.091 2.621 88.231 1.00 40.00 C
+ATOM 2424 CG1 ILE B 8 -37.457 2.024 86.867 1.00 40.00 C
+ATOM 2425 CG2 ILE B 8 -35.693 3.229 88.217 1.00 40.00 C
+ATOM 2426 CD1 ILE B 8 -38.366 2.888 86.025 1.00 40.00 C
+ATOM 2427 N THR B 9 -36.822 1.271 91.691 1.00 40.00 N
+ATOM 2428 CA THR B 9 -36.771 1.620 93.114 1.00 40.00 C
+ATOM 2429 C THR B 9 -35.679 2.687 93.308 1.00 40.00 C
+ATOM 2430 O THR B 9 -34.882 2.915 92.387 1.00 40.00 O
+ATOM 2431 CB THR B 9 -36.547 0.359 94.011 1.00 40.00 C
+ATOM 2432 OG1 THR B 9 -35.149 0.079 94.170 1.00 40.00 O
+ATOM 2433 CG2 THR B 9 -37.244 -0.870 93.421 1.00 40.00 C
+ATOM 2434 N PRO B 10 -35.640 3.359 94.482 1.00 40.00 N
+ATOM 2435 CA PRO B 10 -34.550 4.320 94.721 1.00 40.00 C
+ATOM 2436 C PRO B 10 -33.225 3.583 94.929 1.00 40.00 C
+ATOM 2437 O PRO B 10 -32.163 4.199 95.046 1.00 40.00 O
+ATOM 2438 CB PRO B 10 -34.974 5.029 96.015 1.00 40.00 C
+ATOM 2439 CG PRO B 10 -36.379 4.606 96.270 1.00 40.00 C
+ATOM 2440 CD PRO B 10 -36.520 3.254 95.654 1.00 40.00 C
+ATOM 2441 N GLU B 11 -33.316 2.258 94.969 1.00 40.00 N
+ATOM 2442 CA GLU B 11 -32.167 1.388 95.091 1.00 40.00 C
+ATOM 2443 C GLU B 11 -32.037 0.467 93.870 1.00 40.00 C
+ATOM 2444 O GLU B 11 -31.719 -0.727 93.991 1.00 40.00 O
+ATOM 2445 CB GLU B 11 -32.288 0.579 96.370 1.00 40.00 C
+ATOM 2446 CG GLU B 11 -32.489 1.441 97.598 1.00 40.00 C
+ATOM 2447 CD GLU B 11 -32.233 0.668 98.867 1.00 40.00 C
+ATOM 2448 OE1 GLU B 11 -32.989 -0.288 99.140 1.00 40.00 O
+ATOM 2449 OE2 GLU B 11 -31.270 1.010 99.586 1.00 40.00 O
+ATOM 2450 N GLY B 12 -32.297 1.037 92.694 1.00 40.00 N
+ATOM 2451 CA GLY B 12 -32.036 0.361 91.432 1.00 40.00 C
+ATOM 2452 C GLY B 12 -33.216 -0.383 90.858 1.00 40.00 C
+ATOM 2453 O GLY B 12 -34.280 -0.484 91.484 1.00 40.00 O
+ATOM 2454 N GLU B 13 -32.990 -0.919 89.662 1.00 40.00 N
+ATOM 2455 CA GLU B 13 -34.008 -1.581 88.856 1.00 40.00 C
+ATOM 2456 C GLU B 13 -34.140 -3.063 89.241 1.00 40.00 C
+ATOM 2457 O GLU B 13 -33.197 -3.658 89.771 1.00 40.00 O
+ATOM 2458 CB GLU B 13 -33.635 -1.411 87.379 1.00 40.00 C
+ATOM 2459 CG GLU B 13 -34.758 -1.590 86.382 1.00 40.00 C
+ATOM 2460 CD GLU B 13 -34.220 -1.770 84.979 1.00 40.00 C
+ATOM 2461 OE1 GLU B 13 -34.314 -2.901 84.452 1.00 40.00 O
+ATOM 2462 OE2 GLU B 13 -33.683 -0.790 84.418 1.00 40.00 O
+ATOM 2463 N VAL B 14 -35.323 -3.631 89.004 1.00 40.00 N
+ATOM 2464 CA VAL B 14 -35.569 -5.071 89.164 1.00 40.00 C
+ATOM 2465 C VAL B 14 -36.873 -5.478 88.460 1.00 40.00 C
+ATOM 2466 O VAL B 14 -37.894 -4.806 88.585 1.00 40.00 O
+ATOM 2467 CB VAL B 14 -35.527 -5.534 90.653 1.00 40.00 C
+ATOM 2468 CG1 VAL B 14 -36.541 -4.785 91.514 1.00 40.00 C
+ATOM 2469 CG2 VAL B 14 -35.688 -7.049 90.771 1.00 40.00 C
+ATOM 2470 N GLU B 15 -36.821 -6.570 87.703 1.00 40.00 N
+ATOM 2471 CA GLU B 15 -37.971 -7.037 86.922 1.00 40.00 C
+ATOM 2472 C GLU B 15 -38.583 -8.301 87.511 1.00 40.00 C
+ATOM 2473 O GLU B 15 -37.996 -8.937 88.391 1.00 40.00 O
+ATOM 2474 CB GLU B 15 -37.589 -7.256 85.454 1.00 40.00 C
+ATOM 2475 CG GLU B 15 -37.021 -6.013 84.780 1.00 40.00 C
+ATOM 2476 CD GLU B 15 -36.490 -6.278 83.382 1.00 40.00 C
+ATOM 2477 OE1 GLU B 15 -35.323 -5.908 83.105 1.00 40.00 O
+ATOM 2478 OE2 GLU B 15 -37.239 -6.858 82.563 1.00 40.00 O
+ATOM 2479 N LEU B 16 -39.773 -8.645 87.025 1.00 40.00 N
+ATOM 2480 CA LEU B 16 -40.571 -9.736 87.586 1.00 40.00 C
+ATOM 2481 C LEU B 16 -41.869 -9.946 86.818 1.00 40.00 C
+ATOM 2482 O LEU B 16 -42.302 -9.087 86.054 1.00 40.00 O
+ATOM 2483 CB LEU B 16 -40.907 -9.475 89.050 1.00 40.00 C
+ATOM 2484 CG LEU B 16 -41.741 -8.218 89.287 1.00 40.00 C
+ATOM 2485 CD1 LEU B 16 -42.715 -8.439 90.428 1.00 40.00 C
+ATOM 2486 CD2 LEU B 16 -40.852 -7.006 89.547 1.00 40.00 C
+ATOM 2487 N GLN B 17 -42.500 -11.089 87.060 1.00 40.00 N
+ATOM 2488 CA GLN B 17 -43.656 -11.522 86.279 1.00 40.00 C
+ATOM 2489 C GLN B 17 -44.938 -11.455 87.089 1.00 40.00 C
+ATOM 2490 O GLN B 17 -45.044 -12.076 88.148 1.00 40.00 O
+ATOM 2491 CB GLN B 17 -43.439 -12.948 85.745 1.00 40.00 C
+ATOM 2492 CG GLN B 17 -42.303 -13.069 84.733 1.00 40.00 C
+ATOM 2493 CD GLN B 17 -42.375 -12.015 83.633 1.00 40.00 C
+ATOM 2494 OE1 GLN B 17 -41.444 -11.226 83.450 1.00 40.00 O
+ATOM 2495 NE2 GLN B 17 -43.490 -11.993 82.901 1.00 40.00 N
+ATOM 2496 N VAL B 18 -45.914 -10.707 86.585 1.00 40.00 N
+ATOM 2497 CA VAL B 18 -47.151 -10.507 87.333 1.00 40.00 C
+ATOM 2498 C VAL B 18 -48.420 -10.876 86.580 1.00 40.00 C
+ATOM 2499 O VAL B 18 -48.741 -10.271 85.549 1.00 40.00 O
+ATOM 2500 CB VAL B 18 -47.303 -9.065 87.838 1.00 40.00 C
+ATOM 2501 CG1 VAL B 18 -48.354 -9.017 88.947 1.00 40.00 C
+ATOM 2502 CG2 VAL B 18 -45.963 -8.520 88.318 1.00 40.00 C
+ATOM 2503 N PRO B 19 -49.154 -11.867 87.111 1.00 40.00 N
+ATOM 2504 CA PRO B 19 -50.457 -12.258 86.585 1.00 40.00 C
+ATOM 2505 C PRO B 19 -51.437 -11.091 86.617 1.00 40.00 C
+ATOM 2506 O PRO B 19 -51.528 -10.413 87.639 1.00 40.00 O
+ATOM 2507 CB PRO B 19 -50.897 -13.364 87.551 1.00 40.00 C
+ATOM 2508 CG PRO B 19 -49.618 -13.959 88.038 1.00 40.00 C
+ATOM 2509 CD PRO B 19 -48.689 -12.788 88.168 1.00 40.00 C
+ATOM 2510 N ASP B 20 -52.153 -10.875 85.506 1.00 40.00 N
+ATOM 2511 CA ASP B 20 -53.104 -9.750 85.347 1.00 40.00 C
+ATOM 2512 C ASP B 20 -54.350 -9.792 86.256 1.00 40.00 C
+ATOM 2513 O ASP B 20 -55.247 -8.947 86.131 1.00 40.00 O
+ATOM 2514 CB ASP B 20 -53.492 -9.524 83.859 1.00 40.00 C
+ATOM 2515 CG ASP B 20 -54.532 -10.535 83.323 1.00 40.00 C
+ATOM 2516 OD1 ASP B 20 -54.851 -10.458 82.106 1.00 40.00 O
+ATOM 2517 OD2 ASP B 20 -55.033 -11.391 84.093 1.00 40.00 O
+ATOM 2518 N ASP B 21 -54.386 -10.777 87.156 1.00 40.00 N
+ATOM 2519 CA ASP B 21 -55.429 -10.904 88.175 1.00 40.00 C
+ATOM 2520 C ASP B 21 -54.848 -10.740 89.583 1.00 40.00 C
+ATOM 2521 O ASP B 21 -55.563 -10.873 90.583 1.00 40.00 O
+ATOM 2522 CB ASP B 21 -56.128 -12.257 88.055 1.00 40.00 C
+ATOM 2523 CG ASP B 21 -55.154 -13.404 87.801 1.00 40.00 C
+ATOM 2524 OD1 ASP B 21 -53.933 -13.251 88.036 1.00 40.00 O
+ATOM 2525 OD2 ASP B 21 -55.615 -14.472 87.352 1.00 40.00 O
+ATOM 2526 N VAL B 22 -53.548 -10.449 89.643 1.00 40.00 N
+ATOM 2527 CA VAL B 22 -52.842 -10.206 90.900 1.00 40.00 C
+ATOM 2528 C VAL B 22 -52.370 -8.749 90.938 1.00 40.00 C
+ATOM 2529 O VAL B 22 -51.800 -8.251 89.961 1.00 40.00 O
+ATOM 2530 CB VAL B 22 -51.640 -11.179 91.062 1.00 40.00 C
+ATOM 2531 CG1 VAL B 22 -50.811 -10.856 92.306 1.00 40.00 C
+ATOM 2532 CG2 VAL B 22 -52.118 -12.627 91.103 1.00 40.00 C
+ATOM 2533 N TYR B 23 -52.630 -8.073 92.059 1.00 40.00 N
+ATOM 2534 CA TYR B 23 -52.105 -6.731 92.301 1.00 40.00 C
+ATOM 2535 C TYR B 23 -50.579 -6.719 92.270 1.00 40.00 C
+ATOM 2536 O TYR B 23 -49.926 -7.702 92.647 1.00 40.00 O
+ATOM 2537 CB TYR B 23 -52.572 -6.210 93.649 1.00 40.00 C
+ATOM 2538 CG TYR B 23 -54.047 -5.929 93.750 1.00 40.00 C
+ATOM 2539 CD1 TYR B 23 -54.864 -6.674 94.605 1.00 40.00 C
+ATOM 2540 CD2 TYR B 23 -54.631 -4.906 93.011 1.00 40.00 C
+ATOM 2541 CE1 TYR B 23 -56.224 -6.404 94.718 1.00 40.00 C
+ATOM 2542 CE2 TYR B 23 -55.990 -4.632 93.110 1.00 40.00 C
+ATOM 2543 CZ TYR B 23 -56.784 -5.378 93.966 1.00 40.00 C
+ATOM 2544 OH TYR B 23 -58.133 -5.095 94.060 1.00 40.00 O
+ATOM 2545 N ILE B 24 -50.015 -5.593 91.839 1.00 40.00 N
+ATOM 2546 CA ILE B 24 -48.579 -5.498 91.589 1.00 40.00 C
+ATOM 2547 C ILE B 24 -47.747 -5.671 92.847 1.00 40.00 C
+ATOM 2548 O ILE B 24 -46.802 -6.457 92.871 1.00 40.00 O
+ATOM 2549 CB ILE B 24 -48.221 -4.176 90.903 1.00 40.00 C
+ATOM 2550 CG1 ILE B 24 -48.733 -4.196 89.477 1.00 40.00 C
+ATOM 2551 CG2 ILE B 24 -46.720 -3.994 90.855 1.00 40.00 C
+ATOM 2552 CD1 ILE B 24 -48.951 -2.828 88.881 1.00 40.00 C
+ATOM 2553 N LEU B 25 -48.117 -4.932 93.886 1.00 40.00 N
+ATOM 2554 CA LEU B 25 -47.412 -4.939 95.166 1.00 40.00 C
+ATOM 2555 C LEU B 25 -47.416 -6.321 95.823 1.00 40.00 C
+ATOM 2556 O LEU B 25 -46.398 -6.747 96.385 1.00 40.00 O
+ATOM 2557 CB LEU B 25 -48.027 -3.896 96.104 1.00 40.00 C
+ATOM 2558 CG LEU B 25 -47.376 -3.610 97.455 1.00 40.00 C
+ATOM 2559 CD1 LEU B 25 -46.174 -2.689 97.310 1.00 40.00 C
+ATOM 2560 CD2 LEU B 25 -48.415 -2.996 98.378 1.00 40.00 C
+ATOM 2561 N ASP B 26 -48.557 -7.008 95.745 1.00 40.00 N
+ATOM 2562 CA ASP B 26 -48.681 -8.387 96.208 1.00 40.00 C
+ATOM 2563 C ASP B 26 -47.572 -9.258 95.659 1.00 40.00 C
+ATOM 2564 O ASP B 26 -46.868 -9.932 96.417 1.00 40.00 O
+ATOM 2565 CB ASP B 26 -50.022 -8.953 95.790 1.00 40.00 C
+ATOM 2566 CG ASP B 26 -51.158 -8.223 96.424 1.00 40.00 C
+ATOM 2567 OD1 ASP B 26 -50.891 -7.377 97.298 1.00 40.00 O
+ATOM 2568 OD2 ASP B 26 -52.311 -8.486 96.047 1.00 40.00 O
+ATOM 2569 N GLN B 27 -47.415 -9.224 94.339 1.00 40.00 N
+ATOM 2570 CA GLN B 27 -46.324 -9.919 93.677 1.00 40.00 C
+ATOM 2571 C GLN B 27 -44.939 -9.535 94.252 1.00 40.00 C
+ATOM 2572 O GLN B 27 -44.220 -10.401 94.777 1.00 40.00 O
+ATOM 2573 CB GLN B 27 -46.396 -9.683 92.162 1.00 40.00 C
+ATOM 2574 CG GLN B 27 -45.584 -10.675 91.344 1.00 40.00 C
+ATOM 2575 CD GLN B 27 -46.015 -12.104 91.588 1.00 40.00 C
+ATOM 2576 OE1 GLN B 27 -47.193 -12.437 91.453 1.00 40.00 O
+ATOM 2577 NE2 GLN B 27 -45.066 -12.957 91.960 1.00 40.00 N
+ATOM 2578 N ALA B 28 -44.597 -8.241 94.176 1.00 40.00 N
+ATOM 2579 CA ALA B 28 -43.285 -7.715 94.595 1.00 40.00 C
+ATOM 2580 C ALA B 28 -42.860 -8.244 95.952 1.00 40.00 C
+ATOM 2581 O ALA B 28 -41.702 -8.605 96.161 1.00 40.00 O
+ATOM 2582 CB ALA B 28 -43.304 -6.200 94.614 1.00 40.00 C
+ATOM 2583 N GLU B 29 -43.828 -8.302 96.857 1.00 40.00 N
+ATOM 2584 CA GLU B 29 -43.632 -8.814 98.204 1.00 40.00 C
+ATOM 2585 C GLU B 29 -43.206 -10.302 98.235 1.00 40.00 C
+ATOM 2586 O GLU B 29 -42.186 -10.626 98.849 1.00 40.00 O
+ATOM 2587 CB GLU B 29 -44.906 -8.571 99.011 1.00 40.00 C
+ATOM 2588 CG GLU B 29 -44.782 -8.712 100.514 1.00 40.00 C
+ATOM 2589 CD GLU B 29 -46.145 -8.837 101.155 1.00 40.00 C
+ATOM 2590 OE1 GLU B 29 -47.150 -8.623 100.449 1.00 40.00 O
+ATOM 2591 OE2 GLU B 29 -46.219 -9.153 102.356 1.00 40.00 O
+ATOM 2592 N GLU B 30 -43.964 -11.189 97.576 1.00 40.00 N
+ATOM 2593 CA GLU B 30 -43.621 -12.625 97.537 1.00 40.00 C
+ATOM 2594 C GLU B 30 -42.341 -12.829 96.794 1.00 40.00 C
+ATOM 2595 O GLU B 30 -41.678 -13.853 96.954 1.00 40.00 O
+ATOM 2596 CB GLU B 30 -44.655 -13.445 96.800 1.00 40.00 C
+ATOM 2597 CG GLU B 30 -45.945 -13.677 97.541 1.00 40.00 C
+ATOM 2598 CD GLU B 30 -47.013 -14.147 96.584 1.00 40.00 C
+ATOM 2599 OE1 GLU B 30 -46.699 -15.067 95.788 1.00 40.00 O
+ATOM 2600 OE2 GLU B 30 -48.141 -13.589 96.611 1.00 40.00 O
+ATOM 2601 N ASP B 31 -42.030 -11.861 95.944 1.00 40.00 N
+ATOM 2602 CA ASP B 31 -40.783 -11.861 95.221 1.00 40.00 C
+ATOM 2603 C ASP B 31 -39.734 -11.101 96.003 1.00 40.00 C
+ATOM 2604 O ASP B 31 -38.678 -10.767 95.476 1.00 40.00 O
+ATOM 2605 CB ASP B 31 -40.975 -11.298 93.816 1.00 40.00 C
+ATOM 2606 CG ASP B 31 -41.769 -12.247 92.912 1.00 40.00 C
+ATOM 2607 OD1 ASP B 31 -42.290 -13.277 93.423 1.00 40.00 O
+ATOM 2608 OD2 ASP B 31 -41.872 -11.964 91.690 1.00 40.00 O
+ATOM 2609 N GLY B 32 -40.042 -10.838 97.269 1.00 40.00 N
+ATOM 2610 CA GLY B 32 -39.059 -10.364 98.233 1.00 40.00 C
+ATOM 2611 C GLY B 32 -38.613 -8.932 98.066 1.00 40.00 C
+ATOM 2612 O GLY B 32 -37.513 -8.572 98.493 1.00 40.00 O
+ATOM 2613 N ILE B 33 -39.466 -8.115 97.452 1.00 40.00 N
+ATOM 2614 CA ILE B 33 -39.151 -6.708 97.222 1.00 40.00 C
+ATOM 2615 C ILE B 33 -39.905 -5.807 98.195 1.00 40.00 C
+ATOM 2616 O ILE B 33 -41.122 -5.951 98.391 1.00 40.00 O
+ATOM 2617 CB ILE B 33 -39.420 -6.274 95.768 1.00 40.00 C
+ATOM 2618 CG1 ILE B 33 -38.961 -7.357 94.789 1.00 40.00 C
+ATOM 2619 CG2 ILE B 33 -38.694 -4.968 95.473 1.00 40.00 C
+ATOM 2620 CD1 ILE B 33 -39.755 -7.404 93.498 1.00 40.00 C
+ATOM 2621 N ASP B 34 -39.150 -4.888 98.797 1.00 40.00 N
+ATOM 2622 CA ASP B 34 -39.662 -3.966 99.801 1.00 40.00 C
+ATOM 2623 C ASP B 34 -40.100 -2.634 99.160 1.00 40.00 C
+ATOM 2624 O ASP B 34 -39.283 -1.744 98.864 1.00 40.00 O
+ATOM 2625 CB ASP B 34 -38.617 -3.770 100.921 1.00 40.00 C
+ATOM 2626 CG ASP B 34 -39.196 -3.111 102.192 1.00 40.00 C
+ATOM 2627 OD1 ASP B 34 -40.444 -3.043 102.348 1.00 40.00 O
+ATOM 2628 OD2 ASP B 34 -38.385 -2.663 103.046 1.00 40.00 O
+ATOM 2629 N LEU B 35 -41.410 -2.530 98.942 1.00 40.00 N
+ATOM 2630 CA LEU B 35 -42.039 -1.341 98.380 1.00 40.00 C
+ATOM 2631 C LEU B 35 -42.942 -0.709 99.418 1.00 40.00 C
+ATOM 2632 O LEU B 35 -43.597 -1.427 100.179 1.00 40.00 O
+ATOM 2633 CB LEU B 35 -42.890 -1.709 97.172 1.00 40.00 C
+ATOM 2634 CG LEU B 35 -42.232 -2.483 96.042 1.00 40.00 C
+ATOM 2635 CD1 LEU B 35 -43.293 -2.924 95.052 1.00 40.00 C
+ATOM 2636 CD2 LEU B 35 -41.174 -1.617 95.377 1.00 40.00 C
+ATOM 2637 N PRO B 36 -43.009 0.635 99.438 1.00 40.00 N
+ATOM 2638 CA PRO B 36 -43.776 1.316 100.485 1.00 40.00 C
+ATOM 2639 C PRO B 36 -45.285 1.047 100.366 1.00 40.00 C
+ATOM 2640 O PRO B 36 -45.777 0.865 99.251 1.00 40.00 O
+ATOM 2641 CB PRO B 36 -43.454 2.798 100.242 1.00 40.00 C
+ATOM 2642 CG PRO B 36 -43.158 2.881 98.782 1.00 40.00 C
+ATOM 2643 CD PRO B 36 -42.488 1.580 98.430 1.00 40.00 C
+ATOM 2644 N TYR B 37 -45.982 0.998 101.512 1.00 40.00 N
+ATOM 2645 CA TYR B 37 -47.441 0.776 101.588 1.00 40.00 C
+ATOM 2646 C TYR B 37 -48.046 1.211 102.913 1.00 40.00 C
+ATOM 2647 O TYR B 37 -47.326 1.506 103.845 1.00 40.00 O
+ATOM 2648 CB TYR B 37 -47.817 -0.689 101.297 1.00 40.00 C
+ATOM 2649 CG TYR B 37 -47.342 -1.774 102.272 1.00 40.00 C
+ATOM 2650 CD1 TYR B 37 -46.012 -2.208 102.285 1.00 40.00 C
+ATOM 2651 CD2 TYR B 37 -48.243 -2.419 103.120 1.00 40.00 C
+ATOM 2652 CE1 TYR B 37 -45.597 -3.216 103.140 1.00 40.00 C
+ATOM 2653 CE2 TYR B 37 -47.834 -3.429 103.971 1.00 40.00 C
+ATOM 2654 CZ TYR B 37 -46.515 -3.817 103.973 1.00 40.00 C
+ATOM 2655 OH TYR B 37 -46.110 -4.806 104.819 1.00 40.00 O
+ATOM 2656 N SER B 38 -49.372 1.265 102.979 1.00 40.00 N
+ATOM 2657 CA SER B 38 -50.075 1.532 104.225 1.00 40.00 C
+ATOM 2658 C SER B 38 -51.425 0.825 104.285 1.00 40.00 C
+ATOM 2659 O SER B 38 -51.560 -0.212 104.937 1.00 40.00 O
+ATOM 2660 CB SER B 38 -50.269 3.028 104.435 1.00 40.00 C
+ATOM 2661 OG SER B 38 -50.794 3.262 105.728 1.00 40.00 O
+ATOM 2662 N CYS B 39 -52.413 1.393 103.593 1.00 40.00 N
+ATOM 2663 CA CYS B 39 -53.800 0.917 103.621 1.00 40.00 C
+ATOM 2664 C CYS B 39 -53.963 -0.458 102.981 1.00 40.00 C
+ATOM 2665 O CYS B 39 -54.596 -1.359 103.552 1.00 40.00 O
+ATOM 2666 CB CYS B 39 -54.707 1.920 102.899 1.00 40.00 C
+ATOM 2667 SG CYS B 39 -54.499 1.939 101.101 1.00 40.00 S
+ATOM 2668 N ARG B 40 -53.382 -0.592 101.788 1.00 40.00 N
+ATOM 2669 CA ARG B 40 -53.546 -1.759 100.921 1.00 40.00 C
+ATOM 2670 C ARG B 40 -55.000 -1.941 100.498 1.00 40.00 C
+ATOM 2671 O ARG B 40 -55.512 -3.053 100.410 1.00 40.00 O
+ATOM 2672 CB ARG B 40 -52.964 -3.008 101.573 1.00 40.00 C
+ATOM 2673 CG ARG B 40 -51.452 -2.942 101.679 1.00 40.00 C
+ATOM 2674 CD ARG B 40 -50.910 -4.052 102.552 1.00 40.00 C
+ATOM 2675 NE ARG B 40 -51.013 -5.348 101.896 1.00 40.00 N
+ATOM 2676 CZ ARG B 40 -50.055 -5.890 101.150 1.00 40.00 C
+ATOM 2677 NH1 ARG B 40 -48.909 -5.250 100.962 1.00 40.00 N
+ATOM 2678 NH2 ARG B 40 -50.243 -7.077 100.593 1.00 40.00 N
+ATOM 2679 N ALA B 41 -55.654 -0.817 100.242 1.00 40.00 N
+ATOM 2680 CA ALA B 41 -57.024 -0.806 99.756 1.00 40.00 C
+ATOM 2681 C ALA B 41 -57.257 0.442 98.916 1.00 40.00 C
+ATOM 2682 O ALA B 41 -58.393 0.873 98.692 1.00 40.00 O
+ATOM 2683 CB ALA B 41 -58.013 -0.902 100.902 1.00 40.00 C
+ATOM 2684 N GLY B 42 -56.150 1.021 98.465 1.00 40.00 N
+ATOM 2685 CA GLY B 42 -56.171 1.959 97.355 1.00 40.00 C
+ATOM 2686 C GLY B 42 -56.852 3.277 97.621 1.00 40.00 C
+ATOM 2687 O GLY B 42 -57.432 3.875 96.719 1.00 40.00 O
+ATOM 2688 N SER B 43 -56.792 3.734 98.861 1.00 40.00 N
+ATOM 2689 CA SER B 43 -57.242 5.077 99.158 1.00 40.00 C
+ATOM 2690 C SER B 43 -56.235 5.797 100.032 1.00 40.00 C
+ATOM 2691 O SER B 43 -56.621 6.514 100.939 1.00 40.00 O
+ATOM 2692 CB SER B 43 -58.644 5.070 99.788 1.00 40.00 C
+ATOM 2693 OG SER B 43 -58.642 4.519 101.092 1.00 40.00 O
+ATOM 2694 N CYS B 44 -54.948 5.591 99.763 1.00 40.00 N
+ATOM 2695 CA CYS B 44 -53.889 6.330 100.446 1.00 40.00 C
+ATOM 2696 C CYS B 44 -52.771 6.656 99.469 1.00 40.00 C
+ATOM 2697 O CYS B 44 -52.956 6.518 98.273 1.00 40.00 O
+ATOM 2698 CB CYS B 44 -53.371 5.569 101.663 1.00 40.00 C
+ATOM 2699 SG CYS B 44 -51.997 4.467 101.318 1.00 40.00 S
+ATOM 2700 N SER B 45 -51.617 7.080 99.970 1.00 40.00 N
+ATOM 2701 CA SER B 45 -50.556 7.583 99.102 1.00 40.00 C
+ATOM 2702 C SER B 45 -49.225 6.835 99.209 1.00 40.00 C
+ATOM 2703 O SER B 45 -48.283 7.137 98.469 1.00 40.00 O
+ATOM 2704 CB SER B 45 -50.326 9.063 99.389 1.00 40.00 C
+ATOM 2705 OG SER B 45 -49.974 9.247 100.749 1.00 40.00 O
+ATOM 2706 N SER B 46 -49.149 5.863 100.116 1.00 40.00 N
+ATOM 2707 CA SER B 46 -47.866 5.238 100.490 1.00 40.00 C
+ATOM 2708 C SER B 46 -47.192 4.505 99.341 1.00 40.00 C
+ATOM 2709 O SER B 46 -45.993 4.674 99.089 1.00 40.00 O
+ATOM 2710 CB SER B 46 -48.044 4.290 101.681 1.00 40.00 C
+ATOM 2711 OG SER B 46 -48.247 5.008 102.885 1.00 40.00 O
+ATOM 2712 N CYS B 47 -47.992 3.717 98.636 1.00 40.00 N
+ATOM 2713 CA CYS B 47 -47.511 2.845 97.579 1.00 40.00 C
+ATOM 2714 C CYS B 47 -47.249 3.577 96.267 1.00 40.00 C
+ATOM 2715 O CYS B 47 -46.905 2.962 95.257 1.00 40.00 O
+ATOM 2716 CB CYS B 47 -48.520 1.725 97.372 1.00 40.00 C
+ATOM 2717 SG CYS B 47 -50.226 2.302 97.364 1.00 40.00 S
+ATOM 2718 N ALA B 48 -47.386 4.895 96.305 1.00 40.00 N
+ATOM 2719 CA ALA B 48 -47.285 5.729 95.124 1.00 40.00 C
+ATOM 2720 C ALA B 48 -46.130 5.394 94.200 1.00 40.00 C
+ATOM 2721 O ALA B 48 -45.009 5.074 94.628 1.00 40.00 O
+ATOM 2722 CB ALA B 48 -47.223 7.190 95.518 1.00 40.00 C
+ATOM 2723 N GLY B 49 -46.444 5.497 92.918 1.00 40.00 N
+ATOM 2724 CA GLY B 49 -45.484 5.319 91.860 1.00 40.00 C
+ATOM 2725 C GLY B 49 -45.930 5.983 90.574 1.00 40.00 C
+ATOM 2726 O GLY B 49 -47.069 6.446 90.453 1.00 40.00 O
+ATOM 2727 N LYS B 50 -45.023 6.011 89.605 1.00 40.00 N
+ATOM 2728 CA LYS B 50 -45.265 6.687 88.348 1.00 40.00 C
+ATOM 2729 C LYS B 50 -45.053 5.756 87.174 1.00 40.00 C
+ATOM 2730 O LYS B 50 -44.003 5.118 87.063 1.00 40.00 O
+ATOM 2731 CB LYS B 50 -44.340 7.894 88.207 1.00 40.00 C
+ATOM 2732 CG LYS B 50 -44.715 9.077 89.083 1.00 40.00 C
+ATOM 2733 CD LYS B 50 -44.402 10.393 88.395 1.00 40.00 C
+ATOM 2734 CE LYS B 50 -45.443 10.704 87.343 1.00 40.00 C
+ATOM 2735 NZ LYS B 50 -44.982 11.862 86.547 1.00 40.00 N
+ATOM 2736 N VAL B 51 -46.048 5.701 86.293 1.00 40.00 N
+ATOM 2737 CA VAL B 51 -45.951 4.910 85.078 1.00 40.00 C
+ATOM 2738 C VAL B 51 -45.055 5.596 84.078 1.00 40.00 C
+ATOM 2739 O VAL B 51 -45.300 6.734 83.686 1.00 40.00 O
+ATOM 2740 CB VAL B 51 -47.317 4.677 84.426 1.00 40.00 C
+ATOM 2741 CG1 VAL B 51 -47.169 3.906 83.118 1.00 40.00 C
+ATOM 2742 CG2 VAL B 51 -48.209 3.907 85.375 1.00 40.00 C
+ATOM 2743 N VAL B 52 -44.014 4.876 83.678 1.00 40.00 N
+ATOM 2744 CA VAL B 52 -43.097 5.312 82.635 1.00 40.00 C
+ATOM 2745 C VAL B 52 -43.600 4.842 81.260 1.00 40.00 C
+ATOM 2746 O VAL B 52 -43.571 5.601 80.283 1.00 40.00 O
+ATOM 2747 CB VAL B 52 -41.673 4.776 82.898 1.00 40.00 C
+ATOM 2748 CG1 VAL B 52 -40.694 5.304 81.856 1.00 40.00 C
+ATOM 2749 CG2 VAL B 52 -41.214 5.144 84.302 1.00 40.00 C
+ATOM 2750 N SER B 53 -44.065 3.593 81.202 1.00 40.00 N
+ATOM 2751 CA SER B 53 -44.579 2.986 79.974 1.00 40.00 C
+ATOM 2752 C SER B 53 -45.525 1.850 80.337 1.00 40.00 C
+ATOM 2753 O SER B 53 -45.565 1.422 81.490 1.00 40.00 O
+ATOM 2754 CB SER B 53 -43.425 2.431 79.150 1.00 40.00 C
+ATOM 2755 OG SER B 53 -42.770 1.398 79.868 1.00 40.00 O
+ATOM 2756 N GLY B 54 -46.275 1.359 79.357 1.00 40.00 N
+ATOM 2757 CA GLY B 54 -47.226 0.286 79.599 1.00 40.00 C
+ATOM 2758 C GLY B 54 -48.460 0.783 80.323 1.00 40.00 C
+ATOM 2759 O GLY B 54 -48.523 1.934 80.766 1.00 40.00 O
+ATOM 2760 N SER B 55 -49.441 -0.101 80.446 1.00 40.00 N
+ATOM 2761 CA SER B 55 -50.738 0.250 81.011 1.00 40.00 C
+ATOM 2762 C SER B 55 -51.091 -0.587 82.242 1.00 40.00 C
+ATOM 2763 O SER B 55 -50.592 -1.702 82.404 1.00 40.00 O
+ATOM 2764 CB SER B 55 -51.824 0.089 79.943 1.00 40.00 C
+ATOM 2765 OG SER B 55 -51.783 -1.199 79.348 1.00 40.00 O
+ATOM 2766 N VAL B 56 -51.943 -0.042 83.113 1.00 40.00 N
+ATOM 2767 CA VAL B 56 -52.496 -0.808 84.248 1.00 40.00 C
+ATOM 2768 C VAL B 56 -54.006 -0.595 84.445 1.00 40.00 C
+ATOM 2769 O VAL B 56 -54.576 0.406 83.989 1.00 40.00 O
+ATOM 2770 CB VAL B 56 -51.773 -0.538 85.591 1.00 40.00 C
+ATOM 2771 CG1 VAL B 56 -50.260 -0.576 85.436 1.00 40.00 C
+ATOM 2772 CG2 VAL B 56 -52.237 0.769 86.203 1.00 40.00 C
+ATOM 2773 N ASP B 57 -54.644 -1.550 85.121 1.00 40.00 N
+ATOM 2774 CA ASP B 57 -56.062 -1.456 85.458 1.00 40.00 C
+ATOM 2775 C ASP B 57 -56.161 -1.222 86.943 1.00 40.00 C
+ATOM 2776 O ASP B 57 -56.246 -2.163 87.742 1.00 40.00 O
+ATOM 2777 CB ASP B 57 -56.836 -2.724 85.045 1.00 40.00 C
+ATOM 2778 CG ASP B 57 -58.263 -2.785 85.630 1.00 40.00 C
+ATOM 2779 OD1 ASP B 57 -58.805 -3.908 85.746 1.00 40.00 O
+ATOM 2780 OD2 ASP B 57 -58.842 -1.729 85.972 1.00 40.00 O
+ATOM 2781 N GLN B 58 -56.140 0.048 87.312 1.00 40.00 N
+ATOM 2782 CA GLN B 58 -56.276 0.405 88.707 1.00 40.00 C
+ATOM 2783 C GLN B 58 -57.672 0.898 89.019 1.00 40.00 C
+ATOM 2784 O GLN B 58 -57.853 1.781 89.854 1.00 40.00 O
+ATOM 2785 CB GLN B 58 -55.238 1.434 89.094 1.00 40.00 C
+ATOM 2786 CG GLN B 58 -55.110 2.549 88.089 1.00 40.00 C
+ATOM 2787 CD GLN B 58 -54.138 3.605 88.550 1.00 40.00 C
+ATOM 2788 OE1 GLN B 58 -53.820 4.544 87.808 1.00 40.00 O
+ATOM 2789 NE2 GLN B 58 -53.651 3.462 89.787 1.00 40.00 N
+ATOM 2790 N SER B 59 -58.661 0.326 88.335 1.00 40.00 N
+ATOM 2791 CA SER B 59 -60.042 0.553 88.715 1.00 40.00 C
+ATOM 2792 C SER B 59 -60.224 -0.127 90.066 1.00 40.00 C
+ATOM 2793 O SER B 59 -59.732 -1.243 90.307 1.00 40.00 O
+ATOM 2794 CB SER B 59 -61.035 0.044 87.660 1.00 40.00 C
+ATOM 2795 OG SER B 59 -60.987 -1.366 87.537 1.00 40.00 O
+ATOM 2796 N ASP B 60 -60.885 0.601 90.953 1.00 40.00 N
+ATOM 2797 CA ASP B 60 -61.073 0.197 92.333 1.00 40.00 C
+ATOM 2798 C ASP B 60 -60.060 0.813 93.298 1.00 40.00 C
+ATOM 2799 O ASP B 60 -59.903 0.344 94.426 1.00 40.00 O
+ATOM 2800 CB ASP B 60 -61.084 -1.318 92.474 1.00 40.00 C
+ATOM 2801 CG ASP B 60 -61.974 -1.771 93.586 1.00 40.00 C
+ATOM 2802 OD1 ASP B 60 -62.636 -0.922 94.229 1.00 40.00 O
+ATOM 2803 OD2 ASP B 60 -62.016 -2.987 93.816 1.00 40.00 O
+ATOM 2804 N GLN B 61 -59.372 1.858 92.843 1.00 40.00 N
+ATOM 2805 CA GLN B 61 -58.739 2.803 93.757 1.00 40.00 C
+ATOM 2806 C GLN B 61 -59.721 3.951 93.954 1.00 40.00 C
+ATOM 2807 O GLN B 61 -60.731 4.033 93.253 1.00 40.00 O
+ATOM 2808 CB GLN B 61 -57.377 3.298 93.231 1.00 40.00 C
+ATOM 2809 CG GLN B 61 -57.399 4.229 92.015 1.00 40.00 C
+ATOM 2810 CD GLN B 61 -57.531 5.715 92.352 1.00 40.00 C
+ATOM 2811 OE1 GLN B 61 -57.046 6.194 93.382 1.00 40.00 O
+ATOM 2812 NE2 GLN B 61 -58.183 6.454 91.463 1.00 40.00 N
+ATOM 2813 N SER B 62 -59.431 4.829 94.908 1.00 40.00 N
+ATOM 2814 CA SER B 62 -60.283 5.991 95.144 1.00 40.00 C
+ATOM 2815 C SER B 62 -59.534 7.281 95.529 1.00 40.00 C
+ATOM 2816 O SER B 62 -60.147 8.345 95.598 1.00 40.00 O
+ATOM 2817 CB SER B 62 -61.415 5.660 96.142 1.00 40.00 C
+ATOM 2818 OG SER B 62 -61.075 4.598 97.021 1.00 40.00 O
+ATOM 2819 N TYR B 63 -58.219 7.195 95.736 1.00 40.00 N
+ATOM 2820 CA TYR B 63 -57.419 8.334 96.241 1.00 40.00 C
+ATOM 2821 C TYR B 63 -57.030 9.406 95.199 1.00 40.00 C
+ATOM 2822 O TYR B 63 -57.100 10.615 95.473 1.00 40.00 O
+ATOM 2823 CB TYR B 63 -56.161 7.820 96.961 1.00 40.00 C
+ATOM 2824 CG TYR B 63 -55.351 8.887 97.685 1.00 40.00 C
+ATOM 2825 CD1 TYR B 63 -54.398 9.660 97.010 1.00 40.00 C
+ATOM 2826 CD2 TYR B 63 -55.524 9.105 99.046 1.00 40.00 C
+ATOM 2827 CE1 TYR B 63 -53.657 10.623 97.676 1.00 40.00 C
+ATOM 2828 CE2 TYR B 63 -54.784 10.060 99.719 1.00 40.00 C
+ATOM 2829 CZ TYR B 63 -53.858 10.815 99.036 1.00 40.00 C
+ATOM 2830 OH TYR B 63 -53.151 11.762 99.735 1.00 40.00 O
+ATOM 2831 N LEU B 64 -56.589 8.971 94.025 1.00 40.00 N
+ATOM 2832 CA LEU B 64 -56.165 9.908 92.998 1.00 40.00 C
+ATOM 2833 C LEU B 64 -57.362 10.478 92.268 1.00 40.00 C
+ATOM 2834 O LEU B 64 -58.344 9.770 92.025 1.00 40.00 O
+ATOM 2835 CB LEU B 64 -55.273 9.216 91.977 1.00 40.00 C
+ATOM 2836 CG LEU B 64 -53.982 8.569 92.452 1.00 40.00 C
+ATOM 2837 CD1 LEU B 64 -53.414 7.717 91.333 1.00 40.00 C
+ATOM 2838 CD2 LEU B 64 -52.975 9.616 92.886 1.00 40.00 C
+ATOM 2839 N ASP B 65 -57.279 11.758 91.912 1.00 40.00 N
+ATOM 2840 CA ASP B 65 -58.207 12.327 90.935 1.00 40.00 C
+ATOM 2841 C ASP B 65 -57.750 11.942 89.529 1.00 40.00 C
+ATOM 2842 O ASP B 65 -56.681 11.346 89.358 1.00 40.00 O
+ATOM 2843 CB ASP B 65 -58.299 13.847 91.079 1.00 40.00 C
+ATOM 2844 CG ASP B 65 -56.953 14.542 90.909 1.00 40.00 C
+ATOM 2845 OD1 ASP B 65 -56.245 14.293 89.902 1.00 40.00 O
+ATOM 2846 OD2 ASP B 65 -56.613 15.359 91.789 1.00 40.00 O
+ATOM 2847 N ASP B 66 -58.541 12.298 88.524 1.00 40.00 N
+ATOM 2848 CA ASP B 66 -58.230 11.914 87.156 1.00 40.00 C
+ATOM 2849 C ASP B 66 -56.964 12.516 86.562 1.00 40.00 C
+ATOM 2850 O ASP B 66 -56.278 11.862 85.774 1.00 40.00 O
+ATOM 2851 CB ASP B 66 -59.426 12.198 86.281 1.00 40.00 C
+ATOM 2852 CG ASP B 66 -60.537 11.229 86.533 1.00 40.00 C
+ATOM 2853 OD1 ASP B 66 -60.244 10.020 86.681 1.00 40.00 O
+ATOM 2854 OD2 ASP B 66 -61.697 11.672 86.597 1.00 40.00 O
+ATOM 2855 N GLY B 67 -56.669 13.756 86.954 1.00 40.00 N
+ATOM 2856 CA GLY B 67 -55.488 14.493 86.482 1.00 40.00 C
+ATOM 2857 C GLY B 67 -54.181 13.907 86.984 1.00 40.00 C
+ATOM 2858 O GLY B 67 -53.109 14.125 86.397 1.00 40.00 O
+ATOM 2859 N GLN B 68 -54.290 13.175 88.089 1.00 40.00 N
+ATOM 2860 CA GLN B 68 -53.198 12.381 88.620 1.00 40.00 C
+ATOM 2861 C GLN B 68 -53.087 11.050 87.825 1.00 40.00 C
+ATOM 2862 O GLN B 68 -51.976 10.603 87.508 1.00 40.00 O
+ATOM 2863 CB GLN B 68 -53.372 12.194 90.149 1.00 40.00 C
+ATOM 2864 CG GLN B 68 -53.129 13.483 90.962 1.00 40.00 C
+ATOM 2865 CD GLN B 68 -53.590 13.441 92.429 1.00 40.00 C
+ATOM 2866 OE1 GLN B 68 -54.676 12.939 92.756 1.00 40.00 O
+ATOM 2867 NE2 GLN B 68 -52.769 14.008 93.318 1.00 40.00 N
+ATOM 2868 N ILE B 69 -54.234 10.454 87.471 1.00 40.00 N
+ATOM 2869 CA ILE B 69 -54.281 9.256 86.609 1.00 40.00 C
+ATOM 2870 C ILE B 69 -53.802 9.627 85.218 1.00 40.00 C
+ATOM 2871 O ILE B 69 -53.069 8.872 84.570 1.00 40.00 O
+ATOM 2872 CB ILE B 69 -55.706 8.649 86.519 1.00 40.00 C
+ATOM 2873 CG1 ILE B 69 -56.088 7.980 87.841 1.00 40.00 C
+ATOM 2874 CG2 ILE B 69 -55.800 7.632 85.388 1.00 40.00 C
+ATOM 2875 CD1 ILE B 69 -57.575 7.899 88.092 1.00 40.00 C
+ATOM 2876 N CYS B 70 -54.237 10.804 84.779 1.00 40.00 N
+ATOM 2877 CA CYS B 70 -53.785 11.408 83.543 1.00 40.00 C
+ATOM 2878 C CYS B 70 -52.291 11.666 83.548 1.00 40.00 C
+ATOM 2879 O CYS B 70 -51.654 11.644 82.503 1.00 40.00 O
+ATOM 2880 CB CYS B 70 -54.520 12.722 83.331 1.00 20.00 C
+ATOM 2881 SG CYS B 70 -55.578 12.751 81.867 1.00 20.00 S
+ATOM 2882 N ASP B 71 -51.737 11.908 84.728 1.00 40.00 N
+ATOM 2883 CA ASP B 71 -50.317 12.197 84.857 1.00 40.00 C
+ATOM 2884 C ASP B 71 -49.482 10.930 85.132 1.00 40.00 C
+ATOM 2885 O ASP B 71 -48.294 11.013 85.464 1.00 40.00 O
+ATOM 2886 CB ASP B 71 -50.108 13.265 85.942 1.00 40.00 C
+ATOM 2887 CG ASP B 71 -49.042 14.308 85.567 1.00 40.00 C
+ATOM 2888 OD1 ASP B 71 -48.813 14.563 84.353 1.00 40.00 O
+ATOM 2889 OD2 ASP B 71 -48.438 14.886 86.507 1.00 40.00 O
+ATOM 2890 N GLY B 72 -50.111 9.763 84.994 1.00 40.00 N
+ATOM 2891 CA GLY B 72 -49.407 8.475 85.083 1.00 40.00 C
+ATOM 2892 C GLY B 72 -49.042 8.010 86.484 1.00 40.00 C
+ATOM 2893 O GLY B 72 -48.242 7.087 86.672 1.00 40.00 O
+ATOM 2894 N TRP B 73 -49.628 8.657 87.476 1.00 40.00 N
+ATOM 2895 CA TRP B 73 -49.456 8.244 88.846 1.00 40.00 C
+ATOM 2896 C TRP B 73 -50.145 6.952 89.065 1.00 40.00 C
+ATOM 2897 O TRP B 73 -51.158 6.677 88.426 1.00 40.00 O
+ATOM 2898 CB TRP B 73 -50.064 9.283 89.751 1.00 40.00 C
+ATOM 2899 CG TRP B 73 -49.131 10.425 89.984 1.00 40.00 C
+ATOM 2900 CD1 TRP B 73 -49.193 11.708 89.444 1.00 40.00 C
+ATOM 2901 CD2 TRP B 73 -47.934 10.412 90.827 1.00 40.00 C
+ATOM 2902 NE1 TRP B 73 -48.150 12.475 89.894 1.00 40.00 N
+ATOM 2903 CE2 TRP B 73 -47.352 11.755 90.730 1.00 40.00 C
+ATOM 2904 CE3 TRP B 73 -47.313 9.457 91.641 1.00 40.00 C
+ATOM 2905 CZ2 TRP B 73 -46.195 12.106 91.426 1.00 40.00 C
+ATOM 2906 CZ3 TRP B 73 -46.152 9.822 92.339 1.00 40.00 C
+ATOM 2907 CH2 TRP B 73 -45.606 11.113 92.233 1.00 40.00 C
+ATOM 2908 N VAL B 74 -49.612 6.148 89.980 1.00 40.00 N
+ATOM 2909 CA VAL B 74 -50.226 4.865 90.299 1.00 40.00 C
+ATOM 2910 C VAL B 74 -50.107 4.412 91.742 1.00 40.00 C
+ATOM 2911 O VAL B 74 -49.065 4.565 92.385 1.00 40.00 O
+ATOM 2912 CB VAL B 74 -49.679 3.736 89.414 1.00 40.00 C
+ATOM 2913 CG1 VAL B 74 -48.164 3.659 89.517 1.00 40.00 C
+ATOM 2914 CG2 VAL B 74 -50.328 2.400 89.772 1.00 40.00 C
+ATOM 2915 N LEU B 75 -51.204 3.836 92.221 1.00 40.00 N
+ATOM 2916 CA LEU B 75 -51.234 3.157 93.496 1.00 40.00 C
+ATOM 2917 C LEU B 75 -50.967 1.692 93.263 1.00 40.00 C
+ATOM 2918 O LEU B 75 -51.782 0.978 92.669 1.00 40.00 O
+ATOM 2919 CB LEU B 75 -52.572 3.359 94.214 1.00 40.00 C
+ATOM 2920 CG LEU B 75 -52.784 4.744 94.839 1.00 40.00 C
+ATOM 2921 CD1 LEU B 75 -54.017 4.758 95.737 1.00 40.00 C
+ATOM 2922 CD2 LEU B 75 -51.543 5.191 95.605 1.00 40.00 C
+ATOM 2923 N THR B 76 -49.804 1.267 93.740 1.00 40.00 N
+ATOM 2924 CA THR B 76 -49.308 -0.081 93.537 1.00 40.00 C
+ATOM 2925 C THR B 76 -50.151 -1.165 94.245 1.00 40.00 C
+ATOM 2926 O THR B 76 -50.355 -2.255 93.695 1.00 40.00 O
+ATOM 2927 CB THR B 76 -47.816 -0.170 93.905 1.00 40.00 C
+ATOM 2928 OG1 THR B 76 -47.580 0.574 95.097 1.00 40.00 O
+ATOM 2929 CG2 THR B 76 -46.984 0.449 92.822 1.00 40.00 C
+ATOM 2930 N CYS B 77 -50.674 -0.859 95.430 1.00 40.00 N
+ATOM 2931 CA CYS B 77 -51.440 -1.847 96.189 1.00 40.00 C
+ATOM 2932 C CYS B 77 -52.763 -2.189 95.539 1.00 40.00 C
+ATOM 2933 O CYS B 77 -53.406 -3.150 95.926 1.00 40.00 O
+ATOM 2934 CB CYS B 77 -51.647 -1.410 97.646 1.00 40.00 C
+ATOM 2935 SG CYS B 77 -52.996 -0.254 98.003 1.00 40.00 S
+ATOM 2936 N HIS B 78 -53.165 -1.397 94.555 1.00 40.00 N
+ATOM 2937 CA HIS B 78 -54.412 -1.637 93.838 1.00 40.00 C
+ATOM 2938 C HIS B 78 -54.288 -1.498 92.345 1.00 40.00 C
+ATOM 2939 O HIS B 78 -55.223 -1.052 91.675 1.00 40.00 O
+ATOM 2940 CB HIS B 78 -55.541 -0.763 94.383 1.00 40.00 C
+ATOM 2941 CG HIS B 78 -56.486 -1.489 95.323 1.00 40.00 C
+ATOM 2942 ND1 HIS B 78 -56.058 -2.158 96.412 1.00 40.00 N
+ATOM 2943 CD2 HIS B 78 -57.874 -1.612 95.307 1.00 40.00 C
+ATOM 2944 CE1 HIS B 78 -57.114 -2.689 97.054 1.00 40.00 C
+ATOM 2945 NE2 HIS B 78 -58.225 -2.350 96.379 1.00 40.00 N
+ATOM 2946 N ALA B 79 -53.137 -1.892 91.805 1.00 40.00 N
+ATOM 2947 CA ALA B 79 -52.937 -1.891 90.359 1.00 40.00 C
+ATOM 2948 C ALA B 79 -52.617 -3.296 89.838 1.00 40.00 C
+ATOM 2949 O ALA B 79 -51.672 -3.933 90.322 1.00 40.00 O
+ATOM 2950 CB ALA B 79 -51.850 -0.898 89.967 1.00 40.00 C
+ATOM 2951 N TYR B 80 -53.448 -3.780 88.901 1.00 40.00 N
+ATOM 2952 CA TYR B 80 -53.161 -4.957 88.068 1.00 40.00 C
+ATOM 2953 C TYR B 80 -52.502 -4.454 86.791 1.00 40.00 C
+ATOM 2954 O TYR B 80 -52.779 -3.333 86.363 1.00 40.00 O
+ATOM 2955 CB TYR B 80 -54.442 -5.667 87.636 1.00 40.00 C
+ATOM 2956 CG TYR B 80 -55.349 -6.145 88.726 1.00 40.00 C
+ATOM 2957 CD1 TYR B 80 -56.584 -5.546 88.940 1.00 40.00 C
+ATOM 2958 CD2 TYR B 80 -54.992 -7.219 89.519 1.00 40.00 C
+ATOM 2959 CE1 TYR B 80 -57.433 -5.995 89.928 1.00 40.00 C
+ATOM 2960 CE2 TYR B 80 -55.829 -7.675 90.512 1.00 40.00 C
+ATOM 2961 CZ TYR B 80 -57.045 -7.063 90.708 1.00 40.00 C
+ATOM 2962 OH TYR B 80 -57.857 -7.538 91.703 1.00 40.00 O
+ATOM 2963 N PRO B 81 -51.640 -5.272 86.162 1.00 40.00 N
+ATOM 2964 CA PRO B 81 -51.158 -4.848 84.842 1.00 40.00 C
+ATOM 2965 C PRO B 81 -52.077 -5.311 83.703 1.00 40.00 C
+ATOM 2966 O PRO B 81 -52.777 -6.332 83.835 1.00 40.00 O
+ATOM 2967 CB PRO B 81 -49.786 -5.512 84.739 1.00 40.00 C
+ATOM 2968 CG PRO B 81 -49.877 -6.723 85.618 1.00 40.00 C
+ATOM 2969 CD PRO B 81 -50.941 -6.474 86.657 1.00 40.00 C
+ATOM 2970 N THR B 82 -52.097 -4.546 82.612 1.00 40.00 N
+ATOM 2971 CA THR B 82 -52.779 -4.970 81.388 1.00 40.00 C
+ATOM 2972 C THR B 82 -51.783 -5.006 80.242 1.00 40.00 C
+ATOM 2973 O THR B 82 -52.154 -5.251 79.096 1.00 40.00 O
+ATOM 2974 CB THR B 82 -53.996 -4.084 81.009 1.00 40.00 C
+ATOM 2975 OG1 THR B 82 -53.606 -2.704 80.957 1.00 40.00 O
+ATOM 2976 CG2 THR B 82 -55.162 -4.282 81.992 1.00 40.00 C
+ATOM 2977 N SER B 83 -50.518 -4.756 80.562 1.00 40.00 N
+ATOM 2978 CA SER B 83 -49.452 -4.819 79.581 1.00 40.00 C
+ATOM 2979 C SER B 83 -48.129 -4.899 80.301 1.00 40.00 C
+ATOM 2980 O SER B 83 -48.077 -4.766 81.521 1.00 40.00 O
+ATOM 2981 CB SER B 83 -49.483 -3.593 78.660 1.00 40.00 C
+ATOM 2982 OG SER B 83 -48.931 -2.447 79.279 1.00 40.00 O
+ATOM 2983 N ASP B 84 -47.068 -5.142 79.536 1.00 40.00 N
+ATOM 2984 CA ASP B 84 -45.703 -4.980 80.018 1.00 40.00 C
+ATOM 2985 C ASP B 84 -45.536 -3.536 80.460 1.00 40.00 C
+ATOM 2986 O ASP B 84 -45.883 -2.609 79.728 1.00 40.00 O
+ATOM 2987 CB ASP B 84 -44.694 -5.322 78.916 1.00 40.00 C
+ATOM 2988 CG ASP B 84 -44.421 -6.826 78.795 1.00 40.00 C
+ATOM 2989 OD1 ASP B 84 -43.315 -7.172 78.325 1.00 40.00 O
+ATOM 2990 OD2 ASP B 84 -45.285 -7.660 79.163 1.00 40.00 O
+ATOM 2991 N VAL B 85 -45.022 -3.344 81.667 1.00 40.00 N
+ATOM 2992 CA VAL B 85 -45.050 -2.015 82.277 1.00 40.00 C
+ATOM 2993 C VAL B 85 -43.782 -1.670 83.080 1.00 40.00 C
+ATOM 2994 O VAL B 85 -43.272 -2.502 83.838 1.00 40.00 O
+ATOM 2995 CB VAL B 85 -46.379 -1.788 83.074 1.00 40.00 C
+ATOM 2996 CG1 VAL B 85 -46.649 -2.907 84.077 1.00 40.00 C
+ATOM 2997 CG2 VAL B 85 -46.431 -0.413 83.734 1.00 40.00 C
+ATOM 2998 N VAL B 86 -43.270 -0.452 82.864 1.00 40.00 N
+ATOM 2999 CA VAL B 86 -42.123 0.087 83.605 1.00 40.00 C
+ATOM 3000 C VAL B 86 -42.621 1.117 84.624 1.00 40.00 C
+ATOM 3001 O VAL B 86 -43.398 2.012 84.259 1.00 40.00 O
+ATOM 3002 CB VAL B 86 -41.093 0.764 82.672 1.00 40.00 C
+ATOM 3003 CG1 VAL B 86 -39.861 1.197 83.454 1.00 40.00 C
+ATOM 3004 CG2 VAL B 86 -40.692 -0.169 81.543 1.00 40.00 C
+ATOM 3005 N ILE B 87 -42.168 0.985 85.884 1.00 40.00 N
+ATOM 3006 CA ILE B 87 -42.645 1.810 87.037 1.00 40.00 C
+ATOM 3007 C ILE B 87 -41.541 2.222 88.056 1.00 40.00 C
+ATOM 3008 O ILE B 87 -40.732 1.386 88.491 1.00 40.00 O
+ATOM 3009 CB ILE B 87 -43.849 1.135 87.783 1.00 40.00 C
+ATOM 3010 CG1 ILE B 87 -45.124 1.190 86.936 1.00 40.00 C
+ATOM 3011 CG2 ILE B 87 -44.147 1.820 89.107 1.00 40.00 C
+ATOM 3012 CD1 ILE B 87 -46.294 0.426 87.514 1.00 40.00 C
+ATOM 3013 N GLU B 88 -41.526 3.515 88.417 1.00 40.00 N
+ATOM 3014 CA GLU B 88 -40.719 4.039 89.535 1.00 40.00 C
+ATOM 3015 C GLU B 88 -41.498 3.906 90.829 1.00 40.00 C
+ATOM 3016 O GLU B 88 -42.676 4.247 90.874 1.00 40.00 O
+ATOM 3017 CB GLU B 88 -40.431 5.523 89.345 1.00 40.00 C
+ATOM 3018 CG GLU B 88 -39.597 5.883 88.136 1.00 40.00 C
+ATOM 3019 CD GLU B 88 -39.866 7.299 87.679 1.00 40.00 C
+ATOM 3020 OE1 GLU B 88 -41.040 7.724 87.714 1.00 40.00 O
+ATOM 3021 OE2 GLU B 88 -38.906 7.988 87.279 1.00 40.00 O
+ATOM 3022 N THR B 89 -40.843 3.455 91.888 1.00 40.00 N
+ATOM 3023 CA THR B 89 -41.513 3.322 93.174 1.00 40.00 C
+ATOM 3024 C THR B 89 -41.008 4.387 94.145 1.00 40.00 C
+ATOM 3025 O THR B 89 -40.146 5.187 93.777 1.00 40.00 O
+ATOM 3026 CB THR B 89 -41.315 1.908 93.747 1.00 40.00 C
+ATOM 3027 OG1 THR B 89 -39.932 1.689 94.035 1.00 40.00 O
+ATOM 3028 CG2 THR B 89 -41.749 0.886 92.737 1.00 40.00 C
+ATOM 3029 N HIS B 90 -41.546 4.400 95.370 1.00 40.00 N
+ATOM 3030 CA HIS B 90 -41.099 5.306 96.448 1.00 40.00 C
+ATOM 3031 C HIS B 90 -41.301 6.726 96.016 1.00 40.00 C
+ATOM 3032 O HIS B 90 -40.430 7.584 96.180 1.00 40.00 O
+ATOM 3033 CB HIS B 90 -39.628 5.065 96.849 1.00 40.00 C
+ATOM 3034 CG HIS B 90 -39.315 3.651 97.354 1.00 40.00 C
+ATOM 3035 ND1 HIS B 90 -39.489 2.545 96.596 1.00 40.00 N
+ATOM 3036 CD2 HIS B 90 -38.756 3.209 98.560 1.00 40.00 C
+ATOM 3037 CE1 HIS B 90 -39.104 1.451 97.292 1.00 40.00 C
+ATOM 3038 NE2 HIS B 90 -38.653 1.857 98.490 1.00 40.00 N
+ATOM 3039 N LYS B 91 -42.468 6.975 95.445 1.00 40.00 N
+ATOM 3040 CA LYS B 91 -42.743 8.249 94.819 1.00 40.00 C
+ATOM 3041 C LYS B 91 -43.735 9.073 95.599 1.00 40.00 C
+ATOM 3042 O LYS B 91 -44.197 10.119 95.118 1.00 40.00 O
+ATOM 3043 CB LYS B 91 -43.286 8.017 93.421 1.00 40.00 C
+ATOM 3044 CG LYS B 91 -42.256 7.497 92.443 1.00 40.00 C
+ATOM 3045 CD LYS B 91 -41.324 8.600 91.962 1.00 40.00 C
+ATOM 3046 CE LYS B 91 -40.129 8.783 92.880 1.00 40.00 C
+ATOM 3047 NZ LYS B 91 -39.048 9.476 92.134 1.00 40.00 N
+ATOM 3048 N GLU B 92 -44.073 8.601 96.799 1.00 40.00 N
+ATOM 3049 CA GLU B 92 -45.069 9.292 97.611 1.00 40.00 C
+ATOM 3050 C GLU B 92 -44.666 10.748 97.807 1.00 40.00 C
+ATOM 3051 O GLU B 92 -45.444 11.653 97.494 1.00 40.00 O
+ATOM 3052 CB GLU B 92 -45.310 8.603 98.958 1.00 40.00 C
+ATOM 3053 CG GLU B 92 -46.388 9.303 99.780 1.00 40.00 C
+ATOM 3054 CD GLU B 92 -46.585 8.715 101.164 1.00 40.00 C
+ATOM 3055 OE1 GLU B 92 -45.715 7.950 101.636 1.00 40.00 O
+ATOM 3056 OE2 GLU B 92 -47.617 9.027 101.792 1.00 40.00 O
+ATOM 3057 N GLU B 93 -43.442 10.957 98.292 1.00 40.00 N
+ATOM 3058 CA GLU B 93 -42.939 12.296 98.561 1.00 40.00 C
+ATOM 3059 C GLU B 93 -43.052 13.207 97.342 1.00 40.00 C
+ATOM 3060 O GLU B 93 -43.366 14.400 97.471 1.00 40.00 O
+ATOM 3061 CB GLU B 93 -41.495 12.244 99.043 1.00 40.00 C
+ATOM 3062 CG GLU B 93 -40.877 13.628 99.151 1.00 40.00 C
+ATOM 3063 CD GLU B 93 -39.546 13.630 99.873 1.00 40.00 C
+ATOM 3064 OE1 GLU B 93 -38.557 13.093 99.313 1.00 40.00 O
+ATOM 3065 OE2 GLU B 93 -39.493 14.188 100.998 1.00 40.00 O
+ATOM 3066 N GLU B 94 -42.791 12.641 96.165 1.00 40.00 N
+ATOM 3067 CA GLU B 94 -42.983 13.381 94.934 1.00 40.00 C
+ATOM 3068 C GLU B 94 -44.452 13.784 94.755 1.00 40.00 C
+ATOM 3069 O GLU B 94 -44.734 14.907 94.319 1.00 40.00 O
+ATOM 3070 CB GLU B 94 -42.458 12.621 93.714 1.00 40.00 C
+ATOM 3071 CG GLU B 94 -42.543 13.458 92.442 1.00 40.00 C
+ATOM 3072 CD GLU B 94 -41.943 12.792 91.229 1.00 40.00 C
+ATOM 3073 OE1 GLU B 94 -40.910 12.104 91.369 1.00 40.00 O
+ATOM 3074 OE2 GLU B 94 -42.505 12.978 90.128 1.00 40.00 O
+ATOM 3075 N LEU B 95 -45.374 12.879 95.102 1.00 40.00 N
+ATOM 3076 CA LEU B 95 -46.808 13.186 95.075 1.00 40.00 C
+ATOM 3077 C LEU B 95 -47.161 14.216 96.151 1.00 40.00 C
+ATOM 3078 O LEU B 95 -47.834 15.220 95.891 1.00 40.00 O
+ATOM 3079 CB LEU B 95 -47.625 11.912 95.263 1.00 40.00 C
+ATOM 3080 CG LEU B 95 -49.144 12.067 95.202 1.00 40.00 C
+ATOM 3081 CD1 LEU B 95 -49.617 12.716 93.898 1.00 40.00 C
+ATOM 3082 CD2 LEU B 95 -49.786 10.705 95.409 1.00 40.00 C
+ATOM 3083 N THR B 96 -46.701 13.929 97.363 1.00 40.00 N
+ATOM 3084 CA THR B 96 -46.629 14.885 98.462 1.00 40.00 C
+ATOM 3085 C THR B 96 -45.690 16.047 98.102 1.00 40.00 C
+ATOM 3086 O THR B 96 -45.914 17.200 98.478 1.00 40.00 O
+ATOM 3087 CB THR B 96 -46.142 14.144 99.734 1.00 40.00 C
+ATOM 3088 OG1 THR B 96 -47.275 13.674 100.467 1.00 40.00 O
+ATOM 3089 CG2 THR B 96 -45.272 15.017 100.646 1.00 40.00 C
+TER 3090 THR B 96
+ATOM 3091 N LYS C 18 -58.009 18.926 79.425 1.00 40.00 N
+ATOM 3092 CA LYS C 18 -58.319 17.450 79.423 1.00 40.00 C
+ATOM 3093 C LYS C 18 -57.250 16.682 78.632 1.00 40.00 C
+ATOM 3094 O LYS C 18 -56.972 16.993 77.455 1.00 40.00 O
+ATOM 3095 CB LYS C 18 -59.725 17.138 78.849 1.00 40.00 C
+ATOM 3096 CG LYS C 18 -60.691 18.323 78.676 1.00 40.00 C
+ATOM 3097 CD LYS C 18 -60.325 19.296 77.533 1.00 40.00 C
+ATOM 3098 CE LYS C 18 -59.955 18.619 76.204 1.00 40.00 C
+ATOM 3099 NZ LYS C 18 -61.102 17.999 75.476 1.00 40.00 N
+ATOM 3100 N CYS C 19 -56.645 15.691 79.284 1.00 40.00 N
+ATOM 3101 CA CYS C 19 -55.661 14.858 78.611 1.00 40.00 C
+ATOM 3102 C CYS C 19 -56.375 13.639 77.986 1.00 40.00 C
+ATOM 3103 O CYS C 19 -57.234 12.985 78.612 1.00 40.00 O
+ATOM 3104 CB CYS C 19 -54.438 14.589 79.533 1.00 40.00 C
+ATOM 3105 SG CYS C 19 -54.191 13.011 80.414 1.00 40.00 S
+ATOM 3106 N SER C 20 -56.061 13.414 76.714 1.00 40.00 N
+ATOM 3107 CA SER C 20 -56.756 12.448 75.898 1.00 40.00 C
+ATOM 3108 C SER C 20 -55.937 11.176 75.749 1.00 40.00 C
+ATOM 3109 O SER C 20 -54.711 11.211 75.766 1.00 40.00 O
+ATOM 3110 CB SER C 20 -57.028 13.058 74.531 1.00 40.00 C
+ATOM 3111 OG SER C 20 -57.317 12.055 73.580 1.00 40.00 O
+ATOM 3112 N LYS C 21 -56.629 10.052 75.588 1.00 40.00 N
+ATOM 3113 CA LYS C 21 -55.976 8.749 75.425 1.00 40.00 C
+ATOM 3114 C LYS C 21 -55.500 8.538 73.990 1.00 40.00 C
+ATOM 3115 O LYS C 21 -55.014 7.452 73.650 1.00 40.00 O
+ATOM 3116 CB LYS C 21 -56.914 7.609 75.857 1.00 40.00 C
+ATOM 3117 CG LYS C 21 -57.380 7.714 77.304 1.00 40.00 C
+ATOM 3118 CD LYS C 21 -58.500 6.742 77.617 1.00 40.00 C
+ATOM 3119 CE LYS C 21 -59.278 7.220 78.833 1.00 40.00 C
+ATOM 3120 NZ LYS C 21 -60.349 6.258 79.206 1.00 40.00 N
+ATOM 3121 N LYS C 22 -55.640 9.581 73.166 1.00 40.00 N
+ATOM 3122 CA LYS C 22 -55.257 9.546 71.759 1.00 40.00 C
+ATOM 3123 C LYS C 22 -54.057 10.458 71.563 1.00 40.00 C
+ATOM 3124 O LYS C 22 -54.044 11.564 72.090 1.00 40.00 O
+ATOM 3125 CB LYS C 22 -56.417 10.015 70.878 1.00 40.00 C
+ATOM 3126 CG LYS C 22 -57.774 9.413 71.218 1.00 40.00 C
+ATOM 3127 CD LYS C 22 -58.858 9.982 70.324 1.00 40.00 C
+ATOM 3128 CE LYS C 22 -60.177 9.278 70.544 1.00 40.00 C
+ATOM 3129 NZ LYS C 22 -61.203 9.839 69.630 1.00 40.00 N
+ATOM 3130 N GLN C 23 -53.055 9.992 70.815 1.00 40.00 N
+ATOM 3131 CA GLN C 23 -51.804 10.744 70.620 1.00 40.00 C
+ATOM 3132 C GLN C 23 -52.053 12.095 69.994 1.00 40.00 C
+ATOM 3133 O GLN C 23 -52.320 12.192 68.792 1.00 40.00 O
+ATOM 3134 CB GLN C 23 -50.827 9.987 69.733 1.00 40.00 C
+ATOM 3135 CG GLN C 23 -50.282 8.713 70.339 1.00 40.00 C
+ATOM 3136 CD GLN C 23 -49.611 7.827 69.305 1.00 40.00 C
+ATOM 3137 OE1 GLN C 23 -48.764 8.283 68.523 1.00 40.00 O
+ATOM 3138 NE2 GLN C 23 -49.983 6.549 69.295 1.00 40.00 N
+ATOM 3139 N GLU C 24 -51.955 13.143 70.802 1.00 40.00 N
+ATOM 3140 CA GLU C 24 -52.297 14.462 70.309 1.00 40.00 C
+ATOM 3141 C GLU C 24 -51.056 15.283 69.983 1.00 40.00 C
+ATOM 3142 O GLU C 24 -51.152 16.425 69.542 1.00 40.00 O
+ATOM 3143 CB GLU C 24 -53.274 15.166 71.263 1.00 40.00 C
+ATOM 3144 CG GLU C 24 -54.615 14.429 71.362 1.00 40.00 C
+ATOM 3145 CD GLU C 24 -55.843 15.342 71.429 1.00 40.00 C
+ATOM 3146 OE1 GLU C 24 -55.779 16.502 70.941 1.00 40.00 O
+ATOM 3147 OE2 GLU C 24 -56.892 14.881 71.955 1.00 40.00 O
+ATOM 3148 N GLU C 25 -49.895 14.663 70.135 1.00 40.00 N
+ATOM 3149 CA GLU C 25 -48.629 15.360 69.990 1.00 40.00 C
+ATOM 3150 C GLU C 25 -48.146 15.495 68.541 1.00 40.00 C
+ATOM 3151 O GLU C 25 -47.923 14.494 67.866 1.00 40.00 O
+ATOM 3152 CB GLU C 25 -47.580 14.640 70.832 1.00 40.00 C
+ATOM 3153 CG GLU C 25 -46.161 15.200 70.732 1.00 40.00 C
+ATOM 3154 CD GLU C 25 -45.081 14.190 71.139 1.00 40.00 C
+ATOM 3155 OE1 GLU C 25 -43.878 14.513 71.001 1.00 40.00 O
+ATOM 3156 OE2 GLU C 25 -45.418 13.068 71.591 1.00 40.00 O
+ATOM 3157 N GLY C 26 -47.959 16.735 68.090 1.00 40.00 N
+ATOM 3158 CA GLY C 26 -47.467 17.018 66.743 1.00 40.00 C
+ATOM 3159 C GLY C 26 -48.567 17.152 65.703 1.00 40.00 C
+ATOM 3160 O GLY C 26 -48.339 17.646 64.600 1.00 40.00 O
+ATOM 3161 N VAL C 27 -49.762 16.702 66.059 1.00 40.00 N
+ATOM 3162 CA VAL C 27 -50.917 16.705 65.172 1.00 40.00 C
+ATOM 3163 C VAL C 27 -51.241 18.137 64.758 1.00 40.00 C
+ATOM 3164 O VAL C 27 -51.474 18.974 65.625 1.00 40.00 O
+ATOM 3165 CB VAL C 27 -52.140 16.099 65.903 1.00 40.00 C
+ATOM 3166 CG1 VAL C 27 -53.366 16.071 65.004 1.00 40.00 C
+ATOM 3167 CG2 VAL C 27 -51.836 14.701 66.423 1.00 40.00 C
+ATOM 3168 N VAL C 28 -51.252 18.427 63.456 1.00 40.00 N
+ATOM 3169 CA VAL C 28 -51.605 19.779 62.973 1.00 40.00 C
+ATOM 3170 C VAL C 28 -52.984 19.809 62.296 1.00 40.00 C
+ATOM 3171 O VAL C 28 -53.421 18.810 61.748 1.00 40.00 O
+ATOM 3172 CB VAL C 28 -50.510 20.378 62.046 1.00 40.00 C
+ATOM 3173 CG1 VAL C 28 -49.114 20.079 62.575 1.00 40.00 C
+ATOM 3174 CG2 VAL C 28 -50.633 19.864 60.623 1.00 40.00 C
+ATOM 3175 N THR C 29 -53.681 20.937 62.347 1.00 40.00 N
+ATOM 3176 CA THR C 29 -54.941 21.038 61.611 1.00 40.00 C
+ATOM 3177 C THR C 29 -55.071 22.296 60.777 1.00 40.00 C
+ATOM 3178 O THR C 29 -54.453 23.330 61.067 1.00 40.00 O
+ATOM 3179 CB THR C 29 -56.185 20.910 62.509 1.00 40.00 C
+ATOM 3180 OG1 THR C 29 -55.939 21.548 63.766 1.00 40.00 O
+ATOM 3181 CG2 THR C 29 -56.533 19.456 62.738 1.00 40.00 C
+ATOM 3182 N ASN C 30 -55.889 22.165 59.735 1.00 40.00 N
+ATOM 3183 CA ASN C 30 -56.228 23.234 58.807 1.00 40.00 C
+ATOM 3184 C ASN C 30 -55.059 24.055 58.276 1.00 40.00 C
+ATOM 3185 O ASN C 30 -55.192 25.262 58.029 1.00 40.00 O
+ATOM 3186 CB ASN C 30 -57.311 24.109 59.417 1.00 40.00 C
+ATOM 3187 CG ASN C 30 -58.629 23.387 59.497 1.00 40.00 C
+ATOM 3188 OD1 ASN C 30 -59.401 23.385 58.538 1.00 40.00 O
+ATOM 3189 ND2 ASN C 30 -58.887 22.746 60.633 1.00 40.00 N
+ATOM 3190 N LEU C 31 -53.924 23.383 58.080 1.00 40.00 N
+ATOM 3191 CA LEU C 31 -52.718 24.011 57.540 1.00 40.00 C
+ATOM 3192 C LEU C 31 -52.982 24.730 56.207 1.00 40.00 C
+ATOM 3193 O LEU C 31 -52.474 25.829 55.970 1.00 40.00 O
+ATOM 3194 CB LEU C 31 -51.596 22.987 57.401 1.00 40.00 C
+ATOM 3195 CG LEU C 31 -50.291 23.335 58.116 1.00 40.00 C
+ATOM 3196 CD1 LEU C 31 -49.233 22.305 57.768 1.00 40.00 C
+ATOM 3197 CD2 LEU C 31 -49.800 24.741 57.787 1.00 40.00 C
+ATOM 3198 N TYR C 32 -53.788 24.111 55.351 1.00 40.00 N
+ATOM 3199 CA TYR C 32 -54.310 24.788 54.177 1.00 40.00 C
+ATOM 3200 C TYR C 32 -55.843 24.795 54.232 1.00 40.00 C
+ATOM 3201 O TYR C 32 -56.464 23.794 54.615 1.00 40.00 O
+ATOM 3202 CB TYR C 32 -53.822 24.115 52.889 1.00 40.00 C
+ATOM 3203 CG TYR C 32 -52.311 24.098 52.648 1.00 40.00 C
+ATOM 3204 CD1 TYR C 32 -51.480 23.229 53.360 1.00 40.00 C
+ATOM 3205 CD2 TYR C 32 -51.719 24.922 51.675 1.00 40.00 C
+ATOM 3206 CE1 TYR C 32 -50.111 23.190 53.130 1.00 40.00 C
+ATOM 3207 CE2 TYR C 32 -50.346 24.884 51.437 1.00 40.00 C
+ATOM 3208 CZ TYR C 32 -49.549 24.011 52.170 1.00 40.00 C
+ATOM 3209 OH TYR C 32 -48.191 23.953 51.963 1.00 40.00 O
+ATOM 3210 N LYS C 33 -56.431 25.936 53.857 1.00 40.00 N
+ATOM 3211 CA LYS C 33 -57.901 26.153 53.823 1.00 40.00 C
+ATOM 3212 C LYS C 33 -58.391 26.383 52.371 1.00 40.00 C
+ATOM 3213 O LYS C 33 -57.575 26.701 51.501 1.00 40.00 O
+ATOM 3214 CB LYS C 33 -58.294 27.357 54.709 1.00 40.00 C
+ATOM 3215 CG LYS C 33 -57.982 27.224 56.203 1.00 40.00 C
+ATOM 3216 CD LYS C 33 -58.128 28.566 56.930 1.00 40.00 C
+ATOM 3217 CE LYS C 33 -57.539 28.556 58.340 1.00 40.00 C
+ATOM 3218 NZ LYS C 33 -56.047 28.576 58.334 1.00 40.00 N
+ATOM 3219 N PRO C 34 -59.713 26.220 52.100 1.00 40.00 N
+ATOM 3220 CA PRO C 34 -60.316 26.436 50.759 1.00 40.00 C
+ATOM 3221 C PRO C 34 -59.958 27.747 49.999 1.00 40.00 C
+ATOM 3222 O PRO C 34 -59.988 27.760 48.753 1.00 40.00 O
+ATOM 3223 CB PRO C 34 -61.817 26.365 51.049 1.00 40.00 C
+ATOM 3224 CG PRO C 34 -61.908 25.404 52.178 1.00 40.00 C
+ATOM 3225 CD PRO C 34 -60.690 25.619 53.031 1.00 40.00 C
+ATOM 3226 N LYS C 35 -59.637 28.822 50.735 1.00 40.00 N
+ATOM 3227 CA LYS C 35 -59.136 30.083 50.147 1.00 40.00 C
+ATOM 3228 C LYS C 35 -57.726 29.944 49.520 1.00 40.00 C
+ATOM 3229 O LYS C 35 -57.483 30.459 48.414 1.00 40.00 O
+ATOM 3230 CB LYS C 35 -59.146 31.223 51.184 1.00 40.00 C
+ATOM 3231 CG LYS C 35 -57.854 31.369 51.995 1.00 40.00 C
+ATOM 3232 CD LYS C 35 -58.042 32.238 53.226 1.00 40.00 C
+ATOM 3233 CE LYS C 35 -58.807 31.494 54.323 1.00 40.00 C
+ATOM 3234 NZ LYS C 35 -59.389 32.434 55.331 1.00 40.00 N
+ATOM 3235 N GLU C 36 -56.812 29.265 50.234 1.00 40.00 N
+ATOM 3236 CA GLU C 36 -55.432 29.011 49.755 1.00 40.00 C
+ATOM 3237 C GLU C 36 -54.972 27.531 49.834 1.00 40.00 C
+ATOM 3238 O GLU C 36 -54.097 27.199 50.674 1.00 40.00 O
+ATOM 3239 CB GLU C 36 -54.430 29.949 50.446 1.00 40.00 C
+ATOM 3240 CG GLU C 36 -54.447 31.352 49.858 1.00 40.00 C
+ATOM 3241 CD GLU C 36 -53.270 32.193 50.299 1.00 40.00 C
+ATOM 3242 OE1 GLU C 36 -53.513 33.280 50.859 1.00 40.00 O
+ATOM 3243 OE2 GLU C 36 -52.107 31.776 50.091 1.00 40.00 O
+ATOM 3244 N PRO C 37 -55.548 26.653 48.947 1.00 40.00 N
+ATOM 3245 CA PRO C 37 -55.224 25.226 48.901 1.00 40.00 C
+ATOM 3246 C PRO C 37 -53.844 24.952 48.327 1.00 40.00 C
+ATOM 3247 O PRO C 37 -53.431 25.593 47.353 1.00 40.00 O
+ATOM 3248 CB PRO C 37 -56.285 24.656 47.956 1.00 40.00 C
+ATOM 3249 CG PRO C 37 -56.615 25.776 47.049 1.00 40.00 C
+ATOM 3250 CD PRO C 37 -56.566 26.992 47.926 1.00 40.00 C
+ATOM 3251 N TYR C 38 -53.137 24.004 48.933 1.00 40.00 N
+ATOM 3252 CA TYR C 38 -51.904 23.513 48.355 1.00 40.00 C
+ATOM 3253 C TYR C 38 -52.241 22.809 47.042 1.00 40.00 C
+ATOM 3254 O TYR C 38 -53.164 21.981 46.990 1.00 40.00 O
+ATOM 3255 CB TYR C 38 -51.203 22.553 49.311 1.00 40.00 C
+ATOM 3256 CG TYR C 38 -50.038 21.856 48.679 1.00 40.00 C
+ATOM 3257 CD1 TYR C 38 -48.798 22.492 48.545 1.00 40.00 C
+ATOM 3258 CD2 TYR C 38 -50.181 20.562 48.186 1.00 40.00 C
+ATOM 3259 CE1 TYR C 38 -47.730 21.838 47.948 1.00 40.00 C
+ATOM 3260 CE2 TYR C 38 -49.126 19.900 47.591 1.00 40.00 C
+ATOM 3261 CZ TYR C 38 -47.910 20.534 47.473 1.00 40.00 C
+ATOM 3262 OH TYR C 38 -46.890 19.834 46.880 1.00 40.00 O
+ATOM 3263 N VAL C 39 -51.518 23.153 45.981 1.00 40.00 N
+ATOM 3264 CA VAL C 39 -51.703 22.445 44.727 1.00 40.00 C
+ATOM 3265 C VAL C 39 -50.671 21.317 44.676 1.00 40.00 C
+ATOM 3266 O VAL C 39 -49.466 21.579 44.682 1.00 40.00 O
+ATOM 3267 CB VAL C 39 -51.642 23.387 43.507 1.00 40.00 C
+ATOM 3268 CG1 VAL C 39 -51.728 22.588 42.217 1.00 40.00 C
+ATOM 3269 CG2 VAL C 39 -52.789 24.387 43.566 1.00 40.00 C
+ATOM 3270 N GLY C 40 -51.158 20.072 44.676 1.00 40.00 N
+ATOM 3271 CA GLY C 40 -50.309 18.876 44.669 1.00 40.00 C
+ATOM 3272 C GLY C 40 -50.352 18.208 43.322 1.00 40.00 C
+ATOM 3273 O GLY C 40 -50.801 18.814 42.354 1.00 40.00 O
+ATOM 3274 N ARG C 41 -49.896 16.960 43.246 1.00 40.00 N
+ATOM 3275 CA ARG C 41 -49.868 16.271 41.959 1.00 40.00 C
+ATOM 3276 C ARG C 41 -50.191 14.784 42.022 1.00 40.00 C
+ATOM 3277 O ARG C 41 -49.794 14.104 42.959 1.00 40.00 O
+ATOM 3278 CB ARG C 41 -48.532 16.494 41.263 1.00 40.00 C
+ATOM 3279 CG ARG C 41 -48.652 16.407 39.755 1.00 40.00 C
+ATOM 3280 CD ARG C 41 -47.429 16.973 39.051 1.00 40.00 C
+ATOM 3281 NE ARG C 41 -47.310 18.440 39.146 1.00 40.00 N
+ATOM 3282 CZ ARG C 41 -47.772 19.321 38.248 1.00 40.00 C
+ATOM 3283 NH1 ARG C 41 -48.427 18.913 37.150 1.00 40.00 N
+ATOM 3284 NH2 ARG C 41 -47.580 20.626 38.460 1.00 40.00 N
+ATOM 3285 N CYS C 42 -50.914 14.299 41.009 1.00 40.00 N
+ATOM 3286 CA CYS C 42 -51.350 12.902 40.924 1.00 40.00 C
+ATOM 3287 C CYS C 42 -50.240 12.006 40.423 1.00 40.00 C
+ATOM 3288 O CYS C 42 -49.746 12.182 39.315 1.00 40.00 O
+ATOM 3289 CB CYS C 42 -52.570 12.755 40.005 1.00 40.00 C
+ATOM 3290 SG CYS C 42 -53.073 11.032 39.708 1.00 40.00 S
+ATOM 3291 N LEU C 43 -49.873 11.033 41.247 1.00 40.00 N
+ATOM 3292 CA LEU C 43 -48.792 10.095 40.936 1.00 40.00 C
+ATOM 3293 C LEU C 43 -49.354 8.759 40.439 1.00 40.00 C
+ATOM 3294 O LEU C 43 -49.005 8.280 39.358 1.00 40.00 O
+ATOM 3295 CB LEU C 43 -47.910 9.874 42.175 1.00 40.00 C
+ATOM 3296 CG LEU C 43 -46.896 10.914 42.686 1.00 40.00 C
+ATOM 3297 CD1 LEU C 43 -47.278 12.360 42.380 1.00 40.00 C
+ATOM 3298 CD2 LEU C 43 -46.657 10.743 44.181 1.00 40.00 C
+ATOM 3299 N LEU C 44 -50.224 8.165 41.248 1.00 40.00 N
+ATOM 3300 CA LEU C 44 -50.913 6.941 40.886 1.00 40.00 C
+ATOM 3301 C LEU C 44 -52.397 7.185 40.790 1.00 40.00 C
+ATOM 3302 O LEU C 44 -52.868 8.298 41.039 1.00 40.00 O
+ATOM 3303 CB LEU C 44 -50.658 5.850 41.916 1.00 40.00 C
+ATOM 3304 CG LEU C 44 -49.261 5.247 41.897 1.00 40.00 C
+ATOM 3305 CD1 LEU C 44 -49.255 3.977 42.730 1.00 40.00 C
+ATOM 3306 CD2 LEU C 44 -48.778 4.963 40.477 1.00 40.00 C
+ATOM 3307 N ASN C 45 -53.124 6.132 40.422 1.00 40.00 N
+ATOM 3308 CA ASN C 45 -54.578 6.148 40.358 1.00 40.00 C
+ATOM 3309 C ASN C 45 -55.012 4.834 39.750 1.00 40.00 C
+ATOM 3310 O ASN C 45 -55.078 4.690 38.538 1.00 40.00 O
+ATOM 3311 CB ASN C 45 -55.104 7.336 39.533 1.00 40.00 C
+ATOM 3312 CG ASN C 45 -56.578 7.615 39.779 1.00 40.00 C
+ATOM 3313 OD1 ASN C 45 -57.219 6.952 40.592 1.00 40.00 O
+ATOM 3314 ND2 ASN C 45 -57.123 8.600 39.073 1.00 40.00 N
+ATOM 3315 N THR C 46 -55.294 3.864 40.601 1.00 40.00 N
+ATOM 3316 CA THR C 46 -55.593 2.515 40.144 1.00 40.00 C
+ATOM 3317 C THR C 46 -56.983 2.131 40.626 1.00 40.00 C
+ATOM 3318 O THR C 46 -57.333 2.381 41.780 1.00 40.00 O
+ATOM 3319 CB THR C 46 -54.528 1.527 40.669 1.00 40.00 C
+ATOM 3320 OG1 THR C 46 -53.223 2.059 40.388 1.00 40.00 O
+ATOM 3321 CG2 THR C 46 -54.675 0.119 40.056 1.00 40.00 C
+ATOM 3322 N LYS C 47 -57.795 1.564 39.737 1.00 40.00 N
+ATOM 3323 CA LYS C 47 -59.039 0.956 40.177 1.00 40.00 C
+ATOM 3324 C LYS C 47 -58.617 -0.238 41.015 1.00 40.00 C
+ATOM 3325 O LYS C 47 -57.631 -0.918 40.696 1.00 40.00 O
+ATOM 3326 CB LYS C 47 -59.940 0.530 39.007 1.00 40.00 C
+ATOM 3327 CG LYS C 47 -61.374 0.227 39.436 1.00 40.00 C
+ATOM 3328 CD LYS C 47 -62.341 0.149 38.271 1.00 40.00 C
+ATOM 3329 CE LYS C 47 -62.826 -1.264 38.039 1.00 40.00 C
+ATOM 3330 NZ LYS C 47 -64.128 -1.269 37.325 1.00 40.00 N
+ATOM 3331 N ILE C 48 -59.338 -0.460 42.108 1.00 40.00 N
+ATOM 3332 CA ILE C 48 -59.023 -1.561 43.020 1.00 40.00 C
+ATOM 3333 C ILE C 48 -60.203 -2.518 43.215 1.00 40.00 C
+ATOM 3334 O ILE C 48 -60.050 -3.601 43.803 1.00 40.00 O
+ATOM 3335 CB ILE C 48 -58.502 -1.044 44.370 1.00 40.00 C
+ATOM 3336 CG1 ILE C 48 -59.407 0.069 44.891 1.00 40.00 C
+ATOM 3337 CG2 ILE C 48 -57.076 -0.532 44.219 1.00 40.00 C
+ATOM 3338 CD1 ILE C 48 -59.380 0.222 46.389 1.00 40.00 C
+ATOM 3339 N THR C 49 -61.371 -2.098 42.721 1.00 40.00 N
+ATOM 3340 CA THR C 49 -62.527 -2.976 42.558 1.00 40.00 C
+ATOM 3341 C THR C 49 -62.402 -3.763 41.235 1.00 40.00 C
+ATOM 3342 O THR C 49 -61.833 -3.247 40.257 1.00 40.00 O
+ATOM 3343 CB THR C 49 -63.866 -2.182 42.573 1.00 40.00 C
+ATOM 3344 OG1 THR C 49 -63.812 -1.096 41.640 1.00 40.00 O
+ATOM 3345 CG2 THR C 49 -64.174 -1.638 43.948 1.00 40.00 C
+ATOM 3346 N GLY C 50 -62.919 -5.003 41.216 1.00 40.00 N
+ATOM 3347 CA GLY C 50 -63.077 -5.809 39.977 1.00 40.00 C
+ATOM 3348 C GLY C 50 -63.970 -5.142 38.920 1.00 40.00 C
+ATOM 3349 O GLY C 50 -64.459 -4.019 39.126 1.00 40.00 O
+ATOM 3350 N ASP C 51 -64.192 -5.803 37.782 1.00 40.00 N
+ATOM 3351 CA ASP C 51 -64.990 -5.176 36.707 1.00 40.00 C
+ATOM 3352 C ASP C 51 -66.493 -5.389 36.854 1.00 40.00 C
+ATOM 3353 O ASP C 51 -67.312 -4.576 36.396 1.00 40.00 O
+ATOM 3354 CB ASP C 51 -64.514 -5.649 35.347 1.00 40.00 C
+ATOM 3355 CG ASP C 51 -63.217 -5.007 34.953 1.00 40.00 C
+ATOM 3356 OD1 ASP C 51 -62.207 -5.738 34.834 1.00 40.00 O
+ATOM 3357 OD2 ASP C 51 -63.207 -3.767 34.794 1.00 40.00 O
+ATOM 3358 N ASP C 52 -66.822 -6.505 37.498 1.00 40.00 N
+ATOM 3359 CA ASP C 52 -68.181 -6.864 37.878 1.00 40.00 C
+ATOM 3360 C ASP C 52 -68.681 -6.034 39.079 1.00 40.00 C
+ATOM 3361 O ASP C 52 -69.885 -5.939 39.315 1.00 40.00 O
+ATOM 3362 CB ASP C 52 -68.256 -8.376 38.168 1.00 40.00 C
+ATOM 3363 CG ASP C 52 -67.097 -8.880 39.031 1.00 40.00 C
+ATOM 3364 OD1 ASP C 52 -65.933 -8.456 38.837 1.00 40.00 O
+ATOM 3365 OD2 ASP C 52 -67.356 -9.724 39.903 1.00 40.00 O
+ATOM 3366 N ALA C 53 -67.753 -5.421 39.816 1.00 40.00 N
+ATOM 3367 CA ALA C 53 -68.073 -4.624 41.002 1.00 40.00 C
+ATOM 3368 C ALA C 53 -69.131 -3.569 40.735 1.00 40.00 C
+ATOM 3369 O ALA C 53 -69.051 -2.865 39.731 1.00 40.00 O
+ATOM 3370 CB ALA C 53 -66.820 -3.966 41.551 1.00 40.00 C
+ATOM 3371 N PRO C 54 -70.120 -3.458 41.643 1.00 40.00 N
+ATOM 3372 CA PRO C 54 -71.227 -2.494 41.565 1.00 40.00 C
+ATOM 3373 C PRO C 54 -70.863 -0.994 41.458 1.00 40.00 C
+ATOM 3374 O PRO C 54 -71.552 -0.237 40.772 1.00 40.00 O
+ATOM 3375 CB PRO C 54 -72.017 -2.754 42.867 1.00 40.00 C
+ATOM 3376 CG PRO C 54 -71.120 -3.569 43.734 1.00 40.00 C
+ATOM 3377 CD PRO C 54 -70.301 -4.382 42.777 1.00 40.00 C
+ATOM 3378 N GLY C 55 -69.806 -0.558 42.122 1.00 40.00 N
+ATOM 3379 CA GLY C 55 -69.601 0.876 42.267 1.00 40.00 C
+ATOM 3380 C GLY C 55 -68.351 1.481 41.663 1.00 40.00 C
+ATOM 3381 O GLY C 55 -68.365 2.660 41.300 1.00 40.00 O
+ATOM 3382 N GLU C 56 -67.278 0.686 41.571 1.00 40.00 N
+ATOM 3383 CA GLU C 56 -65.955 1.160 41.138 1.00 40.00 C
+ATOM 3384 C GLU C 56 -65.262 2.108 42.165 1.00 40.00 C
+ATOM 3385 O GLU C 56 -65.774 3.196 42.494 1.00 40.00 O
+ATOM 3386 CB GLU C 56 -66.038 1.778 39.738 1.00 40.00 C
+ATOM 3387 CG GLU C 56 -64.734 2.341 39.221 1.00 40.00 C
+ATOM 3388 CD GLU C 56 -64.866 2.912 37.832 1.00 40.00 C
+ATOM 3389 OE1 GLU C 56 -65.247 2.158 36.920 1.00 40.00 O
+ATOM 3390 OE2 GLU C 56 -64.581 4.108 37.647 1.00 40.00 O
+ATOM 3391 N THR C 57 -64.094 1.674 42.658 1.00 40.00 N
+ATOM 3392 CA THR C 57 -63.320 2.411 43.667 1.00 40.00 C
+ATOM 3393 C THR C 57 -61.814 2.373 43.371 1.00 40.00 C
+ATOM 3394 O THR C 57 -61.236 1.300 43.158 1.00 40.00 O
+ATOM 3395 CB THR C 57 -63.618 1.863 45.070 1.00 40.00 C
+ATOM 3396 OG1 THR C 57 -64.954 2.224 45.433 1.00 40.00 O
+ATOM 3397 CG2 THR C 57 -62.652 2.415 46.100 1.00 40.00 C
+ATOM 3398 N TRP C 58 -61.198 3.558 43.371 1.00 40.00 N
+ATOM 3399 CA TRP C 58 -59.799 3.748 42.956 1.00 40.00 C
+ATOM 3400 C TRP C 58 -58.870 4.143 44.073 1.00 40.00 C
+ATOM 3401 O TRP C 58 -59.270 4.879 44.979 1.00 40.00 O
+ATOM 3402 CB TRP C 58 -59.730 4.848 41.914 1.00 40.00 C
+ATOM 3403 CG TRP C 58 -60.412 4.540 40.613 1.00 40.00 C
+ATOM 3404 CD1 TRP C 58 -61.772 4.392 40.375 1.00 40.00 C
+ATOM 3405 CD2 TRP C 58 -59.776 4.366 39.311 1.00 40.00 C
+ATOM 3406 NE1 TRP C 58 -62.006 4.137 39.054 1.00 40.00 N
+ATOM 3407 CE2 TRP C 58 -60.852 4.107 38.362 1.00 40.00 C
+ATOM 3408 CE3 TRP C 58 -58.469 4.400 38.854 1.00 40.00 C
+ATOM 3409 CZ2 TRP C 58 -60.605 3.887 37.019 1.00 40.00 C
+ATOM 3410 CZ3 TRP C 58 -58.230 4.172 37.499 1.00 40.00 C
+ATOM 3411 CH2 TRP C 58 -59.273 3.924 36.605 1.00 40.00 C
+ATOM 3412 N HIS C 59 -57.613 3.699 44.002 1.00 40.00 N
+ATOM 3413 CA HIS C 59 -56.595 4.095 44.987 1.00 40.00 C
+ATOM 3414 C HIS C 59 -55.609 5.053 44.395 1.00 40.00 C
+ATOM 3415 O HIS C 59 -54.871 4.695 43.484 1.00 40.00 O
+ATOM 3416 CB HIS C 59 -55.866 2.879 45.546 1.00 40.00 C
+ATOM 3417 CG HIS C 59 -54.840 3.214 46.605 1.00 40.00 C
+ATOM 3418 ND1 HIS C 59 -55.172 3.478 47.882 1.00 40.00 N
+ATOM 3419 CD2 HIS C 59 -53.455 3.315 46.534 1.00 40.00 C
+ATOM 3420 CE1 HIS C 59 -54.057 3.736 48.594 1.00 40.00 C
+ATOM 3421 NE2 HIS C 59 -53.007 3.636 47.769 1.00 40.00 N
+ATOM 3422 N MET C 60 -55.572 6.280 44.913 1.00 40.00 N
+ATOM 3423 CA MET C 60 -54.713 7.318 44.342 1.00 40.00 C
+ATOM 3424 C MET C 60 -53.772 7.939 45.354 1.00 40.00 C
+ATOM 3425 O MET C 60 -54.111 8.080 46.532 1.00 40.00 O
+ATOM 3426 CB MET C 60 -55.554 8.405 43.717 1.00 40.00 C
+ATOM 3427 CG MET C 60 -56.531 8.993 44.697 1.00 40.00 C
+ATOM 3428 SD MET C 60 -57.842 9.607 43.678 1.00 40.00 S
+ATOM 3429 CE MET C 60 -58.815 8.132 43.402 1.00 40.00 C
+ATOM 3430 N VAL C 61 -52.595 8.321 44.864 1.00 40.00 N
+ATOM 3431 CA VAL C 61 -51.534 8.888 45.687 1.00 40.00 C
+ATOM 3432 C VAL C 61 -51.145 10.281 45.154 1.00 40.00 C
+ATOM 3433 O VAL C 61 -51.163 10.504 43.941 1.00 40.00 O
+ATOM 3434 CB VAL C 61 -50.304 7.956 45.714 1.00 40.00 C
+ATOM 3435 CG1 VAL C 61 -49.547 8.119 47.015 1.00 40.00 C
+ATOM 3436 CG2 VAL C 61 -50.715 6.501 45.572 1.00 40.00 C
+ATOM 3437 N PHE C 62 -50.816 11.216 46.056 1.00 40.00 N
+ATOM 3438 CA PHE C 62 -50.438 12.591 45.672 1.00 40.00 C
+ATOM 3439 C PHE C 62 -49.126 13.094 46.276 1.00 40.00 C
+ATOM 3440 O PHE C 62 -48.780 12.771 47.410 1.00 40.00 O
+ATOM 3441 CB PHE C 62 -51.535 13.599 46.026 1.00 40.00 C
+ATOM 3442 CG PHE C 62 -52.921 13.194 45.602 1.00 40.00 C
+ATOM 3443 CD1 PHE C 62 -53.204 12.859 44.283 1.00 40.00 C
+ATOM 3444 CD2 PHE C 62 -53.964 13.194 46.525 1.00 40.00 C
+ATOM 3445 CE1 PHE C 62 -54.491 12.497 43.906 1.00 40.00 C
+ATOM 3446 CE2 PHE C 62 -55.254 12.843 46.151 1.00 40.00 C
+ATOM 3447 CZ PHE C 62 -55.518 12.494 44.839 1.00 40.00 C
+ATOM 3448 N SER C 63 -48.419 13.917 45.504 1.00 40.00 N
+ATOM 3449 CA SER C 63 -47.179 14.549 45.947 1.00 40.00 C
+ATOM 3450 C SER C 63 -47.503 15.738 46.828 1.00 40.00 C
+ATOM 3451 O SER C 63 -48.339 16.579 46.477 1.00 40.00 O
+ATOM 3452 CB SER C 63 -46.331 15.000 44.756 1.00 40.00 C
+ATOM 3453 OG SER C 63 -47.059 15.878 43.916 1.00 40.00 O
+ATOM 3454 N THR C 64 -46.819 15.805 47.965 1.00 40.00 N
+ATOM 3455 CA THR C 64 -47.136 16.761 49.014 1.00 40.00 C
+ATOM 3456 C THR C 64 -45.948 17.648 49.338 1.00 40.00 C
+ATOM 3457 O THR C 64 -46.102 18.696 49.950 1.00 40.00 O
+ATOM 3458 CB THR C 64 -47.523 16.027 50.307 1.00 40.00 C
+ATOM 3459 OG1 THR C 64 -46.363 15.396 50.854 1.00 40.00 O
+ATOM 3460 CG2 THR C 64 -48.559 14.966 50.029 1.00 40.00 C
+ATOM 3461 N GLU C 65 -44.761 17.207 48.933 1.00 40.00 N
+ATOM 3462 CA GLU C 65 -43.499 17.854 49.303 1.00 40.00 C
+ATOM 3463 C GLU C 65 -43.231 17.805 50.818 1.00 40.00 C
+ATOM 3464 O GLU C 65 -42.460 18.612 51.354 1.00 40.00 O
+ATOM 3465 CB GLU C 65 -43.449 19.306 48.814 1.00 40.00 C
+ATOM 3466 CG GLU C 65 -43.635 19.518 47.320 1.00 40.00 C
+ATOM 3467 CD GLU C 65 -43.610 20.998 46.938 1.00 40.00 C
+ATOM 3468 OE1 GLU C 65 -42.513 21.599 46.914 1.00 40.00 O
+ATOM 3469 OE2 GLU C 65 -44.687 21.571 46.660 1.00 40.00 O
+ATOM 3470 N GLY C 66 -43.861 16.850 51.503 1.00 40.00 N
+ATOM 3471 CA GLY C 66 -43.715 16.711 52.951 1.00 40.00 C
+ATOM 3472 C GLY C 66 -44.311 17.906 53.655 1.00 40.00 C
+ATOM 3473 O GLY C 66 -44.203 18.040 54.877 1.00 40.00 O
+ATOM 3474 N LYS C 67 -44.951 18.768 52.864 1.00 40.00 N
+ATOM 3475 CA LYS C 67 -45.543 20.032 53.337 1.00 40.00 C
+ATOM 3476 C LYS C 67 -46.858 19.856 54.118 1.00 40.00 C
+ATOM 3477 O LYS C 67 -47.478 20.842 54.532 1.00 40.00 O
+ATOM 3478 CB LYS C 67 -45.752 21.023 52.167 1.00 40.00 C
+ATOM 3479 CG LYS C 67 -44.493 21.752 51.715 1.00 40.00 C
+ATOM 3480 CD LYS C 67 -44.784 22.851 50.705 1.00 40.00 C
+ATOM 3481 CE LYS C 67 -43.497 23.583 50.353 1.00 40.00 C
+ATOM 3482 NZ LYS C 67 -43.700 24.661 49.351 1.00 40.00 N
+ATOM 3483 N ILE C 68 -47.281 18.608 54.305 1.00 40.00 N
+ATOM 3484 CA ILE C 68 -48.496 18.318 55.042 1.00 40.00 C
+ATOM 3485 C ILE C 68 -48.251 17.161 56.003 1.00 40.00 C
+ATOM 3486 O ILE C 68 -48.615 16.029 55.700 1.00 40.00 O
+ATOM 3487 CB ILE C 68 -49.655 18.004 54.089 1.00 40.00 C
+ATOM 3488 CG1 ILE C 68 -49.877 19.194 53.156 1.00 40.00 C
+ATOM 3489 CG2 ILE C 68 -50.904 17.700 54.890 1.00 40.00 C
+ATOM 3490 CD1 ILE C 68 -50.796 18.942 51.986 1.00 40.00 C
+ATOM 3491 N PRO C 69 -47.626 17.443 57.168 1.00 40.00 N
+ATOM 3492 CA PRO C 69 -47.273 16.400 58.136 1.00 40.00 C
+ATOM 3493 C PRO C 69 -48.516 15.832 58.800 1.00 40.00 C
+ATOM 3494 O PRO C 69 -48.785 16.111 59.972 1.00 40.00 O
+ATOM 3495 CB PRO C 69 -46.394 17.138 59.157 1.00 40.00 C
+ATOM 3496 CG PRO C 69 -46.870 18.544 59.101 1.00 40.00 C
+ATOM 3497 CD PRO C 69 -47.282 18.788 57.669 1.00 40.00 C
+ATOM 3498 N TYR C 70 -49.266 15.044 58.034 1.00 40.00 N
+ATOM 3499 CA TYR C 70 -50.494 14.444 58.528 1.00 40.00 C
+ATOM 3500 C TYR C 70 -50.218 13.312 59.482 1.00 40.00 C
+ATOM 3501 O TYR C 70 -49.094 12.825 59.593 1.00 40.00 O
+ATOM 3502 CB TYR C 70 -51.425 13.985 57.390 1.00 40.00 C
+ATOM 3503 CG TYR C 70 -50.918 12.876 56.477 1.00 40.00 C
+ATOM 3504 CD1 TYR C 70 -51.317 11.556 56.657 1.00 40.00 C
+ATOM 3505 CD2 TYR C 70 -50.083 13.162 55.396 1.00 40.00 C
+ATOM 3506 CE1 TYR C 70 -50.873 10.550 55.809 1.00 40.00 C
+ATOM 3507 CE2 TYR C 70 -49.636 12.163 54.543 1.00 40.00 C
+ATOM 3508 CZ TYR C 70 -50.038 10.865 54.755 1.00 40.00 C
+ATOM 3509 OH TYR C 70 -49.591 9.887 53.909 1.00 40.00 O
+ATOM 3510 N ARG C 71 -51.261 12.908 60.181 1.00 40.00 N
+ATOM 3511 CA ARG C 71 -51.132 11.818 61.096 1.00 40.00 C
+ATOM 3512 C ARG C 71 -52.317 10.864 60.965 1.00 40.00 C
+ATOM 3513 O ARG C 71 -53.437 11.260 60.625 1.00 40.00 O
+ATOM 3514 CB ARG C 71 -50.921 12.342 62.520 1.00 40.00 C
+ATOM 3515 CG ARG C 71 -49.958 11.516 63.371 1.00 40.00 C
+ATOM 3516 CD ARG C 71 -48.494 11.578 62.915 1.00 40.00 C
+ATOM 3517 NE ARG C 71 -47.780 12.796 63.329 1.00 40.00 N
+ATOM 3518 CZ ARG C 71 -47.215 13.002 64.528 1.00 40.00 C
+ATOM 3519 NH1 ARG C 71 -47.280 12.081 65.489 1.00 40.00 N
+ATOM 3520 NH2 ARG C 71 -46.588 14.152 64.782 1.00 40.00 N
+ATOM 3521 N GLU C 72 -52.018 9.597 61.223 1.00 40.00 N
+ATOM 3522 CA GLU C 72 -52.904 8.477 60.988 1.00 40.00 C
+ATOM 3523 C GLU C 72 -54.313 8.727 61.481 1.00 40.00 C
+ATOM 3524 O GLU C 72 -54.547 8.848 62.683 1.00 40.00 O
+ATOM 3525 CB GLU C 72 -52.336 7.229 61.662 1.00 40.00 C
+ATOM 3526 CG GLU C 72 -51.081 6.668 61.002 1.00 40.00 C
+ATOM 3527 CD GLU C 72 -49.790 7.381 61.402 1.00 40.00 C
+ATOM 3528 OE1 GLU C 72 -49.816 8.160 62.383 1.00 40.00 O
+ATOM 3529 OE2 GLU C 72 -48.737 7.150 60.744 1.00 40.00 O
+ATOM 3530 N GLY C 73 -55.247 8.810 60.540 1.00 40.00 N
+ATOM 3531 CA GLY C 73 -56.665 8.884 60.870 1.00 40.00 C
+ATOM 3532 C GLY C 73 -57.318 10.129 60.329 1.00 40.00 C
+ATOM 3533 O GLY C 73 -58.551 10.237 60.251 1.00 40.00 O
+ATOM 3534 N GLN C 74 -56.483 11.078 59.948 1.00 40.00 N
+ATOM 3535 CA GLN C 74 -56.991 12.319 59.419 1.00 40.00 C
+ATOM 3536 C GLN C 74 -57.663 12.097 58.074 1.00 40.00 C
+ATOM 3537 O GLN C 74 -57.856 10.964 57.632 1.00 40.00 O
+ATOM 3538 CB GLN C 74 -55.884 13.362 59.355 1.00 40.00 C
+ATOM 3539 CG GLN C 74 -55.479 13.831 60.738 1.00 40.00 C
+ATOM 3540 CD GLN C 74 -54.476 14.950 60.695 1.00 40.00 C
+ATOM 3541 OE1 GLN C 74 -53.327 14.750 60.299 1.00 40.00 O
+ATOM 3542 NE2 GLN C 74 -54.897 16.139 61.118 1.00 40.00 N
+ATOM 3543 N SER C 75 -58.048 13.193 57.449 1.00 40.00 N
+ATOM 3544 CA SER C 75 -58.818 13.155 56.237 1.00 40.00 C
+ATOM 3545 C SER C 75 -58.419 14.432 55.534 1.00 40.00 C
+ATOM 3546 O SER C 75 -57.978 15.372 56.194 1.00 40.00 O
+ATOM 3547 CB SER C 75 -60.306 13.178 56.585 1.00 40.00 C
+ATOM 3548 OG SER C 75 -60.566 12.573 57.851 1.00 40.00 O
+ATOM 3549 N ILE C 76 -58.530 14.490 54.210 1.00 40.00 N
+ATOM 3550 CA ILE C 76 -58.253 15.771 53.533 1.00 40.00 C
+ATOM 3551 C ILE C 76 -59.353 16.315 52.630 1.00 40.00 C
+ATOM 3552 O ILE C 76 -60.336 15.631 52.310 1.00 40.00 O
+ATOM 3553 CB ILE C 76 -56.908 15.813 52.770 1.00 40.00 C
+ATOM 3554 CG1 ILE C 76 -56.843 14.726 51.688 1.00 40.00 C
+ATOM 3555 CG2 ILE C 76 -55.745 15.729 53.741 1.00 40.00 C
+ATOM 3556 CD1 ILE C 76 -55.962 15.094 50.504 1.00 40.00 C
+ATOM 3557 N GLY C 77 -59.153 17.562 52.224 1.00 40.00 N
+ATOM 3558 CA GLY C 77 -60.093 18.231 51.372 1.00 40.00 C
+ATOM 3559 C GLY C 77 -59.632 18.239 49.935 1.00 40.00 C
+ATOM 3560 O GLY C 77 -58.426 18.292 49.641 1.00 40.00 O
+ATOM 3561 N VAL C 78 -60.621 18.173 49.045 1.00 40.00 N
+ATOM 3562 CA VAL C 78 -60.398 18.236 47.615 1.00 40.00 C
+ATOM 3563 C VAL C 78 -61.353 19.244 46.996 1.00 40.00 C
+ATOM 3564 O VAL C 78 -62.579 19.092 47.053 1.00 40.00 O
+ATOM 3565 CB VAL C 78 -60.586 16.858 46.951 1.00 40.00 C
+ATOM 3566 CG1 VAL C 78 -60.445 16.967 45.443 1.00 40.00 C
+ATOM 3567 CG2 VAL C 78 -59.570 15.861 47.484 1.00 40.00 C
+ATOM 3568 N ILE C 79 -60.766 20.288 46.428 1.00 40.00 N
+ATOM 3569 CA ILE C 79 -61.492 21.203 45.568 1.00 40.00 C
+ATOM 3570 C ILE C 79 -61.450 20.629 44.140 1.00 40.00 C
+ATOM 3571 O ILE C 79 -60.380 20.617 43.487 1.00 40.00 O
+ATOM 3572 CB ILE C 79 -60.910 22.641 45.631 1.00 40.00 C
+ATOM 3573 CG1 ILE C 79 -60.945 23.163 47.083 1.00 40.00 C
+ATOM 3574 CG2 ILE C 79 -61.654 23.580 44.671 1.00 40.00 C
+ATOM 3575 CD1 ILE C 79 -59.961 24.277 47.402 1.00 40.00 C
+ATOM 3576 N ALA C 80 -62.615 20.126 43.691 1.00 40.00 N
+ATOM 3577 CA ALA C 80 -62.832 19.603 42.320 1.00 40.00 C
+ATOM 3578 C ALA C 80 -62.685 20.693 41.249 1.00 40.00 C
+ATOM 3579 O ALA C 80 -63.093 21.850 41.454 1.00 40.00 O
+ATOM 3580 CB ALA C 80 -64.200 18.933 42.211 1.00 40.00 C
+ATOM 3581 N ASP C 81 -62.102 20.329 40.108 1.00 40.00 N
+ATOM 3582 CA ASP C 81 -61.849 21.309 39.051 1.00 40.00 C
+ATOM 3583 C ASP C 81 -63.120 21.725 38.320 1.00 40.00 C
+ATOM 3584 O ASP C 81 -64.010 20.902 38.088 1.00 40.00 O
+ATOM 3585 CB ASP C 81 -60.772 20.818 38.084 1.00 40.00 C
+ATOM 3586 CG ASP C 81 -59.353 21.053 38.614 1.00 40.00 C
+ATOM 3587 OD1 ASP C 81 -59.174 21.320 39.834 1.00 40.00 O
+ATOM 3588 OD2 ASP C 81 -58.406 20.971 37.799 1.00 40.00 O
+ATOM 3589 N GLY C 82 -63.194 23.012 37.981 1.00 40.00 N
+ATOM 3590 CA GLY C 82 -64.398 23.599 37.405 1.00 40.00 C
+ATOM 3591 C GLY C 82 -65.100 24.521 38.387 1.00 40.00 C
+ATOM 3592 O GLY C 82 -64.574 24.795 39.482 1.00 40.00 O
+ATOM 3593 N VAL C 83 -66.285 25.001 37.990 1.00 40.00 N
+ATOM 3594 CA VAL C 83 -67.094 25.921 38.813 1.00 40.00 C
+ATOM 3595 C VAL C 83 -68.561 25.462 38.916 1.00 40.00 C
+ATOM 3596 O VAL C 83 -69.039 24.665 38.088 1.00 40.00 O
+ATOM 3597 CB VAL C 83 -66.981 27.400 38.333 1.00 40.00 C
+ATOM 3598 CG1 VAL C 83 -65.600 27.987 38.654 1.00 40.00 C
+ATOM 3599 CG2 VAL C 83 -67.299 27.525 36.846 1.00 40.00 C
+ATOM 3600 N ASP C 84 -69.255 25.933 39.952 1.00 40.00 N
+ATOM 3601 CA ASP C 84 -70.674 25.645 40.106 1.00 40.00 C
+ATOM 3602 C ASP C 84 -71.456 26.538 39.138 1.00 40.00 C
+ATOM 3603 O ASP C 84 -70.844 27.245 38.329 1.00 40.00 O
+ATOM 3604 CB ASP C 84 -71.117 25.852 41.564 1.00 40.00 C
+ATOM 3605 CG ASP C 84 -70.956 27.295 42.043 1.00 40.00 C
+ATOM 3606 OD1 ASP C 84 -71.272 27.574 43.216 1.00 40.00 O
+ATOM 3607 OD2 ASP C 84 -70.523 28.158 41.257 1.00 40.00 O
+ATOM 3608 N LYS C 85 -72.789 26.517 39.221 1.00 40.00 N
+ATOM 3609 CA LYS C 85 -73.635 27.398 38.400 1.00 40.00 C
+ATOM 3610 C LYS C 85 -73.283 28.893 38.501 1.00 40.00 C
+ATOM 3611 O LYS C 85 -73.508 29.639 37.544 1.00 40.00 O
+ATOM 3612 CB LYS C 85 -75.116 27.213 38.735 1.00 40.00 C
+ATOM 3613 CG LYS C 85 -75.462 27.436 40.204 1.00 40.00 C
+ATOM 3614 CD LYS C 85 -76.963 27.503 40.431 1.00 40.00 C
+ATOM 3615 CE LYS C 85 -77.680 26.403 39.669 1.00 40.00 C
+ATOM 3616 NZ LYS C 85 -76.907 25.123 39.643 1.00 40.00 N
+ATOM 3617 N ASN C 86 -72.738 29.321 39.648 1.00 40.00 N
+ATOM 3618 CA ASN C 86 -72.501 30.752 39.942 1.00 40.00 C
+ATOM 3619 C ASN C 86 -71.091 31.275 39.634 1.00 40.00 C
+ATOM 3620 O ASN C 86 -70.720 32.356 40.114 1.00 40.00 O
+ATOM 3621 CB ASN C 86 -72.836 31.067 41.413 1.00 40.00 C
+ATOM 3622 CG ASN C 86 -74.321 30.932 41.738 1.00 40.00 C
+ATOM 3623 OD1 ASN C 86 -74.751 31.265 42.844 1.00 40.00 O
+ATOM 3624 ND2 ASN C 86 -75.109 30.444 40.788 1.00 40.00 N
+ATOM 3625 N GLY C 87 -70.318 30.519 38.845 1.00 40.00 N
+ATOM 3626 CA GLY C 87 -68.917 30.852 38.543 1.00 40.00 C
+ATOM 3627 C GLY C 87 -67.984 30.576 39.714 1.00 40.00 C
+ATOM 3628 O GLY C 87 -66.763 30.802 39.620 1.00 40.00 O
+ATOM 3629 N LYS C 88 -68.571 30.078 40.811 1.00 40.00 N
+ATOM 3630 CA LYS C 88 -67.872 29.807 42.082 1.00 40.00 C
+ATOM 3631 C LYS C 88 -67.287 28.396 42.136 1.00 40.00 C
+ATOM 3632 O LYS C 88 -67.866 27.460 41.548 1.00 40.00 O
+ATOM 3633 CB LYS C 88 -68.820 29.989 43.273 1.00 40.00 C
+ATOM 3634 CG LYS C 88 -69.113 31.431 43.605 1.00 40.00 C
+ATOM 3635 CD LYS C 88 -70.344 31.516 44.478 1.00 40.00 C
+ATOM 3636 CE LYS C 88 -70.882 32.939 44.517 1.00 40.00 C
+ATOM 3637 NZ LYS C 88 -72.018 33.029 45.479 1.00 40.00 N
+ATOM 3638 N PRO C 89 -66.157 28.230 42.872 1.00 40.00 N
+ATOM 3639 CA PRO C 89 -65.567 26.886 43.012 1.00 40.00 C
+ATOM 3640 C PRO C 89 -66.623 25.859 43.460 1.00 40.00 C
+ATOM 3641 O PRO C 89 -67.716 26.242 43.902 1.00 40.00 O
+ATOM 3642 CB PRO C 89 -64.494 27.069 44.109 1.00 40.00 C
+ATOM 3643 CG PRO C 89 -64.242 28.541 44.206 1.00 40.00 C
+ATOM 3644 CD PRO C 89 -65.473 29.246 43.709 1.00 40.00 C
+ATOM 3645 N HIS C 90 -66.319 24.569 43.332 1.00 40.00 N
+ATOM 3646 CA HIS C 90 -67.167 23.541 43.954 1.00 40.00 C
+ATOM 3647 C HIS C 90 -66.859 23.514 45.433 1.00 40.00 C
+ATOM 3648 O HIS C 90 -65.870 24.140 45.869 1.00 40.00 O
+ATOM 3649 CB HIS C 90 -66.963 22.167 43.298 1.00 40.00 C
+ATOM 3650 CG HIS C 90 -67.302 22.136 41.812 1.00 40.00 C
+ATOM 3651 ND1 HIS C 90 -68.560 22.339 41.341 1.00 40.00 N
+ATOM 3652 CD2 HIS C 90 -66.492 21.917 40.685 1.00 40.00 C
+ATOM 3653 CE1 HIS C 90 -68.556 22.259 39.985 1.00 40.00 C
+ATOM 3654 NE2 HIS C 90 -67.291 22.001 39.585 1.00 40.00 N
+ATOM 3655 N LYS C 91 -67.691 22.823 46.225 1.00 40.00 N
+ATOM 3656 CA LYS C 91 -67.492 22.772 47.687 1.00 40.00 C
+ATOM 3657 C LYS C 91 -66.598 21.591 48.136 1.00 40.00 C
+ATOM 3658 O LYS C 91 -66.630 20.505 47.534 1.00 40.00 O
+ATOM 3659 CB LYS C 91 -68.835 22.802 48.440 1.00 40.00 C
+ATOM 3660 CG LYS C 91 -68.801 23.579 49.757 1.00 40.00 C
+ATOM 3661 CD LYS C 91 -69.083 25.064 49.582 1.00 40.00 C
+ATOM 3662 CE LYS C 91 -70.561 25.357 49.794 1.00 40.00 C
+ATOM 3663 NZ LYS C 91 -70.916 26.599 49.069 1.00 40.00 N
+ATOM 3664 N VAL C 92 -65.792 21.842 49.175 1.00 40.00 N
+ATOM 3665 CA VAL C 92 -64.818 20.885 49.728 1.00 40.00 C
+ATOM 3666 C VAL C 92 -65.476 19.538 50.079 1.00 40.00 C
+ATOM 3667 O VAL C 92 -66.387 19.487 50.905 1.00 40.00 O
+ATOM 3668 CB VAL C 92 -64.083 21.500 50.962 1.00 40.00 C
+ATOM 3669 CG1 VAL C 92 -63.308 20.452 51.751 1.00 40.00 C
+ATOM 3670 CG2 VAL C 92 -63.150 22.630 50.535 1.00 40.00 C
+ATOM 3671 N ARG C 93 -65.039 18.461 49.420 1.00 40.00 N
+ATOM 3672 CA ARG C 93 -65.430 17.104 49.822 1.00 40.00 C
+ATOM 3673 C ARG C 93 -64.326 16.477 50.632 1.00 40.00 C
+ATOM 3674 O ARG C 93 -63.135 16.742 50.392 1.00 40.00 O
+ATOM 3675 CB ARG C 93 -65.727 16.205 48.626 1.00 40.00 C
+ATOM 3676 CG ARG C 93 -67.182 16.165 48.220 1.00 40.00 C
+ATOM 3677 CD ARG C 93 -67.582 17.501 47.644 1.00 40.00 C
+ATOM 3678 NE ARG C 93 -68.656 17.371 46.685 1.00 40.00 N
+ATOM 3679 CZ ARG C 93 -69.167 18.391 46.025 1.00 40.00 C
+ATOM 3680 NH1 ARG C 93 -68.691 19.612 46.226 1.00 40.00 N
+ATOM 3681 NH2 ARG C 93 -70.150 18.187 45.168 1.00 40.00 N
+ATOM 3682 N LEU C 94 -64.722 15.628 51.578 1.00 40.00 N
+ATOM 3683 CA LEU C 94 -63.765 15.059 52.502 1.00 40.00 C
+ATOM 3684 C LEU C 94 -63.605 13.577 52.319 1.00 40.00 C
+ATOM 3685 O LEU C 94 -64.557 12.851 52.075 1.00 40.00 O
+ATOM 3686 CB LEU C 94 -64.139 15.378 53.941 1.00 40.00 C
+ATOM 3687 CG LEU C 94 -64.083 16.863 54.308 1.00 40.00 C
+ATOM 3688 CD1 LEU C 94 -64.493 17.025 55.762 1.00 40.00 C
+ATOM 3689 CD2 LEU C 94 -62.714 17.491 54.044 1.00 40.00 C
+ATOM 3690 N TYR C 95 -62.361 13.146 52.421 1.00 40.00 N
+ATOM 3691 CA TYR C 95 -62.038 11.759 52.260 1.00 40.00 C
+ATOM 3692 C TYR C 95 -60.956 11.412 53.240 1.00 40.00 C
+ATOM 3693 O TYR C 95 -59.986 12.149 53.419 1.00 40.00 O
+ATOM 3694 CB TYR C 95 -61.586 11.488 50.831 1.00 40.00 C
+ATOM 3695 CG TYR C 95 -62.625 11.881 49.811 1.00 40.00 C
+ATOM 3696 CD1 TYR C 95 -63.527 10.944 49.333 1.00 40.00 C
+ATOM 3697 CD2 TYR C 95 -62.715 13.198 49.337 1.00 40.00 C
+ATOM 3698 CE1 TYR C 95 -64.477 11.291 48.397 1.00 40.00 C
+ATOM 3699 CE2 TYR C 95 -63.672 13.558 48.410 1.00 40.00 C
+ATOM 3700 CZ TYR C 95 -64.556 12.601 47.953 1.00 40.00 C
+ATOM 3701 OH TYR C 95 -65.507 12.953 47.029 1.00 40.00 O
+ATOM 3702 N SER C 96 -61.153 10.275 53.883 1.00 40.00 N
+ATOM 3703 CA SER C 96 -60.253 9.802 54.908 1.00 40.00 C
+ATOM 3704 C SER C 96 -58.941 9.395 54.280 1.00 40.00 C
+ATOM 3705 O SER C 96 -58.935 8.747 53.235 1.00 40.00 O
+ATOM 3706 CB SER C 96 -60.878 8.598 55.574 1.00 40.00 C
+ATOM 3707 OG SER C 96 -62.283 8.745 55.574 1.00 40.00 O
+ATOM 3708 N ILE C 97 -57.829 9.775 54.914 1.00 40.00 N
+ATOM 3709 CA ILE C 97 -56.496 9.520 54.351 1.00 40.00 C
+ATOM 3710 C ILE C 97 -56.134 8.053 54.457 1.00 40.00 C
+ATOM 3711 O ILE C 97 -56.182 7.454 55.530 1.00 40.00 O
+ATOM 3712 CB ILE C 97 -55.386 10.380 54.989 1.00 40.00 C
+ATOM 3713 CG1 ILE C 97 -55.650 11.866 54.750 1.00 40.00 C
+ATOM 3714 CG2 ILE C 97 -54.026 10.008 54.413 1.00 40.00 C
+ATOM 3715 CD1 ILE C 97 -54.966 12.771 55.754 1.00 40.00 C
+ATOM 3716 N ALA C 98 -55.765 7.496 53.314 1.00 40.00 N
+ATOM 3717 CA ALA C 98 -55.528 6.077 53.180 1.00 40.00 C
+ATOM 3718 C ALA C 98 -54.106 5.704 53.512 1.00 40.00 C
+ATOM 3719 O ALA C 98 -53.882 4.598 53.990 1.00 40.00 O
+ATOM 3720 CB ALA C 98 -55.872 5.614 51.778 1.00 40.00 C
+ATOM 3721 N SER C 99 -53.149 6.605 53.256 1.00 40.00 N
+ATOM 3722 CA SER C 99 -51.732 6.324 53.557 1.00 40.00 C
+ATOM 3723 C SER C 99 -51.344 6.638 54.991 1.00 40.00 C
+ATOM 3724 O SER C 99 -51.957 7.481 55.631 1.00 40.00 O
+ATOM 3725 CB SER C 99 -50.784 7.054 52.601 1.00 40.00 C
+ATOM 3726 OG SER C 99 -51.127 8.418 52.466 1.00 40.00 O
+ATOM 3727 N SER C 100 -50.318 5.948 55.483 1.00 40.00 N
+ATOM 3728 CA SER C 100 -49.759 6.222 56.800 1.00 40.00 C
+ATOM 3729 C SER C 100 -49.026 7.559 56.769 1.00 40.00 C
+ATOM 3730 O SER C 100 -48.942 8.187 55.722 1.00 40.00 O
+ATOM 3731 CB SER C 100 -48.801 5.110 57.231 1.00 40.00 C
+ATOM 3732 OG SER C 100 -47.504 5.324 56.695 1.00 40.00 O
+ATOM 3733 N ALA C 101 -48.488 7.979 57.913 1.00 40.00 N
+ATOM 3734 CA ALA C 101 -47.779 9.251 58.020 1.00 40.00 C
+ATOM 3735 C ALA C 101 -46.694 9.323 56.963 1.00 40.00 C
+ATOM 3736 O ALA C 101 -46.478 10.346 56.295 1.00 40.00 O
+ATOM 3737 CB ALA C 101 -47.171 9.392 59.409 1.00 40.00 C
+ATOM 3738 N ILE C 102 -46.042 8.188 56.798 1.00 40.00 N
+ATOM 3739 CA ILE C 102 -44.836 8.110 56.035 1.00 40.00 C
+ATOM 3740 C ILE C 102 -45.143 8.036 54.563 1.00 40.00 C
+ATOM 3741 O ILE C 102 -44.246 8.141 53.736 1.00 40.00 O
+ATOM 3742 CB ILE C 102 -44.042 6.882 56.452 1.00 40.00 C
+ATOM 3743 CG1 ILE C 102 -44.290 6.571 57.938 1.00 40.00 C
+ATOM 3744 CG2 ILE C 102 -42.571 7.103 56.158 1.00 40.00 C
+ATOM 3745 CD1 ILE C 102 -43.875 7.669 58.909 1.00 40.00 C
+ATOM 3746 N GLY C 103 -46.422 7.868 54.245 1.00 40.00 N
+ATOM 3747 CA GLY C 103 -46.882 7.718 52.859 1.00 40.00 C
+ATOM 3748 C GLY C 103 -46.785 6.282 52.373 1.00 40.00 C
+ATOM 3749 O GLY C 103 -46.257 5.407 53.071 1.00 40.00 O
+ATOM 3750 N ASP C 104 -47.297 6.039 51.172 1.00 40.00 N
+ATOM 3751 CA ASP C 104 -47.193 4.718 50.567 1.00 40.00 C
+ATOM 3752 C ASP C 104 -45.744 4.399 50.178 1.00 40.00 C
+ATOM 3753 O ASP C 104 -45.348 3.231 50.083 1.00 40.00 O
+ATOM 3754 CB ASP C 104 -48.112 4.619 49.341 1.00 40.00 C
+ATOM 3755 CG ASP C 104 -49.583 4.416 49.712 1.00 40.00 C
+ATOM 3756 OD1 ASP C 104 -49.867 3.911 50.824 1.00 40.00 O
+ATOM 3757 OD2 ASP C 104 -50.453 4.747 48.873 1.00 40.00 O
+ATOM 3758 N PHE C 105 -44.954 5.439 49.953 1.00 40.00 N
+ATOM 3759 CA PHE C 105 -43.575 5.224 49.577 1.00 40.00 C
+ATOM 3760 C PHE C 105 -42.676 5.273 50.789 1.00 40.00 C
+ATOM 3761 O PHE C 105 -41.497 4.974 50.686 1.00 40.00 O
+ATOM 3762 CB PHE C 105 -43.137 6.230 48.523 1.00 40.00 C
+ATOM 3763 CG PHE C 105 -44.126 6.389 47.420 1.00 40.00 C
+ATOM 3764 CD1 PHE C 105 -44.842 5.291 46.960 1.00 40.00 C
+ATOM 3765 CD2 PHE C 105 -44.347 7.632 46.840 1.00 40.00 C
+ATOM 3766 CE1 PHE C 105 -45.771 5.429 45.950 1.00 40.00 C
+ATOM 3767 CE2 PHE C 105 -45.274 7.783 45.824 1.00 40.00 C
+ATOM 3768 CZ PHE C 105 -45.986 6.677 45.378 1.00 40.00 C
+ATOM 3769 N GLY C 106 -43.237 5.635 51.938 1.00 40.00 N
+ATOM 3770 CA GLY C 106 -42.481 5.658 53.181 1.00 40.00 C
+ATOM 3771 C GLY C 106 -41.452 6.768 53.249 1.00 40.00 C
+ATOM 3772 O GLY C 106 -40.399 6.608 53.852 1.00 40.00 O
+ATOM 3773 N ASP C 107 -41.757 7.904 52.640 1.00 40.00 N
+ATOM 3774 CA ASP C 107 -40.829 9.024 52.630 1.00 40.00 C
+ATOM 3775 C ASP C 107 -41.482 10.356 53.058 1.00 40.00 C
+ATOM 3776 O ASP C 107 -40.839 11.405 53.023 1.00 40.00 O
+ATOM 3777 CB ASP C 107 -40.213 9.151 51.244 1.00 40.00 C
+ATOM 3778 CG ASP C 107 -41.191 9.674 50.233 1.00 40.00 C
+ATOM 3779 OD1 ASP C 107 -42.376 9.274 50.268 1.00 40.00 O
+ATOM 3780 OD2 ASP C 107 -40.773 10.501 49.407 1.00 40.00 O
+ATOM 3781 N SER C 108 -42.759 10.298 53.444 1.00 40.00 N
+ATOM 3782 CA SER C 108 -43.532 11.439 53.977 1.00 40.00 C
+ATOM 3783 C SER C 108 -43.690 12.642 53.045 1.00 40.00 C
+ATOM 3784 O SER C 108 -43.845 13.766 53.504 1.00 40.00 O
+ATOM 3785 CB SER C 108 -42.980 11.883 55.332 1.00 40.00 C
+ATOM 3786 OG SER C 108 -43.020 10.817 56.257 1.00 40.00 O
+ATOM 3787 N LYS C 109 -43.662 12.392 51.741 1.00 40.00 N
+ATOM 3788 CA LYS C 109 -43.883 13.425 50.728 1.00 40.00 C
+ATOM 3789 C LYS C 109 -45.135 13.069 49.935 1.00 40.00 C
+ATOM 3790 O LYS C 109 -45.340 13.527 48.800 1.00 40.00 O
+ATOM 3791 CB LYS C 109 -42.681 13.506 49.784 1.00 40.00 C
+ATOM 3792 CG LYS C 109 -41.320 13.620 50.467 1.00 40.00 C
+ATOM 3793 CD LYS C 109 -41.206 14.897 51.286 1.00 40.00 C
+ATOM 3794 CE LYS C 109 -39.765 15.283 51.606 1.00 40.00 C
+ATOM 3795 NZ LYS C 109 -39.043 15.920 50.463 1.00 40.00 N
+ATOM 3796 N THR C 110 -45.974 12.253 50.569 1.00 40.00 N
+ATOM 3797 CA THR C 110 -47.022 11.510 49.884 1.00 40.00 C
+ATOM 3798 C THR C 110 -48.230 11.251 50.766 1.00 40.00 C
+ATOM 3799 O THR C 110 -48.094 10.810 51.911 1.00 40.00 O
+ATOM 3800 CB THR C 110 -46.525 10.123 49.445 1.00 40.00 C
+ATOM 3801 OG1 THR C 110 -46.372 9.284 50.597 1.00 40.00 O
+ATOM 3802 CG2 THR C 110 -45.210 10.232 48.691 1.00 40.00 C
+ATOM 3803 N VAL C 111 -49.406 11.501 50.195 1.00 40.00 N
+ATOM 3804 CA VAL C 111 -50.676 11.213 50.834 1.00 40.00 C
+ATOM 3805 C VAL C 111 -51.491 10.294 49.945 1.00 40.00 C
+ATOM 3806 O VAL C 111 -51.388 10.370 48.723 1.00 40.00 O
+ATOM 3807 CB VAL C 111 -51.476 12.494 51.033 1.00 40.00 C
+ATOM 3808 CG1 VAL C 111 -51.933 13.046 49.688 1.00 40.00 C
+ATOM 3809 CG2 VAL C 111 -52.661 12.227 51.943 1.00 40.00 C
+ATOM 3810 N SER C 112 -52.319 9.451 50.551 1.00 40.00 N
+ATOM 3811 CA SER C 112 -53.117 8.502 49.786 1.00 40.00 C
+ATOM 3812 C SER C 112 -54.588 8.528 50.161 1.00 40.00 C
+ATOM 3813 O SER C 112 -54.921 8.607 51.333 1.00 40.00 O
+ATOM 3814 CB SER C 112 -52.547 7.105 49.950 1.00 40.00 C
+ATOM 3815 OG SER C 112 -51.143 7.136 49.734 1.00 40.00 O
+ATOM 3816 N LEU C 113 -55.454 8.460 49.149 1.00 40.00 N
+ATOM 3817 CA LEU C 113 -56.898 8.522 49.338 1.00 40.00 C
+ATOM 3818 C LEU C 113 -57.582 7.298 48.807 1.00 40.00 C
+ATOM 3819 O LEU C 113 -57.065 6.627 47.919 1.00 40.00 O
+ATOM 3820 CB LEU C 113 -57.465 9.700 48.579 1.00 40.00 C
+ATOM 3821 CG LEU C 113 -57.290 11.028 49.267 1.00 40.00 C
+ATOM 3822 CD1 LEU C 113 -57.924 12.110 48.408 1.00 40.00 C
+ATOM 3823 CD2 LEU C 113 -57.958 10.912 50.619 1.00 40.00 C
+ATOM 3824 N CYS C 114 -58.768 7.030 49.332 1.00 40.00 N
+ATOM 3825 CA CYS C 114 -59.589 5.950 48.817 1.00 40.00 C
+ATOM 3826 C CYS C 114 -60.936 6.513 48.395 1.00 40.00 C
+ATOM 3827 O CYS C 114 -61.679 7.053 49.220 1.00 40.00 O
+ATOM 3828 CB CYS C 114 -59.755 4.849 49.857 1.00 40.00 C
+ATOM 3829 SG CYS C 114 -60.695 3.413 49.274 1.00 40.00 S
+ATOM 3830 N VAL C 115 -61.231 6.401 47.100 1.00 40.00 N
+ATOM 3831 CA VAL C 115 -62.420 7.031 46.518 1.00 40.00 C
+ATOM 3832 C VAL C 115 -63.275 6.105 45.652 1.00 40.00 C
+ATOM 3833 O VAL C 115 -62.808 5.511 44.665 1.00 40.00 O
+ATOM 3834 CB VAL C 115 -62.072 8.279 45.680 1.00 40.00 C
+ATOM 3835 CG1 VAL C 115 -63.307 9.157 45.504 1.00 40.00 C
+ATOM 3836 CG2 VAL C 115 -60.947 9.066 46.333 1.00 40.00 C
+ATOM 3837 N LYS C 116 -64.545 6.012 46.038 1.00 40.00 N
+ATOM 3838 CA LYS C 116 -65.562 5.345 45.242 1.00 40.00 C
+ATOM 3839 C LYS C 116 -66.220 6.392 44.345 1.00 40.00 C
+ATOM 3840 O LYS C 116 -66.573 7.493 44.792 1.00 40.00 O
+ATOM 3841 CB LYS C 116 -66.598 4.672 46.145 1.00 40.00 C
+ATOM 3842 CG LYS C 116 -67.550 3.739 45.423 1.00 40.00 C
+ATOM 3843 CD LYS C 116 -68.898 3.755 46.123 1.00 40.00 C
+ATOM 3844 CE LYS C 116 -70.031 3.252 45.235 1.00 40.00 C
+ATOM 3845 NZ LYS C 116 -70.175 1.775 45.339 1.00 40.00 N
+ATOM 3846 N ARG C 117 -66.352 6.034 43.074 1.00 40.00 N
+ATOM 3847 CA ARG C 117 -67.003 6.863 42.080 1.00 40.00 C
+ATOM 3848 C ARG C 117 -68.522 6.864 42.333 1.00 40.00 C
+ATOM 3849 O ARG C 117 -69.210 5.845 42.142 1.00 40.00 O
+ATOM 3850 CB ARG C 117 -66.668 6.312 40.692 1.00 40.00 C
+ATOM 3851 CG ARG C 117 -66.724 7.322 39.568 1.00 40.00 C
+ATOM 3852 CD ARG C 117 -66.647 6.638 38.212 1.00 40.00 C
+ATOM 3853 NE ARG C 117 -65.278 6.494 37.728 1.00 40.00 N
+ATOM 3854 CZ ARG C 117 -64.612 7.434 37.066 1.00 40.00 C
+ATOM 3855 NH1 ARG C 117 -65.181 8.599 36.819 1.00 40.00 N
+ATOM 3856 NH2 ARG C 117 -63.371 7.213 36.656 1.00 40.00 N
+ATOM 3857 N LEU C 118 -69.033 8.002 42.798 1.00 40.00 N
+ATOM 3858 CA LEU C 118 -70.469 8.166 42.994 1.00 40.00 C
+ATOM 3859 C LEU C 118 -71.159 8.194 41.627 1.00 40.00 C
+ATOM 3860 O LEU C 118 -71.077 9.202 40.910 1.00 40.00 O
+ATOM 3861 CB LEU C 118 -70.771 9.448 43.799 1.00 40.00 C
+ATOM 3862 CG LEU C 118 -72.212 9.949 43.968 1.00 40.00 C
+ATOM 3863 CD1 LEU C 118 -73.056 8.959 44.749 1.00 40.00 C
+ATOM 3864 CD2 LEU C 118 -72.247 11.301 44.646 1.00 40.00 C
+ATOM 3865 N ILE C 119 -71.778 7.068 41.247 1.00 40.00 N
+ATOM 3866 CA ILE C 119 -72.764 7.035 40.128 1.00 40.00 C
+ATOM 3867 C ILE C 119 -74.029 6.213 40.487 1.00 40.00 C
+ATOM 3868 O ILE C 119 -73.936 5.009 40.798 1.00 40.00 O
+ATOM 3869 CB ILE C 119 -72.181 6.584 38.748 1.00 40.00 C
+ATOM 3870 CG1 ILE C 119 -71.024 7.482 38.303 1.00 40.00 C
+ATOM 3871 CG2 ILE C 119 -73.256 6.641 37.665 1.00 40.00 C
+ATOM 3872 CD1 ILE C 119 -70.299 6.984 37.072 1.00 40.00 C
+ATOM 3873 N TYR C 120 -75.187 6.891 40.455 1.00 40.00 N
+ATOM 3874 CA TYR C 120 -76.525 6.289 40.653 1.00 40.00 C
+ATOM 3875 C TYR C 120 -77.437 6.617 39.455 1.00 40.00 C
+ATOM 3876 O TYR C 120 -77.104 7.493 38.644 1.00 40.00 O
+ATOM 3877 CB TYR C 120 -77.170 6.721 42.008 1.00 40.00 C
+ATOM 3878 CG TYR C 120 -77.278 8.235 42.308 1.00 40.00 C
+ATOM 3879 CD1 TYR C 120 -76.156 8.983 42.708 1.00 40.00 C
+ATOM 3880 CD2 TYR C 120 -78.515 8.909 42.241 1.00 40.00 C
+ATOM 3881 CE1 TYR C 120 -76.251 10.353 42.993 1.00 40.00 C
+ATOM 3882 CE2 TYR C 120 -78.617 10.282 42.526 1.00 40.00 C
+ATOM 3883 CZ TYR C 120 -77.486 10.999 42.906 1.00 40.00 C
+ATOM 3884 OH TYR C 120 -77.567 12.350 43.192 1.00 40.00 O
+ATOM 3885 N THR C 121 -78.551 5.883 39.324 1.00 40.00 N
+ATOM 3886 CA THR C 121 -79.678 6.254 38.419 1.00 40.00 C
+ATOM 3887 C THR C 121 -80.856 6.724 39.307 1.00 40.00 C
+ATOM 3888 O THR C 121 -81.221 6.002 40.241 1.00 40.00 O
+ATOM 3889 CB THR C 121 -80.086 5.077 37.459 1.00 40.00 C
+ATOM 3890 OG1 THR C 121 -79.204 5.042 36.321 1.00 40.00 O
+ATOM 3891 CG2 THR C 121 -81.548 5.189 36.956 1.00 40.00 C
+ATOM 3892 N ASN C 122 -81.409 7.925 39.061 1.00 40.00 N
+ATOM 3893 CA ASN C 122 -82.621 8.363 39.800 1.00 40.00 C
+ATOM 3894 C ASN C 122 -83.918 7.760 39.217 1.00 40.00 C
+ATOM 3895 O ASN C 122 -83.847 6.913 38.300 1.00 40.00 O
+ATOM 3896 CB ASN C 122 -82.687 9.902 40.100 1.00 40.00 C
+ATOM 3897 CG ASN C 122 -82.666 10.784 38.845 1.00 40.00 C
+ATOM 3898 OD1 ASN C 122 -83.512 10.662 37.948 1.00 40.00 O
+ATOM 3899 ND2 ASN C 122 -81.719 11.719 38.808 1.00 40.00 N
+ATOM 3900 N ASP C 123 -85.078 8.160 39.767 1.00 40.00 N
+ATOM 3901 CA ASP C 123 -86.413 7.640 39.324 1.00 40.00 C
+ATOM 3902 C ASP C 123 -86.874 8.015 37.882 1.00 40.00 C
+ATOM 3903 O ASP C 123 -87.813 7.394 37.330 1.00 40.00 O
+ATOM 3904 CB ASP C 123 -87.547 7.863 40.380 1.00 40.00 C
+ATOM 3905 CG ASP C 123 -87.508 9.260 41.090 1.00 40.00 C
+ATOM 3906 OD1 ASP C 123 -86.823 10.227 40.649 1.00 40.00 O
+ATOM 3907 OD2 ASP C 123 -88.212 9.376 42.124 1.00 40.00 O
+ATOM 3908 N ALA C 124 -86.193 9.014 37.297 1.00 40.00 N
+ATOM 3909 CA ALA C 124 -86.385 9.443 35.903 1.00 40.00 C
+ATOM 3910 C ALA C 124 -85.479 8.684 34.866 1.00 40.00 C
+ATOM 3911 O ALA C 124 -85.502 9.001 33.663 1.00 40.00 O
+ATOM 3912 CB ALA C 124 -86.250 10.974 35.797 1.00 40.00 C
+ATOM 3913 N GLY C 125 -84.725 7.671 35.333 1.00 40.00 N
+ATOM 3914 CA GLY C 125 -83.774 6.892 34.501 1.00 40.00 C
+ATOM 3915 C GLY C 125 -82.401 7.545 34.308 1.00 40.00 C
+ATOM 3916 O GLY C 125 -81.506 6.949 33.672 1.00 40.00 O
+ATOM 3917 N GLU C 126 -82.251 8.752 34.894 1.00 40.00 N
+ATOM 3918 CA GLU C 126 -81.133 9.722 34.678 1.00 40.00 C
+ATOM 3919 C GLU C 126 -79.853 9.451 35.499 1.00 40.00 C
+ATOM 3920 O GLU C 126 -79.839 9.675 36.728 1.00 40.00 O
+ATOM 3921 CB GLU C 126 -81.599 11.172 34.972 1.00 40.00 C
+ATOM 3922 CG GLU C 126 -82.812 11.647 34.180 1.00 40.00 C
+ATOM 3923 CD GLU C 126 -83.642 12.715 34.896 1.00 40.00 C
+ATOM 3924 OE1 GLU C 126 -83.587 12.829 36.151 1.00 40.00 O
+ATOM 3925 OE2 GLU C 126 -84.389 13.431 34.188 1.00 40.00 O
+ATOM 3926 N ILE C 127 -78.791 9.006 34.804 1.00 40.00 N
+ATOM 3927 CA ILE C 127 -77.448 8.757 35.390 1.00 40.00 C
+ATOM 3928 C ILE C 127 -76.807 10.024 36.047 1.00 40.00 C
+ATOM 3929 O ILE C 127 -76.304 10.928 35.349 1.00 40.00 O
+ATOM 3930 CB ILE C 127 -76.507 8.029 34.372 1.00 40.00 C
+ATOM 3931 CG1 ILE C 127 -76.911 6.557 34.254 1.00 40.00 C
+ATOM 3932 CG2 ILE C 127 -75.034 8.138 34.764 1.00 40.00 C
+ATOM 3933 CD1 ILE C 127 -75.960 5.718 33.435 1.00 40.00 C
+ATOM 3934 N VAL C 128 -76.867 10.078 37.391 1.00 40.00 N
+ATOM 3935 CA VAL C 128 -76.253 11.147 38.221 1.00 40.00 C
+ATOM 3936 C VAL C 128 -74.812 10.752 38.597 1.00 40.00 C
+ATOM 3937 O VAL C 128 -74.545 9.598 38.952 1.00 40.00 O
+ATOM 3938 CB VAL C 128 -77.075 11.458 39.518 1.00 40.00 C
+ATOM 3939 CG1 VAL C 128 -76.561 12.719 40.212 1.00 40.00 C
+ATOM 3940 CG2 VAL C 128 -78.568 11.588 39.227 1.00 40.00 C
+ATOM 3941 N LYS C 129 -73.891 11.708 38.497 1.00 40.00 N
+ATOM 3942 CA LYS C 129 -72.495 11.474 38.860 1.00 40.00 C
+ATOM 3943 C LYS C 129 -71.995 12.498 39.893 1.00 40.00 C
+ATOM 3944 O LYS C 129 -72.264 13.702 39.784 1.00 40.00 O
+ATOM 3945 CB LYS C 129 -71.605 11.485 37.614 1.00 40.00 C
+ATOM 3946 CG LYS C 129 -72.046 10.553 36.487 1.00 40.00 C
+ATOM 3947 CD LYS C 129 -70.960 10.413 35.417 1.00 40.00 C
+ATOM 3948 CE LYS C 129 -70.569 11.756 34.794 1.00 40.00 C
+ATOM 3949 NZ LYS C 129 -69.312 11.712 33.986 1.00 40.00 N
+ATOM 3950 N GLY C 130 -71.281 12.006 40.900 1.00 40.00 N
+ATOM 3951 CA GLY C 130 -70.667 12.871 41.891 1.00 40.00 C
+ATOM 3952 C GLY C 130 -69.561 13.735 41.305 1.00 40.00 C
+ATOM 3953 O GLY C 130 -68.653 13.238 40.637 1.00 40.00 O
+ATOM 3954 N VAL C 131 -69.649 15.037 41.563 1.00 40.00 N
+ATOM 3955 CA VAL C 131 -68.611 16.003 41.182 1.00 40.00 C
+ATOM 3956 C VAL C 131 -67.209 15.515 41.602 1.00 40.00 C
+ATOM 3957 O VAL C 131 -66.409 15.090 40.755 1.00 40.00 O
+ATOM 3958 CB VAL C 131 -68.905 17.421 41.770 1.00 40.00 C
+ATOM 3959 CG1 VAL C 131 -67.826 18.433 41.381 1.00 40.00 C
+ATOM 3960 CG2 VAL C 131 -70.282 17.914 41.340 1.00 40.00 C
+ATOM 3961 N CYS C 132 -66.942 15.551 42.911 1.00 40.00 N
+ATOM 3962 CA CYS C 132 -65.605 15.325 43.441 1.00 40.00 C
+ATOM 3963 C CYS C 132 -65.135 13.894 43.233 1.00 40.00 C
+ATOM 3964 O CYS C 132 -64.005 13.690 42.794 1.00 40.00 O
+ATOM 3965 CB CYS C 132 -65.533 15.717 44.913 1.00 40.00 C
+ATOM 3966 SG CYS C 132 -63.970 16.504 45.332 1.00 40.00 S
+ATOM 3967 N SER C 133 -66.009 12.920 43.525 1.00 40.00 N
+ATOM 3968 CA SER C 133 -65.695 11.481 43.398 1.00 40.00 C
+ATOM 3969 C SER C 133 -65.317 11.080 41.970 1.00 40.00 C
+ATOM 3970 O SER C 133 -64.406 10.264 41.768 1.00 40.00 O
+ATOM 3971 CB SER C 133 -66.865 10.609 43.872 1.00 40.00 C
+ATOM 3972 OG SER C 133 -67.963 10.715 42.979 1.00 40.00 O
+ATOM 3973 N ASN C 134 -66.022 11.653 40.991 1.00 40.00 N
+ATOM 3974 CA ASN C 134 -65.744 11.394 39.578 1.00 40.00 C
+ATOM 3975 C ASN C 134 -64.542 12.151 39.080 1.00 40.00 C
+ATOM 3976 O ASN C 134 -63.747 11.606 38.320 1.00 40.00 O
+ATOM 3977 CB ASN C 134 -66.963 11.695 38.720 1.00 40.00 C
+ATOM 3978 CG ASN C 134 -67.988 10.583 38.788 1.00 40.00 C
+ATOM 3979 OD1 ASN C 134 -67.844 9.561 38.118 1.00 40.00 O
+ATOM 3980 ND2 ASN C 134 -69.019 10.764 39.612 1.00 40.00 N
+ATOM 3981 N PHE C 135 -64.414 13.405 39.524 1.00 40.00 N
+ATOM 3982 CA PHE C 135 -63.202 14.193 39.292 1.00 40.00 C
+ATOM 3983 C PHE C 135 -61.964 13.366 39.658 1.00 40.00 C
+ATOM 3984 O PHE C 135 -61.018 13.252 38.863 1.00 40.00 O
+ATOM 3985 CB PHE C 135 -63.243 15.525 40.081 1.00 40.00 C
+ATOM 3986 CG PHE C 135 -61.912 16.241 40.156 1.00 40.00 C
+ATOM 3987 CD1 PHE C 135 -61.267 16.680 38.996 1.00 40.00 C
+ATOM 3988 CD2 PHE C 135 -61.302 16.480 41.385 1.00 40.00 C
+ATOM 3989 CE1 PHE C 135 -60.043 17.331 39.063 1.00 40.00 C
+ATOM 3990 CE2 PHE C 135 -60.079 17.136 41.455 1.00 40.00 C
+ATOM 3991 CZ PHE C 135 -59.451 17.563 40.295 1.00 40.00 C
+ATOM 3992 N LEU C 136 -62.016 12.762 40.847 1.00 40.00 N
+ATOM 3993 CA LEU C 136 -60.871 12.093 41.445 1.00 40.00 C
+ATOM 3994 C LEU C 136 -60.518 10.763 40.786 1.00 40.00 C
+ATOM 3995 O LEU C 136 -59.353 10.529 40.443 1.00 40.00 O
+ATOM 3996 CB LEU C 136 -61.054 11.954 42.960 1.00 40.00 C
+ATOM 3997 CG LEU C 136 -60.809 13.274 43.718 1.00 40.00 C
+ATOM 3998 CD1 LEU C 136 -61.321 13.203 45.153 1.00 40.00 C
+ATOM 3999 CD2 LEU C 136 -59.344 13.717 43.691 1.00 40.00 C
+ATOM 4000 N CYS C 137 -61.504 9.901 40.582 1.00 40.00 N
+ATOM 4001 CA CYS C 137 -61.246 8.657 39.873 1.00 40.00 C
+ATOM 4002 C CYS C 137 -60.762 8.918 38.445 1.00 40.00 C
+ATOM 4003 O CYS C 137 -60.040 8.098 37.869 1.00 40.00 O
+ATOM 4004 CB CYS C 137 -62.494 7.792 39.879 1.00 40.00 C
+ATOM 4005 SG CYS C 137 -62.975 7.260 41.545 1.00 40.00 S
+ATOM 4006 N ASP C 138 -61.144 10.085 37.908 1.00 40.00 N
+ATOM 4007 CA ASP C 138 -60.800 10.525 36.540 1.00 40.00 C
+ATOM 4008 C ASP C 138 -59.381 11.067 36.354 1.00 40.00 C
+ATOM 4009 O ASP C 138 -58.959 11.340 35.220 1.00 40.00 O
+ATOM 4010 CB ASP C 138 -61.795 11.586 36.041 1.00 40.00 C
+ATOM 4011 CG ASP C 138 -63.053 10.983 35.441 1.00 40.00 C
+ATOM 4012 OD1 ASP C 138 -63.167 9.730 35.360 1.00 40.00 O
+ATOM 4013 OD2 ASP C 138 -63.933 11.781 35.052 1.00 40.00 O
+ATOM 4014 N LEU C 139 -58.647 11.232 37.451 1.00 40.00 N
+ATOM 4015 CA LEU C 139 -57.332 11.860 37.369 1.00 40.00 C
+ATOM 4016 C LEU C 139 -56.265 10.961 36.761 1.00 40.00 C
+ATOM 4017 O LEU C 139 -56.208 9.756 37.019 1.00 40.00 O
+ATOM 4018 CB LEU C 139 -56.888 12.434 38.720 1.00 40.00 C
+ATOM 4019 CG LEU C 139 -57.626 13.708 39.150 1.00 40.00 C
+ATOM 4020 CD1 LEU C 139 -57.174 14.094 40.544 1.00 40.00 C
+ATOM 4021 CD2 LEU C 139 -57.459 14.875 38.179 1.00 40.00 C
+ATOM 4022 N GLN C 140 -55.442 11.576 35.924 1.00 40.00 N
+ATOM 4023 CA GLN C 140 -54.323 10.903 35.302 1.00 40.00 C
+ATOM 4024 C GLN C 140 -53.016 11.281 36.021 1.00 40.00 C
+ATOM 4025 O GLN C 140 -52.923 12.390 36.571 1.00 40.00 O
+ATOM 4026 CB GLN C 140 -54.266 11.281 33.814 1.00 40.00 C
+ATOM 4027 CG GLN C 140 -55.489 10.873 33.008 1.00 40.00 C
+ATOM 4028 CD GLN C 140 -55.935 9.443 33.285 1.00 40.00 C
+ATOM 4029 OE1 GLN C 140 -57.104 9.120 33.125 1.00 40.00 O
+ATOM 4030 NE2 GLN C 140 -55.009 8.585 33.708 1.00 40.00 N
+ATOM 4031 N PRO C 141 -52.011 10.364 36.045 1.00 40.00 N
+ATOM 4032 CA PRO C 141 -50.678 10.782 36.470 1.00 40.00 C
+ATOM 4033 C PRO C 141 -50.308 12.166 35.888 1.00 40.00 C
+ATOM 4034 O PRO C 141 -50.358 12.358 34.672 1.00 40.00 O
+ATOM 4035 CB PRO C 141 -49.776 9.694 35.880 1.00 40.00 C
+ATOM 4036 CG PRO C 141 -50.625 8.477 35.814 1.00 40.00 C
+ATOM 4037 CD PRO C 141 -52.066 8.910 35.787 1.00 40.00 C
+ATOM 4038 N GLY C 142 -49.985 13.135 36.740 1.00 40.00 N
+ATOM 4039 CA GLY C 142 -49.518 14.447 36.259 1.00 40.00 C
+ATOM 4040 C GLY C 142 -50.501 15.598 36.379 1.00 40.00 C
+ATOM 4041 O GLY C 142 -50.123 16.776 36.253 1.00 40.00 O
+ATOM 4042 N ASP C 143 -51.765 15.245 36.615 1.00 40.00 N
+ATOM 4043 CA ASP C 143 -52.829 16.213 36.871 1.00 40.00 C
+ATOM 4044 C ASP C 143 -52.573 16.949 38.189 1.00 40.00 C
+ATOM 4045 O ASP C 143 -52.031 16.380 39.132 1.00 40.00 O
+ATOM 4046 CB ASP C 143 -54.201 15.508 36.916 1.00 40.00 C
+ATOM 4047 CG ASP C 143 -54.563 14.802 35.604 1.00 40.00 C
+ATOM 4048 OD1 ASP C 143 -53.655 14.490 34.809 1.00 40.00 O
+ATOM 4049 OD2 ASP C 143 -55.764 14.546 35.374 1.00 40.00 O
+ATOM 4050 N ASN C 144 -52.954 18.217 38.244 1.00 40.00 N
+ATOM 4051 CA ASN C 144 -52.895 18.961 39.496 1.00 40.00 C
+ATOM 4052 C ASN C 144 -54.107 18.687 40.383 1.00 40.00 C
+ATOM 4053 O ASN C 144 -55.196 18.427 39.865 1.00 40.00 O
+ATOM 4054 CB ASN C 144 -52.764 20.467 39.230 1.00 40.00 C
+ATOM 4055 CG ASN C 144 -51.319 20.941 39.238 1.00 40.00 C
+ATOM 4056 OD1 ASN C 144 -51.016 22.064 38.818 1.00 40.00 O
+ATOM 4057 ND2 ASN C 144 -50.419 20.094 39.732 1.00 40.00 N
+ATOM 4058 N VAL C 145 -53.904 18.726 41.710 1.00 40.00 N
+ATOM 4059 CA VAL C 145 -54.997 18.631 42.730 1.00 40.00 C
+ATOM 4060 C VAL C 145 -54.888 19.780 43.765 1.00 40.00 C
+ATOM 4061 O VAL C 145 -53.794 20.059 44.295 1.00 40.00 O
+ATOM 4062 CB VAL C 145 -55.055 17.252 43.490 1.00 40.00 C
+ATOM 4063 CG1 VAL C 145 -56.415 17.036 44.156 1.00 40.00 C
+ATOM 4064 CG2 VAL C 145 -54.744 16.071 42.574 1.00 40.00 C
+ATOM 4065 N GLN C 146 -56.022 20.439 44.038 1.00 40.00 N
+ATOM 4066 CA GLN C 146 -56.102 21.455 45.094 1.00 40.00 C
+ATOM 4067 C GLN C 146 -56.493 20.775 46.410 1.00 40.00 C
+ATOM 4068 O GLN C 146 -57.515 20.071 46.496 1.00 40.00 O
+ATOM 4069 CB GLN C 146 -57.098 22.566 44.724 1.00 40.00 C
+ATOM 4070 CG GLN C 146 -56.642 23.480 43.586 1.00 40.00 C
+ATOM 4071 CD GLN C 146 -57.707 24.482 43.134 1.00 40.00 C
+ATOM 4072 OE1 GLN C 146 -58.872 24.123 42.879 1.00 40.00 O
+ATOM 4073 NE2 GLN C 146 -57.302 25.748 43.010 1.00 40.00 N
+ATOM 4074 N ILE C 147 -55.668 20.986 47.431 1.00 40.00 N
+ATOM 4075 CA ILE C 147 -55.758 20.188 48.649 1.00 40.00 C
+ATOM 4076 C ILE C 147 -55.829 21.012 49.931 1.00 40.00 C
+ATOM 4077 O ILE C 147 -54.932 21.827 50.210 1.00 40.00 O
+ATOM 4078 CB ILE C 147 -54.587 19.182 48.739 1.00 40.00 C
+ATOM 4079 CG1 ILE C 147 -54.693 18.146 47.617 1.00 40.00 C
+ATOM 4080 CG2 ILE C 147 -54.589 18.455 50.077 1.00 40.00 C
+ATOM 4081 CD1 ILE C 147 -53.386 17.454 47.293 1.00 40.00 C
+ATOM 4082 N THR C 148 -56.899 20.770 50.700 1.00 40.00 N
+ATOM 4083 CA THR C 148 -57.126 21.395 52.014 1.00 40.00 C
+ATOM 4084 C THR C 148 -56.839 20.421 53.158 1.00 40.00 C
+ATOM 4085 O THR C 148 -56.967 19.200 53.000 1.00 40.00 O
+ATOM 4086 CB THR C 148 -58.576 21.931 52.171 1.00 40.00 C
+ATOM 4087 OG1 THR C 148 -59.511 20.862 52.015 1.00 40.00 O
+ATOM 4088 CG2 THR C 148 -58.899 23.004 51.135 1.00 40.00 C
+ATOM 4089 N GLY C 149 -56.458 20.970 54.308 1.00 40.00 N
+ATOM 4090 CA GLY C 149 -56.265 20.159 55.504 1.00 40.00 C
+ATOM 4091 C GLY C 149 -54.965 20.452 56.233 1.00 40.00 C
+ATOM 4092 O GLY C 149 -54.358 21.502 56.007 1.00 40.00 O
+ATOM 4093 N PRO C 150 -54.527 19.526 57.116 1.00 40.00 N
+ATOM 4094 CA PRO C 150 -55.248 18.294 57.424 1.00 40.00 C
+ATOM 4095 C PRO C 150 -56.356 18.570 58.408 1.00 40.00 C
+ATOM 4096 O PRO C 150 -56.344 19.599 59.082 1.00 40.00 O
+ATOM 4097 CB PRO C 150 -54.185 17.414 58.074 1.00 40.00 C
+ATOM 4098 CG PRO C 150 -53.224 18.370 58.682 1.00 40.00 C
+ATOM 4099 CD PRO C 150 -53.254 19.628 57.859 1.00 40.00 C
+ATOM 4100 N VAL C 151 -57.303 17.646 58.493 1.00 40.00 N
+ATOM 4101 CA VAL C 151 -58.528 17.873 59.246 1.00 40.00 C
+ATOM 4102 C VAL C 151 -59.002 16.620 59.999 1.00 40.00 C
+ATOM 4103 O VAL C 151 -58.809 15.478 59.536 1.00 40.00 O
+ATOM 4104 CB VAL C 151 -59.637 18.352 58.296 1.00 40.00 C
+ATOM 4105 CG1 VAL C 151 -60.973 18.404 59.002 1.00 40.00 C
+ATOM 4106 CG2 VAL C 151 -59.301 19.719 57.737 1.00 40.00 C
+ATOM 4107 N GLY C 152 -59.634 16.843 61.153 1.00 40.00 N
+ATOM 4108 CA GLY C 152 -60.164 15.753 61.977 1.00 40.00 C
+ATOM 4109 C GLY C 152 -59.190 15.399 63.082 1.00 40.00 C
+ATOM 4110 O GLY C 152 -57.983 15.275 62.859 1.00 40.00 O
+ATOM 4111 N LYS C 153 -59.707 15.269 64.291 1.00 40.00 N
+ATOM 4112 CA LYS C 153 -58.886 14.832 65.399 1.00 40.00 C
+ATOM 4113 C LYS C 153 -59.606 13.624 65.934 1.00 40.00 C
+ATOM 4114 O LYS C 153 -59.112 12.932 66.823 1.00 40.00 O
+ATOM 4115 CB LYS C 153 -58.796 15.914 66.478 1.00 40.00 C
+ATOM 4116 CG LYS C 153 -58.182 17.237 66.036 1.00 40.00 C
+ATOM 4117 CD LYS C 153 -56.728 17.366 66.453 1.00 40.00 C
+ATOM 4118 CE LYS C 153 -56.571 17.714 67.929 1.00 40.00 C
+ATOM 4119 NZ LYS C 153 -56.830 19.145 68.228 1.00 40.00 N
+ATOM 4120 N GLU C 154 -60.786 13.380 65.369 1.00 40.00 N
+ATOM 4121 CA GLU C 154 -61.705 12.393 65.906 1.00 40.00 C
+ATOM 4122 C GLU C 154 -61.164 10.975 65.797 1.00 40.00 C
+ATOM 4123 O GLU C 154 -61.406 10.133 66.668 1.00 40.00 O
+ATOM 4124 CB GLU C 154 -63.064 12.504 65.208 1.00 40.00 C
+ATOM 4125 CG GLU C 154 -64.143 11.554 65.742 1.00 40.00 C
+ATOM 4126 CD GLU C 154 -64.703 11.955 67.104 1.00 40.00 C
+ATOM 4127 OE1 GLU C 154 -64.068 12.786 67.796 1.00 40.00 O
+ATOM 4128 OE2 GLU C 154 -65.787 11.438 67.479 1.00 40.00 O
+ATOM 4129 N MET C 155 -60.412 10.714 64.743 1.00 40.00 N
+ATOM 4130 CA MET C 155 -60.042 9.355 64.479 1.00 40.00 C
+ATOM 4131 C MET C 155 -58.580 9.044 64.700 1.00 40.00 C
+ATOM 4132 O MET C 155 -58.056 8.114 64.118 1.00 40.00 O
+ATOM 4133 CB MET C 155 -60.478 9.001 63.077 1.00 40.00 C
+ATOM 4134 CG MET C 155 -61.982 8.961 62.964 1.00 40.00 C
+ATOM 4135 SD MET C 155 -62.656 7.770 64.134 1.00 40.00 S
+ATOM 4136 CE MET C 155 -62.756 6.298 63.115 1.00 40.00 C
+ATOM 4137 N LEU C 156 -57.922 9.805 65.562 1.00 40.00 N
+ATOM 4138 CA LEU C 156 -56.511 9.564 65.843 1.00 40.00 C
+ATOM 4139 C LEU C 156 -56.340 8.255 66.610 1.00 40.00 C
+ATOM 4140 O LEU C 156 -57.227 7.845 67.353 1.00 40.00 O
+ATOM 4141 CB LEU C 156 -55.895 10.739 66.616 1.00 40.00 C
+ATOM 4142 CG LEU C 156 -55.910 12.149 65.997 1.00 40.00 C
+ATOM 4143 CD1 LEU C 156 -55.752 13.239 67.047 1.00 40.00 C
+ATOM 4144 CD2 LEU C 156 -54.834 12.297 64.941 1.00 40.00 C
+ATOM 4145 N MET C 157 -55.198 7.601 66.409 1.00 40.00 N
+ATOM 4146 CA MET C 157 -54.900 6.320 67.044 1.00 40.00 C
+ATOM 4147 C MET C 157 -54.801 6.505 68.544 1.00 40.00 C
+ATOM 4148 O MET C 157 -54.660 7.629 69.018 1.00 40.00 O
+ATOM 4149 CB MET C 157 -53.565 5.788 66.546 1.00 40.00 C
+ATOM 4150 CG MET C 157 -53.320 5.997 65.069 1.00 40.00 C
+ATOM 4151 SD MET C 157 -51.987 4.945 64.499 1.00 40.00 S
+ATOM 4152 CE MET C 157 -52.750 3.337 64.635 1.00 40.00 C
+ATOM 4153 N PRO C 158 -54.868 5.409 69.306 1.00 40.00 N
+ATOM 4154 CA PRO C 158 -54.652 5.558 70.744 1.00 40.00 C
+ATOM 4155 C PRO C 158 -53.182 5.838 71.088 1.00 40.00 C
+ATOM 4156 O PRO C 158 -52.315 5.674 70.244 1.00 40.00 O
+ATOM 4157 CB PRO C 158 -55.102 4.200 71.307 1.00 40.00 C
+ATOM 4158 CG PRO C 158 -55.970 3.608 70.245 1.00 40.00 C
+ATOM 4159 CD PRO C 158 -55.341 4.060 68.964 1.00 40.00 C
+ATOM 4160 N LYS C 159 -52.918 6.285 72.308 1.00 40.00 N
+ATOM 4161 CA LYS C 159 -51.555 6.442 72.779 1.00 40.00 C
+ATOM 4162 C LYS C 159 -50.982 5.090 73.147 1.00 40.00 C
+ATOM 4163 O LYS C 159 -49.818 4.811 72.866 1.00 40.00 O
+ATOM 4164 CB LYS C 159 -51.506 7.373 73.982 1.00 40.00 C
+ATOM 4165 CG LYS C 159 -51.429 8.837 73.597 1.00 40.00 C
+ATOM 4166 CD LYS C 159 -51.852 9.766 74.728 1.00 40.00 C
+ATOM 4167 CE LYS C 159 -51.754 11.215 74.241 1.00 40.00 C
+ATOM 4168 NZ LYS C 159 -52.514 12.204 75.069 1.00 40.00 N
+ATOM 4169 N ASP C 160 -51.819 4.257 73.766 1.00 40.00 N
+ATOM 4170 CA ASP C 160 -51.473 2.894 74.211 1.00 40.00 C
+ATOM 4171 C ASP C 160 -50.944 1.990 73.071 1.00 40.00 C
+ATOM 4172 O ASP C 160 -51.698 1.648 72.162 1.00 40.00 O
+ATOM 4173 CB ASP C 160 -52.722 2.267 74.871 1.00 40.00 C
+ATOM 4174 CG ASP C 160 -52.460 0.894 75.515 1.00 40.00 C
+ATOM 4175 OD1 ASP C 160 -51.365 0.303 75.334 1.00 40.00 O
+ATOM 4176 OD2 ASP C 160 -53.386 0.407 76.213 1.00 40.00 O
+ATOM 4177 N PRO C 161 -49.653 1.592 73.112 1.00 40.00 N
+ATOM 4178 CA PRO C 161 -49.205 0.704 72.057 1.00 40.00 C
+ATOM 4179 C PRO C 161 -49.447 -0.776 72.400 1.00 40.00 C
+ATOM 4180 O PRO C 161 -48.912 -1.660 71.721 1.00 40.00 O
+ATOM 4181 CB PRO C 161 -47.715 1.036 71.925 1.00 40.00 C
+ATOM 4182 CG PRO C 161 -47.333 1.664 73.215 1.00 40.00 C
+ATOM 4183 CD PRO C 161 -48.564 1.887 74.048 1.00 40.00 C
+ATOM 4184 N ASN C 162 -50.260 -1.030 73.429 1.00 40.00 N
+ATOM 4185 CA ASN C 162 -50.733 -2.377 73.756 1.00 40.00 C
+ATOM 4186 C ASN C 162 -52.243 -2.444 73.743 1.00 40.00 C
+ATOM 4187 O ASN C 162 -52.862 -3.273 74.409 1.00 40.00 O
+ATOM 4188 CB ASN C 162 -50.210 -2.811 75.119 1.00 40.00 C
+ATOM 4189 CG ASN C 162 -48.769 -3.290 75.066 1.00 40.00 C
+ATOM 4190 OD1 ASN C 162 -48.045 -3.217 76.062 1.00 40.00 O
+ATOM 4191 ND2 ASN C 162 -48.342 -3.785 73.902 1.00 40.00 N
+ATOM 4192 N ALA C 163 -52.819 -1.556 72.952 1.00 40.00 N
+ATOM 4193 CA ALA C 163 -54.251 -1.372 72.879 1.00 40.00 C
+ATOM 4194 C ALA C 163 -54.943 -2.458 72.094 1.00 40.00 C
+ATOM 4195 O ALA C 163 -54.380 -3.016 71.155 1.00 40.00 O
+ATOM 4196 CB ALA C 163 -54.554 -0.035 72.238 1.00 40.00 C
+ATOM 4197 N THR C 164 -56.178 -2.740 72.489 1.00 40.00 N
+ATOM 4198 CA THR C 164 -57.083 -3.532 71.687 1.00 40.00 C
+ATOM 4199 C THR C 164 -57.756 -2.531 70.766 1.00 40.00 C
+ATOM 4200 O THR C 164 -58.417 -1.613 71.244 1.00 40.00 O
+ATOM 4201 CB THR C 164 -58.140 -4.225 72.568 1.00 40.00 C
+ATOM 4202 OG1 THR C 164 -57.493 -4.960 73.611 1.00 40.00 O
+ATOM 4203 CG2 THR C 164 -58.985 -5.182 71.755 1.00 40.00 C
+ATOM 4204 N ILE C 165 -57.573 -2.688 69.454 1.00 40.00 N
+ATOM 4205 CA ILE C 165 -58.113 -1.721 68.494 1.00 40.00 C
+ATOM 4206 C ILE C 165 -59.139 -2.270 67.522 1.00 40.00 C
+ATOM 4207 O ILE C 165 -58.809 -2.866 66.497 1.00 40.00 O
+ATOM 4208 CB ILE C 165 -57.015 -1.050 67.687 1.00 40.00 C
+ATOM 4209 CG1 ILE C 165 -56.022 -0.417 68.641 1.00 40.00 C
+ATOM 4210 CG2 ILE C 165 -57.622 0.009 66.785 1.00 40.00 C
+ATOM 4211 CD1 ILE C 165 -54.711 -0.064 67.987 1.00 40.00 C
+ATOM 4212 N ILE C 166 -60.396 -2.011 67.833 1.00 40.00 N
+ATOM 4213 CA ILE C 166 -61.471 -2.568 67.064 1.00 40.00 C
+ATOM 4214 C ILE C 166 -61.914 -1.604 66.009 1.00 40.00 C
+ATOM 4215 O ILE C 166 -62.306 -0.474 66.299 1.00 40.00 O
+ATOM 4216 CB ILE C 166 -62.639 -2.936 67.959 1.00 40.00 C
+ATOM 4217 CG1 ILE C 166 -62.154 -3.987 68.949 1.00 40.00 C
+ATOM 4218 CG2 ILE C 166 -63.784 -3.478 67.119 1.00 40.00 C
+ATOM 4219 CD1 ILE C 166 -62.985 -4.107 70.203 1.00 40.00 C
+ATOM 4220 N MET C 167 -61.866 -2.090 64.779 1.00 40.00 N
+ATOM 4221 CA MET C 167 -62.083 -1.272 63.613 1.00 40.00 C
+ATOM 4222 C MET C 167 -63.248 -1.784 62.776 1.00 40.00 C
+ATOM 4223 O MET C 167 -63.170 -2.835 62.139 1.00 40.00 O
+ATOM 4224 CB MET C 167 -60.797 -1.248 62.809 1.00 40.00 C
+ATOM 4225 CG MET C 167 -59.596 -0.847 63.652 1.00 40.00 C
+ATOM 4226 SD MET C 167 -58.020 -1.016 62.796 1.00 40.00 S
+ATOM 4227 CE MET C 167 -57.561 -2.673 63.303 1.00 40.00 C
+ATOM 4228 N LEU C 168 -64.339 -1.034 62.795 1.00 40.00 N
+ATOM 4229 CA LEU C 168 -65.488 -1.399 62.003 1.00 40.00 C
+ATOM 4230 C LEU C 168 -65.540 -0.534 60.778 1.00 40.00 C
+ATOM 4231 O LEU C 168 -65.555 0.689 60.881 1.00 40.00 O
+ATOM 4232 CB LEU C 168 -66.775 -1.223 62.793 1.00 40.00 C
+ATOM 4233 CG LEU C 168 -66.972 -2.032 64.068 1.00 40.00 C
+ATOM 4234 CD1 LEU C 168 -66.153 -3.320 64.072 1.00 40.00 C
+ATOM 4235 CD2 LEU C 168 -66.580 -1.141 65.224 1.00 40.00 C
+ATOM 4236 N ALA C 169 -65.591 -1.174 59.617 1.00 40.00 N
+ATOM 4237 CA ALA C 169 -65.541 -0.442 58.366 1.00 40.00 C
+ATOM 4238 C ALA C 169 -66.437 -0.998 57.281 1.00 40.00 C
+ATOM 4239 O ALA C 169 -66.541 -2.203 57.107 1.00 40.00 O
+ATOM 4240 CB ALA C 169 -64.113 -0.373 57.866 1.00 40.00 C
+ATOM 4241 N THR C 170 -67.063 -0.095 56.541 1.00 40.00 N
+ATOM 4242 CA THR C 170 -67.895 -0.448 55.413 1.00 40.00 C
+ATOM 4243 C THR C 170 -67.483 0.396 54.237 1.00 40.00 C
+ATOM 4244 O THR C 170 -67.626 1.626 54.267 1.00 40.00 O
+ATOM 4245 CB THR C 170 -69.366 -0.120 55.683 1.00 40.00 C
+ATOM 4246 OG1 THR C 170 -69.468 1.213 56.211 1.00 40.00 O
+ATOM 4247 CG2 THR C 170 -69.964 -1.111 56.661 1.00 40.00 C
+ATOM 4248 N GLY C 171 -66.979 -0.258 53.197 1.00 40.00 N
+ATOM 4249 CA GLY C 171 -66.609 0.436 51.966 1.00 40.00 C
+ATOM 4250 C GLY C 171 -65.386 1.305 52.153 1.00 40.00 C
+ATOM 4251 O GLY C 171 -64.430 0.892 52.805 1.00 40.00 O
+ATOM 4252 N THR C 172 -65.429 2.517 51.601 1.00 40.00 N
+ATOM 4253 CA THR C 172 -64.300 3.440 51.682 1.00 40.00 C
+ATOM 4254 C THR C 172 -64.118 4.004 53.099 1.00 40.00 C
+ATOM 4255 O THR C 172 -63.422 5.004 53.303 1.00 40.00 O
+ATOM 4256 CB THR C 172 -64.415 4.588 50.653 1.00 40.00 C
+ATOM 4257 OG1 THR C 172 -65.483 5.468 51.027 1.00 40.00 O
+ATOM 4258 CG2 THR C 172 -64.679 4.042 49.262 1.00 40.00 C
+ATOM 4259 N GLY C 173 -64.750 3.360 54.074 1.00 40.00 N
+ATOM 4260 CA GLY C 173 -64.515 3.676 55.475 1.00 40.00 C
+ATOM 4261 C GLY C 173 -63.331 2.904 56.024 1.00 40.00 C
+ATOM 4262 O GLY C 173 -63.022 2.986 57.207 1.00 40.00 O
+ATOM 4263 N ILE C 174 -62.674 2.143 55.162 1.00 40.00 N
+ATOM 4264 CA ILE C 174 -61.505 1.385 55.556 1.00 40.00 C
+ATOM 4265 C ILE C 174 -60.304 2.302 55.531 1.00 40.00 C
+ATOM 4266 O ILE C 174 -59.328 2.074 56.239 1.00 40.00 O
+ATOM 4267 CB ILE C 174 -61.257 0.210 54.596 1.00 40.00 C
+ATOM 4268 CG1 ILE C 174 -60.001 -0.582 54.986 1.00 40.00 C
+ATOM 4269 CG2 ILE C 174 -61.100 0.717 53.173 1.00 40.00 C
+ATOM 4270 CD1 ILE C 174 -60.245 -1.716 55.956 1.00 40.00 C
+ATOM 4271 N ALA C 175 -60.396 3.346 54.715 1.00 40.00 N
+ATOM 4272 CA ALA C 175 -59.280 4.256 54.458 1.00 40.00 C
+ATOM 4273 C ALA C 175 -58.406 4.602 55.673 1.00 40.00 C
+ATOM 4274 O ALA C 175 -57.191 4.385 55.622 1.00 40.00 O
+ATOM 4275 CB ALA C 175 -59.773 5.521 53.777 1.00 40.00 C
+ATOM 4276 N PRO C 176 -59.011 5.133 56.763 1.00 40.00 N
+ATOM 4277 CA PRO C 176 -58.199 5.459 57.921 1.00 40.00 C
+ATOM 4278 C PRO C 176 -57.533 4.226 58.483 1.00 40.00 C
+ATOM 4279 O PRO C 176 -56.384 4.291 58.885 1.00 40.00 O
+ATOM 4280 CB PRO C 176 -59.218 5.987 58.923 1.00 40.00 C
+ATOM 4281 CG PRO C 176 -60.515 5.396 58.511 1.00 40.00 C
+ATOM 4282 CD PRO C 176 -60.437 5.406 57.021 1.00 40.00 C
+ATOM 4283 N PHE C 177 -58.243 3.108 58.490 1.00 40.00 N
+ATOM 4284 CA PHE C 177 -57.706 1.897 59.057 1.00 40.00 C
+ATOM 4285 C PHE C 177 -56.567 1.324 58.259 1.00 40.00 C
+ATOM 4286 O PHE C 177 -55.684 0.688 58.818 1.00 40.00 O
+ATOM 4287 CB PHE C 177 -58.795 0.884 59.185 1.00 40.00 C
+ATOM 4288 CG PHE C 177 -59.916 1.344 60.031 1.00 40.00 C
+ATOM 4289 CD1 PHE C 177 -59.698 1.693 61.348 1.00 40.00 C
+ATOM 4290 CD2 PHE C 177 -61.191 1.431 59.515 1.00 40.00 C
+ATOM 4291 CE1 PHE C 177 -60.742 2.111 62.148 1.00 40.00 C
+ATOM 4292 CE2 PHE C 177 -62.247 1.844 60.307 1.00 40.00 C
+ATOM 4293 CZ PHE C 177 -62.021 2.183 61.630 1.00 40.00 C
+ATOM 4294 N ARG C 178 -56.583 1.540 56.953 1.00 40.00 N
+ATOM 4295 CA ARG C 178 -55.411 1.242 56.165 1.00 40.00 C
+ATOM 4296 C ARG C 178 -54.284 1.953 56.888 1.00 40.00 C
+ATOM 4297 O ARG C 178 -53.361 1.322 57.427 1.00 40.00 O
+ATOM 4298 CB ARG C 178 -55.551 1.770 54.735 1.00 40.00 C
+ATOM 4299 CG ARG C 178 -54.305 1.541 53.901 1.00 40.00 C
+ATOM 4300 CD ARG C 178 -54.555 1.687 52.415 1.00 40.00 C
+ATOM 4301 NE ARG C 178 -53.512 1.009 51.641 1.00 40.00 N
+ATOM 4302 CZ ARG C 178 -52.405 1.593 51.188 1.00 40.00 C
+ATOM 4303 NH1 ARG C 178 -52.182 2.882 51.407 1.00 40.00 N
+ATOM 4304 NH2 ARG C 178 -51.524 0.884 50.506 1.00 40.00 N
+ATOM 4305 N SER C 179 -54.424 3.278 56.938 1.00 40.00 N
+ATOM 4306 CA SER C 179 -53.438 4.187 57.510 1.00 40.00 C
+ATOM 4307 C SER C 179 -52.934 3.685 58.854 1.00 40.00 C
+ATOM 4308 O SER C 179 -51.735 3.711 59.107 1.00 40.00 O
+ATOM 4309 CB SER C 179 -54.028 5.594 57.637 1.00 40.00 C
+ATOM 4310 OG SER C 179 -53.012 6.567 57.623 1.00 40.00 O
+ATOM 4311 N PHE C 180 -53.853 3.201 59.687 1.00 40.00 N
+ATOM 4312 CA PHE C 180 -53.521 2.638 60.995 1.00 40.00 C
+ATOM 4313 C PHE C 180 -52.612 1.446 60.856 1.00 40.00 C
+ATOM 4314 O PHE C 180 -51.552 1.365 61.474 1.00 40.00 O
+ATOM 4315 CB PHE C 180 -54.778 2.146 61.700 1.00 40.00 C
+ATOM 4316 CG PHE C 180 -55.498 3.198 62.478 1.00 40.00 C
+ATOM 4317 CD1 PHE C 180 -55.465 4.527 62.086 1.00 40.00 C
+ATOM 4318 CD2 PHE C 180 -56.249 2.845 63.588 1.00 40.00 C
+ATOM 4319 CE1 PHE C 180 -56.149 5.485 62.805 1.00 40.00 C
+ATOM 4320 CE2 PHE C 180 -56.940 3.795 64.313 1.00 40.00 C
+ATOM 4321 CZ PHE C 180 -56.888 5.117 63.921 1.00 40.00 C
+ATOM 4322 N LEU C 181 -53.043 0.502 60.046 1.00 40.00 N
+ATOM 4323 CA LEU C 181 -52.366 -0.760 60.044 1.00 40.00 C
+ATOM 4324 C LEU C 181 -50.962 -0.606 59.480 1.00 40.00 C
+ATOM 4325 O LEU C 181 -49.994 -1.086 60.078 1.00 40.00 O
+ATOM 4326 CB LEU C 181 -53.210 -1.820 59.340 1.00 40.00 C
+ATOM 4327 CG LEU C 181 -54.447 -2.163 60.175 1.00 40.00 C
+ATOM 4328 CD1 LEU C 181 -55.630 -2.475 59.294 1.00 40.00 C
+ATOM 4329 CD2 LEU C 181 -54.180 -3.323 61.104 1.00 40.00 C
+ATOM 4330 N TRP C 182 -50.839 0.113 58.371 1.00 40.00 N
+ATOM 4331 CA TRP C 182 -49.532 0.324 57.789 1.00 40.00 C
+ATOM 4332 C TRP C 182 -48.517 0.699 58.823 1.00 40.00 C
+ATOM 4333 O TRP C 182 -47.458 0.093 58.897 1.00 40.00 O
+ATOM 4334 CB TRP C 182 -49.596 1.378 56.719 1.00 40.00 C
+ATOM 4335 CG TRP C 182 -49.746 0.810 55.336 1.00 40.00 C
+ATOM 4336 CD1 TRP C 182 -50.799 0.060 54.830 1.00 40.00 C
+ATOM 4337 CD2 TRP C 182 -48.816 0.956 54.218 1.00 40.00 C
+ATOM 4338 NE1 TRP C 182 -50.586 -0.258 53.513 1.00 40.00 N
+ATOM 4339 CE2 TRP C 182 -49.417 0.248 53.086 1.00 40.00 C
+ATOM 4340 CE3 TRP C 182 -47.596 1.583 54.046 1.00 40.00 C
+ATOM 4341 CZ2 TRP C 182 -48.801 0.183 51.851 1.00 40.00 C
+ATOM 4342 CZ3 TRP C 182 -46.985 1.512 52.791 1.00 40.00 C
+ATOM 4343 CH2 TRP C 182 -47.574 0.827 51.721 1.00 40.00 C
+ATOM 4344 N LYS C 183 -48.836 1.688 59.649 1.00 40.00 N
+ATOM 4345 CA LYS C 183 -47.924 2.131 60.692 1.00 40.00 C
+ATOM 4346 C LYS C 183 -47.662 0.996 61.661 1.00 40.00 C
+ATOM 4347 O LYS C 183 -46.523 0.733 62.024 1.00 40.00 O
+ATOM 4348 CB LYS C 183 -48.497 3.346 61.436 1.00 40.00 C
+ATOM 4349 CG LYS C 183 -47.454 4.318 62.006 1.00 40.00 C
+ATOM 4350 CD LYS C 183 -47.932 5.102 63.245 1.00 40.00 C
+ATOM 4351 CE LYS C 183 -46.844 6.029 63.813 1.00 40.00 C
+ATOM 4352 NZ LYS C 183 -47.163 6.581 65.163 1.00 40.00 N
+ATOM 4353 N MET C 184 -48.727 0.312 62.051 1.00 40.00 N
+ATOM 4354 CA MET C 184 -48.638 -0.717 63.067 1.00 40.00 C
+ATOM 4355 C MET C 184 -47.807 -1.900 62.646 1.00 40.00 C
+ATOM 4356 O MET C 184 -47.003 -2.410 63.423 1.00 40.00 O
+ATOM 4357 CB MET C 184 -50.016 -1.227 63.407 1.00 40.00 C
+ATOM 4358 CG MET C 184 -50.865 -0.195 64.084 1.00 40.00 C
+ATOM 4359 SD MET C 184 -52.568 -0.614 63.780 1.00 40.00 S
+ATOM 4360 CE MET C 184 -52.758 -2.005 64.901 1.00 40.00 C
+ATOM 4361 N PHE C 185 -48.009 -2.346 61.416 1.00 40.00 N
+ATOM 4362 CA PHE C 185 -47.455 -3.609 61.020 1.00 40.00 C
+ATOM 4363 C PHE C 185 -46.429 -3.531 59.916 1.00 40.00 C
+ATOM 4364 O PHE C 185 -45.461 -4.277 59.921 1.00 40.00 O
+ATOM 4365 CB PHE C 185 -48.572 -4.548 60.636 1.00 40.00 C
+ATOM 4366 CG PHE C 185 -49.431 -4.957 61.787 1.00 40.00 C
+ATOM 4367 CD1 PHE C 185 -48.937 -5.796 62.780 1.00 40.00 C
+ATOM 4368 CD2 PHE C 185 -50.741 -4.518 61.874 1.00 40.00 C
+ATOM 4369 CE1 PHE C 185 -49.740 -6.185 63.841 1.00 40.00 C
+ATOM 4370 CE2 PHE C 185 -51.548 -4.903 62.931 1.00 40.00 C
+ATOM 4371 CZ PHE C 185 -51.050 -5.738 63.915 1.00 40.00 C
+ATOM 4372 N PHE C 186 -46.620 -2.641 58.962 1.00 40.00 N
+ATOM 4373 CA PHE C 186 -45.622 -2.531 57.911 1.00 40.00 C
+ATOM 4374 C PHE C 186 -44.371 -1.774 58.349 1.00 40.00 C
+ATOM 4375 O PHE C 186 -43.282 -2.055 57.862 1.00 40.00 O
+ATOM 4376 CB PHE C 186 -46.216 -1.923 56.633 1.00 40.00 C
+ATOM 4377 CG PHE C 186 -47.055 -2.890 55.818 1.00 40.00 C
+ATOM 4378 CD1 PHE C 186 -47.053 -4.260 56.109 1.00 40.00 C
+ATOM 4379 CD2 PHE C 186 -47.825 -2.431 54.737 1.00 40.00 C
+ATOM 4380 CE1 PHE C 186 -47.816 -5.143 55.363 1.00 40.00 C
+ATOM 4381 CE2 PHE C 186 -48.583 -3.314 53.990 1.00 40.00 C
+ATOM 4382 CZ PHE C 186 -48.577 -4.670 54.302 1.00 40.00 C
+ATOM 4383 N GLU C 187 -44.525 -0.847 59.295 1.00 40.00 N
+ATOM 4384 CA GLU C 187 -43.475 0.135 59.625 1.00 40.00 C
+ATOM 4385 C GLU C 187 -42.762 -0.051 60.983 1.00 40.00 C
+ATOM 4386 O GLU C 187 -43.348 -0.539 61.963 1.00 40.00 O
+ATOM 4387 CB GLU C 187 -44.027 1.563 59.470 1.00 40.00 C
+ATOM 4388 CG GLU C 187 -44.621 1.816 58.089 1.00 40.00 C
+ATOM 4389 CD GLU C 187 -45.361 3.129 57.965 1.00 40.00 C
+ATOM 4390 OE1 GLU C 187 -45.828 3.687 58.975 1.00 40.00 O
+ATOM 4391 OE2 GLU C 187 -45.487 3.605 56.829 1.00 40.00 O
+ATOM 4392 N LYS C 188 -41.480 0.328 61.002 1.00 40.00 N
+ATOM 4393 CA LYS C 188 -40.634 0.277 62.202 1.00 40.00 C
+ATOM 4394 C LYS C 188 -40.372 1.675 62.713 1.00 40.00 C
+ATOM 4395 O LYS C 188 -39.677 2.468 62.080 1.00 40.00 O
+ATOM 4396 CB LYS C 188 -39.287 -0.423 61.943 1.00 40.00 C
+ATOM 4397 CG LYS C 188 -39.384 -1.907 61.604 1.00 40.00 C
+ATOM 4398 CD LYS C 188 -39.918 -2.763 62.755 1.00 40.00 C
+ATOM 4399 CE LYS C 188 -40.284 -4.179 62.305 1.00 40.00 C
+ATOM 4400 NZ LYS C 188 -39.143 -4.922 61.687 1.00 40.00 N
+ATOM 4401 N HIS C 189 -40.941 1.965 63.870 1.00 40.00 N
+ATOM 4402 CA HIS C 189 -40.704 3.228 64.521 1.00 40.00 C
+ATOM 4403 C HIS C 189 -40.034 2.983 65.820 1.00 40.00 C
+ATOM 4404 O HIS C 189 -40.355 2.010 66.518 1.00 40.00 O
+ATOM 4405 CB HIS C 189 -42.012 3.953 64.726 1.00 40.00 C
+ATOM 4406 CG HIS C 189 -42.684 4.312 63.446 1.00 40.00 C
+ATOM 4407 ND1 HIS C 189 -42.669 5.560 62.949 1.00 40.00 N
+ATOM 4408 CD2 HIS C 189 -43.367 3.526 62.530 1.00 40.00 C
+ATOM 4409 CE1 HIS C 189 -43.331 5.581 61.784 1.00 40.00 C
+ATOM 4410 NE2 HIS C 189 -43.754 4.332 61.525 1.00 40.00 N
+ATOM 4411 N ASP C 190 -39.086 3.856 66.148 1.00 40.00 N
+ATOM 4412 CA ASP C 190 -38.360 3.770 67.404 1.00 40.00 C
+ATOM 4413 C ASP C 190 -39.260 4.189 68.550 1.00 40.00 C
+ATOM 4414 O ASP C 190 -39.270 3.551 69.592 1.00 40.00 O
+ATOM 4415 CB ASP C 190 -37.103 4.624 67.332 1.00 40.00 C
+ATOM 4416 CG ASP C 190 -36.256 4.279 66.128 1.00 40.00 C
+ATOM 4417 OD1 ASP C 190 -35.773 3.127 66.055 1.00 40.00 O
+ATOM 4418 OD2 ASP C 190 -36.097 5.148 65.247 1.00 40.00 O
+ATOM 4419 N ASP C 191 -40.044 5.240 68.328 1.00 40.00 N
+ATOM 4420 CA ASP C 191 -41.009 5.723 69.317 1.00 40.00 C
+ATOM 4421 C ASP C 191 -42.292 4.905 69.364 1.00 40.00 C
+ATOM 4422 O ASP C 191 -43.088 5.023 70.286 1.00 40.00 O
+ATOM 4423 CB ASP C 191 -41.349 7.201 69.069 1.00 40.00 C
+ATOM 4424 CG ASP C 191 -41.728 7.487 67.634 1.00 40.00 C
+ATOM 4425 OD1 ASP C 191 -40.908 7.202 66.736 1.00 40.00 O
+ATOM 4426 OD2 ASP C 191 -42.834 8.019 67.410 1.00 40.00 O
+ATOM 4427 N TYR C 192 -42.495 4.071 68.363 1.00 40.00 N
+ATOM 4428 CA TYR C 192 -43.752 3.370 68.254 1.00 40.00 C
+ATOM 4429 C TYR C 192 -43.630 1.923 67.750 1.00 40.00 C
+ATOM 4430 O TYR C 192 -43.355 1.657 66.571 1.00 40.00 O
+ATOM 4431 CB TYR C 192 -44.743 4.185 67.408 1.00 40.00 C
+ATOM 4432 CG TYR C 192 -46.143 3.679 67.564 1.00 40.00 C
+ATOM 4433 CD1 TYR C 192 -46.815 3.823 68.770 1.00 40.00 C
+ATOM 4434 CD2 TYR C 192 -46.783 3.011 66.527 1.00 40.00 C
+ATOM 4435 CE1 TYR C 192 -48.097 3.331 68.935 1.00 40.00 C
+ATOM 4436 CE2 TYR C 192 -48.066 2.519 66.681 1.00 40.00 C
+ATOM 4437 CZ TYR C 192 -48.714 2.684 67.886 1.00 40.00 C
+ATOM 4438 OH TYR C 192 -49.979 2.196 68.060 1.00 40.00 O
+ATOM 4439 N LYS C 193 -43.821 0.989 68.670 1.00 40.00 N
+ATOM 4440 CA LYS C 193 -43.969 -0.402 68.306 1.00 40.00 C
+ATOM 4441 C LYS C 193 -45.244 -0.899 68.964 1.00 40.00 C
+ATOM 4442 O LYS C 193 -45.420 -0.786 70.181 1.00 40.00 O
+ATOM 4443 CB LYS C 193 -42.761 -1.223 68.750 1.00 40.00 C
+ATOM 4444 CG LYS C 193 -41.426 -0.735 68.204 1.00 40.00 C
+ATOM 4445 CD LYS C 193 -40.254 -1.252 69.035 1.00 40.00 C
+ATOM 4446 CE LYS C 193 -40.320 -0.835 70.507 1.00 40.00 C
+ATOM 4447 NZ LYS C 193 -40.254 0.640 70.725 1.00 40.00 N
+ATOM 4448 N PHE C 194 -46.147 -1.413 68.138 1.00 40.00 N
+ATOM 4449 CA PHE C 194 -47.423 -1.924 68.600 1.00 40.00 C
+ATOM 4450 C PHE C 194 -47.244 -3.324 69.159 1.00 40.00 C
+ATOM 4451 O PHE C 194 -46.361 -4.058 68.731 1.00 40.00 O
+ATOM 4452 CB PHE C 194 -48.425 -1.921 67.445 1.00 40.00 C
+ATOM 4453 CG PHE C 194 -49.781 -2.420 67.822 1.00 40.00 C
+ATOM 4454 CD1 PHE C 194 -50.628 -1.651 68.593 1.00 40.00 C
+ATOM 4455 CD2 PHE C 194 -50.210 -3.667 67.412 1.00 40.00 C
+ATOM 4456 CE1 PHE C 194 -51.880 -2.121 68.954 1.00 40.00 C
+ATOM 4457 CE2 PHE C 194 -51.467 -4.143 67.762 1.00 40.00 C
+ATOM 4458 CZ PHE C 194 -52.306 -3.365 68.534 1.00 40.00 C
+ATOM 4459 N ASN C 195 -48.072 -3.682 70.131 1.00 40.00 N
+ATOM 4460 CA ASN C 195 -48.074 -5.034 70.676 1.00 40.00 C
+ATOM 4461 C ASN C 195 -49.366 -5.358 71.447 1.00 40.00 C
+ATOM 4462 O ASN C 195 -49.339 -5.976 72.515 1.00 40.00 O
+ATOM 4463 CB ASN C 195 -46.815 -5.280 71.528 1.00 40.00 C
+ATOM 4464 CG ASN C 195 -46.470 -6.763 71.670 1.00 40.00 C
+ATOM 4465 OD1 ASN C 195 -45.833 -7.164 72.651 1.00 40.00 O
+ATOM 4466 ND2 ASN C 195 -46.883 -7.585 70.692 1.00 40.00 N
+ATOM 4467 N GLY C 196 -50.496 -4.925 70.895 1.00 40.00 N
+ATOM 4468 CA GLY C 196 -51.811 -5.301 71.416 1.00 40.00 C
+ATOM 4469 C GLY C 196 -52.510 -6.241 70.440 1.00 40.00 C
+ATOM 4470 O GLY C 196 -51.905 -7.213 69.952 1.00 40.00 O
+ATOM 4471 N LEU C 197 -53.777 -5.945 70.148 1.00 40.00 N
+ATOM 4472 CA LEU C 197 -54.571 -6.751 69.229 1.00 40.00 C
+ATOM 4473 C LEU C 197 -55.365 -5.882 68.280 1.00 40.00 C
+ATOM 4474 O LEU C 197 -56.271 -5.170 68.698 1.00 40.00 O
+ATOM 4475 CB LEU C 197 -55.527 -7.657 69.999 1.00 40.00 C
+ATOM 4476 CG LEU C 197 -56.495 -8.415 69.099 1.00 40.00 C
+ATOM 4477 CD1 LEU C 197 -55.826 -9.634 68.460 1.00 40.00 C
+ATOM 4478 CD2 LEU C 197 -57.733 -8.796 69.899 1.00 40.00 C
+ATOM 4479 N GLY C 198 -55.027 -5.954 67.000 1.00 40.00 N
+ATOM 4480 CA GLY C 198 -55.754 -5.215 65.977 1.00 40.00 C
+ATOM 4481 C GLY C 198 -56.840 -6.053 65.329 1.00 40.00 C
+ATOM 4482 O GLY C 198 -56.545 -6.917 64.508 1.00 40.00 O
+ATOM 4483 N TRP C 199 -58.097 -5.804 65.695 1.00 40.00 N
+ATOM 4484 CA TRP C 199 -59.223 -6.533 65.113 1.00 40.00 C
+ATOM 4485 C TRP C 199 -59.964 -5.665 64.162 1.00 40.00 C
+ATOM 4486 O TRP C 199 -60.401 -4.573 64.527 1.00 40.00 O
+ATOM 4487 CB TRP C 199 -60.186 -7.035 66.182 1.00 40.00 C
+ATOM 4488 CG TRP C 199 -60.897 -8.337 65.837 1.00 40.00 C
+ATOM 4489 CD1 TRP C 199 -61.046 -8.919 64.582 1.00 40.00 C
+ATOM 4490 CD2 TRP C 199 -61.603 -9.256 66.761 1.00 40.00 C
+ATOM 4491 NE1 TRP C 199 -61.753 -10.092 64.662 1.00 40.00 N
+ATOM 4492 CE2 TRP C 199 -62.120 -10.351 65.934 1.00 40.00 C
+ATOM 4493 CE3 TRP C 199 -61.844 -9.279 68.138 1.00 40.00 C
+ATOM 4494 CZ2 TRP C 199 -62.847 -11.405 66.479 1.00 40.00 C
+ATOM 4495 CZ3 TRP C 199 -62.571 -10.353 68.678 1.00 40.00 C
+ATOM 4496 CH2 TRP C 199 -63.060 -11.389 67.867 1.00 40.00 C
+ATOM 4497 N LEU C 200 -60.122 -6.165 62.936 1.00 40.00 N
+ATOM 4498 CA LEU C 200 -60.765 -5.430 61.846 1.00 40.00 C
+ATOM 4499 C LEU C 200 -61.991 -6.107 61.241 1.00 40.00 C
+ATOM 4500 O LEU C 200 -61.940 -7.261 60.787 1.00 40.00 O
+ATOM 4501 CB LEU C 200 -59.769 -5.151 60.731 1.00 40.00 C
+ATOM 4502 CG LEU C 200 -60.379 -4.613 59.440 1.00 40.00 C
+ATOM 4503 CD1 LEU C 200 -61.115 -3.295 59.646 1.00 40.00 C
+ATOM 4504 CD2 LEU C 200 -59.280 -4.468 58.408 1.00 40.00 C
+ATOM 4505 N PHE C 201 -63.078 -5.346 61.207 1.00 40.00 N
+ATOM 4506 CA PHE C 201 -64.310 -5.777 60.591 1.00 40.00 C
+ATOM 4507 C PHE C 201 -64.603 -4.868 59.399 1.00 40.00 C
+ATOM 4508 O PHE C 201 -64.741 -3.652 59.554 1.00 40.00 O
+ATOM 4509 CB PHE C 201 -65.450 -5.734 61.616 1.00 40.00 C
+ATOM 4510 CG PHE C 201 -65.383 -6.827 62.665 1.00 40.00 C
+ATOM 4511 CD1 PHE C 201 -64.445 -6.783 63.693 1.00 40.00 C
+ATOM 4512 CD2 PHE C 201 -66.279 -7.898 62.638 1.00 40.00 C
+ATOM 4513 CE1 PHE C 201 -64.395 -7.790 64.656 1.00 40.00 C
+ATOM 4514 CE2 PHE C 201 -66.237 -8.905 63.604 1.00 40.00 C
+ATOM 4515 CZ PHE C 201 -65.294 -8.852 64.613 1.00 40.00 C
+ATOM 4516 N LEU C 202 -64.667 -5.471 58.210 1.00 40.00 N
+ATOM 4517 CA LEU C 202 -64.990 -4.753 56.978 1.00 40.00 C
+ATOM 4518 C LEU C 202 -66.097 -5.377 56.150 1.00 40.00 C
+ATOM 4519 O LEU C 202 -65.958 -6.489 55.628 1.00 40.00 O
+ATOM 4520 CB LEU C 202 -63.774 -4.604 56.087 1.00 40.00 C
+ATOM 4521 CG LEU C 202 -64.180 -4.177 54.673 1.00 40.00 C
+ATOM 4522 CD1 LEU C 202 -64.604 -2.702 54.588 1.00 40.00 C
+ATOM 4523 CD2 LEU C 202 -63.042 -4.509 53.724 1.00 40.00 C
+ATOM 4524 N GLY C 203 -67.170 -4.613 55.988 1.00 40.00 N
+ATOM 4525 CA GLY C 203 -68.365 -5.072 55.299 1.00 40.00 C
+ATOM 4526 C GLY C 203 -68.535 -4.415 53.949 1.00 40.00 C
+ATOM 4527 O GLY C 203 -68.418 -3.194 53.817 1.00 40.00 O
+ATOM 4528 N VAL C 204 -68.815 -5.243 52.947 1.00 40.00 N
+ATOM 4529 CA VAL C 204 -68.987 -4.796 51.564 1.00 40.00 C
+ATOM 4530 C VAL C 204 -70.073 -5.591 50.847 1.00 40.00 C
+ATOM 4531 O VAL C 204 -70.547 -6.610 51.364 1.00 40.00 O
+ATOM 4532 CB VAL C 204 -67.695 -4.947 50.719 1.00 40.00 C
+ATOM 4533 CG1 VAL C 204 -66.785 -3.744 50.890 1.00 40.00 C
+ATOM 4534 CG2 VAL C 204 -66.980 -6.266 51.010 1.00 40.00 C
+ATOM 4535 N PRO C 205 -70.467 -5.126 49.645 1.00 40.00 N
+ATOM 4536 CA PRO C 205 -71.365 -5.875 48.748 1.00 40.00 C
+ATOM 4537 C PRO C 205 -70.840 -7.231 48.188 1.00 40.00 C
+ATOM 4538 O PRO C 205 -71.480 -8.271 48.365 1.00 40.00 O
+ATOM 4539 CB PRO C 205 -71.610 -4.877 47.598 1.00 40.00 C
+ATOM 4540 CG PRO C 205 -70.552 -3.821 47.725 1.00 40.00 C
+ATOM 4541 CD PRO C 205 -70.286 -3.728 49.194 1.00 40.00 C
+ATOM 4542 N THR C 206 -69.696 -7.201 47.513 1.00 40.00 N
+ATOM 4543 CA THR C 206 -69.220 -8.336 46.735 1.00 40.00 C
+ATOM 4544 C THR C 206 -67.819 -8.752 47.137 1.00 40.00 C
+ATOM 4545 O THR C 206 -67.154 -8.047 47.879 1.00 40.00 O
+ATOM 4546 CB THR C 206 -69.162 -7.971 45.249 1.00 40.00 C
+ATOM 4547 OG1 THR C 206 -68.452 -6.733 45.087 1.00 40.00 O
+ATOM 4548 CG2 THR C 206 -70.554 -7.832 44.690 1.00 40.00 C
+ATOM 4549 N SER C 207 -67.373 -9.902 46.644 1.00 40.00 N
+ATOM 4550 CA SER C 207 -65.972 -10.295 46.763 1.00 40.00 C
+ATOM 4551 C SER C 207 -65.131 -9.472 45.809 1.00 40.00 C
+ATOM 4552 O SER C 207 -63.908 -9.533 45.842 1.00 40.00 O
+ATOM 4553 CB SER C 207 -65.786 -11.782 46.463 1.00 40.00 C
+ATOM 4554 OG SER C 207 -66.038 -12.575 47.610 1.00 40.00 O
+ATOM 4555 N SER C 208 -65.810 -8.710 44.957 1.00 40.00 N
+ATOM 4556 CA SER C 208 -65.165 -7.803 44.014 1.00 40.00 C
+ATOM 4557 C SER C 208 -65.034 -6.405 44.594 1.00 40.00 C
+ATOM 4558 O SER C 208 -64.231 -5.613 44.107 1.00 40.00 O
+ATOM 4559 CB SER C 208 -65.924 -7.741 42.679 1.00 40.00 C
+ATOM 4560 OG SER C 208 -67.178 -7.087 42.817 1.00 40.00 O
+ATOM 4561 N SER C 209 -65.828 -6.104 45.620 1.00 40.00 N
+ATOM 4562 CA SER C 209 -65.718 -4.826 46.333 1.00 40.00 C
+ATOM 4563 C SER C 209 -64.754 -4.892 47.547 1.00 40.00 C
+ATOM 4564 O SER C 209 -64.613 -3.928 48.305 1.00 40.00 O
+ATOM 4565 CB SER C 209 -67.105 -4.326 46.761 1.00 40.00 C
+ATOM 4566 OG SER C 209 -67.974 -4.181 45.653 1.00 40.00 O
+ATOM 4567 N LEU C 210 -64.074 -6.024 47.702 1.00 40.00 N
+ATOM 4568 CA LEU C 210 -63.244 -6.305 48.877 1.00 40.00 C
+ATOM 4569 C LEU C 210 -61.841 -5.649 48.800 1.00 40.00 C
+ATOM 4570 O LEU C 210 -60.876 -6.252 48.316 1.00 40.00 O
+ATOM 4571 CB LEU C 210 -63.147 -7.830 49.052 1.00 40.00 C
+ATOM 4572 CG LEU C 210 -63.103 -8.506 50.424 1.00 40.00 C
+ATOM 4573 CD1 LEU C 210 -64.430 -8.400 51.156 1.00 40.00 C
+ATOM 4574 CD2 LEU C 210 -62.713 -9.963 50.255 1.00 40.00 C
+ATOM 4575 N LEU C 211 -61.736 -4.422 49.306 1.00 40.00 N
+ATOM 4576 CA LEU C 211 -60.522 -3.603 49.166 1.00 40.00 C
+ATOM 4577 C LEU C 211 -59.254 -4.123 49.895 1.00 40.00 C
+ATOM 4578 O LEU C 211 -59.331 -4.705 50.969 1.00 40.00 O
+ATOM 4579 CB LEU C 211 -60.833 -2.146 49.564 1.00 40.00 C
+ATOM 4580 CG LEU C 211 -62.145 -1.471 49.125 1.00 40.00 C
+ATOM 4581 CD1 LEU C 211 -62.313 -0.115 49.786 1.00 40.00 C
+ATOM 4582 CD2 LEU C 211 -62.231 -1.312 47.621 1.00 40.00 C
+ATOM 4583 N TYR C 212 -58.097 -3.928 49.267 1.00 40.00 N
+ATOM 4584 CA TYR C 212 -56.783 -4.133 49.887 1.00 40.00 C
+ATOM 4585 C TYR C 212 -56.508 -5.496 50.536 1.00 40.00 C
+ATOM 4586 O TYR C 212 -55.508 -5.646 51.236 1.00 40.00 O
+ATOM 4587 CB TYR C 212 -56.511 -3.036 50.920 1.00 40.00 C
+ATOM 4588 CG TYR C 212 -56.798 -1.621 50.472 1.00 40.00 C
+ATOM 4589 CD1 TYR C 212 -55.823 -0.856 49.840 1.00 40.00 C
+ATOM 4590 CD2 TYR C 212 -58.026 -1.036 50.719 1.00 40.00 C
+ATOM 4591 CE1 TYR C 212 -56.077 0.441 49.441 1.00 40.00 C
+ATOM 4592 CE2 TYR C 212 -58.293 0.256 50.321 1.00 40.00 C
+ATOM 4593 CZ TYR C 212 -57.315 0.990 49.686 1.00 40.00 C
+ATOM 4594 OH TYR C 212 -57.583 2.281 49.295 1.00 40.00 O
+ATOM 4595 N LYS C 213 -57.371 -6.481 50.289 1.00 40.00 N
+ATOM 4596 CA LYS C 213 -57.327 -7.806 50.959 1.00 40.00 C
+ATOM 4597 C LYS C 213 -55.953 -8.504 51.050 1.00 40.00 C
+ATOM 4598 O LYS C 213 -55.599 -9.012 52.117 1.00 40.00 O
+ATOM 4599 CB LYS C 213 -58.376 -8.747 50.343 1.00 40.00 C
+ATOM 4600 CG LYS C 213 -58.310 -10.212 50.773 1.00 40.00 C
+ATOM 4601 CD LYS C 213 -59.049 -11.103 49.775 1.00 40.00 C
+ATOM 4602 CE LYS C 213 -58.738 -12.585 49.945 1.00 40.00 C
+ATOM 4603 NZ LYS C 213 -59.547 -13.251 51.004 1.00 40.00 N
+ATOM 4604 N GLU C 214 -55.203 -8.533 49.942 1.00 40.00 N
+ATOM 4605 CA GLU C 214 -53.857 -9.168 49.882 1.00 40.00 C
+ATOM 4606 C GLU C 214 -52.842 -8.451 50.784 1.00 40.00 C
+ATOM 4607 O GLU C 214 -51.827 -9.034 51.176 1.00 40.00 O
+ATOM 4608 CB GLU C 214 -53.275 -9.237 48.446 1.00 40.00 C
+ATOM 4609 CG GLU C 214 -54.242 -8.988 47.297 1.00 40.00 C
+ATOM 4610 CD GLU C 214 -54.952 -7.636 47.401 1.00 40.00 C
+ATOM 4611 OE1 GLU C 214 -54.374 -6.660 47.959 1.00 40.00 O
+ATOM 4612 OE2 GLU C 214 -56.113 -7.556 46.938 1.00 40.00 O
+ATOM 4613 N GLU C 215 -53.107 -7.185 51.091 1.00 40.00 N
+ATOM 4614 CA GLU C 215 -52.263 -6.443 51.995 1.00 40.00 C
+ATOM 4615 C GLU C 215 -52.486 -6.969 53.390 1.00 40.00 C
+ATOM 4616 O GLU C 215 -51.577 -7.487 54.013 1.00 40.00 O
+ATOM 4617 CB GLU C 215 -52.587 -4.959 51.921 1.00 40.00 C
+ATOM 4618 CG GLU C 215 -52.154 -4.306 50.619 1.00 40.00 C
+ATOM 4619 CD GLU C 215 -52.280 -2.791 50.646 1.00 40.00 C
+ATOM 4620 OE1 GLU C 215 -52.327 -2.185 51.739 1.00 40.00 O
+ATOM 4621 OE2 GLU C 215 -52.331 -2.194 49.556 1.00 40.00 O
+ATOM 4622 N PHE C 216 -53.718 -6.857 53.862 1.00 40.00 N
+ATOM 4623 CA PHE C 216 -54.071 -7.365 55.173 1.00 40.00 C
+ATOM 4624 C PHE C 216 -53.679 -8.823 55.299 1.00 40.00 C
+ATOM 4625 O PHE C 216 -53.290 -9.276 56.372 1.00 40.00 O
+ATOM 4626 CB PHE C 216 -55.568 -7.237 55.405 1.00 40.00 C
+ATOM 4627 CG PHE C 216 -56.116 -5.880 55.091 1.00 40.00 C
+ATOM 4628 CD1 PHE C 216 -55.735 -4.778 55.837 1.00 40.00 C
+ATOM 4629 CD2 PHE C 216 -57.029 -5.705 54.056 1.00 40.00 C
+ATOM 4630 CE1 PHE C 216 -56.243 -3.519 55.553 1.00 40.00 C
+ATOM 4631 CE2 PHE C 216 -57.543 -4.449 53.771 1.00 40.00 C
+ATOM 4632 CZ PHE C 216 -57.147 -3.352 54.521 1.00 40.00 C
+ATOM 4633 N GLY C 217 -53.814 -9.558 54.198 1.00 40.00 N
+ATOM 4634 CA GLY C 217 -53.293 -10.912 54.114 1.00 40.00 C
+ATOM 4635 C GLY C 217 -51.851 -10.910 54.586 1.00 40.00 C
+ATOM 4636 O GLY C 217 -51.530 -11.515 55.616 1.00 40.00 O
+ATOM 4637 N LYS C 218 -50.996 -10.185 53.858 1.00 40.00 N
+ATOM 4638 CA LYS C 218 -49.560 -10.100 54.169 1.00 40.00 C
+ATOM 4639 C LYS C 218 -49.304 -9.705 55.630 1.00 40.00 C
+ATOM 4640 O LYS C 218 -48.277 -10.071 56.218 1.00 40.00 O
+ATOM 4641 CB LYS C 218 -48.847 -9.133 53.210 1.00 40.00 C
+ATOM 4642 CG LYS C 218 -48.689 -9.661 51.785 1.00 40.00 C
+ATOM 4643 CD LYS C 218 -47.932 -8.694 50.872 1.00 40.00 C
+ATOM 4644 CE LYS C 218 -48.839 -7.669 50.191 1.00 40.00 C
+ATOM 4645 NZ LYS C 218 -48.065 -6.833 49.228 1.00 40.00 N
+ATOM 4646 N MET C 219 -50.257 -8.972 56.202 1.00 40.00 N
+ATOM 4647 CA MET C 219 -50.195 -8.552 57.590 1.00 40.00 C
+ATOM 4648 C MET C 219 -50.487 -9.728 58.501 1.00 40.00 C
+ATOM 4649 O MET C 219 -49.641 -10.120 59.305 1.00 40.00 O
+ATOM 4650 CB MET C 219 -51.199 -7.434 57.841 1.00 40.00 C
+ATOM 4651 CG MET C 219 -51.043 -6.257 56.896 1.00 40.00 C
+ATOM 4652 SD MET C 219 -51.644 -4.733 57.631 1.00 40.00 S
+ATOM 4653 CE MET C 219 -51.254 -3.579 56.313 1.00 40.00 C
+ATOM 4654 N LYS C 220 -51.685 -10.290 58.356 1.00 40.00 N
+ATOM 4655 CA LYS C 220 -52.101 -11.473 59.101 1.00 40.00 C
+ATOM 4656 C LYS C 220 -51.044 -12.559 59.011 1.00 40.00 C
+ATOM 4657 O LYS C 220 -50.943 -13.419 59.886 1.00 40.00 O
+ATOM 4658 CB LYS C 220 -53.432 -11.990 58.552 1.00 40.00 C
+ATOM 4659 CG LYS C 220 -53.931 -13.274 59.194 1.00 40.00 C
+ATOM 4660 CD LYS C 220 -54.262 -13.065 60.658 1.00 40.00 C
+ATOM 4661 CE LYS C 220 -54.685 -14.368 61.303 1.00 40.00 C
+ATOM 4662 NZ LYS C 220 -54.931 -14.153 62.749 1.00 40.00 N
+ATOM 4663 N GLU C 221 -50.254 -12.498 57.944 1.00 40.00 N
+ATOM 4664 CA GLU C 221 -49.194 -13.465 57.715 1.00 40.00 C
+ATOM 4665 C GLU C 221 -47.900 -13.138 58.483 1.00 40.00 C
+ATOM 4666 O GLU C 221 -47.156 -14.053 58.859 1.00 40.00 O
+ATOM 4667 CB GLU C 221 -48.917 -13.626 56.220 1.00 40.00 C
+ATOM 4668 CG GLU C 221 -48.288 -14.962 55.855 1.00 40.00 C
+ATOM 4669 CD GLU C 221 -47.477 -14.880 54.589 1.00 40.00 C
+ATOM 4670 OE1 GLU C 221 -47.949 -14.239 53.626 1.00 40.00 O
+ATOM 4671 OE2 GLU C 221 -46.368 -15.450 54.565 1.00 40.00 O
+ATOM 4672 N ARG C 222 -47.617 -11.860 58.722 1.00 40.00 N
+ATOM 4673 CA ARG C 222 -46.439 -11.528 59.519 1.00 40.00 C
+ATOM 4674 C ARG C 222 -46.753 -11.171 60.969 1.00 40.00 C
+ATOM 4675 O ARG C 222 -45.840 -10.987 61.756 1.00 40.00 O
+ATOM 4676 CB ARG C 222 -45.563 -10.473 58.841 1.00 40.00 C
+ATOM 4677 CG ARG C 222 -46.318 -9.305 58.244 1.00 40.00 C
+ATOM 4678 CD ARG C 222 -45.437 -8.605 57.233 1.00 40.00 C
+ATOM 4679 NE ARG C 222 -44.316 -7.933 57.887 1.00 40.00 N
+ATOM 4680 CZ ARG C 222 -43.426 -7.158 57.268 1.00 40.00 C
+ATOM 4681 NH1 ARG C 222 -43.499 -6.939 55.958 1.00 40.00 N
+ATOM 4682 NH2 ARG C 222 -42.451 -6.592 57.963 1.00 40.00 N
+ATOM 4683 N ALA C 223 -48.033 -11.101 61.325 1.00 40.00 N
+ATOM 4684 CA ALA C 223 -48.428 -10.907 62.725 1.00 40.00 C
+ATOM 4685 C ALA C 223 -49.727 -11.634 63.084 1.00 40.00 C
+ATOM 4686 O ALA C 223 -50.747 -11.005 63.361 1.00 40.00 O
+ATOM 4687 CB ALA C 223 -48.525 -9.429 63.056 1.00 40.00 C
+ATOM 4688 N PRO C 224 -49.683 -12.972 63.103 1.00 40.00 N
+ATOM 4689 CA PRO C 224 -50.866 -13.826 63.235 1.00 40.00 C
+ATOM 4690 C PRO C 224 -51.702 -13.582 64.485 1.00 40.00 C
+ATOM 4691 O PRO C 224 -52.929 -13.594 64.401 1.00 40.00 O
+ATOM 4692 CB PRO C 224 -50.282 -15.241 63.270 1.00 40.00 C
+ATOM 4693 CG PRO C 224 -48.845 -15.070 63.626 1.00 40.00 C
+ATOM 4694 CD PRO C 224 -48.441 -13.759 63.037 1.00 40.00 C
+ATOM 4695 N GLU C 225 -51.047 -13.372 65.627 1.00 40.00 N
+ATOM 4696 CA GLU C 225 -51.765 -13.157 66.898 1.00 40.00 C
+ATOM 4697 C GLU C 225 -52.083 -11.685 67.181 1.00 40.00 C
+ATOM 4698 O GLU C 225 -53.025 -11.382 67.928 1.00 40.00 O
+ATOM 4699 CB GLU C 225 -51.025 -13.776 68.096 1.00 40.00 C
+ATOM 4700 CG GLU C 225 -49.642 -13.211 68.345 1.00 40.00 C
+ATOM 4701 CD GLU C 225 -48.554 -14.141 67.861 1.00 40.00 C
+ATOM 4702 OE1 GLU C 225 -48.673 -14.689 66.746 1.00 40.00 O
+ATOM 4703 OE2 GLU C 225 -47.577 -14.328 68.610 1.00 40.00 O
+ATOM 4704 N ASN C 226 -51.297 -10.788 66.583 1.00 40.00 N
+ATOM 4705 CA ASN C 226 -51.452 -9.341 66.775 1.00 40.00 C
+ATOM 4706 C ASN C 226 -52.446 -8.710 65.798 1.00 40.00 C
+ATOM 4707 O ASN C 226 -52.762 -7.512 65.894 1.00 40.00 O
+ATOM 4708 CB ASN C 226 -50.095 -8.646 66.674 1.00 40.00 C
+ATOM 4709 CG ASN C 226 -49.067 -9.252 67.604 1.00 40.00 C
+ATOM 4710 OD1 ASN C 226 -49.105 -9.044 68.820 1.00 40.00 O
+ATOM 4711 ND2 ASN C 226 -48.145 -10.018 67.035 1.00 40.00 N
+ATOM 4712 N PHE C 227 -52.934 -9.532 64.870 1.00 40.00 N
+ATOM 4713 CA PHE C 227 -53.906 -9.115 63.869 1.00 40.00 C
+ATOM 4714 C PHE C 227 -54.972 -10.183 63.683 1.00 40.00 C
+ATOM 4715 O PHE C 227 -54.682 -11.378 63.644 1.00 40.00 O
+ATOM 4716 CB PHE C 227 -53.201 -8.822 62.542 1.00 40.00 C
+ATOM 4717 CG PHE C 227 -54.075 -8.163 61.500 1.00 40.00 C
+ATOM 4718 CD1 PHE C 227 -55.058 -7.238 61.852 1.00 40.00 C
+ATOM 4719 CD2 PHE C 227 -53.872 -8.433 60.147 1.00 40.00 C
+ATOM 4720 CE1 PHE C 227 -55.841 -6.631 60.880 1.00 40.00 C
+ATOM 4721 CE2 PHE C 227 -54.643 -7.816 59.169 1.00 40.00 C
+ATOM 4722 CZ PHE C 227 -55.631 -6.916 59.537 1.00 40.00 C
+ATOM 4723 N ARG C 228 -56.211 -9.728 63.589 1.00 40.00 N
+ATOM 4724 CA ARG C 228 -57.340 -10.587 63.332 1.00 40.00 C
+ATOM 4725 C ARG C 228 -58.215 -9.853 62.328 1.00 40.00 C
+ATOM 4726 O ARG C 228 -58.568 -8.698 62.552 1.00 40.00 O
+ATOM 4727 CB ARG C 228 -58.094 -10.864 64.636 1.00 40.00 C
+ATOM 4728 CG ARG C 228 -57.324 -11.720 65.638 1.00 40.00 C
+ATOM 4729 CD ARG C 228 -58.196 -12.158 66.810 1.00 40.00 C
+ATOM 4730 NE ARG C 228 -59.360 -12.940 66.378 1.00 40.00 N
+ATOM 4731 CZ ARG C 228 -60.306 -13.437 67.181 1.00 40.00 C
+ATOM 4732 NH1 ARG C 228 -60.265 -13.246 68.497 1.00 40.00 N
+ATOM 4733 NH2 ARG C 228 -61.315 -14.131 66.658 1.00 40.00 N
+ATOM 4734 N VAL C 229 -58.532 -10.494 61.205 1.00 40.00 N
+ATOM 4735 CA VAL C 229 -59.426 -9.886 60.220 1.00 40.00 C
+ATOM 4736 C VAL C 229 -60.704 -10.675 60.083 1.00 40.00 C
+ATOM 4737 O VAL C 229 -60.744 -11.867 60.360 1.00 40.00 O
+ATOM 4738 CB VAL C 229 -58.805 -9.828 58.828 1.00 40.00 C
+ATOM 4739 CG1 VAL C 229 -59.325 -8.610 58.084 1.00 40.00 C
+ATOM 4740 CG2 VAL C 229 -57.295 -9.812 58.929 1.00 40.00 C
+ATOM 4741 N ASP C 230 -61.750 -9.993 59.645 1.00 40.00 N
+ATOM 4742 CA ASP C 230 -63.021 -10.624 59.382 1.00 40.00 C
+ATOM 4743 C ASP C 230 -63.693 -9.797 58.322 1.00 40.00 C
+ATOM 4744 O ASP C 230 -63.754 -8.573 58.457 1.00 40.00 O
+ATOM 4745 CB ASP C 230 -63.878 -10.630 60.644 1.00 40.00 C
+ATOM 4746 CG ASP C 230 -63.542 -11.780 61.566 1.00 40.00 C
+ATOM 4747 OD1 ASP C 230 -64.153 -12.855 61.407 1.00 40.00 O
+ATOM 4748 OD2 ASP C 230 -62.674 -11.612 62.449 1.00 40.00 O
+ATOM 4749 N TYR C 231 -64.182 -10.449 57.266 1.00 40.00 N
+ATOM 4750 CA TYR C 231 -64.920 -9.750 56.226 1.00 40.00 C
+ATOM 4751 C TYR C 231 -66.376 -10.139 56.282 1.00 40.00 C
+ATOM 4752 O TYR C 231 -66.725 -11.166 56.859 1.00 40.00 O
+ATOM 4753 CB TYR C 231 -64.356 -10.066 54.860 1.00 40.00 C
+ATOM 4754 CG TYR C 231 -62.884 -9.803 54.746 1.00 40.00 C
+ATOM 4755 CD1 TYR C 231 -61.955 -10.748 55.175 1.00 40.00 C
+ATOM 4756 CD2 TYR C 231 -62.408 -8.611 54.199 1.00 40.00 C
+ATOM 4757 CE1 TYR C 231 -60.587 -10.513 55.061 1.00 40.00 C
+ATOM 4758 CE2 TYR C 231 -61.039 -8.368 54.076 1.00 40.00 C
+ATOM 4759 CZ TYR C 231 -60.131 -9.321 54.506 1.00 40.00 C
+ATOM 4760 OH TYR C 231 -58.780 -9.088 54.379 1.00 40.00 O
+ATOM 4761 N ALA C 232 -67.222 -9.298 55.697 1.00 40.00 N
+ATOM 4762 CA ALA C 232 -68.665 -9.534 55.656 1.00 40.00 C
+ATOM 4763 C ALA C 232 -69.214 -9.140 54.291 1.00 40.00 C
+ATOM 4764 O ALA C 232 -69.485 -7.964 54.023 1.00 40.00 O
+ATOM 4765 CB ALA C 232 -69.377 -8.772 56.772 1.00 40.00 C
+ATOM 4766 N VAL C 233 -69.349 -10.136 53.422 1.00 40.00 N
+ATOM 4767 CA VAL C 233 -69.861 -9.918 52.080 1.00 40.00 C
+ATOM 4768 C VAL C 233 -71.377 -10.126 52.108 1.00 40.00 C
+ATOM 4769 O VAL C 233 -71.866 -11.257 52.197 1.00 40.00 O
+ATOM 4770 CB VAL C 233 -69.169 -10.832 51.041 1.00 40.00 C
+ATOM 4771 CG1 VAL C 233 -69.240 -10.199 49.661 1.00 40.00 C
+ATOM 4772 CG2 VAL C 233 -67.712 -11.093 51.416 1.00 40.00 C
+ATOM 4773 N SER C 234 -72.107 -9.013 52.054 1.00 40.00 N
+ATOM 4774 CA SER C 234 -73.566 -9.013 52.182 1.00 40.00 C
+ATOM 4775 C SER C 234 -74.268 -9.823 51.087 1.00 40.00 C
+ATOM 4776 O SER C 234 -75.294 -10.460 51.339 1.00 40.00 O
+ATOM 4777 CB SER C 234 -74.124 -7.578 52.256 1.00 40.00 C
+ATOM 4778 OG SER C 234 -74.119 -6.898 51.005 1.00 40.00 O
+ATOM 4779 N ARG C 235 -73.700 -9.816 49.883 1.00 40.00 N
+ATOM 4780 CA ARG C 235 -74.303 -10.505 48.741 1.00 40.00 C
+ATOM 4781 C ARG C 235 -73.664 -11.842 48.361 1.00 40.00 C
+ATOM 4782 O ARG C 235 -73.834 -12.267 47.224 1.00 40.00 O
+ATOM 4783 CB ARG C 235 -74.244 -9.616 47.511 1.00 40.00 C
+ATOM 4784 CG ARG C 235 -75.199 -8.458 47.535 1.00 40.00 C
+ATOM 4785 CD ARG C 235 -75.135 -7.813 46.175 1.00 40.00 C
+ATOM 4786 NE ARG C 235 -75.651 -6.450 46.194 1.00 40.00 N
+ATOM 4787 CZ ARG C 235 -75.338 -5.515 45.298 1.00 40.00 C
+ATOM 4788 NH1 ARG C 235 -74.496 -5.789 44.303 1.00 40.00 N
+ATOM 4789 NH2 ARG C 235 -75.861 -4.298 45.401 1.00 40.00 N
+ATOM 4790 N GLU C 236 -72.931 -12.492 49.274 1.00 40.00 N
+ATOM 4791 CA GLU C 236 -72.218 -13.755 48.969 1.00 40.00 C
+ATOM 4792 C GLU C 236 -72.051 -14.651 50.177 1.00 40.00 C
+ATOM 4793 O GLU C 236 -71.422 -15.706 50.096 1.00 40.00 O
+ATOM 4794 CB GLU C 236 -70.828 -13.484 48.390 1.00 40.00 C
+ATOM 4795 CG GLU C 236 -70.812 -13.070 46.927 1.00 40.00 C
+ATOM 4796 CD GLU C 236 -69.415 -12.796 46.410 1.00 40.00 C
+ATOM 4797 OE1 GLU C 236 -68.525 -13.663 46.595 1.00 40.00 O
+ATOM 4798 OE2 GLU C 236 -69.219 -11.713 45.813 1.00 40.00 O
+ATOM 4799 N GLN C 237 -72.581 -14.204 51.304 1.00 40.00 N
+ATOM 4800 CA GLN C 237 -72.544 -14.981 52.524 1.00 40.00 C
+ATOM 4801 C GLN C 237 -73.824 -14.731 53.293 1.00 40.00 C
+ATOM 4802 O GLN C 237 -74.415 -13.644 53.222 1.00 40.00 O
+ATOM 4803 CB GLN C 237 -71.361 -14.578 53.412 1.00 40.00 C
+ATOM 4804 CG GLN C 237 -69.967 -14.751 52.819 1.00 40.00 C
+ATOM 4805 CD GLN C 237 -68.910 -13.929 53.552 1.00 40.00 C
+ATOM 4806 OE1 GLN C 237 -69.207 -12.893 54.153 1.00 40.00 O
+ATOM 4807 NE2 GLN C 237 -67.667 -14.389 53.499 1.00 40.00 N
+ATOM 4808 N THR C 238 -74.249 -15.765 54.013 1.00 40.00 N
+ATOM 4809 CA THR C 238 -75.267 -15.645 55.056 1.00 40.00 C
+ATOM 4810 C THR C 238 -74.799 -16.417 56.309 1.00 40.00 C
+ATOM 4811 O THR C 238 -73.823 -17.201 56.266 1.00 40.00 O
+ATOM 4812 CB THR C 238 -76.690 -16.103 54.601 1.00 40.00 C
+ATOM 4813 OG1 THR C 238 -76.712 -17.514 54.343 1.00 40.00 O
+ATOM 4814 CG2 THR C 238 -77.168 -15.337 53.352 1.00 40.00 C
+ATOM 4815 N ASN C 239 -75.482 -16.168 57.425 1.00 40.00 N
+ATOM 4816 CA ASN C 239 -75.183 -16.843 58.689 1.00 40.00 C
+ATOM 4817 C ASN C 239 -75.899 -18.197 58.816 1.00 40.00 C
+ATOM 4818 O ASN C 239 -76.573 -18.657 57.876 1.00 40.00 O
+ATOM 4819 CB ASN C 239 -75.468 -15.913 59.906 1.00 40.00 C
+ATOM 4820 CG ASN C 239 -76.900 -15.354 59.931 1.00 40.00 C
+ATOM 4821 OD1 ASN C 239 -77.554 -15.216 58.895 1.00 40.00 O
+ATOM 4822 ND2 ASN C 239 -77.378 -15.016 61.128 1.00 40.00 N
+ATOM 4823 N ALA C 240 -75.730 -18.835 59.974 1.00 40.00 N
+ATOM 4824 CA ALA C 240 -76.516 -20.008 60.327 1.00 40.00 C
+ATOM 4825 C ALA C 240 -78.010 -19.677 60.212 1.00 40.00 C
+ATOM 4826 O ALA C 240 -78.797 -20.492 59.713 1.00 40.00 O
+ATOM 4827 CB ALA C 240 -76.163 -20.486 61.731 1.00 40.00 C
+ATOM 4828 N ALA C 241 -78.383 -18.468 60.635 1.00 40.00 N
+ATOM 4829 CA ALA C 241 -79.770 -18.005 60.556 1.00 40.00 C
+ATOM 4830 C ALA C 241 -80.267 -17.639 59.129 1.00 40.00 C
+ATOM 4831 O ALA C 241 -81.400 -17.154 58.979 1.00 40.00 O
+ATOM 4832 CB ALA C 241 -80.000 -16.859 61.537 1.00 40.00 C
+ATOM 4833 N GLY C 242 -79.439 -17.878 58.101 1.00 40.00 N
+ATOM 4834 CA GLY C 242 -79.812 -17.649 56.685 1.00 40.00 C
+ATOM 4835 C GLY C 242 -80.131 -16.217 56.243 1.00 40.00 C
+ATOM 4836 O GLY C 242 -80.959 -16.008 55.340 1.00 40.00 O
+ATOM 4837 N GLU C 243 -79.471 -15.240 56.879 1.00 40.00 N
+ATOM 4838 CA GLU C 243 -79.617 -13.797 56.563 1.00 40.00 C
+ATOM 4839 C GLU C 243 -78.301 -13.226 56.023 1.00 40.00 C
+ATOM 4840 O GLU C 243 -77.219 -13.757 56.308 1.00 40.00 O
+ATOM 4841 CB GLU C 243 -80.033 -12.986 57.793 1.00 40.00 C
+ATOM 4842 CG GLU C 243 -80.657 -13.808 58.904 1.00 40.00 C
+ATOM 4843 CD GLU C 243 -80.512 -13.141 60.249 1.00 40.00 C
+ATOM 4844 OE1 GLU C 243 -81.036 -12.011 60.386 1.00 40.00 O
+ATOM 4845 OE2 GLU C 243 -79.878 -13.742 61.157 1.00 40.00 O
+ATOM 4846 N ARG C 244 -78.403 -12.131 55.267 1.00 40.00 N
+ATOM 4847 CA ARG C 244 -77.258 -11.546 54.561 1.00 40.00 C
+ATOM 4848 C ARG C 244 -76.153 -11.059 55.502 1.00 40.00 C
+ATOM 4849 O ARG C 244 -76.437 -10.346 56.470 1.00 40.00 O
+ATOM 4850 CB ARG C 244 -77.736 -10.398 53.676 1.00 40.00 C
+ATOM 4851 CG ARG C 244 -78.369 -10.838 52.370 1.00 40.00 C
+ATOM 4852 CD ARG C 244 -78.677 -9.617 51.524 1.00 40.00 C
+ATOM 4853 NE ARG C 244 -79.229 -9.964 50.220 1.00 40.00 N
+ATOM 4854 CZ ARG C 244 -80.074 -9.195 49.534 1.00 40.00 C
+ATOM 4855 NH1 ARG C 244 -80.482 -8.032 50.029 1.00 40.00 N
+ATOM 4856 NH2 ARG C 244 -80.527 -9.592 48.354 1.00 40.00 N
+ATOM 4857 N MET C 245 -74.904 -11.433 55.207 1.00 40.00 N
+ATOM 4858 CA MET C 245 -73.764 -11.100 56.083 1.00 40.00 C
+ATOM 4859 C MET C 245 -73.396 -9.623 56.060 1.00 40.00 C
+ATOM 4860 O MET C 245 -72.573 -9.167 55.260 1.00 40.00 O
+ATOM 4861 CB MET C 245 -72.530 -11.962 55.780 1.00 40.00 C
+ATOM 4862 CG MET C 245 -71.451 -11.903 56.855 1.00 40.00 C
+ATOM 4863 SD MET C 245 -72.010 -12.534 58.449 1.00 40.00 S
+ATOM 4864 CE MET C 245 -72.063 -14.302 58.147 1.00 40.00 C
+ATOM 4865 N TYR C 246 -74.033 -8.885 56.956 1.00 40.00 N
+ATOM 4866 CA TYR C 246 -73.697 -7.499 57.179 1.00 40.00 C
+ATOM 4867 C TYR C 246 -72.656 -7.425 58.272 1.00 40.00 C
+ATOM 4868 O TYR C 246 -72.459 -8.384 59.030 1.00 40.00 O
+ATOM 4869 CB TYR C 246 -74.949 -6.698 57.521 1.00 40.00 C
+ATOM 4870 CG TYR C 246 -75.907 -6.704 56.373 1.00 40.00 C
+ATOM 4871 CD1 TYR C 246 -75.485 -6.291 55.116 1.00 40.00 C
+ATOM 4872 CD2 TYR C 246 -77.216 -7.157 56.523 1.00 40.00 C
+ATOM 4873 CE1 TYR C 246 -76.340 -6.308 54.032 1.00 40.00 C
+ATOM 4874 CE2 TYR C 246 -78.090 -7.177 55.445 1.00 40.00 C
+ATOM 4875 CZ TYR C 246 -77.645 -6.750 54.198 1.00 40.00 C
+ATOM 4876 OH TYR C 246 -78.487 -6.750 53.101 1.00 40.00 O
+ATOM 4877 N ILE C 247 -71.963 -6.296 58.329 1.00 40.00 N
+ATOM 4878 CA ILE C 247 -70.920 -6.117 59.318 1.00 40.00 C
+ATOM 4879 C ILE C 247 -71.410 -6.649 60.670 1.00 40.00 C
+ATOM 4880 O ILE C 247 -70.770 -7.529 61.253 1.00 40.00 O
+ATOM 4881 CB ILE C 247 -70.411 -4.646 59.365 1.00 40.00 C
+ATOM 4882 CG1 ILE C 247 -69.286 -4.499 60.396 1.00 40.00 C
+ATOM 4883 CG2 ILE C 247 -71.546 -3.644 59.597 1.00 40.00 C
+ATOM 4884 CD1 ILE C 247 -68.284 -3.408 60.075 1.00 40.00 C
+ATOM 4885 N GLN C 248 -72.579 -6.161 61.103 1.00 40.00 N
+ATOM 4886 CA GLN C 248 -73.181 -6.511 62.389 1.00 40.00 C
+ATOM 4887 C GLN C 248 -73.349 -8.007 62.527 1.00 40.00 C
+ATOM 4888 O GLN C 248 -73.117 -8.567 63.600 1.00 40.00 O
+ATOM 4889 CB GLN C 248 -74.529 -5.800 62.598 1.00 40.00 C
+ATOM 4890 CG GLN C 248 -75.606 -6.096 61.562 1.00 40.00 C
+ATOM 4891 CD GLN C 248 -75.602 -5.108 60.414 1.00 40.00 C
+ATOM 4892 OE1 GLN C 248 -74.550 -4.721 59.911 1.00 40.00 O
+ATOM 4893 NE2 GLN C 248 -76.784 -4.697 59.991 1.00 40.00 N
+ATOM 4894 N THR C 249 -73.732 -8.648 61.429 1.00 40.00 N
+ATOM 4895 CA THR C 249 -73.978 -10.080 61.420 1.00 40.00 C
+ATOM 4896 C THR C 249 -72.677 -10.827 61.692 1.00 40.00 C
+ATOM 4897 O THR C 249 -72.639 -11.738 62.522 1.00 40.00 O
+ATOM 4898 CB THR C 249 -74.587 -10.526 60.084 1.00 40.00 C
+ATOM 4899 OG1 THR C 249 -75.322 -9.437 59.516 1.00 40.00 O
+ATOM 4900 CG2 THR C 249 -75.509 -11.715 60.287 1.00 40.00 C
+ATOM 4901 N ARG C 250 -71.613 -10.414 61.009 1.00 40.00 N
+ATOM 4902 CA ARG C 250 -70.298 -11.004 61.200 1.00 40.00 C
+ATOM 4903 C ARG C 250 -69.831 -10.786 62.629 1.00 40.00 C
+ATOM 4904 O ARG C 250 -69.279 -11.685 63.262 1.00 40.00 O
+ATOM 4905 CB ARG C 250 -69.298 -10.399 60.208 1.00 40.00 C
+ATOM 4906 CG ARG C 250 -67.853 -10.861 60.383 1.00 40.00 C
+ATOM 4907 CD ARG C 250 -67.659 -12.323 60.023 1.00 40.00 C
+ATOM 4908 NE ARG C 250 -68.078 -12.570 58.647 1.00 40.00 N
+ATOM 4909 CZ ARG C 250 -68.486 -13.746 58.175 1.00 40.00 C
+ATOM 4910 NH1 ARG C 250 -68.535 -14.819 58.969 1.00 40.00 N
+ATOM 4911 NH2 ARG C 250 -68.853 -13.847 56.900 1.00 40.00 N
+ATOM 4912 N MET C 251 -70.055 -9.574 63.119 1.00 40.00 N
+ATOM 4913 CA MET C 251 -69.680 -9.200 64.469 1.00 40.00 C
+ATOM 4914 C MET C 251 -70.420 -10.084 65.440 1.00 40.00 C
+ATOM 4915 O MET C 251 -69.808 -10.665 66.335 1.00 40.00 O
+ATOM 4916 CB MET C 251 -70.052 -7.749 64.744 1.00 40.00 C
+ATOM 4917 CG MET C 251 -69.102 -6.714 64.165 1.00 40.00 C
+ATOM 4918 SD MET C 251 -69.870 -5.081 64.056 1.00 40.00 S
+ATOM 4919 CE MET C 251 -70.085 -4.652 65.778 1.00 40.00 C
+ATOM 4920 N ALA C 252 -71.736 -10.183 65.245 1.00 40.00 N
+ATOM 4921 CA ALA C 252 -72.607 -10.985 66.101 1.00 40.00 C
+ATOM 4922 C ALA C 252 -72.040 -12.390 66.336 1.00 40.00 C
+ATOM 4923 O ALA C 252 -72.352 -13.036 67.343 1.00 40.00 O
+ATOM 4924 CB ALA C 252 -74.008 -11.060 65.515 1.00 40.00 C
+ATOM 4925 N GLU C 253 -71.191 -12.843 65.411 1.00 40.00 N
+ATOM 4926 CA GLU C 253 -70.503 -14.130 65.534 1.00 40.00 C
+ATOM 4927 C GLU C 253 -69.422 -14.153 66.620 1.00 40.00 C
+ATOM 4928 O GLU C 253 -68.841 -15.204 66.905 1.00 40.00 O
+ATOM 4929 CB GLU C 253 -69.887 -14.532 64.201 1.00 40.00 C
+ATOM 4930 CG GLU C 253 -70.899 -14.829 63.112 1.00 40.00 C
+ATOM 4931 CD GLU C 253 -70.248 -15.405 61.869 1.00 40.00 C
+ATOM 4932 OE1 GLU C 253 -70.990 -15.925 61.005 1.00 40.00 O
+ATOM 4933 OE2 GLU C 253 -68.998 -15.340 61.757 1.00 40.00 O
+ATOM 4934 N TYR C 254 -69.142 -13.000 67.217 1.00 40.00 N
+ATOM 4935 CA TYR C 254 -68.202 -12.938 68.311 1.00 40.00 C
+ATOM 4936 C TYR C 254 -68.798 -12.153 69.444 1.00 40.00 C
+ATOM 4937 O TYR C 254 -68.072 -11.712 70.320 1.00 40.00 O
+ATOM 4938 CB TYR C 254 -66.930 -12.235 67.879 1.00 40.00 C
+ATOM 4939 CG TYR C 254 -66.204 -12.838 66.712 1.00 40.00 C
+ATOM 4940 CD1 TYR C 254 -65.220 -13.798 66.914 1.00 40.00 C
+ATOM 4941 CD2 TYR C 254 -66.466 -12.415 65.407 1.00 40.00 C
+ATOM 4942 CE1 TYR C 254 -64.524 -14.337 65.854 1.00 40.00 C
+ATOM 4943 CE2 TYR C 254 -65.779 -12.952 64.336 1.00 40.00 C
+ATOM 4944 CZ TYR C 254 -64.807 -13.910 64.571 1.00 40.00 C
+ATOM 4945 OH TYR C 254 -64.106 -14.455 63.529 1.00 40.00 O
+ATOM 4946 N LYS C 255 -70.115 -11.972 69.430 1.00 40.00 N
+ATOM 4947 CA LYS C 255 -70.788 -11.115 70.409 1.00 40.00 C
+ATOM 4948 C LYS C 255 -70.300 -11.356 71.831 1.00 40.00 C
+ATOM 4949 O LYS C 255 -70.573 -10.577 72.735 1.00 40.00 O
+ATOM 4950 CB LYS C 255 -72.310 -11.256 70.314 1.00 40.00 C
+ATOM 4951 CG LYS C 255 -72.856 -12.648 70.563 1.00 40.00 C
+ATOM 4952 CD LYS C 255 -74.246 -12.784 69.964 1.00 40.00 C
+ATOM 4953 CE LYS C 255 -74.884 -14.108 70.343 1.00 40.00 C
+ATOM 4954 NZ LYS C 255 -75.336 -14.081 71.759 1.00 40.00 N
+ATOM 4955 N GLU C 256 -69.553 -12.441 71.994 1.00 40.00 N
+ATOM 4956 CA GLU C 256 -68.949 -12.833 73.264 1.00 40.00 C
+ATOM 4957 C GLU C 256 -67.706 -12.000 73.590 1.00 40.00 C
+ATOM 4958 O GLU C 256 -67.784 -11.085 74.410 1.00 40.00 O
+ATOM 4959 CB GLU C 256 -68.578 -14.330 73.248 1.00 40.00 C
+ATOM 4960 CG GLU C 256 -69.500 -15.242 72.439 1.00 40.00 C
+ATOM 4961 CD GLU C 256 -70.910 -15.357 73.007 1.00 40.00 C
+ATOM 4962 OE1 GLU C 256 -71.097 -15.145 74.230 1.00 40.00 O
+ATOM 4963 OE2 GLU C 256 -71.839 -15.668 72.221 1.00 40.00 O
+ATOM 4964 N GLU C 257 -66.570 -12.320 72.954 1.00 40.00 N
+ATOM 4965 CA GLU C 257 -65.281 -11.644 73.230 1.00 40.00 C
+ATOM 4966 C GLU C 257 -65.433 -10.138 73.151 1.00 40.00 C
+ATOM 4967 O GLU C 257 -64.926 -9.407 73.998 1.00 40.00 O
+ATOM 4968 CB GLU C 257 -64.157 -12.042 72.250 1.00 40.00 C
+ATOM 4969 CG GLU C 257 -63.930 -13.521 72.006 1.00 40.00 C
+ATOM 4970 CD GLU C 257 -64.649 -13.986 70.763 1.00 40.00 C
+ATOM 4971 OE1 GLU C 257 -65.892 -14.168 70.834 1.00 40.00 O
+ATOM 4972 OE2 GLU C 257 -63.967 -14.149 69.724 1.00 40.00 O
+ATOM 4973 N LEU C 258 -66.123 -9.689 72.109 1.00 40.00 N
+ATOM 4974 CA LEU C 258 -66.345 -8.280 71.891 1.00 40.00 C
+ATOM 4975 C LEU C 258 -66.957 -7.670 73.137 1.00 40.00 C
+ATOM 4976 O LEU C 258 -66.327 -6.826 73.771 1.00 40.00 O
+ATOM 4977 CB LEU C 258 -67.211 -8.056 70.655 1.00 40.00 C
+ATOM 4978 CG LEU C 258 -66.662 -8.675 69.358 1.00 40.00 C
+ATOM 4979 CD1 LEU C 258 -67.614 -8.424 68.195 1.00 40.00 C
+ATOM 4980 CD2 LEU C 258 -65.256 -8.191 69.013 1.00 40.00 C
+ATOM 4981 N TRP C 259 -68.144 -8.131 73.527 1.00 40.00 N
+ATOM 4982 CA TRP C 259 -68.791 -7.617 74.740 1.00 40.00 C
+ATOM 4983 C TRP C 259 -67.885 -7.646 75.946 1.00 40.00 C
+ATOM 4984 O TRP C 259 -67.882 -6.728 76.768 1.00 40.00 O
+ATOM 4985 CB TRP C 259 -70.092 -8.354 75.033 1.00 40.00 C
+ATOM 4986 CG TRP C 259 -70.756 -7.831 76.282 1.00 40.00 C
+ATOM 4987 CD1 TRP C 259 -71.069 -8.540 77.442 1.00 40.00 C
+ATOM 4988 CD2 TRP C 259 -71.168 -6.437 76.563 1.00 40.00 C
+ATOM 4989 NE1 TRP C 259 -71.650 -7.715 78.381 1.00 40.00 N
+ATOM 4990 CE2 TRP C 259 -71.737 -6.440 77.918 1.00 40.00 C
+ATOM 4991 CE3 TRP C 259 -71.144 -5.245 75.848 1.00 40.00 C
+ATOM 4992 CZ2 TRP C 259 -72.245 -5.282 78.507 1.00 40.00 C
+ATOM 4993 CZ3 TRP C 259 -71.660 -4.090 76.452 1.00 40.00 C
+ATOM 4994 CH2 TRP C 259 -72.196 -4.110 77.748 1.00 40.00 C
+ATOM 4995 N GLU C 260 -67.108 -8.719 76.048 1.00 40.00 N
+ATOM 4996 CA GLU C 260 -66.101 -8.868 77.082 1.00 40.00 C
+ATOM 4997 C GLU C 260 -65.066 -7.762 76.954 1.00 40.00 C
+ATOM 4998 O GLU C 260 -64.902 -6.958 77.868 1.00 40.00 O
+ATOM 4999 CB GLU C 260 -65.425 -10.247 76.972 1.00 40.00 C
+ATOM 5000 CG GLU C 260 -66.263 -11.421 77.469 1.00 40.00 C
+ATOM 5001 CD GLU C 260 -66.689 -11.263 78.921 1.00 40.00 C
+ATOM 5002 OE1 GLU C 260 -67.908 -11.300 79.186 1.00 40.00 O
+ATOM 5003 OE2 GLU C 260 -65.813 -11.084 79.798 1.00 40.00 O
+ATOM 5004 N LEU C 261 -64.396 -7.725 75.803 1.00 40.00 N
+ATOM 5005 CA LEU C 261 -63.350 -6.743 75.500 1.00 40.00 C
+ATOM 5006 C LEU C 261 -63.837 -5.310 75.662 1.00 40.00 C
+ATOM 5007 O LEU C 261 -63.047 -4.383 75.793 1.00 40.00 O
+ATOM 5008 CB LEU C 261 -62.815 -6.960 74.077 1.00 40.00 C
+ATOM 5009 CG LEU C 261 -61.874 -8.157 73.840 1.00 40.00 C
+ATOM 5010 CD1 LEU C 261 -62.098 -8.829 72.494 1.00 40.00 C
+ATOM 5011 CD2 LEU C 261 -60.417 -7.747 73.975 1.00 40.00 C
+ATOM 5012 N LEU C 262 -65.152 -5.149 75.668 1.00 40.00 N
+ATOM 5013 CA LEU C 262 -65.777 -3.847 75.823 1.00 40.00 C
+ATOM 5014 C LEU C 262 -65.723 -3.293 77.235 1.00 40.00 C
+ATOM 5015 O LEU C 262 -66.098 -2.142 77.486 1.00 40.00 O
+ATOM 5016 CB LEU C 262 -67.232 -3.923 75.389 1.00 40.00 C
+ATOM 5017 CG LEU C 262 -67.471 -3.515 73.940 1.00 40.00 C
+ATOM 5018 CD1 LEU C 262 -68.959 -3.316 73.688 1.00 40.00 C
+ATOM 5019 CD2 LEU C 262 -66.724 -2.227 73.634 1.00 40.00 C
+ATOM 5020 N LYS C 263 -65.277 -4.119 78.166 1.00 40.00 N
+ATOM 5021 CA LYS C 263 -65.229 -3.696 79.548 1.00 40.00 C
+ATOM 5022 C LYS C 263 -63.778 -3.426 79.960 1.00 40.00 C
+ATOM 5023 O LYS C 263 -63.521 -2.919 81.046 1.00 40.00 O
+ATOM 5024 CB LYS C 263 -65.961 -4.715 80.440 1.00 40.00 C
+ATOM 5025 CG LYS C 263 -67.431 -4.911 80.044 1.00 40.00 C
+ATOM 5026 CD LYS C 263 -68.199 -5.887 80.929 1.00 40.00 C
+ATOM 5027 CE LYS C 263 -67.948 -7.340 80.548 1.00 40.00 C
+ATOM 5028 NZ LYS C 263 -68.742 -8.257 81.414 1.00 40.00 N
+ATOM 5029 N LYS C 264 -62.841 -3.735 79.065 1.00 40.00 N
+ATOM 5030 CA LYS C 264 -61.432 -3.430 79.278 1.00 40.00 C
+ATOM 5031 C LYS C 264 -61.139 -1.944 79.082 1.00 40.00 C
+ATOM 5032 O LYS C 264 -61.908 -1.229 78.457 1.00 40.00 O
+ATOM 5033 CB LYS C 264 -60.556 -4.269 78.353 1.00 40.00 C
+ATOM 5034 CG LYS C 264 -60.323 -5.693 78.837 1.00 40.00 C
+ATOM 5035 CD LYS C 264 -59.338 -6.437 77.938 1.00 40.00 C
+ATOM 5036 CE LYS C 264 -58.817 -7.711 78.587 1.00 40.00 C
+ATOM 5037 NZ LYS C 264 -59.893 -8.704 78.862 1.00 40.00 N
+ATOM 5038 N ASP C 265 -60.012 -1.495 79.627 1.00 40.00 N
+ATOM 5039 CA ASP C 265 -59.617 -0.071 79.660 1.00 40.00 C
+ATOM 5040 C ASP C 265 -58.748 0.315 78.484 1.00 40.00 C
+ATOM 5041 O ASP C 265 -58.461 1.488 78.261 1.00 40.00 O
+ATOM 5042 CB ASP C 265 -58.804 0.230 80.937 1.00 40.00 C
+ATOM 5043 CG ASP C 265 -59.675 0.548 82.149 1.00 40.00 C
+ATOM 5044 OD1 ASP C 265 -59.187 0.363 83.297 1.00 40.00 O
+ATOM 5045 OD2 ASP C 265 -60.833 0.992 81.955 1.00 40.00 O
+ATOM 5046 N ASN C 266 -58.288 -0.687 77.763 1.00 40.00 N
+ATOM 5047 CA ASN C 266 -57.352 -0.463 76.701 1.00 40.00 C
+ATOM 5048 C ASN C 266 -57.930 -1.027 75.410 1.00 40.00 C
+ATOM 5049 O ASN C 266 -57.208 -1.374 74.474 1.00 40.00 O
+ATOM 5050 CB ASN C 266 -56.019 -1.109 77.053 1.00 40.00 C
+ATOM 5051 CG ASN C 266 -56.129 -2.615 77.214 1.00 40.00 C
+ATOM 5052 OD1 ASN C 266 -57.210 -3.149 77.510 1.00 40.00 O
+ATOM 5053 ND2 ASN C 266 -55.009 -3.314 77.010 1.00 40.00 N
+ATOM 5054 N THR C 267 -59.252 -1.126 75.376 1.00 40.00 N
+ATOM 5055 CA THR C 267 -59.960 -1.496 74.164 1.00 40.00 C
+ATOM 5056 C THR C 267 -60.576 -0.225 73.574 1.00 40.00 C
+ATOM 5057 O THR C 267 -61.405 0.407 74.204 1.00 40.00 O
+ATOM 5058 CB THR C 267 -61.032 -2.566 74.465 1.00 40.00 C
+ATOM 5059 OG1 THR C 267 -60.407 -3.733 75.007 1.00 40.00 O
+ATOM 5060 CG2 THR C 267 -61.753 -2.971 73.223 1.00 40.00 C
+ATOM 5061 N TYR C 268 -60.151 0.169 72.380 1.00 40.00 N
+ATOM 5062 CA TYR C 268 -60.680 1.383 71.758 1.00 40.00 C
+ATOM 5063 C TYR C 268 -61.353 1.068 70.421 1.00 40.00 C
+ATOM 5064 O TYR C 268 -60.772 0.382 69.568 1.00 40.00 O
+ATOM 5065 CB TYR C 268 -59.577 2.413 71.553 1.00 40.00 C
+ATOM 5066 CG TYR C 268 -58.700 2.617 72.752 1.00 40.00 C
+ATOM 5067 CD1 TYR C 268 -57.652 1.750 73.016 1.00 40.00 C
+ATOM 5068 CD2 TYR C 268 -58.907 3.681 73.624 1.00 40.00 C
+ATOM 5069 CE1 TYR C 268 -56.830 1.927 74.118 1.00 40.00 C
+ATOM 5070 CE2 TYR C 268 -58.086 3.870 74.734 1.00 40.00 C
+ATOM 5071 CZ TYR C 268 -57.043 2.983 74.974 1.00 40.00 C
+ATOM 5072 OH TYR C 268 -56.202 3.119 76.059 1.00 40.00 O
+ATOM 5073 N VAL C 269 -62.575 1.575 70.241 1.00 40.00 N
+ATOM 5074 CA VAL C 269 -63.386 1.268 69.058 1.00 40.00 C
+ATOM 5075 C VAL C 269 -63.399 2.422 68.089 1.00 40.00 C
+ATOM 5076 O VAL C 269 -63.566 3.575 68.468 1.00 40.00 O
+ATOM 5077 CB VAL C 269 -64.839 0.919 69.425 1.00 40.00 C
+ATOM 5078 CG1 VAL C 269 -65.718 0.899 68.197 1.00 40.00 C
+ATOM 5079 CG2 VAL C 269 -64.888 -0.439 70.078 1.00 40.00 C
+ATOM 5080 N TYR C 270 -63.226 2.094 66.824 1.00 40.00 N
+ATOM 5081 CA TYR C 270 -63.311 3.089 65.794 1.00 40.00 C
+ATOM 5082 C TYR C 270 -64.279 2.611 64.720 1.00 40.00 C
+ATOM 5083 O TYR C 270 -64.194 1.459 64.260 1.00 40.00 O
+ATOM 5084 CB TYR C 270 -61.941 3.313 65.190 1.00 40.00 C
+ATOM 5085 CG TYR C 270 -60.904 3.965 66.086 1.00 40.00 C
+ATOM 5086 CD1 TYR C 270 -60.209 3.231 67.038 1.00 40.00 C
+ATOM 5087 CD2 TYR C 270 -60.569 5.312 65.925 1.00 40.00 C
+ATOM 5088 CE1 TYR C 270 -59.238 3.829 67.826 1.00 40.00 C
+ATOM 5089 CE2 TYR C 270 -59.597 5.915 66.705 1.00 40.00 C
+ATOM 5090 CZ TYR C 270 -58.935 5.169 67.651 1.00 40.00 C
+ATOM 5091 OH TYR C 270 -57.970 5.761 68.425 1.00 40.00 O
+ATOM 5092 N MET C 271 -65.200 3.496 64.333 1.00 40.00 N
+ATOM 5093 CA MET C 271 -66.225 3.183 63.337 1.00 40.00 C
+ATOM 5094 C MET C 271 -66.148 4.179 62.206 1.00 40.00 C
+ATOM 5095 O MET C 271 -66.098 5.380 62.452 1.00 40.00 O
+ATOM 5096 CB MET C 271 -67.621 3.254 63.954 1.00 40.00 C
+ATOM 5097 CG MET C 271 -68.709 2.570 63.131 1.00 40.00 C
+ATOM 5098 SD MET C 271 -70.407 2.855 63.711 1.00 40.00 S
+ATOM 5099 CE MET C 271 -70.577 1.683 65.062 1.00 40.00 C
+ATOM 5100 N CYS C 272 -66.150 3.681 60.972 1.00 40.00 N
+ATOM 5101 CA CYS C 272 -66.031 4.546 59.805 1.00 40.00 C
+ATOM 5102 C CYS C 272 -66.695 3.956 58.577 1.00 40.00 C
+ATOM 5103 O CYS C 272 -66.631 2.753 58.341 1.00 40.00 O
+ATOM 5104 CB CYS C 272 -64.557 4.842 59.502 1.00 40.00 C
+ATOM 5105 SG CYS C 272 -64.262 6.245 58.397 1.00 40.00 S
+ATOM 5106 N GLY C 273 -67.335 4.820 57.799 1.00 40.00 N
+ATOM 5107 CA GLY C 273 -67.863 4.432 56.504 1.00 40.00 C
+ATOM 5108 C GLY C 273 -69.174 5.084 56.140 1.00 40.00 C
+ATOM 5109 O GLY C 273 -69.292 6.313 56.082 1.00 40.00 O
+ATOM 5110 N LEU C 274 -70.166 4.234 55.904 1.00 40.00 N
+ATOM 5111 CA LEU C 274 -71.442 4.646 55.327 1.00 40.00 C
+ATOM 5112 C LEU C 274 -72.503 4.885 56.383 1.00 40.00 C
+ATOM 5113 O LEU C 274 -72.908 3.951 57.091 1.00 40.00 O
+ATOM 5114 CB LEU C 274 -71.938 3.572 54.357 1.00 40.00 C
+ATOM 5115 CG LEU C 274 -71.016 3.238 53.181 1.00 40.00 C
+ATOM 5116 CD1 LEU C 274 -71.247 1.810 52.683 1.00 40.00 C
+ATOM 5117 CD2 LEU C 274 -71.184 4.287 52.076 1.00 40.00 C
+ATOM 5118 N LYS C 275 -72.959 6.130 56.480 1.00 40.00 N
+ATOM 5119 CA LYS C 275 -74.051 6.452 57.379 1.00 40.00 C
+ATOM 5120 C LYS C 275 -75.092 5.330 57.302 1.00 40.00 C
+ATOM 5121 O LYS C 275 -75.577 5.003 56.220 1.00 40.00 O
+ATOM 5122 CB LYS C 275 -74.665 7.797 56.997 1.00 40.00 C
+ATOM 5123 CG LYS C 275 -75.699 8.305 57.986 1.00 40.00 C
+ATOM 5124 CD LYS C 275 -76.164 9.710 57.637 1.00 40.00 C
+ATOM 5125 CE LYS C 275 -76.995 10.311 58.767 1.00 40.00 C
+ATOM 5126 NZ LYS C 275 -77.027 11.808 58.755 1.00 40.00 N
+ATOM 5127 N GLY C 276 -75.395 4.710 58.437 1.00 40.00 N
+ATOM 5128 CA GLY C 276 -76.421 3.678 58.470 1.00 40.00 C
+ATOM 5129 C GLY C 276 -75.954 2.367 59.049 1.00 40.00 C
+ATOM 5130 O GLY C 276 -76.736 1.635 59.659 1.00 40.00 O
+ATOM 5131 N MET C 277 -74.677 2.064 58.858 1.00 40.00 N
+ATOM 5132 CA MET C 277 -74.087 0.872 59.453 1.00 40.00 C
+ATOM 5133 C MET C 277 -74.378 0.757 60.964 1.00 40.00 C
+ATOM 5134 O MET C 277 -74.733 -0.332 61.434 1.00 40.00 O
+ATOM 5135 CB MET C 277 -72.578 0.793 59.149 1.00 40.00 C
+ATOM 5136 CG MET C 277 -71.732 1.975 59.628 1.00 40.00 C
+ATOM 5137 SD MET C 277 -70.032 2.043 58.995 1.00 40.00 S
+ATOM 5138 CE MET C 277 -69.241 0.709 59.891 1.00 40.00 C
+ATOM 5139 N GLU C 278 -74.277 1.881 61.696 1.00 40.00 N
+ATOM 5140 CA GLU C 278 -74.348 1.895 63.182 1.00 40.00 C
+ATOM 5141 C GLU C 278 -75.716 1.588 63.795 1.00 40.00 C
+ATOM 5142 O GLU C 278 -75.778 1.136 64.942 1.00 40.00 O
+ATOM 5143 CB GLU C 278 -73.757 3.181 63.809 1.00 40.00 C
+ATOM 5144 CG GLU C 278 -74.690 4.377 63.889 1.00 40.00 C
+ATOM 5145 CD GLU C 278 -74.710 5.158 62.599 1.00 40.00 C
+ATOM 5146 OE1 GLU C 278 -75.211 4.634 61.571 1.00 40.00 O
+ATOM 5147 OE2 GLU C 278 -74.207 6.301 62.621 1.00 40.00 O
+ATOM 5148 N LYS C 279 -76.803 1.827 63.061 1.00 40.00 N
+ATOM 5149 CA LYS C 279 -78.079 1.304 63.519 1.00 40.00 C
+ATOM 5150 C LYS C 279 -77.883 -0.192 63.633 1.00 40.00 C
+ATOM 5151 O LYS C 279 -78.078 -0.752 64.706 1.00 40.00 O
+ATOM 5152 CB LYS C 279 -79.242 1.611 62.580 1.00 40.00 C
+ATOM 5153 CG LYS C 279 -80.577 1.245 63.219 1.00 40.00 C
+ATOM 5154 CD LYS C 279 -81.681 0.972 62.205 1.00 40.00 C
+ATOM 5155 CE LYS C 279 -82.875 0.318 62.892 1.00 40.00 C
+ATOM 5156 NZ LYS C 279 -84.124 0.391 62.089 1.00 40.00 N
+ATOM 5157 N GLY C 280 -77.449 -0.814 62.535 1.00 40.00 N
+ATOM 5158 CA GLY C 280 -77.128 -2.238 62.504 1.00 40.00 C
+ATOM 5159 C GLY C 280 -76.375 -2.681 63.740 1.00 40.00 C
+ATOM 5160 O GLY C 280 -76.785 -3.629 64.408 1.00 40.00 O
+ATOM 5161 N ILE C 281 -75.295 -1.965 64.053 1.00 40.00 N
+ATOM 5162 CA ILE C 281 -74.420 -2.273 65.185 1.00 40.00 C
+ATOM 5163 C ILE C 281 -75.094 -2.034 66.531 1.00 40.00 C
+ATOM 5164 O ILE C 281 -75.137 -2.926 67.381 1.00 40.00 O
+ATOM 5165 CB ILE C 281 -73.087 -1.500 65.080 1.00 40.00 C
+ATOM 5166 CG1 ILE C 281 -72.192 -2.178 64.041 1.00 40.00 C
+ATOM 5167 CG2 ILE C 281 -72.371 -1.439 66.417 1.00 40.00 C
+ATOM 5168 CD1 ILE C 281 -70.836 -1.532 63.840 1.00 40.00 C
+ATOM 5169 N ASP C 282 -75.629 -0.836 66.718 1.00 40.00 N
+ATOM 5170 CA ASP C 282 -76.312 -0.510 67.953 1.00 40.00 C
+ATOM 5171 C ASP C 282 -77.331 -1.581 68.305 1.00 40.00 C
+ATOM 5172 O ASP C 282 -77.402 -2.005 69.453 1.00 40.00 O
+ATOM 5173 CB ASP C 282 -76.964 0.869 67.862 1.00 40.00 C
+ATOM 5174 CG ASP C 282 -75.938 2.005 67.871 1.00 40.00 C
+ATOM 5175 OD1 ASP C 282 -74.758 1.763 68.210 1.00 40.00 O
+ATOM 5176 OD2 ASP C 282 -76.305 3.150 67.537 1.00 40.00 O
+ATOM 5177 N ASP C 283 -78.078 -2.041 67.298 1.00 40.00 N
+ATOM 5178 CA ASP C 283 -79.117 -3.084 67.451 1.00 40.00 C
+ATOM 5179 C ASP C 283 -78.584 -4.368 68.073 1.00 40.00 C
+ATOM 5180 O ASP C 283 -79.273 -5.014 68.875 1.00 40.00 O
+ATOM 5181 CB ASP C 283 -79.784 -3.413 66.100 1.00 40.00 C
+ATOM 5182 CG ASP C 283 -80.613 -2.247 65.544 1.00 40.00 C
+ATOM 5183 OD1 ASP C 283 -81.178 -1.462 66.342 1.00 40.00 O
+ATOM 5184 OD2 ASP C 283 -80.704 -2.116 64.300 1.00 40.00 O
+ATOM 5185 N ILE C 284 -77.355 -4.718 67.692 1.00 40.00 N
+ATOM 5186 CA ILE C 284 -76.654 -5.892 68.212 1.00 40.00 C
+ATOM 5187 C ILE C 284 -76.160 -5.655 69.640 1.00 40.00 C
+ATOM 5188 O ILE C 284 -76.125 -6.581 70.462 1.00 40.00 O
+ATOM 5189 CB ILE C 284 -75.477 -6.289 67.287 1.00 40.00 C
+ATOM 5190 CG1 ILE C 284 -75.974 -6.535 65.854 1.00 40.00 C
+ATOM 5191 CG2 ILE C 284 -74.717 -7.501 67.818 1.00 40.00 C
+ATOM 5192 CD1 ILE C 284 -77.242 -7.360 65.741 1.00 40.00 C
+ATOM 5193 N MET C 285 -75.802 -4.406 69.932 1.00 40.00 N
+ATOM 5194 CA MET C 285 -75.251 -4.036 71.237 1.00 40.00 C
+ATOM 5195 C MET C 285 -76.310 -3.925 72.311 1.00 40.00 C
+ATOM 5196 O MET C 285 -76.042 -4.148 73.489 1.00 40.00 O
+ATOM 5197 CB MET C 285 -74.489 -2.722 71.129 1.00 40.00 C
+ATOM 5198 CG MET C 285 -73.222 -2.842 70.296 1.00 40.00 C
+ATOM 5199 SD MET C 285 -71.950 -3.864 71.075 1.00 40.00 S
+ATOM 5200 CE MET C 285 -71.399 -4.868 69.698 1.00 40.00 C
+ATOM 5201 N VAL C 286 -77.511 -3.570 71.879 1.00 40.00 N
+ATOM 5202 CA VAL C 286 -78.649 -3.421 72.761 1.00 40.00 C
+ATOM 5203 C VAL C 286 -78.923 -4.727 73.499 1.00 40.00 C
+ATOM 5204 O VAL C 286 -78.986 -4.734 74.735 1.00 40.00 O
+ATOM 5205 CB VAL C 286 -79.885 -2.929 71.973 1.00 40.00 C
+ATOM 5206 CG1 VAL C 286 -81.182 -3.218 72.721 1.00 40.00 C
+ATOM 5207 CG2 VAL C 286 -79.749 -1.438 71.674 1.00 40.00 C
+ATOM 5208 N SER C 287 -79.045 -5.823 72.744 1.00 40.00 N
+ATOM 5209 CA SER C 287 -79.365 -7.132 73.330 1.00 40.00 C
+ATOM 5210 C SER C 287 -78.245 -7.659 74.229 1.00 40.00 C
+ATOM 5211 O SER C 287 -78.520 -8.373 75.197 1.00 40.00 O
+ATOM 5212 CB SER C 287 -79.798 -8.173 72.271 1.00 40.00 C
+ATOM 5213 OG SER C 287 -78.784 -8.436 71.319 1.00 40.00 O
+ATOM 5214 N LEU C 288 -77.002 -7.281 73.918 1.00 40.00 N
+ATOM 5215 CA LEU C 288 -75.836 -7.654 74.729 1.00 40.00 C
+ATOM 5216 C LEU C 288 -75.752 -6.872 76.035 1.00 40.00 C
+ATOM 5217 O LEU C 288 -75.257 -7.395 77.041 1.00 40.00 O
+ATOM 5218 CB LEU C 288 -74.532 -7.464 73.946 1.00 40.00 C
+ATOM 5219 CG LEU C 288 -73.944 -8.643 73.165 1.00 40.00 C
+ATOM 5220 CD1 LEU C 288 -72.822 -8.153 72.265 1.00 40.00 C
+ATOM 5221 CD2 LEU C 288 -73.454 -9.764 74.079 1.00 40.00 C
+ATOM 5222 N ALA C 289 -76.221 -5.619 75.999 1.00 40.00 N
+ATOM 5223 CA ALA C 289 -76.168 -4.707 77.148 1.00 40.00 C
+ATOM 5224 C ALA C 289 -77.197 -5.087 78.212 1.00 40.00 C
+ATOM 5225 O ALA C 289 -76.830 -5.290 79.368 1.00 40.00 O
+ATOM 5226 CB ALA C 289 -76.346 -3.258 76.709 1.00 40.00 C
+ATOM 5227 N GLU C 290 -78.470 -5.199 77.819 1.00 40.00 N
+ATOM 5228 CA GLU C 290 -79.556 -5.609 78.725 1.00 40.00 C
+ATOM 5229 C GLU C 290 -79.351 -7.011 79.316 1.00 40.00 C
+ATOM 5230 O GLU C 290 -80.066 -7.389 80.243 1.00 40.00 O
+ATOM 5231 CB GLU C 290 -80.901 -5.530 78.002 1.00 40.00 C
+ATOM 5232 CG GLU C 290 -80.917 -6.309 76.686 1.00 40.00 C
+ATOM 5233 CD GLU C 290 -82.271 -6.330 75.987 1.00 40.00 C
+ATOM 5234 OE1 GLU C 290 -83.248 -6.824 76.590 1.00 40.00 O
+ATOM 5235 OE2 GLU C 290 -82.362 -5.880 74.819 1.00 40.00 O
+ATOM 5236 N LYS C 291 -78.394 -7.767 78.758 1.00 40.00 N
+ATOM 5237 CA LYS C 291 -77.908 -9.033 79.336 1.00 40.00 C
+ATOM 5238 C LYS C 291 -77.322 -8.849 80.720 1.00 40.00 C
+ATOM 5239 O LYS C 291 -77.598 -9.645 81.616 1.00 40.00 O
+ATOM 5240 CB LYS C 291 -76.820 -9.675 78.478 1.00 40.00 C
+ATOM 5241 CG LYS C 291 -77.331 -10.428 77.280 1.00 40.00 C
+ATOM 5242 CD LYS C 291 -78.345 -11.490 77.665 1.00 40.00 C
+ATOM 5243 CE LYS C 291 -78.957 -12.084 76.409 1.00 40.00 C
+ATOM 5244 NZ LYS C 291 -77.906 -12.452 75.414 1.00 40.00 N
+ATOM 5245 N ASP C 292 -76.482 -7.824 80.874 1.00 40.00 N
+ATOM 5246 CA ASP C 292 -75.886 -7.460 82.172 1.00 40.00 C
+ATOM 5247 C ASP C 292 -76.790 -6.492 82.982 1.00 40.00 C
+ATOM 5248 O ASP C 292 -76.403 -6.014 84.067 1.00 40.00 O
+ATOM 5249 CB ASP C 292 -74.483 -6.855 81.971 1.00 40.00 C
+ATOM 5250 CG ASP C 292 -73.524 -7.787 81.224 1.00 40.00 C
+ATOM 5251 OD1 ASP C 292 -73.969 -8.743 80.533 1.00 40.00 O
+ATOM 5252 OD2 ASP C 292 -72.300 -7.544 81.325 1.00 40.00 O
+ATOM 5253 N GLY C 293 -77.993 -6.234 82.448 1.00 40.00 N
+ATOM 5254 CA GLY C 293 -78.933 -5.240 82.980 1.00 40.00 C
+ATOM 5255 C GLY C 293 -78.596 -3.797 82.611 1.00 40.00 C
+ATOM 5256 O GLY C 293 -79.139 -2.867 83.212 1.00 40.00 O
+ATOM 5257 N ILE C 294 -77.715 -3.614 81.619 1.00 40.00 N
+ATOM 5258 CA ILE C 294 -77.146 -2.300 81.244 1.00 40.00 C
+ATOM 5259 C ILE C 294 -77.907 -1.643 80.081 1.00 40.00 C
+ATOM 5260 O ILE C 294 -78.306 -2.329 79.118 1.00 40.00 O
+ATOM 5261 CB ILE C 294 -75.635 -2.417 80.886 1.00 40.00 C
+ATOM 5262 CG1 ILE C 294 -74.832 -2.920 82.095 1.00 40.00 C
+ATOM 5263 CG2 ILE C 294 -75.072 -1.085 80.393 1.00 40.00 C
+ATOM 5264 CD1 ILE C 294 -73.423 -3.387 81.781 1.00 40.00 C
+ATOM 5265 N ASP C 295 -78.125 -0.325 80.184 1.00 40.00 N
+ATOM 5266 CA ASP C 295 -78.639 0.445 79.044 1.00 40.00 C
+ATOM 5267 C ASP C 295 -77.494 0.912 78.160 1.00 40.00 C
+ATOM 5268 O ASP C 295 -76.577 1.613 78.614 1.00 40.00 O
+ATOM 5269 CB ASP C 295 -79.511 1.633 79.446 1.00 40.00 C
+ATOM 5270 CG ASP C 295 -79.899 2.501 78.244 1.00 40.00 C
+ATOM 5271 OD1 ASP C 295 -80.288 3.665 78.437 1.00 40.00 O
+ATOM 5272 OD2 ASP C 295 -79.808 2.034 77.092 1.00 40.00 O
+ATOM 5273 N TRP C 296 -77.600 0.534 76.885 1.00 40.00 N
+ATOM 5274 CA TRP C 296 -76.529 0.648 75.898 1.00 40.00 C
+ATOM 5275 C TRP C 296 -76.038 2.056 75.666 1.00 40.00 C
+ATOM 5276 O TRP C 296 -74.839 2.331 75.760 1.00 40.00 O
+ATOM 5277 CB TRP C 296 -76.950 -0.047 74.595 1.00 40.00 C
+ATOM 5278 CG TRP C 296 -76.084 0.291 73.410 1.00 40.00 C
+ATOM 5279 CD1 TRP C 296 -76.497 0.815 72.192 1.00 40.00 C
+ATOM 5280 CD2 TRP C 296 -74.615 0.162 73.290 1.00 40.00 C
+ATOM 5281 NE1 TRP C 296 -75.424 1.004 71.347 1.00 40.00 N
+ATOM 5282 CE2 TRP C 296 -74.270 0.640 71.941 1.00 40.00 C
+ATOM 5283 CE3 TRP C 296 -73.598 -0.285 74.126 1.00 40.00 C
+ATOM 5284 CZ2 TRP C 296 -72.963 0.660 71.475 1.00 40.00 C
+ATOM 5285 CZ3 TRP C 296 -72.284 -0.258 73.646 1.00 40.00 C
+ATOM 5286 CH2 TRP C 296 -71.977 0.204 72.352 1.00 40.00 C
+ATOM 5287 N PHE C 297 -76.956 2.968 75.389 1.00 40.00 N
+ATOM 5288 CA PHE C 297 -76.564 4.311 74.989 1.00 40.00 C
+ATOM 5289 C PHE C 297 -75.797 5.018 76.101 1.00 40.00 C
+ATOM 5290 O PHE C 297 -74.883 5.790 75.832 1.00 40.00 O
+ATOM 5291 CB PHE C 297 -77.775 5.096 74.459 1.00 40.00 C
+ATOM 5292 CG PHE C 297 -78.383 4.482 73.216 1.00 40.00 C
+ATOM 5293 CD1 PHE C 297 -79.366 3.481 73.317 1.00 40.00 C
+ATOM 5294 CD2 PHE C 297 -77.945 4.862 71.947 1.00 40.00 C
+ATOM 5295 CE1 PHE C 297 -79.909 2.892 72.182 1.00 40.00 C
+ATOM 5296 CE2 PHE C 297 -78.488 4.275 70.812 1.00 40.00 C
+ATOM 5297 CZ PHE C 297 -79.470 3.291 70.929 1.00 40.00 C
+ATOM 5298 N ASP C 298 -76.121 4.692 77.345 1.00 40.00 N
+ATOM 5299 CA ASP C 298 -75.425 5.275 78.487 1.00 40.00 C
+ATOM 5300 C ASP C 298 -74.037 4.700 78.667 1.00 40.00 C
+ATOM 5301 O ASP C 298 -73.134 5.366 79.176 1.00 40.00 O
+ATOM 5302 CB ASP C 298 -76.243 5.069 79.750 1.00 40.00 C
+ATOM 5303 CG ASP C 298 -77.633 5.645 79.630 1.00 40.00 C
+ATOM 5304 OD1 ASP C 298 -78.258 5.871 80.683 1.00 40.00 O
+ATOM 5305 OD2 ASP C 298 -78.098 5.878 78.487 1.00 40.00 O
+ATOM 5306 N TYR C 299 -73.887 3.449 78.252 1.00 40.00 N
+ATOM 5307 CA TYR C 299 -72.596 2.796 78.245 1.00 40.00 C
+ATOM 5308 C TYR C 299 -71.802 3.322 77.057 1.00 40.00 C
+ATOM 5309 O TYR C 299 -70.592 3.506 77.144 1.00 40.00 O
+ATOM 5310 CB TYR C 299 -72.767 1.267 78.196 1.00 40.00 C
+ATOM 5311 CG TYR C 299 -71.513 0.469 78.519 1.00 40.00 C
+ATOM 5312 CD1 TYR C 299 -70.975 0.447 79.816 1.00 40.00 C
+ATOM 5313 CD2 TYR C 299 -70.870 -0.282 77.536 1.00 40.00 C
+ATOM 5314 CE1 TYR C 299 -69.820 -0.285 80.112 1.00 40.00 C
+ATOM 5315 CE2 TYR C 299 -69.720 -1.019 77.822 1.00 40.00 C
+ATOM 5316 CZ TYR C 299 -69.193 -1.022 79.106 1.00 40.00 C
+ATOM 5317 OH TYR C 299 -68.049 -1.754 79.383 1.00 40.00 O
+ATOM 5318 N LYS C 300 -72.504 3.588 75.958 1.00 40.00 N
+ATOM 5319 CA LYS C 300 -71.893 4.160 74.763 1.00 40.00 C
+ATOM 5320 C LYS C 300 -71.293 5.514 75.120 1.00 40.00 C
+ATOM 5321 O LYS C 300 -70.075 5.682 75.112 1.00 40.00 O
+ATOM 5322 CB LYS C 300 -72.929 4.300 73.638 1.00 40.00 C
+ATOM 5323 CG LYS C 300 -72.372 4.849 72.327 1.00 40.00 C
+ATOM 5324 CD LYS C 300 -73.469 5.273 71.355 1.00 40.00 C
+ATOM 5325 CE LYS C 300 -73.722 4.232 70.277 1.00 40.00 C
+ATOM 5326 NZ LYS C 300 -74.698 4.706 69.248 1.00 40.00 N
+ATOM 5327 N LYS C 301 -72.162 6.463 75.449 1.00 40.00 N
+ATOM 5328 CA LYS C 301 -71.758 7.758 75.951 1.00 40.00 C
+ATOM 5329 C LYS C 301 -70.460 7.633 76.698 1.00 40.00 C
+ATOM 5330 O LYS C 301 -69.474 8.258 76.345 1.00 40.00 O
+ATOM 5331 CB LYS C 301 -72.812 8.268 76.913 1.00 40.00 C
+ATOM 5332 CG LYS C 301 -74.047 8.816 76.234 1.00 40.00 C
+ATOM 5333 CD LYS C 301 -75.269 8.728 77.144 1.00 40.00 C
+ATOM 5334 CE LYS C 301 -76.391 9.685 76.736 1.00 40.00 C
+ATOM 5335 NZ LYS C 301 -76.720 9.751 75.272 1.00 40.00 N
+ATOM 5336 N GLN C 302 -70.479 6.789 77.723 1.00 40.00 N
+ATOM 5337 CA GLN C 302 -69.367 6.618 78.656 1.00 40.00 C
+ATOM 5338 C GLN C 302 -68.060 6.243 77.971 1.00 40.00 C
+ATOM 5339 O GLN C 302 -67.000 6.800 78.267 1.00 40.00 O
+ATOM 5340 CB GLN C 302 -69.739 5.568 79.703 1.00 40.00 C
+ATOM 5341 CG GLN C 302 -68.645 5.240 80.708 1.00 40.00 C
+ATOM 5342 CD GLN C 302 -68.967 3.996 81.524 1.00 40.00 C
+ATOM 5343 OE1 GLN C 302 -68.173 3.045 81.582 1.00 40.00 O
+ATOM 5344 NE2 GLN C 302 -70.143 3.987 82.151 1.00 40.00 N
+ATOM 5345 N LEU C 303 -68.138 5.293 77.055 1.00 40.00 N
+ATOM 5346 CA LEU C 303 -66.959 4.894 76.319 1.00 40.00 C
+ATOM 5347 C LEU C 303 -66.486 6.087 75.538 1.00 40.00 C
+ATOM 5348 O LEU C 303 -65.291 6.361 75.485 1.00 40.00 O
+ATOM 5349 CB LEU C 303 -67.268 3.735 75.378 1.00 40.00 C
+ATOM 5350 CG LEU C 303 -67.821 2.483 76.057 1.00 40.00 C
+ATOM 5351 CD1 LEU C 303 -68.639 1.688 75.062 1.00 40.00 C
+ATOM 5352 CD2 LEU C 303 -66.725 1.625 76.675 1.00 40.00 C
+ATOM 5353 N LYS C 304 -67.438 6.811 74.952 1.00 40.00 N
+ATOM 5354 CA LYS C 304 -67.100 7.991 74.175 1.00 40.00 C
+ATOM 5355 C LYS C 304 -66.335 8.961 75.050 1.00 40.00 C
+ATOM 5356 O LYS C 304 -65.245 9.385 74.673 1.00 40.00 O
+ATOM 5357 CB LYS C 304 -68.334 8.649 73.560 1.00 40.00 C
+ATOM 5358 CG LYS C 304 -68.934 7.832 72.431 1.00 40.00 C
+ATOM 5359 CD LYS C 304 -70.144 8.504 71.800 1.00 40.00 C
+ATOM 5360 CE LYS C 304 -69.834 9.105 70.436 1.00 40.00 C
+ATOM 5361 NZ LYS C 304 -71.088 9.574 69.780 1.00 40.00 N
+ATOM 5362 N ARG C 305 -66.876 9.281 76.228 1.00 40.00 N
+ATOM 5363 CA ARG C 305 -66.153 10.131 77.177 1.00 40.00 C
+ATOM 5364 C ARG C 305 -64.757 9.579 77.397 1.00 40.00 C
+ATOM 5365 O ARG C 305 -63.800 10.333 77.500 1.00 40.00 O
+ATOM 5366 CB ARG C 305 -66.892 10.287 78.508 1.00 40.00 C
+ATOM 5367 CG ARG C 305 -67.678 11.593 78.647 1.00 40.00 C
+ATOM 5368 CD ARG C 305 -68.207 11.813 80.063 1.00 40.00 C
+ATOM 5369 NE ARG C 305 -69.324 10.919 80.409 1.00 40.00 N
+ATOM 5370 CZ ARG C 305 -69.232 9.807 81.154 1.00 40.00 C
+ATOM 5371 NH1 ARG C 305 -68.062 9.412 81.663 1.00 40.00 N
+ATOM 5372 NH2 ARG C 305 -70.323 9.077 81.394 1.00 40.00 N
+ATOM 5373 N GLY C 306 -64.637 8.258 77.425 1.00 40.00 N
+ATOM 5374 CA GLY C 306 -63.328 7.640 77.506 1.00 40.00 C
+ATOM 5375 C GLY C 306 -62.574 7.621 76.184 1.00 40.00 C
+ATOM 5376 O GLY C 306 -61.561 6.929 76.059 1.00 40.00 O
+ATOM 5377 N ASP C 307 -63.056 8.372 75.195 1.00 40.00 N
+ATOM 5378 CA ASP C 307 -62.476 8.369 73.851 1.00 40.00 C
+ATOM 5379 C ASP C 307 -62.372 6.957 73.317 1.00 40.00 C
+ATOM 5380 O ASP C 307 -61.621 6.712 72.383 1.00 40.00 O
+ATOM 5381 CB ASP C 307 -61.082 9.005 73.845 1.00 40.00 C
+ATOM 5382 CG ASP C 307 -61.084 10.448 74.330 1.00 40.00 C
+ATOM 5383 OD1 ASP C 307 -61.835 11.291 73.785 1.00 40.00 O
+ATOM 5384 OD2 ASP C 307 -60.306 10.754 75.254 1.00 40.00 O
+ATOM 5385 N GLN C 308 -63.114 6.034 73.930 1.00 40.00 N
+ATOM 5386 CA GLN C 308 -63.027 4.601 73.617 1.00 40.00 C
+ATOM 5387 C GLN C 308 -63.980 4.208 72.484 1.00 40.00 C
+ATOM 5388 O GLN C 308 -63.879 3.113 71.940 1.00 40.00 O
+ATOM 5389 CB GLN C 308 -63.216 3.734 74.885 1.00 40.00 C
+ATOM 5390 CG GLN C 308 -61.956 3.664 75.762 1.00 40.00 C
+ATOM 5391 CD GLN C 308 -62.126 2.913 77.081 1.00 40.00 C
+ATOM 5392 OE1 GLN C 308 -62.191 1.691 77.121 1.00 40.00 O
+ATOM 5393 NE2 GLN C 308 -62.144 3.652 78.171 1.00 40.00 N
+ATOM 5394 N TRP C 309 -64.867 5.132 72.111 1.00 40.00 N
+ATOM 5395 CA TRP C 309 -65.828 4.942 71.016 1.00 40.00 C
+ATOM 5396 C TRP C 309 -65.759 6.118 70.100 1.00 40.00 C
+ATOM 5397 O TRP C 309 -65.982 7.262 70.524 1.00 40.00 O
+ATOM 5398 CB TRP C 309 -67.226 4.833 71.584 1.00 40.00 C
+ATOM 5399 CG TRP C 309 -68.287 4.382 70.620 1.00 40.00 C
+ATOM 5400 CD1 TRP C 309 -69.164 5.170 69.891 1.00 40.00 C
+ATOM 5401 CD2 TRP C 309 -68.651 3.005 70.297 1.00 40.00 C
+ATOM 5402 NE1 TRP C 309 -70.015 4.396 69.152 1.00 40.00 N
+ATOM 5403 CE2 TRP C 309 -69.759 3.085 69.350 1.00 40.00 C
+ATOM 5404 CE3 TRP C 309 -68.179 1.759 70.680 1.00 40.00 C
+ATOM 5405 CZ2 TRP C 309 -70.355 1.948 68.815 1.00 40.00 C
+ATOM 5406 CZ3 TRP C 309 -68.785 0.624 70.137 1.00 40.00 C
+ATOM 5407 CH2 TRP C 309 -69.846 0.716 69.226 1.00 40.00 C
+ATOM 5408 N ASN C 310 -65.440 5.846 68.835 1.00 40.00 N
+ATOM 5409 CA ASN C 310 -65.100 6.901 67.875 1.00 40.00 C
+ATOM 5410 C ASN C 310 -65.665 6.677 66.461 1.00 40.00 C
+ATOM 5411 O ASN C 310 -65.361 5.679 65.803 1.00 40.00 O
+ATOM 5412 CB ASN C 310 -63.578 7.129 67.843 1.00 40.00 C
+ATOM 5413 CG ASN C 310 -62.955 7.228 69.243 1.00 40.00 C
+ATOM 5414 OD1 ASN C 310 -63.358 8.044 70.084 1.00 40.00 O
+ATOM 5415 ND2 ASN C 310 -61.954 6.394 69.488 1.00 40.00 N
+ATOM 5416 N VAL C 311 -66.472 7.636 66.003 1.00 40.00 N
+ATOM 5417 CA VAL C 311 -67.351 7.446 64.851 1.00 40.00 C
+ATOM 5418 C VAL C 311 -67.171 8.507 63.762 1.00 40.00 C
+ATOM 5419 O VAL C 311 -67.185 9.709 64.034 1.00 40.00 O
+ATOM 5420 CB VAL C 311 -68.831 7.421 65.286 1.00 40.00 C
+ATOM 5421 CG1 VAL C 311 -69.731 7.059 64.118 1.00 40.00 C
+ATOM 5422 CG2 VAL C 311 -69.048 6.432 66.421 1.00 40.00 C
+ATOM 5423 N GLU C 312 -67.039 8.031 62.525 1.00 40.00 N
+ATOM 5424 CA GLU C 312 -66.745 8.851 61.356 1.00 40.00 C
+ATOM 5425 C GLU C 312 -67.498 8.262 60.178 1.00 40.00 C
+ATOM 5426 O GLU C 312 -66.919 7.510 59.399 1.00 40.00 O
+ATOM 5427 CB GLU C 312 -65.249 8.760 61.058 1.00 40.00 C
+ATOM 5428 CG GLU C 312 -64.717 9.626 59.923 1.00 40.00 C
+ATOM 5429 CD GLU C 312 -63.878 10.797 60.420 1.00 40.00 C
+ATOM 5430 OE1 GLU C 312 -64.374 11.541 61.312 1.00 40.00 O
+ATOM 5431 OE2 GLU C 312 -62.729 10.975 59.919 1.00 40.00 O
+ATOM 5432 N VAL C 313 -68.783 8.591 60.044 1.00 40.00 N
+ATOM 5433 CA VAL C 313 -69.602 8.065 58.928 1.00 40.00 C
+ATOM 5434 C VAL C 313 -70.199 9.157 58.029 1.00 40.00 C
+ATOM 5435 O VAL C 313 -70.390 10.299 58.468 1.00 40.00 O
+ATOM 5436 CB VAL C 313 -70.717 7.106 59.401 1.00 40.00 C
+ATOM 5437 CG1 VAL C 313 -70.114 5.853 60.013 1.00 40.00 C
+ATOM 5438 CG2 VAL C 313 -71.653 7.795 60.381 1.00 40.00 C
+ATOM 5439 N TYR C 314 -70.487 8.803 56.774 1.00 40.00 N
+ATOM 5440 CA TYR C 314 -70.949 9.777 55.778 1.00 40.00 C
+ATOM 5441 C TYR C 314 -71.875 9.124 54.771 1.00 40.00 C
+ATOM 5442 O TYR C 314 -71.981 7.896 54.713 1.00 40.00 O
+ATOM 5443 CB TYR C 314 -69.760 10.453 55.053 1.00 40.00 C
+ATOM 5444 CG TYR C 314 -68.662 9.485 54.630 1.00 40.00 C
+ATOM 5445 CD1 TYR C 314 -68.664 8.888 53.360 1.00 40.00 C
+ATOM 5446 CD2 TYR C 314 -67.617 9.165 55.504 1.00 40.00 C
+ATOM 5447 CE1 TYR C 314 -67.660 7.993 52.983 1.00 40.00 C
+ATOM 5448 CE2 TYR C 314 -66.615 8.267 55.141 1.00 40.00 C
+ATOM 5449 CZ TYR C 314 -66.630 7.681 53.884 1.00 40.00 C
+ATOM 5450 OH TYR C 314 -65.621 6.791 53.546 1.00 40.00 O
+ATOM 5451 OXT TYR C 314 -72.521 9.829 53.997 1.00 40.00 O
+TER 5452 TYR C 314
+ATOM 5453 N ALA D 1 -35.462 -28.005 -0.988 1.00 40.00 N
+ATOM 5454 CA ALA D 1 -33.990 -27.743 -0.945 1.00 40.00 C
+ATOM 5455 C ALA D 1 -33.218 -28.950 -0.428 1.00 40.00 C
+ATOM 5456 O ALA D 1 -33.724 -29.706 0.392 1.00 40.00 O
+ATOM 5457 CB ALA D 1 -33.694 -26.520 -0.090 1.00 40.00 C
+ATOM 5458 N THR D 2 -31.994 -29.120 -0.922 1.00 40.00 N
+ATOM 5459 CA THR D 2 -31.100 -30.212 -0.507 1.00 40.00 C
+ATOM 5460 C THR D 2 -29.765 -29.585 -0.074 1.00 40.00 C
+ATOM 5461 O THR D 2 -29.266 -28.676 -0.736 1.00 40.00 O
+ATOM 5462 CB THR D 2 -30.903 -31.259 -1.646 1.00 40.00 C
+ATOM 5463 OG1 THR D 2 -32.164 -31.853 -1.982 1.00 40.00 O
+ATOM 5464 CG2 THR D 2 -29.919 -32.368 -1.256 1.00 40.00 C
+ATOM 5465 N TYR D 3 -29.203 -30.050 1.043 1.00 40.00 N
+ATOM 5466 CA TYR D 3 -27.958 -29.483 1.598 1.00 40.00 C
+ATOM 5467 C TYR D 3 -26.955 -30.580 1.968 1.00 40.00 C
+ATOM 5468 O TYR D 3 -27.344 -31.720 2.244 1.00 40.00 O
+ATOM 5469 CB TYR D 3 -28.236 -28.636 2.848 1.00 40.00 C
+ATOM 5470 CG TYR D 3 -29.403 -27.660 2.765 1.00 40.00 C
+ATOM 5471 CD1 TYR D 3 -30.726 -28.102 2.902 1.00 40.00 C
+ATOM 5472 CD2 TYR D 3 -29.188 -26.294 2.602 1.00 40.00 C
+ATOM 5473 CE1 TYR D 3 -31.792 -27.219 2.856 1.00 40.00 C
+ATOM 5474 CE2 TYR D 3 -30.253 -25.404 2.556 1.00 40.00 C
+ATOM 5475 CZ TYR D 3 -31.551 -25.875 2.683 1.00 40.00 C
+ATOM 5476 OH TYR D 3 -32.616 -25.006 2.639 1.00 40.00 O
+ATOM 5477 N ASN D 4 -25.668 -30.227 1.985 1.00 40.00 N
+ATOM 5478 CA ASN D 4 -24.608 -31.176 2.363 1.00 40.00 C
+ATOM 5479 C ASN D 4 -24.573 -31.469 3.866 1.00 40.00 C
+ATOM 5480 O ASN D 4 -24.685 -30.559 4.709 1.00 40.00 O
+ATOM 5481 CB ASN D 4 -23.215 -30.727 1.859 1.00 40.00 C
+ATOM 5482 CG ASN D 4 -22.081 -31.649 2.329 1.00 40.00 C
+ATOM 5483 OD1 ASN D 4 -22.086 -32.860 2.063 1.00 40.00 O
+ATOM 5484 ND2 ASN D 4 -21.100 -31.071 3.031 1.00 40.00 N
+ATOM 5485 N VAL D 5 -24.434 -32.758 4.177 1.00 40.00 N
+ATOM 5486 CA VAL D 5 -24.203 -33.210 5.547 1.00 40.00 C
+ATOM 5487 C VAL D 5 -22.988 -34.128 5.629 1.00 40.00 C
+ATOM 5488 O VAL D 5 -22.810 -35.045 4.822 1.00 40.00 O
+ATOM 5489 CB VAL D 5 -25.432 -33.895 6.181 1.00 40.00 C
+ATOM 5490 CG1 VAL D 5 -25.227 -34.060 7.688 1.00 40.00 C
+ATOM 5491 CG2 VAL D 5 -26.706 -33.103 5.892 1.00 40.00 C
+ATOM 5492 N LYS D 6 -22.165 -33.849 6.629 1.00 40.00 N
+ATOM 5493 CA LYS D 6 -20.899 -34.513 6.844 1.00 40.00 C
+ATOM 5494 C LYS D 6 -21.017 -35.171 8.196 1.00 40.00 C
+ATOM 5495 O LYS D 6 -21.233 -34.507 9.212 1.00 40.00 O
+ATOM 5496 CB LYS D 6 -19.775 -33.465 6.832 1.00 40.00 C
+ATOM 5497 CG LYS D 6 -18.365 -33.958 7.139 1.00 40.00 C
+ATOM 5498 CD LYS D 6 -17.336 -32.820 7.112 1.00 40.00 C
+ATOM 5499 CE LYS D 6 -17.121 -32.260 5.703 1.00 40.00 C
+ATOM 5500 NZ LYS D 6 -15.848 -31.501 5.550 1.00 40.00 N
+ATOM 5501 N LEU D 7 -20.901 -36.487 8.205 1.00 40.00 N
+ATOM 5502 CA LEU D 7 -21.063 -37.224 9.444 1.00 40.00 C
+ATOM 5503 C LEU D 7 -19.755 -37.759 9.957 1.00 40.00 C
+ATOM 5504 O LEU D 7 -19.040 -38.472 9.254 1.00 40.00 O
+ATOM 5505 CB LEU D 7 -22.052 -38.371 9.280 1.00 40.00 C
+ATOM 5506 CG LEU D 7 -23.491 -37.929 9.037 1.00 40.00 C
+ATOM 5507 CD1 LEU D 7 -24.351 -39.145 8.751 1.00 40.00 C
+ATOM 5508 CD2 LEU D 7 -24.030 -37.156 10.231 1.00 40.00 C
+ATOM 5509 N ILE D 8 -19.455 -37.414 11.199 1.00 40.00 N
+ATOM 5510 CA ILE D 8 -18.237 -37.878 11.822 1.00 40.00 C
+ATOM 5511 C ILE D 8 -18.625 -39.018 12.753 1.00 40.00 C
+ATOM 5512 O ILE D 8 -18.820 -38.842 13.968 1.00 40.00 O
+ATOM 5513 CB ILE D 8 -17.461 -36.737 12.528 1.00 40.00 C
+ATOM 5514 CG1 ILE D 8 -17.575 -35.431 11.720 1.00 40.00 C
+ATOM 5515 CG2 ILE D 8 -15.993 -37.127 12.709 1.00 40.00 C
+ATOM 5516 CD1 ILE D 8 -17.774 -34.185 12.566 1.00 40.00 C
+ATOM 5517 N THR D 9 -18.764 -40.190 12.141 1.00 40.00 N
+ATOM 5518 CA THR D 9 -19.029 -41.428 12.864 1.00 40.00 C
+ATOM 5519 C THR D 9 -17.766 -41.815 13.684 1.00 40.00 C
+ATOM 5520 O THR D 9 -16.693 -41.221 13.476 1.00 40.00 O
+ATOM 5521 CB THR D 9 -19.509 -42.548 11.894 1.00 40.00 C
+ATOM 5522 OG1 THR D 9 -18.392 -43.275 11.365 1.00 40.00 O
+ATOM 5523 CG2 THR D 9 -20.334 -41.954 10.733 1.00 40.00 C
+ATOM 5524 N PRO D 10 -17.882 -42.780 14.634 1.00 40.00 N
+ATOM 5525 CA PRO D 10 -16.682 -43.237 15.361 1.00 40.00 C
+ATOM 5526 C PRO D 10 -15.761 -44.047 14.445 1.00 40.00 C
+ATOM 5527 O PRO D 10 -14.647 -44.427 14.832 1.00 40.00 O
+ATOM 5528 CB PRO D 10 -17.253 -44.146 16.463 1.00 40.00 C
+ATOM 5529 CG PRO D 10 -18.717 -43.874 16.494 1.00 40.00 C
+ATOM 5530 CD PRO D 10 -19.081 -43.501 15.091 1.00 40.00 C
+ATOM 5531 N GLU D 11 -16.250 -44.302 13.233 1.00 40.00 N
+ATOM 5532 CA GLU D 11 -15.498 -44.999 12.201 1.00 40.00 C
+ATOM 5533 C GLU D 11 -15.266 -44.098 10.987 1.00 40.00 C
+ATOM 5534 O GLU D 11 -15.336 -44.546 9.835 1.00 40.00 O
+ATOM 5535 CB GLU D 11 -16.239 -46.263 11.803 1.00 40.00 C
+ATOM 5536 CG GLU D 11 -16.520 -47.176 12.981 1.00 40.00 C
+ATOM 5537 CD GLU D 11 -16.924 -48.562 12.534 1.00 40.00 C
+ATOM 5538 OE1 GLU D 11 -17.983 -48.686 11.877 1.00 40.00 O
+ATOM 5539 OE2 GLU D 11 -16.178 -49.523 12.834 1.00 40.00 O
+ATOM 5540 N GLY D 12 -14.997 -42.822 11.268 1.00 40.00 N
+ATOM 5541 CA GLY D 12 -14.643 -41.853 10.246 1.00 40.00 C
+ATOM 5542 C GLY D 12 -15.780 -41.038 9.661 1.00 40.00 C
+ATOM 5543 O GLY D 12 -16.967 -41.191 10.004 1.00 40.00 O
+ATOM 5544 N GLU D 13 -15.380 -40.174 8.741 1.00 40.00 N
+ATOM 5545 CA GLU D 13 -16.259 -39.198 8.137 1.00 40.00 C
+ATOM 5546 C GLU D 13 -16.964 -39.785 6.905 1.00 40.00 C
+ATOM 5547 O GLU D 13 -16.455 -40.721 6.284 1.00 40.00 O
+ATOM 5548 CB GLU D 13 -15.419 -37.966 7.776 1.00 40.00 C
+ATOM 5549 CG GLU D 13 -16.187 -36.661 7.613 1.00 40.00 C
+ATOM 5550 CD GLU D 13 -15.354 -35.597 6.916 1.00 40.00 C
+ATOM 5551 OE1 GLU D 13 -15.670 -35.274 5.740 1.00 40.00 O
+ATOM 5552 OE2 GLU D 13 -14.380 -35.101 7.539 1.00 40.00 O
+ATOM 5553 N VAL D 14 -18.144 -39.247 6.584 1.00 40.00 N
+ATOM 5554 CA VAL D 14 -18.858 -39.553 5.335 1.00 40.00 C
+ATOM 5555 C VAL D 14 -19.938 -38.494 5.058 1.00 40.00 C
+ATOM 5556 O VAL D 14 -20.680 -38.083 5.959 1.00 40.00 O
+ATOM 5557 CB VAL D 14 -19.414 -41.005 5.304 1.00 40.00 C
+ATOM 5558 CG1 VAL D 14 -20.356 -41.269 6.477 1.00 40.00 C
+ATOM 5559 CG2 VAL D 14 -20.061 -41.319 3.958 1.00 40.00 C
+ATOM 5560 N GLU D 15 -20.000 -38.040 3.811 1.00 40.00 N
+ATOM 5561 CA GLU D 15 -20.914 -36.962 3.443 1.00 40.00 C
+ATOM 5562 C GLU D 15 -22.038 -37.474 2.566 1.00 40.00 C
+ATOM 5563 O GLU D 15 -21.991 -38.614 2.106 1.00 40.00 O
+ATOM 5564 CB GLU D 15 -20.168 -35.817 2.749 1.00 40.00 C
+ATOM 5565 CG GLU D 15 -19.062 -35.181 3.588 1.00 40.00 C
+ATOM 5566 CD GLU D 15 -18.267 -34.130 2.824 1.00 40.00 C
+ATOM 5567 OE1 GLU D 15 -17.016 -34.205 2.846 1.00 40.00 O
+ATOM 5568 OE2 GLU D 15 -18.888 -33.231 2.199 1.00 40.00 O
+ATOM 5569 N LEU D 16 -23.041 -36.623 2.347 1.00 40.00 N
+ATOM 5570 CA LEU D 16 -24.273 -37.025 1.671 1.00 40.00 C
+ATOM 5571 C LEU D 16 -25.290 -35.900 1.540 1.00 40.00 C
+ATOM 5572 O LEU D 16 -25.238 -34.910 2.271 1.00 40.00 O
+ATOM 5573 CB LEU D 16 -24.935 -38.168 2.431 1.00 40.00 C
+ATOM 5574 CG LEU D 16 -25.333 -37.858 3.880 1.00 40.00 C
+ATOM 5575 CD1 LEU D 16 -26.649 -38.555 4.225 1.00 40.00 C
+ATOM 5576 CD2 LEU D 16 -24.214 -38.227 4.860 1.00 40.00 C
+ATOM 5577 N GLN D 17 -26.244 -36.099 0.636 1.00 40.00 N
+ATOM 5578 CA GLN D 17 -27.202 -35.062 0.273 1.00 40.00 C
+ATOM 5579 C GLN D 17 -28.566 -35.289 0.897 1.00 40.00 C
+ATOM 5580 O GLN D 17 -29.179 -36.339 0.686 1.00 40.00 O
+ATOM 5581 CB GLN D 17 -27.326 -34.976 -1.255 1.00 40.00 C
+ATOM 5582 CG GLN D 17 -26.062 -34.470 -1.927 1.00 40.00 C
+ATOM 5583 CD GLN D 17 -25.494 -33.236 -1.232 1.00 40.00 C
+ATOM 5584 OE1 GLN D 17 -24.355 -33.250 -0.750 1.00 40.00 O
+ATOM 5585 NE2 GLN D 17 -26.296 -32.167 -1.158 1.00 40.00 N
+ATOM 5586 N VAL D 18 -29.044 -34.304 1.657 1.00 40.00 N
+ATOM 5587 CA VAL D 18 -30.330 -34.447 2.344 1.00 40.00 C
+ATOM 5588 C VAL D 18 -31.340 -33.338 2.054 1.00 40.00 C
+ATOM 5589 O VAL D 18 -31.102 -32.168 2.394 1.00 40.00 O
+ATOM 5590 CB VAL D 18 -30.170 -34.558 3.869 1.00 40.00 C
+ATOM 5591 CG1 VAL D 18 -31.451 -35.132 4.485 1.00 40.00 C
+ATOM 5592 CG2 VAL D 18 -28.945 -35.400 4.213 1.00 40.00 C
+ATOM 5593 N PRO D 19 -32.482 -33.710 1.437 1.00 40.00 N
+ATOM 5594 CA PRO D 19 -33.627 -32.795 1.249 1.00 40.00 C
+ATOM 5595 C PRO D 19 -34.182 -32.276 2.586 1.00 40.00 C
+ATOM 5596 O PRO D 19 -34.333 -33.067 3.528 1.00 40.00 O
+ATOM 5597 CB PRO D 19 -34.660 -33.672 0.522 1.00 40.00 C
+ATOM 5598 CG PRO D 19 -33.839 -34.715 -0.182 1.00 40.00 C
+ATOM 5599 CD PRO D 19 -32.672 -34.994 0.725 1.00 40.00 C
+ATOM 5600 N ASP D 20 -34.474 -30.971 2.655 1.00 40.00 N
+ATOM 5601 CA ASP D 20 -34.919 -30.295 3.906 1.00 40.00 C
+ATOM 5602 C ASP D 20 -36.309 -30.697 4.472 1.00 40.00 C
+ATOM 5603 O ASP D 20 -36.773 -30.117 5.478 1.00 40.00 O
+ATOM 5604 CB ASP D 20 -34.789 -28.749 3.795 1.00 40.00 C
+ATOM 5605 CG ASP D 20 -35.867 -28.085 2.879 1.00 40.00 C
+ATOM 5606 OD1 ASP D 20 -35.752 -26.857 2.662 1.00 40.00 O
+ATOM 5607 OD2 ASP D 20 -36.816 -28.743 2.377 1.00 40.00 O
+ATOM 5608 N ASP D 21 -36.944 -31.680 3.816 1.00 40.00 N
+ATOM 5609 CA ASP D 21 -38.240 -32.261 4.221 1.00 40.00 C
+ATOM 5610 C ASP D 21 -38.120 -33.722 4.685 1.00 40.00 C
+ATOM 5611 O ASP D 21 -39.118 -34.329 5.081 1.00 40.00 O
+ATOM 5612 CB ASP D 21 -39.281 -32.134 3.091 1.00 40.00 C
+ATOM 5613 CG ASP D 21 -38.698 -32.407 1.695 1.00 40.00 C
+ATOM 5614 OD1 ASP D 21 -37.603 -33.002 1.570 1.00 40.00 O
+ATOM 5615 OD2 ASP D 21 -39.348 -32.021 0.704 1.00 40.00 O
+ATOM 5616 N VAL D 22 -36.895 -34.260 4.640 1.00 40.00 N
+ATOM 5617 CA VAL D 22 -36.580 -35.625 5.062 1.00 40.00 C
+ATOM 5618 C VAL D 22 -35.696 -35.571 6.301 1.00 40.00 C
+ATOM 5619 O VAL D 22 -34.720 -34.827 6.346 1.00 40.00 O
+ATOM 5620 CB VAL D 22 -35.870 -36.428 3.935 1.00 40.00 C
+ATOM 5621 CG1 VAL D 22 -35.412 -37.798 4.430 1.00 40.00 C
+ATOM 5622 CG2 VAL D 22 -36.787 -36.592 2.725 1.00 40.00 C
+ATOM 5623 N TYR D 23 -36.055 -36.356 7.310 1.00 40.00 N
+ATOM 5624 CA TYR D 23 -35.212 -36.522 8.483 1.00 40.00 C
+ATOM 5625 C TYR D 23 -33.854 -37.067 8.097 1.00 40.00 C
+ATOM 5626 O TYR D 23 -33.723 -37.835 7.146 1.00 40.00 O
+ATOM 5627 CB TYR D 23 -35.854 -37.467 9.490 1.00 40.00 C
+ATOM 5628 CG TYR D 23 -37.118 -36.945 10.121 1.00 40.00 C
+ATOM 5629 CD1 TYR D 23 -38.349 -37.544 9.864 1.00 40.00 C
+ATOM 5630 CD2 TYR D 23 -37.087 -35.858 10.981 1.00 40.00 C
+ATOM 5631 CE1 TYR D 23 -39.510 -37.070 10.452 1.00 40.00 C
+ATOM 5632 CE2 TYR D 23 -38.240 -35.374 11.569 1.00 40.00 C
+ATOM 5633 CZ TYR D 23 -39.445 -35.980 11.305 1.00 40.00 C
+ATOM 5634 OH TYR D 23 -40.575 -35.478 11.901 1.00 40.00 O
+ATOM 5635 N ILE D 24 -32.849 -36.675 8.865 1.00 40.00 N
+ATOM 5636 CA ILE D 24 -31.455 -36.971 8.543 1.00 40.00 C
+ATOM 5637 C ILE D 24 -31.105 -38.467 8.576 1.00 40.00 C
+ATOM 5638 O ILE D 24 -30.468 -38.978 7.649 1.00 40.00 O
+ATOM 5639 CB ILE D 24 -30.484 -36.168 9.451 1.00 40.00 C
+ATOM 5640 CG1 ILE D 24 -30.558 -34.661 9.128 1.00 40.00 C
+ATOM 5641 CG2 ILE D 24 -29.050 -36.693 9.311 1.00 40.00 C
+ATOM 5642 CD1 ILE D 24 -30.128 -33.749 10.260 1.00 40.00 C
+ATOM 5643 N LEU D 25 -31.509 -39.151 9.649 1.00 40.00 N
+ATOM 5644 CA LEU D 25 -31.208 -40.580 9.845 1.00 40.00 C
+ATOM 5645 C LEU D 25 -31.864 -41.426 8.757 1.00 40.00 C
+ATOM 5646 O LEU D 25 -31.263 -42.402 8.290 1.00 40.00 O
+ATOM 5647 CB LEU D 25 -31.664 -41.037 11.237 1.00 40.00 C
+ATOM 5648 CG LEU D 25 -31.419 -42.468 11.725 1.00 40.00 C
+ATOM 5649 CD1 LEU D 25 -30.012 -42.638 12.271 1.00 40.00 C
+ATOM 5650 CD2 LEU D 25 -32.454 -42.809 12.791 1.00 40.00 C
+ATOM 5651 N ASP D 26 -33.089 -41.034 8.371 1.00 40.00 N
+ATOM 5652 CA ASP D 26 -33.819 -41.613 7.241 1.00 40.00 C
+ATOM 5653 C ASP D 26 -32.915 -41.732 6.025 1.00 40.00 C
+ATOM 5654 O ASP D 26 -32.703 -42.837 5.496 1.00 40.00 O
+ATOM 5655 CB ASP D 26 -35.032 -40.746 6.890 1.00 40.00 C
+ATOM 5656 CG ASP D 26 -36.116 -40.819 7.934 1.00 40.00 C
+ATOM 5657 OD1 ASP D 26 -35.968 -41.620 8.888 1.00 40.00 O
+ATOM 5658 OD2 ASP D 26 -37.120 -40.082 7.793 1.00 40.00 O
+ATOM 5659 N GLN D 27 -32.377 -40.586 5.601 1.00 40.00 N
+ATOM 5660 CA GLN D 27 -31.390 -40.520 4.521 1.00 40.00 C
+ATOM 5661 C GLN D 27 -30.182 -41.470 4.732 1.00 40.00 C
+ATOM 5662 O GLN D 27 -29.927 -42.350 3.896 1.00 40.00 O
+ATOM 5663 CB GLN D 27 -30.925 -39.072 4.335 1.00 40.00 C
+ATOM 5664 CG GLN D 27 -30.270 -38.802 2.996 1.00 40.00 C
+ATOM 5665 CD GLN D 27 -31.189 -39.139 1.849 1.00 40.00 C
+ATOM 5666 OE1 GLN D 27 -32.315 -38.633 1.766 1.00 40.00 O
+ATOM 5667 NE2 GLN D 27 -30.722 -40.009 0.960 1.00 40.00 N
+ATOM 5668 N ALA D 28 -29.471 -41.294 5.855 1.00 40.00 N
+ATOM 5669 CA ALA D 28 -28.270 -42.073 6.206 1.00 40.00 C
+ATOM 5670 C ALA D 28 -28.468 -43.556 5.970 1.00 40.00 C
+ATOM 5671 O ALA D 28 -27.605 -44.227 5.421 1.00 40.00 O
+ATOM 5672 CB ALA D 28 -27.885 -41.829 7.658 1.00 40.00 C
+ATOM 5673 N GLU D 29 -29.630 -44.040 6.386 1.00 40.00 N
+ATOM 5674 CA GLU D 29 -30.022 -45.430 6.252 1.00 40.00 C
+ATOM 5675 C GLU D 29 -30.128 -45.910 4.788 1.00 40.00 C
+ATOM 5676 O GLU D 29 -29.498 -46.910 4.438 1.00 40.00 O
+ATOM 5677 CB GLU D 29 -31.340 -45.626 6.992 1.00 40.00 C
+ATOM 5678 CG GLU D 29 -31.734 -47.058 7.294 1.00 40.00 C
+ATOM 5679 CD GLU D 29 -33.203 -47.154 7.665 1.00 40.00 C
+ATOM 5680 OE1 GLU D 29 -33.816 -46.099 7.943 1.00 40.00 O
+ATOM 5681 OE2 GLU D 29 -33.757 -48.276 7.673 1.00 40.00 O
+ATOM 5682 N GLU D 30 -30.908 -45.217 3.943 1.00 40.00 N
+ATOM 5683 CA GLU D 30 -31.027 -45.583 2.505 1.00 40.00 C
+ATOM 5684 C GLU D 30 -29.698 -45.452 1.817 1.00 40.00 C
+ATOM 5685 O GLU D 30 -29.450 -46.112 0.803 1.00 40.00 O
+ATOM 5686 CB GLU D 30 -31.962 -44.666 1.742 1.00 40.00 C
+ATOM 5687 CG GLU D 30 -33.420 -44.830 2.039 1.00 40.00 C
+ATOM 5688 CD GLU D 30 -34.138 -43.576 1.635 1.00 40.00 C
+ATOM 5689 OE1 GLU D 30 -33.848 -43.103 0.510 1.00 40.00 O
+ATOM 5690 OE2 GLU D 30 -34.944 -43.052 2.443 1.00 40.00 O
+ATOM 5691 N ASP D 31 -28.868 -44.559 2.357 1.00 40.00 N
+ATOM 5692 CA ASP D 31 -27.512 -44.354 1.875 1.00 40.00 C
+ATOM 5693 C ASP D 31 -26.550 -45.344 2.526 1.00 40.00 C
+ATOM 5694 O ASP D 31 -25.332 -45.214 2.397 1.00 40.00 O
+ATOM 5695 CB ASP D 31 -27.083 -42.893 2.073 1.00 40.00 C
+ATOM 5696 CG ASP D 31 -27.815 -41.937 1.124 1.00 40.00 C
+ATOM 5697 OD1 ASP D 31 -28.789 -42.368 0.454 1.00 40.00 O
+ATOM 5698 OD2 ASP D 31 -27.422 -40.749 1.045 1.00 40.00 O
+ATOM 5699 N GLY D 32 -27.116 -46.335 3.214 1.00 40.00 N
+ATOM 5700 CA GLY D 32 -26.358 -47.479 3.714 1.00 40.00 C
+ATOM 5701 C GLY D 32 -25.488 -47.263 4.938 1.00 40.00 C
+ATOM 5702 O GLY D 32 -24.548 -48.036 5.180 1.00 40.00 O
+ATOM 5703 N ILE D 33 -25.802 -46.222 5.710 1.00 40.00 N
+ATOM 5704 CA ILE D 33 -25.006 -45.863 6.884 1.00 40.00 C
+ATOM 5705 C ILE D 33 -25.730 -46.315 8.156 1.00 40.00 C
+ATOM 5706 O ILE D 33 -26.948 -46.112 8.314 1.00 40.00 O
+ATOM 5707 CB ILE D 33 -24.643 -44.350 6.925 1.00 40.00 C
+ATOM 5708 CG1 ILE D 33 -24.297 -43.825 5.519 1.00 40.00 C
+ATOM 5709 CG2 ILE D 33 -23.466 -44.112 7.869 1.00 40.00 C
+ATOM 5710 CD1 ILE D 33 -24.632 -42.366 5.278 1.00 40.00 C
+ATOM 5711 N ASP D 34 -24.955 -46.952 9.036 1.00 40.00 N
+ATOM 5712 CA ASP D 34 -25.441 -47.504 10.301 1.00 40.00 C
+ATOM 5713 C ASP D 34 -25.234 -46.517 11.480 1.00 40.00 C
+ATOM 5714 O ASP D 34 -24.148 -46.444 12.076 1.00 40.00 O
+ATOM 5715 CB ASP D 34 -24.769 -48.869 10.563 1.00 40.00 C
+ATOM 5716 CG ASP D 34 -25.460 -49.688 11.665 1.00 40.00 C
+ATOM 5717 OD1 ASP D 34 -26.592 -49.350 12.086 1.00 40.00 O
+ATOM 5718 OD2 ASP D 34 -24.859 -50.691 12.109 1.00 40.00 O
+ATOM 5719 N LEU D 35 -26.290 -45.758 11.790 1.00 40.00 N
+ATOM 5720 CA LEU D 35 -26.304 -44.789 12.895 1.00 40.00 C
+ATOM 5721 C LEU D 35 -27.220 -45.285 13.997 1.00 40.00 C
+ATOM 5722 O LEU D 35 -28.292 -45.810 13.704 1.00 40.00 O
+ATOM 5723 CB LEU D 35 -26.829 -43.439 12.415 1.00 40.00 C
+ATOM 5724 CG LEU D 35 -26.151 -42.793 11.216 1.00 40.00 C
+ATOM 5725 CD1 LEU D 35 -26.983 -41.600 10.799 1.00 40.00 C
+ATOM 5726 CD2 LEU D 35 -24.732 -42.379 11.586 1.00 40.00 C
+ATOM 5727 N PRO D 36 -26.829 -45.086 15.268 1.00 40.00 N
+ATOM 5728 CA PRO D 36 -27.635 -45.625 16.359 1.00 40.00 C
+ATOM 5729 C PRO D 36 -29.022 -44.966 16.408 1.00 40.00 C
+ATOM 5730 O PRO D 36 -29.167 -43.807 15.996 1.00 40.00 O
+ATOM 5731 CB PRO D 36 -26.810 -45.285 17.602 1.00 40.00 C
+ATOM 5732 CG PRO D 36 -26.072 -44.049 17.220 1.00 40.00 C
+ATOM 5733 CD PRO D 36 -25.758 -44.202 15.758 1.00 40.00 C
+ATOM 5734 N TYR D 37 -30.017 -45.732 16.869 1.00 40.00 N
+ATOM 5735 CA TYR D 37 -31.418 -45.289 16.994 1.00 40.00 C
+ATOM 5736 C TYR D 37 -32.237 -46.232 17.871 1.00 40.00 C
+ATOM 5737 O TYR D 37 -31.779 -47.329 18.213 1.00 40.00 O
+ATOM 5738 CB TYR D 37 -32.107 -45.139 15.621 1.00 40.00 C
+ATOM 5739 CG TYR D 37 -32.334 -46.423 14.822 1.00 40.00 C
+ATOM 5740 CD1 TYR D 37 -31.271 -47.064 14.170 1.00 40.00 C
+ATOM 5741 CD2 TYR D 37 -33.614 -46.970 14.682 1.00 40.00 C
+ATOM 5742 CE1 TYR D 37 -31.464 -48.221 13.429 1.00 40.00 C
+ATOM 5743 CE2 TYR D 37 -33.822 -48.123 13.933 1.00 40.00 C
+ATOM 5744 CZ TYR D 37 -32.740 -48.745 13.309 1.00 40.00 C
+ATOM 5745 OH TYR D 37 -32.910 -49.896 12.559 1.00 40.00 O
+ATOM 5746 N SER D 38 -33.449 -45.794 18.221 1.00 40.00 N
+ATOM 5747 CA SER D 38 -34.385 -46.595 19.005 1.00 40.00 C
+ATOM 5748 C SER D 38 -35.825 -46.245 18.635 1.00 40.00 C
+ATOM 5749 O SER D 38 -36.444 -46.934 17.818 1.00 40.00 O
+ATOM 5750 CB SER D 38 -34.140 -46.385 20.506 1.00 40.00 C
+ATOM 5751 OG SER D 38 -34.786 -47.367 21.288 1.00 40.00 O
+ATOM 5752 N CYS D 39 -36.324 -45.158 19.229 1.00 40.00 N
+ATOM 5753 CA CYS D 39 -37.730 -44.741 19.153 1.00 40.00 C
+ATOM 5754 C CYS D 39 -38.129 -44.304 17.760 1.00 40.00 C
+ATOM 5755 O CYS D 39 -39.217 -44.632 17.263 1.00 40.00 O
+ATOM 5756 CB CYS D 39 -37.984 -43.574 20.117 1.00 40.00 C
+ATOM 5757 SG CYS D 39 -37.365 -41.965 19.544 1.00 40.00 S
+ATOM 5758 N ARG D 40 -37.229 -43.540 17.151 1.00 40.00 N
+ATOM 5759 CA ARG D 40 -37.478 -42.902 15.880 1.00 40.00 C
+ATOM 5760 C ARG D 40 -38.738 -42.063 15.967 1.00 40.00 C
+ATOM 5761 O ARG D 40 -39.567 -42.064 15.062 1.00 40.00 O
+ATOM 5762 CB ARG D 40 -37.559 -43.935 14.754 1.00 40.00 C
+ATOM 5763 CG ARG D 40 -36.222 -44.608 14.461 1.00 40.00 C
+ATOM 5764 CD ARG D 40 -36.386 -45.810 13.539 1.00 40.00 C
+ATOM 5765 NE ARG D 40 -36.719 -45.420 12.174 1.00 40.00 N
+ATOM 5766 CZ ARG D 40 -35.824 -45.218 11.217 1.00 40.00 C
+ATOM 5767 NH1 ARG D 40 -34.534 -45.372 11.474 1.00 40.00 N
+ATOM 5768 NH2 ARG D 40 -36.224 -44.857 10.007 1.00 40.00 N
+ATOM 5769 N ALA D 41 -38.879 -41.362 17.083 1.00 40.00 N
+ATOM 5770 CA ALA D 41 -39.955 -40.405 17.250 1.00 40.00 C
+ATOM 5771 C ALA D 41 -39.513 -39.287 18.186 1.00 40.00 C
+ATOM 5772 O ALA D 41 -40.335 -38.544 18.737 1.00 40.00 O
+ATOM 5773 CB ALA D 41 -41.221 -41.088 17.736 1.00 40.00 C
+ATOM 5774 N GLY D 42 -38.198 -39.187 18.357 1.00 40.00 N
+ATOM 5775 CA GLY D 42 -37.581 -38.012 18.949 1.00 40.00 C
+ATOM 5776 C GLY D 42 -37.859 -37.764 20.413 1.00 40.00 C
+ATOM 5777 O GLY D 42 -37.872 -36.624 20.873 1.00 40.00 O
+ATOM 5778 N SER D 43 -38.087 -38.818 21.167 1.00 40.00 N
+ATOM 5779 CA SER D 43 -38.162 -38.622 22.586 1.00 40.00 C
+ATOM 5780 C SER D 43 -37.345 -39.697 23.266 1.00 40.00 C
+ATOM 5781 O SER D 43 -37.779 -40.267 24.261 1.00 40.00 O
+ATOM 5782 CB SER D 43 -39.611 -38.598 23.068 1.00 40.00 C
+ATOM 5783 OG SER D 43 -40.169 -39.883 22.990 1.00 40.00 O
+ATOM 5784 N CYS D 44 -36.165 -39.980 22.711 1.00 40.00 N
+ATOM 5785 CA CYS D 44 -35.177 -40.867 23.360 1.00 40.00 C
+ATOM 5786 C CYS D 44 -33.755 -40.327 23.180 1.00 40.00 C
+ATOM 5787 O CYS D 44 -33.580 -39.162 22.805 1.00 40.00 O
+ATOM 5788 CB CYS D 44 -35.297 -42.320 22.872 1.00 40.00 C
+ATOM 5789 SG CYS D 44 -34.195 -42.765 21.510 1.00 40.00 S
+ATOM 5790 N SER D 45 -32.752 -41.167 23.437 1.00 40.00 N
+ATOM 5791 CA SER D 45 -31.367 -40.714 23.418 1.00 40.00 C
+ATOM 5792 C SER D 45 -30.437 -41.428 22.434 1.00 40.00 C
+ATOM 5793 O SER D 45 -29.278 -41.033 22.294 1.00 40.00 O
+ATOM 5794 CB SER D 45 -30.783 -40.806 24.822 1.00 40.00 C
+ATOM 5795 OG SER D 45 -30.887 -42.124 25.312 1.00 40.00 O
+ATOM 5796 N SER D 46 -30.942 -42.449 21.745 1.00 40.00 N
+ATOM 5797 CA SER D 46 -30.090 -43.369 20.973 1.00 40.00 C
+ATOM 5798 C SER D 46 -29.371 -42.757 19.790 1.00 40.00 C
+ATOM 5799 O SER D 46 -28.178 -43.002 19.594 1.00 40.00 O
+ATOM 5800 CB SER D 46 -30.900 -44.561 20.496 1.00 40.00 C
+ATOM 5801 OG SER D 46 -31.220 -45.408 21.586 1.00 40.00 O
+ATOM 5802 N CYS D 47 -30.109 -41.964 19.015 1.00 40.00 N
+ATOM 5803 CA CYS D 47 -29.601 -41.327 17.791 1.00 40.00 C
+ATOM 5804 C CYS D 47 -28.733 -40.083 18.034 1.00 40.00 C
+ATOM 5805 O CYS D 47 -28.312 -39.413 17.079 1.00 40.00 O
+ATOM 5806 CB CYS D 47 -30.767 -40.990 16.867 1.00 40.00 C
+ATOM 5807 SG CYS D 47 -32.074 -40.088 17.697 1.00 40.00 S
+ATOM 5808 N ALA D 48 -28.455 -39.815 19.313 1.00 40.00 N
+ATOM 5809 CA ALA D 48 -27.720 -38.639 19.769 1.00 40.00 C
+ATOM 5810 C ALA D 48 -26.500 -38.306 18.946 1.00 40.00 C
+ATOM 5811 O ALA D 48 -25.771 -39.174 18.461 1.00 40.00 O
+ATOM 5812 CB ALA D 48 -27.329 -38.777 21.230 1.00 40.00 C
+ATOM 5813 N GLY D 49 -26.302 -37.009 18.809 1.00 40.00 N
+ATOM 5814 CA GLY D 49 -25.183 -36.465 18.081 1.00 40.00 C
+ATOM 5815 C GLY D 49 -24.997 -35.007 18.441 1.00 40.00 C
+ATOM 5816 O GLY D 49 -25.828 -34.415 19.150 1.00 40.00 O
+ATOM 5817 N LYS D 50 -23.907 -34.426 17.940 1.00 40.00 N
+ATOM 5818 CA LYS D 50 -23.546 -33.038 18.254 1.00 40.00 C
+ATOM 5819 C LYS D 50 -23.358 -32.170 16.997 1.00 40.00 C
+ATOM 5820 O LYS D 50 -22.594 -32.544 16.098 1.00 40.00 O
+ATOM 5821 CB LYS D 50 -22.267 -32.997 19.117 1.00 40.00 C
+ATOM 5822 CG LYS D 50 -22.432 -33.498 20.548 1.00 40.00 C
+ATOM 5823 CD LYS D 50 -21.540 -32.723 21.501 1.00 40.00 C
+ATOM 5824 CE LYS D 50 -22.085 -31.326 21.724 1.00 40.00 C
+ATOM 5825 NZ LYS D 50 -21.109 -30.511 22.488 1.00 40.00 N
+ATOM 5826 N VAL D 51 -24.048 -31.023 16.946 1.00 40.00 N
+ATOM 5827 CA VAL D 51 -23.841 -30.035 15.880 1.00 40.00 C
+ATOM 5828 C VAL D 51 -22.471 -29.386 16.034 1.00 40.00 C
+ATOM 5829 O VAL D 51 -22.185 -28.787 17.072 1.00 40.00 O
+ATOM 5830 CB VAL D 51 -24.925 -28.931 15.872 1.00 40.00 C
+ATOM 5831 CG1 VAL D 51 -24.640 -27.886 14.792 1.00 40.00 C
+ATOM 5832 CG2 VAL D 51 -26.294 -29.551 15.662 1.00 40.00 C
+ATOM 5833 N VAL D 52 -21.629 -29.540 15.008 1.00 40.00 N
+ATOM 5834 CA VAL D 52 -20.333 -28.845 14.904 1.00 40.00 C
+ATOM 5835 C VAL D 52 -20.541 -27.494 14.175 1.00 40.00 C
+ATOM 5836 O VAL D 52 -19.970 -26.463 14.566 1.00 40.00 O
+ATOM 5837 CB VAL D 52 -19.254 -29.729 14.200 1.00 40.00 C
+ATOM 5838 CG1 VAL D 52 -17.900 -29.028 14.118 1.00 40.00 C
+ATOM 5839 CG2 VAL D 52 -19.104 -31.068 14.911 1.00 40.00 C
+ATOM 5840 N SER D 53 -21.385 -27.506 13.141 1.00 40.00 N
+ATOM 5841 CA SER D 53 -21.648 -26.329 12.328 1.00 40.00 C
+ATOM 5842 C SER D 53 -22.962 -26.503 11.605 1.00 40.00 C
+ATOM 5843 O SER D 53 -23.525 -27.593 11.585 1.00 40.00 O
+ATOM 5844 CB SER D 53 -20.527 -26.129 11.305 1.00 40.00 C
+ATOM 5845 OG SER D 53 -20.487 -27.198 10.377 1.00 40.00 O
+ATOM 5846 N GLY D 54 -23.440 -25.426 10.998 1.00 40.00 N
+ATOM 5847 CA GLY D 54 -24.700 -25.460 10.292 1.00 40.00 C
+ATOM 5848 C GLY D 54 -25.864 -25.582 11.252 1.00 40.00 C
+ATOM 5849 O GLY D 54 -25.683 -25.795 12.464 1.00 40.00 O
+ATOM 5850 N SER D 55 -27.062 -25.452 10.686 1.00 40.00 N
+ATOM 5851 CA SER D 55 -28.316 -25.423 11.447 1.00 40.00 C
+ATOM 5852 C SER D 55 -29.263 -26.588 11.094 1.00 40.00 C
+ATOM 5853 O SER D 55 -29.151 -27.193 10.010 1.00 40.00 O
+ATOM 5854 CB SER D 55 -29.028 -24.051 11.295 1.00 40.00 C
+ATOM 5855 OG SER D 55 -29.234 -23.669 9.940 1.00 40.00 O
+ATOM 5856 N VAL D 56 -30.166 -26.908 12.032 1.00 40.00 N
+ATOM 5857 CA VAL D 56 -31.234 -27.908 11.829 1.00 40.00 C
+ATOM 5858 C VAL D 56 -32.609 -27.465 12.382 1.00 40.00 C
+ATOM 5859 O VAL D 56 -32.698 -26.626 13.290 1.00 40.00 O
+ATOM 5860 CB VAL D 56 -30.869 -29.333 12.369 1.00 40.00 C
+ATOM 5861 CG1 VAL D 56 -29.465 -29.769 11.936 1.00 40.00 C
+ATOM 5862 CG2 VAL D 56 -31.056 -29.445 13.883 1.00 40.00 C
+ATOM 5863 N ASP D 57 -33.670 -28.033 11.803 1.00 40.00 N
+ATOM 5864 CA ASP D 57 -35.052 -27.858 12.277 1.00 40.00 C
+ATOM 5865 C ASP D 57 -35.521 -29.145 12.975 1.00 40.00 C
+ATOM 5866 O ASP D 57 -36.141 -30.035 12.361 1.00 40.00 O
+ATOM 5867 CB ASP D 57 -35.992 -27.454 11.114 1.00 40.00 C
+ATOM 5868 CG ASP D 57 -37.479 -27.453 11.506 1.00 40.00 C
+ATOM 5869 OD1 ASP D 57 -38.320 -27.548 10.583 1.00 40.00 O
+ATOM 5870 OD2 ASP D 57 -37.808 -27.364 12.717 1.00 40.00 O
+ATOM 5871 N GLN D 58 -35.202 -29.240 14.260 1.00 40.00 N
+ATOM 5872 CA GLN D 58 -35.620 -30.385 15.044 1.00 40.00 C
+ATOM 5873 C GLN D 58 -36.814 -30.027 15.923 1.00 40.00 C
+ATOM 5874 O GLN D 58 -36.955 -30.550 17.029 1.00 40.00 O
+ATOM 5875 CB GLN D 58 -34.453 -30.956 15.860 1.00 40.00 C
+ATOM 5876 CG GLN D 58 -33.647 -29.910 16.614 1.00 40.00 C
+ATOM 5877 CD GLN D 58 -32.558 -30.520 17.471 1.00 40.00 C
+ATOM 5878 OE1 GLN D 58 -31.707 -29.803 18.004 1.00 40.00 O
+ATOM 5879 NE2 GLN D 58 -32.580 -31.848 17.616 1.00 40.00 N
+ATOM 5880 N SER D 59 -37.665 -29.124 15.432 1.00 40.00 N
+ATOM 5881 CA SER D 59 -38.962 -28.897 16.065 1.00 40.00 C
+ATOM 5882 C SER D 59 -39.769 -30.177 15.880 1.00 40.00 C
+ATOM 5883 O SER D 59 -39.781 -30.767 14.782 1.00 40.00 O
+ATOM 5884 CB SER D 59 -39.693 -27.666 15.500 1.00 40.00 C
+ATOM 5885 OG SER D 59 -40.198 -27.888 14.194 1.00 40.00 O
+ATOM 5886 N ASP D 60 -40.389 -30.619 16.975 1.00 40.00 N
+ATOM 5887 CA ASP D 60 -41.091 -31.908 17.041 1.00 40.00 C
+ATOM 5888 C ASP D 60 -40.261 -33.064 17.661 1.00 40.00 C
+ATOM 5889 O ASP D 60 -40.617 -34.245 17.554 1.00 40.00 O
+ATOM 5890 CB ASP D 60 -41.649 -32.305 15.665 1.00 40.00 C
+ATOM 5891 CG ASP D 60 -42.980 -33.028 15.762 1.00 40.00 C
+ATOM 5892 OD1 ASP D 60 -43.526 -33.167 16.889 1.00 40.00 O
+ATOM 5893 OD2 ASP D 60 -43.486 -33.455 14.702 1.00 40.00 O
+ATOM 5894 N GLN D 61 -39.144 -32.722 18.290 1.00 40.00 N
+ATOM 5895 CA GLN D 61 -38.545 -33.624 19.249 1.00 40.00 C
+ATOM 5896 C GLN D 61 -39.126 -33.216 20.599 1.00 40.00 C
+ATOM 5897 O GLN D 61 -39.817 -32.192 20.710 1.00 40.00 O
+ATOM 5898 CB GLN D 61 -37.003 -33.578 19.218 1.00 40.00 C
+ATOM 5899 CG GLN D 61 -36.345 -32.313 19.774 1.00 40.00 C
+ATOM 5900 CD GLN D 61 -36.164 -32.307 21.293 1.00 40.00 C
+ATOM 5901 OE1 GLN D 61 -35.932 -33.350 21.914 1.00 40.00 O
+ATOM 5902 NE2 GLN D 61 -36.259 -31.119 21.896 1.00 40.00 N
+ATOM 5903 N SER D 62 -38.867 -34.023 21.617 1.00 40.00 N
+ATOM 5904 CA SER D 62 -39.357 -33.714 22.942 1.00 40.00 C
+ATOM 5905 C SER D 62 -38.394 -34.127 24.055 1.00 40.00 C
+ATOM 5906 O SER D 62 -38.605 -33.740 25.201 1.00 40.00 O
+ATOM 5907 CB SER D 62 -40.764 -34.299 23.157 1.00 40.00 C
+ATOM 5908 OG SER D 62 -40.920 -35.545 22.494 1.00 40.00 O
+ATOM 5909 N TYR D 63 -37.332 -34.871 23.728 1.00 40.00 N
+ATOM 5910 CA TYR D 63 -36.413 -35.418 24.752 1.00 40.00 C
+ATOM 5911 C TYR D 63 -35.429 -34.428 25.416 1.00 40.00 C
+ATOM 5912 O TYR D 63 -35.204 -34.476 26.635 1.00 40.00 O
+ATOM 5913 CB TYR D 63 -35.634 -36.604 24.182 1.00 40.00 C
+ATOM 5914 CG TYR D 63 -34.821 -37.348 25.219 1.00 40.00 C
+ATOM 5915 CD1 TYR D 63 -33.538 -36.924 25.566 1.00 40.00 C
+ATOM 5916 CD2 TYR D 63 -35.335 -38.478 25.860 1.00 40.00 C
+ATOM 5917 CE1 TYR D 63 -32.793 -37.607 26.522 1.00 40.00 C
+ATOM 5918 CE2 TYR D 63 -34.595 -39.176 26.806 1.00 40.00 C
+ATOM 5919 CZ TYR D 63 -33.329 -38.739 27.135 1.00 40.00 C
+ATOM 5920 OH TYR D 63 -32.610 -39.433 28.077 1.00 40.00 O
+ATOM 5921 N LEU D 64 -34.828 -33.557 24.610 1.00 40.00 N
+ATOM 5922 CA LEU D 64 -33.866 -32.571 25.106 1.00 40.00 C
+ATOM 5923 C LEU D 64 -34.530 -31.326 25.703 1.00 40.00 C
+ATOM 5924 O LEU D 64 -35.555 -30.849 25.199 1.00 40.00 O
+ATOM 5925 CB LEU D 64 -32.945 -32.125 23.970 1.00 40.00 C
+ATOM 5926 CG LEU D 64 -32.161 -33.161 23.166 1.00 40.00 C
+ATOM 5927 CD1 LEU D 64 -31.595 -32.503 21.912 1.00 40.00 C
+ATOM 5928 CD2 LEU D 64 -31.058 -33.779 24.015 1.00 40.00 C
+ATOM 5929 N ASP D 65 -33.937 -30.793 26.769 1.00 40.00 N
+ATOM 5930 CA ASP D 65 -34.296 -29.460 27.256 1.00 40.00 C
+ATOM 5931 C ASP D 65 -33.571 -28.421 26.402 1.00 40.00 C
+ATOM 5932 O ASP D 65 -32.741 -28.783 25.560 1.00 40.00 O
+ATOM 5933 CB ASP D 65 -33.950 -29.300 28.744 1.00 40.00 C
+ATOM 5934 CG ASP D 65 -32.466 -29.573 29.058 1.00 40.00 C
+ATOM 5935 OD1 ASP D 65 -31.571 -28.997 28.395 1.00 40.00 O
+ATOM 5936 OD2 ASP D 65 -32.193 -30.347 30.002 1.00 40.00 O
+ATOM 5937 N ASP D 66 -33.861 -27.140 26.624 1.00 40.00 N
+ATOM 5938 CA ASP D 66 -33.265 -26.064 25.807 1.00 40.00 C
+ATOM 5939 C ASP D 66 -31.749 -25.888 25.905 1.00 40.00 C
+ATOM 5940 O ASP D 66 -31.121 -25.478 24.926 1.00 40.00 O
+ATOM 5941 CB ASP D 66 -33.946 -24.730 26.086 1.00 40.00 C
+ATOM 5942 CG ASP D 66 -35.289 -24.624 25.417 1.00 40.00 C
+ATOM 5943 OD1 ASP D 66 -35.404 -25.086 24.253 1.00 40.00 O
+ATOM 5944 OD2 ASP D 66 -36.222 -24.073 26.052 1.00 40.00 O
+ATOM 5945 N GLY D 67 -31.188 -26.176 27.084 1.00 40.00 N
+ATOM 5946 CA GLY D 67 -29.741 -26.069 27.352 1.00 40.00 C
+ATOM 5947 C GLY D 67 -28.899 -27.117 26.645 1.00 40.00 C
+ATOM 5948 O GLY D 67 -27.695 -26.922 26.427 1.00 40.00 O
+ATOM 5949 N GLN D 68 -29.545 -28.236 26.309 1.00 40.00 N
+ATOM 5950 CA GLN D 68 -28.970 -29.281 25.460 1.00 40.00 C
+ATOM 5951 C GLN D 68 -29.053 -28.885 23.964 1.00 40.00 C
+ATOM 5952 O GLN D 68 -28.115 -29.145 23.201 1.00 40.00 O
+ATOM 5953 CB GLN D 68 -29.632 -30.645 25.756 1.00 40.00 C
+ATOM 5954 CG GLN D 68 -29.261 -31.232 27.128 1.00 40.00 C
+ATOM 5955 CD GLN D 68 -30.143 -32.398 27.609 1.00 40.00 C
+ATOM 5956 OE1 GLN D 68 -31.377 -32.386 27.468 1.00 40.00 O
+ATOM 5957 NE2 GLN D 68 -29.503 -33.401 28.216 1.00 40.00 N
+ATOM 5958 N ILE D 69 -30.163 -28.246 23.566 1.00 40.00 N
+ATOM 5959 CA ILE D 69 -30.319 -27.606 22.231 1.00 40.00 C
+ATOM 5960 C ILE D 69 -29.362 -26.417 22.078 1.00 40.00 C
+ATOM 5961 O ILE D 69 -28.738 -26.220 21.017 1.00 40.00 O
+ATOM 5962 CB ILE D 69 -31.770 -27.096 22.000 1.00 40.00 C
+ATOM 5963 CG1 ILE D 69 -32.725 -28.280 21.796 1.00 40.00 C
+ATOM 5964 CG2 ILE D 69 -31.849 -26.107 20.826 1.00 40.00 C
+ATOM 5965 CD1 ILE D 69 -34.171 -27.979 22.148 1.00 40.00 C
+ATOM 5966 N CYS D 70 -29.283 -25.623 23.148 1.00 40.00 N
+ATOM 5967 CA CYS D 70 -28.295 -24.564 23.286 1.00 40.00 C
+ATOM 5968 C CYS D 70 -26.883 -25.112 23.172 1.00 40.00 C
+ATOM 5969 O CYS D 70 -25.992 -24.451 22.632 1.00 40.00 O
+ATOM 5970 CB CYS D 70 -28.456 -23.862 24.636 1.00 20.00 C
+ATOM 5971 SG CYS D 70 -28.825 -22.076 24.577 1.00 20.00 S
+ATOM 5972 N ASP D 71 -26.691 -26.325 23.679 1.00 40.00 N
+ATOM 5973 CA ASP D 71 -25.388 -26.972 23.630 1.00 40.00 C
+ATOM 5974 C ASP D 71 -25.141 -27.729 22.312 1.00 40.00 C
+ATOM 5975 O ASP D 71 -24.165 -28.479 22.196 1.00 40.00 O
+ATOM 5976 CB ASP D 71 -25.195 -27.887 24.850 1.00 40.00 C
+ATOM 5977 CG ASP D 71 -23.798 -27.766 25.468 1.00 40.00 C
+ATOM 5978 OD1 ASP D 71 -23.116 -26.726 25.251 1.00 40.00 O
+ATOM 5979 OD2 ASP D 71 -23.386 -28.710 26.183 1.00 40.00 O
+ATOM 5980 N GLY D 72 -26.016 -27.523 21.325 1.00 40.00 N
+ATOM 5981 CA GLY D 72 -25.837 -28.095 19.981 1.00 40.00 C
+ATOM 5982 C GLY D 72 -26.086 -29.593 19.873 1.00 40.00 C
+ATOM 5983 O GLY D 72 -25.733 -30.221 18.863 1.00 40.00 O
+ATOM 5984 N TRP D 73 -26.684 -30.165 20.920 1.00 40.00 N
+ATOM 5985 CA TRP D 73 -27.124 -31.549 20.901 1.00 40.00 C
+ATOM 5986 C TRP D 73 -28.241 -31.708 19.918 1.00 40.00 C
+ATOM 5987 O TRP D 73 -29.040 -30.787 19.720 1.00 40.00 O
+ATOM 5988 CB TRP D 73 -27.605 -31.969 22.279 1.00 40.00 C
+ATOM 5989 CG TRP D 73 -26.497 -32.374 23.215 1.00 40.00 C
+ATOM 5990 CD1 TRP D 73 -26.015 -31.669 24.312 1.00 40.00 C
+ATOM 5991 CD2 TRP D 73 -25.691 -33.611 23.169 1.00 40.00 C
+ATOM 5992 NE1 TRP D 73 -24.999 -32.361 24.930 1.00 40.00 N
+ATOM 5993 CE2 TRP D 73 -24.752 -33.529 24.299 1.00 40.00 C
+ATOM 5994 CE3 TRP D 73 -25.656 -34.737 22.338 1.00 40.00 C
+ATOM 5995 CZ2 TRP D 73 -23.827 -34.533 24.564 1.00 40.00 C
+ATOM 5996 CZ3 TRP D 73 -24.719 -35.743 22.617 1.00 40.00 C
+ATOM 5997 CH2 TRP D 73 -23.825 -35.638 23.701 1.00 40.00 C
+ATOM 5998 N VAL D 74 -28.316 -32.882 19.298 1.00 40.00 N
+ATOM 5999 CA VAL D 74 -29.358 -33.146 18.310 1.00 40.00 C
+ATOM 6000 C VAL D 74 -29.842 -34.607 18.281 1.00 40.00 C
+ATOM 6001 O VAL D 74 -29.062 -35.560 18.462 1.00 40.00 O
+ATOM 6002 CB VAL D 74 -28.927 -32.656 16.902 1.00 40.00 C
+ATOM 6003 CG1 VAL D 74 -27.600 -33.284 16.482 1.00 40.00 C
+ATOM 6004 CG2 VAL D 74 -30.024 -32.895 15.868 1.00 40.00 C
+ATOM 6005 N LEU D 75 -31.149 -34.753 18.069 1.00 40.00 N
+ATOM 6006 CA LEU D 75 -31.757 -36.046 17.785 1.00 40.00 C
+ATOM 6007 C LEU D 75 -31.869 -36.253 16.280 1.00 40.00 C
+ATOM 6008 O LEU D 75 -32.652 -35.582 15.583 1.00 40.00 O
+ATOM 6009 CB LEU D 75 -33.117 -36.191 18.482 1.00 40.00 C
+ATOM 6010 CG LEU D 75 -33.048 -36.415 20.006 1.00 40.00 C
+ATOM 6011 CD1 LEU D 75 -34.420 -36.748 20.597 1.00 40.00 C
+ATOM 6012 CD2 LEU D 75 -32.004 -37.471 20.389 1.00 40.00 C
+ATOM 6013 N THR D 76 -31.053 -37.183 15.796 1.00 40.00 N
+ATOM 6014 CA THR D 76 -30.929 -37.444 14.380 1.00 40.00 C
+ATOM 6015 C THR D 76 -32.257 -37.913 13.760 1.00 40.00 C
+ATOM 6016 O THR D 76 -32.620 -37.466 12.668 1.00 40.00 O
+ATOM 6017 CB THR D 76 -29.737 -38.387 14.082 1.00 40.00 C
+ATOM 6018 OG1 THR D 76 -29.666 -39.422 15.066 1.00 40.00 O
+ATOM 6019 CG2 THR D 76 -28.442 -37.621 14.146 1.00 40.00 C
+ATOM 6020 N CYS D 77 -32.995 -38.771 14.476 1.00 40.00 N
+ATOM 6021 CA CYS D 77 -34.259 -39.349 13.972 1.00 40.00 C
+ATOM 6022 C CYS D 77 -35.354 -38.308 13.738 1.00 40.00 C
+ATOM 6023 O CYS D 77 -36.359 -38.581 13.088 1.00 40.00 O
+ATOM 6024 CB CYS D 77 -34.778 -40.446 14.911 1.00 40.00 C
+ATOM 6025 SG CYS D 77 -35.879 -39.875 16.241 1.00 40.00 S
+ATOM 6026 N HIS D 78 -35.151 -37.115 14.277 1.00 40.00 N
+ATOM 6027 CA HIS D 78 -36.119 -36.040 14.136 1.00 40.00 C
+ATOM 6028 C HIS D 78 -35.502 -34.696 13.825 1.00 40.00 C
+ATOM 6029 O HIS D 78 -36.019 -33.643 14.206 1.00 40.00 O
+ATOM 6030 CB HIS D 78 -37.010 -35.974 15.372 1.00 40.00 C
+ATOM 6031 CG HIS D 78 -38.357 -36.621 15.186 1.00 40.00 C
+ATOM 6032 ND1 HIS D 78 -38.500 -37.901 14.800 1.00 40.00 N
+ATOM 6033 CD2 HIS D 78 -39.644 -36.113 15.363 1.00 40.00 C
+ATOM 6034 CE1 HIS D 78 -39.812 -38.197 14.724 1.00 40.00 C
+ATOM 6035 NE2 HIS D 78 -40.510 -37.102 15.075 1.00 40.00 N
+ATOM 6036 N ALA D 79 -34.394 -34.715 13.104 1.00 40.00 N
+ATOM 6037 CA ALA D 79 -33.794 -33.484 12.668 1.00 40.00 C
+ATOM 6038 C ALA D 79 -33.811 -33.391 11.145 1.00 40.00 C
+ATOM 6039 O ALA D 79 -33.263 -34.257 10.464 1.00 40.00 O
+ATOM 6040 CB ALA D 79 -32.382 -33.390 13.201 1.00 40.00 C
+ATOM 6041 N TYR D 80 -34.483 -32.365 10.619 1.00 40.00 N
+ATOM 6042 CA TYR D 80 -34.336 -31.948 9.209 1.00 40.00 C
+ATOM 6043 C TYR D 80 -33.210 -30.908 9.112 1.00 40.00 C
+ATOM 6044 O TYR D 80 -32.987 -30.171 10.080 1.00 40.00 O
+ATOM 6045 CB TYR D 80 -35.583 -31.218 8.703 1.00 40.00 C
+ATOM 6046 CG TYR D 80 -36.879 -31.961 8.766 1.00 40.00 C
+ATOM 6047 CD1 TYR D 80 -37.866 -31.584 9.677 1.00 40.00 C
+ATOM 6048 CD2 TYR D 80 -37.143 -33.014 7.889 1.00 40.00 C
+ATOM 6049 CE1 TYR D 80 -39.076 -32.250 9.728 1.00 40.00 C
+ATOM 6050 CE2 TYR D 80 -38.347 -33.690 7.931 1.00 40.00 C
+ATOM 6051 CZ TYR D 80 -39.310 -33.302 8.848 1.00 40.00 C
+ATOM 6052 OH TYR D 80 -40.506 -33.972 8.886 1.00 40.00 O
+ATOM 6053 N PRO D 81 -32.518 -30.809 7.947 1.00 40.00 N
+ATOM 6054 CA PRO D 81 -31.587 -29.669 7.822 1.00 40.00 C
+ATOM 6055 C PRO D 81 -32.241 -28.359 7.300 1.00 40.00 C
+ATOM 6056 O PRO D 81 -33.255 -28.391 6.575 1.00 40.00 O
+ATOM 6057 CB PRO D 81 -30.502 -30.199 6.867 1.00 40.00 C
+ATOM 6058 CG PRO D 81 -31.194 -31.243 6.042 1.00 40.00 C
+ATOM 6059 CD PRO D 81 -32.370 -31.774 6.834 1.00 40.00 C
+ATOM 6060 N THR D 82 -31.672 -27.225 7.722 1.00 40.00 N
+ATOM 6061 CA THR D 82 -31.993 -25.896 7.157 1.00 40.00 C
+ATOM 6062 C THR D 82 -30.724 -25.242 6.552 1.00 40.00 C
+ATOM 6063 O THR D 82 -30.770 -24.106 6.043 1.00 40.00 O
+ATOM 6064 CB THR D 82 -32.723 -24.944 8.163 1.00 40.00 C
+ATOM 6065 OG1 THR D 82 -31.946 -24.766 9.360 1.00 40.00 O
+ATOM 6066 CG2 THR D 82 -34.118 -25.476 8.521 1.00 40.00 C
+ATOM 6067 N SER D 83 -29.609 -25.980 6.612 1.00 40.00 N
+ATOM 6068 CA SER D 83 -28.335 -25.577 6.021 1.00 40.00 C
+ATOM 6069 C SER D 83 -27.401 -26.779 5.856 1.00 40.00 C
+ATOM 6070 O SER D 83 -27.669 -27.881 6.357 1.00 40.00 O
+ATOM 6071 CB SER D 83 -27.651 -24.493 6.870 1.00 40.00 C
+ATOM 6072 OG SER D 83 -26.960 -25.049 7.981 1.00 40.00 O
+ATOM 6073 N ASP D 84 -26.310 -26.548 5.130 1.00 40.00 N
+ATOM 6074 CA ASP D 84 -25.166 -27.452 5.123 1.00 40.00 C
+ATOM 6075 C ASP D 84 -24.722 -27.634 6.571 1.00 40.00 C
+ATOM 6076 O ASP D 84 -24.533 -26.647 7.311 1.00 40.00 O
+ATOM 6077 CB ASP D 84 -24.010 -26.871 4.285 1.00 40.00 C
+ATOM 6078 CG ASP D 84 -24.183 -27.094 2.775 1.00 40.00 C
+ATOM 6079 OD1 ASP D 84 -23.145 -27.097 2.067 1.00 40.00 O
+ATOM 6080 OD2 ASP D 84 -25.334 -27.267 2.293 1.00 40.00 O
+ATOM 6081 N VAL D 85 -24.568 -28.887 6.985 1.00 40.00 N
+ATOM 6082 CA VAL D 85 -24.343 -29.167 8.403 1.00 40.00 C
+ATOM 6083 C VAL D 85 -23.353 -30.320 8.639 1.00 40.00 C
+ATOM 6084 O VAL D 85 -23.401 -31.343 7.954 1.00 40.00 O
+ATOM 6085 CB VAL D 85 -25.705 -29.308 9.161 1.00 40.00 C
+ATOM 6086 CG1 VAL D 85 -26.622 -30.317 8.476 1.00 40.00 C
+ATOM 6087 CG2 VAL D 85 -25.523 -29.612 10.647 1.00 40.00 C
+ATOM 6088 N VAL D 86 -22.435 -30.115 9.586 1.00 40.00 N
+ATOM 6089 CA VAL D 86 -21.465 -31.137 10.013 1.00 40.00 C
+ATOM 6090 C VAL D 86 -21.920 -31.704 11.365 1.00 40.00 C
+ATOM 6091 O VAL D 86 -22.281 -30.930 12.265 1.00 40.00 O
+ATOM 6092 CB VAL D 86 -20.028 -30.556 10.137 1.00 40.00 C
+ATOM 6093 CG1 VAL D 86 -19.015 -31.653 10.452 1.00 40.00 C
+ATOM 6094 CG2 VAL D 86 -19.623 -29.815 8.866 1.00 40.00 C
+ATOM 6095 N ILE D 87 -21.912 -33.039 11.500 1.00 40.00 N
+ATOM 6096 CA ILE D 87 -22.411 -33.727 12.724 1.00 40.00 C
+ATOM 6097 C ILE D 87 -21.623 -34.986 13.178 1.00 40.00 C
+ATOM 6098 O ILE D 87 -21.318 -35.879 12.378 1.00 40.00 O
+ATOM 6099 CB ILE D 87 -23.937 -34.049 12.631 1.00 40.00 C
+ATOM 6100 CG1 ILE D 87 -24.780 -32.762 12.702 1.00 40.00 C
+ATOM 6101 CG2 ILE D 87 -24.367 -35.022 13.728 1.00 40.00 C
+ATOM 6102 CD1 ILE D 87 -26.237 -32.932 12.330 1.00 40.00 C
+ATOM 6103 N GLU D 88 -21.312 -35.038 14.475 1.00 40.00 N
+ATOM 6104 CA GLU D 88 -20.799 -36.244 15.114 1.00 40.00 C
+ATOM 6105 C GLU D 88 -21.977 -37.122 15.507 1.00 40.00 C
+ATOM 6106 O GLU D 88 -22.962 -36.628 16.057 1.00 40.00 O
+ATOM 6107 CB GLU D 88 -20.024 -35.901 16.387 1.00 40.00 C
+ATOM 6108 CG GLU D 88 -18.735 -35.118 16.194 1.00 40.00 C
+ATOM 6109 CD GLU D 88 -18.331 -34.355 17.454 1.00 40.00 C
+ATOM 6110 OE1 GLU D 88 -19.242 -33.868 18.179 1.00 40.00 O
+ATOM 6111 OE2 GLU D 88 -17.103 -34.232 17.716 1.00 40.00 O
+ATOM 6112 N THR D 89 -21.865 -38.422 15.240 1.00 40.00 N
+ATOM 6113 CA THR D 89 -22.887 -39.386 15.645 1.00 40.00 C
+ATOM 6114 C THR D 89 -22.320 -40.284 16.739 1.00 40.00 C
+ATOM 6115 O THR D 89 -21.147 -40.146 17.112 1.00 40.00 O
+ATOM 6116 CB THR D 89 -23.369 -40.223 14.445 1.00 40.00 C
+ATOM 6117 OG1 THR D 89 -22.307 -41.068 13.987 1.00 40.00 O
+ATOM 6118 CG2 THR D 89 -23.793 -39.311 13.302 1.00 40.00 C
+ATOM 6119 N HIS D 90 -23.151 -41.195 17.248 1.00 40.00 N
+ATOM 6120 CA HIS D 90 -22.769 -42.158 18.316 1.00 40.00 C
+ATOM 6121 C HIS D 90 -22.379 -41.453 19.593 1.00 40.00 C
+ATOM 6122 O HIS D 90 -21.413 -41.830 20.270 1.00 40.00 O
+ATOM 6123 CB HIS D 90 -21.673 -43.132 17.854 1.00 40.00 C
+ATOM 6124 CG HIS D 90 -22.035 -43.941 16.611 1.00 40.00 C
+ATOM 6125 ND1 HIS D 90 -22.296 -43.369 15.408 1.00 40.00 N
+ATOM 6126 CD2 HIS D 90 -22.135 -45.323 16.413 1.00 40.00 C
+ATOM 6127 CE1 HIS D 90 -22.566 -44.331 14.498 1.00 40.00 C
+ATOM 6128 NE2 HIS D 90 -22.471 -45.525 15.113 1.00 40.00 N
+ATOM 6129 N LYS D 91 -23.158 -40.422 19.921 1.00 40.00 N
+ATOM 6130 CA LYS D 91 -22.851 -39.507 21.003 1.00 40.00 C
+ATOM 6131 C LYS D 91 -23.766 -39.686 22.179 1.00 40.00 C
+ATOM 6132 O LYS D 91 -23.773 -38.847 23.072 1.00 40.00 O
+ATOM 6133 CB LYS D 91 -22.972 -38.060 20.525 1.00 40.00 C
+ATOM 6134 CG LYS D 91 -21.911 -37.618 19.526 1.00 40.00 C
+ATOM 6135 CD LYS D 91 -20.540 -37.368 20.153 1.00 40.00 C
+ATOM 6136 CE LYS D 91 -19.681 -38.628 20.211 1.00 40.00 C
+ATOM 6137 NZ LYS D 91 -18.239 -38.312 20.375 1.00 40.00 N
+ATOM 6138 N GLU D 92 -24.546 -40.764 22.183 1.00 40.00 N
+ATOM 6139 CA GLU D 92 -25.457 -41.026 23.302 1.00 40.00 C
+ATOM 6140 C GLU D 92 -24.704 -41.129 24.625 1.00 40.00 C
+ATOM 6141 O GLU D 92 -25.058 -40.437 25.582 1.00 40.00 O
+ATOM 6142 CB GLU D 92 -26.325 -42.282 23.098 1.00 40.00 C
+ATOM 6143 CG GLU D 92 -27.296 -42.532 24.263 1.00 40.00 C
+ATOM 6144 CD GLU D 92 -28.113 -43.813 24.151 1.00 40.00 C
+ATOM 6145 OE1 GLU D 92 -27.791 -44.678 23.316 1.00 40.00 O
+ATOM 6146 OE2 GLU D 92 -29.088 -43.962 24.913 1.00 40.00 O
+ATOM 6147 N GLU D 93 -23.675 -41.981 24.678 1.00 40.00 N
+ATOM 6148 CA GLU D 93 -22.884 -42.156 25.900 1.00 40.00 C
+ATOM 6149 C GLU D 93 -22.327 -40.841 26.453 1.00 40.00 C
+ATOM 6150 O GLU D 93 -22.286 -40.663 27.678 1.00 40.00 O
+ATOM 6151 CB GLU D 93 -21.744 -43.137 25.680 1.00 40.00 C
+ATOM 6152 CG GLU D 93 -20.791 -43.176 26.861 1.00 40.00 C
+ATOM 6153 CD GLU D 93 -19.779 -44.291 26.761 1.00 40.00 C
+ATOM 6154 OE1 GLU D 93 -18.896 -44.231 25.877 1.00 40.00 O
+ATOM 6155 OE2 GLU D 93 -19.864 -45.229 27.579 1.00 40.00 O
+ATOM 6156 N GLU D 94 -21.895 -39.945 25.552 1.00 40.00 N
+ATOM 6157 CA GLU D 94 -21.473 -38.586 25.921 1.00 40.00 C
+ATOM 6158 C GLU D 94 -22.605 -37.756 26.554 1.00 40.00 C
+ATOM 6159 O GLU D 94 -22.384 -37.029 27.520 1.00 40.00 O
+ATOM 6160 CB GLU D 94 -20.859 -37.836 24.732 1.00 40.00 C
+ATOM 6161 CG GLU D 94 -20.342 -36.446 25.119 1.00 40.00 C
+ATOM 6162 CD GLU D 94 -19.657 -35.669 23.990 1.00 40.00 C
+ATOM 6163 OE1 GLU D 94 -18.988 -36.296 23.129 1.00 40.00 O
+ATOM 6164 OE2 GLU D 94 -19.768 -34.413 23.983 1.00 40.00 O
+ATOM 6165 N LEU D 95 -23.809 -37.863 26.007 1.00 40.00 N
+ATOM 6166 CA LEU D 95 -24.982 -37.267 26.632 1.00 40.00 C
+ATOM 6167 C LEU D 95 -25.286 -37.974 27.963 1.00 40.00 C
+ATOM 6168 O LEU D 95 -25.458 -37.327 28.996 1.00 40.00 O
+ATOM 6169 CB LEU D 95 -26.168 -37.352 25.675 1.00 40.00 C
+ATOM 6170 CG LEU D 95 -27.462 -36.667 26.097 1.00 40.00 C
+ATOM 6171 CD1 LEU D 95 -27.250 -35.173 26.345 1.00 40.00 C
+ATOM 6172 CD2 LEU D 95 -28.515 -36.912 25.029 1.00 40.00 C
+ATOM 6173 N THR D 96 -25.356 -39.303 27.904 1.00 40.00 N
+ATOM 6174 CA THR D 96 -25.330 -40.186 29.068 1.00 40.00 C
+ATOM 6175 C THR D 96 -24.003 -40.044 29.811 1.00 40.00 C
+ATOM 6176 O THR D 96 -23.949 -40.140 31.036 1.00 40.00 O
+ATOM 6177 CB THR D 96 -25.549 -41.653 28.624 1.00 40.00 C
+ATOM 6178 OG1 THR D 96 -26.934 -41.981 28.772 1.00 40.00 O
+ATOM 6179 CG2 THR D 96 -24.705 -42.650 29.425 1.00 40.00 C
+TER 6180 THR D 96
+HETATM 6181 PA FAD A 401 -23.428 17.103 27.091 1.00 40.00 P
+HETATM 6182 O1A FAD A 401 -24.306 18.270 26.716 1.00 40.00 O
+HETATM 6183 O2A FAD A 401 -23.559 15.832 26.282 1.00 40.00 O
+HETATM 6184 O5B FAD A 401 -21.890 17.553 27.179 1.00 40.00 O
+HETATM 6185 C5B FAD A 401 -20.853 16.590 27.038 1.00 40.00 C
+HETATM 6186 C4B FAD A 401 -19.842 17.121 26.035 1.00 40.00 C
+HETATM 6187 O4B FAD A 401 -18.794 17.804 26.729 1.00 40.00 O
+HETATM 6188 C3B FAD A 401 -19.217 15.972 25.272 1.00 40.00 C
+HETATM 6189 O3B FAD A 401 -19.255 16.278 23.875 1.00 40.00 O
+HETATM 6190 C2B FAD A 401 -17.792 15.873 25.793 1.00 40.00 C
+HETATM 6191 O2B FAD A 401 -16.826 15.915 24.736 1.00 40.00 O
+HETATM 6192 C1B FAD A 401 -17.592 17.045 26.742 1.00 40.00 C
+HETATM 6193 N9A FAD A 401 -17.401 16.497 28.097 1.00 40.00 N
+HETATM 6194 C8A FAD A 401 -18.201 15.571 28.651 1.00 40.00 C
+HETATM 6195 N7A FAD A 401 -17.783 15.244 29.896 1.00 40.00 N
+HETATM 6196 C5A FAD A 401 -16.679 15.970 30.175 1.00 40.00 C
+HETATM 6197 C6A FAD A 401 -15.733 16.101 31.336 1.00 40.00 C
+HETATM 6198 N6A FAD A 401 -15.890 15.366 32.480 1.00 40.00 N
+HETATM 6199 N1A FAD A 401 -14.702 16.986 31.205 1.00 40.00 N
+HETATM 6200 C2A FAD A 401 -14.533 17.709 30.076 1.00 40.00 C
+HETATM 6201 N3A FAD A 401 -15.352 17.635 28.998 1.00 40.00 N
+HETATM 6202 C4A FAD A 401 -16.431 16.801 28.973 1.00 40.00 C
+HETATM 6203 N1 FAD A 401 -25.090 9.523 32.642 1.00 40.00 N
+HETATM 6204 C2 FAD A 401 -25.557 9.541 33.915 1.00 40.00 C
+HETATM 6205 O2 FAD A 401 -25.483 10.627 34.537 1.00 40.00 O
+HETATM 6206 N3 FAD A 401 -26.098 8.445 34.510 1.00 40.00 N
+HETATM 6207 C4 FAD A 401 -26.237 7.253 33.884 1.00 40.00 C
+HETATM 6208 O4 FAD A 401 -26.778 6.234 34.424 1.00 40.00 O
+HETATM 6209 C4X FAD A 401 -25.739 7.161 32.489 1.00 40.00 C
+HETATM 6210 N5 FAD A 401 -25.863 6.001 31.802 1.00 40.00 N
+HETATM 6211 C5X FAD A 401 -25.398 5.956 30.524 1.00 40.00 C
+HETATM 6212 C6 FAD A 401 -25.490 4.755 29.818 1.00 40.00 C
+HETATM 6213 C7 FAD A 401 -25.017 4.678 28.501 1.00 40.00 C
+HETATM 6214 C7M FAD A 401 -25.148 3.362 27.765 1.00 40.00 C
+HETATM 6215 C8 FAD A 401 -24.383 5.906 27.849 1.00 40.00 C
+HETATM 6216 C8M FAD A 401 -23.851 5.897 26.433 1.00 40.00 C
+HETATM 6217 C9 FAD A 401 -24.283 7.099 28.560 1.00 40.00 C
+HETATM 6218 C9A FAD A 401 -24.746 7.161 29.867 1.00 40.00 C
+HETATM 6219 N10 FAD A 401 -24.654 8.366 30.570 1.00 40.00 N
+HETATM 6220 C10 FAD A 401 -25.146 8.399 31.889 1.00 40.00 C
+HETATM 6221 C1' FAD A 401 -24.095 9.555 29.919 1.00 40.00 C
+HETATM 6222 C2' FAD A 401 -25.245 10.459 29.459 1.00 40.00 C
+HETATM 6223 O2' FAD A 401 -25.841 9.937 28.246 1.00 40.00 O
+HETATM 6224 C3' FAD A 401 -24.785 11.898 29.225 1.00 40.00 C
+HETATM 6225 O3' FAD A 401 -23.775 11.857 28.206 1.00 40.00 O
+HETATM 6226 C4' FAD A 401 -24.249 12.610 30.477 1.00 40.00 C
+HETATM 6227 O4' FAD A 401 -25.197 12.552 31.543 1.00 40.00 O
+HETATM 6228 C5' FAD A 401 -23.945 14.082 30.202 1.00 40.00 C
+HETATM 6229 O5' FAD A 401 -24.838 14.583 29.203 1.00 40.00 O
+HETATM 6230 P FAD A 401 -25.140 16.152 28.992 1.00 40.00 P
+HETATM 6231 O1P FAD A 401 -26.059 16.273 27.791 1.00 40.00 O
+HETATM 6232 O2P FAD A 401 -25.528 16.748 30.312 1.00 40.00 O
+HETATM 6233 O3P FAD A 401 -23.701 16.741 28.620 1.00 40.00 O
+HETATM 6234 FE1 FES B 101 -51.609 1.622 98.269 1.00 40.00 FE
+HETATM 6235 FE2 FES B 101 -52.880 2.980 100.726 1.00 40.00 FE
+HETATM 6236 S1 FES B 101 -53.432 2.833 98.586 1.00 40.00 S
+HETATM 6237 S2 FES B 101 -51.017 1.806 100.389 1.00 40.00 S
+HETATM 6238 PA FAD C 401 -71.512 15.192 45.303 1.00 40.00 P
+HETATM 6239 O1A FAD C 401 -71.196 16.095 44.126 1.00 40.00 O
+HETATM 6240 O2A FAD C 401 -71.257 15.763 46.676 1.00 40.00 O
+HETATM 6241 O5B FAD C 401 -73.004 14.581 45.212 1.00 40.00 O
+HETATM 6242 C5B FAD C 401 -73.681 14.131 46.378 1.00 40.00 C
+HETATM 6243 C4B FAD C 401 -75.069 14.753 46.405 1.00 40.00 C
+HETATM 6244 O4B FAD C 401 -76.017 13.854 45.806 1.00 40.00 O
+HETATM 6245 C3B FAD C 401 -75.475 15.014 47.848 1.00 40.00 C
+HETATM 6246 O3B FAD C 401 -75.908 16.371 48.034 1.00 40.00 O
+HETATM 6247 C2B FAD C 401 -76.572 13.998 48.130 1.00 40.00 C
+HETATM 6248 O2B FAD C 401 -77.747 14.621 48.666 1.00 40.00 O
+HETATM 6249 C1B FAD C 401 -76.849 13.269 46.810 1.00 40.00 C
+HETATM 6250 N9A FAD C 401 -76.460 11.848 46.996 1.00 40.00 N
+HETATM 6251 C8A FAD C 401 -75.293 11.445 47.534 1.00 40.00 C
+HETATM 6252 N7A FAD C 401 -75.211 10.092 47.590 1.00 40.00 N
+HETATM 6253 C5A FAD C 401 -76.353 9.571 47.087 1.00 40.00 C
+HETATM 6254 C6A FAD C 401 -76.920 8.189 46.862 1.00 40.00 C
+HETATM 6255 N6A FAD C 401 -76.254 7.052 47.184 1.00 40.00 N
+HETATM 6256 N1A FAD C 401 -78.147 8.081 46.312 1.00 40.00 N
+HETATM 6257 C2A FAD C 401 -78.810 9.203 45.978 1.00 40.00 C
+HETATM 6258 N3A FAD C 401 -78.385 10.482 46.155 1.00 40.00 N
+HETATM 6259 C4A FAD C 401 -77.171 10.745 46.698 1.00 40.00 C
+HETATM 6260 N1 FAD C 401 -65.661 9.492 50.049 1.00 40.00 N
+HETATM 6261 C2 FAD C 401 -64.871 8.517 49.530 1.00 40.00 C
+HETATM 6262 O2 FAD C 401 -65.158 8.098 48.382 1.00 40.00 O
+HETATM 6263 N3 FAD C 401 -63.801 8.024 50.206 1.00 40.00 N
+HETATM 6264 C4 FAD C 401 -63.462 8.454 51.440 1.00 40.00 C
+HETATM 6265 O4 FAD C 401 -62.478 7.989 52.060 1.00 40.00 O
+HETATM 6266 C4X FAD C 401 -64.274 9.523 52.063 1.00 40.00 C
+HETATM 6267 N5 FAD C 401 -63.998 10.018 53.286 1.00 40.00 N
+HETATM 6268 C5X FAD C 401 -64.775 10.985 53.813 1.00 40.00 C
+HETATM 6269 C6 FAD C 401 -64.501 11.476 55.068 1.00 40.00 C
+HETATM 6270 C7 FAD C 401 -65.298 12.469 55.614 1.00 40.00 C
+HETATM 6271 C7M FAD C 401 -64.967 12.998 56.986 1.00 40.00 C
+HETATM 6272 C8 FAD C 401 -66.454 13.004 54.860 1.00 40.00 C
+HETATM 6273 C8M FAD C 401 -67.330 14.079 55.439 1.00 40.00 C
+HETATM 6274 C9 FAD C 401 -66.736 12.505 53.615 1.00 40.00 C
+HETATM 6275 C9A FAD C 401 -65.945 11.515 53.081 1.00 40.00 C
+HETATM 6276 N10 FAD C 401 -66.230 11.025 51.811 1.00 40.00 N
+HETATM 6277 C10 FAD C 401 -65.420 10.022 51.268 1.00 40.00 C
+HETATM 6278 C1' FAD C 401 -67.368 11.555 51.076 1.00 40.00 C
+HETATM 6279 C2' FAD C 401 -66.800 12.560 50.081 1.00 40.00 C
+HETATM 6280 O2' FAD C 401 -66.365 13.763 50.738 1.00 40.00 O
+HETATM 6281 C3' FAD C 401 -67.851 12.841 49.021 1.00 40.00 C
+HETATM 6282 O3' FAD C 401 -69.000 13.394 49.680 1.00 40.00 O
+HETATM 6283 C4' FAD C 401 -68.281 11.567 48.257 1.00 40.00 C
+HETATM 6284 O4' FAD C 401 -67.170 10.752 47.833 1.00 40.00 O
+HETATM 6285 C5' FAD C 401 -69.122 11.942 47.040 1.00 40.00 C
+HETATM 6286 O5' FAD C 401 -68.816 13.304 46.693 1.00 40.00 O
+HETATM 6287 P FAD C 401 -69.069 13.912 45.222 1.00 40.00 P
+HETATM 6288 O1P FAD C 401 -68.616 15.371 45.244 1.00 40.00 O
+HETATM 6289 O2P FAD C 401 -68.531 12.935 44.203 1.00 40.00 O
+HETATM 6290 O3P FAD C 401 -70.673 13.835 45.140 1.00 40.00 O
+HETATM 6291 FE1 FES D 101 -33.932 -40.658 17.785 1.00 40.00 FE
+HETATM 6292 FE2 FES D 101 -35.294 -42.145 20.075 1.00 40.00 FE
+HETATM 6293 S1 FES D 101 -35.422 -40.052 19.343 1.00 40.00 S
+HETATM 6294 S2 FES D 101 -33.906 -42.776 18.453 1.00 40.00 S
+CONECT 15 5971
+CONECT 2667 6235
+CONECT 2881 3105
+CONECT 2935 6234
+CONECT 3105 2881
+CONECT 5757 6292
+CONECT 5789 6292
+CONECT 5807 6291
+CONECT 5971 15
+CONECT 6025 6291
+CONECT 6181 6182 6183 6184 6233
+CONECT 6182 6181
+CONECT 6183 6181
+CONECT 6184 6181 6185
+CONECT 6185 6184 6186
+CONECT 6186 6185 6187 6188
+CONECT 6187 6186 6192
+CONECT 6188 6186 6189 6190
+CONECT 6189 6188
+CONECT 6190 6188 6191 6192
+CONECT 6191 6190
+CONECT 6192 6187 6190 6193
+CONECT 6193 6192 6194 6202
+CONECT 6194 6193 6195
+CONECT 6195 6194 6196
+CONECT 6196 6195 6197 6202
+CONECT 6197 6196 6198 6199
+CONECT 6198 6197
+CONECT 6199 6197 6200
+CONECT 6200 6199 6201
+CONECT 6201 6200 6202
+CONECT 6202 6193 6196 6201
+CONECT 6203 6204 6220
+CONECT 6204 6203 6205 6206
+CONECT 6205 6204
+CONECT 6206 6204 6207
+CONECT 6207 6206 6208 6209
+CONECT 6208 6207
+CONECT 6209 6207 6210 6220
+CONECT 6210 6209 6211
+CONECT 6211 6210 6212 6218
+CONECT 6212 6211 6213
+CONECT 6213 6212 6214 6215
+CONECT 6214 6213
+CONECT 6215 6213 6216 6217
+CONECT 6216 6215
+CONECT 6217 6215 6218
+CONECT 6218 6211 6217 6219
+CONECT 6219 6218 6220 6221
+CONECT 6220 6203 6209 6219
+CONECT 6221 6219 6222
+CONECT 6222 6221 6223 6224
+CONECT 6223 6222
+CONECT 6224 6222 6225 6226
+CONECT 6225 6224
+CONECT 6226 6224 6227 6228
+CONECT 6227 6226
+CONECT 6228 6226 6229
+CONECT 6229 6228 6230
+CONECT 6230 6229 6231 6232 6233
+CONECT 6231 6230
+CONECT 6232 6230
+CONECT 6233 6181 6230
+CONECT 6234 2935 6236 6237
+CONECT 6235 2667 6236 6237
+CONECT 6236 6234 6235
+CONECT 6237 6234 6235
+CONECT 6238 6239 6240 6241 6290
+CONECT 6239 6238
+CONECT 6240 6238
+CONECT 6241 6238 6242
+CONECT 6242 6241 6243
+CONECT 6243 6242 6244 6245
+CONECT 6244 6243 6249
+CONECT 6245 6243 6246 6247
+CONECT 6246 6245
+CONECT 6247 6245 6248 6249
+CONECT 6248 6247
+CONECT 6249 6244 6247 6250
+CONECT 6250 6249 6251 6259
+CONECT 6251 6250 6252
+CONECT 6252 6251 6253
+CONECT 6253 6252 6254 6259
+CONECT 6254 6253 6255 6256
+CONECT 6255 6254
+CONECT 6256 6254 6257
+CONECT 6257 6256 6258
+CONECT 6258 6257 6259
+CONECT 6259 6250 6253 6258
+CONECT 6260 6261 6277
+CONECT 6261 6260 6262 6263
+CONECT 6262 6261
+CONECT 6263 6261 6264
+CONECT 6264 6263 6265 6266
+CONECT 6265 6264
+CONECT 6266 6264 6267 6277
+CONECT 6267 6266 6268
+CONECT 6268 6267 6269 6275
+CONECT 6269 6268 6270
+CONECT 6270 6269 6271 6272
+CONECT 6271 6270
+CONECT 6272 6270 6273 6274
+CONECT 6273 6272
+CONECT 6274 6272 6275
+CONECT 6275 6268 6274 6276
+CONECT 6276 6275 6277 6278
+CONECT 6277 6260 6266 6276
+CONECT 6278 6276 6279
+CONECT 6279 6278 6280 6281
+CONECT 6280 6279
+CONECT 6281 6279 6282 6283
+CONECT 6282 6281
+CONECT 6283 6281 6284 6285
+CONECT 6284 6283
+CONECT 6285 6283 6286
+CONECT 6286 6285 6287
+CONECT 6287 6286 6288 6289 6290
+CONECT 6288 6287
+CONECT 6289 6287
+CONECT 6290 6238 6287
+CONECT 6291 5807 6025 6293 6294
+CONECT 6292 5757 5789 6293 6294
+CONECT 6293 6291 6292
+CONECT 6294 6291 6292
+MASTER 433 0 4 22 46 0 15 12 6290 4 124 66
+END
--- /dev/null
+>BACKUP_FILES/1-6 backupfiles
+AAAARG
--- /dev/null
+{"$schema":"http://json-schema.org/draft-04/schema#","id":"http://jsonschema.net","type":"object","properties":{"seqs":{"id":"http://jsonschema.net/seqs","type":"array","items":{"id":"http://jsonschema.net/seqs/0","type":"object","properties":{"name":{"id":"http://jsonschema.net/seqs/0/name","type":"string","description":"Sequence name"},"start":{"id":"http://jsonschema.net/seqs/0/start","type":"integer","description":"Start residue position"},"svid":{"id":"http://jsonschema.net/seqs/0/svid","type":"string","description":"Serial version id for sequence object"},"end":{"id":"http://jsonschema.net/seqs/0/end","type":"integer","description":"End residue position"},"id":{"id":"http://jsonschema.net/seqs/0/id","type":"string","description":"Sequence unique identifier"},"seq":{"id":"http://jsonschema.net/seqs/0/seq","type":"string","description":"Sequence Residues"},"order":{"id":"http://jsonschema.net/seqs/0/order","type":"integer","description":"Sequence order in an alignment space"}},"required":["name","start","svid","end","id","seq"]},"required":["0"],"description":"Sequences in the Alignemnt","minItems":"1","maxItems":"*"},"appSettings":{"id":"http://jsonschema.net/appSettings","type":"object","properties":{"globalColorScheme":{"id":"http://jsonschema.net/appSettings/globalColorScheme","type":"string","description":"Global colour schem for the alignment"},"webStartUrl":{"id":"http://jsonschema.net/appSettings/webStartUrl","type":"string","description":"Jalview specific setting which points to a url for launching Jalview"},"application":{"id":"http://jsonschema.net/appSettings/application","type":"string","description":"Application which generated the Json"},"showSeqFeatures":{"id":"http://jsonschema.net/appSettings/showSeqFeatures","type":"string","description":"Determines if sequence features are visible or not"},"version":{"id":"http://jsonschema.net/appSettings/version","type":"string","description":"Verion of the application which generated the JSON"},"hiddenCols":{"id":"http://jsonschema.net/appSettings/hiddenCols","type":"string","description":"Delimited lists of hidden colums ranges i.e [2-3,5-5,11-23]"}},"description":"Application specific settings"},"seqGroups":{"id":"http://jsonschema.net/seqGroups","type":"array","items":[{"id":"http://jsonschema.net/seqGroups/0","type":"object","properties":{"displayText":{"id":"http://jsonschema.net/seqGroups/0/displayText","type":"boolean","description":"Determines if the texts of the group is displayed or not"},"startRes":{"id":"http://jsonschema.net/seqGroups/0/startRes","type":"integer","description":"Start residue position for a given group"},"groupName":{"id":"http://jsonschema.net/seqGroups/0/groupName","type":"string","description":"Group name"},"endRes":{"id":"http://jsonschema.net/seqGroups/0/endRes","type":"integer","description":"End residue position for a given group"},"colourText":{"id":"http://jsonschema.net/seqGroups/0/colourText","type":"boolean","description":"Determines if the Residues text for the group is coloured"},"seqsHash":{"id":"http://jsonschema.net/seqGroups/0/seqsHash","type":"array","items":[],"minItems":"0","maxItems":"*","description":"The id's of the sequences which belongs to the group"},"svid":{"id":"http://jsonschema.net/seqGroups/0/svid","type":"string","description":"Serial version id for a given group"},"showNonconserved":{"id":"http://jsonschema.net/seqGroups/0/showNonconserved","type":"boolean","description":"Determines if non conserved regions of a group is shown or not"},"colourScheme":{"id":"http://jsonschema.net/seqGroups/0/colourScheme","type":"string","description":"Colour Scheme for the sequence group"},"displayBoxes":{"id":"http://jsonschema.net/seqGroups/0/displayBoxes","type":"boolean","description":"Determines if the group border should be visible or not"}}}],"description":"Sequence groups in the Alignment","minItems":"0","maxItems":"*"},"alignAnnotation":{"id":"http://jsonschema.net/alignAnnotation","type":"array","items":{"id":"http://jsonschema.net/alignAnnotation/0","type":"object","properties":{"svid":{"id":"http://jsonschema.net/alignAnnotation/0/svid","type":"string","description":"Serial version id for the annotation object"},"annotations":{"id":"http://jsonschema.net/alignAnnotation/0/annotations","type":"array","items":[{"id":"http://jsonschema.net/alignAnnotation/0/annotations/0","type":"object","properties":{"displayCharacter":{"id":"http://jsonschema.net/alignAnnotation/0/annotations/0/displayCharacter","type":"string","description":"Display character to denote the given annotation"},"value":{"id":"http://jsonschema.net/alignAnnotation/0/annotations/0/value","type":"integer","description":"Value of the annotation"},"secondaryStructure":{"id":"http://jsonschema.net/alignAnnotation/0/annotations/0/secondaryStructure","type":"string","description":"Secondary structure symbol for the given annotation"}}},{"id":"http://jsonschema.net/alignAnnotation/0/annotations/1","type":"object","properties":{"displayCharacter":{"id":"http://jsonschema.net/alignAnnotation/0/annotations/1/displayCharacter","type":"string"},"value":{"id":"http://jsonschema.net/alignAnnotation/0/annotations/1/value","type":"integer"},"secondaryStructure":{"id":"http://jsonschema.net/alignAnnotation/0/annotations/1/secondaryStructure","type":"string"}}},{"id":"http://jsonschema.net/alignAnnotation/0/annotations/2","type":"object","properties":{"displayCharacter":{"id":"http://jsonschema.net/alignAnnotation/0/annotations/2/displayCharacter","type":"string"},"value":{"id":"http://jsonschema.net/alignAnnotation/0/annotations/2/value","type":"integer"},"secondaryStructure":{"id":"http://jsonschema.net/alignAnnotation/0/annotations/2/secondaryStructure","type":"string"}}}]},"description":{"id":"http://jsonschema.net/alignAnnotation/0/description","type":"string","description":"Description of the Alignment Annotation"},"label":{"id":"http://jsonschema.net/alignAnnotation/0/label","type":"string","description":"Label for the Annotation"}}},"description":"Alignment Annotations","minItems":"0","maxItems":"*"},"svid":{"id":"http://jsonschema.net/svid","type":"string","description":"Serial version id"},"seqFeatures":{"id":"http://jsonschema.net/seqFeatures","type":"array","items":{"id":"http://jsonschema.net/seqFeatures/0","type":"object","properties":{"fillColor":{"id":"http://jsonschema.net/seqFeatures/0/fillColor","type":"string","description":"Fill colour"},"score":{"id":"http://jsonschema.net/seqFeatures/0/score","type":"integer","description":"Score"},"sequenceRef":{"id":"http://jsonschema.net/seqFeatures/0/sequenceRef","type":"string","description":"Reference to the Sequence in the alignement (More like a foreign key)"},"featureGroup":{"id":"http://jsonschema.net/seqFeatures/0/featureGroup","type":"string","description":"Feature Group"},"svid":{"id":"http://jsonschema.net/seqFeatures/0/svid","type":"string","description":"Serial version id for the SeqFeature object"},"description":{"id":"http://jsonschema.net/seqFeatures/0/description","type":"string","description":"Description of Feature"},"xStart":{"id":"http://jsonschema.net/seqFeatures/0/xStart","type":"integer","description":"Start residue position for the sequence feature"},"xEnd":{"id":"http://jsonschema.net/seqFeatures/0/xEnd","type":"integer","description":"End residue position for the sequence feature"},"type":{"id":"http://jsonschema.net/seqFeatures/0/type","type":"string","description":"The name of the SequenceFeature"}}},"minItems":"0","maxItems":"*","description":"Sequence Features within the alignment"}},"required":["seqs","appSettings","seqGroups","alignAnnotation","svid","seqFeatures"]}
\ No newline at end of file
--- /dev/null
+10 705
+Cow ATGGCATATCCCATACAACTAGGATTCCAAGATGCAACATCACCAATCATAGAAGAACTA
+Carp ATGGCACACCCAACGCAACTAGGTTTCAAGGACGCGGCCATACCCGTTATAGAGGAACTT
+Chicken ATGGCCAACCACTCCCAACTAGGCTTTCAAGACGCCTCATCCCCCATCATAGAAGAGCTC
+Human ATGGCACATGCAGCGCAAGTAGGTCTACAAGACGCTACTTCCCCTATCATAGAAGAGCTT
+Loach ATGGCACATCCCACACAATTAGGATTCCAAGACGCGGCCTCACCCGTAATAGAAGAACTT
+Mouse ATGGCCTACCCATTCCAACTTGGTCTACAAGACGCCACATCCCCTATTATAGAAGAGCTA
+Rat ATGGCTTACCCATTTCAACTTGGCTTACAAGACGCTACATCACCTATCATAGAAGAACTT
+Seal ATGGCATACCCCCTACAAATAGGCCTACAAGATGCAACCTCTCCCATTATAGAGGAGTTA
+Whale ATGGCATATCCATTCCAACTAGGTTTCCAAGATGCAGCATCACCCATCATAGAAGAGCTC
+Frog ATGGCACACCCATCACAATTAGGTTTTCAAGACGCAGCCTCTCCAATTATAGAAGAATTA
+
+CTTCACTTTCATGACCACACGCTAATAATTGTCTTCTTAATTAGCTCATTAGTACTTTAC
+CTTCACTTCCACGACCACGCATTAATAATTGTGCTCCTAATTAGCACTTTAGTTTTATAT
+GTTGAATTCCACGACCACGCCCTGATAGTCGCACTAGCAATTTGCAGCTTAGTACTCTAC
+ATCACCTTTCATGATCACGCCCTCATAATCATTTTCCTTATCTGCTTCCTAGTCCTGTAT
+CTTCACTTCCATGACCATGCCCTAATAATTGTATTTTTGATTAGCGCCCTAGTACTTTAT
+ATAAATTTCCATGATCACACACTAATAATTGTTTTCCTAATTAGCTCCTTAGTCCTCTAT
+ACAAACTTTCATGACCACACCCTAATAATTGTATTCCTCATCAGCTCCCTAGTACTTTAT
+CTACACTTCCATGACCACACATTAATAATTGTGTTCCTAATTAGCTCATTAGTACTCTAC
+CTACACTTTCACGATCATACACTAATAATCGTTTTTCTAATTAGCTCTTTAGTTCTCTAC
+CTTCACTTCCACGACCATACCCTCATAGCCGTTTTTCTTATTAGTACGCTAGTTCTTTAC
+
+ATTATTTCACTAATACTAACGACAAAGCTGACCCATACAAGCACGATAGATGCACAAGAA
+ATTATTACTGCAATGGTATCAACTAAACTTACTAATAAATATATTCTAGACTCCCAAGAA
+CTTCTAACTCTTATACTTATAGAAAAACTATCA---TCAAACACCGTAGATGCCCAAGAA
+GCCCTTTTCCTAACACTCACAACAAAACTAACTAATACTAACATCTCAGACGCTCAGGAA
+GTTATTATTACAACCGTCTCAACAAAACTCACTAACATATATATTTTGGACTCACAAGAA
+ATCATCTCGCTAATATTAACAACAAAACTAACACATACAAGCACAATAGATGCACAAGAA
+ATTATTTCACTAATACTAACAACAAAACTAACACACACAAGCACAATAGACGCCCAAGAA
+ATTATCTCACTTATACTAACCACGAAACTCACCCACACAAGTACAATAGACGCACAAGAA
+ATTATTACCCTAATGCTTACAACCAAATTAACACATACTAGTACAATAGACGCCCAAGAA
+ATTATTACTATTATAATAACTACTAAACTAACTAATACAAACCTAATGGACGCACAAGAG
+
+GTAGAGACAATCTGAACCATTCTGCCCGCCATCATCTTAATTCTAATTGCTCTTCCTTCT
+ATCGAAATCGTATGAACCATTCTACCAGCCGTCATTTTAGTACTAATCGCCCTGCCCTCC
+GTTGAACTAATCTGAACCATCCTACCCGCTATTGTCCTAGTCCTGCTTGCCCTCCCCTCC
+ATAGAAACCGTCTGAACTATCCTGCCCGCCATCATCCTAGTCCTCATCGCCCTCCCATCC
+ATTGAAATCGTATGAACTGTGCTCCCTGCCCTAATCCTCATTTTAATCGCCCTCCCCTCA
+GTTGAAACCATTTGAACTATTCTACCAGCTGTAATCCTTATCATAATTGCTCTCCCCTCT
+GTAGAAACAATTTGAACAATTCTCCCAGCTGTCATTCTTATTCTAATTGCCCTTCCCTCC
+GTGGAAACGGTGTGAACGATCCTACCCGCTATCATTTTAATTCTCATTGCCCTACCATCA
+GTAGAAACTGTCTGAACTATCCTCCCAGCCATTATCTTAATTTTAATTGCCTTGCCTTCA
+ATCGAAATAGTGTGAACTATTATACCAGCTATTAGCCTCATCATAATTGCCCTTCCATCC
+
+TTACGAATTCTATACATAATAGATGAAATCAATAACCCATCTCTTACAGTAAAAACCATA
+CTACGCATCCTGTACCTTATAGACGAAATTAACGACCCTCACCTGACAATTAAAGCAATA
+CTCCAAATCCTCTACATAATAGACGAAATCGACGAACCTGATCTCACCCTAAAAGCCATC
+CTACGCATCCTTTACATAACAGACGAGGTCAACGATCCCTCCCTTACCATCAAATCAATT
+CTACGAATTCTATATCTTATAGACGAGATTAATGACCCCCACCTAACAATTAAGGCCATG
+CTACGCATTCTATATATAATAGACGAAATCAACAACCCCGTATTAACCGTTAAAACCATA
+CTACGAATTCTATACATAATAGACGAGATTAATAACCCAGTTCTAACAGTAAAAACTATA
+TTACGAATCCTCTACATAATGGACGAGATCAATAACCCTTCCTTGACCGTAAAAACTATA
+TTACGGATCCTTTACATAATAGACGAAGTCAATAACCCCTCCCTCACTGTAAAAACAATA
+CTTCGTATCCTATATTTAATAGATGAAGTTAATGATCCACACTTAACAATTAAAGCAATC
+
+GGACATCAGTGATACTGAAGCTATGAGTATACAGATTATGAGGACTTAAGCTTCGACTCC
+GGACACCAATGATACTGAAGTTACGAGTATACAGACTATGAAAATCTAGGATTCGACTCC
+GGACACCAATGATACTGAACCTATGAATACACAGACTTCAAGGACCTCTCATTTGACTCC
+GGCCACCAATGGTACTGAACCTACGAGTACACCGACTACGGCGGACTAATCTTCAACTCC
+GGGCACCAATGATACTGAAGCTACGAGTATACTGATTATGAAAACTTAAGTTTTGACTCC
+GGGCACCAATGATACTGAAGCTACGAATATACTGACTATGAAGACCTATGCTTTGATTCA
+GGACACCAATGATACTGAAGCTATGAATATACTGACTATGAAGACCTATGCTTTGACTCC
+GGACATCAGTGATACTGAAGCTATGAGTACACAGACTACGAAGACCTGAACTTTGACTCA
+GGTCACCAATGATATTGAAGCTATGAGTATACCGACTACGAAGACCTAAGCTTCGACTCC
+GGCCACCAATGATACTGAAGCTACGAATATACTAACTATGAGGATCTCTCATTTGACTCT
+
+TACATAATTCCAACATCAGAATTAAAGCCAGGGGAGCTACGACTATTAGAAGTCGATAAT
+TATATAGTACCAACCCAAGACCTTGCCCCCGGACAATTCCGACTTCTGGAAACAGACCAC
+TACATAACCCCAACAACAGACCTCCCCCTAGGCCACTTCCGCCTACTAGAAGTCGACCAT
+TACATACTTCCCCCATTATTCCTAGAACCAGGCGACCTGCGACTCCTTGACGTTGACAAT
+TACATAATCCCCACCCAGGACCTAACCCCTGGACAATTCCGGCTACTAGAGACAGACCAC
+TATATAATCCCAACAAACGACCTAAAACCTGGTGAACTACGACTGCTAGAAGTTGATAAC
+TACATAATCCCAACCAATGACCTAAAACCAGGTGAACTTCGTCTATTAGAAGTTGATAAT
+TATATGATCCCCACACAAGAACTAAAGCCCGGAGAACTACGACTGCTAGAAGTAGACAAT
+TATATAATCCCAACATCAGACCTAAAGCCAGGAGAACTACGATTATTAGAAGTAGATAAC
+TATATAATTCCAACTAATGACCTTACCCCTGGACAATTCCGGCTGCTAGAAGTTGATAAT
+
+CGAGTTGTACTACCAATAGAAATAACAATCCGAATGTTAGTCTCCTCTGAAGACGTATTA
+CGAATAGTTGTTCCAATAGAATCCCCAGTCCGTGTCCTAGTATCTGCTGAAGACGTGCTA
+CGCATTGTAATCCCCATAGAATCCCCCATTCGAGTAATCATCACCGCTGATGACGTCCTC
+CGAGTAGTACTCCCGATTGAAGCCCCCATTCGTATAATAATTACATCACAAGACGTCTTG
+CGAATGGTTGTTCCCATAGAATCCCCTATTCGCATTCTTGTTTCCGCCGAAGATGTACTA
+CGAGTCGTTCTGCCAATAGAACTTCCAATCCGTATATTAATTTCATCTGAAGACGTCCTC
+CGGGTAGTCTTACCAATAGAACTTCCAATTCGTATACTAATCTCATCCGAAGACGTCCTG
+CGAGTAGTCCTCCCAATAGAAATAACAATCCGCATACTAATCTCATCAGAAGATGTACTC
+CGAGTTGTCTTACCTATAGAAATAACAATCCGAATATTAGTCTCATCAGAAGACGTACTC
+CGAATAGTAGTCCCAATAGAATCTCCAACCCGACTTTTAGTTACAGCCGAAGACGTCCTC
+
+CACTCATGAGCTGTGCCCTCTCTAGGACTAAAAACAGACGCAATCCCAGGCCGTCTAAAC
+CATTCTTGAGCTGTTCCATCCCTTGGCGTAAAAATGGACGCAGTCCCAGGACGACTAAAT
+CACTCATGAGCCGTACCCGCCCTCGGGGTAAAAACAGACGCAATCCCTGGACGACTAAAT
+CACTCATGAGCTGTCCCCACATTAGGCTTAAAAACAGATGCAATTCCCGGACGTCTAAAC
+CACTCCTGGGCCCTTCCAGCCATGGGGGTAAAGATAGACGCGGTCCCAGGACGCCTTAAC
+CACTCATGAGCAGTCCCCTCCCTAGGACTTAAAACTGATGCCATCCCAGGCCGACTAAAT
+CACTCATGAGCCATCCCTTCACTAGGGTTAAAAACCGACGCAATCCCCGGCCGCCTAAAC
+CACTCATGAGCCGTACCGTCCCTAGGACTAAAAACTGATGCTATCCCAGGACGACTAAAC
+CACTCATGGGCCGTACCCTCCTTGGGCCTAAAAACAGATGCAATCCCAGGACGCCTAAAC
+CACTCGTGAGCTGTACCCTCCTTGGGTGTCAAAACAGATGCAATCCCAGGACGACTTCAT
+
+CAAACAACCCTTATATCGTCCCGTCCAGGCTTATATTACGGTCAATGCTCAGAAATTTGC
+CAAGCCGCCTTTATTGCCTCACGCCCAGGGGTCTTTTACGGACAATGCTCTGAAATTTGT
+CAAACCTCCTTCATCACCACTCGACCAGGAGTGTTTTACGGACAATGCTCAGAAATCTGC
+CAAACCACTTTCACCGCTACACGACCGGGGGTATACTACGGTCAATGCTCTGAAATCTGT
+CAAACCGCCTTTATTGCCTCCCGCCCCGGGGTATTCTATGGGCAATGCTCAGAAATCTGT
+CAAGCAACAGTAACATCAAACCGACCAGGGTTATTCTATGGCCAATGCTCTGAAATTTGT
+CAAGCTACAGTCACATCAAACCGACCAGGTCTATTCTATGGCCAATGCTCTGAAATTTGC
+CAAACAACCCTAATAACCATACGACCAGGACTGTACTACGGTCAATGCTCAGAAATCTGT
+CAAACAACCTTAATATCAACACGACCAGGCCTATTTTATGGACAATGCTCAGAGATCTGC
+CAAACATCATTTATTGCTACTCGTCCGGGAGTATTTTACGGACAATGTTCAGAAATTTGC
+
+GGGTCAAACCACAGTTTCATACCCATTGTCCTTGAGTTAGTCCCACTAAAGTACTTTGAA
+GGAGCTAATCACAGCTTTATACCAATTGTAGTTGAAGCAGTACCTCTCGAACACTTCGAA
+GGAGCTAACCACAGCTACATACCCATTGTAGTAGAGTCTACCCCCCTAAAACACTTTGAA
+GGAGCAAACCACAGTTTCATGCCCATCGTCCTAGAATTAATTCCCCTAAAAATCTTTGAA
+GGAGCAAACCACAGCTTTATACCCATCGTAGTAGAAGCGGTCCCACTATCTCACTTCGAA
+GGATCTAACCATAGCTTTATGCCCATTGTCCTAGAAATGGTTCCACTAAAATATTTCGAA
+GGCTCAAATCACAGCTTCATACCCATTGTACTAGAAATAGTGCCTCTAAAATATTTCGAA
+GGTTCAAACCACAGCTTCATACCTATTGTCCTCGAATTGGTCCCACTATCCCACTTCGAG
+GGCTCAAACCACAGTTTCATACCAATTGTCCTAGAACTAGTACCCCTAGAAGTCTTTGAA
+GGAGCAAACCACAGCTTTATACCAATTGTAGTTGAAGCAGTACCGCTAACCGACTTTGAA
+
+AAATGATCTGCGTCAATATTA---------------------TAA
+AACTGATCCTCATTAATACTAGAAGACGCCTCGCTAGGAAGCTAA
+GCCTGATCCTCACTA------------------CTGTCATCTTAA
+ATA---------------------GGGCCCGTATTTACCCTATAG
+AACTGGTCCACCCTTATACTAAAAGACGCCTCACTAGGAAGCTAA
+AACTGATCTGCTTCAATAATT---------------------TAA
+AACTGATCAGCTTCTATAATT---------------------TAA
+AAATGATCTACCTCAATGCTT---------------------TAA
+AAATGATCTGTATCAATACTA---------------------TAA
+AACTGATCTTCATCAATACTA---GAAGCATCACTA------AGA
--- /dev/null
+10 705
+Cow ATGGCATATCCCATACAACTAGGATTCCAAGATGCAACATCACCAATCATAGAAGAACTACTTCACTTTCATGACCACACGCTAATAATTGTCTTCTTAATTAGCTCATTAGTACTTTACATTATTTCACTAATACTAACGACAAAGCTGACCCATACAAGCACGATAGATGCACAAGAAGTAGAGACAATCTGAACCATTCTGCCCGCCATCATCTTAATTCTAATTGCTCTTCCTTCTTTACGAATTCTATACATAATAGATGAAATCAATAACCCATCTCTTACAGTAAAAACCATAGGACATCAGTGATACTGAAGCTATGAGTATACAGATTATGAGGACTTAAGCTTCGACTCCTACATAATTCCAACATCAGAATTAAAGCCAGGGGAGCTACGACTATTAGAAGTCGATAATCGAGTTGTACTACCAATAGAAATAACAATCCGAATGTTAGTCTCCTCTGAAGACGTATTACACTCATGAGCTGTGCCCTCTCTAGGACTAAAAACAGACGCAATCCCAGGCCGTCTAAACCAAACAACCCTTATATCGTCCCGTCCAGGCTTATATTACGGTCAATGCTCAGAAATTTGCGGGTCAAACCACAGTTTCATACCCATTGTCCTTGAGTTAGTCCCACTAAAGTACTTTGAAAAATGATCTGCGTCAATATTA---------------------TAA
+Carp ATGGCACACCCAACGCAACTAGGTTTCAAGGACGCGGCCATACCCGTTATAGAGGAACTTCTTCACTTCCACGACCACGCATTAATAATTGTGCTCCTAATTAGCACTTTAGTTTTATATATTATTACTGCAATGGTATCAACTAAACTTACTAATAAATATATTCTAGACTCCCAAGAAATCGAAATCGTATGAACCATTCTACCAGCCGTCATTTTAGTACTAATCGCCCTGCCCTCCCTACGCATCCTGTACCTTATAGACGAAATTAACGACCCTCACCTGACAATTAAAGCAATAGGACACCAATGATACTGAAGTTACGAGTATACAGACTATGAAAATCTAGGATTCGACTCCTATATAGTACCAACCCAAGACCTTGCCCCCGGACAATTCCGACTTCTGGAAACAGACCACCGAATAGTTGTTCCAATAGAATCCCCAGTCCGTGTCCTAGTATCTGCTGAAGACGTGCTACATTCTTGAGCTGTTCCATCCCTTGGCGTAAAAATGGACGCAGTCCCAGGACGACTAAATCAAGCCGCCTTTATTGCCTCACGCCCAGGGGTCTTTTACGGACAATGCTCTGAAATTTGTGGAGCTAATCACAGCTTTATACCAATTGTAGTTGAAGCAGTACCTCTCGAACACTTCGAAAACTGATCCTCATTAATACTAGAAGACGCCTCGCTAGGAAGCTAA
+Chicken ATGGCCAACCACTCCCAACTAGGCTTTCAAGACGCCTCATCCCCCATCATAGAAGAGCTCGTTGAATTCCACGACCACGCCCTGATAGTCGCACTAGCAATTTGCAGCTTAGTACTCTACCTTCTAACTCTTATACTTATAGAAAAACTATCA---TCAAACACCGTAGATGCCCAAGAAGTTGAACTAATCTGAACCATCCTACCCGCTATTGTCCTAGTCCTGCTTGCCCTCCCCTCCCTCCAAATCCTCTACATAATAGACGAAATCGACGAACCTGATCTCACCCTAAAAGCCATCGGACACCAATGATACTGAACCTATGAATACACAGACTTCAAGGACCTCTCATTTGACTCCTACATAACCCCAACAACAGACCTCCCCCTAGGCCACTTCCGCCTACTAGAAGTCGACCATCGCATTGTAATCCCCATAGAATCCCCCATTCGAGTAATCATCACCGCTGATGACGTCCTCCACTCATGAGCCGTACCCGCCCTCGGGGTAAAAACAGACGCAATCCCTGGACGACTAAATCAAACCTCCTTCATCACCACTCGACCAGGAGTGTTTTACGGACAATGCTCAGAAATCTGCGGAGCTAACCACAGCTACATACCCATTGTAGTAGAGTCTACCCCCCTAAAACACTTTGAAGCCTGATCCTCACTA------------------CTGTCATCTTAA
+Human ATGGCACATGCAGCGCAAGTAGGTCTACAAGACGCTACTTCCCCTATCATAGAAGAGCTTATCACCTTTCATGATCACGCCCTCATAATCATTTTCCTTATCTGCTTCCTAGTCCTGTATGCCCTTTTCCTAACACTCACAACAAAACTAACTAATACTAACATCTCAGACGCTCAGGAAATAGAAACCGTCTGAACTATCCTGCCCGCCATCATCCTAGTCCTCATCGCCCTCCCATCCCTACGCATCCTTTACATAACAGACGAGGTCAACGATCCCTCCCTTACCATCAAATCAATTGGCCACCAATGGTACTGAACCTACGAGTACACCGACTACGGCGGACTAATCTTCAACTCCTACATACTTCCCCCATTATTCCTAGAACCAGGCGACCTGCGACTCCTTGACGTTGACAATCGAGTAGTACTCCCGATTGAAGCCCCCATTCGTATAATAATTACATCACAAGACGTCTTGCACTCATGAGCTGTCCCCACATTAGGCTTAAAAACAGATGCAATTCCCGGACGTCTAAACCAAACCACTTTCACCGCTACACGACCGGGGGTATACTACGGTCAATGCTCTGAAATCTGTGGAGCAAACCACAGTTTCATGCCCATCGTCCTAGAATTAATTCCCCTAAAAATCTTTGAAATA---------------------GGGCCCGTATTTACCCTATAG
+Loach ATGGCACATCCCACACAATTAGGATTCCAAGACGCGGCCTCACCCGTAATAGAAGAACTTCTTCACTTCCATGACCATGCCCTAATAATTGTATTTTTGATTAGCGCCCTAGTACTTTATGTTATTATTACAACCGTCTCAACAAAACTCACTAACATATATATTTTGGACTCACAAGAAATTGAAATCGTATGAACTGTGCTCCCTGCCCTAATCCTCATTTTAATCGCCCTCCCCTCACTACGAATTCTATATCTTATAGACGAGATTAATGACCCCCACCTAACAATTAAGGCCATGGGGCACCAATGATACTGAAGCTACGAGTATACTGATTATGAAAACTTAAGTTTTGACTCCTACATAATCCCCACCCAGGACCTAACCCCTGGACAATTCCGGCTACTAGAGACAGACCACCGAATGGTTGTTCCCATAGAATCCCCTATTCGCATTCTTGTTTCCGCCGAAGATGTACTACACTCCTGGGCCCTTCCAGCCATGGGGGTAAAGATAGACGCGGTCCCAGGACGCCTTAACCAAACCGCCTTTATTGCCTCCCGCCCCGGGGTATTCTATGGGCAATGCTCAGAAATCTGTGGAGCAAACCACAGCTTTATACCCATCGTAGTAGAAGCGGTCCCACTATCTCACTTCGAAAACTGGTCCACCCTTATACTAAAAGACGCCTCACTAGGAAGCTAA
+Mouse ATGGCCTACCCATTCCAACTTGGTCTACAAGACGCCACATCCCCTATTATAGAAGAGCTAATAAATTTCCATGATCACACACTAATAATTGTTTTCCTAATTAGCTCCTTAGTCCTCTATATCATCTCGCTAATATTAACAACAAAACTAACACATACAAGCACAATAGATGCACAAGAAGTTGAAACCATTTGAACTATTCTACCAGCTGTAATCCTTATCATAATTGCTCTCCCCTCTCTACGCATTCTATATATAATAGACGAAATCAACAACCCCGTATTAACCGTTAAAACCATAGGGCACCAATGATACTGAAGCTACGAATATACTGACTATGAAGACCTATGCTTTGATTCATATATAATCCCAACAAACGACCTAAAACCTGGTGAACTACGACTGCTAGAAGTTGATAACCGAGTCGTTCTGCCAATAGAACTTCCAATCCGTATATTAATTTCATCTGAAGACGTCCTCCACTCATGAGCAGTCCCCTCCCTAGGACTTAAAACTGATGCCATCCCAGGCCGACTAAATCAAGCAACAGTAACATCAAACCGACCAGGGTTATTCTATGGCCAATGCTCTGAAATTTGTGGATCTAACCATAGCTTTATGCCCATTGTCCTAGAAATGGTTCCACTAAAATATTTCGAAAACTGATCTGCTTCAATAATT---------------------TAA
+Rat ATGGCTTACCCATTTCAACTTGGCTTACAAGACGCTACATCACCTATCATAGAAGAACTTACAAACTTTCATGACCACACCCTAATAATTGTATTCCTCATCAGCTCCCTAGTACTTTATATTATTTCACTAATACTAACAACAAAACTAACACACACAAGCACAATAGACGCCCAAGAAGTAGAAACAATTTGAACAATTCTCCCAGCTGTCATTCTTATTCTAATTGCCCTTCCCTCCCTACGAATTCTATACATAATAGACGAGATTAATAACCCAGTTCTAACAGTAAAAACTATAGGACACCAATGATACTGAAGCTATGAATATACTGACTATGAAGACCTATGCTTTGACTCCTACATAATCCCAACCAATGACCTAAAACCAGGTGAACTTCGTCTATTAGAAGTTGATAATCGGGTAGTCTTACCAATAGAACTTCCAATTCGTATACTAATCTCATCCGAAGACGTCCTGCACTCATGAGCCATCCCTTCACTAGGGTTAAAAACCGACGCAATCCCCGGCCGCCTAAACCAAGCTACAGTCACATCAAACCGACCAGGTCTATTCTATGGCCAATGCTCTGAAATTTGCGGCTCAAATCACAGCTTCATACCCATTGTACTAGAAATAGTGCCTCTAAAATATTTCGAAAACTGATCAGCTTCTATAATT---------------------TAA
+Seal ATGGCATACCCCCTACAAATAGGCCTACAAGATGCAACCTCTCCCATTATAGAGGAGTTACTACACTTCCATGACCACACATTAATAATTGTGTTCCTAATTAGCTCATTAGTACTCTACATTATCTCACTTATACTAACCACGAAACTCACCCACACAAGTACAATAGACGCACAAGAAGTGGAAACGGTGTGAACGATCCTACCCGCTATCATTTTAATTCTCATTGCCCTACCATCATTACGAATCCTCTACATAATGGACGAGATCAATAACCCTTCCTTGACCGTAAAAACTATAGGACATCAGTGATACTGAAGCTATGAGTACACAGACTACGAAGACCTGAACTTTGACTCATATATGATCCCCACACAAGAACTAAAGCCCGGAGAACTACGACTGCTAGAAGTAGACAATCGAGTAGTCCTCCCAATAGAAATAACAATCCGCATACTAATCTCATCAGAAGATGTACTCCACTCATGAGCCGTACCGTCCCTAGGACTAAAAACTGATGCTATCCCAGGACGACTAAACCAAACAACCCTAATAACCATACGACCAGGACTGTACTACGGTCAATGCTCAGAAATCTGTGGTTCAAACCACAGCTTCATACCTATTGTCCTCGAATTGGTCCCACTATCCCACTTCGAGAAATGATCTACCTCAATGCTT---------------------TAA
+Whale ATGGCATATCCATTCCAACTAGGTTTCCAAGATGCAGCATCACCCATCATAGAAGAGCTCCTACACTTTCACGATCATACACTAATAATCGTTTTTCTAATTAGCTCTTTAGTTCTCTACATTATTACCCTAATGCTTACAACCAAATTAACACATACTAGTACAATAGACGCCCAAGAAGTAGAAACTGTCTGAACTATCCTCCCAGCCATTATCTTAATTTTAATTGCCTTGCCTTCATTACGGATCCTTTACATAATAGACGAAGTCAATAACCCCTCCCTCACTGTAAAAACAATAGGTCACCAATGATATTGAAGCTATGAGTATACCGACTACGAAGACCTAAGCTTCGACTCCTATATAATCCCAACATCAGACCTAAAGCCAGGAGAACTACGATTATTAGAAGTAGATAACCGAGTTGTCTTACCTATAGAAATAACAATCCGAATATTAGTCTCATCAGAAGACGTACTCCACTCATGGGCCGTACCCTCCTTGGGCCTAAAAACAGATGCAATCCCAGGACGCCTAAACCAAACAACCTTAATATCAACACGACCAGGCCTATTTTATGGACAATGCTCAGAGATCTGCGGCTCAAACCACAGTTTCATACCAATTGTCCTAGAACTAGTACCCCTAGAAGTCTTTGAAAAATGATCTGTATCAATACTA---------------------TAA
+Frog ATGGCACACCCATCACAATTAGGTTTTCAAGACGCAGCCTCTCCAATTATAGAAGAATTACTTCACTTCCACGACCATACCCTCATAGCCGTTTTTCTTATTAGTACGCTAGTTCTTTACATTATTACTATTATAATAACTACTAAACTAACTAATACAAACCTAATGGACGCACAAGAGATCGAAATAGTGTGAACTATTATACCAGCTATTAGCCTCATCATAATTGCCCTTCCATCCCTTCGTATCCTATATTTAATAGATGAAGTTAATGATCCACACTTAACAATTAAAGCAATCGGCCACCAATGATACTGAAGCTACGAATATACTAACTATGAGGATCTCTCATTTGACTCTTATATAATTCCAACTAATGACCTTACCCCTGGACAATTCCGGCTGCTAGAAGTTGATAATCGAATAGTAGTCCCAATAGAATCTCCAACCCGACTTTTAGTTACAGCCGAAGACGTCCTCCACTCGTGAGCTGTACCCTCCTTGGGTGTCAAAACAGATGCAATCCCAGGACGACTTCATCAAACATCATTTATTGCTACTCGTCCGGGAGTATTTTACGGACAATGTTCAGAAATTTGCGGAGCAAACCACAGCTTTATACCAATTGTAGTTGAAGCAGTACCGCTAACCGACTTTGAAAACTGATCTTCATCAATACTA---GAAGCATCACTA------AGA
--- /dev/null
+>EMBLCDS|ADZ17331/1-1593 Homo sapiens (human) estrogen nuclear receptor beta variant a
+atggatataaaaaactcaccatctagccttaattctccttcctcctacaactgcagtcaatccatcttaccc
+ctggagcacggctccatatacataccttcctcctatgtagacagccaccatgaatatccagccatgacattc
+tatagccctgctgtgatgaattacagcattcccagcaatgtcactaacttggaaggtgggcctggtcggcag
+accacaagcccaaatgtgttgtggccaacacctgggcacctttctcctttagtggtccatcgccagttatca
+catctgtatgcggaacctcaaaagagtccctggtgtgaagcaagatcgctagaacacaccttacctgtaaac
+agagagacactgaaaaggaaggttagtgggaaccgttgcgccagccctgttactggtccaggttcaaagagg
+gatgctcacttctgcgctgtctgcagcgattacgcatcgggatatcactatggagtctggtcgtgtgaagga
+tgtaaggccttttttaaaagaagcattcaaggacataatgattatatttgtccagctacaaatcagtgtaca
+atcgataaaaaccggcgcaagagctgccaggcctgccgacttcggaagtgttacgaagtgggaatggtgaag
+tgtggctcccggagagagagatgtgggtaccgccttgtgcggagacagagaagtgccgacgagcagctgcac
+tgtgccggcaaggccaagagaagtggcggccacgcgccccgagtgcgggagctgctgctggacgccctgagc
+cccgagcagctagtgctcaccctcctggaggctgagccgccccatgtgctgatcagccgccccagtgcgccc
+ttcaccgaggcctccatgatgatgtccctgaccaagttggccgacaaggagttggtacacatgatcagctgg
+gccaagaagattcccggctttgtggagctcagcctgttcgaccaagtgcggctcttggagagctgttggatg
+gaggtgttaatgatggggctgatgtggcgctcaattgaccaccccggcaagctcatctttgctccagatctt
+gttctggacagggatgaggggaaatgcgtagaaggaattctggaaatctttgacatgctcctggcaactact
+tcaaggtttcgagagttaaaactccaacacaaagaatatctctgtgtcaaggccatgatcctgctcaattcc
+agtatgtaccctctggtcacagcgacccaggatgctgacagcagccggaagctggctcacttgctgaacgcc
+gtgaccgatgctttggtttgggtgattgccaagagcggcatctcctcccagcagcaatccatgcgcctggct
+aacctcctgatgctcctgtcccacgtcaggcatgcgagtaacaagggcatggaacatctgctcaacatgaag
+tgcaaaaatgtggtcccagtgtatgacctgctgctggagatgctgaatgcccacgtgcttcgcgggtgcaag
+tcctccatcacggggtccgagtgcagcccggcagaggacagtaaaagcaaagagggctcccagaacccacag
+tctcagtga
+>EMBLCDS|AAK93056/1-1455 Drosophila melanogaster (fruit fly) GH28308p
+atgtccgacggcgtcagcatcttgcacatcaaacaggaggtggacactccatcggcgtcctgctttagtccc
+agctccaagtcaacggccacgcagagtggcacaaacggcctgaaatcctcgccctcggtttcgccggaaagg
+cagctctgcagctcgacgacctctctatcctgcgatttgcacaatgtatccttaagcaatgatggcgatagt
+ctgaaaggaagtggtacaagtggcggcaatggcggaggaggaggtggtggtacgagtggtggaaatgcgacc
+aatgcgagtgccggagctggatcgggatccgtcagggacgagctccgccgattgtgtttggtttgtggcgat
+gtggccagtggattccactatggtgtggcgagttgtgaggcttgcaaagcgttctttaaacgcaccatccaa
+ggcaacatcgagtacacgtgtccggcgaacaacgagtgtgagattaacaagcggagacgcaaggcctgccaa
+gcgtgtcgcttccagaaatgtctactaatgggcatgctcaaggagggtgtgcgcttggatcgagttcgtgga
+ggacggcagaagtaccgaaggaatcctgtatcaaactcttaccagactatgcagctgctataccaatccaac
+accacctcgctgtgcgatgtcaagatactggaggtgctcaattcatatgagccggatgccttgagcgtccaa
+acgccgccgccgcaagtccacacgactagcataactaatgatgaggcctcatcctcctcgggcagcataaaa
+ctggagtccagcgttgttacgcccaatgggacttgcattttccaaaacaacaacaacaatgatcccaatgag
+atactaagcgtccttagtgatatttacgacaaggaattggtcagcgtcattggctgggccaagcagatacct
+ggctttatagatctgccacttaacgaccagatgaagcttctccaggtgtcgtgggcagagatcctgacgctc
+cagctgaccttccggtccctaccgttcaatggcaagttatgcttcgccacggatgtctggatggatgaacat
+ttggccaaggagtgcggttacacggagttctactaccactgcgtccagatcgcacagcgcatggaaagaata
+tcgccacgaagggaggagtactacttgctaaaggcgctcctgctggccaactgcgacattctgctggatgat
+cagagttccctgcgcgcatttcgtgatacgattcttaattctctaaacgatgtggtctacttgctgcgtcat
+tcgtcggccgtgtcgcatcagcaacaattgctgcttttgctgccttcgctgcggcaggcggatgatatcctg
+cgaagattttggcgtggaattgcacgcgatgaagtcattaccatgaagaaactgttcctcgagatgctcgag
+ccgctggccaggtga
+>EMBLCDS|BAA89539/1-2133 Anguilla japonica (Japanese eel) progesterone receptor
+atggacaacaatcaccaagacaagatggaaagtctatacacgccagccagagcatcaccaactcctgatgca
+gaatcgattaaaagagccaggaatttgattaaaacatactcggagtcttttgggagttatgtggaggagata
+gttcgagacgactcgaataacatacaatctttgagcagcgtccctctcttgatgcgtaattttggaaacatg
+gacaccctaacctgcgcacctggctcgggtagtgacagtgagatttggaaagactttgttgttcccgggaac
+tctgtggtaagcaaagacacctgtggtcatgttgaaatatccactaaagccgaaaatttgtcttgggctgcc
+gcgcccttaagtagagaagaaaccctcgcgaaaggaactgttacggtcccagcgactgtgcctaaagaaagt
+tttaccgcaacatcaaacacttcttcagccagtggaatctctattaaagatgaacaacaatctttgctcaaa
+atggaaccacagtcttctgacttttgtccttatacagcaaatataccgaaattgaatccatcttatctgacc
+aatactgcgagtacgaaacaacttggatatggcgaacagccggacacttcagcgcactcctctccacctgct
+cagaagattgttttagatactgctcgatactcggccgatttatgttcggataaccctttaccgcaagcgaca
+aatatcaaaacagatccttgtagtagtttctcttctttcgttggagaagggatccttactagggcatctatg
+ggctactcacagcaagcgattcagacattgccggtgcacaagagtgaaccgttcaggttgtctgcttcgagc
+gcgcccgcggattctccgttttggtgccaatccacgggtccttctgaggatcatcatctgcagattgactat
+ctatctcccgctggactccacagcacatgcaaatacagttccacgaacgcgtacagctcctatttaggtgtg
+ctgccccagagggtgtgcgtcatctgtggggatgaagcatcaggctgtcactatggtgtcctcacctgtggc
+agctgtaaggtgttctttaagagggcagtggaaggccatcataactacttgtgtgctggacggaatgactgc
+atcgtggacaagatccgtaggaaaaactgtcctgcttgtcgcctcagaaagtgctaccaggcgggaatgata
+ctgggaggtcggaagctgaagaagttgggggctctgaaggcagcagggctgacccaggccctggtggcccac
+tcactgactcctcggaggctctctggtgacagccaggccctgatgcccctgggctgccttccaggggtccgg
+gagctgcacctttccccacagatcatcagcgtgctggagagcattgagcctgaggtggtgtactctggttat
+gacaactcccagcctgacatgcccaatatgctgctcaacagcctcaaccgcttatgtgagaggcagctgctg
+aggattgtcaagtggtccaagtctttaccaggttttcgcagtttacacatcaatgaccaaatggctctgatc
+cagtactcctggatgagcttaatggtattttctttgggttggcggtctttccaaaatgtcaccagtgattac
+ctgtactttgcacctgacctcattctcaacgaagagtatatgaggaggtctccaatatttgacctgtgcatg
+gccatgcagttcatccctcaagagtttgccaatctccaggtgaccaaggaggagtttctgtgcatgaaggtc
+ttgctgttgctcaacacagtgcctctggaggggttgaagagccagccacagtttgatgagatgaggcagaat
+tacatccatgaactcaccaaggccattcacctgcgagagaatggtgtggtcgcctgctcccagcgtttctac
+cacctgaccaagctgatggaccacatgcatgacattgtgaagaagctccacctgtactgcctgagcactttc
+attcaggcagatgccatgcgggtagagttccccgagatgatgtcagaagtcatcgcctcccagctgcctcgg
+gtgctcgctggaatggtgaaaccccttctttttcacaccaaatga
+>EMBLCDS|AHW56473/1-1590 Homo sapiens (human) partial estrogen receptor 2 isoform A
+atggatataaaaaactcaccatctagccttaattctccttcctcctacaactgcagtcaatccatcttaccc
+ctggagcacggctccatatacataccttcctcctatgtagacagccaccatgaatatccagccatgacattc
+tatagccctgctgtgatgaattacagcattcccagcaatgtcactaacttggaaggtgggcctggtcggcag
+accacaagcccaaatgtgttgtggccaacacctgggcacctttctcctttagtggtccatcgccagttatca
+catctgtatgcggaacctcaaaagagtccctggtgtgaagcaagatcgctagaacacaccttacctgtaaac
+agagagacactgaaaaggaaggttagtgggaaccgttgcgccagccctgttactggtccaggttcaaagagg
+gatgctcacttctgcgctgtctgcagcgattacgcatcgggatatcactatggagtctggtcgtgtgaagga
+tgtaaggccttttttaaaagaagcattcaaggacataatgattatatttgtccagctacaaatcagtgtaca
+atcgataaaaaccggcgcaagagctgccaggcctgccgacttcggaagtgttacgaagtgggaatggtgaag
+tgtggctcccggagagagagatgtgggtaccgccttgtgcggagacagagaagtgccgacgagcagctgcac
+tgtgccggcaaggccaagagaagtggcggccacgcgccccgagtgcgggagctgctgctggacgccctgagc
+cccgagcagctagtgctcaccctcctggaggctgagccgccccatgtgctgatcagccgccccagtgcgccc
+ttcaccgaggcctccatgatgatgtccctgaccaagttggccgacaaggagttggtacacatgatcagctgg
+gccaagaagattcccggctttgtggagctcagcctgttcgaccaagtgcggctcttggagagctgttggatg
+gaggtgttaatgatggggctgatgtggcgctcaattgaccaccccggcaagctcatctttgctccagatctt
+gttctggacagggatgaggggaaatgcgtagaaggaattctggaaatctttgacatgctcctggcaactact
+tcaaggtttcgagagttaaaactccaacacaaagaatatctctgtgtcaaggccatgatcctgctcaattcc
+agtatgtaccctctggtcacagcgacccaggatgctgacagcagccggaagctggctcacttgctgaacgcc
+gtgaccgatgctttggtttgggtgattgccaagagcggcatctcctcccagcagcaatccatgcgcctggct
+aacctcctgatgctcctgtcccacgtcaggcatgcgagtaacaagggcatggaacatctgctcaacatgaag
+tgcaaaaatgtggtcccagtgtatgacctgctgctggagatgctgaatgcccacgtgcttcgcgggtgcaag
+tcctccatcacggggtccgagtgcagcccggcagaggacagtaaaagcaaagagggctcccagaacccacag
+tctcag
+>EMBLCDS|BAA75464/1-2547 Anguilla japonica (Japanese eel) androgen receptor alpha
+atggagattccagttgggttaggaggagtttcagatgccacaaacgccgtttttcgcggaccttaccaaaac
+gttttccacagccttcaagtggcatttcagagtcacggtgccgtctccaggagcttagattttccaaataca
+aagtacggttttttacaaaacagacatttctgtgaaatgcgtcaggagaacaagcagccgccatgcaaagga
+ctcggcctattttacgggaaccatcgtaattcggacactgggacaaacgaagacgacatcgcttgtttttcc
+agacagtccgacgctgaagccagacctggtattttttctgaaagctcattggatactggagacgagattact
+tgcaaactccagtcagacaaccaaggggtaagagcgagcggtcctctcctaccgggctctagcggctgcaat
+tcgggacaaaagtcctcccttgcttgtacgtcccaacaaagggagacaacatctcaaagtgacacctgcgca
+ggagagagctgctcggaacatcaagcaactaccatttcggaaactgcgcgcgaattgtgcaacgccgtttcc
+gtgtcgctgggcttgaatttagatcttaatgatatgaatgacctaagttcaaaccaaatatcgtctaccgaa
+agtgacacaagtcaagccatctacttatttgaatcttcacctgggtatactggggtcggactgaacgccttg
+gtaagagactgtaaatgtcagagtgcacgcgaagggacatcgacacaacagtacgaccgcggggcaatgttt
+aagataaaccgtgtaaatgacttgccgcttcagccagcacccccgcgacacaccagcattagcgatgctaaa
+tgggacatggaagcaggtttgtgtgcgcagatggagcacaaagactctgaaaagtgcgcgaatatggatggt
+gcacactccacttctgtcttctcccagttcgaccaactgttgccagtaaacgcgtcgcactacagtcagaac
+gtttcggtcagagtggaaccacaaagtgatttctctccgattttgtacaaatcacctggtattcagaaaaat
+gccgaaaagtacaatgtccaatatgatgccacaattaaatcagaagatgggaaaacgacatctgaacgggaa
+tggggttttcagtacaggtacaatgaaagctgcagcacaccgtcagcacctcctagacattgtgcacatcag
+aacagggccggaccgtacaaccagttcttttttaatccatttgaatatgcgaaaagaggtgttgtctcaagg
+gaaggatattctctcgaacatgggttcccaaacaatctcgctcggacaccctactctggttccttgaaaaac
+gaactaggagatcgtctgagtgggccataccctgacgtcagttacaggtacgagggcgagcgggagaacgtg
+ttccccgtggagttcttctttccgccgcagaggacctgcctgatctgcggggacgaggcctcgggctgtcac
+tatggagccctcacctgcggcagctgcaaggtgttcttcaagagggccgcggaagggaaacagaagtacctg
+tgcgccagcatcaatgattgcaccattgataaacttcgaaggaagaactgcccctcttgccgtctcaaaagg
+tgctttgctgccggaatgacccttggagcgcggaagctgaagaagatcgggcaaatgagggcccccgaggat
+ggccaggggcagggcccggcggaagcggagctgagcgtctcccccaagtacgacctgggcttccacacccag
+tccatgttcctcaacatcctggaggccatcgagccggaggtggtgaacgccgggcacgactatggccagccg
+gactctgcggccagcctgctgaccagcctcaacgagctcggagaacggcaactcgtcaaggtcgtcaagtgg
+gccaagggcatgccaggttttcggagtctgtacgtggatgaccagatgacagtcatccagcactcctggatg
+gcagtgatggtgttcgctctgggctggaggtcatttaagaatgtgaagtccaggatgctttactttgctcct
+gaccttgttttcaacgagcaccgaatgcaggtgtccaccatgtatgaacactgcatccggatgaagaacttc
+tcccaggagtttgctatgctgcaggtctcccaggaagagttcctgtgcatgaaagctctgcttctcttcagc
+accatccccgttgaagggctgaaggggcagaatttctttgacgagctgcggaggagctacattaacgagctg
+gaccggctggttagcttcaggagcaagtccagctgttccgagaggttccagcagctcacccgcctcctggac
+tccctccaacctgttctgaagaagctccaccagtttacgttcgaccttttcgtccagtcccagaacctctcc
+aaccaagtttgctttcccgagatgatctcagagatcatatccgtgcacgtgccaaagattctcgctggcacg
+gtgaagccaatcctcttccacaagtag
+>EMBLCDS|AAK20930/1-1317 Petromyzon marinus (sea lamprey) partial corticoid receptor
+ggggtggagtttcagttgccctactcggcatctgccacatcctttcgtccgtccgttgccacctcgtccgcc
+tcgggcatctccaacttttcaaatgggaataattttggattcctttctcccaatggagtacaacaggatgga
+tttccttaccctggtttcacgagtcccgcacagtcctcagtccctccgcagaaggcgtgtctcatctgtagt
+gatgaggcttcgggctgccactacggagtgctcacctgtggaagctgcaaggtgttcttcaagcgtgccgtg
+gaaggacagcacaattatctgtgcgccggacgaaacgactgcatcattgacaagatccgccgcaagaactgc
+ccagcttgccgtctgcgcaagtgcatccaggctggaatgacgctaggagcacgcaagcttaagaagcaaggc
+cgggtaaagggagagaaccagcgcagcccagcgtcctccacagccaccacctcgtctgccaccccgcaaccc
+tccagcaactcgacggccgtgaccacgttctcgccaccgccgaccggagagcccattttctcacccacactc
+atcgccatcctgcaggcgatcgagcccgaggtggtcatgtccggctatgacaacacgcggtcccagaccacc
+gcctacatgctgtcgagcctcaaccgcctctgcgacaagcagctcgtgtccattgtcaagtgggccaagtct
+ctgccaggtttccgaaacctgcacatcgacgaccagatggtgttaatccagtactcatggatgggcctgatg
+tcatttgccatgagctggaggtccttccagcacaccaacagcaagctgctctactttgctcctgatctggtt
+tttgatgagacgcgcatgcagcartcggcgatgtatcaattgtgcgtggaaatgaggcaagtctcggaggac
+ttcatgaagttgcaagtcacttcagaggagtttctgtgcatgaaagccatcttgctcctgagtactgtccca
+caagagggtctgaagagccagggctgcttcgaggagatgcggatcagctacatccgggaattgaaccggacc
+atcgcgcggacggagaagaatgccgtgcagtgttggcagcgcttctaccagctcaccaagctgctggrctgc
+atgcaggatctcgtgagcaagctcctggagttctgcttcgcaaccttcacgcagacgcaggtgtggagtgtg
+gagtttcctgacatgatggccgagatcatcagtgcgcagcttgcctcgcatcatggccgagaagcccgggca
+ctccacttccacaagaaatga
+>EMBLCDS|AAA17402/1-1032 Serinus canaria (common canary) partial androgen receptor
+gaagcctccgggtgccactacggagccctgacgtgtgggagctgcaaagtgttcttcaaacgggcagctgaa
+ggtaaacagaagtacctctgtgccagccgcaacgactgcaccatcgacaagttccggcggaaaaactgcccc
+tcctgccgcctgcgcaagtgctacgaggccgggatgacgcttggagcccgcaagctgaagaaactgggtaac
+ctgaaggcacaggacgacatagagggagccagctcgtccagcccaacggaggagcaagctcccaagctggtg
+atgacacgcattgatggctacgagtgccagcccatcttcctcaacgtcctggaggccatcgagcctggggtg
+gtgtgtgctggccatgacaacagccagcctgactccttctccaacctgctgaccagcctgaatgagcttggg
+gagaggcagctggtctacgtggtcaaatgggcaaaggctctgccaggatttcgcaacctgcatgtggatgac
+cagatgtcaataatccagtactcttggatgggcctgatggtgtttgctatggggtggagatccttcaccaac
+gtcaattccaggatgctttactttgctccagacctggtcttcaatgagtaccgcatgcacaaatccaggatg
+tacagccagtgcatcaggatgcggcacctctcccaggaattcgggtggcttcagatcacaccccaggggttc
+ctctgtatgaaggctctcctcttcttcagtattattccagtggatggcctgaagaaccagaagctcttcgat
+gagctccgcatgaattacatcaaggaacttgaccgtatcattgcctgcaagaggaagaaccccacctcatgc
+tcccggaggttttaccagctcaccaaggtcctggactccgtgactccgattgccaaggacctgcatcagttt
+acatttgatctcctaatcaaggcacacatggtgagcgtggactacccagaaatgatggctgagatcatctct
+gtgcaggttcccaagatcctgtct
+>EMBLCDS|AAL37553/1-1455 Drosophila melanogaster (fruit fly) estrogen-related receptor
+atgtccgacggcgtcagcatcttgcacatcaaacaggaggtggacactccatcggcgtcctgctttagtccc
+agctccaagtcaacggccacgcagagtggcacaaacggcctgaaatcctcgccctcggtttcgccggaaagg
+cagctctgcagctcgacgacctctctatcctgcgatttgcacaatgtatccttaagcaatgatggcgatagt
+ctgaaaggaagtggtacaagtggcggcaatggcggaggaggaggtggtggtacgagtggtggaaatgcgacc
+aatgcgagtgccggagctggatcgggatccgtcagggacgagctccgccgattgtgtttggtttgtggcgat
+gtggccagtggattccactatggtgtggcgagttgtgaggcttgcaaagcgttctttaaacgcaccatccaa
+ggcaacatcgagtacacgtgtccggcgaacaacgagtgtgagattaacaagcggagacgcaaggcctgccaa
+gcgtgtcgcttccagaaatgtctactaatgggcatgctcaaggagggtgtgcgcttggatcgagttcgtgga
+ggacggcagaagtaccgaaggaatcctgtatcaaactcttaccagactatgcagctgctataccaatccaac
+accacctcgctgtgcgatgtcaagatactggaggtgctcaattcatatgagccggatgccttgagcgtccaa
+acgccgccgccgcaagtccacacgactagcataactaatgatgaggcctcatcctcctcgggcagcataaaa
+ctggagtccagcgttgttacgcccaatgggacttgcattttccaaaacaacaacaacaatgatcccaatgag
+atactaagcgtccttagtgatatttacgacaaggaattggtcagcgtcattggctgggccaagcagatacct
+ggctttatagatctgccacttaacgaccagatgaagcttctccaggtgtcgtgggcagagatcctgacgctc
+cagctgaccttccggtccctaccgttcaatggcaagttatgcttcgccacggatgtctggatggatgaacat
+ttggccaaggagtgcggttacacggagttctactaccactgcgtccagatcgcacagcgcatggaaagaata
+tcgccacgaagggaggagtactacttgctaaaggcgctcctgctggccaactgcgacattctgctggatgat
+cagagttccctgcgcgcatttcgtgatacgattcttaattctctaaacgatgtggtctacttgctgcgtcat
+tcgtcggccgtgtcgcatcagcaacaattgctgcttttgctgccttcgctgcggcaggcggatgatatcctg
+cgaagattttggcgtggaattgcacgcgatgaagtcattaccatgaagaaactgttcctcgagatgctcgag
+ccgctggccaggtga
+>EMBLCDS|AAK20929/1-1662 Petromyzon marinus (sea lamprey) partial estrogen receptor
+gcacgaggcttcagcgaggcacatggctacgagtactccggggcctcgctctaccagccactgcctccctcg
+tgcacagagttctcaattggagctcatcaacaacaacaacatcagcaccagcatcaccagcaccagcatcag
+cagcaccaccaccagcagcagcagcagcagccacagccgcagcagaatggagttttgggcgaggggcagagt
+tcccatctctcttatcttccgccctcgaccgagctgccccagtacgtgccctccagccccagcgcgccctac
+agcatggagctcggggcagggcgtcctcacggctacgacccagggccacagagcctctacaggggcggtgtg
+gagagcagcgcccccccgtacagcgagcagcagcaggtggtgggcggcggcggagccatgtcggccatgggc
+ttgacagagccacgccacgtcagctccggatcgctacccagcagcacgaggcccgagcgcagcacccagttc
+tgtgccgtgtgcagcgactatgcctcggggtaccactacggcgtgtggtcctgcgagggctgcaaagccttc
+ttcaagcgcagcacgcaaggccacaatgactacatgtgcccggccaccaaccagtgcaccatcgacaggaac
+cgtcgcaagagctgtcaggcttgccgcctgcgtaagtgctacgaagtgggcatggtcaaaggcgttcgcaag
+gaccgcaaaggctttcgaggggtcaagcacaaacgtaagcgccccatcccccaaaagaatgggggagaagga
+ggtgccggcggcggccaagacgtgagcgagacgaggcctcagggtgagaggccctccgggccgagggaccgg
+gagagcgccgtcagctcactcgaggctgaccaggtgatctcggctcttctggaggctgagccacccaccgta
+ctgtcctcgtatgaccccgacaagcctgtgacggaggcctcgctcatggctgctctcaccagcctggctgac
+cgagagctcgtgcacatgatcacctgggctaagaagattccaggattcacggccatcgggctgagtgaccag
+gtgcagctgctggagtgctgctggctggagatcctaatcgtggggctcatctggaggtctatcgatcgccct
+ggtcagctccactttgctccaaacctcatcctaggaagggaggacgcgcgcaatgtggagggcatgctggac
+atgttcgacatgctgctcgtcaccgtgagtcgcttccgtgagctgcatctccgccgggaggaatacgtctgc
+ctcaaggccatgatcctcctcaactcgggggtgtttttctgcctctccaattccgccggggagcagacgaat
+gtgcagctcatccagcagatcctcgagaaggtgatggacgccctgggcagcaccatcggccacattgaggcg
+tccccgccgcaacactcgcgtcgcctctcccagctgctcctgctgctttcacagatccggcacattagcaac
+aagggcatcgagcatctcaacagcatgaagcgtaagaatgtgatcccgctatacgacctgctccttgagctg
+ctggacgctcacagcctgcagaatactggcttacggacgtcgcccccaccgcaggatttcagggcaaccctc
+gtgccg
--- /dev/null
+>EMBLCDS|ADZ17331/1-1593 Homo sapiens (human) estrogen nuclear receptor beta variant a
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------atggatataaaaaactcaccatctagccttaattctccttcctcctacaactgcagtcaatccatc
+------------------ttacccctggagcacggctccatatacataccttcctcctatgtagacagccac
+catgaatatccagccatgacattctatagccctgctgtgatgaattacagcattcccagcaatgtcactaac
+ttggaaggtgggcctggtcggcagacc---------------------acaagccca---------------
+---------------aatgtgttgtggccaacacctgggcacctttctcctttagtggtccatcgccagtta
+tcacatctgtat------------------------------------------------------------
+------------------------------------------------------------------------
+gcggaacctcaaaagagtccctggtgtgaagcaagatcgctagaacacaccttacctgtaaacagagagaca
+ctgaaa------------------------------aggaaggttagtgggaac------------------
+---------------------------cgttgcgccagccctgttactggtcca------------------
+------------------------------------------------------------------------
+---------------------------------------------------------ggttcaaagagggat
+gctcacttc---------------------------------------------------------------
+------------------------------------tgcgctgtctgcagcgattacgcatcgggatatcac
+tatggagtctggtcgtgtgaaggatgtaaggccttttttaaaagaagcattcaaggacataatgattatatt
+tgtccagctacaaatcagtgtacaatcgataaaaaccggcgcaagagctgccaggcctgccgacttcggaag
+tgttacgaagtgggaatggtgaagtgtggctcccggagagagagatgt---gggtaccgccttgtgcggaga
+cagagaagtgccgacgagcagctgcactgtgccggcaaggccaagagaagtggcggccac------------
+---------------------------gcgccccgagtgcgggagctgctgctggacgccctgagccccgag
+cagctagtgctcaccctcctggaggct---gagccgccccatgtgctgatcagc------------------
+------------------------------------------------------------------cgc---
+cccagtgcgcccttcaccgaggcctccatgatgatgtccctgaccaagttggccgacaaggagttggtacac
+atgatcagctgggccaagaagattcccggctttgtggagctcagcctgttcgaccaagtgcggctcttggag
+agctgttggatggaggtgttaatgatggggctgatgtggcgctcaattgac------caccccggcaagctc
+atctttgctccagatcttgttctggacagggatgaggggaaatgcgtagaaggaattctggaaatctttgac
+atgctcctggcaact---------acttcaaggtttcgagagttaaaactccaacacaaagaatatctctgt
+gtcaaggccatgatcctgctcaattccagtatgtaccctctggtcacagcgacc---caggatgctgacagc
+agccggaagctggctcacttgctgaacgccgtgaccgatgctttggtttgggtgattgccaagagcggcatc
+tcctcccagcagcaatccatgcgcctggctaacctcctgatgctcctgtcccacgtcaggcatgcgagtaac
+aagggcatggaacatctgctcaac------atgaagtgcaaaaatgtg---------gtcccagtgtatgac
+ctgctgctggagatgctgaatgcccacgtgcttcgcgggtgcaagtcctccatcacggggtccgagtgcagc
+ccggcagaggacagtaaaagcaaagagggctcccagaacccacagtctcagtga
+>EMBLCDS|AAK93056/1-1455 Drosophila melanogaster (fruit fly) GH28308p
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+---------------------------------atgtccgacggcgtcagcatcttgcacatcaaacaggag
+gtggacactccatcggcgtcctgctttagtcccagctccaagtcaacggccacgcagagtggcacaaacggc
+ctgaaa------------------------------------------tcctcgccc---------------
+---------------tcggtttcgccggaaaggcagctctgcagctcgacgacctctctatcctgcgatttg
+cacaatgtatcc------------------------------------------------------------
+---------------------------------------------------------ttaagcaatgatggc
+gatagtctgaaaggaagtggtacaagtggcggcaatggcggaggaggaggtggtggtacgagtggtggaaat
+gcgacc------------------------------------------------------------------
+------------------------------aatgcgagtgccggagctggatcg------------------
+------------------------------------------------------------------------
+---------------------------------------------------------ggatccgtcagggac
+gagctccgccgattg---------------------------------------------------------
+------------------------------------tgtttggtttgtggcgatgtggccagtggattccac
+tatggtgtggcgagttgtgaggcttgcaaagcgttctttaaacgcaccatccaaggcaacatcgagtacacg
+tgtccggcgaacaacgagtgtgagattaacaagcggagacgcaaggcctgccaagcgtgtcgcttccagaaa
+tgtctactaatgggcatgctcaaggagggtgtgcgcttggatcgagttcgtggaggacggcagaagtaccga
+aggaatcctgtatcaaactcttaccagactatgcagctgctataccaatccaacaccacctcgctg------
+---------------------------tgcgatgtcaagatactggaggtgctcaattcatatgagccggat
+gccttgagcgtccaaacg------------ccgccgccgcaagtccacacgactagcataactaatgatgag
+gcctcatcctcctcgggcagcataaaactggagtccagcgttgttacgcccaatgggacttgcattttccaa
+aacaacaacaacaatgatcccaatgagatactaagcgtccttagtgatatttacgacaaggaattggtcagc
+gtcattggctgggccaagcagatacctggctttatagatctgccacttaacgaccagatgaagcttctccag
+gtgtcgtgggcagagatcctgacgctccagctgaccttccggtccctaccg------ttcaatggcaagtta
+tgcttcgccacggatgtctggatggatgaacatttggccaaggagtgc---ggttacacggagttctactac
+cactgcgtccagatc---------gcacagcgcatggaaagaatatcgccacgaagggaggagtactacttg
+ctaaaggcgctcctgctggccaactgcgacattctgctg------------------gatgatcagagttcc
+ctgcgcgcatttcgtgatacgattcttaattctctaaacgatgtggtctacttgctgcgtcattcgtcggcc
+gtgtcgcatcagcaa---------------caattgctgcttttgctgccttcgctgcggcaggcggatgat
+atcctgcgaagattttggcgtgga------attgcacgcgatgaagtc---------attaccatgaagaaa
+ctgttcctcgagatgctcgag---------------------------------------------------
+---------------------------------------ccgctggccaggtga
+>EMBLCDS|BAA89539/1-2133 Anguilla japonica (Japanese eel) progesterone receptor
+------------------------------------------------------------------------
+------------------------------------------------------------atggacaacaat
+caccaagacaagatggaaagtctatacacgccagccagagcatcaccaactcctgatgcagaatcgattaaa
+agagccaggaatttgattaaaacatactcggagtcttttgggagttatgtggaggagatagttcgagacgac
+tcgaataacatacaatctttgagcagcgtccctctcttgatgcgtaattttggaaacatggacaccctaacc
+tgcgcacctggctcgggtagtgacagtgagatttggaaagactttgttgttcccgggaactctgtggtaagc
+aaagacacctgtggtcatgttgaaatatccactaaagccgaaaatttgtcttgggctgccgcgcccttaagt
+agagaagaaaccctcgcgaaaggaactgttacggtcccagcgactgtgcctaaagaaagttttaccgcaaca
+---------------tcaaacacttcttcagccagtggaatctctattaaagatgaacaacaatctttgctc
+aaaatggaaccacagtcttctgacttttgtccttatacagcaaatataccgaaattgaatccatcttatctg
+accaatactgcgagtacgaaacaacttggatatggc------------gaacagccg---------------
+---------------gacacttcagcgcactcctctccacctgctcagaagattgttttagatactgctcga
+tactcggccgat------------------------------------------------------------
+------------------------------------------ttatgttcggataaccctttaccgcaagcg
+acaaatatcaaaacagatccttgtagtagtttctcttctttcgttggagaagggatccttactagggcatct
+atgggctactcacagcaagcgattcagacattgccggtgcacaagagtgaaccg------------------
+---------------------------ttcaggttgtctgcttcgagcgcgcccgcggattctccgttttgg
+tgccaatcc---------------------------------------------------------------
+------------------------------------------------------acgggtccttctgaggat
+catcatctgcagattgactatctatctcccgctggactccacagcacatgcaaatacagttccacgaacgcg
+tacagctcctatttaggtgtgctgccccagagggtgtgcgtcatctgtggggatgaagcatcaggctgtcac
+tatggtgtcctcacctgtggcagctgtaaggtgttctttaagagggcagtggaaggccatcataactacttg
+tgtgctggacggaatgactgcatcgtggacaagatccgtaggaaaaactgtcctgcttgtcgcctcagaaag
+tgctaccaggcgggaatgatactgggaggtcggaagctgaagaagttg---ggggctctgaaggcagcaggg
+ctgacccaggccctggtggcccactcactgactcctcggaggctctctggtgacagccaggccctg------
+---------------------------atgcccctgggctgccttccaggggtccgggagctgcacctttcc
+ccacagatcatcagcgtgctggagagcattgagcctgaggtggtgtactctggt------------------
+------------------------------------------------------------------tatgac
+aactcccagcctgacatgcccaatatgctgctcaacagcctcaaccgcttatgtgagaggcagctgctgagg
+attgtcaagtggtccaagtctttaccaggttttcgcagtttacacatcaatgaccaaatggctctgatccag
+tactcctggatgagcttaatggtattttctttgggttggcggtctttccaaaatgtcaccagtgattacctg
+tactttgcacctgacctcattctcaacgaagagtatatgaggaggtct------------ccaatatttgac
+ctgtgcatggccatgcagttcatccctcaagagtttgccaatctccaggtgaccaaggaggagtttctgtgc
+atgaaggtcttgctgttgctcaac------acagtgcctctg---------------gaggggttgaagagc
+cagccacagtttgatgagatgaggcagaattacatccatgaactcaccaaggccattcacctgcgagagaat
+ggtgtggtcgcctgctcccagcgtttctaccacctgaccaagctgatggaccacatgcatgacattgtgaag
+aagctccacctgtactgcctgagcactttcattcaggcagatgccatgcgg------gtagagttccccgag
+atgatgtcagaagtcatcgcctcccagctg------------------------------------------
+------------cctcgggtgctcgctggaatggtgaaaccccttctttttcacaccaaatga
+>EMBLCDS|AHW56473/1-1590 Homo sapiens (human) partial estrogen receptor 2 isoform A
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------atggatataaaaaactcaccatctagccttaattctccttcctcctacaactgcagtcaatccatc
+------------------ttacccctggagcacggctccatatacataccttcctcctatgtagacagccac
+catgaatatccagccatgacattctatagccctgctgtgatgaattacagcattcccagcaatgtcactaac
+ttggaaggtgggcctggtcggcagacc---------------------acaagccca---------------
+---------------aatgtgttgtggccaacacctgggcacctttctcctttagtggtccatcgccagtta
+tcacatctgtat------------------------------------------------------------
+------------------------------------------------------------------------
+gcggaacctcaaaagagtccctggtgtgaagcaagatcgctagaacacaccttacctgtaaacagagagaca
+ctgaaa------------------------------aggaaggttagtgggaac------------------
+---------------------------cgttgcgccagccctgttactggtcca------------------
+------------------------------------------------------------------------
+---------------------------------------------------------ggttcaaagagggat
+gctcacttc---------------------------------------------------------------
+------------------------------------tgcgctgtctgcagcgattacgcatcgggatatcac
+tatggagtctggtcgtgtgaaggatgtaaggccttttttaaaagaagcattcaaggacataatgattatatt
+tgtccagctacaaatcagtgtacaatcgataaaaaccggcgcaagagctgccaggcctgccgacttcggaag
+tgttacgaagtgggaatggtgaagtgtggctcccggagagagagatgt---gggtaccgccttgtgcggaga
+cagagaagtgccgacgagcagctgcactgtgccggcaaggccaagagaagtggcggccac------------
+---------------------------gcgccccgagtgcgggagctgctgctggacgccctgagccccgag
+cagctagtgctcaccctcctggaggct---gagccgccccatgtgctgatcagc------------------
+------------------------------------------------------------------cgc---
+cccagtgcgcccttcaccgaggcctccatgatgatgtccctgaccaagttggccgacaaggagttggtacac
+atgatcagctgggccaagaagattcccggctttgtggagctcagcctgttcgaccaagtgcggctcttggag
+agctgttggatggaggtgttaatgatggggctgatgtggcgctcaattgac------caccccggcaagctc
+atctttgctccagatcttgttctggacagggatgaggggaaatgcgtagaaggaattctggaaatctttgac
+atgctcctggcaact---------acttcaaggtttcgagagttaaaactccaacacaaagaatatctctgt
+gtcaaggccatgatcctgctcaattccagtatgtaccctctggtcacagcgacc---caggatgctgacagc
+agccggaagctggctcacttgctgaacgccgtgaccgatgctttggtttgggtgattgccaagagcggcatc
+tcctcccagcagcaatccatgcgcctggctaacctcctgatgctcctgtcccacgtcaggcatgcgagtaac
+aagggcatggaacatctgctcaac------atgaagtgcaaaaatgtg---------gtcccagtgtatgac
+ctgctgctggagatgctgaatgcccacgtgcttcgcgggtgcaagtcctccatcacggggtccgagtgcagc
+ccggcagaggacagtaaaagcaaagagggctcccagaacccacagtctcag
+>EMBLCDS|BAA75464/1-2547 Anguilla japonica (Japanese eel) androgen receptor alpha
+atggagattccagttgggttaggaggagtttcagatgccacaaacgccgtttttcgcggaccttaccaaaac
+gttttccacagccttcaagtggcatttcagagtcacggtgccgtctccaggagcttagattttccaaataca
+aagtacggttttttacaaaacagacatttctgtgaaatgcgtcaggagaacaagcagccgccatgcaaagga
+ctcggcctattttacgggaaccatcgtaattcggacactgggacaaacgaagacgacatcgcttgtttttcc
+agacagtccgacgctgaagccagacctggtattttttctgaaagctcattggatactggagacgagattact
+tgcaaactccagtcagacaaccaaggggtaagagcgagcggtcctctcctaccgggctctagcggctgcaat
+tcgggacaaaagtcctcccttgcttgtacgtcccaacaaagggagacaacatctcaaagtgacacctgcgca
+ggagagagctgctcggaacatcaagcaactaccatttcggaaactgcgcgcgaattgtgcaacgccgtttcc
+gtgtcgctgggcttgaatttagatcttaatgatatgaatgacctaagttcaaaccaaatatcgtctaccgaa
+agtgacacaagtcaagccatctacttatttgaatcttcacctgggtatactggggtcggactgaacgccttg
+gtaagagactgtaaatgtcagagtgcacgcgaagggacatcgacacaacagtacgaccgcggggcaatgttt
+aagataaaccgtgtaaatgacttgccgcttcagccagcacccccgcgacacaccagcattagcgatgctaaa
+tgggacatggaagcaggtttgtgtgcgcagatggagcacaaagactctgaaaagtgcgcgaatatggatggt
+gcacactccacttctgtcttctcccagttcgaccaactgttgccagtaaacgcgtcgcactacagtcagaac
+gtttcggtcagagtggaaccacaaagtgatttctctccgattttgtacaaatcacctggtattcagaaaaat
+gccgaaaagtacaatgtccaatatgatgccacaattaaatcagaagatgggaaaacgacatctgaacgggaa
+tggggttttcagtacaggtacaatgaaagctgcagcacaccgtcagcacctcctagacattgtgcacatcag
+aacagggccggaccgtacaaccagttcttttttaatccatttgaatatgcgaaaagaggtgttgtctcaagg
+gaaggatattctctcgaacatgggttcccaaacaatctcgctcggacaccctactctggttccttgaaaaac
+gaactaggagatcgtctgagtgggccataccctgacgtcagttacaggtacgagggcgagcgggagaacgtg
+ttccccgtggagttcttctttccgccgcagaggacctgcctgatctgcggggacgaggcctcgggctgtcac
+tatggagccctcacctgcggcagctgcaaggtgttcttcaagagggccgcggaagggaaacagaagtacctg
+tgcgccagcatcaatgattgcaccattgataaacttcgaaggaagaactgcccctcttgccgtctcaaaagg
+tgctttgctgccggaatgaccctt---------------------------ggagcgcggaagctgaagaag
+atcgggcaaatgagggcccccgaggatggccaggggcagggcccggcggaagcggagctgagcgtc------
+---------------------------tcccccaagtacgacctg------------ggcttccacacccag
+tccatgttcctcaacatcctggaggccatcgagccggaggtggtgaacgccggg------------------
+------------------------------------------------------------------cacgac
+tatggccagccggactctgcggccagcctgctgaccagcctcaacgagctcggagaacggcaactcgtcaag
+gtcgtcaagtgggccaagggcatgccaggttttcggagtctgtacgtggatgaccagatgacagtcatccag
+cactcctggatggcagtgatggtgttcgctctgggctggaggtcatttaagaatgtgaagtccaggatgctt
+tactttgctcctgaccttgttttcaacgagcaccgaatgcaggtgtcc------------accatgtatgaa
+cactgcatccggatgaagaacttctcccaggagtttgctatgctgcaggtctcccaggaagagttcctgtgc
+atgaaagctctgcttctcttcagc------accatccccgtt---------------gaagggctgaagggg
+cagaatttctttgacgagctgcggaggagctacattaacgagctggaccggctggttagcttcaggagcaag
+tccagc------tgttccgagaggttccagcagctcacccgcctcctggactccctccaacctgttctgaag
+aagctccaccagtttacgttcgaccttttcgtccagtcccagaacctctccaaccaagtttgctttcccgag
+atgatctcagagatcatatccgtgcacgtg------------------------------------------
+------------ccaaagattctcgctggcacggtgaagccaatcctcttccacaagtag
+>EMBLCDS|AAA17402/1-1032 Serinus canaria (common canary) partial androgen receptor
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------------------------------------------------------gaagcctccgggtgccac
+tacggagccctgacgtgtgggagctgcaaagtgttcttcaaacgggcagctgaaggtaaacagaagtacctc
+tgtgccagccgcaacgactgcaccatcgacaagttccggcggaaaaactgcccctcctgccgcctgcgcaag
+tgctacgaggccgggatgacgctt---------------------------ggagcccgcaagctgaagaaa
+ctgggtaacctgaaggcacaggacgacatagagggagccagctcgtccagcccaacggaggagcaa------
+---------------------------gctcccaagctggtgatgacacgcattgatggctacgagtgccag
+cccatcttcctcaacgtcctggaggccatcgagcctggggtggtgtgtgctggc------------------
+------------------------------------------------------------------catgac
+aacagccagcctgactccttctccaacctgctgaccagcctgaatgagcttggggagaggcagctggtctac
+gtggtcaaatgggcaaaggctctgccaggatttcgcaacctgcatgtggatgaccagatgtcaataatccag
+tactcttggatgggcctgatggtgtttgctatggggtggagatccttcaccaacgtcaattccaggatgctt
+tactttgctccagacctggtcttcaatgagtaccgcatgcacaaatcc------------aggatgtacagc
+cagtgcatcaggatgcggcacctctcccaggaattcgggtggcttcagatcacaccccaggggttcctctgt
+atgaaggctctcctcttcttcagt------attattccagtg---------------gatggcctgaagaac
+cagaagctcttcgatgagctccgcatgaattacatcaaggaacttgaccgtatcattgcctgcaagaggaag
+aaccccacctcatgctcccggaggttttaccagctcaccaaggtcctggactccgtgactccgattgccaag
+gacctgcatcagtttacatttgatctcctaatcaaggcacacatggtgagc------gtggactacccagaa
+atgatggctgagatcatctctgtgcaggtt------------------------------------------
+------------cccaagatcctgtct
+>EMBLCDS|AAL37553/1-1455 Drosophila melanogaster (fruit fly) estrogen-related receptor
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+---------------------------------atgtccgacggcgtcagcatcttgcacatcaaacaggag
+gtggacactccatcggcgtcctgctttagtcccagctccaagtcaacggccacgcagagtggcacaaacggc
+ctgaaa------------------------------------------tcctcgccc---------------
+---------------tcggtttcgccggaaaggcagctctgcagctcgacgacctctctatcctgcgatttg
+cacaatgtatcc------------------------------------------------------------
+---------------------------------------------------------ttaagcaatgatggc
+gatagtctgaaaggaagtggtacaagtggcggcaatggcggaggaggaggtggtggtacgagtggtggaaat
+gcgacc------------------------------------------------------------------
+------------------------------aatgcgagtgccggagctggatcg------------------
+------------------------------------------------------------------------
+---------------------------------------------------------ggatccgtcagggac
+gagctccgccgattg---------------------------------------------------------
+------------------------------------tgtttggtttgtggcgatgtggccagtggattccac
+tatggtgtggcgagttgtgaggcttgcaaagcgttctttaaacgcaccatccaaggcaacatcgagtacacg
+tgtccggcgaacaacgagtgtgagattaacaagcggagacgcaaggcctgccaagcgtgtcgcttccagaaa
+tgtctactaatgggcatgctcaaggagggtgtgcgcttggatcgagttcgtggaggacggcagaagtaccga
+aggaatcctgtatcaaactcttaccagactatgcagctgctataccaatccaacaccacctcgctg------
+---------------------------tgcgatgtcaagatactggaggtgctcaattcatatgagccggat
+gccttgagcgtccaaacg------------ccgccgccgcaagtccacacgactagcataactaatgatgag
+gcctcatcctcctcgggcagcataaaactggagtccagcgttgttacgcccaatgggacttgcattttccaa
+aacaacaacaacaatgatcccaatgagatactaagcgtccttagtgatatttacgacaaggaattggtcagc
+gtcattggctgggccaagcagatacctggctttatagatctgccacttaacgaccagatgaagcttctccag
+gtgtcgtgggcagagatcctgacgctccagctgaccttccggtccctaccg------ttcaatggcaagtta
+tgcttcgccacggatgtctggatggatgaacatttggccaaggagtgc---ggttacacggagttctactac
+cactgcgtccagatc---------gcacagcgcatggaaagaatatcgccacgaagggaggagtactacttg
+ctaaaggcgctcctgctggccaactgcgacattctgctg------------------gatgatcagagttcc
+ctgcgcgcatttcgtgatacgattcttaattctctaaacgatgtggtctacttgctgcgtcattcgtcggcc
+gtgtcgcatcagcaa---------------caattgctgcttttgctgccttcgctgcggcaggcggatgat
+atcctgcgaagattttggcgtgga------attgcacgcgatgaagtc---------attaccatgaagaaa
+ctgttcctcgagatgctcgag---------------------------------------------------
+---------------------------------------ccgctggccaggtga
+>EMBLCDS|AAK20929/1-1662 Petromyzon marinus (sea lamprey) partial estrogen receptor
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+---------------------------------------------------------gcacgaggcttcagc
+gaggcacatggctacgagtactccggggcctcgctctaccagccactgcctccctcgtgcacagagttctca
+---------------------------------attggagctcatcaacaacaacaacatcagcaccagcat
+caccagcaccagcatcagcagcaccaccaccagcagcagcagcagcagccacagccgcagcagaatggagtt
+ttgggcgaggggcagagttcccatctctcttatcttccgccctcgaccgagctgccc---------------
+---------------cagtacgtgccctccagccccagcgcgccctacagcatggagctcggggcagggcgt
+cctcacggctacgac---------------------------------------------------------
+------------------------------------------ccagggccacagagcctctacaggggcggt
+gtggagagcagcgcccccccgtacagcgagcagcagcaggtggtgggcggcggcggagccatgtcggccatg
+ggcttg---------------------------------------acagagcca------------------
+---------------------------cgccacgtcagctccggatcgctaccc------------------
+------------------------------------------------------------------------
+---------------------------------------------------------agcagcacgaggccc
+gagcgcagcacccagttc------------------------------------------------------
+------------------------------------tgtgccgtgtgcagcgactatgcctcggggtaccac
+tacggcgtgtggtcctgcgagggctgcaaagccttcttcaagcgcagcacgcaaggccacaatgactacatg
+tgcccggccaccaaccagtgcaccatcgacaggaaccgtcgcaagagctgtcaggcttgccgcctgcgtaag
+tgctacgaagtgggcatggtcaaa---ggcgttcgcaaggaccgcaaa---ggctttcgaggggtcaagcac
+aaacgtaagcgccccatcccccaaaagaatgggggagaaggaggtgccggcggcggccaagacgtgagcgag
+acgaggcctcagggtgagaggccctccgggccgagggaccgggagagcgccgtcagctcactcgaggctgac
+caggtgatctcggctcttctggaggct---gagccacccaccgtactgtcctcg------------------
+------------------------------------------------------------------tatgac
+cccgacaagcctgtgacggaggcctcgctcatggctgctctcaccagcctggctgaccgagagctcgtgcac
+atgatcacctgggctaagaagattccaggattcacggccatcgggctgagtgaccaggtgcagctgctggag
+tgctgctggctggagatcctaatcgtggggctcatctggaggtctatcgat------cgccctggtcagctc
+cactttgctccaaacctcatcctaggaagggaggacgcgcgcaatgtggagggcatgctggacatgttcgac
+atgctgctcgtcacc---------gtgagtcgcttccgtgagctgcatctccgccgggaggaatacgtctgc
+ctcaaggccatgatcctcctcaactcgggggtgtttttctgcctctccaattccgccggggagcagacgaat
+gtgcagctcatccagcagatcctcgagaaggtgatggacgccctgggcagcaccatcggccacattgaggcg
+tccccgccgcaacactcgcgtcgcctctcccagctgctcctgctgctttcacagatccggcacattagcaac
+aagggcatcgagcatctcaacagc------atgaagcgtaagaatgtg---------atcccgctatacgac
+ctgctccttgagctgctggacgctcacagcctgcag---------------------aatactggcttacgg
+acgtcgcccccaccgcaggatttcagggcaaccctcgtgccg
--- /dev/null
+>EMBLCDS|ADZ17331/532-675 Homo sapiens (human) estrogen nuclear receptor beta variant a
+caaggacataatgattatatttgtccagctacaaatcagtgtacaatcgataaaaaccggcgcaagagctgc
+caggcctgccgacttcggaagtgttacgaagtgggaatggtgaagtgtggctcccggagagagagatgt---
+ggg
+>EMBLCDS|AAK93056/430-576 Drosophila melanogaster (fruit fly) GH28308p
+caaggcaacatcgagtacacgtgtccggcgaacaacgagtgtgagattaacaagcggagacgcaaggcctgc
+caagcgtgtcgcttccagaaatgtctactaatgggcatgctcaaggagggtgtgcgcttggatcgagttcgt
+gga
+>EMBLCDS|BAA89539/1111-1254 Anguilla japonica (Japanese eel) progesterone receptor
+gaaggccatcataactacttgtgtgctggacggaatgactgcatcgtggacaagatccgtaggaaaaactgt
+cctgcttgtcgcctcagaaagtgctaccaggcgggaatgatactgggaggtcggaagctgaagaagttg---
+ggg
+>EMBLCDS|AHW56473/532-675 Homo sapiens (human) partial estrogen receptor 2 isoform A
+caaggacataatgattatatttgtccagctacaaatcagtgtacaatcgataaaaaccggcgcaagagctgc
+caggcctgccgacttcggaagtgttacgaagtgggaatggtgaagtgtggctcccggagagagagatgt---
+ggg
+>EMBLCDS|BAA75464/1564-1683 Anguilla japonica (Japanese eel) androgen receptor alpha
+gaagggaaacagaagtacctgtgcgccagcatcaatgattgcaccattgataaacttcgaaggaagaactgc
+ccctcttgccgtctcaaaaggtgctttgctgccggaatgaccctt---------------------------
+gga
+>EMBLCDS|AAA17402/70-189 Serinus canaria (common canary) partial androgen receptor
+gaaggtaaacagaagtacctctgtgccagccgcaacgactgcaccatcgacaagttccggcggaaaaactgc
+ccctcctgccgcctgcgcaagtgctacgaggccgggatgacgctt---------------------------
+gga
+>EMBLCDS|AAL37553/430-576 Drosophila melanogaster (fruit fly) estrogen-related receptor
+caaggcaacatcgagtacacgtgtccggcgaacaacgagtgtgagattaacaagcggagacgcaaggcctgc
+caagcgtgtcgcttccagaaatgtctactaatgggcatgctcaaggagggtgtgcgcttggatcgagttcgt
+gga
+>EMBLCDS|AAK20929/592-732 Petromyzon marinus (sea lamprey) partial estrogen receptor
+caaggccacaatgactacatgtgcccggccaccaaccagtgcaccatcgacaggaaccgtcgcaagagctgt
+caggcttgccgcctgcgtaagtgctacgaagtgggcatggtcaaa---ggcgttcgcaaggaccgcaaa---
+ggc
--- /dev/null
+CLUSTAL
+
+UNIPROT|Q7LCB3/1-530 -------MDIKNSPSSLNSPSSYNCSQSILPLEHG-----------SIYIPSSYVDSHHE
+UNIPROT|Q9VSE9/1-484 ----------------------------------M-----------SDGVSILHIKQEVD
+UNIPROT|Q9IBD5/1-710 -----MDNNHQDKMESLYTPARASPTPDAESIKRARNLIKTYSESFGSYVEEIVRDDSNN
+UNIPROT|Q7LCB3/1-530 -------MDIKNSPSSLNSPSSYNCSQSILPLEHG-----------SIYIPSSYVDSHHE
+UNIPROT|Q9YGV9/1-848 MEIPVGLGGVSDATNAVFRGPYQNVFHSLQ----------------VAFQSHGAVSRSLD
+UNIPROT|Q90ZM7/1-438 -----------------------------------------------------GVEFQLP
+UNIPROT|Q91445/1-344 ------------------------------------------------------------
+UNIPROT|Q9VSE9/1-484 ----------------------------------M-----------SDGVSILHIKQEVD
+UNIPROT|Q90ZM8/1-554 ARGFSEAHGYEYSGASLYQPLPPSCTEFSI----------------GAHQQQQHQHQHHQ
+
+UNIPROT|Q7LCB3/1-530 YPAM--------------------------------------------TFYSPAVMNYSI
+UNIPROT|Q9VSE9/1-484 TPSA--------------------------------------------SCFSPSSKSTAT
+UNIPROT|Q9IBD5/1-710 IQSLSSVPLLMRNFGNMDTLTCAPGSGSDSEIWKDFVVPGNSVVSKD-TCGHVEISTKAE
+UNIPROT|Q7LCB3/1-530 YPAM--------------------------------------------TFYSPAVMNYSI
+UNIPROT|Q9YGV9/1-848 FPNTKYGFLQNRHFCEMRQENKQPPCKGLGLFYGNHRNSDTGTNEDDIACFSRQSDAEAR
+UNIPROT|Q90ZM7/1-438 YSASA-------------------------------------------TSFRPSVATSSA
+UNIPROT|Q91445/1-344 ------------------------------------------------------------
+UNIPROT|Q9VSE9/1-484 TPSA--------------------------------------------SCFSPSSKSTAT
+UNIPROT|Q90ZM8/1-554 HQHQ--------------------------------------------QHHHQQQQQQPQ
+
+UNIPROT|Q7LCB3/1-530 P---------SNVTNLEGGP-------GRQTTSPNVLWPTPGHLSPLVVHRQLSHLYAEP
+UNIPROT|Q9VSE9/1-484 Q---------SGTNGLKSSP----------SVSPERQLCSS--TTSLSCDLHNVSLSNDG
+UNIPROT|Q9IBD5/1-710 NLSWAAAPL-SREETLAKGTVTVPATVPKESFTATSNTSSASGIS--IKDEQQSLLKMEP
+UNIPROT|Q7LCB3/1-530 P---------SNVTNLEGGP-------GRQTTSPNVLWPTPGHLSPLVVHRQLSHLYAEP
+UNIPROT|Q9YGV9/1-848 PGIFSESSLDTGDEITCKLQSDNQGVRASGPLLPGSSGCNSGQKSSLACTSQQRETTSQS
+UNIPROT|Q90ZM7/1-438 ----------SGISNFSNGN----------------------------------------
+UNIPROT|Q91445/1-344 ------------------------------------------------------------
+UNIPROT|Q9VSE9/1-484 Q---------SGTNGLKSSP----------SVSPERQLCSS--TTSLSCDLHNVSLSNDG
+UNIPROT|Q90ZM8/1-554 P---------QQNGVLGEGQSSHLSYLPPSTELPQYVPSSPSAPYSMELGAGRPHGYDPG
+
+UNIPROT|Q7LCB3/1-530 QKSPWCE---------------------------------------------------AR
+UNIPROT|Q9VSE9/1-484 DS--------------------------------------------------------LK
+UNIPROT|Q9IBD5/1-710 QSSDFCPYTANIPKLNP-----------------------------------------SY
+UNIPROT|Q7LCB3/1-530 QKSPWCE---------------------------------------------------AR
+UNIPROT|Q9YGV9/1-848 DTCAGESCSEHQATTISETARELCNAVSVSLGLNLDLNDMNDLSSNQISSTESDTSQAIY
+UNIPROT|Q90ZM7/1-438 ----------------------------------------------------------NF
+UNIPROT|Q91445/1-344 ------------------------------------------------------------
+UNIPROT|Q9VSE9/1-484 DS--------------------------------------------------------LK
+UNIPROT|Q90ZM8/1-554 PQSLYRGGVE------------------------------------------------SS
+
+UNIPROT|Q7LCB3/1-530 SLEHTLPVNRETLKRKVSGNRCASPV----------------------------------
+UNIPROT|Q9VSE9/1-484 GSGTSGGNGGGGGGGTSGGNATNASA----------------------------------
+UNIPROT|Q9IBD5/1-710 LTNTASTKQLGYGEQPDTSAHSSPPA----------------------------------
+UNIPROT|Q7LCB3/1-530 SLEHTLPVNRETLKRKVSGNRCASPV----------------------------------
+UNIPROT|Q9YGV9/1-848 LFESSPGYTGVGLNALVRDCKCQSAREGTSTQQYDRGAMFKINRVNDLPLQPAPPRHTSI
+UNIPROT|Q90ZM7/1-438 GFLSPNGVQQDGFPYPGFTSPAQSSV----------------------------------
+UNIPROT|Q91445/1-344 ------------------------------------------------------------
+UNIPROT|Q9VSE9/1-484 GSGTSGGNGGGGGGGTSGGNATNASA----------------------------------
+UNIPROT|Q90ZM8/1-554 APPYSEQQQVVGGGGAMSAMGLTEPR----------------------------------
+
+UNIPROT|Q7LCB3/1-530 ------------------------------------------------------------
+UNIPROT|Q9VSE9/1-484 ------------------------------------------------------------
+UNIPROT|Q9IBD5/1-710 QKIVLDTARYSADLCSDNPLPQATNIKTDPCSSFSSFVGEGILTRASMGYSQQAIQTLPV
+UNIPROT|Q7LCB3/1-530 ------------------------------------------------------------
+UNIPROT|Q9YGV9/1-848 SDAKWDMEAGLCAQMEHKDSEKCANMDGAHSTSVFSQFDQLLPVNASHYSQNVSVRVEPQ
+UNIPROT|Q90ZM7/1-438 ------------------------------------------------------------
+UNIPROT|Q91445/1-344 ------------------------------------------------------------
+UNIPROT|Q9VSE9/1-484 ------------------------------------------------------------
+UNIPROT|Q90ZM8/1-554 ------------------------------------------------------------
+
+UNIPROT|Q7LCB3/1-530 ------------------------------------------------------------
+UNIPROT|Q9VSE9/1-484 ------------------------------------------------------------
+UNIPROT|Q9IBD5/1-710 HKSEPFRLSASSAPADSPFW----------------------------------------
+UNIPROT|Q7LCB3/1-530 ------------------------------------------------------------
+UNIPROT|Q9YGV9/1-848 SDFSPILYKSPGIQKNAEKYNVQYDATIKSEDGKTTSEREWGFQYRYNESCSTPSAPPRH
+UNIPROT|Q90ZM7/1-438 ------------------------------------------------------------
+UNIPROT|Q91445/1-344 ------------------------------------------------------------
+UNIPROT|Q9VSE9/1-484 ------------------------------------------------------------
+UNIPROT|Q90ZM8/1-554 ------------------------------------------------------------
+
+UNIPROT|Q7LCB3/1-530 --------------------------------------------TGPGSKRDA-------
+UNIPROT|Q9VSE9/1-484 -------------------------------------------GAGSGSVRDELR-----
+UNIPROT|Q9IBD5/1-710 -------------------------------------------CQSTGPSEDHHLQIDYL
+UNIPROT|Q7LCB3/1-530 --------------------------------------------TGPGSKRDA-------
+UNIPROT|Q9YGV9/1-848 CAHQNRAGPYNQFFFNPFEYAKRGVVSREGYSLEHGFPNNLARTPYSGSLKNELGDRLSG
+UNIPROT|Q90ZM7/1-438 ------------------------------------------------------------
+UNIPROT|Q91445/1-344 ------------------------------------------------------------
+UNIPROT|Q9VSE9/1-484 -------------------------------------------GAGSGSVRDELR-----
+UNIPROT|Q90ZM8/1-554 -------------------------------------------HVSSGSLPSSTRPE---
+
+UNIPROT|Q7LCB3/1-530 --------------------------HFCAVCSDYASGYHYGVWSCEGCKAFFKRSIQGH
+UNIPROT|Q9VSE9/1-484 --------------------------RLCLVCGDVASGFHYGVASCEACKAFFKRTIQGN
+UNIPROT|Q9IBD5/1-710 SPAGLHSTCKYSSTNAYSSYLGVLPQRVCVICGDEASGCHYGVLTCGSCKVFFKRAVEGH
+UNIPROT|Q7LCB3/1-530 --------------------------HFCAVCSDYASGYHYGVWSCEGCKAFFKRSIQGH
+UNIPROT|Q9YGV9/1-848 PYPDVSYRYEGERENVFPVEFFFPPQRTCLICGDEASGCHYGALTCGSCKVFFKRAAEGK
+UNIPROT|Q90ZM7/1-438 -----------------------PPQKACLICSDEASGCHYGVLTCGSCKVFFKRAVEGQ
+UNIPROT|Q91445/1-344 ----------------------------------EASGCHYGALTCGSCKVFFKRAAEGK
+UNIPROT|Q9VSE9/1-484 --------------------------RLCLVCGDVASGFHYGVASCEACKAFFKRTIQGN
+UNIPROT|Q90ZM8/1-554 -----------------------RSTQFCAVCSDYASGYHYGVWSCEGCKAFFKRSTQGH
+
+UNIPROT|Q7LCB3/1-530 NDYICPATNQCTIDKNRRKSCQACRLRKCYEVGMVKCGSRRER-CGYRLVRRQRSADEQL
+UNIPROT|Q9VSE9/1-484 IEYTCPANNECEINKRRRKACQACRFQKCLLMGMLKEGVRLDRVRGGRQKYRRNPVSNSY
+UNIPROT|Q9IBD5/1-710 HNYLCAGRNDCIVDKIRRKNCPACRLRKCYQAGMI---------LGGRKLKKLGALKAAG
+UNIPROT|Q7LCB3/1-530 NDYICPATNQCTIDKNRRKSCQACRLRKCYEVGMVKCGSRRER-CGYRLVRRQRSADEQL
+UNIPROT|Q9YGV9/1-848 QKYLCASINDCTIDKLRRKNCPSCRLKRCFAAGMT---------LGARKLKKIGQMRAPE
+UNIPROT|Q90ZM7/1-438 HNYLCAGRNDCIIDKIRRKNCPACRLRKCIQAGMT---------LGARKLKKQGRVKGEN
+UNIPROT|Q91445/1-344 QKYLCASRNDCTIDKFRRKNCPSCRLRKCYEAGMT---------LGARKLKKLGNLKAQD
+UNIPROT|Q9VSE9/1-484 IEYTCPANNECEINKRRRKACQACRFQKCLLMGMLKEGVRLDRVRGGRQKYRRNPVSNSY
+UNIPROT|Q90ZM8/1-554 NDYMCPATNQCTIDRNRRKSCQACRLRKCYEVGMVK-GVRKDR-KGFRGVKHKRKRPIPQ
+
+UNIPROT|Q7LCB3/1-530 HCAGKAKRSGGH------------------------APRVRELLLDALSPE--------Q
+UNIPROT|Q9VSE9/1-484 QTMQLLYQSNTTSLCDVKILEVLNSYEPDALSVQTPPPQVHTTSITNDEASSSSGSI--K
+UNIPROT|Q9IBD5/1-710 LTQALVAHSLTPRR---------LSGDSQALMPLGCLPGVRELHLS-------------P
+UNIPROT|Q7LCB3/1-530 HCAGKAKRSGGH------------------------APRVRELLLDALSPE--------Q
+UNIPROT|Q9YGV9/1-848 DGQGQGPAEAELSV----------------------SPKYDLGFHTQ------------S
+UNIPROT|Q90ZM7/1-438 QRSPASSTATTSSA--------------------TPQPSSNSTAVTTFSPPPTGEPIFSP
+UNIPROT|Q91445/1-344 DIEGASSSSPTEEQ----------------------APKLVMTRIDGYECQ--------P
+UNIPROT|Q9VSE9/1-484 QTMQLLYQSNTTSLCDVKILEVLNSYEPDALSVQTPPPQVHTTSITNDEASSSSGSI--K
+UNIPROT|Q90ZM8/1-554 KNGGEGGAGGGQDV-----------SETRPQGERPSGPRDRESAVSSLEAD--------Q
+
+UNIPROT|Q7LCB3/1-530 LVLTLLEA-EPPHVLISR-PSAPFTEASMMMSLTKLADKELVHMISWAKKIPGFVELSLF
+UNIPROT|Q9VSE9/1-484 LESSVVTP-NGTCIFQNNNNNDP---NEILSVLSDIYDKELVSVIGWAKQIPGFIDLPLN
+UNIPROT|Q9IBD5/1-710 QIISVLESIEPEVVYSGYDNSQPDMPNMLLNSLNRLCERQLLRIVKWSKSLPGFRSLHIN
+UNIPROT|Q7LCB3/1-530 LVLTLLEA-EPPHVLISR-PSAPFTEASMMMSLTKLADKELVHMISWAKKIPGFVELSLF
+UNIPROT|Q9YGV9/1-848 MFLNILEAIEPEVVNAGHDYGQPDSAASLLTSLNELGERQLVKVVKWAKGMPGFRSLYVD
+UNIPROT|Q90ZM7/1-438 TLIAILQAIEPEVVMSGYDNTRSQTTAYMLSSLNRLCDKQLVSIVKWAKSLPGFRNLHID
+UNIPROT|Q91445/1-344 IFLNVLEAIEPGVVCAGHDNSQPDSFSNLLTSLNELGERQLVYVVKWAKALPGFRNLHVD
+UNIPROT|Q9VSE9/1-484 LESSVVTP-NGTCIFQNNNNNDP---NEILSVLSDIYDKELVSVIGWAKQIPGFIDLPLN
+UNIPROT|Q90ZM8/1-554 VISALLEA-EPPTVLSSYDPDKPVTEASLMAALTSLADRELVHMITWAKKIPGFTAIGLS
+
+UNIPROT|Q7LCB3/1-530 DQVRLLESCWMEVLMMGLMWRSIDH--PGKLIFAPDLVLDRDEGKCVEGILEIFDMLLA-
+UNIPROT|Q9VSE9/1-484 DQMKLLQVSWAEILTLQLTFRSLPF--NGKLCFATDVWMDEHLAKEC-GYTEFYYHCVQ-
+UNIPROT|Q9IBD5/1-710 DQMALIQYSWMSLMVFSLGWRSFQNVTSDYLYFAPDLILNEEYMRRS----PIFDLCMAM
+UNIPROT|Q7LCB3/1-530 DQVRLLESCWMEVLMMGLMWRSIDH--PGKLIFAPDLVLDRDEGKCVEGILEIFDMLLA-
+UNIPROT|Q9YGV9/1-848 DQMTVIQHSWMAVMVFALGWRSFKNVKSRMLYFAPDLVFNEHRMQVS----TMYEHCIRM
+UNIPROT|Q90ZM7/1-438 DQMVLIQYSWMGLMSFAMSWRSFQHTNSKLLYFAPDLVFDETRMQQS----AMYQLCVEM
+UNIPROT|Q91445/1-344 DQMSIIQYSWMGLMVFAMGWRSFTNVNSRMLYFAPDLVFNEYRMHKS----RMYSQCIRM
+UNIPROT|Q9VSE9/1-484 DQMKLLQVSWAEILTLQLTFRSLPF--NGKLCFATDVWMDEHLAKEC-GYTEFYYHCVQ-
+UNIPROT|Q90ZM8/1-554 DQVQLLECCWLEILIVGLIWRSIDR--PGQLHFAPNLILGREDARNVEGMLDMFDMLLV-
+
+UNIPROT|Q7LCB3/1-530 --TTSRFRELKLQHKEYLCVKAMILLNSSMYPLVTATQDADSSRKL-AHLLNAVTDALVW
+UNIPROT|Q9VSE9/1-484 --IAQRMERISPRREEYYLLKALLLANC------DILLDDQSSLRAFRDTILNSLNDVVY
+UNIPROT|Q9IBD5/1-710 QFIPQEFANLQVTKEEFLCMKVLLLLN-------TVPLEGLKSQPQFDEMRQNYIHELTK
+UNIPROT|Q7LCB3/1-530 --TTSRFRELKLQHKEYLCVKAMILLNSSMYPLVTATQDADSSRKL-AHLLNAVTDALVW
+UNIPROT|Q9YGV9/1-848 KNFSQEFAMLQVSQEEFLCMKALLLFS-------TIPVEGLKGQNFFDELRRSYINELDR
+UNIPROT|Q90ZM7/1-438 RQVSEDFMKLQVTSEEFLCMKAILLLS-------TVPQEGLKSQGCFEEMRISYIRELNR
+UNIPROT|Q91445/1-344 RHLSQEFGWLQITPQGFLCMKALLFFS-------IIPVDGLKNQKLFDELRMNYIKELDR
+UNIPROT|Q9VSE9/1-484 --IAQRMERISPRREEYYLLKALLLANC------DILLDDQSSLRAFRDTILNSLNDVVY
+UNIPROT|Q90ZM8/1-554 --TVSRFRELHLRREEYVCLKAMILLNSGVFFCLSNSAGEQTNVQLIQQILEKVMDALGS
+
+UNIPROT|Q7LCB3/1-530 VIAKSGISSQQQSMRLANLLMLLSHVRHASNKGMEHLLNMKCKNV-----VPVYDLLLEM
+UNIPROT|Q9VSE9/1-484 LLRHSSAVSHQQ-----QLLLLLPSLRQADDILRRFWRGIARDEV-----ITMKKLFLEM
+UNIPROT|Q9IBD5/1-710 AIHLRENGVVACSQRFYHLTKLMDHMHDIVKKLHLYCLSTFIQADAMR--VEFPEMMSEV
+UNIPROT|Q7LCB3/1-530 VIAKSGISSQQQSMRLANLLMLLSHVRHASNKGMEHLLNMKCKNV-----VPVYDLLLEM
+UNIPROT|Q9YGV9/1-848 LVSFRSK--SSCSERFQQLTRLLDSLQPVLKKLHQFTFDLFVQSQNLSNQVCFPEMISEI
+UNIPROT|Q90ZM7/1-438 TIARTEKNAVQCWQRFYQLTKLLXCMQDLVSKLLEFCFATFTQTQVWS--VEFPDMMAEI
+UNIPROT|Q91445/1-344 IIACKRKNPTSCSRRFYQLTKVLDSVTPIAKDLHQFTFDLLIKAHMVS--VDYPEMMAEI
+UNIPROT|Q9VSE9/1-484 LLRHSSAVSHQQ-----QLLLLLPSLRQADDILRRFWRGIARDEV-----ITMKKLFLEM
+UNIPROT|Q90ZM8/1-554 TIGHIEASPPQHSRRLSQLLLLLSQIRHISNKGIEHLNSMKRKNV-----IPLYDLLLEL
+
+UNIPROT|Q7LCB3/1-530 LNAHVLRGCKSSITGSECSPAEDSKSKEGSQNPQSQ---
+UNIPROT|Q9VSE9/1-484 LE------------------------------PLAR---
+UNIPROT|Q9IBD5/1-710 IASQL------------------PRVLAGMVKPLLFHTK
+UNIPROT|Q7LCB3/1-530 LNAHVLRGCKSSITGSECSPAEDSKSKEGSQNPQSQ---
+UNIPROT|Q9YGV9/1-848 ISVHV------------------PKILAGTVKPILFHK-
+UNIPROT|Q90ZM7/1-438 ISAQL------------------ASHHGREARALHFHKK
+UNIPROT|Q91445/1-344 ISVQV------------------PKILS-----------
+UNIPROT|Q9VSE9/1-484 LE------------------------------PLAR---
+UNIPROT|Q90ZM8/1-554 LDAHSLQN-----TGLRTSPP--PQDFRATLVP------
+
--- /dev/null
+>UNIPROT|Q7LCB3/1-530 estrogen nuclear receptor beta variant a
+MDIKNSPSSLNSPSSYNCSQSILPLEHGSIYIPSSYVDSHHEYPAMTFYSPAVMNYSIPSNVTNLEGGPGRQ
+TTSPNVLWPTPGHLSPLVVHRQLSHLYAEPQKSPWCEARSLEHTLPVNRETLKRKVSGNRCASPVTGPGSKR
+DAHFCAVCSDYASGYHYGVWSCEGCKAFFKRSIQGHNDYICPATNQCTIDKNRRKSCQACRLRKCYEVGMVK
+CGSRRERCGYRLVRRQRSADEQLHCAGKAKRSGGHAPRVRELLLDALSPEQLVLTLLEAEPPHVLISRPSAP
+FTEASMMMSLTKLADKELVHMISWAKKIPGFVELSLFDQVRLLESCWMEVLMMGLMWRSIDHPGKLIFAPDL
+VLDRDEGKCVEGILEIFDMLLATTSRFRELKLQHKEYLCVKAMILLNSSMYPLVTATQDADSSRKLAHLLNA
+VTDALVWVIAKSGISSQQQSMRLANLLMLLSHVRHASNKGMEHLLNMKCKNVVPVYDLLLEMLNAHVLRGCK
+SSITGSECSPAEDSKSKEGSQNPQSQ
+>UNIPROT|Q9VSE9/1-484 GH28308p
+MSDGVSILHIKQEVDTPSASCFSPSSKSTATQSGTNGLKSSPSVSPERQLCSSTTSLSCDLHNVSLSNDGDS
+LKGSGTSGGNGGGGGGGTSGGNATNASAGAGSGSVRDELRRLCLVCGDVASGFHYGVASCEACKAFFKRTIQ
+GNIEYTCPANNECEINKRRRKACQACRFQKCLLMGMLKEGVRLDRVRGGRQKYRRNPVSNSYQTMQLLYQSN
+TTSLCDVKILEVLNSYEPDALSVQTPPPQVHTTSITNDEASSSSGSIKLESSVVTPNGTCIFQNNNNNDPNE
+ILSVLSDIYDKELVSVIGWAKQIPGFIDLPLNDQMKLLQVSWAEILTLQLTFRSLPFNGKLCFATDVWMDEH
+LAKECGYTEFYYHCVQIAQRMERISPRREEYYLLKALLLANCDILLDDQSSLRAFRDTILNSLNDVVYLLRH
+SSAVSHQQQLLLLLPSLRQADDILRRFWRGIARDEVITMKKLFLEMLEPLAR
+>UNIPROT|Q9IBD5/1-710 progesterone receptor
+MDNNHQDKMESLYTPARASPTPDAESIKRARNLIKTYSESFGSYVEEIVRDDSNNIQSLSSVPLLMRNFGNM
+DTLTCAPGSGSDSEIWKDFVVPGNSVVSKDTCGHVEISTKAENLSWAAAPLSREETLAKGTVTVPATVPKES
+FTATSNTSSASGISIKDEQQSLLKMEPQSSDFCPYTANIPKLNPSYLTNTASTKQLGYGEQPDTSAHSSPPA
+QKIVLDTARYSADLCSDNPLPQATNIKTDPCSSFSSFVGEGILTRASMGYSQQAIQTLPVHKSEPFRLSASS
+APADSPFWCQSTGPSEDHHLQIDYLSPAGLHSTCKYSSTNAYSSYLGVLPQRVCVICGDEASGCHYGVLTCG
+SCKVFFKRAVEGHHNYLCAGRNDCIVDKIRRKNCPACRLRKCYQAGMILGGRKLKKLGALKAAGLTQALVAH
+SLTPRRLSGDSQALMPLGCLPGVRELHLSPQIISVLESIEPEVVYSGYDNSQPDMPNMLLNSLNRLCERQLL
+RIVKWSKSLPGFRSLHINDQMALIQYSWMSLMVFSLGWRSFQNVTSDYLYFAPDLILNEEYMRRSPIFDLCM
+AMQFIPQEFANLQVTKEEFLCMKVLLLLNTVPLEGLKSQPQFDEMRQNYIHELTKAIHLRENGVVACSQRFY
+HLTKLMDHMHDIVKKLHLYCLSTFIQADAMRVEFPEMMSEVIASQLPRVLAGMVKPLLFHTK
+>UNIPROT|Q7LCB3/1-530 estrogen receptor 2 isoform A
+MDIKNSPSSLNSPSSYNCSQSILPLEHGSIYIPSSYVDSHHEYPAMTFYSPAVMNYSIPSNVTNLEGGPGRQ
+TTSPNVLWPTPGHLSPLVVHRQLSHLYAEPQKSPWCEARSLEHTLPVNRETLKRKVSGNRCASPVTGPGSKR
+DAHFCAVCSDYASGYHYGVWSCEGCKAFFKRSIQGHNDYICPATNQCTIDKNRRKSCQACRLRKCYEVGMVK
+CGSRRERCGYRLVRRQRSADEQLHCAGKAKRSGGHAPRVRELLLDALSPEQLVLTLLEAEPPHVLISRPSAP
+FTEASMMMSLTKLADKELVHMISWAKKIPGFVELSLFDQVRLLESCWMEVLMMGLMWRSIDHPGKLIFAPDL
+VLDRDEGKCVEGILEIFDMLLATTSRFRELKLQHKEYLCVKAMILLNSSMYPLVTATQDADSSRKLAHLLNA
+VTDALVWVIAKSGISSQQQSMRLANLLMLLSHVRHASNKGMEHLLNMKCKNVVPVYDLLLEMLNAHVLRGCK
+SSITGSECSPAEDSKSKEGSQNPQSQ
+>UNIPROT|Q9YGV9/1-848 androgen receptor alpha
+MEIPVGLGGVSDATNAVFRGPYQNVFHSLQVAFQSHGAVSRSLDFPNTKYGFLQNRHFCEMRQENKQPPCKG
+LGLFYGNHRNSDTGTNEDDIACFSRQSDAEARPGIFSESSLDTGDEITCKLQSDNQGVRASGPLLPGSSGCN
+SGQKSSLACTSQQRETTSQSDTCAGESCSEHQATTISETARELCNAVSVSLGLNLDLNDMNDLSSNQISSTE
+SDTSQAIYLFESSPGYTGVGLNALVRDCKCQSAREGTSTQQYDRGAMFKINRVNDLPLQPAPPRHTSISDAK
+WDMEAGLCAQMEHKDSEKCANMDGAHSTSVFSQFDQLLPVNASHYSQNVSVRVEPQSDFSPILYKSPGIQKN
+AEKYNVQYDATIKSEDGKTTSEREWGFQYRYNESCSTPSAPPRHCAHQNRAGPYNQFFFNPFEYAKRGVVSR
+EGYSLEHGFPNNLARTPYSGSLKNELGDRLSGPYPDVSYRYEGERENVFPVEFFFPPQRTCLICGDEASGCH
+YGALTCGSCKVFFKRAAEGKQKYLCASINDCTIDKLRRKNCPSCRLKRCFAAGMTLGARKLKKIGQMRAPED
+GQGQGPAEAELSVSPKYDLGFHTQSMFLNILEAIEPEVVNAGHDYGQPDSAASLLTSLNELGERQLVKVVKW
+AKGMPGFRSLYVDDQMTVIQHSWMAVMVFALGWRSFKNVKSRMLYFAPDLVFNEHRMQVSTMYEHCIRMKNF
+SQEFAMLQVSQEEFLCMKALLLFSTIPVEGLKGQNFFDELRRSYINELDRLVSFRSKSSCSERFQQLTRLLD
+SLQPVLKKLHQFTFDLFVQSQNLSNQVCFPEMISEIISVHVPKILAGTVKPILFHK
+>UNIPROT|Q90ZM7/1-438 corticoid receptor
+GVEFQLPYSASATSFRPSVATSSASGISNFSNGNNFGFLSPNGVQQDGFPYPGFTSPAQSSVPPQKACLICS
+DEASGCHYGVLTCGSCKVFFKRAVEGQHNYLCAGRNDCIIDKIRRKNCPACRLRKCIQAGMTLGARKLKKQG
+RVKGENQRSPASSTATTSSATPQPSSNSTAVTTFSPPPTGEPIFSPTLIAILQAIEPEVVMSGYDNTRSQTT
+AYMLSSLNRLCDKQLVSIVKWAKSLPGFRNLHIDDQMVLIQYSWMGLMSFAMSWRSFQHTNSKLLYFAPDLV
+FDETRMQQSAMYQLCVEMRQVSEDFMKLQVTSEEFLCMKAILLLSTVPQEGLKSQGCFEEMRISYIRELNRT
+IARTEKNAVQCWQRFYQLTKLLXCMQDLVSKLLEFCFATFTQTQVWSVEFPDMMAEIISAQLASHHGREARA
+LHFHKK
+>UNIPROT|Q91445/1-344 androgen receptor
+EASGCHYGALTCGSCKVFFKRAAEGKQKYLCASRNDCTIDKFRRKNCPSCRLRKCYEAGMTLGARKLKKLGN
+LKAQDDIEGASSSSPTEEQAPKLVMTRIDGYECQPIFLNVLEAIEPGVVCAGHDNSQPDSFSNLLTSLNELG
+ERQLVYVVKWAKALPGFRNLHVDDQMSIIQYSWMGLMVFAMGWRSFTNVNSRMLYFAPDLVFNEYRMHKSRM
+YSQCIRMRHLSQEFGWLQITPQGFLCMKALLFFSIIPVDGLKNQKLFDELRMNYIKELDRIIACKRKNPTSC
+SRRFYQLTKVLDSVTPIAKDLHQFTFDLLIKAHMVSVDYPEMMAEIISVQVPKILS
+>UNIPROT|Q9VSE9/1-484 estrogen-related receptor
+MSDGVSILHIKQEVDTPSASCFSPSSKSTATQSGTNGLKSSPSVSPERQLCSSTTSLSCDLHNVSLSNDGDS
+LKGSGTSGGNGGGGGGGTSGGNATNASAGAGSGSVRDELRRLCLVCGDVASGFHYGVASCEACKAFFKRTIQ
+GNIEYTCPANNECEINKRRRKACQACRFQKCLLMGMLKEGVRLDRVRGGRQKYRRNPVSNSYQTMQLLYQSN
+TTSLCDVKILEVLNSYEPDALSVQTPPPQVHTTSITNDEASSSSGSIKLESSVVTPNGTCIFQNNNNNDPNE
+ILSVLSDIYDKELVSVIGWAKQIPGFIDLPLNDQMKLLQVSWAEILTLQLTFRSLPFNGKLCFATDVWMDEH
+LAKECGYTEFYYHCVQIAQRMERISPRREEYYLLKALLLANCDILLDDQSSLRAFRDTILNSLNDVVYLLRH
+SSAVSHQQQLLLLLPSLRQADDILRRFWRGIARDEVITMKKLFLEMLEPLAR
+>UNIPROT|Q90ZM8/1-554 estrogen receptor
+ARGFSEAHGYEYSGASLYQPLPPSCTEFSIGAHQQQQHQHQHHQHQHQQHHHQQQQQQPQPQQNGVLGEGQS
+SHLSYLPPSTELPQYVPSSPSAPYSMELGAGRPHGYDPGPQSLYRGGVESSAPPYSEQQQVVGGGGAMSAMG
+LTEPRHVSSGSLPSSTRPERSTQFCAVCSDYASGYHYGVWSCEGCKAFFKRSTQGHNDYMCPATNQCTIDRN
+RRKSCQACRLRKCYEVGMVKGVRKDRKGFRGVKHKRKRPIPQKNGGEGGAGGGQDVSETRPQGERPSGPRDR
+ESAVSSLEADQVISALLEAEPPTVLSSYDPDKPVTEASLMAALTSLADRELVHMITWAKKIPGFTAIGLSDQ
+VQLLECCWLEILIVGLIWRSIDRPGQLHFAPNLILGREDARNVEGMLDMFDMLLVTVSRFRELHLRREEYVC
+LKAMILLNSGVFFCLSNSAGEQTNVQLIQQILEKVMDALGSTIGHIEASPPQHSRRLSQLLLLLSQIRHISN
+KGIEHLNSMKRKNVIPLYDLLLELLDAHSLQNTGLRTSPPPQDFRATLVP
--- /dev/null
+>UNIPROT|Q7LCB3/1-530 estrogen nuclear receptor beta variant a
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+--------------------------MDIKNSPSSLNSPSSYNCSQSI------LPLEHGSIYIPSSYVDSH
+HEYPAMTFYSPAVMNYSIPSNVTNLEGGPGRQT-------TSP----------NVLWPTPGHLSPLVVHRQL
+SHLY--------------------------------------------AEPQKSPWCEARSLEHTLPVNRET
+LK----------RKVSGN---------------RCASPVTGP------------------------------
+-------------------GSKRDAHF---------------------------------CAVCSDYASGYH
+YGVWSCEGCKAFFKRSIQGHNDYICPATNQCTIDKNRRKSCQACRLRKCYEVGMVKCGSRRERC-GYRLVRR
+QRSADEQLHCAGKAKRSGGH-------------APRVRELLLDALSPEQLVLTLLEA-EPPHVLIS------
+----------------------R-PSAPFTEASMMMSLTKLADKELVHMISWAKKIPGFVELSLFDQVRLLE
+SCWMEVLMMGLMWRSID--HPGKLIFAPDLVLDRDEGKCVEGILEIFDMLLAT---TSRFRELKLQHKEYLC
+VKAMILLNSSMYPLVTAT-QDADSSRKLAHLLNAVTDALVWVIAKSGISSQQQSMRLANLLMLLSHVRHASN
+KGMEHLLN--MKCKNV---VPVYDLLLEMLNAHVLRGCKSSITGSECSPAEDSKSKEGSQNPQSQ---
+>UNIPROT|Q9VSE9/1-484 GH28308p
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+-----------------------------------------------------------MSDGVSILHIKQE
+VDTPSASCFSPSSKSTATQSGTNGLK--------------SSP----------SVSPERQLCSSTTSLSCDL
+HNVS---------------------------------------LSNDGDSLKGSGTSGGNGGGGGGGTSGGN
+AT--------------------------------NASAGAGS------------------------------
+-------------------GSVRDELRRL-------------------------------CLVCGDVASGFH
+YGVASCEACKAFFKRTIQGNIEYTCPANNECEINKRRRKACQACRFQKCLLMGMLKEGVRLDRVRGGRQKYR
+RNPVSNSYQTMQLLYQSNTTSL-----------CDVKILEVLNSYEPDALSVQT----PPPQVHTTSITNDE
+ASSSSGSIKLESSVVTPNGTCIFQNNNNNDPNEILSVLSDIYDKELVSVIGWAKQIPGFIDLPLNDQMKLLQ
+VSWAEILTLQLTFRSLP--FNGKLCFATDVWMDEHLAKEC-GYTEFYYHCVQI---AQRMERISPRREEYYL
+LKALLLANCDILL------DDQSSLRAFRDTILNSLNDVVYLLRHSSAVSHQQ-----QLLLLLPSLRQADD
+ILRRFWRG--IARDEV---ITMKKLFLEMLE------------------------------PLAR---
+>UNIPROT|Q9IBD5/1-710 progesterone receptor
+--------------------------------------------MDNNHQDKMESLYTPARASPTPDAESIK
+RARNLIKTYSESFGSYVEEIVRDDSNNIQSLSSVPLLMRNFGNMDTLTCAPGSGSDSEIWKDFVVPGNSVVS
+KDTCGHVEISTKAENLSWAAAPLSREETLAKGTVTVPATVPKESFTAT-----SNTSSASGISIKDEQQSLL
+KMEPQSSDFCPYTANIPKLNPSYLTNTASTKQLGYG----EQP----------DTSAHSSPPAQKIVLDTAR
+YSAD----------------------------------LCSDNPLPQATNIKTDPCSSFSSFVGEGILTRAS
+MGYSQQAIQTLPVHKSEP---------------FRLSASSAPADSPFWCQS---------------------
+------------------TGPSEDHHLQIDYLSPAGLHSTCKYSSTNAYSSYLGVLPQRVCVICGDEASGCH
+YGVLTCGSCKVFFKRAVEGHHNYLCAGRNDCIVDKIRRKNCPACRLRKCYQAGMILGGRKLKKL-GALKAAG
+LTQALVAHSLTPRRLSGDSQAL-----------MPLGCLPGVRELHLSPQIISVLESIEPEVVYSG------
+----------------------YDNSQPDMPNMLLNSLNRLCERQLLRIVKWSKSLPGFRSLHINDQMALIQ
+YSWMSLMVFSLGWRSFQNVTSDYLYFAPDLILNEEYMRRS----PIFDLCMAMQFIPQEFANLQVTKEEFLC
+MKVLLLLN--TVPL-----EGLKSQPQFDEMRQNYIHELTKAIHLRENGVVACSQRFYHLTKLMDHMHDIVK
+KLHLYCLSTFIQADAMR--VEFPEMMSEVIASQL------------------PRVLAGMVKPLLFHTK
+>UNIPROT|Q7LCB3/1-530 estrogen receptor 2 isoform A
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+--------------------------MDIKNSPSSLNSPSSYNCSQSI------LPLEHGSIYIPSSYVDSH
+HEYPAMTFYSPAVMNYSIPSNVTNLEGGPGRQT-------TSP----------NVLWPTPGHLSPLVVHRQL
+SHLY--------------------------------------------AEPQKSPWCEARSLEHTLPVNRET
+LK----------RKVSGN---------------RCASPVTGP------------------------------
+-------------------GSKRDAHF---------------------------------CAVCSDYASGYH
+YGVWSCEGCKAFFKRSIQGHNDYICPATNQCTIDKNRRKSCQACRLRKCYEVGMVKCGSRRERC-GYRLVRR
+QRSADEQLHCAGKAKRSGGH-------------APRVRELLLDALSPEQLVLTLLEA-EPPHVLIS------
+----------------------R-PSAPFTEASMMMSLTKLADKELVHMISWAKKIPGFVELSLFDQVRLLE
+SCWMEVLMMGLMWRSID--HPGKLIFAPDLVLDRDEGKCVEGILEIFDMLLAT---TSRFRELKLQHKEYLC
+VKAMILLNSSMYPLVTAT-QDADSSRKLAHLLNAVTDALVWVIAKSGISSQQQSMRLANLLMLLSHVRHASN
+KGMEHLLN--MKCKNV---VPVYDLLLEMLNAHVLRGCKSSITGSECSPAEDSKSKEGSQNPQSQ---
+>UNIPROT|Q9YGV9/1-848 androgen receptor alpha
+MEIPVGLGGVSDATNAVFRGPYQNVFHSLQVAFQSHGAVSRSLDFPNTKYGFLQNRHFCEMRQENKQPPCKG
+LGLFYGNHRNSDTGTNEDDIACFSRQSDAEARPGIFSESSLDTGDEITCKLQSDNQGVRASGPLLPGSSGCN
+SGQKSSLACTSQQRETTSQSDTCAGESCSEHQATTISETARELCNAVSVSLGLNLDLNDMNDLSSNQISSTE
+SDTSQAIYLFESSPGYTGVGLNALVRDCKCQSAREGTSTQQYDRGAMFKINRVNDLPLQPAPPRHTSISDAK
+WDMEAGLCAQMEHKDSEKCANMDGAHSTSVFSQFDQLLPVNASHYSQNVSVRVEPQSDFSPILYKSPGIQKN
+AEKYNVQYDATIKSEDGKTTSEREWGFQYRYNESCSTPSAPPRHCAHQNRAGPYNQFFFNPFEYAKRGVVSR
+EGYSLEHGFPNNLARTPYSGSLKNELGDRLSGPYPDVSYRYEGERENVFPVEFFFPPQRTCLICGDEASGCH
+YGALTCGSCKVFFKRAAEGKQKYLCASINDCTIDKLRRKNCPSCRLKRCFAAGMTL---------GARKLKK
+IGQMRAPEDGQGQGPAEAELSV-----------SPKYDL----GFHTQSMFLNILEAIEPEVVNAG------
+----------------------HDYGQPDSAASLLTSLNELGERQLVKVVKWAKGMPGFRSLYVDDQMTVIQ
+HSWMAVMVFALGWRSFKNVKSRMLYFAPDLVFNEHRMQVS----TMYEHCIRMKNFSQEFAMLQVSQEEFLC
+MKALLLFS--TIPV-----EGLKGQNFFDELRRSYINELDRLVSFRSKSS--CSERFQQLTRLLDSLQPVLK
+KLHQFTFDLFVQSQNLSNQVCFPEMISEIISVHV------------------PKILAGTVKPILFHK-
+>UNIPROT|Q91445/1-344 androgen receptor
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------------------------------------------------------------------EASGCH
+YGALTCGSCKVFFKRAAEGKQKYLCASRNDCTIDKFRRKNCPSCRLRKCYEAGMTL---------GARKLKK
+LGNLKAQDDIEGASSSSPTEEQ-----------APKLVMTRIDGYECQPIFLNVLEAIEPGVVCAG------
+----------------------HDNSQPDSFSNLLTSLNELGERQLVYVVKWAKALPGFRNLHVDDQMSIIQ
+YSWMGLMVFAMGWRSFTNVNSRMLYFAPDLVFNEYRMHKS----RMYSQCIRMRHLSQEFGWLQITPQGFLC
+MKALLFFS--IIPV-----DGLKNQKLFDELRMNYIKELDRIIACKRKNPTSCSRRFYQLTKVLDSVTPIAK
+DLHQFTFDLLIKAHMVS--VDYPEMMAEIISVQV------------------PKILS-----------
+>UNIPROT|Q9VSE9/1-484 estrogen-related receptor
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+-----------------------------------------------------------MSDGVSILHIKQE
+VDTPSASCFSPSSKSTATQSGTNGLK--------------SSP----------SVSPERQLCSSTTSLSCDL
+HNVS---------------------------------------LSNDGDSLKGSGTSGGNGGGGGGGTSGGN
+AT--------------------------------NASAGAGS------------------------------
+-------------------GSVRDELRRL-------------------------------CLVCGDVASGFH
+YGVASCEACKAFFKRTIQGNIEYTCPANNECEINKRRRKACQACRFQKCLLMGMLKEGVRLDRVRGGRQKYR
+RNPVSNSYQTMQLLYQSNTTSL-----------CDVKILEVLNSYEPDALSVQT----PPPQVHTTSITNDE
+ASSSSGSIKLESSVVTPNGTCIFQNNNNNDPNEILSVLSDIYDKELVSVIGWAKQIPGFIDLPLNDQMKLLQ
+VSWAEILTLQLTFRSLP--FNGKLCFATDVWMDEHLAKEC-GYTEFYYHCVQI---AQRMERISPRREEYYL
+LKALLLANCDILL------DDQSSLRAFRDTILNSLNDVVYLLRHSSAVSHQQ-----QLLLLLPSLRQADD
+ILRRFWRG--IARDEV---ITMKKLFLEMLE------------------------------PLAR---
+>UNIPROT|Q90ZM8/1-554 estrogen receptor
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+-------------------ARGFSEAHGYEYSGASLYQPLPPSCTEFS-----------IGAHQQQQHQHQH
+HQHQHQQHHHQQQQQQPQPQQNGVLGEGQSSHLSYLPPSTELP----------QYVPSSPSAPYSMELGAGR
+PHGYD---------------------------------PGPQSLYRGGVESSAPPYSEQQQVVGGGGAMSAM
+GL-------------TEP---------------RHVSSGSLP------------------------------
+-------------------SSTRPERSTQF------------------------------CAVCSDYASGYH
+YGVWSCEGCKAFFKRSTQGHNDYMCPATNQCTIDRNRRKSCQACRLRKCYEVGMVK-GVRKDRK-GFRGVKH
+KRKRPIPQKNGGEGGAGGGQDVSETRPQGERPSGPRDRESAVSSLEADQVISALLEA-EPPTVLSS------
+----------------------YDPDKPVTEASLMAALTSLADRELVHMITWAKKIPGFTAIGLSDQVQLLE
+CCWLEILIVGLIWRSID--RPGQLHFAPNLILGREDARNVEGMLDMFDMLLVT---VSRFRELHLRREEYVC
+LKAMILLNSGVFFCLSNSAGEQTNVQLIQQILEKVMDALGSTIGHIEASPPQHSRRLSQLLLLLSQIRHISN
+KGIEHLNS--MKRKNV---IPLYDLLLELLDAHSLQ-------NTGLRTSPPPQDFRATLVP------
--- /dev/null
+>UNIPROT|Q7LCB3/178-225 estrogen nuclear receptor beta variant a
+QGHNDYICPATNQCTIDKNRRKSCQACRLRKCYEVGMVKCGSRRERC-G
+>UNIPROT|Q9VSE9/144-192 GH28308p
+QGNIEYTCPANNECEINKRRRKACQACRFQKCLLMGMLKEGVRLDRVRG
+>UNIPROT|Q9IBD5/371-418 progesterone receptor
+EGHHNYLCAGRNDCIVDKIRRKNCPACRLRKCYQAGMILGGRKLKKL-G
+>UNIPROT|Q7LCB3/178-225 estrogen receptor 2 isoform A
+QGHNDYICPATNQCTIDKNRRKSCQACRLRKCYEVGMVKCGSRRERC-G
+>UNIPROT|Q9YGV9/522-561 androgen receptor alpha
+EGKQKYLCASINDCTIDKLRRKNCPSCRLKRCFAAGMTL---------G
+>UNIPROT|Q91445/24-63 androgen receptor
+EGKQKYLCASRNDCTIDKFRRKNCPSCRLRKCYEAGMTL---------G
+>UNIPROT|Q9VSE9/144-192 estrogen-related receptor
+QGNIEYTCPANNECEINKRRRKACQACRFQKCLLMGMLKEGVRLDRVRG
+>UNIPROT|Q90ZM8/198-244 estrogen receptor
+QGHNDYMCPATNQCTIDRNRRKSCQACRLRKCYEVGMVK-GVRKDRK-G
--- /dev/null
+{"seqs":[{"name":"FER_CAPAN/3-34","start":3,"svid":"1.0","end":34,"id":"1665704504","seq":"SVSATMISTSFMPRKPAVTSL-KPIPNVGE--ALF","order":1},{"name":"FER1_SOLLC/3-34","start":3,"svid":"1.0","end":34,"id":"1003594867","seq":"SISGTMISTSFLPRKPAVTSL-KAISNVGE--ALF","order":2},{"name":"Q93XJ9_SOLTU/3-34","start":3,"svid":"1.0","end":34,"id":"1332961135","seq":"SISGTMISTSFLPRKPVVTSL-KAISNVGE--ALF","order":3},{"name":"FER1_PEA/6-37","start":6,"svid":"1.0","end":37,"id":"1335040546","seq":"ALYGTAVSTSFLRTQPMPMSV-TTTKAFSN--GFL","order":4},{"name":"Q7XA98_TRIPR/6-39","start":6,"svid":"1.0","end":39,"id":"1777084554","seq":"ALYGTAVSTSFMRRQPVPMSV-ATTTTTKAFPSGF","order":5},{"name":"FER_TOCH/3-34","start":3,"svid":"1.0","end":34,"id":"823528539","seq":"FILGTMISKSFLFRKPAVTSL-KAISNVGE--ALF","order":6}],"appSettings":{"globalColorScheme":"zappo","webStartUrl":"www.jalview.org/services/launchApp","application":"Jalview","hiddenSeqs":"823528539","showSeqFeatures":"true","version":"2.9","hiddenCols":"32-33;34-34"},"seqGroups":[{"displayText":true,"startRes":21,"groupName":"JGroup:1883305585","endRes":29,"colourText":false,"sequenceRefs":["1003594867","1332961135","1335040546","1777084554"],"svid":"1.0","showNonconserved":false,"colourScheme":"Zappo","displayBoxes":true}],"alignAnnotation":[{"svid":"1.0","annotations":[{"displayCharacter":"","value":0,"secondaryStructure":"\u0000"},{"displayCharacter":"","value":0,"secondaryStructure":"\u0000"},{"displayCharacter":"α","value":0,"secondaryStructure":"H"},{"displayCharacter":"α","value":0,"secondaryStructure":"H"},{"displayCharacter":"α","value":0,"secondaryStructure":"H"},{"displayCharacter":"","value":0,"secondaryStructure":"\u0000"},{"displayCharacter":"","value":0,"secondaryStructure":"\u0000"},{"displayCharacter":"","value":0,"secondaryStructure":"\u0000"},{"displayCharacter":"β","value":0,"secondaryStructure":"E"},{"displayCharacter":"β","value":0,"secondaryStructure":"E"},{"displayCharacter":"β","value":0,"secondaryStructure":"E"},{"displayCharacter":"β","value":0,"secondaryStructure":"E"},{"displayCharacter":"β","value":0,"secondaryStructure":"E"},{"displayCharacter":"β","value":0,"secondaryStructure":"E"},{"displayCharacter":"β","value":0,"secondaryStructure":"E"},{"displayCharacter":"β","value":0,"secondaryStructure":"E"},{"displayCharacter":"","value":0,"secondaryStructure":"\u0000"},{"displayCharacter":"","value":0,"secondaryStructure":"\u0000"},{"displayCharacter":"","value":0,"secondaryStructure":"\u0000"},{"displayCharacter":"","value":0,"secondaryStructure":"\u0000"},{"displayCharacter":"","value":0,"secondaryStructure":"\u0000"},{"displayCharacter":"","value":0,"secondaryStructure":"\u0000"},{"displayCharacter":"","value":0,"secondaryStructure":"\u0000"},{"displayCharacter":"","value":0,"secondaryStructure":"\u0000"},{"displayCharacter":"","value":0,"secondaryStructure":"\u0000"},{"displayCharacter":"","value":0,"secondaryStructure":"\u0000"},{"displayCharacter":"α","value":0,"secondaryStructure":"H"},{"displayCharacter":"α","value":0,"secondaryStructure":"H"},{"displayCharacter":"α","value":0,"secondaryStructure":"H"},{"displayCharacter":"α","value":0,"secondaryStructure":"H"},{"displayCharacter":"α","value":0,"secondaryStructure":"H"},{"displayCharacter":"","value":0,"secondaryStructure":"\u0000"},{"displayCharacter":"","value":0,"secondaryStructure":"\u0000"},{"displayCharacter":"","value":0,"secondaryStructure":"\u0000"},{"displayCharacter":"","value":0,"secondaryStructure":"\u0000"}],"description":"New description","label":"Secondary Structure"}],"svid":"1.0","seqFeatures":[{"fillColor":"#7d1633","score":0,"otherDetails":{"status":"+"},"sequenceRef":"1332961135","featureGroup":"Pfam","svid":"1.0","description":"My description","xStart":0,"xEnd":0,"type":"Domain"},{"fillColor":"#7d1633","score":0,"sequenceRef":"1332961135","featureGroup":"Jalview","svid":"1.0","description":"theDesc","xStart":3,"xEnd":13,"type":"feature_x"},{"fillColor":"#7d1633","score":0,"sequenceRef":"1335040546","featureGroup":"Jalview","svid":"1.0","description":"theDesc","xStart":3,"xEnd":13,"type":"feature_x"},{"fillColor":"#7d1633","score":0,"sequenceRef":"1777084554","featureGroup":"Jalview","svid":"1.0","description":"theDesc","xStart":3,"xEnd":13,"type":"feature_x"}]}
\ No newline at end of file
--- /dev/null
+(((FER_BRANA:128.0,FER3_RAPSA:128.0):50.75,FER_CAPAA:178.75):121.94443,(Q93Z60_ARATH:271.45456,((O80429_MAIZE:183.0,FER1_MAIZE:183.0):30.5,((Q7XA98_TRIPR:90.0,FER1_PEA:90.0):83.32143,(((FER1_ARATH:64.0,FER2_ARATH:64.0):94.375,(FER1_SPIOL:124.5,FER1_MESCR:124.5):33.875):6.4166718,((Q93XJ9_SOLTU:33.5,FER1_SOLLC:33.5):49.0,FER_CAPAN:82.5):82.29167):8.529755):40.178574):57.95456):29.239868);
--- /dev/null
+>FER_CAPAA Ferredoxin
+ASYKVKLITPDGPIEFDCPDDVYILDQAEEAGHDLPYSCRAGSCSSCAGKIAGGAVDQTDGNFLDDDQLEEG
+WVLTCVAYPQSDVTIETHKEAELVG-
+>FER_CAPAN Ferredoxin, chloroplast precursor
+ASYKVKLITPDGPIEFDCPDNVYILDQAEEAGHDLPYSCRAGSCSSCAGKIAGGAVDQTDGNFLDDDQLEEG
+WVLTCVAYPQSDVTIETHKEAELVG-
+>FER1_SOLLC Ferredoxin-1, chloroplast precursor
+ASYKVKLITPEGPIEFECPDDVYILDQAEEEGHDLPYSCRAGSCSSCAGKVTAGSVDQSDGNFLDEDQEAAG
+FVLTCVAYPKGDVTIETHKEEELTA-
+>Q93XJ9_SOLTU Ferredoxin I precursor
+ASYKVKLITPDGPIEFECPDDVYILDQAEEEGHDLPYSCRAGSCSSCAGKVTAGTVDQSDGKFLDDDQEAAG
+FVLTCVAYPKCDVTIETHKEEELTA-
+>FER1_MESCR Ferredoxin-1, chloroplast precursor
+AAYKVTLVTPEGKQELECPDDVYILDAAEEAGIDLPYSCRAGSCSSCAGKVTSGSVNQDDGSFLDDDQIKEG
+WVLTCVAYPTGDVTIETHKEEELTA-
+>FER1_SPIOL Ferredoxin-1, chloroplast precursor
+AAYKVTLVTPTGNVEFQCPDDVYILDAAEEEGIDLPYSCRAGSCSSCAGKLKTGSLNQDDQSFLDDDQIDEG
+WVLTCAAYPVSDVTIETHKEEELTA-
+>FER1_ARATH Ferredoxin-1, chloroplast precursor
+ATYKVKFITPEGELEVECDDDVYVLDAAEEAGIDLPYSCRAGSCSSCAGKVVSGSVDQSDQSFLDDEQIGEG
+FVLTCAAYPTSDVTIETHKEEDIV--
+>FER2_ARATH Ferredoxin-2, chloroplast precursor
+ATYKVKFITPEGEQEVECEEDVYVLDAAEEAGLDLPYSCRAGSCSSCAGKVVSGSIDQSDQSFLDDEQMSEG
+YVLTCVAYPTSDVVIETHKEEAIM--
+>FER1_PEA Ferredoxin-1, chloroplast precursor
+ASYKVKLVTPDGTQEFECPSDVYILDHAEEVGIDLPYSCRAGSCSSCAGKVVGGEVDQSDGSFLDDEQIEAG
+FVLTCVAYPTSDVVIETHKEEDLTA-
+>Q7XA98_TRIPR Ferredoxin I
+ATYKVKLITPEGPQEFDCPDDVYILDHAEEVGIELPYSCRAGSCSSCAGKVVNGNVNQEDGSFLDDEQIEGG
+WVLTCVAFPTSDVTIETHKEEELTA-
+>FER1_MAIZE Ferredoxin-1, chloroplast precursor
+ATYNVKLITPEGEVELQVPDDVYILDQAEEDGIDLPYSCRAGSCSSCAGKVVSGSVDQSDQSYLDDGQIADG
+WVLTCHAYPTSDVVIETHKEEELTGA
+>O80429_MAIZE Ferredoxin
+ATYNVKLITPEGEVELQVPDDVYILDFAEEEGIDLPFSCRAGSCSSCAGKVVSGSVDQSDQSFLNDNQVADG
+WVLTCAAYPTSDVVIETHKEDDLL--
+>Q93Z60_ARATH At1g10960/T19D16_12
+ATYKVKFITPEGEQEVECEEDVYVLDAAEEAGLDLPYSCRAGSCSSCAGKVVSGSIDQSDQSFLDD------
+--------------------------
+>FER3_RAPSA Ferredoxin, leaf L-A
+ATYKVKFITPEGEQEVECDDDVYVLDAAEEAGIDLPYSCRAGSCSSCAGKVVSGSVDQSDQSFLDDDQIAEG
+FVLTCAAYPTSDVTIETHREEDMV--
+>FER_BRANA Ferredoxin
+ATYKVKFITPEGEQEVECDDDVYVLDAAEEAGIDLPYSCRAGSCSSCAGKVVSGFVDQSDESFLDDDQIAEG
+FVLTCAAYPTSDVTIETHKEEELV--
--- /dev/null
+Lupas_21:-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,
+Lupas_14:-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,
+Lupas_28:-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,
+
+jnetpred:-,-,-,-,E,E,E,E,E,E,-,-,-,-,-,E,E,E,E,-,-,-,-,E,E,E,E,E,-,H,H,H,H,H,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,E,E,E,E,-,-,E,E,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,E,E,E,E,E,E,E,E,-,-,-,-,E,E,E,E,-,
+JNETCONF:1,3,1,2,7,7,9,9,7,1,6,8,9,8,1,3,5,5,1,6,8,9,7,4,8,8,7,2,3,2,0,2,1,2,5,7,8,8,7,6,4,2,1,3,5,7,8,7,5,4,4,5,7,5,2,5,5,1,4,2,0,1,5,6,7,7,5,4,5,4,5,6,6,3,1,1,1,4,6,1,6,9,9,9,8,8,7,0,8,9,9,7,2,8,9,9,8,
+JNETSOL25:B,-,B,-,-,B,B,B,B,B,-,-,-,-,-,-,-,-,-,-,-,-,-,-,B,B,B,B,-,B,-,B,-,-,-,-,-,-,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,-,-,B,-,-,-,-,-,-,-,-,-,-,-,-,B,B,-,-,-,-,-,-,B,-,-,B,B,B,B,B,B,B,B,B,B,-,-,-,-,B,B,-,-,
+JNETSOL5:-,-,-,-,-,-,-,B,B,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,B,-,-,-,-,-,-,-,-,-,-,-,-,-,-,B,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,B,B,B,B,B,B,-,-,-,-,-,-,-,B,-,-,
+JNETSOL0:-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,B,-,B,-,-,-,-,-,-,-,-,-,-,-,-,-,
+JNETPROPH:0.44514,0.02676,0.50891,0.59931,0.03767,0.31300,0.54697,0.01490,0.41391,0.55820,0.01816,0.38620,0.82780,0.00804,0.16764,0.86436,0.00416,0.14111,0.96423,0.00391,0.03569,0.94587,0.00483,0.05758,0.88110,0.01273,0.13718,0.57335,0.02654,0.44509,0.17935,0.02373,0.80108,0.08085,0.00825,0.91351,0.06739,0.00450,0.93803,0.11202,0.00730,0.88142,0.41953,0.00953,0.55868,0.64171,0.00894,0.34807,0.74660,0.00831,0.27522,0.78367,0.00952,0.27786,0.54376,0.01578,0.49285,0.18080,0.01695,0.78463,0.05922,0.01157,0.90794,0.03565,0.02045,0.91548,0.12377,0.02896,0.77671,0.58102,0.05600,0.22143,0.82750,0.03376,0.07013,0.86371,0.02169,0.08984,0.81881,0.04410,0.14200,0.60784,0.05837,0.36725,0.27275,0.10034,0.53452,0.12405,0.28672,0.44961,0.07683,0.43094,0.40783,0.05134,0.55252,0.37353,0.03890,
+JNETPROPB:0.59931,0.03767,0.31300,0.54697,0.01490,0.41391,0.55820,0.01816,0.38620,0.82780,0.00804,0.16764,0.86436,0.00416,0.14111,0.96423,0.00391,0.03569,0.94587,0.00483,0.05758,0.88110,0.01273,0.13718,0.57335,0.02654,0.44509,0.17935,0.02373,0.80108,0.08085,0.00825,0.91351,0.06739,0.00450,0.93803,0.11202,0.00730,0.88142,0.41953,0.00953,0.55868,0.64171,0.00894,0.34807,0.74660,0.00831,0.27522,0.78367,0.00952,0.27786,0.54376,0.01578,0.49285,0.18080,0.01695,0.78463,0.05922,0.01157,0.90794,0.03565,0.02045,0.91548,0.12377,0.02896,0.77671,0.58102,0.05600,0.22143,0.82750,0.03376,0.07013,0.86371,0.02169,0.08984,0.81881,0.04410,0.14200,0.60784,0.05837,0.36725,0.27275,0.10034,0.53452,0.12405,0.28672,0.44961,0.07683,0.43094,0.40783,0.05134,0.55252,0.37353,0.03890,0.52815,0.46401,0.03979,
+JNETPROPC:0.54697,0.01490,0.41391,0.55820,0.01816,0.38620,0.82780,0.00804,0.16764,0.86436,0.00416,0.14111,0.96423,0.00391,0.03569,0.94587,0.00483,0.05758,0.88110,0.01273,0.13718,0.57335,0.02654,0.44509,0.17935,0.02373,0.80108,0.08085,0.00825,0.91351,0.06739,0.00450,0.93803,0.11202,0.00730,0.88142,0.41953,0.00953,0.55868,0.64171,0.00894,0.34807,0.74660,0.00831,0.27522,0.78367,0.00952,0.27786,0.54376,0.01578,0.49285,0.18080,0.01695,0.78463,0.05922,0.01157,0.90794,0.03565,0.02045,0.91548,0.12377,0.02896,0.77671,0.58102,0.05600,0.22143,0.82750,0.03376,0.07013,0.86371,0.02169,0.08984,0.81881,0.04410,0.14200,0.60784,0.05837,0.36725,0.27275,0.10034,0.53452,0.12405,0.28672,0.44961,0.07683,0.43094,0.40783,0.05134,0.55252,0.37353,0.03890,0.52815,0.46401,0.03979,0.40515,0.56556,0.03815,
+JNETHMM:-,-,-,-,E,E,E,E,E,E,-,-,-,-,-,E,E,E,E,-,-,-,-,E,E,E,E,E,-,-,H,H,H,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,E,E,E,E,-,-,E,E,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,E,E,E,E,E,E,E,E,-,-,-,-,E,E,E,E,-,
+JNETALIGN:-,-,-,E,E,E,E,E,-,-,-,-,-,-,E,-,-,-,-,-,-,E,E,E,E,H,H,H,H,H,-,-,-,-,-,-,-,E,-,-,-,-,-,-,-,-,-,-,-,-,E,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,H,-,-,-,-,-,-,E,E,E,E,E,E,-,-,-,-,-,E,E,E,E,E,E,H,H,H,-,-,-,-,
+align1;Sequence0/1.97:A,S,Y,K,V,K,L,I,T,P,D,G,P,I,E,F,D,C,P,D,D,V,Y,I,L,D,Q,A,E,E,A,G,H,D,L,P,Y,S,C,R,A,G,S,C,S,S,C,A,G,K,I,A,G,G,A,V,D,Q,T,D,G,N,F,L,D,D,D,Q,L,E,E,G,W,V,L,T,C,V,A,Y,P,Q,S,D,V,T,I,E,T,H,K,E,A,E,L,V,G,
+align2;Sequence1/1.144:A,S,Y,K,V,K,L,I,T,P,D,G,P,I,E,F,D,C,P,D,N,V,Y,I,L,D,Q,A,E,E,A,G,H,D,L,P,Y,S,C,R,A,G,S,C,S,S,C,A,G,K,I,A,G,G,A,V,D,Q,T,D,G,N,F,L,D,D,D,Q,L,E,E,G,W,V,L,T,C,V,A,Y,P,Q,S,D,V,T,I,E,T,H,K,E,A,E,L,V,G,
+align3;Sequence2/1.144:A,S,Y,K,V,K,L,I,T,P,E,G,P,I,E,F,E,C,P,D,D,V,Y,I,L,D,Q,A,E,E,E,G,H,D,L,P,Y,S,C,R,A,G,S,C,S,S,C,A,G,K,V,T,A,G,S,V,D,Q,S,D,G,N,F,L,D,E,D,Q,E,A,A,G,F,V,L,T,C,V,A,Y,P,K,G,D,V,T,I,E,T,H,K,E,E,E,L,T,A,
+align4;Sequence3/1.144:A,S,Y,K,V,K,L,I,T,P,D,G,P,I,E,F,E,C,P,D,D,V,Y,I,L,D,Q,A,E,E,E,G,H,D,L,P,Y,S,C,R,A,G,S,C,S,S,C,A,G,K,V,T,A,G,T,V,D,Q,S,D,G,K,F,L,D,D,D,Q,E,A,A,G,F,V,L,T,C,V,A,Y,P,K,C,D,V,T,I,E,T,H,K,E,E,E,L,T,A,
+align5;Sequence4/1.149:A,S,Y,K,V,K,L,V,T,P,D,G,T,Q,E,F,E,C,P,S,D,V,Y,I,L,D,H,A,E,E,V,G,I,D,L,P,Y,S,C,R,A,G,S,C,S,S,C,A,G,K,V,V,G,G,E,V,D,Q,S,D,G,S,F,L,D,D,E,Q,I,E,A,G,F,V,L,T,C,V,A,Y,P,T,S,D,V,V,I,E,T,H,K,E,E,D,L,T,A,
+align6;Sequence5/1.152:A,T,Y,K,V,K,L,I,T,P,E,G,P,Q,E,F,D,C,P,D,D,V,Y,I,L,D,H,A,E,E,V,G,I,E,L,P,Y,S,C,R,A,G,S,C,S,S,C,A,G,K,V,V,N,G,N,V,N,Q,E,D,G,S,F,L,D,D,E,Q,I,E,G,G,W,V,L,T,C,V,A,F,P,T,S,D,V,T,I,E,T,H,K,E,E,E,L,T,A,
+align7;Sequence6/1.148:A,A,Y,K,V,T,L,V,T,P,E,G,K,Q,E,L,E,C,P,D,D,V,Y,I,L,D,A,A,E,E,A,G,I,D,L,P,Y,S,C,R,A,G,S,C,S,S,C,A,G,K,V,T,S,G,S,V,N,Q,D,D,G,S,F,L,D,D,D,Q,I,K,E,G,W,V,L,T,C,V,A,Y,P,T,G,D,V,T,I,E,T,H,K,E,E,E,L,T,A,
+align8;Sequence7/1.147:A,A,Y,K,V,T,L,V,T,P,T,G,N,V,E,F,Q,C,P,D,D,V,Y,I,L,D,A,A,E,E,E,G,I,D,L,P,Y,S,C,R,A,G,S,C,S,S,C,A,G,K,L,K,T,G,S,L,N,Q,D,D,Q,S,F,L,D,D,D,Q,I,D,E,G,W,V,L,T,C,A,A,Y,P,V,S,D,V,T,I,E,T,H,K,E,E,E,L,T,A,
+align9;Sequence8/1.96:A,T,Y,K,V,K,F,I,T,P,E,G,E,Q,E,V,E,C,D,D,D,V,Y,V,L,D,A,A,E,E,A,G,I,D,L,P,Y,S,C,R,A,G,S,C,S,S,C,A,G,K,V,V,S,G,S,V,D,Q,S,D,Q,S,F,L,D,D,D,Q,I,A,E,G,F,V,L,T,C,A,A,Y,P,T,S,D,V,T,I,E,T,H,R,E,E,D,M,V,.,
+align10;Sequence9/1.148:A,T,Y,K,V,K,F,I,T,P,E,G,E,L,E,V,E,C,D,D,D,V,Y,V,L,D,A,A,E,E,A,G,I,D,L,P,Y,S,C,R,A,G,S,C,S,S,C,A,G,K,V,V,S,G,S,V,D,Q,S,D,Q,S,F,L,D,D,E,Q,I,G,E,G,F,V,L,T,C,A,A,Y,P,T,S,D,V,T,I,E,T,H,K,E,E,D,I,V,.,
+align11;Sequence10/1.96:A,T,Y,K,V,K,F,I,T,P,E,G,E,Q,E,V,E,C,D,D,D,V,Y,V,L,D,A,A,E,E,A,G,I,D,L,P,Y,S,C,R,A,G,S,C,S,S,C,A,G,K,V,V,S,G,F,V,D,Q,S,D,E,S,F,L,D,D,D,Q,I,A,E,G,F,V,L,T,C,A,A,Y,P,T,S,D,V,T,I,E,T,H,K,E,E,E,L,V,.,
+align12;Sequence11/1.148:A,T,Y,K,V,K,F,I,T,P,E,G,E,Q,E,V,E,C,E,E,D,V,Y,V,L,D,A,A,E,E,A,G,L,D,L,P,Y,S,C,R,A,G,S,C,S,S,C,A,G,K,V,V,S,G,S,I,D,Q,S,D,Q,S,F,L,D,D,E,Q,M,S,E,G,Y,V,L,T,C,V,A,Y,P,T,S,D,V,V,I,E,T,H,K,E,E,A,I,M,.,
+align13;Sequence12/1.118:A,T,Y,K,V,K,F,I,T,P,E,G,E,Q,E,V,E,C,E,E,D,V,Y,V,L,D,A,A,E,E,A,G,L,D,L,P,Y,S,C,R,A,G,S,C,S,S,C,A,G,K,V,V,S,G,S,I,D,Q,S,D,Q,S,F,L,D,D,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,
+align14;Sequence13/1.150:A,T,Y,N,V,K,L,I,T,P,E,G,E,V,E,L,Q,V,P,D,D,V,Y,I,L,D,Q,A,E,E,D,G,I,D,L,P,Y,S,C,R,A,G,S,C,S,S,C,A,G,K,V,V,S,G,S,V,D,Q,S,D,Q,S,Y,L,D,D,G,Q,I,A,D,G,W,V,L,T,C,H,A,Y,P,T,S,D,V,V,I,E,T,H,K,E,E,E,L,T,G,
+align15;Sequence14/1.140:A,T,Y,N,V,K,L,I,T,P,E,G,E,V,E,L,Q,V,P,D,D,V,Y,I,L,D,F,A,E,E,E,G,I,D,L,P,F,S,C,R,A,G,S,C,S,S,C,A,G,K,V,V,S,G,S,V,D,Q,S,D,Q,S,F,L,N,D,N,Q,V,A,D,G,W,V,L,T,C,A,A,Y,P,T,S,D,V,V,I,E,T,H,K,E,D,D,L,L,.,
+jpred:-,-,-,-,E,E,E,E,E,E,-,-,-,-,-,E,E,E,E,-,-,-,-,E,E,E,E,E,-,H,H,H,H,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,E,E,E,E,-,-,E,E,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,E,E,E,E,E,E,E,E,-,-,-,-,E,E,E,E,-,
--- /dev/null
+JALVIEW_ANNOTATION
+# Created: Mon Dec 11 10:43:00 GMT 2006
+
+NO_GRAPH Secondary Structure ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||1,E|E|E|||||2,E|E|E|E|E|E|E|E|||||3,H|H|H|H|H|||||||||||Fe|||||Fe|||Fe||4,E|E||||||5,E|E|||||||||||6,H|H|H|H||7,E||||Fe|||E|E||||9,E|E|E|E|E||||||||||
+NO_GRAPH Iron Sulphur Contacts ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||Fe|||||Fe|||Fe||||||||||||||||||||||||||||||Fe||||||||||||||||||||||
+COLOUR Conservation 5d1500
+COLOUR Quality 560c00
--- /dev/null
+>FER_CAPAA/1-97
+----------------------------------------------------------ASYKVKLITPDGPI
+EFDCPDDVYILDQAEEAGHDLPYSCRAGSCSSCAGKIAGGAVDQTDGNFLDDDQLEEGWVLTCVAYPQSDVT
+IETHKEAELVG-
+>FER_CAPAN/1-144
+------MASVSATMISTSFMPRKPAVTSLKPIP-NVG-EALFGLKS---ANGGKVTCMASYKVKLITPDGPI
+EFDCPDNVYILDQAEEAGHDLPYSCRAGSCSSCAGKIAGGAVDQTDGNFLDDDQLEEGWVLTCVAYPQSDVT
+IETHKEAELVG-
+>FER1_SOLLC/1-144
+------MASISGTMISTSFLPRKPAVTSLKAIS-NVG-EALFGLKS---GRNGRITCMASYKVKLITPEGPI
+EFECPDDVYILDQAEEEGHDLPYSCRAGSCSSCAGKVTAGSVDQSDGNFLDEDQEAAGFVLTCVAYPKGDVT
+IETHKEEELTA-
+>Q93XJ9_SOLTU/1-144
+------MASISGTMISTSFLPRKPVVTSLKAIS-NVG-EALFGLKS---GRNGRITCMASYKVKLITPDGPI
+EFECPDDVYILDQAEEEGHDLPYSCRAGSCSSCAGKVTAGTVDQSDGKFLDDDQEAAGFVLTCVAYPKCDVT
+IETHKEEELTA-
+>FER1_PEA/1-149
+---MATTPALYGTAVSTSFLRTQPMPMSVTTTKAFSN--GFLGLKT-SLKRGDLAVAMASYKVKLVTPDGTQ
+EFECPSDVYILDHAEEVGIDLPYSCRAGSCSSCAGKVVGGEVDQSDGSFLDDEQIEAGFVLTCVAYPTSDVV
+IETHKEEDLTA-
+>Q7XA98_TRIPR/1-152
+---MATTPALYGTAVSTSFMRRQPVPMSVATTTTTKAFPSGFGLKSVSTKRGDLAVAMATYKVKLITPEGPQ
+EFDCPDDVYILDHAEEVGIELPYSCRAGSCSSCAGKVVNGNVNQEDGSFLDDEQIEGGWVLTCVAFPTSDVT
+IETHKEEELTA-
+>FER1_MESCR/1-148
+--MAATTAALSGATMSTAFAPKT--PPMTAALPTNVG-RALFGLKS--SASRGRVTAMAAYKVTLVTPEGKQ
+ELECPDDVYILDAAEEAGIDLPYSCRAGSCSSCAGKVTSGSVNQDDGSFLDDDQIKEGWVLTCVAYPTGDVT
+IETHKEEELTA-
+>FER1_SPIOL/1-147
+----MAATTTTMMGMATTFVPKPQAPPMMAALPSNTG-RSLFGLKT--GSRGGRMT-MAAYKVTLVTPTGNV
+EFQCPDDVYILDAAEEEGIDLPYSCRAGSCSSCAGKLKTGSLNQDDQSFLDDDQIDEGWVLTCAAYPVSDVT
+IETHKEEELTA-
+>FER3_RAPSA/1-96
+----------------------------------------------------------ATYKVKFITPEGEQ
+EVECDDDVYVLDAAEEAGIDLPYSCRAGSCSSCAGKVVSGSVDQSDQSFLDDDQIAEGFVLTCAAYPTSDVT
+IETHREEDMV--
+>FER2_ARATH/1-148
+----MASTALSSAIVGTSFIRRSPAPISLRSLPSANT-QSLFGLKS-GTARGGRVTAMATYKVKFITPEGEL
+EVECDDDVYVLDAAEEAGIDLPYSCRAGSCSSCAGKVVSGSVDQSDQSFLDDEQIGEGFVLTCAAYPTSDVT
+IETHKEEDIV--
+>FER_BRANA/1-96
+----------------------------------------------------------ATYKVKFITPEGEQ
+EVECDDDVYVLDAAEEAGIDLPYSCRAGSCSSCAGKVVSGFVDQSDESFLDDDQIAEGFVLTCAAYPTSDVT
+IETHKEEELV--
+>FER1_ARATH/1-148
+----MASTALSSAIVSTSFLRRQQTPISLRSLPFANT-QSLFGLKS-STARGGRVTAMATYKVKFITPEGEQ
+EVECEEDVYVLDAAEEAGLDLPYSCRAGSCSSCAGKVVSGSIDQSDQSFLDDEQMSEGYVLTCVAYPTSDVV
+IETHKEEAIM--
+>Q93Z60_ARATH/1-118
+----MASTALSSAIVSTSFLRRQQTPISLRSLPFANT-QSLFGLKS-STARGGRVTAMATYKVKFITPEGEQ
+EVECEEDVYVLDAAEEAGLDLPYSCRAGSCSSCAGKVVSGSIDQSDQSFLDD--------------------
+------------
+>FER1_MAIZE/1-150
+MATVLGSPRAPAFFFSSSSLRAAPAPTAVALPAAKVG---IMGRSA---SSRRRLRAQATYNVKLITPEGEV
+ELQVPDDVYILDQAEEDGIDLPYSCRAGSCSSCAGKVVSGSVDQSDQSYLDDGQIADGWVLTCHAYPTSDVV
+IETHKEEELTGA
+>O80429_MAIZE/1-140
+---------MAATALSMSILRAPP-PCFSSPLRLRVAVAKPLAAPM----RRQLLRAQATYNVKLITPEGEV
+ELQVPDDVYILDFAEEEGIDLPFSCRAGSCSSCAGKVVSGSVDQSDQSFLNDNQVADGWVLTCAAYPTSDVV
+IETHKEDDLL--
--- /dev/null
+HELIX d4d189
+MOD_RES 47e459
+TRANSIT 6f949b
+TURN 1d1e2d
+METAL 70686e
+SIGNAL 92c7dd
+VARIANT 60beac
+Pfam dc206a
+CONFLICT c46c6e
+STRAND 25c54c
+
+STARTGROUP uniprot
+Iron-sulfur (2Fe-2S) FER_CAPAA -1 39 39 METAL
+Iron-sulfur (2Fe-2S) FER_CAPAA -1 44 44 METAL
+Iron-sulfur (2Fe-2S) FER_CAPAA -1 47 47 METAL
+Iron-sulfur (2Fe-2S) FER_CAPAA -1 77 77 METAL
+<html>Description: Fer2 Status: True Positive <a href="http://pfam.xfam.org/family/PF00111">Pfam 8_83</a></html> FER_CAPAA -1 8 83 Pfam
+Chloroplast FER_CAPAN -1 1 47 TRANSIT
+Iron-sulfur (2Fe-2S) FER_CAPAN -1 86 86 METAL
+Iron-sulfur (2Fe-2S) FER_CAPAN -1 91 91 METAL
+Iron-sulfur (2Fe-2S) FER_CAPAN -1 94 94 METAL
+Iron-sulfur (2Fe-2S) FER_CAPAN -1 124 124 METAL
+Phosphothreonine FER_CAPAN -1 136 136 MOD_RES
+<html>Description: Fer2 Status: True Positive <a href="http://pfam.xfam.org/family/PF00111">Pfam 55_130</a></html> FER_CAPAN -1 55 130 Pfam
+Chloroplast FER1_SOLLC -1 1 47 TRANSIT
+Iron-sulfur (2Fe-2S) FER1_SOLLC -1 86 86 METAL
+Iron-sulfur (2Fe-2S) FER1_SOLLC -1 91 91 METAL
+Iron-sulfur (2Fe-2S) FER1_SOLLC -1 94 94 METAL
+Iron-sulfur (2Fe-2S) FER1_SOLLC -1 124 124 METAL
+<html>Description: Fer2 Status: True Positive <a href="http://pfam.xfam.org/family/PF00111">Pfam 55_130</a></html> FER1_SOLLC -1 55 130 Pfam
+Evidence: EI4 Q93XJ9_SOLTU -1 1 48 SIGNAL
+<html>Description: Fer2 Status: True Positive <a href="http://pfam.xfam.org/family/PF00111">Pfam 55_130</a></html> Q93XJ9_SOLTU -1 55 130 Pfam
+Chloroplast FER1_PEA -1 1 52 TRANSIT
+L -> I (in strain: cv. Onward) FER1_PEA -1 59 59 VARIANT
+I -> L (in strain: cv. Onward) FER1_PEA -1 85 85 VARIANT
+Iron-sulfur (2Fe-2S) FER1_PEA -1 91 91 METAL
+Iron-sulfur (2Fe-2S) FER1_PEA -1 96 96 METAL
+Iron-sulfur (2Fe-2S) FER1_PEA -1 99 99 METAL
+Iron-sulfur (2Fe-2S) FER1_PEA -1 129 129 METAL
+YPTS -> PPPA (in Ref. 2) FER1_PEA -1 132 135 CONFLICT
+<html>Description: Fer2 Status: True Positive <a href="http://pfam.xfam.org/family/PF00111">Pfam 60_135</a></html> FER1_PEA -1 60 135 Pfam
+<html>Description: Fer2 Status: True Positive <a href="http://pfam.xfam.org/family/PF00111">Pfam 63_138</a></html> Q7XA98_TRIPR -1 63 138 Pfam
+Chloroplast FER1_MESCR -1 1 51 TRANSIT
+Iron-sulfur (2Fe-2S) FER1_MESCR -1 90 90 METAL
+Iron-sulfur (2Fe-2S) FER1_MESCR -1 95 95 METAL
+Iron-sulfur (2Fe-2S) FER1_MESCR -1 98 98 METAL
+Iron-sulfur (2Fe-2S) FER1_MESCR -1 128 128 METAL
+<html>Description: Fer2 Status: True Positive <a href="http://pfam.xfam.org/family/PF00111">Pfam 59_134</a></html> FER1_MESCR -1 59 134 Pfam
+Chloroplast FER1_SPIOL -1 1 50 TRANSIT
+STRAND FER1_SPIOL -1 52 59 STRAND
+TURN FER1_SPIOL -1 60 61 TURN
+STRAND FER1_SPIOL -1 62 69 STRAND
+TURN FER1_SPIOL -1 70 71 TURN
+HELIX FER1_SPIOL -1 74 80 HELIX
+TURN FER1_SPIOL -1 81 82 TURN
+STRAND FER1_SPIOL -1 88 92 STRAND
+Iron-sulfur (2Fe-2S) FER1_SPIOL -1 89 89 METAL
+Iron-sulfur (2Fe-2S) FER1_SPIOL -1 94 94 METAL
+TURN FER1_SPIOL -1 96 97 TURN
+Iron-sulfur (2Fe-2S) FER1_SPIOL -1 97 97 METAL
+STRAND FER1_SPIOL -1 98 104 STRAND
+TURN FER1_SPIOL -1 109 110 TURN
+HELIX FER1_SPIOL -1 116 121 HELIX
+TURN FER1_SPIOL -1 122 122 TURN
+STRAND FER1_SPIOL -1 123 125 STRAND
+HELIX FER1_SPIOL -1 126 128 HELIX
+Iron-sulfur (2Fe-2S) FER1_SPIOL -1 127 127 METAL
+STRAND FER1_SPIOL -1 130 133 STRAND
+STRAND FER1_SPIOL -1 135 138 STRAND
+HELIX FER1_SPIOL -1 142 144 HELIX
+<html>Description: Fer2 Status: True Positive <a href="http://pfam.xfam.org/family/PF00111">Pfam 58_133</a></html> FER1_SPIOL -1 58 133 Pfam
+I -> V FER3_RAPSA -1 8 8 VARIANT
+Iron-sulfur (2Fe-2S) FER3_RAPSA -1 39 39 METAL
+Iron-sulfur (2Fe-2S) FER3_RAPSA -1 44 44 METAL
+Iron-sulfur (2Fe-2S) FER3_RAPSA -1 47 47 METAL
+S -> T FER3_RAPSA -1 55 55 VARIANT
+Iron-sulfur (2Fe-2S) FER3_RAPSA -1 77 77 METAL
+R -> K FER3_RAPSA -1 91 91 VARIANT
+M -> V FER3_RAPSA -1 95 95 VARIANT
+<html>Description: Fer2 Status: True Positive <a href="http://pfam.xfam.org/family/PF00111">Pfam 8_83</a></html> FER3_RAPSA -1 8 83 Pfam
+Chloroplast FER2_ARATH -1 1 52 TRANSIT
+Iron-sulfur (2Fe-2S) FER2_ARATH -1 91 91 METAL
+Iron-sulfur (2Fe-2S) FER2_ARATH -1 96 96 METAL
+Iron-sulfur (2Fe-2S) FER2_ARATH -1 99 99 METAL
+Iron-sulfur (2Fe-2S) FER2_ARATH -1 129 129 METAL
+<html>Description: Fer2 Status: True Positive <a href="http://pfam.xfam.org/family/PF00111">Pfam 60_135</a></html> FER2_ARATH -1 60 135 Pfam
+Iron-sulfur (2Fe-2S) FER_BRANA -1 39 39 METAL
+Iron-sulfur (2Fe-2S) FER_BRANA -1 44 44 METAL
+Iron-sulfur (2Fe-2S) FER_BRANA -1 47 47 METAL
+Iron-sulfur (2Fe-2S) FER_BRANA -1 77 77 METAL
+<html>Description: Fer2 Status: True Positive <a href="http://pfam.xfam.org/family/PF00111">Pfam 8_83</a></html> FER_BRANA -1 8 83 Pfam
+Chloroplast FER1_ARATH -1 1 52 TRANSIT
+Iron-sulfur (2Fe-2S) FER1_ARATH -1 91 91 METAL
+Iron-sulfur (2Fe-2S) FER1_ARATH -1 96 96 METAL
+Iron-sulfur (2Fe-2S) FER1_ARATH -1 99 99 METAL
+Iron-sulfur (2Fe-2S) FER1_ARATH -1 129 129 METAL
+<html>Description: Fer2 Status: True Positive <a href="http://pfam.xfam.org/family/PF00111">Pfam 60_135</a></html> FER1_ARATH -1 60 135 Pfam
+<html>Description: Fer2 Status: True Positive <a href="http://pfam.xfam.org/family/PF00111">Pfam 60_118</a></html> Q93Z60_ARATH -1 60 118 Pfam
+Chloroplast FER1_MAIZE -1 1 52 TRANSIT
+STRAND FER1_MAIZE -1 57 59 STRAND
+STRAND FER1_MAIZE -1 72 74 STRAND
+HELIX FER1_MAIZE -1 76 80 HELIX
+TURN FER1_MAIZE -1 81 84 TURN
+STRAND FER1_MAIZE -1 90 97 STRAND
+Iron-sulfur (2Fe-2S) FER1_MAIZE -1 91 91 METAL
+Iron-sulfur (2Fe-2S) FER1_MAIZE -1 96 96 METAL
+TURN FER1_MAIZE -1 98 99 TURN
+Iron-sulfur (2Fe-2S) FER1_MAIZE -1 99 99 METAL
+TURN FER1_MAIZE -1 118 119 TURN
+HELIX FER1_MAIZE -1 120 123 HELIX
+TURN FER1_MAIZE -1 128 129 TURN
+Iron-sulfur (2Fe-2S) FER1_MAIZE -1 129 129 METAL
+STRAND FER1_MAIZE -1 132 135 STRAND
+STRAND FER1_MAIZE -1 137 141 STRAND
+TURN FER1_MAIZE -1 142 142 TURN
+<html>Description: Fer2 Status: True Positive <a href="http://pfam.xfam.org/family/PF00111">Pfam 60_135</a></html> FER1_MAIZE -1 60 135 Pfam
+<html>Description: Fer2 Status: True Positive <a href="http://pfam.xfam.org/family/PF00111">Pfam 52_127</a></html> O80429_MAIZE -1 52 127 Pfam
+ENDGROUP uniprot
--- /dev/null
+CLUSTAL
+
+B.taurus.1/1-64 C-UUGCGUU--AAUGAGAACAGAAACG-UAAA--CUAUAA-CCUAG-G---------GGU
+D.melanogaster.3/1-68 G-UGGCGCU--UAUGACGCAGUUGUCU-UAAA-CUCGAAC--UCGA-GC--------GGG
+D.melanogaster.2/1-63 C-AUUCAACU-UAUGAGGAUUAUUUCU-UAAA-GGCCUCU---GGC--U-------CGGA
+D.melanogaster.1/1-65 G-AGCC-CU---AUGAUCGAUGAUUGG-CAAA-UCCUCUC--GAGG--A-------ACCG
+R.norvegicus.7/1-66 C-CGGCACU--CAUGACGGUCUGCCUG-AAAA-CCAGCCC--GCUG-GU--------GGG
+R.norvegicus.6/1-67 G-CCGCUUC---AUGACAGGAAGGACU-GAAA-UGUCUCA-AAGAC--C-----UGUGGU
+R.norvegicus.5/1-62 G-UUUUUCC---AUGACGGUGUUUCCUCUAAA--UUUAC----AUG-----------GAG
+R.norvegicus.4/1-61 G-UCAGAUG---AUGACGGCCUGUGCA-GAAA-CCCCCAC-GUGGG--C--------UGC
+R.norvegicus.3/1-67 U-UUGCAUU--AAUGAGGAUUACACAG-AAAA-CCUUUGU--UAAGGGU--------UUG
+R.norvegicus.2/1-64 G-UUACAUU--GAUGAGAACAGAAACA-UAAA--CUAUGA-CCUAG-G---------GGU
+R.norvegicus.1/1-61 A-UAUUUGUU-UAUGAUGGUCACAGUG-UAAA--GUUCA----CAC-----------AGC
+O.aries.1/1-68 G-ACGCUUC---AUGACAGGAAGGACU-GAAA-UGUCUCU-UGGAC-GC------CUGGU
+M.musculus.9/1-66 C-CGGCACU--CAUGAAGGUCUGCUUG-AAAA-CCAGCCU--GCUG-GU--------GGG
+M.musculus.8/1-67 U-UUGCAUU--AAUGAGGAUUACACAG-AAAA-CCUUUGU--UAAG-GA-------CUUG
+O.niloticus.3/1-65 G-UGUCUCU---GUGAAGUUCGGUUUU-UAAA-AGGGUCA---UCC--A-------GAAA
+M.musculus.7/1-64 G-UGUCUCU---AUGAAGGAGGGGCCC-GAAG-CCCUUGU---GGG--C--------GGG
+O.niloticus.2/1-61 U-GUUUAUU--AAUGACGGCUACAGAU-UAAA--CCUUU----AGC-----------CUC
+M.musculus.6/1-61 G-UCAGAUG---AUGAUGGCCUGGGCA-GAAA-CCCCAUG--UGGG--C--------CGC
+O.niloticus.1/1-59 G-UUUCUCA---GUGAAGGCUACAGAU-UAAA--CCUCU----GGC-----------CUC
+M.musculus.5/1-66 G-CCGCUUC---AUGACAGGAAGGACU-GAAA-UGUCUUA---GAC--C-----UGUGGU
+M.musculus.4/1-65 G-UGUGCGA---AUGAUAACUACUGAC-GAAA-GAGCUGU-CUGCU--C-------AGUC
+M.musculus.3/1-64 G-GUUCUUC--CAUGAUGGUGUUUCCUCUAAA--UUUGC----ACG-----------GAG
+M.musculus.2/1-64 G-UUACAUU--AAUGAGAACAGAAACA-UAAA--CUAUGA-CCUAG-G---------GGU
+M.musculus.1/1-64 G-UCACCGA---AUGAUCUGCUCUGGU-CAAA-UCCUUCU---AUG--C------CAGCC
+C.elegans.1/1-64 G-AGGCAGCUUUGUGACGACCUUUGGC-UAAA-CUCCAUC--GUGA-GC--------GCC
+H.sapiens.15/1-63 U-UUUCAUC--UAUGAGGGUGUUUCCUCUAAA--CCUACG---AGG-----------GAG
+H.sapiens.14/1-62 C-ACUGCUG---AUGACGAACUAUCUC-UAAC-UGGUCUU--GACC--A-------CGAG
+H.sapiens.13/1-64 G-UCACUGC---AUGAUCCGCUCUGGU-CAAA-CCCUUCC---AGG--C------CAGCC
+H.sapiens.12/1-67 C-UCUGUUA---AUGACGUCUCUCCCUCUAAA-CCCCAUU-AAGGA--C--------UGG
+D.rerio.1/1-66 A-UGUGGUCUUUAUGAAGGCAGGUGCA-GAAA-CUAUGCA---CUA-GU--------GGU
+H.sapiens.11/1-63 G-CCGGAUG---AUGACGACCUGGGUG-GAAA-CCUACCC-UGUGG--G--------CAC
+H.sapiens.10/1-62 C-CGGCACU--CAUGACGGCCUGCCUG-CAAA--CCUGC----UGG--U--------GGG
+S.mansoni.1/1-67 C-UCGCUAU---AUGACGAUGGCAAUC-UCAA--AUGUU----CAU--U--------GGU
+S.scrofa.4/1-64 C-UGGCACC--CAUGACAGUCUGCCUA-AAAA-CCAGCC----CUG-GU--------GGG
+S.scrofa.3/1-63 A-UUUUAUC--CAUGAAAGUGUUUCCUCUAAA--CCUAU----GUG-----------GAG
+S.scrofa.2/1-65 C-UGGCACC--CAUGACAGUCUGCCUA-AAAA-CCAGCCC---CUG-GU--------GGG
+S.scrofa.1/1-68 G-ACGCUUC---AUGACAGGAAGGACU-GAAA-UGUCUUG-UGGAC-GC------CUGGU
+H.sapiens.9/1-58 U-AUUUGUU--UAUGAUGGCCACAGCC-UAAA--GUACA----CAC-----------GGC
+H.sapiens.8/1-67 U-UUGCUUU--AAUGAGAAUAGAAACG-UAAA--CUAUGA-CCUAG-G---------GGU
+X.laevis.1/1-67 G-UGUUUGCA-AAUGACGACCGAUUUU-GAAA-UGGUCUCACGGCC--A-------AAAA
+H.sapiens.7/1-70 U-GGCGUCUU-CAUGAGGGAGGGGCCC--AAA-GCCCUUG--UGGG--C--------GGA
+H.sapiens.6/1-66 G-UGUGCGG---AUGAUAACUACUGAC-GAAAGAGUCAUC---GAC--C-----UCAGUU
+H.sapiens.5/1-57 U-UCACAGA---AUGAUGGCACCUUCC-UAA---ACCCU----CAU-----------GGG
+H.sapiens.4/1-71 G-ACUGACAU-UAUGAAGGCCUGUACU-GAAG-ACAGCAA--GCUG--U-------UAGU
+H.sapiens.3/1-68 G-ACGCUUC---AUGAUAGGAAGGACU-GAAA-AGUCUUG-UGGAC--A-----CCUGGU
+H.sapiens.2/1-65 G-UGUGCGG---AUGAUAACUACUGAC-GAAA-GAGUCAU-CGACU--C-------AGUU
+H.sapiens.1/1-63 G-CCAGAUG---AUGACGACCUGGGUG-GAAA-CCUACCC-UGUGG--G--------CAC
+M.musculus.14/1-67 C-UCUGAUA---AUGAUGUCUCUCCCU-CUAA-CUCCCAGUAAGGA--C--------UGG
+M.musculus.13/1-60 C-AUGCGUC--CAUGAAGUCACUGGCC-UCAA-GCCCAA----GUG-GU--------GGG
+M.musculus.12/1-65 C-UCAGCAG--GAUGAUGAGAAGGGCU-GAAA-UGCUGCC--AAAC--C-------AGGU
+M.musculus.11/1-63 U-AUUUGUG--UAUGAUGGUCACAGUG-UAAA--GUUCC----CAC-----------AGC
+M.musculus.10/1-66 C-CGGCACU--CAUGAAGGUCUGCCUG-AAAA-CCAGCCU--GCUG-GU--------GGG
+B.taurus.7/1-61 U-UUUGCCC---AUGAAGGUGUUCCCUCUAAA--CCUAC----GUG-----------GAG
+B.taurus.6/1-67 G-AUGCGUC--CAUGAAGUCACCAGCC-CCAA-GCCCCUC---GUG-GU--------GGG
+B.taurus.5/1-61 G-CCAGAUG---AUGAGGACCUGUGCG-GAAA-CCCCCCG--CGGG--C--------UGC
+B.taurus.4/1-64 ACUUGCGUU--AAUGAGAACAGAAACG-UAAA--CUAUAA-CCUAG-G---------GGU
+G.gallus.3/1-73 U-AUUUCUU--UGUGAUGACCGAUUUU-GAAA-UGGGUUU---CUC--UAAUGCCAGGAA
+B.taurus.3/1-66 C-CCGGUGCC-UAUGACGGUCUGUCUG-AAAA-CCAGCCC---CUG-GU--------GGG
+G.gallus.2/1-60 U-AUUUGUC---AUGACAGUCACAGCA-UAAA--GCGCA----GAC-----------GGC
+B.taurus.2/1-64 C-UUGCGUU--AAUGAGAACAGAAACG-AAAA--CUAUAA-CCUAG-G---------GGU
+G.gallus.1/1-63 G-UGUGUUU---AUGAAGAGCACUAAC-AAAA-GAGUAAU-UGACU--C-------AGUU
+
+B.taurus.1/1-64 UUC-U-G-UUGGAU--GGUUG-------GCAAC
+D.melanogaster.3/1-68 CAA-U-U-GCUGAU---UACG---AUUAACCAC
+D.melanogaster.2/1-63 AAU-A-G-UCUGAA---CCU--------UAUUG
+D.melanogaster.1/1-65 AUC-G-U-UGAGAA--CCCCU-----UUGCCUU
+R.norvegicus.7/1-66 GCA-G-U-CCCGAG-GACCUG-------GCGUG
+R.norvegicus.6/1-67 CUU-U-C-UUCGAU--GUUCU-------GCGGC
+R.norvegicus.5/1-62 AAA-C-A-CCUGAU-UUCCAG------AAAAAU
+R.norvegicus.4/1-61 -CA-G-G-UUUGAA---CCC--------CUGGC
+R.norvegicus.3/1-67 UGUCG-A-UCUGCU--AAUUG-------GCAAA
+R.norvegicus.2/1-64 UUC-U-G-UUGGAU--AGCUC-------GUAAU
+R.norvegicus.1/1-61 UGU-G-A-CUUGAU--UUUUA-------AAAAU
+O.aries.1/1-68 CCU-U-C-CUUGAU--GUUCU------CACGGC
+M.musculus.9/1-66 GCA-G-U-CCUGAG-GACCUG-------GCGUG
+M.musculus.8/1-67 UGU-AGA-UCUGAU--AAUUG-------GCAAA
+O.niloticus.3/1-65 ACC-G-ACACUGAU--GUUUC------CGACAC
+M.musculus.7/1-64 CCU-C-C-CCUGAG---CCCG----UCUGUGGU
+O.niloticus.2/1-61 UGG-A-G-CCAGAU--GCAUU------CAAACA
+M.musculus.6/1-61 CCA-G-G-UUUGAA---CCC--------CUGGC
+O.niloticus.1/1-59 UGG-A-G-CCAGAU--GCAUU-------GAAAC
+M.musculus.5/1-66 CUU-U-C-CUCGAU--GUUCC------UGCGGC
+M.musculus.4/1-65 UGU-G-G-UUGGAU---GUAG------UCACAC
+M.musculus.3/1-64 AAA-C-A-CCUGAU-UUCCAG-----GAAAAUC
+M.musculus.2/1-64 UUC-U-G-UUGGAU--AGCUU-------GUAAU
+M.musculus.1/1-64 AGG-G-U-GGUGAU--GACCC-------GUGAC
+C.elegans.1/1-64 UCU-G-G-UCUGAU---GC---------GCCUC
+H.sapiens.15/1-63 GAA-C-A-CCUGAU---CUUA-----CAGAAAA
+H.sapiens.14/1-62 CUA-G-U-UCUGAA---UU-G-------CAGGG
+H.sapiens.13/1-64 AGA-G-U-GGGGAU--GGUCU-------GUGAC
+H.sapiens.12/1-67 GAG-A-G-GCAGAGCAAGCCU-------CAGAG
+D.rerio.1/1-66 GUC-U-G-UCUGAU--GUUUG-------GCCAU
+H.sapiens.11/1-63 CCA-U-G-UCCGAG---CCCC-------CUGGC
+H.sapiens.10/1-62 GCA-G-A-CCCGAA-AAUCCA-------GCGUG
+S.mansoni.1/1-67 UGC-C-A-UUUGAU--GAAAUCAGUUUUGUGUG
+S.scrofa.4/1-64 GCA-G-A-CUCGAG-AACCUG-------GCGUG
+S.scrofa.3/1-63 GAA-C-A-CCUGAU-GUCCAG------GAAAAU
+S.scrofa.2/1-65 GCA-G-A-CUCGAG-AACCUG-------GCGUG
+S.scrofa.1/1-68 CCU-U-C-CCUGAU--GUUCU------CAUGGC
+H.sapiens.9/1-58 UGU-G-A-CUUGAU---UCA--------AAAGA
+H.sapiens.8/1-67 UUC-U-G-UUGGAU-AAUUAG-----CAGUUUA
+X.laevis.1/1-67 CUC-GUG-UCCGAC---AUC--------AACCC
+H.sapiens.7/1-70 CCU-C-C-CCUGAG---CCUGUCUGAGGGGCCA
+H.sapiens.6/1-66 AGU-G-G-UUGGAU---GUAG------UCACAU
+H.sapiens.5/1-57 UGG-U-G-UCUGAG--AGGC--------GUGAA
+H.sapiens.4/1-71 ACA-G-A-CCAGAU--GCUUU--CUUGGCAGGC
+H.sapiens.3/1-68 CUU-U-C-CCUGAU--GUUCU------CGUGGC
+H.sapiens.2/1-65 AGU-G-G-UUGGAU---GUAG------UCACAU
+H.sapiens.1/1-63 CCA-U-G-UCCGAG---CCCC-------CUGGC
+M.musculus.14/1-67 GAG-A-G-GCUGAACAAACCU-------CAGAG
+M.musculus.13/1-60 CAG-U-G-ACAGAA---GA---------GCUGC
+M.musculus.12/1-65 CCU-U-U-UCUGAU--GGUGG-------CUGGG
+M.musculus.11/1-63 UGU-G-A-CUUGAU--UUUUA----AAAAUGUC
+M.musculus.10/1-66 GCA-G-U-CCUGAG-GACCUG-------GCGUG
+B.taurus.7/1-61 GAA-U-G-CCUGAU-GUCCAG-------GAAAA
+B.taurus.6/1-67 UGG-U-G-AUGGAA-CCGUCA-----AAGCAGU
+B.taurus.5/1-61 CCA-U-G-UCUGAG---CCC--------CUGGC
+B.taurus.4/1-64 UUC-U-G-UUGGAU--GGUUG-------GCAA-
+G.gallus.3/1-73 AUC-GUG-UCUGAU---GUUG-----UCAAGUA
+B.taurus.3/1-66 GCA-G-A-CCUGAG-AACCUG-------GCGUG
+G.gallus.2/1-60 UGU-G-A-CCUGAU--UUUAG------AAAAUA
+B.taurus.2/1-64 UUC-U-G-UUGGAU--GGUUG-------GCAAC
+G.gallus.1/1-63 GGU-G-U-UCAGAU--GCU---------CUCAC
+
--- /dev/null
+T-COFFEE, Version_8.99(Fri Feb 18 08:27:45 CET 2011 - Revision 596)
+Cedric Notredame
+CPU TIME:0 sec.
+SCORE=94
+*
+ BAD AVG GOOD
+*
+FER_CAPAA : 99
+FER_CAPAN : 94
+FER1_SOLLC : 94
+Q93XJ9_SOLTU : 93
+FER1_PEA : 93
+Q7XA98_TRIPR : 92
+FER1_MESCR : 92
+FER1_SPIOL : 92
+FER3_RAPSA : 99
+FER1_ARATH : 93
+FER_BRANA : 99
+FER2_ARATH : 93
+Q93Z60_ARATH : 92
+FER1_MAIZE : 91
+O80429_MAIZE : 91
+cons : 94
+
+FER_CAPAA ------------------------------------------------
+FER_CAPAN 99------333445778888876665554-23333345--6778765-
+FER1_SOLLC 98------344556788888876665544-23333344--5677765-
+Q93XJ9_SOLTU 98------344556788888876555554-23333344--5677765-
+FER1_PEA 9964---1344556788888876655544-23333344--6778876-
+Q7XA98_TRIPR 9964---1344566788888876665554-222222210056777650
+FER1_MESCR 9954--1124455677878765--22222122233345--5677776-
+FER1_SPIOL 9965--111111--677777765444444233334445--6789876-
+FER3_RAPSA ------------------------------------------------
+FER1_ARATH 9965----344556888888876665554233333344--6788776-
+FER_BRANA ------------------------------------------------
+FER2_ARATH 9965----344556888888876665555233333345--6778876-
+Q93Z60_ARATH 9965----344556888888876665555233333345--6778876-
+FER1_MAIZE 99540001222334677777765555443--2222233--4567554-
+O80429_MAIZE 9854---------23445555---11111111111111--1212222-
+cons 996400012344557778887766544441222233340056777650
+
+
+FER_CAPAA -----------9999999999999999999999999999999999999
+FER_CAPAN 4--445678999999999999999999999999999999999999999
+FER1_SOLLC 4--445678999999999999999999999999999999999999999
+Q93XJ9_SOLTU 4--445678999999999999999999999999999999999999999
+FER1_PEA 533444568999999999999999999999999999999999999999
+Q7XA98_TRIPR 333434568999999999999999999999999999999999999999
+FER1_MESCR 4333-5678999999999999999999999999999999999999999
+FER1_SPIOL 422--2334599999999999999999999999999999999999999
+FER3_RAPSA -----------9999999999999999999999999999999999999
+FER1_ARATH 533446788999999999999999999999999999999999999999
+FER_BRANA -----------9999999999999999999999999999999999999
+FER2_ARATH 533546788999999999999999999999999999999999999999
+Q93Z60_ARATH 533546788999999999999999999999999999999999999999
+FER1_MAIZE 4222--567899999999999999999999999999999999999999
+O80429_MAIZE 222435678999999999999999999999999999999999999999
+cons 422445677899999999999999999999999999999999999999
+
+
+FER_CAPAA 999999999999999999999999999999999999999999999999
+FER_CAPAN 999999999999999999999999999999999999999999999999
+FER1_SOLLC 999999999999999999999999999999999999999999999999
+Q93XJ9_SOLTU 999999999999999999999999999999999999999999999999
+FER1_PEA 999999999999999999999999999999999999999999999999
+Q7XA98_TRIPR 999999999999999999999999999999999999999999999999
+FER1_MESCR 999999999999999999999999999999999999999999999999
+FER1_SPIOL 999999999999999999999999999999999999999999999999
+FER3_RAPSA 999999999999999999999999999999999999999999999999
+FER1_ARATH 999999999999999999999999999999999999999999999999
+FER_BRANA 999999999999999999999999999999999999999999999999
+FER2_ARATH 999999999999999999999999999999999999999999999999
+Q93Z60_ARATH 99999999999999999999999999999-------------------
+FER1_MAIZE 999999999999999999999999999999999999999999999999
+O80429_MAIZE 999999999999999999999999999999999999999999999999
+cons 999999999999999999999999999999999999999999999999
+
+
+FER_CAPAA 999999998865-
+FER_CAPAN 999999998865-
+FER1_SOLLC 999999998865-
+Q93XJ9_SOLTU 999999998865-
+FER1_PEA 999999999865-
+Q7XA98_TRIPR 999999998865-
+FER1_MESCR 999999998865-
+FER1_SPIOL 999999998865-
+FER3_RAPSA 99999999874--
+FER1_ARATH 99999998874--
+FER_BRANA 99999999874--
+FER2_ARATH 99999998764--
+Q93Z60_ARATH -------------
+FER1_MAIZE 9999999998620
+O80429_MAIZE 99999999874--
+cons 9999999987550
+
+
+
+
+
--- /dev/null
+>FER1_MAIZE/53-118 Ferredoxin-1, chloroplast precursor
+ATYNVKLITPEGEVELQVPDDVYILDQAEEDGIDLPYSCRAGSCSSCAGKVVSGSVDQSDQSYLDD
+>FER_CAPAA/1-66 Ferredoxin
+ASYKVKLITPDGPIEFDCPDDVYILDQAEEAGHDLPYSCRAGSCSSCAGKIAGGAVDQTDGNFLDD
+>FER_CAPAN/48-113 Ferredoxin, chloroplast precursor
+ASYKVKLITPDGPIEFDCPDNVYILDQAEEAGHDLPYSCRAGSCSSCAGKIAGGAVDQTDGNFLDD
+>FER1_SOLLC/48-113 Ferredoxin-1, chloroplast precursor
+ASYKVKLITPEGPIEFECPDDVYILDQAEEEGHDLPYSCRAGSCSSCAGKVTAGSVDQSDGNFLDE
+>Q93XJ9_SOLTU/48-113 Ferredoxin I precursor
+ASYKVKLITPDGPIEFECPDDVYILDQAEEEGHDLPYSCRAGSCSSCAGKVTAGTVDQSDGKFLDD
+>FER1_PEA/53-118 Ferredoxin-1, chloroplast precursor
+ASYKVKLVTPDGTQEFECPSDVYILDHAEEVGIDLPYSCRAGSCSSCAGKVVGGEVDQSDGSFLDD
+>Q7XA98_TRIPR/56-121 Ferredoxin I
+ATYKVKLITPEGPQEFDCPDDVYILDHAEEVGIELPYSCRAGSCSSCAGKVVNGNVNQEDGSFLDD
+>FER1_MESCR/52-117 Ferredoxin-1, chloroplast precursor
+AAYKVTLVTPEGKQELECPDDVYILDAAEEAGIDLPYSCRAGSCSSCAGKVTSGSVNQDDGSFLDD
+>FER1_SPIOL/51-116 Ferredoxin-1, chloroplast precursor
+AAYKVTLVTPTGNVEFQCPDDVYILDAAEEEGIDLPYSCRAGSCSSCAGKLKTGSLNQDDQSFLDD
+>FER3_RAPSA/1-66 Ferredoxin, leaf L-A
+ATYKVKFITPEGEQEVECDDDVYVLDAAEEAGIDLPYSCRAGSCSSCAGKVVSGSVDQSDQSFLDD
+>FER2_ARATH/53-118 Ferredoxin-1, chloroplast precursor
+ATYKVKFITPEGELEVECDDDVYVLDAAEEAGIDLPYSCRAGSCSSCAGKVVSGSVDQSDQSFLDD
+>FER_BRANA/1-66 Ferredoxin
+ATYKVKFITPEGEQEVECDDDVYVLDAAEEAGIDLPYSCRAGSCSSCAGKVVSGFVDQSDESFLDD
+>FER1_ARATH/53-118 Ferredoxin-2, chloroplast precursor
+ATYKVKFITPEGEQEVECEEDVYVLDAAEEAGLDLPYSCRAGSCSSCAGKVVSGSIDQSDQSFLDD
+>Q93Z60_ARATH/53-118 At1g10960/T19D16_12
+ATYKVKFITPEGEQEVECEEDVYVLDAAEEAGLDLPYSCRAGSCSSCAGKVVSGSIDQSDQSFLDD
+>O80429_MAIZE/45-110 Ferredoxin
+ATYNVKLITPEGEVELQVPDDVYILDFAEEEGIDLPFSCRAGSCSSCAGKVVSGSVDQSDQSFLND
--- /dev/null
+<!DOCTYPE html>
+<html>
+<head>
+<title>Embedded JalviewJS Example 1</title><meta charset="utf-8" />
+<script src="swingjs/swingjs2.js"></script>
+<script>
+if (!self.SwingJS)alert('swingjs2.js was not found. It needs to be in swingjs folder in the same directory as ' + document.location.href)
+Info = {
+ code: null,
+ main: "jalview.bin.JalviewJS2",
+// core: "NONE",
+ core:"_jalview",
+ readyFunction: null,
+ serverURL: 'https://chemapps.stolaf.edu/jmol/jsmol/php/jsmol.php',
+ j2sPath: 'swingjs/j2s',
+ console:'none',
+ allowjavascript: true,
+
+ //Jalview-specific:
+ // note that desktop-frame-div has been set to display:none
+ jalview_SCREEN_WIDTH: 0, // desktop width -- 0 to hide
+ jalview_SCREEN_HEIGHT: 0, // desktop height -- 0 to hide
+ jalview_SCREEN_X: 10,
+ jalview_SCREEN_Y: 10,
+ jalview_EMBEDDED: true
+
+}
+
+jvGet = function(what) {
+ switch(what) {
+ case "tree":
+ break;
+ case "pca":
+ break;
+ }
+
+}
+</script>
+</head>
+<body style="background-image: url(images/coolVeryLightBG.png);">
+<table style="width:1400px;border:2px solid lightblue;border-spacing:0;font-size:16pt;" padding="10" valign="top">
+<tr>
+<td style="font-size:24;font-weight:bold;background-color:lightblue" colspan=2><center>Demonstration of embedded JalviewJS components</center>
+</td>
+
+
+</tr><tr>
+
+
+<td valign=top style="padding:20px;background-color:lightgray">
+<div style="padding:20px;width:600px;height:400px;overflow-y:auto;background-color:white">
+This simple page illustrates how one can embed the JalviewJS desktop into a web page.
+The basic idea is that we have something interesting to say — some sort of scientific context — something we want to get
+across to our visitors with more than just text and images. The idea is to have a <b>dynamic</b> page that will involve <b>user interaction</b>.
+<br><br>
+We start with a Jalview desktop. You can't see it, because I have placed it in a <code>div</code> tag with style <i>width:0px;height:0px</i> just after the period that ends this sentence.
+<div id="jalview-desktop-div" style="width:0px;height:0px;"></div>
+<br>
+The idea is NOT to teach visitors how to use Jalview. The idea is to seamlessly integrate components of Jalview that can be used to enrich a discussion.
+Like JSmol in <a target="_blank" href="http://proteopedia.org/wiki/index.php/Main_Page"><img src=https://pbs.twimg.com/profile_images/818051034/proteopedia_135x200_small_logo_for_Twitter_400x400.png width=16 height=16/>Proteopedia</a>.
+For example, in the space to the right, after a few seconds, you will see an alignment frame. This alignment is for 15 genes that code for one of the domains in the ferredoxin family (<a href=https://pfam.xfam.org/family/NIR_SIR_ferr target=_blank>NIR_SIR_ferr (PF03460)</a>).
+<br><br>
+What you see initially is just the first few residues. Doesn't look like much of an alignment, does it? But <b>scroll to the right</b>.
+See the big block of red color? That's the <i>Ferredoxin fold</i>domain.
+
+</div>
+</td><td style="background-color:lightgray;padding:20px">
+<div id="jalview-alignment-div" style="padding:20px;position:relative;top:0px;left:0px;width:680px;height:400px">
+<br><br>
+The alignment frame will appear here momentarily. When it does, you can go ahead and manipulate the alignment with your mouse.
+</div>
+</td>
+
+
+</tr><tr>
+
+
+<td colspan=2 valign=top style="padding:0px 0px 0px 0px">
+<table style="background-color:lightgray"><tr><td style="padding:0px 0px 0px 20px">
+<b>Select a few alignments</b> by left-dragging across a few rows of the alignment to make a selection box.
+Then click one of the buttons below to see more information about your selected subset of the alignment.
+<ul>
+<li><button onclick='jvGet("tree")'>similarity tree</button></li>
+<li><button onclick='jvGet("pca")'>principal component analysis</button></li>
+</ul>
+
+
+
+
+</td><td style="padding:0px 0px 0px 0px">
+<table style="border-spacing:0"><tr><td style="background-color:lightgray;padding:10px 0px 10px 20px">
+<div id="jalview-tree-div" style="position:relative;top:0px;left:0px;width:500px;height:500px">
+<br><br><br><br>
+jalview-tree-div
+</div>
+</td><td style="background-color:lightgray;padding:10px 20px 10px 0px">
+<div id="jalview-pca-div" style="position:relative;top:0px;left:0px;width:500px;height:500px">
+<br><br><br><br>
+jalview-pca-div
+</div>
+</td></tr></table>
+
+</td></tr></table>
+
+
+</td></tr>
+
+<tr>
+
+<td valign=top style="padding:20px;height:650px" >
+
+<div id="jalview-structureviewer-div" style="position:relative;top:0px;left:0px;width:600px;height:600px">
+jalview-strucddtureviewer-div
+</div>
+</td>
+<td valign=top style="padding:20px;background-color:white" >
+One more thing. Let's take a look at the 3D structure of one these proteins. Ferredoxins are important, because they have
+iron-sulfur clusters that can accept and deliver electrons in metabolic processes. Let's see if we can find it.
+<br><center><a href="">add the 3D structure</a></center>
+</td></tr></table>
+
+
+<script>
+SwingJS.getApplet('testApplet', Info)
+getClassList = function(){J2S._saveFile('_j2sclasslist.txt', Clazz.ClassFilesLoaded.sort().join('\n'))}
+</script>
+
+
+<div style="display:none;position:absolute;left:900px;top:30px;width:600px;height:300px;">
+<div id="sysoutdiv" style="border:1px solid green;width:100%;height:95%;overflow:auto"></div>
+This is System.out. <a href="javascript:testApplet._clearConsole()">clear it</a> <br>Add ?j2snocore to URL to see full class list; ?j2sdebug to use uncompressed j2s/core files <br><a href="javascript:getClassList()">get _j2sClassList.txt</a>
+</div>
+</body>
+</html>
--- /dev/null
+var deployJava=function(){var l={core:["id","class","title","style"],i18n:["lang","dir"],events:["onclick","ondblclick","onmousedown","onmouseup","onmouseover","onmousemove","onmouseout","onkeypress","onkeydown","onkeyup"],applet:["codebase","code","name","archive","object","width","height","alt","align","hspace","vspace"],object:["classid","codebase","codetype","data","type","archive","declare","standby","height","width","usemap","name","tabindex","align","border","hspace","vspace"]};var b=l.object.concat(l.core,l.i18n,l.events);var m=l.applet.concat(l.core);function g(o){if(!d.debug){return}if(console.log){console.log(o)}else{alert(o)}}function k(p,o){if(p==null||p.length==0){return true}var r=p.charAt(p.length-1);if(r!="+"&&r!="*"&&(p.indexOf("_")!=-1&&r!="_")){p=p+"*";r="*"}p=p.substring(0,p.length-1);if(p.length>0){var q=p.charAt(p.length-1);if(q=="."||q=="_"){p=p.substring(0,p.length-1)}}if(r=="*"){return(o.indexOf(p)==0)}else{if(r=="+"){return p<=o}}return false}function e(){var o="//java.com/js/webstart.png";try{return document.location.protocol.indexOf("http")!=-1?o:"http:"+o}catch(p){return"http:"+o}}function n(p){var o="http://java.com/dt-redirect";if(p==null||p.length==0){return o}if(p.charAt(0)=="&"){p=p.substring(1,p.length)}return o+"?"+p}function j(q,p){var o=q.length;for(var r=0;r<o;r++){if(q[r]===p){return true}}return false}function c(o){return j(m,o.toLowerCase())}function i(o){return j(b,o.toLowerCase())}function a(o){if("MSIE"!=deployJava.browserName){return true}if(deployJava.compareVersionToPattern(deployJava.getPlugin().version,["10","0","0"],false,true)){return true}if(o==null){return false}return !k("1.6.0_33+",o)}var d={debug:null,version:"20120801",firefoxJavaVersion:null,myInterval:null,preInstallJREList:null,returnPage:null,brand:null,locale:null,installType:null,EAInstallEnabled:false,EarlyAccessURL:null,oldMimeType:"application/npruntime-scriptable-plugin;DeploymentToolkit",mimeType:"application/java-deployment-toolkit",launchButtonPNG:e(),browserName:null,browserName2:null,getJREs:function(){var t=new Array();if(this.isPluginInstalled()){var r=this.getPlugin();var o=r.jvms;for(var q=0;q<o.getLength();q++){t[q]=o.get(q).version}}else{var p=this.getBrowser();if(p=="MSIE"){if(this.testUsingActiveX("1.7.0")){t[0]="1.7.0"}else{if(this.testUsingActiveX("1.6.0")){t[0]="1.6.0"}else{if(this.testUsingActiveX("1.5.0")){t[0]="1.5.0"}else{if(this.testUsingActiveX("1.4.2")){t[0]="1.4.2"}else{if(this.testForMSVM()){t[0]="1.1"}}}}}}else{if(p=="Netscape Family"){this.getJPIVersionUsingMimeType();if(this.firefoxJavaVersion!=null){t[0]=this.firefoxJavaVersion}else{if(this.testUsingMimeTypes("1.7")){t[0]="1.7.0"}else{if(this.testUsingMimeTypes("1.6")){t[0]="1.6.0"}else{if(this.testUsingMimeTypes("1.5")){t[0]="1.5.0"}else{if(this.testUsingMimeTypes("1.4.2")){t[0]="1.4.2"}else{if(this.browserName2=="Safari"){if(this.testUsingPluginsArray("1.7.0")){t[0]="1.7.0"}else{if(this.testUsingPluginsArray("1.6")){t[0]="1.6.0"}else{if(this.testUsingPluginsArray("1.5")){t[0]="1.5.0"}else{if(this.testUsingPluginsArray("1.4.2")){t[0]="1.4.2"}}}}}}}}}}}}}if(this.debug){for(var q=0;q<t.length;++q){g("[getJREs()] We claim to have detected Java SE "+t[q])}}return t},installJRE:function(r,p){var o=false;if(this.isPluginInstalled()&&this.isAutoInstallEnabled(r)){var q=false;if(this.isCallbackSupported()){q=this.getPlugin().installJRE(r,p)}else{q=this.getPlugin().installJRE(r)}if(q){this.refresh();if(this.returnPage!=null){document.location=this.returnPage}}return q}else{return this.installLatestJRE()}},isAutoInstallEnabled:function(o){if(!this.isPluginInstalled()){return false}if(typeof o=="undefined"){o=null}return a(o)},isCallbackSupported:function(){return this.isPluginInstalled()&&this.compareVersionToPattern(this.getPlugin().version,["10","2","0"],false,true)},installLatestJRE:function(q){if(this.isPluginInstalled()&&this.isAutoInstallEnabled()){var r=false;if(this.isCallbackSupported()){r=this.getPlugin().installLatestJRE(q)}else{r=this.getPlugin().installLatestJRE()}if(r){this.refresh();if(this.returnPage!=null){document.location=this.returnPage}}return r}else{var p=this.getBrowser();var o=navigator.platform.toLowerCase();if((this.EAInstallEnabled=="true")&&(o.indexOf("win")!=-1)&&(this.EarlyAccessURL!=null)){this.preInstallJREList=this.getJREs();if(this.returnPage!=null){this.myInterval=setInterval("deployJava.poll()",3000)}location.href=this.EarlyAccessURL;return false}else{if(p=="MSIE"){return this.IEInstall()}else{if((p=="Netscape Family")&&(o.indexOf("win32")!=-1)){return this.FFInstall()}else{location.href=n(((this.returnPage!=null)?("&returnPage="+this.returnPage):"")+((this.locale!=null)?("&locale="+this.locale):"")+((this.brand!=null)?("&brand="+this.brand):""))}}return false}}},runApplet:function(p,u,r){if(r=="undefined"||r==null){r="1.1"}var t="^(\\d+)(?:\\.(\\d+)(?:\\.(\\d+)(?:_(\\d+))?)?)?$";var o=r.match(t);if(this.returnPage==null){this.returnPage=document.location}if(o!=null){var q=this.getBrowser();if(q!="?"){if(this.versionCheck(r+"+")){this.writeAppletTag(p,u)}else{if(this.installJRE(r+"+")){this.refresh();location.href=document.location;this.writeAppletTag(p,u)}}}else{this.writeAppletTag(p,u)}}else{g("[runApplet()] Invalid minimumVersion argument to runApplet():"+r)}},writeAppletTag:function(r,w){var o="<"+"applet ";var q="";var t="<"+"/"+"applet"+">";var x=true;if(null==w||typeof w!="object"){w=new Object()}for(var p in r){if(!c(p)){w[p]=r[p]}else{o+=(" "+p+'="'+r[p]+'"');if(p=="code"){x=false}}}var v=false;for(var u in w){if(u=="codebase_lookup"){v=true}if(u=="object"||u=="java_object"||u=="java_code"){x=false}q+='<param name="'+u+'" value="'+w[u]+'"/>'}if(!v){q+='<param name="codebase_lookup" value="false"/>'}if(x){o+=(' code="dummy"')}o+=">";document.write(o+"\n"+q+"\n"+t)},versionCheck:function(p){var v=0;var x="^(\\d+)(?:\\.(\\d+)(?:\\.(\\d+)(?:_(\\d+))?)?)?(\\*|\\+)?$";var y=p.match(x);if(y!=null){var r=false;var u=false;var q=new Array();for(var t=1;t<y.length;++t){if((typeof y[t]=="string")&&(y[t]!="")){q[v]=y[t];v++}}if(q[q.length-1]=="+"){u=true;r=false;q.length--}else{if(q[q.length-1]=="*"){u=false;r=true;q.length--}else{if(q.length<4){u=false;r=true}}}var w=this.getJREs();for(var t=0;t<w.length;++t){if(this.compareVersionToPattern(w[t],q,r,u)){return true}}return false}else{var o="Invalid versionPattern passed to versionCheck: "+p;g("[versionCheck()] "+o);alert(o);return false}},isWebStartInstalled:function(r){var q=this.getBrowser();if(q=="?"){return true}if(r=="undefined"||r==null){r="1.4.2"}var p=false;var t="^(\\d+)(?:\\.(\\d+)(?:\\.(\\d+)(?:_(\\d+))?)?)?$";var o=r.match(t);if(o!=null){p=this.versionCheck(r+"+")}else{g("[isWebStartInstaller()] Invalid minimumVersion argument to isWebStartInstalled(): "+r);p=this.versionCheck("1.4.2+")}return p},getJPIVersionUsingMimeType:function(){for(var p=0;p<navigator.mimeTypes.length;++p){var q=navigator.mimeTypes[p].type;var o=q.match(/^application\/x-java-applet;jpi-version=(.*)$/);if(o!=null){this.firefoxJavaVersion=o[1];if("Opera"!=this.browserName2){break}}}},launchWebStartApplication:function(r){var o=navigator.userAgent.toLowerCase();this.getJPIVersionUsingMimeType();if(this.isWebStartInstalled("1.7.0")==false){if((this.installJRE("1.7.0+")==false)||((this.isWebStartInstalled("1.7.0")==false))){return false}}var u=null;if(document.documentURI){u=document.documentURI}if(u==null){u=document.URL}var p=this.getBrowser();var q;if(p=="MSIE"){q="<"+'object classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" '+'width="0" height="0">'+"<"+'PARAM name="launchjnlp" value="'+r+'"'+">"+"<"+'PARAM name="docbase" value="'+u+'"'+">"+"<"+"/"+"object"+">"}else{if(p=="Netscape Family"){q="<"+'embed type="application/x-java-applet;jpi-version='+this.firefoxJavaVersion+'" '+'width="0" height="0" '+'launchjnlp="'+r+'"'+'docbase="'+u+'"'+" />"}}if(document.body=="undefined"||document.body==null){document.write(q);document.location=u}else{var t=document.createElement("div");t.id="div1";t.style.position="relative";t.style.left="-10000px";t.style.margin="0px auto";t.className="dynamicDiv";t.innerHTML=q;document.body.appendChild(t)}},createWebStartLaunchButtonEx:function(q,p){if(this.returnPage==null){this.returnPage=q}var o="javascript:deployJava.launchWebStartApplication('"+q+"');";document.write("<"+'a href="'+o+"\" onMouseOver=\"window.status=''; "+'return true;"><'+"img "+'src="'+this.launchButtonPNG+'" '+'border="0" /><'+"/"+"a"+">")},createWebStartLaunchButton:function(q,p){if(this.returnPage==null){this.returnPage=q}var o="javascript:"+"if (!deployJava.isWebStartInstalled(""+p+"")) {"+"if (deployJava.installLatestJRE()) {"+"if (deployJava.launch(""+q+"")) {}"+"}"+"} else {"+"if (deployJava.launch(""+q+"")) {}"+"}";document.write("<"+'a href="'+o+"\" onMouseOver=\"window.status=''; "+'return true;"><'+"img "+'src="'+this.launchButtonPNG+'" '+'border="0" /><'+"/"+"a"+">")},launch:function(o){document.location=o;return true},isPluginInstalled:function(){var o=this.getPlugin();if(o&&o.jvms){return true}else{return false}},isAutoUpdateEnabled:function(){if(this.isPluginInstalled()){return this.getPlugin().isAutoUpdateEnabled()}return false},setAutoUpdateEnabled:function(){if(this.isPluginInstalled()){return this.getPlugin().setAutoUpdateEnabled()}return false},setInstallerType:function(o){this.installType=o;if(this.isPluginInstalled()){return this.getPlugin().setInstallerType(o)}return false},setAdditionalPackages:function(o){if(this.isPluginInstalled()){return this.getPlugin().setAdditionalPackages(o)}return false},setEarlyAccess:function(o){this.EAInstallEnabled=o},isPlugin2:function(){if(this.isPluginInstalled()){if(this.versionCheck("1.6.0_10+")){try{return this.getPlugin().isPlugin2()}catch(o){}}}return false},allowPlugin:function(){this.getBrowser();var o=("Safari"!=this.browserName2&&"Opera"!=this.browserName2);return o},getPlugin:function(){this.refresh();var o=null;if(this.allowPlugin()){o=document.getElementById("deployJavaPlugin")}return o},compareVersionToPattern:function(v,p,r,t){if(v==undefined||p==undefined){return false}var w="^(\\d+)(?:\\.(\\d+)(?:\\.(\\d+)(?:_(\\d+))?)?)?$";var x=v.match(w);if(x!=null){var u=0;var y=new Array();for(var q=1;q<x.length;++q){if((typeof x[q]=="string")&&(x[q]!="")){y[u]=x[q];u++}}var o=Math.min(y.length,p.length);if(t){for(var q=0;q<o;++q){if(y[q]<p[q]){return false}else{if(y[q]>p[q]){return true}}}return true}else{for(var q=0;q<o;++q){if(y[q]!=p[q]){return false}}if(r){return true}else{return(y.length==p.length)}}}else{return false}},getBrowser:function(){if(this.browserName==null){var o=navigator.userAgent.toLowerCase();g("[getBrowser()] navigator.userAgent.toLowerCase() -> "+o);if((o.indexOf("msie")!=-1)&&(o.indexOf("opera")==-1)){this.browserName="MSIE";this.browserName2="MSIE"}else{if(o.indexOf("trident")!=-1||o.indexOf("Trident")!=-1){this.browserName="MSIE";this.browserName2="MSIE"}else{if(o.indexOf("iphone")!=-1){this.browserName="Netscape Family";this.browserName2="iPhone"}else{if((o.indexOf("firefox")!=-1)&&(o.indexOf("opera")==-1)){this.browserName="Netscape Family";this.browserName2="Firefox"}else{if(o.indexOf("chrome")!=-1){this.browserName="Netscape Family";this.browserName2="Chrome"}else{if(o.indexOf("safari")!=-1){this.browserName="Netscape Family";this.browserName2="Safari"}else{if((o.indexOf("mozilla")!=-1)&&(o.indexOf("opera")==-1)){this.browserName="Netscape Family";this.browserName2="Other"}else{if(o.indexOf("opera")!=-1){this.browserName="Netscape Family";this.browserName2="Opera"}else{this.browserName="?";this.browserName2="unknown"}}}}}}}}g("[getBrowser()] Detected browser name:"+this.browserName+", "+this.browserName2)}return this.browserName},testUsingActiveX:function(o){var q="JavaWebStart.isInstalled."+o+".0";if(typeof ActiveXObject=="undefined"||!ActiveXObject){g("[testUsingActiveX()] Browser claims to be IE, but no ActiveXObject object?");return false}try{return(new ActiveXObject(q)!=null)}catch(p){return false}},testForMSVM:function(){var p="{08B0E5C0-4FCB-11CF-AAA5-00401C608500}";if(typeof oClientCaps!="undefined"){var o=oClientCaps.getComponentVersion(p,"ComponentID");if((o=="")||(o=="5,0,5000,0")){return false}else{return true}}else{return false}},testUsingMimeTypes:function(p){if(!navigator.mimeTypes){g("[testUsingMimeTypes()] Browser claims to be Netscape family, but no mimeTypes[] array?");return false}for(var q=0;q<navigator.mimeTypes.length;++q){s=navigator.mimeTypes[q].type;var o=s.match(/^application\/x-java-applet\x3Bversion=(1\.8|1\.7|1\.6|1\.5|1\.4\.2)$/);if(o!=null){if(this.compareVersions(o[1],p)){return true}}}return false},testUsingPluginsArray:function(p){if((!navigator.plugins)||(!navigator.plugins.length)){return false}var o=navigator.platform.toLowerCase();for(var q=0;q<navigator.plugins.length;++q){s=navigator.plugins[q].description;if(s.search(/^Java Switchable Plug-in (Cocoa)/)!=-1){if(this.compareVersions("1.5.0",p)){return true}}else{if(s.search(/^Java/)!=-1){if(o.indexOf("win")!=-1){if(this.compareVersions("1.5.0",p)||this.compareVersions("1.6.0",p)){return true}}}}}if(this.compareVersions("1.5.0",p)){return true}return false},IEInstall:function(){location.href=n(((this.returnPage!=null)?("&returnPage="+this.returnPage):"")+((this.locale!=null)?("&locale="+this.locale):"")+((this.brand!=null)?("&brand="+this.brand):""));return false},done:function(p,o){},FFInstall:function(){location.href=n(((this.returnPage!=null)?("&returnPage="+this.returnPage):"")+((this.locale!=null)?("&locale="+this.locale):"")+((this.brand!=null)?("&brand="+this.brand):"")+((this.installType!=null)?("&type="+this.installType):""));return false},compareVersions:function(r,t){var p=r.split(".");var o=t.split(".");for(var q=0;q<p.length;++q){p[q]=Number(p[q])}for(var q=0;q<o.length;++q){o[q]=Number(o[q])}if(p.length==2){p[2]=0}if(p[0]>o[0]){return true}if(p[0]<o[0]){return false}if(p[1]>o[1]){return true}if(p[1]<o[1]){return false}if(p[2]>o[2]){return true}if(p[2]<o[2]){return false}return true},enableAlerts:function(){this.browserName=null;this.debug=true},poll:function(){this.refresh();var o=this.getJREs();if((this.preInstallJREList.length==0)&&(o.length!=0)){clearInterval(this.myInterval);if(this.returnPage!=null){location.href=this.returnPage}}if((this.preInstallJREList.length!=0)&&(o.length!=0)&&(this.preInstallJREList[0]!=o[0])){clearInterval(this.myInterval);if(this.returnPage!=null){location.href=this.returnPage}}},writePluginTag:function(){var o=this.getBrowser();if(o=="MSIE"){document.write("<"+'object classid="clsid:CAFEEFAC-DEC7-0000-0001-ABCDEFFEDCBA" '+'id="deployJavaPlugin" width="0" height="0">'+"<"+"/"+"object"+">")}else{if(o=="Netscape Family"&&this.allowPlugin()){this.writeEmbedTag()}}},refresh:function(){navigator.plugins.refresh(false);var o=this.getBrowser();if(o=="Netscape Family"&&this.allowPlugin()){var p=document.getElementById("deployJavaPlugin");if(p==null){this.writeEmbedTag()}}},writeEmbedTag:function(){var o=false;if(navigator.mimeTypes!=null){for(var p=0;p<navigator.mimeTypes.length;p++){if(navigator.mimeTypes[p].type==this.mimeType){if(navigator.mimeTypes[p].enabledPlugin){document.write("<"+'embed id="deployJavaPlugin" type="'+this.mimeType+'" hidden="true" />');o=true}}}if(!o){for(var p=0;p<navigator.mimeTypes.length;p++){if(navigator.mimeTypes[p].type==this.oldMimeType){if(navigator.mimeTypes[p].enabledPlugin){document.write("<"+'embed id="deployJavaPlugin" type="'+this.oldMimeType+'" hidden="true" />')}}}}}}};d.writePluginTag();if(d.locale==null){var h=null;if(h==null){try{h=navigator.userLanguage}catch(f){}}if(h==null){try{h=navigator.systemLanguage}catch(f){}}if(h==null){try{h=navigator.language}catch(f){}}if(h!=null){h.replace("-","_");d.locale=h}}return d}();
\ No newline at end of file
--- /dev/null
+/*
+ * Facebox (for jQuery)
+ * version: 1.2 (05/05/2008)
+ * @requires jQuery v1.2 or later
+ *
+ * Examples at http://famspam.com/facebox/
+ *
+ * Licensed under the MIT:
+ * http://www.opensource.org/licenses/mit-license.php
+ *
+ * Copyright 2007, 2008 Chris Wanstrath [ chris@ozmm.org ]
+ *
+ * Usage:
+ *
+ * jQuery(document).ready(function() {
+ * jQuery('a[rel*=facebox]').facebox()
+ * })
+ *
+ * <a href="#terms" rel="facebox">Terms</a>
+ * Loads the #terms div in the box
+ *
+ * <a href="terms.html" rel="facebox">Terms</a>
+ * Loads the terms.html page in the box
+ *
+ * <a href="terms.png" rel="facebox">Terms</a>
+ * Loads the terms.png image in the box
+ *
+ *
+ * You can also use it programmatically:
+ *
+ * jQuery.facebox('some html')
+ * jQuery.facebox('some html', 'my-groovy-style')
+ *
+ * The above will open a facebox with "some html" as the content.
+ *
+ * jQuery.facebox(function($) {
+ * $.get('blah.html', function(data) { $.facebox(data) })
+ * })
+ *
+ * The above will show a loading screen before the passed function is called,
+ * allowing for a better ajaxy experience.
+ *
+ * The facebox function can also display an ajax page, an image, or the contents of a div:
+ *
+ * jQuery.facebox({ ajax: 'remote.html' })
+ * jQuery.facebox({ ajax: 'remote.html' }, 'my-groovy-style')
+ * jQuery.facebox({ image: 'stairs.jpg' })
+ * jQuery.facebox({ image: 'stairs.jpg' }, 'my-groovy-style')
+ * jQuery.facebox({ div: '#box' })
+ * jQuery.facebox({ div: '#box' }, 'my-groovy-style')
+ *
+ * Want to close the facebox? Trigger the 'close.facebox' document event:
+ *
+ * jQuery(document).trigger('close.facebox')
+ *
+ * Facebox also has a bunch of other hooks:
+ *
+ * loading.facebox
+ * beforeReveal.facebox
+ * reveal.facebox (aliased as 'afterReveal.facebox')
+ * init.facebox
+ * afterClose.facebox
+ *
+ * Simply bind a function to any of these hooks:
+ *
+ * $(document).bind('reveal.facebox', function() { ...stuff to do after the facebox and contents are revealed... })
+ *
+ */
+(function($) {
+ $.facebox = function(data, klass) {
+ $.facebox.loading()
+
+ if (data.ajax) fillFaceboxFromAjax(data.ajax, klass)
+ else if (data.image) fillFaceboxFromImage(data.image, klass)
+ else if (data.div) fillFaceboxFromHref(data.div, klass)
+ else if ($.isFunction(data)) data.call($)
+ else $.facebox.reveal(data, klass)
+ }
+
+ /*
+ * Public, $.facebox methods
+ */
+
+ $.extend($.facebox, {
+ settings: {
+ opacity : 0.2,
+ overlay : true,
+ loadingImage : 'https://raw.githubusercontent.com/jalview/biojson/gh-pages/images/loading.gif',
+ closeImage : 'https://raw.githubusercontent.com/jalview/biojson/gh-pages/images/cancel.png',
+ imageTypes : [ 'png', 'jpg', 'jpeg', 'gif' ],
+ faceboxHtml : '\
+ <div id="facebox" style="display:none;"> \
+ <div class="popup"> \
+ <div class="content"> \
+ </div> \
+ <a href="#" class="close"><img src="https://raw.githubusercontent.com/jalview/biojson/gh-pages/images/cancel.png" title="close" class="close_image" /></a> \
+ </div> \
+ </div>'
+ },
+
+ loading: function() {
+ init()
+ if ($('#facebox .loading').length == 1) return true
+ showOverlay()
+
+ $('#facebox .content').empty()
+ $('#facebox .body').children().hide().end().
+ append('<div class="loading"><img src="'+$.facebox.settings.loadingImage+'"/></div>')
+
+ $('#facebox').css({
+ top: getPageScroll()[1] + (getPageHeight() / 10),
+ left: $(window).width() / 2 - 205
+ }).show()
+
+ $(document).bind('keydown.facebox', function(e) {
+ if (e.keyCode == 27) $.facebox.close()
+ return true
+ })
+ $(document).trigger('loading.facebox')
+ },
+
+ reveal: function(data, klass) {
+ $(document).trigger('beforeReveal.facebox')
+ if (klass) $('#facebox .content').addClass(klass)
+ $('#facebox .content').append('<pre><code>'+JSON.stringify(JSON.parse(data),null,4)+'</pre></code>')
+ $('#facebox .loading').remove()
+ $('#facebox .body').children().fadeIn('normal')
+ $('#facebox').css('left', $(window).width() / 2 - ($('#facebox .popup').width() / 2))
+ $(document).trigger('reveal.facebox').trigger('afterReveal.facebox')
+ },
+
+ close: function() {
+ $(document).trigger('close.facebox')
+ return false
+ }
+ })
+
+ /*
+ * Public, $.fn methods
+ */
+
+ $.fn.facebox = function(settings) {
+ if ($(this).length == 0) return
+
+ init(settings)
+
+ function clickHandler() {
+ $.facebox.loading(true)
+
+ // support for rel="facebox.inline_popup" syntax, to add a class
+ // also supports deprecated "facebox[.inline_popup]" syntax
+ var klass = this.rel.match(/facebox\[?\.(\w+)\]?/)
+ if (klass) klass = klass[1]
+
+ fillFaceboxFromHref(this.href, klass)
+ return false
+ }
+
+ return this.bind('click.facebox', clickHandler)
+ }
+
+ /*
+ * Private methods
+ */
+
+ // called one time to setup facebox on this page
+ function init(settings) {
+ if ($.facebox.settings.inited) return true
+ else $.facebox.settings.inited = true
+
+ $(document).trigger('init.facebox')
+ makeCompatible()
+
+ var imageTypes = $.facebox.settings.imageTypes.join('|')
+ $.facebox.settings.imageTypesRegexp = new RegExp('\.(' + imageTypes + ')$', 'i')
+
+ if (settings) $.extend($.facebox.settings, settings)
+ $('body').append($.facebox.settings.faceboxHtml)
+
+ var preload = [ new Image(), new Image() ]
+ preload[0].src = $.facebox.settings.closeImage
+ preload[1].src = $.facebox.settings.loadingImage
+
+ $('#facebox').find('.b:first, .bl').each(function() {
+ preload.push(new Image())
+ preload.slice(-1).src = $(this).css('background-image').replace(/url\((.+)\)/, '$1')
+ })
+
+ $('#facebox .close').click($.facebox.close)
+ $('#facebox .close_image').attr('src', $.facebox.settings.closeImage)
+ }
+
+ // getPageScroll() by quirksmode.com
+ function getPageScroll() {
+ var xScroll, yScroll;
+ if (self.pageYOffset) {
+ yScroll = self.pageYOffset;
+ xScroll = self.pageXOffset;
+ } else if (document.documentElement && document.documentElement.scrollTop) { // Explorer 6 Strict
+ yScroll = document.documentElement.scrollTop;
+ xScroll = document.documentElement.scrollLeft;
+ } else if (document.body) {// all other Explorers
+ yScroll = document.body.scrollTop;
+ xScroll = document.body.scrollLeft;
+ }
+ return new Array(xScroll,yScroll)
+ }
+
+ // Adapted from getPageSize() by quirksmode.com
+ function getPageHeight() {
+ var windowHeight
+ if (self.innerHeight) { // all except Explorer
+ windowHeight = self.innerHeight;
+ } else if (document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict Mode
+ windowHeight = document.documentElement.clientHeight;
+ } else if (document.body) { // other Explorers
+ windowHeight = document.body.clientHeight;
+ }
+ return windowHeight
+ }
+
+ // Backwards compatibility
+ function makeCompatible() {
+ var $s = $.facebox.settings
+
+ $s.loadingImage = $s.loading_image || $s.loadingImage
+ $s.closeImage = $s.close_image || $s.closeImage
+ $s.imageTypes = $s.image_types || $s.imageTypes
+ $s.faceboxHtml = $s.facebox_html || $s.faceboxHtml
+ }
+
+ // Figures out what you want to display and displays it
+ // formats are:
+ // div: #id
+ // image: blah.extension
+ // ajax: anything else
+ function fillFaceboxFromHref(href, klass) {
+ // div
+ if (href.match(/#/)) {
+ var url = window.location.href.split('#')[0]
+ var target = href.replace(url,'')
+ if (target == '#') return
+ $.facebox.reveal($(target).html(), klass)
+
+ // image
+ } else if (href.match($.facebox.settings.imageTypesRegexp)) {
+ fillFaceboxFromImage(href, klass)
+ // ajax
+ } else {
+ fillFaceboxFromAjax(href, klass)
+ }
+ }
+
+ function fillFaceboxFromImage(href, klass) {
+ var image = new Image()
+ image.onload = function() {
+ $.facebox.reveal('<div class="image"><img src="' + image.src + '" /></div>', klass)
+ }
+ image.src = href
+ }
+
+ function fillFaceboxFromAjax(href, klass) {
+ $.get(href, function(data) { $.facebox.reveal(data, klass) })
+ }
+
+ function skipOverlay() {
+ return $.facebox.settings.overlay == false || $.facebox.settings.opacity === null
+ }
+
+ function showOverlay() {
+ if (skipOverlay()) return
+
+ if ($('#facebox_overlay').length == 0)
+ $("body").append('<div id="facebox_overlay" class="facebox_hide"></div>')
+
+ $('#facebox_overlay').hide().addClass("facebox_overlayBG")
+ .css('opacity', $.facebox.settings.opacity)
+ .click(function() { $(document).trigger('close.facebox') })
+ .fadeIn(200)
+ return false
+ }
+
+ function hideOverlay() {
+ if (skipOverlay()) return
+
+ $('#facebox_overlay').fadeOut(200, function(){
+ $("#facebox_overlay").removeClass("facebox_overlayBG")
+ $("#facebox_overlay").addClass("facebox_hide")
+ $("#facebox_overlay").remove()
+ })
+
+ return false
+ }
+
+ /*
+ * Bindings
+ */
+
+ $(document).bind('close.facebox', function() {
+ $(document).unbind('keydown.facebox')
+ $('#facebox').fadeOut(function() {
+ $('#facebox .content').removeClass().addClass('content')
+ $('#facebox .loading').remove()
+ $(document).trigger('afterClose.facebox')
+ })
+ hideOverlay()
+ })
+
+})(jQuery);
--- /dev/null
+/**
+ * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
+ * Copyright (C) $$Year-Rel$$ The Jalview Authors
+ *
+ * This file is part of Jalview.
+ *
+ * Jalview is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
+ *
+ * Jalview is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with Jalview. If not, see <http://www.gnu.org/licenses/>.
+ * The Jalview Authors are detailed in the 'AUTHORS' file.
+ */
+
+
+
+
+
+
+
+
+
+// default console to report messages
+var _console = document.getElementById("stdout");
+var _jvapps = new Array();
+// jvjmols is a list associating a jmol id to { modelstofiles }
+var _jvjmols = new Hashtable();
+// array of model names used to lookup index in Jmol
+var _modeltofiles = new Array();
+// counter for jmol structures
+var mnum = 1;
+
+function getDocumentBase() {
+ var dburi = document.baseURI;
+ // IE does not support document.baseURI
+ // logic from patch to TYPO3:
+ // http://forge.typo3.org/projects/typo3cms-core/repository/revisions/f61358afad28adb6dcaeb270ba480e998dfb0b79/diff/typo3/sysext/rtehtmlarea/htmlarea/htmlarea.js
+ if (!dburi) {
+ var baseTags = document.getElementsByTagName('base');
+ if (baseTags.length > 0) {
+ dburi = baseTags[0].href;
+ } else {
+ dburi = document.URL;
+ }
+ }
+ return dburi.substring(0, dburi.lastIndexOf("/") + 1);
+}
+function setConsole(console) {
+ _console = console;
+}
+
+function getDestinationFrms(source, frames) {
+ var frms = new Array();
+ var frid = "";
+ for (frm in frames) {
+ try {
+ frid = (source!=null) && (("" + source.getSequenceSetId()) == ("" + frames[frm].currentAlignFrame
+ .getSequenceSetId()));
+ } catch (q) {
+ };
+
+ if (!frames[frm].equals(source) && !frid
+ && !frames[frm].currentAlignFrame.equals(source)) {
+ frms[frms.length] = frames[frm];
+ }
+ }
+ return frms;
+}
+
+function mouseover(list1, list2, list3, list4) {
+ // list1 = new Object(list1);
+ var list = new Array(("" + list1), ("" + list2), ("" + list3), ("" + list4));
+ var msg = "Mouse over :\n" + "AlignFrame obj: " + list1 + " Seq : "
+ + list[1] + "\nPos: " + list[2] + "(" + list[3] + ")\n";
+
+ var flist = getDestinationFrms(list1, _jvapps);
+ if (_console) {
+ _console.value = msg + "\n";
+ }
+
+ for (follower in flist) {
+ if (_console) {
+ _console.value += "Sending to " + flist[follower] + "\n";
+ }
+ flist[follower].highlight(list[1], list[2], "true");
+ }
+ return true;
+}
+
+function sellist(list1, list2, list3, list4) {
+ // list1 = new Object(list1);
+ var list = new Array(("" + list1), ("" + list2), ("" + list3), ("" + list4));
+ var msg = "Selection:\n" + "AlignFrame obj: " + list[0] + " id : "
+ + list[1] + "\nSeqs " + list[2] + "\nColumns " + list[3] + "\n";
+ var flist = getDestinationFrms(list1, _jvapps);
+ if (_console) {
+ _console.value = msg + "\n";
+ }
+
+ for (follower in flist) {
+ if (_console) {
+ _console.value += "Sending to " + flist[follower] + "\n";
+ }
+ flist[follower].selectIn(flist[follower].getDefaultTargetFrame(),
+ list[2], list[3])
+ }
+ return true;
+}
+
+function viewlist(list1, list2, list3, list4) {
+ // list1 = new Object(list1);
+ var list = new Array(("" + list1), ("" + list2), ("" + list3), ("" + list4));
+ var msg = "Viewport extent change::\n" + "AlignFrame obj: " + list[0]
+ + " id : " + list[1] + "\nRow from " + list[2] + " and to "
+ + list[3] + "\nVisible columns: " + list[4] + "\n";
+ var flist = getDestinationFrms(list1, _jvapps);
+ if (_console) {
+ _console.value = msg + "\n";
+ }
+
+ for (follower in flist) {
+ if (_console) {
+ _console.value += "Sending to " + flist[follower] + "\n";
+ }
+ flist[follower].scrollToViewIn(flist[follower].getDefaultTargetFrame(),
+ list[2], "-1");
+ }
+ return true;
+}
+
+// register a jalview applet and add some handlers to it
+// jmolView is a reference to a jmol applet that is displaying the PDB files listed (in order) in the modeltofiles Array
+function linkJvJmol(applet, jmolView, modeltofiles) {
+ var i = _jvapps.length;
+ while (i--) {
+ if (_jvapps[i].equals(applet)) {
+ throw ("Ignoring additional linkJvJmol call for "
+ + applet.getName() + ".");
+ }
+ }
+ _jvapps[_jvapps.length] = applet;
+ applet.setMouseoverListener("mouseover");
+ applet.setSelectionListener("sellist");
+ // viewListener not fully implemented in 2.7
+ // try { applet.setViewListener("viewlist"); } catch (err) {};
+ if (jmolView)
+ {
+ var sep = applet.getSeparator();
+ var oldjm=jmolView;
+ // recover full id of Jmol applet
+ jmolView=jmolFindTarget(jmolView)._id; // Jmol 14.2.14
+ var jmbinding=_jvjmols.get(jmolView);
+ if (!jmbinding)
+ {
+ jmbinding=new Object();
+ jmbinding._modelstofiles=new Array();
+ jmbinding._fullmpath=new Array();
+ jmbinding._filetonum=new Hashtable();
+ jmbinding._jmol=jmolView;
+ jmbinding._jmhandle=oldjm;
+ _jvjmols.put(jmolView,jmbinding);
+ }
+
+ jmbinding._modelstofiles=jmbinding._modelstofiles.concat(jmbinding._modelstofiles,modeltofiles);
+ jmbinding._jmol=jmolView;
+ // now update structureListener list
+ mtf="";
+ var dbase = getDocumentBase();
+ for (m in jmbinding._modelstofiles)
+ { if (m>0) { mtf+=sep; }
+ mtf+=jmbinding._modelstofiles[m];
+ if (jmbinding._modelstofiles[m].indexOf("//")==-1)
+ { jmbinding._fullmpath[m] = dbase+((jmbinding._modelstofiles[m].indexOf("/")==0) ? jmbinding._modelstofiles[m].substring(1) : jmbinding._modelstofiles[m]); }
+ jmbinding._filetonum.put(jmbinding._modelstofiles[m], m+1);
+ jmbinding._filetonum.put(jmbinding._fullmpath[m], m+1);
+
+ }
+ applet.setStructureListener("_structure", mtf);
+ }
+}
+
+/*function _addJmolModel(jmolid, modelname) {
+ modelname=""+modelname;
+ var jminf = _jvjmols[jmolid];
+ if (!jminf) {
+ jminf = new Object();
+ jminf._modelstofiles = new Array(); //new Hashtable();
+ jminf._jmol = jmolid;
+ jminf._modellist=new Array();
+ _jvjmols[jmolid] = jminf;
+ }
+ var obj = new Object();
+ jminf._modeltofiles[modelname] = obj; // .put(modelname, obj);
+ obj.id = modelname;
+ obj.mnum = jminf._modeltofiles.length;
+ jminf._modellist+=modelname;
+}*/
+
+
+
+// jmol Jalview Methods
+
+function _structure(list1, list2, list3, list4) {
+ var follower;
+ // if (_console) { if (!_console.value) { _console.value="";} }
+ if (list1 == "mouseover") {
+ var list = new Array(("" + list1), ("" + list2), ("" + list3),
+ ("" + list4));
+ // 1 is pdb file, 2 is residue number, 3 is chain
+ // list1 = new Object(list1);
+ var base = list[1].indexOf(getDocumentBase()); // .indexOf(_path);
+ if (base==0) { base = getDocumentBase(); }
+ var sid = list[1]; // .substring(base);
+ base = list[1].substring(0, base);
+ if (_console) {
+ _console.value += "Model is " + list[1] + ", Structure id is : "
+ + sid + "\n";
+ }
+ ;
+ var siddat;
+ for ( var jmolappi in _jvjmols.values()) {
+ var jmolapp=_jvjmols.values()[jmolappi];
+ var msg = "";
+ if (siddat = jmolapp._filetonum.get(sid)) {
+ // we don't putin chain number because there isn't one ?
+ // skip select 0 bit
+ var ch = ""+list[3];
+ if ((""+list[2]).trim().length==1)
+ {
+ ch+=":"+list[2];
+ }
+ msg = "select (" + ch + " /" + siddat + ") ;";
+ }
+ if (msg) {
+ if (_console) {
+ _console.value += "Sending '" + msg + "' to jmol." + "\n";
+ }
+ }
+ jmolScriptWait(msg, "" + jmolapp._jmhandle);
+ // only do highlight for one jmol ?
+ // return 1;
+ }
+ }
+ if (list1 == "colourstruct") {
+ if (_console) {
+ _console.value += 'colourStruct("' + list1 + '","' + list2
+ + '") [' + list4 + ']' + "\n";
+ }
+ setTimeout('colourStruct("'+list4+'","' + list1 + '","' + list2 + '")', 1);
+ return 1;
+ }
+ return 1;
+}
+// last colour message
+var _lastMsg = "";
+// indicator - if _colourStruct==0 then no colouring is going on
+var _colourStruct = 0;
+
+function colourStruct(involves, msg, handle) {
+ if (_colourStruct == 0) {
+ _colourStruct = 1;
+ for (ap in _jvapps) {
+ var _msg = "";
+ do {
+ if (_msg.match(/\S/)) {
+ _lastMsg += _msg;
+ }
+ _msg = "" + _jvapps[ap].getJsMessage(msg, handle);
+ } while (_msg.match(/\S/));
+ }
+ // locate the jmol that should get the message
+ for (var jmol in _jvjmols.values())
+ {
+ var jml=_jvjmols.values()[jmol];
+ if (jml._filetonum.get(involves))
+ {
+ colourStructs(jml._jmhandle);
+ }
+ }
+ _colourStruct = 0;
+ } else {
+ // setTimeout('colourStruct("'+msg+'","'+handle+'")',3);
+ }
+}
+
+function colourStructs(jmolapp) {
+ dbg(0, "Colouring the structures\n");
+ jmolScriptWait("set selectionhalos false;" + _lastMsg
+ + "; select 0; set selectionhalos true;", jmolapp);
+ _lastMsg = "";
+}
+var _jmolhovermsg="";
+function _jmolhover(jmid, atomlabel, atomidx) {
+ var msg=""+jmid+" "+atomlabel+" "+atomidx;
+ if (_jmolhovermsg==msg)
+ {
+ return;
+ }
+ _jmolhovermsg=msg;
+ modeltofiles = _jvjmols.get(jmid)._modelstofiles;
+ // atomlabel=(""+atomlabel).match(/\[(.+)\](\d+):(.)\.(\S+)\s*\/(\d+)\..+/);
+ // relaxed third parameter - may be null or a model number for multi model
+ // views
+ atomlabel = ("" + atomlabel)
+ .match(/\[(.+)\](\d+):(.)\.([^\/]+)(\/\d+\.|).+/);
+ atomidx = "" + atomidx;
+ if (atomlabel[5]) {
+ atomlabel[5] = atomlabel[5].match(/\/(.+)\./)[1];
+ atomlabel[5] = parseInt(atomlabel[5])-1;
+ } else {
+ // default - first model
+ atomlabel[5] = 0;
+ }
+ // use atomlabel[5] to look up model filename so we can highlight associated positions in any jalviews
+ for (ap in _jvapps) {
+ pdb = getDocumentBase() + modeltofiles[atomlabel[5]];
+ _jvapps[ap].mouseOverStructure(atomlabel[2], atomlabel[3], pdb);
+ msg = _jmolhovermsg;
+ }
+}
+function _jmolpick(jmid, atomlabel, atomidx) {
+ atomlabel = "" + atomlabel;
+ atomidx = "" + atomidx;
+ // label is atom id, atom number, and xyz coordinates in the form:
+ // C6 #6 -0.30683374 -1.6836332 -0.716934
+ // atom index, starting with 0.
+
+}
+function _jmolMessagecallback(jmid, statmess) {
+ // if (statmess.indexOf("Script Terminated")==0)
+ {
+ var thisTime = new Date();
+ if (_console) {
+ _console.value += "Last script execution took : "
+ + (thisTime.valueOf() - _lastTime.valueOf()) / 1000.0
+ + " seconds.";
+ }
+ _lastTime = thisTime;
+
+ }
+}
+
+
+ function lJvApp() {
+ setTimeout(function() {
+ //alert("in lJvApp");
+ var jvapp = document.getElementById("jvapp");
+ var jvfollower = document.getElementById("jvfollower");
+ //console.log(">>>>>>>> lJvApp" + jvapp);
+ linkJvJmol(jvapp);
+ }, 200);
+ setConsole(document.getElementById("stdout"));
+ };
+
+ function lJvFollow() {
+ setTimeout(function() {
+ //alert("in lJvFollow");
+ var jvapp = document.getElementById("jvapp");
+ var jvfollower = document.getElementById("jvfollower");
+ console.log(">>>>>>> lJvFollow" + jvfollower);
+ linkJvJmol(jvfollower);
+ }, 200);
+ };
+
+ function lJvA() {
+ setTimeout(function() {
+ //alert("lJvA");
+ jvfollower = document.getElementById("jvA");
+ setConsole(document.getElementById("stdout"));
+ //sep = jvfollower.getSeparator();
+ //jvapp.setSeparator(""+jvapp.getSeparator());
+ linkJvJmol(jvfollower, "jmolView", modeltofiles);
+ }, 100);
+ };
+
--- /dev/null
+/*!
+ * jQuery JavaScript Library v1.4.4
+ * http://jquery.com/
+ *
+ * Copyright 2010, John Resig
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ * Copyright 2010, The Dojo Foundation
+ * Released under the MIT, BSD, and GPL Licenses.
+ *
+ * Date: Thu Nov 11 19:04:53 2010 -0500
+ */
+(function(E,B){function ka(a,b,d){if(d===B&&a.nodeType===1){d=a.getAttribute("data-"+b);if(typeof d==="string"){try{d=d==="true"?true:d==="false"?false:d==="null"?null:!c.isNaN(d)?parseFloat(d):Ja.test(d)?c.parseJSON(d):d}catch(e){}c.data(a,b,d)}else d=B}return d}function U(){return false}function ca(){return true}function la(a,b,d){d[0].type=a;return c.event.handle.apply(b,d)}function Ka(a){var b,d,e,f,h,l,k,o,x,r,A,C=[];f=[];h=c.data(this,this.nodeType?"events":"__events__");if(typeof h==="function")h=
+h.events;if(!(a.liveFired===this||!h||!h.live||a.button&&a.type==="click")){if(a.namespace)A=RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)");a.liveFired=this;var J=h.live.slice(0);for(k=0;k<J.length;k++){h=J[k];h.origType.replace(X,"")===a.type?f.push(h.selector):J.splice(k--,1)}f=c(a.target).closest(f,a.currentTarget);o=0;for(x=f.length;o<x;o++){r=f[o];for(k=0;k<J.length;k++){h=J[k];if(r.selector===h.selector&&(!A||A.test(h.namespace))){l=r.elem;e=null;if(h.preType==="mouseenter"||
+h.preType==="mouseleave"){a.type=h.preType;e=c(a.relatedTarget).closest(h.selector)[0]}if(!e||e!==l)C.push({elem:l,handleObj:h,level:r.level})}}}o=0;for(x=C.length;o<x;o++){f=C[o];if(d&&f.level>d)break;a.currentTarget=f.elem;a.data=f.handleObj.data;a.handleObj=f.handleObj;A=f.handleObj.origHandler.apply(f.elem,arguments);if(A===false||a.isPropagationStopped()){d=f.level;if(A===false)b=false;if(a.isImmediatePropagationStopped())break}}return b}}function Y(a,b){return(a&&a!=="*"?a+".":"")+b.replace(La,
+"`").replace(Ma,"&")}function ma(a,b,d){if(c.isFunction(b))return c.grep(a,function(f,h){return!!b.call(f,h,f)===d});else if(b.nodeType)return c.grep(a,function(f){return f===b===d});else if(typeof b==="string"){var e=c.grep(a,function(f){return f.nodeType===1});if(Na.test(b))return c.filter(b,e,!d);else b=c.filter(b,e)}return c.grep(a,function(f){return c.inArray(f,b)>=0===d})}function na(a,b){var d=0;b.each(function(){if(this.nodeName===(a[d]&&a[d].nodeName)){var e=c.data(a[d++]),f=c.data(this,
+e);if(e=e&&e.events){delete f.handle;f.events={};for(var h in e)for(var l in e[h])c.event.add(this,h,e[h][l],e[h][l].data)}}})}function Oa(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)}function oa(a,b,d){var e=b==="width"?a.offsetWidth:a.offsetHeight;if(d==="border")return e;c.each(b==="width"?Pa:Qa,function(){d||(e-=parseFloat(c.css(a,"padding"+this))||0);if(d==="margin")e+=parseFloat(c.css(a,
+"margin"+this))||0;else e-=parseFloat(c.css(a,"border"+this+"Width"))||0});return e}function da(a,b,d,e){if(c.isArray(b)&&b.length)c.each(b,function(f,h){d||Ra.test(a)?e(a,h):da(a+"["+(typeof h==="object"||c.isArray(h)?f:"")+"]",h,d,e)});else if(!d&&b!=null&&typeof b==="object")c.isEmptyObject(b)?e(a,""):c.each(b,function(f,h){da(a+"["+f+"]",h,d,e)});else e(a,b)}function S(a,b){var d={};c.each(pa.concat.apply([],pa.slice(0,b)),function(){d[this]=a});return d}function qa(a){if(!ea[a]){var b=c("<"+
+a+">").appendTo("body"),d=b.css("display");b.remove();if(d==="none"||d==="")d="block";ea[a]=d}return ea[a]}function fa(a){return c.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:false}var t=E.document,c=function(){function a(){if(!b.isReady){try{t.documentElement.doScroll("left")}catch(j){setTimeout(a,1);return}b.ready()}}var b=function(j,s){return new b.fn.init(j,s)},d=E.jQuery,e=E.$,f,h=/^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]+)$)/,l=/\S/,k=/^\s+/,o=/\s+$/,x=/\W/,r=/\d/,A=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,
+C=/^[\],:{}\s]*$/,J=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,w=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,I=/(?:^|:|,)(?:\s*\[)+/g,L=/(webkit)[ \/]([\w.]+)/,g=/(opera)(?:.*version)?[ \/]([\w.]+)/,i=/(msie) ([\w.]+)/,n=/(mozilla)(?:.*? rv:([\w.]+))?/,m=navigator.userAgent,p=false,q=[],u,y=Object.prototype.toString,F=Object.prototype.hasOwnProperty,M=Array.prototype.push,N=Array.prototype.slice,O=String.prototype.trim,D=Array.prototype.indexOf,R={};b.fn=b.prototype={init:function(j,
+s){var v,z,H;if(!j)return this;if(j.nodeType){this.context=this[0]=j;this.length=1;return this}if(j==="body"&&!s&&t.body){this.context=t;this[0]=t.body;this.selector="body";this.length=1;return this}if(typeof j==="string")if((v=h.exec(j))&&(v[1]||!s))if(v[1]){H=s?s.ownerDocument||s:t;if(z=A.exec(j))if(b.isPlainObject(s)){j=[t.createElement(z[1])];b.fn.attr.call(j,s,true)}else j=[H.createElement(z[1])];else{z=b.buildFragment([v[1]],[H]);j=(z.cacheable?z.fragment.cloneNode(true):z.fragment).childNodes}return b.merge(this,
+j)}else{if((z=t.getElementById(v[2]))&&z.parentNode){if(z.id!==v[2])return f.find(j);this.length=1;this[0]=z}this.context=t;this.selector=j;return this}else if(!s&&!x.test(j)){this.selector=j;this.context=t;j=t.getElementsByTagName(j);return b.merge(this,j)}else return!s||s.jquery?(s||f).find(j):b(s).find(j);else if(b.isFunction(j))return f.ready(j);if(j.selector!==B){this.selector=j.selector;this.context=j.context}return b.makeArray(j,this)},selector:"",jquery:"1.4.4",length:0,size:function(){return this.length},
+toArray:function(){return N.call(this,0)},get:function(j){return j==null?this.toArray():j<0?this.slice(j)[0]:this[j]},pushStack:function(j,s,v){var z=b();b.isArray(j)?M.apply(z,j):b.merge(z,j);z.prevObject=this;z.context=this.context;if(s==="find")z.selector=this.selector+(this.selector?" ":"")+v;else if(s)z.selector=this.selector+"."+s+"("+v+")";return z},each:function(j,s){return b.each(this,j,s)},ready:function(j){b.bindReady();if(b.isReady)j.call(t,b);else q&&q.push(j);return this},eq:function(j){return j===
+-1?this.slice(j):this.slice(j,+j+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(N.apply(this,arguments),"slice",N.call(arguments).join(","))},map:function(j){return this.pushStack(b.map(this,function(s,v){return j.call(s,v,s)}))},end:function(){return this.prevObject||b(null)},push:M,sort:[].sort,splice:[].splice};b.fn.init.prototype=b.fn;b.extend=b.fn.extend=function(){var j,s,v,z,H,G=arguments[0]||{},K=1,Q=arguments.length,ga=false;
+if(typeof G==="boolean"){ga=G;G=arguments[1]||{};K=2}if(typeof G!=="object"&&!b.isFunction(G))G={};if(Q===K){G=this;--K}for(;K<Q;K++)if((j=arguments[K])!=null)for(s in j){v=G[s];z=j[s];if(G!==z)if(ga&&z&&(b.isPlainObject(z)||(H=b.isArray(z)))){if(H){H=false;v=v&&b.isArray(v)?v:[]}else v=v&&b.isPlainObject(v)?v:{};G[s]=b.extend(ga,v,z)}else if(z!==B)G[s]=z}return G};b.extend({noConflict:function(j){E.$=e;if(j)E.jQuery=d;return b},isReady:false,readyWait:1,ready:function(j){j===true&&b.readyWait--;
+if(!b.readyWait||j!==true&&!b.isReady){if(!t.body)return setTimeout(b.ready,1);b.isReady=true;if(!(j!==true&&--b.readyWait>0))if(q){var s=0,v=q;for(q=null;j=v[s++];)j.call(t,b);b.fn.trigger&&b(t).trigger("ready").unbind("ready")}}},bindReady:function(){if(!p){p=true;if(t.readyState==="complete")return setTimeout(b.ready,1);if(t.addEventListener){t.addEventListener("DOMContentLoaded",u,false);E.addEventListener("load",b.ready,false)}else if(t.attachEvent){t.attachEvent("onreadystatechange",u);E.attachEvent("onload",
+b.ready);var j=false;try{j=E.frameElement==null}catch(s){}t.documentElement.doScroll&&j&&a()}}},isFunction:function(j){return b.type(j)==="function"},isArray:Array.isArray||function(j){return b.type(j)==="array"},isWindow:function(j){return j&&typeof j==="object"&&"setInterval"in j},isNaN:function(j){return j==null||!r.test(j)||isNaN(j)},type:function(j){return j==null?String(j):R[y.call(j)]||"object"},isPlainObject:function(j){if(!j||b.type(j)!=="object"||j.nodeType||b.isWindow(j))return false;if(j.constructor&&
+!F.call(j,"constructor")&&!F.call(j.constructor.prototype,"isPrototypeOf"))return false;for(var s in j);return s===B||F.call(j,s)},isEmptyObject:function(j){for(var s in j)return false;return true},error:function(j){throw j;},parseJSON:function(j){if(typeof j!=="string"||!j)return null;j=b.trim(j);if(C.test(j.replace(J,"@").replace(w,"]").replace(I,"")))return E.JSON&&E.JSON.parse?E.JSON.parse(j):(new Function("return "+j))();else b.error("Invalid JSON: "+j)},noop:function(){},globalEval:function(j){if(j&&
+l.test(j)){var s=t.getElementsByTagName("head")[0]||t.documentElement,v=t.createElement("script");v.type="text/javascript";if(b.support.scriptEval)v.appendChild(t.createTextNode(j));else v.text=j;s.insertBefore(v,s.firstChild);s.removeChild(v)}},nodeName:function(j,s){return j.nodeName&&j.nodeName.toUpperCase()===s.toUpperCase()},each:function(j,s,v){var z,H=0,G=j.length,K=G===B||b.isFunction(j);if(v)if(K)for(z in j){if(s.apply(j[z],v)===false)break}else for(;H<G;){if(s.apply(j[H++],v)===false)break}else if(K)for(z in j){if(s.call(j[z],
+z,j[z])===false)break}else for(v=j[0];H<G&&s.call(v,H,v)!==false;v=j[++H]);return j},trim:O?function(j){return j==null?"":O.call(j)}:function(j){return j==null?"":j.toString().replace(k,"").replace(o,"")},makeArray:function(j,s){var v=s||[];if(j!=null){var z=b.type(j);j.length==null||z==="string"||z==="function"||z==="regexp"||b.isWindow(j)?M.call(v,j):b.merge(v,j)}return v},inArray:function(j,s){if(s.indexOf)return s.indexOf(j);for(var v=0,z=s.length;v<z;v++)if(s[v]===j)return v;return-1},merge:function(j,
+s){var v=j.length,z=0;if(typeof s.length==="number")for(var H=s.length;z<H;z++)j[v++]=s[z];else for(;s[z]!==B;)j[v++]=s[z++];j.length=v;return j},grep:function(j,s,v){var z=[],H;v=!!v;for(var G=0,K=j.length;G<K;G++){H=!!s(j[G],G);v!==H&&z.push(j[G])}return z},map:function(j,s,v){for(var z=[],H,G=0,K=j.length;G<K;G++){H=s(j[G],G,v);if(H!=null)z[z.length]=H}return z.concat.apply([],z)},guid:1,proxy:function(j,s,v){if(arguments.length===2)if(typeof s==="string"){v=j;j=v[s];s=B}else if(s&&!b.isFunction(s)){v=
+s;s=B}if(!s&&j)s=function(){return j.apply(v||this,arguments)};if(j)s.guid=j.guid=j.guid||s.guid||b.guid++;return s},access:function(j,s,v,z,H,G){var K=j.length;if(typeof s==="object"){for(var Q in s)b.access(j,Q,s[Q],z,H,v);return j}if(v!==B){z=!G&&z&&b.isFunction(v);for(Q=0;Q<K;Q++)H(j[Q],s,z?v.call(j[Q],Q,H(j[Q],s)):v,G);return j}return K?H(j[0],s):B},now:function(){return(new Date).getTime()},uaMatch:function(j){j=j.toLowerCase();j=L.exec(j)||g.exec(j)||i.exec(j)||j.indexOf("compatible")<0&&n.exec(j)||
+[];return{browser:j[1]||"",version:j[2]||"0"}},browser:{}});b.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(j,s){R["[object "+s+"]"]=s.toLowerCase()});m=b.uaMatch(m);if(m.browser){b.browser[m.browser]=true;b.browser.version=m.version}if(b.browser.webkit)b.browser.safari=true;if(D)b.inArray=function(j,s){return D.call(s,j)};if(!/\s/.test("\u00a0")){k=/^[\s\xA0]+/;o=/[\s\xA0]+$/}f=b(t);if(t.addEventListener)u=function(){t.removeEventListener("DOMContentLoaded",u,
+false);b.ready()};else if(t.attachEvent)u=function(){if(t.readyState==="complete"){t.detachEvent("onreadystatechange",u);b.ready()}};return E.jQuery=E.$=b}();(function(){c.support={};var a=t.documentElement,b=t.createElement("script"),d=t.createElement("div"),e="script"+c.now();d.style.display="none";d.innerHTML=" <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";var f=d.getElementsByTagName("*"),h=d.getElementsByTagName("a")[0],l=t.createElement("select"),
+k=l.appendChild(t.createElement("option"));if(!(!f||!f.length||!h)){c.support={leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(h.getAttribute("style")),hrefNormalized:h.getAttribute("href")==="/a",opacity:/^0.55$/.test(h.style.opacity),cssFloat:!!h.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:k.selected,deleteExpando:true,optDisabled:false,checkClone:false,
+scriptEval:false,noCloneEvent:true,boxModel:null,inlineBlockNeedsLayout:false,shrinkWrapBlocks:false,reliableHiddenOffsets:true};l.disabled=true;c.support.optDisabled=!k.disabled;b.type="text/javascript";try{b.appendChild(t.createTextNode("window."+e+"=1;"))}catch(o){}a.insertBefore(b,a.firstChild);if(E[e]){c.support.scriptEval=true;delete E[e]}try{delete b.test}catch(x){c.support.deleteExpando=false}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function r(){c.support.noCloneEvent=
+false;d.detachEvent("onclick",r)});d.cloneNode(true).fireEvent("onclick")}d=t.createElement("div");d.innerHTML="<input type='radio' name='radiotest' checked='checked'/>";a=t.createDocumentFragment();a.appendChild(d.firstChild);c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var r=t.createElement("div");r.style.width=r.style.paddingLeft="1px";t.body.appendChild(r);c.boxModel=c.support.boxModel=r.offsetWidth===2;if("zoom"in r.style){r.style.display="inline";r.style.zoom=
+1;c.support.inlineBlockNeedsLayout=r.offsetWidth===2;r.style.display="";r.innerHTML="<div style='width:4px;'></div>";c.support.shrinkWrapBlocks=r.offsetWidth!==2}r.innerHTML="<table><tr><td style='padding:0;display:none'></td><td>t</td></tr></table>";var A=r.getElementsByTagName("td");c.support.reliableHiddenOffsets=A[0].offsetHeight===0;A[0].style.display="";A[1].style.display="none";c.support.reliableHiddenOffsets=c.support.reliableHiddenOffsets&&A[0].offsetHeight===0;r.innerHTML="";t.body.removeChild(r).style.display=
+"none"});a=function(r){var A=t.createElement("div");r="on"+r;var C=r in A;if(!C){A.setAttribute(r,"return;");C=typeof A[r]==="function"}return C};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=f=h=null}})();var ra={},Ja=/^(?:\{.*\}|\[.*\])$/;c.extend({cache:{},uuid:0,expando:"jQuery"+c.now(),noData:{embed:true,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:true},data:function(a,b,d){if(c.acceptData(a)){a=a==E?ra:a;var e=a.nodeType,f=e?a[c.expando]:null,h=
+c.cache;if(!(e&&!f&&typeof b==="string"&&d===B)){if(e)f||(a[c.expando]=f=++c.uuid);else h=a;if(typeof b==="object")if(e)h[f]=c.extend(h[f],b);else c.extend(h,b);else if(e&&!h[f])h[f]={};a=e?h[f]:h;if(d!==B)a[b]=d;return typeof b==="string"?a[b]:a}}},removeData:function(a,b){if(c.acceptData(a)){a=a==E?ra:a;var d=a.nodeType,e=d?a[c.expando]:a,f=c.cache,h=d?f[e]:e;if(b){if(h){delete h[b];d&&c.isEmptyObject(h)&&c.removeData(a)}}else if(d&&c.support.deleteExpando)delete a[c.expando];else if(a.removeAttribute)a.removeAttribute(c.expando);
+else if(d)delete f[e];else for(var l in a)delete a[l]}},acceptData:function(a){if(a.nodeName){var b=c.noData[a.nodeName.toLowerCase()];if(b)return!(b===true||a.getAttribute("classid")!==b)}return true}});c.fn.extend({data:function(a,b){var d=null;if(typeof a==="undefined"){if(this.length){var e=this[0].attributes,f;d=c.data(this[0]);for(var h=0,l=e.length;h<l;h++){f=e[h].name;if(f.indexOf("data-")===0){f=f.substr(5);ka(this[0],f,d[f])}}}return d}else if(typeof a==="object")return this.each(function(){c.data(this,
+a)});var k=a.split(".");k[1]=k[1]?"."+k[1]:"";if(b===B){d=this.triggerHandler("getData"+k[1]+"!",[k[0]]);if(d===B&&this.length){d=c.data(this[0],a);d=ka(this[0],a,d)}return d===B&&k[1]?this.data(k[0]):d}else return this.each(function(){var o=c(this),x=[k[0],b];o.triggerHandler("setData"+k[1]+"!",x);c.data(this,a,b);o.triggerHandler("changeData"+k[1]+"!",x)})},removeData:function(a){return this.each(function(){c.removeData(this,a)})}});c.extend({queue:function(a,b,d){if(a){b=(b||"fx")+"queue";var e=
+c.data(a,b);if(!d)return e||[];if(!e||c.isArray(d))e=c.data(a,b,c.makeArray(d));else e.push(d);return e}},dequeue:function(a,b){b=b||"fx";var d=c.queue(a,b),e=d.shift();if(e==="inprogress")e=d.shift();if(e){b==="fx"&&d.unshift("inprogress");e.call(a,function(){c.dequeue(a,b)})}}});c.fn.extend({queue:function(a,b){if(typeof a!=="string"){b=a;a="fx"}if(b===B)return c.queue(this[0],a);return this.each(function(){var d=c.queue(this,a,b);a==="fx"&&d[0]!=="inprogress"&&c.dequeue(this,a)})},dequeue:function(a){return this.each(function(){c.dequeue(this,
+a)})},delay:function(a,b){a=c.fx?c.fx.speeds[a]||a:a;b=b||"fx";return this.queue(b,function(){var d=this;setTimeout(function(){c.dequeue(d,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var sa=/[\n\t]/g,ha=/\s+/,Sa=/\r/g,Ta=/^(?:href|src|style)$/,Ua=/^(?:button|input)$/i,Va=/^(?:button|input|object|select|textarea)$/i,Wa=/^a(?:rea)?$/i,ta=/^(?:radio|checkbox)$/i;c.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",
+colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"};c.fn.extend({attr:function(a,b){return c.access(this,a,b,true,c.attr)},removeAttr:function(a){return this.each(function(){c.attr(this,a,"");this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(c.isFunction(a))return this.each(function(x){var r=c(this);r.addClass(a.call(this,x,r.attr("class")))});if(a&&typeof a==="string")for(var b=(a||"").split(ha),d=0,e=this.length;d<e;d++){var f=this[d];if(f.nodeType===
+1)if(f.className){for(var h=" "+f.className+" ",l=f.className,k=0,o=b.length;k<o;k++)if(h.indexOf(" "+b[k]+" ")<0)l+=" "+b[k];f.className=c.trim(l)}else f.className=a}return this},removeClass:function(a){if(c.isFunction(a))return this.each(function(o){var x=c(this);x.removeClass(a.call(this,o,x.attr("class")))});if(a&&typeof a==="string"||a===B)for(var b=(a||"").split(ha),d=0,e=this.length;d<e;d++){var f=this[d];if(f.nodeType===1&&f.className)if(a){for(var h=(" "+f.className+" ").replace(sa," "),
+l=0,k=b.length;l<k;l++)h=h.replace(" "+b[l]+" "," ");f.className=c.trim(h)}else f.className=""}return this},toggleClass:function(a,b){var d=typeof a,e=typeof b==="boolean";if(c.isFunction(a))return this.each(function(f){var h=c(this);h.toggleClass(a.call(this,f,h.attr("class"),b),b)});return this.each(function(){if(d==="string")for(var f,h=0,l=c(this),k=b,o=a.split(ha);f=o[h++];){k=e?k:!l.hasClass(f);l[k?"addClass":"removeClass"](f)}else if(d==="undefined"||d==="boolean"){this.className&&c.data(this,
+"__className__",this.className);this.className=this.className||a===false?"":c.data(this,"__className__")||""}})},hasClass:function(a){a=" "+a+" ";for(var b=0,d=this.length;b<d;b++)if((" "+this[b].className+" ").replace(sa," ").indexOf(a)>-1)return true;return false},val:function(a){if(!arguments.length){var b=this[0];if(b){if(c.nodeName(b,"option")){var d=b.attributes.value;return!d||d.specified?b.value:b.text}if(c.nodeName(b,"select")){var e=b.selectedIndex;d=[];var f=b.options;b=b.type==="select-one";
+if(e<0)return null;var h=b?e:0;for(e=b?e+1:f.length;h<e;h++){var l=f[h];if(l.selected&&(c.support.optDisabled?!l.disabled:l.getAttribute("disabled")===null)&&(!l.parentNode.disabled||!c.nodeName(l.parentNode,"optgroup"))){a=c(l).val();if(b)return a;d.push(a)}}return d}if(ta.test(b.type)&&!c.support.checkOn)return b.getAttribute("value")===null?"on":b.value;return(b.value||"").replace(Sa,"")}return B}var k=c.isFunction(a);return this.each(function(o){var x=c(this),r=a;if(this.nodeType===1){if(k)r=
+a.call(this,o,x.val());if(r==null)r="";else if(typeof r==="number")r+="";else if(c.isArray(r))r=c.map(r,function(C){return C==null?"":C+""});if(c.isArray(r)&&ta.test(this.type))this.checked=c.inArray(x.val(),r)>=0;else if(c.nodeName(this,"select")){var A=c.makeArray(r);c("option",this).each(function(){this.selected=c.inArray(c(this).val(),A)>=0});if(!A.length)this.selectedIndex=-1}else this.value=r}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},
+attr:function(a,b,d,e){if(!a||a.nodeType===3||a.nodeType===8)return B;if(e&&b in c.attrFn)return c(a)[b](d);e=a.nodeType!==1||!c.isXMLDoc(a);var f=d!==B;b=e&&c.props[b]||b;var h=Ta.test(b);if((b in a||a[b]!==B)&&e&&!h){if(f){b==="type"&&Ua.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed");if(d===null)a.nodeType===1&&a.removeAttribute(b);else a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&&
+b.specified?b.value:Va.test(a.nodeName)||Wa.test(a.nodeName)&&a.href?0:B;return a[b]}if(!c.support.style&&e&&b==="style"){if(f)a.style.cssText=""+d;return a.style.cssText}f&&a.setAttribute(b,""+d);if(!a.attributes[b]&&a.hasAttribute&&!a.hasAttribute(b))return B;a=!c.support.hrefNormalized&&e&&h?a.getAttribute(b,2):a.getAttribute(b);return a===null?B:a}});var X=/\.(.*)$/,ia=/^(?:textarea|input|select)$/i,La=/\./g,Ma=/ /g,Xa=/[^\w\s.|`]/g,Ya=function(a){return a.replace(Xa,"\\$&")},ua={focusin:0,focusout:0};
+c.event={add:function(a,b,d,e){if(!(a.nodeType===3||a.nodeType===8)){if(c.isWindow(a)&&a!==E&&!a.frameElement)a=E;if(d===false)d=U;else if(!d)return;var f,h;if(d.handler){f=d;d=f.handler}if(!d.guid)d.guid=c.guid++;if(h=c.data(a)){var l=a.nodeType?"events":"__events__",k=h[l],o=h.handle;if(typeof k==="function"){o=k.handle;k=k.events}else if(!k){a.nodeType||(h[l]=h=function(){});h.events=k={}}if(!o)h.handle=o=function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(o.elem,
+arguments):B};o.elem=a;b=b.split(" ");for(var x=0,r;l=b[x++];){h=f?c.extend({},f):{handler:d,data:e};if(l.indexOf(".")>-1){r=l.split(".");l=r.shift();h.namespace=r.slice(0).sort().join(".")}else{r=[];h.namespace=""}h.type=l;if(!h.guid)h.guid=d.guid;var A=k[l],C=c.event.special[l]||{};if(!A){A=k[l]=[];if(!C.setup||C.setup.call(a,e,r,o)===false)if(a.addEventListener)a.addEventListener(l,o,false);else a.attachEvent&&a.attachEvent("on"+l,o)}if(C.add){C.add.call(a,h);if(!h.handler.guid)h.handler.guid=
+d.guid}A.push(h);c.event.global[l]=true}a=null}}},global:{},remove:function(a,b,d,e){if(!(a.nodeType===3||a.nodeType===8)){if(d===false)d=U;var f,h,l=0,k,o,x,r,A,C,J=a.nodeType?"events":"__events__",w=c.data(a),I=w&&w[J];if(w&&I){if(typeof I==="function"){w=I;I=I.events}if(b&&b.type){d=b.handler;b=b.type}if(!b||typeof b==="string"&&b.charAt(0)==="."){b=b||"";for(f in I)c.event.remove(a,f+b)}else{for(b=b.split(" ");f=b[l++];){r=f;k=f.indexOf(".")<0;o=[];if(!k){o=f.split(".");f=o.shift();x=RegExp("(^|\\.)"+
+c.map(o.slice(0).sort(),Ya).join("\\.(?:.*\\.)?")+"(\\.|$)")}if(A=I[f])if(d){r=c.event.special[f]||{};for(h=e||0;h<A.length;h++){C=A[h];if(d.guid===C.guid){if(k||x.test(C.namespace)){e==null&&A.splice(h--,1);r.remove&&r.remove.call(a,C)}if(e!=null)break}}if(A.length===0||e!=null&&A.length===1){if(!r.teardown||r.teardown.call(a,o)===false)c.removeEvent(a,f,w.handle);delete I[f]}}else for(h=0;h<A.length;h++){C=A[h];if(k||x.test(C.namespace)){c.event.remove(a,r,C.handler,h);A.splice(h--,1)}}}if(c.isEmptyObject(I)){if(b=
+w.handle)b.elem=null;delete w.events;delete w.handle;if(typeof w==="function")c.removeData(a,J);else c.isEmptyObject(w)&&c.removeData(a)}}}}},trigger:function(a,b,d,e){var f=a.type||a;if(!e){a=typeof a==="object"?a[c.expando]?a:c.extend(c.Event(f),a):c.Event(f);if(f.indexOf("!")>=0){a.type=f=f.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();c.event.global[f]&&c.each(c.cache,function(){this.events&&this.events[f]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType===
+8)return B;a.result=B;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(e=d.nodeType?c.data(d,"handle"):(c.data(d,"__events__")||{}).handle)&&e.apply(d,b);e=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+f]&&d["on"+f].apply(d,b)===false){a.result=false;a.preventDefault()}}catch(h){}if(!a.isPropagationStopped()&&e)c.event.trigger(a,b,e,true);else if(!a.isDefaultPrevented()){var l;e=a.target;var k=f.replace(X,""),o=c.nodeName(e,"a")&&k===
+"click",x=c.event.special[k]||{};if((!x._default||x._default.call(d,a)===false)&&!o&&!(e&&e.nodeName&&c.noData[e.nodeName.toLowerCase()])){try{if(e[k]){if(l=e["on"+k])e["on"+k]=null;c.event.triggered=true;e[k]()}}catch(r){}if(l)e["on"+k]=l;c.event.triggered=false}}},handle:function(a){var b,d,e,f;d=[];var h=c.makeArray(arguments);a=h[0]=c.event.fix(a||E.event);a.currentTarget=this;b=a.type.indexOf(".")<0&&!a.exclusive;if(!b){e=a.type.split(".");a.type=e.shift();d=e.slice(0).sort();e=RegExp("(^|\\.)"+
+d.join("\\.(?:.*\\.)?")+"(\\.|$)")}a.namespace=a.namespace||d.join(".");f=c.data(this,this.nodeType?"events":"__events__");if(typeof f==="function")f=f.events;d=(f||{})[a.type];if(f&&d){d=d.slice(0);f=0;for(var l=d.length;f<l;f++){var k=d[f];if(b||e.test(k.namespace)){a.handler=k.handler;a.data=k.data;a.handleObj=k;k=k.handler.apply(this,h);if(k!==B){a.result=k;if(k===false){a.preventDefault();a.stopPropagation()}}if(a.isImmediatePropagationStopped())break}}}return a.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),
+fix:function(a){if(a[c.expando])return a;var b=a;a=c.Event(b);for(var d=this.props.length,e;d;){e=this.props[--d];a[e]=b[e]}if(!a.target)a.target=a.srcElement||t;if(a.target.nodeType===3)a.target=a.target.parentNode;if(!a.relatedTarget&&a.fromElement)a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement;if(a.pageX==null&&a.clientX!=null){b=t.documentElement;d=t.body;a.pageX=a.clientX+(b&&b.scrollLeft||d&&d.scrollLeft||0)-(b&&b.clientLeft||d&&d.clientLeft||0);a.pageY=a.clientY+(b&&b.scrollTop||
+d&&d.scrollTop||0)-(b&&b.clientTop||d&&d.clientTop||0)}if(a.which==null&&(a.charCode!=null||a.keyCode!=null))a.which=a.charCode!=null?a.charCode:a.keyCode;if(!a.metaKey&&a.ctrlKey)a.metaKey=a.ctrlKey;if(!a.which&&a.button!==B)a.which=a.button&1?1:a.button&2?3:a.button&4?2:0;return a},guid:1E8,proxy:c.proxy,special:{ready:{setup:c.bindReady,teardown:c.noop},live:{add:function(a){c.event.add(this,Y(a.origType,a.selector),c.extend({},a,{handler:Ka,guid:a.handler.guid}))},remove:function(a){c.event.remove(this,
+Y(a.origType,a.selector),a)}},beforeunload:{setup:function(a,b,d){if(c.isWindow(this))this.onbeforeunload=d},teardown:function(a,b){if(this.onbeforeunload===b)this.onbeforeunload=null}}}};c.removeEvent=t.removeEventListener?function(a,b,d){a.removeEventListener&&a.removeEventListener(b,d,false)}:function(a,b,d){a.detachEvent&&a.detachEvent("on"+b,d)};c.Event=function(a){if(!this.preventDefault)return new c.Event(a);if(a&&a.type){this.originalEvent=a;this.type=a.type}else this.type=a;this.timeStamp=
+c.now();this[c.expando]=true};c.Event.prototype={preventDefault:function(){this.isDefaultPrevented=ca;var a=this.originalEvent;if(a)if(a.preventDefault)a.preventDefault();else a.returnValue=false},stopPropagation:function(){this.isPropagationStopped=ca;var a=this.originalEvent;if(a){a.stopPropagation&&a.stopPropagation();a.cancelBubble=true}},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=ca;this.stopPropagation()},isDefaultPrevented:U,isPropagationStopped:U,isImmediatePropagationStopped:U};
+var va=function(a){var b=a.relatedTarget;try{for(;b&&b!==this;)b=b.parentNode;if(b!==this){a.type=a.data;c.event.handle.apply(this,arguments)}}catch(d){}},wa=function(a){a.type=a.data;c.event.handle.apply(this,arguments)};c.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){c.event.special[a]={setup:function(d){c.event.add(this,b,d&&d.selector?wa:va,a)},teardown:function(d){c.event.remove(this,b,d&&d.selector?wa:va)}}});if(!c.support.submitBubbles)c.event.special.submit={setup:function(){if(this.nodeName.toLowerCase()!==
+"form"){c.event.add(this,"click.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="submit"||d==="image")&&c(b).closest("form").length){a.liveFired=B;return la("submit",this,arguments)}});c.event.add(this,"keypress.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="text"||d==="password")&&c(b).closest("form").length&&a.keyCode===13){a.liveFired=B;return la("submit",this,arguments)}})}else return false},teardown:function(){c.event.remove(this,".specialSubmit")}};if(!c.support.changeBubbles){var V,
+xa=function(a){var b=a.type,d=a.value;if(b==="radio"||b==="checkbox")d=a.checked;else if(b==="select-multiple")d=a.selectedIndex>-1?c.map(a.options,function(e){return e.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d},Z=function(a,b){var d=a.target,e,f;if(!(!ia.test(d.nodeName)||d.readOnly)){e=c.data(d,"_change_data");f=xa(d);if(a.type!=="focusout"||d.type!=="radio")c.data(d,"_change_data",f);if(!(e===B||f===e))if(e!=null||f){a.type="change";a.liveFired=
+B;return c.event.trigger(a,b,d)}}};c.event.special.change={filters:{focusout:Z,beforedeactivate:Z,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return Z.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return Z.call(this,a)},beforeactivate:function(a){a=a.target;c.data(a,"_change_data",xa(a))}},setup:function(){if(this.type===
+"file")return false;for(var a in V)c.event.add(this,a+".specialChange",V[a]);return ia.test(this.nodeName)},teardown:function(){c.event.remove(this,".specialChange");return ia.test(this.nodeName)}};V=c.event.special.change.filters;V.focus=V.beforeactivate}t.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(e){e=c.event.fix(e);e.type=b;return c.event.trigger(e,null,e.target)}c.event.special[b]={setup:function(){ua[b]++===0&&t.addEventListener(a,d,true)},teardown:function(){--ua[b]===
+0&&t.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,e,f){if(typeof d==="object"){for(var h in d)this[b](h,e,d[h],f);return this}if(c.isFunction(e)||e===false){f=e;e=B}var l=b==="one"?c.proxy(f,function(o){c(this).unbind(o,l);return f.apply(this,arguments)}):f;if(d==="unload"&&b!=="one")this.one(d,e,f);else{h=0;for(var k=this.length;h<k;h++)c.event.add(this[h],d,l,e)}return this}});c.fn.extend({unbind:function(a,b){if(typeof a==="object"&&!a.preventDefault)for(var d in a)this.unbind(d,
+a[d]);else{d=0;for(var e=this.length;d<e;d++)c.event.remove(this[d],a,b)}return this},delegate:function(a,b,d,e){return this.live(b,d,e,a)},undelegate:function(a,b,d){return arguments.length===0?this.unbind("live"):this.die(b,null,d,a)},trigger:function(a,b){return this.each(function(){c.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0]){var d=c.Event(a);d.preventDefault();d.stopPropagation();c.event.trigger(d,b,this[0]);return d.result}},toggle:function(a){for(var b=arguments,d=
+1;d<b.length;)c.proxy(a,b[d++]);return this.click(c.proxy(a,function(e){var f=(c.data(this,"lastToggle"+a.guid)||0)%d;c.data(this,"lastToggle"+a.guid,f+1);e.preventDefault();return b[f].apply(this,arguments)||false}))},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var ya={focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};c.each(["live","die"],function(a,b){c.fn[b]=function(d,e,f,h){var l,k=0,o,x,r=h||this.selector;h=h?this:c(this.context);if(typeof d===
+"object"&&!d.preventDefault){for(l in d)h[b](l,e,d[l],r);return this}if(c.isFunction(e)){f=e;e=B}for(d=(d||"").split(" ");(l=d[k++])!=null;){o=X.exec(l);x="";if(o){x=o[0];l=l.replace(X,"")}if(l==="hover")d.push("mouseenter"+x,"mouseleave"+x);else{o=l;if(l==="focus"||l==="blur"){d.push(ya[l]+x);l+=x}else l=(ya[l]||l)+x;if(b==="live"){x=0;for(var A=h.length;x<A;x++)c.event.add(h[x],"live."+Y(l,r),{data:e,selector:r,handler:f,origType:l,origHandler:f,preType:o})}else h.unbind("live."+Y(l,r),f)}}return this}});
+c.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error".split(" "),function(a,b){c.fn[b]=function(d,e){if(e==null){e=d;d=null}return arguments.length>0?this.bind(b,d,e):this.trigger(b)};if(c.attrFn)c.attrFn[b]=true});E.attachEvent&&!E.addEventListener&&c(E).bind("unload",function(){for(var a in c.cache)if(c.cache[a].handle)try{c.event.remove(c.cache[a].handle.elem)}catch(b){}});
+(function(){function a(g,i,n,m,p,q){p=0;for(var u=m.length;p<u;p++){var y=m[p];if(y){var F=false;for(y=y[g];y;){if(y.sizcache===n){F=m[y.sizset];break}if(y.nodeType===1&&!q){y.sizcache=n;y.sizset=p}if(y.nodeName.toLowerCase()===i){F=y;break}y=y[g]}m[p]=F}}}function b(g,i,n,m,p,q){p=0;for(var u=m.length;p<u;p++){var y=m[p];if(y){var F=false;for(y=y[g];y;){if(y.sizcache===n){F=m[y.sizset];break}if(y.nodeType===1){if(!q){y.sizcache=n;y.sizset=p}if(typeof i!=="string"){if(y===i){F=true;break}}else if(k.filter(i,
+[y]).length>0){F=y;break}}y=y[g]}m[p]=F}}}var d=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,e=0,f=Object.prototype.toString,h=false,l=true;[0,0].sort(function(){l=false;return 0});var k=function(g,i,n,m){n=n||[];var p=i=i||t;if(i.nodeType!==1&&i.nodeType!==9)return[];if(!g||typeof g!=="string")return n;var q,u,y,F,M,N=true,O=k.isXML(i),D=[],R=g;do{d.exec("");if(q=d.exec(R)){R=q[3];D.push(q[1]);if(q[2]){F=q[3];
+break}}}while(q);if(D.length>1&&x.exec(g))if(D.length===2&&o.relative[D[0]])u=L(D[0]+D[1],i);else for(u=o.relative[D[0]]?[i]:k(D.shift(),i);D.length;){g=D.shift();if(o.relative[g])g+=D.shift();u=L(g,u)}else{if(!m&&D.length>1&&i.nodeType===9&&!O&&o.match.ID.test(D[0])&&!o.match.ID.test(D[D.length-1])){q=k.find(D.shift(),i,O);i=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]}if(i){q=m?{expr:D.pop(),set:C(m)}:k.find(D.pop(),D.length===1&&(D[0]==="~"||D[0]==="+")&&i.parentNode?i.parentNode:i,O);u=q.expr?k.filter(q.expr,
+q.set):q.set;if(D.length>0)y=C(u);else N=false;for(;D.length;){q=M=D.pop();if(o.relative[M])q=D.pop();else M="";if(q==null)q=i;o.relative[M](y,q,O)}}else y=[]}y||(y=u);y||k.error(M||g);if(f.call(y)==="[object Array]")if(N)if(i&&i.nodeType===1)for(g=0;y[g]!=null;g++){if(y[g]&&(y[g]===true||y[g].nodeType===1&&k.contains(i,y[g])))n.push(u[g])}else for(g=0;y[g]!=null;g++)y[g]&&y[g].nodeType===1&&n.push(u[g]);else n.push.apply(n,y);else C(y,n);if(F){k(F,p,n,m);k.uniqueSort(n)}return n};k.uniqueSort=function(g){if(w){h=
+l;g.sort(w);if(h)for(var i=1;i<g.length;i++)g[i]===g[i-1]&&g.splice(i--,1)}return g};k.matches=function(g,i){return k(g,null,null,i)};k.matchesSelector=function(g,i){return k(i,null,null,[g]).length>0};k.find=function(g,i,n){var m;if(!g)return[];for(var p=0,q=o.order.length;p<q;p++){var u,y=o.order[p];if(u=o.leftMatch[y].exec(g)){var F=u[1];u.splice(1,1);if(F.substr(F.length-1)!=="\\"){u[1]=(u[1]||"").replace(/\\/g,"");m=o.find[y](u,i,n);if(m!=null){g=g.replace(o.match[y],"");break}}}}m||(m=i.getElementsByTagName("*"));
+return{set:m,expr:g}};k.filter=function(g,i,n,m){for(var p,q,u=g,y=[],F=i,M=i&&i[0]&&k.isXML(i[0]);g&&i.length;){for(var N in o.filter)if((p=o.leftMatch[N].exec(g))!=null&&p[2]){var O,D,R=o.filter[N];D=p[1];q=false;p.splice(1,1);if(D.substr(D.length-1)!=="\\"){if(F===y)y=[];if(o.preFilter[N])if(p=o.preFilter[N](p,F,n,y,m,M)){if(p===true)continue}else q=O=true;if(p)for(var j=0;(D=F[j])!=null;j++)if(D){O=R(D,p,j,F);var s=m^!!O;if(n&&O!=null)if(s)q=true;else F[j]=false;else if(s){y.push(D);q=true}}if(O!==
+B){n||(F=y);g=g.replace(o.match[N],"");if(!q)return[];break}}}if(g===u)if(q==null)k.error(g);else break;u=g}return F};k.error=function(g){throw"Syntax error, unrecognized expression: "+g;};var o=k.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+\-]*)\))?/,
+POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(g){return g.getAttribute("href")}},relative:{"+":function(g,i){var n=typeof i==="string",m=n&&!/\W/.test(i);n=n&&!m;if(m)i=i.toLowerCase();m=0;for(var p=g.length,q;m<p;m++)if(q=g[m]){for(;(q=q.previousSibling)&&q.nodeType!==1;);g[m]=n||q&&q.nodeName.toLowerCase()===
+i?q||false:q===i}n&&k.filter(i,g,true)},">":function(g,i){var n,m=typeof i==="string",p=0,q=g.length;if(m&&!/\W/.test(i))for(i=i.toLowerCase();p<q;p++){if(n=g[p]){n=n.parentNode;g[p]=n.nodeName.toLowerCase()===i?n:false}}else{for(;p<q;p++)if(n=g[p])g[p]=m?n.parentNode:n.parentNode===i;m&&k.filter(i,g,true)}},"":function(g,i,n){var m,p=e++,q=b;if(typeof i==="string"&&!/\W/.test(i)){m=i=i.toLowerCase();q=a}q("parentNode",i,p,g,m,n)},"~":function(g,i,n){var m,p=e++,q=b;if(typeof i==="string"&&!/\W/.test(i)){m=
+i=i.toLowerCase();q=a}q("previousSibling",i,p,g,m,n)}},find:{ID:function(g,i,n){if(typeof i.getElementById!=="undefined"&&!n)return(g=i.getElementById(g[1]))&&g.parentNode?[g]:[]},NAME:function(g,i){if(typeof i.getElementsByName!=="undefined"){for(var n=[],m=i.getElementsByName(g[1]),p=0,q=m.length;p<q;p++)m[p].getAttribute("name")===g[1]&&n.push(m[p]);return n.length===0?null:n}},TAG:function(g,i){return i.getElementsByTagName(g[1])}},preFilter:{CLASS:function(g,i,n,m,p,q){g=" "+g[1].replace(/\\/g,
+"")+" ";if(q)return g;q=0;for(var u;(u=i[q])!=null;q++)if(u)if(p^(u.className&&(" "+u.className+" ").replace(/[\t\n]/g," ").indexOf(g)>=0))n||m.push(u);else if(n)i[q]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()},CHILD:function(g){if(g[1]==="nth"){var i=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=i[1]+(i[2]||1)-0;g[3]=i[3]-0}g[0]=e++;return g},ATTR:function(g,i,n,
+m,p,q){i=g[1].replace(/\\/g,"");if(!q&&o.attrMap[i])g[1]=o.attrMap[i];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,i,n,m,p){if(g[1]==="not")if((d.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=k(g[3],null,null,i);else{g=k.filter(g[3],i,n,true^p);n||m.push.apply(m,g);return false}else if(o.match.POS.test(g[0])||o.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled===
+true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,i,n){return!!k(n[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)},text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"===
+g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}},setFilters:{first:function(g,i){return i===0},last:function(g,i,n,m){return i===m.length-1},even:function(g,i){return i%2===0},odd:function(g,i){return i%2===1},lt:function(g,i,n){return i<n[3]-0},gt:function(g,i,n){return i>n[3]-0},nth:function(g,i,n){return n[3]-
+0===i},eq:function(g,i,n){return n[3]-0===i}},filter:{PSEUDO:function(g,i,n,m){var p=i[1],q=o.filters[p];if(q)return q(g,n,i,m);else if(p==="contains")return(g.textContent||g.innerText||k.getText([g])||"").indexOf(i[3])>=0;else if(p==="not"){i=i[3];n=0;for(m=i.length;n<m;n++)if(i[n]===g)return false;return true}else k.error("Syntax error, unrecognized expression: "+p)},CHILD:function(g,i){var n=i[1],m=g;switch(n){case "only":case "first":for(;m=m.previousSibling;)if(m.nodeType===1)return false;if(n===
+"first")return true;m=g;case "last":for(;m=m.nextSibling;)if(m.nodeType===1)return false;return true;case "nth":n=i[2];var p=i[3];if(n===1&&p===0)return true;var q=i[0],u=g.parentNode;if(u&&(u.sizcache!==q||!g.nodeIndex)){var y=0;for(m=u.firstChild;m;m=m.nextSibling)if(m.nodeType===1)m.nodeIndex=++y;u.sizcache=q}m=g.nodeIndex-p;return n===0?m===0:m%n===0&&m/n>=0}},ID:function(g,i){return g.nodeType===1&&g.getAttribute("id")===i},TAG:function(g,i){return i==="*"&&g.nodeType===1||g.nodeName.toLowerCase()===
+i},CLASS:function(g,i){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(i)>-1},ATTR:function(g,i){var n=i[1];n=o.attrHandle[n]?o.attrHandle[n](g):g[n]!=null?g[n]:g.getAttribute(n);var m=n+"",p=i[2],q=i[4];return n==null?p==="!=":p==="="?m===q:p==="*="?m.indexOf(q)>=0:p==="~="?(" "+m+" ").indexOf(q)>=0:!q?m&&n!==false:p==="!="?m!==q:p==="^="?m.indexOf(q)===0:p==="$="?m.substr(m.length-q.length)===q:p==="|="?m===q||m.substr(0,q.length+1)===q+"-":false},POS:function(g,i,n,m){var p=o.setFilters[i[2]];
+if(p)return p(g,n,i,m)}}},x=o.match.POS,r=function(g,i){return"\\"+(i-0+1)},A;for(A in o.match){o.match[A]=RegExp(o.match[A].source+/(?![^\[]*\])(?![^\(]*\))/.source);o.leftMatch[A]=RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[A].source.replace(/\\(\d+)/g,r))}var C=function(g,i){g=Array.prototype.slice.call(g,0);if(i){i.push.apply(i,g);return i}return g};try{Array.prototype.slice.call(t.documentElement.childNodes,0)}catch(J){C=function(g,i){var n=0,m=i||[];if(f.call(g)==="[object Array]")Array.prototype.push.apply(m,
+g);else if(typeof g.length==="number")for(var p=g.length;n<p;n++)m.push(g[n]);else for(;g[n];n++)m.push(g[n]);return m}}var w,I;if(t.documentElement.compareDocumentPosition)w=function(g,i){if(g===i){h=true;return 0}if(!g.compareDocumentPosition||!i.compareDocumentPosition)return g.compareDocumentPosition?-1:1;return g.compareDocumentPosition(i)&4?-1:1};else{w=function(g,i){var n,m,p=[],q=[];n=g.parentNode;m=i.parentNode;var u=n;if(g===i){h=true;return 0}else if(n===m)return I(g,i);else if(n){if(!m)return 1}else return-1;
+for(;u;){p.unshift(u);u=u.parentNode}for(u=m;u;){q.unshift(u);u=u.parentNode}n=p.length;m=q.length;for(u=0;u<n&&u<m;u++)if(p[u]!==q[u])return I(p[u],q[u]);return u===n?I(g,q[u],-1):I(p[u],i,1)};I=function(g,i,n){if(g===i)return n;for(g=g.nextSibling;g;){if(g===i)return-1;g=g.nextSibling}return 1}}k.getText=function(g){for(var i="",n,m=0;g[m];m++){n=g[m];if(n.nodeType===3||n.nodeType===4)i+=n.nodeValue;else if(n.nodeType!==8)i+=k.getText(n.childNodes)}return i};(function(){var g=t.createElement("div"),
+i="script"+(new Date).getTime(),n=t.documentElement;g.innerHTML="<a name='"+i+"'/>";n.insertBefore(g,n.firstChild);if(t.getElementById(i)){o.find.ID=function(m,p,q){if(typeof p.getElementById!=="undefined"&&!q)return(p=p.getElementById(m[1]))?p.id===m[1]||typeof p.getAttributeNode!=="undefined"&&p.getAttributeNode("id").nodeValue===m[1]?[p]:B:[]};o.filter.ID=function(m,p){var q=typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id");return m.nodeType===1&&q&&q.nodeValue===p}}n.removeChild(g);
+n=g=null})();(function(){var g=t.createElement("div");g.appendChild(t.createComment(""));if(g.getElementsByTagName("*").length>0)o.find.TAG=function(i,n){var m=n.getElementsByTagName(i[1]);if(i[1]==="*"){for(var p=[],q=0;m[q];q++)m[q].nodeType===1&&p.push(m[q]);m=p}return m};g.innerHTML="<a href='#'></a>";if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")o.attrHandle.href=function(i){return i.getAttribute("href",2)};g=null})();t.querySelectorAll&&
+function(){var g=k,i=t.createElement("div");i.innerHTML="<p class='TEST'></p>";if(!(i.querySelectorAll&&i.querySelectorAll(".TEST").length===0)){k=function(m,p,q,u){p=p||t;m=m.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!u&&!k.isXML(p))if(p.nodeType===9)try{return C(p.querySelectorAll(m),q)}catch(y){}else if(p.nodeType===1&&p.nodeName.toLowerCase()!=="object"){var F=p.getAttribute("id"),M=F||"__sizzle__";F||p.setAttribute("id",M);try{return C(p.querySelectorAll("#"+M+" "+m),q)}catch(N){}finally{F||
+p.removeAttribute("id")}}return g(m,p,q,u)};for(var n in g)k[n]=g[n];i=null}}();(function(){var g=t.documentElement,i=g.matchesSelector||g.mozMatchesSelector||g.webkitMatchesSelector||g.msMatchesSelector,n=false;try{i.call(t.documentElement,"[test!='']:sizzle")}catch(m){n=true}if(i)k.matchesSelector=function(p,q){q=q.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(p))try{if(n||!o.match.PSEUDO.test(q)&&!/!=/.test(q))return i.call(p,q)}catch(u){}return k(q,null,null,[p]).length>0}})();(function(){var g=
+t.createElement("div");g.innerHTML="<div class='test e'></div><div class='test'></div>";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length===0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){o.order.splice(1,0,"CLASS");o.find.CLASS=function(i,n,m){if(typeof n.getElementsByClassName!=="undefined"&&!m)return n.getElementsByClassName(i[1])};g=null}}})();k.contains=t.documentElement.contains?function(g,i){return g!==i&&(g.contains?g.contains(i):true)}:t.documentElement.compareDocumentPosition?
+function(g,i){return!!(g.compareDocumentPosition(i)&16)}:function(){return false};k.isXML=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false};var L=function(g,i){for(var n,m=[],p="",q=i.nodeType?[i]:i;n=o.match.PSEUDO.exec(g);){p+=n[0];g=g.replace(o.match.PSEUDO,"")}g=o.relative[g]?g+"*":g;n=0;for(var u=q.length;n<u;n++)k(g,q[n],m);return k.filter(p,m)};c.find=k;c.expr=k.selectors;c.expr[":"]=c.expr.filters;c.unique=k.uniqueSort;c.text=k.getText;c.isXMLDoc=k.isXML;
+c.contains=k.contains})();var Za=/Until$/,$a=/^(?:parents|prevUntil|prevAll)/,ab=/,/,Na=/^.[^:#\[\.,]*$/,bb=Array.prototype.slice,cb=c.expr.match.POS;c.fn.extend({find:function(a){for(var b=this.pushStack("","find",a),d=0,e=0,f=this.length;e<f;e++){d=b.length;c.find(a,this[e],b);if(e>0)for(var h=d;h<b.length;h++)for(var l=0;l<d;l++)if(b[l]===b[h]){b.splice(h--,1);break}}return b},has:function(a){var b=c(a);return this.filter(function(){for(var d=0,e=b.length;d<e;d++)if(c.contains(this,b[d]))return true})},
+not:function(a){return this.pushStack(ma(this,a,false),"not",a)},filter:function(a){return this.pushStack(ma(this,a,true),"filter",a)},is:function(a){return!!a&&c.filter(a,this).length>0},closest:function(a,b){var d=[],e,f,h=this[0];if(c.isArray(a)){var l,k={},o=1;if(h&&a.length){e=0;for(f=a.length;e<f;e++){l=a[e];k[l]||(k[l]=c.expr.match.POS.test(l)?c(l,b||this.context):l)}for(;h&&h.ownerDocument&&h!==b;){for(l in k){e=k[l];if(e.jquery?e.index(h)>-1:c(h).is(e))d.push({selector:l,elem:h,level:o})}h=
+h.parentNode;o++}}return d}l=cb.test(a)?c(a,b||this.context):null;e=0;for(f=this.length;e<f;e++)for(h=this[e];h;)if(l?l.index(h)>-1:c.find.matchesSelector(h,a)){d.push(h);break}else{h=h.parentNode;if(!h||!h.ownerDocument||h===b)break}d=d.length>1?c.unique(d):d;return this.pushStack(d,"closest",a)},index:function(a){if(!a||typeof a==="string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var d=typeof a==="string"?c(a,b||this.context):
+c.makeArray(a),e=c.merge(this.get(),d);return this.pushStack(!d[0]||!d[0].parentNode||d[0].parentNode.nodeType===11||!e[0]||!e[0].parentNode||e[0].parentNode.nodeType===11?e:c.unique(e))},andSelf:function(){return this.add(this.prevObject)}});c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode",d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a,
+2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling",d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a,
+b){c.fn[a]=function(d,e){var f=c.map(this,b,d);Za.test(a)||(e=d);if(e&&typeof e==="string")f=c.filter(e,f);f=this.length>1?c.unique(f):f;if((this.length>1||ab.test(e))&&$a.test(a))f=f.reverse();return this.pushStack(f,a,bb.call(arguments).join(","))}});c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return b.length===1?c.find.matchesSelector(b[0],a)?[b[0]]:[]:c.find.matches(a,b)},dir:function(a,b,d){var e=[];for(a=a[b];a&&a.nodeType!==9&&(d===B||a.nodeType!==1||!c(a).is(d));){a.nodeType===1&&
+e.push(a);a=a[b]}return e},nth:function(a,b,d){b=b||1;for(var e=0;a;a=a[d])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==b&&d.push(a);return d}});var za=/ jQuery\d+="(?:\d+|null)"/g,$=/^\s+/,Aa=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Ba=/<([\w:]+)/,db=/<tbody/i,eb=/<|&#?\w+;/,Ca=/<(?:script|object|embed|option|style)/i,Da=/checked\s*(?:[^=]|=\s*.checked.)/i,fb=/\=([^="'>\s]+\/)>/g,P={option:[1,
+"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]};P.optgroup=P.option;P.tbody=P.tfoot=P.colgroup=P.caption=P.thead;P.th=P.td;if(!c.support.htmlSerialize)P._default=[1,"div<div>","</div>"];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d=
+c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==B)return this.empty().append((this[0]&&this[0].ownerDocument||t).createTextNode(a));return c.text(this)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this},
+wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})},
+prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,
+this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},remove:function(a,b){for(var d=0,e;(e=this[d])!=null;d++)if(!a||c.filter(a,[e]).length){if(!b&&e.nodeType===1){c.cleanData(e.getElementsByTagName("*"));c.cleanData([e])}e.parentNode&&e.parentNode.removeChild(e)}return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++)for(b.nodeType===1&&c.cleanData(b.getElementsByTagName("*"));b.firstChild;)b.removeChild(b.firstChild);
+return this},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&!c.isXMLDoc(this)){var d=this.outerHTML,e=this.ownerDocument;if(!d){d=e.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(za,"").replace(fb,'="$1">').replace($,"")],e)[0]}else return this.cloneNode(true)});if(a===true){na(this,b);na(this.find("*"),b.find("*"))}return b},html:function(a){if(a===B)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(za,""):null;
+else if(typeof a==="string"&&!Ca.test(a)&&(c.support.leadingWhitespace||!$.test(a))&&!P[(Ba.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Aa,"<$1></$2>");try{for(var b=0,d=this.length;b<d;b++)if(this[b].nodeType===1){c.cleanData(this[b].getElementsByTagName("*"));this[b].innerHTML=a}}catch(e){this.empty().append(a)}}else c.isFunction(a)?this.each(function(f){var h=c(this);h.html(a.call(this,f,h.html()))}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(c.isFunction(a))return this.each(function(b){var d=
+c(this),e=d.html();d.replaceWith(a.call(this,b,e))});if(typeof a!=="string")a=c(a).detach();return this.each(function(){var b=this.nextSibling,d=this.parentNode;c(this).remove();b?c(b).before(a):c(d).append(a)})}else return this.pushStack(c(c.isFunction(a)?a():a),"replaceWith",a)},detach:function(a){return this.remove(a,true)},domManip:function(a,b,d){var e,f,h,l=a[0],k=[];if(!c.support.checkClone&&arguments.length===3&&typeof l==="string"&&Da.test(l))return this.each(function(){c(this).domManip(a,
+b,d,true)});if(c.isFunction(l))return this.each(function(x){var r=c(this);a[0]=l.call(this,x,b?r.html():B);r.domManip(a,b,d)});if(this[0]){e=l&&l.parentNode;e=c.support.parentNode&&e&&e.nodeType===11&&e.childNodes.length===this.length?{fragment:e}:c.buildFragment(a,this,k);h=e.fragment;if(f=h.childNodes.length===1?h=h.firstChild:h.firstChild){b=b&&c.nodeName(f,"tr");f=0;for(var o=this.length;f<o;f++)d.call(b?c.nodeName(this[f],"table")?this[f].getElementsByTagName("tbody")[0]||this[f].appendChild(this[f].ownerDocument.createElement("tbody")):
+this[f]:this[f],f>0||e.cacheable||this.length>1?h.cloneNode(true):h)}k.length&&c.each(k,Oa)}return this}});c.buildFragment=function(a,b,d){var e,f,h;b=b&&b[0]?b[0].ownerDocument||b[0]:t;if(a.length===1&&typeof a[0]==="string"&&a[0].length<512&&b===t&&!Ca.test(a[0])&&(c.support.checkClone||!Da.test(a[0]))){f=true;if(h=c.fragments[a[0]])if(h!==1)e=h}if(!e){e=b.createDocumentFragment();c.clean(a,b,e,d)}if(f)c.fragments[a[0]]=h?e:1;return{fragment:e,cacheable:f}};c.fragments={};c.each({appendTo:"append",
+prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){c.fn[a]=function(d){var e=[];d=c(d);var f=this.length===1&&this[0].parentNode;if(f&&f.nodeType===11&&f.childNodes.length===1&&d.length===1){d[b](this[0]);return this}else{f=0;for(var h=d.length;f<h;f++){var l=(f>0?this.clone(true):this).get();c(d[f])[b](l);e=e.concat(l)}return this.pushStack(e,a,d.selector)}}});c.extend({clean:function(a,b,d,e){b=b||t;if(typeof b.createElement==="undefined")b=b.ownerDocument||
+b[0]&&b[0].ownerDocument||t;for(var f=[],h=0,l;(l=a[h])!=null;h++){if(typeof l==="number")l+="";if(l){if(typeof l==="string"&&!eb.test(l))l=b.createTextNode(l);else if(typeof l==="string"){l=l.replace(Aa,"<$1></$2>");var k=(Ba.exec(l)||["",""])[1].toLowerCase(),o=P[k]||P._default,x=o[0],r=b.createElement("div");for(r.innerHTML=o[1]+l+o[2];x--;)r=r.lastChild;if(!c.support.tbody){x=db.test(l);k=k==="table"&&!x?r.firstChild&&r.firstChild.childNodes:o[1]==="<table>"&&!x?r.childNodes:[];for(o=k.length-
+1;o>=0;--o)c.nodeName(k[o],"tbody")&&!k[o].childNodes.length&&k[o].parentNode.removeChild(k[o])}!c.support.leadingWhitespace&&$.test(l)&&r.insertBefore(b.createTextNode($.exec(l)[0]),r.firstChild);l=r.childNodes}if(l.nodeType)f.push(l);else f=c.merge(f,l)}}if(d)for(h=0;f[h];h++)if(e&&c.nodeName(f[h],"script")&&(!f[h].type||f[h].type.toLowerCase()==="text/javascript"))e.push(f[h].parentNode?f[h].parentNode.removeChild(f[h]):f[h]);else{f[h].nodeType===1&&f.splice.apply(f,[h+1,0].concat(c.makeArray(f[h].getElementsByTagName("script"))));
+d.appendChild(f[h])}return f},cleanData:function(a){for(var b,d,e=c.cache,f=c.event.special,h=c.support.deleteExpando,l=0,k;(k=a[l])!=null;l++)if(!(k.nodeName&&c.noData[k.nodeName.toLowerCase()]))if(d=k[c.expando]){if((b=e[d])&&b.events)for(var o in b.events)f[o]?c.event.remove(k,o):c.removeEvent(k,o,b.handle);if(h)delete k[c.expando];else k.removeAttribute&&k.removeAttribute(c.expando);delete e[d]}}});var Ea=/alpha\([^)]*\)/i,gb=/opacity=([^)]*)/,hb=/-([a-z])/ig,ib=/([A-Z])/g,Fa=/^-?\d+(?:px)?$/i,
+jb=/^-?\d/,kb={position:"absolute",visibility:"hidden",display:"block"},Pa=["Left","Right"],Qa=["Top","Bottom"],W,Ga,aa,lb=function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){if(arguments.length===2&&b===B)return this;return c.access(this,a,b,true,function(d,e,f){return f!==B?c.style(d,e,f):c.css(d,e)})};c.extend({cssHooks:{opacity:{get:function(a,b){if(b){var d=W(a,"opacity","opacity");return d===""?"1":d}else return a.style.opacity}}},cssNumber:{zIndex:true,fontWeight:true,opacity:true,
+zoom:true,lineHeight:true},cssProps:{"float":c.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,b,d,e){if(!(!a||a.nodeType===3||a.nodeType===8||!a.style)){var f,h=c.camelCase(b),l=a.style,k=c.cssHooks[h];b=c.cssProps[h]||h;if(d!==B){if(!(typeof d==="number"&&isNaN(d)||d==null)){if(typeof d==="number"&&!c.cssNumber[h])d+="px";if(!k||!("set"in k)||(d=k.set(a,d))!==B)try{l[b]=d}catch(o){}}}else{if(k&&"get"in k&&(f=k.get(a,false,e))!==B)return f;return l[b]}}},css:function(a,b,d){var e,f=c.camelCase(b),
+h=c.cssHooks[f];b=c.cssProps[f]||f;if(h&&"get"in h&&(e=h.get(a,true,d))!==B)return e;else if(W)return W(a,b,f)},swap:function(a,b,d){var e={},f;for(f in b){e[f]=a.style[f];a.style[f]=b[f]}d.call(a);for(f in b)a.style[f]=e[f]},camelCase:function(a){return a.replace(hb,lb)}});c.curCSS=c.css;c.each(["height","width"],function(a,b){c.cssHooks[b]={get:function(d,e,f){var h;if(e){if(d.offsetWidth!==0)h=oa(d,b,f);else c.swap(d,kb,function(){h=oa(d,b,f)});if(h<=0){h=W(d,b,b);if(h==="0px"&&aa)h=aa(d,b,b);
+if(h!=null)return h===""||h==="auto"?"0px":h}if(h<0||h==null){h=d.style[b];return h===""||h==="auto"?"0px":h}return typeof h==="string"?h:h+"px"}},set:function(d,e){if(Fa.test(e)){e=parseFloat(e);if(e>=0)return e+"px"}else return e}}});if(!c.support.opacity)c.cssHooks.opacity={get:function(a,b){return gb.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var d=a.style;d.zoom=1;var e=c.isNaN(b)?"":"alpha(opacity="+b*100+")",f=
+d.filter||"";d.filter=Ea.test(f)?f.replace(Ea,e):d.filter+" "+e}};if(t.defaultView&&t.defaultView.getComputedStyle)Ga=function(a,b,d){var e;d=d.replace(ib,"-$1").toLowerCase();if(!(b=a.ownerDocument.defaultView))return B;if(b=b.getComputedStyle(a,null)){e=b.getPropertyValue(d);if(e===""&&!c.contains(a.ownerDocument.documentElement,a))e=c.style(a,d)}return e};if(t.documentElement.currentStyle)aa=function(a,b){var d,e,f=a.currentStyle&&a.currentStyle[b],h=a.style;if(!Fa.test(f)&&jb.test(f)){d=h.left;
+e=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;h.left=b==="fontSize"?"1em":f||0;f=h.pixelLeft+"px";h.left=d;a.runtimeStyle.left=e}return f===""?"auto":f};W=Ga||aa;if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b=a.offsetHeight;return a.offsetWidth===0&&b===0||!c.support.reliableHiddenOffsets&&(a.style.display||c.css(a,"display"))==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var mb=c.now(),nb=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
+ob=/^(?:select|textarea)/i,pb=/^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,qb=/^(?:GET|HEAD)$/,Ra=/\[\]$/,T=/\=\?(&|$)/,ja=/\?/,rb=/([?&])_=[^&]*/,sb=/^(\w+:)?\/\/([^\/?#]+)/,tb=/%20/g,ub=/#.*$/,Ha=c.fn.load;c.fn.extend({load:function(a,b,d){if(typeof a!=="string"&&Ha)return Ha.apply(this,arguments);else if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var f=a.slice(e,a.length);a=a.slice(0,e)}e="GET";if(b)if(c.isFunction(b)){d=b;b=null}else if(typeof b===
+"object"){b=c.param(b,c.ajaxSettings.traditional);e="POST"}var h=this;c.ajax({url:a,type:e,dataType:"html",data:b,complete:function(l,k){if(k==="success"||k==="notmodified")h.html(f?c("<div>").append(l.responseText.replace(nb,"")).find(f):l.responseText);d&&h.each(d,[l.responseText,k,l])}});return this},serialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?c.makeArray(this.elements):this}).filter(function(){return this.name&&
+!this.disabled&&(this.checked||ob.test(this.nodeName)||pb.test(this.type))}).map(function(a,b){var d=c(this).val();return d==null?null:c.isArray(d)?c.map(d,function(e){return{name:b.name,value:e}}):{name:b.name,value:d}}).get()}});c.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){c.fn[b]=function(d){return this.bind(b,d)}});c.extend({get:function(a,b,d,e){if(c.isFunction(b)){e=e||d;d=b;b=null}return c.ajax({type:"GET",url:a,data:b,success:d,dataType:e})},
+getScript:function(a,b){return c.get(a,null,b,"script")},getJSON:function(a,b,d){return c.get(a,b,d,"json")},post:function(a,b,d,e){if(c.isFunction(b)){e=e||d;d=b;b={}}return c.ajax({type:"POST",url:a,data:b,success:d,dataType:e})},ajaxSetup:function(a){c.extend(c.ajaxSettings,a)},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:function(){return new E.XMLHttpRequest},accepts:{xml:"application/xml, text/xml",html:"text/html",
+script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},ajax:function(a){var b=c.extend(true,{},c.ajaxSettings,a),d,e,f,h=b.type.toUpperCase(),l=qb.test(h);b.url=b.url.replace(ub,"");b.context=a&&a.context!=null?a.context:b;if(b.data&&b.processData&&typeof b.data!=="string")b.data=c.param(b.data,b.traditional);if(b.dataType==="jsonp"){if(h==="GET")T.test(b.url)||(b.url+=(ja.test(b.url)?"&":"?")+(b.jsonp||"callback")+"=?");else if(!b.data||
+!T.test(b.data))b.data=(b.data?b.data+"&":"")+(b.jsonp||"callback")+"=?";b.dataType="json"}if(b.dataType==="json"&&(b.data&&T.test(b.data)||T.test(b.url))){d=b.jsonpCallback||"jsonp"+mb++;if(b.data)b.data=(b.data+"").replace(T,"="+d+"$1");b.url=b.url.replace(T,"="+d+"$1");b.dataType="script";var k=E[d];E[d]=function(m){if(c.isFunction(k))k(m);else{E[d]=B;try{delete E[d]}catch(p){}}f=m;c.handleSuccess(b,w,e,f);c.handleComplete(b,w,e,f);r&&r.removeChild(A)}}if(b.dataType==="script"&&b.cache===null)b.cache=
+false;if(b.cache===false&&l){var o=c.now(),x=b.url.replace(rb,"$1_="+o);b.url=x+(x===b.url?(ja.test(b.url)?"&":"?")+"_="+o:"")}if(b.data&&l)b.url+=(ja.test(b.url)?"&":"?")+b.data;b.global&&c.active++===0&&c.event.trigger("ajaxStart");o=(o=sb.exec(b.url))&&(o[1]&&o[1].toLowerCase()!==location.protocol||o[2].toLowerCase()!==location.host);if(b.dataType==="script"&&h==="GET"&&o){var r=t.getElementsByTagName("head")[0]||t.documentElement,A=t.createElement("script");if(b.scriptCharset)A.charset=b.scriptCharset;
+A.src=b.url;if(!d){var C=false;A.onload=A.onreadystatechange=function(){if(!C&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){C=true;c.handleSuccess(b,w,e,f);c.handleComplete(b,w,e,f);A.onload=A.onreadystatechange=null;r&&A.parentNode&&r.removeChild(A)}}}r.insertBefore(A,r.firstChild);return B}var J=false,w=b.xhr();if(w){b.username?w.open(h,b.url,b.async,b.username,b.password):w.open(h,b.url,b.async);try{if(b.data!=null&&!l||a&&a.contentType)w.setRequestHeader("Content-Type",
+b.contentType);if(b.ifModified){c.lastModified[b.url]&&w.setRequestHeader("If-Modified-Since",c.lastModified[b.url]);c.etag[b.url]&&w.setRequestHeader("If-None-Match",c.etag[b.url])}o||w.setRequestHeader("X-Requested-With","XMLHttpRequest");w.setRequestHeader("Accept",b.dataType&&b.accepts[b.dataType]?b.accepts[b.dataType]+", */*; q=0.01":b.accepts._default)}catch(I){}if(b.beforeSend&&b.beforeSend.call(b.context,w,b)===false){b.global&&c.active--===1&&c.event.trigger("ajaxStop");w.abort();return false}b.global&&
+c.triggerGlobal(b,"ajaxSend",[w,b]);var L=w.onreadystatechange=function(m){if(!w||w.readyState===0||m==="abort"){J||c.handleComplete(b,w,e,f);J=true;if(w)w.onreadystatechange=c.noop}else if(!J&&w&&(w.readyState===4||m==="timeout")){J=true;w.onreadystatechange=c.noop;e=m==="timeout"?"timeout":!c.httpSuccess(w)?"error":b.ifModified&&c.httpNotModified(w,b.url)?"notmodified":"success";var p;if(e==="success")try{f=c.httpData(w,b.dataType,b)}catch(q){e="parsererror";p=q}if(e==="success"||e==="notmodified")d||
+c.handleSuccess(b,w,e,f);else c.handleError(b,w,e,p);d||c.handleComplete(b,w,e,f);m==="timeout"&&w.abort();if(b.async)w=null}};try{var g=w.abort;w.abort=function(){w&&Function.prototype.call.call(g,w);L("abort")}}catch(i){}b.async&&b.timeout>0&&setTimeout(function(){w&&!J&&L("timeout")},b.timeout);try{w.send(l||b.data==null?null:b.data)}catch(n){c.handleError(b,w,null,n);c.handleComplete(b,w,e,f)}b.async||L();return w}},param:function(a,b){var d=[],e=function(h,l){l=c.isFunction(l)?l():l;d[d.length]=
+encodeURIComponent(h)+"="+encodeURIComponent(l)};if(b===B)b=c.ajaxSettings.traditional;if(c.isArray(a)||a.jquery)c.each(a,function(){e(this.name,this.value)});else for(var f in a)da(f,a[f],b,e);return d.join("&").replace(tb,"+")}});c.extend({active:0,lastModified:{},etag:{},handleError:function(a,b,d,e){a.error&&a.error.call(a.context,b,d,e);a.global&&c.triggerGlobal(a,"ajaxError",[b,a,e])},handleSuccess:function(a,b,d,e){a.success&&a.success.call(a.context,e,d,b);a.global&&c.triggerGlobal(a,"ajaxSuccess",
+[b,a])},handleComplete:function(a,b,d){a.complete&&a.complete.call(a.context,b,d);a.global&&c.triggerGlobal(a,"ajaxComplete",[b,a]);a.global&&c.active--===1&&c.event.trigger("ajaxStop")},triggerGlobal:function(a,b,d){(a.context&&a.context.url==null?c(a.context):c.event).trigger(b,d)},httpSuccess:function(a){try{return!a.status&&location.protocol==="file:"||a.status>=200&&a.status<300||a.status===304||a.status===1223}catch(b){}return false},httpNotModified:function(a,b){var d=a.getResponseHeader("Last-Modified"),
+e=a.getResponseHeader("Etag");if(d)c.lastModified[b]=d;if(e)c.etag[b]=e;return a.status===304},httpData:function(a,b,d){var e=a.getResponseHeader("content-type")||"",f=b==="xml"||!b&&e.indexOf("xml")>=0;a=f?a.responseXML:a.responseText;f&&a.documentElement.nodeName==="parsererror"&&c.error("parsererror");if(d&&d.dataFilter)a=d.dataFilter(a,b);if(typeof a==="string")if(b==="json"||!b&&e.indexOf("json")>=0)a=c.parseJSON(a);else if(b==="script"||!b&&e.indexOf("javascript")>=0)c.globalEval(a);return a}});
+if(E.ActiveXObject)c.ajaxSettings.xhr=function(){if(E.location.protocol!=="file:")try{return new E.XMLHttpRequest}catch(a){}try{return new E.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}};c.support.ajax=!!c.ajaxSettings.xhr();var ea={},vb=/^(?:toggle|show|hide)$/,wb=/^([+\-]=)?([\d+.\-]+)(.*)$/,ba,pa=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];c.fn.extend({show:function(a,b,d){if(a||a===0)return this.animate(S("show",
+3),a,b,d);else{d=0;for(var e=this.length;d<e;d++){a=this[d];b=a.style.display;if(!c.data(a,"olddisplay")&&b==="none")b=a.style.display="";b===""&&c.css(a,"display")==="none"&&c.data(a,"olddisplay",qa(a.nodeName))}for(d=0;d<e;d++){a=this[d];b=a.style.display;if(b===""||b==="none")a.style.display=c.data(a,"olddisplay")||""}return this}},hide:function(a,b,d){if(a||a===0)return this.animate(S("hide",3),a,b,d);else{a=0;for(b=this.length;a<b;a++){d=c.css(this[a],"display");d!=="none"&&c.data(this[a],"olddisplay",
+d)}for(a=0;a<b;a++)this[a].style.display="none";return this}},_toggle:c.fn.toggle,toggle:function(a,b,d){var e=typeof a==="boolean";if(c.isFunction(a)&&c.isFunction(b))this._toggle.apply(this,arguments);else a==null||e?this.each(function(){var f=e?a:c(this).is(":hidden");c(this)[f?"show":"hide"]()}):this.animate(S("toggle",3),a,b,d);return this},fadeTo:function(a,b,d,e){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,d,e)},animate:function(a,b,d,e){var f=c.speed(b,
+d,e);if(c.isEmptyObject(a))return this.each(f.complete);return this[f.queue===false?"each":"queue"](function(){var h=c.extend({},f),l,k=this.nodeType===1,o=k&&c(this).is(":hidden"),x=this;for(l in a){var r=c.camelCase(l);if(l!==r){a[r]=a[l];delete a[l];l=r}if(a[l]==="hide"&&o||a[l]==="show"&&!o)return h.complete.call(this);if(k&&(l==="height"||l==="width")){h.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY];if(c.css(this,"display")==="inline"&&c.css(this,"float")==="none")if(c.support.inlineBlockNeedsLayout)if(qa(this.nodeName)===
+"inline")this.style.display="inline-block";else{this.style.display="inline";this.style.zoom=1}else this.style.display="inline-block"}if(c.isArray(a[l])){(h.specialEasing=h.specialEasing||{})[l]=a[l][1];a[l]=a[l][0]}}if(h.overflow!=null)this.style.overflow="hidden";h.curAnim=c.extend({},a);c.each(a,function(A,C){var J=new c.fx(x,h,A);if(vb.test(C))J[C==="toggle"?o?"show":"hide":C](a);else{var w=wb.exec(C),I=J.cur()||0;if(w){var L=parseFloat(w[2]),g=w[3]||"px";if(g!=="px"){c.style(x,A,(L||1)+g);I=(L||
+1)/J.cur()*I;c.style(x,A,I+g)}if(w[1])L=(w[1]==="-="?-1:1)*L+I;J.custom(I,L,g)}else J.custom(I,C,"")}});return true})},stop:function(a,b){var d=c.timers;a&&this.queue([]);this.each(function(){for(var e=d.length-1;e>=0;e--)if(d[e].elem===this){b&&d[e](true);d.splice(e,1)}});b||this.dequeue();return this}});c.each({slideDown:S("show",1),slideUp:S("hide",1),slideToggle:S("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){c.fn[a]=function(d,e,f){return this.animate(b,
+d,e,f)}});c.extend({speed:function(a,b,d){var e=a&&typeof a==="object"?c.extend({},a):{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};e.duration=c.fx.off?0:typeof e.duration==="number"?e.duration:e.duration in c.fx.speeds?c.fx.speeds[e.duration]:c.fx.speeds._default;e.old=e.complete;e.complete=function(){e.queue!==false&&c(this).dequeue();c.isFunction(e.old)&&e.old.call(this)};return e},easing:{linear:function(a,b,d,e){return d+e*a},swing:function(a,b,d,e){return(-Math.cos(a*
+Math.PI)/2+0.5)*e+d}},timers:[],fx:function(a,b,d){this.options=b;this.elem=a;this.prop=d;if(!b.orig)b.orig={}}});c.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this);(c.fx.step[this.prop]||c.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a=parseFloat(c.css(this.elem,this.prop));return a&&a>-1E4?a:0},custom:function(a,b,d){function e(l){return f.step(l)}
+var f=this,h=c.fx;this.startTime=c.now();this.start=a;this.end=b;this.unit=d||this.unit||"px";this.now=this.start;this.pos=this.state=0;e.elem=this.elem;if(e()&&c.timers.push(e)&&!ba)ba=setInterval(h.tick,h.interval)},show:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur());c(this.elem).show()},hide:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.hide=true;
+this.custom(this.cur(),0)},step:function(a){var b=c.now(),d=true;if(a||b>=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var e in this.options.curAnim)if(this.options.curAnim[e]!==true)d=false;if(d){if(this.options.overflow!=null&&!c.support.shrinkWrapBlocks){var f=this.elem,h=this.options;c.each(["","X","Y"],function(k,o){f.style["overflow"+o]=h.overflow[k]})}this.options.hide&&c(this.elem).hide();if(this.options.hide||
+this.options.show)for(var l in this.options.curAnim)c.style(this.elem,l,this.options.orig[l]);this.options.complete.call(this.elem)}return false}else{a=b-this.startTime;this.state=a/this.options.duration;b=this.options.easing||(c.easing.swing?"swing":"linear");this.pos=c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||b](this.state,a,0,1,this.options.duration);this.now=this.start+(this.end-this.start)*this.pos;this.update()}return true}};c.extend(c.fx,{tick:function(){for(var a=
+c.timers,b=0;b<a.length;b++)a[b]()||a.splice(b--,1);a.length||c.fx.stop()},interval:13,stop:function(){clearInterval(ba);ba=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){c.style(a.elem,"opacity",a.now)},_default:function(a){if(a.elem.style&&a.elem.style[a.prop]!=null)a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit;else a.elem[a.prop]=a.now}}});if(c.expr&&c.expr.filters)c.expr.filters.animated=function(a){return c.grep(c.timers,function(b){return a===
+b.elem}).length};var xb=/^t(?:able|d|h)$/i,Ia=/^(?:body|html)$/i;c.fn.offset="getBoundingClientRect"in t.documentElement?function(a){var b=this[0],d;if(a)return this.each(function(l){c.offset.setOffset(this,a,l)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);try{d=b.getBoundingClientRect()}catch(e){}var f=b.ownerDocument,h=f.documentElement;if(!d||!c.contains(h,b))return d||{top:0,left:0};b=f.body;f=fa(f);return{top:d.top+(f.pageYOffset||c.support.boxModel&&
+h.scrollTop||b.scrollTop)-(h.clientTop||b.clientTop||0),left:d.left+(f.pageXOffset||c.support.boxModel&&h.scrollLeft||b.scrollLeft)-(h.clientLeft||b.clientLeft||0)}}:function(a){var b=this[0];if(a)return this.each(function(x){c.offset.setOffset(this,a,x)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);c.offset.initialize();var d,e=b.offsetParent,f=b.ownerDocument,h=f.documentElement,l=f.body;d=(f=f.defaultView)?f.getComputedStyle(b,null):b.currentStyle;
+for(var k=b.offsetTop,o=b.offsetLeft;(b=b.parentNode)&&b!==l&&b!==h;){if(c.offset.supportsFixedPosition&&d.position==="fixed")break;d=f?f.getComputedStyle(b,null):b.currentStyle;k-=b.scrollTop;o-=b.scrollLeft;if(b===e){k+=b.offsetTop;o+=b.offsetLeft;if(c.offset.doesNotAddBorder&&!(c.offset.doesAddBorderForTableAndCells&&xb.test(b.nodeName))){k+=parseFloat(d.borderTopWidth)||0;o+=parseFloat(d.borderLeftWidth)||0}e=b.offsetParent}if(c.offset.subtractsBorderForOverflowNotVisible&&d.overflow!=="visible"){k+=
+parseFloat(d.borderTopWidth)||0;o+=parseFloat(d.borderLeftWidth)||0}d=d}if(d.position==="relative"||d.position==="static"){k+=l.offsetTop;o+=l.offsetLeft}if(c.offset.supportsFixedPosition&&d.position==="fixed"){k+=Math.max(h.scrollTop,l.scrollTop);o+=Math.max(h.scrollLeft,l.scrollLeft)}return{top:k,left:o}};c.offset={initialize:function(){var a=t.body,b=t.createElement("div"),d,e,f,h=parseFloat(c.css(a,"marginTop"))||0;c.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",
+height:"1px",visibility:"hidden"});b.innerHTML="<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";a.insertBefore(b,a.firstChild);d=b.firstChild;e=d.firstChild;f=d.nextSibling.firstChild.firstChild;this.doesNotAddBorder=e.offsetTop!==5;this.doesAddBorderForTableAndCells=
+f.offsetTop===5;e.style.position="fixed";e.style.top="20px";this.supportsFixedPosition=e.offsetTop===20||e.offsetTop===15;e.style.position=e.style.top="";d.style.overflow="hidden";d.style.position="relative";this.subtractsBorderForOverflowNotVisible=e.offsetTop===-5;this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==h;a.removeChild(b);c.offset.initialize=c.noop},bodyOffset:function(a){var b=a.offsetTop,d=a.offsetLeft;c.offset.initialize();if(c.offset.doesNotIncludeMarginInBodyOffset){b+=parseFloat(c.css(a,
+"marginTop"))||0;d+=parseFloat(c.css(a,"marginLeft"))||0}return{top:b,left:d}},setOffset:function(a,b,d){var e=c.css(a,"position");if(e==="static")a.style.position="relative";var f=c(a),h=f.offset(),l=c.css(a,"top"),k=c.css(a,"left"),o=e==="absolute"&&c.inArray("auto",[l,k])>-1;e={};var x={};if(o)x=f.position();l=o?x.top:parseInt(l,10)||0;k=o?x.left:parseInt(k,10)||0;if(c.isFunction(b))b=b.call(a,d,h);if(b.top!=null)e.top=b.top-h.top+l;if(b.left!=null)e.left=b.left-h.left+k;"using"in b?b.using.call(a,
+e):f.css(e)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),e=Ia.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.css(a,"marginTop"))||0;d.left-=parseFloat(c.css(a,"marginLeft"))||0;e.top+=parseFloat(c.css(b[0],"borderTopWidth"))||0;e.left+=parseFloat(c.css(b[0],"borderLeftWidth"))||0;return{top:d.top-e.top,left:d.left-e.left}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||t.body;a&&!Ia.test(a.nodeName)&&
+c.css(a,"position")==="static";)a=a.offsetParent;return a})}});c.each(["Left","Top"],function(a,b){var d="scroll"+b;c.fn[d]=function(e){var f=this[0],h;if(!f)return null;if(e!==B)return this.each(function(){if(h=fa(this))h.scrollTo(!a?e:c(h).scrollLeft(),a?e:c(h).scrollTop());else this[d]=e});else return(h=fa(f))?"pageXOffset"in h?h[a?"pageYOffset":"pageXOffset"]:c.support.boxModel&&h.document.documentElement[d]||h.document.body[d]:f[d]}});c.each(["Height","Width"],function(a,b){var d=b.toLowerCase();
+c.fn["inner"+b]=function(){return this[0]?parseFloat(c.css(this[0],d,"padding")):null};c.fn["outer"+b]=function(e){return this[0]?parseFloat(c.css(this[0],d,e?"margin":"border")):null};c.fn[d]=function(e){var f=this[0];if(!f)return e==null?null:this;if(c.isFunction(e))return this.each(function(l){var k=c(this);k[d](e.call(this,l,k[d]()))});if(c.isWindow(f))return f.document.compatMode==="CSS1Compat"&&f.document.documentElement["client"+b]||f.document.body["client"+b];else if(f.nodeType===9)return Math.max(f.documentElement["client"+
+b],f.body["scroll"+b],f.documentElement["scroll"+b],f.body["offset"+b],f.documentElement["offset"+b]);else if(e===B){f=c.css(f,d);var h=parseFloat(f);return c.isNaN(h)?f:h}else return this.css(d,typeof e==="string"?e:e+"px")}})})(window);
--- /dev/null
+\feff/*!
+ * jQuery blockUI plugin
+ * Version 2.37 (29-JAN-2011)
+ * @requires jQuery v1.2.3 or later
+ *
+ * Examples at: http://malsup.com/jquery/block/
+ * Copyright (c) 2007-2010 M. Alsup
+ * Dual licensed under the MIT and GPL licenses:
+ * http://www.opensource.org/licenses/mit-license.php
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * Thanks to Amir-Hossein Sobhi for some excellent contributions!
+ */
+
+;(function($) {
+
+if (/1\.(0|1|2)\.(0|1|2)/.test($.fn.jquery) || /^1.1/.test($.fn.jquery)) {
+ alert('blockUI requires jQuery v1.2.3 or later! You are using v' + $.fn.jquery);
+ return;
+}
+
+$.fn._fadeIn = $.fn.fadeIn;
+
+var noOp = function() {};
+
+// this bit is to ensure we don't call setExpression when we shouldn't (with extra muscle to handle
+// retarded userAgent strings on Vista)
+var mode = document.documentMode || 0;
+var setExpr = $.browser.msie && (($.browser.version < 8 && !mode) || mode < 8);
+var ie6 = $.browser.msie && /MSIE 6.0/.test(navigator.userAgent) && !mode;
+
+// global $ methods for blocking/unblocking the entire page
+$.blockUI = function(opts) { install(window, opts); };
+$.unblockUI = function(opts) { remove(window, opts); };
+
+// convenience method for quick growl-like notifications (http://www.google.com/search?q=growl)
+$.growlUI = function(title, message, timeout, onClose) {
+ var $m = $('<div class="growlUI"></div>');
+ if (title) $m.append('<h1>'+title+'</h1>');
+ if (message) $m.append('<h2>'+message+'</h2>');
+ if (timeout == undefined) timeout = 3000;
+ $.blockUI({
+ message: $m, fadeIn: 700, fadeOut: 1000, centerY: false,
+ timeout: timeout, showOverlay: false,
+ onUnblock: onClose,
+ css: $.blockUI.defaults.growlCSS
+ });
+};
+
+// plugin method for blocking element content
+$.fn.block = function(opts) {
+ return this.unblock({ fadeOut: 0 }).each(function() {
+ if ($.css(this,'position') == 'static')
+ this.style.position = 'relative';
+ if ($.browser.msie)
+ this.style.zoom = 1; // force 'hasLayout'
+ install(this, opts);
+ });
+};
+
+// plugin method for unblocking element content
+$.fn.unblock = function(opts) {
+ return this.each(function() {
+ remove(this, opts);
+ });
+};
+
+$.blockUI.version = 2.37; // 2nd generation blocking at no extra cost!
+
+// override these in your code to change the default behavior and style
+$.blockUI.defaults = {
+ // message displayed when blocking (use null for no message)
+ message: '<h1>Please wait...</h1>',
+
+ title: null, // title string; only used when theme == true
+ draggable: true, // only used when theme == true (requires jquery-ui.js to be loaded)
+
+ theme: false, // set to true to use with jQuery UI themes
+
+ // styles for the message when blocking; if you wish to disable
+ // these and use an external stylesheet then do this in your code:
+ // $.blockUI.defaults.css = {};
+ css: {
+ padding: 0,
+ margin: 0,
+ width: '30%',
+ top: '40%',
+ left: '35%',
+ textAlign: 'center',
+ color: '#000',
+ border: '3px solid #aaa',
+ backgroundColor:'#fff',
+ cursor: 'wait'
+ },
+
+ // minimal style set used when themes are used
+ themedCSS: {
+ width: '30%',
+ top: '40%',
+ left: '35%'
+ },
+
+ // styles for the overlay
+ overlayCSS: {
+ backgroundColor: '#000',
+ opacity: 0.6,
+ cursor: 'wait'
+ },
+
+ // styles applied when using $.growlUI
+ growlCSS: {
+ width: '350px',
+ top: '10px',
+ left: '',
+ right: '10px',
+ border: 'none',
+ padding: '5px',
+ opacity: 0.6,
+ cursor: 'default',
+ color: '#fff',
+ backgroundColor: '#000',
+ '-webkit-border-radius': '10px',
+ '-moz-border-radius': '10px',
+ 'border-radius': '10px'
+ },
+
+ // IE issues: 'about:blank' fails on HTTPS and javascript:false is s-l-o-w
+ // (hat tip to Jorge H. N. de Vasconcelos)
+ iframeSrc: /^https/i.test(window.location.href || '') ? 'javascript:false' : 'about:blank',
+
+ // force usage of iframe in non-IE browsers (handy for blocking applets)
+ forceIframe: false,
+
+ // z-index for the blocking overlay
+ baseZ: 1000,
+
+ // set these to true to have the message automatically centered
+ centerX: true, // <-- only effects element blocking (page block controlled via css above)
+ centerY: true,
+
+ // allow body element to be stetched in ie6; this makes blocking look better
+ // on "short" pages. disable if you wish to prevent changes to the body height
+ allowBodyStretch: true,
+
+ // enable if you want key and mouse events to be disabled for content that is blocked
+ bindEvents: true,
+
+ // be default blockUI will supress tab navigation from leaving blocking content
+ // (if bindEvents is true)
+ constrainTabKey: true,
+
+ // fadeIn time in millis; set to 0 to disable fadeIn on block
+ fadeIn: 200,
+
+ // fadeOut time in millis; set to 0 to disable fadeOut on unblock
+ fadeOut: 400,
+
+ // time in millis to wait before auto-unblocking; set to 0 to disable auto-unblock
+ timeout: 0,
+
+ // disable if you don't want to show the overlay
+ showOverlay: true,
+
+ // if true, focus will be placed in the first available input field when
+ // page blocking
+ focusInput: true,
+
+ // suppresses the use of overlay styles on FF/Linux (due to performance issues with opacity)
+ applyPlatformOpacityRules: true,
+
+ // callback method invoked when fadeIn has completed and blocking message is visible
+ onBlock: null,
+
+ // callback method invoked when unblocking has completed; the callback is
+ // passed the element that has been unblocked (which is the window object for page
+ // blocks) and the options that were passed to the unblock call:
+ // onUnblock(element, options)
+ onUnblock: null,
+
+ // don't ask; if you really must know: http://groups.google.com/group/jquery-en/browse_thread/thread/36640a8730503595/2f6a79a77a78e493#2f6a79a77a78e493
+ quirksmodeOffsetHack: 4,
+
+ // class name of the message block
+ blockMsgClass: 'blockMsg'
+};
+
+// private data and functions follow...
+
+var pageBlock = null;
+var pageBlockEls = [];
+
+function install(el, opts) {
+ var full = (el == window);
+ var msg = opts && opts.message !== undefined ? opts.message : undefined;
+ opts = $.extend({}, $.blockUI.defaults, opts || {});
+ opts.overlayCSS = $.extend({}, $.blockUI.defaults.overlayCSS, opts.overlayCSS || {});
+ var css = $.extend({}, $.blockUI.defaults.css, opts.css || {});
+ var themedCSS = $.extend({}, $.blockUI.defaults.themedCSS, opts.themedCSS || {});
+ msg = msg === undefined ? opts.message : msg;
+
+ // remove the current block (if there is one)
+ if (full && pageBlock)
+ remove(window, {fadeOut:0});
+
+ // if an existing element is being used as the blocking content then we capture
+ // its current place in the DOM (and current display style) so we can restore
+ // it when we unblock
+ if (msg && typeof msg != 'string' && (msg.parentNode || msg.jquery)) {
+ var node = msg.jquery ? msg[0] : msg;
+ var data = {};
+ $(el).data('blockUI.history', data);
+ data.el = node;
+ data.parent = node.parentNode;
+ data.display = node.style.display;
+ data.position = node.style.position;
+ if (data.parent)
+ data.parent.removeChild(node);
+ }
+
+ var z = opts.baseZ;
+
+ // blockUI uses 3 layers for blocking, for simplicity they are all used on every platform;
+ // layer1 is the iframe layer which is used to supress bleed through of underlying content
+ // layer2 is the overlay layer which has opacity and a wait cursor (by default)
+ // layer3 is the message content that is displayed while blocking
+
+ var lyr1 = ($.browser.msie || opts.forceIframe)
+ ? $('<iframe class="blockUI" style="z-index:'+ (z++) +';display:none;border:none;margin:0;padding:0;position:absolute;width:100%;height:100%;top:0;left:0" src="'+opts.iframeSrc+'"></iframe>')
+ : $('<div class="blockUI" style="display:none"></div>');
+ var lyr2 = $('<div class="blockUI blockOverlay" style="z-index:'+ (z++) +';display:none;border:none;margin:0;padding:0;width:100%;height:100%;top:0;left:0"></div>');
+
+ var lyr3, s;
+ if (opts.theme && full) {
+ s = '<div class="blockUI ' + opts.blockMsgClass + ' blockPage ui-dialog ui-widget ui-corner-all" style="z-index:'+z+';display:none;position:fixed">' +
+ '<div class="ui-widget-header ui-dialog-titlebar ui-corner-all blockTitle">'+(opts.title || ' ')+'</div>' +
+ '<div class="ui-widget-content ui-dialog-content"></div>' +
+ '</div>';
+ }
+ else if (opts.theme) {
+ s = '<div class="blockUI ' + opts.blockMsgClass + ' blockElement ui-dialog ui-widget ui-corner-all" style="z-index:'+z+';display:none;position:absolute">' +
+ '<div class="ui-widget-header ui-dialog-titlebar ui-corner-all blockTitle">'+(opts.title || ' ')+'</div>' +
+ '<div class="ui-widget-content ui-dialog-content"></div>' +
+ '</div>';
+ }
+ else if (full) {
+ s = '<div class="blockUI ' + opts.blockMsgClass + ' blockPage" style="z-index:'+z+';display:none;position:fixed"></div>';
+ }
+ else {
+ s = '<div class="blockUI ' + opts.blockMsgClass + ' blockElement" style="z-index:'+z+';display:none;position:absolute"></div>';
+ }
+ lyr3 = $(s);
+
+ // if we have a message, style it
+ if (msg) {
+ if (opts.theme) {
+ lyr3.css(themedCSS);
+ lyr3.addClass('ui-widget-content');
+ }
+ else
+ lyr3.css(css);
+ }
+
+ // style the overlay
+ if (!opts.applyPlatformOpacityRules || !($.browser.mozilla && /Linux/.test(navigator.platform)))
+ lyr2.css(opts.overlayCSS);
+ lyr2.css('position', full ? 'fixed' : 'absolute');
+
+ // make iframe layer transparent in IE
+ if ($.browser.msie || opts.forceIframe)
+ lyr1.css('opacity',0.0);
+
+ //$([lyr1[0],lyr2[0],lyr3[0]]).appendTo(full ? 'body' : el);
+ var layers = [lyr1,lyr2,lyr3], $par = full ? $('body') : $(el);
+ $.each(layers, function() {
+ this.appendTo($par);
+ });
+
+ if (opts.theme && opts.draggable && $.fn.draggable) {
+ lyr3.draggable({
+ handle: '.ui-dialog-titlebar',
+ cancel: 'li'
+ });
+ }
+
+ // ie7 must use absolute positioning in quirks mode and to account for activex issues (when scrolling)
+ var expr = setExpr && (!$.boxModel || $('object,embed', full ? null : el).length > 0);
+ if (ie6 || expr) {
+ // give body 100% height
+ if (full && opts.allowBodyStretch && $.boxModel)
+ $('html,body').css('height','100%');
+
+ // fix ie6 issue when blocked element has a border width
+ if ((ie6 || !$.boxModel) && !full) {
+ var t = sz(el,'borderTopWidth'), l = sz(el,'borderLeftWidth');
+ var fixT = t ? '(0 - '+t+')' : 0;
+ var fixL = l ? '(0 - '+l+')' : 0;
+ }
+
+ // simulate fixed position
+ $.each([lyr1,lyr2,lyr3], function(i,o) {
+ var s = o[0].style;
+ s.position = 'absolute';
+ if (i < 2) {
+ full ? s.setExpression('height','Math.max(document.body.scrollHeight, document.body.offsetHeight) - (jQuery.boxModel?0:'+opts.quirksmodeOffsetHack+') + "px"')
+ : s.setExpression('height','this.parentNode.offsetHeight + "px"');
+ full ? s.setExpression('width','jQuery.boxModel && document.documentElement.clientWidth || document.body.clientWidth + "px"')
+ : s.setExpression('width','this.parentNode.offsetWidth + "px"');
+ if (fixL) s.setExpression('left', fixL);
+ if (fixT) s.setExpression('top', fixT);
+ }
+ else if (opts.centerY) {
+ if (full) s.setExpression('top','(document.documentElement.clientHeight || document.body.clientHeight) / 2 - (this.offsetHeight / 2) + (blah = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop) + "px"');
+ s.marginTop = 0;
+ }
+ else if (!opts.centerY && full) {
+ var top = (opts.css && opts.css.top) ? parseInt(opts.css.top) : 0;
+ var expression = '((document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop) + '+top+') + "px"';
+ s.setExpression('top',expression);
+ }
+ });
+ }
+
+ // show the message
+ if (msg) {
+ if (opts.theme)
+ lyr3.find('.ui-widget-content').append(msg);
+ else
+ lyr3.append(msg);
+ if (msg.jquery || msg.nodeType)
+ $(msg).show();
+ }
+
+ if (($.browser.msie || opts.forceIframe) && opts.showOverlay)
+ lyr1.show(); // opacity is zero
+ if (opts.fadeIn) {
+ var cb = opts.onBlock ? opts.onBlock : noOp;
+ var cb1 = (opts.showOverlay && !msg) ? cb : noOp;
+ var cb2 = msg ? cb : noOp;
+ if (opts.showOverlay)
+ lyr2._fadeIn(opts.fadeIn, cb1);
+ if (msg)
+ lyr3._fadeIn(opts.fadeIn, cb2);
+ }
+ else {
+ if (opts.showOverlay)
+ lyr2.show();
+ if (msg)
+ lyr3.show();
+ if (opts.onBlock)
+ opts.onBlock();
+ }
+
+ // bind key and mouse events
+ bind(1, el, opts);
+
+ if (full) {
+ pageBlock = lyr3[0];
+ pageBlockEls = $(':input:enabled:visible',pageBlock);
+ if (opts.focusInput)
+ setTimeout(focus, 20);
+ }
+ else
+ center(lyr3[0], opts.centerX, opts.centerY);
+
+ if (opts.timeout) {
+ // auto-unblock
+ var to = setTimeout(function() {
+ full ? $.unblockUI(opts) : $(el).unblock(opts);
+ }, opts.timeout);
+ $(el).data('blockUI.timeout', to);
+ }
+};
+
+// remove the block
+function remove(el, opts) {
+ var full = (el == window);
+ var $el = $(el);
+ var data = $el.data('blockUI.history');
+ var to = $el.data('blockUI.timeout');
+ if (to) {
+ clearTimeout(to);
+ $el.removeData('blockUI.timeout');
+ }
+ opts = $.extend({}, $.blockUI.defaults, opts || {});
+ bind(0, el, opts); // unbind events
+
+ var els;
+ if (full) // crazy selector to handle odd field errors in ie6/7
+ els = $('body').children().filter('.blockUI').add('body > .blockUI');
+ else
+ els = $('.blockUI', el);
+
+ if (full)
+ pageBlock = pageBlockEls = null;
+
+ if (opts.fadeOut) {
+ els.fadeOut(opts.fadeOut);
+ setTimeout(function() { reset(els,data,opts,el); }, opts.fadeOut);
+ }
+ else
+ reset(els, data, opts, el);
+};
+
+// move blocking element back into the DOM where it started
+function reset(els,data,opts,el) {
+ els.each(function(i,o) {
+ // remove via DOM calls so we don't lose event handlers
+ if (this.parentNode)
+ this.parentNode.removeChild(this);
+ });
+
+ if (data && data.el) {
+ data.el.style.display = data.display;
+ data.el.style.position = data.position;
+ if (data.parent)
+ data.parent.appendChild(data.el);
+ $(el).removeData('blockUI.history');
+ }
+
+ if (typeof opts.onUnblock == 'function')
+ opts.onUnblock(el,opts);
+};
+
+// bind/unbind the handler
+function bind(b, el, opts) {
+ var full = el == window, $el = $(el);
+
+ // don't bother unbinding if there is nothing to unbind
+ if (!b && (full && !pageBlock || !full && !$el.data('blockUI.isBlocked')))
+ return;
+ if (!full)
+ $el.data('blockUI.isBlocked', b);
+
+ // don't bind events when overlay is not in use or if bindEvents is false
+ if (!opts.bindEvents || (b && !opts.showOverlay))
+ return;
+
+ // bind anchors and inputs for mouse and key events
+ var events = 'mousedown mouseup keydown keypress';
+ b ? $(document).bind(events, opts, handler) : $(document).unbind(events, handler);
+
+// former impl...
+// var $e = $('a,:input');
+// b ? $e.bind(events, opts, handler) : $e.unbind(events, handler);
+};
+
+// event handler to suppress keyboard/mouse events when blocking
+function handler(e) {
+ // allow tab navigation (conditionally)
+ if (e.keyCode && e.keyCode == 9) {
+ if (pageBlock && e.data.constrainTabKey) {
+ var els = pageBlockEls;
+ var fwd = !e.shiftKey && e.target === els[els.length-1];
+ var back = e.shiftKey && e.target === els[0];
+ if (fwd || back) {
+ setTimeout(function(){focus(back)},10);
+ return false;
+ }
+ }
+ }
+ var opts = e.data;
+ // allow events within the message content
+ if ($(e.target).parents('div.' + opts.blockMsgClass).length > 0)
+ return true;
+
+ // allow events for content that is not being blocked
+ return $(e.target).parents().children().filter('div.blockUI').length == 0;
+};
+
+function focus(back) {
+ if (!pageBlockEls)
+ return;
+ var e = pageBlockEls[back===true ? pageBlockEls.length-1 : 0];
+ if (e)
+ e.focus();
+};
+
+function center(el, x, y) {
+ var p = el.parentNode, s = el.style;
+ var l = ((p.offsetWidth - el.offsetWidth)/2) - sz(p,'borderLeftWidth');
+ var t = ((p.offsetHeight - el.offsetHeight)/2) - sz(p,'borderTopWidth');
+ if (x) s.left = l > 0 ? (l+'px') : '0';
+ if (y) s.top = t > 0 ? (t+'px') : '0';
+};
+
+function sz(el, p) {
+ return parseInt($.css(el,p))||0;
+};
+
+})(jQuery);
--- /dev/null
+\feff/*
+ *
+ * jQuery Timer plugin v0.1
+ * Matt Schmidt [http://www.mattptr.net]
+ *
+ * Licensed under the BSD License:
+ * http://mattptr.net/license/license.txt
+ *
+ */
+
+ jQuery.timer = function (interval, callback)
+ {
+ /**
+ *
+ * timer() provides a cleaner way to handle intervals
+ *
+ * @usage
+ * $.timer(interval, callback);
+ *
+ *
+ * @example
+ * $.timer(1000, function (timer) {
+ * alert("hello");
+ * timer.stop();
+ * });
+ * @desc Show an alert box after 1 second and stop
+ *
+ * @example
+ * var second = false;
+ * $.timer(1000, function (timer) {
+ * if (!second) {
+ * alert('First time!');
+ * second = true;
+ * timer.reset(3000);
+ * }
+ * else {
+ * alert('Second time');
+ * timer.stop();
+ * }
+ * });
+ * @desc Show an alert box after 1 second and show another after 3 seconds
+ *
+ *
+ */
+
+ var interval = interval || 100;
+
+ if (!callback)
+ return false;
+
+ _timer = function (interval, callback) {
+ this.stop = function () {
+ clearInterval(self.id);
+ };
+
+ this.internalCallback = function () {
+ callback(self);
+ };
+
+ this.reset = function (val) {
+ if (self.id)
+ clearInterval(self.id);
+
+ var val = val || 100;
+ this.id = setInterval(this.internalCallback, val);
+ };
+
+ this.interval = interval;
+ this.id = setInterval(this.internalCallback, this.interval);
+
+ var self = this;
+ };
+
+ return new _timer(interval, callback);
+ };
\ No newline at end of file
--- /dev/null
+/**
+ * Copyright 2010 Tim Down.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+var Hashtable=(function(){var p="function";var n=(typeof Array.prototype.splice==p)?function(s,r){s.splice(r,1)}:function(u,t){var s,v,r;if(t===u.length-1){u.length=t}else{s=u.slice(t+1);u.length=t;for(v=0,r=s.length;v<r;++v){u[t+v]=s[v]}}};function a(t){var r;if(typeof t=="string"){return t}else{if(typeof t.hashCode==p){r=t.hashCode();return(typeof r=="string")?r:a(r)}else{if(typeof t.toString==p){return t.toString()}else{try{return String(t)}catch(s){return Object.prototype.toString.call(t)}}}}}function g(r,s){return r.equals(s)}function e(r,s){return(typeof s.equals==p)?s.equals(r):(r===s)}function c(r){return function(s){if(s===null){throw new Error("null is not a valid "+r)}else{if(typeof s=="undefined"){throw new Error(r+" must not be undefined")}}}}var q=c("key"),l=c("value");function d(u,s,t,r){this[0]=u;this.entries=[];this.addEntry(s,t);if(r!==null){this.getEqualityFunction=function(){return r}}}var h=0,j=1,f=2;function o(r){return function(t){var s=this.entries.length,v,u=this.getEqualityFunction(t);while(s--){v=this.entries[s];if(u(t,v[0])){switch(r){case h:return true;case j:return v;case f:return[s,v[1]]}}}return false}}function k(r){return function(u){var v=u.length;for(var t=0,s=this.entries.length;t<s;++t){u[v+t]=this.entries[t][r]}}}d.prototype={getEqualityFunction:function(r){return(typeof r.equals==p)?g:e},getEntryForKey:o(j),getEntryAndIndexForKey:o(f),removeEntryForKey:function(s){var r=this.getEntryAndIndexForKey(s);if(r){n(this.entries,r[0]);return r[1]}return null},addEntry:function(r,s){this.entries[this.entries.length]=[r,s]},keys:k(0),values:k(1),getEntries:function(s){var u=s.length;for(var t=0,r=this.entries.length;t<r;++t){s[u+t]=this.entries[t].slice(0)}},containsKey:o(h),containsValue:function(s){var r=this.entries.length;while(r--){if(s===this.entries[r][1]){return true}}return false}};function m(s,t){var r=s.length,u;while(r--){u=s[r];if(t===u[0]){return r}}return null}function i(r,s){var t=r[s];return(t&&(t instanceof d))?t:null}function b(t,r){var w=this;var v=[];var u={};var x=(typeof t==p)?t:a;var s=(typeof r==p)?r:null;this.put=function(B,C){q(B);l(C);var D=x(B),E,A,z=null;E=i(u,D);if(E){A=E.getEntryForKey(B);if(A){z=A[1];A[1]=C}else{E.addEntry(B,C)}}else{E=new d(D,B,C,s);v[v.length]=E;u[D]=E}return z};this.get=function(A){q(A);var B=x(A);var C=i(u,B);if(C){var z=C.getEntryForKey(A);if(z){return z[1]}}return null};this.containsKey=function(A){q(A);var z=x(A);var B=i(u,z);return B?B.containsKey(A):false};this.containsValue=function(A){l(A);var z=v.length;while(z--){if(v[z].containsValue(A)){return true}}return false};this.clear=function(){v.length=0;u={}};this.isEmpty=function(){return !v.length};var y=function(z){return function(){var A=[],B=v.length;while(B--){v[B][z](A)}return A}};this.keys=y("keys");this.values=y("values");this.entries=y("getEntries");this.remove=function(B){q(B);var C=x(B),z,A=null;var D=i(u,C);if(D){A=D.removeEntryForKey(B);if(A!==null){if(!D.entries.length){z=m(v,C);n(v,z);delete u[C]}}}return A};this.size=function(){var A=0,z=v.length;while(z--){A+=v[z].entries.length}return A};this.each=function(C){var z=w.entries(),A=z.length,B;while(A--){B=z[A];C(B[0],B[1])}};this.putAll=function(H,C){var B=H.entries();var E,F,D,z,A=B.length;var G=(typeof C==p);while(A--){E=B[A];F=E[0];D=E[1];if(G&&(z=w.get(F))){D=C(F,z,D)}w.put(F,D)}};this.clone=function(){var z=new b(t,r);z.putAll(w);return z}}return b})();
\ No newline at end of file
--- /dev/null
+/**
+ * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
+ * Copyright (C) $$Year-Rel$$ The Jalview Authors
+ *
+ * This file is part of Jalview.
+ *
+ * Jalview is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
+ *
+ * Jalview is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of
+ * the GNU General Public License along with Jalview. If not, see <http://www.gnu.org/licenses/>.
+ * The Jalview Authors are detailed in the 'AUTHORS' file.
+ */
+
+
+$(document).ready(function() {
+ processAllAppletElements();
+});
+
+
+
+ var currentPage = "applets";
+
+ function processAllAppletElements() {
+ var apps = document.getElementsByTagName("applet");
+ for (var i = apps.length; --i >= 0;) {
+ processAppletElement(apps[i]);
+ }
+ }
+
+ var jvid = 0;
+
+ function testBtn(e) {
+ var element = e.target.appletElement;
+ var text = element.outerHTML;
+
+ //var
+ var Info = self.JalviewInfo || {
+ code: null,
+ main: "jalview.bin.Jalview",
+ core: "NONE",
+
+
+ width: 850,
+ height: 550,
+ readyFunction: null,
+ serverURL: 'https://chemapps.stolaf.edu/jmol/jsmol/php/jsmol.php',
+ j2sPath: 'swingjs/j2s',
+// console:'sysoutdiv',
+ allowjavascript: true
+}
+
+var id = "JVApplet" + jvid++;
+var args = text.replace(/[\n\t]/g, " ").split("<param ");
+Info.j2sAppletID = id;
+Info.jalview_SCREEN_WIDTH= 100, // desktop width -- 0 to hide
+Info.jalview_SCREEN_HEIGHT= 70, // desktop height -- 0 to hide
+Info.jalview_SCREEN_X= 10,
+Info.jalview_SCREEN_Y= 10,
+Info.jalview_EMBEDDED= true;
+
+
+for (var i in Info) {
+ var v = ("" + Info[i] || "null").replace(/\"/g,"'");
+ args.push("name=\"Info." + i + "\" value=\"" + v + "\"");
+}
+Info.args = args;
+SwingJS.getApplet(id, Info);
+ document.title = id;
+ e.target.style.visibility="hidden";
+
+ }
+
+ function processAppletElement(element) {
+ var code = element.getAttribute("code");
+ var parent = element.parentElement;
+ if (code == "jalview.bin.JalviewLite") {
+ var text = element.outerHTML;
+ console.log(text);
+ var btn = document.createElement("button");
+ btn.innerHTML = "Start Jalview";
+ var a = element.getAttribute("width");
+ btn.style.width = (a || 140) + "px";
+ a = element.getAttribute("height");
+ btn.style.height = (a || 25) + "px";
+ btn.appletElement = element;
+ parent.replaceChild(btn, element);
+ $(btn).click(testBtn)
+ } else {
+ parent.removeElement(element);
+ }
+ }
+
+
+ /**
+ * Generate an applet tag
+ *
+ * @param code
+ * @param name
+ * @param archive
+ * @param width
+ * @param height
+ * @param params
+ * @returns a DOM APPLET element
+ */
+ function createAppletTag(code, name, archive, width, height, params){
+ var app = document.createElement('applet');
+ app.code= code;
+ app.width = width;
+ app.height = height;
+ app.archive = archive;
+
+ var arrayLength = params.length;
+ for (var i = 0; i < arrayLength; i++) {
+ //console.log('name : '+ params[i][0] + ' code : '+ params[i][1]);
+ var param = document.createElement('param');
+ param.name = params[i][0];
+ param.value = params[i][1];
+ app.appendChild(param);
+ }
+ return app;
+ }
+
+ function readCookie(name) {
+ var nameEQ = name + "=";
+ var ca = document.cookie.split(';');
+ for(var i=0;i < ca.length;i++) {
+ var c = ca[i];
+ while (c.charAt(0)==' ') c = c.substring(1,c.length);
+ if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
+ }
+ return null;
+ }
+
+ function setOrUpdateCookie(name, value, days) {
+ var expires;
+ if (days) {
+ var date = new Date();
+ date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
+ expires = "; expires=" + date.toGMTString();
+ }
+ else {
+ expires = "";
+ }
+ document.cookie = name + "=" + value + expires + "; path=/";
+ }
+
+ $(function(){
+ var url = window.location.href;
+ var end = url.length;
+ var start = url.lastIndexOf("#");
+ var newPage = url.substring(start + 1, end);
+ var page = ((start === -1) ? currentPage : newPage);
+ //alert("page:" + page);
+ if(page === "embeddedWJmol"){
+ // do nothing embeddedWJmol page already include
+
+ $('#header').load("includes/header_jv.html");
+ //$('#content').load(page + ".html");
+ $('#nav').load("includes/nav_jv.html");
+ $('#footer').load("includes/footer_jv.html");
+ $('#'+ currentPage).addClass('active-trail active');
+ }else{
+ $('#header').load("includes/header_jv.html");
+ $('#content').load(page + ".html");
+ $('#nav').load("includes/nav_jv.html");
+ $('#footer').load("includes/footer_jv.html");
+ $('#'+ currentPage).addClass('active-trail active');
+
+ var e = document.getElementById("view_decorated");
+ e.style.display = 'none';
+ }
+ });
+
+function doSubmit(target){
+ var currentPage = target+'.html';
+ //alert("page:" + target);
+ if(target == "embeddedWJmol"){
+ //loadJMolPage();
+ window.location.href = 'embeddedWJmol.html#' + target;
+ $('#content').load(currentPage);
+ }else{
+ window.location.href = 'index.html#' + target;
+ $('#content').load(currentPage);
+ }
+ updateLinks(target);
+}
+
+
+
+function updateLinks(target) {
+ var ul = document.getElementById("menu");
+ var items = ul.getElementsByTagName("li");
+ for (var i = 0; i < items.length; ++i) {
+ removeClass(items[i], "active-trail active");
+ }
+ $('#'+ target).addClass('active-trail active');
+}
+
+function hasClass(ele,cls) {
+ return !!ele.className.match(new RegExp('(\\s|^)'+cls+'(\\s|$)'));
+}
+
+function addClass(ele,cls) {
+ if (!hasClass(ele,cls)) ele.className += " "+cls;
+}
+
+function removeClass(ele,cls) {
+ if (hasClass(ele,cls)) {
+ var reg = new RegExp('(\\s|^)'+cls+'(\\s|$)');
+ ele.className=ele.className.replace(reg,' ');
+ }
+}
+
--- /dev/null
+// Jalview Priliminary applet-generation code.
+// author: Bob Hanson hansonr@stolaf.edu
+
+Jalview = {
+ jvid : 0
+}
+
+$(document).ready(function() {
+ if (document.location.href.toLowerCase().indexOf("_use=java") < 0)
+ Jalview.processAllAppletElements(self.JalviewInfo);
+});
+
+
+Jalview.processAllAppletElements = function(PageInfo) {
+ var applets = document.getElementsByTagName("applet");
+ var apps=[];
+ for (var i = 0; i < applets.length; i++)
+ apps[i] = applets[i];
+ for (var i = 0; i < apps.length; i++) {
+ Jalview.processAppletElement(apps[i], PageInfo);
+ }
+}
+
+Jalview.processAppletElement = function(element, UserInfo) {
+
+ var code = element.getAttribute("code");
+ var parent = element.parentElement;
+ if (code != "jalview.bin.JalviewLite") {
+ return;
+ }
+
+ var Info = {
+ code: null,
+ main: "jalview.bin.Jalview",
+ core: "NONE",
+ resourcePath: "examples",
+ readyFunction: null,
+ serverURL: 'https://chemapps.stolaf.edu/jmol/jsmol/php/jsmol.php',
+ j2sPath: 'swingjs/j2s',
+ console:'sysout',
+ startButton:'Start Jalview',
+ hideDesktop:true,
+ embedInternalFrames:false,
+ idPrefix:'%ID%',
+ allowJavascript: true,
+ }
+
+ var text = element.outerHTML;
+ var args = Info.args = text.replace(/[\n\t]/g, " ").split("<param ");
+
+ // overwrite default parameters with UserInfo (global JalviewInfo):
+
+ if (UserInfo) {
+ for (var i in UserInfo) {
+ Info[i] = UserInfo[i];
+ }
+ }
+ // generate name/value pairs for parameters in Applet tag
+
+ Info.j2sAppletID = Info.j2sAppletID
+ || element.getAttribute("name")
+ || element.getAttribute("id")
+ || Info.idPrefix.replace(/%ID%/g, "jalview" + ++Jalview.jvid);
+
+ //Info.jalview_SCREEN_X= 10,Info.jalview_SCREEN_Y= 10;
+ //Info.jalview_EMBEDDED= true;
+ //Info.jalview_SCREEN_WIDTH = 400;
+ //Info.jalview_SCREEN_HEIGHT = 100;
+
+
+ var addParam = function(key,value) {
+ args.push("name=\"" + key + "\" value=\"" + value + "\"");
+ }
+
+
+ for (var i in Info) {
+ var v = ("" + Info[i] || "null").replace(/\"/g,"'");
+ addParam("Info." + i, v);
+ }
+
+
+
+ element.JalviewInfo = Info;
+ var btn = document.createElement("button");
+ btn.appletElement = element;
+ var a = element.getAttribute("width");
+ //a && (btn.style.width = (a || 140) + "px");
+ a = element.getAttribute("height");
+ //a && (btn.style.height = (a || 25) + "px");
+ btn.jvparent = parent;
+ if (Info.startButton) {
+ btn.innerHTML = Info.startButton;
+ parent.replaceChild(btn, element);
+ $(btn).click(Jalview.doStartJalview);
+ } else {
+ parent.removeChild(element);
+ Jalview.doStartJalview({target:btn});
+ }
+}
+
+
+
+Jalview.doStartJalview = function(e) {
+ e.target.disabled = true;
+ var element = e.target.appletElement;
+ var parent = e.target.jvparent;
+ var Info = element.JalviewInfo;
+ var id = Info.j2sAppletID;
+ var d = document.createElement("div");
+ d.id = id + "-desktop-div";
+ if (Info.hideDesktop) {
+ d.style.display = "none";
+ d.style.width = d.style.height = "0px";
+ } else {
+ d.style.width = "300px", d.style.height = "70px";
+ }
+ parent.appendChild(d);
+ d = document.createElement("div");
+ d.id = id + "-alignment-div";
+ if (Info.embedInternalFrames) {
+// TODO
+ } else {
+ d.style.display = "none";
+ d.style.width = d.style.height = "0px";
+ }
+ if (Info.allowJavascript) {
+ if (Info.readyFunction) {
+ var c = Info.readyFunction;
+ Info.readyFunction = function(a){
+ Jalview._setAPI(a);
+ c.apply(null, arguments);
+ }
+ } else {
+ Info.readyFunction = function(a) {Jalview._setAPI(a)};
+ }
+ }
+ var app = SwingJS.getApplet(id, Info);
+}
+
+Jalview._setAPI = function(app) {
+
+ // Create a map of nonqualified methods to qualified methods
+ // based on parameter type.
+ var cl = Class.forName$S("jalview.bin.Jalview");
+ if (!cl.$clazz$.getInstance$) {
+ System.err.println(app.__Info.main + " has no getInstance() method; interface creation skipped.");
+ return;
+ }
+ var instance = app._instance = cl.$clazz$.getInstance$();
+ var apply = function(args, methods) {
+ return methods[args.length].apply(instance, args);
+ }
+ var getMap = function(cl) {
+ var methods = cl.getMethods$();
+ var p = cl.$clazz$.prototype;
+ var map = {};
+ for (var i = 0, n = methods.length; i < n; i++) {
+ var qname = methods[i].name;
+ if (cl.$clazz$[qname])
+ continue; // static method
+ var s = qname.split("$");
+ var name = s[0];
+ if (!name)
+ continue; // $init$, $cinit$
+ if (app[name]) {
+ name += "$";
+ System.err.println(app._id + "." + name + " is " + qname);
+ };
+ (m = map[name])||(m = map[name] = []);
+ var j = p[qname].length;
+ if (m[j]) {
+ System.err.println(app._id + ".instance." + qname + " must be called directly.");
+ app[qname] = p[qname];
+ } else {
+ System.out.println(app._id + "." + name + "(" + j + ") aliases " + app._id + ".instance." + qname);
+ m[j] = p[qname];
+ }
+ }
+ return map;
+ }
+ var getFunc = function(map,i) {
+ return function(){return apply(arguments,map[i])};
+ }
+ var map = getMap(Clazz._4Name(app.__Info.main));
+ var n = 0;
+ for (var i in map) {
+ n++;
+ app[i] = getFunc(map,i);
+ }
+ System.err.println(app._id + " contains " + n + " JavaScript interface methods");
+}