Repository 's_mart'
hg clone https://toolshed.g2.bx.psu.edu/repos/yufei-luo/s_mart

Changeset 38:2c0c0a89fad7 (2013-05-02)
Previous changeset 37:d22fadc825e3 (2013-05-02) Next changeset 39:1236e5a49595 (2013-05-13)
Commit message:
Uploaded
added:
LICENSE.txt
README.txt
SMART/Java/Python/CleanTranscriptFile.py
SMART/Java/Python/ClusterizeByTags.py
SMART/Java/Python/CollapseReads.py
SMART/Java/Python/CombineTags.py
SMART/Java/Python/CompareOverlapping.py
SMART/Java/Python/CompareOverlappingSmallQuery.py
SMART/Java/Python/CompareOverlappingSmallRef.py
SMART/Java/Python/ComputeCoverage.py
SMART/Java/Python/CountLoci.py
SMART/Java/Python/CountReadGCPercent.py
SMART/Java/Python/FindOverlapsOptim.py
SMART/Java/Python/GetDifferentialExpression.py
SMART/Java/Python/GetDistribution.py
SMART/Java/Python/GetFlanking.py
SMART/Java/Python/GetIntersection.py
SMART/Java/Python/GetRandomSubset.py
SMART/Java/Python/GetReadDistribution.py
SMART/Java/Python/GetReadSizes.py
SMART/Java/Python/GetUpDownStream.py
SMART/Java/Python/RestrictFromCoverage.py
SMART/Java/Python/SelectByTag.py
SMART/Java/Python/WrappGetDistribution.py
SMART/Java/Python/WrappGetReadDistribution.py
SMART/Java/Python/WrappPlotCoverage.py
SMART/Java/Python/WrappPlotRepartition.py
SMART/Java/Python/__init__.py
SMART/Java/Python/adaptorStripper.py
SMART/Java/Python/changeGffFeatures.sh
SMART/Java/Python/changeTagName.py
SMART/Java/Python/cleanGff.py
SMART/Java/Python/cleaning/CleanerChooser.py
SMART/Java/Python/cleaning/DefaultCleaner.py
SMART/Java/Python/cleaning/GffCleaner.py
SMART/Java/Python/cleaning/GtfCleaner.py
SMART/Java/Python/cleaning/TranscriptListCleaner.py
SMART/Java/Python/cleaning/__init__.py
SMART/Java/Python/clusterize.py
SMART/Java/Python/clusterizeBySlidingWindows.py
SMART/Java/Python/compareOverlapping.py
SMART/Java/Python/convertTranscriptFile.py
SMART/Java/Python/coordinatesToSequence.py
SMART/Java/Python/findTss.py
SMART/Java/Python/fold.py
SMART/Java/Python/getDifference.py
SMART/Java/Python/getDistance.py
SMART/Java/Python/getDistribution.py
SMART/Java/Python/getElement.py
SMART/Java/Python/getExons.py
SMART/Java/Python/getInfoPerCoverage.py
SMART/Java/Python/getIntrons.py
SMART/Java/Python/getLetterDistribution.py
SMART/Java/Python/getNb.py
SMART/Java/Python/getRandomRegions.py
SMART/Java/Python/getReadDistribution.py
SMART/Java/Python/getSequence.py
SMART/Java/Python/getSizes.py
SMART/Java/Python/getWigData.py
SMART/Java/Python/getWigDistance.py
SMART/Java/Python/getWigProfile.py
SMART/Java/Python/mapperAnalyzer.py
SMART/Java/Python/mappingToCoordinates.py
SMART/Java/Python/mergeSlidingWindowsClusters.py
SMART/Java/Python/mergeTranscriptLists.py
SMART/Java/Python/misc/MultipleRPlotter.py
SMART/Java/Python/misc/Progress.py
SMART/Java/Python/misc/RPlotter.py
SMART/Java/Python/misc/UnlimitedProgress.py
SMART/Java/Python/misc/Utils.py
SMART/Java/Python/misc/__init__.py
SMART/Java/Python/modifyFasta.py
SMART/Java/Python/modifyGenomicCoordinates.py
SMART/Java/Python/modifySequenceList.py
SMART/Java/Python/mySql/MySqlConnection.py
SMART/Java/Python/mySql/MySqlExonTable.py
SMART/Java/Python/mySql/MySqlQuery.py
SMART/Java/Python/mySql/MySqlTable.py
SMART/Java/Python/mySql/MySqlTranscriptTable.py
SMART/Java/Python/mySql/__init__.py
SMART/Java/Python/ncList/.NCList.py.swp
SMART/Java/Python/ncList/.NCListCursor.py.swp
SMART/Java/Python/ncList/Benchmark.py
SMART/Java/Python/ncList/ConvertToNCList.py
SMART/Java/Python/ncList/FileSorter.py
SMART/Java/Python/ncList/FindOverlapsWithOneInterval.py
SMART/Java/Python/ncList/FindOverlapsWithSeveralIntervals.py
SMART/Java/Python/ncList/FindOverlapsWithSeveralIntervalsBin.py
SMART/Java/Python/ncList/FindOverlapsWithSeveralIntervalsIndex.py
SMART/Java/Python/ncList/FindOverlaps_naif.py
SMART/Java/Python/ncList/NCIndex.py
SMART/Java/Python/ncList/NCList.py
SMART/Java/Python/ncList/NCListCursor.py
SMART/Java/Python/ncList/NCListFilePickle.py
SMART/Java/Python/ncList/NCListHandler.py
SMART/Java/Python/ncList/NCListMerger.py
SMART/Java/Python/ncList/NCListParser.py
SMART/Java/Python/ncList/__init__.py
SMART/Java/Python/plot.py
SMART/Java/Python/plotCoverage.py
SMART/Java/Python/plotGenomeCoverage.py
SMART/Java/Python/plotRepartition.py
SMART/Java/Python/plotTranscriptList.py
SMART/Java/Python/qualToFastq.py
SMART/Java/Python/removeAllTmpTables.py
SMART/Java/Python/removeEmptySequences.py
SMART/Java/Python/removeExonLines.sh
SMART/Java/Python/repetGffConverter.py
SMART/Java/Python/restrictFromNucleotides.py
SMART/Java/Python/restrictFromSize.py
SMART/Java/Python/restrictSequenceList.py
SMART/Java/Python/restrictTranscriptList.py
SMART/Java/Python/runRandomJobs.py
SMART/Java/Python/selectByNbOccurrences.py
SMART/Java/Python/sequenceListSplitter.py
SMART/Java/Python/splitByTag.py
SMART/Java/Python/splitMultiFasta.py
SMART/Java/Python/structure/Bins.py
SMART/Java/Python/structure/Interval.py
SMART/Java/Python/structure/Mapping.py
SMART/Java/Python/structure/Sequence.py
SMART/Java/Python/structure/SequenceList.py
SMART/Java/Python/structure/SubMapping.py
SMART/Java/Python/structure/Transcript.py
SMART/Java/Python/structure/TranscriptContainer.py
SMART/Java/Python/structure/TranscriptList.py
SMART/Java/Python/structure/TranscriptListIterator.py
SMART/Java/Python/structure/TranscriptListsComparator.py
SMART/Java/Python/structure/__init__.py
SMART/Java/Python/testInstall.py
SMART/Java/Python/toolLauncher/RnaFoldLauncher.py
SMART/Java/Python/toolLauncher/__init__.py
SMART/Java/Python/trimAdaptor.py
SMART/Java/Python/trimSequence.py
SMART/Java/Python/trimSequences.py
SMART/Java/Python/txtToFasta.py
SMART/Java/Python/updateQual.py
SMART/Java/Python/wigExploder.py
SMART/Java/Python/wrongFastqToQual.py
SMART/Java/__init__.py
SMART/__init__.py
SMART/galaxy/CleanTranscriptFile.xml
SMART/galaxy/Clusterize.xml
SMART/galaxy/CollapseReads.xml
SMART/galaxy/CompareOverlappingSmallQuery.xml
SMART/galaxy/CompareOverlappingSmallRef.xml
SMART/galaxy/ConvertTranscriptFile.xml
SMART/galaxy/CountReadGCPercent.xml
SMART/galaxy/GetDifferentialExpression.xml
SMART/galaxy/GetFlanking.xml
SMART/galaxy/SelectByTag.xml
SMART/galaxy/WrappGetLetterDistribution.py
SMART/galaxy/WrappGetLetterDistribution.xml
SMART/galaxy/__init__.py
SMART/galaxy/changeGffFeatures.xml
SMART/galaxy/changeTagName.xml
SMART/galaxy/clusterizeBySlidingWindows.xml
SMART/galaxy/compareOverlapping.xml
SMART/galaxy/computeCoverage.xml
SMART/galaxy/coordinatesToSequence.xml
SMART/galaxy/getDifference.xml
SMART/galaxy/getDistance.xml
SMART/galaxy/getDistribution.xml
SMART/galaxy/getExons.xml
SMART/galaxy/getIntrons.xml
SMART/galaxy/getReadDistribution.xml
SMART/galaxy/getSizes.xml
SMART/galaxy/getWigData.xml
SMART/galaxy/getWigDistance.xml
SMART/galaxy/getWigProfile.xml
SMART/galaxy/mapperAnalyzer.xml
SMART/galaxy/mergeSlidingWindowsClusters.xml
SMART/galaxy/mergeTranscriptLists.xml
SMART/galaxy/modifyGenomicCoordinates.xml
SMART/galaxy/modifySequenceList.xml
SMART/galaxy/plotCoverage.xml
SMART/galaxy/plotTranscriptList.xml
SMART/galaxy/removeExonLines.sh
SMART/galaxy/removeExonLines.xml
SMART/galaxy/restrictFromSize.xml
SMART/galaxy/restrictTranscriptList.xml
SMART/galaxy/test.py
SMART/galaxy/trimSequences.xml
__init__.py
commons/__init__.py
commons/core/LoggerFactory.py
commons/core/__init__.py
commons/core/checker/AbstractChecker.py
commons/core/checker/CheckerException.py
commons/core/checker/CheckerUtils.py
commons/core/checker/ConfigChecker.py
commons/core/checker/ConfigException.py
commons/core/checker/ConfigValue.py
commons/core/checker/IChecker.py
commons/core/checker/OldConfigChecker.py
commons/core/checker/RepetException.py
commons/core/checker/__init__.py
commons/core/coord/Align.py
commons/core/coord/AlignUtils.py
commons/core/coord/ConvCoord.py
commons/core/coord/Map.py
commons/core/coord/MapUtils.py
commons/core/coord/Match.py
commons/core/coord/MatchUtils.py
commons/core/coord/MergedRange.py
commons/core/coord/Path.py
commons/core/coord/PathUtils.py
commons/core/coord/Range.py
commons/core/coord/Set.py
commons/core/coord/SetUtils.py
commons/core/coord/SlidingWindow.py
commons/core/coord/__init__.py
commons/core/coord/align2set.py
commons/core/parsing/.BamParser.py.swp
commons/core/parsing/AxtParser.py
commons/core/parsing/BamParser.py
commons/core/parsing/BedParser.py
commons/core/parsing/BlastParser.py
commons/core/parsing/BlatFileParser.py
commons/core/parsing/BlatParser.py
commons/core/parsing/BlatToGff.py
commons/core/parsing/BlatToGffForBesPaired.py
commons/core/parsing/BowtieParser.py
commons/core/parsing/CoordsParser.py
commons/core/parsing/CrossSsrAndBesMappedByBlatToGff.py
commons/core/parsing/ElandParser.py
commons/core/parsing/ExoParser.py
commons/core/parsing/FastaParser.py
commons/core/parsing/FastqParser.py
commons/core/parsing/FindRep.py
commons/core/parsing/GbParser.py
commons/core/parsing/GffParser.py
commons/core/parsing/GtfParser.py
commons/core/parsing/MapParser.py
commons/core/parsing/MapperParser.py
commons/core/parsing/MaqParser.py
commons/core/parsing/MrepsToSet.py
commons/core/parsing/Multifasta2SNPFile.py
commons/core/parsing/MummerParser.py
commons/core/parsing/NCListParser.py
commons/core/parsing/NucmerParser.py
commons/core/parsing/PalsToAlign.py
commons/core/parsing/ParserChooser.py
commons/core/parsing/PathNum2Id.py
commons/core/parsing/PilerTAToGrouperMap.py
commons/core/parsing/PklParser.py
commons/core/parsing/PslParser.py
commons/core/parsing/README_MultiFasta2SNPFile
commons/core/parsing/RmapParser.py
commons/core/parsing/SamParser.py
commons/core/parsing/SeqmapParser.py
commons/core/parsing/SequenceListParser.py
commons/core/parsing/ShrimpParser.py
commons/core/parsing/Soap2Parser.py
commons/core/parsing/SoapParser.py
commons/core/parsing/SsrParser.py
commons/core/parsing/TranscriptListParser.py
commons/core/parsing/VarscanFile.py
commons/core/parsing/VarscanFileForGnpSNP.py
commons/core/parsing/VarscanHit.py
commons/core/parsing/VarscanHitForGnpSNP.py
commons/core/parsing/VarscanHit_WithTag.py
commons/core/parsing/VarscanHit_v2_2_8.py
commons/core/parsing/VarscanHit_v2_2_8_WithTag.py
commons/core/parsing/VarscanToVCF.py
commons/core/parsing/WigParser.py
commons/core/parsing/__init__.py
commons/core/parsing/multifastaParserLauncher.py
commons/core/seq/AlignedBioseqDB.py
commons/core/seq/Bioseq.py
commons/core/seq/BioseqDB.py
commons/core/seq/BioseqUtils.py
commons/core/seq/ClusterConsensusCollection.py
commons/core/seq/FastaUtils.py
commons/core/seq/__init__.py
commons/core/utils/FileUtils.py
commons/core/utils/PipelineStepFTests.py
commons/core/utils/RepetConfigParser.py
commons/core/utils/RepetOptionParser.py
commons/core/utils/__init__.py
commons/core/writer/BedWriter.py
commons/core/writer/CsvWriter.py
commons/core/writer/EmblWriter.py
commons/core/writer/FastaWriter.py
commons/core/writer/FastqWriter.py
commons/core/writer/GbWriter.py
commons/core/writer/Gff2Writer.py
commons/core/writer/Gff3Writer.py
commons/core/writer/GtfWriter.py
commons/core/writer/MapWriter.py
commons/core/writer/MySqlTranscriptWriter.py
commons/core/writer/SamWriter.py
commons/core/writer/SequenceListWriter.py
commons/core/writer/TranscriptListWriter.py
commons/core/writer/TranscriptWriter.py
commons/core/writer/UcscWriter.py
commons/core/writer/WigWriter.py
commons/core/writer/WriterChooser.py
commons/core/writer/__init__.py
doc.pdf
tool_conf.xml
tool_dependencies.xml
b
diff -r d22fadc825e3 -r 2c0c0a89fad7 LICENSE.txt
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/LICENSE.txt Thu May 02 09:56:47 2013 -0400
[
b'@@ -0,0 +1,506 @@\n+\n+CeCILL FREE SOFTWARE LICENSE AGREEMENT\n+\n+\n+    Notice\n+\n+This Agreement is a Free Software license agreement that is the result\n+of discussions between its authors in order to ensure compliance with\n+the two main principles guiding its drafting:\n+\n+    * firstly, compliance with the principles governing the distribution\n+      of Free Software: access to source code, broad rights granted to\n+      users,\n+    * secondly, the election of a governing law, French law, with which\n+      it is conformant, both as regards the law of torts and\n+      intellectual property law, and the protection that it offers to\n+      both authors and holders of the economic rights over software.\n+\n+The authors of the CeCILL (for Ce[a] C[nrs] I[nria] L[ogiciel] L[ibre])\n+license are:\n+\n+Commissariat \xe0 l\'Energie Atomique - CEA, a public scientific, technical\n+and industrial research establishment, having its principal place of\n+business at 25 rue Leblanc, immeuble Le Ponant D, 75015 Paris, France.\n+\n+Centre National de la Recherche Scientifique - CNRS, a public scientific\n+and technological establishment, having its principal place of business\n+at 3 rue Michel-Ange, 75794 Paris cedex 16, France.\n+\n+Institut National de Recherche en Informatique et en Automatique -\n+INRIA, a public scientific and technological establishment, having its\n+principal place of business at Domaine de Voluceau, Rocquencourt, BP\n+105, 78153 Le Chesnay cedex, France.\n+\n+\n+    Preamble\n+\n+The purpose of this Free Software license agreement is to grant users\n+the right to modify and redistribute the software governed by this\n+license within the framework of an open source distribution model.\n+\n+The exercising of these rights is conditional upon certain obligations\n+for users so as to preserve this status for all subsequent redistributions.\n+\n+In consideration of access to the source code and the rights to copy,\n+modify and redistribute granted by the license, users are provided only\n+with a limited warranty and the software\'s author, the holder of the\n+economic rights, and the successive licensors only have limited liability.\n+\n+In this respect, the risks associated with loading, using, modifying\n+and/or developing or reproducing the software by the user are brought to\n+the user\'s attention, given its Free Software status, which may make it\n+complicated to use, with the result that its use is reserved for\n+developers and experienced professionals having in-depth computer\n+knowledge. Users are therefore encouraged to load and test the\n+suitability of the software as regards their requirements in conditions\n+enabling the security of their systems and/or data to be ensured and,\n+more generally, to use and operate it in the same conditions of\n+security. This Agreement may be freely reproduced and published,\n+provided it is not altered, and that no provisions are either added or\n+removed herefrom.\n+\n+This Agreement may apply to any or all software for which the holder of\n+the economic rights decides to submit the use thereof to its provisions.\n+\n+\n+    Article 1 - DEFINITIONS\n+\n+For the purpose of this Agreement, when the following expressions\n+commence with a capital letter, they shall have the following meaning:\n+\n+Agreement: means this license agreement, and its possible subsequent\n+versions and annexes.\n+\n+Software: means the software in its Object Code and/or Source Code form\n+and, where applicable, its documentation, "as is" when the Licensee\n+accepts the Agreement.\n+\n+Initial Software: means the Software in its Source Code and possibly its\n+Object Code form and, where applicable, its documentation, "as is" when\n+it is first distributed under the terms and conditions of the Agreement.\n+\n+Modified Software: means the Software modified by at least one\n+Contribution.\n+\n+Source Code: means all the Software\'s instructions and program lines to\n+which access is required so as to modify the Software.\n+\n+Object Code: means the binary files originating from the co'..b"a case-by-case basis between the relevant Licensor and the\n+Licensee pursuant to a memorandum of understanding. The Licensor\n+disclaims any and all liability as regards the Licensee's use of the\n+name of the Software. No warranty is given as regards the existence of\n+prior rights over the name of the Software or as regards the existence\n+of a trademark.\n+\n+\n+    Article 10 - TERMINATION\n+\n+10.1 In the event of a breach by the Licensee of its obligations\n+hereunder, the Licensor may automatically terminate this Agreement\n+thirty (30) days after notice has been sent to the Licensee and has\n+remained ineffective.\n+\n+10.2 A Licensee whose Agreement is terminated shall no longer be\n+authorized to use, modify or distribute the Software. However, any\n+licenses that it may have granted prior to termination of the Agreement\n+shall remain valid subject to their having been granted in compliance\n+with the terms and conditions hereof.\n+\n+\n+    Article 11 - MISCELLANEOUS\n+\n+\n+      11.1 EXCUSABLE EVENTS\n+\n+Neither Party shall be liable for any or all delay, or failure to\n+perform the Agreement, that may be attributable to an event of force\n+majeure, an act of God or an outside cause, such as defective\n+functioning or interruptions of the electricity or telecommunications\n+networks, network paralysis following a virus attack, intervention by\n+government authorities, natural disasters, water damage, earthquakes,\n+fire, explosions, strikes and labor unrest, war, etc.\n+\n+11.2 Any failure by either Party, on one or more occasions, to invoke\n+one or more of the provisions hereof, shall under no circumstances be\n+interpreted as being a waiver by the interested Party of its right to\n+invoke said provision(s) subsequently.\n+\n+11.3 The Agreement cancels and replaces any or all previous agreements,\n+whether written or oral, between the Parties and having the same\n+purpose, and constitutes the entirety of the agreement between said\n+Parties concerning said purpose. No supplement or modification to the\n+terms and conditions hereof shall be effective as between the Parties\n+unless it is made in writing and signed by their duly authorized\n+representatives.\n+\n+11.4 In the event that one or more of the provisions hereof were to\n+conflict with a current or future applicable act or legislative text,\n+said act or legislative text shall prevail, and the Parties shall make\n+the necessary amendments so as to comply with said act or legislative\n+text. All other provisions shall remain effective. Similarly, invalidity\n+of a provision of the Agreement, for any reason whatsoever, shall not\n+cause the Agreement as a whole to be invalid.\n+\n+\n+      11.5 LANGUAGE\n+\n+The Agreement is drafted in both French and English and both versions\n+are deemed authentic.\n+\n+\n+    Article 12 - NEW VERSIONS OF THE AGREEMENT\n+\n+12.1 Any person is authorized to duplicate and distribute copies of this\n+Agreement.\n+\n+12.2 So as to ensure coherence, the wording of this Agreement is\n+protected and may only be modified by the authors of the License, who\n+reserve the right to periodically publish updates or new versions of the\n+Agreement, each with a separate number. These subsequent versions may\n+address new issues encountered by Free Software.\n+\n+12.3 Any Software distributed under a given version of the Agreement may\n+only be subsequently distributed under the same version of the Agreement\n+or a subsequent version, subject to the provisions of Article 5.3.4.\n+\n+\n+    Article 13 - GOVERNING LAW AND JURISDICTION\n+\n+13.1 The Agreement is governed by French law. The Parties agree to\n+endeavor to seek an amicable solution to any disagreements or disputes\n+that may arise during the performance of the Agreement.\n+\n+13.2 Failing an amicable solution within two (2) months as from their\n+occurrence, and unless emergency proceedings are necessary, the\n+disagreements or disputes shall be referred to the Paris Courts having\n+jurisdiction, by the more diligent Party.\n+\n+\n+Version 2.0 dated 2006-09-05.\n"
b
diff -r d22fadc825e3 -r 2c0c0a89fad7 README.txt
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/README.txt Thu May 02 09:56:47 2013 -0400
b
@@ -0,0 +1,75 @@
+----------
+|  NAME  |
+----------
+S-MART
+
+
+Description
+-----------
+Several tools are now available for mapping high-throughput sequencing data from a genome, but few can extract biological knowledge from the mapped reads. We have developed a toolbox, S-MART, which handles mapped RNA-Seq and ChIP-Seq data.
+
+S-MART is an intuitive and lightweight tool, performing several tasks that are usually required during the analysis of mapped RNA-Seq and ChIP-Seq reads, including data selection and data visualization.
+
+S-MART does not require a computer science background and thus can be used by all biologists through a graphical interface. S-MART can run on any personal computer, yielding results within an hour for most queries. 
+
+
+Copyright
+---------
+Copyright INRA-URGI 2009-2013
+
+
+Authors
+-------
+Matthias Zytnicki
+
+
+Contact
+-------
+urgi-contact@versailles.inra.fr
+
+
+License
+-------
+This library is distributed under the terms of the CeCILL license 
+(http://www.cecill.info/index.en.html).
+See the LICENSE.txt file.
+
+
+Installation under Galaxy
+-------------------------
+S-MART is available under the Galaxy Tool Shed: http://toolshed.g2.bx.psu.edu/
+Remember to set the variables "tool_config_file" and "tool_dependency_dir" accordingly. Please look up the Galaxy Tool Shed wiki to know more about it.
+It assumes you have R installed, as well as two packages: RColorBrewer (for colors in graphics), and Hmisc (for statistics). You can install them as root with the commands:
+ - R --slave --no-save --no-restore --quiet -e 'if("RColorBrewer" %in% rownames(installed.packages()) == FALSE){install.packages("RColorBrewer", repos = c("http://cran.rstudio.com/"), dependencies = TRUE)}'
+ - R --slave --no-save --no-restore --quiet -e 'if("Hmisc" %in% rownames(installed.packages()) == FALSE){install.packages("Hmisc", repos = c("http://cran.rstudio.com/"), dependencies = TRUE)}'
+
+Optionally, you can organize the layout of S-MART tools following these instructions. This way, all the tools will be correctly sorted and appear in categories.
+ - Locate the directory where S-MART has been installed: probably in "<galaxy install dir>/shed_tool/toolshed.g2.bx.psu.edu/repos/yufei-luo/s_mart/XXX/s_mart/"
+ - Create a symbolic link "<galaxy install dir>/tools/s_mart" directing to "<S-MART install dir>/SMART/galaxy/"
+ - Paste the content of "<S-MART install dir>/SMART/galaxy/tool_conf.xml" to your local "<galaxy install dir>/tool_conf.xml", for instance, right before the </toolbox> mark-up.
+ - Remove the S-MART layout in "<galaxy install dir>/shed_tool_conf.xml" (the name may vary depending on your "universe_wgsi.ini" file) which has been automatically generated: remove the whole block between the markup <section id="s-mart" name="S-MART" version="XXX"> and the corresponding </section>.
+ - Restart Galaxy to complete the install.
+
+
+Stand-alone installation
+------------------------
+This product needs the following softwares :
+ - R, under the GNU General Public License, and several R package (under the same License)
+ - Python, under the Python License, compatible with the GNU General Public License
+ - Java, under the GNU General Public License
+
+
+Instructions
+------------
+Further installation instructions and the user guide are available in the file "doc.pdf".
+
+
+Acknowledgements
+----------------
+Many thanks go helping developers:
+ - Yufei Luo
+ - the URGI team
+and the beta-testers:
+ - Claire Toffano-Nioche
+ - Claire Kuchly
+ - among others...
b
diff -r d22fadc825e3 -r 2c0c0a89fad7 SMART/Java/Python/CleanTranscriptFile.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/SMART/Java/Python/CleanTranscriptFile.py Thu May 02 09:56:47 2013 -0400
[
@@ -0,0 +1,74 @@
+#! /usr/bin/env python
+#
+# Copyright INRA-URGI 2009-2011
+# 
+# This software is governed by the CeCILL license under French law and
+# abiding by the rules of distribution of free software. You can use,
+# modify and/ or redistribute the software under the terms of the CeCILL
+# license as circulated by CEA, CNRS and INRIA at the following URL
+# "http://www.cecill.info".
+# 
+# As a counterpart to the access to the source code and rights to copy,
+# modify and redistribute granted by the license, users are provided only
+# with a limited warranty and the software's author, the holder of the
+# economic rights, and the successive licensors have only limited
+# liability.
+# 
+# In this respect, the user's attention is drawn to the risks associated
+# with loading, using, modifying and/or developing or reproducing the
+# software by the user in light of its specific status of free software,
+# that may mean that it is complicated to manipulate, and that also
+# therefore means that it is reserved for developers and experienced
+# professionals having in-depth computer knowledge. Users are therefore
+# encouraged to load and test the software's suitability as regards their
+# requirements in conditions enabling the security of their systems and/or
+# data to be ensured and, more generally, to use and operate it in the
+# same conditions as regards security.
+# 
+# The fact that you are presently reading this means that you have had
+# knowledge of the CeCILL license and that you accept its terms.
+#
+from optparse import OptionParser
+from SMART.Java.Python.cleaning.CleanerChooser import CleanerChooser
+
+
+class CleanTranscriptFile(object):
+
+ def __init__(self, verbosity):
+ self.verbosity = verbosity
+ self.chooser   = CleanerChooser(self.verbosity)
+
+ def setInputFile(self, fileName, format):
+ self.chooser.findFormat(format)
+ self.cleaner = self.chooser.getCleaner()
+ self.cleaner.setInputFileName(fileName)
+
+ def setOutputFile(self, fileName):
+ self.cleaner.setOutputFileName(fileName)
+
+ def setAcceptedTypes(self, types):
+ if types != None:
+ self.cleaner.setAcceptedTypes(types)
+
+ def run(self):
+ self.cleaner.clean()
+
+
+if __name__ == "__main__":
+
+ description = "Clean Transcript File v1.0.1: Clean a transcript file so that it is useable for S-MART. [Category: Other]"
+
+ parser = OptionParser(description = description)
+ parser.add_option("-i", "--input",       dest="inputFileName",  action="store",                     type="string", help="query input file [compulsory] [format: file in transcript format given by -f]")
+ parser.add_option("-f", "--format",      dest="format",         action="store",                     type="string", help="format of previous file [compulsory] [format: transcript file format]")
+ parser.add_option("-t", "--types",       dest="acceptedTypes",  action="store",      default=None,  type="string", help="name of the types you want to keep in GFF/GTF (list separated by commas) [format: string] [default: None]")
+ parser.add_option("-o", "--output",      dest="outputFileName", action="store",                     type="string", help="output file [format: output file in GFF3 format]")
+ parser.add_option("-v", "--verbosity",   dest="verbosity",      action="store",      default=1,     type="int",    help="trace level [format: int]")
+ (options, args) = parser.parse_args()
+
+ ctf = CleanTranscriptFile(options.verbosity)
+ ctf.setInputFile(options.inputFileName, options.format)
+ ctf.setOutputFile(options.outputFileName)
+ ctf.setAcceptedTypes(None if options.acceptedTypes == None else options.acceptedTypes.split(","))
+ ctf.run()
+
b
diff -r d22fadc825e3 -r 2c0c0a89fad7 SMART/Java/Python/ClusterizeByTags.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/SMART/Java/Python/ClusterizeByTags.py Thu May 02 09:56:47 2013 -0400
[
b'@@ -0,0 +1,157 @@\n+#! /usr/bin/env python\n+#\n+# Copyright INRA-URGI 2009-2011\n+# \n+# This software is governed by the CeCILL license under French law and\n+# abiding by the rules of distribution of free software. You can use,\n+# modify and/ or redistribute the software under the terms of the CeCILL\n+# license as circulated by CEA, CNRS and INRIA at the following URL\n+# "http://www.cecill.info".\n+# \n+# As a counterpart to the access to the source code and rights to copy,\n+# modify and redistribute granted by the license, users are provided only\n+# with a limited warranty and the software\'s author, the holder of the\n+# economic rights, and the successive licensors have only limited\n+# liability.\n+# \n+# In this respect, the user\'s attention is drawn to the risks associated\n+# with loading, using, modifying and/or developing or reproducing the\n+# software by the user in light of its specific status of free software,\n+# that may mean that it is complicated to manipulate, and that also\n+# therefore means that it is reserved for developers and experienced\n+# professionals having in-depth computer knowledge. Users are therefore\n+# encouraged to load and test the software\'s suitability as regards their\n+# requirements in conditions enabling the security of their systems and/or\n+# data to be ensured and, more generally, to use and operate it in the\n+# same conditions as regards security.\n+# \n+# The fact that you are presently reading this means that you have had\n+# knowledge of the CeCILL license and that you accept its terms.\n+#\n+import random\n+from optparse import OptionParser\n+from commons.core.parsing.ParserChooser import ParserChooser\n+from commons.core.writer.TranscriptWriter import TranscriptWriter\n+from SMART.Java.Python.structure.Transcript import Transcript\n+from SMART.Java.Python.structure.Interval import Interval\n+from SMART.Java.Python.misc.Progress import Progress\n+from SMART.Java.Python.mySql.MySqlConnection import MySqlConnection\n+from commons.core.writer.MySqlTranscriptWriter import MySqlTranscriptWriter\n+\n+\n+OPERATIONS = ("diff", "div")\n+BOOLTOSTRANDS = {True: [0], False: [-1, 1]}\n+\n+class ClusterizeByTags(object):\n+\n+    def __init__(self, verbosity):\n+        self.verbosity   = verbosity\n+        self.connection  = MySqlConnection(self.verbosity-1)\n+        self.defautValue = None\n+        self.maxDistance = None\n+        self.oneStrand   = False\n+\n+    def setInputFile(self, fileName, format):\n+        chooser = ParserChooser(self.verbosity)\n+        chooser.findFormat(format)\n+        parser = chooser.getParser(fileName)\n+        writer = MySqlTranscriptWriter(self.connection, None, self.verbosity)\n+        writer.addTranscriptList(parser)\n+        writer.write()\n+        self.transcriptTables = writer.getTables()\n+\n+    def setOutputFile(self, fileName):\n+        self.writer = TranscriptWriter(fileName, "gff3", self.verbosity)\n+\n+    def setTag(self, tagName, defaultValue):\n+        self.tagName      = tagName\n+        self.defaultValue = defaultValue\n+\n+    def setThreshold(self, threshold):\n+        self.threshold = threshold\n+\n+    def setOperation(self, operation):\n+        self.operation = operation\n+        if self.operation not in OPERATIONS:\n+            raise Exception("Operation \'%s\' unsupported: choose among %s" % (self.operation, ", ".join(OPERATIONS)))\n+\n+    def setMaxDistance(self, distance):\n+        self.maxDistance = distance\n+\n+    def setOneStrand(self, oneStrand):\n+        self.oneStrand = oneStrand\n+\n+    def run(self):\n+        for chromosome in sorted(self.transcriptTables.keys()):\n+            progress = Progress(self.transcriptTables[chromosome].getNbElements(), "Analyzing %s" % (chromosome), self.verbosity)\n+            for strand in BOOLTOSTRANDS[self.oneStrand]:\n+                previousValue      = None\n+                previousTrend      = None\n+                previousTranscript = None\n+                sumValue           = 0\n+                command = "SELECT * FROM %s" % (self.tran'..b'       trend = value / previousValue\n+                    if previousTranscript == None:\n+                        sumValue = value\n+                    elif (previousTrend == None or abs(trend - previousTrend) <= self.threshold) and (self.maxDistance == None or previousTranscript.getDistance(transcript) <= self.maxDistance) and (previousTranscript.getDirection() == transcript.getDirection() or not self.oneStrand):\n+                        if previousTranscript.getDirection() != transcript.getDirection():\n+                            transcript.reverse()\n+                        previousTranscript.merge(transcript)\n+                        transcript = previousTranscript\n+                        sumValue += value\n+                        previousTrend = trend\n+                    else:\n+                        previousTranscript.setTagValue(self.tagName, sumValue)\n+                        self.writer.addTranscript(previousTranscript)\n+                        sumValue = value\n+                        previousTrend = None\n+                    previousValue      = value\n+                    previousTranscript = transcript\n+                    progress.inc()\n+                if previousTranscript != None:\n+                    previousTranscript.setTagValue(self.tagName, sumValue)\n+                    self.writer.addTranscript(previousTranscript)\n+            progress.done()\n+        self.writer.close()\n+\n+\n+if __name__ == "__main__":\n+    \n+    description = "Clusterize By Tags v1.0.1: Clusterize a set of element using their tag values. [Category: Merge]"\n+\n+    parser = OptionParser(description = description)\n+    parser.add_option("-i", "--input",       dest="inputFileName",  action="store",                     type="string", help="query input file [compulsory] [format: file in transcript format given by -f]")\n+    parser.add_option("-f", "--format",      dest="format",         action="store",                     type="string", help="format of previous file [compulsory] [format: transcript file format]")\n+    parser.add_option("-t", "--tag",         dest="tagName",        action="store",                     type="string", help="name of the tag [format: string] [compulsory]")\n+    parser.add_option("-e", "--default",     dest="defaultValue",   action="store",      default=None,  type="int",    help="default value for the tag [format: string]")\n+    parser.add_option("-r", "--threshold",   dest="threshold",      action="store",                     type="int",    help="threshold between two consecutive tags [format: int] [compulsory]")\n+    parser.add_option("-p", "--operation",   dest="operation",      action="store",                     type="string", help="operation to apply between 2 different clusters to compare them [format: choice (diff, div)] [compulsory]")\n+    parser.add_option("-d", "--distance",    dest="maxDistance",    action="store",      default=None,  type="int",    help="maximum distance for 2 clusters to be merged [format: int] [default: None]")\n+    parser.add_option("-1", "--oneStrand",   dest="oneStrand",      action="store_true", default=False,                help="also cluster the elements which are on different strands [format: bool] [default: False]")\n+    parser.add_option("-o", "--output",      dest="outputFileName", action="store",                     type="string", help="output file [format: output file in GFF3 format]")\n+    parser.add_option("-v", "--verbosity",   dest="verbosity",      action="store",      default=1,     type="int",    help="trace level [format: int]")\n+    (options, args) = parser.parse_args()\n+\n+    cbt = ClusterizeByTags(options.verbosity)\n+    cbt.setInputFile(options.inputFileName, options.format)\n+    cbt.setOutputFile(options.outputFileName)\n+    cbt.setTag(option.tagName, option.defaultValue)\n+    cbt.setThreshold(option.threshold)\n+    cbt.setOperation(option.operation)\n+    cbt.setMaxDistance(operation.maxDistance)\n+    cbt.setOneStrand(operation.oneStrand)\n+    cbt.run()\n'
b
diff -r d22fadc825e3 -r 2c0c0a89fad7 SMART/Java/Python/CollapseReads.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/SMART/Java/Python/CollapseReads.py Thu May 02 09:56:47 2013 -0400
[
b'@@ -0,0 +1,174 @@\n+#! /usr/bin/env python\n+#\n+# Copyright INRA-URGI 2009-2010\n+# \n+# This software is governed by the CeCILL license under French law and\n+# abiding by the rules of distribution of free software. You can use,\n+# modify and/ or redistribute the software under the terms of the CeCILL\n+# license as circulated by CEA, CNRS and INRIA at the following URL\n+# "http://www.cecill.info".\n+# \n+# As a counterpart to the access to the source code and rights to copy,\n+# modify and redistribute granted by the license, users are provided only\n+# with a limited warranty and the software\'s author, the holder of the\n+# economic rights, and the successive licensors have only limited\n+# liability.\n+# \n+# In this respect, the user\'s attention is drawn to the risks associated\n+# with loading, using, modifying and/or developing or reproducing the\n+# software by the user in light of its specific status of free software,\n+# that may mean that it is complicated to manipulate, and that also\n+# therefore means that it is reserved for developers and experienced\n+# professionals having in-depth computer knowledge. Users are therefore\n+# encouraged to load and test the software\'s suitability as regards their\n+# requirements in conditions enabling the security of their systems and/or\n+# data to be ensured and, more generally, to use and operate it in the\n+# same conditions as regards security.\n+# \n+# The fact that you are presently reading this means that you have had\n+# knowledge of the CeCILL license and that you accept its terms.\n+#\n+import os\n+from optparse import OptionParser, OptionGroup\n+from commons.core.parsing.ParserChooser import ParserChooser\n+from commons.core.writer.Gff3Writer import Gff3Writer\n+from SMART.Java.Python.structure.Transcript import Transcript\n+from SMART.Java.Python.ncList.NCListFilePickle import NCListFileUnpickle\n+from SMART.Java.Python.ncList.FileSorter import FileSorter\n+from SMART.Java.Python.misc.Progress import Progress\n+\n+\n+class CollapseReads(object):\n+    """\n+    Merge two reads if they have exactly the same genomic coordinates\n+    """\n+\n+    def __init__(self, verbosity = 0):\n+        self.verbosity         = verbosity\n+        self.inputReader       = None\n+        self.outputWriter      = None\n+        self.strands           = True\n+        self.nbRead            = 0\n+        self.nbWritten         = 0\n+        self.nbMerges          = 0\n+        self.splittedFileNames = {}\n+\n+    def __del__(self):\n+        for fileName in self.splittedFileNames.values():\n+            os.remove(fileName)\n+            \n+    def close(self):\n+        self.outputWriter.close()\n+        \n+    def setInputFile(self, fileName, format):\n+        parserChooser = ParserChooser(self.verbosity)\n+        parserChooser.findFormat(format)\n+        self.parser = parserChooser.getParser(fileName)\n+        self.sortedFileName = "%s_sorted.pkl" % (os.path.splitext(fileName)[0])\n+\n+    def setOutputFile(self, fileName):\n+        self.outputWriter = Gff3Writer(fileName, self.verbosity)\n+\n+    def getNbElements(self):\n+        return self.parser.getNbTranscripts()\n+\n+    def _sortFile(self):\n+        fs = FileSorter(self.parser, self.verbosity-4)\n+        fs.perChromosome(True)\n+        fs.setOutputFileName(self.sortedFileName)\n+        fs.sort()\n+        self.splittedFileNames       = fs.getOutputFileNames()\n+        self.nbElementsPerChromosome = fs.getNbElementsPerChromosome()\n+        self.nbRead                  = fs.getNbElements()\n+        \n+    def _iterate(self, chromosome):\n+        progress    = Progress(self.nbElementsPerChromosome[chromosome], "Checking chromosome %s" % (chromosome), self.verbosity)\n+        transcripts = []\n+        parser      = NCListFileUnpickle(self.splittedFileNames[chromosome], self.verbosity)\n+        for newTranscript in parser.getIterator():\n+            newTranscripts = []\n+            for oldTranscript in transcripts:\n+                if self._checkOverlap(newTranscript, oldTranscript):\n+       '..b'pt2):\n+        self.nbMerges += 1\n+        transcript2.setDirection(transcript1.getDirection())\n+        transcript1.merge(transcript2)\n+\n+    def _write(self, transcript):\n+        self.nbWritten += 1\n+        self.outputWriter.addTranscript(transcript)\n+\n+    def _checkOverlap(self, transcript1, transcript2):\n+        if transcript1.getStart() != transcript2.getStart() or transcript1.getEnd() != transcript2.getEnd():\n+            return False\n+        return (not self.strands or transcript1.getDirection() == transcript2.getDirection())\n+\n+    def _checkPassed(self, transcript1, transcript2):\n+        return (transcript2.getStart() < transcript1.getStart())\n+\n+    def collapseChromosome(self, chromosome):\n+        progress            = Progress(table.getNbElements(), "Analysing chromosome %s" % (chromosome), self.verbosity)\n+        command             = "SELECT * FROM %s ORDER BY start ASC, end DESC" % (table.name)\n+        transcriptStart     = None\n+        transcriptEnd       = None\n+        transcriptDirection = None\n+        currentTranscript   = None\n+        if self.strands:\n+            command += ", direction"\n+        for index, transcript in table.selectTranscripts(command, True):\n+            self.nbRead += 1\n+            if not self.strands:\n+                transcript.setDirection("+")\n+            if transcriptStart != transcript.getStart() or transcriptEnd != transcript.getEnd() or transcriptDirection != transcript.getDirection():\n+                self.writeTranscript(currentTranscript)\n+                transcriptStart     = transcript.getStart()\n+                transcriptEnd       = transcript.getEnd()\n+                transcriptDirection = transcript.getDirection()\n+                currentTranscript   = transcript\n+            else:\n+                currentTranscript.setTagValue("nbElements", (currentTranscript.getTagValue("nbElements") + 1) if "nbElements" in currentTranscript.getTagNames() else 1)\n+            progress.inc()\n+        self.writeTranscript(currentTranscript)\n+        progress.done()\n+\n+    def collapse(self):\n+        self._sortFile()\n+        for chromosome in sorted(self.nbElementsPerChromosome.keys()):\n+            self._iterate(chromosome)\n+        self.outputWriter.close()\n+        if self.verbosity > 1:\n+            print "# reads read: %d" % (self.nbRead)\n+            print "# reads written: %d (%.2f%%)" % (self.nbWritten, float(self.nbWritten) / self.nbRead * 100)\n+            print "# reads merges: %d" % (self.nbMerges)\n+\n+if __name__ == "__main__":\n+    \n+    # parse command line\n+    description = "Collapse Reads v1.0.3: Merge two reads if they have exactly the same genomic coordinates. [Category: Merge]"\n+\n+    parser = OptionParser(description = description)\n+    parser.add_option("-i", "--input",     dest="inputFileName",  action="store",                     type="string", help="input file [compulsory] [format: file in mapping format given by -f]")\n+    parser.add_option("-f", "--format",    dest="format",         action="store",                     type="string", help="format of the file [compulsory] [format: mapping file format]")\n+    parser.add_option("-o", "--output",    dest="outputFileName", action="store",                     type="string", help="output file [compulsory] [format: output file in GFF3 format]")\n+    parser.add_option("-s", "--strands",   dest="strands",        action="store_true", default=False,                help="merge elements on 2 different strands [format: bool] [default: false]")\n+    parser.add_option("-v", "--verbosity", dest="verbosity",      action="store",      default=1,     type="int",    help="trace level [default: 1] [format: int]")\n+    (options, args) = parser.parse_args()\n+\n+    collapser = CollapseReads(options.verbosity)\n+    collapser.setInputFile(options.inputFileName, options.format)\n+    collapser.setOutputFile(options.outputFileName)\n+    collapser.strands = not options.strands\n+    collapser.collapse()\n+    collapser.close()\n'
b
diff -r d22fadc825e3 -r 2c0c0a89fad7 SMART/Java/Python/CombineTags.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/SMART/Java/Python/CombineTags.py Thu May 02 09:56:47 2013 -0400
[
@@ -0,0 +1,115 @@
+#! /usr/bin/env python
+#
+# Copyright INRA-URGI 2009-2011
+# 
+# This software is governed by the CeCILL license under French law and
+# abiding by the rules of distribution of free software. You can use,
+# modify and/ or redistribute the software under the terms of the CeCILL
+# license as circulated by CEA, CNRS and INRIA at the following URL
+# "http://www.cecill.info".
+# 
+# As a counterpart to the access to the source code and rights to copy,
+# modify and redistribute granted by the license, users are provided only
+# with a limited warranty and the software's author, the holder of the
+# economic rights, and the successive licensors have only limited
+# liability.
+# 
+# In this respect, the user's attention is drawn to the risks associated
+# with loading, using, modifying and/or developing or reproducing the
+# software by the user in light of its specific status of free software,
+# that may mean that it is complicated to manipulate, and that also
+# therefore means that it is reserved for developers and experienced
+# professionals having in-depth computer knowledge. Users are therefore
+# encouraged to load and test the software's suitability as regards their
+# requirements in conditions enabling the security of their systems and/or
+# data to be ensured and, more generally, to use and operate it in the
+# same conditions as regards security.
+# 
+# The fact that you are presently reading this means that you have had
+# knowledge of the CeCILL license and that you accept its terms.
+#
+import os
+import random
+from optparse import OptionParser
+from SMART.Java.Python.structure.TranscriptContainer import TranscriptContainer
+from SMART.Java.Python.misc.Progress import Progress
+from commons.core.parsing.ParserChooser import ParserChooser
+from commons.core.writer.Gff3Writer import Gff3Writer
+
+OPERATIONS = ("plus", "minus", "times", "div")
+
+class CombineTags(object):
+
+    def __init__(self, verbosity = 0):
+        self.verbosity       = verbosity
+
+    def setInputFile(self, fileName, format):
+        self.inputFileName = fileName
+        parserChooser = ParserChooser(self.verbosity)
+        parserChooser.findFormat(format, "transcript")
+        self.parser = parserChooser.getParser(fileName)
+
+    def setOutputFile(self, fileName):
+        self.outputWriter = Gff3Writer(fileName, self.verbosity)
+
+    def setTags(self, tag1, tag2, outputTag, defaultValue = None):
+        self.tag1         = tag1
+        self.tag2         = tag2
+        self.outputTag    = outputTag
+        self.defaultValue = defaultValue
+
+    def setOperation(self, operation):
+        self.operation = operation
+        if self.operation not in OPERATIONS:
+            raise Exception("Do no handle operation %s, only: %s" % (self.operation, ", ".join(OPERATIONS)))
+
+    def run(self):
+        progress = Progress(self.parser.getNbTranscripts(), "Printing transcripts %s" % (self.inputFileName), self.verbosity)
+        for transcript in self.parser.getIterator():
+            tag1 = transcript.getTagValue(self.tag1)
+            tag2 = transcript.getTagValue(self.tag2)
+            if tag1 == None or tag2 == None:
+                if self.defaultValue == None:
+                    raise Exception("Transcript %s misses one of the tags %s and %s, and has no default value !" % (transcript, self.tag1, self.tag2))
+                newTag = self.defaultValue
+            else:
+                tag1, tag2 = float(tag1), float(tag2)
+                if self.operation == "plus":
+                    newTag = tag1 + tag2
+                elif self.operation == "minus":
+                    newTag = tag1 - tag2
+                elif self.operation == "times":
+                    newTag = tag1 * tag2
+                elif self.operation == "div":
+                    newTag = tag1 / tag2
+            transcript.setTagValue(self.outputTag, newTag)
+            self.outputWriter.addTranscript(transcript)
+            progress.inc()
+        progress.done()
+        self.parser.close()
+        self.outputWriter.close()
+
+
+if __name__ == "__main__":
+    
+    # parse command line
+    description = "Change Tag Name v1.0.1: Change the name of tag of a list of transcripts. [Category: Data Modification]"
+
+    parser = OptionParser(description = description)
+    parser.add_option("-i", "--input",       dest="inputFileName",  action="store",               type="string", help="input file [compulsory] [format: file in transcript format given by -f]")
+    parser.add_option("-f", "--inputFormat", dest="inputFormat",    action="store",               type="string", help="format of the input file [compulsory] [format: transcript file format]")
+    parser.add_option("-o", "--output",      dest="outputFileName", action="store",               type="string", help="output file [compulsory] [format: output file in GFF3 format]")
+    parser.add_option("-t", "--tag1",        dest="tag1",           action="store",               type="string", help="name of the first tag [compulsory] [format: string]")
+    parser.add_option("-T", "--tag2",        dest="tag2",           action="store",               type="string", help="name of the second tag [compulsory] [format: string]")
+    parser.add_option("-d", "--default",     dest="defaultValue",   action="store", default=None, type="string", help="default value when one of the tag is absent [compulsory] [format: float]")
+    parser.add_option("-n", "--new",         dest="newTag",         action="store",               type="string", help="name of the new tag [compulsory] [format: string]")
+    parser.add_option("-p", "--operation",   dest="operation",      action="store",               type="string", help="operation combining the tags [compulsory] [format: choice (plus, minus, times, div)]")
+    parser.add_option("-v", "--verbosity",   dest="verbosity",      action="store", default=1,    type="int",    help="trace level [format: int] [default: 1]")
+    (options, args) = parser.parse_args()
+
+    combiner = CombineTags(options.verbosity)
+    combiner.setInputFile(options.inputFileName, options.inputFormat)
+    combiner.setOutputFile("%s.gff3" % (options.outputFileName))
+    combiner.setTags(options.tag1, options.tag2, options.newTag, options.defaultValue)
+    combiner.setOperation(options.operation)
+    combiner.run()
b
diff -r d22fadc825e3 -r 2c0c0a89fad7 SMART/Java/Python/CompareOverlapping.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/SMART/Java/Python/CompareOverlapping.py Thu May 02 09:56:47 2013 -0400
[
b'@@ -0,0 +1,491 @@\n+#! /usr/bin/env python\n+#\n+# Copyright INRA-URGI 2009-2010\n+# \n+# This software is governed by the CeCILL license under French law and\n+# abiding by the rules of distribution of free software. You can use,\n+# modify and/ or redistribute the software under the terms of the CeCILL\n+# license as circulated by CEA, CNRS and INRIA at the following URL\n+# "http://www.cecill.info".\n+# \n+# As a counterpart to the access to the source code and rights to copy,\n+# modify and redistribute granted by the license, users are provided only\n+# with a limited warranty and the software\'s author, the holder of the\n+# economic rights, and the successive licensors have only limited\n+# liability.\n+# \n+# In this respect, the user\'s attention is drawn to the risks associated\n+# with loading, using, modifying and/or developing or reproducing the\n+# software by the user in light of its specific status of free software,\n+# that may mean that it is complicated to manipulate, and that also\n+# therefore means that it is reserved for developers and experienced\n+# professionals having in-depth computer knowledge. Users are therefore\n+# encouraged to load and test the software\'s suitability as regards their\n+# requirements in conditions enabling the security of their systems and/or\n+# data to be ensured and, more generally, to use and operate it in the\n+# same conditions as regards security.\n+# \n+# The fact that you are presently reading this means that you have had\n+# knowledge of the CeCILL license and that you accept its terms.\n+#\n+import os, struct, time, random\n+from optparse import OptionParser\n+from commons.core.parsing.ParserChooser import ParserChooser\n+from commons.core.writer.Gff3Writer import Gff3Writer\n+from SMART.Java.Python.structure.Transcript import Transcript\n+from SMART.Java.Python.structure.Interval import Interval\n+from SMART.Java.Python.ncList.NCList import NCList\n+from SMART.Java.Python.ncList.NCListCursor import NCListCursor\n+from SMART.Java.Python.ncList.NCListFilePickle import NCListFilePickle, NCListFileUnpickle\n+from SMART.Java.Python.ncList.NCListHandler import NCListHandler\n+from SMART.Java.Python.ncList.ConvertToNCList import ConvertToNCList\n+from SMART.Java.Python.misc.Progress import Progress\n+from SMART.Java.Python.misc.UnlimitedProgress import UnlimitedProgress\n+from SMART.Java.Python.misc import Utils\n+try:\n+\timport cPickle as pickle\n+except:\n+\timport pickle\n+\n+REFERENCE = 0\n+QUERY = 1\n+TYPES = (REFERENCE, QUERY)\n+TYPETOSTRING = {0: "reference", 1: "query"}\n+\n+class CompareOverlapping(object):\n+\n+\tdef __init__(self, verbosity = 1):\n+\t\tself._outputFileName\t\t   = "outputOverlaps.gff3"\n+\t\tself._iWriter\t\t\t\t   = None\n+\t\tself._nbOverlappingQueries\t   = 0\n+\t\tself._nbOverlaps\t\t\t   = 0\n+\t\tself._nbLines\t\t\t\t   = {REFERENCE: 0, QUERY: 0}\n+\t\tself._verbosity\t\t\t\t   = verbosity\n+\t\tself._ncLists\t\t\t\t   = {}\n+\t\tself._cursors\t\t\t\t   = {}\n+\t\tself._splittedFileNames\t\t   = {}\n+\t\tself._nbElements\t\t\t   = {}\n+\t\tself._nbElementsPerChromosome  = {}\n+\t\tself._inputFileNames\t\t   = {REFERENCE: None,  QUERY: None}\n+\t\tself._inputFileFormats\t\t   = {REFERENCE: None,  QUERY: None}\n+\t\tself._starts\t\t\t\t   = {REFERENCE: None, QUERY: None}\n+\t\tself._ends\t\t\t\t\t   = {REFERENCE: None, QUERY: None}\n+\t\tself._fivePrimes\t\t\t   = {REFERENCE: None, QUERY: None}\n+\t\tself._threePrimes\t\t\t   = {REFERENCE: None, QUERY: None}\n+\t\tself._ncListHandlers\t\t   = {REFERENCE: None,  QUERY: None}\n+\t\tself._convertedFileNames\t   = {REFERENCE: False, QUERY: False}\n+\t\tself._sorted                   = False\n+\t\tself._index                    = False\n+\t\tself._introns\t\t\t\t   = False\n+\t\tself._antisense\t\t\t\t   = False\n+\t\tself._colinear\t\t\t\t   = False\n+\t\tself._invert\t\t\t\t   = False\n+\t\tself._distance\t\t\t\t   = 0\n+\t\tself._minOverlap\t\t\t   = 1\n+\t\tself._pcOverlap\t\t\t\t   = None\n+\t\tself._included\t\t\t\t   = False\n+\t\tself._including\t\t\t\t   = False\n+\t\tself._outputNotOverlapping\t   = False\n+\t\tself._tmpRefFileName\t\t   = None\n+\t\tself._currentQueryTranscript   = None\n+\t\tself._currentOrQueryTranscript = None\n+\t'..b'in file 1 (do not use it with -S) [format: int]")\n+\tparser.add_option("-u", "--end2",\t\t\t  dest="end2",\t\t     action="store",\t  default=None,  type="int",\thelp="only consider the n last nucleotides of the transcripts in file 2 (do not use it with -s) [format: int]")\n+\tparser.add_option("-t", "--intron",\t\t      dest="introns",\t\t action="store_true", default=False,\t\t\t\thelp="also report introns [format: bool] [default: false]")\n+\tparser.add_option("-E", "--5primeExtension1", dest="fivePrime1",\t action="store",\t  default=None,  type="int",\thelp="extension towards 5\' in file 1 [format: int]")\n+\tparser.add_option("-e", "--5primeExtension2", dest="fivePrime2",\t action="store",\t  default=None,  type="int",\thelp="extension towards 5\' in file 2 [format: int]")\n+\tparser.add_option("-N", "--3primeExtension1", dest="threePrime1",\t action="store",\t  default=None,  type="int",\thelp="extension towards 3\' in file 1 [format: int]")\n+\tparser.add_option("-n", "--3primeExtension2", dest="threePrime2",\t action="store",\t  default=None,  type="int",\thelp="extension towards 3\' in file 2 [format: int]")\n+\tparser.add_option("-c", "--colinear",\t\t  dest="colinear",\t\t action="store_true", default=False,\t\t\t\thelp="colinear only [format: bool] [default: false]")\n+\tparser.add_option("-a", "--antisense",\t\t  dest="antisense",\t\t action="store_true", default=False,\t\t\t\thelp="antisense only [format: bool] [default: false]")\n+\tparser.add_option("-d", "--distance",\t\t  dest="distance",\t     action="store",\t  default=0,\t type="int",\thelp="accept some distance between query and reference [format: int]")\n+\tparser.add_option("-k", "--included",\t\t  dest="included",\t     action="store_true", default=False,\t\t\t\thelp="keep only elements from file 1 which are included in an element of file 2 [format: bool] [default: false]")\n+\tparser.add_option("-K", "--including",\t\t  dest="including",\t     action="store_true", default=False,\t\t\t\thelp="keep only elements from file 2 which are included in an element of file 1 [format: bool] [default: false]")\n+\tparser.add_option("-m", "--minOverlap",\t\t  dest="minOverlap",\t action="store",\t  default=1,\t type="int",\thelp="minimum number of nucleotides overlapping to declare an overlap [format: int] [default: 1]")\n+\tparser.add_option("-p", "--pcOverlap",\t\t  dest="pcOverlap",\t     action="store",\t  default=None,  type="int",\thelp="minimum percentage of nucleotides to overlap to declare an overlap [format: int]")\n+\tparser.add_option("-O", "--notOverlapping",   dest="notOverlapping", action="store_true", default=False,\t\t\t\thelp="also output not overlapping data [format: bool] [default: false]")\n+\tparser.add_option("-x", "--exclude",\t\t  dest="exclude",\t\t action="store_true", default=False,\t\t\t\thelp="invert the match [format: bool] [default: false]")\n+\tparser.add_option("-v", "--verbosity",\t\t  dest="verbosity",\t\t action="store",\t  default=1,\t type="int",\thelp="trace level [format: int]")\n+\t(options, args) = parser.parse_args()\n+\n+\tco = CompareOverlapping(options.verbosity)\n+\tco.setInput(options.inputFileName1, options.format1, QUERY)\n+\tco.setInput(options.inputFileName2, options.format2, REFERENCE)\n+\tco.setOutput(options.output)\n+\tco.setSorted(options.sorted)\n+\tco.setIndex(options.index)\n+\tco.restrictToStart(options.start1, QUERY)\n+\tco.restrictToStart(options.start2, REFERENCE)\n+\tco.restrictToEnd(options.end1, QUERY)\n+\tco.restrictToEnd(options.end2, REFERENCE)\n+\tco.extendFivePrime(options.fivePrime1, QUERY)\n+\tco.extendFivePrime(options.fivePrime2, REFERENCE)\n+\tco.extendThreePrime(options.threePrime1, QUERY)\n+\tco.extendThreePrime(options.threePrime2, REFERENCE)\n+\tco.acceptIntrons(options.introns)\n+\tco.getAntisenseOnly(options.antisense)\n+\tco.getColinearOnly(options.colinear)\n+\tco.getInvert(options.exclude)\n+\tco.setMaxDistance(options.distance)\n+\tco.setMinOverlap(options.minOverlap)\n+\tco.setPcOverlap(options.pcOverlap)\n+\tco.setIncludedOnly(options.included)\n+\tco.setIncludingOnly(options.including)\n+\tco.includeNotOverlapping(options.notOverlapping)\n+\tco.run()\n'
b
diff -r d22fadc825e3 -r 2c0c0a89fad7 SMART/Java/Python/CompareOverlappingSmallQuery.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/SMART/Java/Python/CompareOverlappingSmallQuery.py Thu May 02 09:56:47 2013 -0400
[
b'@@ -0,0 +1,261 @@\n+#! /usr/bin/env python\n+#\n+# Copyright INRA-URGI 2009-2011\n+# \n+# This software is governed by the CeCILL license under French law and\n+# abiding by the rules of distribution of free software. You can use,\n+# modify and/ or redistribute the software under the terms of the CeCILL\n+# license as circulated by CEA, CNRS and INRIA at the following URL\n+# "http://www.cecill.info".\n+# \n+# As a counterpart to the access to the source code and rights to copy,\n+# modify and redistribute granted by the license, users are provided only\n+# with a limited warranty and the software\'s author, the holder of the\n+# economic rights, and the successive licensors have only limited\n+# liability.\n+# \n+# In this respect, the user\'s attention is drawn to the risks associated\n+# with loading, using, modifying and/or developing or reproducing the\n+# software by the user in light of its specific status of free software,\n+# that may mean that it is complicated to manipulate, and that also\n+# therefore means that it is reserved for developers and experienced\n+# professionals having in-depth computer knowledge. Users are therefore\n+# encouraged to load and test the software\'s suitability as regards their\n+# requirements in conditions enabling the security of their systems and/or\n+# data to be ensured and, more generally, to use and operate it in the\n+# same conditions as regards security.\n+# \n+# The fact that you are presently reading this means that you have had\n+# knowledge of the CeCILL license and that you accept its terms.\n+#\n+from optparse import OptionParser\n+from commons.core.parsing.ParserChooser import ParserChooser\n+from commons.core.writer.TranscriptWriter import TranscriptWriter\n+from SMART.Java.Python.structure.Interval import Interval\n+from SMART.Java.Python.structure.Transcript import Transcript\n+from SMART.Java.Python.structure.Mapping import Mapping\n+from SMART.Java.Python.misc.Progress import Progress\n+from SMART.Java.Python.misc.UnlimitedProgress import UnlimitedProgress\n+\n+MINBIN = 3\n+MAXBIN = 7\n+REFERENCE = 0\n+QUERY = 1\n+\n+def getBin(start, end):\n+\tfor i in range(MINBIN, MAXBIN + 1):\n+\t\tbinLevel = 10 ** i\n+\t\tif int(start / binLevel) == int(end / binLevel):\n+\t\t\treturn int(i * 10 ** (MAXBIN + 1) + int(start / binLevel))\n+\treturn int((MAXBIN + 1) * 10 ** (MAXBIN + 1))\n+\n+def getOverlappingBins(start, end):\n+\tarray\t= []\n+\tbigBin = int((MAXBIN + 1) * 10 ** (MAXBIN + 1))\n+\tfor i in range(MINBIN, MAXBIN + 1):\n+\t\tbinLevel = 10 ** i\n+\t\tarray.append((int(i * 10 ** (MAXBIN + 1) + int(start / binLevel)), int(i * 10 ** (MAXBIN + 1) + int(end / binLevel))))\n+\tarray.append((bigBin, bigBin))\n+\treturn array\n+\n+\n+class CompareOverlappingSmallQuery(object):\n+\n+\tdef __init__(self, verbosity):\n+\t\tself.verbosity      = verbosity\n+\t\tself.tableNames     = {}\n+\t\tself.nbQueries      = 0\n+\t\tself.nbRefs\t        = 0\n+\t\tself.nbWritten      = 0\n+\t\tself.nbOverlaps     = 0\n+\t\tself.distance       = None\n+\t\tself.invert         = False\n+\t\tself.antisense      = False\n+\t\tself.collinear      = False\n+\t\tself.pcOverlapQuery = False\n+\t\tself.pcOverlapRef   = False\n+\t\tself.minOverlap     = False\n+\t\tself.included       = False\n+\t\tself.including      = False\n+\t\tself.bins\t        = {}\n+\t\tself.overlaps       = {}\n+\t\tself.notOverlapping = False\n+\n+\tdef setReferenceFile(self, fileName, format):\n+\t\tchooser = ParserChooser(self.verbosity)\n+\t\tchooser.findFormat(format)\n+\t\tself.refParser = chooser.getParser(fileName)\n+\n+\tdef setQueryFile(self, fileName, format):\n+\t\tchooser = ParserChooser(self.verbosity)\n+\t\tchooser.findFormat(format)\n+\t\tself.queryParser = chooser.getParser(fileName)\n+\n+\tdef setOutputFile(self, fileName):\n+\t\tself.writer = TranscriptWriter(fileName, "gff3", self.verbosity)\n+\n+\tdef setDistance(self, distance):\n+\t\tself.distance = distance\n+\n+\tdef setInvert(self, boolean):\n+\t\tself.invert = boolean\n+\n+\tdef setCollinear(self, boolean):\n+\t\tself.collinear = boolean\n+\n+\tdef setAntisense(self, boolean):\n+\t\tself.antisense = boolean\n+\n+\tdef setMinPercentOverlap(sel'..b'\tprint "# written:  %d (%d overlaps)" % (self.nbWritten, self.nbOverlaps)\n+\n+\tdef run(self):\n+\t\tself.loadQuery()\n+\t\tself.compare()\n+\t\tself.printResults()\n+\t\tself.displayResults()\n+\n+if __name__ == "__main__":\n+\t\n+\tdescription = "Compare Overlapping Small Query v1.0.1: Provide the queries that overlap with a reference, when the query is small. [Category: Data Comparison]"\n+\n+\tparser = OptionParser(description = description)\n+\tparser.add_option("-i", "--input1",\t        dest="inputFileName1", action="store",\t\t\t           type="string", help="query input file [compulsory] [format: file in transcript format given by -f]")\n+\tparser.add_option("-f", "--format1",        dest="format1",\t\t  action="store",\t\t\t           type="string", help="format of previous file [compulsory] [format: transcript file format]")\n+\tparser.add_option("-j", "--input2",\t        dest="inputFileName2", action="store",\t\t\t           type="string", help="reference input file [compulsory] [format: file in transcript format given by -g]")\n+\tparser.add_option("-g", "--format2",        dest="format2",\t\t  action="store",\t\t\t           type="string", help="format of previous file [compulsory] [format: transcript file format]")\n+\tparser.add_option("-o", "--output",\t        dest="outputFileName", action="store",\t\t\t           type="string", help="output file [format: output file in GFF3 format]")\n+\tparser.add_option("-O", "--notOverlapping", dest="notOverlapping", action="store_true", default=False,\t\t\t\t help="also output not overlapping data [format: bool] [default: false]")\n+\tparser.add_option("-d", "--distance",\t\tdest="distance",\t   action="store",\t    default=0,\t   type="int",\t help="accept some distance between query and reference [format: int]")\n+\tparser.add_option("-c", "--collinear",\t\tdest="collinear",\t   action="store_true", default=False,\t\t\t \t help="provide collinear features [format: bool] [default: false]")\n+\tparser.add_option("-a", "--antisense",\t\tdest="antisense",\t   action="store_true", default=False,\t\t\t \t help="provide antisense features [format: bool] [default: false]")\n+\tparser.add_option("-m", "--minOverlap",\t    dest="minOverlap",     action="store",      default=False, type="int",\t help="min. #nt overlap [format: bool] [default: false]")\n+\tparser.add_option("-p", "--pcOverlapQuery",\tdest="pcOverlapQuery", action="store",      default=False, type="int",\t help="min. % overlap of the query [format: bool] [default: false]")\n+\tparser.add_option("-P", "--pcOverlapRef",\tdest="pcOverlapRef",   action="store",      default=False, type="int",   help="min. % overlap of the reference [format: bool] [default: false]")\n+\tparser.add_option("-k", "--included",\t\tdest="included",\t   action="store_true", default=False,\t\t\t \t help="provide query elements which are nested in reference elements [format: bool] [default: false]")\n+\tparser.add_option("-K", "--including",\t\tdest="including",\t   action="store_true", default=False,\t\t\t \t help="provide query elements in which reference elements are nested [format: bool] [default: false]")\n+\tparser.add_option("-x", "--exclude",\t\tdest="exclude",\t\t   action="store_true", default=False,\t\t\t \t help="invert the match [format: bool] [default: false]")\n+\tparser.add_option("-v", "--verbosity",      dest="verbosity",\t   action="store",      default=1,     type="int",\t help="trace level [format: int]")\n+\t(options, args) = parser.parse_args()\n+\n+\tcosq = CompareOverlappingSmallQuery(options.verbosity)\n+\tcosq.setQueryFile(options.inputFileName1, options.format1)\n+\tcosq.setReferenceFile(options.inputFileName2, options.format2)\n+\tcosq.setOutputFile(options.outputFileName)\n+\tcosq.includeNotOverlapping(options.notOverlapping)\n+\tcosq.setDistance(options.distance)\n+\tcosq.setCollinear(options.collinear)\n+\tcosq.setAntisense(options.antisense)\n+\tcosq.setMinPercentOverlap(options.pcOverlapQuery, options.pcOverlapRef)\n+\tcosq.setMinOverlap(options.minOverlap)\n+\tcosq.setInclude(options.included, options.including)\n+\tcosq.setInvert(options.exclude)\n+\tcosq.run()\n'
b
diff -r d22fadc825e3 -r 2c0c0a89fad7 SMART/Java/Python/CompareOverlappingSmallRef.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/SMART/Java/Python/CompareOverlappingSmallRef.py Thu May 02 09:56:47 2013 -0400
[
b'@@ -0,0 +1,250 @@\n+#! /usr/bin/env python\n+#\n+# Copyright INRA-URGI 2009-2011\n+# \n+# This software is governed by the CeCILL license under French law and\n+# abiding by the rules of distribution of free software. You can use,\n+# modify and/ or redistribute the software under the terms of the CeCILL\n+# license as circulated by CEA, CNRS and INRIA at the following URL\n+# "http://www.cecill.info".\n+# \n+# As a counterpart to the access to the source code and rights to copy,\n+# modify and redistribute granted by the license, users are provided only\n+# with a limited warranty and the software\'s author, the holder of the\n+# economic rights, and the successive licensors have only limited\n+# liability.\n+# \n+# In this respect, the user\'s attention is drawn to the risks associated\n+# with loading, using, modifying and/or developing or reproducing the\n+# software by the user in light of its specific status of free software,\n+# that may mean that it is complicated to manipulate, and that also\n+# therefore means that it is reserved for developers and experienced\n+# professionals having in-depth computer knowledge. Users are therefore\n+# encouraged to load and test the software\'s suitability as regards their\n+# requirements in conditions enabling the security of their systems and/or\n+# data to be ensured and, more generally, to use and operate it in the\n+# same conditions as regards security.\n+# \n+# The fact that you are presently reading this means that you have had\n+# knowledge of the CeCILL license and that you accept its terms.\n+#\n+from optparse import OptionParser\n+from commons.core.parsing.ParserChooser import ParserChooser\n+from commons.core.writer.TranscriptWriter import TranscriptWriter\n+from SMART.Java.Python.structure.Interval import Interval\n+from SMART.Java.Python.structure.Transcript import Transcript\n+from SMART.Java.Python.structure.Mapping import Mapping\n+from SMART.Java.Python.misc.Progress import Progress\n+from SMART.Java.Python.misc.UnlimitedProgress import UnlimitedProgress\n+\n+MINBIN = 3\n+MAXBIN = 7\n+REFERENCE = 0\n+QUERY = 1\n+\n+def getBin(start, end):\n+\tfor i in range(MINBIN, MAXBIN + 1):\n+\t\tbinLevel = 10 ** i\n+\t\tif int(start / binLevel) == int(end / binLevel):\n+\t\t\treturn int(i * 10 ** (MAXBIN + 1) + int(start / binLevel))\n+\treturn int((MAXBIN + 1) * 10 ** (MAXBIN + 1))\n+\n+def getOverlappingBins(start, end):\n+\tarray\t= []\n+\tbigBin = int((MAXBIN + 1) * 10 ** (MAXBIN + 1))\n+\tfor i in range(MINBIN, MAXBIN + 1):\n+\t\tbinLevel = 10 ** i\n+\t\tarray.append((int(i * 10 ** (MAXBIN + 1) + int(start / binLevel)), int(i * 10 ** (MAXBIN + 1) + int(end / binLevel))))\n+\tarray.append((bigBin, bigBin))\n+\treturn array\n+\n+\n+class CompareOverlappingSmallRef(object):\n+\n+\tdef __init__(self, verbosity):\n+\t\tself.verbosity      = verbosity\n+\t\tself.tableNames     = {}\n+\t\tself.nbQueries      = 0\n+\t\tself.nbRefs\t        = 0\n+\t\tself.nbWritten      = 0\n+\t\tself.nbOverlaps     = 0\n+\t\tself.invert         = False\n+\t\tself.antisense      = False\n+\t\tself.collinear      = False\n+\t\tself.distance       = None\n+\t\tself.minOverlap     = False\n+\t\tself.pcOverlapQuery = False\n+\t\tself.pcOverlapRef   = False\n+\t\tself.included       = False\n+\t\tself.including      = False\n+\t\tself.bins\t        = {}\n+\t\tself.notOverlapping = False\n+\n+\tdef setReferenceFile(self, fileName, format):\n+\t\tchooser = ParserChooser(self.verbosity)\n+\t\tchooser.findFormat(format)\n+\t\tself.refParser = chooser.getParser(fileName)\n+\n+\tdef setQueryFile(self, fileName, format):\n+\t\tchooser = ParserChooser(self.verbosity)\n+\t\tchooser.findFormat(format)\n+\t\tself.queryParser = chooser.getParser(fileName)\n+\n+\tdef setOutputFile(self, fileName):\n+\t\tself.writer = TranscriptWriter(fileName, "gff3", self.verbosity)\n+\n+\tdef setDistance(self, distance):\n+\t\tself.distance = distance\n+\n+\tdef setCollinear(self, boolean):\n+\t\tself.collinear = boolean\n+\n+\tdef setAntisense(self, boolean):\n+\t\tself.antisense = boolean\n+\n+\tdef setInvert(self, boolean):\n+\t\tself.invert = boolean\n+\n+\tdef setMinPercentOverlap(self, pcOverlapQuery, pcOverlapRe'..b'\t\t\tprint "# refs:     %d" % (self.nbRefs)\n+\t\t\tprint "# written:  %d (%d overlaps)" % (self.nbWritten, self.nbOverlaps)\n+\n+\tdef run(self):\n+\t\tself.loadRef()\n+\t\tself.compare()\n+\t\tself.displayResults()\n+\n+if __name__ == "__main__":\n+\t\n+\tdescription = "Compare Overlapping Small Reference v1.0.1: Provide the queries that overlap with a reference, when the reference is small. [Category: Data Comparison]"\n+\n+\tparser = OptionParser(description = description)\n+\tparser.add_option("-i", "--input1",\t        dest="inputFileName1", action="store",\t\t\t           type="string", help="query input file [compulsory] [format: file in transcript format given by -f]")\n+\tparser.add_option("-f", "--format1",        dest="format1",\t\t  action="store",\t\t\t           type="string", help="format of previous file [compulsory] [format: transcript file format]")\n+\tparser.add_option("-j", "--input2",\t        dest="inputFileName2", action="store",\t\t\t           type="string", help="reference input file [compulsory] [format: file in transcript format given by -g]")\n+\tparser.add_option("-g", "--format2",        dest="format2",\t\t  action="store",\t\t\t           type="string", help="format of previous file [compulsory] [format: transcript file format]")\n+\tparser.add_option("-o", "--output",\t        dest="outputFileName", action="store",\t\t\t           type="string", help="output file [format: output file in GFF3 format]")\n+\tparser.add_option("-O", "--notOverlapping", dest="notOverlapping", action="store_true", default=False,\t\t\t\t  help="also output not overlapping data [format: bool] [default: false]")\n+\tparser.add_option("-d", "--distance",\t\tdest="distance",\t   action="store",\t    default=0,\t   type="int",\t  help="accept some distance between query and reference [format: int]")\n+\tparser.add_option("-c", "--collinear",\t\tdest="collinear",\t   action="store_true", default=False,\t\t\t \t  help="provide collinear features [format: bool] [default: false]")\n+\tparser.add_option("-a", "--antisense",\t\tdest="antisense",\t   action="store_true", default=False,\t\t\t \t  help="provide antisense features [format: bool] [default: false]")\n+\tparser.add_option("-m", "--minOverlap",\t    dest="minOverlap",     action="store",      default=False, type="int",\t  help="min. #nt overlap [format: bool] [default: false]")\n+\tparser.add_option("-p", "--pcOverlapQuery",\tdest="pcOverlapQuery", action="store",      default=False, type="int",\t  help="min. % overlap of the query [format: bool] [default: false]")\n+\tparser.add_option("-P", "--pcOverlapRef",\tdest="pcOverlapRef",   action="store",      default=False, type="int",    help="min. % overlap of the reference [format: bool] [default: false]")\n+\tparser.add_option("-k", "--included",\t\tdest="included",\t   action="store_true", default=False,\t\t\t \t  help="provide query elements which are nested in reference elements [format: bool] [default: false]")\n+\tparser.add_option("-K", "--including",\t\tdest="including",\t   action="store_true", default=False,\t\t\t \t  help="provide query elements in which reference elements are nested [format: bool] [default: false]")\n+\tparser.add_option("-x", "--exclude",\t\tdest="exclude",\t\t   action="store_true", default=False,\t\t\t \t  help="invert the match [format: bool] [default: false]")\n+\tparser.add_option("-v", "--verbosity",      dest="verbosity",\t   action="store",      default=1,     type="int",\t  help="trace level [format: int]")\n+\t(options, args) = parser.parse_args()\n+\n+\tcosr = CompareOverlappingSmallRef(options.verbosity)\n+\tcosr.setQueryFile(options.inputFileName1, options.format1)\n+\tcosr.setReferenceFile(options.inputFileName2, options.format2)\n+\tcosr.setOutputFile(options.outputFileName)\n+\tcosr.includeNotOverlapping(options.notOverlapping)\n+\tcosr.setDistance(options.distance)\n+\tcosr.setAntisense(options.antisense)\n+\tcosr.setInclude(options.included, options.including)\n+\tcosr.setInvert(options.exclude)\n+\tcosr.setMinOverlap(options.minOverlap)\n+\tcosr.setMinPercentOverlap(options.pcOverlapQuery, options.pcOverlapRef)\n+\tcosr.run()\n+\n'
b
diff -r d22fadc825e3 -r 2c0c0a89fad7 SMART/Java/Python/ComputeCoverage.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/SMART/Java/Python/ComputeCoverage.py Thu May 02 09:56:47 2013 -0400
[
@@ -0,0 +1,142 @@
+#! /usr/bin/env python
+#
+# Copyright INRA-URGI 2009-2011
+# 
+# This software is governed by the CeCILL license under French law and
+# abiding by the rules of distribution of free software. You can use,
+# modify and/ or redistribute the software under the terms of the CeCILL
+# license as circulated by CEA, CNRS and INRIA at the following URL
+# "http://www.cecill.info".
+# 
+# As a counterpart to the access to the source code and rights to copy,
+# modify and redistribute granted by the license, users are provided only
+# with a limited warranty and the software's author, the holder of the
+# economic rights, and the successive licensors have only limited
+# liability.
+# 
+# In this respect, the user's attention is drawn to the risks associated
+# with loading, using, modifying and/or developing or reproducing the
+# software by the user in light of its specific status of free software,
+# that may mean that it is complicated to manipulate, and that also
+# therefore means that it is reserved for developers and experienced
+# professionals having in-depth computer knowledge. Users are therefore
+# encouraged to load and test the software's suitability as regards their
+# requirements in conditions enabling the security of their systems and/or
+# data to be ensured and, more generally, to use and operate it in the
+# same conditions as regards security.
+# 
+# The fact that you are presently reading this means that you have had
+# knowledge of the CeCILL license and that you accept its terms.
+#
+import os, random
+from optparse import OptionParser, OptionGroup
+from SMART.Java.Python.structure.TranscriptContainer import TranscriptContainer
+from SMART.Java.Python.misc.Progress import Progress
+from commons.core.writer.Gff3Writer import Gff3Writer
+
+
+class CoverageComputer(object):
+
+ def __init__(self, verbosity = 0):
+ self.verbosity      = verbosity
+ self.queryReader  = None
+ self.referenceReader = None
+ self.outputWriter  = None
+ self.introns  = False
+ self.nbNucleotides   = 0
+ self.nbCovered      = 0
+
+ def setInputQueryFile(self, fileName, format):
+ self.queryReader = TranscriptContainer(fileName, format, self.verbosity-1)
+
+ def setInputReferenceFile(self, fileName, format):
+ self.referenceReader = TranscriptContainer(fileName, format, self.verbosity-1)
+
+ def includeIntrons(self, boolean):
+ self.introns = boolean
+
+ def setOutputFileName(self, fileName, title="S-MART", feature="transcript", featurePart="exon"):
+ self.outputWriter = Gff3Writer(fileName, self.verbosity-1)
+ self.outputWriter.setTitle(title)
+ self.outputWriter.setFeature(feature)
+ self.outputWriter.setFeaturePart(featurePart)
+
+ def readReference(self):
+ self.coveredRegions = {}
+ progress = Progress(self.referenceReader.getNbTranscripts(), "Reading reference file", self.verbosity-1)
+ for transcript in self.referenceReader.getIterator():
+ chromosome = transcript.getChromosome()
+ if chromosome not in self.coveredRegions:
+ self.coveredRegions[chromosome] = {}
+ if self.introns:
+ transcript.removeExons()
+ for exon in transcript.getExons():
+ for position in range(exon.getStart(), exon.getEnd()+1):
+ self.coveredRegions[chromosome][position] = 1
+ progress.inc()
+ progress.done()
+
+ def readQuery(self):
+ progress = Progress(self.queryReader.getNbTranscripts(), "Reading query file", self.verbosity-1)
+ for transcript in self.queryReader.getIterator():
+ progress.inc()
+ chromosome = transcript.getChromosome()
+ if chromosome not in self.coveredRegions:
+ continue
+ if self.introns:
+ transcript.removeExons()
+ for exon in transcript.getExons():
+ for position in range(exon.getStart(), exon.getEnd()+1):
+ self.nbNucleotides += 1
+ self.nbCovered     += self.coveredRegions[chromosome].get(position, 0)
+ progress.done()
+
+ def write(self):
+ progress = Progress(self.queryReader.getNbTranscripts(), "Writing output file", self.verbosity-1)
+ for transcript in self.queryReader.getIterator():
+ chromosome = transcript.getChromosome()
+ if self.introns:
+ transcript.removeExons()
+ size  = transcript.getSize()
+ coverage = 0
+ for exon in transcript.getExons():
+ for position in range(exon.getStart(), exon.getEnd()+1):
+ coverage += self.coveredRegions[chromosome].get(position, 0)
+ transcript.setTagValue("coverage", 0 if size == 0 else float(coverage) / size * 100)
+ self.outputWriter.addTranscript(transcript)
+ progress.inc()
+ progress.done()
+
+ def sumUp(self):
+ print "%d nucleotides in query, %d (%.f%%) covered" % (self.nbNucleotides, self.nbCovered, 0 if self.nbNucleotides == 0 else float(self.nbCovered) / self.nbNucleotides * 100)
+
+ def run(self):
+ self.readReference()
+ self.readQuery()
+ if self.outputWriter != None:
+ self.write()
+ self.sumUp()
+
+
+if __name__ == "__main__":
+
+ # parse command line
+ description = "Compute Coverage v1.0.1: Compute the coverage of a set with respect to another set. [Category: Personal]"
+
+ parser = OptionParser(description = description)
+ parser.add_option("-i", "--input1",    dest="inputFileName1", action="store",                     type="string", help="input query file [compulsory] [format: file in transcript format given by -f]")
+ parser.add_option("-f", "--format1",   dest="format1",        action="store",                     type="string", help="format of the first file [compulsory] [format: transcript file format]")
+ parser.add_option("-j", "--input2",    dest="inputFileName2", action="store",                     type="string", help="input reference file [compulsory] [format: file in transcript format given by -f]")
+ parser.add_option("-g", "--format2",   dest="format2",        action="store",                     type="string", help="format of the second file [compulsory] [format: transcript file format]")
+ parser.add_option("-t", "--introns",   dest="introns",        action="store_true", default=False,                help="also include introns [format: boolean] [default: false]")
+ parser.add_option("-o", "--output",    dest="outputFileName", action="store",    default=None,  type="string", help="output file [format: output file in GFF3 format]")
+ parser.add_option("-v", "--verbosity", dest="verbosity",   action="store",      default=1,     type="int",    help="trace level [default: 1] [format: int]")
+ (options, args) = parser.parse_args()
+
+ computer = CoverageComputer(options.verbosity)
+ computer.setInputQueryFile(options.inputFileName1, options.format1)
+ computer.setInputReferenceFile(options.inputFileName2, options.format2)
+ computer.includeIntrons(options.introns)
+ computer.setOutputFileName(options.outputFileName)
+ computer.run()
+
b
diff -r d22fadc825e3 -r 2c0c0a89fad7 SMART/Java/Python/CountLoci.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/SMART/Java/Python/CountLoci.py Thu May 02 09:56:47 2013 -0400
[
b'@@ -0,0 +1,230 @@\n+#! /usr/bin/env python\n+#\n+# Copyright INRA-URGI 2009-2012\n+# \n+# This software is governed by the CeCILL license under French law and\n+# abiding by the rules of distribution of free software. You can use,\n+# modify and/ or redistribute the software under the terms of the CeCILL\n+# license as circulated by CEA, CNRS and INRIA at the following URL\n+# "http://www.cecill.info".\n+# \n+# As a counterpart to the access to the source code and rights to copy,\n+# modify and redistribute granted by the license, users are provided only\n+# with a limited warranty and the software\'s author, the holder of the\n+# economic rights, and the successive licensors have only limited\n+# liability.\n+# \n+# In this respect, the user\'s attention is drawn to the risks associated\n+# with loading, using, modifying and/or developing or reproducing the\n+# software by the user in light of its specific status of free software,\n+# that may mean that it is complicated to manipulate, and that also\n+# therefore means that it is reserved for developers and experienced\n+# professionals having in-depth computer knowledge. Users are therefore\n+# encouraged to load and test the software\'s suitability as regards their\n+# requirements in conditions enabling the security of their systems and/or\n+# data to be ensured and, more generally, to use and operate it in the\n+# same conditions as regards security.\n+# \n+# The fact that you are presently reading this means that you have had\n+# knowledge of the CeCILL license and that you accept its terms.\n+#\n+import os, os.path, random\n+from optparse import OptionParser\n+from SMART.Java.Python.structure.TranscriptContainer import TranscriptContainer\n+from commons.core.parsing.GffParser import GffParser\n+from commons.core.writer.Gff3Writer import Gff3Writer\n+from commons.core.writer.TranscriptWriter import TranscriptWriter\n+from SMART.Java.Python.misc.Progress import Progress\n+from SMART.Java.Python.misc.RPlotter import RPlotter\n+from SMART.Java.Python.cleanGff import CleanGff\n+from SMART.Java.Python.CompareOverlappingSmallRef import CompareOverlappingSmallRef\n+from SMART.Java.Python.structure.TranscriptListsComparator import TranscriptListsComparator\n+from SMART.Java.Python.GetUpDownStream import GetUpDownStream\n+\n+REFERENCE = 0\n+QUERY = 1\n+\n+class CountLoci(object):\n+    \n+    def __init__(self, verbosity = 1):\n+        self.verbosity = verbosity\n+        self.tmpFileNames = []\n+\n+    def __del__(self):\n+        for fileName in self.tmpFileNames:\n+            if os.path.exists(fileName):\n+                os.remove(fileName)\n+    \n+    def setInputFile(self, fileName, format):\n+        self.inputFileName = fileName\n+        self.inputFormat = format\n+        self.parser = TranscriptContainer(fileName, format, self.verbosity-1)\n+        if self.verbosity > 0:\n+            print "%d elements in input" % (self.parser.getNbTranscripts())\n+\n+    def setReference(self, fileName):\n+        self.referenceFileName = fileName\n+\n+    def setDistance(self, distance):\n+        self.distance = distance\n+\n+    def setOutputFileName(self, fileName):\n+        self.outputFileName = fileName\n+        self.writer         = Gff3Writer(fileName, self.verbosity-1)\n+        self.outputBase     = "%s_%d_" % (os.path.splitext(fileName)[0], random.randint(0, 10000))\n+\n+    def _writeTmpRef(self, tags, outputFileName):\n+        cleanGff = CleanGff(self.verbosity-1)\n+        cleanGff.setInputFileName(self.referenceFileName)\n+        cleanGff.setOutputFileName(outputFileName)\n+        cleanGff.setAcceptedTypes(tags)\n+        cleanGff.run()\n+\n+    def _getReferenceFiles(self):\n+        self.referenceFiles = {"CDS":                       "%scds.gff3"      % (self.outputBase), \\\n+                               "five_prime_UTR":            "%sfive.gff3"     % (self.outputBase), \\\n+                               "three_prime_UTR":           "%sthree.gff3"    % (self.outputBase), \\\n+                               "mRNA":                      "%smrna.'..b', "gff3", self.referenceFiles["transposable_element_gene"], "gff3", outputNoFileName, True)\n+        self._copy(outputFileName, "TE")\n+        if self.verbosity > 0:\n+            print "%d overlaps in TE" % (nbOverlaps)\n+        return outputNoFileName\n+    \n+    def _getIntron(self, inputFileName):\n+        outputFileName   = "%sin_intron.gff3" % (self.outputBase)\n+        outputNoFileName = "%sin_nointron.gff3" % (self.outputBase)\n+        self.tmpFileNames.extend([outputFileName, outputNoFileName])\n+        nbOverlaps = self._compare(inputFileName, "gff3", self.referenceFiles["mRNA"], "gff3", outputFileName)\n+        self._compare(inputFileName, "gff3", self.referenceFiles["mRNA"], "gff3", outputNoFileName, True)\n+        self._copy(outputFileName, "intron")\n+        if self.verbosity > 0:\n+            print "%d overlaps in introns" % (nbOverlaps)\n+        return outputNoFileName\n+    \n+    def _getVicinity(self, inputFileName):\n+        guds = GetUpDownStream(self.verbosity-1)\n+        guds.setInputFile(self.referenceFiles["mRNA"], "gff3")\n+        guds.setOutputFile(self.referenceFiles["vic"])\n+        guds.setDistances(self.distance, self.distance)\n+        guds.run()\n+        outputFileName = "%sout_vicinity.gff3" % (self.outputBase)\n+        outputNoFileName = "%sout_novicinity.gff3" % (self.outputBase)\n+        self.tmpFileNames.extend([outputFileName, outputNoFileName])\n+        nbOverlaps = self._compare(inputFileName, "gff3", self.referenceFiles["vic"], "gff3", outputFileName)\n+        nbNoOverlaps = self._compare(inputFileName, "gff3", self.referenceFiles["vic"], "gff3", outputNoFileName, True)\n+        self._copy(outputFileName, "vicinity")\n+        self._copy(outputNoFileName, "intergenic")\n+        if self.verbosity > 0:\n+            print "%d overlaps in vicinity" % (nbOverlaps)\n+            print "%d elsewhere" % (nbNoOverlaps)\n+    \n+    def run(self):\n+        self._getReferenceFiles()\n+        outputFileName = self._getCds()\n+        outputFileName = self._getFivePrime(outputFileName)\n+        outputFileName = self._getThreePrime(outputFileName)\n+        outputFileName = self._getNcRna(outputFileName)\n+        outputFileName = self._getTe(outputFileName)\n+        outputFileName = self._getIntron(outputFileName)\n+        self._getVicinity(outputFileName)\n+\n+\n+\n+if __name__ == "__main__":\n+    \n+    # parse command line\n+    description = "Count Loci v1.0.0: Count input elements with respect to CDS, 5\' UTR, 3\' UTR, intron, downstream, upstream. [Category: Personal]"\n+\n+    parser = OptionParser(description = description)\n+    parser.add_option("-i", "--input",     dest="inputFileName",  action="store",            type="string", help="input file              [compulsory] [format: file in transcript format given by -f]")\n+    parser.add_option("-f", "--format",    dest="format",         action="store",            type="string", help="format of the input     [compulsory] [format: transcript file format]")\n+    parser.add_option("-r", "--reference", dest="reference",      action="store",            type="string", help="reference file          [compulsory] [format: file in GFF format]")     \n+    parser.add_option("-o", "--output",    dest="outputFileName", action="store",            type="string", help="output file             [compulsory] [format: output file in GFF3 format]")\n+    parser.add_option("-d", "--distance",  dest="distance",       action="store",            type="int",    help="distance up/down stream [compulsory] [format: output file in GFF3 format]")\n+    parser.add_option("-v", "--verbosity", dest="verbosity",      action="store", default=1, type="int",    help="trace level                          [format: int]")\n+    (options, args) = parser.parse_args()\n+\n+    cl = CountLoci(options.verbosity)\n+    cl.setInputFile(options.inputFileName, options.format)\n+    cl.setDistance(options.distance)\n+    cl.setReference(options.reference)\n+    cl.setOutputFileName(options.outputFileName)\n+    cl.run()\n'
b
diff -r d22fadc825e3 -r 2c0c0a89fad7 SMART/Java/Python/CountReadGCPercent.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/SMART/Java/Python/CountReadGCPercent.py Thu May 02 09:56:47 2013 -0400
[
@@ -0,0 +1,88 @@
+#!/usr/bin/env python
+
+from optparse import OptionParser
+from commons.core.parsing.FastaParser import FastaParser
+from commons.core.writer.Gff3Writer import Gff3Writer
+from SMART.Java.Python.structure.TranscriptContainer import TranscriptContainer
+from SMART.Java.Python.misc.Progress import Progress
+from commons.core.utils.RepetOptionParser import RepetOptionParser
+from Gnome_tools.CountGCPercentBySlidingWindow import CountGCPercentBySlidingWindow
+
+
+class CountReadGCPercent(object):
+    
+    def __init__(self):
+        self.referenceReader = None
+        self.gffReader = None
+        self.outputWriter = None
+        self.verbose = 0
+        
+    def setInputReferenceFile(self, fileName):
+        self.referenceReader = fileName

+    def setInputGffFile(self, fileName):
+        self.gffReader = TranscriptContainer(fileName, 'gff3', self.verbose)
+        
+    def setOutputFileName(self, fileName):
+        self.outputWriter = Gff3Writer(fileName, self.verbose)
+
+    def readGffAnnotation(self):
+        self.coveredRegions = {}
+        progress = Progress(self.gffReader.getNbTranscripts(), "Reading gff3 annotation file", self.verbose)
+        for transcript in self.gffReader.getIterator():
+            chromosome = transcript.getChromosome()
+            if chromosome not in self.coveredRegions:
+                self.coveredRegions[chromosome] = {}
+            for exon in transcript.getExons():
+                for position in range(exon.getStart(), exon.getEnd()+1):
+                    self.coveredRegions[chromosome][position] = 1
+            progress.inc()
+        progress.done()
+        
+    def write(self):
+        iParser = FastaParser(self.referenceReader)
+        iParser.setTags()
+        iGetGCPercentBySW = CountGCPercentBySlidingWindow()
+        progress = Progress(self.gffReader.getNbTranscripts(), "Writing output file", self.verbose)
+        for transcript in self.gffReader.getIterator():
+            chromosome = transcript.getChromosome()
+            GCpercent = 0
+            nPercent = 0
+            for exon in transcript.getExons():
+                    for sequenceName in iParser.getTags().keys():
+                        if sequenceName != chromosome:
+                            continue
+                        else:
+                            subSequence = iParser.getSubSequence(sequenceName, exon.getStart() , exon.getEnd(), 1)
+                            GCpercent, nPercent = iGetGCPercentBySW.getGCPercentAccordingToNAndNPercent(subSequence)
+                            print "GCpercent = %f, nPercent = %f" % (GCpercent, nPercent)
+            transcript.setTagValue("GCpercent", GCpercent)
+            transcript.setTagValue("NPercent", nPercent)
+            self.outputWriter.addTranscript(transcript)
+            progress.inc()
+        progress.done()

+    def run(self):
+        self.readGffAnnotation()
+        if self.outputWriter != None:
+            self.write()
+            
+if __name__ == "__main__":
+        description = "Count GC percent for each read against a genome."
+        usage = "CountReadGCPercent.py -i <fasta file> -j <gff3 file> -o <output gff3 file> -v <verbose> -h]"
+        examples = "\nExample: \n"
+        examples += "\t$ python CountReadGCPercent.py -i file.fasta -j annotation.gff -o output.gff3"
+        examples += "\n\n"
+        parser = RepetOptionParser(description = description, usage = usage, version = "v1.0", epilog = examples)
+        parser.add_option( '-i', '--inputGenome', dest='fastaFile', help='fasta file [compulsory]', default= None )
+        parser.add_option( '-j', '--inputAnnotation', dest='gffFile', help='gff3 file [compulsory]', default= None)
+        parser.add_option( '-o', '--output', dest='outputFile', help='output gff3 file [compulsory]', default= None )
+        parser.add_option( '-v', '--verbose', dest='verbose', help='verbosity level (default=0/1)',type="int", default= 0 )
+        (options, args) = parser.parse_args()
+    
+        readGCPercent = CountReadGCPercent()
+        readGCPercent.setInputReferenceFile(options.fastaFile)
+        readGCPercent.setInputGffFile(options.gffFile)
+        readGCPercent.setOutputFileName(options.outputFile)
+        readGCPercent.run()
+        
\ No newline at end of file
b
diff -r d22fadc825e3 -r 2c0c0a89fad7 SMART/Java/Python/FindOverlapsOptim.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/SMART/Java/Python/FindOverlapsOptim.py Thu May 02 09:56:47 2013 -0400
[
b'@@ -0,0 +1,343 @@\n+#! /usr/bin/env python\n+#\n+# Copyright INRA-URGI 2009-2012\n+# \n+# This software is governed by the CeCILL license under French law and\n+# abiding by the rules of distribution of free software. You can use,\n+# modify and/ or redistribute the software under the terms of the CeCILL\n+# license as circulated by CEA, CNRS and INRIA at the following URL\n+# "http://www.cecill.info".\n+# \n+# As a counterpart to the access to the source code and rights to copy,\n+# modify and redistribute granted by the license, users are provided only\n+# with a limited warranty and the software\'s author, the holder of the\n+# economic rights, and the successive licensors have only limited\n+# liability.\n+# \n+# In this respect, the user\'s attention is drawn to the risks associated\n+# with loading, using, modifying and/or developing or reproducing the\n+# software by the user in light of its specific status of free software,\n+# that may mean that it is complicated to manipulate, and that also\n+# therefore means that it is reserved for developers and experienced\n+# professionals having in-depth computer knowledge. Users are therefore\n+# encouraged to load and test the software\'s suitability as regards their\n+# requirements in conditions enabling the security of their systems and/or\n+# data to be ensured and, more generally, to use and operate it in the\n+# same conditions as regards security.\n+# \n+# The fact that you are presently reading this means that you have had\n+# knowledge of the CeCILL license and that you accept its terms.\n+#\n+\n+import os, struct, time, shutil\n+from optparse import OptionParser\n+from commons.core.parsing.ParserChooser import ParserChooser\n+from commons.core.writer.Gff3Writer import Gff3Writer\n+from SMART.Java.Python.structure.Transcript import Transcript\n+from SMART.Java.Python.structure.Interval import Interval\n+from SMART.Java.Python.ncList.NCList import NCList\n+from SMART.Java.Python.ncList.ConvertToNCList import ConvertToNCList\n+from SMART.Java.Python.ncList.NCListParser import NCListParser\n+from SMART.Java.Python.ncList.NCListCursor import NCListCursor\n+from SMART.Java.Python.ncList.NCListFilePickle import NCListFilePickle, NCListFileUnpickle\n+from SMART.Java.Python.ncList.NCListHandler import NCListHandler\n+from SMART.Java.Python.misc.Progress import Progress\n+from SMART.Java.Python.misc.UnlimitedProgress import UnlimitedProgress\n+try:\n+   import cPickle as pickle\n+except:\n+   import pickle\n+\n+REFERENCE = 0\n+QUERY = 1\n+TYPES = (REFERENCE, QUERY)\n+TYPETOSTRING = {0: "reference", 1: "query"}\n+\n+class FindOverlapsOptim(object):\n+\t\n+\tdef __init__(self, verbosity = 1):\n+\t\tself._parsers\t\t\t\t  = {}\n+\t\tself._sortedFileNames\t\t  = {}\n+\t\tself._outputFileName\t\t  = "outputOverlaps.gff3"\n+\t\tself._iWriter\t\t\t\t  = None\n+\t\tself._inputFileNames\t\t  = {REFERENCE: None,  QUERY: None}\n+\t\tself._convertedFileNames      = {REFERENCE: False, QUERY: False}\n+\t\tself._inputFileFormats\t\t  = {REFERENCE: None,  QUERY: None}\n+\t\tself._converted\t\t\t      = {REFERENCE: False, QUERY: False}\n+\t\tself._ncListHandlers          = {REFERENCE: None,  QUERY: None}\n+\t\tself._splittedFileNames\t      = {REFERENCE: {},\tQUERY: {}}\n+\t\tself._nbOverlappingQueries\t  = 0\n+\t\tself._nbOverlaps\t\t\t  = 0\n+\t\tself._nbLines\t\t\t\t  = {REFERENCE: 0, QUERY: 0}\n+\t\tself._sorted                  = False\n+\t\tself._index                   = False\n+\t\tself._verbosity\t\t\t      = verbosity\n+\t\tself._ncLists\t\t\t\t  = {}\n+\t\tself._cursors\t\t\t\t  = {}\n+\t\tself._nbElementsPerChromosome = {}\n+\t\tself._tmpDirectories\t\t  = {REFERENCE: False, QUERY: False}\n+\t\t\n+\tdef close(self):\n+\t\tself._iWriter.close()\n+\t\tfor fileName in (self._sortedFileNames.values()):\n+\t\t\tif os.path.exists(fileName):\n+\t\t\t\tos.remove(fileName)\n+\t\tfor fileName in self._convertedFileNames.values():\n+\t\t\tif fileName:\n+\t\t\t\tos.remove(fileName)\n+\t\t\n+\tdef setRefFileName(self, fileName, format):\n+\t\tself.setFileName(fileName, format, REFERENCE)\n+\t\t\n+\tdef setQueryFileName(self, fileName, format):\n+\t\tself.setFileName(fileName, format, QUERY)\n+\n+\tdef se'..b'def isOverlapping(self, queryTranscript, refTranscript):\n+\t\tif (queryTranscript.getStart() <= refTranscript.getEnd() and queryTranscript.getEnd() >= refTranscript.getStart()):\n+\t\t\treturn 0   \n+\t\tif queryTranscript.getEnd() < refTranscript.getStart():\n+\t\t\treturn 1\n+\t\treturn -1\n+\n+\tdef checkIndex(self, transcript, cursor):\n+\t\tif not self._index:\n+\t\t\treturn None\n+\t\tchromosome = transcript.getChromosome()\n+\t\tnextLIndex = self._indices[REFERENCE][chromosome].getIndex(transcript)\n+\t\tif nextLIndex == None:\n+\t\t\treturn None\n+\t\tncList\t\t = self._ncLists[REFERENCE][chromosome]\n+\t\tnextGffAddress = ncList.getRefGffAddr(nextLIndex)\n+\t\tthisGffAddress = cursor.getGffAddress()\n+\t\tif nextGffAddress > thisGffAddress:\n+\t\t\treturn nextLIndex\n+\t\treturn None\n+\t\t\n+\tdef _writeIntervalInNewGFF3(self, transcript, names):\n+\t\tnbOverlaps = 0\n+\t\tfor cpt in names.values():\n+\t\t\tnbOverlaps += cpt\n+\t\tif not names:\n+\t\t\treturn\n+\t\ttranscript.setTagValue("overlapsWith", "--".join(sorted(names.keys())))\n+\t\ttranscript.setTagValue("nbOverlaps", nbOverlaps)\n+\t\tself._iWriter.addTranscript(transcript)\n+\t\tself._iWriter.write()\n+\t\tself._nbOverlappingQueries += 1\n+\t\tself._nbOverlaps\t\t   += nbOverlaps\n+\t\t\n+\tdef _extractID(self, transcript):\n+\t\tnbElements = float(transcript.getTagValue("nbElements")) if "nbElements" in transcript.getTagNames() else 1\n+\t\tid\t\t   = transcript.getTagValue("ID")\t\t\t\t if "ID"\t\t in transcript.getTagNames() else transcript.getUniqueName()\n+\t\treturn {id: nbElements}\n+\t\t\n+\tdef run(self):\n+\t\tself.createNCLists()\n+\t\tself.compare()\n+\t\tself.close()\n+\t\tif self._verbosity > 0:\n+\t\t\tprint "# queries: %d" % (self._nbLines[QUERY])\n+\t\t\tprint "# refs:    %d" % (self._nbLines[REFERENCE])\n+\t\t\tprint "# written: %d (%d overlaps)" % (self._nbOverlappingQueries, self._nbOverlaps)\n+\t\t\tprint "time:      %.2gs" % (self._timeSpent)\n+\n+\n+if __name__ == "__main__":\n+\tdescription = "Find Overlaps Optim v1.0.0: Finds overlaps with several query intervals. [Category: Data Comparison]"\n+\n+\tparser = OptionParser(description = description)\n+\tparser.add_option("-i", "--query",\t     dest="inputQueryFileName", action="store",\t\t\t            type="string", help="query input file [compulsory] [format: file in transcript or other format given by -f]")\n+\tparser.add_option("-f", "--queryFormat", dest="queryFormat",\t\taction="store",\t\t\t            type="string", help="format of previous file (possibly in NCL format) [compulsory] [format: transcript or other file format]")\n+\tparser.add_option("-j", "--ref",\t\t dest="inputRefFileName",   action="store",\t\t\t            type="string", help="reference input file [compulsory] [format: file in transcript or other format given by -g]")\n+\tparser.add_option("-g", "--refFormat",   dest="refFormat",\t\t    action="store",\t\t\t            type="string", help="format of previous file (possibly in NCL format) [compulsory] [format: transcript or other file format]")\n+\tparser.add_option("-o", "--output",\t     dest="outputFileName",\t    action="store",\t\t\t            type="string", help="output file [compulsory] [format: output file in GFF3 format]")\n+\tparser.add_option("-d", "--index",\t     dest="index",\t            action="store_true", default=False,\t               help="add an index to the reference file (faster but more memory) [format: boolean] [default: False]")\n+\tparser.add_option("-s", "--sorted",\t     dest="sorted",\t            action="store_true", default=False,\t               help="input files are already sorted [format: boolean] [default: False]")\n+\tparser.add_option("-v", "--verbosity",   dest="verbosity",\t\t    action="store",      default=1,     type="int",\t   help="Trace level [format: int] [default: 1]")\n+\t(options, args) = parser.parse_args()\n+\t\n+\tiFOO = FindOverlapsOptim(options.verbosity)\n+\tiFOO.setRefFileName(options.inputRefFileName, options.refFormat)\n+\tiFOO.setQueryFileName(options.inputQueryFileName, options.queryFormat)\n+\tiFOO.setOutputFileName(options.outputFileName)\n+\tiFOO.setIndex(options.index)\n+\tiFOO.setSorted(options.sorted)\n+\tiFOO.run()\n'
b
diff -r d22fadc825e3 -r 2c0c0a89fad7 SMART/Java/Python/GetDifferentialExpression.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/SMART/Java/Python/GetDifferentialExpression.py Thu May 02 09:56:47 2013 -0400
[
b'@@ -0,0 +1,441 @@\n+#! /usr/bin/env python\n+#\n+# Copyright INRA-URGI 2009-2010\n+# \n+# This software is governed by the CeCILL license under French law and\n+# abiding by the rules of distribution of free software. You can use,\n+# modify and/ or redistribute the software under the terms of the CeCILL\n+# license as circulated by CEA, CNRS and INRIA at the following URL\n+# "http://www.cecill.info".\n+# \n+# As a counterpart to the access to the source code and rights to copy,\n+# modify and redistribute granted by the license, users are provided only\n+# with a limited warranty and the software\'s author, the holder of the\n+# economic rights, and the successive licensors have only limited\n+# liability.\n+# \n+# In this respect, the user\'s attention is drawn to the risks associated\n+# with loading, using, modifying and/or developing or reproducing the\n+# software by the user in light of its specific status of free software,\n+# that may mean that it is complicated to manipulate, and that also\n+# therefore means that it is reserved for developers and experienced\n+# professionals having in-depth computer knowledge. Users are therefore\n+# encouraged to load and test the software\'s suitability as regards their\n+# requirements in conditions enabling the security of their systems and/or\n+# data to be ensured and, more generally, to use and operate it in the\n+# same conditions as regards security.\n+# \n+# The fact that you are presently reading this means that you have had\n+# knowledge of the CeCILL license and that you accept its terms.\n+#\n+"""Get the differential expression between 2 conditions (2 files), on regions defined by a third file"""\n+\n+import os, re\n+from optparse import OptionParser\n+from SMART.Java.Python.structure.TranscriptContainer import TranscriptContainer\n+from commons.core.writer.Gff3Writer import Gff3Writer\n+from SMART.Java.Python.misc.Progress import Progress\n+from SMART.Java.Python.misc.RPlotter import RPlotter\n+from SMART.Java.Python.misc import Utils\n+from SMART.Java.Python.mySql.MySqlConnection import MySqlConnection\n+from SMART.Java.Python.structure.Transcript import Transcript\n+\n+class GetDifferentialExpression(object):\n+    \n+    def __init__(self, verbosity = 1):\n+        self.verbosity              = verbosity\n+        self.mySqlConnection        = MySqlConnection(verbosity)\n+        self.inputs                 = (0, 1)\n+        self.transcriptContainers   = [None, None]\n+        self.transcriptContainerRef = None\n+        self.outputFileName         = None\n+        self.writer                 = None\n+        self.tables                 = [None, None]\n+        self.nbElements             = [0, 0]\n+\n+        self.regionsToValues = {}\n+        self.regionsToNames  = {}\n+        self.valuesToPvalues = {}\n+\n+        self.oriented                      = True\n+        self.simpleNormalization           = False\n+        self.simpleNormalizationParameters = None\n+        self.adjustedNormalization         = False\n+        self.fixedSizeFactor               = None\n+        self.normalizationSize             = None\n+        self.normalizationFactors          = [1, 1]\n+        self.fdr                           = None \n+        self.fdrPvalue                     = None \n+\n+        self.plot    = False\n+        self.plotter = None\n+        self.plotterName = None\n+        self.points  = {}\n+\n+\n+    def setInputFile(self, i, fileName, fileFormat):\n+        self.transcriptContainers[i] = TranscriptContainer(fileName, fileFormat, self.verbosity)\n+        self.transcriptContainers[i].mySqlConnection = self.mySqlConnection\n+\n+\n+    def setReferenceFile(self, fileName, fileFormat):\n+        self.transcriptContainerRef = TranscriptContainer(fileName, fileFormat, self.verbosity)\n+        self.transcriptContainerRef.mySqlConnection = self.mySqlConnection\n+\n+\n+    def setOutputFile(self, fileName):\n+        self.outputFileName = fileName\n+        self.writer         = Gff3Writer(fileName, self.verbosity)\n+\n+    \n+    def setOriented(self'..b' file in transcript format given by -f]")\n+    parser.add_option("-f", "--format1",          dest="format1",           action="store",                     type="string", help="format of file 1 [compulsory] [format: transcript file format]")\n+    parser.add_option("-j", "--input2",           dest="inputFileName2",    action="store",                     type="string", help="input file 2 [compulsory] [format: file in transcript format given by -g]")\n+    parser.add_option("-g", "--format2",          dest="format2",           action="store",                     type="string", help="format of file 2 [compulsory] [format: transcript file format]")\n+    parser.add_option("-k", "--reference",        dest="referenceFileName", action="store",                     type="string", help="reference file [compulsory] [format: file in transcript format given by -l]")\n+    parser.add_option("-l", "--referenceFormat",  dest="referenceFormat",   action="store",                     type="string", help="format of reference file [compulsory] [format: transcript file format]")\n+    parser.add_option("-o", "--output",           dest="outputFileName",    action="store",                     type="string", help="output file [format: output file in gff3 format]")\n+    parser.add_option("-n", "--notOriented",      dest="notOriented",       action="store_true", default=False,                help="if the reads are not oriented [default: False] [format: bool]")\n+    parser.add_option("-s", "--simple",           dest="simple",            action="store_true", default=False,                help="normalize using the number of reads in each condition [format: bool]")\n+    parser.add_option("-S", "--simpleParameters", dest="simpleParameters",  action="store",      default=None,  type="string", help="provide the number of reads [format: bool]")\n+    parser.add_option("-a", "--adjusted",         dest="adjusted",          action="store_true", default=False,                help="normalize using the number of reads of \'mean\' regions [format: bool]")\n+    parser.add_option("-x", "--fixedSizeFactor",  dest="fixedSizeFactor",   action="store",      default=None,  type="int",    help="give the magnification factor for the normalization using fixed size sliding windows in reference regions (leave empty for no such normalization) [format: int]")\n+    parser.add_option("-d", "--fdr",              dest="fdr",               action="store",      default=None,  type="float",  help="use FDR [format: float]")\n+    parser.add_option("-p", "--plot",             dest="plotName",          action="store",      default=None,  type="string", help="plot cloud plot [format: output file in PNG format]")\n+    parser.add_option("-v", "--verbosity",        dest="verbosity",         action="store",      default=1,     type="int",    help="trace level [format: int]")\n+    (options, args) = parser.parse_args()\n+\n+\n+        \n+    differentialExpression = GetDifferentialExpression(options.verbosity)\n+    differentialExpression.setInputFile(0, options.inputFileName1, options.format1)\n+    differentialExpression.setInputFile(1, options.inputFileName2, options.format2)\n+    differentialExpression.setReferenceFile(options.referenceFileName, options.referenceFormat)\n+    differentialExpression.setOutputFile(options.outputFileName)\n+    if options.plotName != None :\n+        differentialExpression.setPlotterName(options.plotName)\n+        differentialExpression.setPlotter()\n+    differentialExpression.setOriented(not options.notOriented)\n+    differentialExpression.setSimpleNormalization(options.simple)\n+    differentialExpression.setSimpleNormalizationParameters(options.simpleParameters)\n+    differentialExpression.setAdjustedNormalization(options.adjusted)\n+    differentialExpression.setFixedSizeNormalization(options.fixedSizeFactor)\n+    differentialExpression.setFdr(options.fdr)\n+    differentialExpression.getDifferentialExpression()\n+    differentialExpression.mySqlConnection.deleteDatabase()\n+    \n+\n'
b
diff -r d22fadc825e3 -r 2c0c0a89fad7 SMART/Java/Python/GetDistribution.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/SMART/Java/Python/GetDistribution.py Thu May 02 09:56:47 2013 -0400
[
b'@@ -0,0 +1,362 @@\n+#! /usr/bin/env python\n+#\n+# Copyright INRA-URGI 2009-2012\n+# \n+# This software is governed by the CeCILL license under French law and\n+# abiding by the rules of distribution of free software. You can use,\n+# modify and/ or redistribute the software under the terms of the CeCILL\n+# license as circulated by CEA, CNRS and INRIA at the following URL\n+# "http://www.cecill.info".\n+# \n+# As a counterpart to the access to the source code and rights to copy,\n+# modify and redistribute granted by the license, users are provided only\n+# with a limited warranty and the software\'s author, the holder of the\n+# economic rights, and the successive licensors have only limited\n+# liability.\n+# \n+# In this respect, the user\'s attention is drawn to the risks associated\n+# with loading, using, modifying and/or developing or reproducing the\n+# software by the user in light of its specific status of free software,\n+# that may mean that it is complicated to manipulate, and that also\n+# therefore means that it is reserved for developers and experienced\n+# professionals having in-depth computer knowledge. Users are therefore\n+# encouraged to load and test the software\'s suitability as regards their\n+# requirements in conditions enabling the security of their systems and/or\n+# data to be ensured and, more generally, to use and operate it in the\n+# same conditions as regards security.\n+# \n+# The fact that you are presently reading this means that you have had\n+# knowledge of the CeCILL license and that you accept its terms.\n+#\n+import os\n+from optparse import OptionParser\n+from commons.core.parsing.ParserChooser import ParserChooser\n+from commons.core.parsing.FastaParser import FastaParser\n+from SMART.Java.Python.structure.Transcript import Transcript\n+from commons.core.writer.Gff3Writer import Gff3Writer\n+from SMART.Java.Python.misc.RPlotter import RPlotter\n+from SMART.Java.Python.misc.MultipleRPlotter import MultipleRPlotter\n+from SMART.Java.Python.misc.UnlimitedProgress import UnlimitedProgress\n+from SMART.Java.Python.misc.Progress import Progress\n+\n+TWOSTRANDS = {True: [1, -1], False: [0]}\n+STRANDTOSTR = {1: "(+)", -1: "(-)", 0: ""}\n+\n+class GetDistribution(object):\n+\n+\tdef __init__(self, verbosity):\n+\t\tself.verbosity     = verbosity\n+\t\tself.sizes         = None\n+\t\tself.twoStrands    = False\n+\t\tself.start         = 1\n+\t\tself.names         = ["nbElements"]\n+\t\tself.average       = False\n+\t\tself.nbValues      = {}\n+\t\tself.height        = 300\n+\t\tself.width         = 600\n+\t\tself.colors        = None\n+\t\tself.gffFileName   = None\n+\t\tself.csvFileName   = None\n+\t\tself.yMin          = None\n+\t\tself.yMax          = None\n+\t\tself.chromosome    = None\n+\t\tself.merge         = False\n+\t\tself.nbTranscripts = None\n+\n+\tdef setInputFile(self, fileName, format):\n+\t\tchooser = ParserChooser(self.verbosity)\n+\t\tchooser.findFormat(format)\n+\t\tself.parser = chooser.getParser(fileName)\n+\n+\tdef setReferenceFile(self, fileName):\n+\t\tif fileName == None:\n+\t\t\treturn\n+\t\tfastaParser = FastaParser(fileName, self.verbosity)\n+\t\tself.chromosomes = fastaParser.getRegions()\n+\t\tself.sizes       = dict([region, fastaParser.getSizeOfRegion(region)] for region in self.chromosomes)\n+\t\tself.maxSize     = max(self.sizes.values())\n+\n+\tdef setRegion(self, chromosome, start, end):\n+\t\tif chromosome == None:\n+\t\t\treturn\n+\t\tself.maxSize     = options.end\n+\t\tself.sizes       = {chromosome: end}\n+\t\tself.chromosomes = [chromosome]\n+\t\tself.chromosome  = chromosome\n+\t\tself.start       = start\n+\t\tself.end         = end\n+\n+\tdef setOutputFile(self, fileName):\n+\t\tself.outputFileName = fileName\n+\n+\tdef setNbBins(self, nbBins):\n+\t\tself.nbBins = nbBins\n+\n+\tdef set2Strands(self, twoStrands):\n+\t\tself.twoStrands = twoStrands\n+\n+\tdef setNames(self, names):\n+\t\tself.names = names\n+\n+\tdef setAverage(self, average):\n+\t\tself.average = average\n+\n+\tdef setNormalization(self, normalization):\n+\t\tself.normalization = normalization\n+\t\n+\tdef setImageSize(self, height, width):\n+\t\tself.height = height\n+\t\tself.width '..b'        action="store",      default=1000,         type="int",    help="number of bins [default: 1000] [format: int]")\n+\tparser.add_option("-2", "--bothStrands", dest="bothStrands",       action="store_true", default=False,                       help="plot one curve per strand [format: bool] [default: false]")\n+\tparser.add_option("-c", "--chromosome",  dest="chromosome",        action="store",      default=None,         type="string", help="plot only a chromosome [format: string]")\n+\tparser.add_option("-s", "--start",       dest="start",             action="store",      default=None,         type="int",    help="start from a given region [format: int]")\n+\tparser.add_option("-e", "--end",         dest="end",               action="store",      default=None,         type="int",    help="end from a given region [format: int]")\n+\tparser.add_option("-y", "--yMin",        dest="yMin",              action="store",      default=None,         type="int",    help="minimum value on the y-axis to plot [format: int]")\n+\tparser.add_option("-Y", "--yMax",        dest="yMax",              action="store",      default=None,         type="int",    help="maximum value on the y-axis to plot [format: int]")\n+\tparser.add_option("-x", "--csv",         dest="csv",               action="store",      default=None,                        help="write a .csv file [format: output file in CSV format] [default: None]")\n+\tparser.add_option("-g", "--gff",         dest="gff",               action="store",      default=None,                        help="also write GFF3 file [format: output file in GFF format] [default: None]")\n+\tparser.add_option("-H", "--height",      dest="height",            action="store",      default=300,          type="int",    help="height of the graphics [format: int] [default: 300]")\n+\tparser.add_option("-W", "--width",       dest="width",             action="store",      default=600,          type="int",    help="width of the graphics [format: int] [default: 1000]")\n+\tparser.add_option("-a", "--average",     dest="average",           action="store_true", default=False,                       help="plot average (instead of sum) [default: false] [format: boolean]")\n+\tparser.add_option("-n", "--names",       dest="names",             action="store",      default="nbElements", type="string", help="name for the tags (separated by commas and no space) [default: None] [format: string]")\n+\tparser.add_option("-l", "--color",       dest="colors",            action="store",      default=None,         type="string", help="color of the lines (separated by commas and no space) [format: string]")\n+\tparser.add_option("-z", "--normalize",   dest="normalize",         action="store_true", default=False,                       help="normalize data (when panels are different) [format: bool] [default: false]")\n+\tparser.add_option("-m", "--merge",       dest="mergePlots",        action="store_true", default=False,                       help="merge all plots in one figure [format: bool] [default: false]")\n+\tparser.add_option("-v", "--verbosity",   dest="verbosity",         action="store",      default=1,            type="int",    help="trace level [default: 1] [format: int]")\n+\t(options, args) = parser.parse_args()\n+\n+\tgt = GetDistribution(options.verbosity)\n+\tgt.setInputFile(options.inputFileName, options.format)\n+\tgt.setOutputFile(options.outputFileName)\n+\tgt.setReferenceFile(options.referenceFileName)\n+\tgt.setNbBins(int(options.nbBins))\n+\tgt.set2Strands(options.bothStrands)\n+\tgt.setRegion(options.chromosome, options.start, options.end)\n+\tgt.setNormalization(options.normalize)\n+\tgt.setAverage(options.average)\n+\tgt.setYLimits(options.yMin, options.yMax)\n+\tgt.writeCsv(options.csv)\n+\tgt.writeGff(options.gff)\n+\tgt.setImageSize(options.height, options.width)\n+\tgt.setNames(options.names.split(","))\n+\tgt.setColors(None if options.colors == None else options.colors.split(","))\n+\tgt.setNormalization(options.normalize)\n+\tgt.mergePlots(options.mergePlots)\n+\tgt.run()\n+\n'
b
diff -r d22fadc825e3 -r 2c0c0a89fad7 SMART/Java/Python/GetFlanking.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/SMART/Java/Python/GetFlanking.py Thu May 02 09:56:47 2013 -0400
[
b'@@ -0,0 +1,233 @@\n+#! /usr/bin/env python\n+#\n+# Copyright INRA-URGI 2009-2011\n+# \n+# This software is governed by the CeCILL license under French law and\n+# abiding by the rules of distribution of free software. You can use,\n+# modify and/ or redistribute the software under the terms of the CeCILL\n+# license as circulated by CEA, CNRS and INRIA at the following URL\n+# "http://www.cecill.info".\n+# \n+# As a counterpart to the access to the source code and rights to copy,\n+# modify and redistribute granted by the license, users are provided only\n+# with a limited warranty and the software\'s author, the holder of the\n+# economic rights, and the successive licensors have only limited\n+# liability.\n+# \n+# In this respect, the user\'s attention is drawn to the risks associated\n+# with loading, using, modifying and/or developing or reproducing the\n+# software by the user in light of its specific status of free software,\n+# that may mean that it is complicated to manipulate, and that also\n+# therefore means that it is reserved for developers and experienced\n+# professionals having in-depth computer knowledge. Users are therefore\n+# encouraged to load and test the software\'s suitability as regards their\n+# requirements in conditions enabling the security of their systems and/or\n+# data to be ensured and, more generally, to use and operate it in the\n+# same conditions as regards security.\n+# \n+# The fact that you are presently reading this means that you have had\n+# knowledge of the CeCILL license and that you accept its terms.\n+#\n+from optparse import OptionParser\n+from commons.core.parsing.ParserChooser import ParserChooser\n+from commons.core.writer.TranscriptWriter import TranscriptWriter\n+from SMART.Java.Python.structure.Transcript import Transcript\n+from SMART.Java.Python.structure.Interval import Interval\n+from SMART.Java.Python.misc.Progress import Progress\n+\n+QUERY        = 0\n+REFERENCE    = 1\n+INPUTS       = (QUERY, REFERENCE)\n+STRANDS      = (-1, 1)\n+TAG_DISTANCE = "distance_"\n+TAG_SENSE    = "_sense"\n+TAG_REGION   = "_region"\n+TAGS_REGION  = {-1: "_upstream", 0: "", 1: "_downstream"}\n+TAGS_RREGION = {-1: "upstream", 0: "overlapping", 1: "downstream"}\n+TAGS_SENSE   = {-1: "antisense", 0: "", 1: "collinear"}\n+STRANDSTOSTR = {-1: "(-)", 0: "", 1: "(+)"}\n+\n+\n+def getOrderKey(transcript, direction, input):\n+\tif direction == 1:\n+\t\tif input == QUERY:\n+\t\t\treturn (transcript.getEnd(), -transcript.getStart())\n+\t\treturn (transcript.getStart(), -transcript.getEnd())\n+\tif input == QUERY:\n+\t\treturn (-transcript.getStart(), transcript.getEnd())\n+\treturn (-transcript.getEnd(), transcript.getStart())\n+\n+\n+class GetFlanking(object):\n+\n+\tdef __init__(self, verbosity):\n+\t\tself.verbosity   = verbosity\n+\t\tself.transcripts = dict([id, {}] for id in INPUTS)\n+\t\tself.directions  = []\n+\t\tself.noOverlap   = False\n+\t\tself.colinear    = False\n+\t\tself.antisense   = False\n+\t\tself.distance    = None\n+\t\tself.minDistance = None\n+\t\tself.maxDistance = None\n+\t\tself.tagName     = "flanking"\n+\n+\tdef setInputFile(self, fileName, format, id):\n+\t\tchooser = ParserChooser(self.verbosity)\n+\t\tchooser.findFormat(format)\n+\t\tparser = chooser.getParser(fileName)\n+\t\tfor transcript in parser.getIterator():\n+\t\t\tchromosome = transcript.getChromosome()\n+\t\t\tif chromosome not in self.transcripts[id]:\n+\t\t\t\tself.transcripts[id][chromosome] = []\n+\t\t\tself.transcripts[id][chromosome].append(transcript)\n+\n+\tdef setOutputFile(self, fileName):\n+\t\tself.writer = TranscriptWriter(fileName, "gff3", self.verbosity)\n+\n+\tdef addUpstreamDirection(self, upstream):\n+\t\tif upstream:\n+\t\t\tself.directions.append(-1)\n+\n+\tdef addDownstreamDirection(self, downstream):\n+\t\tif downstream:\n+\t\t\tself.directions.append(1)\n+\n+\tdef setColinear(self, colinear):\n+\t\tself.colinear = colinear\n+\n+\tdef setAntisense(self, antisense):\n+\t\tself.antisense = antisense\n+\n+\tdef setNoOverlap(self, noOverlap):\n+\t\tself.noOverlap = noOverlap\n+\n+\tdef setMinDistance(self, distance):\n+\t\tself.minDistance = distance\n+\n+\tdef setMaxDistance(se'..b'scriptRef: transcriptQuery.getDistance(transcriptRef))[0]\n+\t\t\t\tself.writer.addTranscript(self.setTags(transcriptQuery, transcriptRef, 0))\n+\t\t\tprogress.inc()\n+\t\tprogress.done()\n+\n+\tdef run(self):\n+\t\tfor chromosome in sorted(self.transcripts[QUERY].keys()):\n+\t\t\tself.flankings = dict([query, {}] for query in self.transcripts[QUERY][chromosome])\n+\t\t\tfor direction in STRANDS:\n+\t\t\t\t#print "comparison", chromosome, direction\n+\t\t\t\tself.getFlanking(chromosome, direction)\n+\t\t\tself.write()\n+\t\tself.writer.close()\n+\n+if __name__ == "__main__":\n+\t\n+\tdescription = "Get Flanking v1.0.1: Get the flanking regions of a set of reference. [Category: Data Selection]"\n+\n+\tparser = OptionParser(description = description)\n+\tparser.add_option("-i", "--input1",      dest="inputFileName1", action="store",                          type="string", help="query input file [compulsory] [format: file in transcript format given by -f]")\n+\tparser.add_option("-f", "--format1",     dest="format1",        action="store",                          type="string", help="format of previous file [compulsory] [format: transcript file format]")\n+\tparser.add_option("-j", "--input2",      dest="inputFileName2", action="store",                          type="string", help="reference input file [compulsory] [format: file in transcript format given by -g]")\n+\tparser.add_option("-g", "--format2",     dest="format2",        action="store",                          type="string", help="format of previous file [compulsory] [format: transcript file format]")\n+\tparser.add_option("-5", "--upstream",    dest="upstream",       action="store_true", default=False,                     help="output upstream elements [format: boolean] [default: False]")\n+\tparser.add_option("-3", "--downstream",  dest="downstream",     action="store_true", default=False,                     help="output downstream elements [format: boolean] [default: False]")\n+\tparser.add_option("-c", "--colinear",    dest="colinear",       action="store_true", default=False,                     help="find first colinear element [format: boolean] [default: False]")\n+\tparser.add_option("-a", "--antisense",   dest="antisense",      action="store_true", default=False,                     help="find first anti-sense element [format: boolean] [default: False]")\n+\tparser.add_option("-e", "--noOverlap",   dest="noOverlap",      action="store_true", default=False,                     help="do not consider elements which are overlapping reference elements [format: boolean] [default: False]")\n+\tparser.add_option("-d", "--minDistance", dest="minDistance",    action="store",      default=None,       type="int",    help="minimum distance between 2 elements [format: int]")\n+\tparser.add_option("-D", "--maxDistance", dest="maxDistance",    action="store",      default=None,       type="int",    help="maximum distance between 2 elements [format: int]")\n+\tparser.add_option("-t", "--tag",         dest="tagName",        action="store",      default="flanking", type="string", help="name of the new tag [format: string] [default: flanking]")\n+\tparser.add_option("-o", "--output",      dest="outputFileName", action="store",                          type="string", help="output file [format: output file in GFF3 format]")\n+\tparser.add_option("-v", "--verbosity",   dest="verbosity",      action="store",      default=1,          type="int",    help="trace level [format: int]")\n+\t(options, args) = parser.parse_args()\n+\n+\tgf = GetFlanking(options.verbosity)\n+\tgf.setInputFile(options.inputFileName1, options.format1, QUERY)\n+\tgf.setInputFile(options.inputFileName2, options.format2, REFERENCE)\n+\tgf.setOutputFile(options.outputFileName)\n+\tgf.addUpstreamDirection(options.upstream)\n+\tgf.addDownstreamDirection(options.downstream)\n+\tgf.setColinear(options.colinear)\n+\tgf.setAntisense(options.antisense)\n+\tgf.setNoOverlap(options.noOverlap)\n+\tgf.setMinDistance(options.minDistance)\n+\tgf.setMaxDistance(options.maxDistance)\n+\tgf.setNewTagName(options.tagName)\n+\tgf.run()\n'
b
diff -r d22fadc825e3 -r 2c0c0a89fad7 SMART/Java/Python/GetIntersection.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/SMART/Java/Python/GetIntersection.py Thu May 02 09:56:47 2013 -0400
[
@@ -0,0 +1,164 @@
+#! /usr/bin/env python
+#
+# Copyright INRA-URGI 2009-2011
+# 
+# This software is governed by the CeCILL license under French law and
+# abiding by the rules of distribution of free software. You can use,
+# modify and/ or redistribute the software under the terms of the CeCILL
+# license as circulated by CEA, CNRS and INRIA at the following URL
+# "http://www.cecill.info".
+# 
+# As a counterpart to the access to the source code and rights to copy,
+# modify and redistribute granted by the license, users are provided only
+# with a limited warranty and the software's author, the holder of the
+# economic rights, and the successive licensors have only limited
+# liability.
+# 
+# In this respect, the user's attention is drawn to the risks associated
+# with loading, using, modifying and/or developing or reproducing the
+# software by the user in light of its specific status of free software,
+# that may mean that it is complicated to manipulate, and that also
+# therefore means that it is reserved for developers and experienced
+# professionals having in-depth computer knowledge. Users are therefore
+# encouraged to load and test the software's suitability as regards their
+# requirements in conditions enabling the security of their systems and/or
+# data to be ensured and, more generally, to use and operate it in the
+# same conditions as regards security.
+# 
+# The fact that you are presently reading this means that you have had
+# knowledge of the CeCILL license and that you accept its terms.
+#
+from optparse import OptionParser
+from commons.core.parsing.ParserChooser import ParserChooser
+from commons.core.writer.TranscriptWriter import TranscriptWriter
+from SMART.Java.Python.structure.Interval import Interval
+from SMART.Java.Python.structure.Transcript import Transcript
+from SMART.Java.Python.structure.Mapping import Mapping
+from SMART.Java.Python.misc.Progress import Progress
+from SMART.Java.Python.misc.UnlimitedProgress import UnlimitedProgress
+
+MINBIN = 3
+MAXBIN = 7
+REFERENCE = 0
+QUERY = 1
+
+def getBin(start, end):
+ for i in range(MINBIN, MAXBIN + 1):
+ binLevel = 10 ** i
+ if int(start / binLevel) == int(end / binLevel):
+ return int(i * 10 ** (MAXBIN + 1) + int(start / binLevel))
+ return int((MAXBIN + 1) * 10 ** (MAXBIN + 1))
+
+def getOverlappingBins(start, end):
+ array = []
+ bigBin = int((MAXBIN + 1) * 10 ** (MAXBIN + 1))
+ for i in range(MINBIN, MAXBIN + 1):
+ binLevel = 10 ** i
+ array.append((int(i * 10 ** (MAXBIN + 1) + int(start / binLevel)), int(i * 10 ** (MAXBIN + 1) + int(end / binLevel))))
+ array.append((bigBin, bigBin))
+ return array
+
+
+class GetIntersection(object):
+
+ def __init__(self, verbosity):
+ self.verbosity              = verbosity
+ self.nbQueries              = 0
+ self.nbRefs                 = 0
+ self.nbWritten              = 0
+ self.bins                 = {}
+
+ def setReferenceFile(self, fileName, format):
+ chooser = ParserChooser(self.verbosity)
+ chooser.findFormat(format)
+ self.refParser = chooser.getParser(fileName)
+
+ def setQueryFile(self, fileName, format):
+ chooser = ParserChooser(self.verbosity)
+ chooser.findFormat(format)
+ self.queryParser = chooser.getParser(fileName)
+
+ def setOutputFile(self, fileName):
+ self.writer = TranscriptWriter(fileName, "gff3", self.verbosity)
+
+ def loadRef(self):
+ progress = UnlimitedProgress(10000, "Reading references", self.verbosity)
+ for transcript in self.refParser.getIterator():
+ if transcript.__class__.__name__ == "Mapping":
+ transcript = transcript.getTranscript()
+ chromosome = transcript.getChromosome()
+ bin    = getBin(transcript.getStart(), transcript.getEnd())
+ if chromosome not in self.bins:
+ self.bins[chromosome] = {}
+ if bin not in self.bins[chromosome]:
+ self.bins[chromosome][bin] = []
+ self.bins[chromosome][bin].append(transcript)
+ self.nbRefs += 1
+ progress.inc()
+ progress.done()
+
+ def _compareTranscript(self, queryTranscript):
+ queryChromosome = queryTranscript.getChromosome()
+ if queryChromosome not in self.bins:
+ return None
+ queryStart = queryTranscript.getStart()
+ queryEnd   = queryTranscript.getEnd()
+ bins    = getOverlappingBins(queryStart, queryEnd)
+ overlaps   = []
+ for binRange in bins:
+ for bin in range(binRange[0], binRange[1]+1):
+ if bin not in self.bins[queryChromosome]:
+ continue
+ for refTranscript in self.bins[queryChromosome][bin]:
+ newTranscript = queryTranscript.getIntersection(refTranscript)
+ if newTranscript != None:
+ overlaps.append(newTranscript)
+ if not overlaps:
+ return None
+ newTranscript = overlaps[0]
+ for transcript in overlaps[1:]:
+ newTranscript.merge(transcript)
+ return newTranscript
+
+ def compare(self):
+ progress = UnlimitedProgress(10000, "Comparing queries", self.verbosity)
+ for queryTranscript in self.queryParser.getIterator():
+ if queryTranscript.__class__.__name__ == "Mapping":
+ queryTranscript = queryTranscript.getTranscript()
+ progress.inc()
+ self.nbQueries += 1
+ newTranscript = self._compareTranscript(queryTranscript)
+ if newTranscript != None:
+ self.writer.addTranscript(queryTranscript)
+ self.nbWritten += 1
+ progress.done()
+ self.writer.close()
+
+ def displayResults(self):
+ print "# queries:  %d" % (self.nbQueries)
+ print "# refs:     %d" % (self.nbRefs)
+ print "# written:  %d" % (self.nbWritten)
+
+ def run(self):
+ self.loadRef()
+ self.compare()
+ self.displayResults()
+
+if __name__ == "__main__":
+
+ description = "Get Intersection v1.0.0: Shrink the first data set so that all bases covered by the first data set is also covered by the second data set. [Category: Data Comparison]"
+
+ parser = OptionParser(description = description)
+ parser.add_option("-i", "--input1",         dest="inputFileName1", action="store",            type="string", help="query input file [compulsory] [format: file in transcript format given by -f]")
+ parser.add_option("-f", "--format1",        dest="format1",   action="store",            type="string", help="format of previous file [compulsory] [format: transcript file format]")
+ parser.add_option("-j", "--input2",         dest="inputFileName2", action="store",            type="string", help="reference input file [compulsory] [format: file in transcript format given by -g]")
+ parser.add_option("-g", "--format2",        dest="format2",   action="store",            type="string", help="format of previous file [compulsory] [format: transcript file format]")
+ parser.add_option("-o", "--output",         dest="outputFileName", action="store",            type="string", help="output file [format: output file in GFF3 format]")
+ parser.add_option("-v", "--verbosity",      dest="verbosity",    action="store",      default=1,     type="int",  help="trace level [format: int]")
+ (options, args) = parser.parse_args()
+
+ gi = GetIntersection(options.verbosity)
+ gi.setQueryFile(options.inputFileName1, options.format1)
+ gi.setReferenceFile(options.inputFileName2, options.format2)
+ gi.setOutputFile(options.outputFileName)
+ gi.run()
b
diff -r d22fadc825e3 -r 2c0c0a89fad7 SMART/Java/Python/GetRandomSubset.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/SMART/Java/Python/GetRandomSubset.py Thu May 02 09:56:47 2013 -0400
[
@@ -0,0 +1,96 @@
+#! /usr/bin/env python
+#
+# Copyright INRA-URGI 2009-2011
+# 
+# This software is governed by the CeCILL license under French law and
+# abiding by the rules of distribution of free software. You can use,
+# modify and/ or redistribute the software under the terms of the CeCILL
+# license as circulated by CEA, CNRS and INRIA at the following URL
+# "http://www.cecill.info".
+# 
+# As a counterpart to the access to the source code and rights to copy,
+# modify and redistribute granted by the license, users are provided only
+# with a limited warranty and the software's author, the holder of the
+# economic rights, and the successive licensors have only limited
+# liability.
+# 
+# In this respect, the user's attention is drawn to the risks associated
+# with loading, using, modifying and/or developing or reproducing the
+# software by the user in light of its specific status of free software,
+# that may mean that it is complicated to manipulate, and that also
+# therefore means that it is reserved for developers and experienced
+# professionals having in-depth computer knowledge. Users are therefore
+# encouraged to load and test the software's suitability as regards their
+# requirements in conditions enabling the security of their systems and/or
+# data to be ensured and, more generally, to use and operate it in the
+# same conditions as regards security.
+# 
+# The fact that you are presently reading this means that you have had
+# knowledge of the CeCILL license and that you accept its terms.
+#
+import random
+from optparse import OptionParser
+from commons.core.parsing.ParserChooser import ParserChooser
+from commons.core.writer.TranscriptWriter import TranscriptWriter
+from SMART.Java.Python.structure.Transcript import Transcript
+from SMART.Java.Python.misc.Progress import Progress
+
+class GetRandomSubset(object):
+
+    def __init__(self, verbosity):
+        self.verbosity = verbosity
+
+    def setInputFile(self, fileName, format):
+        chooser = ParserChooser(self.verbosity)
+        chooser.findFormat(format)
+        self.parser = chooser.getParser(fileName)
+
+    def setNumber(self, number, percent):
+        if number != None:
+            self.number = number
+        elif percent != None:
+            self.number = int(float(percent) / 100 * self.parser.getNbTranscripts())
+        else:
+            raise Exception("Error! Number of elements to output is not given!")
+
+    def setOutputFile(self, fileName):
+        self.writer = TranscriptWriter(fileName, "gff3", self.verbosity)
+
+    def chooseElements(self):
+        self.randomIndices = random.sample(range(self.parser.getNbTranscripts()), self.number)
+        
+    def run(self):
+        self.chooseElements()
+        progress  = Progress(self.parser.getNbTranscripts(), "Reading input file", self.verbosity)
+        nbWritten = 0
+        for cpt1, transcript in enumerate(self.parser.getIterator()):
+            if cpt1 in self.randomIndices:
+                self.writer.addTranscript(transcript)
+                nbWritten += 1
+            progress.inc()
+        self.writer.write()
+        self.writer.close()
+        progress.done()
+        if self.verbosity > 1:
+            print "%d transcripts read" % (self.parser.getNbTranscripts())
+            print "%d transcripts written" % (nbWritten)
+
+
+if __name__ == "__main__":
+    
+    description = "Get Random Subset v1.0.1: Get a random sub-set of a list of genomic coordinates. [Category: Personal]"
+
+    parser = OptionParser(description = description)
+    parser.add_option("-i", "--input",     dest="inputFileName",  action="store",               type="string", help="input file [compulsory] [format: file in transcript format given by -f]")
+    parser.add_option("-f", "--format",    dest="format",         action="store",               type="string", help="format of file [compulsory] [format: transcript file format]")
+    parser.add_option("-n", "--number",    dest="number",         action="store", default=None, type="string", help="number of elements to output [format: int]")
+    parser.add_option("-p", "--percent",   dest="percent",        action="store", default=None, type="string", help="percentage of elements to output (between 0 and 100) [format: int]")
+    parser.add_option("-o", "--output",    dest="outputFileName", action="store",               type="string", help="output file [format: output file in GFF3 format]")
+    parser.add_option("-v", "--verbosity", dest="verbosity",      action="store", default=1,    type="int", help="trace level [format: int]")
+    (options, args) = parser.parse_args()
+
+    grs = GetRandomSubset(options.verbosity)
+    grs.setInputFile(options.inputFileName, options.format)
+    grs.setNumber(options.number, options.percent)
+    grs.setOutputFile(options.outputFileName)
+    grs.run()
b
diff -r d22fadc825e3 -r 2c0c0a89fad7 SMART/Java/Python/GetReadDistribution.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/SMART/Java/Python/GetReadDistribution.py Thu May 02 09:56:47 2013 -0400
[
b'@@ -0,0 +1,303 @@\n+#! /usr/bin/env python\n+#\n+# Copyright INRA-URGI 2009-2010\n+# \n+# This software is governed by the CeCILL license under French law and\n+# abiding by the rules of distribution of free software. You can use,\n+# modify and/ or redistribute the software under the terms of the CeCILL\n+# license as circulated by CEA, CNRS and INRIA at the following URL\n+# "http://www.cecill.info".\n+# \n+# As a counterpart to the access to the source code and rights to copy,\n+# modify and redistribute granted by the license, users are provided only\n+# with a limited warranty and the software\'s author, the holder of the\n+# economic rights, and the successive licensors have only limited\n+# liability.\n+# \n+# In this respect, the user\'s attention is drawn to the risks associated\n+# with loading, using, modifying and/or developing or reproducing the\n+# software by the user in light of its specific status of free software,\n+# that may mean that it is complicated to manipulate, and that also\n+# therefore means that it is reserved for developers and experienced\n+# professionals having in-depth computer knowledge. Users are therefore\n+# encouraged to load and test the software\'s suitability as regards their\n+# requirements in conditions enabling the security of their systems and/or\n+# data to be ensured and, more generally, to use and operate it in the\n+# same conditions as regards security.\n+# \n+# The fact that you are presently reading this means that you have had\n+# knowledge of the CeCILL license and that you accept its terms.\n+#\n+import random, os, glob, subprocess\n+from commons.core.parsing.ParserChooser import ParserChooser\n+from commons.core.parsing.GffParser import GffParser\n+from SMART.Java.Python.misc.UnlimitedProgress import UnlimitedProgress\n+from SMART.Java.Python.misc.Progress import Progress\n+from SMART.Java.Python.misc import Utils\n+from commons.core.LoggerFactory import LoggerFactory\n+from commons.core.utils.RepetOptionParser import RepetOptionParser\n+\n+LOG_DEPTH      = "smart"\n+DEFAULT_REGION = "_all_"\n+MULTIPLE_STR   = {1: "", 1000: " (in kbp)", 1000000: " (in Gbp)"}\n+\n+class GetReadDistribution(object):\n+\n+\tdef __init__(self, verbosity = 0):\n+\t\tself.xLab         = ""\n+\t\tself.yLab         = "# reads"\n+\t\tself.verbosity    = verbosity\n+\t\tself.number       = random.randint(0, 100000)\n+\t\tself.log          = LoggerFactory.createLogger("%s.%s" % (LOG_DEPTH, self.__class__.__name__), self.verbosity)\n+\t\tself.parsers      = {}\n+\t\tself.distribution = {}\n+\t\tself.factors      = {}\n+\t\tself.regions      = None\n+\t\tself.tmpDatName   = None\n+\t\tself.tmpRName     = None\n+\t\tself.quorum       = 1\n+\t\tself.strands      = False\n+\t\tself.width        = 800\n+\t\tself.height       = 300\n+\t\tself.arial        = False\n+\n+\tdef setNames(self, names):\n+\t\tself.names = names\n+\n+\tdef setInputFiles(self, fileNames, format):\n+\t\tchooser = ParserChooser(self.verbosity)\n+\t\tchooser.findFormat(format)\n+\t\tfor cpt, fileName in enumerate(fileNames):\n+\t\t\tself.parsers[self.names[cpt]] = chooser.getParser(fileName)\n+\n+\tdef setOutputFileName(self, fileName):\n+\t\tself.outputFileName = fileName\n+\n+\tdef setLabs(self, xLab, yLab):\n+\t\tself.xLab = xLab\n+\t\tself.yLab = yLab\n+\n+\tdef setBinSize(self, binSize):\n+\t\tself.binSize = binSize\n+\n+\tdef setColors(self, colors):\n+\t\tself.colors = colors\n+\n+\tdef setFactors(self, factors):\n+\t\tif factors == None:\n+\t\t\tself.factors = dict([name, 1.0] for name in self.names)\n+\t\telse:\n+\t\t\tself.factors = dict(zip(self.names, factors))\n+\n+\tdef setMultiple(self, boolean):\n+\t\tself.multiple = boolean\n+\t\n+\tdef setImageSize(self, width, height):\n+\t\tif width != None:\n+\t\t\tself.width = width\n+\t\tif height != None:\n+\t\t\tself.height = height\n+\n+\tdef setQuorum(self, quorum):\n+\t\tself.quorum = quorum\n+\n+\tdef setRegionsFile(self, fileName):\n+\t\tif fileName != None:\n+\t\t\tself._loadRegions(fileName)\n+\n+\tdef setBothStrands(self, strands):\n+\t\tself.strands = strands\n+\n+\tdef setArial(self, arial):\n+\t\tself.arial = arial\n+\n+\tdef _checkOptions(self):\n+\t\tif not self.parsers:\n+\t\t\tse'..b' separated by commas [compulsory] [format: string]")\n+\tparser.add_option("-f", "--format",    dest="format",          action="store",      default=None,      type="string", help="format of the input [compulsory] [format: transcript or sequence file format]")\n+\tparser.add_option("-n", "--names",     dest="names",           action="store",      default=None,      type="string", help="name of the input data, separated by commas [compulsory] [format: string]")\n+\tparser.add_option("-o", "--output",    dest="outputFileName",  action="store",      default=None,      type="string", help="output file [format: output file in PNG format]")\n+\tparser.add_option("-s", "--binSize",   dest="binSize",         action="store",      default=10000,     type="int",    help="bin size [format: int] [default: 10000]")\n+\tparser.add_option("-l", "--xLabel",    dest="xLab",            action="store",      default="",        type="string", help="x-axis label name [format: string]")\n+\tparser.add_option("-L", "--yLabel",    dest="yLab",            action="store",      default="# reads", type="string", help="y-axis label name [format: string] [default: Reads]")\n+\tparser.add_option("-c", "--colors",    dest="colors",          action="store",      default=None,      type="string", help="colors of the bars, separated by commas  [format: string]")\n+\tparser.add_option("-a", "--factors",   dest="factors",         action="store",      default=None,      type="string", help="normalization factors, separated by commas  [format: string]")\n+\tparser.add_option("-r", "--regions",   dest="regionsFileName", action="store",      default=None,      type="string", help="regions to plot [format: transcript file in GFF format]")\n+\tparser.add_option("-2", "--strands",   dest="strands",         action="store_true", default=False,                    help="plot negative strands on the negative x-axis [format: boolean] [default: False]")\n+\tparser.add_option("-m", "--multiple",  dest="multiple",        action="store_true", default=False,                    help="use human readable genomic positions (k, G) [format: boolean] [default: False]")\n+\tparser.add_option("-q", "--quorum",    dest="quorum",          action="store",      default=1,         type="int",    help="minimum number of intervals to plot a region [format: int] [default: 1]")\n+\tparser.add_option("-z", "--width",     dest="width",           action="store",      default=800,       type="int",    help="width of the image [format: int] [default: 800]")\n+\tparser.add_option("-Z", "--height",    dest="height",          action="store",      default=300,       type="int",    help="height of the image [format: int] [default: 300]")\n+\tparser.add_option("-A", "--arial",     dest="arial",           action="store_true", default=False,                    help="use Arial font [format: boolean] [default: false]")\n+\tparser.add_option("-v", "--verbosity", dest="verbosity",       action="store",      default=1,         type="int",    help="trace level [format: int]")\n+\toptions = parser.parse_args()[0]\n+\tiGetReadDistribution = GetReadDistribution(options.verbosity)\n+\tiGetReadDistribution.setNames(options.names.split(","))\n+\tiGetReadDistribution.setInputFiles(options.inputFileNames.split(","), options.format)\n+\tiGetReadDistribution.setOutputFileName(options.outputFileName)\n+\tiGetReadDistribution.setLabs(options.xLab, options.yLab)\n+\tiGetReadDistribution.setBinSize(options.binSize)\n+\tiGetReadDistribution.setColors(None if options.colors == None else options.colors.split(","))\n+\tiGetReadDistribution.setFactors(None if options.factors == None else map(float, options.factors.split(",")))\n+\tiGetReadDistribution.setRegionsFile(options.regionsFileName)\n+\tiGetReadDistribution.setMultiple(options.multiple)\n+\tiGetReadDistribution.setQuorum(options.quorum)\n+\tiGetReadDistribution.setImageSize(options.width, options.height)\n+\tiGetReadDistribution.setBothStrands(options.strands)\n+\tiGetReadDistribution.setArial(options.arial)\n+\tiGetReadDistribution.run()\n+\n'
b
diff -r d22fadc825e3 -r 2c0c0a89fad7 SMART/Java/Python/GetReadSizes.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/SMART/Java/Python/GetReadSizes.py Thu May 02 09:56:47 2013 -0400
[
b'@@ -0,0 +1,262 @@\n+#! /usr/bin/env python\n+#\n+# Copyright INRA-URGI 2009-2010\n+# \n+# This software is governed by the CeCILL license under French law and\n+# abiding by the rules of distribution of free software. You can use,\n+# modify and/ or redistribute the software under the terms of the CeCILL\n+# license as circulated by CEA, CNRS and INRIA at the following URL\n+# "http://www.cecill.info".\n+# \n+# As a counterpart to the access to the source code and rights to copy,\n+# modify and redistribute granted by the license, users are provided only\n+# with a limited warranty and the software\'s author, the holder of the\n+# economic rights, and the successive licensors have only limited\n+# liability.\n+# \n+# In this respect, the user\'s attention is drawn to the risks associated\n+# with loading, using, modifying and/or developing or reproducing the\n+# software by the user in light of its specific status of free software,\n+# that may mean that it is complicated to manipulate, and that also\n+# therefore means that it is reserved for developers and experienced\n+# professionals having in-depth computer knowledge. Users are therefore\n+# encouraged to load and test the software\'s suitability as regards their\n+# requirements in conditions enabling the security of their systems and/or\n+# data to be ensured and, more generally, to use and operate it in the\n+# same conditions as regards security.\n+# \n+# The fact that you are presently reading this means that you have had\n+# knowledge of the CeCILL license and that you accept its terms.\n+#\n+import random, os, glob, subprocess\n+from commons.core.parsing.ParserChooser import ParserChooser\n+from commons.core.parsing.GffParser import GffParser\n+from SMART.Java.Python.misc.UnlimitedProgress import UnlimitedProgress\n+from SMART.Java.Python.misc.Progress import Progress\n+from SMART.Java.Python.misc import Utils\n+from commons.core.LoggerFactory import LoggerFactory\n+from commons.core.utils.RepetOptionParser import RepetOptionParser\n+\n+LOG_DEPTH      = "smart"\n+DEFAULT_REGION = "_all_"\n+\n+class GetReadSizes(object):\n+\n+\tdef __init__(self, verbosity = 0):\n+\t\tself.xLab       = "Size"\n+\t\tself.yLab       = "# reads"\n+\t\tself.verbosity  = verbosity\n+\t\tself.number     = random.randint(0, 100000)\n+\t\tself.log        = LoggerFactory.createLogger("%s.%s" % (LOG_DEPTH, self.__class__.__name__), self.verbosity)\n+\t\tself.parsers    = {}\n+\t\tself.sizes      = {}\n+\t\tself.factors    = {}\n+\t\tself.regions    = None\n+\t\tself.tmpDatName = None\n+\t\tself.tmpRName   = None\n+\t\tself.width      = 800\n+\t\tself.height     = 300\n+\t\tself.arial      = False\n+\n+\tdef setNames(self, names):\n+\t\tself.names = names\n+\n+\tdef setInputFiles(self, fileNames, format):\n+\t\tchooser = ParserChooser(self.verbosity)\n+\t\tchooser.findFormat(format)\n+\t\tfor cpt, fileName in enumerate(fileNames):\n+\t\t\tself.parsers[self.names[cpt]] = chooser.getParser(fileName)\n+\n+\tdef setOutputFileName(self, fileName):\n+\t\tself.outputFileName = fileName\n+\n+\tdef setLabs(self, xLab, yLab):\n+\t\tself.xLab = xLab\n+\t\tself.yLab = yLab\n+\n+\tdef setSizes(self, minSize, maxSize):\n+\t\tself.minSize = minSize\n+\t\tself.maxSize = maxSize\n+\n+\tdef setColors(self, colors):\n+\t\tself.colors = colors\n+\n+\tdef setFactors(self, factors):\n+\t\tself.factors = dict(zip(self.names, factors))\n+\n+\tdef setRegionsFile(self, fileName):\n+\t\tif fileName != None:\n+\t\t\tself._loadRegions(fileName)\n+\n+\tdef setImageSize(self, width, height):\n+\t\tif width != None:\n+\t\t\tself.width = width\n+\t\tif height != None:\n+\t\t\tself.height = height\n+\n+\tdef setArial(self, arial):\n+\t\tself.arial = arial\n+\n+\tdef _checkOptions(self):\n+\t\tif not self.parsers:\n+\t\t\tself.logAndRaise("ERROR: Missing input file names")\n+\n+\tdef _logAndRaise(self, errorMsg):\n+\t\tself.log.error(errorMsg)\n+\t\traise Exception(errorMsg)\n+\n+\tdef _loadRegions(self, fileName):\n+\t\tself.regions = {}\n+\t\tparser       = GffParser(fileName, self.verbosity)\n+\t\tfor transcript in parser.getIterator():\n+\t\t\tchromosome = transcript.getChromosome()\n+\t\t\tstart      = transcript.getStart()\n+\t\t\tend       '..b'fileName)):\n+\t\t\t\t\tos.remove(otherFileName)\n+\n+\tdef run(self):\n+\t\tLoggerFactory.setLevel(self.log, self.verbosity)\n+\t\tself._checkOptions()\n+\t\tself.log.info("START Get Read Sizes")\n+\t\tfor name in self.names:\n+\t\t\tself._parse(name)\n+\t\tself._plot()\n+\t\tself._cleanFiles()\n+\t\tself.log.info("END Get Read Sizes")\n+\n+\n+if __name__ == "__main__":\n+\tdescription = "Usage: GetReadSizes.py [options]\\n\\nGet Read Sizes v1.0.1: Get the sizes of a set of reads. [Category: Personal]\\n"\n+\tepilog = ""\n+\tparser = RepetOptionParser(description = description, epilog = epilog)\n+\tparser.add_option("-i", "--input",     dest="inputFileNames",  action="store",      default=None,     type="string", help="input files, separated by commas [compulsory] [format: string]")\n+\tparser.add_option("-f", "--format",    dest="format",          action="store",      default=None,     type="string", help="format of the input [compulsory] [format: transcript or sequence file format]")\n+\tparser.add_option("-n", "--names",     dest="names",           action="store",      default=None,     type="string", help="name of the input data, separated by commas [compulsory] [format: string]")\n+\tparser.add_option("-o", "--output",    dest="outputFileName",  action="store",      default=None,      type="string", help="output file [format: output file in PNG format]")\n+\tparser.add_option("-s", "--minSize",   dest="minSize",         action="store",      default=None,      type="int",    help="minimum size [format: int]")\n+\tparser.add_option("-S", "--maxSize",   dest="maxSize",         action="store",      default=None,      type="int",    help="maximum size [format: int]")\n+\tparser.add_option("-l", "--xLabel",    dest="xLab",            action="store",      default="Size",    type="string", help="x-axis label name [format: string] [default: Size]")\n+\tparser.add_option("-L", "--yLabel",    dest="yLab",            action="store",      default="# reads", type="string", help="y-axis label name [format: string] [default: Reads]")\n+\tparser.add_option("-c", "--colors",    dest="colors",          action="store",      default=None,      type="string", help="colors of the bars, separated by commas  [format: string]")\n+\tparser.add_option("-a", "--factors",   dest="factors",         action="store",      default=None,      type="string", help="normalization factors, separated by commas  [format: string]")\n+\tparser.add_option("-r", "--regions",   dest="regionsFileName", action="store",      default=None,      type="string", help="regions to plot [format: transcript file in GFF format]")\n+\tparser.add_option("-z", "--width",     dest="width",           action="store",      default=800,       type="int",    help="width of the image [format: int] [default: 800]")\n+\tparser.add_option("-Z", "--height",    dest="height",          action="store",      default=300,       type="int",    help="height of the image [format: int] [default: 300]")\n+\tparser.add_option("-A", "--arial",     dest="arial",           action="store_true", default=False,                    help="use Arial font [format: boolean] [default: false]")\n+\tparser.add_option("-v", "--verbosity", dest="verbosity",       action="store",      default=1,         type="int",    help="trace level [format: int]")\n+\toptions = parser.parse_args()[0]\n+\tiGetReadSizes = GetReadSizes(options.verbosity)\n+\tiGetReadSizes.setNames(options.names.split(","))\n+\tiGetReadSizes.setInputFiles(options.inputFileNames.split(","), options.format)\n+\tiGetReadSizes.setOutputFileName(options.outputFileName)\n+\tiGetReadSizes.setLabs(options.xLab, options.yLab)\n+\tiGetReadSizes.setSizes(options.minSize, options.maxSize)\n+\tiGetReadSizes.setColors(None if options.colors == None else options.colors.split(","))\n+\tiGetReadSizes.setFactors(None if options.factors == None else map(float, options.factors.split(",")))\n+\tiGetReadSizes.setRegionsFile(options.regionsFileName)\n+\tiGetReadSizes.setImageSize(options.width, options.height)\n+\tiGetReadSizes.setArial(options.arial)\n+\tiGetReadSizes.run()\n'
b
diff -r d22fadc825e3 -r 2c0c0a89fad7 SMART/Java/Python/GetUpDownStream.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/SMART/Java/Python/GetUpDownStream.py Thu May 02 09:56:47 2013 -0400
[
@@ -0,0 +1,152 @@
+#! /usr/bin/env python
+#
+# Copyright INRA-URGI 2009-2012
+# 
+# This software is governed by the CeCILL license under French law and
+# abiding by the rules of distribution of free software. You can use,
+# modify and/ or redistribute the software under the terms of the CeCILL
+# license as circulated by CEA, CNRS and INRIA at the following URL
+# "http://www.cecill.info".
+# 
+# As a counterpart to the access to the source code and rights to copy,
+# modify and redistribute granted by the license, users are provided only
+# with a limited warranty and the software's author, the holder of the
+# economic rights, and the successive licensors have only limited
+# liability.
+# 
+# In this respect, the user's attention is drawn to the risks associated
+# with loading, using, modifying and/or developing or reproducing the
+# software by the user in light of its specific status of free software,
+# that may mean that it is complicated to manipulate, and that also
+# therefore means that it is reserved for developers and experienced
+# professionals having in-depth computer knowledge. Users are therefore
+# encouraged to load and test the software's suitability as regards their
+# requirements in conditions enabling the security of their systems and/or
+# data to be ensured and, more generally, to use and operate it in the
+# same conditions as regards security.
+# 
+# The fact that you are presently reading this means that you have had
+# knowledge of the CeCILL license and that you accept its terms.
+#
+import os
+from optparse import OptionParser, OptionGroup
+from commons.core.parsing.ParserChooser import ParserChooser
+from commons.core.writer.Gff3Writer import Gff3Writer
+from SMART.Java.Python.structure.Transcript import Transcript
+from SMART.Java.Python.ncList.NCListFilePickle import NCListFileUnpickle
+from SMART.Java.Python.ncList.FileSorter import FileSorter
+from SMART.Java.Python.misc.Progress import Progress
+from SMART.Java.Python.misc import Utils
+
+
+class GetUpDownStream(object):
+
+    def __init__(self, verbosity = 0):
+        self.verbosity         = verbosity
+        self.inputReader       = None
+        self.outputWriter      = None
+        self.nbRead            = 0
+        self.nbWritten         = 0
+        self.nbMerges          = 0
+        self.splittedFileNames = {}
+
+    def __del__(self):
+        for fileName in self.splittedFileNames.values():
+            os.remove(fileName)
+            
+    def setInputFile(self, fileName, format):
+        parserChooser = ParserChooser(self.verbosity)
+        parserChooser.findFormat(format, "transcript")
+        self.parser = parserChooser.getParser(fileName)
+        self.sortedFileName = "%s_sorted.pkl" % (os.path.splitext(fileName)[0])
+
+    def setOutputFile(self, fileName):
+        self.outputWriter = Gff3Writer(fileName, self.verbosity)
+
+    def setDistances(self, up, down):
+        self.upDistance   = up
+        self.downDistance = down
+
+    def _sortFile(self):
+        fs = FileSorter(self.parser, self.verbosity-4)
+        fs.perChromosome(True)
+        fs.setOutputFileName(self.sortedFileName)
+        fs.sort()
+        self.splittedFileNames       = fs.getOutputFileNames()
+        self.nbElementsPerChromosome = fs.getNbElementsPerChromosome()
+        self.nbRead                  = fs.getNbElements()
+
+    def _write(self, start, end, reference, after):
+        if start > end:
+            return
+        transcript = Transcript()
+        transcript.setChromosome(reference.getChromosome())
+        transcript.setStart(start)
+        transcript.setEnd(end)
+        transcript.setDirection("+")
+        transcript.setName("%s_%s" % ("up" if Utils.xor(reference.getDirection() == 1, after) else "down", reference.getName()))
+        self.outputWriter.addTranscript(transcript)
+        
+    def _getFlanking(self, chromosome):
+        progress    = Progress(self.nbElementsPerChromosome[chromosome], "Analyzing chromosome %s" % (chromosome), self.verbosity)
+        parser      = NCListFileUnpickle(self.splittedFileNames[chromosome], self.verbosity)
+        previous    = None
+        for transcript in parser.getIterator():
+            progress.inc()
+            transcript.removeExons()
+            if previous == None:
+                distance = self.upDistance if transcript.getDirection() == 1 else self.downDistance
+                start    = max(1, transcript.getStart() - distance)
+                self._write(start, transcript.getStart()-1, transcript, False)
+                previous = transcript
+                continue
+            if previous.include(transcript):
+                continue
+            if transcript.overlapWith(previous):
+                previous = transcript
+                continue
+            distancePrevious = self.downDistance if previous.getDirection()   == 1 else self.upDistance
+            distanceCurrent  = self.upDistance   if transcript.getDirection() == 1 else self.downDistance
+            distance = transcript.getDistance(previous)
+            if distancePrevious + distanceCurrent == 0:
+                previous = transcript
+                continue
+            if distance >= distancePrevious + distanceCurrent:
+                endPrevious  = previous.getEnd() + distancePrevious
+                startCurrent = transcript.getStart() - distanceCurrent
+            else:
+                middle       = previous.getEnd() + int((distance-1) * float(distancePrevious) / (distancePrevious + distanceCurrent))
+                endPrevious  = middle
+                startCurrent = middle+1
+            self._write(previous.getEnd() + 1, endPrevious, previous, True)
+            self._write(startCurrent, transcript.getStart() - 1, transcript, False)
+            previous = transcript
+        distance = self.downDistance if previous.getDirection() == 1 else self.upDistance
+        self._write(previous.getEnd() + 1, previous.getEnd() + distance, previous, True)
+        progress.done()
+
+    def run(self):
+        self._sortFile()
+        for chromosome in sorted(self.nbElementsPerChromosome.keys()):
+            self._getFlanking(chromosome)
+        self.outputWriter.close()
+
+if __name__ == "__main__":
+    
+    # parse command line
+    description = "Get Up and Down Stream v1.0.0: Get the flanking regions of an annotation. [Category: Data Modification]"
+
+    parser = OptionParser(description = description)
+    parser.add_option("-i", "--input",     dest="inputFileName",  action="store",                     type="string", help="input file [compulsory] [format: file in mapping format given by -f]")
+    parser.add_option("-f", "--format",    dest="format",         action="store",                     type="string", help="format of the file [compulsory] [format: mapping file format]")
+    parser.add_option("-o", "--output",    dest="outputFileName", action="store",                     type="string", help="output file [compulsory] [format: output file in GFF3 format]")
+    parser.add_option("-u", "--up",        dest="up",             action="store",      default=0,     type="int",    help="the upstream distance  [format: int]")
+    parser.add_option("-d", "--down",      dest="down",           action="store",      default=0,     type="int",    help="the downstream distance  [format: int]")
+    parser.add_option("-v", "--verbosity", dest="verbosity",      action="store",      default=1,     type="int",    help="trace level [default: 1] [format: int]")
+    (options, args) = parser.parse_args()
+
+    guds = GetUpDownStream(options.verbosity)
+    guds.setInputFile(options.inputFileName, options.format)
+    guds.setOutputFile(options.outputFileName)
+    guds.setDistances(options.up, options.down)
+    guds.run()
b
diff -r d22fadc825e3 -r 2c0c0a89fad7 SMART/Java/Python/RestrictFromCoverage.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/SMART/Java/Python/RestrictFromCoverage.py Thu May 02 09:56:47 2013 -0400
[
b'@@ -0,0 +1,224 @@\n+#! /usr/bin/env python\n+#\n+# Copyright INRA-URGI 2009-2012\n+# \n+# This software is governed by the CeCILL license under French law and\n+# abiding by the rules of distribution of free software. You can use,\n+# modify and/ or redistribute the software under the terms of the CeCILL\n+# license as circulated by CEA, CNRS and INRIA at the following URL\n+# "http://www.cecill.info".\n+# \n+# As a counterpart to the access to the source code and rights to copy,\n+# modify and redistribute granted by the license, users are provided only\n+# with a limited warranty and the software\'s author, the holder of the\n+# economic rights, and the successive licensors have only limited\n+# liability.\n+# \n+# In this respect, the user\'s attention is drawn to the risks associated\n+# with loading, using, modifying and/or developing or reproducing the\n+# software by the user in light of its specific status of free software,\n+# that may mean that it is complicated to manipulate, and that also\n+# therefore means that it is reserved for developers and experienced\n+# professionals having in-depth computer knowledge. Users are therefore\n+# encouraged to load and test the software\'s suitability as regards their\n+# requirements in conditions enabling the security of their systems and/or\n+# data to be ensured and, more generally, to use and operate it in the\n+# same conditions as regards security.\n+# \n+# The fact that you are presently reading this means that you have had\n+# knowledge of the CeCILL license and that you accept its terms.\n+#\n+import os, struct, time, random\n+from optparse import OptionParser\n+from commons.core.parsing.ParserChooser import ParserChooser\n+from commons.core.writer.Gff3Writer import Gff3Writer\n+from SMART.Java.Python.structure.Transcript import Transcript\n+from SMART.Java.Python.structure.Interval import Interval\n+from SMART.Java.Python.ncList.NCList import NCList\n+from SMART.Java.Python.ncList.NCListCursor import NCListCursor\n+from SMART.Java.Python.ncList.NCListFilePickle import NCListFilePickle, NCListFileUnpickle\n+from SMART.Java.Python.ncList.FileSorter import FileSorter\n+from SMART.Java.Python.misc.Progress import Progress\n+from SMART.Java.Python.misc.UnlimitedProgress import UnlimitedProgress\n+from SMART.Java.Python.misc import Utils\n+try:\n+    import cPickle as pickle\n+except:\n+    import pickle\n+\n+REFERENCE = 0\n+QUERY = 1\n+TYPES = (REFERENCE, QUERY)\n+TYPETOSTRING = {0: "reference", 1: "query"}\n+\n+class RestrictFromCoverage(object):\n+\n+    def __init__(self, verbosity = 1):\n+        self._verbosity               = verbosity\n+        self._randomNumber            = random.randint(0, 100000)\n+        self._nbWritten               = 0\n+        self._nbLines                 = dict([type, 0]  for type in TYPES)\n+        self._splittedFileNames       = dict([type, {}] for type in TYPES)\n+        self._nbElementsPerChromosome = dict([type, {}] for type in TYPES)\n+        self._nbElements              = dict([type, 0]  for type in TYPES)\n+        \n+    def __del__(self):\n+        pass\n+\n+    def _close(self):\n+        self._writer.close()\n+        \n+    def setInputFileName(self, fileName, format, type):\n+        chooser = ParserChooser(self._verbosity)\n+        chooser.findFormat(format)\n+        parser = chooser.getParser(fileName)\n+        sortedFileName = "%s_%d_%d_sorted.pkl" % (os.path.splitext(fileName)[0], self._randomNumber, type)\n+        if self._verbosity > 2:\n+            print "Preparing %s file..." % (TYPETOSTRING[type])\n+        startTime = time.time()\n+        fs = FileSorter(parser, self._verbosity-1)\n+        fs.perChromosome(True)\n+        fs.setOutputFileName(sortedFileName)\n+        fs.sort()\n+        self._nbLines[type]                 = fs.getNbElements()\n+        self._splittedFileNames[type]       = fs.getOutputFileNames()\n+        self._nbElementsPerChromosome[type] = fs.getNbElementsPerChromosome()\n+        self._nbElements[type]              = fs.getNbElements()\n+        endTime = time.time'..b'ranscript):\n+        self._writer.addTranscript(transcript)\n+        self._nbWritten += 1\n+\n+    def run(self):\n+        for chromosome in sorted(self._splittedFileNames[QUERY].keys()):\n+            self._compareChromosome(chromosome)\n+        self._close()\n+        if self._verbosity > 0:\n+            print "# queries: %d" % (self._nbElements[QUERY])\n+            print "# refs:    %d" % (self._nbElements[REFERENCE])\n+            print "# written: %d (%d%%)" % (self._nbWritten, 0 if self._nbElements[QUERY] == 0 else round(float(self._nbWritten) / self._nbElements[QUERY] * 100))\n+        \n+\n+if __name__ == "__main__":\n+    description = "Restrict From Coverage v1.0.0: Select the elements from the first set which have a given coverage. [Category: Data Comparison]"\n+\n+    parser = OptionParser(description = description)\n+    parser.add_option("-i", "--input1",           dest="inputFileName1", action="store",                     type="string", help="input file 1 [compulsory] [format: file in transcript format given by -f]")\n+    parser.add_option("-f", "--format1",          dest="format1",        action="store",                     type="string", help="format of file 1 [compulsory] [format: transcript file format]")\n+    parser.add_option("-j", "--input2",           dest="inputFileName2", action="store",                     type="string", help="input file 2 [compulsory] [format: file in transcript format given by -g]")\n+    parser.add_option("-g", "--format2",          dest="format2",        action="store",                     type="string", help="format of file 2 [compulsory] [format: transcript file format]")\n+    parser.add_option("-o", "--output",           dest="output",         action="store",      default=None,  type="string", help="output file [compulsory] [format: output file in GFF3 format]")\n+    parser.add_option("-n", "--minNucleotides",   dest="minNucleotides", action="store",      default=None,  type="int",    help="minimum number of nucleotides overlapping to declare an overlap [format: int]")\n+    parser.add_option("-N", "--maxNucleotides",   dest="maxNucleotides", action="store",      default=None,  type="int",    help="maximum number of nucleotides overlapping to declare an overlap [format: int]")\n+    parser.add_option("-p", "--minPercent",       dest="minPercent",     action="store",      default=None,  type="int",    help="minimum percentage of nucleotides overlapping to declare an overlap [format: int]")\n+    parser.add_option("-P", "--maxPercent",       dest="maxPercent",     action="store",      default=None,  type="int",    help="maximum percentage of nucleotides overlapping to declare an overlap [format: int]")\n+    parser.add_option("-e", "--minOverlap",       dest="minOverlap",     action="store",      default=None,  type="int",    help="minimum number of elements from 2nd file to declare an overlap [format: int]")\n+    parser.add_option("-E", "--maxOverlap",       dest="maxOverlap",     action="store",      default=None,  type="int",    help="maximum number of elements from 2nd file to declare an overlap [format: int]")\n+    parser.add_option("-s", "--strands",          dest="strands",        action="store_true", default=False,                help="consider the two strands separately [format: bool] [default: false]")\n+    parser.add_option("-v", "--verbosity",        dest="verbosity",      action="store",      default=1,     type="int",    help="trace level [format: int]")\n+    (options, args) = parser.parse_args()\n+\n+    rfc = RestrictFromCoverage(options.verbosity)\n+    rfc.setInputFileName(options.inputFileName1, options.format1, QUERY)\n+    rfc.setInputFileName(options.inputFileName2, options.format2, REFERENCE)\n+    rfc.setOutputFileName(options.output)\n+    rfc.setNbNucleotides(options.minNucleotides, options.maxNucleotides)\n+    rfc.setPercent(options.minPercent, options.maxPercent)\n+    rfc.setOverlap(options.minOverlap, options.maxOverlap)\n+    rfc.setStrands(options.strands)\n+    rfc.run()\n'
b
diff -r d22fadc825e3 -r 2c0c0a89fad7 SMART/Java/Python/SelectByTag.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/SMART/Java/Python/SelectByTag.py Thu May 02 09:56:47 2013 -0400
[
@@ -0,0 +1,148 @@
+#! /usr/bin/env python
+#
+# Copyright INRA-URGI 2009-2010
+# 
+# This software is governed by the CeCILL license under French law and
+# abiding by the rules of distribution of free software. You can use,
+# modify and/ or redistribute the software under the terms of the CeCILL
+# license as circulated by CEA, CNRS and INRIA at the following URL
+# "http://www.cecill.info".
+# 
+# As a counterpart to the access to the source code and rights to copy,
+# modify and redistribute granted by the license, users are provided only
+# with a limited warranty and the software's author, the holder of the
+# economic rights, and the successive licensors have only limited
+# liability.
+# 
+# In this respect, the user's attention is drawn to the risks associated
+# with loading, using, modifying and/or developing or reproducing the
+# software by the user in light of its specific status of free software,
+# that may mean that it is complicated to manipulate, and that also
+# therefore means that it is reserved for developers and experienced
+# professionals having in-depth computer knowledge. Users are therefore
+# encouraged to load and test the software's suitability as regards their
+# requirements in conditions enabling the security of their systems and/or
+# data to be ensured and, more generally, to use and operate it in the
+# same conditions as regards security.
+# 
+# The fact that you are presently reading this means that you have had
+# knowledge of the CeCILL license and that you accept its terms.
+#
+"""Select the transcript such that a tag value is not less than a given threshold"""
+import os
+import sys
+from optparse import OptionParser
+from SMART.Java.Python.structure.TranscriptContainer import TranscriptContainer
+from commons.core.writer import MySqlTranscriptWriter
+from commons.core.writer.Gff3Writer import Gff3Writer
+from SMART.Java.Python.misc.Progress import Progress
+from SMART.Java.Python.misc.RPlotter import RPlotter
+
+class SelectByTag(object):
+    
+    def __init__(self, verbosity = 1):
+        self.input     = None
+        self.format    = None
+        self.tag       = None
+        self.value     = None
+        self.min       = None
+        self.max       = None
+        self.default   = None
+        self.output    = None
+        self.mysql     = None
+        self.verbosity = verbosity
+
+        self.parser      = None
+        self.writer      = None
+        self.mysqlWriter = None
+        self.nbElements  = None
+        self.nbWritten   = 0
+
+    
+    def setParser(self):
+        self.parser     = TranscriptContainer(self.input, self.format, self.verbosity)
+        self.nbElements = self.parser.getNbTranscripts()
+
+
+    def setWriter(self):
+        self.writer = Gff3Writer(self.output, self.verbosity)
+        if self.mysql:
+            self.mysqlWriter = MySqlTranscriptWriter(self.output, self.verbosity)
+
+
+    def isAccepted(self, transcript):
+        value = transcript.getTagValue(self.tag)
+        if value == None:
+            if self.default != None:
+                value = self.default
+            else:
+                raise Exception("Error! Transcript %s no tag called '%s'" % (transcript, self.tag))
+        if self.value != None:
+            if self.value == str(value):
+                return True
+            return self.value.isdigit() and value == float(self.value)
+        value = float(value)
+        return (self.min == None or self.min <= value) and (self.max == None or self.max >= value)
+
+
+    def readInputFile(self):
+        progress = Progress(self.parser.getNbTranscripts(), "Writing transcripts", self.verbosity)
+        for transcript in self.parser.getIterator():
+            if self.isAccepted(transcript):
+                self.writer.addTranscript(transcript)
+                if self.mysql:
+                    self.mysqlWriter.addTranscript(transcript)
+                self.nbWritten += 1
+            progress.inc()
+        progress.done()
+
+
+    def writeFile(self):
+        self.writer.write()
+        if self.mysql:
+            self.mysqlWriter.write()
+
+    
+    def run(self):
+        self.setParser()
+        self.setWriter()
+        self.readInputFile()
+        self.writeFile()
+        if self.verbosity > 0:
+            print "%d input" % (self.nbElements)
+            if self.nbElements != 0:
+                print "%d output (%.2f%%)" % (self.nbWritten, float(self.nbWritten) / self.nbElements * 100)
+
+
+
+if __name__ == "__main__":
+    
+    # parse command line
+    description = "Select by Tag v1.0.2: Keep the genomic coordinates such that a the value of a given tag is between two limits. [Category: Data Selection]"
+
+    parser = OptionParser(description = description)
+    parser.add_option("-i", "--input", dest="inputFileName", action="store", type="string", help="input file [compulsory] [format: file in transcript format given by -f]")
+    parser.add_option("-f", "--format", dest="format", action="store", type="string", help="format of the input [compulsory] [format: transcript file format]")
+    parser.add_option("-g", "--tag", dest="tag", action="store", default=None, type="string", help="the tag [compulsory] [format: string]")     
+    parser.add_option("-a", "--value", dest="value", action="store", default=None, type="string", help="the value to be found [format: string]")     
+    parser.add_option("-m", "--min", dest="min", action="store", default=None, type="float", help="the minimum threshold [format: float]")     
+    parser.add_option("-M", "--max", dest="max", action="store", default=None, type="float", help="the maximum threshold [format: float]")     
+    parser.add_option("-d", "--default", dest="default", action="store", default=None, type="float", help="value if tag is not present [format: float]")     
+    parser.add_option("-o", "--output", dest="outputFileName", action="store", type="string", help="output file [format: output file in GFF3 format]")
+    parser.add_option("-y", "--mysql", dest="mysql", action="store_true", default=False, help="write output into MySQL tables [format: boolean] [default: False]")
+    parser.add_option("-v", "--verbosity", dest="verbosity", action="store", default=1, type="int", help="trace level [format: int]")
+    (options, args) = parser.parse_args()
+
+    selectByTag         = SelectByTag(options.verbosity)
+    selectByTag.input   = options.inputFileName
+    selectByTag.format  = options.format
+    selectByTag.tag     = options.tag
+    selectByTag.value   = options.value
+    selectByTag.min     = options.min
+    selectByTag.max     = options.max
+    selectByTag.default = options.default
+    selectByTag.output  = options.outputFileName
+    selectByTag.mysql   = options.mysql
+    selectByTag.run()
+
+
b
diff -r d22fadc825e3 -r 2c0c0a89fad7 SMART/Java/Python/WrappGetDistribution.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/SMART/Java/Python/WrappGetDistribution.py Thu May 02 09:56:47 2013 -0400
[
@@ -0,0 +1,96 @@
+#! /usr/bin/env python
+from optparse import OptionParser
+import tarfile
+import os
+import re
+import shutil
+import subprocess
+
+SMART_PATH = "%s/SMART" % os.environ["REPET_PATH"]
+
+def toTar(tarFileName, directory):
+    fileName = os.path.splitext(tarFileName)[0]
+    fileNameBaseName = os.path.basename(fileName)
+    tfile = tarfile.open(fileName + ".tmp.tar", "w")
+    list = os.listdir(directory)
+    for file in list:
+        if re.search(str(fileNameBaseName), file):
+            tfile.add(file)
+    os.system("mv %s %s" % (fileName + ".tmp.tar", options.outTarFileName))
+    tfile.close()
+    
+
+if __name__ == "__main__":
+    
+    magnifyingFactor = 1000
+    
+    # parse command line
+    description = "Get Distribution v1.0.1: Get the distribution of the genomic coordinates on a genome. [Category: Visualization]"
+
+    parser = OptionParser(description = description)
+    parser.add_option("-i", "--input",       dest="inputFileName",     action="store",                     type="string", help="input file [compulsory] [format: file in transcript format given by -f]")
+    parser.add_option("-f", "--format",      dest="format",            action="store",                     type="string", help="format of the input file [compulsory] [format: transcript file format]")
+    parser.add_option("-o", "--output",      dest="outTarFileName",    action="store",                     type="string", help="output file [compulsory] [format: output file in GFF3 format]")
+    parser.add_option("-r", "--reference",   dest="referenceFileName", action="store",      default=None,  type="string", help="file containing the genome [compulsory] [format: file in FASTA format]")
+    parser.add_option("-n", "--nbBins",      dest="nbBins",            action="store",      default=1000,  type="int",    help="number of bins [default: 1000] [format: int]")
+    parser.add_option("-2", "--bothStrands", dest="bothStrands",       action="store_true", default=False,                help="plot one curve per strand [format: bool] [default: false]")
+    parser.add_option("-w", "--raw",         dest="raw",               action="store_true", default=False,                help="plot raw number of occurrences instead of density [format: bool] [default: false]")
+    parser.add_option("-x", "--csv",         dest="csv",               action="store_true", default=False,                help="write a .csv file [format: bool]")
+    parser.add_option("-c", "--chromosome",  dest="chromosome",        action="store",      default=None,  type="string", help="plot only a chromosome [format: string]")
+    parser.add_option("-s", "--start",       dest="start",             action="store",      default=None,  type="int",    help="start from a given region [format: int]")
+    parser.add_option("-e", "--end",         dest="end",               action="store",      default=None,  type="int",    help="end from a given region [format: int]")
+    parser.add_option("-y", "--yMin",        dest="yMin",              action="store",      default=None,  type="int",    help="minimum value on the y-axis to plot [format: int]")
+    parser.add_option("-Y", "--yMax",        dest="yMax",              action="store",      default=None,  type="int",    help="maximum value on the y-axis to plot [format: int]")
+    parser.add_option("-g", "--gff",         dest="gff",               action="store_true", default=False,                help="also write GFF3 file [format: bool] [default: false]")
+    parser.add_option("-H", "--height",      dest="height",            action="store",      default=None,  type="int",    help="height of the graphics [format: int] [default: 300]")
+    parser.add_option("-W", "--width",       dest="width",             action="store",      default=None,  type="int",    help="width of the graphics [format: int] [default: 1000]")
+    parser.add_option("-v", "--verbosity",   dest="verbosity",         action="store",      default=1,     type="int",    help="trace level [default: 1] [format: int]")
+    parser.add_option("-l", "--log",         dest="log",               action="store_true", default=False,                help="write a log file [format: bool]")
+    (options, args) = parser.parse_args()
+
+
+    absPath = os.getcwd()
+    print "the current path is :", absPath
+    directory = "/tmp/wrappGetDistribution"
+    print "the dir path is :", directory
+    if not os.path.exists(directory):
+        os.makedirs(directory)
+    os.chdir(directory)
+    if options.inputFileName != None and options.format != None and options.outTarFileName != None:
+        outputFileName = os.path.splitext(os.path.basename(options.outTarFileName))[0]
+        cmd = "python %s/Java/Python/getDistribution.py -i %s -f %s -o %s -D %s" % (SMART_PATH, options.inputFileName, options.format, outputFileName, directory)
+    if options.referenceFileName != None :
+        cmd += " -r %s" % options.referenceFileName
+    if options.nbBins != None :
+        cmd += " -n %s" % options.nbBins
+    if options.chromosome :
+        cmd += " -c %s" % options.chromosome 
+    if options.start != None :
+        cmd += " -s %s" % options.start
+    if options.end != None :
+        cmd += " -e %s" % options.end
+    if options.yMin != None :
+        cmd += " -y %s" % options.yMin
+    if options.yMax != None :
+        cmd += " -Y %s" % options.yMax
+    if options.height != None :
+        cmd += " -H %s" % options.height
+    if options.width != None :
+        cmd += " -W %s" % options.width
+    if options.bothStrands :
+        cmd += " -2" 
+    if options.raw :
+        cmd += " -w" 
+    if options.csv :
+        cmd += " -x" 
+    if options.gff :
+        cmd += " -g"
+    if options.log :
+        cmd += " -l" 
+    print "cmd is: ", cmd    
+    status = subprocess.call(cmd, shell=True)
+    if status != 0:
+            raise Exception("Problem with the execution of command!")
+    toTar(options.outTarFileName, directory)
+    shutil.rmtree(directory)
+    
b
diff -r d22fadc825e3 -r 2c0c0a89fad7 SMART/Java/Python/WrappGetReadDistribution.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/SMART/Java/Python/WrappGetReadDistribution.py Thu May 02 09:56:47 2013 -0400
[
@@ -0,0 +1,58 @@
+#! /usr/bin/env python
+from optparse import OptionParser
+import tarfile
+import os
+import re
+import shutil
+import subprocess
+
+SMART_PATH = "%s/SMART" % os.environ["REPET_PATH"]
+
+def toTar(tarFileName, directory):
+    fileName = os.path.splitext(tarFileName)[0]
+    fileNameBaseName = os.path.basename(fileName)
+    tfile = tarfile.open(fileName + ".tmp.tar", "w")
+    list = os.listdir(directory)
+    for file in list:
+        if re.search(str(fileNameBaseName), file):
+            tfile.add(file)
+    os.system("mv %s %s" % (fileName + ".tmp.tar", options.outTarFileName))
+    tfile.close()
+    
+
+if __name__ == "__main__":
+    
+    # parse command line
+    description = "Get Read Distribution v1.0.1: Plot the number of identical reads and give the most represented. [Category: Visualization]"
+
+    parser = OptionParser(description = description)
+    parser.add_option("-i", "--input",     dest="inputFileName",  action="store",               type="string", help="input file sequence [compulsory] [format: file in sequence format given by -f]")
+    parser.add_option("-f", "--format",    dest="format",         action="store",               type="string", help="format of the file [compulsory] [format: sequence file format]")
+    parser.add_option("-n", "--number",    dest="number",         action="store", default=None, type="int",    help="keep the best n    [format: int]")
+    parser.add_option("-p", "--percent",   dest="percent",        action="store", default=None, type="float",  help="keep the best n\% [format: float]")
+    parser.add_option("-o", "--output",    dest="outTarFileName", action="store",               type="string", help="output file [compulsory] [format: zip]")
+
+    (options, args) = parser.parse_args()
+
+
+    absPath = os.getcwd()
+    print "the current path is :", absPath
+    directory = "/tmp/wrappGetReadDistribution"
+    print "the dir path is :", directory
+    if not os.path.exists(directory):
+        os.makedirs(directory)
+    os.chdir(directory)
+    if options.inputFileName != None and options.format != None and options.outTarFileName != None:
+        outputFileName = os.path.splitext(os.path.basename(options.outTarFileName))[0]
+        cmd = "python %s/Java/Python/getReadDistribution.py -i %s -f %s -o %s -D %s" % (SMART_PATH, options.inputFileName, options.format, outputFileName, directory)
+    if options.number != None :
+        cmd += " -n %s" % options.number
+    if options.percent != None :
+        cmd += " -p %s" % options.percent
+    print "cmd is: ", cmd    
+    status = subprocess.call(cmd, shell=True)
+    if status != 0:
+            raise Exception("Problem with the execution of command!")
+    toTar(options.outTarFileName, directory)
+    shutil.rmtree(directory)
+    
b
diff -r d22fadc825e3 -r 2c0c0a89fad7 SMART/Java/Python/WrappPlotCoverage.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/SMART/Java/Python/WrappPlotCoverage.py Thu May 02 09:56:47 2013 -0400
[
@@ -0,0 +1,89 @@
+#! /usr/bin/env python
+from optparse import OptionParser
+import tarfile
+import os
+import re
+import shutil
+import subprocess
+
+SMART_PATH = "%s/SMART" % os.environ["REPET_PATH"]
+
+def toTar(tarFileName, directory):
+    fileName = os.path.splitext(tarFileName)[0]
+    fileNameBaseName = os.path.basename(fileName)
+    tfile = tarfile.open(fileName + ".tmp.tar", "w")
+    list = os.listdir(directory)
+    for file in list:
+        if re.search(str(fileNameBaseName), file):
+            tfile.add(file)
+    os.system("mv %s %s" % (fileName + ".tmp.tar", options.outTarFileName))
+    tfile.close()
+
+
+
+if __name__ == "__main__":
+    
+    # parse command line
+    description = "Plot Coverage v1.0.1: Plot the coverage of the first data with respect to the second one. [Category: Visualization]"
+
+    parser = OptionParser(description = description)
+    parser.add_option("-i", "--input1",       dest="inputFileName1", action="store",                       type="string", help="input file 1 [compulsory] [format: file in transcript format given by -f]")
+    parser.add_option("-f", "--inputFormat1", dest="inputFormat1",   action="store",                       type="string", help="format of input file 1 [compulsory] [format: transcript file format]")
+    parser.add_option("-j", "--input2",       dest="inputFileName2", action="store",                       type="string", help="input file 2 [compulsory] [format: file in transcript format given by -g]")
+    parser.add_option("-g", "--inputFormat2", dest="inputFormat2",   action="store",                       type="string", help="format of input file 2 [compulsory] [format: transcript file format]")
+    parser.add_option("-q", "--sequence",     dest="inputSequence",  action="store",      default=None,    type="string", help="input sequence file [format: file in FASTA format] [default: None]")
+    parser.add_option("-o", "--output",       dest="outTarFileName", action="store",                       type="string", help="output file [compulsory] [format: output file in zip format]")
+    parser.add_option("-w", "--width",        dest="width",          action="store",      default=1500,    type="int",    help="width of the plots (in px) [format: int] [default: 1500]")
+    parser.add_option("-e", "--height",       dest="height",         action="store",      default=1000,    type="int",    help="height of the plots (in px) [format: int] [default: 1000]")
+    parser.add_option("-t", "--title",        dest="title",          action="store",      default="",      type="string", help="title of the plots [format: string]")
+    parser.add_option("-x", "--xlab",         dest="xLabel",         action="store",      default="",      type="string", help="label on the x-axis [format: string]")
+    parser.add_option("-y", "--ylab",         dest="yLabel",         action="store",      default="",      type="string", help="label on the y-axis [format: string]")
+    parser.add_option("-p", "--plusColor",    dest="plusColor",      action="store",      default="red",   type="string", help="color for the elements on the plus strand [format: string] [default: red]")
+    parser.add_option("-m", "--minusColor",   dest="minusColor",     action="store",      default="blue",  type="string", help="color for the elements on the minus strand [format: string] [default: blue]")
+    parser.add_option("-s", "--sumColor",     dest="sumColor",       action="store",      default="black", type="string", help="color for 2 strands coverage line [format: string] [default: black]")
+    parser.add_option("-l", "--lineColor",    dest="lineColor",      action="store",      default="black", type="string", help="color for the lines [format: string] [default: black]")
+    parser.add_option("-1", "--merge",        dest="merge",          action="store_true", default=False,                  help="merge the 2 plots in 1 [format: boolean] [default: false]")
+    parser.add_option("-v", "--verbosity",    dest="verbosity",      action="store",      default=1,       type="int",    help="trace level [format: int]")
+    (options, args) = parser.parse_args()
+
+    absPath = os.getcwd()
+    directory = "/tmp/wrappPlotCov"
+    if not os.path.exists(directory):
+        os.makedirs(directory)
+    os.chdir(directory)
+    if options.inputFileName1 != None and options.inputFormat1 != None and options.inputFileName2 != None and options.inputFormat2 != None and options.outTarFileName != None:
+        outputFileName = os.path.splitext(os.path.basename(options.outTarFileName))[0]
+        print 'outputfile is :', outputFileName
+        cmd = "python %s/Java/Python/plotCoverage.py -i %s -f %s -j %s -g %s -o %s -D %s" % (SMART_PATH, options.inputFileName1, options.inputFormat1, options.inputFileName2, options.inputFormat2, outputFileName, directory)
+    if options.inputSequence!= None:
+        cmd += " -q %s" % options.inputSequence
+    if options.width != None:
+        cmd += " -w %s" % options.width
+    if options.height != None:
+        cmd += " -e %s" % options.height
+    if options.title != None:
+        cmd += " -t %s" % options.title
+    if options.xLabel != None:
+        cmd += " -x %s" % options.xLabel
+    if options.yLabel != None:
+        cmd += " -y %s" % options.yLabel
+    if options.plusColor != None:
+        cmd += " -p %s" % options.plusColor
+    if options.minusColor != None:
+        cmd += " -m %s" % options.minusColor
+    if options.sumColor != None:
+        cmd += " -s %s" % options.sumColor
+    if options.lineColor != None:
+        cmd += " -l %s" % options.lineColor
+    if options.merge:
+        cmd += " -1"
+    status = subprocess.call(cmd, shell=True)
+    if status != 0:
+            raise Exception("Problem with the execution of command!")
+    toTar(options.outTarFileName, directory)
+    shutil.rmtree(directory)
+

+
+
+        
b
diff -r d22fadc825e3 -r 2c0c0a89fad7 SMART/Java/Python/WrappPlotRepartition.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/SMART/Java/Python/WrappPlotRepartition.py Thu May 02 09:56:47 2013 -0400
[
@@ -0,0 +1,71 @@
+#! /usr/bin/env python
+from optparse import OptionParser
+import tarfile
+import os
+import re
+import shutil
+import subprocess
+
+SMART_PATH = "%sSMART" % os.environ["REPET_PATH"]
+
+def toTar(tarFileName, directory):
+    fileName = os.path.splitext(tarFileName)[0]
+    fileNameBaseName = os.path.basename(fileName)
+    tfile = tarfile.open(fileName + ".tmp.tar", "w")
+    list = os.listdir(directory)
+    for file in list:
+        if re.search(str(fileNameBaseName), file):
+            tfile.add(file)
+    os.system("mv %s %s" % (fileName + ".tmp.tar", options.outTarFileName))
+    tfile.close()
+    
+
+if __name__ == "__main__":
+    
+    magnifyingFactor = 1000
+    
+    # parse command line
+    description = "Plot the repartition of different data on a whole genome. (This tool uses 1 input file only, the different values being stored in the tags.    See documentation to know more about it.) [Category: Visualization]"
+
+
+    parser = OptionParser(description = description)
+    parser.add_option("-i", "--input",dest="inputFileName",action="store",type="string",help="input file name [compulsory] [format: file in GFF3 format]")
+    parser.add_option("-n", "--names",dest="names", action="store", type="string", help="name for the tags (separated by commas and no space) [compulsory] [format: string]")
+    parser.add_option("-o", "--output",dest="outTarFileName",action="store",type="string", help="output file [compulsory] [format: output file tar format]")
+    parser.add_option("-c", "--color",dest="colors",action="store",default=None,type="string", help="color of the lines (separated by commas and no space) [format: string]")
+    parser.add_option("-f", "--format",dest="format",action="store",default="png",type="string", help="format of the output file [format: string] [default: png]")
+    parser.add_option("-r", "--normalize",dest="normalize",action="store_true", default=False,help="normalize data (when panels are different) [format: bool] [default: false]")
+    parser.add_option("-l", "--log",dest="log",action="store",default="",type="string", help="use log on x- or y-axis (write 'x', 'y' or 'xy') [format: string]")
+    parser.add_option("-v", "--verbosity",dest="verbosity",action="store",default=1,type="int",help="trace level [format: int]")
+    (options, args) = parser.parse_args()
+
+
+    absPath = os.getcwd()
+    print "the current path is :", absPath
+    directory = "/tmp/wrappPlotRepartition"
+    print "the dir path is :", directory
+    if not os.path.exists(directory):
+        os.makedirs(directory)
+    os.chdir(directory)
+    if options.inputFileName != None and options.format != None and options.outTarFileName != None:
+        outputFileName = os.path.splitext(os.path.basename(options.outTarFileName))[0]
+        cmd = "python %s/Java/Python/plotRepartition.py -i %s -o %s -D %s" % (SMART_PATH, options.inputFileName, outputFileName, directory)
+    if options.names != None :
+        cmd += " -n %s" % options.names
+    else: print "You must choose tag names !"
+    if options.colors != None :
+        cmd += " -c %s" % options.colors
+    if options.format != None:
+        cmd += " -f %s" % options.format
+    if options.normalize :
+        cmd += " -r " 
+    if options.log != "" :
+        cmd += " -l %s" % options.log
+    
+    print "cmd is: ", cmd    
+    status = subprocess.call(cmd, shell=True)
+    if status != 0:
+            raise Exception("Problem with the execution of command!")
+    toTar(options.outTarFileName, directory)
+    shutil.rmtree(directory)
+    
b
diff -r d22fadc825e3 -r 2c0c0a89fad7 SMART/Java/Python/adaptorStripper.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/SMART/Java/Python/adaptorStripper.py Thu May 02 09:56:47 2013 -0400
[
@@ -0,0 +1,115 @@
+#! /usr/bin/env python
+#
+# Copyright INRA-URGI 2009-2010
+# 
+# This software is governed by the CeCILL license under French law and
+# abiding by the rules of distribution of free software. You can use,
+# modify and/ or redistribute the software under the terms of the CeCILL
+# license as circulated by CEA, CNRS and INRIA at the following URL
+# "http://www.cecill.info".
+# 
+# As a counterpart to the access to the source code and rights to copy,
+# modify and redistribute granted by the license, users are provided only
+# with a limited warranty and the software's author, the holder of the
+# economic rights, and the successive licensors have only limited
+# liability.
+# 
+# In this respect, the user's attention is drawn to the risks associated
+# with loading, using, modifying and/or developing or reproducing the
+# software by the user in light of its specific status of free software,
+# that may mean that it is complicated to manipulate, and that also
+# therefore means that it is reserved for developers and experienced
+# professionals having in-depth computer knowledge. Users are therefore
+# encouraged to load and test the software's suitability as regards their
+# requirements in conditions enabling the security of their systems and/or
+# data to be ensured and, more generally, to use and operate it in the
+# same conditions as regards security.
+# 
+# The fact that you are presently reading this means that you have had
+# knowledge of the CeCILL license and that you accept its terms.
+#
+"""Remove adaptors"""
+
+import os
+from optparse import OptionParser
+from SMART.Java.Python.structure.Sequence import Sequence
+from SMART.Java.Python.structure.SequenceList import SequenceList
+from commons.core.parsing.FastaParser import FastaParser
+from commons.core.writer.FastaWriter import FastaWriter
+from SMART.Java.Python.misc.Progress import Progress
+
+
+def distance (string1, string2):
+    if len(string1) != len(string2):
+        return None
+    distance = 0
+    for i in range(0, len(string1)):
+        if string1[i] != string2[i]:
+            distance += 1
+    return distance
+
+
+
+if __name__ == "__main__":
+    nbRemaining = 0
+    
+    # parse command line
+    description = "Adaptor Stripper v1.0.1: Remove the adaptor of a list of reads. [Category: Personnal]"
+
+    parser = OptionParser(description = description)
+    parser.add_option("-i", "--input",         dest="inputFileName",      action="store",                     type="string", help="input file [compulsory] [format: file in FASTA format]")
+    parser.add_option("-o", "--output",        dest="outputFileName",     action="store",                     type="string", help="output file [compulsory] [format: output file in FASTA format]")
+    parser.add_option("-5", "--5primeAdaptor", dest="fivePrimeAdaptor",   action="store",                     type="string", help="five prime adaptor [format: string]")
+    parser.add_option("-3", "--3primeAdaptor", dest="threePrimeAdaptor",  action="store",                     type="string", help="three prime adaptor [format: string]")
+    parser.add_option("-d", "--5primeDist",    dest="fivePrimeDistance",  action="store",      default=3,     type="int",    help="five prime distance [format: int] [default: 3]")
+    parser.add_option("-e", "--3primeDist",    dest="threePrimeDistance", action="store",      default=3,     type="int",    help="three prime distance [format: int [default: 3]]")
+    parser.add_option("-m", "--3primeSize",    dest="threePrimeSize",     action="store",      default=10,    type="int",    help="three prime size [format: int] [default: 10]")
+    parser.add_option("-v", "--verbosity",     dest="verbosity",          action="store",      default=1,     type="int",    help="trace level [format: int] [default: 1]")
+    parser.add_option("-l", "--log",           dest="log",                action="store_true", default=False,                help="write a log file [format: bool] [default: false]")
+    (options, args) = parser.parse_args()
+
+    if options.log:
+        logHandle = open(options.outputFileName + ".log", "w")
+
+
+    writer         = FastaWriter(options.outputFileName + ".fas", options.verbosity)
+    sequenceParser = FastaParser(options.inputFileName, options.verbosity)
+    nbSequences    = sequenceParser.getNbSequences()
+
+    # treat sequences
+    progress = Progress(sequenceParser.getNbSequences(), "Analyzing " + options.inputFileName, options.verbosity)
+    for sequence in sequenceParser.getIterator():
+        fivePrimeAdaptor  = sequence.getSequence()[0:len(options.fivePrimeAdaptor)]
+        threePrimeAdaptor = sequence.getSequence()[len(sequence.sequence)-len(options.threePrimeAdaptor):]
+
+        # check 5' adaptor
+        fivePrimeDistance = distance(fivePrimeAdaptor, options.fivePrimeAdaptor)
+        # check 3' adaptor
+        threePrimeDistance = len(threePrimeAdaptor)
+        for i in range(options.threePrimeSize, len(threePrimeAdaptor)+1):
+            threePrimeDistance = min(threePrimeDistance, distance(threePrimeAdaptor[-i:], options.threePrimeAdaptor[:i]))
+
+        # sort candidates
+        if fivePrimeDistance > options.fivePrimeDistance:
+            if options.log:
+                logHandle.write("Sequence %s does not start with the right adaptor (%s != %s)\n" % (sequence.getSequence(), fivePrimeAdaptor, options.fivePrimeAdaptor))
+        elif threePrimeDistance > options.threePrimeDistance:
+            if options.log:
+                logHandle.write("Sequence %s does not end with the right adaptor (%s != %s)\n" % (sequence.getSequence(), threePrimeAdaptor, options.threePrimeAdaptor))
+        else:
+            nbRemaining += 1
+            sequence.setSequence(sequence.getSequence()[len(options.fivePrimeAdaptor):len(sequence.getSequence())-len(options.threePrimeAdaptor)])
+            writer.addSequence(sequence)
+
+        progress.inc()
+
+    progress.done()
+
+    if options.log:
+        logHandle.close()
+
+    writer.write()
+
+    print "kept %i over %i (%.f%%)" % (nbRemaining, nbSequences, float(nbRemaining) / nbSequences * 100)
+
+
b
diff -r d22fadc825e3 -r 2c0c0a89fad7 SMART/Java/Python/changeGffFeatures.sh
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/SMART/Java/Python/changeGffFeatures.sh Thu May 02 09:56:47 2013 -0400
b
@@ -0,0 +1,2 @@
+#!/bin/bash
+sed "s/\t$2\t/\t$3\t/g" $1
b
diff -r d22fadc825e3 -r 2c0c0a89fad7 SMART/Java/Python/changeTagName.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/SMART/Java/Python/changeTagName.py Thu May 02 09:56:47 2013 -0400
[
@@ -0,0 +1,90 @@
+#! /usr/bin/env python
+#
+# Copyright INRA-URGI 2009-2010
+# 
+# This software is governed by the CeCILL license under French law and
+# abiding by the rules of distribution of free software. You can use,
+# modify and/ or redistribute the software under the terms of the CeCILL
+# license as circulated by CEA, CNRS and INRIA at the following URL
+# "http://www.cecill.info".
+# 
+# As a counterpart to the access to the source code and rights to copy,
+# modify and redistribute granted by the license, users are provided only
+# with a limited warranty and the software's author, the holder of the
+# economic rights, and the successive licensors have only limited
+# liability.
+# 
+# In this respect, the user's attention is drawn to the risks associated
+# with loading, using, modifying and/or developing or reproducing the
+# software by the user in light of its specific status of free software,
+# that may mean that it is complicated to manipulate, and that also
+# therefore means that it is reserved for developers and experienced
+# professionals having in-depth computer knowledge. Users are therefore
+# encouraged to load and test the software's suitability as regards their
+# requirements in conditions enabling the security of their systems and/or
+# data to be ensured and, more generally, to use and operate it in the
+# same conditions as regards security.
+# 
+# The fact that you are presently reading this means that you have had
+# knowledge of the CeCILL license and that you accept its terms.
+#
+"""
+Change the name of a tag
+"""
+
+import os
+import random
+from optparse import OptionParser
+from SMART.Java.Python.structure.TranscriptContainer import TranscriptContainer
+from SMART.Java.Python.misc.Progress import Progress
+from commons.core.writer.MySqlTranscriptWriter import MySqlTranscriptWriter
+from commons.core.writer.Gff3Writer import Gff3Writer
+
+
+if __name__ == "__main__":
+    
+    # parse command line
+    description = "Change Tag Name v1.0.1: Change the name of tag of a list of transcripts. [Category: Data Modification]"
+
+    parser = OptionParser(description = description)
+    parser.add_option("-i", "--input",       dest="inputFileName",  action="store",                      type="string", help="input file [compulsory] [format: file in transcript format given by -f]")
+    parser.add_option("-f", "--inputFormat", dest="inputFormat",    action="store",                      type="string", help="format of the input file [compulsory] [format: transcript file format]")
+    parser.add_option("-o", "--output",      dest="outputFileName", action="store",                      type="string", help="output file [compulsory] [format: output file in GFF3 format]")
+    parser.add_option("-t", "--tag",         dest="tag",            action="store",                      type="string", help="name of the tag to change [compulsory] [format: string]")
+    parser.add_option("-n", "--name",        dest="name",           action="store",                      type="string", help="new name for the tag [compulsory] [format: string]")
+    parser.add_option("-y", "--mysql",       dest="mysql",          action="store_true", default=False,                 help="mySQL output [format: bool] [default: false]")    
+    parser.add_option("-v", "--verbosity",   dest="verbosity",      action="store",      default=1,      type="int",    help="trace level [format: int] [default: 1]")
+    parser.add_option("-l", "--log",         dest="log",            action="store_true", default=False,                 help="write a log file [format: bool] [default: false]")
+    (options, args) = parser.parse_args()
+
+    if options.log:
+        logHandle = open("%s.log" % options.outputFileName, "w")
+
+    # create parser and writer(s)
+    parser      = TranscriptContainer(options.inputFileName, options.inputFormat, options.verbosity)
+    tmpFileName = "tmpTranscriptFile%d.gff3" % (random.randint(0, 100000))
+    writer      = Gff3Writer(tmpFileName, options.verbosity)
+    if options.mysql:
+        mysqlWriter = MySqlTranscriptWriter(options.outputFileName, options.verbosity)
+    outputData = {}
+        
+    # process transcripts
+    progress = Progress(parser.getNbTranscripts(), "Printing transcripts %s" % (options.inputFileName), options.verbosity)
+    for transcript in parser.getIterator():
+        if options.tag in transcript.tags:
+            value = transcript.tags[options.tag]
+            del transcript.tags[options.tag]
+            transcript.tags[options.name] = value
+        writer.addTranscript(transcript)
+        if options.mysql:
+            mysqlWriter.addTranscript(transcript)
+        progress.inc()
+    progress.done()
+    parser.transcriptListParser.close()
+
+    writer.write()
+
+    if options.mysql:
+        mysqlWriter.write()
+
+    os.rename(tmpFileName, options.outputFileName)
b
diff -r d22fadc825e3 -r 2c0c0a89fad7 SMART/Java/Python/cleanGff.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/SMART/Java/Python/cleanGff.py Thu May 02 09:56:47 2013 -0400
[
@@ -0,0 +1,195 @@
+#! /usr/bin/env python
+#
+# Copyright INRA-URGI 2009-2010
+# 
+# This software is governed by the CeCILL license under French law and
+# abiding by the rules of distribution of free software. You can use,
+# modify and/ or redistribute the software under the terms of the CeCILL
+# license as circulated by CEA, CNRS and INRIA at the following URL
+# "http://www.cecill.info".
+# 
+# As a counterpart to the access to the source code and rights to copy,
+# modify and redistribute granted by the license, users are provided only
+# with a limited warranty and the software's author, the holder of the
+# economic rights, and the successive licensors have only limited
+# liability.
+# 
+# In this respect, the user's attention is drawn to the risks associated
+# with loading, using, modifying and/or developing or reproducing the
+# software by the user in light of its specific status of free software,
+# that may mean that it is complicated to manipulate, and that also
+# therefore means that it is reserved for developers and experienced
+# professionals having in-depth computer knowledge. Users are therefore
+# encouraged to load and test the software's suitability as regards their
+# requirements in conditions enabling the security of their systems and/or
+# data to be ensured and, more generally, to use and operate it in the
+# same conditions as regards security.
+# 
+# The fact that you are presently reading this means that you have had
+# knowledge of the CeCILL license and that you accept its terms.
+#
+"""
+Clean a GFF file (as given by NCBI or TAIR) and outputs a GFF3 file.
+"""
+
+import os
+import re
+from optparse import OptionParser
+from commons.core.parsing.GffParser import *
+from SMART.Java.Python.misc.RPlotter import *
+from SMART.Java.Python.misc.Progress import Progress
+from SMART.Java.Python.misc.UnlimitedProgress import UnlimitedProgress
+
+count = {}
+
+class ParsedLine(object):
+    def __init__(self, line, cpt):
+        self.line = line
+        self.cpt  = cpt
+        self.parse()
+
+    def parse(self):
+        self.line = self.line.strip()
+        self.splittedLine = self.line.split(None, 8)
+        if len(self.splittedLine) < 9:
+            raise Exception("Line '%s' has less than 9 fields.  Exiting..." % (self.line))
+        self.type = self.splittedLine[2]
+        self.parseOptions()
+        self.getId()
+        self.getParents()
+
+    def parseOptions(self):
+        self.parsedOptions = {}
+        for option in self.splittedLine[8].split(";"):
+            option = option.strip()
+            if option == "": continue
+            posSpace = option.find(" ")
+            posEqual = option.find("=")
+            if posEqual != -1 and (posEqual < posSpace or posSpace == -1):
+                key, value = option.split("=", 1)
+            elif posSpace != -1:
+                key, value = option.split(None, 1)
+            else:
+                key   = "ID"
+                value = option
+            self.parsedOptions[key.strip()] = value.strip(" \"")
+
+    def getId(self):
+        for key in self.parsedOptions:
+            if key.lower() == "id":
+                self.id = self.parsedOptions[key]
+                return
+        if "Parent" in self.parsedOptions:
+            parent = self.parsedOptions["Parent"].split(",")[0]
+            if parent not in count:
+                count[parent] = {}
+            if self.type not in count[parent]:
+                count[parent][self.type] = 0
+            count[parent][self.type] += 1
+            self.id = "%s-%s-%d" % (parent, self.type, count[parent][self.type])
+        else:
+            self.id = "smart%d" % (self.cpt)
+        self.parsedOptions["ID"] = self.id
+
+    def getParents(self):
+        for key in self.parsedOptions:
+            if key.lower() in ("parent", "derives_from"):
+                self.parents = self.parsedOptions[key].split(",")
+                return
+        self.parents = None
+
+    def removeParent(self):
+        for key in self.parsedOptions.keys():
+            if key.lower() in ("parent", "derives_from"):
+                del self.parsedOptions[key]
+
+    def export(self):
+        self.splittedLine[8] = ";".join(["%s=%s" % (key, value) for key, value in self.parsedOptions.iteritems()])
+        return "%s\n" % ("\t".join(self.splittedLine))
+
+
+class CleanGff(object):
+
+    def __init__(self, verbosity = 1):
+        self.verbosity = verbosity
+        self.lines         = {}
+        self.acceptedTypes = []
+        self.parents       = []
+        self.children      = {}
+
+    def setInputFileName(self, name):
+        self.inputFile = open(name)
+        
+    def setOutputFileName(self, name):
+        self.outputFile = open(name, "w")
+
+    def setAcceptedTypes(self, types):
+        self.acceptedTypes = types
+
+    def parse(self):
+        progress = UnlimitedProgress(100000, "Reading input file", self.verbosity)
+        for cpt, line in enumerate(self.inputFile):
+            if not line or line[0] == "#": continue
+            if line[0] == ">": break
+            parsedLine = ParsedLine(line, cpt)
+            if parsedLine.type in self.acceptedTypes:
+                self.lines[parsedLine.id] = parsedLine
+            progress.inc()
+        progress.done()
+
+    def sort(self):
+        progress = Progress(len(self.lines.keys()), "Sorting file", self.verbosity)
+        for line in self.lines.values():
+            parentFound = False
+            if line.parents:
+                for parent in line.parents:
+                    if parent in self.lines:
+                        parentFound = True
+                        if parent in self.children:
+                            self.children[parent].append(line)
+                        else:
+                            self.children[parent] = [line]
+            if not parentFound:
+                line.removeParent()
+                self.parents.append(line)
+            progress.inc()
+        progress.done()
+
+    def write(self):
+        progress = Progress(len(self.parents), "Writing output file", self.verbosity)
+        for line in self.parents:
+            self.writeLine(line)
+            progress.inc()
+        self.outputFile.close()
+        progress.done()
+
+    def writeLine(self, line):
+        self.outputFile.write(line.export())
+        if line.id in self.children:
+            for child in self.children[line.id]:
+                self.writeLine(child)
+
+    def run(self):
+        self.parse()
+        self.sort()
+        self.write()
+
+
+if __name__ == "__main__":
+    
+    # parse command line
+    description = "Clean GFF v1.0.3: Clean a GFF file (as given by NCBI) and outputs a GFF3 file. [Category: Other]"
+
+    parser = OptionParser(description = description)
+    parser.add_option("-i", "--input",     dest="inputFileName",  action="store",                      type="string", help="input file name [compulsory] [format: file in GFF format]")
+    parser.add_option("-o", "--output",    dest="outputFileName", action="store",                      type="string", help="output file [compulsory] [format: output file in GFF3 format]")
+    parser.add_option("-t", "--types",     dest="types",          action="store", default="mRNA,exon", type="string", help="list of comma-separated types that you want to keep [format: string] [default: mRNA,exon]")
+    parser.add_option("-v", "--verbosity", dest="verbosity",      action="store", default=1,           type="int",    help="trace level [format: int]")
+    (options, args) = parser.parse_args()
+
+    cleanGff = CleanGff(options.verbosity)
+    cleanGff.setInputFileName(options.inputFileName)
+    cleanGff.setOutputFileName(options.outputFileName)
+    cleanGff.setAcceptedTypes(options.types.split(","))
+    cleanGff.run()
+
b
diff -r d22fadc825e3 -r 2c0c0a89fad7 SMART/Java/Python/cleaning/CleanerChooser.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/SMART/Java/Python/cleaning/CleanerChooser.py Thu May 02 09:56:47 2013 -0400
b
@@ -0,0 +1,80 @@
+#
+# Copyright INRA-URGI 2009-2010
+# 
+# This software is governed by the CeCILL license under French law and
+# abiding by the rules of distribution of free software. You can use,
+# modify and/ or redistribute the software under the terms of the CeCILL
+# license as circulated by CEA, CNRS and INRIA at the following URL
+# "http://www.cecill.info".
+# 
+# As a counterpart to the access to the source code and rights to copy,
+# modify and redistribute granted by the license, users are provided only
+# with a limited warranty and the software's author, the holder of the
+# economic rights, and the successive licensors have only limited
+# liability.
+# 
+# In this respect, the user's attention is drawn to the risks associated
+# with loading, using, modifying and/or developing or reproducing the
+# software by the user in light of its specific status of free software,
+# that may mean that it is complicated to manipulate, and that also
+# therefore means that it is reserved for developers and experienced
+# professionals having in-depth computer knowledge. Users are therefore
+# encouraged to load and test the software's suitability as regards their
+# requirements in conditions enabling the security of their systems and/or
+# data to be ensured and, more generally, to use and operate it in the
+# same conditions as regards security.
+# 
+# The fact that you are presently reading this means that you have had
+# knowledge of the CeCILL license and that you accept its terms.
+#
+import sys
+from SMART.Java.Python.cleaning.TranscriptListCleaner import TranscriptListCleaner
+from SMART.Java.Python.cleaning.GffCleaner import GffCleaner
+from SMART.Java.Python.cleaning.GtfCleaner import GtfCleaner
+from SMART.Java.Python.cleaning.DefaultCleaner import DefaultCleaner
+
+#Attention!! Do not delete the imports!! They are used to know the type of file format!!!
+
+class CleanerChooser(object):
+ """
+ A class that finds the correct cleaner
+ @ivar format: the format
+ @type format: string
+ @ivar cleaner: the parser
+ @type cleaner: object
+ @ivar cleanerClass: the class of the parser
+ @type cleanerClass: class
+ @ivar verbosity: verbosity
+ @type verbosity: int
+ """
+
+ def __init__(self, verbosity = 0):
+ """
+ Constructor
+ @param verbosity: verbosity
+ @type verbosity: int
+ """
+ self.verbosity = verbosity
+
+
+ def findFormat(self, format):
+ """
+ Find the correct parser
+ @ivar format: the format
+ @type format: string
+ @return: a cleaner
+ """
+ for cleanerClass in TranscriptListCleaner.__subclasses__():
+ if cleanerClass != None:
+ if cleanerClass.getFileFormats() != None and format in cleanerClass.getFileFormats():
+ self.cleanerClass = cleanerClass
+ return
+ self.cleanerClass = DefaultCleaner
+
+
+ def getCleaner(self):
+ """
+ Get the parser previously found
+ @return: the parser
+ """
+ return self.cleanerClass(self.verbosity)
b
diff -r d22fadc825e3 -r 2c0c0a89fad7 SMART/Java/Python/cleaning/DefaultCleaner.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/SMART/Java/Python/cleaning/DefaultCleaner.py Thu May 02 09:56:47 2013 -0400
b
@@ -0,0 +1,45 @@
+#! /usr/bin/env python
+#
+# Copyright INRA-URGI 2009-2010
+# 
+# This software is governed by the CeCILL license under French law and
+# abiding by the rules of distribution of free software. You can use,
+# modify and/ or redistribute the software under the terms of the CeCILL
+# license as circulated by CEA, CNRS and INRIA at the following URL
+# "http://www.cecill.info".
+# 
+# As a counterpart to the access to the source code and rights to copy,
+# modify and redistribute granted by the license, users are provided only
+# with a limited warranty and the software's author, the holder of the
+# economic rights, and the successive licensors have only limited
+# liability.
+# 
+# In this respect, the user's attention is drawn to the risks associated
+# with loading, using, modifying and/or developing or reproducing the
+# software by the user in light of its specific status of free software,
+# that may mean that it is complicated to manipulate, and that also
+# therefore means that it is reserved for developers and experienced
+# professionals having in-depth computer knowledge. Users are therefore
+# encouraged to load and test the software's suitability as regards their
+# requirements in conditions enabling the security of their systems and/or
+# data to be ensured and, more generally, to use and operate it in the
+# same conditions as regards security.
+# 
+# The fact that you are presently reading this means that you have had
+# knowledge of the CeCILL license and that you accept its terms.
+#
+"""
+Default cleaner. Does nothing but copying.
+"""
+from SMART.Java.Python.cleaning.TranscriptListCleaner import TranscriptListCleaner
+from SMART.Java.Python.misc.Progress import Progress
+from SMART.Java.Python.misc.UnlimitedProgress import UnlimitedProgress
+
+
+class DefaultCleaner(TranscriptListCleaner):
+
+ def __init__(self, verbosity = 1):
+ super(DefaultCleaner, self).__init__(verbosity)
+
+ def _clean(self):
+ self.outputHandle.write(self.inputHandle.read())
b
diff -r d22fadc825e3 -r 2c0c0a89fad7 SMART/Java/Python/cleaning/GffCleaner.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/SMART/Java/Python/cleaning/GffCleaner.py Thu May 02 09:56:47 2013 -0400
[
@@ -0,0 +1,168 @@
+#! /usr/bin/env python
+#
+# Copyright INRA-URGI 2009-2010
+# 
+# This software is governed by the CeCILL license under French law and
+# abiding by the rules of distribution of free software. You can use,
+# modify and/ or redistribute the software under the terms of the CeCILL
+# license as circulated by CEA, CNRS and INRIA at the following URL
+# "http://www.cecill.info".
+# 
+# As a counterpart to the access to the source code and rights to copy,
+# modify and redistribute granted by the license, users are provided only
+# with a limited warranty and the software's author, the holder of the
+# economic rights, and the successive licensors have only limited
+# liability.
+# 
+# In this respect, the user's attention is drawn to the risks associated
+# with loading, using, modifying and/or developing or reproducing the
+# software by the user in light of its specific status of free software,
+# that may mean that it is complicated to manipulate, and that also
+# therefore means that it is reserved for developers and experienced
+# professionals having in-depth computer knowledge. Users are therefore
+# encouraged to load and test the software's suitability as regards their
+# requirements in conditions enabling the security of their systems and/or
+# data to be ensured and, more generally, to use and operate it in the
+# same conditions as regards security.
+# 
+# The fact that you are presently reading this means that you have had
+# knowledge of the CeCILL license and that you accept its terms.
+#
+"""
+Clean a GFF file (as given by NCBI or TAIR) and outputs a GFF3 file.
+"""
+
+from SMART.Java.Python.cleaning.TranscriptListCleaner import TranscriptListCleaner
+from SMART.Java.Python.misc.Progress import Progress
+from SMART.Java.Python.misc.UnlimitedProgress import UnlimitedProgress
+
+count = {}
+
+class ParsedLine(object):
+ def __init__(self, line, cpt):
+ self.line = line
+ self.cpt  = cpt
+ self.parse()
+
+ def parse(self):
+ self.line = self.line.strip()
+ self.splittedLine = self.line.split(None, 8)
+ if len(self.splittedLine) < 9:
+ raise Exception("Line '%s' has less than 9 fields.  Exiting..." % (self.line))
+ self.type = self.splittedLine[2]
+ self.parseOptions()
+ self.getId()
+ self.getParents()
+
+ def parseOptions(self):
+ self.parsedOptions = {}
+ for option in self.splittedLine[8].split(";"):
+ option = option.strip()
+ if option == "": continue
+ posSpace = option.find(" ")
+ posEqual = option.find("=")
+ if posEqual != -1 and (posEqual < posSpace or posSpace == -1):
+ key, value = option.split("=", 1)
+ elif posSpace != -1:
+ key, value = option.split(None, 1)
+ else:
+ key   = "ID"
+ value = option
+ self.parsedOptions[key.strip()] = value.strip(" \"")
+
+ def getId(self):
+ for key in self.parsedOptions:
+ if key.lower() == "id":
+ self.id = self.parsedOptions[key]
+ return
+ if "Parent" in self.parsedOptions:
+ parent = self.parsedOptions["Parent"].split(",")[0]
+ if parent not in count:
+ count[parent] = {}
+ if self.type not in count[parent]:
+ count[parent][self.type] = 0
+ count[parent][self.type] += 1
+ self.id = "%s-%s-%d" % (parent, self.type, count[parent][self.type])
+ else:
+ self.id = "smart%d" % (self.cpt)
+ self.parsedOptions["ID"] = self.id
+
+ def getParents(self):
+ for key in self.parsedOptions:
+ if key.lower() in ("parent", "derives_from"):
+ self.parents = self.parsedOptions[key].split(",")
+ return
+ self.parents = None
+
+ def removeParent(self):
+ for key in self.parsedOptions.keys():
+ if key.lower() in ("parent", "derives_from"):
+ del self.parsedOptions[key]
+
+ def export(self):
+ self.splittedLine[8] = ";".join(["%s=%s" % (key, value) for key, value in self.parsedOptions.iteritems()])
+ return "%s\n" % ("\t".join(self.splittedLine))
+
+
+class GffCleaner(TranscriptListCleaner):
+
+ def __init__(self, verbosity = 1):
+ super(GffCleaner, self).__init__(verbosity)
+ self.lines  = {}
+ self.acceptedTypes = ["mRNA", "transcript", "exon"]
+ self.parents    = []
+ self.children   = {}
+
+ def getFileFormats():
+ return ["gff", "gff2", "gff3"]
+ getFileFormats = staticmethod(getFileFormats)
+
+ def setAcceptedTypes(self, types):
+ self.acceptedTypes = types
+
+ def parse(self):
+ progress = UnlimitedProgress(100000, "Reading input file", self.verbosity)
+ for cpt, line in enumerate(self.inputHandle):
+ if not line or line[0] == "#": continue
+ if line[0] == ">": break
+ parsedLine = ParsedLine(line, cpt)
+ if self.acceptedTypes == None or parsedLine.type in self.acceptedTypes:
+ self.lines[parsedLine.id] = parsedLine
+ progress.inc()
+ progress.done()
+
+ def sort(self):
+ progress = Progress(len(self.lines.keys()), "Sorting file", self.verbosity)
+ for line in self.lines.values():
+ parentFound = False
+ if line.parents:
+ for parent in line.parents:
+ if parent in self.lines:
+ parentFound = True
+ if parent in self.children:
+ self.children[parent].append(line)
+ else:
+ self.children[parent] = [line]
+ if not parentFound:
+ line.removeParent()
+ self.parents.append(line)
+ progress.inc()
+ progress.done()
+
+ def write(self):
+ progress = Progress(len(self.parents), "Writing output file", self.verbosity)
+ for line in self.parents:
+ self.writeLine(line)
+ progress.inc()
+ progress.done()
+
+ def writeLine(self, line):
+ self.outputHandle.write(line.export())
+ if line.id in self.children:
+ for child in self.children[line.id]:
+ self.writeLine(child)
+
+ def _clean(self):
+ self.parse()
+ self.sort()
+ self.write()
b
diff -r d22fadc825e3 -r 2c0c0a89fad7 SMART/Java/Python/cleaning/GtfCleaner.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/SMART/Java/Python/cleaning/GtfCleaner.py Thu May 02 09:56:47 2013 -0400
[
@@ -0,0 +1,121 @@
+#! /usr/bin/env python
+#
+# Copyright INRA-URGI 2009-2010
+# 
+# This software is governed by the CeCILL license under French law and
+# abiding by the rules of distribution of free software. You can use,
+# modify and/ or redistribute the software under the terms of the CeCILL
+# license as circulated by CEA, CNRS and INRIA at the following URL
+# "http://www.cecill.info".
+# 
+# As a counterpart to the access to the source code and rights to copy,
+# modify and redistribute granted by the license, users are provided only
+# with a limited warranty and the software's author, the holder of the
+# economic rights, and the successive licensors have only limited
+# liability.
+# 
+# In this respect, the user's attention is drawn to the risks associated
+# with loading, using, modifying and/or developing or reproducing the
+# software by the user in light of its specific status of free software,
+# that may mean that it is complicated to manipulate, and that also
+# therefore means that it is reserved for developers and experienced
+# professionals having in-depth computer knowledge. Users are therefore
+# encouraged to load and test the software's suitability as regards their
+# requirements in conditions enabling the security of their systems and/or
+# data to be ensured and, more generally, to use and operate it in the
+# same conditions as regards security.
+# 
+# The fact that you are presently reading this means that you have had
+# knowledge of the CeCILL license and that you accept its terms.
+#
+"""
+Clean a GTF file
+"""
+
+import shlex
+from SMART.Java.Python.cleaning.TranscriptListCleaner import TranscriptListCleaner
+from SMART.Java.Python.misc.Progress import Progress
+from SMART.Java.Python.misc.UnlimitedProgress import UnlimitedProgress
+
+count = {}
+
+class ParsedLine(object):
+ def __init__(self, line, cpt):
+ self.line = line
+ self.cpt  = cpt
+ self.parse()
+
+ def parse(self):
+ self.line = self.line.strip()
+ self.splittedLine = self.line.split(None, 8)
+ if len(self.splittedLine) < 9:
+ raise Exception("Line '%s' has less than 9 fields.  Exiting..." % (self.line))
+ self.type = self.splittedLine[2]
+ self.parseOptions()
+
+ def parseOptions(self):
+ self.parsedOptions = {}
+ key   = None
+ value = ""
+ for option in shlex.split(self.splittedLine[8]):
+ option = option.strip()
+ if option == "": continue
+ if key == None:
+ key = option
+ else:
+ endValue = False
+ if option[-1] == ";":
+ endValue = True
+ option.rstrip(";")
+ value = "%s \"%s\"" % (value, option)
+ if endValue:
+ self.parsedOptions[key] = value
+ if key == "transcript_id":
+ self.transcriptId = value
+ key   = None
+ value = ""
+
+ def export(self):
+ return "%s\n" % (self.line)
+
+
+class GtfCleaner(TranscriptListCleaner):
+
+ def __init__(self, verbosity = 1):
+ super(GtfCleaner, self).__init__(verbosity)
+ self.acceptedTypes = ["exon"]
+ self.parents    = {}
+
+ def getFileFormats():
+ return ["gtf"]
+ getFileFormats = staticmethod(getFileFormats)
+
+ def setAcceptedTypes(self, types):
+ self.acceptedTypes = types
+
+ def parse(self):
+ progress = UnlimitedProgress(100000, "Reading input file", self.verbosity)
+ for cpt, line in enumerate(self.inputHandle):
+ if not line or line[0] == "#": continue
+ parsedLine = ParsedLine(line, cpt)
+ if self.acceptedTypes == None or parsedLine.type in self.acceptedTypes:
+ transcriptId = parsedLine.transcriptId
+ if transcriptId not in self.parents:
+ self.parents[parsedLine.transcriptId] = [parsedLine]
+ else:
+ self.parents[parsedLine.transcriptId].append(parsedLine)
+ progress.inc()
+ progress.done()
+
+ def write(self):
+ progress = Progress(len(self.parents.keys()), "Writing output file", self.verbosity)
+ for parent in sorted(self.parents.keys()):
+ for line in self.parents[parent]:
+ self.outputHandle.write(line.export())
+ progress.inc()
+ progress.done()
+
+ def _clean(self):
+ self.parse()
+ self.write()
+
b
diff -r d22fadc825e3 -r 2c0c0a89fad7 SMART/Java/Python/cleaning/TranscriptListCleaner.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/SMART/Java/Python/cleaning/TranscriptListCleaner.py Thu May 02 09:56:47 2013 -0400
b
@@ -0,0 +1,63 @@
+#
+# Copyright INRA-URGI 2009-2010
+# 
+# This software is governed by the CeCILL license under French law and
+# abiding by the rules of distribution of free software. You can use,
+# modify and/ or redistribute the software under the terms of the CeCILL
+# license as circulated by CEA, CNRS and INRIA at the following URL
+# "http://www.cecill.info".
+# 
+# As a counterpart to the access to the source code and rights to copy,
+# modify and redistribute granted by the license, users are provided only
+# with a limited warranty and the software's author, the holder of the
+# economic rights, and the successive licensors have only limited
+# liability.
+# 
+# In this respect, the user's attention is drawn to the risks associated
+# with loading, using, modifying and/or developing or reproducing the
+# software by the user in light of its specific status of free software,
+# that may mean that it is complicated to manipulate, and that also
+# therefore means that it is reserved for developers and experienced
+# professionals having in-depth computer knowledge. Users are therefore
+# encouraged to load and test the software's suitability as regards their
+# requirements in conditions enabling the security of their systems and/or
+# data to be ensured and, more generally, to use and operate it in the
+# same conditions as regards security.
+# 
+# The fact that you are presently reading this means that you have had
+# knowledge of the CeCILL license and that you accept its terms.
+#
+import sys
+from SMART.Java.Python.structure.TranscriptList import TranscriptList
+from SMART.Java.Python.misc.Progress import Progress
+from SMART.Java.Python.misc.UnlimitedProgress import UnlimitedProgress
+
+class TranscriptListCleaner(object):
+ """A (quite generic) class that cleans a file containing transcripts"""
+
+ def __init__(self, verbosity = 0):
+ self.verbosity = verbosity
+
+ def setInputFileName(self, fileName):
+ try:
+ self.inputHandle = open(fileName)
+ except IOError:
+ raise Exception("Error! Transcript file '%s' does not exist! Exiting..." % (self.fileName))
+
+ def setOutputFileName(self, fileName):
+ try:
+ self.outputHandle = open(fileName, "w")
+ except IOError:
+ raise Exception("Error! Transcript file '%s' does not exist! Exiting..." % (self.fileName))
+
+ def getFileFormats():
+ pass
+ getFileFormats = staticmethod(getFileFormats)
+
+ def close(self):
+ self.inputHandle.close()
+ self.outputHandle.close()
+
+ def clean(self):
+ self._clean()
+ self.close()
b
diff -r d22fadc825e3 -r 2c0c0a89fad7 SMART/Java/Python/clusterize.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/SMART/Java/Python/clusterize.py Thu May 02 09:56:47 2013 -0400
[
b'@@ -0,0 +1,185 @@\n+#! /usr/bin/env python\n+#\n+# Copyright INRA-URGI 2009-2010\n+# \n+# This software is governed by the CeCILL license under French law and\n+# abiding by the rules of distribution of free software. You can use,\n+# modify and/ or redistribute the software under the terms of the CeCILL\n+# license as circulated by CEA, CNRS and INRIA at the following URL\n+# "http://www.cecill.info".\n+# \n+# As a counterpart to the access to the source code and rights to copy,\n+# modify and redistribute granted by the license, users are provided only\n+# with a limited warranty and the software\'s author, the holder of the\n+# economic rights, and the successive licensors have only limited\n+# liability.\n+# \n+# In this respect, the user\'s attention is drawn to the risks associated\n+# with loading, using, modifying and/or developing or reproducing the\n+# software by the user in light of its specific status of free software,\n+# that may mean that it is complicated to manipulate, and that also\n+# therefore means that it is reserved for developers and experienced\n+# professionals having in-depth computer knowledge. Users are therefore\n+# encouraged to load and test the software\'s suitability as regards their\n+# requirements in conditions enabling the security of their systems and/or\n+# data to be ensured and, more generally, to use and operate it in the\n+# same conditions as regards security.\n+# \n+# The fact that you are presently reading this means that you have had\n+# knowledge of the CeCILL license and that you accept its terms.\n+#\n+from commons.core.writer.WriterChooser import WriterChooser\n+"""Clusterize a set of transcripts"""\n+\n+import os, os.path, random\n+from optparse import OptionParser\n+from commons.core.parsing.ParserChooser import ParserChooser\n+from commons.core.writer.Gff3Writer import Gff3Writer\n+from SMART.Java.Python.structure.Transcript import Transcript\n+from SMART.Java.Python.ncList.NCListFilePickle import NCListFileUnpickle\n+from SMART.Java.Python.ncList.FileSorter import FileSorter\n+from SMART.Java.Python.misc.Progress import Progress\n+from SMART.Java.Python.misc.UnlimitedProgress import UnlimitedProgress\n+\n+class Clusterize(object):\n+\n+\tdef __init__(self, verbosity):\n+\t\tself.normalize\t\t = False\n+\t\tself.presorted\t\t = False\n+\t\tself.distance\t\t  = 1\n+\t\tself.colinear\t\t  = False\n+\t\tself.nbWritten\t\t = 0\n+\t\tself.nbMerges\t\t  = 0\n+\t\tself.verbosity\t\t = verbosity\n+\t\tself.splittedFileNames = {}\n+\n+\tdef __del__(self):\n+\t\tfor fileName in self.splittedFileNames.values():\n+\t\t\tos.remove(fileName)\n+\n+\tdef setInputFile(self, fileName, format):\n+\t\tparserChooser = ParserChooser(self.verbosity)\n+\t\tparserChooser.findFormat(format)\n+\t\tself.parser = parserChooser.getParser(fileName)\n+\t\tself.sortedFileName = "%s_sorted_%d.pkl" % (os.path.splitext(fileName)[0], random.randint(1, 100000))\n+\t\tif "SMARTTMPPATH" in os.environ:\n+\t\t\tself.sortedFileName = os.path.join(os.environ["SMARTTMPPATH"], os.path.basename(self.sortedFileName))\n+\n+\tdef setOutputFileName(self, fileName, format="gff3", title="S-MART", feature="transcript", featurePart="exon"):\n+\t\twriterChooser = WriterChooser()\n+\t\twriterChooser.findFormat(format)\n+\t\tself.writer = writerChooser.getWriter(fileName)\n+\t\tself.writer.setTitle(title)\n+\t\tself.writer.setFeature(feature)\n+\t\tself.writer.setFeaturePart(featurePart)\n+\n+\tdef setDistance(self, distance):\n+\t\tself.distance = distance\n+\n+\tdef setColinear(self, colinear):\n+\t\tself.colinear = colinear\n+\n+\tdef setNormalize(self, normalize):\n+\t\tself.normalize = normalize\n+\t\t\n+\tdef setPresorted(self, presorted):\n+\t\tself.presorted = presorted\n+\n+\tdef _sortFile(self):\n+\t\tif self.presorted:\n+\t\t\treturn\n+\t\tfs = FileSorter(self.parser, self.verbosity-4)\n+\t\tfs.perChromosome(True)\n+\t\tfs.setPresorted(self.presorted)\n+\t\tfs.setOutputFileName(self.sortedFileName)\n+\t\tfs.sort()\n+\t\tself.splittedFileNames       = fs.getOutputFileNames()\n+\t\tself.nbElementsPerChromosome = fs.getNbElementsPerChromosome()\n+\t\tself.nbElements              = fs.getNbElements()\n+\t\t\n+\tdef _iterat'..b'ipts = []\n+\t\t\tif newTranscript.__class__.__name__ == "Mapping":\n+\t\t\t\tnewTranscript = newTranscript.getTranscript()\n+\t\t\tfor oldTranscript in transcripts:\n+\t\t\t\tif self._checkOverlap(newTranscript, oldTranscript):\n+\t\t\t\t\tself._merge(newTranscript, oldTranscript)\n+\t\t\t\telif self._checkPassed(newTranscript, oldTranscript):\n+\t\t\t\t\tself._write(oldTranscript)\n+\t\t\t\telse:\n+\t\t\t\t\tnewTranscripts.append(oldTranscript)\n+\t\t\tnewTranscripts.append(newTranscript)\n+\t\t\ttranscripts = newTranscripts\n+\t\t\tself.nbElements += 1\n+\t\t\tprogress.inc()\n+\t\tfor transcript in transcripts:\n+\t\t\tself._write(transcript)\n+\t\tprogress.done()\n+\n+\tdef _merge(self, transcript1, transcript2):\n+\t\tself.nbMerges += 1\n+\t\ttranscript2.setDirection(transcript1.getDirection())\n+\t\ttranscript1.merge(transcript2)\n+\n+\tdef _write(self, transcript):\n+\t\tself.nbWritten += 1\n+\t\tself.writer.addTranscript(transcript)\n+\n+\tdef _checkOverlap(self, transcript1, transcript2):\n+\t\tif transcript1.getChromosome() != transcript2.getChromosome():\n+\t\t\treturn False\n+\t\tif self.colinear and transcript1.getDirection() != transcript2.getDirection():\n+\t\t\treturn False\n+\t\tif transcript1.getDistance(transcript2) > self.distance:\n+\t\t\treturn False\n+\t\treturn True\n+\n+\tdef _checkPassed(self, transcript1, transcript2):\n+\t\treturn ((transcript1.getChromosome() != transcript2.getChromosome()) or (transcript1.getDistance(transcript2) > self.distance))\n+\n+\tdef run(self):\n+\t\tself._sortFile()\n+\t\tif self.presorted:\n+\t\t\tself._iterate(None)\n+\t\telse:\n+\t\t\tfor chromosome in sorted(self.splittedFileNames.keys()):\n+\t\t\t\tself._iterate(chromosome)\n+\t\tself.writer.close()\n+\t\tif self.verbosity > 0:\n+\t\t\tprint "# input:   %d" % (self.nbElements)\n+\t\t\tprint "# written: %d (%d%% overlaps)" % (self.nbWritten, 0 if (self.nbElements == 0) else ((float(self.nbWritten) / self.nbElements) * 100))\n+\t\t\tprint "# merges:  %d" % (self.nbMerges)\n+\t\t\n+\n+if __name__ == "__main__":\n+\tdescription = "Clusterize v1.0.3: clusterize the data which overlap. [Category: Merge]"\n+\n+\tparser = OptionParser(description = description)\n+\tparser.add_option("-i", "--input",     dest="inputFileName",  action="store",\t\t\t\t     type="string", help="input file [compulsory] [format: file in transcript format given by -f]")\n+\tparser.add_option("-f", "--format",    dest="format",\t\t action="store",\t\t\t\t     type="string", help="format of file [format: transcript file format]")\n+\tparser.add_option("-o", "--output",    dest="outputFileName", action="store",\t\t\t\t     type="string", help="output file [compulsory] [format: output file in transcript format given by -u]")\n+\tparser.add_option("-u", "--outputFormat", dest="outputFormat", action="store",     default="gff",\t\t     type="string", help="output file format [format: transcript file format]")\n+\tparser.add_option("-c", "--colinear",  dest="colinear",       action="store_true", default=False,\t\t\t\thelp="merge colinear transcripts only [format: bool] [default: false]")\n+\tparser.add_option("-d", "--distance",  dest="distance",       action="store",      default=0,     type="int",    help="max. distance between two transcripts to be merged [format: int] [default: 0]")\n+\tparser.add_option("-n", "--normalize", dest="normalize",      action="store_true", default=False,\t\t\t\thelp="normalize the number of reads per cluster by the number of mappings per read [format: bool] [default: false]")\n+\tparser.add_option("-s", "--sorted",    dest="sorted",\t\t action="store_true", default=False,\t\t\t\thelp="input is already sorted [format: bool] [default: false]")\n+\tparser.add_option("-v", "--verbosity", dest="verbosity",      action="store",      default=1,     type="int",    help="trace level [format: int] [default: 1]")\n+\t(options, args) = parser.parse_args()\n+\n+\tc = Clusterize(options.verbosity)\n+\tc.setInputFile(options.inputFileName, options.format)\n+\tc.setOutputFileName(options.outputFileName, options.outputFormat)\n+\tc.setColinear(options.colinear)\n+\tc.setDistance(options.distance)\n+\tc.setNormalize(options.normalize)\n+\tc.setPresorted(options.sorted)\n+\tc.run()\n'
b
diff -r d22fadc825e3 -r 2c0c0a89fad7 SMART/Java/Python/clusterizeBySlidingWindows.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/SMART/Java/Python/clusterizeBySlidingWindows.py Thu May 02 09:56:47 2013 -0400
[
b'@@ -0,0 +1,344 @@\n+#! /usr/bin/env python\n+#\n+# Copyright INRA-URGI 2009-2010\n+# \n+# This software is governed by the CeCILL license under French law and\n+# abiding by the rules of distribution of free software. You can use,\n+# modify and/ or redistribute the software under the terms of the CeCILL\n+# license as circulated by CEA, CNRS and INRIA at the following URL\n+# "http://www.cecill.info".\n+# \n+# As a counterpart to the access to the source code and rights to copy,\n+# modify and redistribute granted by the license, users are provided only\n+# with a limited warranty and the software\'s author, the holder of the\n+# economic rights, and the successive licensors have only limited\n+# liability.\n+# \n+# In this respect, the user\'s attention is drawn to the risks associated\n+# with loading, using, modifying and/or developing or reproducing the\n+# software by the user in light of its specific status of free software,\n+# that may mean that it is complicated to manipulate, and that also\n+# therefore means that it is reserved for developers and experienced\n+# professionals having in-depth computer knowledge. Users are therefore\n+# encouraged to load and test the software\'s suitability as regards their\n+# requirements in conditions enabling the security of their systems and/or\n+# data to be ensured and, more generally, to use and operate it in the\n+# same conditions as regards security.\n+# \n+# The fact that you are presently reading this means that you have had\n+# knowledge of the CeCILL license and that you accept its terms.\n+#\n+import re\n+from commons.core.writer.WriterChooser import WriterChooser\n+"""\n+Cluster the data into regions (defined by size and overlap with next region) and keep only highest peaks.\n+"""\n+\n+import os, os.path\n+from optparse import OptionParser\n+from SMART.Java.Python.structure.Transcript import Transcript\n+from SMART.Java.Python.structure.TranscriptContainer import TranscriptContainer\n+from SMART.Java.Python.misc.RPlotter import RPlotter\n+from SMART.Java.Python.misc.Progress import Progress\n+from commons.core.writer.Gff3Writer import Gff3Writer\n+\n+class ClusterizeBySlidingWindows(object):\n+\n+    def __init__(self, verbosity = 0):\n+        self.verbosity = verbosity\n+        self.strands   = (0, )\n+        self.normalize = False\n+        self.plot      = None\n+        self.excel     = None\n+        self.outputFileName = \'\'\n+        self.defaultValue = None\n+\n+    def __del__(self):\n+        pass\n+\n+    def setInputFile(self, fileName, format):\n+        self.parser = TranscriptContainer(fileName, format, self.verbosity)\n+\n+    def setOutputFileName(self, fileName, format="gff", title="S-MART", feature="transcript", featurePart="exon"):\n+        writerChooser = WriterChooser(self.verbosity)\n+        writerChooser.findFormat(format)\n+        self.writer = writerChooser.getWriter(fileName)\n+        self.writer.setTitle(title)\n+        self.writer.setFeature(feature)\n+        self.writer.setFeaturePart(featurePart)\n+#        self.outputFileName = fileName\n+#        self.outputFormat = format\n+\n+    def setWindowSize(self, size):\n+        self.size = size\n+\n+    def setWindowOverlap(self, overlap):\n+        self.overlap = overlap\n+\n+    def setTag(self, tag):\n+        self.tag = tag\n+\n+    def setOperation(self, operation):\n+        self.operation = operation\n+\n+    def setBothStrands(self, bothStrands):\n+        if bothStrands:\n+            self.strands = (-1, 1)\n+\n+    def setNormalize(self, normalize):\n+        self.normalize = normalize\n+\n+    def setPlot(self, plot):\n+        self.plot = plot\n+\n+    def setExcel(self, excel):\n+        self.excel = excel\n+\n+    def setOutputTag(self, tag):\n+        self.outputTagName = tag\n+        \n+    def setDefaultValue(self, defaultValue):\n+        self.defaultValue = defaultValue\n+\n+    def checkOptions(self):\n+#        if self.operation != None:\n+#            raise Exception("Trying to combine the values without specifying tag! Aborting...")\n+        if self.operation != '..b'lf.excel:\n+            self.writeExcel()\n+        if self.plot:\n+            self.plotData()\n+        self.printRegions()\n+\n+\n+if __name__ == "__main__":\n+    \n+    # parse command line\n+    description = "Clusterize by Sliding Windows v1.0.1: Produces a GFF3 file that clusters a list of transcripts using a sliding window. [Category: Sliding Windows]"\n+\n+    parser = OptionParser(description = description)\n+    parser.add_option("-i", "--input",       dest="inputFileName",  action="store",                     type="string", help="input file [compulsory] [format: file in transcript format given by -f]")\n+    parser.add_option("-f", "--inputFormat", dest="inputFormat",    action="store",                     type="string", help="format of the input file [compulsory] [format: transcript file format]")\n+    parser.add_option("-o", "--output",      dest="outputFileName", action="store",                     type="string", help="output file [compulsory] [format: output file in transcript format given by -u]")\n+    parser.add_option("-u", "--outputFormat", dest="outputFormat",  action="store",     default="gff",  type="string", help="format of the output file [format: transcript file format]")\n+    parser.add_option("-s", "--size",        dest="size",           action="store",                     type="int",    help="size of the regions [compulsory] [format: int]")\n+    parser.add_option("-e", "--overlap",     dest="overlap",        action="store",                     type="int",    help="overlap between two consecutive regions [compulsory] [format: int]")\n+    parser.add_option("-m", "--normalize",   dest="normalize",      action="store_true", default=False,                help="normalize the number of reads per cluster by the number of mappings per read [format: bool] [default: false]")\n+    parser.add_option("-g", "--tag",         dest="tag",            action="store",      default=None,  type="string", help="use a given tag as input (instead of summing number of features) [format: string]")    \n+    parser.add_option("-r", "--operation",   dest="operation",      action="store",      default=None,  type="string", help="combine tag value with given operation [format: choice (sum, avg, med, min, max)]")\n+    parser.add_option("-d", "--defaultValue",dest="defaultValue",   action="store",                     type="float",    help="default value for input tag [format: float]")\n+    parser.add_option("-w", "--write",       dest="writeTag",       action="store",      default=None,  type="string", help="print the result in the given tag (default usually is \'nbElements\') [format: string]")    \n+    parser.add_option("-2", "--strands",     dest="strands",        action="store_true", default=False,                help="consider the two strands separately [format: bool] [default: false]")\n+    parser.add_option("-p", "--plot",        dest="plot",           action="store",      default=None,  type="string", help="plot regions to the given file [format: output file in PNG format]")\n+    parser.add_option("-x", "--excel",       dest="excel",          action="store",      default=None,  type="string", help="write an Excel file to the given file [format: output file in Excel format]")\n+    parser.add_option("-v", "--verbosity",   dest="verbosity",      action="store",      default=1,     type="int",    help="trace level [format: int] [default: 1]")\n+    (options, args) = parser.parse_args()\n+\n+    cbsw = ClusterizeBySlidingWindows(options.verbosity)\n+    cbsw.setInputFile(options.inputFileName, options.inputFormat)\n+    cbsw.setOutputFileName(options.outputFileName, options.outputFormat)\n+    cbsw.setWindowSize(options.size)\n+    cbsw.setWindowOverlap(options.overlap)\n+    cbsw.setTag(options.tag)\n+    cbsw.setDefaultValue(options.defaultValue)\n+    cbsw.setOperation(options.operation)\n+    cbsw.setOutputTag(options.writeTag)\n+    cbsw.setBothStrands(options.strands)\n+    cbsw.setPlot(options.plot)\n+    cbsw.setExcel(options.excel)\n+    cbsw.run()\n'
b
diff -r d22fadc825e3 -r 2c0c0a89fad7 SMART/Java/Python/compareOverlapping.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/SMART/Java/Python/compareOverlapping.py Thu May 02 09:56:47 2013 -0400
[
b'@@ -0,0 +1,126 @@\n+#! /usr/bin/env python\n+#\n+# Copyright INRA-URGI 2009-2010\n+# \n+# This software is governed by the CeCILL license under French law and\n+# abiding by the rules of distribution of free software. You can use,\n+# modify and/ or redistribute the software under the terms of the CeCILL\n+# license as circulated by CEA, CNRS and INRIA at the following URL\n+# "http://www.cecill.info".\n+# \n+# As a counterpart to the access to the source code and rights to copy,\n+# modify and redistribute granted by the license, users are provided only\n+# with a limited warranty and the software\'s author, the holder of the\n+# economic rights, and the successive licensors have only limited\n+# liability.\n+# \n+# In this respect, the user\'s attention is drawn to the risks associated\n+# with loading, using, modifying and/or developing or reproducing the\n+# software by the user in light of its specific status of free software,\n+# that may mean that it is complicated to manipulate, and that also\n+# therefore means that it is reserved for developers and experienced\n+# professionals having in-depth computer knowledge. Users are therefore\n+# encouraged to load and test the software\'s suitability as regards their\n+# requirements in conditions enabling the security of their systems and/or\n+# data to be ensured and, more generally, to use and operate it in the\n+# same conditions as regards security.\n+# \n+# The fact that you are presently reading this means that you have had\n+# knowledge of the CeCILL license and that you accept its terms.\n+#\n+"""Compare overlap of two transcript lists"""\n+import sys\n+import os\n+from optparse import OptionParser\n+from SMART.Java.Python.misc import Utils\n+from SMART.Java.Python.structure.TranscriptContainer import TranscriptContainer\n+from commons.core.writer.TranscriptWriter import TranscriptWriter\n+from SMART.Java.Python.structure.TranscriptListsComparator import TranscriptListsComparator\n+from SMART.Java.Python.misc.RPlotter import RPlotter\n+from commons.core.writer.Gff3Writer import Gff3Writer\n+\n+class CompareOverlapping(object):\n+\n+    def __init__(self):\n+        self._options = None\n+\n+\n+    def setAttributesFromCmdLine(self):\n+        description = "Compare Overlapping v1.0.3: Get the data which overlap with a reference set. [Category: Data Comparison]"\n+\n+        parser = OptionParser(description = description)\n+        parser.add_option("-i", "--input1",           dest="inputFileName1", action="store",                     type="string", help="input file 1 [compulsory] [format: file in transcript format given by -f]")\n+        parser.add_option("-f", "--format1",          dest="format1",        action="store",                     type="string", help="format of file 1 [compulsory] [format: transcript file format]")\n+        parser.add_option("-j", "--input2",           dest="inputFileName2", action="store",                     type="string", help="input file 2 [compulsory] [format: file in transcript format given by -g]")\n+        parser.add_option("-g", "--format2",          dest="format2",        action="store",                     type="string", help="format of file 2 [compulsory] [format: transcript file format]")\n+        parser.add_option("-o", "--output",           dest="output",         action="store",      default=None,  type="string", help="output file [compulsory] [format: output file in GFF3 format]")\n+        parser.add_option("-S", "--start1",           dest="start1",         action="store",      default=None,  type="int",    help="only consider the n first nucleotides of the transcripts in file 1 (do not use it with -U) [format: int]")\n+        parser.add_option("-s", "--start2",           dest="start2",         action="store",      default=None,  type="int",    help="only consider the n first nucleotides of the transcripts in file 2 (do not use it with -u) [format: int]")\n+        parser.add_option("-U", "--end1",             dest="end1",           action="store",      default=None,  type="int'..b'pping",   dest="notOverlapping", action="store_true", default=False,                help="also output not overlapping data [format: bool] [default: false]")\n+        parser.add_option("-x", "--exclude",          dest="exclude",        action="store_true", default=False,                help="invert the match [format: bool] [default: false]")\n+        parser.add_option("-v", "--verbosity",        dest="verbosity",      action="store",      default=1,     type="int",    help="trace level [format: int]")\n+        parser.add_option("-l", "--log",              dest="log",            action="store_true", default=False,                help="write a log file [format: bool] [default: false]")\n+        (self._options, args) = parser.parse_args()\n+\n+\n+    def run(self):             \n+        logHandle = None\n+        if self._options.log:\n+            logHandle = open(self._options.output, "w")\n+\n+        transcriptContainer1 = TranscriptContainer(self._options.inputFileName1, self._options.format1, self._options.verbosity)\n+        transcriptContainer2 = TranscriptContainer(self._options.inputFileName2, self._options.format2, self._options.verbosity)\n+        writer               = TranscriptWriter(self._options.output, "gff3", self._options.verbosity)\n+\n+        transcriptListComparator = TranscriptListsComparator(logHandle, self._options.verbosity)\n+        transcriptListComparator.restrictToStart(transcriptListComparator.QUERY, self._options.start1)\n+        transcriptListComparator.restrictToStart(transcriptListComparator.REFERENCE, self._options.start2)\n+        transcriptListComparator.restrictToEnd(transcriptListComparator.QUERY, self._options.end1)\n+        transcriptListComparator.restrictToEnd(transcriptListComparator.REFERENCE, self._options.end2)\n+        transcriptListComparator.extendFivePrime(transcriptListComparator.QUERY, self._options.fivePrime1)\n+        transcriptListComparator.extendFivePrime(transcriptListComparator.REFERENCE, self._options.fivePrime2)\n+        transcriptListComparator.extendThreePrime(transcriptListComparator.QUERY, self._options.threePrime1)\n+        transcriptListComparator.extendThreePrime(transcriptListComparator.REFERENCE, self._options.threePrime2)\n+        transcriptListComparator.acceptIntrons(transcriptListComparator.QUERY, self._options.introns)\n+        transcriptListComparator.acceptIntrons(transcriptListComparator.REFERENCE, self._options.introns)\n+        transcriptListComparator.getAntisenseOnly(self._options.antisense)\n+        transcriptListComparator.getColinearOnly(self._options.colinear)\n+        transcriptListComparator.getInvert(self._options.exclude)\n+        transcriptListComparator.setMaxDistance(self._options.distance)\n+        transcriptListComparator.setMinOverlap(self._options.minOverlap)\n+        transcriptListComparator.setPcOverlap(self._options.pcOverlap)\n+        transcriptListComparator.setIncludedOnly(self._options.included)\n+        transcriptListComparator.setIncludingOnly(self._options.including)\n+        transcriptListComparator.includeNotOverlapping(self._options.notOverlapping)\n+        transcriptListComparator.computeOdds(True)\n+        transcriptListComparator.setInputTranscriptContainer(transcriptListComparator.QUERY, transcriptContainer1)\n+        transcriptListComparator.setInputTranscriptContainer(transcriptListComparator.REFERENCE, transcriptContainer2)\n+        transcriptListComparator.setOutputWriter(writer)\n+        transcriptListComparator.compareTranscriptList()\n+\n+        if self._options.log:\n+            logHandle.close()\n+\n+        if not self._options.exclude:\n+            odds = transcriptListComparator.getOdds()\n+            if self._options.verbosity > 0 and odds:\n+                print "min/avg/med/max transcripts: %d/%.2f/%.1f/%d" % Utils.getMinAvgMedMax(odds)\n+                \n+if __name__ == "__main__":\n+    icompareOverlapping = CompareOverlapping()\n+    icompareOverlapping.setAttributesFromCmdLine()\n+    icompareOverlapping.run()\n'
b
diff -r d22fadc825e3 -r 2c0c0a89fad7 SMART/Java/Python/convertTranscriptFile.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/SMART/Java/Python/convertTranscriptFile.py Thu May 02 09:56:47 2013 -0400
[
@@ -0,0 +1,115 @@
+#! /usr/bin/env python
+#
+# Copyright INRA-URGI 2009-2010
+# 
+# This software is governed by the CeCILL license under French law and
+# abiding by the rules of distribution of free software. You can use,
+# modify and/ or redistribute the software under the terms of the CeCILL
+# license as circulated by CEA, CNRS and INRIA at the following URL
+# "http://www.cecill.info".
+# 
+# As a counterpart to the access to the source code and rights to copy,
+# modify and redistribute granted by the license, users are provided only
+# with a limited warranty and the software's author, the holder of the
+# economic rights, and the successive licensors have only limited
+# liability.
+# 
+# In this respect, the user's attention is drawn to the risks associated
+# with loading, using, modifying and/or developing or reproducing the
+# software by the user in light of its specific status of free software,
+# that may mean that it is complicated to manipulate, and that also
+# therefore means that it is reserved for developers and experienced
+# professionals having in-depth computer knowledge. Users are therefore
+# encouraged to load and test the software's suitability as regards their
+# requirements in conditions enabling the security of their systems and/or
+# data to be ensured and, more generally, to use and operate it in the
+# same conditions as regards security.
+# 
+# The fact that you are presently reading this means that you have had
+# knowledge of the CeCILL license and that you accept its terms.
+#
+"""
+Read a transcript file and convert it to another format
+"""
+
+import os, re
+from optparse import OptionParser
+from SMART.Java.Python.structure.TranscriptContainer import TranscriptContainer
+from commons.core.writer.TranscriptWriter import TranscriptWriter
+from SMART.Java.Python.misc.Progress import Progress
+
+
+class ConvertTranscriptFile(object):
+    def __init__(self,inputFileName="", inputFormat ="", outputFileName="", outputFormat="", name="", sequenceFileName=None, strands=False, galaxy=False, feature=None, featurePart=None, verbosity=1):
+        self.inputFileName = inputFileName
+        self.inputFormat = inputFormat
+        self.outputFileName = outputFileName
+        self.outputFormat = outputFormat
+        self.name = name
+        self.sequenceFileName = sequenceFileName
+        self.strands = strands
+        self.galaxy = galaxy
+
+        self.feature=feature
+        self.featurePart=featurePart
+        
+        self.verbosity = verbosity
+         
+    def setAttributesFromCmdLine(self):
+        description = "Convert Transcript File v1.0.3: Convert a file from a format to another. [Category: Conversion]"
+        parser = OptionParser(description = description)
+        parser.add_option("-i", "--input",        dest="inputFileName",    action="store",                       type="string", help="input file [compulsory] [format: file in format given by -f]")
+        parser.add_option("-f", "--inputFormat",  dest="inputFormat",      action="store",                       type="string", help="format of the input file [compulsory] [format: transcript or mapping file format]")
+        parser.add_option("-o", "--output",       dest="outputFileName",   action="store",                       type="string", help="output file [compulsory] [format: output file in format given by -g]")
+        parser.add_option("-g", "--outputFormat", dest="outputFormat",     action="store",                       type="string", help="format of the output file [compulsory] [format: transcript file format]")
+        parser.add_option("-n", "--name",         dest="name",             action="store",      default="SMART", type="string", help="name for the transcripts [format: string] [default: SMART]")
+        parser.add_option("-s", "--sequences",    dest="sequenceFileName", action="store",      default=None,    type="string", help="give the corresponding Multi-Fasta file (useful for EMBL format) [format: string]")
+        parser.add_option("-t", "--strands",      dest="strands",          action="store_true", default=False,                  help="consider the 2 strands as different (only useful for writing WIG files) [format: bool] [default: False]")
+        parser.add_option("-v", "--verbosity",    dest="verbosity",        action="store",      default=1,       type="int",    help="trace level [format: int] [default: 1]")
+        parser.add_option("-G", "--galaxy",       dest="galaxy",           action="store_true", default=False,                  help="used for galaxy [format: bool] [default: False]")
+        (options, args) = parser.parse_args()
+        self._setAttributesFromOptions(options)
+
+    def _setAttributesFromOptions(self, options):
+        self.inputFileName = options.inputFileName
+        self.inputFormat = options.inputFormat
+        self.outputFileName = options.outputFileName
+        self.outputFormat = options.outputFormat
+        self.name = options.name  
+        self.sequenceFileName = options.sequenceFileName
+        self.strands = options.strands
+        self.galaxy =  options.galaxy
+        self.verbosity = options.verbosity
+
+    def run(self):
+        # create parser
+        parser = TranscriptContainer(self.inputFileName, self.inputFormat, self.verbosity)
+        # create writer
+        writer = TranscriptWriter(self.outputFileName, self.outputFormat, self.verbosity)
+        # connect parser and writer
+        writer.setContainer(parser)
+            
+        if self.name != None:
+            writer.setTitle(self.name)
+        if self.feature != None:
+            writer.setFeature(self.feature)
+        if self.featurePart != None:
+            writer.setFeaturePart(self.featurePart)
+        if self.sequenceFileName != None:
+            writer.addSequenceFile(self.sequenceFileName)
+            
+        nbItems = 0
+        if self.verbosity > 0:
+            nbItems = parser.getNbItems()
+            print "%i items found" % (nbItems)
+    
+        if self.strands:
+            writer.setStrands(True)
+        # convert
+        writer.write()
+        writer.close()
+
+if __name__ == "__main__":
+    iConvertTranscriptFile = ConvertTranscriptFile()
+    iConvertTranscriptFile.setAttributesFromCmdLine()
+    iConvertTranscriptFile.run()
b
diff -r d22fadc825e3 -r 2c0c0a89fad7 SMART/Java/Python/coordinatesToSequence.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/SMART/Java/Python/coordinatesToSequence.py Thu May 02 09:56:47 2013 -0400
[
@@ -0,0 +1,64 @@
+#! /usr/bin/env python
+#
+# Copyright INRA-URGI 2009-2010
+# 
+# This software is governed by the CeCILL license under French law and
+# abiding by the rules of distribution of free software. You can use,
+# modify and/ or redistribute the software under the terms of the CeCILL
+# license as circulated by CEA, CNRS and INRIA at the following URL
+# "http://www.cecill.info".
+# 
+# As a counterpart to the access to the source code and rights to copy,
+# modify and redistribute granted by the license, users are provided only
+# with a limited warranty and the software's author, the holder of the
+# economic rights, and the successive licensors have only limited
+# liability.
+# 
+# In this respect, the user's attention is drawn to the risks associated
+# with loading, using, modifying and/or developing or reproducing the
+# software by the user in light of its specific status of free software,
+# that may mean that it is complicated to manipulate, and that also
+# therefore means that it is reserved for developers and experienced
+# professionals having in-depth computer knowledge. Users are therefore
+# encouraged to load and test the software's suitability as regards their
+# requirements in conditions enabling the security of their systems and/or
+# data to be ensured and, more generally, to use and operate it in the
+# same conditions as regards security.
+# 
+# The fact that you are presently reading this means that you have had
+# knowledge of the CeCILL license and that you accept its terms.
+#
+"""Convert a list of coordinates to sequences"""
+
+from optparse import OptionParser
+from commons.core.parsing.FastaParser import FastaParser
+from SMART.Java.Python.structure.TranscriptContainer import TranscriptContainer
+from commons.core.writer.FastaWriter import FastaWriter
+from SMART.Java.Python.misc.Progress import Progress
+
+
+if __name__ == "__main__":
+    
+    # parse command line
+    description = "Coordinates to Sequences v1.0.2: Extract the sequences from a list of coordinates. [Category: Conversion]"
+
+    parser = OptionParser(description = description)
+    parser.add_option("-i", "--input", dest="inputFileName", action="store", type="string", help="input file [compulsory] [format: file in transcript format given by -f]")
+    parser.add_option("-f", "--format", dest="format", action="store", type="string", help="format of file [compulsory] [format: transcript file format]")
+    parser.add_option("-s", "--sequences", dest="sequences", action="store",  type="string", help="file that contains the sequences [compulsory] [format: file in FASTA format]")
+    parser.add_option("-o", "--output", dest="outputFileName", action="store",  default=None, type="string", help="output file (FASTA format) [format: output file in FASTA format]")
+    parser.add_option("-v", "--verbosity", dest="verbosity", action="store", default=1, type="int", help="trace level [format: int]")
+    (options, args) = parser.parse_args()
+
+    # create parser
+    parser = TranscriptContainer(options.inputFileName, options.format, options.verbosity) 
+
+    sequenceParser = FastaParser(options.sequences, options.verbosity)
+
+    writer = FastaWriter(options.outputFileName, options.verbosity)
+    progress = Progress(parser.getNbTranscripts(), "Reading %s" % (options.inputFileName), options.verbosity)
+    for transcript in parser.getIterator():
+        sequence = transcript.extractSequence(sequenceParser)
+        writer.addSequence(sequence)
+        progress.inc()
+    progress.done()
b
diff -r d22fadc825e3 -r 2c0c0a89fad7 SMART/Java/Python/findTss.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/SMART/Java/Python/findTss.py Thu May 02 09:56:47 2013 -0400
[
@@ -0,0 +1,77 @@
+#! /usr/bin/env python
+#
+# Copyright INRA-URGI 2009-2010
+# 
+# This software is governed by the CeCILL license under French law and
+# abiding by the rules of distribution of free software. You can use,
+# modify and/ or redistribute the software under the terms of the CeCILL
+# license as circulated by CEA, CNRS and INRIA at the following URL
+# "http://www.cecill.info".
+# 
+# As a counterpart to the access to the source code and rights to copy,
+# modify and redistribute granted by the license, users are provided only
+# with a limited warranty and the software's author, the holder of the
+# economic rights, and the successive licensors have only limited
+# liability.
+# 
+# In this respect, the user's attention is drawn to the risks associated
+# with loading, using, modifying and/or developing or reproducing the
+# software by the user in light of its specific status of free software,
+# that may mean that it is complicated to manipulate, and that also
+# therefore means that it is reserved for developers and experienced
+# professionals having in-depth computer knowledge. Users are therefore
+# encouraged to load and test the software's suitability as regards their
+# requirements in conditions enabling the security of their systems and/or
+# data to be ensured and, more generally, to use and operate it in the
+# same conditions as regards security.
+# 
+# The fact that you are presently reading this means that you have had
+# knowledge of the CeCILL license and that you accept its terms.
+#
+"""Find TSS from short reads"""
+import os
+from optparse import OptionParser
+from SMART.Java.Python.structure.TranscriptListsComparator import TranscriptListsComparator
+from SMART.Java.Python.structure.TranscriptContainer import TranscriptContainer
+from commons.core.writer.Gff3Writer import Gff3Writer
+
+if __name__ == "__main__":
+    
+    # parse command line
+    description = "Find TSS v1.0.1: Find the transcription start site of a list of transcripts. [Category: Merge]"
+
+    parser = OptionParser(description = description)
+    parser.add_option("-i", "--input",     dest="inputFileName", action="store",                     type="string", help="input file [compulsory] [format: file in transcript format given by -f]")
+    parser.add_option("-f", "--format",    dest="format",        action="store",                     type="string", help="format of file [compulsory] [format: transcript file format]")
+    parser.add_option("-o", "--output",    dest="output",        action="store",      default=None,  type="string", help="output file [compulsory] [format: output file in GFF3 format]")
+    parser.add_option("-n", "--normalize", dest="normalize",     action="store_true", default=False,                help="normalize the number of reads per cluster by the number of mappings per read [format: bool] [default: false]")
+    parser.add_option("-d", "--distance",  dest="distance",      action="store",      default=10,    type="int",    help="distance between two reads to mark the same TSS [format: int] [default: 10]")
+    parser.add_option("-e", "--colinear",  dest="colinear",      action="store_true", default=False,                help="group by strand [format: bool] [default: false]")
+    parser.add_option("-c", "--csv",       dest="csv",           action="store",      default=None,  type="string", help="output a CSV file in the given path [format: output file in Excel format]")
+    parser.add_option("-v", "--verbosity", dest="verbosity",     action="store",      default=1,     type="int",    help="trace level [format: int]")
+    (options, args) = parser.parse_args()
+
+    transcriptContainer = TranscriptContainer(options.inputFileName, options.format, options.verbosity)        
+    transcriptListComparator = TranscriptListsComparator(None, options.verbosity)
+    transcriptListComparator.restrictToStart(transcriptListComparator.QUERY, 1)
+    transcriptListComparator.setMaxDistance(options.distance)
+    transcriptListComparator.aggregate(True)
+    transcriptListComparator.computeOdds(True)
+    transcriptListComparator.getColinearOnly(options.colinear)
+    transcriptListComparator.setNormalization(options.normalize)
+    transcriptListComparator.setInputTranscriptContainer(transcriptListComparator.QUERY, transcriptContainer)
+    transcriptListComparator.setOutputWriter(Gff3Writer(options.output, options.verbosity))
+    transcriptListComparator.compareTranscriptListSelfMerge()
+
+    if options.csv != None:
+        csvResults = transcriptListComparator.getOddsPerTranscript()
+        csvFile    = open(options.csv, "w")
+        csvFile.write("Number,Transcript\n")
+        for number in sorted(list(set(csvResults.values()))):
+            csvFile.write("%d," % (number))
+            for name in csvResults:
+                if csvResults[name] == number:
+                    csvFile.write("%s " % (name))
+            csvFile.write("\n")
+        csvFile.close()
+
b
diff -r d22fadc825e3 -r 2c0c0a89fad7 SMART/Java/Python/fold.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/SMART/Java/Python/fold.py Thu May 02 09:56:47 2013 -0400
[
@@ -0,0 +1,95 @@
+#! /usr/bin/env python
+#
+# Copyright INRA-URGI 2009-2010
+# 
+# This software is governed by the CeCILL license under French law and
+# abiding by the rules of distribution of free software. You can use,
+# modify and/ or redistribute the software under the terms of the CeCILL
+# license as circulated by CEA, CNRS and INRIA at the following URL
+# "http://www.cecill.info".
+# 
+# As a counterpart to the access to the source code and rights to copy,
+# modify and redistribute granted by the license, users are provided only
+# with a limited warranty and the software's author, the holder of the
+# economic rights, and the successive licensors have only limited
+# liability.
+# 
+# In this respect, the user's attention is drawn to the risks associated
+# with loading, using, modifying and/or developing or reproducing the
+# software by the user in light of its specific status of free software,
+# that may mean that it is complicated to manipulate, and that also
+# therefore means that it is reserved for developers and experienced
+# professionals having in-depth computer knowledge. Users are therefore
+# encouraged to load and test the software's suitability as regards their
+# requirements in conditions enabling the security of their systems and/or
+# data to be ensured and, more generally, to use and operate it in the
+# same conditions as regards security.
+# 
+# The fact that you are presently reading this means that you have had
+# knowledge of the CeCILL license and that you accept its terms.
+#
+"""
+Read a mapping file (many formats supported) and select some of them
+Mappings should be sorted by read names
+"""
+
+from optparse import OptionParser
+from SMART.Java.Python.structure.TranscriptContainer import TranscriptContainer
+from SMART.Java.Python.toolLauncher.RnaFoldLauncher import RnaFoldLauncher
+from commons.core.writer.Gff3Writer import Gff3Writer
+
+
+class Fold(object):
+    """
+    Fold a series of transcripts
+    """
+
+    def __init__(self, verbosity = 0):
+        self.verbosity       = verbosity
+        self.rnaFoldLauncher = RnaFoldLauncher(verbosity)
+        self.gff3Writer      = None
+
+
+    def setInputFileName(self, fileName, format):
+        transcriptContainer = TranscriptContainer(fileName, format, options.verbosity)
+        self.rnaFoldLauncher.setTranscriptList(transcriptContainer)
+
+    
+    def setOutputFileName(self, fileName):
+        self.gff3Writer = Gff3Writer("%s.gff3" % (fileName), self.verbosity)
+
+
+    def setGenomeFileName(self, fileName):
+        self.rnaFoldLauncher.setGenomeFile(fileName)
+
+
+    def setExtensions(self, fivePrime, threePrime):
+        self.rnaFoldLauncher.setExtensions(fivePrime, threePrime)
+
+
+    def start(self):
+        self.gff3Writer.addTranscriptList(self.rnaFoldLauncher.getResults())
+
+
+
+if __name__ == "__main__":
+    
+    # parse command line
+    description = "Fold v1.0.1: Fold a list of transcript and give the energy. [Category: Personal]"
+
+    parser = OptionParser(description = description)
+    parser.add_option("-i", "--input",      dest="inputFileName",  action="store",            type="string", help="input file [compulsory] [format: file in transcript format given by -f]")
+    parser.add_option("-f", "--format",     dest="format",         action="store",            type="string", help="format of file [compulsory] [format: transcript file format]")
+    parser.add_option("-o", "--output",     dest="outputFileName", action="store",            type="string", help="output file [format: output file in GFF3 format]")
+    parser.add_option("-g", "--genome",     dest="genomeFileName", action="store",            type="string", help="genome file name [format: file in FASTA format]")
+    parser.add_option("-5", "--fivePrime",  dest="fivePrime",      action="store",            type="int",    help="extend towards the 5' end [format: int]")
+    parser.add_option("-3", "--threePrime", dest="threePrime",     action="store",            type="int",    help="extend towards the 3' end [format: int]")
+    parser.add_option("-v", "--verbosity",  dest="verbosity",      action="store", default=1, type="int",    help="trace level [format: int]")
+    (options, args) = parser.parse_args()
+
+    folder = Fold(options.verbosity)
+    folder.setInputFileName(options.inputFileName, options.format)
+    folder.setOutputFileName(options.outputFileName)
+    folder.setExtensions(options.fivePrime, options.threePrime)
+    folder.setGenomeFileName(options.genomeFileName)
+    folder.start()
b
diff -r d22fadc825e3 -r 2c0c0a89fad7 SMART/Java/Python/getDifference.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/SMART/Java/Python/getDifference.py Thu May 02 09:56:47 2013 -0400
[
b'@@ -0,0 +1,155 @@\n+#! /usr/bin/env python\n+#\n+# Copyright INRA-URGI 2009-2010\n+# \n+# This software is governed by the CeCILL license under French law and\n+# abiding by the rules of distribution of free software. You can use,\n+# modify and/ or redistribute the software under the terms of the CeCILL\n+# license as circulated by CEA, CNRS and INRIA at the following URL\n+# "http://www.cecill.info".\n+# \n+# As a counterpart to the access to the source code and rights to copy,\n+# modify and redistribute granted by the license, users are provided only\n+# with a limited warranty and the software\'s author, the holder of the\n+# economic rights, and the successive licensors have only limited\n+# liability.\n+# \n+# In this respect, the user\'s attention is drawn to the risks associated\n+# with loading, using, modifying and/or developing or reproducing the\n+# software by the user in light of its specific status of free software,\n+# that may mean that it is complicated to manipulate, and that also\n+# therefore means that it is reserved for developers and experienced\n+# professionals having in-depth computer knowledge. Users are therefore\n+# encouraged to load and test the software\'s suitability as regards their\n+# requirements in conditions enabling the security of their systems and/or\n+# data to be ensured and, more generally, to use and operate it in the\n+# same conditions as regards security.\n+# \n+# The fact that you are presently reading this means that you have had\n+# knowledge of the CeCILL license and that you accept its terms.\n+#\n+"""Restrict a transcript list with some parameters (regions)"""\n+\n+from optparse import OptionParser\n+from SMART.Java.Python.structure.Transcript import Transcript\n+from SMART.Java.Python.structure.TranscriptContainer import TranscriptContainer\n+from SMART.Java.Python.structure.TranscriptListsComparator import TranscriptListsComparator\n+from commons.core.writer.Gff3Writer import Gff3Writer\n+from commons.core.parsing.FastaParser import FastaParser\n+from SMART.Java.Python.misc.Progress import Progress\n+\n+class DifferenceGetter(object):\n+\n+    def __init__(self, verbosity):\n+        self.verbosity        = verbosity\n+        self.annotationParser = None\n+        self.referenceParser  = None\n+        self.sequenceParser   = None\n+        self.transcriptCount  = 1\n+        self.split            = False\n+\n+    def createTranscript(self, chromosome, start, end):\n+        transcript = Transcript()\n+        transcript.setChromosome(chromosome)\n+        transcript.setDirection("+")\n+        transcript.setStart(start)\n+        transcript.setEnd(end)\n+        transcript.setName("region_%d" % self.transcriptCount)\n+        transcript.setTagValue("ID", "region_%d" % self.transcriptCount)\n+        self.transcriptCount += 1\n+        return transcript\n+\n+    def setSplit(self, split):\n+        self.split = split\n+\n+    def setAnnotationFile(self, fileName, format):\n+        if fileName != None:\n+            self.annotationParser = TranscriptContainer(fileName, format, self.verbosity)\n+\n+    def setReferenceFile(self, fileName, format):\n+        if fileName != None:\n+            self.referenceParser = TranscriptContainer(fileName, format, self.verbosity)\n+\n+    def setSequenceFile(self, fileName):\n+        if fileName != None:\n+            self.sequenceParser = FastaParser(fileName, self.verbosity)\n+\n+    def setOutputFile(self, fileName):\n+        self.writer = Gff3Writer(fileName, self.verbosity)\n+\n+    def initialize(self):\n+        self.presence = {}\n+        for chromosome in self.sequenceParser.getRegions():\n+            self.presence[chromosome] = [[1, self.sequenceParser.getSizeOfRegion(chromosome)]]\n+\n+    def readTranscripts(self):\n+        nbTranscripts = self.annotationParser.getNbTranscripts()\n+        progress      = Progress(nbTranscripts, "Parsing annotation file" , self.verbosity)\n+        for transcript in self.annotationParser.getIterator():\n+            chromosome   = transcript.getChromosome()\n+            '..b'me]):\n+                start, end = element\n+                if start <= transcript.getEnd() and transcript.getStart() <= end:\n+                    toBeDeleted.append(i)\n+                    if start < transcript.getStart():\n+                        toBeAppended.append([start, transcript.getStart() - 1])\n+                    if end > transcript.getEnd():\n+                        toBeAppended.append([transcript.getEnd() + 1, end])\n+            for i in reversed(toBeDeleted):\n+                del self.presence[chromosome][i]\n+            self.presence[chromosome].extend(toBeAppended)\n+            progress.inc()\n+        progress.done()\n+\n+    def writeOutput(self):\n+        for chromosome in self.presence:\n+            for element in self.presence[chromosome]:\n+                start, end = element\n+                self.writer.addTranscript(self.createTranscript(chromosome, start, end))\n+        self.writer.write()\n+\n+    def compareToSequence(self):\n+        self.initialize()\n+        self.readTranscripts()\n+        self.writeOutput()\n+\n+    def compareToAnnotation(self):\n+        transcriptListComparator = TranscriptListsComparator(None, self.verbosity)\n+        transcriptListComparator.setSplitDifference(self.split)\n+        transcriptListComparator.setInputTranscriptContainer(transcriptListComparator.QUERY, self.annotationParser)\n+        transcriptListComparator.setInputTranscriptContainer(transcriptListComparator.REFERENCE, self.referenceParser)\n+        transcriptListComparator.setOutputWriter(self.writer)\n+        transcriptListComparator.getDifferenceTranscriptList()\n+\n+    def run(self):\n+        if self.referenceParser != None:\n+            self.compareToAnnotation()\n+        else:\n+            self.compareToSequence()\n+\n+\n+if __name__ == "__main__":\n+    \n+    # parse command line\n+    description = "Get Difference v1.0.1: Get all the regions of the genome, except the one given or get all the elements from the first set which does not ovelap with the second set (at the nucleotide level). [Category: Data Comparison]"\n+\n+    parser = OptionParser(description = description)\n+    parser.add_option("-i", "--input1",    dest="inputFileName1",   action="store",                     type="string", help="input file [compulsory] [format: file in transcript format given by -f]")\n+    parser.add_option("-f", "--format1",   dest="format1",          action="store",                     type="string", help="format [compulsory] [format: transcript file format]")\n+    parser.add_option("-j", "--input2",    dest="inputFileName2",   action="store",      default=None,  type="string", help="reference file [format: file in transcript format given by -g]")\n+    parser.add_option("-g", "--format2",   dest="format2",          action="store",      default=None,  type="string", help="format of the reference file [format: transcript file format]")\n+    parser.add_option("-s", "--sequence",  dest="sequenceFileName", action="store",      default=None,  type="string", help="sequence file [format: file in FASTA format]")\n+    parser.add_option("-p", "--split",     dest="split",            action="store_true", default=False,                help="when comparing to a set of genomic coordinates, do not join [format: boolean] [default: False")\n+    parser.add_option("-o", "--output",    dest="outputFileName",   action="store",                     type="string", help="output file [format: output file in GFF3 format]")\n+    parser.add_option("-v", "--verbosity", dest="verbosity",        action="store",      default=1,     type="int",    help="trace level [format: int]")\n+    (options, args) = parser.parse_args()\n+\n+    getter = DifferenceGetter(options.verbosity)\n+    getter.setSplit(options.split)\n+    getter.setAnnotationFile(options.inputFileName1, options.format1)\n+    getter.setSequenceFile(options.sequenceFileName)\n+    getter.setReferenceFile(options.inputFileName2, options.format2)\n+    getter.setOutputFile(options.outputFileName)\n+    getter.run()\n'
b
diff -r d22fadc825e3 -r 2c0c0a89fad7 SMART/Java/Python/getDistance.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/SMART/Java/Python/getDistance.py Thu May 02 09:56:47 2013 -0400
[
b'@@ -0,0 +1,241 @@\n+#! /usr/bin/env python\n+#\n+# Copyright INRA-URGI 2009-2010\n+# \n+# This software is governed by the CeCILL license under French law and\n+# abiding by the rules of distribution of free software. You can use,\n+# modify and/ or redistribute the software under the terms of the CeCILL\n+# license as circulated by CEA, CNRS and INRIA at the following URL\n+# "http://www.cecill.info".\n+# \n+# As a counterpart to the access to the source code and rights to copy,\n+# modify and redistribute granted by the license, users are provided only\n+# with a limited warranty and the software\'s author, the holder of the\n+# economic rights, and the successive licensors have only limited\n+# liability.\n+# \n+# In this respect, the user\'s attention is drawn to the risks associated\n+# with loading, using, modifying and/or developing or reproducing the\n+# software by the user in light of its specific status of free software,\n+# that may mean that it is complicated to manipulate, and that also\n+# therefore means that it is reserved for developers and experienced\n+# professionals having in-depth computer knowledge. Users are therefore\n+# encouraged to load and test the software\'s suitability as regards their\n+# requirements in conditions enabling the security of their systems and/or\n+# data to be ensured and, more generally, to use and operate it in the\n+# same conditions as regards security.\n+# \n+# The fact that you are presently reading this means that you have had\n+# knowledge of the CeCILL license and that you accept its terms.\n+#\n+"""Get the distance between the transcripts of two lists"""\n+\n+import os\n+import sys\n+from optparse import OptionParser\n+from SMART.Java.Python.structure.TranscriptListsComparator import TranscriptListsComparator\n+from SMART.Java.Python.structure.TranscriptContainer import TranscriptContainer\n+from SMART.Java.Python.misc.RPlotter import RPlotter\n+from commons.core.writer.Gff3Writer import Gff3Writer\n+\n+class GetDistance(object):\n+\n+    def __init__(self, verbosity = 0):\n+        self.verbosity      = verbosity\n+        self.writer         = None\n+        self.spearman       = False\n+        self.tlc            = TranscriptListsComparator(None, self.verbosity)\n+        self.strands        = (0, )\n+        self.buckets        = None\n+        self.title          = ""\n+        self.xMin           = None\n+        self.xMax           = None\n+        self.proportion     = False\n+        self.outputFileName = None\n+        self.keep           = False\n+\n+    def __del__(self):\n+        pass\n+\n+    def setQueryFile(self, fileName, format):\n+        self.transcriptContainer1 = TranscriptContainer(fileName, format, self.verbosity)\n+        \n+    def setReferenceFile(self, fileName, format):\n+        self.transcriptContainer2 = TranscriptContainer(fileName, format, self.verbosity)\n+\n+    def setOutputFile(self, fileName):\n+        self.outputFileName = fileName\n+        \n+    def setOutputTranscriptFile(self, fileName):\n+        if fileName != None:\n+            self.writer = Gff3Writer(fileName, self.verbosity)\n+        \n+    def restrictQueryToStart(self, number):\n+        self.tlc.restrictToStart(self.tlc.QUERY, number)\n+\n+    def restrictReferenceToStart(self, number):\n+        self.tlc.restrictToStart(self.tlc.REFERENCE, number)\n+\n+    def restrictQueryToEnd(self, number):\n+        self.tlc.restrictToEnd(self.tlc.QUERY, number)\n+\n+    def restrictReferenceToEnd(self, number):\n+        self.tlc.restrictToEnd(self.tlc.REFERENCE, number)\n+\n+    def setAbsolute(self, boolean):\n+        self.tlc.setAbsolute(boolean)\n+\n+    def setProportion(self, boolean):\n+        self.proportion = boolean\n+\n+    def setColinear(self, boolean):\n+        self.tlc.getColinearOnly(boolean)\n+\n+    def setAntisense(self, boolean):\n+        self.tlc.getAntisenseOnly(boolean)\n+\n+    def setDistances(self, minDistance, maxDistance):\n+        self.tlc.setMinDistance(minDistance)\n+        self.tlc.setMaxDistance(maxDistance)\n+\n+    def setStrands(s'..b'"--start2",          dest="start2",          action="store",      default=None, type="int",    help="only consider the n first 5\' nucleotides for list 2 [format: int]")\n+    parser.add_option("-e", "--end1",            dest="end1",            action="store",      default=None, type="int",    help="only consider the n last 3\' nucleotides for list 1 [format: int]")\n+    parser.add_option("-E", "--end2",            dest="end2",            action="store",      default=None, type="int",    help="only consider the n last 3\' nucleotides for list 2 [format: int]")\n+    parser.add_option("-m", "--minDistance",     dest="minDistance",     action="store",      default=None, type="int",    help="minimum distance considered between two transcripts [format: int] [default: None]")\n+    parser.add_option("-M", "--maxDistance",     dest="maxDistance",     action="store",      default=1000, type="int",    help="maximum distance considered between two transcripts [format: int] [default: 1000]")\n+    parser.add_option("-5", "--fivePrime",       dest="fivePrime",       action="store_true", default=False,               help="consider the elements from list 1 which are upstream of elements of list 2 [format: bool] [default: False]")\n+    parser.add_option("-3", "--threePrime",      dest="threePrime",      action="store_true", default=False,               help="consider the elements from list 1 which are downstream of elements of list 2 [format: bool] [default: False]")\n+    parser.add_option("-u", "--buckets",         dest="buckets",         action="store",      default=None, type="int",    help="plot histogram instead of line plot with given interval size [format: int] [default: None]")\n+    parser.add_option("-2", "--2strands",        dest="twoStrands",      action="store_true", default=False,               help="plot the distributions of each strand separately [format: bool] [default: False]")\n+    parser.add_option("-r", "--spearman",        dest="spearman",        action="store_true", default=False,               help="compute Spearman rho [format: bool] [default: False]")\n+    parser.add_option("-x", "--xMin",            dest="xMin",            action="store",      default=None, type="int",    help="minimum value on the x-axis to plot [format: int] [default: None]")\n+    parser.add_option("-X", "--xMax",            dest="xMax",            action="store",      default=None, type="int",    help="maximum value on the x-axis to plot [format: int] [default: None]")\n+    parser.add_option("-t", "--title",           dest="title",           action="store",      default=None, type="string", help="title for the graph [format: int] [default: None]")\n+    parser.add_option("-v", "--verbosity",       dest="verbosity",       action="store",      default=1,    type="int",    help="trace level [format: int]")\n+    parser.add_option("-k", "--keep",            dest="keep",            action="store_true", default=False,               help="keep temporary files [format: bool]")\n+    (options, args) = parser.parse_args()\n+\n+    gd = GetDistance(options.verbosity)\n+    gd.setQueryFile(options.inputFileName1, options.format1)\n+    gd.setReferenceFile(options.inputFileName2, options.format2)\n+    gd.setOutputFile(options.outputFileName)\n+    gd.setOutputTranscriptFile(options.outputDistances)\n+    gd.setColinear(options.colinear)\n+    gd.setAntisense(options.antisense)\n+    gd.setAbsolute(options.absolute)\n+    gd.setProportion(options.proportion)\n+    gd.restrictQueryToStart(options.start1)\n+    gd.restrictReferenceToStart(options.start2)\n+    gd.restrictQueryToEnd(options.end1)\n+    gd.restrictReferenceToEnd(options.end2)\n+    gd.setDistances(options.minDistance, options.maxDistance)\n+    gd.setUpstream(options.fivePrime)\n+    gd.setDownstream(options.threePrime)\n+    gd.setStrands(options.twoStrands)\n+    gd.setBuckets(options.buckets)\n+    gd.setTitle(options.title)\n+    gd.setXValues(options.xMin, options.xMax)\n+    gd.keepTmpValues(options.keep)\n+    gd.run()\n'
b
diff -r d22fadc825e3 -r 2c0c0a89fad7 SMART/Java/Python/getDistribution.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/SMART/Java/Python/getDistribution.py Thu May 02 09:56:47 2013 -0400
[
b'@@ -0,0 +1,291 @@\n+#! /usr/bin/env python\n+#\n+# Copyright INRA-URGI 2009-2010\n+# \n+# This software is governed by the CeCILL license under French law and\n+# abiding by the rules of distribution of free software. You can use,\n+# modify and/ or redistribute the software under the terms of the CeCILL\n+# license as circulated by CEA, CNRS and INRIA at the following URL\n+# "http://www.cecill.info".\n+# \n+# As a counterpart to the access to the source code and rights to copy,\n+# modify and redistribute granted by the license, users are provided only\n+# with a limited warranty and the software\'s author, the holder of the\n+# economic rights, and the successive licensors have only limited\n+# liability.\n+# \n+# In this respect, the user\'s attention is drawn to the risks associated\n+# with loading, using, modifying and/or developing or reproducing the\n+# software by the user in light of its specific status of free software,\n+# that may mean that it is complicated to manipulate, and that also\n+# therefore means that it is reserved for developers and experienced\n+# professionals having in-depth computer knowledge. Users are therefore\n+# encouraged to load and test the software\'s suitability as regards their\n+# requirements in conditions enabling the security of their systems and/or\n+# data to be ensured and, more generally, to use and operate it in the\n+# same conditions as regards security.\n+# \n+# The fact that you are presently reading this means that you have had\n+# knowledge of the CeCILL license and that you accept its terms.\n+#\n+"""Get the repartition of some elements in a chromosomes"""\n+\n+import os\n+from optparse import OptionParser\n+from SMART.Java.Python.structure.TranscriptContainer import TranscriptContainer\n+from SMART.Java.Python.structure.Transcript import Transcript\n+from commons.core.writer.Gff3Writer import Gff3Writer\n+from SMART.Java.Python.misc.RPlotter import RPlotter\n+from SMART.Java.Python.misc.Progress import Progress\n+from math import *\n+\n+def divideKeyDict(dictionary, ratio):\n+    return dict([(key / ratio, dictionary[key]) for key in dictionary])\n+\n+\n+def setTranscript(chromosome, direction, start, end, name, value):\n+    transcript = Transcript()\n+    transcript.setChromosome(chromosome)\n+    transcript.setDirection(direction)\n+    transcript.setStart(start)\n+    transcript.setEnd(end)\n+    transcript.setName(name)\n+    transcript.setTagValue("nbElements", value)\n+    return transcript\n+\n+\n+\n+if __name__ == "__main__":\n+    \n+    magnifyingFactor = 1000\n+    \n+    # parse command line\n+    description = "Get Distribution v1.0.1: Get the distribution of the genomic coordinates on a genome. [Category: Visualization]"\n+\n+    parser = OptionParser(description = description)\n+    parser.add_option("-i", "--input",       dest="inputFileName",     action="store",                           type="string", help="input file [compulsory] [format: file in transcript format given by -f]")\n+    parser.add_option("-f", "--format",      dest="format",            action="store",                           type="string", help="format of the input file [compulsory] [format: transcript file format]")\n+    parser.add_option("-o", "--output",      dest="outputFileName",    action="store",                           type="string", help="output file [compulsory] [format: output file in GFF3 format]")\n+    parser.add_option("-r", "--reference",   dest="referenceFileName", action="store",      default=None,        type="string", help="file containing the genome [compulsory] [format: file in FASTA format]")\n+    parser.add_option("-n", "--nbBins",      dest="nbBins",            action="store",      default=1000,        type="int",    help="number of bins [default: 1000] [format: int]")\n+    parser.add_option("-2", "--bothStrands", dest="bothStrands",       action="store_true", default=False,                      help="plot one curve per strand [format: bool] [default: false]")\n+    parser.add_option("-w", "--raw",         dest="raw",         '..b'       plotter.addLine(divideKeyDict(densityPlus[chromosome], ratio))\n+            if options.raw:\n+                plotter.addLine(divideKeyDict(binsMinus[chromosome], ratio))\n+            else:\n+                plotter.addLine(divideKeyDict(densityMinus[chromosome], ratio))\n+        else:\n+            if options.raw:\n+                plotter.addLine(divideKeyDict(bins[chromosome], ratio))\n+            else:\n+                plotter.addLine(divideKeyDict(density[chromosome], ratio))\n+        plotter.plot()\n+        \n+    if options.csv:\n+        outputFileName = "%s" % (options.outputFileName)\n+        if options.chromosome != None:\n+            outputFileName += "_%s" % (options.chromosome)\n+        if options.start != None and options.end != None:\n+            outputFileName += ":%d-%d" % (options.start, options.end)\n+        outputFileName += ".csv"\n+        csvHandle = open(outputFileName, "w")\n+        for slice in range(start / sliceSize, maxSlice + 1):\n+            csvHandle.write(";%d-%d" % (slice * sliceSize + 1, (slice+1) * sliceSize))\n+        csvHandle.write("\\n")\n+        if options.bothStrands:\n+            for chromosome in densityPlus:\n+                if len(densityPlus[chromosome]) > 0:\n+                    csvHandle.write("%s [+]" % (chromosome))\n+                    for slice in sorted(densityPlus[chromosome].keys()):\n+                        csvHandle.write(";%.2f" % (densityPlus[chromosome][slice]))\n+                    csvHandle.write("\\n")            \n+                if len(densityMinus[chromosome]) > 0:\n+                    csvHandle.write("%s [-]" % (chromosome))\n+                    for slice in sorted(densityPlus[chromosome].keys()):\n+                        csvHandle.write(";%.2f" % (-densityMinus[chromosome][slice]))\n+                    csvHandle.write("\\n")            \n+        else:\n+            for chromosome in density:\n+                if len(density[chromosome]) > 0:\n+                    csvHandle.write(chromosome)\n+                    for slice in sorted(density[chromosome].keys()):\n+                        csvHandle.write(";%.2f" % (density[chromosome][slice]))\n+                    csvHandle.write("\\n")\n+        csvHandle.close()\n+             \n+    if options.gff:\n+        chromosome = "" if options.chromosome == None                         else options.chromosome.capitalize()\n+        start      = "" if options.start      == None                         else "%d" % (options.start)\n+        end        = "" if options.end        == None                         else "%d" % (options.end)\n+        link1      = "" if options.start      == None and options.end == None else ":"\n+        link2      = "" if options.start      == None and options.end == None else "-"\n+        writer     = Gff3Writer("%s%s%s%s%s.gff3" % (options.outputFileName, link1, start, link2, end), options.verbosity)\n+        cpt = 1\n+        if options.raw:\n+            valuesPlus  = binsPlus\n+            valuesMinus = binsMinus\n+            values      = bins\n+        else:\n+            valuesPlus  = densityPlus\n+            valuesMinus = densityMinus\n+            values      = density\n+        if options.bothStrands:\n+            for chromosome in values:\n+                for slice in valuesPlus[chromosome]:\n+                    writer.addTranscript(setTranscript(chromosome, 1, slice, slice + sliceSize, "region%d" % (cpt), valuesPlus[chromosome][slice]))\n+                    cpt += 1\n+                for slice in valuesMinus[chromosome]:\n+                    writer.addTranscript(setTranscript(chromosome, -1, slice, slice + sliceSize, "region%d" % (cpt), - valuesMinus[chromosome][slice]))\n+                    cpt += 1\n+        else:\n+            for chromosome in values:\n+                for slice in values[chromosome]:\n+                    writer.addTranscript(setTranscript(chromosome, 1, slice, slice + sliceSize, "region%d" % (cpt), values[chromosome][slice]))\n+                    cpt += 1\n+        writer.write()\n+\n+\n'
b
diff -r d22fadc825e3 -r 2c0c0a89fad7 SMART/Java/Python/getElement.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/SMART/Java/Python/getElement.py Thu May 02 09:56:47 2013 -0400
[
@@ -0,0 +1,106 @@
+#! /usr/bin/env python
+#
+# Copyright INRA-URGI 2009-2010
+# 
+# This software is governed by the CeCILL license under French law and
+# abiding by the rules of distribution of free software. You can use,
+# modify and/ or redistribute the software under the terms of the CeCILL
+# license as circulated by CEA, CNRS and INRIA at the following URL
+# "http://www.cecill.info".
+# 
+# As a counterpart to the access to the source code and rights to copy,
+# modify and redistribute granted by the license, users are provided only
+# with a limited warranty and the software's author, the holder of the
+# economic rights, and the successive licensors have only limited
+# liability.
+# 
+# In this respect, the user's attention is drawn to the risks associated
+# with loading, using, modifying and/or developing or reproducing the
+# software by the user in light of its specific status of free software,
+# that may mean that it is complicated to manipulate, and that also
+# therefore means that it is reserved for developers and experienced
+# professionals having in-depth computer knowledge. Users are therefore
+# encouraged to load and test the software's suitability as regards their
+# requirements in conditions enabling the security of their systems and/or
+# data to be ensured and, more generally, to use and operate it in the
+# same conditions as regards security.
+# 
+# The fact that you are presently reading this means that you have had
+# knowledge of the CeCILL license and that you accept its terms.
+#
+"""Get the first element (exon / intron) from a list of transcripts"""
+
+import os
+from optparse import OptionParser
+from commons.core.writer.Gff3Writer import *
+from SMART.Java.Python.structure.TranscriptContainer import *
+from SMART.Java.Python.misc.Progress import *
+
+
+if __name__ == "__main__":
+    
+    # parse command line
+    description = "Get Element v1.0.1: Get the first element (exon / intron) from a list of transcripts. [Category: Personnal]"
+
+    parser = OptionParser(description = description)
+    parser.add_option("-i", "--input",         dest="inputFileName",    action="store",                                                type="string", help="input file [compulsory] [format: file in transcript format given by -f]")
+    parser.add_option("-f", "--format",        dest="format",                 action="store",                                                type="string", help="format of file [compulsory] [format: transcript file format]")
+    parser.add_option("-o", "--output",        dest="outputFileName", action="store",                                                type="string", help="output file [compulsory] [format: output file in GFF3 format]")
+    parser.add_option("-y", "--mysql",         dest="mysql",                    action="store_true", default=False,                                     help="mySQL output [format: bool] [default: false]")
+    parser.add_option("-t", "--type",            dest="type",                     action="store",                                                type="string", help="type of the element    [format: choice (exon, intron)]")
+    parser.add_option("-v", "--verbosity", dest="verbosity",            action="store",            default=1,                type="int",        help="trace level [format: int]")
+    parser.add_option("-l", "--log",             dest="log",                        action="store_true", default=False,                                     help="write a log file [format: bool] [default: false]")
+    (options, args) = parser.parse_args()
+
+    parser        = TranscriptContainer(options.inputFileName, options.format, options.verbosity)
+    writer        = Gff3Writer(options.outputFileName, options.verbosity)
+    sqlWriter = MySqlTranscriptWriter(options.outputFileName, options.verbosity)
+    
+    nbLines = parser.getNbTranscripts()
+    print "%i lines found" % (nbLines)
+
+    # treat transcripts
+    nbWritten = 0
+    nbUsed        = 0
+    progress    = Progress(nbLines, "Analyzing transcripts of " + options.inputFileName, options.verbosity)
+    for transcript in parser.getIterator():
+
+        outTranscript = Transcript()
+        outTranscript.setName(transcript.getName())
+        outTranscript.setDirection(transcript.getDirection())
+        outTranscript.setChromosome(transcript.getChromosome())
+        
+        if options.type == "exon":
+            if len(transcript.getExons()) > 1:
+                transcript.sortExons()
+                outTranscript.setStart(transcript.getExons()[0].getStart())
+                outTranscript.setEnd(transcript.getExons()[0].getEnd())
+                writer.addTranscript(outTranscript)
+                if options.mysql:
+                    sqlWriter.addTranscript(transcript)
+                nbWritten += 1
+                nbUsed        += 1
+        elif options.type == "intron":
+            used = False
+            for intron in transcript.getIntrons():
+                used = True
+                thisTranscript = Transcript()
+                thisTranscript.copy(outTranscript)
+                thisTranscript.setStart(intron.getStart())
+                thisTranscript.setEnd(intron.getEnd())
+                writer.addTranscript(thisTranscript)
+                if options.mysql:
+                    sqlWriter.addTranscript(transcript)
+                nbWritten += 1
+            if used:
+                nbUsed += 1
+        else:
+            sys.exit("Cannot understan type %s" % (options.type))
+        progress.inc()
+    progress.done()
+
+    if options.mysql:
+        sqlWriter.write()
+
+    print "nb sequences used: %d" % (nbUsed)
+    print "nb elements used: %d" % (nbWritten)
b
diff -r d22fadc825e3 -r 2c0c0a89fad7 SMART/Java/Python/getExons.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/SMART/Java/Python/getExons.py Thu May 02 09:56:47 2013 -0400
[
@@ -0,0 +1,128 @@
+#! /usr/bin/env python
+#
+# Copyright INRA-URGI 2009-2010
+# 
+# This software is governed by the CeCILL license under French law and
+# abiding by the rules of distribution of free software. You can use,
+# modify and/ or redistribute the software under the terms of the CeCILL
+# license as circulated by CEA, CNRS and INRIA at the following URL
+# "http://www.cecill.info".
+# 
+# As a counterpart to the access to the source code and rights to copy,
+# modify and redistribute granted by the license, users are provided only
+# with a limited warranty and the software's author, the holder of the
+# economic rights, and the successive licensors have only limited
+# liability.
+# 
+# In this respect, the user's attention is drawn to the risks associated
+# with loading, using, modifying and/or developing or reproducing the
+# software by the user in light of its specific status of free software,
+# that may mean that it is complicated to manipulate, and that also
+# therefore means that it is reserved for developers and experienced
+# professionals having in-depth computer knowledge. Users are therefore
+# encouraged to load and test the software's suitability as regards their
+# requirements in conditions enabling the security of their systems and/or
+# data to be ensured and, more generally, to use and operate it in the
+# same conditions as regards security.
+# 
+# The fact that you are presently reading this means that you have had
+# knowledge of the CeCILL license and that you accept its terms.
+#
+from optparse import OptionParser
+from commons.core.parsing.ParserChooser import ParserChooser
+from commons.core.writer.TranscriptWriter import TranscriptWriter
+from SMART.Java.Python.structure.Transcript import Transcript
+from SMART.Java.Python.misc.Progress import Progress
+
+zeroBaseToOneBaseConvertor = (lambda x: x - 1 if x > 0 else x)
+
+class GetExons(object):
+
+    def __init__(self, verbosity):
+        self.verbosity = verbosity
+        self.selection = False
+
+    def setInputFile(self, fileName, format):
+        chooser = ParserChooser(self.verbosity)
+        chooser.findFormat(format)
+        self.parser = chooser.getParser(fileName)
+
+    def setSelection(self, selection):
+        if selection == None:
+            return
+        self.selection = True
+        self.selectionItems = []
+        self.selectionIntervals = []
+        for part in selection.split(","):
+            try:
+                splittedPart = map(int, part.split(".."))
+            except Exception:
+                raise Exception("Elements '" + splittedPart + "' of selection '" + selection + "' do no seem to be integers!")
+            if len(splittedPart) == 1:
+                self.selectionItems.append(splittedPart[0])
+            elif len(splittedPart) == 2:
+                self.selectionIntervals.append((splittedPart[0], splittedPart[1]))
+            else:
+                raise Exception("Cannot parse elements '" + splittedPart + "' of selection '" + selection + "'!")
+
+    def getSelectionExonIndices(self, nbExons):
+        if not self.selection:
+            return range(nbExons)
+        indices = []
+        for item in self.selectionItems:
+            indices.append(range(nbExons)[zeroBaseToOneBaseConvertor(item)])
+        for start, end in self.selectionIntervals:
+            start, end = map(zeroBaseToOneBaseConvertor, (start, end))
+            if end > 0:
+                end += 1
+            indices.extend(range(nbExons)[start:end])
+        return indices
+
+    def setOutputFile(self, fileName):
+        self.writer = TranscriptWriter(fileName, "gff3", self.verbosity)
+        
+    def run(self):
+        progress = Progress(self.parser.getNbTranscripts(), "Reading input file", self.verbosity)
+        nbExons = 0
+        for cpt1, transcript in enumerate(self.parser.getIterator()):
+            selectedExons = self.getSelectionExonIndices(transcript.getNbExons())
+            transcript.sortExons()
+            for cpt2, exon in enumerate(transcript.getExons()):
+                if cpt2 not in selectedExons:
+                    continue
+                exonTranscript = Transcript()
+                exonTranscript.copy(exon)
+                if "Parent" in exonTranscript.tags:
+                    del exonTranscript.tags["Parent"]
+                exonTranscript.tags["feature"] = "transcript"
+                if "ID" not in exonTranscript.tags or exonTranscript.tags["ID"] == "unnamed transcript":
+                    exonTranscript.tags["ID"] = "exon_%d-%d" % (cpt1+1, cpt2+1)
+                if exonTranscript.getName() == "unnamed transcript":
+                    exonTranscript.setName("exon_%d-%d" % (cpt1+1, cpt2+1))
+                self.writer.addTranscript(exonTranscript)
+                nbExons += 1
+            progress.inc()
+        self.writer.write()
+        self.writer.close()
+        progress.done()
+        if self.verbosity > 1:
+            print "%d transcripts read" % (self.parser.getNbTranscripts())
+            print "%d exons written" % (nbExons)
+
+if __name__ == "__main__":
+    
+    description = "Get Exons v1.0.1: Get the exons of a set of transcripts. [Category: Data Modification]"
+
+    parser = OptionParser(description = description)
+    parser.add_option("-i", "--input",     dest="inputFileName",  action="store",               type="string", help="input file [compulsory] [format: file in transcript format given by -f]")
+    parser.add_option("-f", "--format",    dest="format",         action="store",               type="string", help="format of file [compulsory] [format: transcript file format]")
+    parser.add_option("-s", "--select",    dest="select",         action="store", default=None, type="string", help="select some of the exons (like '1,2,5..-3,-1') [format: string]")
+    parser.add_option("-o", "--output",    dest="outputFileName", action="store",               type="string", help="output file [format: output file in GFF3 format]")
+    parser.add_option("-v", "--verbosity", dest="verbosity",      action="store", default=1,    type="int",    help="trace level [format: int]")
+    (options, args) = parser.parse_args()
+
+    ge = GetExons(options.verbosity)
+    ge.setInputFile(options.inputFileName, options.format)
+    ge.setSelection(options.select)
+    ge.setOutputFile(options.outputFileName)
+    ge.run()
b
diff -r d22fadc825e3 -r 2c0c0a89fad7 SMART/Java/Python/getInfoPerCoverage.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/SMART/Java/Python/getInfoPerCoverage.py Thu May 02 09:56:47 2013 -0400
[
b'@@ -0,0 +1,167 @@\n+#! /usr/bin/env python\n+#\n+# Copyright INRA-URGI 2009-2010\n+# \n+# This software is governed by the CeCILL license under French law and\n+# abiding by the rules of distribution of free software. You can use,\n+# modify and/ or redistribute the software under the terms of the CeCILL\n+# license as circulated by CEA, CNRS and INRIA at the following URL\n+# "http://www.cecill.info".\n+# \n+# As a counterpart to the access to the source code and rights to copy,\n+# modify and redistribute granted by the license, users are provided only\n+# with a limited warranty and the software\'s author, the holder of the\n+# economic rights, and the successive licensors have only limited\n+# liability.\n+# \n+# In this respect, the user\'s attention is drawn to the risks associated\n+# with loading, using, modifying and/or developing or reproducing the\n+# software by the user in light of its specific status of free software,\n+# that may mean that it is complicated to manipulate, and that also\n+# therefore means that it is reserved for developers and experienced\n+# professionals having in-depth computer knowledge. Users are therefore\n+# encouraged to load and test the software\'s suitability as regards their\n+# requirements in conditions enabling the security of their systems and/or\n+# data to be ensured and, more generally, to use and operate it in the\n+# same conditions as regards security.\n+# \n+# The fact that you are presently reading this means that you have had\n+# knowledge of the CeCILL license and that you accept its terms.\n+#\n+"""Compare overlap of a transcript list and list of read, and get some info depending on the coverage"""\n+\n+import os\n+from optparse import OptionParser\n+from commons.core.parsing.SequenceListParser import *\n+from commons.core.writer.Gff3Writer import *\n+from SMART.Java.Python.mySql.MySqlConnection import *\n+from SMART.Java.Python.structure.TranscriptListsComparator import *\n+from SMART.Java.Python.misc.RPlotter import *\n+from SMART.Java.Python.misc.Progress import *\n+\n+\n+if __name__ == "__main__":\n+    \n+    # parse command line\n+    description = "Get Info per Coverage v1.0.1: Get a list of information clustered by the density of the coverage on a genome. [Category: Personnal]"\n+\n+    parser = OptionParser(description = description)\n+    parser.add_option("-i", "--input1",                     dest="inputFileName1", action="store",                                         type="string", help="input file 1 [compulsory] [format: file in transcript format given by -f]")\n+    parser.add_option("-f", "--format1",                    dest="format1",                action="store",                                         type="string", help="format of file 1 [compulsory] [format: transcript file format]")\n+    parser.add_option("-j", "--input2",                     dest="inputFileName2", action="store",                                         type="string", help="input file 2 [compulsory] [format: file in transcript format given by -g]")\n+    parser.add_option("-g", "--format2",                    dest="format2",                action="store",                                         type="string", help="format of file 2 [compulsory] [format: transcript file format]")\n+    parser.add_option("-o", "--output",                     dest="output",                 action="store",            default=None,    type="string", help="output file [compulsory] [format: output file in TXT format]")\n+    parser.add_option("-v", "--verbosity",                dest="verbosity",            action="store",            default=1,         type="int",        help="trace level [format: int]")\n+    parser.add_option("-l", "--log",                            dest="log",                        action="store",            default=None,    type="string", help="write a log file [format: bool] [default: false]")\n+    (options, args) = parser.parse_args()\n+\n+    logHandle = None\n+    if options.log != None:\n+        logHandle = open(options.log, "w")\n+  '..b'script.name]\n+            else:\n+                averageSizesWithoutIntrons[transcript.getSize()] += coverages[transcript.name]\n+            if transcript.getSize() not in sumSizesWithoutIntrons:\n+                sumSizesWithoutIntrons[transcript.getSize()] = 1\n+            else:\n+                sumSizesWithoutIntrons[transcript.getSize()] += 1\n+            if transcript.getNbExons() not in averageNbExons:\n+                averageNbExons[transcript.getNbExons()] = coverages[transcript.name]\n+            else:\n+                averageNbExons[transcript.getNbExons()] += coverages[transcript.name]\n+            if transcript.getNbExons() not in sumSizesNbExons:\n+                sumSizesNbExons[transcript.getNbExons()] = 1\n+            else:\n+                sumSizesNbExons[transcript.getNbExons()] += 1\n+            sizesWithIntrons[transcript.name]        = (transcript.getSizeWithIntrons(), coverages[transcript.name])\n+            sizesWithoutIntrons[transcript.name] = (transcript.getSize(), coverages[transcript.name])\n+            nbExons[transcript.name]                         = (transcript.getNbExons(), coverages[transcript.name])\n+        progress.inc()\n+    progress.done()\n+        \n+    plotterSizeWithIntrons = RPlotter("%sWithIntrons.png" % (options.output), options.verbosity)\n+    plotterSizeWithIntrons.setPoints(True)\n+    plotterSizeWithIntrons.setMaximumX(10000)\n+    plotterSizeWithIntrons.setMaximumY(1000)    \n+    plotterSizeWithIntrons.setLog("y")\n+    plotterSizeWithIntrons.addLine(sizesWithIntrons)\n+    plotterSizeWithIntrons.plot()\n+    \n+    plotterSizeWithoutIntrons = RPlotter("%sWithoutIntrons.png" % (options.output), options.verbosity)\n+    plotterSizeWithoutIntrons.setPoints(True)\n+    plotterSizeWithoutIntrons.setMaximumX(10000)    \n+    plotterSizeWithoutIntrons.setMaximumY(1000)\n+    plotterSizeWithoutIntrons.setLog("y")\n+    plotterSizeWithoutIntrons.addLine(sizesWithoutIntrons)\n+    plotterSizeWithoutIntrons.plot()\n+    \n+    plotterNbExons = RPlotter("%sNbExons.png" % (options.output), options.verbosity)\n+    plotterNbExons.setPoints(True)\n+    plotterNbExons.addLine(nbExons)\n+    plotterNbExons.plot()\n+    \n+    for element in averageSizesWithIntrons:\n+        averageSizesWithIntrons[element] = int(float(averageSizesWithIntrons[element]) / sumSizesWithIntrons[element])\n+    plotterAverageSizeWithIntrons = RPlotter("%sAverageWithIntrons.png" % (options.output), options.verbosity)\n+    plotterAverageSizeWithIntrons.setMaximumX(10000)\n+    plotterAverageSizeWithIntrons.setMaximumY(1000)    \n+    plotterAverageSizeWithIntrons.setLog("y")\n+    plotterAverageSizeWithIntrons.addLine(averageSizesWithIntrons)\n+    plotterAverageSizeWithIntrons.plot()\n+    print "min/avg/med/max sizes with introns: %d/%.2f/%.1f/%d" % Utils.getMinAvgMedMax(averageSizesWithIntrons)\n+\n+    for element in averageSizesWithoutIntrons:\n+        averageSizesWithoutIntrons[element] = int(float(averageSizesWithoutIntrons[element]) / sumSizesWithoutIntrons[element])\n+    plotterAverageSizeWithoutIntrons = RPlotter("%sAverageWithoutIntrons.png" % (options.output), options.verbosity)\n+    plotterAverageSizeWithoutIntrons.setMaximumX(10000)\n+    plotterAverageSizeWithoutIntrons.setMaximumY(1000)    \n+    plotterAverageSizeWithoutIntrons.setLog("y")\n+    plotterAverageSizeWithoutIntrons.addLine(averageSizesWithoutIntrons)\n+    plotterAverageSizeWithoutIntrons.plot()\n+    print "min/avg/med/max sizes without introns: %d/%.2f/%.1f/%d" % Utils.getMinAvgMedMax(averageSizesWithoutIntrons)\n+\n+    for element in averageNbExons:\n+        averageNbExons[element] = int(float(averageNbExons[element]) / sumSizesNbExons[element])\n+    plotterAverageNbExons = RPlotter("%sAverageNbExons.png" % (options.output), options.verbosity)\n+    plotterAverageNbExons.addLine(averageNbExons)\n+    plotterAverageNbExons.plot()\n+    print "min/avg/med/max # exons: %d/%.2f/%.1f/%d" % Utils.getMinAvgMedMax(averageNbExons)\n+\n+    if options.log:\n+        logHandle.close()\n'
b
diff -r d22fadc825e3 -r 2c0c0a89fad7 SMART/Java/Python/getIntrons.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/SMART/Java/Python/getIntrons.py Thu May 02 09:56:47 2013 -0400
[
@@ -0,0 +1,89 @@
+#! /usr/bin/env python
+#
+# Copyright INRA-URGI 2009-2010
+# 
+# This software is governed by the CeCILL license under French law and
+# abiding by the rules of distribution of free software. You can use,
+# modify and/ or redistribute the software under the terms of the CeCILL
+# license as circulated by CEA, CNRS and INRIA at the following URL
+# "http://www.cecill.info".
+# 
+# As a counterpart to the access to the source code and rights to copy,
+# modify and redistribute granted by the license, users are provided only
+# with a limited warranty and the software's author, the holder of the
+# economic rights, and the successive licensors have only limited
+# liability.
+# 
+# In this respect, the user's attention is drawn to the risks associated
+# with loading, using, modifying and/or developing or reproducing the
+# software by the user in light of its specific status of free software,
+# that may mean that it is complicated to manipulate, and that also
+# therefore means that it is reserved for developers and experienced
+# professionals having in-depth computer knowledge. Users are therefore
+# encouraged to load and test the software's suitability as regards their
+# requirements in conditions enabling the security of their systems and/or
+# data to be ensured and, more generally, to use and operate it in the
+# same conditions as regards security.
+# 
+# The fact that you are presently reading this means that you have had
+# knowledge of the CeCILL license and that you accept its terms.
+#
+from optparse import OptionParser
+from commons.core.parsing.ParserChooser import ParserChooser
+from commons.core.writer.TranscriptWriter import TranscriptWriter
+from SMART.Java.Python.structure.Transcript import Transcript
+from SMART.Java.Python.misc.Progress import Progress
+
+class GetIntrons(object):
+
+    def __init__(self, verbosity):
+        self.verbosity = verbosity
+
+    def setInputFile(self, fileName, format):
+        chooser = ParserChooser(self.verbosity)
+        chooser.findFormat(format)
+        self.parser = chooser.getParser(fileName)
+
+    def setOutputFile(self, fileName):
+        self.writer = TranscriptWriter(fileName, "gff3", self.verbosity)
+        
+    def run(self):
+        progress  = Progress(self.parser.getNbTranscripts(), "Reading input file", self.verbosity)
+        nbIntrons = 0
+        for cpt1, transcript in enumerate(self.parser.getIterator()):
+            for cpt2, intron in enumerate(transcript.getIntrons()):
+                intronTranscript = Transcript()
+                intronTranscript.copy(intron)
+                if "Parent" in intronTranscript.tags:
+                    del intronTranscript.tags["Parent"]
+                intronTranscript.tags["feature"] = "transcript"
+                if "ID" not in intronTranscript.tags or intronTranscript.tags["ID"] == "unnamed transcript":
+                    intronTranscript.tags["ID"] = "intron_%d-%d" % (cpt1+1, cpt2+1)
+                if intronTranscript.getName() == "unnamed transcript":
+                    intronTranscript.setName("intron_%d-%d" % (cpt1+1, cpt2+1))
+                self.writer.addTranscript(intronTranscript)
+                nbIntrons += 1
+            progress.inc()
+        self.writer.write()
+        self.writer.close()
+        progress.done()
+        if self.verbosity > 1:
+            print "%d transcripts read" % (self.parser.getNbTranscripts())
+            print "%d introns written" % (nbIntrons)
+
+
+if __name__ == "__main__":
+    
+    description = "Get Introns v1.0.1: Get the introns of a set of transcripts. [Category: Data Modification]"
+
+    parser = OptionParser(description = description)
+    parser.add_option("-i", "--input",     dest="inputFileName",  action="store",             type="string", help="input file [compulsory] [format: file in transcript format given by -f]")
+    parser.add_option("-f", "--format",    dest="format",         action="store",             type="string", help="format of file [compulsory] [format: transcript file format]")
+    parser.add_option("-o", "--output",    dest="outputFileName", action="store",             type="string", help="output file [format: output file in GFF3 format]")
+    parser.add_option("-v", "--verbosity", dest="verbosity",      action="store",  default=1, type="int",    help="trace level [format: int]")
+    (options, args) = parser.parse_args()
+
+    gi = GetIntrons(options.verbosity)
+    gi.setInputFile(options.inputFileName, options.format)
+    gi.setOutputFile(options.outputFileName)
+    gi.run()
b
diff -r d22fadc825e3 -r 2c0c0a89fad7 SMART/Java/Python/getLetterDistribution.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/SMART/Java/Python/getLetterDistribution.py Thu May 02 09:56:47 2013 -0400
[
@@ -0,0 +1,153 @@
+#! /usr/bin/env python
+#
+# Copyright INRA-URGI 2009-2010
+# 
+# This software is governed by the CeCILL license under French law and
+# abiding by the rules of distribution of free software. You can use,
+# modify and/ or redistribute the software under the terms of the CeCILL
+# license as circulated by CEA, CNRS and INRIA at the following URL
+# "http://www.cecill.info".
+# 
+# As a counterpart to the access to the source code and rights to copy,
+# modify and redistribute granted by the license, users are provided only
+# with a limited warranty and the software's author, the holder of the
+# economic rights, and the successive licensors have only limited
+# liability.
+# 
+# In this respect, the user's attention is drawn to the risks associated
+# with loading, using, modifying and/or developing or reproducing the
+# software by the user in light of its specific status of free software,
+# that may mean that it is complicated to manipulate, and that also
+# therefore means that it is reserved for developers and experienced
+# professionals having in-depth computer knowledge. Users are therefore
+# encouraged to load and test the software's suitability as regards their
+# requirements in conditions enabling the security of their systems and/or
+# data to be ensured and, more generally, to use and operate it in the
+# same conditions as regards security.
+# 
+# The fact that you are presently reading this means that you have had
+# knowledge of the CeCILL license and that you accept its terms.
+#
+"""Get the size distribution of a Fasta / BED file"""
+
+import os
+from optparse import OptionParser
+from commons.core.parsing.FastaParser import *
+from SMART.Java.Python.misc.Progress import *
+from SMART.Java.Python.misc.RPlotter import *
+from commons.core.parsing.ParserChooser import ParserChooser
+
+
+def writeCVSfile(outHandler):
+    for pos in range(len(letters)):
+        posTrue = pos +1
+        outHandler.write( "%s;" % (posTrue))
+        for letter in lettersRate:
+            if positionRate[letter].has_key(pos):
+                outHandler.write("%s=%.2f%s;" %(letter, positionRate[letter][pos], "%"))
+            else:
+                outHandler.write("%s=0%s;" % (letter, "%"))
+        outHandler.write("\n")
+
+if __name__ == "__main__":
+
+    # parse command line
+    description = "Get Letter Distribution v1.0.1: Compute the distribution of nucleotides of a set of genomic coordinates. [Category: Visualization]"
+
+    parser = OptionParser(description = description)
+    parser.add_option("-i", "--input",     dest="inputFileName",  action="store",                     type="string", help="input file to be analyzed [compulsory] [format: file in sequence format given by -f]")
+    parser.add_option("-f", "--format",    dest="format",         action="store",                     type="string", help="format of file [format: sequence file format]")
+    parser.add_option("-o", "--output",    dest="outputFileName", action="store",                     type="string", help="output file [compulsory] [format: output file in PNG format]")
+    parser.add_option("-v", "--verbosity", dest="verbosity",      action="store",      default=1,     type="int",    help="trace level [format: int]")
+    parser.add_option("-c", "--csv",       dest="csv",            action="store_true", default=False,                help="write a .csv file [format: bool] [default: false]")
+    parser.add_option("-l", "--log",       dest="log",            action="store_true", default=False,                help="write a log file [format: bool] [default: false]")
+    (options, args) = parser.parse_args()
+
+    chooser = ParserChooser()
+    chooser.findFormat(options.format)    
+    parser      = chooser.getParser(options.inputFileName)
+    nbSequences = parser.getNbSequences()
+    print "%i sequences read" % (nbSequences)
+
+    # treat items
+    progress       = Progress(nbSequences, "Analyzing sequences of " + options.inputFileName, options.verbosity)
+    nbLettersTotal = 0
+    nbLetters      = {}
+    lettersRate    = {}
+    nbPositions    = {}
+    positionCount  = {}
+    positionRate   = {}
+    nbPositionRate = {}
+    for sequence in parser.getIterator():
+        letters            = sequence.getSequence()
+        thisNbLettersTotal = sequence.getSize()
+        nbLettersTotal    += thisNbLettersTotal
+        thisNbLetters      = {}
+        
+        for pos in range(len(letters)):
+            letter = letters[pos]
+            if letter not in thisNbLetters:
+                thisNbLetters[letter] = 1
+            else:
+                thisNbLetters[letter] += 1
+            if pos+1 not in nbPositions:
+                nbPositions[pos+1] = 1
+            else:
+                nbPositions[pos+1] += 1
+            if letter not in positionCount:
+                positionCount[letter] = {}
+            if pos+1 not in positionCount[letter]:
+                positionCount[letter][pos+1] = 1
+            else:
+                positionCount[letter][pos+1] += 1
+
+        for letter in thisNbLetters:
+            if letter not in nbLetters:
+                nbLetters[letter] = thisNbLetters[letter]
+            else:
+                nbLetters[letter] += thisNbLetters[letter]
+            if letter not in lettersRate:
+                lettersRate[letter] = {}
+            rate = int(float(thisNbLetters[letter]) / thisNbLettersTotal * 100)
+            if rate not in lettersRate[letter]:
+                lettersRate[letter][rate] = 1
+            else:
+                lettersRate[letter][rate] += 1
+        progress.inc()
+    progress.done()
+    
+    for letter in positionCount:
+        positionRate[letter] = {}
+        for pos in positionCount[letter]:
+            positionRate[letter][pos] = positionCount[letter][pos] / float(nbPositions[pos]) * 100
+    for pos in nbPositions:
+        nbPositionRate[pos] = nbPositions[pos] / float(nbPositions[1]) * 100
+
+    # plot content distributions
+    plotter = RPlotter("%s.png" % (options.outputFileName), options.verbosity, True)
+    plotter.setFill(0)
+    plotter.setLegend(True)
+    for letter in lettersRate:
+        plotter.addLine(lettersRate[letter], letter)
+    plotter.plot()
+    
+    # plot distribution per position
+    plotter = RPlotter("%sPerNt.png" % (options.outputFileName), options.verbosity, True)
+    plotter.setFill(0)
+    plotter.setLegend(True)
+    plotter.setXLabel("Position on the read")
+    plotter.setYLabel("Percentage")
+    for letter in positionRate:
+        plotter.addLine(positionRate[letter], letter)
+    plotter.addLine(nbPositionRate, "#")
+    plotter.plot()
+
+    if options.csv:
+        outHandler = open("%s.csv" % (options.outputFileName), "w")
+        writeCVSfile(outHandler)
+        outHandler.close() 

+    print "%d sequences" % (nbSequences)
+    print "%d letters" % (nbLettersTotal)
+    for letter in nbLetters:
+        print "%s: %d (%.2f%%)" % (letter, nbLetters[letter], float(nbLetters[letter]) / nbLettersTotal * 100)
b
diff -r d22fadc825e3 -r 2c0c0a89fad7 SMART/Java/Python/getNb.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/SMART/Java/Python/getNb.py Thu May 02 09:56:47 2013 -0400
[
@@ -0,0 +1,99 @@
+#! /usr/bin/env python
+#
+# Copyright INRA-URGI 2009-2010
+# 
+# This software is governed by the CeCILL license under French law and
+# abiding by the rules of distribution of free software. You can use,
+# modify and/ or redistribute the software under the terms of the CeCILL
+# license as circulated by CEA, CNRS and INRIA at the following URL
+# "http://www.cecill.info".
+# 
+# As a counterpart to the access to the source code and rights to copy,
+# modify and redistribute granted by the license, users are provided only
+# with a limited warranty and the software's author, the holder of the
+# economic rights, and the successive licensors have only limited
+# liability.
+# 
+# In this respect, the user's attention is drawn to the risks associated
+# with loading, using, modifying and/or developing or reproducing the
+# software by the user in light of its specific status of free software,
+# that may mean that it is complicated to manipulate, and that also
+# therefore means that it is reserved for developers and experienced
+# professionals having in-depth computer knowledge. Users are therefore
+# encouraged to load and test the software's suitability as regards their
+# requirements in conditions enabling the security of their systems and/or
+# data to be ensured and, more generally, to use and operate it in the
+# same conditions as regards security.
+# 
+# The fact that you are presently reading this means that you have had
+# knowledge of the CeCILL license and that you accept its terms.
+#
+"""Get the repartition of some elements (# exons per transcripts, # of repetitions of a mapping or # of transcripts in a cluster)"""
+
+from optparse import OptionParser
+from SMART.Java.Python.structure.TranscriptContainer import TranscriptContainer
+from SMART.Java.Python.misc.RPlotter import RPlotter
+from SMART.Java.Python.misc.Progress import Progress
+from SMART.Java.Python.misc import Utils
+from math import *
+
+if __name__ == "__main__":
+    
+    # parse command line
+    description = "Get Nb v1.0.1: Get the distribution of exons per transcripts, or mapping per read, or transcript per cluster. [Category: Visualization]"
+
+    parser = OptionParser(description = description)
+    parser.add_option("-i", "--input",     dest="inputFileName",  action="store",                     type="string", help="input file [compulsory] [format: file in transcript format given by -f]")
+    parser.add_option("-f", "--format",    dest="format",         action="store",                     type="string", help="format of the input file [compulsory] [format: transcript file format]")
+    parser.add_option("-o", "--output",    dest="outputFileName", action="store",                     type="string", help="output file [compulsory] [format: output file in png format]")
+    parser.add_option("-q", "--query",     dest="query",          action="store",                     type="string", help="query  [compulsory] (# exons, # transcripts) [format: choice (exon, transcript, cluster)]")    
+    parser.add_option("-b", "--barplot",   dest="barplot",        action="store_true", default=False,                help="use barplot representation [format: bool] [default: false]")
+    parser.add_option("-x", "--xMax",      dest="xMax",           action="store",      default=None,  type="int",    help="maximum value on the x-axis to plot [format: int]")
+    parser.add_option("-v", "--verbosity", dest="verbosity",      action="store",      default=1,     type="int",    help="trace level [default: 1] [format: int]")
+    parser.add_option("-l", "--log",       dest="log",            action="store_true", default=False,                help="write a log file [format: bool] [default: false]")
+    (options, args) = parser.parse_args()
+
+    if options.query != "exon" and options.query != "transcript" and options.query != "cluster":
+        raise Exception("Do not understand query %s" % (options.query))
+
+    exonDistribution       = {}
+    transcriptDistribution = {}
+    clusterDistribution    = {}
+    
+    transcriptContainer = TranscriptContainer(options.inputFileName, options.format, options.verbosity)
+        
+    progress = Progress(transcriptContainer.getNbTranscripts(), "Parsing %s" % (options.inputFileName), options.verbosity)
+    # count the number of reads
+    for element in transcriptContainer.getIterator():
+        if options.query == "exon":
+            nbExons = element.getNbExons()
+            exonDistribution[nbExons] = exonDistribution.get(nbExons, 0) + 1
+        elif options.query == "transcript":
+            name = element.getName()
+            transcriptDistribution[name] = transcriptDistribution.get(name, 0) + 1
+        elif options.query == "cluster":
+            nbElements = 1 if "nbElements" not in element.getTagNames() else element.getTagValue("nbElements")
+            clusterDistribution[nbElements] = clusterDistribution.get(nbElements, 0) + 1
+        progress.inc()
+    progress.done()
+    
+    if options.query == "exon":
+        distribution = exonDistribution
+    elif options.query == "transcript":
+        distribution = {}
+        for name in transcriptDistribution:
+            distribution[transcriptDistribution[name]] = distribution.get(transcriptDistribution[name], 0) + 1
+    elif options.query == "cluster":
+        distribution = clusterDistribution
+    
+    outputFileName = options.outputFileName
+    plotter = RPlotter(outputFileName, options.verbosity)
+    plotter.setImageSize(1000, 300)
+    plotter.setFill(0)
+    plotter.setMaximumX(options.xMax)
+    plotter.setBarplot(options.barplot)
+    plotter.addLine(distribution)
+    plotter.plot()
+             
+    print "min/avg/med/max: %d/%.2f/%.1f/%d" % (Utils.getMinAvgMedMax(distribution))
+            
b
diff -r d22fadc825e3 -r 2c0c0a89fad7 SMART/Java/Python/getRandomRegions.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/SMART/Java/Python/getRandomRegions.py Thu May 02 09:56:47 2013 -0400
[
b'@@ -0,0 +1,267 @@\n+#! /usr/bin/env python\n+#\n+# Copyright INRA-URGI 2009-2010\n+# \n+# This software is governed by the CeCILL license under French law and\n+# abiding by the rules of distribution of free software. You can use,\n+# modify and/ or redistribute the software under the terms of the CeCILL\n+# license as circulated by CEA, CNRS and INRIA at the following URL\n+# "http://www.cecill.info".\n+# \n+# As a counterpart to the access to the source code and rights to copy,\n+# modify and redistribute granted by the license, users are provided only\n+# with a limited warranty and the software\'s author, the holder of the\n+# economic rights, and the successive licensors have only limited\n+# liability.\n+# \n+# In this respect, the user\'s attention is drawn to the risks associated\n+# with loading, using, modifying and/or developing or reproducing the\n+# software by the user in light of its specific status of free software,\n+# that may mean that it is complicated to manipulate, and that also\n+# therefore means that it is reserved for developers and experienced\n+# professionals having in-depth computer knowledge. Users are therefore\n+# encouraged to load and test the software\'s suitability as regards their\n+# requirements in conditions enabling the security of their systems and/or\n+# data to be ensured and, more generally, to use and operate it in the\n+# same conditions as regards security.\n+# \n+# The fact that you are presently reading this means that you have had\n+# knowledge of the CeCILL license and that you accept its terms.\n+#\n+"""Find random regions in a genome"""\n+\n+import random, math\n+from optparse import OptionParser\n+from commons.core.parsing.FastaParser import *\n+from commons.core.writer.Gff3Writer import *\n+from commons.core.writer.MySqlTranscriptWriter import *\n+from SMART.Java.Python.misc.Progress import *\n+from SMART.Java.Python.structure.Transcript import Transcript\n+from SMART.Java.Python.structure.TranscriptContainer import TranscriptContainer\n+\n+repetitions = 100\n+\n+\n+class RandomRegionsGenerator(object):\n+\n+    def __init__(self, verbosity):\n+        self.verbosity      = verbosity\n+        self.strands        = False\n+        self.distribution   = "uniform"\n+        self.transcripts    = None\n+        self.sequenceParser = None\n+        random.seed()\n+\n+\n+    def setInput(self, fileName):\n+        self.sequenceParser = FastaParser(fileName, self.verbosity)\n+\n+\n+    def setGenomeSize(self, size):\n+        self.genomeSize = size\n+\n+\n+    def setChromosomeName(self, name):\n+        self.chromosomeName = name\n+\n+\n+    def setAnnotation(self, fileName, format):\n+        parser           = TranscriptContainer(fileName, format, self.verbosity)\n+        self.transcripts = []\n+        for transcript in parser.getIterator():\n+            self.transcripts.append(transcript)\n+        self.setNumber(len(self.transcripts))\n+        self.setSize(0)\n+\n+\n+    def setOutputFile(self, fileName):\n+        self.outputFileName = fileName\n+\n+\n+    def setSize(self, size):\n+        self.minSize = size\n+        self.maxSize = size\n+\n+\n+    def setMinSize(self, size):\n+        self.minSize = size\n+\n+\n+    def setMaxSize(self, size):\n+        self.maxSize = size\n+\n+\n+    def setNumber(self, number):\n+        self.number = number\n+\n+\n+    def setStrands(self, strands):\n+        self.strands = strands\n+\n+\n+    def setMaxDistribution(self, maxElements):\n+        if maxElements == None:\n+            return\n+        self.maxElements = maxElements\n+        self.distribution = "gaussian"\n+\n+\n+    def setDeviationDistribution(self, deviation):\n+        if deviation == None:\n+            return\n+        self.deviation = deviation\n+        self.distribution = "gaussian"\n+\n+\n+    def getSizes(self):\n+        if self.sequenceParser == None:\n+            self.chromosomes    = [self.chromosomeName]\n+            self.sizes          = {self.chromosomeName: self.genomeSize}\n+            self.cumulatedSize  = self.genomeSize\n+            self.cumulatedSizes = {'..b'n(self):\n+        self.getSizes()\n+        self.writeRegions()\n+\n+\n+if __name__ == "__main__":\n+    \n+    # parse command line\n+    description = "Get Random Regions v1.0.2: Get some random coordinates on a genome. May use uniform or gaussian distribution (in gaussion distribution, # of element per cluster follows a power law). [Category: Other]"\n+\n+    parser = OptionParser(description = description)\n+    parser.add_option("-r", "--reference",     dest="reference",      action="store",      default=None,  type="string", help="file that contains the sequences [format: file in FASTA format]")\n+    parser.add_option("-S", "--referenceSize", dest="referenceSize",  action="store",      default=None,  type="int",    help="size of the chromosome (when no reference is given) [format: int]")\n+    parser.add_option("-c", "--chromosome",    dest="chromosome",     action="store",      default=None,  type="string", help="name of the chromosome (when no reference is given) [format: string]")\n+    parser.add_option("-o", "--output",        dest="outputFileName", action="store",                     type="string", help="output file [compulsory] [format: output file in FASTA format]")\n+    parser.add_option("-i", "--input",         dest="inputFileName",  action="store",      default=None,  type="string", help="optional file containing regions to shuffle [format: file in transcript format given by -f]")\n+    parser.add_option("-f", "--format",        dest="format",         action="store",      default=None,  type="string", help="format of the previous file [format: transcript file format]")\n+    parser.add_option("-s", "--size",          dest="size",           action="store",      default=None,  type="int",    help="size of the regions (if no region set is provided) [format: int]")\n+    parser.add_option("-z", "--minSize",       dest="minSize",        action="store",      default=None,  type="int",    help="minimum size of the regions (if no region set nor a fixed size are provided) [format: int]")\n+    parser.add_option("-Z", "--maxSize",       dest="maxSize",        action="store",      default=None,  type="int",    help="maximum size of the regions (if no region set nor a fixed size are provided) [format: int]")\n+    parser.add_option("-n", "--number",        dest="number",         action="store",      default=None,  type="int",    help="number of regions (if no region set is provided) [format: int]")\n+    parser.add_option("-t", "--strands",       dest="strands",        action="store_true", default=False,                help="use both strands (if no region set is provided) [format: boolean]")\n+    parser.add_option("-m", "--max",           dest="max",            action="store",      default=None,  type="int",    help="max. # reads in a cluster (for Gaussian dist.) [format: int]")\n+    parser.add_option("-d", "--deviation",     dest="deviation",      action="store",      default=None,  type="int",    help="deviation around the center of the cluster (for Gaussian dist.) [format: int]")\n+    parser.add_option("-v", "--verbosity",     dest="verbosity",      action="store",      default=1,     type="int",    help="trace level [format: int]")\n+    (options, args) = parser.parse_args()\n+\n+    rrg = RandomRegionsGenerator(options.verbosity)\n+    if options.reference == None:\n+        rrg.setGenomeSize(options.referenceSize)\n+        rrg.setChromosomeName(options.chromosome)\n+    else:\n+        rrg.setInput(options.reference)\n+    rrg.setOutputFile(options.outputFileName)\n+    if options.inputFileName == None:\n+        if options.size != None:\n+            rrg.setSize(options.size)\n+        else:\n+            rrg.setMinSize(options.minSize)\n+            rrg.setMaxSize(options.maxSize)\n+        rrg.setNumber(options.number)\n+        rrg.setStrands(options.strands)\n+    else:\n+        rrg.setAnnotation(options.inputFileName, options.format)\n+    rrg.setMaxDistribution(options.max)\n+    rrg.setDeviationDistribution(options.deviation)\n+    rrg.run()\n+\n'
b
diff -r d22fadc825e3 -r 2c0c0a89fad7 SMART/Java/Python/getReadDistribution.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/SMART/Java/Python/getReadDistribution.py Thu May 02 09:56:47 2013 -0400
[
@@ -0,0 +1,129 @@
+#! /usr/bin/env python
+#
+# Copyright INRA-URGI 2009-2010
+# 
+# This software is governed by the CeCILL license under French law and
+# abiding by the rules of distribution of free software. You can use,
+# modify and/ or redistribute the software under the terms of the CeCILL
+# license as circulated by CEA, CNRS and INRIA at the following URL
+# "http://www.cecill.info".
+# 
+# As a counterpart to the access to the source code and rights to copy,
+# modify and redistribute granted by the license, users are provided only
+# with a limited warranty and the software's author, the holder of the
+# economic rights, and the successive licensors have only limited
+# liability.
+# 
+# In this respect, the user's attention is drawn to the risks associated
+# with loading, using, modifying and/or developing or reproducing the
+# software by the user in light of its specific status of free software,
+# that may mean that it is complicated to manipulate, and that also
+# therefore means that it is reserved for developers and experienced
+# professionals having in-depth computer knowledge. Users are therefore
+# encouraged to load and test the software's suitability as regards their
+# requirements in conditions enabling the security of their systems and/or
+# data to be ensured and, more generally, to use and operate it in the
+# same conditions as regards security.
+# 
+# The fact that you are presently reading this means that you have had
+# knowledge of the CeCILL license and that you accept its terms.
+#
+"""
+Plot the data from the data files
+"""
+import os
+from optparse import OptionParser
+from commons.core.parsing.FastaParser import FastaParser
+from commons.core.parsing.FastqParser import FastqParser
+from SMART.Java.Python.misc.RPlotter import RPlotter
+from SMART.Java.Python.misc.Progress import Progress
+from SMART.Java.Python.misc import Utils
+
+
+if __name__ == "__main__":
+    
+    # parse command line
+    description = "Get Read Distribution v1.0.1: Plot the number of identical reads and give the most represented. [Category: Visualization]"
+
+    parser = OptionParser(description = description)
+    parser.add_option("-i", "--input",     dest="inputFileName",  action="store",               type="string", help="input file sequence [compulsory] [format: file in sequence format given by -f]")
+    parser.add_option("-f", "--format",    dest="format",         action="store",               type="string", help="format of the file [compulsory] [format: sequence file format]")
+    parser.add_option("-n", "--number",    dest="number",         action="store", default=None, type="int",    help="keep the best n    [format: int]")
+    parser.add_option("-p", "--percent",   dest="percent",        action="store", default=None, type="float",  help="keep the best n\% [format: float]")
+    parser.add_option("-o", "--output",    dest="outputFileName", action="store",               type="string", help="output file [compulsory] [format: output files in PNG format and txt format]")
+    parser.add_option("-x", "--xMax",      dest="xMax",           action="store", default=None, type="int",    help="maximum value on the x-axis to plot [format: int]")
+    parser.add_option("-D", "--directory", dest="working_Dir",    action="store", default=os.getcwd(), type="string", help="the directory to store the results [format: directory]")
+    parser.add_option("-v", "--verbosity", dest="verbosity",      action="store", default=1,    type="int",    help="trace level [format: int]")
+    (options, args) = parser.parse_args()
+
+    if options.working_Dir[-1] != '/':
+        options.outputFileName = options.working_Dir + '/' + options.outputFileName
+        
+    if options.format == "fasta":
+        parser = FastaParser(options.inputFileName, options.verbosity)
+    elif options.format == "fastq":
+        parser = FastqParser(options.inputFileName, options.verbosity)
+    else:
+        raise Exception("Do not understand '%s' file format." % (options.format))
+
+    progress  = Progress(parser.getNbSequences(), "Reading %s" % (options.inputFileName), options.verbosity)
+    sequences = {}
+    for sequence in parser.getIterator():
+        sequence = sequence.sequence
+        if sequence not in sequences:
+            sequences[sequence] = 1
+        else:
+            sequences[sequence] += 1
+        progress.inc()
+    progress.done()
+
+    values = sequences.values()
+    values.sort()
+    if options.percent != None:
+        threshold = values[int(float(options.percent) / 100 * len(values))]
+    elif options.number != None:
+        threshold = values[-options.number]
+    else:
+        threshold = 0
+
+    # sort by value
+    progress     = Progress(parser.getNbSequences(), "Sorting values", options.verbosity)
+    sortedValues = dict([(value, []) for value in sequences.values()])
+    for sequence, value in sequences.iteritems():
+        sortedValues[value].append(sequence)
+        progress.inc()
+    progress.done()
+
+    outputFileName = "%s.txt" % (options.outputFileName)
+    handle         = open(outputFileName, "w")
+    progress       = Progress(parser.getNbSequences(), "Writing into %s" % (outputFileName), options.verbosity)
+    for value in reversed(sorted(sortedValues.keys())):
+        if value >= threshold:
+            for sequence in sortedValues[value]:
+                handle.write("%s\t%d\n" % (sequence, value))
+        progress.inc()
+    progress.done()
+    handle.close()
+
+    line     = {}
+    progress = Progress(len(values), "Preparing plot", options.verbosity)
+    for value in values:
+        if value not in line:
+            line[value] = 1
+        else:
+            line[value] += 1
+        progress.inc()
+    progress.done()
+
+    plot = RPlotter("%s.png" % (options.outputFileName), options.verbosity)
+    plot.setFill(0)
+    plot.setMaximumX(options.xMax)
+    plot.setXLabel("# occurrences")
+    plot.setYLabel("# reads")
+    plot.addLine(line)
+    plot.plot()
+
+    if options.verbosity > 0:
+        print "%d/%.2f/%.1f/%d occurrences" % (Utils.getMinAvgMedMax(line))
+
+
b
diff -r d22fadc825e3 -r 2c0c0a89fad7 SMART/Java/Python/getSequence.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/SMART/Java/Python/getSequence.py Thu May 02 09:56:47 2013 -0400
[
@@ -0,0 +1,60 @@
+#! /usr/bin/env python
+#
+# Copyright INRA-URGI 2009-2010
+# 
+# This software is governed by the CeCILL license under French law and
+# abiding by the rules of distribution of free software. You can use,
+# modify and/ or redistribute the software under the terms of the CeCILL
+# license as circulated by CEA, CNRS and INRIA at the following URL
+# "http://www.cecill.info".
+# 
+# As a counterpart to the access to the source code and rights to copy,
+# modify and redistribute granted by the license, users are provided only
+# with a limited warranty and the software's author, the holder of the
+# economic rights, and the successive licensors have only limited
+# liability.
+# 
+# In this respect, the user's attention is drawn to the risks associated
+# with loading, using, modifying and/or developing or reproducing the
+# software by the user in light of its specific status of free software,
+# that may mean that it is complicated to manipulate, and that also
+# therefore means that it is reserved for developers and experienced
+# professionals having in-depth computer knowledge. Users are therefore
+# encouraged to load and test the software's suitability as regards their
+# requirements in conditions enabling the security of their systems and/or
+# data to be ensured and, more generally, to use and operate it in the
+# same conditions as regards security.
+# 
+# The fact that you are presently reading this means that you have had
+# knowledge of the CeCILL license and that you accept its terms.
+#
+"""Get a given sequence in a multi-Fasta file"""
+import sys
+from optparse import OptionParser
+from commons.core.parsing.FastaParser import FastaParser
+from SMART.Java.Python.misc.Progress import Progress
+from commons.core.writer.FastaWriter import FastaWriter
+
+if __name__ == "__main__":
+    
+    # parse command line
+    description = "Get Sequence v1.0.1: Get a single sequence in a FASTA file. [Category: Data Selection]"
+
+    parser = OptionParser(description = description)
+    parser.add_option("-i", "--input", dest="inputFileName",action="store",type="string", help="multi-FASTA file [compulsory] [format: file in FASTA format]")
+    parser.add_option("-n", "--name",dest="name",action="store",type="string", help="name of the sequence [compulsory] [format: string]")
+    parser.add_option("-o", "--output",dest="outputFileName",action="store",type="string", help="output sequence file (FASTA) [compulsory] [format: file in FASTA format]")
+    parser.add_option("-v", "--verbosity", dest="verbosity",action="store",default=1,type="int",help="trace level [format: int]")
+    (options, args) = parser.parse_args()
+
+    # read Fasta file
+    sequenceListParser = FastaParser(options.inputFileName, options.verbosity)
+    for sequence in sequenceListParser.getIterator():
+        name = sequence.name.split(" ")[0]
+        if name == options.name:
+            writer = FastaWriter(options.outputFileName, options.verbosity)
+            writer.addSequence(sequence)
+            print sequence.printFasta(),
+            sys.exit(0)
+    writer.close()
+    print "No sequence found"
b
diff -r d22fadc825e3 -r 2c0c0a89fad7 SMART/Java/Python/getSizes.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/SMART/Java/Python/getSizes.py Thu May 02 09:56:47 2013 -0400
[
b'@@ -0,0 +1,218 @@\n+#! /usr/bin/env python\n+#\n+# Copyright INRA-URGI 2009-2010\n+# \n+# This software is governed by the CeCILL license under French law and\n+# abiding by the rules of distribution of free software. You can use,\n+# modify and/ or redistribute the software under the terms of the CeCILL\n+# license as circulated by CEA, CNRS and INRIA at the following URL\n+# "http://www.cecill.info".\n+# \n+# As a counterpart to the access to the source code and rights to copy,\n+# modify and redistribute granted by the license, users are provided only\n+# with a limited warranty and the software\'s author, the holder of the\n+# economic rights, and the successive licensors have only limited\n+# liability.\n+# \n+# In this respect, the user\'s attention is drawn to the risks associated\n+# with loading, using, modifying and/or developing or reproducing the\n+# software by the user in light of its specific status of free software,\n+# that may mean that it is complicated to manipulate, and that also\n+# therefore means that it is reserved for developers and experienced\n+# professionals having in-depth computer knowledge. Users are therefore\n+# encouraged to load and test the software\'s suitability as regards their\n+# requirements in conditions enabling the security of their systems and/or\n+# data to be ensured and, more generally, to use and operate it in the\n+# same conditions as regards security.\n+# \n+# The fact that you are presently reading this means that you have had\n+# knowledge of the CeCILL license and that you accept its terms.\n+#\n+import os, sys\n+from optparse import OptionParser\n+from commons.core.parsing.FastaParser import FastaParser\n+from commons.core.parsing.FastqParser import FastqParser\n+from SMART.Java.Python.structure.TranscriptContainer import TranscriptContainer\n+from commons.core.parsing.GffParser import GffParser\n+from SMART.Java.Python.misc.Progress import Progress\n+from SMART.Java.Python.misc.RPlotter import RPlotter\n+from SMART.Java.Python.misc import Utils\n+\n+from commons.core.LoggerFactory import LoggerFactory\n+from commons.core.utils.RepetOptionParser import RepetOptionParser\n+\n+LOG_DEPTH = "smart"\n+\n+class GetSizes(object):\n+\t\n+\tdef __init__(self, inFileName = None, inFormat=None, outFileName = None, query=None,xMax=None, xMin=None, verbosity = 0):\n+\t\tself.inFileName = inFileName\n+\t\tself.inFormat= inFormat\n+\t\tself.outFileName = outFileName\n+\t\tself.query = query\n+\t\tself.xMax = xMax\n+\t\tself.xMin = xMin\n+\t\tself.xLab = "Size"\n+\t\tself.yLab = "# reads"\n+\t\tself.barplot = False\n+\t\tself._verbosity = verbosity\n+\t\tself.parser = None\n+\t\tself._log = LoggerFactory.createLogger("%s.%s" % (LOG_DEPTH, self.__class__.__name__), self._verbosity)\n+\t\t\n+\tdef setAttributesFromCmdLine(self):\n+\t\tdescription = "Usage: getSizes.py [options]\\n\\nGet Sizes v1.0.2: Get the sizes of a set of genomic coordinates. [Category: Visualization]\\n"\n+\t\tepilog = ""\n+\t\tparser = RepetOptionParser(description = description, epilog = epilog)\n+\t\tparser.add_option("-i", "--input",\t dest="inputFileName", action="store",\t    default=None,\t   type="string", help="input file [compulsory] [format: file in transcript or sequence format given by -f]")\n+\t\tparser.add_option("-f", "--format",\tdest="format",\t\t   action="store",\t    default=None,\t   type="string", help="format of the input [compulsory] [format: transcript or sequence file format]")\n+\t\tparser.add_option("-q", "--query",\t dest="query",\t\t   action="store",\t    default=None,\t   type="string", help="type to mesure [default: size] [format: choice (size, intron size, exon size, 1st exon size)]")\t \n+\t\tparser.add_option("-o", "--output",\tdest="outputFileName", action="store",\t    default=None,\t   type="string", help="output file [format: output file in PNG format]")\n+\t\tparser.add_option("-x", "--xMax",\t  dest="xMax",\t\t   action="store",\t    default=None,\t   type="int",\t  help="maximum value on the x-axis to plot [format: int]")\n+\t\tparser.add_option("-X", "--xMin",\t  dest="xMin",\t\t   action="store",\t    default=None,\t '..b'="store_true", default=False,\t\t\t\t\t  help="use barplot representation [format: bool] [default: false]")  \n+\t\toptions = parser.parse_args()[0]\n+\t\tself._setAttributesFromOptions(options)\n+\t\t\n+\tdef _setAttributesFromOptions(self, options):\n+\t\tself.setInFileName(options.inputFileName)\n+\t\tself.setInFormat(options.format)\n+\t\tself.setQuery(options.query)\n+\t\tself.setOutFileName(options.outputFileName)\n+\t\tself.setXMax(options.xMax)\n+\t\tself.setXMin(options.xMin)\n+\t\tself.setxLab(options.xLab)\n+\t\tself.setyLab(options.yLab)\n+\t\tself.setBarplot(options.barplot)\n+\t\tself.setVerbosity(options.verbosity)\n+\t\t\n+\tdef setInFileName(self, inputFileName):\n+\t\tself.inFileName = inputFileName\n+\t\t\n+\tdef setInFormat(self, inFormat):\n+\t\tself.inFormat = inFormat\n+\t\n+\tdef setQuery(self, query):\n+\t\tself.query = query\n+\t\t\n+\tdef setOutFileName(self, outFileName):\n+\t\tself.outFileName = outFileName\n+\t\n+\tdef setXMax(self, xMax):\n+\t\tself.xMax = xMax\n+\t\t\n+\tdef setXMin(self, xMin):\n+\t\tself.xMin = xMin\n+\t\n+\tdef setxLab(self, xLab):\n+\t\tself.xLab = xLab\n+\t\t\n+\tdef setyLab(self, yLab):\n+\t\tself.yLab = yLab\n+\t\t\n+\tdef setBarplot(self, barplot):\n+\t\tself.barplot = barplot\n+\t\t\n+\tdef setVerbosity(self, verbosity):\n+\t\tself._verbosity = verbosity\n+\t\t\n+\tdef _checkOptions(self):\n+\t\tif self.inFileName == None:\n+\t\t\tself._logAndRaise("ERROR: Missing input file name")\n+\t\tif self.inFormat == "fasta":\n+\t\t\tself.parser = FastaParser(self.inFileName, self._verbosity)\n+\t\telif self.inFormat == "fastq":\n+\t\t\tself.parser = FastqParser(self.inFileName, self._verbosity)\n+\t\telse:\n+\t\t\tself.parser = TranscriptContainer(self.inFileName, self.inFormat, self._verbosity)\n+\t\t\t\n+\tdef _logAndRaise(self, errorMsg):\n+\t\tself._log.error(errorMsg)\n+\t\traise Exception(errorMsg)\n+\n+\tdef run(self):\n+\t\tLoggerFactory.setLevel(self._log, self._verbosity)\n+\t\tself._checkOptions()\n+\t\tself._log.info("START getsizes")\n+\t\tself._log.debug("Input file name: %s" % self.inFileName)\n+\n+\t\tnbItems = self.parser.getNbItems()\n+\t\tself._log.info( "%i items found" % (nbItems))\n+\t\t\n+\t\t# treat items\n+\t\tprogress   = Progress(nbItems, "Analyzing sequences of %s" % (self.inFileName), self._verbosity)\n+\t\tsizes      = {}\n+\t\tminimum\t   = 1000000000000\n+\t\tmaximum\t   = 0\n+\t\tsum\t\t   = 0\n+\t\tnumber     = 0\n+\t\tnbSubItems = 0\n+\t\tfor item in self.parser.getIterator():\n+\t\t\titems = []\n+\t\t\tif self.query == "exon":\n+\t\t\t\titems = item.getExons()\n+\t\t\telif self.query == "exon1":\n+\t\t\t\tif len(item.getExons()) > 1:\n+\t\t\t\t\titem.sortExons()\n+\t\t\t\t\titems = [item.getExons()[0]]\n+\t\t\telif self.query == "intron":\n+\t\t\t\titems = item.getIntrons()\n+\t\t\telse:\n+\t\t\t\titems = [item, ]\n+\t\n+\t\t\tfor thisItem in items:\n+\t\t\t\ttry:\n+\t\t\t\t\tnbElements = int(float(thisItem.getTagValue("nbElements")))\n+\t\t\t\t\tif nbElements == None:\n+\t\t\t\t\t\tnbElements = 1\n+\t\t\t\texcept:\n+\t\t\t\t\tnbElements = 1\n+\t\t\t\tsize\t= thisItem.getSize()\n+\t\t\t\tminimum = min(minimum, size)\n+\t\t\t\tmaximum = max(maximum, size)\n+\t\t\t\t\n+\t\t\t\tif size not in sizes:\n+\t\t\t\t\tsizes[size] = nbElements\n+\t\t\t\telse:\n+\t\t\t\t\tsizes[size] += nbElements\n+\t\t\t\tsum\t\t+= size\n+\t\t\t\tnbSubItems += nbElements\n+\t\t\tnumber += 1\n+\t\t\tprogress.inc()\n+\t\tprogress.done()\n+\n+\t\tif self.outFileName != None:\n+\t\t\tplotter = RPlotter(self.outFileName, self._verbosity)\n+\t\t\tplotter.setFill(0)\n+\t\t\tplotter.setMinimumX(self.xMin)\n+\t\t\tplotter.setMaximumX(self.xMax)\n+\t\t\tplotter.setXLabel(self.xLab)\n+\t\t\tplotter.setYLabel(self.yLab)\n+\t\t\tplotter.setBarplot(self.barplot)\n+\t\t\tplotter.addLine(sizes)\n+\t\t\tplotter.plot()\n+\t\t\t\n+\t\tif nbSubItems == 0:\n+\t\t\tself._logAndRaise("No item found")\n+\t\t\t\n+\t\tself.items = number\t  \n+\t\tself.subItems = nbSubItems\n+\t\tself.nucleotides = sum\n+\t\tself.minAvgMedMax = Utils.getMinAvgMedMax(sizes)\n+\t\t\t\t  \n+\t\tprint "%d items" % (number)\n+\t\tprint "%d sub-items" % (nbSubItems)\n+\t\tprint "%d nucleotides" % (sum)\n+\t\tprint "min/avg/med/max transcripts: %d/%.2f/%.1f/%d" % Utils.getMinAvgMedMax(sizes)\n+\n+\t\tself._log.info("END getsizes")\n+\n+\n+if __name__ == "__main__":\n+\tiGetSizes = GetSizes()\n+\tiGetSizes.setAttributesFromCmdLine()\n+\tiGetSizes.run()\n+\t\n+#TODO: add two more options!!!!!!\n'
b
diff -r d22fadc825e3 -r 2c0c0a89fad7 SMART/Java/Python/getWigData.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/SMART/Java/Python/getWigData.py Thu May 02 09:56:47 2013 -0400
[
@@ -0,0 +1,67 @@
+#! /usr/bin/env python
+#
+# Copyright INRA-URGI 2009-2010
+# 
+# This software is governed by the CeCILL license under French law and
+# abiding by the rules of distribution of free software. You can use,
+# modify and/ or redistribute the software under the terms of the CeCILL
+# license as circulated by CEA, CNRS and INRIA at the following URL
+# "http://www.cecill.info".
+# 
+# As a counterpart to the access to the source code and rights to copy,
+# modify and redistribute granted by the license, users are provided only
+# with a limited warranty and the software's author, the holder of the
+# economic rights, and the successive licensors have only limited
+# liability.
+# 
+# In this respect, the user's attention is drawn to the risks associated
+# with loading, using, modifying and/or developing or reproducing the
+# software by the user in light of its specific status of free software,
+# that may mean that it is complicated to manipulate, and that also
+# therefore means that it is reserved for developers and experienced
+# professionals having in-depth computer knowledge. Users are therefore
+# encouraged to load and test the software's suitability as regards their
+# requirements in conditions enabling the security of their systems and/or
+# data to be ensured and, more generally, to use and operate it in the
+# same conditions as regards security.
+# 
+# The fact that you are presently reading this means that you have had
+# knowledge of the CeCILL license and that you accept its terms.
+#
+from optparse import OptionParser
+from SMART.Java.Python.structure.TranscriptContainer import TranscriptContainer
+from commons.core.parsing.WigParser import WigParser
+from commons.core.writer.Gff3Writer import Gff3Writer
+from SMART.Java.Python.misc.Progress import Progress
+
+
+if __name__ == "__main__":
+    
+    # parse command line
+    description = "Get WIG Data v1.0.1: Compute the average data for some genomic coordinates using WIG files (thus covering a large proportion of the genome) and update a tag. [Category: WIG Tools]"
+
+    parser = OptionParser(description = description)
+    parser.add_option("-i", "--input",       dest="inputFileName",  action="store",                     type="string", help="input file [compulsory] [format: file in transcript format given by -f]")
+    parser.add_option("-f", "--inputFormat", dest="inputFormat",    action="store",                     type="string", help="format of the input file [compulsory] [format: transcript file format]")
+    parser.add_option("-w", "--wig",         dest="wig",            action="store",                     type="string", help="wig file name [compulsory] [format: file in WIG format]")    
+    parser.add_option("-t", "--tag",         dest="tag",            action="store",                     type="string", help="choose a tag name to write the wig information to output file [compulsory] [format: file in WIG format]")    
+    parser.add_option("-o", "--output",      dest="outputFileName", action="store",                     type="string", help="output file [compulsory] [format: output file in GFF3 format]")
+    parser.add_option("-s", "--strands",     dest="strands",        action="store_true", default=False,                help="consider both strands separately [format: boolean] [default: False]")    
+    parser.add_option("-v", "--verbosity",   dest="verbosity",      action="store",      default=1,     type="int",    help="trace level [format: int]")
+    (options, args) = parser.parse_args()
+
+    # create parsers and writers
+    transcriptParser = TranscriptContainer(options.inputFileName, options.inputFormat, options.verbosity)
+    wigParser        = WigParser(options.wig)
+    writer           = Gff3Writer(options.outputFileName, options.verbosity)
+    wigParser.setStrands(options.strands)
+    
+    progress = Progress(transcriptParser.getNbTranscripts(), "Parsing %s" % (options.inputFileName), options.verbosity)
+    for transcript in transcriptParser.getIterator():
+        values = transcript.extractWigData(wigParser)
+        if options.strands:
+            values = values[transcript.getDirection()]
+        transcript.setTagValue(options.tag, str(float(sum(values)) / len(values)))
+        writer.addTranscript(transcript)
+        progress.inc()
+    progress.done()
b
diff -r d22fadc825e3 -r 2c0c0a89fad7 SMART/Java/Python/getWigDistance.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/SMART/Java/Python/getWigDistance.py Thu May 02 09:56:47 2013 -0400
[
@@ -0,0 +1,105 @@
+#! /usr/bin/env python
+#
+# Copyright INRA-URGI 2009-2010
+# 
+# This software is governed by the CeCILL license under French law and
+# abiding by the rules of distribution of free software. You can use,
+# modify and/ or redistribute the software under the terms of the CeCILL
+# license as circulated by CEA, CNRS and INRIA at the following URL
+# "http://www.cecill.info".
+# 
+# As a counterpart to the access to the source code and rights to copy,
+# modify and redistribute granted by the license, users are provided only
+# with a limited warranty and the software's author, the holder of the
+# economic rights, and the successive licensors have only limited
+# liability.
+# 
+# In this respect, the user's attention is drawn to the risks associated
+# with loading, using, modifying and/or developing or reproducing the
+# software by the user in light of its specific status of free software,
+# that may mean that it is complicated to manipulate, and that also
+# therefore means that it is reserved for developers and experienced
+# professionals having in-depth computer knowledge. Users are therefore
+# encouraged to load and test the software's suitability as regards their
+# requirements in conditions enabling the security of their systems and/or
+# data to be ensured and, more generally, to use and operate it in the
+# same conditions as regards security.
+# 
+# The fact that you are presently reading this means that you have had
+# knowledge of the CeCILL license and that you accept its terms.
+#
+"""
+Cluster the data into regions (defined by size and overlap with next region) and keep only highest peaks.
+"""
+
+from optparse import OptionParser
+from SMART.Java.Python.structure.TranscriptContainer import TranscriptContainer
+from commons.core.parsing.WigParser import WigParser
+from SMART.Java.Python.misc.Progress import Progress
+from SMART.Java.Python.misc.RPlotter import RPlotter
+
+
+if __name__ == "__main__":
+    
+    # parse command line
+    description = "Get WIG Data v1.0.2: Compute the average data around some genomic coordinates using WIG files (thus covering a large proportion of the genome). [Category: WIG Tools]"
+
+    parser = OptionParser(description = description)
+    parser.add_option("-i", "--input",       dest="inputFileName",  action="store",                     type="string", help="input file [compulsory] [format: file in transcript format given by -f]")
+    parser.add_option("-f", "--inputFormat", dest="inputFormat",    action="store",                     type="string", help="format of the input file [compulsory] [format: transcript file format]")
+    parser.add_option("-w", "--wig",         dest="wig",            action="store",                     type="string", help="wig file name [compulsory] [format: file in WIG format]")    
+    parser.add_option("-d", "--distance",    dest="distance",       action="store",      default=1000,  type="int",    help="distance around position [compulsory] [format: int] [default: 1000]")    
+    parser.add_option("-s", "--strands",     dest="strands",        action="store_true", default=False,                help="consider both strands separately [format: boolean] [default: False]")    
+    parser.add_option("-o", "--output",      dest="outputFileName", action="store",                     type="string", help="output file [compulsory] [format: output file in PNG format]")
+    parser.add_option("-a", "--default",     dest="defaultValue",   action="store",      default=0.0,   type="float",  help="default value (when value is NA) [default: 0.0] [format: float]")
+    parser.add_option("-l", "--log",         dest="log",            action="store_true", default=False,                help="use log scale for y-axis [format: boolean] [default: False]")
+    parser.add_option("-k", "--keep",        dest="keep",           action="store_true", default=False,                help="keep temporary files [format: boolean] [default: False]")
+    parser.add_option("-v", "--verbosity",   dest="verbosity",      action="store",      default=1,     type="int",    help="trace level [format: int]")
+    (options, args) = parser.parse_args()
+
+    # create parsers and writers
+    transcriptParser = TranscriptContainer(options.inputFileName, options.inputFormat, options.verbosity)
+    wigParser        = WigParser(options.wig)
+    wigParser.setStrands(options.strands)
+    wigParser.setDefaultValue(options.defaultValue)
+    
+    # allocate data
+    strands = (1, -1) if options.strands else (1, )
+    values    = {}
+    for strand in strands:
+        values[strand] = dict([(i, 0.0) for i in range(-options.distance, options.distance+1)])
+
+    # read transcripts
+    progress = Progress(transcriptParser.getNbTranscripts(), "Parsing %s" % (options.inputFileName), options.verbosity)
+    for transcript in transcriptParser.getIterator():
+        transcript.removeExons()
+        transcript.restrictStart(2)
+        transcript.extendStart(options.distance)
+        transcript.extendEnd(options.distance-1)
+        theseValues = transcript.extractWigData(wigParser)
+        if len(strands) == 1:
+            theseValues = {1: theseValues}
+        for strand in strands:
+            if len(theseValues[strand]) < 2 * options.distance + 1:
+                theseValues[strand] = [options.defaultValue] * (2 * options.distance + 1 - len(theseValues[strand])) + theseValues[strand]
+            if len(theseValues[strand]) != 2 * options.distance + 1:
+ raise Exception("Got something wrong with the size of the WIG data concerning %s: %d found instead of %d" % (transcript, len(theseValues[strand]), 2 * options.distance + 1))
+            for i in range(-options.distance, options.distance+1):
+                values[strand][i] += theseValues[strand][i + options.distance]
+        progress.inc()
+    progress.done()
+
+    for strand in strands:
+        for i in range(-options.distance, options.distance+1):
+            values[strand][i] /= transcriptParser.getNbTranscripts() * strand
+
+    # draw plot
+    plotter = RPlotter(options.outputFileName, options.verbosity, options.keep)
+    plotter.setXLabel("Distance")
+    plotter.setYLabel("WigValue")
+    for strand in strands:
+        plotter.addLine(values[strand])
+    if options.log:
+        plotter.setLog("y")
+    plotter.plot()
+
b
diff -r d22fadc825e3 -r 2c0c0a89fad7 SMART/Java/Python/getWigProfile.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/SMART/Java/Python/getWigProfile.py Thu May 02 09:56:47 2013 -0400
[
b'@@ -0,0 +1,160 @@\n+#! /usr/bin/env python\n+#\n+# Copyright INRA-URGI 2009-2010\n+# \n+# This software is governed by the CeCILL license under French law and\n+# abiding by the rules of distribution of free software. You can use,\n+# modify and/ or redistribute the software under the terms of the CeCILL\n+# license as circulated by CEA, CNRS and INRIA at the following URL\n+# "http://www.cecill.info".\n+# \n+# As a counterpart to the access to the source code and rights to copy,\n+# modify and redistribute granted by the license, users are provided only\n+# with a limited warranty and the software\'s author, the holder of the\n+# economic rights, and the successive licensors have only limited\n+# liability.\n+# \n+# In this respect, the user\'s attention is drawn to the risks associated\n+# with loading, using, modifying and/or developing or reproducing the\n+# software by the user in light of its specific status of free software,\n+# that may mean that it is complicated to manipulate, and that also\n+# therefore means that it is reserved for developers and experienced\n+# professionals having in-depth computer knowledge. Users are therefore\n+# encouraged to load and test the software\'s suitability as regards their\n+# requirements in conditions enabling the security of their systems and/or\n+# data to be ensured and, more generally, to use and operate it in the\n+# same conditions as regards security.\n+# \n+# The fact that you are presently reading this means that you have had\n+# knowledge of the CeCILL license and that you accept its terms.\n+#\n+"""\n+Cluster the data into regions (defined by size and overlap with next region) and keep only highest peaks.\n+"""\n+\n+import math\n+from optparse import OptionParser\n+from SMART.Java.Python.structure.TranscriptContainer import TranscriptContainer\n+from commons.core.parsing.WigParser import WigParser\n+from SMART.Java.Python.misc.Progress import Progress\n+from SMART.Java.Python.misc.RPlotter import RPlotter\n+\n+class GetWigProfile(object):\n+\n+\tdef __init__(self, verbosity):\n+\t\tself.verbosity\t= verbosity\n+\t\tself.values\t\t = {}\n+\t\tself.defaultValue = 0.0\n+\n+\tdef _iToJ(self, i, size):\n+\t\treturn min(self.nbPoints+1, int(math.floor(float(i - self.distance) / (size) * (self.nbPoints))))\n+\n+\tdef readTranscripts(self):\n+\t\tself.strandNames = (1, -1) if self.strands else (1, )\n+\t\tself.values\t\t= dict([(strand, dict([(i, 0.0) for i in range(self.nbPoints + 2 * self.distance)])) for strand in self.strandNames])\n+\t\ttranscriptParser = TranscriptContainer(self.inputFileName, self.inputFormat, self.verbosity)\n+\t\twigParser\t\t= WigParser(self.wig)\n+\t\tnbValues\t\t = dict([(strand, dict([(i, 0.0) for i in range(self.nbPoints + 2 * self.distance)])) for strand in self.strandNames])\n+\t\twigParser.setStrands(self.strands)\n+\t\twigParser.setDefaultValue(self.defaultValue)\n+\n+\t\tprogress = Progress(transcriptParser.getNbTranscripts(), "Parsing %s" % (self.inputFileName), self.verbosity)\n+\t\tfor transcript in transcriptParser.getIterator():\n+\t\t\ttranscriptSize = transcript.getSize()\n+\t\t\texpectedSize   = transcriptSize + 2 * self.distance\n+\t\t\ttranscript.extendStart(self.distance)\n+\t\t\ttranscript.extendEnd(self.distance)\n+\t\t\ttheseValues = transcript.extractWigData(wigParser)\n+\n+\t\t\tif len(self.strandNames) == 1:\n+\t\t\t\ttheseValues = {1: theseValues}\n+\t\t\tfor strand in self.strandNames:\n+\t\t\t\tif len(theseValues[strand]) < expectedSize:\n+\t\t\t\t\ttheseValues[strand] = [self.defaultValue] * (expectedSize - len(theseValues[strand])) + theseValues[strand]\n+\t\t\t\tif len(theseValues[strand]) != expectedSize:\n+\t\t\t\t\traise Exception("Got something wrong with the size of the WIG data concerning %s [%s]: %d found instead of %d" % (transcript, ",".join(["%d-%d" % (exon.getStart(), exon.getEnd()) for exon in transcript.getExons()]), len(theseValues[strand]), expectedSize))\n+\t\t\t\tfivePValues = theseValues[strand][: self.distance]\n+\t\t\t\tnbValues         = [0.0] * (self.nbPoints)\n+\t\t\t\ttranscriptValues = [0.0] * (self.nbPoints)\n+\t\t\t\tfor i in range(self.distance, len(theseValues[stra'..b'+\t\t\t\tstrand = 1\n+\t\t\tfor i in range(self.nbPoints + 2 * self.distance):\n+\t\t\t\tself.values[strand][i] /= transcriptParser.getNbTranscripts() * strand\n+\n+\n+\tdef smoothen(self):\n+\t\tif self.smoothenForce == None:\n+\t\t\treturn\n+\t\tfor strand in self.strandNames:\n+\t\t\taverageValues = {}\n+\t\t\tfor center in range(self.distance, self.distance + self.nbPoints):\n+\t\t\t\tsum\t\t= 0.0\n+\t\t\t\tnbValues = 0.0\n+\t\t\t\tfor i in range(center - self.smoothenForce + 1, center + self.smoothenForce):\n+\t\t\t\t\tif i > self.distance and i < self.distance + self.nbPoints:\n+\t\t\t\t\t\tnbValues += 1\n+\t\t\t\t\t\tsum\t\t+= self.values[strand][i]\n+\t\t\t\taverageValues[center] = sum / nbValues\n+\t\t\tfor position in range(self.distance, self.distance + self.nbPoints):\n+\t\t\t\tself.values[strand][position] = averageValues[position]\n+\t\t\n+\n+\tdef plot(self):\n+\t\tplotter = RPlotter(self.outputFileName, self.verbosity)\n+\t\tfor strand in self.strandNames:\n+\t\t\tplotter.addLine(self.values[strand])\n+\t\tif self.log:\n+\t\t\tplotter.setLog("y")\n+\t\tplotter.setAxisLabel("x", {0: -self.distance, self.distance: "start", self.distance+self.nbPoints-1: "end", 2*self.distance+self.nbPoints-1: self.distance})\n+\t\tplotter.plot()\n+\n+\n+\n+if __name__ == "__main__":\n+\t\n+\t# parse command line\n+\tdescription = "Get WIG Profile v1.0.1: Compute the average profile of some genomic coordinates using WIG files (thus covering a large proportion of the genome). [Category: WIG Tools]"\n+\n+\tparser = OptionParser(description = description)\n+\tparser.add_option("-i", "--input",\t\t\t dest="inputFileName",\taction="store",\t\t\t\t\t\t\t\t\t\t\ttype="string", help="input file [compulsory] [format: file in transcript format given by -f]")\n+\tparser.add_option("-f", "--inputFormat", dest="inputFormat",\t\taction="store",\t\t\t\t\t\t\t\t\t\t\ttype="string", help="format of the input file [compulsory] [format: transcript file format]")\n+\tparser.add_option("-w", "--wig",\t\t\t\t dest="wig",\t\t\t\t\t\taction="store",\t\t\t\t\t\t\t\t\t\t\ttype="string", help="wig file name [compulsory] [format: file in WIG format]")\t\n+\tparser.add_option("-p", "--nbPoints",\t\t dest="nbPoints",\t\t\t\taction="store",\t\t\t default=1000,\ttype="int",\t\t help="number of points on the x-axis [compulsory] [format: int] [default: 1000]")\t\n+\tparser.add_option("-d", "--distance",\t\t dest="distance",\t\t\t\taction="store",\t\t\t default=0,\t\t\ttype="int",\t\t help="distance around genomic coordinates [compulsory] [format: int] [default: 0]")\t\n+\tparser.add_option("-s", "--strands",\t\t dest="strands",\t\t\t\taction="store_true", default=False,\t\t\t\t\t\t\t\t help="consider both strands separately [format: boolean] [default: False]")\t\n+\tparser.add_option("-m", "--smoothen",\t\t dest="smoothen",\t\t\t\taction="store",\t\t\t default=None,\ttype="int",\t\t help="smoothen the curve [format: int] [default: None]")\t\n+\tparser.add_option("-a", "--default",\t\t dest="defaultValue",\t action="store",\t\t\t default=0.0,\t type="float",\thelp="default value (when value is NA) [default: 0.0] [format: float]")\n+\tparser.add_option("-o", "--output",\t\t\t dest="outputFileName", action="store",\t\t\t\t\t\t\t\t\t\t\ttype="string", help="output file [compulsory] [format: output file in PNG format]")\n+\tparser.add_option("-l", "--log",\t\t\t\t dest="log",\t\t\t\t\t\taction="store_true", default=False,\t\t\t\t\t\t\t\t help="use log scale for y-axis\t[format: boolean] [default: False]")\n+\tparser.add_option("-v", "--verbosity",\t dest="verbosity",\t\t\taction="store",\t\t\t default=1,\t\t\ttype="int",\t\t help="trace level [format: int]")\n+\t(options, args) = parser.parse_args()\n+\n+\twigProfile\t\t\t\t\t\t\t\t= GetWigProfile(options.verbosity)\n+\twigProfile.strands\t\t\t \t= options.strands\n+\twigProfile.inputFileName\t= options.inputFileName\n+\twigProfile.inputFormat\t\t= options.inputFormat\n+\twigProfile.wig\t\t\t\t\t\t= options.wig\n+\twigProfile.nbPoints\t\t\t\t= options.nbPoints\n+\twigProfile.distance\t\t\t\t= options.distance\n+\twigProfile.smoothenForce\t= options.smoothen\n+\twigProfile.defaultValue\t  = options.defaultValue\n+\twigProfile.outputFileName = options.outputFileName\n+\twigProfile.log\t\t\t\t\t\t= options.log\n+\n+\twigProfile.readTranscripts()\n+\twigProfile.smoothen()\n+\twigProfile.plot()\n'
b
diff -r d22fadc825e3 -r 2c0c0a89fad7 SMART/Java/Python/mapperAnalyzer.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/SMART/Java/Python/mapperAnalyzer.py Thu May 02 09:56:47 2013 -0400
[
b'@@ -0,0 +1,486 @@\n+#! /usr/bin/env python\n+#\n+# Copyright INRA-URGI 2009-2010\n+# \n+# This software is governed by the CeCILL license under French law and\n+# abiding by the rules of distribution of free software. You can use,\n+# modify and/ or redistribute the software under the terms of the CeCILL\n+# license as circulated by CEA, CNRS and INRIA at the following URL\n+# "http://www.cecill.info".\n+# \n+# As a counterpart to the access to the source code and rights to copy,\n+# modify and redistribute granted by the license, users are provided only\n+# with a limited warranty and the software\'s author, the holder of the\n+# economic rights, and the successive licensors have only limited\n+# liability.\n+# \n+# In this respect, the user\'s attention is drawn to the risks associated\n+# with loading, using, modifying and/or developing or reproducing the\n+# software by the user in light of its specific status of free software,\n+# that may mean that it is complicated to manipulate, and that also\n+# therefore means that it is reserved for developers and experienced\n+# professionals having in-depth computer knowledge. Users are therefore\n+# encouraged to load and test the software\'s suitability as regards their\n+# requirements in conditions enabling the security of their systems and/or\n+# data to be ensured and, more generally, to use and operate it in the\n+# same conditions as regards security.\n+# \n+# The fact that you are presently reading this means that you have had\n+# knowledge of the CeCILL license and that you accept its terms.\n+#\n+"""\n+Read a mapping file (many formats supported) and select some of them\n+Mappings should be sorted by read names\n+"""\n+import os, random, shelve\n+from optparse import OptionParser, OptionGroup\n+from commons.core.parsing.ParserChooser import ParserChooser\n+from commons.core.parsing.FastaParser import FastaParser\n+from commons.core.parsing.FastqParser import FastqParser\n+from commons.core.parsing.GffParser import GffParser\n+from commons.core.writer.BedWriter import BedWriter\n+from commons.core.writer.UcscWriter import UcscWriter\n+from commons.core.writer.GbWriter import GbWriter\n+from commons.core.writer.Gff2Writer import Gff2Writer\n+from commons.core.writer.Gff3Writer import Gff3Writer\n+from commons.core.writer.FastaWriter import FastaWriter\n+from commons.core.writer.FastqWriter import FastqWriter\n+from commons.core.writer.MySqlTranscriptWriter import MySqlTranscriptWriter\n+from SMART.Java.Python.mySql.MySqlConnection import MySqlConnection\n+from SMART.Java.Python.mySql.MySqlTable import MySqlTable\n+from SMART.Java.Python.misc.RPlotter import RPlotter\n+from SMART.Java.Python.misc.Progress import Progress\n+from SMART.Java.Python.misc.UnlimitedProgress import UnlimitedProgress\n+\n+\n+distanceExons = 20\n+exonSize      = 20\n+\n+\n+class MapperAnalyzer(object):\n+    """\n+    Analyse the output of a parser\n+    """\n+\n+    def __init__(self, verbosity = 0):\n+        self.verbosity                = verbosity\n+        self.mySqlConnection          = MySqlConnection(verbosity)\n+        self.tooShort                 = 0\n+        self.tooManyMismatches        = 0\n+        self.tooManyGaps              = 0\n+        self.tooShortExons            = 0\n+        self.tooManyMappings          = 0\n+        self.nbMappings               = 0\n+        self.nbSequences              = 0\n+        self.nbAlreadyMapped          = 0\n+        self.nbAlreadyMappedSequences = 0\n+        self.nbWrittenMappings        = 0\n+        self.nbWrittenSequences       = 0\n+        self.parser                   = None\n+        self.logHandle                = None\n+        self.randomNumber             = random.randint(0, 100000)\n+        self.gff3Writer               = None\n+        self.alreadyMappedReader      = None\n+        self.unmatchedWriter          = None\n+        self.sequenceListParser       = None\n+        self.sequences                = None\n+        self.alreadyMapped            = None\n+        self.mappedNamesTable         = None\n+        s'..b'up.add_option("-v", "--verbosity",        dest="verbosity",         action="store",      default=1,        type="int",    help="trace level [default: 1] [format: int]")\n+    otheGroup.add_option("-l", "--log",              dest="log",               action="store_true", default=False,                   help="write a log file [format: bool] [default: false]")\n+    parser.add_option_group(compGroup)\n+    parser.add_option_group(filtGroup)\n+    parser.add_option_group(tranGroup)\n+    parser.add_option_group(outpGroup)\n+    parser.add_option_group(otheGroup)\n+    (options, args) = parser.parse_args()\n+\n+    \n+    analyzer = MapperAnalyzer(options.verbosity)\n+    analyzer.setMappingFile(options.inputFileName, options.format)\n+    analyzer.setSequenceFile(options.sequencesFileName, options.sequenceFormat)\n+    analyzer.setOutputFile(options.outputFileName, options.title)\n+    if options.appendFileName != None:\n+        analyzer.setAlreadyMatched(options.appendFileName)\n+    if options.remaining:\n+        analyzer.setRemainingFile(options.outputFileName, options.sequenceFormat)\n+    if options.number != None:\n+        analyzer.setMaxMappings(options.number)\n+    if options.size != None:\n+        analyzer.setMinSize(options.size)\n+    if options.identity != None:\n+        analyzer.setMinId(options.identity)\n+    if options.mismatch != None:\n+        analyzer.setMaxMismatches(options.mismatch)\n+    if options.gap != None:\n+        analyzer.setMaxGaps(options.gap)\n+    if options.mergeExons:\n+        analyzer.mergeExons(True)\n+    if options.removeExons:\n+        analyzer.acceptShortExons(False)\n+    if options.log:\n+        analyzer.setLog("%s.log" % (options.outputFileName))\n+    analyzer.analyze()\n+    \n+    if options.verbosity > 0:\n+        print "kept %i sequences over %s (%f%%)" % (analyzer.nbWrittenSequences, analyzer.nbSequences, float(analyzer.nbWrittenSequences) / analyzer.nbSequences * 100)\n+        if options.appendFileName != None:\n+            print "kept %i sequences over %s (%f%%) including already mapped sequences" % (analyzer.nbWrittenSequences + analyzer.nbAlreadyMappedSequences, analyzer.nbSequences, float(analyzer.nbWrittenSequences + analyzer.nbAlreadyMappedSequences) / analyzer.nbSequences * 100)\n+        print "kept %i mappings over %i (%f%%)" % (analyzer.nbWrittenMappings, analyzer.nbMappings, float(analyzer.nbWrittenMappings) / analyzer.nbMappings * 100)\n+        if options.appendFileName != None:\n+            print "kept %i mappings over %i (%f%%) including already mapped" % (analyzer.nbWrittenMappings + analyzer.nbAlreadyMapped, analyzer.nbMappings, float(analyzer.nbWrittenMappings + analyzer.nbAlreadyMapped) / analyzer.nbMappings * 100)\n+        print "removed %i too short mappings (%f%%)" % (analyzer.tooShort, float(analyzer.tooShort) / analyzer.nbMappings * 100)\n+        print "removed %i mappings with too many mismatches (%f%%)" % (analyzer.tooManyMismatches, float(analyzer.tooManyMismatches) / analyzer.nbMappings * 100)\n+        print "removed %i mappings with too many gaps (%f%%)" % (analyzer.tooManyGaps, float(analyzer.tooManyGaps) / analyzer.nbMappings * 100)\n+        print "removed %i mappings with too short exons (%f%%)" % (analyzer.tooShortExons, float(analyzer.tooShortExons) / analyzer.nbMappings * 100)\n+        print "removed %i sequences with too many hits (%f%%)" % (analyzer.tooManyMappings, float(analyzer.tooManyMappings) / analyzer.nbSequences * 100)\n+        print "%i sequences have no mapping (%f%%)" % (analyzer.nbSequences - analyzer.nbWrittenSequences, float(analyzer.nbSequences - analyzer.nbWrittenSequences) / analyzer.nbSequences * 100)\n+        if options.appendFileName != None:\n+            print "%i sequences have no mapping (%f%%) excluding already mapped sequences" % (analyzer.nbSequences - analyzer.nbWrittenSequences - analyzer.nbAlreadyMappedSequences, float(analyzer.nbSequences - analyzer.nbWrittenSequences - analyzer.nbAlreadyMappedSequences) / analyzer.nbSequences * 100)\n+\n+\n'
b
diff -r d22fadc825e3 -r 2c0c0a89fad7 SMART/Java/Python/mappingToCoordinates.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/SMART/Java/Python/mappingToCoordinates.py Thu May 02 09:56:47 2013 -0400
[
@@ -0,0 +1,91 @@
+#! /usr/bin/env python
+#
+# Copyright INRA-URGI 2009-2010
+# 
+# This software is governed by the CeCILL license under French law and
+# abiding by the rules of distribution of free software. You can use,
+# modify and/ or redistribute the software under the terms of the CeCILL
+# license as circulated by CEA, CNRS and INRIA at the following URL
+# "http://www.cecill.info".
+# 
+# As a counterpart to the access to the source code and rights to copy,
+# modify and redistribute granted by the license, users are provided only
+# with a limited warranty and the software's author, the holder of the
+# economic rights, and the successive licensors have only limited
+# liability.
+# 
+# In this respect, the user's attention is drawn to the risks associated
+# with loading, using, modifying and/or developing or reproducing the
+# software by the user in light of its specific status of free software,
+# that may mean that it is complicated to manipulate, and that also
+# therefore means that it is reserved for developers and experienced
+# professionals having in-depth computer knowledge. Users are therefore
+# encouraged to load and test the software's suitability as regards their
+# requirements in conditions enabling the security of their systems and/or
+# data to be ensured and, more generally, to use and operate it in the
+# same conditions as regards security.
+# 
+# The fact that you are presently reading this means that you have had
+# knowledge of the CeCILL license and that you accept its terms.
+#
+
+
+"""Convert files with some mapping format to coordinates format"""
+
+import os
+from optparse import OptionParser
+from commons.core.parsing.PslParser import PslParser
+from commons.core.parsing.AxtParser import AxtParser
+from commons.core.writer.Gff3Writer import Gff3Writer
+from commons.core.writer.MySqlTranscriptWriter import MySqlTranscriptWriter
+from SMART.Java.Python.structure.TranscriptListsComparator import TranscriptListsComparator
+from SMART.Java.Python.structure.TranscriptContainer import TranscriptContainer
+from SMART.Java.Python.misc.Progress import Progress
+
+
+class MappingToCoordinates(object):
+    def __init__(self,verbosity=1, inputFileName=None, format = None, output=None,galaxy = False, title="S-MART"):
+        self.verbosity = verbosity
+        self.inputFileName = inputFileName
+        self.format = format
+        self.output = output
+        self.galaxy = galaxy
+        self.title = title
+    
+    def setAttributesFromCmdLine(self):
+        description = "Mapping To Coordinates v1.0.1: Convert a set of mappings (given by a mapping tool) to a set of transcripts. [Category: Conversion]"
+        parser = OptionParser(description = description)
+        parser.add_option("-i", "--input",     dest="inputFileName", action="store",                     type="string", help="input file [compulsory] [format: file in mapping format given by -f]")
+        parser.add_option("-f", "--format",    dest="format",        action="store",                     type="string", help="format of file [compulsory] [format: mapping file format]")
+        parser.add_option("-o", "--output",    dest="output",        action="store",      default=None,  type="string", help="output file [compulsory] [format: output file in GFF3 format]")
+        parser.add_option("-v", "--verbosity", dest="verbosity",     action="store",      default=1,     type="int",    help="trace level [format: int]")
+        parser.add_option("-G", "--galaxy",    dest="galaxy",        action="store_true", default=False,                help="used for galaxy [format: bool] [default: False]")    
+        (options, args) = parser.parse_args()
+    
+        self.verbosity = options.verbosity
+        self.inputFileName = options.inputFileName
+        self.format = options.format
+        self.output = options.output
+        self.galaxy = options.galaxy
+
+    def run(self):  
+        if self.verbosity > 0:
+            print "Reading input file..."
+        parser = TranscriptContainer(self.inputFileName, self.format, self.verbosity)
+        if self.verbosity > 0:
+            print "... done"
+        writer = Gff3Writer(self.output, self.verbosity, self.title)
+            
+        progress = Progress(parser.getNbTranscripts(), "Reading %s" % (self.inputFileName), self.verbosity)
+        for transcript in parser.getIterator():
+            writer.addTranscript(transcript)
+            progress.inc()
+        progress.done()
+        
+        if self.galaxy:
+            os.rename("%s.gff3" % (self.output), self.output) 
+            
+if __name__ == '__main__':
+    launcher = MappingToCoordinates()
+    launcher.setAttributesFromCmdLine()
+    launcher.run()
b
diff -r d22fadc825e3 -r 2c0c0a89fad7 SMART/Java/Python/mergeSlidingWindowsClusters.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/SMART/Java/Python/mergeSlidingWindowsClusters.py Thu May 02 09:56:47 2013 -0400
[
@@ -0,0 +1,144 @@
+#! /usr/bin/env python
+#
+# Copyright INRA-URGI 2009-2010
+# 
+# This software is governed by the CeCILL license under French law and
+# abiding by the rules of distribution of free software. You can use,
+# modify and/ or redistribute the software under the terms of the CeCILL
+# license as circulated by CEA, CNRS and INRIA at the following URL
+# "http://www.cecill.info".
+# 
+# As a counterpart to the access to the source code and rights to copy,
+# modify and redistribute granted by the license, users are provided only
+# with a limited warranty and the software's author, the holder of the
+# economic rights, and the successive licensors have only limited
+# liability.
+# 
+# In this respect, the user's attention is drawn to the risks associated
+# with loading, using, modifying and/or developing or reproducing the
+# software by the user in light of its specific status of free software,
+# that may mean that it is complicated to manipulate, and that also
+# therefore means that it is reserved for developers and experienced
+# professionals having in-depth computer knowledge. Users are therefore
+# encouraged to load and test the software's suitability as regards their
+# requirements in conditions enabling the security of their systems and/or
+# data to be ensured and, more generally, to use and operate it in the
+# same conditions as regards security.
+# 
+# The fact that you are presently reading this means that you have had
+# knowledge of the CeCILL license and that you accept its terms.
+#
+"""
+Merge sliding windows of two different clusterings
+"""
+
+import sys
+import re
+import os
+from optparse import OptionParser
+from SMART.Java.Python.structure.TranscriptContainer import TranscriptContainer
+from commons.core.writer.Gff3Writer import Gff3Writer
+from SMART.Java.Python.misc.Progress import Progress
+from SMART.Java.Python.structure.Transcript import Transcript
+
+class MergeSlidingWindowsClusters(object):
+    """
+    Merge the ouptput of several sets of sliding windows
+    """
+
+    def __init__(self, verbosity = 0):
+        self.verbosity     = verbosity
+        self.inputs        = []
+        self.outputData    = {}
+        self.nbData        = 0
+        self.nbWrittenData = 0
+        self.chromosomes   = []
+        self.writer        = None
+
+    def __del__(self):
+        if self.writer != None:
+            self.writer.close()
+
+    def addInput(self, fileName, fileFormat):
+        self.inputs.append(TranscriptContainer(fileName, fileFormat, self.verbosity))
+        self.chromosomes = list(set(self.chromosomes).union(set(self.inputs[-1].getChromosomes())))
+
+    def setOutput(self, fileName):
+        self.writer = Gff3Writer(fileName, self.verbosity)
+
+    def readInput(self, i, chromosome):
+        progress = Progress(self.inputs[i].getNbTranscripts(), "Reading file #%d -- chromosome %s" % (i+1, chromosome), self.verbosity)
+        for transcript in self.inputs[i].getIterator():
+            progress.inc()
+            if chromosome != transcript.getChromosome(): continue
+            start     = transcript.getStart()
+            end       = transcript.getEnd()
+            direction = transcript.getDirection()
+            tags      = transcript.tags
+            if chromosome not in self.outputData:
+                self.outputData[chromosome] = {}
+            if direction not in self.outputData[chromosome]:
+                self.outputData[chromosome][direction] = {}
+            if start not in self.outputData[chromosome][direction]:
+                self.outputData[chromosome][direction][start] = {}
+            if end in self.outputData[chromosome][direction][start]:
+                ends = self.outputData[chromosome][direction][start].keys()
+                if ends[0] != end:
+                    sys.exit("Error! Two regions starting at %d end are not consistent (%d and %d) in %s on strand %d" % (start, end, ends[0], chromosome, direction))
+                self.outputData[chromosome][direction][start][end].update(tags)
+            else:
+                self.outputData[chromosome][direction][start][end] = tags
+                self.nbData += 1
+        progress.done()
+
+
+    def writeOutput(self, chromosome):
+        progress = Progress(self.nbData - self.nbWrittenData, "Writing output for chromosome %s" % (chromosome), self.verbosity)
+        for direction in self.outputData[chromosome]:
+            for start in self.outputData[chromosome][direction]:
+                for end in self.outputData[chromosome][direction][start]:
+                    transcript = Transcript()
+                    transcript.setChromosome(chromosome)
+                    transcript.setStart(start)
+                    transcript.setEnd(end)
+                    transcript.setDirection(direction)
+                    transcript.tags = self.outputData[chromosome][direction][start][end]
+                    transcript.setName("region_%d" % (self.nbWrittenData + 1))
+                    tags = transcript.getTagNames()
+                    for tag in tags:
+                        if tag.startswith("Name_") or tag.startswith("ID_"):
+                            del transcript.tags[tag]
+                    self.nbWrittenData += 1
+                    self.writer.addTranscript(transcript)
+                    progress.inc()
+        self.writer.write()
+        progress.done()
+        self.outputData = {}
+
+    def merge(self):
+        for chromosome in self.chromosomes:
+            for i, input in enumerate(self.inputs):
+                self.readInput(i, chromosome)
+            self.writeOutput(chromosome)
+        self.writer.close()
+
+
+if __name__ == "__main__":
+    
+    # parse command line
+    description = "Merge Sliding Windows Clusters v1.0.2: Merge two files containing the results of a sliding windows clustering. [Category: Sliding Windows]"
+
+    parser = OptionParser(description = description)
+    parser.add_option("-i", "--input1",       dest="inputFileName1", action="store",                     type="string", help="input file 1 [compulsory] [format: file in transcript format given by -f]")
+    parser.add_option("-f", "--inputFormat1", dest="inputFormat1",   action="store",                     type="string", help="format of the input file 1 [compulsory] [format: transcript file format]")
+    parser.add_option("-j", "--input2",       dest="inputFileName2", action="store",                     type="string", help="input file 2 [compulsory] [format: file in transcript format given by -g]")
+    parser.add_option("-g", "--inputFormat2", dest="inputFormat2",   action="store",                     type="string", help="format of the input file 2 [compulsory] [format: transcript file format]")
+    parser.add_option("-o", "--output",       dest="outputFileName", action="store",                     type="string", help="output file [compulsory] [format: output file in GFF3 format]")
+    parser.add_option("-v", "--verbosity",    dest="verbosity",      action="store",      default=1,     type="int",    help="trace level [format: int]")
+    (options, args) = parser.parse_args()
+
+    merger = MergeSlidingWindowsClusters(options.verbosity)
+    merger.addInput(options.inputFileName1, options.inputFormat1)
+    merger.addInput(options.inputFileName2, options.inputFormat2)
+    merger.setOutput(options.outputFileName)
+    merger.merge()
b
diff -r d22fadc825e3 -r 2c0c0a89fad7 SMART/Java/Python/mergeTranscriptLists.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/SMART/Java/Python/mergeTranscriptLists.py Thu May 02 09:56:47 2013 -0400
[
b'@@ -0,0 +1,174 @@\n+#! /usr/bin/env python\n+#\n+# Copyright INRA-URGI 2009-2010\n+# \n+# This software is governed by the CeCILL license under French law and\n+# abiding by the rules of distribution of free software. You can use,\n+# modify and/ or redistribute the software under the terms of the CeCILL\n+# license as circulated by CEA, CNRS and INRIA at the following URL\n+# "http://www.cecill.info".\n+# \n+# As a counterpart to the access to the source code and rights to copy,\n+# modify and redistribute granted by the license, users are provided only\n+# with a limited warranty and the software\'s author, the holder of the\n+# economic rights, and the successive licensors have only limited\n+# liability.\n+# \n+# In this respect, the user\'s attention is drawn to the risks associated\n+# with loading, using, modifying and/or developing or reproducing the\n+# software by the user in light of its specific status of free software,\n+# that may mean that it is complicated to manipulate, and that also\n+# therefore means that it is reserved for developers and experienced\n+# professionals having in-depth computer knowledge. Users are therefore\n+# encouraged to load and test the software\'s suitability as regards their\n+# requirements in conditions enabling the security of their systems and/or\n+# data to be ensured and, more generally, to use and operate it in the\n+# same conditions as regards security.\n+# \n+# The fact that you are presently reading this means that you have had\n+# knowledge of the CeCILL license and that you accept its terms.\n+#\n+"""Merge elements of two transcript lists with some condition"""\n+\n+import os, random, shutil, glob\n+from optparse import OptionParser\n+from commons.core.parsing.SequenceListParser import SequenceListParser\n+from commons.core.parsing.BedParser import BedParser\n+from commons.core.parsing.GffParser import GffParser\n+from commons.core.writer.TranscriptWriter import TranscriptWriter\n+from SMART.Java.Python.structure.TranscriptListsComparator import TranscriptListsComparator\n+from SMART.Java.Python.structure.TranscriptContainer import TranscriptContainer\n+from SMART.Java.Python.misc.RPlotter import RPlotter\n+from SMART.Java.Python.misc.Progress import Progress\n+\n+\n+\n+class MergeLists(object):\n+\n+    def __init__(self, verbosity):\n+        self.verbosity     = verbosity\n+        self.seed          = random.randint(0, 100000)\n+        self.aggregation   = False\n+        self.normalization = False\n+        self.distance      = False\n+        self.antisense     = False\n+        self.colinear      = False\n+        self.fileNames     = {}\n+        self.formats       = {}\n+        self.tmpFileNames  = []\n+        self.logHandle     = None\n+\n+#    def __del__(self):\n+#        for fileNameRoot in self.tmpFileNames:\n+#            for fileName in glob.glob("%s*" % (fileNameRoot)):\n+#                os.remove(fileName)\n+#        if self.logHandle != None:\n+#            self.logHandle.close()\n+#            self.logHandle = None\n+\n+    def setLogFileName(self, fileName):\n+        self.logHandle = open(fileName, "w")\n+\n+    def setInputFileName(self, fileName, format, id):\n+        self.fileNames[id] = fileName\n+        self.formats[id]   = format\n+\n+    def setOutputFileName(self, fileName):\n+        self.outputFileName = fileName\n+\n+    def setAggregate(self, aggregation):\n+        self.aggregation = aggregation\n+\n+    def setNormalization(self, normalization):\n+        self.normalization = normalization\n+\n+    def setDistance(self, distance):\n+        self.distance = distance\n+\n+    def setAntisense(self, antisense):\n+        self.antisense = antisense\n+\n+    def setColinear(self, colinear):\n+        self.colinear = colinear\n+\n+    def createTmpFileName(self, root):\n+        fileName = "tmp_%s_%d.gff3" % (root, self.seed)\n+        self.tmpFileNames.append(fileName)\n+        return fileName\n+\n+    def selfMerge(self, fileName, format, outputFileName):\n+        transcriptListComparator = TranscriptListsComparator(self.logHandle,'..b'nscriptListComparator.compareTranscriptList()\n+\n+    def mergeFiles(self, fileName1, fileName2, outputFileName):\n+        outputFile = open(outputFileName, "w")\n+        shutil.copyfileobj(open(fileName1, "r"), outputFile)\n+        shutil.copyfileobj(open(fileName2, "r"), outputFile)\n+        outputFile.close()\n+\n+    def run(self):\n+        selectedFileQuery = self.createTmpFileName("query")\n+        self.keepOverlapping({0: self.fileNames[0], 1: self.fileNames[0]}, {0: "gff3", 1: "gff3"}, selectedFileQuery)\n+        mergeFileTarget = self.createTmpFileName("target")\n+        self.selfMerge(self.fileNames[1], self.formats[1], mergeFileTarget)\n+        if not self.aggregation:\n+            overlapFile = self.createTmpFileName("overlap")\n+            self.keepOverlapping({0: mergeFileTarget, 1: selectedFileQuery}, {0: "gff3", 1: "gff3"}, overlapFile)\n+            mergeFileTarget = overlapFile\n+        mergeFileMerged = self.createTmpFileName("merged")\n+        self.mergeFiles(mergeFileTarget, selectedFileQuery, mergeFileMerged)\n+        self.selfMerge(mergeFileMerged, "gff3", self.outputFileName)\n+\n+\n+\n+if __name__ == "__main__":\n+    \n+    # parse command line\n+    description = "Merge Lists v1.0.3: Merge the elements of two lists of genomic coordinates. [Category: Merge]"\n+\n+    parser = OptionParser(description = description)\n+    parser.add_option("-i", "--input1",    dest="inputFileName1", action="store",                       type="string", help="input file 1 [compulsory] [format: file in transcript format given by -f]")\n+    parser.add_option("-f", "--format1",   dest="format1",        action="store",                       type="string", help="format of file 1 [compulsory] [format: transcript file format]")\n+    parser.add_option("-j", "--input2",    dest="inputFileName2", action="store",      default=None,    type="string", help="input file 2 [compulsory] [format: file in transcript format given by -g]")\n+    parser.add_option("-g", "--format2",   dest="format2",        action="store",      default=None,    type="string", help="format of file 2 [compulsory] [format: file in transcript format]")\n+    parser.add_option("-o", "--output",    dest="outputFileName", action="store",      default=None,    type="string", help="output file [compulsory] [format: output file in GFF3 format]")\n+    parser.add_option("-k", "--all",       dest="all",            action="store_true", default=False,                  help="print all the transcripts, not only those overlapping [format: bool] [default: false]")\n+    parser.add_option("-d", "--distance",  dest="distance",       action="store",      default=0,       type="int",    help="max. distance between two transcripts [format: int] [default: 0]")\n+    parser.add_option("-a", "--antisense", dest="antisense",      action="store_true", default=False,                  help="antisense only [format: bool] [default: false]")\n+    parser.add_option("-c", "--colinear",  dest="colinear",       action="store_true", default=False,                  help="colinear only [format: bool] [default: false]")\n+    parser.add_option("-n", "--normalize", dest="normalize",      action="store_true", default=False,                  help="normalize the number of reads per cluster by the number of mappings per read [format: bool] [default: false]")\n+    parser.add_option("-v", "--verbosity", dest="verbosity",      action="store",      default=1,       type="int",    help="trace level [format: int]")\n+    (options, args) = parser.parse_args()\n+\n+#    ml = MergeLists(logHandle, options.verbosity)\n+    \n+    ml = MergeLists(0)\n+    ml.setInputFileName(options.inputFileName1, options.format1, 0)\n+    ml.setInputFileName(options.inputFileName2, options.format2, 1)\n+    ml.setOutputFileName(options.outputFileName)\n+    ml.setAntisense(options.antisense)\n+    ml.setColinear(options.colinear)\n+    ml.setAggregate(options.all)\n+    ml.setNormalization(options.normalize)\n+    ml.setDistance(options.distance)\n+    ml.run()\n'
b
diff -r d22fadc825e3 -r 2c0c0a89fad7 SMART/Java/Python/misc/MultipleRPlotter.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/SMART/Java/Python/misc/MultipleRPlotter.py Thu May 02 09:56:47 2013 -0400
[
@@ -0,0 +1,160 @@
+#
+# Copyright INRA-URGI 2009-2012
+# 
+# This software is governed by the CeCILL license under French law and
+# abiding by the rules of distribution of free software. You can use,
+# modify and/ or redistribute the software under the terms of the CeCILL
+# license as circulated by CEA, CNRS and INRIA at the following URL
+# "http://www.cecill.info".
+# 
+# As a counterpart to the access to the source code and rights to copy,
+# modify and redistribute granted by the license, users are provided only
+# with a limited warranty and the software's author, the holder of the
+# economic rights, and the successive licensors have only limited
+# liability.
+# 
+# In this respect, the user's attention is drawn to the risks associated
+# with loading, using, modifying and/or developing or reproducing the
+# software by the user in light of its specific status of free software,
+# that may mean that it is complicated to manipulate, and that also
+# therefore means that it is reserved for developers and experienced
+# professionals having in-depth computer knowledge. Users are therefore
+# encouraged to load and test the software's suitability as regards their
+# requirements in conditions enabling the security of their systems and/or
+# data to be ensured and, more generally, to use and operate it in the
+# same conditions as regards security.
+# 
+# The fact that you are presently reading this means that you have had
+# knowledge of the CeCILL license and that you accept its terms.
+#
+
+import os
+import subprocess
+import random
+import math
+from SMART.Java.Python.misc.RPlotter import RPlotter
+
+NBCOLORS = 9
+
+"""
+Plot multiple curves with RPlotter
+"""
+
+class MultipleRPlotter(object):
+ """
+ Plot some curves
+ @ivar fileName: name of the file
+ @type fileName: string
+ @ivar height: height of the file
+ @type height: int
+ @ivar width: width of the file
+ @type width: int
+ @ivar plots: plots to be included
+ @type plots: list of L{RPlotter{RPlotter}}
+ @ivar keep: keep script lines
+ @type keep: boolean
+ @ivar format: format of the file
+ @type format: string
+ """
+
+ def __init__(self, fileName, verbosity = 0, keep = False):
+ """
+ Constructor
+ @param fileName: name of the file to produce
+ @type  fileName: string
+ @param verbosity: verbosity
+ @type  verbosity: int
+ @param keep: keep temporary files
+ @type  keep: boolean
+ """
+ self.fileName = fileName
+ self.verbosity = verbosity
+ self.keep = keep
+ self.format = "png"
+ self.width = 1000
+ self.height = 500
+ self.plots = []
+ self.scriptFileName = "tmpScript-%d.R" % (os.getpid())
+
+ def __del__(self):
+ """
+ Destructor
+ Remove script files
+ """
+ if not self.keep:
+ if os.path.exists(self.scriptFileName):
+ os.remove(self.scriptFileName)
+ outputFileName = "%sout" % (self.scriptFileName)
+ if os.path.exists(outputFileName):
+ os.remove(outputFileName)
+
+ def setFormat(self, format):
+ """
+ Set the format of the picture
+ @param format: the format
+ @type format: string
+ """
+ if format not in ("png", "pdf", "jpeg", "bmp", "tiff"):
+ raise Exception("Format '%s' is not supported by RPlotter" % (format))
+ self.format = format
+
+
+ def setWidth(self, width):
+ """
+ Set the dimensions of the image produced
+ @param width: width of the image
+ @type width: int
+ """
+ self.width = width
+
+
+ def setHeight(self, height):
+ """
+ Set the dimensions of the image produced
+ @param height: heigth of the image
+ @type height: int
+ """
+ self.height = height
+
+
+ def setImageSize(self, width, height):
+ """
+ Set the dimensions of the image produced
+ @param width: width of the image
+ @type width: int
+ @param height: heigth of the image
+ @type height: int
+ """
+ self.width = width
+ self.height = height
+
+ def addPlot(self, plot):
+ """
+ Add a plot
+ @param plots: plot to be included
+ @type  plots: L{RPlotter{RPlotter}}
+ """
+ self.plots.append(plot)
+
+ def plot(self):
+ """
+ Plot the figures
+ """
+ scriptHandle = open(self.scriptFileName, "w")
+ scriptHandle.write("library(RColorBrewer)\n")
+ scriptHandle.write("colorPanel = brewer.pal(n=%d, name=\"Set1\")\n" % (NBCOLORS))
+ scriptHandle.write("%s(%s = \"%s\", width = %d, height = %d, bg = \"white\")\n" % (self.format, "filename" if self.format != "pdf" else "file", self.fileName, self.width, self.height))
+ scriptHandle.write("par(mfrow=c(%d, 1))\n" % (len(self.plots)))
+ for plot in self.plots:
+ scriptHandle.write(plot.getScript())
+ scriptHandle.write("dev.off()\n")
+ scriptHandle.close()
+ rCommand = "R"
+ if "SMARTRPATH" in os.environ:
+ rCommand = os.environ["SMARTRPATH"]
+ command = "\"%s\" CMD BATCH %s" % (rCommand, self.scriptFileName)
+ status = subprocess.call(command, shell=True)
+ if status != 0:
+ self.keep = True
+ raise Exception("Problem with the execution of script file %s, status is: %s" % (self.scriptFileName, status))
+
b
diff -r d22fadc825e3 -r 2c0c0a89fad7 SMART/Java/Python/misc/Progress.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/SMART/Java/Python/misc/Progress.py Thu May 02 09:56:47 2013 -0400
[
@@ -0,0 +1,93 @@
+#
+# Copyright INRA-URGI 2009-2010
+# 
+# This software is governed by the CeCILL license under French law and
+# abiding by the rules of distribution of free software. You can use,
+# modify and/ or redistribute the software under the terms of the CeCILL
+# license as circulated by CEA, CNRS and INRIA at the following URL
+# "http://www.cecill.info".
+# 
+# As a counterpart to the access to the source code and rights to copy,
+# modify and redistribute granted by the license, users are provided only
+# with a limited warranty and the software's author, the holder of the
+# economic rights, and the successive licensors have only limited
+# liability.
+# 
+# In this respect, the user's attention is drawn to the risks associated
+# with loading, using, modifying and/or developing or reproducing the
+# software by the user in light of its specific status of free software,
+# that may mean that it is complicated to manipulate, and that also
+# therefore means that it is reserved for developers and experienced
+# professionals having in-depth computer knowledge. Users are therefore
+# encouraged to load and test the software's suitability as regards their
+# requirements in conditions enabling the security of their systems and/or
+# data to be ensured and, more generally, to use and operate it in the
+# same conditions as regards security.
+# 
+# The fact that you are presently reading this means that you have had
+# knowledge of the CeCILL license and that you accept its terms.
+#
+import sys
+import time
+
+class Progress(object):
+    """Show the progress of a process"""
+
+    def __init__(self, aim, message = "Progress", verbosity = 0):
+        self.aim            = aim
+        self.progress       = 0
+        self.message        = message
+        self.length         = -1
+        self.verbosity      = verbosity
+        self.maxMessageSize = 50
+        self.barSize        = 80
+        self.startTime      = time.time()
+        self.elapsed        = 0
+        if len(self.message) > self.maxMessageSize:
+            self.message = self.message[0:self.maxMessageSize-3] + "..."
+        self.show()
+
+
+    def inc(self):
+        self.progress += 1
+        self.show()
+        
+        
+    def getPrintableElapsedTime(self, time):
+        timeHou = int(time) / 3600
+        timeMin = int(time) / 60 - 60 * timeHou
+        timeSec = int(time) % 60
+        if timeHou > 0:
+            return "%3dh %2dm" % (timeHou, timeMin)
+        if timeMin > 0:
+            return "%2dm %2ds" % (timeMin, timeSec)
+        return "%2ds   " % (timeSec)
+
+
+    def show(self):
+        if self.verbosity <= 0:
+            return
+        if self.aim == 0:
+            return
+        messageSize = len(self.message)
+        length = int(self.progress / float(self.aim) * self.barSize)
+        elapsed = int(time.time() - self.startTime)
+        if (length > self.length) or (elapsed > self.elapsed + 10):
+            self.length = length
+            self.elapsed = elapsed            
+            string = "%s%s[%s%s] %d/%d" % (self.message, " " * max(0, self.maxMessageSize - messageSize), "=" * self.length, " " * (self.barSize - self.length), self.progress, self.aim)
+            if elapsed > 5:
+                done = float(self.progress) / self.aim
+                total = elapsed / done
+                remaining = total - elapsed
+                string += " ETA: %s " % (self.getPrintableElapsedTime(remaining))
+            string += "\r"
+            sys.stdout.write(string)
+            sys.stdout.flush()
+
+
+    def done(self):
+        if self.verbosity > 0:
+            messageSize = len(self.message)
+            elapsed = time.time() - self.startTime
+            print "%s%s[%s] %d completed in %s " % (self.message, " " * max(0, self.maxMessageSize - messageSize), "=" * self.barSize, self.aim, self.getPrintableElapsedTime(elapsed))
b
diff -r d22fadc825e3 -r 2c0c0a89fad7 SMART/Java/Python/misc/RPlotter.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/SMART/Java/Python/misc/RPlotter.py Thu May 02 09:56:47 2013 -0400
[
b'@@ -0,0 +1,821 @@\n+#\n+# Copyright INRA-URGI 2009-2010\n+# \n+# This software is governed by the CeCILL license under French law and\n+# abiding by the rules of distribution of free software. You can use,\n+# modify and/ or redistribute the software under the terms of the CeCILL\n+# license as circulated by CEA, CNRS and INRIA at the following URL\n+# "http://www.cecill.info".\n+# \n+# As a counterpart to the access to the source code and rights to copy,\n+# modify and redistribute granted by the license, users are provided only\n+# with a limited warranty and the software\'s author, the holder of the\n+# economic rights, and the successive licensors have only limited\n+# liability.\n+# \n+# In this respect, the user\'s attention is drawn to the risks associated\n+# with loading, using, modifying and/or developing or reproducing the\n+# software by the user in light of its specific status of free software,\n+# that may mean that it is complicated to manipulate, and that also\n+# therefore means that it is reserved for developers and experienced\n+# professionals having in-depth computer knowledge. Users are therefore\n+# encouraged to load and test the software\'s suitability as regards their\n+# requirements in conditions enabling the security of their systems and/or\n+# data to be ensured and, more generally, to use and operate it in the\n+# same conditions as regards security.\n+# \n+# The fact that you are presently reading this means that you have had\n+# knowledge of the CeCILL license and that you accept its terms.\n+#\n+\n+import os\n+import subprocess\n+import random\n+import math\n+\n+minPositiveValue = 10e-6\n+\n+"""\n+Plot simple curves in R\n+"""\n+\n+class RPlotter(object):\n+    """\n+    Plot some curves\n+    @ivar nbColors: number of different colors\n+    @type nbColors: int\n+    @ivar fileName: name of the file\n+    @type fileName: string\n+    @ivar lines: lines to be plotted\n+    @type lines: array of dict\n+    @ivar names: name of the lines\n+    @type names: array of strings\n+    @ivar colors: color of the lines\n+    @type colors: array of strings\n+    @ivar types: type of the lines (plain or dashed)\n+    @type types: array of strings\n+    @ivar format: format of the picture\n+    @type format: string\n+    @ivar lineWidth: width of the line in a xy-plot\n+    @type lineWidth: int\n+    @ivar xMin: minimum value taken on the x-axis\n+    @type xMin: int\n+    @ivar xMax: maximum value taken on the x-axis\n+    @type xMax: int\n+    @ivar yMin: minimum value taken on the y-axis\n+    @type yMin: int\n+    @ivar yMax: maximum value taken on the y-axis\n+    @type yMax: int\n+    @ivar minimumX: minimum value allowed on the x-axis\n+    @type minimumX: int\n+    @ivar maximumX: maximum value allowed on the x-axis\n+    @type maximumX: int\n+    @ivar minimumY: minimum value allowed on the y-axis\n+    @type minimumY: int\n+    @ivar maximumY: maximum value allowed on the y-axis\n+    @type maximumY: int\n+    @ivar leftMargin:  add some margin in the left part of the plot\n+    @type leftMargin:  float\n+    @ivar rightMargin: add some margin in the right part of the plot\n+    @type rightMargin: float\n+    @ivar downMargin:  add some margin at the top of the plot\n+    @type downMargin:  float\n+    @ivar upMargin:    add some margin at the bottom of the plot\n+    @type upMargin:    float\n+    @ivar logX: use log scale on the x-axis\n+    @type logX: boolean\n+    @ivar logY: use log scale on the y-axis\n+    @type logY: boolean\n+    @ivar logZ: use log scale on the z-axis (the color)\n+    @type logZ: boolean\n+    @ival fill: if a value is not given, fill it with given value\n+    @type fill: int\n+    @ival bucket: cluster the data into buckets of given size\n+    @type bucket: int\n+    @ival seed: a random number\n+    @type seed: int\n+    @ival regression: plot a linear regression\n+    @type regression: boolean\n+    @ival legend: set the legend\n+    @type legend: boolean\n+    @ival legendBySide: set the legend outside of the plot\n+    @type legendBySde: boolean\n+    @ival xLabel: l'..b' lwd = %d, cex = 1.5, ncol = 1, bg = \\"white\\")\\n" % (self.lineWidth)\n+\n+        return script\n+            \n+\n+\n+    def plot(self):\n+        """\n+        Plot the lines\n+        """\n+        scriptFileName = "tmpScript-%d.R" % (self.seed)\n+        scriptHandle = open(scriptFileName, "w")\n+        scriptHandle.write("library(RColorBrewer)\\n")\n+        scriptHandle.write("colorPanel = brewer.pal(n=%d, name=\\"Set1\\")\\n" % (self.nbColors))\n+        scriptHandle.write("%s(%s = \\"%s\\", width = %d, height = %d, bg = \\"white\\")\\n" % (self.format, "filename" if self.format != "pdf" else "file", self.fileName, self.width, self.height))\n+        scriptHandle.write(self.getScript())\n+        scriptHandle.write("dev.off()\\n")\n+        scriptHandle.close()\n+        rCommand = "R"\n+        if "SMARTRPATH" in os.environ:\n+            rCommand = os.environ["SMARTRPATH"]\n+        command = "\\"%s\\" CMD BATCH %s" % (rCommand, scriptFileName)\n+        status = subprocess.call(command, shell=True)\n+\n+        if status != 0:\n+            self.keep = True\n+            raise Exception("Problem with the execution of script file %s, status is: %s" % (scriptFileName, status))\n+            \n+\n+    def getCorrelationData(self):\n+        if not self.regression:\n+            return ""\n+        scriptFileName = "tmpScript-%d.R" % (self.seed)\n+        rScript = open(scriptFileName, "w")\n+        rScript.write("data = scan(\\"tmpData-%d-0.dat\\", list(x = -0.000000, y = -0.000000))\\n" % (self.seed))\n+        x = "log10(data$x)" if self.logX else "data$x"\n+        y = "log10(data$y)" if self.logY else "data$y"\n+        rScript.write("summary(lm(%s ~ %s))\\n" % (y, x))\n+        rScript.close()\n+        rCommand = "R"\n+        if "SMARTRPATH" in os.environ:\n+            rCommand = os.environ["SMARTRPATH"]\n+        command = "\\"%s\\" CMD BATCH %s" % (rCommand, scriptFileName)\n+        status = subprocess.call(command, shell=True)\n+        if status != 0:\n+            self.keep = True\n+            raise Exception("Problem with the execution of script file %s computing the correlation, status is: %s" % (scriptFileName, status))\n+        outputRFile = open("%sout" % (scriptFileName))\n+        output      = ""\n+        start       = False\n+        end         = False\n+        for line in outputRFile:\n+            if start and "> " in line:\n+                end = True\n+            if start and not end:\n+                output += line\n+            if "summary" in line:\n+                start = True\n+        return output\n+\n+\n+    def getSpearmanRho(self):\n+        """\n+        Get the Spearman rho correlation using R\n+        """\n+        return None\n+        if not self.points and not self.barplot and not self.heatPoints:\n+            raise Exception("Cannot compute Spearman rho correlation whereas not in \'points\' or \'bar\' mode.")\n+        \n+        scriptFileName = "tmpScript-%d.R" % (self.seed)\n+        rScript = open(scriptFileName, "w")\n+        rScript.write("library(Hmisc)\\n")\n+        rScript.write("data = scan(\\"tmpData-%d-0.dat\\", list(x = -0.000000, y = -0.000000))\\n" % (self.seed))\n+        rScript.write("spearman(data$x, data$y)\\n")\n+        rScript.close()\n+\n+        rCommand = "R"\n+        if "SMARTRPATH" in os.environ:\n+            rCommand = os.environ["SMARTRPATH"]\n+        command = "\\"%s\\" CMD BATCH %s" % (rCommand, scriptFileName)\n+        status = subprocess.call(command, shell=True)\n+\n+        if status != 0:\n+            self.keep = True\n+            raise Exception("Problem with the execution of script file %s, status is: %s" % (scriptFileName, status))\n+\n+        outputRFile = open("%sout" % (scriptFileName))\n+        nextLine = False\n+        for line in outputRFile:\n+            line = line.strip()\n+            if nextLine:\n+                if line == "NA":\n+                    return None\n+                return float(line)\n+                nextLine = False\n+            if line == "rho":\n+                nextLine = True\n+\n+        return None\n'
b
diff -r d22fadc825e3 -r 2c0c0a89fad7 SMART/Java/Python/misc/UnlimitedProgress.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/SMART/Java/Python/misc/UnlimitedProgress.py Thu May 02 09:56:47 2013 -0400
[
@@ -0,0 +1,81 @@
+#
+# Copyright INRA-URGI 2009-2010
+# 
+# This software is governed by the CeCILL license under French law and
+# abiding by the rules of distribution of free software. You can use,
+# modify and/ or redistribute the software under the terms of the CeCILL
+# license as circulated by CEA, CNRS and INRIA at the following URL
+# "http://www.cecill.info".
+# 
+# As a counterpart to the access to the source code and rights to copy,
+# modify and redistribute granted by the license, users are provided only
+# with a limited warranty and the software's author, the holder of the
+# economic rights, and the successive licensors have only limited
+# liability.
+# 
+# In this respect, the user's attention is drawn to the risks associated
+# with loading, using, modifying and/or developing or reproducing the
+# software by the user in light of its specific status of free software,
+# that may mean that it is complicated to manipulate, and that also
+# therefore means that it is reserved for developers and experienced
+# professionals having in-depth computer knowledge. Users are therefore
+# encouraged to load and test the software's suitability as regards their
+# requirements in conditions enabling the security of their systems and/or
+# data to be ensured and, more generally, to use and operate it in the
+# same conditions as regards security.
+# 
+# The fact that you are presently reading this means that you have had
+# knowledge of the CeCILL license and that you accept its terms.
+#
+import sys
+import time
+
+class UnlimitedProgress(object):
+    """Show the progress of a process when no upper bound is known"""
+
+    def __init__(self, step = 1000, message = "Progress", verbosity = 0):
+        self.step           = step
+        self.progress       = 0
+        self.message        = message
+        self.verbosity      = verbosity
+        self.maxMessageSize = 50
+        self.startTime      = time.time()
+        self.elapsed        = 0
+        if len(self.message) > self.maxMessageSize:
+            self.message = self.message[0:self.maxMessageSize-3] + "..."
+        self.show()
+
+
+    def inc(self):
+        self.progress += 1
+        self.show()
+        
+        
+    def getPrintableElapsedTime(self, time):
+        timeHou = int(time) / 3600
+        timeMin = int(time) / 60 - 60 * timeHou
+        timeSec = int(time) % 60
+        if timeHou > 0:
+            return "%3dh %2dm" % (timeHou, timeMin)
+        if timeMin > 0:
+            return "%2dm %2ds" % (timeMin, timeSec)
+        return "%2ds" % (timeSec)
+
+
+    def show(self):
+        if self.verbosity <= 0:
+            return
+        elapsed = int(time.time() - self.startTime)
+        if (self.progress % self.step == 0) or (elapsed > self.elapsed + 10):
+            self.elapsed = elapsed            
+            string = "%s %d -- time spent: %s\r" % (self.message, self.progress, self.getPrintableElapsedTime(elapsed))
+            sys.stdout.write(string)
+            sys.stdout.flush()
+
+
+    def done(self):
+        if self.verbosity > 0:
+            elapsed = time.time() - self.startTime
+            string = "%s %d -- time spent: %s\r" % (self.message, self.progress, self.getPrintableElapsedTime(elapsed))
+            print string
+
b
diff -r d22fadc825e3 -r 2c0c0a89fad7 SMART/Java/Python/misc/Utils.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/SMART/Java/Python/misc/Utils.py Thu May 02 09:56:47 2013 -0400
[
b'@@ -0,0 +1,271 @@\n+#\n+# Copyright INRA-URGI 2009-2010\n+# \n+# This software is governed by the CeCILL license under French law and\n+# abiding by the rules of distribution of free software. You can use,\n+# modify and/ or redistribute the software under the terms of the CeCILL\n+# license as circulated by CEA, CNRS and INRIA at the following URL\n+# "http://www.cecill.info".\n+# \n+# As a counterpart to the access to the source code and rights to copy,\n+# modify and redistribute granted by the license, users are provided only\n+# with a limited warranty and the software\'s author, the holder of the\n+# economic rights, and the successive licensors have only limited\n+# liability.\n+# \n+# In this respect, the user\'s attention is drawn to the risks associated\n+# with loading, using, modifying and/or developing or reproducing the\n+# software by the user in light of its specific status of free software,\n+# that may mean that it is complicated to manipulate, and that also\n+# therefore means that it is reserved for developers and experienced\n+# professionals having in-depth computer knowledge. Users are therefore\n+# encouraged to load and test the software\'s suitability as regards their\n+# requirements in conditions enabling the security of their systems and/or\n+# data to be ensured and, more generally, to use and operate it in the\n+# same conditions as regards security.\n+# \n+# The fact that you are presently reading this means that you have had\n+# knowledge of the CeCILL license and that you accept its terms.\n+#\n+"""Some useful functions"""\n+\n+import sys, os\n+import random\n+import subprocess\n+\n+\n+def writeFile(fileName, content):\n+    """\n+    Write the content of a file\n+    """\n+    handle = open(fileName, "w")\n+    handle.write(content)\n+    handle.close()\n+\n+def sumOfLists(list1, list2):\n+    """\n+    Element by element sum\n+    """\n+    if len(list1) != len(list2):\n+        sys.exit("Cannot sum list whose sizes are different!")\n+    return [list1[i] + list2[i] for i in range(len(list1))]\n+\n+\n+def protectBackslashes(string):\n+    """\n+    Protect the backslashes in a path by adding another backslash\n+    """\n+    return string.replace("\\\\", "\\\\\\\\")\n+    \n+\n+def getHammingDistance(string1, string2):\n+    """\n+    Compute Hamming distance between two strings\n+    """\n+    if len(string1) != len(string2):\n+        raise Exception("Error, size of %s and %s differ" % (string1, string2))\n+    return sum(ch1 != ch2 for ch1, ch2 in zip(string1, string2))\n+\n+\n+def getLevenshteinDistance(string1, string2):\n+    """\n+    Compute Levenshtein distance between two strings\n+    """\n+    if len(string1) < len(string2):\n+        return getLevenshteinDistance(string2, string1)\n+    if not string1:\n+        return len(string2)\n+    previousRow = xrange(len(string2) + 1)\n+    for i, c1 in enumerate(string1):\n+        currentRow = [i + 1]\n+        for j, c2 in enumerate(string2):\n+            insertions    = previousRow[j + 1] + 1\n+            deletions     = currentRow[j] + 1\n+            substitutions = previousRow[j] + (c1 != c2)\n+            currentRow.append(min(insertions, deletions, substitutions))\n+        previousRow = currentRow\n+    return previousRow[-1]\n+\n+\n+def getMinAvgMedMax(values):\n+    """\n+    Get some stats about a dict\n+    @param values: a distribution (the value being the number of occurrences of the key)\n+    @type values: dict int to int\n+    @return: a tuple\n+    """\n+    minValues = min(values.keys())\n+    maxValues = max(values.keys())\n+    sumValues = sum([value * values[value] for value in values])\n+    nbValues = sum(values.values())\n+    allValues = []\n+    for key in values:\n+        for i in range(values[key]):\n+            allValues.append(key)\n+    sortedValues = sorted(allValues)\n+    sorted(values.values())\n+    if (nbValues % 2 == 0):\n+        medValues = (sortedValues[nbValues / 2 - 1] + sortedValues[nbValues / 2]) / 2.0\n+    else:\n+        medValues = sortedValues[(nbValues + 1) / 2 - 1]\n+    return (minValues, float('..b'les differ (%d != %d)" % (len(lines1), len(lines2))\n+        return False\n+    for i in xrange(len(lines1)):\n+        if lines1[i] != lines2[i]:\n+            print "Line %d differ (\'%s\' != \'%s\')" % (i, lines1[i].strip(), lines2[i].strip())\n+            return False\n+    return True\n+\n+\n+def binomialCoefficient(a, b):\n+    """\n+    Compute cumulated product from a to b\n+    @param a: a value\n+    @type    a: int\n+    @param b: a value\n+    @type    b: int\n+    """\n+    if a > b / 2:\n+        a = b-a\n+    p = 1.0\n+    for i in range(b-a+1, b+1):\n+        p *= i\n+    q = 1.0\n+    for i in range(1, a+1):\n+        q *= i\n+    return p / q\n+\n+\n+memory = {}\n+\n+# def fisherExactPValue(a, b, c, d):\n+#     """\n+#     P-value of Fisher exact test for 2x2 contingency table\n+#     """\n+#     if (a, b, c, d) in memory:\n+#         return memory[(a, b, c, d)]\n+\n+#     n = a + b + c + d\n+#     i1 = binomialCoefficient(a, a+b)\n+#     i2 = binomialCoefficient(c, a+c)\n+#     i3 = binomialCoefficient(c+d, n)\n+#     pValue = i1 * i2 / i3\n+\n+#     memory[(a, b, c, d)] = pValue\n+\n+#     return pValue\n+    \n+\n+def fisherExactPValue(a, b, c, d):\n+    if (a, b, c, d) in memory:\n+        return memory[(a, b, c, d)]\n+\n+    scriptFileName = "tmpScript-%d.R" % (random.randint(0, 10000))\n+    rScript = open(scriptFileName, "w")\n+    rScript.write("data = matrix(c(%d, %d, %d, %d), nr=2)\\n" % (a, b, c, d))\n+    rScript.write("fisher.test(data)\\n")\n+    #rScript.write("chisq.test(data)\\n")\n+    rScript.close()\n+\n+    rCommand = "R"\n+    if "SMARTRPATH" in os.environ:\n+        rCommand = os.environ["SMARTRPATH"]\n+    command = "\\"%s\\" CMD BATCH %s" % (rCommand, scriptFileName)\n+    status = subprocess.call(command, shell=True)\n+\n+    if status != 0:\n+        sys.exit("Problem with the execution of script file %s, status is: %s" % (scriptFileName, status))\n+\n+    outputRFileName = "%sout" % (scriptFileName)\n+    outputRFile = open(outputRFileName)\n+    pValue = None\n+    pValueTag = "p-value "\n+    for line in outputRFile:\n+        line = line.strip()\n+        if line == "": continue\n+        for splittedLine in line.split(","):\n+            splittedLine = splittedLine.strip()\n+            if splittedLine.startswith(pValueTag):\n+                pValue = float(splittedLine.split()[-1])\n+                break\n+\n+    if pValue == None:\n+        sys.exit("Problem with the cannot find p-value! File %s, values are: %d, %d, %d, %d" % (scriptFileName, a, b, c, d))\n+\n+    os.remove(scriptFileName)\n+    os.remove(outputRFileName)\n+\n+    memory[(a, b, c, d)] = pValue\n+\n+    return pValue\n+\n+\n+def fisherExactPValueBulk(list):\n+\n+    scriptFileName = "tmpScript-%d.R" % (random.randint(0, 10000))\n+    rScript = open(scriptFileName, "w")\n+    for element in list:\n+        rScript.write("fisher.test(matrix(c(%d, %d, %d, %d), nr=2))$p.value\\n" % (int(element[0]), int(element[1]), int(element[2]), int(element[3])))\n+    rScript.close()\n+\n+    rCommand = "R"\n+    if "SMARTRPATH" in os.environ:\n+        rCommand = os.environ["SMARTRPATH"]\n+    command = "\\"%s\\" CMD BATCH %s" % (rCommand, scriptFileName)\n+    status = subprocess.call(command, shell=True)\n+\n+    if status != 0:\n+        sys.exit("Problem with the execution of script file %s, status is: %s" % (scriptFileName, status))\n+\n+    outputRFileName = "%sout" % (scriptFileName)\n+    outputRFile = open(outputRFileName)\n+    pValue = None\n+    pValueTag = "[1] "\n+    results = {}\n+    cpt = 0\n+    for line in outputRFile:\n+        line = line.strip()\n+        if line == "": continue\n+        if line.startswith(pValueTag):\n+            pValue = float(line.split()[-1])\n+            results[list[cpt][0:2]] = pValue\n+            cpt += 1\n+\n+    if pValue == None:\n+        sys.exit("Problem with the cannot find p-value!")\n+    if cpt != len(list):\n+        sys.exit("Error in the number of p-values computed by R in file \'%s\'!" % (scriptFileName))\n+\n+    os.remove(scriptFileName)\n+    os.remove(outputRFileName)\n+\n+    return results\n+\n'
b
diff -r d22fadc825e3 -r 2c0c0a89fad7 SMART/Java/Python/modifyFasta.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/SMART/Java/Python/modifyFasta.py Thu May 02 09:56:47 2013 -0400
[
@@ -0,0 +1,62 @@
+#! /usr/bin/env python
+#
+# Copyright INRA-URGI 2009-2010
+# 
+# This software is governed by the CeCILL license under French law and
+# abiding by the rules of distribution of free software. You can use,
+# modify and/ or redistribute the software under the terms of the CeCILL
+# license as circulated by CEA, CNRS and INRIA at the following URL
+# "http://www.cecill.info".
+# 
+# As a counterpart to the access to the source code and rights to copy,
+# modify and redistribute granted by the license, users are provided only
+# with a limited warranty and the software's author, the holder of the
+# economic rights, and the successive licensors have only limited
+# liability.
+# 
+# In this respect, the user's attention is drawn to the risks associated
+# with loading, using, modifying and/or developing or reproducing the
+# software by the user in light of its specific status of free software,
+# that may mean that it is complicated to manipulate, and that also
+# therefore means that it is reserved for developers and experienced
+# professionals having in-depth computer knowledge. Users are therefore
+# encouraged to load and test the software's suitability as regards their
+# requirements in conditions enabling the security of their systems and/or
+# data to be ensured and, more generally, to use and operate it in the
+# same conditions as regards security.
+# 
+# The fact that you are presently reading this means that you have had
+# knowledge of the CeCILL license and that you accept its terms.
+#
+"""Modify the content of a FASTA file"""
+
+from optparse import OptionParser
+from commons.core.parsing.FastaParser import FastaParser
+from commons.core.writer.FastaWriter import FastaWriter
+from SMART.Java.Python.misc.Progress import Progress
+
+
+if __name__ == "__main__":
+    
+    # parse command line
+    description = "Modify Sequence List v1.0.1: Extend or shring a list of sequences. [Category: Data Modification]"
+
+    parser = OptionParser(description = description)
+    parser.add_option("-i", "--input",                     dest="inputFileName",    action="store",                                         type="string", help="input file [compulsory] [format: file in FASTA format]")
+    parser.add_option("-o", "--output",                    dest="outputFileName", action="store",            default=None,    type="string", help="output file [compulsory] [format: output file in FASTA format]")
+    parser.add_option("-s", "--start",                     dest="start",                    action="store",            default=None,    type="int",        help="keep first nucleotides [format: int]")
+    parser.add_option("-e", "--end",                         dest="end",                        action="store",            default=None,    type="int",        help="keep last nucleotides [format: int]")
+    parser.add_option("-v", "--verbosity",             dest="verbosity",            action="store",            default=1,         type="int",        help="trace level [format: int]")
+    (options, args) = parser.parse_args()
+
+    parser     = FastaParser(options.inputFileName, options.verbosity)
+    writer     = FastaWriter(options.outputFileName, options.verbosity)
+    progress = Progress(parser.getNbSequences(), "Reading file %s" % (options.inputFileName), options.verbosity)
+    for sequence in parser.getIterator():
+        if options.start != None:
+            sequence.shrinkToFirstNucleotides(options.start)
+        if options.end != None:
+            sequence.shrinkToLastNucleotides(options.end)
+        writer.addSequence(sequence)
+        progress.inc()
+    progress.done()
b
diff -r d22fadc825e3 -r 2c0c0a89fad7 SMART/Java/Python/modifyGenomicCoordinates.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/SMART/Java/Python/modifyGenomicCoordinates.py Thu May 02 09:56:47 2013 -0400
[
@@ -0,0 +1,80 @@
+#! /usr/bin/env python
+#
+# Copyright INRA-URGI 2009-2010
+# 
+# This software is governed by the CeCILL license under French law and
+# abiding by the rules of distribution of free software. You can use,
+# modify and/ or redistribute the software under the terms of the CeCILL
+# license as circulated by CEA, CNRS and INRIA at the following URL
+# "http://www.cecill.info".
+# 
+# As a counterpart to the access to the source code and rights to copy,
+# modify and redistribute granted by the license, users are provided only
+# with a limited warranty and the software's author, the holder of the
+# economic rights, and the successive licensors have only limited
+# liability.
+# 
+# In this respect, the user's attention is drawn to the risks associated
+# with loading, using, modifying and/or developing or reproducing the
+# software by the user in light of its specific status of free software,
+# that may mean that it is complicated to manipulate, and that also
+# therefore means that it is reserved for developers and experienced
+# professionals having in-depth computer knowledge. Users are therefore
+# encouraged to load and test the software's suitability as regards their
+# requirements in conditions enabling the security of their systems and/or
+# data to be ensured and, more generally, to use and operate it in the
+# same conditions as regards security.
+# 
+# The fact that you are presently reading this means that you have had
+# knowledge of the CeCILL license and that you accept its terms.
+#
+"""Modify the genomic coordinates of a file"""
+
+from optparse import OptionParser
+from commons.core.writer.TranscriptWriter import TranscriptWriter
+from SMART.Java.Python.structure.TranscriptContainer import TranscriptContainer
+from SMART.Java.Python.misc.Progress import Progress
+
+
+if __name__ == "__main__":
+    
+    # parse command line
+    description = "Modify Genomic Coordinates v1.0.1: Extend or shrink a list of genomic coordinates. [Category: Data Modification]"
+
+    parser = OptionParser(description = description)
+    parser.add_option("-i", "--input",      dest="inputFileName",  action="store",               type="string", help="input file [compulsory] [format: file in transcript format given by -f]")
+    parser.add_option("-f", "--format",     dest="format",         action="store",               type="string", help="format of the input [compulsory] [format: transcript file format]")
+    parser.add_option("-o", "--output",     dest="outputFileName", action="store",               type="string", help="output file [compulsory] [format: output file in GFF3 format]")
+    parser.add_option("-s", "--start",      dest="start",          action="store", default=None, type="int",    help="restrict to the start of the transcript [format: int]")
+    parser.add_option("-e", "--end",        dest="end",            action="store", default=None, type="int",    help="restrict to the end of the transcript [format: int]")
+    parser.add_option("-5", "--fivePrime",  dest="fivePrime",      action="store", default=None, type="int",    help="extend to the 5' direction [format: int]")
+    parser.add_option("-3", "--threePrime", dest="threePrime",     action="store", default=None, type="int",    help="extend to the 3' direction [format: int]")
+    parser.add_option("-v", "--verbosity",  dest="verbosity",      action="store", default=1,    type="int",    help="trace level [format: int]")
+
+    (options, args) = parser.parse_args()
+
+    parser = TranscriptContainer(options.inputFileName, options.format, options.verbosity)
+        
+    writer = TranscriptWriter(options.outputFileName, "gff3", options.verbosity)
+
+    nbItems = 0
+    nbItems = parser.getNbItems()
+    print "%i items found" % (nbItems)
+
+    progress = Progress(nbItems, "Analyzing sequences of " + options.inputFileName, options.verbosity)
+    for transcript in parser.getIterator():
+        if options.start != None:
+            transcript.restrictStart(options.start)
+        if options.end != None:
+            transcript.restrictEnd(options.end)
+        if options.fivePrime != None:
+            transcript.extendStart(options.fivePrime)
+        if options.threePrime != None:
+            transcript.extendEnd(options.threePrime)
+
+        writer.addTranscript(transcript)
+
+        progress.inc()
+    progress.done()
+
+    writer.write()
b
diff -r d22fadc825e3 -r 2c0c0a89fad7 SMART/Java/Python/modifySequenceList.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/SMART/Java/Python/modifySequenceList.py Thu May 02 09:56:47 2013 -0400
[
@@ -0,0 +1,72 @@
+#! /usr/bin/env python
+#
+# Copyright INRA-URGI 2009-2010
+# 
+# This software is governed by the CeCILL license under French law and
+# abiding by the rules of distribution of free software. You can use,
+# modify and/ or redistribute the software under the terms of the CeCILL
+# license as circulated by CEA, CNRS and INRIA at the following URL
+# "http://www.cecill.info".
+# 
+# As a counterpart to the access to the source code and rights to copy,
+# modify and redistribute granted by the license, users are provided only
+# with a limited warranty and the software's author, the holder of the
+# economic rights, and the successive licensors have only limited
+# liability.
+# 
+# In this respect, the user's attention is drawn to the risks associated
+# with loading, using, modifying and/or developing or reproducing the
+# software by the user in light of its specific status of free software,
+# that may mean that it is complicated to manipulate, and that also
+# therefore means that it is reserved for developers and experienced
+# professionals having in-depth computer knowledge. Users are therefore
+# encouraged to load and test the software's suitability as regards their
+# requirements in conditions enabling the security of their systems and/or
+# data to be ensured and, more generally, to use and operate it in the
+# same conditions as regards security.
+# 
+# The fact that you are presently reading this means that you have had
+# knowledge of the CeCILL license and that you accept its terms.
+#
+"""Modify the content of a FASTA file"""
+import sys
+from optparse import OptionParser
+from commons.core.parsing.FastaParser import FastaParser
+from commons.core.parsing.FastqParser import FastqParser
+from commons.core.writer.FastaWriter import FastaWriter
+from commons.core.writer.FastqWriter import FastqWriter
+from SMART.Java.Python.misc.Progress import Progress
+
+
+if __name__ == "__main__":
+    
+    # parse command line
+    description = "Modify Sequence List v1.0.1: Extend or shring a list of sequences. [Category: Data Modification]"
+
+    parser = OptionParser(description = description)
+    parser.add_option("-i", "--input", dest="inputFileName",action="store", type="string", help="input file [compulsory] [format: file in format given by -f]")
+    parser.add_option("-o", "--output", dest="outputFileName", action="store",default=None,    type="string", help="output file [compulsory] [format: output file in format given by -f]")
+    parser.add_option("-f", "--format", dest="format",action="store",type="string", help="format of the file [compulsory] [format: sequence file format]")
+    parser.add_option("-s", "--start", dest="start", action="store", default=None,type="int",help="keep first nucleotides [format: int]")
+    parser.add_option("-e", "--end",  dest="end", action="store",default=None,type="int",help="keep last nucleotides [format: int]")
+    parser.add_option("-v", "--verbosity",dest="verbosity",action="store",default=1,type="int",help="trace level [format: int]")
+    (options, args) = parser.parse_args()
+
+    if options.format == "fasta":
+        parser = FastaParser(options.inputFileName, options.verbosity)
+        writer = FastaWriter(options.outputFileName, options.verbosity)
+    elif options.format == "fastq":
+        parser = FastqParser(options.inputFileName, options.verbosity)
+        writer = FastqWriter(options.outputFileName, options.verbosity)
+    else:
+        sys.exit("Do not understand '%s' file format." % (options.format))
+
+    progress = Progress(parser.getNbSequences(), "Reading file %s" % (options.inputFileName), options.verbosity)
+    for sequence in parser.getIterator():
+        if options.start != None:
+            sequence.shrinkToFirstNucleotides(options.start)
+        if options.end != None:
+            sequence.shrinkToLastNucleotides(options.end)
+        writer.addSequence(sequence)
+        progress.inc()
+    progress.done()
b
diff -r d22fadc825e3 -r 2c0c0a89fad7 SMART/Java/Python/mySql/MySqlConnection.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/SMART/Java/Python/mySql/MySqlConnection.py Thu May 02 09:56:47 2013 -0400
b
@@ -0,0 +1,137 @@
+#
+# Copyright INRA-URGI 2009-2010
+# 
+# This software is governed by the CeCILL license under French law and
+# abiding by the rules of distribution of free software. You can use,
+# modify and/ or redistribute the software under the terms of the CeCILL
+# license as circulated by CEA, CNRS and INRIA at the following URL
+# "http://www.cecill.info".
+# 
+# As a counterpart to the access to the source code and rights to copy,
+# modify and redistribute granted by the license, users are provided only
+# with a limited warranty and the software's author, the holder of the
+# economic rights, and the successive licensors have only limited
+# liability.
+# 
+# In this respect, the user's attention is drawn to the risks associated
+# with loading, using, modifying and/or developing or reproducing the
+# software by the user in light of its specific status of free software,
+# that may mean that it is complicated to manipulate, and that also
+# therefore means that it is reserved for developers and experienced
+# professionals having in-depth computer knowledge. Users are therefore
+# encouraged to load and test the software's suitability as regards their
+# requirements in conditions enabling the security of their systems and/or
+# data to be ensured and, more generally, to use and operate it in the
+# same conditions as regards security.
+# 
+# The fact that you are presently reading this means that you have had
+# knowledge of the CeCILL license and that you accept its terms.
+#
+#! /usr/bin/env python
+import os
+import random
+import sqlite3
+from SMART.Java.Python.mySql.MySqlQuery import MySqlQuery
+
+
+class MySqlConnection(object):
+    """Connection to a database"""
+
+    def __init__(self, verbosity = 0):
+        self.verbosity = verbosity
+        self.databaseName = os.path.join(os.environ.get("SMARTTMPPATH", "."), "smartdb%d" % random.randint(0, 100000))
+        self.connection = sqlite3.connect(self.databaseName)
+        self.executeQuery("PRAGMA journal_mode = OFF")
+        self.executeQuery("PRAGMA synchronous = 0")
+        self.executeQuery("PRAGMA locking_mode = EXCLUSIVE")
+        self.executeQuery("PRAGMA count_change = OFF")
+        self.executeQuery("PRAGMA temp_store = 2")
+
+    def __del__(self):
+        self.connection.close()
+
+
+    def createDatabase(self):
+        pass
+
+
+    def deleteDatabase(self):
+        if os.path.exists(self.databaseName):
+            os.remove(self.databaseName)
+
+
+    def executeQuery(self, command, insertion = False):
+        cursor = self.connection.cursor()
+        query = MySqlQuery(cursor, self.verbosity)
+        try:
+            result = query.execute(command, insertion)
+            self.connection.commit()
+        except:
+            result = query.execute(command, insertion)
+            self.connection.commit()
+        if insertion:
+            return result
+        else:
+            return query
+
+
+    def executeManyQueries(self, commands):
+        cursor = self.connection.cursor()
+        query = MySqlQuery(cursor, self.verbosity)
+        try:
+            for cpt, command in enumerate(commands):
+                query.execute(command)
+            self.connection.commit()
+        except:
+            for cpt, command in enumerate(commands):
+                query.execute(command)
+            self.connection.commit()
+
+
+    def executeManyFormattedQueries(self, command, lines, insertion = False):
+        cursor = self.connection.cursor()
+        query = MySqlQuery(cursor, self.verbosity)
+        for line in lines:
+            result = query.executeFormat(command, line)
+        self.connection.commit()
+        if insertion:
+            return result
+        else:
+            return query
+
+
+    def executeManyQueriesIterator(self, table):
+        cursor = self.connection.cursor()
+        query = MySqlQuery(cursor, self.verbosity)
+        try:
+            for command in table.getIterator():
+                query.execute(command)
+            self.connection.commit()
+        except:
+            for command in table.getIterator():
+                query.execute(command)
+            self.connection.commit()
+
+
+    def executeManyFormattedQueriesIterator(self, table):
+        cursor = self.connection.cursor()
+        query = MySqlQuery(cursor, self.verbosity)
+        try:
+            for command, values in table.getIterator():
+                query.executeFormat(command, values)
+            self.connection.commit()
+        except:
+            for command, values in table.getIterator():
+                query.execute(command, values)
+            self.connection.commit()
+
+
+    def executeFormattedQuery(self, command, parameters, insertion = False):
+        cursor = self.connection.cursor()
+        query = MySqlQuery(cursor, self.verbosity)
+        result = query.executeFormat(command, parameters)
+        self.connection.commit()
+        if insertion:
+            return result
+        else:
+            return query
\ No newline at end of file
b
diff -r d22fadc825e3 -r 2c0c0a89fad7 SMART/Java/Python/mySql/MySqlExonTable.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/SMART/Java/Python/mySql/MySqlExonTable.py Thu May 02 09:56:47 2013 -0400
[
@@ -0,0 +1,97 @@
+#
+# Copyright INRA-URGI 2009-2010
+# 
+# This software is governed by the CeCILL license under French law and
+# abiding by the rules of distribution of free software. You can use,
+# modify and/ or redistribute the software under the terms of the CeCILL
+# license as circulated by CEA, CNRS and INRIA at the following URL
+# "http://www.cecill.info".
+# 
+# As a counterpart to the access to the source code and rights to copy,
+# modify and redistribute granted by the license, users are provided only
+# with a limited warranty and the software's author, the holder of the
+# economic rights, and the successive licensors have only limited
+# liability.
+# 
+# In this respect, the user's attention is drawn to the risks associated
+# with loading, using, modifying and/or developing or reproducing the
+# software by the user in light of its specific status of free software,
+# that may mean that it is complicated to manipulate, and that also
+# therefore means that it is reserved for developers and experienced
+# professionals having in-depth computer knowledge. Users are therefore
+# encouraged to load and test the software's suitability as regards their
+# requirements in conditions enabling the security of their systems and/or
+# data to be ensured and, more generally, to use and operate it in the
+# same conditions as regards security.
+# 
+# The fact that you are presently reading this means that you have had
+# knowledge of the CeCILL license and that you accept its terms.
+#
+import random
+from SMART.Java.Python.structure.Interval import Interval
+from SMART.Java.Python.mySql.MySqlTable import MySqlTable
+
+
+class MySqlExonTable(MySqlTable):
+    """A table of exon in a mySQL database"""
+
+    def __init__(self, connection, name = None, chromosome = None, verbosity = 0):
+        if chromosome == None:
+            chromosome = ""
+        else:
+            chromosome = "_%s" % chromosome
+        if name == None:
+            name = "TmpTable_%d" % (random.randint(0, 100000))
+        name = "%s%s_exons" % (name, chromosome)
+        super(MySqlExonTable, self).__init__(connection, name, verbosity)
+
+
+    def createExonTable(self):
+        variables = Interval.getSqlVariables()
+        variables.append("transcriptId")
+        types = Interval.getSqlTypes()
+        types["transcriptId"] = "int"
+        sizes = Interval.getSqlSizes()
+        sizes["transcriptId"] = 11
+        self.create(variables, types, sizes)
+
+
+    def rename(self, name):
+        super(MySqlExonTable, self).rename("%s_exons" % name)
+    
+        
+    def addExon(self, exon, transcriptId):
+        values = exon.getSqlValues()
+        values["transcriptId"] = transcriptId
+        id = self.addLine(values)
+        exon.id = id
+
+
+    def retrieveExonsFromTranscriptId(self, transcriptId):
+        if not self.created:
+            return []
+        query = self.mySqlConnection.executeQuery("SELECT * FROM %s WHERE transcriptId = %d" % (self.name, transcriptId))
+        exons = []
+        for exonLine in query.getIterator():
+            exon = Interval()
+            exon.setSqlValues(exonLine)
+            exons.append(exon)
+        return exons
+            
+
+    def retrieveExonsFromBulkTranscriptIds(self, transcriptIds):
+        if not transcriptIds:
+            return {}
+        if not self.created:
+            return {}
+        exons = dict([(transcriptId, []) for transcriptId in transcriptIds])
+        query = self.mySqlConnection.executeQuery("SELECT * FROM %s WHERE transcriptId IN (%s)" % (self.name, ", ".join(["%s" % (transcriptId) for transcriptId in transcriptIds])))
+        for exonLine in query.getIterator():
+            exon = Interval()
+            exon.setSqlValues(exonLine)
+            exons[exonLine[-1]].append(exon)
+        return exons
+            
+
+    def removeFromTranscriptId(self, transcriptId):
+        self.mySqlConnection.executeQuery("DELETE FROM %s WHERE transcriptId = %d" % (self.name, transcriptId))
b
diff -r d22fadc825e3 -r 2c0c0a89fad7 SMART/Java/Python/mySql/MySqlQuery.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/SMART/Java/Python/mySql/MySqlQuery.py Thu May 02 09:56:47 2013 -0400
b
@@ -0,0 +1,94 @@
+#
+# Copyright INRA-URGI 2009-2010
+# 
+# This software is governed by the CeCILL license under French law and
+# abiding by the rules of distribution of free software. You can use,
+# modify and/ or redistribute the software under the terms of the CeCILL
+# license as circulated by CEA, CNRS and INRIA at the following URL
+# "http://www.cecill.info".
+# 
+# As a counterpart to the access to the source code and rights to copy,
+# modify and redistribute granted by the license, users are provided only
+# with a limited warranty and the software's author, the holder of the
+# economic rights, and the successive licensors have only limited
+# liability.
+# 
+# In this respect, the user's attention is drawn to the risks associated
+# with loading, using, modifying and/or developing or reproducing the
+# software by the user in light of its specific status of free software,
+# that may mean that it is complicated to manipulate, and that also
+# therefore means that it is reserved for developers and experienced
+# professionals having in-depth computer knowledge. Users are therefore
+# encouraged to load and test the software's suitability as regards their
+# requirements in conditions enabling the security of their systems and/or
+# data to be ensured and, more generally, to use and operate it in the
+# same conditions as regards security.
+# 
+# The fact that you are presently reading this means that you have had
+# knowledge of the CeCILL license and that you accept its terms.
+#
+
+class MySqlQuery(object):
+    """Query to a database"""
+
+    def __init__(self, cursor, verbosity = 0):
+        self.verbosity = verbosity
+        self.cursor = cursor
+        self.insertedId = None
+
+
+    def __del__(self):
+        self.cursor.close()
+        
+        
+    def execute(self, query, insertion = False):
+        if self.verbosity > 99:
+            print "Querying %s" % (query)
+        try:
+            results = self.cursor.execute(query)
+        except Exception:
+            raise Exception("Error! Command \"%s\" failed!" % (query))
+        if insertion:
+            return self.cursor.lastrowid
+        return results
+
+
+    def executeFormat(self, query, parameters):
+        if self.verbosity > 99:
+            print "Querying %s |" % (query),
+            for parameter in parameters:
+                print parameter,
+            print
+        results = self.cursor.execute(query, parameters)
+        return results
+
+
+    def getLine(self):
+        return self.cursor.fetchone()
+
+
+    def getLines(self, lines = None):
+        if lines == None:
+            return self.cursor.fetchall()
+        return self.cursor.fetchmany(lines)
+
+
+    def isEmpty(self):
+        self.getLines()
+        return self.cursor.rowcount == None or self.cursor.rowcount == 0
+    
+
+    def getInsertedId(self):
+        return self.insertedId
+
+
+    def getIterator(self):
+        line = self.getLine()
+        while line != None:
+            yield line
+            line = self.getLine()
+         
+
+    def show(self):
+        for line in self.getIterator():
+            print line
\ No newline at end of file
b
diff -r d22fadc825e3 -r 2c0c0a89fad7 SMART/Java/Python/mySql/MySqlTable.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/SMART/Java/Python/mySql/MySqlTable.py Thu May 02 09:56:47 2013 -0400
[
b'@@ -0,0 +1,349 @@\n+#\n+# Copyright INRA-URGI 2009-2010\n+# \n+# This software is governed by the CeCILL license under French law and\n+# abiding by the rules of distribution of free software. You can use,\n+# modify and/ or redistribute the software under the terms of the CeCILL\n+# license as circulated by CEA, CNRS and INRIA at the following URL\n+# "http://www.cecill.info".\n+# \n+# As a counterpart to the access to the source code and rights to copy,\n+# modify and redistribute granted by the license, users are provided only\n+# with a limited warranty and the software\'s author, the holder of the\n+# economic rights, and the successive licensors have only limited\n+# liability.\n+# \n+# In this respect, the user\'s attention is drawn to the risks associated\n+# with loading, using, modifying and/or developing or reproducing the\n+# software by the user in light of its specific status of free software,\n+# that may mean that it is complicated to manipulate, and that also\n+# therefore means that it is reserved for developers and experienced\n+# professionals having in-depth computer knowledge. Users are therefore\n+# encouraged to load and test the software\'s suitability as regards their\n+# requirements in conditions enabling the security of their systems and/or\n+# data to be ensured and, more generally, to use and operate it in the\n+# same conditions as regards security.\n+# \n+# The fact that you are presently reading this means that you have had\n+# knowledge of the CeCILL license and that you accept its terms.\n+#\n+import re\n+import sys\n+\n+class MySqlTable(object):\n+    """\n+    Store a table of a mySQL database, used for transcripts or exons\n+    Record a a name and a type (int, float, double) for each column\n+    @ivar name:            name of the table\n+    @type name:            string\n+    @ivar variables:       name of the columns\n+    @type variables:       list of string\n+    @ivar types:           type of the columns\n+    @type types:           dict of string\n+    @ivar mySqlConnection: connection to a database\n+    @type mySqlConnection: class L{MySqlConnection<MySqlConnection>}\n+    @ivar nbLines:         number of rows\n+    @type nbLines:         int\n+    @ivar verbosity:       verbosity\n+    @type verbosity:       int\n+    """\n+\n+    def __init__(self, connection, name, verbosity = 0):\n+        """\n+        Constructor\n+        Possibly retrieve column names and types if table exists\n+        @param mySqlConnection: connection to a databas\n+        @type  mySqlConnection: class L{MySqlConnection<MySqlConnection>}\n+        @param name:            name of the table\n+        @type  name:            string\n+        @param verbosity:       verbosity\n+        @type  verbosity:       int\n+        """\n+        self.name      = name\n+        self.variables = []\n+        self.types     = {}\n+        self.sizes     = {}\n+        self.nbLines   = None\n+        self.verbosity = verbosity\n+        self.mySqlConnection = connection\n+        queryTables = self.mySqlConnection.executeQuery("SELECT name FROM sqlite_master WHERE type LIKE \'table\' AND name LIKE \'%s\'" % (self.name))\n+        self.created = not queryTables.isEmpty()\n+        if self.created:\n+            queryFields = self.mySqlConnection.executeQuery("PRAGMA table_info(\'%s\')" % (name))\n+            for field in queryFields.getIterator():\n+                if field[1] != "id":\n+                    self.variables.append(field[1])\n+                    self.types[field[1]] = field[2]\n+                    self.sizes[field[1]] = field[3]\n+                    \n+                    \n+    def getName(self):\n+        return self.name\n+\n+\n+    def create(self, variables, types, sizes):\n+        """\n+        Create a table using give column names and types\n+        @param variables: names of the columns\n+        @type  variables: list of string\n+        @param types:     types of the columns\n+        @type  types:     dict of string\n+        @param sizes:     sizes of the types\n+        @type  size'..b', id):\n+        """\n+        Retrieve a row from its id\n+        @param id: the id of the row\n+        @type  id: int\n+        @return:   the row\n+        """\n+        query = self.mySqlConnection.executeQuery("SELECT * FROM \'%s\' WHERE id = %d" % (self.name, id))\n+        result = query.getLine()\n+        if result == None:\n+            raise Exception("Error! Id %d is not in the table %s!" % (id, self.name))\n+        return result\n+\n+\n+    def retrieveBulkFromId(self, ids):\n+        """\n+        Retrieve a row from its id\n+        @param id: the ids of the row\n+        @type  id: list of int\n+        @return:   the row\n+        """\n+        if not ids:\n+            return []\n+        MAXSIZE = 1000\n+        results = []\n+        for batch in range(len(ids) / MAXSIZE + 1):\n+            theseIds = ids[batch * MAXSIZE : (batch+1) * MAXSIZE]\n+            if theseIds:\n+                query = self.mySqlConnection.executeQuery("SELECT * FROM \'%s\' WHERE id IN (%s)" % (self.name, ", ".join(["%d" % (id) for id in theseIds])))\n+                lines = query.getLines()\n+                if len(lines) != len(theseIds):\n+                    raise Exception("Error! Some Ids of (%s) is are missing in the table \'%s\' (got %d instead of %d)!" % (", ".join(["%d" % (id) for id in theseIds]), self.name, len(lines)), len(theseIds))\n+                results.extend(lines)\n+        return results\n+\n+\n+    def removeFromId(self, id):\n+        """\n+        Remove a row from its id\n+        @param id: the id of the row\n+        @type  id: int\n+        """\n+        self.mySqlConnection.executeQuery("DELETE FROM \'%s\' WHERE id = %d" % (self.name, id))\n+    \n+    \n+    def getIterator(self):\n+        """\n+        Iterate on the content of table\n+        @return: iterator to the rows of the table\n+        """\n+        if not self.created:\n+            return\n+        MAXSIZE = 1000\n+        query = self.mySqlConnection.executeQuery("SELECT count(id) FROM \'%s\'" % (self.name))\n+        nbRows = int(query.getLine()[0])\n+        for chunk in range((nbRows / MAXSIZE) + 1):\n+            query = self.mySqlConnection.executeQuery("SELECT * FROM \'%s\' LIMIT %d, %d" % (self.name, chunk * MAXSIZE, MAXSIZE))\n+            for line in query.getIterator():\n+                yield line\n+\n+\n+    def createIndex(self, indexName, values, unique = False, fullText = False):\n+        """\n+        Add an index on the table\n+        @param indexName: name of the index\n+        @type  indexName: string\n+        @param values:    values to be indexed\n+        @type  values:    string\n+        @param unique:    if the index is unique\n+        @type  unique:    boolean\n+        @param fullText:  whether full text should be indexed\n+        @type  fullText:  boolean\n+        """\n+        self.mySqlConnection.executeQuery("CREATE %s%sINDEX \'%s\' ON \'%s\' (%s)" % ("UNIQUE " if unique else "", "FULLTEXT " if fullText else "", indexName, self.name, ", ".join(values)))\n+\n+\n+    def setDefaultTagValue(self, field, name, value):\n+        """\n+        Add a tag value\n+        @param name:  name of the tag\n+        @type  name:  string\n+        @param value: value of the tag\n+        @type  value: string or int\n+        """\n+        newData = {}\n+        for line in MySqlTable.getIterator(self):\n+            id = line[0]\n+            tags = line[field]\n+            if tags == \'\':\n+                newTag = "%s=%s" % (name, value)\n+            else:\n+                newTag = "%s;%s=%s" % (tags, name, value)\n+            if name not in [tag.split("=")[0] for tag in tags.split(";")]:\n+                newData[id] = newTag\n+        for id, tag in newData.iteritems():\n+            query = self.mySqlConnection.executeQuery("UPDATE \'%s\' SET tags = \'%s\' WHERE id = %i" % (self.name, tag, id))\n+\n+\n+\n+    def show(self):\n+        """\n+        Drop the content of the current table\n+        """\n+        query = self.mySqlConnection.executeQuery("SELECT * FROM \'%s\'" % (self.name))\n+        print query.getLines()\n+\n'
b
diff -r d22fadc825e3 -r 2c0c0a89fad7 SMART/Java/Python/mySql/MySqlTranscriptTable.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/SMART/Java/Python/mySql/MySqlTranscriptTable.py Thu May 02 09:56:47 2013 -0400
[
@@ -0,0 +1,149 @@
+#
+# Copyright INRA-URGI 2009-2010
+# 
+# This software is governed by the CeCILL license under French law and
+# abiding by the rules of distribution of free software. You can use,
+# modify and/ or redistribute the software under the terms of the CeCILL
+# license as circulated by CEA, CNRS and INRIA at the following URL
+# "http://www.cecill.info".
+# 
+# As a counterpart to the access to the source code and rights to copy,
+# modify and redistribute granted by the license, users are provided only
+# with a limited warranty and the software's author, the holder of the
+# economic rights, and the successive licensors have only limited
+# liability.
+# 
+# In this respect, the user's attention is drawn to the risks associated
+# with loading, using, modifying and/or developing or reproducing the
+# software by the user in light of its specific status of free software,
+# that may mean that it is complicated to manipulate, and that also
+# therefore means that it is reserved for developers and experienced
+# professionals having in-depth computer knowledge. Users are therefore
+# encouraged to load and test the software's suitability as regards their
+# requirements in conditions enabling the security of their systems and/or
+# data to be ensured and, more generally, to use and operate it in the
+# same conditions as regards security.
+# 
+# The fact that you are presently reading this means that you have had
+# knowledge of the CeCILL license and that you accept its terms.
+#
+import random
+import sys
+from SMART.Java.Python.structure.TranscriptList import TranscriptList
+from SMART.Java.Python.mySql.MySqlExonTable import MySqlExonTable
+from SMART.Java.Python.mySql.MySqlTable import MySqlTable
+from SMART.Java.Python.structure.Transcript import Transcript
+from SMART.Java.Python.misc.Progress import Progress
+
+class MySqlTranscriptTable(MySqlTable):
+    """A table of transcripts in a mySQL database"""
+
+    def __init__(self, connection, name = None, chromosome = None, verbosity = 0):
+        if chromosome == None:
+            chromosome = ""
+        else:
+            chromosome = "_%s" % chromosome
+        if name == None:
+            name = "TmpTable_%d" % (random.randint(0, 100000))
+        name = "%s%s" % (name, chromosome)
+        super(MySqlTranscriptTable, self).__init__(connection, "%s_transcripts" % name, verbosity)
+
+
+    def createTranscriptTable(self):
+        self.create(Transcript.getSqlVariables(), Transcript.getSqlTypes(), Transcript.getSqlSizes())
+
+
+    def rename(self, name):
+        super(MySqlTranscriptTable, self).rename("%s_transcripts" % name)
+
+
+    def remove(self):
+        super(MySqlTranscriptTable, self).remove()
+        
+        
+    def clear(self):
+        super(MySqlTranscriptTable, self).clear()
+
+        
+    def copy(self, transcriptTable):
+        self.remove()
+        super(MySqlTranscriptTable, self).copy(transcriptTable)
+
+
+    def add(self, transcriptTable):
+        super(MySqlTranscriptTable, self).add(transcriptTable)
+
+
+    def addTranscript(self, transcript):
+        id = self.addLine(transcript.getSqlValues())
+        transcript.id = id
+            
+            
+    def addTranscriptList(self, transcriptList):
+        progress = Progress(transcriptList.getNbTranscript(), "Storing list to %s" % (self.name), self.verbosity)
+        for transcript in transcriptList.getIterator():
+            self.addTranscript(transcript)
+            progress.inc()
+        progress.done()
+
+            
+    def removeTranscript(self, transcript):
+        self.removeFromId(transcript.id)
+            
+            
+    def retrieveTranscriptFromId(self, id):
+        transcript = Transcript()
+        transcript.setSqlValues(self.retrieveFromId(id))
+        return transcript
+    
+    
+    def retrieveBulkTranscriptFromId(self, ids):
+        if not ids:
+            return []
+        transcripts = self.retrieveBulkFromId(ids)
+        idsToTranscripts = {}
+        for values in transcripts:
+            transcript = Transcript()
+            transcript.setSqlValues(values)
+            idsToTranscripts[values[0]] = transcript
+        return idsToTranscripts.values()
+    
+    
+    def selectTranscripts(self, command, simple = False):
+        MAXSIZE = 100000
+        found   = True
+        cpt     = 0
+        while found:
+            found = False
+            if simple:
+                thisCommand = command
+            else:
+                thisCommand = "%s LIMIT %d OFFSET %d" % (command, MAXSIZE, MAXSIZE * cpt)
+            query = self.mySqlConnection.executeQuery(thisCommand)
+            for line in query.getIterator():
+                found      = True
+                id         = int(line[0])
+                transcript = Transcript()
+                transcript.setSqlValues(line)
+                yield (id, transcript)
+            cpt += 1
+            if simple:
+                return
+
+    
+    def getIterator(self):
+        for id, transcript in self.selectTranscripts("SELECT * FROM '%s'" % (self.name)):
+            yield transcript
+
+
+    def retrieveTranscriptList(self):
+        transcriptList = TranscriptList()
+        for transcriptLine in self.getLines():
+            transcript = Transcript()
+            transcript.setSqlValues(transcriptLine)
+            transcriptList.addTranscript(transcript)
+        return transcriptList
+            
+
+    def setDefaultTagValue(self, name, value):
+        super(MySqlTranscriptTable, self).setDefaultTagValue(Transcript.getSqlVariables().index("tags")+1, name, value)
\ No newline at end of file
b
diff -r d22fadc825e3 -r 2c0c0a89fad7 SMART/Java/Python/ncList/.NCList.py.swp
b
Binary file SMART/Java/Python/ncList/.NCList.py.swp has changed
b
diff -r d22fadc825e3 -r 2c0c0a89fad7 SMART/Java/Python/ncList/.NCListCursor.py.swp
b
Binary file SMART/Java/Python/ncList/.NCListCursor.py.swp has changed
b
diff -r d22fadc825e3 -r 2c0c0a89fad7 SMART/Java/Python/ncList/Benchmark.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/SMART/Java/Python/ncList/Benchmark.py Thu May 02 09:56:47 2013 -0400
[
b'@@ -0,0 +1,357 @@\n+import os, os.path, random, glob, subprocess, threading, time, resource\n+from optparse import OptionParser\n+from SMART.Java.Python.misc.Progress import *\n+from SMART.Java.Python.getRandomRegions import RandomRegionsGenerator\n+from commons.core.writer.TranscriptWriter import TranscriptWriter\n+from SMART.Java.Python.structure.Transcript import Transcript\n+from commons.core.parsing.GffParser import GffParser\n+\n+#TYPES = ("bin", "has", "seg", "fj", "nc", "new")\n+TYPES = ("new", )\n+\n+class RunCmd(threading.Thread):\n+\tdef __init__(self, cmd, out, err, time, memory):\n+\t\tthreading.Thread.__init__(self)\n+\t\tself._cmd    = cmd\n+\t\tself._out    = out\n+\t\tself._err    = err\n+\t\tself._time   = time\n+\t\tself._memory = memory\n+\t\tself._id\t = os.getpid()\n+\t\tself._mem    = 0.0\n+\t\tself._outputFileName = "tmp_%d.out" % (self._id)\n+\n+\tdef run(self):\n+\t\tself._p = subprocess.Popen(self._cmd, stdout = self._out, stderr = self._err, shell = True)\n+\t\t#self._p.wait()\n+\n+\tdef _runShellCommand(self, command):\n+\t\tp = subprocess.call("%s > %s" % (command, self._outputFileName), shell=True)\n+\t\thandle = open(self._outputFileName)\n+\t\tdata   = [line.split() for line in handle.readlines()[1:] if line]\n+\t\thandle.close()\n+\t\tos.remove(self._outputFileName)\n+\t\treturn data\n+\n+\tdef _getPid(self):\n+\t\tself._pid\t  = None\n+\t\tcpt           = 1\n+\t\twhile True:\n+\t\t\tcommandsFound = []\n+\t\t\tfor line in self._runShellCommand("ps -o pid,cmd"):\n+\t\t\t\tif line[1:] == self._cmd.split(" "):\n+\t\t\t\t\tself._pid = int(line[0])\n+\t\t\t\tcommandsFound.append(" ".join(line[1:]))\n+\t\t\tif self._pid != None:\n+\t\t\t\treturn True\n+\t\t\ttime.sleep(1)\n+\t\t\tif cpt % 100 == 0:\n+\t\t\t\tprint "pid of \'%s\' not found after %d seconds. Found: %s" % (self._cmd, cpt, " --- ".join(commandsFound))\n+\t\t\tcpt += 1\n+\t\t\tif cpt > 300:\n+\t\t\t\treturn False\n+\n+\tdef _fetchMemory(self):\n+\t\tlines = self._runShellCommand("ps u -p %d" % (self._pid))\n+\t\tfor line in lines:\n+\t\t\tself._mem = max(self._mem, float(line[3]))\n+\t\t\treturn self._mem >= self._memory\n+\t\t#print "Cannot find the memory of the current PID (%d) in: %s" % (self._pid, " --- ".join([" ".join(line) for line in lines]))\n+\t\treturn False\n+\t\n+\tdef getMemory(self):\n+\t\treturn self._mem\n+\n+\tdef _abort(self):\n+\t\ttry:\n+\t\t\tself._p.terminate()\n+\t\texcept Exception:\n+\t\t\tpass\n+\t\tself._killSubThreads()\n+\t\n+\tdef _killSubThreads(self):\n+\t\tfor line in self._runShellCommand("ps --ppid %d -o pid" % (self._pid)):\n+\t\t\tself._runShellCommand("kill %s" % (line[0]))\n+\t\tself._runShellCommand("kill %s" % (self._pid))\n+\n+\tdef go(self):\n+\t\tstartTime = time.time()\n+\t\tself.run()\n+\t\t#self.start()\n+\t\twhile not self._getPid():\n+\t\t\t#self.start()\n+\t\t\tself.run()\n+\t\twhile True:\n+\t\t\tif self._time != None and time.time() - startTime > self._time:\n+\t\t\t\tprint "\\nCommand \'%s\' did not finish in time. Aborting it." % (self._cmd)\n+\t\t\t\tself._abort()\n+\t\t\t\tbreak\n+\t\t\tif self._memory != None and self._fetchMemory():\n+\t\t\t\tprint "\\nCommand \'%s\' required too much memory (%f). Aborting it." % (self._cmd, self._mem)\n+\t\t\t\tself._abort()\n+\t\t\t\tbreak\n+\t\t\t#self.join(0.1)\n+\t\t\ttime.sleep(0.1)\n+\t\t\t#if not self.isAlive():\n+\t\t\tif self._p.poll() != None:\n+\t\t\t\treturn True\n+\t\treturn False\n+\n+\n+class DataStructure(object):\n+\tdef __init__(self):\n+\t\tself._structure = {}\n+\n+\tdef addData(self, data):\n+\t\tif data._nbRefs not in self._structure:\n+\t\t\tself._structure[data._nbRefs] = {}\n+\t\tif data._nbQueries not in self._structure[data._nbRefs]:\n+\t\t\tself._structure[data._nbRefs][data._nbQueries] = {}\n+\t\tif data._genomeSize not in self._structure[data._nbRefs][data._nbQueries]:\n+\t\t\tself._structure[data._nbRefs][data._nbQueries][data._genomeSize] = {}\n+\t\tif data._type not in self._structure[data._nbRefs][data._nbQueries][data._genomeSize]:\n+\t\t\tself._structure[data._nbRefs][data._nbQueries][data._genomeSize][data._type] = []\n+\t\tself._structure[data._nbRefs][data._nbQueries][data._genomeSize][data._type].append(data._group)\n+\n+\tdef export(self):\n+\t\toutputString = "#refs\\t#queries\\tgenome size\\ttype\\t# written\\t# overlaps\\tbuild t.\\trun t.\\tmem\\n"\n+\t\tf'..b' nbReferences, nbQueries, "NA", "NA", genomeSize)\n+\t\t\t\t\t\t\telse:\n+\t\t\t\t\t\t\t\tdata[type] = self._parseTrace(type, fileName, genomeSize)\n+\t\t\t\t\t\t\t\tself._structure.addData(data[type])\n+\t\t\t\t\t\t\t\tos.remove(fileName)\n+\t\t\t\t\t\t\tself._cleanTmpFiles()\n+\t\t\t\t\t\tself._cleanTmpFiles(True)\n+\t\t\t\t\t\tfirstType = TYPES[0]\n+\t\t\t\t\t\tfor type in TYPES[1:]:\n+\t\t\t\t\t\t\tif not data[firstType].checkConsistency(data[type]):\n+\t\t\t\t\t\t\t\traise Exception("Outputs are not consistent.\\n  # outputs: %d vs %d.\\n  # overlaps: %d vs %d.\\n  %s: %f + %f; %s: %f + %f.\\n  Files are %s and %s." % (data[firstType]._group._nbOutputs, data[type]._group._nbOutputs, data[firstType]._group._nbOverlaps, data[type]._group._nbOverlaps, firstType, data[firstType]._group._buildTime, data[firstType]._group._runTime, data[firstType]._group._mem, type, data[type]._group._buildTime, data[type]._group._runTime, data[type]._group._mem, refFileName, queryFileName))\n+\t\t\t\t\t\tfor fileName in (queryFileName, refFileName):\n+\t\t\t\t\t\t\tif os.path.exists(fileName):\n+\t\t\t\t\t\t\t\tos.remove(fileName)\n+\t\t\t\t\t\tprogress.inc()\n+\t\tprogress.done()\n+\t\thandle = open(self._outputFileName, "w")\n+\t\thandle.write(self._structure.export())\n+\t\thandle.close()\n+\n+\n+\n+if __name__ == "__main__":\n+\t\n+\tdescription = "Benchmark v1.0.2: Compare NC-List with other tools. Only work under Linux. [Category: Other]"\n+\tparser = OptionParser(description = description)\n+\tparser.add_option("-r", "--nbReferences", dest="nbReferences",   action="store", default=None,   type="string", help="number of references (list of integers separated by commas) [compulsory] [format: string]")\n+\tparser.add_option("-q", "--nbQueries",    dest="nbQueries",\t\t action="store", default=None,   type="string", help="number of queries as a factor of the number of references (list of floats separated by commas) [compulsory] [format: string]")\n+\tparser.add_option("-R", "--nbReplicates", dest="nbReplicates",   action="store", default=None,   type="int",\thelp="number of replicates [compulsory] [format: int]")\n+\tparser.add_option("-s", "--genomeSizes",  dest="genomeSizes",    action="store", default=None,   type="string", help="genome size as a factor of the number of references (list of floats separated by commas) [compulsory] [format: string]")\n+\tparser.add_option("-c", "--chromosome",   dest="chromosome",\t action="store", default="chr1", type="string", help="name of the chromosome [default: chr1] [format: string]")\n+\tparser.add_option("-z", "--minSize",      dest="minSize",        action="store", default=None,   type="int",\thelp="minimum size of the reads [compulsory] [format: int]")\n+\tparser.add_option("-Z", "--maxSize",      dest="maxSize",        action="store", default=None,   type="int",\thelp="maximum size of the reads [compulsory] [format: int]")\n+\tparser.add_option("-o", "--output",       dest="outputFileName", action="store",\t\t\t\t type="string", help="output file [compulsory] [format: output file in TXT format]")\n+\tparser.add_option("-t", "--time",         dest="time",           action="store", default=None,   type="int",\thelp="maximum time to wait (in seconds) [default: None] [format: int]")\n+\tparser.add_option("-m", "--memory",\t      dest="memory",\t\t action="store", default=None,   type="float",\thelp="maximum memory usage (in %) [default: None] [format: float]")\n+\tparser.add_option("-v", "--verbosity",    dest="verbosity",      action="store", default=1,\t     type="int",\thelp="trace level [format: int]")\n+\t(options, args) = parser.parse_args()\n+\n+\tbenchmark = Benchmark(options.verbosity)\n+\tbenchmark.setNbReferences(map(int, options.nbReferences.split(",")))\n+\tbenchmark.setNbQueries(map(float, options.nbQueries.split(",")))\n+\tbenchmark.setGenomeSizes(map(float, options.genomeSizes.split(",")))\n+\tbenchmark.setNbReplicates(options.nbReplicates)\n+\tbenchmark.setChromosomeName(options.chromosome)\n+\tbenchmark.setSizes(options.minSize, options.maxSize)\n+\tbenchmark.setLimits(options.time, options.memory)\n+\tbenchmark.setOutputFileName(options.outputFileName)\n+\tbenchmark.run()\n+\n'
b
diff -r d22fadc825e3 -r 2c0c0a89fad7 SMART/Java/Python/ncList/ConvertToNCList.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/SMART/Java/Python/ncList/ConvertToNCList.py Thu May 02 09:56:47 2013 -0400
[
@@ -0,0 +1,172 @@
+#! /usr/bin/env python
+#
+# Copyright INRA-URGI 2009-2012
+# 
+# This software is governed by the CeCILL license under French law and
+# abiding by the rules of distribution of free software. You can use,
+# modify and/ or redistribute the software under the terms of the CeCILL
+# license as circulated by CEA, CNRS and INRIA at the following URL
+# "http://www.cecill.info".
+# 
+# As a counterpart to the access to the source code and rights to copy,
+# modify and redistribute granted by the license, users are provided only
+# with a limited warranty and the software's author, the holder of the
+# economic rights, and the successive licensors have only limited
+# liability.
+# 
+# In this respect, the user's attention is drawn to the risks associated
+# with loading, using, modifying and/or developing or reproducing the
+# software by the user in light of its specific status of free software,
+# that may mean that it is complicated to manipulate, and that also
+# therefore means that it is reserved for developers and experienced
+# professionals having in-depth computer knowledge. Users are therefore
+# encouraged to load and test the software's suitability as regards their
+# requirements in conditions enabling the security of their systems and/or
+# data to be ensured and, more generally, to use and operate it in the
+# same conditions as regards security.
+# 
+# The fact that you are presently reading this means that you have had
+# knowledge of the CeCILL license and that you accept its terms.
+#
+
+import random, os, time, shutil
+from optparse import OptionParser
+from commons.core.parsing.ParserChooser import ParserChooser
+from SMART.Java.Python.structure.Transcript import Transcript
+from SMART.Java.Python.structure.Interval import Interval
+from SMART.Java.Python.ncList.NCList import NCList
+from SMART.Java.Python.ncList.NCListCursor import NCListCursor
+from SMART.Java.Python.ncList.NCListFilePickle import NCListFilePickle, NCListFileUnpickle
+from SMART.Java.Python.ncList.FileSorter import FileSorter
+from SMART.Java.Python.ncList.NCListMerger import NCListMerger
+from SMART.Java.Python.misc.Progress import Progress
+from SMART.Java.Python.misc.UnlimitedProgress import UnlimitedProgress
+try:
+   import cPickle as pickle
+except:
+   import pickle
+
+class ConvertToNCList(object):
+
+ def __init__(self, verbosity = 1):
+ self._parsers   = {}
+ self._sortedFileNames   = {}
+ self._inputFileName       = None
+ self._outputFileName   = None
+ self._index       = False
+ self._ncLists   = {}
+ self._splittedFileNames       = {}
+ self._nbElements   = 0
+ self._nbElementsPerChromosome = {}
+ self._randomNumber   = random.randint(0, 10000)
+ self._sorted                  = False
+ self._verbosity       = verbosity
+
+ def setInputFileName(self, fileName, format):
+ self._inputFileName = fileName
+ chooser = ParserChooser(self._verbosity)
+ chooser.findFormat(format)
+ self._parser = chooser.getParser(fileName)
+
+ def setOutputFileName(self, fileName):
+ self._outputFileName = fileName
+ fileNameNoExtension  = os.path.splitext(fileName)[0]
+ baseName  = "%s_%d" % (fileNameNoExtension, self._randomNumber)
+ self._directory      = "%s_files" % (baseName)
+ if not os.path.exists(self._directory):
+ os.makedirs(self._directory)
+ self._sortedFileNames = os.path.join(self._directory, baseName)
+
+ def setIndex(self, boolean):
+ self._index = boolean
+
+ def setSorted(self, boolean):
+ self._sorted = boolean
+
+ def sortFile(self):
+ if self._verbosity > 2:
+ print "%s file %s..." % ("Rewriting" if self._sorted else "Sorting", self._inputFileName)
+ startTime = time.time()
+ fs = FileSorter(self._parser, self._verbosity-4)
+ fs.setPresorted(self._sorted)
+ fs.perChromosome(True)
+ fs.setOutputFileName(self._sortedFileNames)
+ fs.sort()
+ self._splittedFileNames       = fs.getOutputFileNames()
+ self._nbElementsPerChromosome = fs.getNbElementsPerChromosome()
+ self._nbElements   = fs.getNbElements()
+ endTime = time.time()
+ if self._verbosity > 2:
+ print " ...done (%ds)" % (endTime - startTime)
+
+ def createNCLists(self):
+ self._ncLists = {}
+ if self._verbosity > 2:
+ print "Creating NC-list for %s..." % (self._inputFileName)
+ startTime = time.time()
+ for chromosome, fileName in self._splittedFileNames.iteritems():
+ if self._verbosity > 3:
+ print "  chromosome %s" % (chromosome)
+ ncList = NCList(self._verbosity)
+ if self._index:
+ ncList.createIndex(True)
+ ncList.setChromosome(chromosome)
+ ncList.setFileName(fileName)
+ ncList.setNbElements(self._nbElementsPerChromosome[chromosome])
+ ncList.buildLists()
+ self._ncLists[chromosome] = ncList
+ endTime = time.time()
+ if self._verbosity > 2:
+ print " ...done (%ds)" % (endTime - startTime)
+
+ def writeOutputFile(self):
+ merger = NCListMerger(self._verbosity)
+ merger.setFileName(self._outputFileName)
+ merger.addIndex(self._index)
+ merger.setNCLists(self._ncLists)
+ merger.merge()
+
+ def cleanFiles(self):
+ shutil.rmtree(self._directory)
+
+ def run(self):
+ self.sortFile()
+ self.createNCLists()
+ self.writeOutputFile()
+ self.cleanFiles()
+
+ def getSortedFileNames(self):
+ return self._splittedFileNames
+
+ def getNbElements(self):
+ return self._nbElements
+
+ def getNbElementsPerChromosome(self):
+ return self._nbElementsPerChromosome
+
+ def getNCLists(self):
+ return self._ncLists
+
+ def getTmpDirectory(self):
+ return self._directory
+
+
+if __name__ == "__main__":
+ description = "Convert To NC-List v1.0.0: Convert a mapping or transcript file into a NC-List. [Category: NC-List]"
+
+ parser = OptionParser(description = description)
+ parser.add_option("-i", "--input",    dest="inputFileName",  action="store",   type="string",  help="Query input file [compulsory] [format: file in transcript format given by -f]")
+ parser.add_option("-f", "--format",    dest="format",   action="store",   type="string",  help="format of previous file [compulsory] [format: transcript file format]")
+ parser.add_option("-d", "--index",    dest="index",   action="store_true", default=False,   help="create an index [default: false] [format: boolean]")
+ parser.add_option("-o", "--output",    dest="outputFileName", action="store",   type="string",  help="Output file [compulsory] [format: output file in NCList format]")
+ parser.add_option("-s", "--sorted",    dest="sorted",       action="store_true", default=False,               help="input file is already sorted [format: boolean] [default: False]")
+ parser.add_option("-v", "--verbosity", dest="verbosity",   action="store",    default=1,   type="int",   help="Trace level [format: int] [default: 1]")
+ (options, args) = parser.parse_args()
+
+ ctncl = ConvertToNCList(options.verbosity)
+ ctncl.setInputFileName(options.inputFileName, options.format)
+ ctncl.setOutputFileName(options.outputFileName)
+ ctncl.setIndex(options.index)
+ ctncl.setSorted(options.sorted)
+ ctncl.run()
+
b
diff -r d22fadc825e3 -r 2c0c0a89fad7 SMART/Java/Python/ncList/FileSorter.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/SMART/Java/Python/ncList/FileSorter.py Thu May 02 09:56:47 2013 -0400
[
@@ -0,0 +1,210 @@
+#! /usr/bin/env python
+#
+# Copyright INRA-URGI 2009-2010
+# 
+# This software is governed by the CeCILL license under French law and
+# abiding by the rules of distribution of free software. You can use,
+# modify and/ or redistribute the software under the terms of the CeCILL
+# license as circulated by CEA, CNRS and INRIA at the following URL
+# "http://www.cecill.info".
+# 
+# As a counterpart to the access to the source code and rights to copy,
+# modify and redistribute granted by the license, users are provided only
+# with a limited warranty and the software's author, the holder of the
+# economic rights, and the successive licensors have only limited
+# liability.
+# 
+# In this respect, the user's attention is drawn to the risks associated
+# with loading, using, modifying and/or developing or reproducing the
+# software by the user in light of its specific status of free software,
+# that may mean that it is complicated to manipulate, and that also
+# therefore means that it is reserved for developers and experienced
+# professionals having in-depth computer knowledge. Users are therefore
+# encouraged to load and test the software's suitability as regards their
+# requirements in conditions enabling the security of their systems and/or
+# data to be ensured and, more generally, to use and operate it in the
+# same conditions as regards security.
+# 
+# The fact that you are presently reading this means that you have had
+# knowledge of the CeCILL license and that you accept its terms.
+#
+
+try:
+ import cPickle as pickle
+except:
+ import pickle
+import random, os
+from heapq import heapify, heappop, heappush
+from itertools import islice, cycle
+from SMART.Java.Python.structure.Transcript import Transcript
+from SMART.Java.Python.misc.Progress import Progress
+from SMART.Java.Python.misc.UnlimitedProgress import UnlimitedProgress
+
+BUFFER_SIZE = 100 * 1024
+
+class FileSorter(object):
+
+ def __init__(self, parser, verbosity = 1):
+ self._parser   = parser
+ self._verbosity       = verbosity
+ self._chunks   = {}
+ self._nbElements   = 0
+ self._nbElementsPerChromosome = {}
+ self._perChromosome       = False
+ self._isPreSorted             = False
+ self._outputFileNames   = {}
+ self._prefix   = "tmpFile_%d" % (random.randint(0, 100000))
+ self._chromosome   = None
+ if "SMARTTMPPATH" in os.environ:
+ self._prefix = os.path.join(os.environ["SMARTTMPPATH"], self._prefix)
+
+ def selectChromosome(self, chromosome):
+ self._chromosome = chromosome
+
+ def perChromosome(self, boolean):
+ self._perChromosome = boolean
+
+ def setOutputFileName(self, fileName):
+ self._outputFileName = fileName
+ if self._perChromosome:
+ self._outputFileName = os.path.splitext(self._outputFileName)[0]
+
+ def setPresorted(self, presorted):
+ self._isPreSorted = presorted
+
+ def sort(self):
+ if not self._isPreSorted:
+ self._batchSort()
+ else:
+ self._presorted()
+
+ def _presorted(self):
+ progress = UnlimitedProgress(1000, "Writing files %s" % (self._parser.fileName), self._verbosity)
+ curChromosome = None
+ outputHandle  = None
+
+ if not self._perChromosome:
+ outputHandle = open(self._outputFileName, "wb")
+ for transcript in self._parser.getIterator():
+ progress.inc()
+ if transcript.__class__.__name__ == "Mapping":
+ transcript = transcript.getTranscript()
+ chromosome = transcript.getChromosome()
+ if self._chromosome != None and chromosome != self._chromosome:
+ continue
+ self._nbElements += 1
+ self._nbElementsPerChromosome[chromosome] = self._nbElementsPerChromosome.get(chromosome, 0) + 1
+ if self._perChromosome:
+ if chromosome != curChromosome:
+ if outputHandle != None:
+ outputHandle.close()
+ self._outputFileNames[chromosome] = "%s_%s.pkl" % (self._outputFileName, chromosome)
+ outputHandle  = open(self._outputFileNames[chromosome], "wb")
+ curChromosome = chromosome
+ outputHandle.writelines("%s" % pickle.dumps(transcript))  
+ if outputHandle != None:
+ outputHandle.close(