Sphinx uses interpreted text roles to insert semantic markup into documents. They are written as :rolename:`content`.
Note
The default role (`content`) has no special meaning by default. You are free to use it for anything you like, e.g. variable names; use the :confval:`default_role` config value to set it to a known role.
See Sphinx Domains for roles added by domains.
Cross-references are generated by many semantic interpreted text roles. Basically, you only need to write :role:`target`, and a link will be created to the item named target of the type indicated by role. The links’s text will be the same as target.
There are some additional facilities, however, that make cross-referencing roles more versatile:
You may supply an explicit title and reference target, like in reST direct hyperlinks: :role:`title <target>` will refer to target, but the link text will be title.
If you prefix the content with !, no reference/hyperlink will be created.
If you prefix the content with ~, the link text will only be the last component of the target. For example, :py:meth:`~Queue.Queue.get` will refer to Queue.Queue.get but only display get as the link text.
In HTML output, the link’s title attribute (that is e.g. shown as a tool-tip on mouse-hover) will always be the full target name.
These roles are described with their respective domains:
To support cross-referencing to arbitrary locations in any document, the standard reST labels are used. For this to work label names must be unique throughout the entire documentation. There are two ways in which you can refer to labels:
If you place a label directly before a section title, you can reference to it with :ref:`label-name`. Example:
.. _my-reference-label:
Section to cross-reference
--------------------------
This is the text of the section.
It refers to the section itself, see :ref:`my-reference-label`.
The :ref: role would then generate a link to the section, with the link title being “Section to cross-reference”. This works just as well when section and reference are in different source files.
Automatic labels also work with figures: given
.. _my-figure:
.. figure:: whatever
Figure caption
a reference :ref:`my-figure` would insert a reference to the figure with link text “Figure caption”.
The same works for tables that are given an explicit caption using the :dudir:`table` directive.
Labels that aren’t placed before a section title can still be referenced to, but you must give the link an explicit title, using this syntax: :ref:`Link title <label-name>`.
Using ref is advised over standard reStructuredText links to sections (like `Section title`_) because it works across files, when section headings are changed, and for all builders that support cross-references.
New in version 0.6.
There is also a way to directly link to documents:
Link to the specified document; the document name can be specified in absolute or relative fashion. For example, if the reference :doc:`parrot` occurs in the document sketches/index, then the link refers to sketches/parrot. If the reference is :doc:`/people` or :doc:`../people`, the link refers to people.
If no explicit link text is given (like usual: :doc:`Monty Python members </people>`), the link caption will be the title of the given document.
New in version 0.6.
This role lets you link to files within your source tree that are not reST documents that can be viewed, but files that can be downloaded.
When you use this role, the referenced file is automatically marked for inclusion in the output when building (obviously, for HTML output only). All downloadable files are put into the _downloads subdirectory of the output directory; duplicate filenames are handled.
An example:
See :download:`this example script <../example.py>`.
The given filename is usually relative to the directory the current source file is contained in, but if it absolute (starting with /), it is taken as relative to the top source directory.
The example.py file will be copied to the output directory, and a suitable link generated to it.
The following roles do possibly create a cross-reference, but do not refer to objects:
An environment variable. Index entries are generated. Also generates a link to the matching envvar directive, if it exists.
The name of a grammar token (used to create links between productionlist directives).
The name of a keyword in Python. This creates a link to a reference label with that name, if it exists.
A command-line option to an executable program. The leading hyphen(s) must be included. This generates a link to a option directive, if it exists.
The following role creates a cross-reference to the term in the glossary:
Reference to a term in the glossary. The glossary is created using the glossary directive containing a definition list with terms and definitions. It does not have to be in the same file as the term markup, for example the Python docs have one global glossary in the glossary.rst file.
If you use a term that’s not explained in a glossary, you’ll get a warning during build.
The following roles don’t do anything special except formatting the text in a different style:
An abbreviation. If the role content contains a parenthesized explanation, it will be treated specially: it will be shown in a tool-tip in HTML, and output only once in LaTeX.
Example: :abbr:`LIFO (last-in, first-out)`.
New in version 0.6.
The name of an OS-level command, such as rm.
Mark the defining instance of a term in the text. (No index entries are generated.)
The name of a file or directory. Within the contents, you can use curly braces to indicate a “variable” part, for example:
... is installed in :file:`/usr/lib/python2.{x}/site-packages` ...
In the built documentation, the x will be displayed differently to indicate that it is to be replaced by the Python minor version.
Labels presented as part of an interactive user interface should be marked using guilabel. This includes labels from text-based interfaces such as those created using curses or other text-based libraries. Any label used in the interface should be marked with this role, including button labels, window titles, field names, menu and menu selection names, and even values in selection lists.
Changed in version 1.0: An accelerator key for the GUI label can be included using an ampersand; this will be stripped and displayed underlined in the output (example: :guilabel:`&Cancel`). To include a literal ampersand, double it.
Mark a sequence of keystrokes. What form the key sequence takes may depend on platform- or application-specific conventions. When there are no relevant conventions, the names of modifier keys should be spelled out, to improve accessibility for new users and non-native speakers. For example, an xemacs key sequence may be marked like :kbd:`C-x C-f`, but without reference to a specific application or platform, the same sequence should be marked as :kbd:`Control-x Control-f`.
The name of an RFC 822-style mail header. This markup does not imply that the header is being used in an email message, but can be used to refer to any header of the same “style.” This is also used for headers defined by the various MIME specifications. The header name should be entered in the same way it would normally be found in practice, with the camel-casing conventions being preferred where there is more than one common usage. For example: :mailheader:`Content-Type`.
The name of a make variable.
A reference to a Unix manual page including the section, e.g. :manpage:`ls(1)`.
Menu selections should be marked using the menuselection role. This is used to mark a complete sequence of menu selections, including selecting submenus and choosing a specific operation, or any subsequence of such a sequence. The names of individual selections should be separated by -->.
For example, to mark the selection “Start > Programs”, use this markup:
:menuselection:`Start --> Programs`
When including a selection that includes some trailing indicator, such as the ellipsis some operating systems use to indicate that the command opens a dialog, the indicator should be omitted from the selection name.
menuselection also supports ampersand accelerators just like guilabel.
The name of a MIME type, or a component of a MIME type (the major or minor portion, taken alone).
The name of a Usenet newsgroup.
The name of an executable program. This may differ from the file name for the executable for some platforms. In particular, the .exe (or other) extension should be omitted for Windows programs.
A regular expression. Quotes should not be included.
A piece of literal text, such as code. Within the contents, you can use curly braces to indicate a “variable” part, as in file. For example, in :samp:`print 1+{variable}`, the part variable would be emphasized.
If you don’t need the “variable part” indication, use the standard ``code`` instead.
There is also an index role to generate index entries.
The following roles generate external links:
A reference to a Python Enhancement Proposal. This generates appropriate index entries. The text “PEP number” is generated; in the HTML output, this text is a hyperlink to an online copy of the specified PEP. You can link to a specific section by saying :pep:`number#anchor`.
A reference to an Internet Request for Comments. This generates appropriate index entries. The text “RFC number” is generated; in the HTML output, this text is a hyperlink to an online copy of the specified RFC. You can link to a specific section by saying :rfc:`number#anchor`.
Note that there are no special roles for including hyperlinks as you can use the standard reST markup for that purpose.
The documentation system provides three substitutions that are defined by default. They are set in the build configuration file.
Replaced by the project release the documentation refers to. This is meant to be the full version string including alpha/beta/release candidate tags, e.g. 2.5.2b3. Set by :confval:`release`.
Replaced by the project version the documentation refers to. This is meant to consist only of the major and minor version parts, e.g. 2.5, even for version 2.5.1. Set by :confval:`version`.
Replaced by either today’s date (the date on which the document is read), or the date set in the build configuration file. Normally has the format April 14, 2007. Set by :confval:`today_fmt` and :confval:`today`.


30897 [Test worker] WARN o.hibernate.orm.connections.pooling - HHH10001002: Using Hibernate built-in connection pool (not for production use!)
30898 [Test worker] INFO o.hibernate.orm.connections.pooling - HHH10001005: using driver [com.mysql.cj.jdbc.Driver] at URL [jdbc:mysql://localhost:3306/addressbook?useTimezone=true&serverTimezone=UTC]
30898 [Test worker] INFO o.hibernate.orm.connections.pooling - HHH10001001: Connection properties: {user=root, password=}
30898 [Test worker] INFO o.hibernate.orm.connections.pooling - HHH10001003: Autocommit mode: false
30898 [Test worker] INFO o.h.e.j.c.i.DriverManagerConnectionProviderImpl - HHH000115: Hibernate connection pool size: 1 (min=1)
30902 [Test worker] INFO org.hibernate.dialect.Dialect - HHH000400: Using dialect: org.hibernate.dialect.MySQLDialect
30939 [Test worker] INFO o.hibernate.orm.connections.access - HHH10001501: Connection obtained from JdbcConnectionAccess [org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess@13a5d33] for (non-JTA) DDL execution was not in auto-commit mode; the Connection 'local transaction' will be committed and the Connection will be set into auto-commit mode.
30982 [Test worker] INFO o.h.e.t.j.p.i.JtaPlatformInitiator - HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform]
Hibernate: select contactdat0_.id as id1_1_, contactdat0_.address as address2_1_, contactdat0_.email as email3_1_, contactdat0_.email2 as email4_1_, contactdat0_.email3 as email5_1_, contactdat0_.firstname as firstnam6_1_, contactdat0_.home as home7_1_, contactdat0_.lastname as lastname8_1_, contactdat0_.middlename as middlena9_1_, contactdat0_.mobile as mobile10_1_, contactdat0_.work as work11_1_ from addressbook contactdat0_ where deprecated='0000-00-00'
Hibernate: select groups0_.id as id1_0_0_, groups0_.group_id as group_id2_0_0_, groupdata1_.group_id as group_id1_2_1_, groupdata1_.group_footer as group_fo2_2_1_, groupdata1_.group_header as group_he3_2_1_, groupdata1_.group_name as group_na4_2_1_ from address_in_groups groups0_ inner join group_list groupdata1_ on groups0_.group_id=groupdata1_.group_id where groups0_.id=?
Hibernate: select groups0_.id as id1_0_0_, groups0_.group_id as group_id2_0_0_, groupdata1_.group_id as group_id1_2_1_, groupdata1_.group_footer as group_fo2_2_1_, groupdata1_.group_header as group_he3_2_1_, groupdata1_.group_name as group_na4_2_1_ from address_in_groups groups0_ inner join group_list groupdata1_ on groups0_.group_id=groupdata1_.group_id where groups0_.id=?
Hibernate: select groups0_.id as id1_0_0_, groups0_.group_id as group_id2_0_0_, groupdata1_.group_id as group_id1_2_1_, groupdata1_.group_footer as group_fo2_2_1_, groupdata1_.group_header as group_he3_2_1_, groupdata1_.group_name as group_na4_2_1_ from address_in_groups groups0_ inner join group_list groupdata1_ on groups0_.group_id=groupdata1_.group_id where groups0_.id=?
Hibernate: select groups0_.id as id1_0_0_, groups0_.group_id as group_id2_0_0_, groupdata1_.group_id as group_id1_2_1_, groupdata1_.group_footer as group_fo2_2_1_, groupdata1_.group_header as group_he3_2_1_, groupdata1_.group_name as group_na4_2_1_ from address_in_groups groups0_ inner join group_list groupdata1_ on groups0_.group_id=groupdata1_.group_id where groups0_.id=?
Hibernate: select groups0_.id as id1_0_0_, groups0_.group_id as group_id2_0_0_, groupdata1_.group_id as group_id1_2_1_, groupdata1_.group_footer as group_fo2_2_1_, groupdata1_.group_header as group_he3_2_1_, groupdata1_.group_name as group_na4_2_1_ from address_in_groups groups0_ inner join group_list groupdata1_ on groups0_.group_id=groupdata1_.group_id where groups0_.id=?
Hibernate: select groups0_.id as id1_0_0_, groups0_.group_id as group_id2_0_0_, groupdata1_.group_id as group_id1_2_1_, groupdata1_.group_footer as group_fo2_2_1_, groupdata1_.group_header as group_he3_2_1_, groupdata1_.group_name as group_na4_2_1_ from address_in_groups groups0_ inner join group_list groupdata1_ on groups0_.group_id=groupdata1_.group_id where groups0_.id=?
Hibernate: select groups0_.id as id1_0_0_, groups0_.group_id as group_id2_0_0_, groupdata1_.group_id as group_id1_2_1_, groupdata1_.group_footer as group_fo2_2_1_, groupdata1_.group_header as group_he3_2_1_, groupdata1_.group_name as group_na4_2_1_ from address_in_groups groups0_ inner join group_list groupdata1_ on groups0_.group_id=groupdata1_.group_id where groups0_.id=?
Hibernate: select groups0_.id as id1_0_0_, groups0_.group_id as group_id2_0_0_, groupdata1_.group_id as group_id1_2_1_, groupdata1_.group_footer as group_fo2_2_1_, groupdata1_.group_header as group_he3_2_1_, groupdata1_.group_name as group_na4_2_1_ from address_in_groups groups0_ inner join group_list groupdata1_ on groups0_.group_id=groupdata1_.group_id where groups0_.id=?
Hibernate: select groups0_.id as id1_0_0_, groups0_.group_id as group_id2_0_0_, groupdata1_.group_id as group_id1_2_1_, groupdata1_.group_footer as group_fo2_2_1_, groupdata1_.group_header as group_he3_2_1_, groupdata1_.group_name as group_na4_2_1_ from address_in_groups groups0_ inner join group_list groupdata1_ on groups0_.group_id=groupdata1_.group_id where groups0_.id=?
Hibernate: select groups0_.id as id1_0_0_, groups0_.group_id as group_id2_0_0_, groupdata1_.group_id as group_id1_2_1_, groupdata1_.group_footer as group_fo2_2_1_, groupdata1_.group_header as group_he3_2_1_, groupdata1_.group_name as group_na4_2_1_ from address_in_groups groups0_ inner join group_list groupdata1_ on groups0_.group_id=groupdata1_.group_id where groups0_.id=?


Basic vega-element demo
Binding to signals in vega runtime
Click to select color [[barColor]] for the bars
Binding to data set in vega runtime
Binding to data set in vega runtime


net use
Connects or disconnects to a network share. Used with no qualifiers lists the current network mappings.
Syntax:
net use <device name> or * \\<computer name>\<share name> \[password or *\] \[/user:\[domain\user\] /delete or \[persistent:\[yes or no\]\]
net use <device name> /home /delete or /persistent:\[yes or no\]
Options:
<device name> Name of the device to map to. Use * to use the next available device name
\\computer name The name of the computer controlling the resource
\sharename Name of the share
\volume Name of the volume if on a NetWare server
password Password to which to map
* Gives a prompt to which to enter the password
/user:<domain>\<user> Specifies the user to connect as
/home Connects to a users home directory
/delete Closes a connection
/persistent:\[yes or no> Sets if the connection should be reconnected at next logon


The <template>
tag provides a way of defining
content that should be considered separate from
the document until it is intentionally created and used.
This example uses a template to create content which is then inserted into the div below.


{{define "settings"}}
To start staking, you need to submit a public key address. This can be done automatically by the GUI wallet Exilibrium (see below). You may also proceed by following the command-line instructions on the Address Page.
{{end}}The official EXCCoin GUI wallet Exilibrium is the recommended way to use stake pools. All you need to get started is to copy and paste the API Key below when prompted. A more comprehensive guide is available for Exilibrium. There is also a more general overview of the staking process available here.
{{ .APIToken }}


Minor snow, but big time cold on the way
by Chris ReeceDrivers need to plan a little extra time for their Monday morning and evening commutes. An area of low pressure will move across southern Wisconsin Monday, bringing precipitation for most of the day. Dense fog and light rain is expected to continue through the morning. Showers will change to light snow in the afternoon.
Little accumulation is expected; less than an inch of snowfall is likely in Dane County. Totals will be less to the south and higher to the north.
Following this system, cold air will settle in.
Skies will be partly sunny, but temperatures Tuesday and Wednesday afternoon will be in the teens. Overnight temperatures will fall to the single digits with wind chills below zero.


This intention splits a variable declaration with initialization into a declaration and an assignment statement.
Powered by JavaScript IntentionPowerPack


Rugby star Israel Folau claims bushfires 'God's judgment' for gay marriage
SYDNEY: Sacked Wallabies rugby star Israel Folau Monday (Nov 18) sparked outrage by suggesting destructive bushfires and drought ravaging Australia were "God's judgment" for the legalisation of same-sex marriage and abortion.
The devout Christian, who is pursuing legal action against Rugby Australia after being fired in May for posting on Instagram that "hell awaits" gay people and others he considers sinners, made his latest outburst in a Sydney church sermon on Sunday.
READ: Rugby: Folau opts for 'God' over rugby on social media
The comments were slammed as "appallingly insensitive" by Prime Minister Scott Morrison, himself an evangelical Christian.
Folau said the devastating drought and timing of fires across swathes of New South Wales and Queensland, which have left six people dead and destroyed hundreds of homes, were no coincidence.
"I've been looking around at the events that's been happening in Australia, this past couple of weeks, with all the natural disasters, the bushfires and the droughts," he said.
Folau, Super Rugby's record try-scorer who has played for Australia 73 times, then talked to the congregation about same-sex marriage and abortion.
"God's word says for a man and a woman to be together, one man and one woman in the covenant of marriage," he said, while adding: "Abortion, it's OK now to murder, kill infants, unborn children."
Folau continued: "Look how rapid these bushfires, these droughts, all these things have come in a short period of time. Do you think it's a coincidence or not?
READ: Helicopter crashes during Australia bushfire operation
"BUTTON UP"
"God is speaking to you guys. Australia you need to repent and take these laws and turn it back to what is right by God."
Same-sex marriage became law in Australia following a referendum in 2017 while New South Wales became the last state to decriminalise abortion in September this year.
In the sermon posted on The Truth of Jesus Christ Church's Facebook page, Folau said he was sharing his message "out of love" and warned the fires were "only a little taste of God's judgment coming".
READ: Rugby: Australia's Folau launches legal action over homophobia sacking
While Folau has gained the support of prominent conservatives in the past, Morrison was quick to criticise.
"They were appalling comments and he is a free citizen, he can say whatever he likes. But that doesn't mean he can't have regard to the grievous offence this would have caused to people whose homes have been burnt down," said the prime minister.
READ: Death toll in Australia bushfires rises to four
Even one of his most staunch allies, former Wallabies coach and conservative radio host Alan Jones, was unimpressed.
"Israel is a lovely human being, I know him well. But, Israel, button up," Jones said on his 2GB radio programme. "These comments don't help."
Folau is reportedly seeking AUD$10 million (US$6.8 million) in compensation from Rugby Australia, challenging his dismissal under laws that disallow sackings because of a person's religion.
The governing body insists his firing was purely contractual. A trial has been set for February unless a court-ordered mediation in December is successful.
Folau is cashed up after the Australian Christian Lobby raised more than AUD$2 million in just two days to help pay his legal fees.


Enjoy this selection of titles at a specially reduced price, for a limited time only.
Priceless
A lowly barman is mistaken for a millionaire. Subtitled.
Available for £1.50 from 23/03/09 to 29/03/09
Shoot On Sight
A Muslim police officer faces turmoil at Scotland Yard.
Available for 99p from 23/03/09 to 29/03/09


A growing engineer who has the technical knowledge of how things work in the world of zero's and one's, ready with an edge to dive into the design process to discover, ideate and build some cool product.
I love to work with
Some of the best memories I have
#Funtime #AmazingPeople
Failure will never overtake me if my determination to succeed is strong enough.
Time means a lot to me because, you see, I, too, am also a learner and am often lost in the joy of forever developing and simplifying.

" Be nice to nerds. Chances are you’ll end up working for one "
- Bill Gates


Do you refer cats or dogs? Choose wisely
Cat:
Dog:
What's your favorite color?
Purple
Orange
Yellow
Go!


Disney Plus user accounts already found on hacking sites
by EndPlayNEW YORK (AP) - Disney says its new Disney Plus streaming service doesn't have a security breach, but some users have been shut out after hackers tried to break into their accounts.
The news site ZDNet found stolen account usernames and passwords selling for $3 on underground hacking forums. Disney's streaming service costs $7 a month or $70 a year.
Disney says there's no indication of a security breach on Disney Plus. It says it takes the privacy and security of users' data seriously.
It's likely hackers found email and password combinations re-used by Disney Plus subscribers after they'd previously been stolen from other online services.
Disney Plus hasn't said how many subscribers have had security problems. The new service attracted 10 million subscribers the day it launched earlier this month.


BindGen is the tool used to generate a binding definition and matching schema definition from existing Java code.
BindGen executes as a Java application, meaning it needs to be run directly from a
console window using the "java" command, or though some equivalent technique (such as
an Ant <java>
task, discussed below). However it's being run, you need
to include jibx-tools.jar from your JiBX installation lib directory in the
Java classpath, along with the path for the compiled class files you'll use as input to
the generation. You'll also need several of the other jars from the JiBX lib
directory (including jibx-bind.jar, jibx-schema.jar, and jibx-run.jar).
As long as these jars are in the same directory as jibx-tools.jar you don't need to
list them in the classpath, though - they'll be picked up automatically.
The BindGen application main class is org.jibx.binding.generator.BindGen
,
and it takes as parameters the fully-qualified names of one or more root class(es) to be
to be included in the binding generation. In schema terms, each of these root classes will
be treated as a separate global definition.
Here's a sample of running BindGen on Unix/Linux systems from the examples/bindgen directory of the distribution (in a single line, shown split here only for formatting):
java -cp ../../lib/jibx-tools.jar:bin org.jibx.binding.generator.BindGen org.jibx.starter1.Order
On Windows, the corresponding command line is:
java -cp ..\..\lib\jibx-tools.jar;bin org.jibx.binding.generator.BindGen org.jibx.starter.Order
By default, BindGen output just goes to the current directory where it was executed. The generated root binding definition is named binding.xml, and the generated schema name is derived from the target namespace (which in turn is derived from the Java package name).
You can easily run BindGen from an Ant build, just as you would any other Java application. The build.xml in the examples/bindgen directory gives an example of this (which passes an optional source directory path parameter, in addition to a root class name), as shown below:
<!-- set classpath for compiling and running application with JiBX --> <path id="classpath"> <fileset dir="${jibx-home}/lib" includes="*.jar"/> <pathelement location="bin"/> </path> ... <!-- generate default binding and schema --> <target name="bindgen"> <echo message="Running BindGen tool"/> <java classpathref="classpath" fork="true" failonerror="true" classname="org.jibx.binding.generator.BindGen"> <arg value="-s"/> <arg value="src"/> <arg value="org.jibx.starter1.Order"/> </java> </target>
Most IDEs allow you to directly execute an Ant build target, so you can use the Ant approach to running BindGen from within your IDE.
You can pass a variety of command line parameters to BindGen, as listed below in alphabetical order:
| Parameter | Purpose |
|---|---|
-a |
Force abstract mapping (equivalent to a schema complexType) generation for classes passed as input parameters. |
-b name |
Generated root binding definition file name (default name is binding.xml) |
-c path |
Path to input customizations file |
-m |
Force concrete mapping (equivalent to a schema complexType plus an element of that type) generation for classes passed as input parameters |
-n uri=name,... |
Give schema namespace URI and file-name pairs (default generates file names from schema namespace URIs) |
-o |
Binding generation only (no schema generation) |
-p path,... |
Paths for loading Java class files (default is the classpath used to run BindGen) |
-s path,... |
Paths for loading Java source files (source is not used by default) |
-t path |
Target directory path for generated output (default is current directory) |
-v |
Verbose output |
-w |
Wipe all files from target directory before generating output (ignored if the target directory is the same as the current directory) |
You need to specify one or more class names as command line parameters to BindGen. Each class you name is used as a starting point for generating binding definitions. BindGen examines each class listed to find references to other classes, and then recursively examines the referenced classes, to find the complete set of classes necessary to represent your data. It then generates binding and schema definitions for all of these classes. The class names must be at the end of the command line, following any other command line parameters.
You can pass global customizations to BindGen as command-line parameters,
by using --
as a special prefix to the customization attribute name.
This is explained in more detail in the BindGen customization
reference page. Before digging into the details of customizations you may find
it useful to review the BindGen examples to learn how BindGen
works and see some basic applications of customizations.


| DOSE: |
1.0 g |
insufflated |
Cocaine |
(powder / crystals) |
Cocaine, She first came into my life acouple weekends ago. I Have been around coke for awhile, Acouple of my buddies had busted lines in front of me many of times. Well With that said it was only a matter of time befor I asked for someone to rail me one up. I went to a typical highschool party, Booze,Weed,coke all the goodies. So me and my really good buddy picked up a gram off another close buddy that we have gone to school with since grade two until the past month when he found a better income then school.
So we go to the party and I talk to my buddy who is tossing it, We end up in his room in the basement with someone holding the door since we don't need everyone coming into the room when we are doing our lines. In the room there where about six of us. Three of us where going to take her for out first time. We bust the lines my buddies go first, I stand back totally sober I havn't had any weed or anything, This for me isn't very normal I smoke atleast two times a Day. This gave me the clearest mindest, Making me think about what I was about to do. What I was getting myself into and if I should do it? Screw it its for fun isn't it?
Here we go, Rail one. I take a crisp 100 dollar bill out of my pocket and roll it up. Lean over my buddies desk and no turning back now. I sniffed a rail and looked up and my friends they grinned at me and laughed. I could feel it and soon as I looked up from the table. It was great, I was ontop of the world. I could talk to anyone at that party about anything, Fight any guy, sleep with any girl. Cocaine made it all go together. It was clear to me now what all the hype was about.
I am in the chair with the lines still infront of me for acouple more minutes, My buddies didn't ask me to move they made there way around me for the rail. Befor I knew it they had served me another, Corse not turning it down I snorted this one up my right this time. I could feel the coke in the back of my throat, Not the best taste but I could tolerate it for this a amazing rush.
I went around the party after hitting around 6-7 nice sized rails under 20 minutes. This beeing my first time I was feeling pretty great about cocaine and what she was doing for me. 11:25 I looked at my watch and asked my buddy if he wanted to smoke a joint to take the edge off. We end up just having acouple smoked outside and chat about bullshit, life, girls, cars, stuff we wanted, stuff we couldn't have. I look down at my watch at 12:30 am. It has only seemed to me like it had been minutes since I stepped out onto the back deck with my buddy. With us both knowing the time we stepped back into the party, It was not as packed now and It was more lax. Me with still a half gram in my pocket and two of my closest friends sitting next to me.
We busted more rails, Hit them and then started on the way home for the night. We railed the rest of the half gram as we left between three guys. Needless to say none of us where very experinced with coke, But thats not saying we didn't enjoy it just as much as the next guy. The drive home was a blast, My music never sounded so clear, Never made me move my head so much. I was doing 90 mph feeling like I was skating, Nothing could touch me.
4:40 am, No sleep, I could feel her leaving my body slowly. I couldn't get any sleep. No matter how hard I closed my eyes I found them open seconds later.
10:10 am, waking up, getting ready for work. One of my friends calls and askes me if I got any sleep last night. I laugh and say yea abit but not to much. He hadn't slept, infact he had picked up more coke that night after the party. This made me feel good, It shouldn't have or maybe its low? but I felt that I outlasted someone so I could now quit at anytime. I had control, I have control, I'll keep control.
I have done coke over 40 times now, I do it on weekends. Maybe the odd rail in the washroom once or twice a week. I find I still have control over the coke. I would test myself by going weeks without and going to parties where I know coke would be getting done and turn it down. This made me feel good and in control. But really, I can't turn down a free rail now, without atleast kicking myself about it later. Cocaine is slowly become a habbit but, Its only on the side. I make sure its not the main part of my night, or the main objective. If I keep these rules I think I will be fine. Just fine.
Experience Reports are the writings and opinions of the individual authors who submit them.
Some of the activities described are dangerous and/or illegal and none are recommended by Erowid.


DOCX table into python
2014-11-01
###Docx table into pandas#### ####FOr this script /scripts/DOCXPANDASSEARCH.py#### 1. to import the table in docx format has to use window based python library pywin32. Instead of this the table can be all select, copy paste in Libre calculator and save it as csv. 1. This CSV file will have one blank line after every row as of DOCX table. To remove this row use this script, edited with considering the special delimiter used to silence the ‘,’ in the address column.
import CSV
...
input = open('CBEN2.csv', 'rb')
output = open('CBE_North_ind.csv', 'wb')
writer = csv.writer(output)
for row in csv.reader(input):
if any(field.strip(']') for field in row):
writer.writerow(row)
input.close()
output.close()
- To read by pandas dataframe,
db=pd.read_csv('CBE_North_ind.csv',delimiter=']')
above gives non equal row values for each column, the csv fileopened in text editor was serached for multiple ‘]]]’ and removed all of it. but still having unequal row value.
- To know the presence of null values in the data frame used
da=pd.isnull(db[‘Name and Factory address’]) db[‘Nullys’]=pd.isnull(db[‘Products manufactured with Quantity and Intermediate / By-Products manufactured with Quantity’])
- To sort the null, boolean values and view its location
rec=db.sort(['Nullys'],ascending=[0])
- To search for a string in particular column
db2=db[db['columns'].str.contains("Search string")]


We redefine blockchain!
- orchestrate web-enabled initiatives
- synthesize B2C e-services
- engage granular infrastructures
- expedite world-class channels
- orchestrate ubiquitous bandwidth
- strategize real-time experiences
- redefine impactful schemas
- expedite end-to-end metrics
- strategize distributed platforms
- incentivize extensible channels
- architect innovative deliverables
- exploit dot-com interfaces
- engineer strategic infrastructures
- deliver value-added deliverables
- leverage holistic models


The CAZyme prediction tools dbCAN, CUPP and eCAMI write out their output files in different formats, and do not present the data in a standardised manner across all tools. Additionally, the output from the prediction tools does not enable easy parsing of the data by the Sklearn library, which performs the statistical analysis of the tools preformances.
This notebook explains the method used by the pyrewton.cazymes.prediction.parse
submodule to parse the output from the CAZyme prediction tool CUPP.
CUPP is a k-mer based CAZyme prediction tool. The information defining the data included in each field of the output files came from the README file and the raw Python script.
The following data is collected from the CUPP output:
A some of the information about CUPP and its data is taken from its README, but predominately the information is taken from the CUPPprediction.py
Python script.
The section titled 'exploring the output' shows the exploration of the tools output files. This is to demonstrate how the data is constructed and presented, and forms a foundation for explaining the developed method of parsing the data.
The section 'parsing the output' shows the method of parsing the data from the CAZyme prediction tool.
The final section shows any additional parsing that was performed to make the statistical analysis of the tool's performance easier. This typically includes removing duplicates, and combining rows that represent data for the same predicted CAZyme.
# Install necessary libraries
!pip3 install pandas
!pip3 install numpy
import re
import pandas as pd
import numpy as np
from tqdm.notebook import tqdm
Requirement already satisfied: pandas in /home/em/.local/lib/python3.8/site-packages (1.1.4) Requirement already satisfied: python-dateutil>=2.7.3 in /home/em/anaconda3/lib/python3.8/site-packages (from pandas) (2.8.1) Requirement already satisfied: pytz>=2017.2 in /home/em/anaconda3/lib/python3.8/site-packages (from pandas) (2020.1) Requirement already satisfied: numpy>=1.15.4 in /home/em/.local/lib/python3.8/site-packages (from pandas) (1.19.4) Requirement already satisfied: six>=1.5 in /home/em/anaconda3/lib/python3.8/site-packages (from python-dateutil>=2.7.3->pandas) (1.15.0) Requirement already satisfied: numpy in /home/em/.local/lib/python3.8/site-packages (1.19.4)
CUPP produces two output files (a log file and a FASTA file) that contain the same data, but present it slightly differently.
The format of the data in the output FASTA file for each protein is as follows:
> accession | raw_function | best_function | additional_info | subfam \n seq
For example:
>QIX00022.1 AMS68_005539|&|AA1:<IP_ADDRESS>|AA1:<IP_ADDRESS>|AA1:6.1(20.3,124..357)|AA1_3
mvrsvnfplgvyfqykfikigtdttltweadpnreytvpsdcntspvlsgpwqyppvstsaavaiaatsttaqasavvtsqptycpntpttrncwadgfdintdfdnhwpttgrtvsytfeitnttlApDgvSRPvfaingqyPGPtIYADWgDMISVtvinklqdngttIHFHGVrQWHSNtqdgvpGLTECpIAPGTTRTyTfqatQfGTSwYHSHFSCQYGdGILGPiviqGpAtANYDIDVGpLpitdwyyptvnyhasitehtngsppvadnalINgTMTSSsggayaltklttgkrhRLrLINTSVDNHFMVSLdghqievitaDFvpIVPYNtTWimlgigqRYDVIITADQAPgnywfraevqdgcganannkniksmfaypghenetpistgsgytgrctdetqlvphwnsyvppkagfaeptffgtalnqstaadgtltlywqvngsslniqwdkptlqyvqesntsypsganvvetategqwtywviqevpgtpynvnvphplhLHGHDFFilGtgtdtwdakfsqnlnynnpprrdtamlpsngwivlawqtdnpgawLFhCHiAwhsdeglgvqfleaadqmqsvnpigtefdqqcqawhdfypvhasylkhdsgv
The following defines and the explains what data is included within each field of the output FASTA file.
Accession
This the data contained in the line starting with '>' in the input FASTA file containing the query sequences for CUPP. If the input FASTA file passed to CUPP was written output using pyrewton
the first item in the accession is the GenBank protein accession number. This is the unique identifier for each protein.
Raw function The following definition was taken from the raw Python script for CUPP.CUPPprediction.py
: The 'raw function' is produced "when consider[ing] all EC functions of a CUPP equally". This is preseted as "predicted_cazy_family : predicted_ec_number".
Best function The following definition was taken from the raw Python script for CUPP.CUPPprediction.py
: the best function is the "most occuring EC function of the CUPP group". It was inferred from the Python script CUPP.CUPPprediction.py
that the 'CUPP group' refers to the CAZy family k-mer cluster for which the query protein scored most highly. In the FASTA file this is presented as "predicted_cazy_family : predicted_ec_number". This is the function that is taken from the output files as the CUPP CAZyme and CAZy family prediction.
Additional information This includes several pieces of information that are calculated by CUPP. Owing to the manner that CUPP presents this data in the FASTA file it can be difficult to determine exactly which pieces of data have been provided. The additional data is presented in the following order (and the definitions were taken from the script CUPP.CUPPprediction.py
):
Subfam This is the predicted CAZy subfamily for the query protein
Seq This is the amino acid sequence of the query protein. It has not been determined why some letters up upper case and other lower case, although it is hypothesised that the upper case letters indicate the start of a k-mer hit found by CUPP.
The output log file for CUPP presents the same data as the FASTA, but presents the data in a different way. Instead of separating the data by '|' (which is used in the output FASTA file), the data is separated by tabulated white space ('\t').
Additionally, the data is presented in a different order to the output FASTA file:
The data in the CUPP FASTA file is separated by '|'. Each protein covers two lines of data
# Reading the CUPP output FASTA file
with open("gca_143535_cupp.fasta", "r") as fh:
fasta_file = fh.read().splitlines()
for line in fasta_file[:4]:
print(line)
>XP_001545605.1 BCIN_01g00260|&|AA4:<IP_ADDRESS>|AA4:<IP_ADDRESS>|AA4:1.1(13.9,122..568)| maasivttdtplalrvpnaattpaandplalppgtssekfaefishaeqttgaenviiirkkeeltkelytdpskahdmyhlfdkdyfvvsatiaprnveevqaivrlcndyeiplwpfsigrnvGYGgAAPRVPGSigldmgknmnkvlevnsegayallEPGvTFFSLydylkekklddqlwidtpdlgggsvvGNTIERGvGYTPYGDHFMMHCGLeVVlPTGELIRTGMGALPDPTQptveggsldqqpgnkcwqlfpygfgpYnDGIfSQSNlGIVTKMGIWLMpNPGGyQpylitfpkdtdlpkivdiirplrlqmviqnvpsirhilldaavmgtkksyydvdrplneeeldaiakelnlgrwnfygAlYgPKPvrdvlwqvvkdafgtiegakfflpedikekcvlhiraktlqgiptidelswvdwlpngahlffspiskisgedaskqyaltqkmtleagfdfigtftigmremhhiiclvfdrededqkrrahklireliqvcadngwgeYrTHIALMdqiaetygwndnaqmklnekiknaLDpKGILaPGKNGVWpAsYdrsawrldansertrtrp >XP_024545922.1 BCIN_01g00340|&|GT2:<IP_ADDRESS>|GT2:<IP_ADDRESS>|GT2:23.1(20.2,116..300)| mdgllelpvqilgglwevvrdtpvhvlgviligllglglgliyallllvapvprppypsektyitttpsgttetkpltcwydswvahreasvsksdscpantirtgaiepatlemslvvPaYNEEERLIgMLeealsfldttygrvargtgtgtgyeillvNDgSRDRTVEIAlDFSrknglhdvlrivtleenRGkGGAVTHGMRHVRGEYAVfADADGASRFADLGkLvkgvrevvdeegrgvavGSRaWLVGseAvvkRSALRNtlMhsfhlllrlltppatsrirdtQcGFKLFTRAAlPhiipymhaegwifdvemlmlaesapgvedaekgkgnggkakgikvseqpiawqevggsklnvmwdslgmawglavlrggwgmgvwrrr
# read the raw text in the fasta file
for line in fasta_file[:4]:
print(repr(line))
# the data is separated by '|'
'>XP_001545605.1 BCIN_01g00260|&|AA4:<IP_ADDRESS>|AA4:<IP_ADDRESS>|AA4:1.1(13.9,122..568)|' 'maasivttdtplalrvpnaattpaandplalppgtssekfaefishaeqttgaenviiirkkeeltkelytdpskahdmyhlfdkdyfvvsatiaprnveevqaivrlcndyeiplwpfsigrnvGYGgAAPRVPGSigldmgknmnkvlevnsegayallEPGvTFFSLydylkekklddqlwidtpdlgggsvvGNTIERGvGYTPYGDHFMMHCGLeVVlPTGELIRTGMGALPDPTQptveggsldqqpgnkcwqlfpygfgpYnDGIfSQSNlGIVTKMGIWLMpNPGGyQpylitfpkdtdlpkivdiirplrlqmviqnvpsirhilldaavmgtkksyydvdrplneeeldaiakelnlgrwnfygAlYgPKPvrdvlwqvvkdafgtiegakfflpedikekcvlhiraktlqgiptidelswvdwlpngahlffspiskisgedaskqyaltqkmtleagfdfigtftigmremhhiiclvfdrededqkrrahklireliqvcadngwgeYrTHIALMdqiaetygwndnaqmklnekiknaLDpKGILaPGKNGVWpAsYdrsawrldansertrtrp' '>XP_024545922.1 BCIN_01g00340|&|GT2:<IP_ADDRESS>|GT2:<IP_ADDRESS>|GT2:23.1(20.2,116..300)|' 'mdgllelpvqilgglwevvrdtpvhvlgviligllglglgliyallllvapvprppypsektyitttpsgttetkpltcwydswvahreasvsksdscpantirtgaiepatlemslvvPaYNEEERLIgMLeealsfldttygrvargtgtgtgyeillvNDgSRDRTVEIAlDFSrknglhdvlrivtleenRGkGGAVTHGMRHVRGEYAVfADADGASRFADLGkLvkgvrevvdeegrgvavGSRaWLVGseAvvkRSALRNtlMhsfhlllrlltppatsrirdtQcGFKLFTRAAlPhiipymhaegwifdvemlmlaesapgvedaekgkgnggkakgikvseqpiawqevggsklnvmwdslgmawglavlrggwgmgvwrrr'
The data in the CUPP log file is separated by '\t' (tabulated white space). Each protein is contained on a single line
# read the log file
with open("gca_143535_cupp.fasta.log", "r") as lfh:
log_file = lfh.read().splitlines()
for line in log_file[:4]:
print(line)
XP_001545605.1 BCIN_01g00260 AA4 AA4:1.1 13.9 7.39 268 122..568 107 AA4:<IP_ADDRESS> AA4:<IP_ADDRESS> XP_024545922.1 BCIN_01g00340 GT2 GT2:23.1 20.2 7.74 211 116..300 77 GT2:<IP_ADDRESS> GT2:<IP_ADDRESS> XP_001547235.1 BCIN_01g00640 AA3 AA3:3.1 64.0 144.16 274 26..553 453 AA3_1 XP_001547254.1 BCIN_01g00800 AA1 AA1:6.1 10.5 5.13 329 202..455 98 AA1:<IP_ADDRESS> AA1:<IP_ADDRESS> AA1_3
# read the raw text in the log file
for line in log_file[:4]:
print(repr(line))
# data is separated by '\t'
'XP_001545605.1 BCIN_01g00260\tAA4\tAA4:1.1\t13.9\t7.39\t268\t122..568\t107\tAA4:<IP_ADDRESS>\tAA4:<IP_ADDRESS>\t' 'XP_024545922.1 BCIN_01g00340\tGT2\tGT2:23.1\t20.2\t7.74\t211\t116..300\t77\tGT2:<IP_ADDRESS>\tGT2:<IP_ADDRESS>\t' 'XP_001547235.1 BCIN_01g00640\tAA3\tAA3:3.1\t64.0\t144.16\t274\t26..553\t453\t\t\tAA3_1' 'XP_001547254.1 BCIN_01g00800\tAA1\tAA1:6.1\t10.5\t5.13\t329\t202..455\t98\tAA1:<IP_ADDRESS>\tAA1:<IP_ADDRESS>\tAA1_3'
The output FASTA and log files of CUPP contain the same data, therefore, it is unnecessary to parse both output files.
A parser of the CUPP FASTA file would separate the protein data by the '|' separator character. This would parse the individual items of the protein data into a list, in the same order as they appear in the output FASTA file. This would allow the parser to selective retrieve the predicted CAZy families, EC numbers, etc.
However, '|' is a common data separator. A user or external database from which the input FASTA file containing the input query protein sequences for CUPP was retrieved, may include '|' characters in their FASTA files. For example, a protein data line may be written as ">XP_001545605.1|BCIN_01g00260|Botrytis cinerea B05.10|XM_001545555.2" in the CUPP input FASTA file. The entire contents of this protein data line would be included in the CUPP output FASTA file under the 'Accession' field. If the 'Accession' field contains '|', the items withint the 'Accession' field would also be separated and thus disrupt the selective retrieval of data.
The code blocks below demonstrate this theory.
# Example that would work
protein_data_line = '>XP_024545922.1 BCIN_01g00340|&|GT2:<IP_ADDRESS>|GT2:<IP_ADDRESS>|GT2:23.1(20.2,116..300)|'
protein_data = protein_data_line.split("|")
protein_data
['>XP_024545922.1 BCIN_01g00340', '&', 'GT2:<IP_ADDRESS>', 'GT2:<IP_ADDRESS>', 'GT2:23.1(20.2,116..300)', '']
print("best function=", protein_data[3])
best function= GT2:<IP_ADDRESS>
# Example that would cause the incorrect data to be retrieved
protein_data_line = '>XP_001545605.1|BCIN_01g00260|Botrytis cinerea B05.10|XM_001545555.2|&|GT2:<IP_ADDRESS>|GT2:<IP_ADDRESS>|GT2:23.1(20.2,116..300)|'
protein_data = protein_data_line.split("|")
protein_data
['>XP_001545605.1', 'BCIN_01g00260', 'Botrytis cinerea B05.10', 'XM_001545555.2', '&', 'GT2:<IP_ADDRESS>', 'GT2:<IP_ADDRESS>', 'GT2:23.1(20.2,116..300)', '']
print("best function=", protein_data[3])
best function= XM_001545555.2
Using '|' as a separator is common. Therefore, using '|' to identify separations between individual items of data may be a brittle approach when parsing the output from CUPP.
The data in the output Log file is separated by tabs '\t'. This is less common that '|' and was therefore, deemed the least brittle of the two files to parse. Consequently, a method to parse the CUPP output log file was developed.
The first task is to separate the out the data fields created by CUPP into separate elements in a list.
The explanation of the design of the data model is explained in the note book prediction_data_model.ipynb.
class CazymeDomain:
"""Single CAZyme domain in a protein, predicted by a CAZyme prediction tool.
Each unique CAZy domain per protein is identifiable by a unique CAZy
family-subfamily combination.
Every CAZyme domain has a source CAZyme prediction tool that predicted the CAZyme
domain, a parent CAZyme protein (represented by the protein accession), and CAZy
family and subfamily combination. If no CAZy subfamily is predicted, the
subfamily will be listed as a null value.
Hotpep, CUPP and eCAMI predict EC numbers for each CAZyme domain.
HMMER and CUPP predict amino acid domain ranges.
Multiple EC numbers and domain ranges can be predicted for a single CAZyme domain,
therefore, these attritbutes are stored as lists.
"""
def __init__(
self,
prediction_tool,
protein_accession,
cazy_family,
cazy_subfamily=None,
ec_numbers=None,
domain_range=None,
):
"""Initiate instance
:attr prediction_tool: str, CAZyme prediciton tool which predicted the domain
:attr protein_accession: str
:attr cazy_family: str
:attr cazy_subfamily: str
:attr ec_numbers: list (list of str, each str contains a unique EC number)
:attr domain_range: list (list of str, each str contains a unique domain range)
"""
self.prediction_tool = prediction_tool
self.protein_accession = protein_accession
self.cazy_family = cazy_family
# not all CAZyme domans are catalogued under a CAZy subfamily
if cazy_subfamily is None:
self.cazy_subfamiy = np.nan
else:
self.cazy_subfamily = cazy_subfamily
# EC numbers are not predicted for all CAZyme domains
if ec_numbers is None:
self.ec_numbers = [] # enables adding in EC numbers included in another line of the output file
else:
self.ec_numbers = ec_numbers
# Not all prediction tools predict CAZyme domains
if domain_range is None:
self.domain_range = [] # enables adding domain range listed in another line of the ouput file
else:
self.domain_range = domain_range
def __str__(self):
return f"-CazymeDomain in {self.protein_accession}, fam={self.cazy_family}, subfam={self.cazy_subfamily}-"
def __repr__(self):
return f"<CazymeDomain parent={self.protein_accession} fam={self.cazy_family}, subfam={self.cazy_subfamily}>"
class CazymeProteinPrediction:
"""Single protein and CAZyme/non-CAZyme prediction by a CAZyme prediction tool"""
def __init__(self, prediction_tool, protein_accession, cazyme_classification, cazyme_domains=None):
"""Initate class instance.
:attr prediction_tool: str, name of CAZyme prediction tool
:attr protein_accession: str
:attr cazyme_classification: int, 1=CAZyme, 0=non-CAZyme
:attr cazyme_domains: list of CazymeDomain instances, domain predicted to be in the CAZyme
"""
self.prediction_tool = prediction_tool
self.protein_accession = protein_accession
self.cazyme_classification = cazyme_classification # CAZyme=1, non-CAZyme=0
# non-CAZymes will have no cazyme_domains
if cazyme_domains is None:
self.cazyme_domains = [] # enables adding domain predictions too
else:
self.cazyme_domains = cazyme_domains
def __str__(self):
if self.cazyme_classification == 0:
return f"-CazymeProteinPrediction, protein={self.protein_accession}, non-CAZyme-"
else:
return f"-CazymeProteinPrediction, protein={self.protein_accession}, CAZyme domains={len(self.cazyme_domains)}-"
def __repr__(self):
return(
f"<CazymeProteinPrediction, protein={self.protein_accession}, "
f"cazyme_classification{self.cazyme_classification}>"
)
Now lets split up the data in the CUPP log file to prepare it for adding it to the data model. Additionally, we create a dictionary, key by the protein accession and valued by its corresponding CUPPprediction instance. This is to enable quick checking if a CUPPprediction instance has already been created for a protein.
cupp_predictions = {} # stores proteins {protein_accession:CUPPprediction_instance}
# first split the line into the individual pieces of data
for line in log_file[:2]:
prediction_output = line.split("\t")
print(prediction_output)
['XP_001545605.1 BCIN_01g00260', 'AA4', 'AA4:1.1', '13.9', '7.39', '268', '122..568', '107', 'AA4:<IP_ADDRESS>', 'AA4:<IP_ADDRESS>', ''] ['XP_024545922.1 BCIN_01g00340', 'GT2', 'GT2:23.1', '20.2', '7.74', '211', '116..300', '77', 'GT2:<IP_ADDRESS>', 'GT2:<IP_ADDRESS>', '']
The domain range is stored within the 'additional data' field by CUPP. However, if CUPP does not commute some of the fields within 'additional data' an empty object (such as an empty string) is not written out to the output FASTA or log files.
Reminder of the data included in the 'additional data' field by CUPP:
Therefore, if only the domain range is calculated, only the data for the domain range will be included, producing the following output:
XP_001545605.1 BCIN_01g00260 AA4 AA4:1.1 15...250
If the 'Ratio of maximum frequencies' and domain range are calculated, then two elements of data will be included in the space allocated for 'additional data' within the output FASTA and log files. Also, these elements within the 'additional data' are separated by the same character used to separate the other data fields in the output file (such as '\t' for output log file). Therefore, the following output would be produced:
XP_001545605.1 BCIN_01g00260 AA4 AA4:1.1 7.4 15...250
Therefore, retrieving the predicted domain range can not be achieved by calling for an element in the prediction_output
list by its index. However, the domain range is easy to identify by its characteristic '..' between two digits. The remaining data can be retrieved based upon its index in the prediction_output
list.
for line in log_file[:4]:
# separate the data fields
prediction_output = line.split("\t")
for item in prediction_output:
if item.find("..") != -1:
domain_range = item
break
else:
domain_range = np.nan
# store the prediction output in a dictionary
prediction = {
"protein_accession": prediction_output[0],
"cazy_family": prediction_output[1],
"cazy_subfamily": prediction_output[-1],
"ec_number": prediction_output[-2],
"domain_range": domain_range,
}
print("protein_accession =", prediction["protein_accession"])
print("CAZy family =", prediction["cazy_family"])
print("CAZy subfamily =", prediction["cazy_subfamily"])
print("EC# =", prediction["ec_number"])
print("Domain range =", prediction["domain_range"])
protein_accession = XP_001547254.1 BCIN_01g00800 CAZy family = AA1 CAZy subfamily = AA1_3 EC# = AA1:<IP_ADDRESS> Domain range = 202..455
This can be written into a single function, and a 'quality' control to check the believed domain range is in the expected format (digit..digit), to increase the probability of correctly identifying the domain range.
def get_cupp_domain_range(prediction_output):
"""Retrieve the predicted amino acid range of predicted CAZyme domain from CUPP log file.
:param prediction_output: list of items from log file line.
Return string if domain range given, or null value if a domain range is not given.
"""
domain_range = [] # store as a string in case multiple domain ranges are given
for item in prediction_output:
if item.find("..") != -1:
domain_range.append(item)
# check retrieved items are definetly the domain ranges
for item in domain_range:
try:
re.match(r"\d+\.\.\d+", item).group()
except AttributeError:
# write as logger in pyrewton
print(f"RAISED ATTRIBUTE ERROR: {item} misidentified as domain range")
domain_range.remove(item)
if len(domain_range) == 0:
domain_range = np.nan
else:
domain_range = ", ".join(domain_range)
return domain_range
for line in log_file[:4]:
# separate the data fields
prediction_output = line.split("\t")
domain_range = get_cupp_domain_range(prediction_output)
print(domain_range)
122..568 116..300 26..553 202..455
The CAZy family and associated EC number are stored within the same element in the prediction_output
list. The CAZy family is always listed first, followed by a colon and then the EC number, which allows the retrieval of only the EC number.
The item at position [-2]
in prediction_output is the 'Best function' predicted by CUPP, the item at position [-3]
is the raw function. The item listed is the 'Best function' is taken as the predicted CAZy family and associated EC numbers for the protein.
for line in log_file[:4]:
# separate the data fields
prediction_output = line.split("\t")
# retrieve the predicted domain range
for item in prediction_output:
if item.find("..") != -1:
domain_range = item
break
else:
domain_range = np.nan
# retrieve the predicted EC number
try:
ec_number = prediction_output[-2].split(":")[1]
except IndexError:
ec_number = np.nan
# store the prediction output in a dictionary
prediction = {
"protein_accession": prediction_output[0],
"cazy_family": prediction_output[1],
"cazy_subfamily": prediction_output[-1],
"ec_number": ec_number,
"domain_range": domain_range,
}
print("protein_accession =", prediction["protein_accession"])
print("CAZy family =", prediction["cazy_family"])
print("CAZy subfamily =", prediction["cazy_subfamily"])
print("EC# =", prediction["ec_number"])
print("Domain range =", prediction["domain_range"])
protein_accession = XP_001547254.1 BCIN_01g00800 CAZy family = AA1 CAZy subfamily = AA1_3 EC# = <IP_ADDRESS> Domain range = 202..455
The retrieval of the predicted EC number appears susceptible to errors. The appear to result from not fully analysing all potential formats that CUPP may write out its predicted EC numbers.
Therefore, first lets look at the EC numbers listed in the CUPP output log file.
for line in log_file:
# separate the data fields
prediction_output = line.split("\t")
print(prediction_output[-2], repr(prediction_output[-2]))
AA4:<IP_ADDRESS> 'AA4:<IP_ADDRESS>' GT2:<IP_ADDRESS> 'GT2:<IP_ADDRESS>' '' AA1:<IP_ADDRESS> 'AA1:<IP_ADDRESS>' '' '' GT39:<IP_ADDRESS> 'GT39:<IP_ADDRESS>' GT2:<IP_ADDRESS> 'GT2:<IP_ADDRESS>' AA11:1.*.*.* 'AA11:1.*.*.*' GH71:<IP_ADDRESS> 'GH71:<IP_ADDRESS>' GH71:<IP_ADDRESS> 'GH71:<IP_ADDRESS>' GH38:<IP_ADDRESS> 'GH38:<IP_ADDRESS>' GH38:<IP_ADDRESS> 'GH38:<IP_ADDRESS>' GT2:<IP_ADDRESS> 'GT2:<IP_ADDRESS>' GT2:<IP_ADDRESS> 'GT2:<IP_ADDRESS>' '' GH47:<IP_ADDRESS> 'GH47:<IP_ADDRESS>' '' GH114:<IP_ADDRESS> 'GH114:<IP_ADDRESS>' GH135:3.2.1.* 'GH135:3.2.1.*' GH16:2.4.1.*&3.2.1.*-GH16:<IP_ADDRESS> 'GH16:2.4.1.*&3.2.1.*-GH16:<IP_ADDRESS>' GH47:<IP_ADDRESS> 'GH47:<IP_ADDRESS>' CE12:3.1.1.* 'CE12:3.1.1.*' AA1:<IP_ADDRESS> 'AA1:<IP_ADDRESS>' '' GH28:<IP_ADDRESS> 'GH28:<IP_ADDRESS>' '' GH28:<IP_ADDRESS> 'GH28:<IP_ADDRESS>' GH125:3.2.1.* 'GH125:3.2.1.*' AA1:<IP_ADDRESS> 'AA1:<IP_ADDRESS>' GH27:<IP_ADDRESS> 'GH27:<IP_ADDRESS>' GH135:3.2.1.* 'GH135:3.2.1.*' GT50:2.4.1.* 'GT50:2.4.1.*' CE16:<IP_ADDRESS> 'CE16:<IP_ADDRESS>' '' GT20:<IP_ADDRESS> 'GT20:<IP_ADDRESS>' '' CE5:<IP_ADDRESS> 'CE5:<IP_ADDRESS>' '' CE9:<IP_ADDRESS> 'CE9:<IP_ADDRESS>' GH13:<IP_ADDRESS>&<IP_ADDRESS> 'GH13:<IP_ADDRESS>&<IP_ADDRESS>' GH13:<IP_ADDRESS>&<IP_ADDRESS> 'GH13:<IP_ADDRESS>&<IP_ADDRESS>' '' CE5:<IP_ADDRESS> 'CE5:<IP_ADDRESS>' '' CE8:<IP_ADDRESS> 'CE8:<IP_ADDRESS>' GH28:3.2.1.* 'GH28:3.2.1.*' '' GH76:<IP_ADDRESS> 'GH76:<IP_ADDRESS>' '' GH88:3.2.1.* 'GH88:3.2.1.*' '' '' '' '' '' GH71:<IP_ADDRESS> 'GH71:<IP_ADDRESS>' GH71:<IP_ADDRESS> 'GH71:<IP_ADDRESS>' '' GH18:<IP_ADDRESS> 'GH18:<IP_ADDRESS>' GT21:<IP_ADDRESS> 'GT21:<IP_ADDRESS>' '' '' GH27:<IP_ADDRESS>-GH27:<IP_ADDRESS> 'GH27:<IP_ADDRESS>-GH27:<IP_ADDRESS>' GH45:<IP_ADDRESS> 'GH45:<IP_ADDRESS>' GT39:<IP_ADDRESS> 'GT39:<IP_ADDRESS>' '' AA9:1.*.*.* 'AA9:1.*.*.*' GT66:<IP_ADDRESS> 'GT66:<IP_ADDRESS>' '' AA1:<IP_ADDRESS> 'AA1:<IP_ADDRESS>' AA1:<IP_ADDRESS> 'AA1:<IP_ADDRESS>' GH1:<IP_ADDRESS>&<IP_ADDRESS> 'GH1:<IP_ADDRESS>&<IP_ADDRESS>' GT15:<IP_ADDRESS> 'GT15:<IP_ADDRESS>' '' GH16:<IP_ADDRESS>-GH16:<IP_ADDRESS> 'GH16:<IP_ADDRESS>-GH16:<IP_ADDRESS>' '' '' GT22:<IP_ADDRESS>9&<IP_ADDRESS>1 'GT22:<IP_ADDRESS>9&<IP_ADDRESS>1' GT24:2.4.1.* 'GT24:2.4.1.*' GH13:<IP_ADDRESS>-GH13:<IP_ADDRESS> 'GH13:<IP_ADDRESS>-GH13:<IP_ADDRESS>' GH28:<IP_ADDRESS> 'GH28:<IP_ADDRESS>' '' '' '' GT48:<IP_ADDRESS> 'GT48:<IP_ADDRESS>' GH72:2.4.1.* 'GH72:2.4.1.*' '' CE12:3.1.1.* 'CE12:3.1.1.*' GH16:<IP_ADDRESS>-GH16:<IP_ADDRESS> 'GH16:<IP_ADDRESS>-GH16:<IP_ADDRESS>' GH16:<IP_ADDRESS>-GH16:<IP_ADDRESS> 'GH16:<IP_ADDRESS>-GH16:<IP_ADDRESS>' '' AA1:<IP_ADDRESS> 'AA1:<IP_ADDRESS>' GH43:<IP_ADDRESS> 'GH43:<IP_ADDRESS>' GH76:<IP_ADDRESS> 'GH76:<IP_ADDRESS>' GH5:<IP_ADDRESS> 'GH5:<IP_ADDRESS>' GT20:<IP_ADDRESS> 'GT20:<IP_ADDRESS>' GH93:3.2.1.* 'GH93:3.2.1.*' GH2:<IP_ADDRESS> 'GH2:<IP_ADDRESS>' GH71:<IP_ADDRESS> 'GH71:<IP_ADDRESS>' PL1:<IP_ADDRESS> 'PL1:<IP_ADDRESS>' '' GH11:<IP_ADDRESS> 'GH11:<IP_ADDRESS>' '' AA3:<IP_ADDRESS> 'AA3:<IP_ADDRESS>' '' GH5:<IP_ADDRESS> 'GH5:<IP_ADDRESS>' '' '' GH28:<IP_ADDRESS> 'GH28:<IP_ADDRESS>' GT22:2.4.1.* 'GT22:2.4.1.*' '' GH27:<IP_ADDRESS> 'GH27:<IP_ADDRESS>' '' '' GH10:<IP_ADDRESS> 'GH10:<IP_ADDRESS>' '' GH12:<IP_ADDRESS> 'GH12:<IP_ADDRESS>' CE8:<IP_ADDRESS> 'CE8:<IP_ADDRESS>' '' GH5:<IP_ADDRESS> 'GH5:<IP_ADDRESS>' GT32:2.4.1.* 'GT32:2.4.1.*' '' CE8:<IP_ADDRESS> 'CE8:<IP_ADDRESS>' GH81:<IP_ADDRESS> 'GH81:<IP_ADDRESS>' '' '' PL1:<IP_ADDRESS> 'PL1:<IP_ADDRESS>' AA9:1.*.*.* 'AA9:1.*.*.*' GT76:2.4.1.* 'GT76:2.4.1.*' '' GT90:2.4.1.*&2.4.2.* 'GT90:2.4.1.*&2.4.2.*' '' '' '' GH15:<IP_ADDRESS> 'GH15:<IP_ADDRESS>' GH71:<IP_ADDRESS> 'GH71:<IP_ADDRESS>' PL3:<IP_ADDRESS> 'PL3:<IP_ADDRESS>' GT62:2.4.1.* 'GT62:2.4.1.*' '' '' GT2:<IP_ADDRESS> 'GT2:<IP_ADDRESS>' GH15:<IP_ADDRESS> 'GH15:<IP_ADDRESS>' GH15:<IP_ADDRESS> 'GH15:<IP_ADDRESS>' GH28:<IP_ADDRESS> 'GH28:<IP_ADDRESS>' GH35:<IP_ADDRESS> 'GH35:<IP_ADDRESS>' GT2:2.4.1.* 'GT2:2.4.1.*' '' '' GT4:<IP_ADDRESS> 'GT4:<IP_ADDRESS>' GH43:<IP_ADDRESS> 'GH43:<IP_ADDRESS>' GH47:<IP_ADDRESS> 'GH47:<IP_ADDRESS>' GH2:<IP_ADDRESS> 'GH2:<IP_ADDRESS>' GH16:<IP_ADDRESS> 'GH16:<IP_ADDRESS>' GT1:<IP_ADDRESS> 'GT1:<IP_ADDRESS>' '' '' '' GH28:<IP_ADDRESS> 'GH28:<IP_ADDRESS>' '' GT69:2.4.1.* 'GT69:2.4.1.*' '' AA1:<IP_ADDRESS> 'AA1:<IP_ADDRESS>' '' '' GH72:2.4.1.* 'GH72:2.4.1.*' AA7:1.1.3.* 'AA7:1.1.3.*' '' GH10:<IP_ADDRESS> 'GH10:<IP_ADDRESS>' AA8:<IP_ADDRESS> 'AA8:<IP_ADDRESS>' '' '' GH64:<IP_ADDRESS> 'GH64:<IP_ADDRESS>' GH3:Unknown 'GH3:Unknown' GH76:<IP_ADDRESS> 'GH76:<IP_ADDRESS>' GH115:3.2.1.*-GH115:<IP_ADDRESS> 'GH115:3.2.1.*-GH115:<IP_ADDRESS>' '' GH28:<IP_ADDRESS> 'GH28:<IP_ADDRESS>' '' GH89:<IP_ADDRESS> 'GH89:<IP_ADDRESS>' GT71:2.4.1.* 'GT71:2.4.1.*' GT71:2.4.1.* 'GT71:2.4.1.*' GT1:<IP_ADDRESS> 'GT1:<IP_ADDRESS>' AA9:1.*.*.* 'AA9:1.*.*.*' '' '' GH55:<IP_ADDRESS> 'GH55:<IP_ADDRESS>' AA7:1.1.3.* 'AA7:1.1.3.*' '' '' '' GH43:<IP_ADDRESS> 'GH43:<IP_ADDRESS>' GH79:3.2.1.*&<IP_ADDRESS> 'GH79:3.2.1.*&<IP_ADDRESS>' '' GH28:<IP_ADDRESS> 'GH28:<IP_ADDRESS>' GT62:2.4.1.* 'GT62:2.4.1.*' GH125:3.2.1.* 'GH125:3.2.1.*' GH76:<IP_ADDRESS> 'GH76:<IP_ADDRESS>' '' CE16:<IP_ADDRESS> 'CE16:<IP_ADDRESS>' '' '' '' GH47:<IP_ADDRESS> 'GH47:<IP_ADDRESS>' GH5:<IP_ADDRESS> 'GH5:<IP_ADDRESS>' GH3:<IP_ADDRESS> 'GH3:<IP_ADDRESS>' GH31:<IP_ADDRESS> 'GH31:<IP_ADDRESS>' AA13:1.*.*.* 'AA13:1.*.*.*' GH64:<IP_ADDRESS> 'GH64:<IP_ADDRESS>' GT71:2.4.1.* 'GT71:2.4.1.*' GT15:<IP_ADDRESS> 'GT15:<IP_ADDRESS>' GH47:<IP_ADDRESS> 'GH47:<IP_ADDRESS>' GH132:3.2.1.* 'GH132:3.2.1.*' GH132:3.2.1.* 'GH132:3.2.1.*' AA6:<IP_ADDRESS> 'AA6:<IP_ADDRESS>' CE16:<IP_ADDRESS> 'CE16:<IP_ADDRESS>' GH78:<IP_ADDRESS> 'GH78:<IP_ADDRESS>' '' '' '' AA9:1.*.*.* 'AA9:1.*.*.*' GT33:<IP_ADDRESS> 'GT33:<IP_ADDRESS>' GH71:<IP_ADDRESS> 'GH71:<IP_ADDRESS>' GH18:<IP_ADDRESS> 'GH18:<IP_ADDRESS>' GT90:2.4.1.*&2.4.2.* 'GT90:2.4.1.*&2.4.2.*' GT22:2.4.1.* 'GT22:2.4.1.*' GH18:<IP_ADDRESS> 'GH18:<IP_ADDRESS>' GT20:<IP_ADDRESS> 'GT20:<IP_ADDRESS>' GT20:<IP_ADDRESS> 'GT20:<IP_ADDRESS>' GT20:<IP_ADDRESS> 'GT20:<IP_ADDRESS>' CE5:<IP_ADDRESS> 'CE5:<IP_ADDRESS>' GT2:<IP_ADDRESS> 'GT2:<IP_ADDRESS>' '' '' GH15:<IP_ADDRESS> 'GH15:<IP_ADDRESS>' GH15:<IP_ADDRESS> 'GH15:<IP_ADDRESS>' GH5:<IP_ADDRESS> 'GH5:<IP_ADDRESS>' GH71:<IP_ADDRESS> 'GH71:<IP_ADDRESS>' GH55:<IP_ADDRESS> 'GH55:<IP_ADDRESS>' '' GT69:2.4.1.* 'GT69:2.4.1.*' GT69:2.4.1.* 'GT69:2.4.1.*' GT69:2.4.1.* 'GT69:2.4.1.*' AA3:<IP_ADDRESS> 'AA3:<IP_ADDRESS>' CE16:<IP_ADDRESS> 'CE16:<IP_ADDRESS>' GH16:<IP_ADDRESS> 'GH16:<IP_ADDRESS>' GH16:<IP_ADDRESS> 'GH16:<IP_ADDRESS>' AA11:1.*.*.* 'AA11:1.*.*.*' '' '' '' GH20:<IP_ADDRESS> 'GH20:<IP_ADDRESS>' GH20:<IP_ADDRESS> 'GH20:<IP_ADDRESS>' GH16:2.4.1.*&3.2.1.*-GH16:<IP_ADDRESS> 'GH16:2.4.1.*&3.2.1.*-GH16:<IP_ADDRESS>' '' GH78:Unknown 'GH78:Unknown' GH47:<IP_ADDRESS> 'GH47:<IP_ADDRESS>' GH47:<IP_ADDRESS> 'GH47:<IP_ADDRESS>' '' GH132:3.2.1.* 'GH132:3.2.1.*' GH1:<IP_ADDRESS> 'GH1:<IP_ADDRESS>' GH1:<IP_ADDRESS> 'GH1:<IP_ADDRESS>' GH95:<IP_ADDRESS> 'GH95:<IP_ADDRESS>' AA1:<IP_ADDRESS> 'AA1:<IP_ADDRESS>' '' GH43:<IP_ADDRESS> 'GH43:<IP_ADDRESS>' GT1:<IP_ADDRESS> 'GT1:<IP_ADDRESS>' GT90:2.4.1.*&2.4.2.* 'GT90:2.4.1.*&2.4.2.*' GH51:<IP_ADDRESS> 'GH51:<IP_ADDRESS>' GH17:2.4.1.* 'GH17:2.4.1.*' '' '' '' '' AA3:Unknown 'AA3:Unknown' GH5:<IP_ADDRESS> 'GH5:<IP_ADDRESS>' '' '' GH13:2.4.1.* 'GH13:2.4.1.*' GH13:2.4.1.* 'GH13:2.4.1.*' CE8:<IP_ADDRESS> 'CE8:<IP_ADDRESS>' AA1:<IP_ADDRESS> 'AA1:<IP_ADDRESS>' PL1:<IP_ADDRESS> 'PL1:<IP_ADDRESS>' GT32:2.4.1.* 'GT32:2.4.1.*' '' '' '' '' GT15:<IP_ADDRESS> 'GT15:<IP_ADDRESS>' GH16:<IP_ADDRESS> 'GH16:<IP_ADDRESS>' GH95:<IP_ADDRESS> 'GH95:<IP_ADDRESS>' GT32:2.4.1.* 'GT32:2.4.1.*' GH76:<IP_ADDRESS> 'GH76:<IP_ADDRESS>' GH53:<IP_ADDRESS> 'GH53:<IP_ADDRESS>' '' GH18:<IP_ADDRESS> 'GH18:<IP_ADDRESS>' GH18:<IP_ADDRESS> 'GH18:<IP_ADDRESS>' GH76:<IP_ADDRESS> 'GH76:<IP_ADDRESS>' '' '' GH131:3.2.1.* 'GH131:3.2.1.*' GH131:3.2.1.* 'GH131:3.2.1.*' GT2:<IP_ADDRESS> 'GT2:<IP_ADDRESS>' GH37:<IP_ADDRESS> 'GH37:<IP_ADDRESS>' '' '' GH16:<IP_ADDRESS> 'GH16:<IP_ADDRESS>' AA1:<IP_ADDRESS> 'AA1:<IP_ADDRESS>' GH76:<IP_ADDRESS> 'GH76:<IP_ADDRESS>' '' GT1:<IP_ADDRESS> 'GT1:<IP_ADDRESS>' '' GH16:<IP_ADDRESS>-GH16:<IP_ADDRESS> 'GH16:<IP_ADDRESS>-GH16:<IP_ADDRESS>' AA5:<IP_ADDRESS> 'AA5:<IP_ADDRESS>' AA5:<IP_ADDRESS> 'AA5:<IP_ADDRESS>' '' GH51:<IP_ADDRESS> 'GH51:<IP_ADDRESS>' GH65:<IP_ADDRESS> 'GH65:<IP_ADDRESS>' '' GH16:<IP_ADDRESS>-GH16:<IP_ADDRESS> 'GH16:<IP_ADDRESS>-GH16:<IP_ADDRESS>' AA1:<IP_ADDRESS> 'AA1:<IP_ADDRESS>' AA1:<IP_ADDRESS> 'AA1:<IP_ADDRESS>' AA1:<IP_ADDRESS> 'AA1:<IP_ADDRESS>' '' '' GT32:2.4.1.* 'GT32:2.4.1.*' AA9:1.*.*.* 'AA9:1.*.*.*' AA9:1.*.*.* 'AA9:1.*.*.*'  GH31:<IP_ADDRESS> 'GH31:<IP_ADDRESS>' '' GH35:<IP_ADDRESS> 'GH35:<IP_ADDRESS>' GT15:<IP_ADDRESS> 'GT15:<IP_ADDRESS>' GH5:<IP_ADDRESS> 'GH5:<IP_ADDRESS>' GH28:<IP_ADDRESS> 'GH28:<IP_ADDRESS>' '' GT2:<IP_ADDRESS> 'GT2:<IP_ADDRESS>' GT2:<IP_ADDRESS> 'GT2:<IP_ADDRESS>' '' GH16:<IP_ADDRESS> 'GH16:<IP_ADDRESS>' GH125:3.2.1.* 'GH125:3.2.1.*' '' GT62:2.4.1.* 'GT62:2.4.1.*' '' AA3:Unknown 'AA3:Unknown' AA8:<IP_ADDRESS> 'AA8:<IP_ADDRESS>' '' GH15:<IP_ADDRESS> 'GH15:<IP_ADDRESS>' '' AA9:1.*.*.* 'AA9:1.*.*.*' GH28:<IP_ADDRESS> 'GH28:<IP_ADDRESS>' GT58:<IP_ADDRESS>8 'GT58:<IP_ADDRESS>8' '' GH5:<IP_ADDRESS> 'GH5:<IP_ADDRESS>' GT2:<IP_ADDRESS> 'GT2:<IP_ADDRESS>' GT2:<IP_ADDRESS> 'GT2:<IP_ADDRESS>' '' '' GH131:3.2.1.* 'GH131:3.2.1.*' GH16:<IP_ADDRESS>-GH16:<IP_ADDRESS> 'GH16:<IP_ADDRESS>-GH16:<IP_ADDRESS>' GH5:<IP_ADDRESS> 'GH5:<IP_ADDRESS>' GH45:<IP_ADDRESS> 'GH45:<IP_ADDRESS>' AA1:<IP_ADDRESS> 'AA1:<IP_ADDRESS>' GT57:2.4.1.* 'GT57:2.4.1.*' '' GH12:<IP_ADDRESS> 'GH12:<IP_ADDRESS>' GH72:2.4.1.* 'GH72:2.4.1.*' GH28:<IP_ADDRESS> 'GH28:<IP_ADDRESS>' GH5:<IP_ADDRESS> 'GH5:<IP_ADDRESS>' GH76:<IP_ADDRESS> 'GH76:<IP_ADDRESS>' GH16:2.4.1.*&3.2.1.*-GH16:<IP_ADDRESS> 'GH16:2.4.1.*&3.2.1.*-GH16:<IP_ADDRESS>' GT4:<IP_ADDRESS>&<IP_ADDRESS>7 'GT4:<IP_ADDRESS>&<IP_ADDRESS>7' '' '' GH78:<IP_ADDRESS>-GH78:<IP_ADDRESS> 'GH78:<IP_ADDRESS>-GH78:<IP_ADDRESS>' AA3:Unknown 'AA3:Unknown' GT1:<IP_ADDRESS> 'GT1:<IP_ADDRESS>' GH78:<IP_ADDRESS> 'GH78:<IP_ADDRESS>' '' GT71:2.4.1.* 'GT71:2.4.1.*' AA5:<IP_ADDRESS> 'AA5:<IP_ADDRESS>' CE5:<IP_ADDRESS> 'CE5:<IP_ADDRESS>' AA3:Unknown 'AA3:Unknown' '' '' '' GH28:<IP_ADDRESS> 'GH28:<IP_ADDRESS>' GH28:<IP_ADDRESS> 'GH28:<IP_ADDRESS>' GH28:<IP_ADDRESS> 'GH28:<IP_ADDRESS>' GH28:<IP_ADDRESS> 'GH28:<IP_ADDRESS>' GH28:<IP_ADDRESS> 'GH28:<IP_ADDRESS>' '' GH28:<IP_ADDRESS> 'GH28:<IP_ADDRESS>' CE8:<IP_ADDRESS> 'CE8:<IP_ADDRESS>' GT71:2.4.1.* 'GT71:2.4.1.*'  CE9:<IP_ADDRESS> 'CE9:<IP_ADDRESS>' '' GH62:<IP_ADDRESS> 'GH62:<IP_ADDRESS>' CE5:<IP_ADDRESS> 'CE5:<IP_ADDRESS>' GT1:<IP_ADDRESS> 'GT1:<IP_ADDRESS>' '' GH47:<IP_ADDRESS> 'GH47:<IP_ADDRESS>' CE1:<IP_ADDRESS> 'CE1:<IP_ADDRESS>' AA3:<IP_ADDRESS> 'AA3:<IP_ADDRESS>' GH11:<IP_ADDRESS> 'GH11:<IP_ADDRESS>' GH71:<IP_ADDRESS> 'GH71:<IP_ADDRESS>' GT57:2.4.1.* 'GT57:2.4.1.*' GH13:<IP_ADDRESS> 'GH13:<IP_ADDRESS>' GH13:<IP_ADDRESS> 'GH13:<IP_ADDRESS>' GT3:<IP_ADDRESS> 'GT3:<IP_ADDRESS>' GH3:<IP_ADDRESS> 'GH3:<IP_ADDRESS>' GH16:2.4.1.*&3.2.1.*-GH16:<IP_ADDRESS> 'GH16:2.4.1.*&3.2.1.*-GH16:<IP_ADDRESS>' CE5:<IP_ADDRESS> 'CE5:<IP_ADDRESS>' AA9:1.*.*.* 'AA9:1.*.*.*' '' GT39:<IP_ADDRESS> 'GT39:<IP_ADDRESS>' GT35:<IP_ADDRESS> 'GT35:<IP_ADDRESS>' GT59:<IP_ADDRESS>6 'GT59:<IP_ADDRESS>6' '' GH72:2.4.1.* 'GH72:2.4.1.*' GH76:<IP_ADDRESS> 'GH76:<IP_ADDRESS>' GT1:<IP_ADDRESS> 'GT1:<IP_ADDRESS>' GH71:<IP_ADDRESS> 'GH71:<IP_ADDRESS>' GT69:2.4.1.* 'GT69:2.4.1.*' GH18:<IP_ADDRESS> 'GH18:<IP_ADDRESS>' GH63:<IP_ADDRESS> 'GH63:<IP_ADDRESS>' GH5:<IP_ADDRESS> 'GH5:<IP_ADDRESS>' '' GH1:<IP_ADDRESS>&<IP_ADDRESS> 'GH1:<IP_ADDRESS>&<IP_ADDRESS>' GH16:<IP_ADDRESS>-GH16:<IP_ADDRESS> 'GH16:<IP_ADDRESS>-GH16:<IP_ADDRESS>' '' GH47:<IP_ADDRESS> 'GH47:<IP_ADDRESS>' GH47:<IP_ADDRESS> 'GH47:<IP_ADDRESS>' GH32:<IP_ADDRESS> 'GH32:<IP_ADDRESS>'
The above shows that when no EC number is predicted an empty string is provided (in the same manner as discussed when retrieving the predicted CAZy subfamily). It is better to store missing data as a null value instead. Furthermore, sometimes instead of writing out an empty string the word 'Unknown' is written out. For standardisation of the output this to will be converted to a null value.
Additionally, it is more common practise to annotate missing digits in an EC number with -
rather than *
. Changing *
or -
would also bring the EC number output from CUPP in line with the other CAZyme prediction tools.
For human readability, when multiple EC numbers are predicted, the '&' will be changed to separate the EC numbers by a comma and match the formating of presenting multiple predicted CAZy subfamilies.
Another issue with the retrieval of the predicted EC numbers is that the above method does not retrieval all predicted EC numbers. If multiple EC numbers are predicted these predictions may be separated by '-'.
For example, protein XP_001561324.1 BCIN_01g06010, has the following output in the log file:
['XP_001561324.1 BCIN_01g06010', 'GH16', 'GH16:21.1', '14.8', '4.11', '123', '89..206', '56', 'GH16:2.4.1.*&3.2.1.*-GH16:<IP_ADDRESS>', 'GH16:2.4.1.*&3.2.1.*-GH16:<IP_ADDRESS>', '']
Where, GH16:2.4.1.*&3.2.1.*-GH16:<IP_ADDRESS>
and GH16:2.4.1.*&3.2.1.*-GH16:<IP_ADDRESS>
, contain multiple listed EC numbers, separated by '-'.
Therefore, additional checks for multiple predicated EC numbers and quality checking of EC number formating to ensure only the EC number is retrieved was added to the method of parsing the log file.
The below examples look at the first few lines to highlight some important examples of data.
for line in log_file[462:]:
# separate the data fields
prediction_output = line.split("\t")
# retrieve the predicted EC number
ec_data = prediction_output[-2].split(":")
if len(ec_data) == 1: # no EC number predicted
ec_number = np.nan
elif len(ec_data) == 2:
# element 0 is the CAZy family
all_ec_numbers = []
ec_split = ec_data[1].split("&") # if multiple EC numbers are predicted, separate them
for item in ec_split:
# check formating, somtimes 'Unknown' is written in stead of an EC number
try:
re.match(r"\d+?\.(\d+?|\*)\.(\d+?|\*)\.(\d+?|\*)", item)
item = item.replace("*","-") # standardise missing digit format
except AttributeError:
pass
all_ec_numbers.append(item)
if len(all_ec_numbers) == 0:
ec_number = np.nan
else:
ec_number = ", ".join(all_ec_numbers)
print("Checking EC# parsing\nec_split=", ec_split, "\nall_ec_numbers=", all_ec_numbers, "\nec_number=", ec_number)
Checking EC# parsing ec_split= ['<IP_ADDRESS>'] all_ec_numbers= ['<IP_ADDRESS>'] ec_number= <IP_ADDRESS> Checking EC# parsing ec_split= ['<IP_ADDRESS>'] all_ec_numbers= ['<IP_ADDRESS>'] ec_number= <IP_ADDRESS> Checking EC# parsing ec_split= ['<IP_ADDRESS>6'] all_ec_numbers= ['<IP_ADDRESS>6'] ec_number= <IP_ADDRESS>6 Checking EC# parsing ec_split= ['2.4.1.*'] all_ec_numbers= ['2.4.1.-'] ec_number= 2.4.1.- Checking EC# parsing ec_split= ['<IP_ADDRESS>'] all_ec_numbers= ['<IP_ADDRESS>'] ec_number= <IP_ADDRESS> Checking EC# parsing ec_split= ['<IP_ADDRESS>'] all_ec_numbers= ['<IP_ADDRESS>'] ec_number= <IP_ADDRESS> Checking EC# parsing ec_split= ['<IP_ADDRESS>'] all_ec_numbers= ['<IP_ADDRESS>'] ec_number= <IP_ADDRESS> Checking EC# parsing ec_split= ['2.4.1.*'] all_ec_numbers= ['2.4.1.-'] ec_number= 2.4.1.- Checking EC# parsing ec_split= ['<IP_ADDRESS>'] all_ec_numbers= ['<IP_ADDRESS>'] ec_number= <IP_ADDRESS> Checking EC# parsing ec_split= ['<IP_ADDRESS>'] all_ec_numbers= ['<IP_ADDRESS>'] ec_number= <IP_ADDRESS> Checking EC# parsing ec_split= ['<IP_ADDRESS>'] all_ec_numbers= ['<IP_ADDRESS>'] ec_number= <IP_ADDRESS> Checking EC# parsing ec_split= ['<IP_ADDRESS>', '<IP_ADDRESS>'] all_ec_numbers= ['<IP_ADDRESS>', '<IP_ADDRESS>'] ec_number= <IP_ADDRESS>, <IP_ADDRESS> Checking EC# parsing ec_split= ['<IP_ADDRESS>'] all_ec_numbers= ['<IP_ADDRESS>'] ec_number= <IP_ADDRESS> Checking EC# parsing ec_split= ['<IP_ADDRESS>'] all_ec_numbers= ['<IP_ADDRESS>'] ec_number= <IP_ADDRESS> Checking EC# parsing ec_split= ['<IP_ADDRESS>'] all_ec_numbers= ['<IP_ADDRESS>'] ec_number= <IP_ADDRESS>
From this we can define a function to retrieved the predicted EC numbers for the CAZy family that CUPP has listed as the 'Best function' for the protein.
def get_cupp_ec_number(prediction_output):
"""Retrieve predicted EC numbers from CUPP log file.
EC numbers are represented as "CAZy_fam:EC_number" in the log file.
If multiple EC numbers are predicated and the CAZy families of each are
given then these are separated by '-'. If multiple EC numbers are predicated
for the same CAZy family, these are separated by '&'.
:param prediciton_output: list of items from log file line.
 However, it is better if the resulting Pandas dataframe contains a null value instead.
At this stage we can also create an empty dataframe, to which the data from each parsed protein is added.
# build an empty dataframe
cupp_df = pd.DataFrame(columns=[
"protein_accession",
"cazy_family",
"cazy_subfamily",
"ec_number",
"domain_range",
])
for line in log_file[:10]:
# separate the data fields
prediction_output = line.split("\t")
# retrieve the predicted domain range if given
for item in prediction_output:
if item.find("..") != -1:
domain_range = item
break
else:
domain_range = np.nan
# retrieve the predicted EC number
try:
ec_number = prediction_output[-2].split(":")[1]
except IndexError:
ec_number = np.nan
# store the prediction output in a dictionary
prediction = {
"protein_accession": [prediction_output[0]],
"cazy_family": [prediction_output[1]],
"cazy_subfamily": [prediction_output[-1]],
"ec_number": ec_number,
"domain_range": [domain_range],
}
# if no CAZy subfamily was predicted, change empty string to null value
if len(prediction["cazy_subfamily"][0]) == 0:
prediction["cazy_subfamily"][0] = np.nan
# create dataframe to represent the current working protein
prediction_df = pd.DataFrame(prediction)
# add protein to CUPP dataframe
cupp_df = cupp_df.append(prediction_df)
cupp_df
| protein_accession | cazy_family | cazy_subfamily | ec_number | domain_range | |
|---|---|---|---|---|---|
| 0 | XP_001545605.1 BCIN_01g00260 | AA4 | NaN | <IP_ADDRESS> | 122..568 |
| 0 | XP_024545922.1 BCIN_01g00340 | GT2 | NaN | <IP_ADDRESS> | 116..300 |
| 0 | XP_001547235.1 BCIN_01g00640 | AA3 | AA3_1 | NaN | 26..553 |
| 0 | XP_001547254.1 BCIN_01g00800 | AA1 | AA1_3 | <IP_ADDRESS> | 202..455 |
| 0 | XP_024546029.1 BCIN_01g01760 | GH18 | NaN | NaN | 116..258 |
| 0 | XP_024546029.1 BCIN_01g01760 | PL7 | PL7:2 | NaN | 989..1040 |
| 0 | XP_001548518.1 BCIN_01g02310 | GT39 | NaN | <IP_ADDRESS> | 62..264 |
| 0 | XP_001548545.1 BCIN_01g02520 | GT2 | NaN | <IP_ADDRESS> | 213..452 |
| 0 | XP_001549934.1 BCIN_01g02970 | AA11 | NaN | 1.*.*.* | 55..160 |
| 0 | XP_024546135.1 BCIN_01g03210 | GH71 | NaN | <IP_ADDRESS> | 71..381 |
Sometimes the CAZy subfamily is not written in the standard CAZy format of family_subfam#. For example, for protein "XP_024546029.1 BCIN_01g01760" the CAZy subfamily is listed as 'PL7:2'.
Looking further through the CUPP output log file, there are several instances of a this occuring, and often occuring for CAZy families for which CAZy has not created a subfamily with number outputted by CUPP. For example, protein XP_001549864.1 BCIN_03g07360 is predicted to have the subfamily 'PL1:4', however, there is not CAZy subfamily 'PL1:4'.
It was hypothesised that listing a CAZy subfamily with a colon instead of the traditional CAZy underscore was done to indicate when the predict CAZy subfamily is one created by CUPP and is not in CAZy.
Looking at lines 2890 and 2914 in the CUPP.CUPPprediction.py
script, the :
in the predicated subfamily is replaced by _
when writing the output FASTA file. Therefore, the predicted CAZy subfamily is written as 'PL72' in the output FASTA file. However, in line 2909, when writing out to the log file, the replacement of :
to `` is not performed. Hence, the predicted CAZy subfamily is written as 'PL7:2' in the output log file.
For standardistion, the colon in the predicted CAZy subfamily was changed to an underscore.
Moreover, when looking through the log file, multiple subfamilies can be predicted for a given protein. These subfamilies are separated by '+'. To improve human readability this was changed to separate the subfamilies by commas (', '). For example, CUPP's analysis of protein sequences from the genome GCA143535.1 predicted two CAZy subfamilies within the GH13 CAZyme domain of the protein XP_001552718.2.
XP_001552718.2 BCIN_02g05690 GH13 GH13:0.2 15.7 5.93 151 70..391 76 GH13:<IP_ADDRESS>&<IP_ADDRESS> GH13:<IP_ADDRESS>-GH13:<IP_ADDRESS> GH13:31+GH13:40
for line in log_file[:10]:
# separate the data fields
prediction_output = line.split("\t")
# retrieve predicated CAZy subfamily
subfam = prediction_output[-1]
# if no CAZy subfamily was predicted, change empty string to null value
if len(subfam) == 0:
subfam = np.nan
else:
# write subfamilies using CAZy standard format
subfam = subfam.replace(":","_")
subfam = subfam.replace("+", ", ") # separate multiple subfams with ', ' not '+'
print("subfam=", subfam)
subfam= nan subfam= nan subfam= AA3_1 subfam= AA1_3 subfam= nan subfam= PL7_2 subfam= nan subfam= nan subfam= nan subfam= nan
The above can be combined into functions, that are then included in pyrewton.cazymes.prediction.parse
. When it comes to evaluating CUPP's performance when differentiating between CAZymes and non-CAZymes, a binary classification of CAZymes (1) and non-CAZyme (0) is needed for each protein. If a protein is included in the CUPP output CUPP has predicted that the protein is a CAZyme, and thus an additional column with a value of 1 can be added to the standardised CUPP output, to represent the cazyme/non-cazyme classification of proteins by CUPP.
For the evaluation CUPP's performance the information of none CAZymes is also needed. CUPP only includes the data for proteins in it's log file that have classified as CAZymes therefore, the remaining protein sequences are retrieved from the FASTA file.
def parse_cupp_output(log_file_path, fasta_path):
"""Parse the output log file from CUPP and write out a dataframe.
Retrieves the protein accession, predicted CAZy families, CAZy families EC
numbers and domain ranges.
:param log_file_path: Path, path to the output log file
:fasta path: Path, path to the FASTA containing the query sequences for CUPP
Return a list of CUPPprediction instances, where each instance represented one protein.
"""
# open the CUPP output log file
with open(log_file_path, "r") as lfh:
log_file = lfh.read().splitlines()
cupp_predictions = {} # stores proteins {protein_accession:CUPPprediction_instance}
for line in tqdm(log_file, desc="parsing cupp output"):
# separate the data fields
prediction_output = line.split("\t")
# retrieve the predicted domain range if given
domain_range = get_cupp_domain_range(prediction_output) # list of strs
# retrieve predicted EC number if given
ec_numbers = get_cupp_ec_number(prediction_output) # list of strs
# retrieve predicted CAZy subfamily if given
cazy_subfamily = prediction_output[-1]
# if no CAZy subfamily was predicted, change empty string to null value
if len(cazy_subfamily) == 0:
cazy_subfamily = np.nan
else:
# write subfamilies using CAZy standard format
cazy_subfamily = cazy_subfamily.replace(":","_")
cazy_subfamily = cazy_subfamily.replace("+", ", ") # separate multiple subfams with ', ' not '+'
# retrieve the protein accession and check if it already has a corresponding CUPPprediction instance
protein_accession = prediction_output[0]
# retrieve the CAZyme classification and predicted CAZy family
cazyme_classification = 1 # all proteins included in CUPP log file are identified as CAZymes
cazy_family = prediction_output[1] # This is selected from the CUPP 'Best function'
# check if a CUPPprediction instance already exists for the protein
try:
existing_prediction = cupp_predictions[protein_accession]
print("existing=", existing_prediction)
# check if the CAZyme domain has been been parsed before
print("existing domains=", len(existing_prediction.cazyme_domains), existing_prediction.cazyme_domains)
existing_cazyme_domains = existing_prediction.cazyme_domains
existance = False
for domain in existing_cazyme_domains:
if (domain.cazy_family == cazy_family) and (domain.cazy_subfamily == cazy_subfamily):
for ec in ec_numbers:
domain.ec_numbers.append(ec)
for drange in domain_range:
domain.domain_range.append(drange)
existance = True
if existance is False:
# create new CAZyme domain
new_cazyme_domain = CazymeDomain(
protein_accession,
cazy_family,
cazy_subfamily,
ec_numbers,
domain_range,
)
existing_prediction.cazyme_domains.append(new_cazyme_domain)
except KeyError: # raised if there is not instance for the protein
new_cazyme_domain = CazymeDomain(
protein_accession,
cazy_family,
cazy_subfamily,
ec_numbers,
domain_range,
)
new_protein = CazymeProteinPrediction(
"CUPP",
protein_accession,
cazyme_classification,
[new_cazyme_domain],
)
cupp_predictions[protein_accession] = new_protein
print("len1=", len(list(cupp_predictions.values())))
# add non-CAZymes
cupp_predictions = add_non_cazymes(fasta_path, cupp_predictions)
cupp_predictions = list(cupp_predictions.values())
return cupp_predictions
def get_cupp_domain_range(prediction_output):
"""Retrieve the predicted amino acid range of predicted CAZyme domain from CUPP log file.
:param prediction_output: list of items from log file line.
List of predicted domain ranges or null value in a list if not.
"""
domain_range = [] # store as a list in case multiple domain ranges are given
for item in prediction_output:
if item.find("..") != -1:
domain_range.append(item)
# check retrieved items are definetly the domain ranges
for item in domain_range:
try:
re.match(r"\d+\.\.\d+", item).group()
except AttributeError:
# write as logger in pyrewton
print(f"RAISED ATTRIBUTE ERROR: {item} misidentified as domain range")
domain_range.remove(item)
if len(domain_range) == 0:
domain_range = [np.nan]
return domain_range
def get_cupp_ec_number(prediction_output):
"""Retrieve predicted EC numbers from CUPP log file.
EC numbers are represented as "CAZy_fam:EC_number" in the log file.
If multiple EC numbers are predicated and the CAZy families of each are
given then these are separated by '-'. If multiple EC numbers are predicated
for the same CAZy family, these are separated by '&'.
:param prediciton_output: list of items from log file line.


Team Profile
Sarah Smith
Manager
Employee ID: 1
Email:
<EMAIL_ADDRESS>Office: 203
Sabrina Sharmin
Engineer
Employee ID: 2
Email:
<EMAIL_ADDRESS>GitHub:
ssharmin0029
Chase Adams
Engineer
Employee ID: 3
Email:
<EMAIL_ADDRESS>GitHub:
chase.adams223
Cooper Pretson
Intern
Employee ID: 4
Email:
<EMAIL_ADDRESS>School: NYU


climate vulnerability state change population municipalities Index indices adaptive Climate Fig Vulnerability higher Amazon data related current future social Amazonas, Amazonas capacity present used climatic percentage values Score conditions index study indicators Brazil. precipitation temperature variables vulnerable Brazilian human impacts populations Municipal considered sensitivity total {border-style average considering local px;} risk #ffffff;} Brazil Change MVI greater municipality natural regions Amazonas. Click LINK Table additional events file. health observed Rio environmental high microregions scenario slice Chang. according areas change. exposure main number poverty region results specific Glob Thus, actions analysis different disasters emission highest population. regional represented scores value (–) Confalonieri Environ However, Social households important model vegetation vulnerability, Brazil, Health Marengo aspects associated components compose demonstrated incidence increased mainly municipal para pessimistic showed southern using vulnerability. (DOCX) Boca Clim South basic characteristics days deforestation developed economic exposure, extreme factors governance increase information maximum mean method minimum municipalities, possible relation studies time vulnerable. years IPCC’s Minas Natural Nobre Percentage Representation adaptation anomalies area better calculated change, cover decision effects food group including index; methodology municipalities. occurrence potential profile px; rainfall resources scenario, sensitive/vulnerable. sensitivity, shown {font-family Alves CSI Development Manaus Manaus, RCP.. Sciences VInd age allows anomaly applied arithmetic aspect capital, changes constructed construction context cope councils development disaster elderly expected final focus font-size influence institutions measure modeling people population, presented projections proportion public represents scenarios socio-environmental state, vulnerabilities (TIF) Adaptation Adger Change. Estud Future Instituto Public RCP. Regional Rev Working adapted aggregation annual approach assessment capacity. capital cases collab: combination double; eastern essential flood generate global hydrological key linked lowest methodological microregion northeastern northern, order portion reduce reflects region. represent role scale sensitivity/vulnerability. services socioeconomic traditional way (.) (VInd) Acre Amazônia Cambridge: Earth Estado Estudos Gerais, INDEX In: Index, Mapping Marinho Purus Regarding Region René Res University assessments assignment available based border-color border-width care case central chosen conceptual difference distribution droughts dry dying ecological ecosystem elements encompasses established evaluate evaluated evaluation experienced financial groups hand, health, identify impacts. increasing indicator issues levels living located makers makes metropolitan municipality. national need organization original parameters performance processes quality quantitative recent reduced reducing region, review shows socio-political solid; state. step structural support systems tropical use {font-style {font-weight –): Acta Adaptive Amazon. Amazonian America América Análise Belo Borma Brito CDD Cambridge Contribution Disasters FIRJAN Geophys IPCC. Investigation Janeiro Lett. Organization Press; Preto Quintão RCP Raw Report SSI Scenario Science Socioeconomic State Torres UEC Universidade Values Writing ability affected aged allow anomaly, article assessing attributed bold capable capacity, city climate, climate. component comprise conditions, consecutive countries courier; damage das data, degree demonstrate determine determining disasters, disasters. disease does ecosystems em; environment, environmental, especially example, extremes findings floods followed forest framework generated greatest improvement improving income indices, infrastructure institutions, land largest management mapping medium municipality, needs northern obtained old others. perspective policy poor populations, possessed priority problems project, provided proxy pt;} ranging rate regionalized regions, relationship relative report require respond risks riverine scheme security shape similar social, southwestern susceptibility system, systematically understand understood urban variability various work, year


With rrricanes
you can access current and archived advisories as-issued from the National Hurricane Center archives. rrricanesdata
is a complimentary data package meant to make it faster to get most data avialable from these storms.
Installing rrricanesdata
is simple:
Data in rrricanesdata
will be updated on the first of every month with a cutoff date of midnight on the last day of the month. So, advisories issued at any time during the current month will not be available; you will need to use any of rrricanes
get_*
functions.
Datasets
adv
- Key: Unique identifier of cyclone
- Adv: Advisory number
- Date: Date and time of advisory
- Status: Classification of cyclone
- Name: Name of cyclone
- Lat: Latitude of cyclone center
- Lon: Longitude of cyclone center
- Wind: Maximum sustained one-minute winds in knots
- Gust: Maximum sustained one-minute gusts in knots
- Pressure: Minimum central pressure in millibars
- PosAcc: Position accuracy of cyclone in nautical miles
- FwdDir: Compass angle of forward motion
- FwdSpeed: Forward speed in miles per hour
- Eye: Size of eye in nautical miles
- SeasNE: Radius of 12ft seas in northeast quadrant
- SeasSE: Radius of 12ft seas in southeast quadrant
- SeasSW: Radius of 12ft seas in southwest quadrant
- SeasNW: Radius of 12ft seas in northwest quadrant
discus
- Status: Classification of storm, e.g., Tropical Storm, Hurricane, etc.
- Name: Name of storm
- Adv: Advisory Number
- Date: Date of advisory issuance
- Key: ID of cyclone
- Contents: Text content of product
fcst
- Key: Unique identifier of cyclone
- Adv: Advisory number
- Date: Date and time of advisory
- FcstDate: Forecast date and time in UTC
- Lat: Forecast latitude
- Lon: Forecast Longitude
- Wind: Forecast wind in knots
- Gust: Forecast gust in knots
fcst_wr
- Key: Unique identifier of cyclone
- Adv: Advisory number
- Date: Date and time of advisory
- FcstDate: Forecast date and time in UTC
- WindField: Minimum sustained wind field for quadrants
- NE: Radius in nautical miles for northeast quadrant
- SE: Radius in nautical miles for southeast quadrant
- SW: Radius in nautical miles for southwest quadrant
- NW: Radius in nautical miles for northwest quadrant
fstadv
- Status: Classification of cyclone
- Name: Name of cyclone
- Adv: Advisory number
- Date: Date and time of advisory
- Key: Unique identifier of cyclone
- Lat: Latitude of cyclone center
- Lon: Longitude of cyclone center
- Wind: Maximum sustained one-minute winds in knots
- Gust: Maximum sustained one-minute gusts in knots
- Pressure: Minimum central pressure in millibars
- PosAcc: Position accuracy of cyclone in nautical miles
- FwdDir: Compass angle of forward motion
- FwdSpeed: Forward speed in miles per hour
- Eye: Size of eye in nautical miles
- NE64: Radius of >=64kt winds in northeast quadrant
- SE64: Radius of >=64kt winds in southeast quadrant
- SW64: Radius of >=64kt winds in southwest quadrant
- NW64: Radius of >=64kt winds in northwest quadrant
- NE50: Radius of >=50kt winds in northeast quadrant
- SE50: Radius of >=50kt winds in southeast quadrant
- SW50: Radius of >=50kt winds in southwest quadrant
- NW50: Radius of >=50kt winds in northwest quadrant
- NE34: Radius of >=34kt winds in northwest quadrant
- SE34: Radius of >=34kt winds in southeast quadrant
- SW34: Radius of >=34kt winds in southwest quadrant
- NW34: Radius of >=34kt winds in northwest quadrant
- Hr{n}FcstDate: Forecast valid date
- Hr{n}Lat: Forecast latitude in
n
hours
- Hr{n}Lon: Forecast longitude in
n
hours
- Hr{n}Wind: Forecast maximum wind in
n
hours
- Hr{n}Gust: Forecast maximum gust in
n
hours
- Hr{n}NE64: Forecast wind radius in
n
hours
- Hr{n}SE64: Forecast wind radius in
n
hours
- Hr{n}SW64: Forecast wind radius in
n
hours
- Hr{n}NW64: Forecast wind radius in
n
hours
- Hr{n}NE50: Forecast wind radius in
n
hours
- Hr{n}SE50: Forecast wind radius in
n
hours
- Hr{n}SW50: Forecast wind radius in
n
hours
- Hr{n}NW50: Forecast wind radius in
n
hours
- Hr{n}NE34: Forecast wind radius in
n
hours
- Hr{n}SE34: Forecast wind radius in
n
hours
- Hr{n}SW34: Forecast wind radius in
n
hours
- Hr{n}NW34: Forecast wind radius in
n
hours
- SeasNE: Radius of 12ft seas in northeast quadrant
- SeasSE: Radius of 12ft seas in southeast quadrant
- SeasSW: Radius of 12ft seas in southwest quadrant
- SeasNW: Radius of 12ft seas in northwest quadrant
posest
- Status: Classification of storm, e.g., Tropical Storm, Hurricane, etc.
- Name: Name of storm
- Date: Date of advisory issuance
- Contents: Text content of product
prblty
- Status: Classification of storm, e.g., Tropical Storm, Hurricane, etc.
- Name: Name of storm
- Adv: Advisory Number
- Date: Date of advisory issuance
- Location: Location for which the probability statistics rely
- A: Probability of a strike within the next 12 hours
- B: Probability of a strike between 12 and 24 hours
- C: Probability of a strike between 24 and 36 hours
- D: Probability of a strike between 36 and 48 hours
- E: Probability of a strike between 48 and 72 hours
public
- Status: Classification of storm, e.g., Tropical Storm, Hurricane, etc.
- Name: Name of storm
- Adv: Advisory Number
- Date: Date of advisory issuance
- Key: Unique ID of the cyclone
- Contents: Text content of product
storms
- Key: Storm ID
- Name: Storm name
- Wind: Peak wind speed in knots
- StartDate: Date/time of first advisory
- EndDate: Date/time of last advisory
update
- Status: Classification of storm, e.g., Tropical Storm, Hurricane, etc.
- Name: Name of storm
- Date: Date of advisory issuance
- Key: Unique ID of cyclone
- Contents: Text content of product
wndprb
- Status: Classification of storm, e.g., Tropical Storm, Hurricane, etc.
- Name: Name of storm
- Adv: Advisory Number
- Date: Date of advisory issuance
- Wind: Minimum wind speed for which probabilities reference
- Wind12: Probability of sustained
Wind
within 12 hours
- Wind24: Probability of sustained
Wind
within 24 hours
- Wind24Cum: Cumulative probability through 24 hours
- Wind36: Probability of sustained
Wind
within 36 hours
- Wind36Cum: Cumulative probability through 36 hours
- Wind48: Probability of sustained
Wind
within 48 hours
- Wind48Cum: Cumulative probability through 48 hours
- Wind72: Probability of sustained
Wind
within 72 hours
- Wind72Cum: Cumulative probability through 72 hours
- Wind96: Probability of sustained
Wind
within 96 hours
- Wind96Cum: Cumulative probability through 96 hours
- Wind120: Probability of sustained
Wind
within 120 hours
- Wind120Cum: Cumulative probability through 120 hours
wr
- Key: Unique identifier of cyclone
- Adv: Advisory number
- Date: Date and time of advisory
- Windfield: Minimum wind speed expected
- NE: Radius of
Windfield
in the northeast quadrant
- SE: Radius of
Windfield
in the southeast quadrant
- SW: Radius of
Windfield
in the southwest quadrant
- NW: Radius of
Windfield
in the northwest quadrant


Fabinho suspended for Liverpool's clash with Brighton
Fabinho has been yellow carded five times so far this season
by Joe RimmerFabinho will miss Liverpool's match with Brighton next weekend after picking up his fifth booking of the season.
The Brazilian midfielder was shown a yellow card for a late challenge on Crystal Palace's Cheick Kouyate, with Liverpool leading 1-0 through Sadio Mane's second half goa l.
Fabinho was left out of Liverpool's win over Aston Villa in early November, with Jurgen Klopp keen to ensure he didn't miss the Reds' meeting with Premier League title rivals Man City .
It proved to be the right move from the Reds boss as Fabinho scored the opening goal in a 3-1 victory at Anfield .
Liverpool face Brighton at Anfield next week after the trip to Palace, but the midfielder will be available once again for the Merseyside derby on December 4.


Show Menu
Home
Top 13
1. Boothill
2. Buford House
3. Birdcage Theatre
4. Courthouse
5. Oriental Saloon
6. Crystal Palace
7. San Jose House
8. Heath's Corner
9. Schieffelin Hall
10. City Hall
11. OK Corral
12. Old Marshall's Office
13. Mines
Other Sites
Big Nose Kate's
Harwood House
Longhorn
Old Tombstone
Railroad
Red Buffalo
Russ House
Stories
About
Tickets
Gallery
Parson George
FAQ
Boothill
Jewish Memorial
The Music
Disclaimer
The Site
Contact


Although it cannot compete with the major safari countries for sheer natural spectacle, Mali is a nation of unusual interest and charm. Like Egypt, Mali is a country that is intimately related to a great river--in this case, the Niger. In addition, Mali is the location of some of the continent's most interesting cultural sites. Legendary Timbuktu is located here, and in the center of the country is the magnificently dramatic Bandiagara escarpment, home to the fascinating culture of the Dogon. Do you want to know more ....? Please check down the different places in Mali.
Bamako is the capital and largest city of Mali, with a population of 3.3 million (2016 census, provisional). In 2006, it was estimated to be the fastest-growing city in Africa and sixth-fastest in the world. It is located on the Niger River, near the rapids that divide the upper and middle Niger valleys in the southwestern part of the country
View MoreKayes (Bambara: Kayi, Soninké: Xaayi) is a city in western Mali on the Sénégal River, with a population of 127,368 at the 2009 census. Kayes is the capital of the administrative region of the same name. The name "Kayes" comes from the Soninké word "karré", which describes a low humid place that floods in rainy season. The city is located 420 kilometres (260 mi) northwest of the capital Bamako.
View MoreKoulikoro is a town and urban commune in Mali. The capital of the Koulikoro Region, Koulikoro is located on banks of the Niger River, 59 kilometres (37 mi) downstream from Mali's capital Bamako. Koulikoro is the terminus of the Dakar-Niger Railway which was completed in 1905. Between August and November, at the end of the rainy season, goods are transported down the Niger River to Ségou, Mopti, Tombouctou and Gao.
View MoreSégou (also Segou, Segu, Seku) is a town and an urban commune in south-central Mali that lies 235 kilometres (146 mi) northeast of Bamako on the River Niger. The town is the capital of the Ségou Cercle and the Ségou Region. With 130,690 inhabitants in 2009, it is the fifth-largest town in Mali.
View MoreSikasso is a city in the south of Mali and the capital of the Sikasso Cercle and the Sikasso Region. It is Mali's second largest city with 225,753 residents in the 2009 census.
View MoreMopti is a town and an urban commune in the Inner Niger Delta region of Mali. The town is the capital of the Mopti Cercle and the Mopti Region. Situated 460 km northeast of Bamako, the town lies at the confluence of the Niger and the Bani Rivers and is linked by an elevated causeway to the town of Sévaré. The urban commune, which includes both Mopti and Sévaré, had a population of 114,296 in the 2009 census.
View MoreTombouctou Region is one of the administrative regions of Mali. It is the largest of Mali's eight regions and includes a large section of the Sahara Desert. For administrative purposes, the region is subdivided into five cercles. The region is part of northern Mali that was separated and declared independent by the National Movement for the Liberation of Azawad (MNLA) during the Tuareg rebellion of 2012. In the course of the conflict, the MNLA lost control of the territory to Islamist militias.
View MoreGao /ɡaʊ/ is a city in Mali and the capital of the Gao Region. The city is located on the River Niger, 320 km (200 mi) east-southeast of Timbuktu on the left bank at the junction with the Tilemsi valley.
View MoreKidal (Tuareg-Berber ⴾⴸⵍ, Kidal) is a town and commune in the desert region of northern Mali. The town lies 285 km (177 mi) northeast of Gao and is the capital of the Kidal Cercle and the Kidal Region. The commune has an area of about 9,910 km2 (3,830 sq mi) and includes the town of Kidal and 31 other settlements.
View More