From e2ebc357eea44e582b468dff4290c6c688157f3b Mon Sep 17 00:00:00 2001 From: Eric Coissac Date: Wed, 1 Jun 2011 22:42:30 +0000 Subject: [PATCH] Backup with sets and ahocorasick git-svn-id: https://www.grenoble.prabi.fr/svn/LECASofts/ecoPrimers/branches/ecoPrimers-2.1@298 60f365c0-8329-0410-b2a4-ec073aeeaa1d --- .cproject | 221 ++++ .project | 83 ++ .pydevproject | 7 + Licence_CeCILL_V2-en.txt | 506 +++++++++ Licence_CeCILL_V2-fr.txt | 512 +++++++++ VERSION | 1 + ahoc_metazoas.gv | 1389 +++++++++++++++++++++++ ecoPrimerCommands | 15 + src copy.zip | Bin 0 -> 513625 bytes src/.Rhistory | 250 +++++ src/Documents/CalculTM.xls | Bin 0 -> 35840 bytes src/Makefile | 78 ++ src/ecoPrimers | Bin 0 -> 162352 bytes src/ecoprimer.P | 32 + src/ecoprimer.c | 1019 +++++++++++++++++ src/global.mk | 21 + src/libecoPCR/Makefile | 30 + src/libecoPCR/ecoError.c | 26 + src/libecoPCR/ecoIOUtils.c | 122 ++ src/libecoPCR/ecoMalloc.c | 96 ++ src/libecoPCR/ecoPCR.h | 270 +++++ src/libecoPCR/ecoapat.c | 202 ++++ src/libecoPCR/ecodna.c | 153 +++ src/libecoPCR/ecofilter.c | 20 + src/libecoPCR/econame.c | 61 + src/libecoPCR/ecorank.c | 52 + src/libecoPCR/ecoseq.c | 233 ++++ src/libecoPCR/ecotax.c | 329 ++++++ src/libecoprimer/Makefile | 39 + src/libecoprimer/PrimerSets.c | 1770 ++++++++++++++++++++++++++++++ src/libecoprimer/PrimerSets.h | 58 + src/libecoprimer/ahocorasick.c | 479 ++++++++ src/libecoprimer/ahocorasick.h | 43 + src/libecoprimer/amplifiatree.c | 131 +++ src/libecoprimer/apat.h | 120 ++ src/libecoprimer/apat_parse.c | 65 ++ src/libecoprimer/apat_search.c | 155 +++ src/libecoprimer/aproxpattern.c | 237 ++++ src/libecoprimer/debug.h | 29 + src/libecoprimer/ecoprimer.h | 366 ++++++ src/libecoprimer/ecotype.h | 14 + src/libecoprimer/filtering.c | 188 ++++ src/libecoprimer/goodtaxon.c | 64 ++ src/libecoprimer/hashencoder.h | 21 + src/libecoprimer/hashsequence.c | 243 ++++ src/libecoprimer/libstki.c | 379 +++++++ src/libecoprimer/libstki.h | 89 ++ src/libecoprimer/mapping.c | 7 + src/libecoprimer/merge.c | 152 +++ src/libecoprimer/pairs.c | 460 ++++++++ src/libecoprimer/pairtree.c | 136 +++ src/libecoprimer/queue.c | 100 ++ src/libecoprimer/readdnadb.c | 59 + src/libecoprimer/smothsort.c | 265 +++++ src/libecoprimer/sortmatch.c | 51 + src/libecoprimer/sortword.c | 44 + src/libecoprimer/strictprimers.c | 264 +++++ src/libecoprimer/taxstats.c | 378 +++++++ src/libthermo/Makefile | 23 + src/libthermo/nnparams.c | 600 ++++++++++ src/libthermo/nnparams.h | 72 ++ src/libthermo/thermostats.c | 115 ++ src/libthermo/thermostats.h | 9 + tools/ecoPCRFormat.py | 651 +++++++++++ 64 files changed, 13604 insertions(+) create mode 100644 .cproject create mode 100644 .project create mode 100644 .pydevproject create mode 100644 Licence_CeCILL_V2-en.txt create mode 100644 Licence_CeCILL_V2-fr.txt create mode 100644 VERSION create mode 100644 ahoc_metazoas.gv create mode 100644 ecoPrimerCommands create mode 100644 src copy.zip create mode 100644 src/.Rhistory create mode 100644 src/Documents/CalculTM.xls create mode 100644 src/Makefile create mode 100755 src/ecoPrimers create mode 100644 src/ecoprimer.P create mode 100755 src/ecoprimer.c create mode 100644 src/global.mk create mode 100644 src/libecoPCR/Makefile create mode 100644 src/libecoPCR/ecoError.c create mode 100644 src/libecoPCR/ecoIOUtils.c create mode 100644 src/libecoPCR/ecoMalloc.c create mode 100644 src/libecoPCR/ecoPCR.h create mode 100644 src/libecoPCR/ecoapat.c create mode 100644 src/libecoPCR/ecodna.c create mode 100644 src/libecoPCR/ecofilter.c create mode 100644 src/libecoPCR/econame.c create mode 100644 src/libecoPCR/ecorank.c create mode 100644 src/libecoPCR/ecoseq.c create mode 100644 src/libecoPCR/ecotax.c create mode 100644 src/libecoprimer/Makefile create mode 100644 src/libecoprimer/PrimerSets.c create mode 100644 src/libecoprimer/PrimerSets.h create mode 100755 src/libecoprimer/ahocorasick.c create mode 100755 src/libecoprimer/ahocorasick.h create mode 100644 src/libecoprimer/amplifiatree.c create mode 100644 src/libecoprimer/apat.h create mode 100644 src/libecoprimer/apat_parse.c create mode 100644 src/libecoprimer/apat_search.c create mode 100644 src/libecoprimer/aproxpattern.c create mode 100644 src/libecoprimer/debug.h create mode 100755 src/libecoprimer/ecoprimer.h create mode 100644 src/libecoprimer/ecotype.h create mode 100644 src/libecoprimer/filtering.c create mode 100644 src/libecoprimer/goodtaxon.c create mode 100644 src/libecoprimer/hashencoder.h create mode 100644 src/libecoprimer/hashsequence.c create mode 100644 src/libecoprimer/libstki.c create mode 100644 src/libecoprimer/libstki.h create mode 100644 src/libecoprimer/mapping.c create mode 100644 src/libecoprimer/merge.c create mode 100644 src/libecoprimer/pairs.c create mode 100644 src/libecoprimer/pairtree.c create mode 100644 src/libecoprimer/queue.c create mode 100644 src/libecoprimer/readdnadb.c create mode 100644 src/libecoprimer/smothsort.c create mode 100644 src/libecoprimer/sortmatch.c create mode 100644 src/libecoprimer/sortword.c create mode 100644 src/libecoprimer/strictprimers.c create mode 100644 src/libecoprimer/taxstats.c create mode 100644 src/libthermo/Makefile create mode 100644 src/libthermo/nnparams.c create mode 100644 src/libthermo/nnparams.h create mode 100644 src/libthermo/thermostats.c create mode 100644 src/libthermo/thermostats.h create mode 100755 tools/ecoPCRFormat.py diff --git a/.cproject b/.cproject new file mode 100644 index 0000000..f99343a --- /dev/null +++ b/.cproject @@ -0,0 +1,221 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.project b/.project new file mode 100644 index 0000000..50a83f9 --- /dev/null +++ b/.project @@ -0,0 +1,83 @@ + + + ecoPrimers + + + + + + org.python.pydev.PyDevBuilder + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + clean,full,incremental, + + + ?name? + + + + org.eclipse.cdt.make.core.append_environment + true + + + org.eclipse.cdt.make.core.autoBuildTarget + all + + + org.eclipse.cdt.make.core.buildArguments + + + + org.eclipse.cdt.make.core.buildCommand + make + + + org.eclipse.cdt.make.core.cleanBuildTarget + clean + + + org.eclipse.cdt.make.core.contents + org.eclipse.cdt.make.core.activeConfigSettings + + + org.eclipse.cdt.make.core.enableAutoBuild + false + + + org.eclipse.cdt.make.core.enableCleanBuild + true + + + org.eclipse.cdt.make.core.enableFullBuild + true + + + org.eclipse.cdt.make.core.fullBuildTarget + all + + + org.eclipse.cdt.make.core.stopOnError + true + + + org.eclipse.cdt.make.core.useDefaultBuildCmd + true + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + + + + + + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.python.pydev.pythonNature + + diff --git a/.pydevproject b/.pydevproject new file mode 100644 index 0000000..ac30bc7 --- /dev/null +++ b/.pydevproject @@ -0,0 +1,7 @@ + + + + +Python 2.6 +python 2.6 + diff --git a/Licence_CeCILL_V2-en.txt b/Licence_CeCILL_V2-en.txt new file mode 100644 index 0000000..fcc8df2 --- /dev/null +++ b/Licence_CeCILL_V2-en.txt @@ -0,0 +1,506 @@ + +CeCILL FREE SOFTWARE LICENSE AGREEMENT + + + Notice + +This Agreement is a Free Software license agreement that is the result +of discussions between its authors in order to ensure compliance with +the two main principles guiding its drafting: + + * firstly, compliance with the principles governing the distribution + of Free Software: access to source code, broad rights granted to + users, + * secondly, the election of a governing law, French law, with which + it is conformant, both as regards the law of torts and + intellectual property law, and the protection that it offers to + both authors and holders of the economic rights over software. + +The authors of the CeCILL (for Ce[a] C[nrs] I[nria] L[ogiciel] L[ibre]) +license are: + +Commissariat à l'Energie Atomique - CEA, a public scientific, technical +and industrial research establishment, having its principal place of +business at 25 rue Leblanc, immeuble Le Ponant D, 75015 Paris, France. + +Centre National de la Recherche Scientifique - CNRS, a public scientific +and technological establishment, having its principal place of business +at 3 rue Michel-Ange, 75794 Paris cedex 16, France. + +Institut National de Recherche en Informatique et en Automatique - +INRIA, a public scientific and technological establishment, having its +principal place of business at Domaine de Voluceau, Rocquencourt, BP +105, 78153 Le Chesnay cedex, France. + + + Preamble + +The purpose of this Free Software license agreement is to grant users +the right to modify and redistribute the software governed by this +license within the framework of an open source distribution model. + +The exercising of these rights is conditional upon certain obligations +for users so as to preserve this status for all subsequent redistributions. + +In consideration of access to the source code and the 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 only have limited liability. + +In this respect, the risks associated with loading, using, modifying +and/or developing or reproducing the software by the user are brought to +the user's attention, given its Free Software status, which may make it +complicated to use, with the result that its use is reserved for +developers and experienced professionals having in-depth computer +knowledge. Users are therefore encouraged to load and test the +suitability of the software 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 of +security. This Agreement may be freely reproduced and published, +provided it is not altered, and that no provisions are either added or +removed herefrom. + +This Agreement may apply to any or all software for which the holder of +the economic rights decides to submit the use thereof to its provisions. + + + Article 1 - DEFINITIONS + +For the purpose of this Agreement, when the following expressions +commence with a capital letter, they shall have the following meaning: + +Agreement: means this license agreement, and its possible subsequent +versions and annexes. + +Software: means the software in its Object Code and/or Source Code form +and, where applicable, its documentation, "as is" when the Licensee +accepts the Agreement. + +Initial Software: means the Software in its Source Code and possibly its +Object Code form and, where applicable, its documentation, "as is" when +it is first distributed under the terms and conditions of the Agreement. + +Modified Software: means the Software modified by at least one +Contribution. + +Source Code: means all the Software's instructions and program lines to +which access is required so as to modify the Software. + +Object Code: means the binary files originating from the compilation of +the Source Code. + +Holder: means the holder(s) of the economic rights over the Initial +Software. + +Licensee: means the Software user(s) having accepted the Agreement. + +Contributor: means a Licensee having made at least one Contribution. + +Licensor: means the Holder, or any other individual or legal entity, who +distributes the Software under the Agreement. + +Contribution: means any or all modifications, corrections, translations, +adaptations and/or new functions integrated into the Software by any or +all Contributors, as well as any or all Internal Modules. + +Module: means a set of sources files including their documentation that +enables supplementary functions or services in addition to those offered +by the Software. + +External Module: means any or all Modules, not derived from the +Software, so that this Module and the Software run in separate address +spaces, with one calling the other when they are run. + +Internal Module: means any or all Module, connected to the Software so +that they both execute in the same address space. + +GNU GPL: means the GNU General Public License version 2 or any +subsequent version, as published by the Free Software Foundation Inc. + +Parties: mean both the Licensee and the Licensor. + +These expressions may be used both in singular and plural form. + + + Article 2 - PURPOSE + +The purpose of the Agreement is the grant by the Licensor to the +Licensee of a non-exclusive, transferable and worldwide license for the +Software as set forth in Article 5 hereinafter for the whole term of the +protection granted by the rights over said Software. + + + Article 3 - ACCEPTANCE + +3.1 The Licensee shall be deemed as having accepted the terms and +conditions of this Agreement upon the occurrence of the first of the +following events: + + * (i) loading the Software by any or all means, notably, by + downloading from a remote server, or by loading from a physical + medium; + * (ii) the first time the Licensee exercises any of the rights + granted hereunder. + +3.2 One copy of the Agreement, containing a notice relating to the +characteristics of the Software, to the limited warranty, and to the +fact that its use is restricted to experienced users has been provided +to the Licensee prior to its acceptance as set forth in Article 3.1 +hereinabove, and the Licensee hereby acknowledges that it has read and +understood it. + + + Article 4 - EFFECTIVE DATE AND TERM + + + 4.1 EFFECTIVE DATE + +The Agreement shall become effective on the date when it is accepted by +the Licensee as set forth in Article 3.1. + + + 4.2 TERM + +The Agreement shall remain in force for the entire legal term of +protection of the economic rights over the Software. + + + Article 5 - SCOPE OF RIGHTS GRANTED + +The Licensor hereby grants to the Licensee, who accepts, the following +rights over the Software for any or all use, and for the term of the +Agreement, on the basis of the terms and conditions set forth hereinafter. + +Besides, if the Licensor owns or comes to own one or more patents +protecting all or part of the functions of the Software or of its +components, the Licensor undertakes not to enforce the rights granted by +these patents against successive Licensees using, exploiting or +modifying the Software. If these patents are transferred, the Licensor +undertakes to have the transferees subscribe to the obligations set +forth in this paragraph. + + + 5.1 RIGHT OF USE + +The Licensee is authorized to use the Software, without any limitation +as to its fields of application, with it being hereinafter specified +that this comprises: + + 1. permanent or temporary reproduction of all or part of the Software + by any or all means and in any or all form. + + 2. loading, displaying, running, or storing the Software on any or + all medium. + + 3. entitlement to observe, study or test its operation so as to + determine the ideas and principles behind any or all constituent + elements of said Software. This shall apply when the Licensee + carries out any or all loading, displaying, running, transmission + or storage operation as regards the Software, that it is entitled + to carry out hereunder. + + + 5.2 ENTITLEMENT TO MAKE CONTRIBUTIONS + +The right to make Contributions includes the right to translate, adapt, +arrange, or make any or all modifications to the Software, and the right +to reproduce the resulting software. + +The Licensee is authorized to make any or all Contributions to the +Software provided that it includes an explicit notice that it is the +author of said Contribution and indicates the date of the creation thereof. + + + 5.3 RIGHT OF DISTRIBUTION + +In particular, the right of distribution includes the right to publish, +transmit and communicate the Software to the general public on any or +all medium, and by any or all means, and the right to market, either in +consideration of a fee, or free of charge, one or more copies of the +Software by any means. + +The Licensee is further authorized to distribute copies of the modified +or unmodified Software to third parties according to the terms and +conditions set forth hereinafter. + + + 5.3.1 DISTRIBUTION OF SOFTWARE WITHOUT MODIFICATION + +The Licensee is authorized to distribute true copies of the Software in +Source Code or Object Code form, provided that said distribution +complies with all the provisions of the Agreement and is accompanied by: + + 1. a copy of the Agreement, + + 2. a notice relating to the limitation of both the Licensor's + warranty and liability as set forth in Articles 8 and 9, + +and that, in the event that only the Object Code of the Software is +redistributed, the Licensee allows future Licensees unhindered access to +the full Source Code of the Software by indicating how to access it, it +being understood that the additional cost of acquiring the Source Code +shall not exceed the cost of transferring the data. + + + 5.3.2 DISTRIBUTION OF MODIFIED SOFTWARE + +When the Licensee makes a Contribution to the Software, the terms and +conditions for the distribution of the resulting Modified Software +become subject to all the provisions of this Agreement. + +The Licensee is authorized to distribute the Modified Software, in +source code or object code form, provided that said distribution +complies with all the provisions of the Agreement and is accompanied by: + + 1. a copy of the Agreement, + + 2. a notice relating to the limitation of both the Licensor's + warranty and liability as set forth in Articles 8 and 9, + +and that, in the event that only the object code of the Modified +Software is redistributed, the Licensee allows future Licensees +unhindered access to the full source code of the Modified Software by +indicating how to access it, it being understood that the additional +cost of acquiring the source code shall not exceed the cost of +transferring the data. + + + 5.3.3 DISTRIBUTION OF EXTERNAL MODULES + +When the Licensee has developed an External Module, the terms and +conditions of this Agreement do not apply to said External Module, that +may be distributed under a separate license agreement. + + + 5.3.4 COMPATIBILITY WITH THE GNU GPL + +The Licensee can include a code that is subject to the provisions of one +of the versions of the GNU GPL in the Modified or unmodified Software, +and distribute that entire code under the terms of the same version of +the GNU GPL. + +The Licensee can include the Modified or unmodified Software in a code +that is subject to the provisions of one of the versions of the GNU GPL, +and distribute that entire code under the terms of the same version of +the GNU GPL. + + + Article 6 - INTELLECTUAL PROPERTY + + + 6.1 OVER THE INITIAL SOFTWARE + +The Holder owns the economic rights over the Initial Software. Any or +all use of the Initial Software is subject to compliance with the terms +and conditions under which the Holder has elected to distribute its work +and no one shall be entitled to modify the terms and conditions for the +distribution of said Initial Software. + +The Holder undertakes that the Initial Software will remain ruled at +least by this Agreement, for the duration set forth in Article 4.2. + + + 6.2 OVER THE CONTRIBUTIONS + +The Licensee who develops a Contribution is the owner of the +intellectual property rights over this Contribution as defined by +applicable law. + + + 6.3 OVER THE EXTERNAL MODULES + +The Licensee who develops an External Module is the owner of the +intellectual property rights over this External Module as defined by +applicable law and is free to choose the type of agreement that shall +govern its distribution. + + + 6.4 JOINT PROVISIONS + +The Licensee expressly undertakes: + + 1. not to remove, or modify, in any manner, the intellectual property + notices attached to the Software; + + 2. to reproduce said notices, in an identical manner, in the copies + of the Software modified or not. + +The Licensee undertakes not to directly or indirectly infringe the +intellectual property rights of the Holder and/or Contributors on the +Software and to take, where applicable, vis-à-vis its staff, any and all +measures required to ensure respect of said intellectual property rights +of the Holder and/or Contributors. + + + Article 7 - RELATED SERVICES + +7.1 Under no circumstances shall the Agreement oblige the Licensor to +provide technical assistance or maintenance services for the Software. + +However, the Licensor is entitled to offer this type of services. The +terms and conditions of such technical assistance, and/or such +maintenance, shall be set forth in a separate instrument. Only the +Licensor offering said maintenance and/or technical assistance services +shall incur liability therefor. + +7.2 Similarly, any Licensor is entitled to offer to its licensees, under +its sole responsibility, a warranty, that shall only be binding upon +itself, for the redistribution of the Software and/or the Modified +Software, under terms and conditions that it is free to decide. Said +warranty, and the financial terms and conditions of its application, +shall be subject of a separate instrument executed between the Licensor +and the Licensee. + + + Article 8 - LIABILITY + +8.1 Subject to the provisions of Article 8.2, the Licensee shall be +entitled to claim compensation for any direct loss it may have suffered +from the Software as a result of a fault on the part of the relevant +Licensor, subject to providing evidence thereof. + +8.2 The Licensor's liability is limited to the commitments made under +this Agreement and shall not be incurred as a result of in particular: +(i) loss due the Licensee's total or partial failure to fulfill its +obligations, (ii) direct or consequential loss that is suffered by the +Licensee due to the use or performance of the Software, and (iii) more +generally, any consequential loss. In particular the Parties expressly +agree that any or all pecuniary or business loss (i.e. loss of data, +loss of profits, operating loss, loss of customers or orders, +opportunity cost, any disturbance to business activities) or any or all +legal proceedings instituted against the Licensee by a third party, +shall constitute consequential loss and shall not provide entitlement to +any or all compensation from the Licensor. + + + Article 9 - WARRANTY + +9.1 The Licensee acknowledges that the scientific and technical +state-of-the-art when the Software was distributed did not enable all +possible uses to be tested and verified, nor for the presence of +possible defects to be detected. In this respect, the Licensee's +attention has been drawn to the risks associated with loading, using, +modifying and/or developing and reproducing the Software which are +reserved for experienced users. + +The Licensee shall be responsible for verifying, by any or all means, +the suitability of the product for its requirements, its good working +order, and for ensuring that it shall not cause damage to either persons +or properties. + +9.2 The Licensor hereby represents, in good faith, that it is entitled +to grant all the rights over the Software (including in particular the +rights set forth in Article 5). + +9.3 The Licensee acknowledges that the Software is supplied "as is" by +the Licensor without any other express or tacit warranty, other than +that provided for in Article 9.2 and, in particular, without any warranty +as to its commercial value, its secured, safe, innovative or relevant +nature. + +Specifically, the Licensor does not warrant that the Software is free +from any error, that it will operate without interruption, that it will +be compatible with the Licensee's own equipment and software +configuration, nor that it will meet the Licensee's requirements. + +9.4 The Licensor does not either expressly or tacitly warrant that the +Software does not infringe any third party intellectual property right +relating to a patent, software or any other property right. Therefore, +the Licensor disclaims any and all liability towards the Licensee +arising out of any or all proceedings for infringement that may be +instituted in respect of the use, modification and redistribution of the +Software. Nevertheless, should such proceedings be instituted against +the Licensee, the Licensor shall provide it with technical and legal +assistance for its defense. Such technical and legal assistance shall be +decided on a case-by-case basis between the relevant Licensor and the +Licensee pursuant to a memorandum of understanding. The Licensor +disclaims any and all liability as regards the Licensee's use of the +name of the Software. No warranty is given as regards the existence of +prior rights over the name of the Software or as regards the existence +of a trademark. + + + Article 10 - TERMINATION + +10.1 In the event of a breach by the Licensee of its obligations +hereunder, the Licensor may automatically terminate this Agreement +thirty (30) days after notice has been sent to the Licensee and has +remained ineffective. + +10.2 A Licensee whose Agreement is terminated shall no longer be +authorized to use, modify or distribute the Software. However, any +licenses that it may have granted prior to termination of the Agreement +shall remain valid subject to their having been granted in compliance +with the terms and conditions hereof. + + + Article 11 - MISCELLANEOUS + + + 11.1 EXCUSABLE EVENTS + +Neither Party shall be liable for any or all delay, or failure to +perform the Agreement, that may be attributable to an event of force +majeure, an act of God or an outside cause, such as defective +functioning or interruptions of the electricity or telecommunications +networks, network paralysis following a virus attack, intervention by +government authorities, natural disasters, water damage, earthquakes, +fire, explosions, strikes and labor unrest, war, etc. + +11.2 Any failure by either Party, on one or more occasions, to invoke +one or more of the provisions hereof, shall under no circumstances be +interpreted as being a waiver by the interested Party of its right to +invoke said provision(s) subsequently. + +11.3 The Agreement cancels and replaces any or all previous agreements, +whether written or oral, between the Parties and having the same +purpose, and constitutes the entirety of the agreement between said +Parties concerning said purpose. No supplement or modification to the +terms and conditions hereof shall be effective as between the Parties +unless it is made in writing and signed by their duly authorized +representatives. + +11.4 In the event that one or more of the provisions hereof were to +conflict with a current or future applicable act or legislative text, +said act or legislative text shall prevail, and the Parties shall make +the necessary amendments so as to comply with said act or legislative +text. All other provisions shall remain effective. Similarly, invalidity +of a provision of the Agreement, for any reason whatsoever, shall not +cause the Agreement as a whole to be invalid. + + + 11.5 LANGUAGE + +The Agreement is drafted in both French and English and both versions +are deemed authentic. + + + Article 12 - NEW VERSIONS OF THE AGREEMENT + +12.1 Any person is authorized to duplicate and distribute copies of this +Agreement. + +12.2 So as to ensure coherence, the wording of this Agreement is +protected and may only be modified by the authors of the License, who +reserve the right to periodically publish updates or new versions of the +Agreement, each with a separate number. These subsequent versions may +address new issues encountered by Free Software. + +12.3 Any Software distributed under a given version of the Agreement may +only be subsequently distributed under the same version of the Agreement +or a subsequent version, subject to the provisions of Article 5.3.4. + + + Article 13 - GOVERNING LAW AND JURISDICTION + +13.1 The Agreement is governed by French law. The Parties agree to +endeavor to seek an amicable solution to any disagreements or disputes +that may arise during the performance of the Agreement. + +13.2 Failing an amicable solution within two (2) months as from their +occurrence, and unless emergency proceedings are necessary, the +disagreements or disputes shall be referred to the Paris Courts having +jurisdiction, by the more diligent Party. + + +Version 2.0 dated 2006-09-05. diff --git a/Licence_CeCILL_V2-fr.txt b/Licence_CeCILL_V2-fr.txt new file mode 100644 index 0000000..1613fca --- /dev/null +++ b/Licence_CeCILL_V2-fr.txt @@ -0,0 +1,512 @@ + +CONTRAT DE LICENCE DE LOGICIEL LIBRE CeCILL + + + Avertissement + +Ce contrat est une licence de logiciel libre issue d'une concertation +entre ses auteurs afin que le respect de deux grands principes préside à +sa rédaction: + + * d'une part, le respect des principes de diffusion des logiciels + libres: accès au code source, droits étendus conférés aux + utilisateurs, + * d'autre part, la désignation d'un droit applicable, le droit + français, auquel elle est conforme, tant au regard du droit de la + responsabilité civile que du droit de la propriété intellectuelle + et de la protection qu'il offre aux auteurs et titulaires des + droits patrimoniaux sur un logiciel. + +Les auteurs de la licence CeCILL (pour Ce[a] C[nrs] I[nria] L[ogiciel] +L[ibre]) sont: + +Commissariat à l'Energie Atomique - CEA, établissement public de +recherche à caractère scientifique, technique et industriel, dont le +siège est situé 25 rue Leblanc, immeuble Le Ponant D, 75015 Paris. + +Centre National de la Recherche Scientifique - CNRS, établissement +public à caractère scientifique et technologique, dont le siège est +situé 3 rue Michel-Ange, 75794 Paris cedex 16. + +Institut National de Recherche en Informatique et en Automatique - +INRIA, établissement public à caractère scientifique et technologique, +dont le siège est situé Domaine de Voluceau, Rocquencourt, BP 105, 78153 +Le Chesnay cedex. + + + Préambule + +Ce contrat est une licence de logiciel libre dont l'objectif est de +conférer aux utilisateurs la liberté de modification et de +redistribution du logiciel régi par cette licence dans le cadre d'un +modèle de diffusion en logiciel libre. + +L'exercice de ces libertés est assorti de certains devoirs à la charge +des utilisateurs afin de préserver ce statut au cours des +redistributions ultérieures. + +L'accessibilité au code source et les droits de copie, de modification +et de redistribution qui en découlent ont pour contrepartie de n'offrir +aux utilisateurs qu'une garantie limitée et de ne faire peser sur +l'auteur du logiciel, le titulaire des droits patrimoniaux et les +concédants successifs qu'une responsabilité restreinte. + +A cet égard l'attention de l'utilisateur est attirée sur les risques +associés au chargement, à l'utilisation, à la modification et/ou au +développement et à la reproduction du logiciel par l'utilisateur étant +donné sa spécificité de logiciel libre, qui peut le rendre complexe à +manipuler et qui le réserve donc à des développeurs ou des +professionnels avertis possédant des connaissances informatiques +approfondies. Les utilisateurs sont donc invités à charger et tester +l'adéquation du logiciel à leurs besoins dans des conditions permettant +d'assurer la sécurité de leurs systèmes et/ou de leurs données et, plus +généralement, à l'utiliser et l'exploiter dans les mêmes conditions de +sécurité. Ce contrat peut être reproduit et diffusé librement, sous +réserve de le conserver en l'état, sans ajout ni suppression de clauses. + +Ce contrat est susceptible de s'appliquer à tout logiciel dont le +titulaire des droits patrimoniaux décide de soumettre l'exploitation aux +dispositions qu'il contient. + + + Article 1 - DEFINITIONS + +Dans ce contrat, les termes suivants, lorsqu'ils seront écrits avec une +lettre capitale, auront la signification suivante: + +Contrat: désigne le présent contrat de licence, ses éventuelles versions +postérieures et annexes. + +Logiciel: désigne le logiciel sous sa forme de Code Objet et/ou de Code +Source et le cas échéant sa documentation, dans leur état au moment de +l'acceptation du Contrat par le Licencié. + +Logiciel Initial: désigne le Logiciel sous sa forme de Code Source et +éventuellement de Code Objet et le cas échéant sa documentation, dans +leur état au moment de leur première diffusion sous les termes du Contrat. + +Logiciel Modifié: désigne le Logiciel modifié par au moins une +Contribution. + +Code Source: désigne l'ensemble des instructions et des lignes de +programme du Logiciel et auquel l'accès est nécessaire en vue de +modifier le Logiciel. + +Code Objet: désigne les fichiers binaires issus de la compilation du +Code Source. + +Titulaire: désigne le ou les détenteurs des droits patrimoniaux d'auteur +sur le Logiciel Initial. + +Licencié: désigne le ou les utilisateurs du Logiciel ayant accepté le +Contrat. + +Contributeur: désigne le Licencié auteur d'au moins une Contribution. + +Concédant: désigne le Titulaire ou toute personne physique ou morale +distribuant le Logiciel sous le Contrat. + +Contribution: désigne l'ensemble des modifications, corrections, +traductions, adaptations et/ou nouvelles fonctionnalités intégrées dans +le Logiciel par tout Contributeur, ainsi que tout Module Interne. + +Module: désigne un ensemble de fichiers sources y compris leur +documentation qui permet de réaliser des fonctionnalités ou services +supplémentaires à ceux fournis par le Logiciel. + +Module Externe: désigne tout Module, non dérivé du Logiciel, tel que ce +Module et le Logiciel s'exécutent dans des espaces d'adressage +différents, l'un appelant l'autre au moment de leur exécution. + +Module Interne: désigne tout Module lié au Logiciel de telle sorte +qu'ils s'exécutent dans le même espace d'adressage. + +GNU GPL: désigne la GNU General Public License dans sa version 2 ou +toute version ultérieure, telle que publiée par Free Software Foundation +Inc. + +Parties: désigne collectivement le Licencié et le Concédant. + +Ces termes s'entendent au singulier comme au pluriel. + + + Article 2 - OBJET + +Le Contrat a pour objet la concession par le Concédant au Licencié d'une +licence non exclusive, cessible et mondiale du Logiciel telle que +définie ci-après à l'article 5 pour toute la durée de protection des droits +portant sur ce Logiciel. + + + Article 3 - ACCEPTATION + +3.1 L'acceptation par le Licencié des termes du Contrat est réputée +acquise du fait du premier des faits suivants: + + * (i) le chargement du Logiciel par tout moyen notamment par + téléchargement à partir d'un serveur distant ou par chargement à + partir d'un support physique; + * (ii) le premier exercice par le Licencié de l'un quelconque des + droits concédés par le Contrat. + +3.2 Un exemplaire du Contrat, contenant notamment un avertissement +relatif aux spécificités du Logiciel, à la restriction de garantie et à +la limitation à un usage par des utilisateurs expérimentés a été mis à +disposition du Licencié préalablement à son acceptation telle que +définie à l'article 3.1 ci dessus et le Licencié reconnaît en avoir pris +connaissance. + + + Article 4 - ENTREE EN VIGUEUR ET DUREE + + + 4.1 ENTREE EN VIGUEUR + +Le Contrat entre en vigueur à la date de son acceptation par le Licencié +telle que définie en 3.1. + + + 4.2 DUREE + +Le Contrat produira ses effets pendant toute la durée légale de +protection des droits patrimoniaux portant sur le Logiciel. + + + Article 5 - ETENDUE DES DROITS CONCEDES + +Le Concédant concède au Licencié, qui accepte, les droits suivants sur +le Logiciel pour toutes destinations et pour la durée du Contrat dans +les conditions ci-après détaillées. + +Par ailleurs, si le Concédant détient ou venait à détenir un ou +plusieurs brevets d'invention protégeant tout ou partie des +fonctionnalités du Logiciel ou de ses composants, il s'engage à ne pas +opposer les éventuels droits conférés par ces brevets aux Licenciés +successifs qui utiliseraient, exploiteraient ou modifieraient le +Logiciel. En cas de cession de ces brevets, le Concédant s'engage à +faire reprendre les obligations du présent alinéa aux cessionnaires. + + + 5.1 DROIT D'UTILISATION + +Le Licencié est autorisé à utiliser le Logiciel, sans restriction quant +aux domaines d'application, étant ci-après précisé que cela comporte: + + 1. la reproduction permanente ou provisoire du Logiciel en tout ou + partie par tout moyen et sous toute forme. + + 2. le chargement, l'affichage, l'exécution, ou le stockage du + Logiciel sur tout support. + + 3. la possibilité d'en observer, d'en étudier, ou d'en tester le + fonctionnement afin de déterminer les idées et principes qui sont + à la base de n'importe quel élément de ce Logiciel; et ceci, + lorsque le Licencié effectue toute opération de chargement, + d'affichage, d'exécution, de transmission ou de stockage du + Logiciel qu'il est en droit d'effectuer en vertu du Contrat. + + + 5.2 DROIT D'APPORTER DES CONTRIBUTIONS + +Le droit d'apporter des Contributions comporte le droit de traduire, +d'adapter, d'arranger ou d'apporter toute autre modification au Logiciel +et le droit de reproduire le logiciel en résultant. + +Le Licencié est autorisé à apporter toute Contribution au Logiciel sous +réserve de mentionner, de façon explicite, son nom en tant qu'auteur de +cette Contribution et la date de création de celle-ci. + + + 5.3 DROIT DE DISTRIBUTION + +Le droit de distribution comporte notamment le droit de diffuser, de +transmettre et de communiquer le Logiciel au public sur tout support et +par tout moyen ainsi que le droit de mettre sur le marché à titre +onéreux ou gratuit, un ou des exemplaires du Logiciel par tout procédé. + +Le Licencié est autorisé à distribuer des copies du Logiciel, modifié ou +non, à des tiers dans les conditions ci-après détaillées. + + + 5.3.1 DISTRIBUTION DU LOGICIEL SANS MODIFICATION + +Le Licencié est autorisé à distribuer des copies conformes du Logiciel, +sous forme de Code Source ou de Code Objet, à condition que cette +distribution respecte les dispositions du Contrat dans leur totalité et +soit accompagnée: + + 1. d'un exemplaire du Contrat, + + 2. d'un avertissement relatif à la restriction de garantie et de + responsabilité du Concédant telle que prévue aux articles 8 + et 9, + +et que, dans le cas où seul le Code Objet du Logiciel est redistribué, +le Licencié permette aux futurs Licenciés d'accéder facilement au Code +Source complet du Logiciel en indiquant les modalités d'accès, étant +entendu que le coût additionnel d'acquisition du Code Source ne devra +pas excéder le simple coût de transfert des données. + + + 5.3.2 DISTRIBUTION DU LOGICIEL MODIFIE + +Lorsque le Licencié apporte une Contribution au Logiciel, les conditions +de distribution du Logiciel Modifié en résultant sont alors soumises à +l'intégralité des dispositions du Contrat. + +Le Licencié est autorisé à distribuer le Logiciel Modifié, sous forme de +code source ou de code objet, à condition que cette distribution +respecte les dispositions du Contrat dans leur totalité et soit +accompagnée: + + 1. d'un exemplaire du Contrat, + + 2. d'un avertissement relatif à la restriction de garantie et de + responsabilité du Concédant telle que prévue aux articles 8 + et 9, + +et que, dans le cas où seul le code objet du Logiciel Modifié est +redistribué, le Licencié permette aux futurs Licenciés d'accéder +facilement au code source complet du Logiciel Modifié en indiquant les +modalités d'accès, étant entendu que le coût additionnel d'acquisition +du code source ne devra pas excéder le simple coût de transfert des données. + + + 5.3.3 DISTRIBUTION DES MODULES EXTERNES + +Lorsque le Licencié a développé un Module Externe les conditions du +Contrat ne s'appliquent pas à ce Module Externe, qui peut être distribué +sous un contrat de licence différent. + + + 5.3.4 COMPATIBILITE AVEC LA LICENCE GNU GPL + +Le Licencié peut inclure un code soumis aux dispositions d'une des +versions de la licence GNU GPL dans le Logiciel modifié ou non et +distribuer l'ensemble sous les conditions de la même version de la +licence GNU GPL. + +Le Licencié peut inclure le Logiciel modifié ou non dans un code soumis +aux dispositions d'une des versions de la licence GNU GPL et distribuer +l'ensemble sous les conditions de la même version de la licence GNU GPL. + + + Article 6 - PROPRIETE INTELLECTUELLE + + + 6.1 SUR LE LOGICIEL INITIAL + +Le Titulaire est détenteur des droits patrimoniaux sur le Logiciel +Initial. Toute utilisation du Logiciel Initial est soumise au respect +des conditions dans lesquelles le Titulaire a choisi de diffuser son +oeuvre et nul autre n'a la faculté de modifier les conditions de +diffusion de ce Logiciel Initial. + +Le Titulaire s'engage à ce que le Logiciel Initial reste au moins régi +par le Contrat et ce, pour la durée visée à l'article 4.2. + + + 6.2 SUR LES CONTRIBUTIONS + +Le Licencié qui a développé une Contribution est titulaire sur celle-ci +des droits de propriété intellectuelle dans les conditions définies par +la législation applicable. + + + 6.3 SUR LES MODULES EXTERNES + +Le Licencié qui a développé un Module Externe est titulaire sur celui-ci +des droits de propriété intellectuelle dans les conditions définies par +la législation applicable et reste libre du choix du contrat régissant +sa diffusion. + + + 6.4 DISPOSITIONS COMMUNES + +Le Licencié s'engage expressément: + + 1. à ne pas supprimer ou modifier de quelque manière que ce soit les + mentions de propriété intellectuelle apposées sur le Logiciel; + + 2. à reproduire à l'identique lesdites mentions de propriété + intellectuelle sur les copies du Logiciel modifié ou non. + +Le Licencié s'engage à ne pas porter atteinte, directement ou +indirectement, aux droits de propriété intellectuelle du Titulaire et/ou +des Contributeurs sur le Logiciel et à prendre, le cas échéant, à +l'égard de son personnel toutes les mesures nécessaires pour assurer le +respect des dits droits de propriété intellectuelle du Titulaire et/ou +des Contributeurs. + + + Article 7 - SERVICES ASSOCIES + +7.1 Le Contrat n'oblige en aucun cas le Concédant à la réalisation de +prestations d'assistance technique ou de maintenance du Logiciel. + +Cependant le Concédant reste libre de proposer ce type de services. Les +termes et conditions d'une telle assistance technique et/ou d'une telle +maintenance seront alors déterminés dans un acte séparé. Ces actes de +maintenance et/ou assistance technique n'engageront que la seule +responsabilité du Concédant qui les propose. + +7.2 De même, tout Concédant est libre de proposer, sous sa seule +responsabilité, à ses licenciés une garantie, qui n'engagera que lui, +lors de la redistribution du Logiciel et/ou du Logiciel Modifié et ce, +dans les conditions qu'il souhaite. Cette garantie et les modalités +financières de son application feront l'objet d'un acte séparé entre le +Concédant et le Licencié. + + + Article 8 - RESPONSABILITE + +8.1 Sous réserve des dispositions de l'article 8.2, le Licencié a la +faculté, sous réserve de prouver la faute du Concédant concerné, de +solliciter la réparation du préjudice direct qu'il subirait du fait du +Logiciel et dont il apportera la preuve. + +8.2 La responsabilité du Concédant est limitée aux engagements pris en +application du Contrat et ne saurait être engagée en raison notamment: +(i) des dommages dus à l'inexécution, totale ou partielle, de ses +obligations par le Licencié, (ii) des dommages directs ou indirects +découlant de l'utilisation ou des performances du Logiciel subis par le +Licencié et (iii) plus généralement d'un quelconque dommage indirect. En +particulier, les Parties conviennent expressément que tout préjudice +financier ou commercial (par exemple perte de données, perte de +bénéfices, perte d'exploitation, perte de clientèle ou de commandes, +manque à gagner, trouble commercial quelconque) ou toute action dirigée +contre le Licencié par un tiers, constitue un dommage indirect et +n'ouvre pas droit à réparation par le Concédant. + + + Article 9 - GARANTIE + +9.1 Le Licencié reconnaît que l'état actuel des connaissances +scientifiques et techniques au moment de la mise en circulation du +Logiciel ne permet pas d'en tester et d'en vérifier toutes les +utilisations ni de détecter l'existence d'éventuels défauts. L'attention +du Licencié a été attirée sur ce point sur les risques associés au +chargement, à l'utilisation, la modification et/ou au développement et à +la reproduction du Logiciel qui sont réservés à des utilisateurs avertis. + +Il relève de la responsabilité du Licencié de contrôler, par tous +moyens, l'adéquation du produit à ses besoins, son bon fonctionnement et +de s'assurer qu'il ne causera pas de dommages aux personnes et aux biens. + +9.2 Le Concédant déclare de bonne foi être en droit de concéder +l'ensemble des droits attachés au Logiciel (comprenant notamment les +droits visés à l'article 5). + +9.3 Le Licencié reconnaît que le Logiciel est fourni "en l'état" par le +Concédant sans autre garantie, expresse ou tacite, que celle prévue à +l'article 9.2 et notamment sans aucune garantie sur sa valeur commerciale, +son caractère sécurisé, innovant ou pertinent. + +En particulier, le Concédant ne garantit pas que le Logiciel est exempt +d'erreur, qu'il fonctionnera sans interruption, qu'il sera compatible +avec l'équipement du Licencié et sa configuration logicielle ni qu'il +remplira les besoins du Licencié. + +9.4 Le Concédant ne garantit pas, de manière expresse ou tacite, que le +Logiciel ne porte pas atteinte à un quelconque droit de propriété +intellectuelle d'un tiers portant sur un brevet, un logiciel ou sur tout +autre droit de propriété. Ainsi, le Concédant exclut toute garantie au +profit du Licencié contre les actions en contrefaçon qui pourraient être +diligentées au titre de l'utilisation, de la modification, et de la +redistribution du Logiciel. Néanmoins, si de telles actions sont +exercées contre le Licencié, le Concédant lui apportera son aide +technique et juridique pour sa défense. Cette aide technique et +juridique est déterminée au cas par cas entre le Concédant concerné et +le Licencié dans le cadre d'un protocole d'accord. Le Concédant dégage +toute responsabilité quant à l'utilisation de la dénomination du +Logiciel par le Licencié. Aucune garantie n'est apportée quant à +l'existence de droits antérieurs sur le nom du Logiciel et sur +l'existence d'une marque. + + + Article 10 - RESILIATION + +10.1 En cas de manquement par le Licencié aux obligations mises à sa +charge par le Contrat, le Concédant pourra résilier de plein droit le +Contrat trente (30) jours après notification adressée au Licencié et +restée sans effet. + +10.2 Le Licencié dont le Contrat est résilié n'est plus autorisé à +utiliser, modifier ou distribuer le Logiciel. Cependant, toutes les +licences qu'il aura concédées antérieurement à la résiliation du Contrat +resteront valides sous réserve qu'elles aient été effectuées en +conformité avec le Contrat. + + + Article 11 - DISPOSITIONS DIVERSES + + + 11.1 CAUSE EXTERIEURE + +Aucune des Parties ne sera responsable d'un retard ou d'une défaillance +d'exécution du Contrat qui serait dû à un cas de force majeure, un cas +fortuit ou une cause extérieure, telle que, notamment, le mauvais +fonctionnement ou les interruptions du réseau électrique ou de +télécommunication, la paralysie du réseau liée à une attaque +informatique, l'intervention des autorités gouvernementales, les +catastrophes naturelles, les dégâts des eaux, les tremblements de terre, +le feu, les explosions, les grèves et les conflits sociaux, l'état de +guerre... + +11.2 Le fait, par l'une ou l'autre des Parties, d'omettre en une ou +plusieurs occasions de se prévaloir d'une ou plusieurs dispositions du +Contrat, ne pourra en aucun cas impliquer renonciation par la Partie +intéressée à s'en prévaloir ultérieurement. + +11.3 Le Contrat annule et remplace toute convention antérieure, écrite +ou orale, entre les Parties sur le même objet et constitue l'accord +entier entre les Parties sur cet objet. Aucune addition ou modification +aux termes du Contrat n'aura d'effet à l'égard des Parties à moins +d'être faite par écrit et signée par leurs représentants dûment habilités. + +11.4 Dans l'hypothèse où une ou plusieurs des dispositions du Contrat +s'avèrerait contraire à une loi ou à un texte applicable, existants ou +futurs, cette loi ou ce texte prévaudrait, et les Parties feraient les +amendements nécessaires pour se conformer à cette loi ou à ce texte. +Toutes les autres dispositions resteront en vigueur. De même, la +nullité, pour quelque raison que ce soit, d'une des dispositions du +Contrat ne saurait entraîner la nullité de l'ensemble du Contrat. + + + 11.5 LANGUE + +Le Contrat est rédigé en langue française et en langue anglaise, ces +deux versions faisant également foi. + + + Article 12 - NOUVELLES VERSIONS DU CONTRAT + +12.1 Toute personne est autorisée à copier et distribuer des copies de +ce Contrat. + +12.2 Afin d'en préserver la cohérence, le texte du Contrat est protégé +et ne peut être modifié que par les auteurs de la licence, lesquels se +réservent le droit de publier périodiquement des mises à jour ou de +nouvelles versions du Contrat, qui posséderont chacune un numéro +distinct. Ces versions ultérieures seront susceptibles de prendre en +compte de nouvelles problématiques rencontrées par les logiciels libres. + +12.3 Tout Logiciel diffusé sous une version donnée du Contrat ne pourra +faire l'objet d'une diffusion ultérieure que sous la même version du +Contrat ou une version postérieure, sous réserve des dispositions de +l'article 5.3.4. + + + Article 13 - LOI APPLICABLE ET COMPETENCE TERRITORIALE + +13.1 Le Contrat est régi par la loi française. Les Parties conviennent +de tenter de régler à l'amiable les différends ou litiges qui +viendraient à se produire par suite ou à l'occasion du Contrat. + +13.2 A défaut d'accord amiable dans un délai de deux (2) mois à compter +de leur survenance et sauf situation relevant d'une procédure d'urgence, +les différends ou litiges seront portés par la Partie la plus diligente +devant les Tribunaux compétents de Paris. + + +Version 2.0 du 2006-09-05. diff --git a/VERSION b/VERSION new file mode 100644 index 0000000..d3827e7 --- /dev/null +++ b/VERSION @@ -0,0 +1 @@ +1.0 diff --git a/ahoc_metazoas.gv b/ahoc_metazoas.gv new file mode 100644 index 0000000..fdf1e81 --- /dev/null +++ b/ahoc_metazoas.gv @@ -0,0 +1,1389 @@ +graph primerlinks { + 21 -- 150 [label="116: 0.26: 0.17"]; + 21 -- 151 [label="116: 0.26: 0.17"]; + 21 -- 152 [label="117: 0.26: 0.17"]; + 21 -- 153 [label="116: 0.26: 0.17"]; + 21 -- 154 [label="116: 0.26: 0.17"]; + 21 -- 155 [label="116: 0.26: 0.17"]; + 21 -- 163 [label="107: 0.26: 0.18"]; + 21 -- 164 [label="102: 0.26: 0.17"]; + 21 -- 190 [label="74: 0.26: 0.15"]; + 32 -- 150 [label="111: 0.25: 0.17"]; + 32 -- 151 [label="111: 0.25: 0.17"]; + 32 -- 152 [label="112: 0.25: 0.17"]; + 32 -- 153 [label="111: 0.25: 0.17"]; + 32 -- 154 [label="111: 0.25: 0.17"]; + 32 -- 155 [label="111: 0.25: 0.17"]; + 32 -- 163 [label="102: 0.25: 0.18"]; + 32 -- 164 [label="97: 0.25: 0.17"]; + 32 -- 169 [label="110: 0.25: 0.19"]; + 32 -- 170 [label="110: 0.25: 0.20"]; + 32 -- 173 [label="109: 0.25: 0.20"]; + 32 -- 181 [label="103: 0.25: 0.15"]; + 32 -- 190 [label="72: 0.25: 0.15"]; + 80 -- 150 [label="118: 0.20: 0.17"]; + 80 -- 151 [label="118: 0.20: 0.17"]; + 80 -- 152 [label="119: 0.20: 0.17"]; + 80 -- 153 [label="118: 0.20: 0.17"]; + 80 -- 154 [label="118: 0.20: 0.17"]; + 80 -- 155 [label="118: 0.20: 0.17"]; + 80 -- 163 [label="105: 0.20: 0.18"]; + 80 -- 164 [label="102: 0.20: 0.17"]; + 80 -- 190 [label="74: 0.20: 0.15"]; + 88 -- 144 [label="125: 0.21: 0.21"]; + 88 -- 150 [label="104: 0.21: 0.17"]; + 88 -- 151 [label="104: 0.21: 0.17"]; + 88 -- 152 [label="105: 0.21: 0.17"]; + 88 -- 153 [label="104: 0.21: 0.17"]; + 88 -- 154 [label="104: 0.21: 0.17"]; + 88 -- 155 [label="104: 0.21: 0.17"]; + 88 -- 163 [label="93: 0.21: 0.18"]; + 88 -- 164 [label="90: 0.21: 0.17"]; + 88 -- 169 [label="96: 0.21: 0.19"]; + 88 -- 170 [label="96: 0.21: 0.20"]; + 88 -- 172 [label="98: 0.21: 0.20"]; + 88 -- 173 [label="95: 0.21: 0.20"]; + 88 -- 174 [label="98: 0.21: 0.20"]; + 88 -- 176 [label="97: 0.21: 0.19"]; + 88 -- 177 [label="96: 0.21: 0.19"]; + 88 -- 178 [label="97: 0.21: 0.19"]; + 88 -- 179 [label="95: 0.21: 0.19"]; + 88 -- 181 [label="97: 0.21: 0.15"]; + 88 -- 183 [label="96: 0.21: 0.17"]; + 88 -- 184 [label="96: 0.21: 0.17"]; + 88 -- 185 [label="96: 0.21: 0.17"]; + 88 -- 186 [label="96: 0.21: 0.17"]; + 88 -- 190 [label="67: 0.21: 0.15"]; + 88 -- 191 [label="81: 0.21: 0.15"]; + 91 -- 150 [label="116: 0.19: 0.17"]; + 91 -- 151 [label="116: 0.19: 0.17"]; + 91 -- 152 [label="117: 0.19: 0.17"]; + 91 -- 153 [label="116: 0.19: 0.17"]; + 91 -- 154 [label="116: 0.19: 0.17"]; + 91 -- 155 [label="116: 0.19: 0.17"]; + 91 -- 163 [label="101: 0.19: 0.18"]; + 91 -- 164 [label="99: 0.19: 0.17"]; + 91 -- 169 [label="110: 0.19: 0.19"]; + 91 -- 170 [label="110: 0.19: 0.20"]; + 91 -- 173 [label="109: 0.19: 0.20"]; + 91 -- 190 [label="72: 0.19: 0.15"]; + 92 -- 94 [label="147: 0.19: 0.19"]; + 92 -- 95 [label="145: 0.19: 0.19"]; + 92 -- 144 [label="124: 0.19: 0.21"]; + 92 -- 150 [label="96: 0.19: 0.17"]; + 92 -- 151 [label="96: 0.19: 0.17"]; + 92 -- 152 [label="96: 0.19: 0.17"]; + 92 -- 153 [label="96: 0.19: 0.17"]; + 92 -- 154 [label="96: 0.19: 0.17"]; + 92 -- 155 [label="95: 0.19: 0.17"]; + 92 -- 163 [label="82: 0.19: 0.18"]; + 92 -- 164 [label="79: 0.19: 0.17"]; + 92 -- 169 [label="94: 0.19: 0.19"]; + 92 -- 170 [label="94: 0.19: 0.20"]; + 92 -- 172 [label="95: 0.19: 0.20"]; + 92 -- 173 [label="93: 0.19: 0.20"]; + 92 -- 174 [label="95: 0.19: 0.20"]; + 92 -- 176 [label="94: 0.19: 0.19"]; + 92 -- 177 [label="94: 0.19: 0.19"]; + 92 -- 178 [label="94: 0.19: 0.19"]; + 92 -- 179 [label="93: 0.19: 0.19"]; + 92 -- 181 [label="89: 0.19: 0.15"]; + 92 -- 183 [label="93: 0.19: 0.17"]; + 92 -- 184 [label="94: 0.19: 0.17"]; + 92 -- 185 [label="94: 0.19: 0.17"]; + 92 -- 186 [label="94: 0.19: 0.17"]; + 92 -- 188 [label="83: 0.19: 0.15"]; + 92 -- 190 [label="59: 0.19: 0.15"]; + 92 -- 191 [label="72: 0.19: 0.15"]; + 93 -- 131 [label="126: 0.19: 0.22"]; + 93 -- 167 [label="105: 0.19: 0.20"]; + 93 -- 175 [label="102: 0.19: 0.20"]; + 93 -- 187 [label="89: 0.19: 0.15"]; + 93 -- 189 [label="86: 0.19: 0.16"]; + 94 -- 131 [label="127: 0.19: 0.22"]; + 94 -- 167 [label="106: 0.19: 0.20"]; + 94 -- 175 [label="105: 0.19: 0.20"]; + 94 -- 190 [label="86: 0.19: 0.15"]; + 95 -- 131 [label="126: 0.19: 0.22"]; + 95 -- 167 [label="106: 0.19: 0.20"]; + 95 -- 175 [label="105: 0.19: 0.20"]; + 95 -- 190 [label="87: 0.19: 0.15"]; + 96 -- 150 [label="110: 0.20: 0.17"]; + 96 -- 151 [label="110: 0.20: 0.17"]; + 96 -- 152 [label="111: 0.20: 0.17"]; + 96 -- 153 [label="110: 0.20: 0.17"]; + 96 -- 154 [label="110: 0.20: 0.17"]; + 96 -- 155 [label="110: 0.20: 0.17"]; + 96 -- 163 [label="105: 0.20: 0.18"]; + 96 -- 164 [label="101: 0.20: 0.17"]; + 96 -- 169 [label="110: 0.20: 0.19"]; + 96 -- 170 [label="110: 0.20: 0.20"]; + 96 -- 173 [label="109: 0.20: 0.20"]; + 96 -- 190 [label="68: 0.20: 0.15"]; + 97 -- 150 [label="115: 0.19: 0.17"]; + 97 -- 151 [label="115: 0.19: 0.17"]; + 97 -- 152 [label="116: 0.19: 0.17"]; + 97 -- 153 [label="115: 0.19: 0.17"]; + 97 -- 154 [label="115: 0.19: 0.17"]; + 97 -- 155 [label="115: 0.19: 0.17"]; + 97 -- 163 [label="102: 0.19: 0.18"]; + 97 -- 164 [label="100: 0.19: 0.17"]; + 97 -- 169 [label="109: 0.19: 0.19"]; + 97 -- 170 [label="109: 0.19: 0.20"]; + 97 -- 172 [label="110: 0.19: 0.20"]; + 97 -- 173 [label="108: 0.19: 0.20"]; + 97 -- 174 [label="110: 0.19: 0.20"]; + 97 -- 176 [label="109: 0.19: 0.19"]; + 97 -- 177 [label="109: 0.19: 0.19"]; + 97 -- 178 [label="109: 0.19: 0.19"]; + 97 -- 190 [label="71: 0.19: 0.15"]; + 98 -- 150 [label="114: 0.19: 0.17"]; + 98 -- 151 [label="114: 0.19: 0.17"]; + 98 -- 152 [label="115: 0.19: 0.17"]; + 98 -- 153 [label="114: 0.19: 0.17"]; + 98 -- 154 [label="114: 0.19: 0.17"]; + 98 -- 155 [label="114: 0.19: 0.17"]; + 98 -- 163 [label="101: 0.19: 0.18"]; + 98 -- 164 [label="99: 0.19: 0.17"]; + 98 -- 169 [label="109: 0.19: 0.19"]; + 98 -- 170 [label="109: 0.19: 0.20"]; + 98 -- 172 [label="110: 0.19: 0.20"]; + 98 -- 173 [label="108: 0.19: 0.20"]; + 98 -- 174 [label="110: 0.19: 0.20"]; + 98 -- 176 [label="109: 0.19: 0.19"]; + 98 -- 177 [label="109: 0.19: 0.19"]; + 98 -- 178 [label="109: 0.19: 0.19"]; + 98 -- 190 [label="70: 0.19: 0.15"]; + 99 -- 150 [label="109: 0.20: 0.17"]; + 99 -- 151 [label="109: 0.20: 0.17"]; + 99 -- 152 [label="110: 0.20: 0.17"]; + 99 -- 153 [label="109: 0.20: 0.17"]; + 99 -- 154 [label="109: 0.20: 0.17"]; + 99 -- 155 [label="109: 0.20: 0.17"]; + 99 -- 163 [label="106: 0.20: 0.18"]; + 99 -- 164 [label="102: 0.20: 0.17"]; + 99 -- 190 [label="67: 0.20: 0.15"]; + 100 -- 150 [label="118: 0.19: 0.17"]; + 100 -- 151 [label="118: 0.19: 0.17"]; + 100 -- 152 [label="119: 0.19: 0.17"]; + 100 -- 153 [label="118: 0.19: 0.17"]; + 100 -- 154 [label="118: 0.19: 0.17"]; + 100 -- 155 [label="118: 0.19: 0.17"]; + 100 -- 163 [label="109: 0.19: 0.18"]; + 100 -- 164 [label="106: 0.19: 0.17"]; + 100 -- 190 [label="74: 0.19: 0.15"]; + 101 -- 150 [label="107: 0.20: 0.17"]; + 101 -- 151 [label="107: 0.20: 0.17"]; + 101 -- 152 [label="108: 0.20: 0.17"]; + 101 -- 153 [label="107: 0.20: 0.17"]; + 101 -- 154 [label="107: 0.20: 0.17"]; + 101 -- 155 [label="107: 0.20: 0.17"]; + 101 -- 163 [label="100: 0.20: 0.18"]; + 101 -- 164 [label="97: 0.20: 0.17"]; + 101 -- 169 [label="111: 0.20: 0.19"]; + 101 -- 170 [label="111: 0.20: 0.20"]; + 101 -- 173 [label="110: 0.20: 0.20"]; + 101 -- 190 [label="65: 0.20: 0.15"]; + 102 -- 150 [label="115: 0.18: 0.17"]; + 102 -- 151 [label="115: 0.18: 0.17"]; + 102 -- 152 [label="116: 0.18: 0.17"]; + 102 -- 153 [label="115: 0.18: 0.17"]; + 102 -- 154 [label="115: 0.18: 0.17"]; + 102 -- 155 [label="115: 0.18: 0.17"]; + 102 -- 163 [label="107: 0.18: 0.18"]; + 102 -- 164 [label="104: 0.18: 0.17"]; + 102 -- 190 [label="71: 0.18: 0.15"]; + 103 -- 150 [label="107: 0.20: 0.17"]; + 103 -- 151 [label="107: 0.20: 0.17"]; + 103 -- 152 [label="108: 0.20: 0.17"]; + 103 -- 153 [label="107: 0.20: 0.17"]; + 103 -- 154 [label="107: 0.20: 0.17"]; + 103 -- 155 [label="107: 0.20: 0.17"]; + 103 -- 163 [label="102: 0.20: 0.18"]; + 103 -- 164 [label="99: 0.20: 0.17"]; + 103 -- 190 [label="65: 0.20: 0.15"]; + 104 -- 150 [label="107: 0.20: 0.17"]; + 104 -- 151 [label="107: 0.20: 0.17"]; + 104 -- 152 [label="108: 0.20: 0.17"]; + 104 -- 153 [label="107: 0.20: 0.17"]; + 104 -- 154 [label="107: 0.20: 0.17"]; + 104 -- 155 [label="107: 0.20: 0.17"]; + 104 -- 163 [label="101: 0.20: 0.18"]; + 104 -- 164 [label="98: 0.20: 0.17"]; + 104 -- 190 [label="65: 0.20: 0.15"]; + 105 -- 150 [label="108: 0.19: 0.17"]; + 105 -- 151 [label="108: 0.19: 0.17"]; + 105 -- 152 [label="109: 0.19: 0.17"]; + 105 -- 153 [label="108: 0.19: 0.17"]; + 105 -- 154 [label="108: 0.19: 0.17"]; + 105 -- 155 [label="108: 0.19: 0.17"]; + 105 -- 163 [label="102: 0.19: 0.18"]; + 105 -- 164 [label="99: 0.19: 0.17"]; + 105 -- 190 [label="66: 0.19: 0.15"]; + 106 -- 150 [label="107: 0.20: 0.17"]; + 106 -- 151 [label="107: 0.20: 0.17"]; + 106 -- 152 [label="108: 0.20: 0.17"]; + 106 -- 153 [label="107: 0.20: 0.17"]; + 106 -- 154 [label="107: 0.20: 0.17"]; + 106 -- 155 [label="107: 0.20: 0.17"]; + 106 -- 163 [label="99: 0.20: 0.18"]; + 106 -- 164 [label="96: 0.20: 0.17"]; + 106 -- 190 [label="65: 0.20: 0.15"]; + 107 -- 163 [label="115: 0.20: 0.18"]; + 107 -- 164 [label="113: 0.20: 0.17"]; + 107 -- 190 [label="84: 0.20: 0.15"]; + 108 -- 150 [label="115: 0.18: 0.17"]; + 108 -- 151 [label="115: 0.18: 0.17"]; + 108 -- 152 [label="116: 0.18: 0.17"]; + 108 -- 153 [label="115: 0.18: 0.17"]; + 108 -- 154 [label="115: 0.18: 0.17"]; + 108 -- 155 [label="115: 0.18: 0.17"]; + 108 -- 163 [label="103: 0.18: 0.18"]; + 108 -- 164 [label="100: 0.18: 0.17"]; + 108 -- 190 [label="71: 0.18: 0.15"]; + 109 -- 150 [label="106: 0.19: 0.17"]; + 109 -- 151 [label="106: 0.19: 0.17"]; + 109 -- 152 [label="107: 0.19: 0.17"]; + 109 -- 153 [label="106: 0.19: 0.17"]; + 109 -- 154 [label="106: 0.19: 0.17"]; + 109 -- 155 [label="106: 0.19: 0.17"]; + 109 -- 163 [label="99: 0.19: 0.18"]; + 109 -- 164 [label="96: 0.19: 0.17"]; + 109 -- 169 [label="111: 0.19: 0.19"]; + 109 -- 170 [label="111: 0.19: 0.20"]; + 109 -- 173 [label="110: 0.19: 0.20"]; + 109 -- 190 [label="64: 0.19: 0.15"]; + 110 -- 163 [label="113: 0.21: 0.18"]; + 110 -- 164 [label="111: 0.21: 0.17"]; + 110 -- 190 [label="86: 0.21: 0.15"]; + 111 -- 163 [label="113: 0.21: 0.18"]; + 111 -- 164 [label="111: 0.21: 0.17"]; + 111 -- 190 [label="86: 0.21: 0.15"]; + 112 -- 163 [label="113: 0.21: 0.18"]; + 112 -- 164 [label="111: 0.21: 0.17"]; + 112 -- 190 [label="86: 0.21: 0.15"]; + 113 -- 150 [label="115: 0.18: 0.17"]; + 113 -- 151 [label="115: 0.18: 0.17"]; + 113 -- 152 [label="116: 0.18: 0.17"]; + 113 -- 153 [label="115: 0.18: 0.17"]; + 113 -- 154 [label="115: 0.18: 0.17"]; + 113 -- 155 [label="115: 0.18: 0.17"]; + 113 -- 163 [label="107: 0.18: 0.18"]; + 113 -- 164 [label="104: 0.18: 0.17"]; + 113 -- 190 [label="71: 0.18: 0.15"]; + 114 -- 150 [label="107: 0.19: 0.17"]; + 114 -- 151 [label="107: 0.19: 0.17"]; + 114 -- 152 [label="108: 0.19: 0.17"]; + 114 -- 153 [label="107: 0.19: 0.17"]; + 114 -- 154 [label="107: 0.19: 0.17"]; + 114 -- 155 [label="107: 0.19: 0.17"]; + 114 -- 163 [label="100: 0.19: 0.18"]; + 114 -- 164 [label="97: 0.19: 0.17"]; + 114 -- 169 [label="111: 0.19: 0.19"]; + 114 -- 170 [label="111: 0.19: 0.20"]; + 114 -- 173 [label="110: 0.19: 0.20"]; + 114 -- 190 [label="65: 0.19: 0.15"]; + 115 -- 163 [label="113: 0.20: 0.18"]; + 115 -- 164 [label="111: 0.20: 0.17"]; + 115 -- 190 [label="84: 0.20: 0.15"]; + 116 -- 150 [label="104: 0.19: 0.17"]; + 116 -- 151 [label="104: 0.19: 0.17"]; + 116 -- 152 [label="105: 0.19: 0.17"]; + 116 -- 153 [label="104: 0.19: 0.17"]; + 116 -- 154 [label="104: 0.19: 0.17"]; + 116 -- 155 [label="104: 0.19: 0.17"]; + 116 -- 163 [label="96: 0.19: 0.18"]; + 116 -- 164 [label="94: 0.19: 0.17"]; + 116 -- 169 [label="106: 0.19: 0.19"]; + 116 -- 170 [label="106: 0.19: 0.20"]; + 116 -- 172 [label="107: 0.19: 0.20"]; + 116 -- 173 [label="105: 0.19: 0.20"]; + 116 -- 174 [label="107: 0.19: 0.20"]; + 116 -- 176 [label="106: 0.19: 0.19"]; + 116 -- 177 [label="106: 0.19: 0.19"]; + 116 -- 178 [label="106: 0.19: 0.19"]; + 116 -- 179 [label="105: 0.19: 0.19"]; + 116 -- 190 [label="62: 0.19: 0.15"]; + 117 -- 150 [label="115: 0.18: 0.17"]; + 117 -- 151 [label="115: 0.18: 0.17"]; + 117 -- 152 [label="116: 0.18: 0.17"]; + 117 -- 153 [label="115: 0.18: 0.17"]; + 117 -- 154 [label="115: 0.18: 0.17"]; + 117 -- 155 [label="115: 0.18: 0.17"]; + 117 -- 163 [label="102: 0.18: 0.18"]; + 117 -- 164 [label="100: 0.18: 0.17"]; + 117 -- 169 [label="108: 0.18: 0.19"]; + 117 -- 170 [label="108: 0.18: 0.20"]; + 117 -- 172 [label="109: 0.18: 0.20"]; + 117 -- 173 [label="107: 0.18: 0.20"]; + 117 -- 174 [label="109: 0.18: 0.20"]; + 117 -- 176 [label="108: 0.18: 0.19"]; + 117 -- 177 [label="108: 0.18: 0.19"]; + 117 -- 178 [label="108: 0.18: 0.19"]; + 117 -- 179 [label="107: 0.18: 0.19"]; + 117 -- 190 [label="71: 0.18: 0.15"]; + 118 -- 150 [label="107: 0.17: 0.17"]; + 118 -- 151 [label="107: 0.17: 0.17"]; + 118 -- 152 [label="108: 0.17: 0.17"]; + 118 -- 153 [label="107: 0.17: 0.17"]; + 118 -- 154 [label="107: 0.17: 0.17"]; + 118 -- 155 [label="107: 0.17: 0.17"]; + 118 -- 163 [label="95: 0.17: 0.18"]; + 118 -- 164 [label="93: 0.17: 0.17"]; + 118 -- 169 [label="102: 0.17: 0.19"]; + 118 -- 170 [label="102: 0.17: 0.20"]; + 118 -- 172 [label="103: 0.17: 0.20"]; + 118 -- 173 [label="101: 0.17: 0.20"]; + 118 -- 174 [label="103: 0.17: 0.20"]; + 118 -- 176 [label="102: 0.17: 0.19"]; + 118 -- 177 [label="102: 0.17: 0.19"]; + 118 -- 178 [label="102: 0.17: 0.19"]; + 118 -- 179 [label="101: 0.17: 0.19"]; + 118 -- 190 [label="66: 0.17: 0.15"]; + 119 -- 131 [label="129: 0.20: 0.22"]; + 119 -- 163 [label="113: 0.20: 0.18"]; + 119 -- 164 [label="111: 0.20: 0.17"]; + 119 -- 167 [label="112: 0.20: 0.20"]; + 119 -- 190 [label="84: 0.20: 0.15"]; + 120 -- 131 [label="123: 0.19: 0.22"]; + 120 -- 150 [label="122: 0.19: 0.17"]; + 120 -- 151 [label="122: 0.19: 0.17"]; + 120 -- 152 [label="122: 0.19: 0.17"]; + 120 -- 153 [label="122: 0.19: 0.17"]; + 120 -- 154 [label="122: 0.19: 0.17"]; + 120 -- 155 [label="122: 0.19: 0.17"]; + 120 -- 167 [label="102: 0.19: 0.20"]; + 120 -- 175 [label="101: 0.19: 0.20"]; + 120 -- 190 [label="76: 0.19: 0.15"]; + 121 -- 131 [label="127: 0.17: 0.22"]; + 121 -- 144 [label="116: 0.17: 0.21"]; + 121 -- 150 [label="92: 0.17: 0.17"]; + 121 -- 151 [label="92: 0.17: 0.17"]; + 121 -- 152 [label="92: 0.17: 0.17"]; + 121 -- 153 [label="92: 0.17: 0.17"]; + 121 -- 154 [label="92: 0.17: 0.17"]; + 121 -- 155 [label="91: 0.17: 0.17"]; + 121 -- 163 [label="78: 0.17: 0.18"]; + 121 -- 164 [label="75: 0.17: 0.17"]; + 121 -- 169 [label="85: 0.17: 0.19"]; + 121 -- 170 [label="85: 0.17: 0.20"]; + 121 -- 172 [label="87: 0.17: 0.20"]; + 121 -- 173 [label="84: 0.17: 0.20"]; + 121 -- 174 [label="87: 0.17: 0.20"]; + 121 -- 176 [label="86: 0.17: 0.19"]; + 121 -- 177 [label="86: 0.17: 0.19"]; + 121 -- 178 [label="86: 0.17: 0.19"]; + 121 -- 179 [label="85: 0.17: 0.19"]; + 121 -- 181 [label="85: 0.17: 0.15"]; + 121 -- 183 [label="84: 0.17: 0.17"]; + 121 -- 184 [label="85: 0.17: 0.17"]; + 121 -- 185 [label="85: 0.17: 0.17"]; + 121 -- 186 [label="86: 0.17: 0.17"]; + 121 -- 188 [label="79: 0.17: 0.15"]; + 121 -- 190 [label="57: 0.17: 0.15"]; + 121 -- 191 [label="66: 0.17: 0.15"]; + 122 -- 150 [label="105: 0.19: 0.17"]; + 122 -- 151 [label="105: 0.19: 0.17"]; + 122 -- 152 [label="106: 0.19: 0.17"]; + 122 -- 153 [label="105: 0.19: 0.17"]; + 122 -- 154 [label="105: 0.19: 0.17"]; + 122 -- 155 [label="105: 0.19: 0.17"]; + 122 -- 163 [label="97: 0.19: 0.18"]; + 122 -- 164 [label="95: 0.19: 0.17"]; + 122 -- 169 [label="107: 0.19: 0.19"]; + 122 -- 170 [label="107: 0.19: 0.20"]; + 122 -- 172 [label="108: 0.19: 0.20"]; + 122 -- 173 [label="106: 0.19: 0.20"]; + 122 -- 174 [label="108: 0.19: 0.20"]; + 122 -- 176 [label="107: 0.19: 0.19"]; + 122 -- 177 [label="107: 0.19: 0.19"]; + 122 -- 178 [label="107: 0.19: 0.19"]; + 122 -- 179 [label="106: 0.19: 0.19"]; + 122 -- 190 [label="63: 0.19: 0.15"]; + 123 -- 150 [label="105: 0.19: 0.17"]; + 123 -- 151 [label="105: 0.19: 0.17"]; + 123 -- 152 [label="106: 0.19: 0.17"]; + 123 -- 153 [label="105: 0.19: 0.17"]; + 123 -- 154 [label="105: 0.19: 0.17"]; + 123 -- 155 [label="105: 0.19: 0.17"]; + 123 -- 163 [label="97: 0.19: 0.18"]; + 123 -- 164 [label="95: 0.19: 0.17"]; + 123 -- 169 [label="107: 0.19: 0.19"]; + 123 -- 170 [label="107: 0.19: 0.20"]; + 123 -- 172 [label="108: 0.19: 0.20"]; + 123 -- 173 [label="106: 0.19: 0.20"]; + 123 -- 174 [label="108: 0.19: 0.20"]; + 123 -- 176 [label="107: 0.19: 0.19"]; + 123 -- 177 [label="107: 0.19: 0.19"]; + 123 -- 178 [label="107: 0.19: 0.19"]; + 123 -- 179 [label="106: 0.19: 0.19"]; + 123 -- 190 [label="63: 0.19: 0.15"]; + 124 -- 150 [label="106: 0.19: 0.17"]; + 124 -- 151 [label="106: 0.19: 0.17"]; + 124 -- 152 [label="107: 0.19: 0.17"]; + 124 -- 153 [label="106: 0.19: 0.17"]; + 124 -- 154 [label="106: 0.19: 0.17"]; + 124 -- 155 [label="106: 0.19: 0.17"]; + 124 -- 163 [label="102: 0.19: 0.18"]; + 124 -- 164 [label="99: 0.19: 0.17"]; + 124 -- 169 [label="110: 0.19: 0.19"]; + 124 -- 170 [label="110: 0.19: 0.20"]; + 124 -- 173 [label="109: 0.19: 0.20"]; + 124 -- 177 [label="109: 0.19: 0.19"]; + 124 -- 181 [label="104: 0.19: 0.15"]; + 124 -- 190 [label="64: 0.19: 0.15"]; + 125 -- 150 [label="117: 0.16: 0.17"]; + 125 -- 151 [label="117: 0.16: 0.17"]; + 125 -- 152 [label="117: 0.16: 0.17"]; + 125 -- 153 [label="117: 0.16: 0.17"]; + 125 -- 154 [label="117: 0.16: 0.17"]; + 125 -- 155 [label="116: 0.16: 0.17"]; + 125 -- 163 [label="109: 0.16: 0.18"]; + 125 -- 164 [label="106: 0.16: 0.17"]; + 125 -- 169 [label="102: 0.16: 0.19"]; + 125 -- 170 [label="102: 0.16: 0.20"]; + 125 -- 172 [label="104: 0.16: 0.20"]; + 125 -- 173 [label="101: 0.16: 0.20"]; + 125 -- 174 [label="104: 0.16: 0.20"]; + 125 -- 176 [label="103: 0.16: 0.19"]; + 125 -- 177 [label="103: 0.16: 0.19"]; + 125 -- 178 [label="103: 0.16: 0.19"]; + 125 -- 179 [label="102: 0.16: 0.19"]; + 125 -- 183 [label="100: 0.16: 0.17"]; + 125 -- 190 [label="77: 0.16: 0.15"]; + 125 -- 191 [label="80: 0.16: 0.15"]; + 126 -- 150 [label="116: 0.16: 0.17"]; + 126 -- 151 [label="116: 0.16: 0.17"]; + 126 -- 152 [label="116: 0.16: 0.17"]; + 126 -- 153 [label="116: 0.16: 0.17"]; + 126 -- 154 [label="116: 0.16: 0.17"]; + 126 -- 155 [label="115: 0.16: 0.17"]; + 126 -- 163 [label="108: 0.16: 0.18"]; + 126 -- 164 [label="105: 0.16: 0.17"]; + 126 -- 169 [label="100: 0.16: 0.19"]; + 126 -- 170 [label="100: 0.16: 0.20"]; + 126 -- 172 [label="102: 0.16: 0.20"]; + 126 -- 173 [label="99: 0.16: 0.20"]; + 126 -- 174 [label="102: 0.16: 0.20"]; + 126 -- 176 [label="101: 0.16: 0.19"]; + 126 -- 177 [label="101: 0.16: 0.19"]; + 126 -- 178 [label="101: 0.16: 0.19"]; + 126 -- 179 [label="100: 0.16: 0.19"]; + 126 -- 181 [label="106: 0.16: 0.15"]; + 126 -- 183 [label="98: 0.16: 0.17"]; + 126 -- 184 [label="99: 0.16: 0.17"]; + 126 -- 185 [label="99: 0.16: 0.17"]; + 126 -- 190 [label="76: 0.16: 0.15"]; + 126 -- 191 [label="80: 0.16: 0.15"]; + 127 -- 150 [label="102: 0.18: 0.17"]; + 127 -- 151 [label="102: 0.18: 0.17"]; + 127 -- 152 [label="103: 0.18: 0.17"]; + 127 -- 153 [label="102: 0.18: 0.17"]; + 127 -- 154 [label="102: 0.18: 0.17"]; + 127 -- 155 [label="102: 0.18: 0.17"]; + 127 -- 163 [label="96: 0.18: 0.18"]; + 127 -- 164 [label="93: 0.18: 0.17"]; + 127 -- 169 [label="99: 0.18: 0.19"]; + 127 -- 170 [label="99: 0.18: 0.20"]; + 127 -- 172 [label="100: 0.18: 0.20"]; + 127 -- 173 [label="98: 0.18: 0.20"]; + 127 -- 174 [label="100: 0.18: 0.20"]; + 127 -- 176 [label="99: 0.18: 0.19"]; + 127 -- 177 [label="99: 0.18: 0.19"]; + 127 -- 178 [label="99: 0.18: 0.19"]; + 127 -- 179 [label="98: 0.18: 0.19"]; + 127 -- 181 [label="102: 0.18: 0.15"]; + 127 -- 183 [label="99: 0.18: 0.17"]; + 127 -- 184 [label="99: 0.18: 0.17"]; + 127 -- 185 [label="99: 0.18: 0.17"]; + 127 -- 190 [label="63: 0.18: 0.15"]; + 127 -- 191 [label="82: 0.18: 0.15"]; + 128 -- 150 [label="103: 0.19: 0.17"]; + 128 -- 151 [label="103: 0.19: 0.17"]; + 128 -- 152 [label="104: 0.19: 0.17"]; + 128 -- 153 [label="103: 0.19: 0.17"]; + 128 -- 154 [label="103: 0.19: 0.17"]; + 128 -- 155 [label="103: 0.19: 0.17"]; + 128 -- 163 [label="94: 0.19: 0.18"]; + 128 -- 164 [label="92: 0.19: 0.17"]; + 128 -- 169 [label="104: 0.19: 0.19"]; + 128 -- 170 [label="104: 0.19: 0.20"]; + 128 -- 172 [label="105: 0.19: 0.20"]; + 128 -- 173 [label="103: 0.19: 0.20"]; + 128 -- 174 [label="105: 0.19: 0.20"]; + 128 -- 176 [label="104: 0.19: 0.19"]; + 128 -- 177 [label="104: 0.19: 0.19"]; + 128 -- 178 [label="104: 0.19: 0.19"]; + 128 -- 179 [label="103: 0.19: 0.19"]; + 128 -- 181 [label="106: 0.19: 0.15"]; + 128 -- 190 [label="61: 0.19: 0.15"]; + 129 -- 150 [label="107: 0.19: 0.17"]; + 129 -- 151 [label="107: 0.19: 0.17"]; + 129 -- 152 [label="108: 0.19: 0.17"]; + 129 -- 153 [label="107: 0.19: 0.17"]; + 129 -- 154 [label="107: 0.19: 0.17"]; + 129 -- 155 [label="107: 0.19: 0.17"]; + 129 -- 163 [label="103: 0.19: 0.18"]; + 129 -- 164 [label="100: 0.19: 0.17"]; + 129 -- 190 [label="65: 0.19: 0.15"]; + 130 -- 150 [label="108: 0.18: 0.17"]; + 130 -- 151 [label="108: 0.18: 0.17"]; + 130 -- 152 [label="109: 0.18: 0.17"]; + 130 -- 153 [label="108: 0.18: 0.17"]; + 130 -- 154 [label="108: 0.18: 0.17"]; + 130 -- 155 [label="108: 0.18: 0.17"]; + 130 -- 163 [label="103: 0.18: 0.18"]; + 130 -- 164 [label="100: 0.18: 0.17"]; + 130 -- 190 [label="66: 0.18: 0.15"]; + 131 -- 142 [label="118: 0.22: 0.18"]; + 131 -- 144 [label="114: 0.22: 0.21"]; + 131 -- 147 [label="116: 0.22: 0.18"]; + 131 -- 150 [label="101: 0.22: 0.17"]; + 131 -- 151 [label="101: 0.22: 0.17"]; + 131 -- 152 [label="102: 0.22: 0.17"]; + 131 -- 153 [label="101: 0.22: 0.17"]; + 131 -- 154 [label="101: 0.22: 0.17"]; + 131 -- 155 [label="101: 0.22: 0.17"]; + 131 -- 163 [label="103: 0.22: 0.18"]; + 131 -- 164 [label="101: 0.22: 0.17"]; + 131 -- 181 [label="87: 0.22: 0.15"]; + 131 -- 188 [label="81: 0.22: 0.15"]; + 131 -- 190 [label="69: 0.22: 0.15"]; + 131 -- 191 [label="79: 0.22: 0.15"]; + 132 -- 150 [label="110: 0.17: 0.17"]; + 132 -- 151 [label="110: 0.17: 0.17"]; + 132 -- 152 [label="111: 0.17: 0.17"]; + 132 -- 153 [label="110: 0.17: 0.17"]; + 132 -- 154 [label="110: 0.17: 0.17"]; + 132 -- 155 [label="111: 0.17: 0.17"]; + 132 -- 163 [label="96: 0.17: 0.18"]; + 132 -- 164 [label="93: 0.17: 0.17"]; + 132 -- 169 [label="109: 0.17: 0.19"]; + 132 -- 170 [label="109: 0.17: 0.20"]; + 132 -- 172 [label="110: 0.17: 0.20"]; + 132 -- 173 [label="109: 0.17: 0.20"]; + 132 -- 174 [label="110: 0.17: 0.20"]; + 132 -- 177 [label="109: 0.17: 0.19"]; + 132 -- 178 [label="109: 0.17: 0.19"]; + 132 -- 190 [label="68: 0.17: 0.15"]; + 133 -- 150 [label="109: 0.17: 0.17"]; + 133 -- 151 [label="109: 0.17: 0.17"]; + 133 -- 152 [label="110: 0.17: 0.17"]; + 133 -- 153 [label="109: 0.17: 0.17"]; + 133 -- 154 [label="109: 0.17: 0.17"]; + 133 -- 155 [label="110: 0.17: 0.17"]; + 133 -- 163 [label="95: 0.17: 0.18"]; + 133 -- 164 [label="92: 0.17: 0.17"]; + 133 -- 169 [label="108: 0.17: 0.19"]; + 133 -- 170 [label="108: 0.17: 0.20"]; + 133 -- 172 [label="109: 0.17: 0.20"]; + 133 -- 173 [label="108: 0.17: 0.20"]; + 133 -- 174 [label="109: 0.17: 0.20"]; + 133 -- 176 [label="109: 0.17: 0.19"]; + 133 -- 177 [label="108: 0.17: 0.19"]; + 133 -- 178 [label="108: 0.17: 0.19"]; + 133 -- 179 [label="107: 0.17: 0.19"]; + 133 -- 190 [label="67: 0.17: 0.15"]; + 134 -- 150 [label="110: 0.17: 0.17"]; + 134 -- 151 [label="110: 0.17: 0.17"]; + 134 -- 152 [label="111: 0.17: 0.17"]; + 134 -- 153 [label="110: 0.17: 0.17"]; + 134 -- 154 [label="110: 0.17: 0.17"]; + 134 -- 155 [label="111: 0.17: 0.17"]; + 134 -- 163 [label="95: 0.17: 0.18"]; + 134 -- 164 [label="92: 0.17: 0.17"]; + 134 -- 169 [label="108: 0.17: 0.19"]; + 134 -- 170 [label="108: 0.17: 0.20"]; + 134 -- 172 [label="109: 0.17: 0.20"]; + 134 -- 173 [label="108: 0.17: 0.20"]; + 134 -- 174 [label="109: 0.17: 0.20"]; + 134 -- 176 [label="109: 0.17: 0.19"]; + 134 -- 177 [label="108: 0.17: 0.19"]; + 134 -- 178 [label="108: 0.17: 0.19"]; + 134 -- 179 [label="107: 0.17: 0.19"]; + 134 -- 190 [label="68: 0.17: 0.15"]; + 135 -- 150 [label="110: 0.17: 0.17"]; + 135 -- 151 [label="110: 0.17: 0.17"]; + 135 -- 152 [label="111: 0.17: 0.17"]; + 135 -- 153 [label="110: 0.17: 0.17"]; + 135 -- 154 [label="110: 0.17: 0.17"]; + 135 -- 155 [label="111: 0.17: 0.17"]; + 135 -- 163 [label="94: 0.17: 0.18"]; + 135 -- 164 [label="91: 0.17: 0.17"]; + 135 -- 169 [label="108: 0.17: 0.19"]; + 135 -- 170 [label="108: 0.17: 0.20"]; + 135 -- 172 [label="109: 0.17: 0.20"]; + 135 -- 173 [label="107: 0.17: 0.20"]; + 135 -- 174 [label="109: 0.17: 0.20"]; + 135 -- 176 [label="108: 0.17: 0.19"]; + 135 -- 177 [label="108: 0.17: 0.19"]; + 135 -- 178 [label="108: 0.17: 0.19"]; + 135 -- 179 [label="107: 0.17: 0.19"]; + 135 -- 190 [label="68: 0.17: 0.15"]; + 136 -- 150 [label="104: 0.18: 0.17"]; + 136 -- 151 [label="104: 0.18: 0.17"]; + 136 -- 152 [label="105: 0.18: 0.17"]; + 136 -- 153 [label="104: 0.18: 0.17"]; + 136 -- 154 [label="104: 0.18: 0.17"]; + 136 -- 155 [label="104: 0.18: 0.17"]; + 136 -- 163 [label="100: 0.18: 0.18"]; + 136 -- 164 [label="97: 0.18: 0.17"]; + 136 -- 169 [label="111: 0.18: 0.19"]; + 136 -- 170 [label="111: 0.18: 0.20"]; + 136 -- 173 [label="110: 0.18: 0.20"]; + 136 -- 181 [label="105: 0.18: 0.15"]; + 136 -- 190 [label="62: 0.18: 0.15"]; + 137 -- 150 [label="104: 0.18: 0.17"]; + 137 -- 151 [label="104: 0.18: 0.17"]; + 137 -- 152 [label="105: 0.18: 0.17"]; + 137 -- 153 [label="104: 0.18: 0.17"]; + 137 -- 154 [label="104: 0.18: 0.17"]; + 137 -- 155 [label="104: 0.18: 0.17"]; + 137 -- 163 [label="99: 0.18: 0.18"]; + 137 -- 164 [label="96: 0.18: 0.17"]; + 137 -- 169 [label="111: 0.18: 0.19"]; + 137 -- 170 [label="111: 0.18: 0.20"]; + 137 -- 173 [label="110: 0.18: 0.20"]; + 137 -- 181 [label="105: 0.18: 0.15"]; + 137 -- 190 [label="62: 0.18: 0.15"]; + 138 -- 150 [label="106: 0.18: 0.17"]; + 138 -- 151 [label="106: 0.18: 0.17"]; + 138 -- 152 [label="107: 0.18: 0.17"]; + 138 -- 153 [label="106: 0.18: 0.17"]; + 138 -- 154 [label="106: 0.18: 0.17"]; + 138 -- 155 [label="106: 0.18: 0.17"]; + 138 -- 163 [label="99: 0.18: 0.18"]; + 138 -- 164 [label="97: 0.18: 0.17"]; + 138 -- 169 [label="108: 0.18: 0.19"]; + 138 -- 170 [label="108: 0.18: 0.20"]; + 138 -- 172 [label="109: 0.18: 0.20"]; + 138 -- 173 [label="107: 0.18: 0.20"]; + 138 -- 174 [label="109: 0.18: 0.20"]; + 138 -- 176 [label="108: 0.18: 0.19"]; + 138 -- 177 [label="108: 0.18: 0.19"]; + 138 -- 178 [label="107: 0.18: 0.19"]; + 138 -- 179 [label="106: 0.18: 0.19"]; + 138 -- 190 [label="64: 0.18: 0.15"]; + 139 -- 150 [label="106: 0.16: 0.17"]; + 139 -- 151 [label="106: 0.16: 0.17"]; + 139 -- 152 [label="107: 0.16: 0.17"]; + 139 -- 153 [label="106: 0.16: 0.17"]; + 139 -- 154 [label="106: 0.16: 0.17"]; + 139 -- 155 [label="107: 0.16: 0.17"]; + 139 -- 163 [label="93: 0.16: 0.18"]; + 139 -- 164 [label="90: 0.16: 0.17"]; + 139 -- 169 [label="106: 0.16: 0.19"]; + 139 -- 170 [label="106: 0.16: 0.20"]; + 139 -- 172 [label="107: 0.16: 0.20"]; + 139 -- 173 [label="106: 0.16: 0.20"]; + 139 -- 174 [label="107: 0.16: 0.20"]; + 139 -- 176 [label="107: 0.16: 0.19"]; + 139 -- 177 [label="106: 0.16: 0.19"]; + 139 -- 178 [label="106: 0.16: 0.19"]; + 139 -- 179 [label="105: 0.16: 0.19"]; + 139 -- 190 [label="64: 0.16: 0.15"]; + 140 -- 150 [label="108: 0.16: 0.17"]; + 140 -- 151 [label="108: 0.16: 0.17"]; + 140 -- 152 [label="109: 0.16: 0.17"]; + 140 -- 153 [label="108: 0.16: 0.17"]; + 140 -- 154 [label="108: 0.16: 0.17"]; + 140 -- 155 [label="109: 0.16: 0.17"]; + 140 -- 163 [label="91: 0.16: 0.18"]; + 140 -- 164 [label="89: 0.16: 0.17"]; + 140 -- 169 [label="105: 0.16: 0.19"]; + 140 -- 170 [label="105: 0.16: 0.20"]; + 140 -- 172 [label="106: 0.16: 0.20"]; + 140 -- 173 [label="105: 0.16: 0.20"]; + 140 -- 174 [label="106: 0.16: 0.20"]; + 140 -- 176 [label="106: 0.16: 0.19"]; + 140 -- 177 [label="105: 0.16: 0.19"]; + 140 -- 178 [label="105: 0.16: 0.19"]; + 140 -- 179 [label="104: 0.16: 0.19"]; + 140 -- 190 [label="66: 0.16: 0.15"]; + 141 -- 150 [label="108: 0.16: 0.17"]; + 141 -- 151 [label="108: 0.16: 0.17"]; + 141 -- 152 [label="109: 0.16: 0.17"]; + 141 -- 153 [label="108: 0.16: 0.17"]; + 141 -- 154 [label="108: 0.16: 0.17"]; + 141 -- 155 [label="109: 0.16: 0.17"]; + 141 -- 163 [label="92: 0.16: 0.18"]; + 141 -- 164 [label="90: 0.16: 0.17"]; + 141 -- 169 [label="104: 0.16: 0.19"]; + 141 -- 170 [label="104: 0.16: 0.20"]; + 141 -- 172 [label="105: 0.16: 0.20"]; + 141 -- 173 [label="104: 0.16: 0.20"]; + 141 -- 174 [label="105: 0.16: 0.20"]; + 141 -- 176 [label="105: 0.16: 0.19"]; + 141 -- 177 [label="104: 0.16: 0.19"]; + 141 -- 178 [label="104: 0.16: 0.19"]; + 141 -- 179 [label="103: 0.16: 0.19"]; + 141 -- 190 [label="66: 0.16: 0.15"]; + 142 -- 150 [label="114: 0.18: 0.17"]; + 142 -- 151 [label="114: 0.18: 0.17"]; + 142 -- 152 [label="114: 0.18: 0.17"]; + 142 -- 153 [label="114: 0.18: 0.17"]; + 142 -- 154 [label="114: 0.18: 0.17"]; + 142 -- 155 [label="114: 0.18: 0.17"]; + 142 -- 163 [label="117: 0.18: 0.18"]; + 142 -- 164 [label="114: 0.18: 0.17"]; + 142 -- 167 [label="97: 0.18: 0.20"]; + 142 -- 175 [label="96: 0.18: 0.20"]; + 142 -- 189 [label="85: 0.18: 0.16"]; + 142 -- 190 [label="70: 0.18: 0.15"]; + 143 -- 150 [label="99: 0.18: 0.17"]; + 143 -- 151 [label="99: 0.18: 0.17"]; + 143 -- 152 [label="100: 0.18: 0.17"]; + 143 -- 153 [label="99: 0.18: 0.17"]; + 143 -- 154 [label="99: 0.18: 0.17"]; + 143 -- 155 [label="99: 0.18: 0.17"]; + 143 -- 163 [label="83: 0.18: 0.18"]; + 143 -- 164 [label="81: 0.18: 0.17"]; + 143 -- 169 [label="100: 0.18: 0.19"]; + 143 -- 170 [label="100: 0.18: 0.20"]; + 143 -- 172 [label="101: 0.18: 0.20"]; + 143 -- 173 [label="99: 0.18: 0.20"]; + 143 -- 174 [label="101: 0.18: 0.20"]; + 143 -- 176 [label="100: 0.18: 0.19"]; + 143 -- 177 [label="100: 0.18: 0.19"]; + 143 -- 178 [label="100: 0.18: 0.19"]; + 143 -- 179 [label="99: 0.18: 0.19"]; + 143 -- 181 [label="102: 0.18: 0.15"]; + 143 -- 183 [label="100: 0.18: 0.17"]; + 143 -- 184 [label="100: 0.18: 0.17"]; + 143 -- 190 [label="57: 0.18: 0.15"]; + 143 -- 191 [label="84: 0.18: 0.15"]; + 144 -- 150 [label="103: 0.21: 0.17"]; + 144 -- 151 [label="103: 0.21: 0.17"]; + 144 -- 152 [label="103: 0.21: 0.17"]; + 144 -- 153 [label="103: 0.21: 0.17"]; + 144 -- 154 [label="103: 0.21: 0.17"]; + 144 -- 155 [label="103: 0.21: 0.17"]; + 144 -- 163 [label="109: 0.21: 0.18"]; + 144 -- 164 [label="106: 0.21: 0.17"]; + 144 -- 167 [label="97: 0.21: 0.20"]; + 144 -- 169 [label="98: 0.21: 0.19"]; + 144 -- 170 [label="98: 0.21: 0.20"]; + 144 -- 172 [label="100: 0.21: 0.20"]; + 144 -- 173 [label="98: 0.21: 0.20"]; + 144 -- 174 [label="100: 0.21: 0.20"]; + 144 -- 175 [label="96: 0.21: 0.20"]; + 144 -- 176 [label="100: 0.21: 0.19"]; + 144 -- 177 [label="98: 0.21: 0.19"]; + 144 -- 178 [label="98: 0.21: 0.19"]; + 144 -- 179 [label="96: 0.21: 0.19"]; + 144 -- 181 [label="101: 0.21: 0.15"]; + 144 -- 183 [label="95: 0.21: 0.17"]; + 144 -- 184 [label="95: 0.21: 0.17"]; + 144 -- 185 [label="95: 0.21: 0.17"]; + 144 -- 186 [label="95: 0.21: 0.17"]; + 144 -- 187 [label="82: 0.21: 0.15"]; + 144 -- 188 [label="85: 0.21: 0.15"]; + 144 -- 189 [label="79: 0.21: 0.16"]; + 144 -- 190 [label="75: 0.21: 0.15"]; + 144 -- 191 [label="85: 0.21: 0.15"]; + 145 -- 150 [label="106: 0.16: 0.17"]; + 145 -- 151 [label="106: 0.16: 0.17"]; + 145 -- 152 [label="107: 0.16: 0.17"]; + 145 -- 153 [label="106: 0.16: 0.17"]; + 145 -- 154 [label="106: 0.16: 0.17"]; + 145 -- 155 [label="107: 0.16: 0.17"]; + 145 -- 163 [label="92: 0.16: 0.18"]; + 145 -- 164 [label="89: 0.16: 0.17"]; + 145 -- 169 [label="105: 0.16: 0.19"]; + 145 -- 170 [label="105: 0.16: 0.20"]; + 145 -- 172 [label="106: 0.16: 0.20"]; + 145 -- 173 [label="105: 0.16: 0.20"]; + 145 -- 174 [label="106: 0.16: 0.20"]; + 145 -- 176 [label="106: 0.16: 0.19"]; + 145 -- 177 [label="105: 0.16: 0.19"]; + 145 -- 178 [label="105: 0.16: 0.19"]; + 145 -- 179 [label="104: 0.16: 0.19"]; + 145 -- 190 [label="64: 0.16: 0.15"]; + 146 -- 150 [label="99: 0.18: 0.17"]; + 146 -- 151 [label="99: 0.18: 0.17"]; + 146 -- 152 [label="100: 0.18: 0.17"]; + 146 -- 153 [label="99: 0.18: 0.17"]; + 146 -- 154 [label="99: 0.18: 0.17"]; + 146 -- 155 [label="99: 0.18: 0.17"]; + 146 -- 163 [label="82: 0.18: 0.18"]; + 146 -- 164 [label="80: 0.18: 0.17"]; + 146 -- 169 [label="99: 0.18: 0.19"]; + 146 -- 170 [label="99: 0.18: 0.20"]; + 146 -- 172 [label="100: 0.18: 0.20"]; + 146 -- 173 [label="98: 0.18: 0.20"]; + 146 -- 174 [label="100: 0.18: 0.20"]; + 146 -- 176 [label="99: 0.18: 0.19"]; + 146 -- 177 [label="99: 0.18: 0.19"]; + 146 -- 178 [label="99: 0.18: 0.19"]; + 146 -- 179 [label="98: 0.18: 0.19"]; + 146 -- 181 [label="102: 0.18: 0.15"]; + 146 -- 183 [label="99: 0.18: 0.17"]; + 146 -- 184 [label="99: 0.18: 0.17"]; + 146 -- 185 [label="99: 0.18: 0.17"]; + 146 -- 190 [label="57: 0.18: 0.15"]; + 146 -- 191 [label="83: 0.18: 0.15"]; + 147 -- 150 [label="113: 0.18: 0.17"]; + 147 -- 151 [label="113: 0.18: 0.17"]; + 147 -- 152 [label="113: 0.18: 0.17"]; + 147 -- 153 [label="113: 0.18: 0.17"]; + 147 -- 154 [label="113: 0.18: 0.17"]; + 147 -- 155 [label="113: 0.18: 0.17"]; + 147 -- 163 [label="114: 0.18: 0.18"]; + 147 -- 164 [label="111: 0.18: 0.17"]; + 147 -- 167 [label="96: 0.18: 0.20"]; + 147 -- 175 [label="95: 0.18: 0.20"]; + 147 -- 184 [label="100: 0.18: 0.17"]; + 147 -- 189 [label="84: 0.18: 0.16"]; + 147 -- 190 [label="70: 0.18: 0.15"]; + 148 -- 150 [label="107: 0.16: 0.17"]; + 148 -- 151 [label="107: 0.16: 0.17"]; + 148 -- 152 [label="108: 0.16: 0.17"]; + 148 -- 153 [label="107: 0.16: 0.17"]; + 148 -- 154 [label="107: 0.16: 0.17"]; + 148 -- 155 [label="108: 0.16: 0.17"]; + 148 -- 163 [label="90: 0.16: 0.18"]; + 148 -- 164 [label="88: 0.16: 0.17"]; + 148 -- 169 [label="103: 0.16: 0.19"]; + 148 -- 170 [label="103: 0.16: 0.20"]; + 148 -- 172 [label="104: 0.16: 0.20"]; + 148 -- 173 [label="103: 0.16: 0.20"]; + 148 -- 174 [label="104: 0.16: 0.20"]; + 148 -- 176 [label="104: 0.16: 0.19"]; + 148 -- 177 [label="103: 0.16: 0.19"]; + 148 -- 178 [label="103: 0.16: 0.19"]; + 148 -- 179 [label="102: 0.16: 0.19"]; + 148 -- 190 [label="65: 0.16: 0.15"]; + 149 -- 150 [label="107: 0.16: 0.17"]; + 149 -- 151 [label="107: 0.16: 0.17"]; + 149 -- 152 [label="108: 0.16: 0.17"]; + 149 -- 153 [label="107: 0.16: 0.17"]; + 149 -- 154 [label="107: 0.16: 0.17"]; + 149 -- 155 [label="108: 0.16: 0.17"]; + 149 -- 163 [label="89: 0.16: 0.18"]; + 149 -- 164 [label="87: 0.16: 0.17"]; + 149 -- 169 [label="104: 0.16: 0.19"]; + 149 -- 170 [label="104: 0.16: 0.20"]; + 149 -- 172 [label="105: 0.16: 0.20"]; + 149 -- 173 [label="104: 0.16: 0.20"]; + 149 -- 174 [label="105: 0.16: 0.20"]; + 149 -- 176 [label="105: 0.16: 0.19"]; + 149 -- 177 [label="104: 0.16: 0.19"]; + 149 -- 178 [label="104: 0.16: 0.19"]; + 149 -- 179 [label="103: 0.16: 0.19"]; + 149 -- 190 [label="65: 0.16: 0.15"]; + 150 -- 156 [label="103: 0.17: 0.16"]; + 150 -- 157 [label="106: 0.17: 0.16"]; + 150 -- 158 [label="102: 0.17: 0.17"]; + 150 -- 159 [label="93: 0.17: 0.17"]; + 150 -- 160 [label="100: 0.17: 0.17"]; + 150 -- 161 [label="103: 0.17: 0.15"]; + 150 -- 162 [label="104: 0.17: 0.15"]; + 150 -- 163 [label="102: 0.17: 0.18"]; + 150 -- 164 [label="99: 0.17: 0.17"]; + 150 -- 165 [label="98: 0.17: 0.16"]; + 150 -- 166 [label="98: 0.17: 0.16"]; + 150 -- 167 [label="81: 0.17: 0.20"]; + 150 -- 168 [label="97: 0.17: 0.16"]; + 150 -- 169 [label="106: 0.17: 0.19"]; + 150 -- 170 [label="106: 0.17: 0.20"]; + 150 -- 171 [label="94: 0.17: 0.16"]; + 150 -- 172 [label="107: 0.17: 0.20"]; + 150 -- 173 [label="104: 0.17: 0.20"]; + 150 -- 174 [label="107: 0.17: 0.20"]; + 150 -- 175 [label="80: 0.17: 0.20"]; + 150 -- 176 [label="105: 0.17: 0.19"]; + 150 -- 177 [label="106: 0.17: 0.19"]; + 150 -- 178 [label="106: 0.17: 0.19"]; + 150 -- 179 [label="105: 0.17: 0.19"]; + 150 -- 180 [label="94: 0.17: 0.15"]; + 150 -- 182 [label="92: 0.17: 0.15"]; + 150 -- 183 [label="89: 0.17: 0.17"]; + 150 -- 184 [label="90: 0.17: 0.17"]; + 150 -- 185 [label="90: 0.17: 0.17"]; + 150 -- 186 [label="90: 0.17: 0.17"]; + 150 -- 187 [label="76: 0.17: 0.15"]; + 150 -- 188 [label="80: 0.17: 0.15"]; + 150 -- 189 [label="62: 0.17: 0.16"]; + 150 -- 191 [label="82: 0.17: 0.15"]; + 151 -- 156 [label="103: 0.17: 0.16"]; + 151 -- 157 [label="106: 0.17: 0.16"]; + 151 -- 158 [label="102: 0.17: 0.17"]; + 151 -- 159 [label="93: 0.17: 0.17"]; + 151 -- 160 [label="100: 0.17: 0.17"]; + 151 -- 161 [label="103: 0.17: 0.15"]; + 151 -- 162 [label="104: 0.17: 0.15"]; + 151 -- 163 [label="101: 0.17: 0.18"]; + 151 -- 164 [label="98: 0.17: 0.17"]; + 151 -- 165 [label="98: 0.17: 0.16"]; + 151 -- 166 [label="98: 0.17: 0.16"]; + 151 -- 167 [label="81: 0.17: 0.20"]; + 151 -- 168 [label="97: 0.17: 0.16"]; + 151 -- 169 [label="105: 0.17: 0.19"]; + 151 -- 170 [label="105: 0.17: 0.20"]; + 151 -- 171 [label="94: 0.17: 0.16"]; + 151 -- 172 [label="106: 0.17: 0.20"]; + 151 -- 173 [label="103: 0.17: 0.20"]; + 151 -- 174 [label="106: 0.17: 0.20"]; + 151 -- 175 [label="80: 0.17: 0.20"]; + 151 -- 176 [label="104: 0.17: 0.19"]; + 151 -- 177 [label="105: 0.17: 0.19"]; + 151 -- 178 [label="105: 0.17: 0.19"]; + 151 -- 179 [label="104: 0.17: 0.19"]; + 151 -- 180 [label="94: 0.17: 0.15"]; + 151 -- 182 [label="92: 0.17: 0.15"]; + 151 -- 183 [label="88: 0.17: 0.17"]; + 151 -- 184 [label="89: 0.17: 0.17"]; + 151 -- 185 [label="89: 0.17: 0.17"]; + 151 -- 186 [label="89: 0.17: 0.17"]; + 151 -- 187 [label="76: 0.17: 0.15"]; + 151 -- 188 [label="80: 0.17: 0.15"]; + 151 -- 189 [label="62: 0.17: 0.16"]; + 151 -- 191 [label="81: 0.17: 0.15"]; + 152 -- 156 [label="104: 0.17: 0.16"]; + 152 -- 157 [label="107: 0.17: 0.16"]; + 152 -- 158 [label="103: 0.17: 0.17"]; + 152 -- 159 [label="94: 0.17: 0.17"]; + 152 -- 160 [label="101: 0.17: 0.17"]; + 152 -- 161 [label="104: 0.17: 0.15"]; + 152 -- 162 [label="105: 0.17: 0.15"]; + 152 -- 163 [label="101: 0.17: 0.18"]; + 152 -- 164 [label="98: 0.17: 0.17"]; + 152 -- 165 [label="99: 0.17: 0.16"]; + 152 -- 166 [label="99: 0.17: 0.16"]; + 152 -- 167 [label="82: 0.17: 0.20"]; + 152 -- 168 [label="98: 0.17: 0.16"]; + 152 -- 169 [label="105: 0.17: 0.19"]; + 152 -- 170 [label="105: 0.17: 0.20"]; + 152 -- 171 [label="95: 0.17: 0.16"]; + 152 -- 172 [label="106: 0.17: 0.20"]; + 152 -- 173 [label="103: 0.17: 0.20"]; + 152 -- 174 [label="106: 0.17: 0.20"]; + 152 -- 175 [label="81: 0.17: 0.20"]; + 152 -- 176 [label="104: 0.17: 0.19"]; + 152 -- 177 [label="105: 0.17: 0.19"]; + 152 -- 178 [label="105: 0.17: 0.19"]; + 152 -- 179 [label="104: 0.17: 0.19"]; + 152 -- 180 [label="95: 0.17: 0.15"]; + 152 -- 182 [label="92: 0.17: 0.15"]; + 152 -- 183 [label="88: 0.17: 0.17"]; + 152 -- 184 [label="89: 0.17: 0.17"]; + 152 -- 185 [label="89: 0.17: 0.17"]; + 152 -- 186 [label="89: 0.17: 0.17"]; + 152 -- 187 [label="77: 0.17: 0.15"]; + 152 -- 188 [label="80: 0.17: 0.15"]; + 152 -- 189 [label="63: 0.17: 0.16"]; + 152 -- 191 [label="81: 0.17: 0.15"]; + 153 -- 156 [label="103: 0.17: 0.16"]; + 153 -- 157 [label="106: 0.17: 0.16"]; + 153 -- 158 [label="102: 0.17: 0.17"]; + 153 -- 159 [label="93: 0.17: 0.17"]; + 153 -- 160 [label="100: 0.17: 0.17"]; + 153 -- 161 [label="103: 0.17: 0.15"]; + 153 -- 162 [label="104: 0.17: 0.15"]; + 153 -- 163 [label="101: 0.17: 0.18"]; + 153 -- 164 [label="98: 0.17: 0.17"]; + 153 -- 165 [label="98: 0.17: 0.16"]; + 153 -- 166 [label="98: 0.17: 0.16"]; + 153 -- 167 [label="81: 0.17: 0.20"]; + 153 -- 168 [label="97: 0.17: 0.16"]; + 153 -- 169 [label="105: 0.17: 0.19"]; + 153 -- 170 [label="105: 0.17: 0.20"]; + 153 -- 171 [label="94: 0.17: 0.16"]; + 153 -- 172 [label="106: 0.17: 0.20"]; + 153 -- 173 [label="103: 0.17: 0.20"]; + 153 -- 174 [label="106: 0.17: 0.20"]; + 153 -- 175 [label="80: 0.17: 0.20"]; + 153 -- 176 [label="104: 0.17: 0.19"]; + 153 -- 177 [label="105: 0.17: 0.19"]; + 153 -- 178 [label="105: 0.17: 0.19"]; + 153 -- 179 [label="104: 0.17: 0.19"]; + 153 -- 180 [label="94: 0.17: 0.15"]; + 153 -- 182 [label="92: 0.17: 0.15"]; + 153 -- 183 [label="88: 0.17: 0.17"]; + 153 -- 184 [label="89: 0.17: 0.17"]; + 153 -- 185 [label="89: 0.17: 0.17"]; + 153 -- 186 [label="89: 0.17: 0.17"]; + 153 -- 187 [label="76: 0.17: 0.15"]; + 153 -- 188 [label="80: 0.17: 0.15"]; + 153 -- 189 [label="62: 0.17: 0.16"]; + 153 -- 191 [label="81: 0.17: 0.15"]; + 154 -- 156 [label="103: 0.17: 0.16"]; + 154 -- 157 [label="106: 0.17: 0.16"]; + 154 -- 158 [label="102: 0.17: 0.17"]; + 154 -- 159 [label="93: 0.17: 0.17"]; + 154 -- 160 [label="100: 0.17: 0.17"]; + 154 -- 161 [label="103: 0.17: 0.15"]; + 154 -- 162 [label="104: 0.17: 0.15"]; + 154 -- 163 [label="101: 0.17: 0.18"]; + 154 -- 164 [label="98: 0.17: 0.17"]; + 154 -- 165 [label="98: 0.17: 0.16"]; + 154 -- 166 [label="98: 0.17: 0.16"]; + 154 -- 167 [label="81: 0.17: 0.20"]; + 154 -- 168 [label="97: 0.17: 0.16"]; + 154 -- 169 [label="105: 0.17: 0.19"]; + 154 -- 170 [label="105: 0.17: 0.20"]; + 154 -- 171 [label="94: 0.17: 0.16"]; + 154 -- 172 [label="106: 0.17: 0.20"]; + 154 -- 173 [label="103: 0.17: 0.20"]; + 154 -- 174 [label="106: 0.17: 0.20"]; + 154 -- 175 [label="80: 0.17: 0.20"]; + 154 -- 176 [label="104: 0.17: 0.19"]; + 154 -- 177 [label="105: 0.17: 0.19"]; + 154 -- 178 [label="105: 0.17: 0.19"]; + 154 -- 179 [label="104: 0.17: 0.19"]; + 154 -- 180 [label="94: 0.17: 0.15"]; + 154 -- 182 [label="92: 0.17: 0.15"]; + 154 -- 183 [label="88: 0.17: 0.17"]; + 154 -- 184 [label="89: 0.17: 0.17"]; + 154 -- 185 [label="89: 0.17: 0.17"]; + 154 -- 186 [label="89: 0.17: 0.17"]; + 154 -- 187 [label="76: 0.17: 0.15"]; + 154 -- 188 [label="80: 0.17: 0.15"]; + 154 -- 189 [label="62: 0.17: 0.16"]; + 154 -- 191 [label="81: 0.17: 0.15"]; + 155 -- 156 [label="103: 0.17: 0.16"]; + 155 -- 157 [label="107: 0.17: 0.16"]; + 155 -- 158 [label="102: 0.17: 0.17"]; + 155 -- 159 [label="93: 0.17: 0.17"]; + 155 -- 160 [label="100: 0.17: 0.17"]; + 155 -- 161 [label="104: 0.17: 0.15"]; + 155 -- 162 [label="105: 0.17: 0.15"]; + 155 -- 163 [label="100: 0.17: 0.18"]; + 155 -- 164 [label="97: 0.17: 0.17"]; + 155 -- 165 [label="99: 0.17: 0.16"]; + 155 -- 166 [label="99: 0.17: 0.16"]; + 155 -- 167 [label="81: 0.17: 0.20"]; + 155 -- 168 [label="98: 0.17: 0.16"]; + 155 -- 169 [label="104: 0.17: 0.19"]; + 155 -- 170 [label="104: 0.17: 0.20"]; + 155 -- 171 [label="95: 0.17: 0.16"]; + 155 -- 172 [label="105: 0.17: 0.20"]; + 155 -- 173 [label="102: 0.17: 0.20"]; + 155 -- 174 [label="105: 0.17: 0.20"]; + 155 -- 175 [label="80: 0.17: 0.20"]; + 155 -- 176 [label="103: 0.17: 0.19"]; + 155 -- 177 [label="104: 0.17: 0.19"]; + 155 -- 178 [label="104: 0.17: 0.19"]; + 155 -- 179 [label="103: 0.17: 0.19"]; + 155 -- 180 [label="95: 0.17: 0.15"]; + 155 -- 182 [label="92: 0.17: 0.15"]; + 155 -- 183 [label="87: 0.17: 0.17"]; + 155 -- 184 [label="88: 0.17: 0.17"]; + 155 -- 185 [label="88: 0.17: 0.17"]; + 155 -- 186 [label="88: 0.17: 0.17"]; + 155 -- 187 [label="77: 0.17: 0.15"]; + 155 -- 188 [label="80: 0.17: 0.15"]; + 155 -- 189 [label="62: 0.17: 0.16"]; + 155 -- 191 [label="81: 0.17: 0.15"]; + 156 -- 163 [label="92: 0.16: 0.18"]; + 156 -- 164 [label="89: 0.16: 0.17"]; + 156 -- 169 [label="93: 0.16: 0.19"]; + 156 -- 170 [label="93: 0.16: 0.20"]; + 156 -- 172 [label="95: 0.16: 0.20"]; + 156 -- 173 [label="92: 0.16: 0.20"]; + 156 -- 174 [label="95: 0.16: 0.20"]; + 156 -- 176 [label="94: 0.16: 0.19"]; + 156 -- 177 [label="93: 0.16: 0.19"]; + 156 -- 178 [label="94: 0.16: 0.19"]; + 156 -- 179 [label="92: 0.16: 0.19"]; + 156 -- 181 [label="100: 0.16: 0.15"]; + 156 -- 183 [label="93: 0.16: 0.17"]; + 156 -- 184 [label="93: 0.16: 0.17"]; + 156 -- 185 [label="93: 0.16: 0.17"]; + 156 -- 186 [label="93: 0.16: 0.17"]; + 156 -- 190 [label="64: 0.16: 0.15"]; + 156 -- 191 [label="82: 0.16: 0.15"]; + 157 -- 163 [label="85: 0.16: 0.18"]; + 157 -- 164 [label="83: 0.16: 0.17"]; + 157 -- 169 [label="99: 0.16: 0.19"]; + 157 -- 170 [label="99: 0.16: 0.20"]; + 157 -- 172 [label="100: 0.16: 0.20"]; + 157 -- 173 [label="99: 0.16: 0.20"]; + 157 -- 174 [label="100: 0.16: 0.20"]; + 157 -- 176 [label="100: 0.16: 0.19"]; + 157 -- 177 [label="99: 0.16: 0.19"]; + 157 -- 178 [label="99: 0.16: 0.19"]; + 157 -- 179 [label="98: 0.16: 0.19"]; + 157 -- 183 [label="100: 0.16: 0.17"]; + 157 -- 184 [label="99: 0.16: 0.17"]; + 157 -- 185 [label="99: 0.16: 0.17"]; + 157 -- 190 [label="64: 0.16: 0.15"]; + 158 -- 163 [label="96: 0.17: 0.18"]; + 158 -- 164 [label="93: 0.17: 0.17"]; + 158 -- 169 [label="98: 0.17: 0.19"]; + 158 -- 170 [label="98: 0.17: 0.20"]; + 158 -- 172 [label="100: 0.17: 0.20"]; + 158 -- 173 [label="97: 0.17: 0.20"]; + 158 -- 174 [label="100: 0.17: 0.20"]; + 158 -- 176 [label="99: 0.17: 0.19"]; + 158 -- 177 [label="98: 0.17: 0.19"]; + 158 -- 178 [label="99: 0.17: 0.19"]; + 158 -- 179 [label="97: 0.17: 0.19"]; + 158 -- 181 [label="99: 0.17: 0.15"]; + 158 -- 183 [label="98: 0.17: 0.17"]; + 158 -- 184 [label="98: 0.17: 0.17"]; + 158 -- 185 [label="98: 0.17: 0.17"]; + 158 -- 186 [label="98: 0.17: 0.17"]; + 158 -- 190 [label="62: 0.17: 0.15"]; + 158 -- 191 [label="85: 0.17: 0.15"]; + 159 -- 163 [label="79: 0.17: 0.18"]; + 159 -- 164 [label="77: 0.17: 0.17"]; + 159 -- 169 [label="94: 0.17: 0.19"]; + 159 -- 170 [label="94: 0.17: 0.20"]; + 159 -- 172 [label="95: 0.17: 0.20"]; + 159 -- 173 [label="93: 0.17: 0.20"]; + 159 -- 174 [label="95: 0.17: 0.20"]; + 159 -- 176 [label="94: 0.17: 0.19"]; + 159 -- 177 [label="94: 0.17: 0.19"]; + 159 -- 178 [label="94: 0.17: 0.19"]; + 159 -- 179 [label="93: 0.17: 0.19"]; + 159 -- 181 [label="97: 0.17: 0.15"]; + 159 -- 183 [label="94: 0.17: 0.17"]; + 159 -- 184 [label="94: 0.17: 0.17"]; + 159 -- 185 [label="94: 0.17: 0.17"]; + 159 -- 186 [label="94: 0.17: 0.17"]; + 159 -- 188 [label="88: 0.17: 0.15"]; + 159 -- 190 [label="54: 0.17: 0.15"]; + 159 -- 191 [label="76: 0.17: 0.15"]; + 160 -- 163 [label="84: 0.17: 0.18"]; + 160 -- 164 [label="82: 0.17: 0.17"]; + 160 -- 169 [label="99: 0.17: 0.19"]; + 160 -- 170 [label="99: 0.17: 0.20"]; + 160 -- 172 [label="100: 0.17: 0.20"]; + 160 -- 173 [label="98: 0.17: 0.20"]; + 160 -- 174 [label="100: 0.17: 0.20"]; + 160 -- 176 [label="99: 0.17: 0.19"]; + 160 -- 177 [label="99: 0.17: 0.19"]; + 160 -- 178 [label="99: 0.17: 0.19"]; + 160 -- 179 [label="98: 0.17: 0.19"]; + 160 -- 181 [label="102: 0.17: 0.15"]; + 160 -- 183 [label="99: 0.17: 0.17"]; + 160 -- 184 [label="99: 0.17: 0.17"]; + 160 -- 185 [label="99: 0.17: 0.17"]; + 160 -- 190 [label="58: 0.17: 0.15"]; + 160 -- 191 [label="84: 0.17: 0.15"]; + 161 -- 163 [label="77: 0.15: 0.18"]; + 161 -- 164 [label="75: 0.15: 0.17"]; + 161 -- 169 [label="98: 0.15: 0.19"]; + 161 -- 170 [label="98: 0.15: 0.20"]; + 161 -- 172 [label="99: 0.15: 0.20"]; + 161 -- 173 [label="98: 0.15: 0.20"]; + 161 -- 174 [label="99: 0.15: 0.20"]; + 161 -- 176 [label="99: 0.15: 0.19"]; + 161 -- 177 [label="98: 0.15: 0.19"]; + 161 -- 178 [label="99: 0.15: 0.19"]; + 161 -- 179 [label="98: 0.15: 0.19"]; + 161 -- 183 [label="99: 0.15: 0.17"]; + 161 -- 184 [label="98: 0.15: 0.17"]; + 161 -- 185 [label="98: 0.15: 0.17"]; + 161 -- 186 [label="98: 0.15: 0.17"]; + 161 -- 190 [label="61: 0.15: 0.15"]; + 162 -- 163 [label="78: 0.15: 0.18"]; + 162 -- 164 [label="76: 0.15: 0.17"]; + 162 -- 169 [label="98: 0.15: 0.19"]; + 162 -- 170 [label="98: 0.15: 0.20"]; + 162 -- 172 [label="99: 0.15: 0.20"]; + 162 -- 173 [label="98: 0.15: 0.20"]; + 162 -- 174 [label="99: 0.15: 0.20"]; + 162 -- 176 [label="99: 0.15: 0.19"]; + 162 -- 177 [label="98: 0.15: 0.19"]; + 162 -- 178 [label="98: 0.15: 0.19"]; + 162 -- 179 [label="97: 0.15: 0.19"]; + 162 -- 183 [label="99: 0.15: 0.17"]; + 162 -- 184 [label="98: 0.15: 0.17"]; + 162 -- 185 [label="98: 0.15: 0.17"]; + 162 -- 186 [label="98: 0.15: 0.17"]; + 162 -- 190 [label="62: 0.15: 0.15"]; + 163 -- 165 [label="81: 0.18: 0.16"]; + 163 -- 166 [label="82: 0.18: 0.16"]; + 163 -- 167 [label="81: 0.18: 0.20"]; + 163 -- 168 [label="80: 0.18: 0.16"]; + 163 -- 169 [label="92: 0.18: 0.19"]; + 163 -- 170 [label="92: 0.18: 0.20"]; + 163 -- 171 [label="79: 0.18: 0.16"]; + 163 -- 172 [label="94: 0.18: 0.20"]; + 163 -- 173 [label="91: 0.18: 0.20"]; + 163 -- 174 [label="94: 0.18: 0.20"]; + 163 -- 175 [label="79: 0.18: 0.20"]; + 163 -- 176 [label="93: 0.18: 0.19"]; + 163 -- 177 [label="92: 0.18: 0.19"]; + 163 -- 178 [label="91: 0.18: 0.19"]; + 163 -- 179 [label="89: 0.18: 0.19"]; + 163 -- 180 [label="73: 0.18: 0.15"]; + 163 -- 181 [label="76: 0.18: 0.15"]; + 163 -- 182 [label="72: 0.18: 0.15"]; + 163 -- 183 [label="80: 0.18: 0.17"]; + 163 -- 184 [label="80: 0.18: 0.17"]; + 163 -- 185 [label="80: 0.18: 0.17"]; + 163 -- 186 [label="80: 0.18: 0.17"]; + 163 -- 187 [label="58: 0.18: 0.15"]; + 163 -- 189 [label="57: 0.18: 0.16"]; + 163 -- 190 [label="73: 0.18: 0.15"]; + 164 -- 165 [label="78: 0.17: 0.16"]; + 164 -- 166 [label="79: 0.17: 0.16"]; + 164 -- 167 [label="79: 0.17: 0.20"]; + 164 -- 168 [label="78: 0.17: 0.16"]; + 164 -- 169 [label="90: 0.17: 0.19"]; + 164 -- 170 [label="90: 0.17: 0.20"]; + 164 -- 171 [label="76: 0.17: 0.16"]; + 164 -- 172 [label="92: 0.17: 0.20"]; + 164 -- 173 [label="89: 0.17: 0.20"]; + 164 -- 174 [label="92: 0.17: 0.20"]; + 164 -- 175 [label="77: 0.17: 0.20"]; + 164 -- 176 [label="91: 0.17: 0.19"]; + 164 -- 177 [label="90: 0.17: 0.19"]; + 164 -- 178 [label="89: 0.17: 0.19"]; + 164 -- 179 [label="87: 0.17: 0.19"]; + 164 -- 180 [label="71: 0.17: 0.15"]; + 164 -- 181 [label="74: 0.17: 0.15"]; + 164 -- 182 [label="70: 0.17: 0.15"]; + 164 -- 183 [label="78: 0.17: 0.17"]; + 164 -- 184 [label="78: 0.17: 0.17"]; + 164 -- 185 [label="78: 0.17: 0.17"]; + 164 -- 186 [label="78: 0.17: 0.17"]; + 164 -- 187 [label="56: 0.17: 0.15"]; + 164 -- 189 [label="55: 0.17: 0.16"]; + 164 -- 190 [label="70: 0.17: 0.15"]; + 165 -- 169 [label="100: 0.16: 0.19"]; + 165 -- 170 [label="100: 0.16: 0.20"]; + 165 -- 172 [label="101: 0.16: 0.20"]; + 165 -- 173 [label="99: 0.16: 0.20"]; + 165 -- 174 [label="101: 0.16: 0.20"]; + 165 -- 176 [label="100: 0.16: 0.19"]; + 165 -- 177 [label="100: 0.16: 0.19"]; + 165 -- 178 [label="100: 0.16: 0.19"]; + 165 -- 179 [label="99: 0.16: 0.19"]; + 165 -- 181 [label="102: 0.16: 0.15"]; + 165 -- 183 [label="100: 0.16: 0.17"]; + 165 -- 184 [label="100: 0.16: 0.17"]; + 165 -- 190 [label="58: 0.16: 0.15"]; + 166 -- 169 [label="99: 0.16: 0.19"]; + 166 -- 170 [label="99: 0.16: 0.20"]; + 166 -- 172 [label="100: 0.16: 0.20"]; + 166 -- 173 [label="99: 0.16: 0.20"]; + 166 -- 174 [label="100: 0.16: 0.20"]; + 166 -- 176 [label="100: 0.16: 0.19"]; + 166 -- 177 [label="99: 0.16: 0.19"]; + 166 -- 178 [label="99: 0.16: 0.19"]; + 166 -- 179 [label="98: 0.16: 0.19"]; + 166 -- 181 [label="102: 0.16: 0.15"]; + 166 -- 183 [label="100: 0.16: 0.17"]; + 166 -- 184 [label="99: 0.16: 0.17"]; + 166 -- 185 [label="99: 0.16: 0.17"]; + 166 -- 190 [label="58: 0.16: 0.15"]; + 167 -- 181 [label="75: 0.20: 0.15"]; + 167 -- 188 [label="70: 0.20: 0.15"]; + 167 -- 190 [label="50: 0.20: 0.15"]; + 167 -- 191 [label="63: 0.20: 0.15"]; + 168 -- 169 [label="96: 0.16: 0.19"]; + 168 -- 170 [label="96: 0.16: 0.20"]; + 168 -- 172 [label="97: 0.16: 0.20"]; + 168 -- 173 [label="96: 0.16: 0.20"]; + 168 -- 174 [label="97: 0.16: 0.20"]; + 168 -- 176 [label="97: 0.16: 0.19"]; + 168 -- 177 [label="96: 0.16: 0.19"]; + 168 -- 178 [label="96: 0.16: 0.19"]; + 168 -- 179 [label="95: 0.16: 0.19"]; + 168 -- 181 [label="102: 0.16: 0.15"]; + 168 -- 183 [label="97: 0.16: 0.17"]; + 168 -- 184 [label="96: 0.16: 0.17"]; + 168 -- 185 [label="96: 0.16: 0.17"]; + 168 -- 186 [label="96: 0.16: 0.17"]; + 168 -- 190 [label="57: 0.16: 0.15"]; + 169 -- 171 [label="97: 0.19: 0.16"]; + 169 -- 180 [label="94: 0.19: 0.15"]; + 169 -- 181 [label="98: 0.19: 0.15"]; + 169 -- 182 [label="88: 0.19: 0.15"]; + 169 -- 190 [label="67: 0.19: 0.15"]; + 170 -- 171 [label="97: 0.20: 0.16"]; + 170 -- 180 [label="94: 0.20: 0.15"]; + 170 -- 181 [label="98: 0.20: 0.15"]; + 170 -- 182 [label="88: 0.20: 0.15"]; + 170 -- 190 [label="67: 0.20: 0.15"]; + 171 -- 172 [label="98: 0.16: 0.20"]; + 171 -- 173 [label="97: 0.16: 0.20"]; + 171 -- 174 [label="98: 0.16: 0.20"]; + 171 -- 176 [label="98: 0.16: 0.19"]; + 171 -- 177 [label="97: 0.16: 0.19"]; + 171 -- 178 [label="97: 0.16: 0.19"]; + 171 -- 179 [label="96: 0.16: 0.19"]; + 171 -- 181 [label="98: 0.16: 0.15"]; + 171 -- 183 [label="98: 0.16: 0.17"]; + 171 -- 184 [label="97: 0.16: 0.17"]; + 171 -- 185 [label="97: 0.16: 0.17"]; + 171 -- 186 [label="97: 0.16: 0.17"]; + 171 -- 190 [label="54: 0.16: 0.15"]; + 172 -- 180 [label="95: 0.20: 0.15"]; + 172 -- 181 [label="100: 0.20: 0.15"]; + 172 -- 182 [label="89: 0.20: 0.15"]; + 172 -- 190 [label="68: 0.20: 0.15"]; + 173 -- 180 [label="94: 0.20: 0.15"]; + 173 -- 181 [label="97: 0.20: 0.15"]; + 173 -- 182 [label="88: 0.20: 0.15"]; + 173 -- 190 [label="65: 0.20: 0.15"]; + 174 -- 180 [label="95: 0.20: 0.15"]; + 174 -- 181 [label="100: 0.20: 0.15"]; + 174 -- 182 [label="89: 0.20: 0.15"]; + 174 -- 190 [label="68: 0.20: 0.15"]; + 175 -- 181 [label="75: 0.20: 0.15"]; + 175 -- 188 [label="70: 0.20: 0.15"]; + 175 -- 190 [label="50: 0.20: 0.15"]; + 175 -- 191 [label="63: 0.20: 0.15"]; + 176 -- 180 [label="95: 0.19: 0.15"]; + 176 -- 181 [label="99: 0.19: 0.15"]; + 176 -- 182 [label="89: 0.19: 0.15"]; + 176 -- 190 [label="66: 0.19: 0.15"]; + 177 -- 180 [label="94: 0.19: 0.15"]; + 177 -- 181 [label="99: 0.19: 0.15"]; + 177 -- 182 [label="88: 0.19: 0.15"]; + 177 -- 190 [label="67: 0.19: 0.15"]; + 178 -- 180 [label="94: 0.19: 0.15"]; + 178 -- 181 [label="99: 0.19: 0.15"]; + 178 -- 182 [label="88: 0.19: 0.15"]; + 178 -- 190 [label="67: 0.19: 0.15"]; + 179 -- 180 [label="93: 0.19: 0.15"]; + 179 -- 181 [label="98: 0.19: 0.15"]; + 179 -- 182 [label="87: 0.19: 0.15"]; + 179 -- 190 [label="66: 0.19: 0.15"]; + 180 -- 181 [label="99: 0.15: 0.15"]; + 180 -- 183 [label="95: 0.15: 0.17"]; + 180 -- 184 [label="94: 0.15: 0.17"]; + 180 -- 185 [label="94: 0.15: 0.17"]; + 180 -- 186 [label="94: 0.15: 0.17"]; + 180 -- 190 [label="54: 0.15: 0.15"]; + 180 -- 191 [label="85: 0.15: 0.15"]; + 181 -- 182 [label="93: 0.15: 0.15"]; + 181 -- 183 [label="83: 0.15: 0.17"]; + 181 -- 184 [label="83: 0.15: 0.17"]; + 181 -- 185 [label="83: 0.15: 0.17"]; + 181 -- 186 [label="84: 0.15: 0.17"]; + 181 -- 187 [label="77: 0.15: 0.15"]; + 181 -- 188 [label="81: 0.15: 0.15"]; + 181 -- 189 [label="61: 0.15: 0.16"]; + 181 -- 190 [label="71: 0.15: 0.15"]; + 181 -- 191 [label="73: 0.15: 0.15"]; + 182 -- 183 [label="89: 0.15: 0.17"]; + 182 -- 184 [label="88: 0.15: 0.17"]; + 182 -- 185 [label="88: 0.15: 0.17"]; + 182 -- 186 [label="88: 0.15: 0.17"]; + 182 -- 188 [label="86: 0.15: 0.15"]; + 182 -- 189 [label="87: 0.15: 0.16"]; + 182 -- 190 [label="54: 0.15: 0.15"]; + 182 -- 191 [label="79: 0.15: 0.15"]; + 183 -- 190 [label="56: 0.17: 0.15"]; + 183 -- 191 [label="87: 0.17: 0.15"]; + 184 -- 190 [label="58: 0.17: 0.15"]; + 184 -- 191 [label="86: 0.17: 0.15"]; + 185 -- 190 [label="58: 0.17: 0.15"]; + 185 -- 191 [label="86: 0.17: 0.15"]; + 186 -- 190 [label="58: 0.17: 0.15"]; + 186 -- 191 [label="86: 0.17: 0.15"]; + 187 -- 188 [label="67: 0.15: 0.15"]; + 187 -- 190 [label="44: 0.15: 0.15"]; + 187 -- 191 [label="66: 0.15: 0.15"]; + 188 -- 189 [label="66: 0.15: 0.16"]; + 188 -- 190 [label="46: 0.15: 0.15"]; + 189 -- 190 [label="34: 0.16: 0.15"]; + 189 -- 191 [label="60: 0.16: 0.15"]; + 190 -- 191 [label="51: 0.15: 0.15"]; +} diff --git a/ecoPrimerCommands b/ecoPrimerCommands new file mode 100644 index 0000000..8ec7636 --- /dev/null +++ b/ecoPrimerCommands @@ -0,0 +1,15 @@ + + +./ecoPrimer -d /Groups/Barcode-Leca/eubacteria-gr -l 10 -L 1000 -e 3 > euBactResults.txt +./ecoPrimer -d ChloroDB/chloroplast -l 5 -L 120 -r 58023 -e 3 > chloroVascularPlantsEric.txt +./ecoPrimer -d /Users/tiayyba/Documents/Data/mitochondrion/mitochondrion -q 0.4 -s 0.5 -l 10 -L 60 -r 1 -i 1 -T 0.2 -p > setsRoot.txt + + + ./ecoPCR -d /Users/tiayyba/Documents/workspace/ecoPrimers/src/mitochondrion/mitochondrion -l 50 -L 120 -r 7742 TAGAACAGGCTCCTCTAG TTAGATACCCCACTATGC > 12SV5.ecoPCR + ecoTaxSpecificity -d /Users/tiayyba/Documents/workspace/ecoPrimers/src/mitochondrion/mitochondrion /Users/tiayyba/Documents/workspace/ecoPCR/src/12SV5.ecoPCR + + + + 149 ./ecoPrimer -d /Users/tiayyba/Documents/Data/mitochondrion/mitochondrion -r 40674 -E 9606 -l 10 -L 100 > MamalsNotHomoSapien.primers + 150 ./ecoPrimer -d /Users/tiayyba/Documents/Data/mitochondrion/mitochondrion -q 0.4 -s 0.5 -r 40674 -E 9606 -l 10 -L 100 > MamalsNotHomoSapien.primers + 151 ./ecoPrimer -d /Users/tiayyba/Documents/Data/mitochondrion/mitochondrion -q 0.5 -s 0.6 -r 40674 -E 9606 -l 10 -L 100 > MamalsNotHomoSapien1.primers diff --git a/src copy.zip b/src copy.zip new file mode 100644 index 0000000000000000000000000000000000000000..dd1a43cfdb3614c584ae8ce340c4ddf473d31670 GIT binary patch literal 513625 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®^D$IxwM}H$#8_Gu)*liWKi}*mh$EDw@FfT_ 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 eDh&Y)VnjI=m$VUp9645!Xm7oB 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⪙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⪚dx`z4Z0P~*zN1bA4XTLxM4d-oYRQe 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 literal 0 HcmV?d00001 diff --git a/src/.Rhistory b/src/.Rhistory new file mode 100644 index 0000000..4eaef7b --- /dev/null +++ b/src/.Rhistory @@ -0,0 +1,250 @@ +plot(s$seq, s$size, xlab="Sequence Count", ylab="Memory used[B]", main="a. memory used vs sequence count without data mining") +abline(v = 273, col = "Blue") +text(400, 0.7e+09, "nSeq = 273") +plot(t$seq, t$size, xlab="Sequence Count", ylab="Memory used[B]", main="b. memory used vs sequence count with data mining") +abline(v = 273, col = "Blue") +text(450, 700, "nSeq = 273") +plot(s$seq, s$time, xlab="Sequence Count", ylab="Time[s]", main="c. time vs sequence count withount data mining") +abline(v = 273, col = "Blue") +text(450, 300, "nSeq = 273") + plot(t$seq, t$time, xlab="Sequence Count", ylab="Time[s]", main="d. time vs sequence count with data mining") +abline(v = 273, col = "Blue") +text(350, 20, "nSeq = 273") +par(mfrow=c(2,2)) +plot(s$seq, s$size, xlab="Sequence Count", ylab="Memory used[B]", main="a. memory used vs sequence count without data mining") +abline(v = 273, col = "Blue") +text(400, 0.6e+09, "nSeq = 273") +plot(t$seq, t$size, xlab="Sequence Count", ylab="Memory used[B]", main="b. memory used vs sequence count with data mining") +abline(v = 273, col = "Blue") +text(400, 600, "nSeq = 273") +plot(s$seq, s$time, xlab="Sequence Count", ylab="Time[s]", main="c. time vs sequence count withount data mining") +abline(v = 273, col = "Blue") +text(400, 300, "nSeq = 273") + plot(t$seq, t$time, xlab="Sequence Count", ylab="Time[s]", main="d. time vs sequence count with data mining") +abline(v = 273, col = "Blue") +text(400, 15, "nSeq = 273") +par(mfrow=c(2,2)) +plot(s$seq, s$size, xlab="Sequence Count", ylab="Memory used[B]", main="a. memory used vs sequence count without data mining") +abline(v = 273, col = "Blue") +text(400, 0.6e+09, "Nseq = 273") +plot(t$seq, t$size, xlab="Sequence Count", ylab="Memory used[B]", main="b. memory used vs sequence count with data mining") +abline(v = 273, col = "Blue") +text(400, 600, "Nseq = 273") +plot(s$seq, s$time, xlab="Sequence Count", ylab="Time[s]", main="c. time vs sequence count withount data mining") +abline(v = 273, col = "Blue") +text(400, 300, "Nseq = 273") +plot(t$seq, t$time, xlab="Sequence Count", ylab="Time[s]", main="d. time vs sequence count with data mining") +abline(v = 273, col = "Blue") +text(400, 15, "Nseq = 273") +s = read.table('/Users/tiayyba/Desktop/euBact/ecoprimer_71493.log', header= T) +t = read.table('/Users/tiayyba/Desktop/euBact/ecoprimer_84784.log', header= T) +par(mfrow=c(2,2)) +plot(s$seq, s$size, xlab="Sequence Count", ylab="Memory used[B]", main="a. memory used vs sequence count without data mining") +plot(s$seq, s$size*1.5, xlab="Sequence Count", ylab="Memory used[B]", main="a. memory used vs sequence count without data mining") +abline(v = 273, col = "Blue") +text(450, 3e+09, "nSeq = 273") +plot(t$seq, t$size*1.5, xlab="Sequence Count", ylab="Memory used[B]", main="b. memory used vs sequence count with data mining") +abline(v = 273, col = "Blue") +text(450, 1150, "nSeq = 273") +par(mfrow=c(2,2)) +plot(s$seq, s$size*1.5, xlab="Sequence Count", ylab="Memory used[B]", main="a. memory used vs sequence count without data mining") +abline(v = 273, col = "Blue") +text(450, 3e+09, "nSeq = 273") +plot(t$seq, t$size*1.5, xlab="Sequence Count", ylab="Memory used[B]", main="b. memory used vs sequence count with data mining") + abline(v = 273, col = "Blue") +text(450, 1150, "nSeq = 273") +par(mfrow=c(2,2)) +plot(s$seq, s$size*1.5, xlab="Sequence Count", ylab="Memory used[B]", main="a. memory used vs sequence count without data mining") + abline(v = 273, col = "Blue") +text(450, 1.7e+09, "nSeq = 273") +par(mfrow=c(2,2)) +plot(s$seq, s$size*1.5, xlab="Sequence Count", ylab="Memory used[B]", main="a. memory used vs sequence count without data mining") + abline(v = 273, col = "Blue") +text(450, 1.4e+09, "nSeq = 273") +plot(t$seq, t$size*1.5, xlab="Sequence Count", ylab="Memory used[B]", main="b. memory used vs sequence count with data mining") + abline(v = 273, col = "Blue") +text(450, 500, "nSeq = 273") +par(mfrow=c(2,2)) +plot(s$seq, s$size*1.5, xlab="Sequence Count", ylab="Memory used[B]", main="a. memory used vs sequence count without data mining") +abline(v = 273, col = "Blue") +text(450, 1.4e+09, "nSeq = 273") +plot(t$seq, t$size*1.5, xlab="Sequence Count", ylab="Memory used[B]", main="b. memory used vs sequence count with data mining") +abline(v = 273, col = "Blue") +text(450, 500, "nSeq = 273") +text(450, 1000, "nSeq = 273") +par(mfrow=c(2,2)) +plot(s$seq, s$size*1.5, xlab="Sequence Count", ylab="Memory used[B]", main="a. memory used vs sequence count without data mining") +abline(v = 273, col = "Blue") +text(450, 1.3e+09, "nSeq = 273") +plot(t$seq, t$size*1.5, xlab="Sequence Count", ylab="Memory used[B]", main="b. memory used vs sequence count with data mining") +abline(v = 273, col = "Blue") +text(450, 1000, "nSeq = 273") +plot(s$seq, s$time, xlab="Sequence Count", ylab="Time[s]", main="c. time vs sequence count withount data mining") +abline(v = 273, col = "Blue") +text(450, 700, "nSeq = 273") + plot(t$seq, t$time, xlab="Sequence Count", ylab="Time[s]", main="d. time vs sequence count with data mining") +abline(v = 273, col = "Blue") +text(450, 30, "nSeq = 273") +s = read.table('/Users/tiayyba/Desktop/UsedistRef1.txt', header = T) +s +plot(s$Distance, s$Count) +plot(s$Distance, log(s$Count)) +plot(log(s$Distance), log(s$Count)) +plot(s$Distance, log(s$Count)) +s = read.table('/Users/tiayyba/Desktop/UU_results/UU_F83/plots/F83_distRef1.old.txt', header = T) +plot(s$Distance, log(s$Count)) +s = read.table('/Users/tiayyba/Desktop/UsedistRef1.txt', header = T) +plot(s$Distance*100, log(s$Count)) +s = read.table('/Users/tiayyba/Desktop/UU_results/UU_F83/plots/F83_distRef1.old.txt', header = T) +plot(s$Distance, log(s$Count)) +s = read.table('/Users/tiayyba/Desktop/UsedistRef1.txt', header = T) +plot(s$Distance, log(s$Count)) +s = read.table('/Users/tiayyba/Desktop/UU_results/UU_F83/plots/F83_distRef1.old.txt', header = T) +plot(s$Distance, log(s$Count)) +s = read.table('/Users/tiayyba/Desktop/UsedistRef1.txt', header = T) +plot(s$Distance, log(s$Count)) +plot(s$Distance*1000, log(s$Count)) +s = read.table('/Users/tiayyba/Desktop/UsedistRef1.txt', header = T) +plot(s$Distance*1000, log(s$Count)) +u = read.table('/Users/tiayyba/Desktop/UU_FdistRef2.txt', header = T) +u +max(u$Count) +max(u$Distance) +plot(u$Distance, u$Count) +plot(log(u$Distance), log(u$Count)) +plot(u$Distance, u$Count, log(xy)) +plot(u$Distance, u$Count, log=xy) +plot(u$Distance, u$Count, log='xy') +plot(u$Distance+1, u$Count, log='xy') +plot(u$Distance, u$Count, log='xy') +?plot +s = read.table('/Users/tiayyba/Desktop/UU_FdistRef1.txt', header = T) +plot(s$Distance, s$Count) +plot(log(s$Distance), log(s$Count)) +plot(s$Distance, s$Count, log='xy') +plot(s$Distance, log(s$Count)) +s = read.table('/Users/tiayyba/Desktop/ErrModel/Borneo/UnciaUncia/UU_F83/plots/F83_distRef1.old.txt', header = T) +s +sNew = s[order(s$Count),] +sNew +plot(s$Distance, s$Count) +s = read.table('/Users/tiayyba/Desktop/ErrModel/Borneo/UnciaUncia/UU_F83/plots/F83_distRef1.old.txt', header = T) +t = read.table('/Users/tiayyba/Desktop/ErrModel/Borneo/UnciaUncia/UU_F83/plots/F83_distRef2.old.txt', header = T) +s = read.table('/Users/tiayyba/Desktop/ErrModel/Borneo/UnciaUncia/UU_F83/plots/F83_distRef2.old.txt', header = T) +u = read.table('/Users/tiayyba/Desktop/ErrModel/Borneo/UnciaUncia/UU_F83/plots/F83_distRef1.old.txt', header = T) + t = data.frame(count=s$Count,uu=u$Distance,cs=s$Distance,col=(s$Distance < u$Distance)+1) +plot(s$Distance,s$Count,log='xy',col=t$col) + par(mfrow=c(1,2)) +plot(s$Distance+1,s$Count,log='xy',col=t$col) +plot(u$Distance+1,u$Count,log='xy',col=t$col) +s = read.table('/Users/tiayyba/Desktop/ErrModel/Borneo/UnciaUncia/UU_F83/plots/F83_distRef2.old.txt', header = T) +u = read.table('/Users/tiayyba/Desktop/ErrModel/Borneo/UnciaUncia/UU_F83/plots/F83_distRef1.old.txt', header = T) + t = data.frame(count=s$Count,uu=u$Distance,cs=s$Distance,col=(s$Distance < u$Distance)+1) +plot(u$Distance+1,u$Count,log='xy',col=t$col) + par(mfrow=c(1,2)) +plot(s$Distance+1,s$Count,log='xy',col=t$col) +plot(u$Distance+1,u$Count,log='xy',col=t$col) +s = read.table('/Users/tiayyba/Desktop/ErrModel/Borneo/UnciaUncia/UU_F82/plots/F82_distRef1.txt', header = F) +s = read.table('/Users/tiayyba/Desktop/ErrModel/Borneo/UnciaUncia/UU_F82/plots/F82_distRef1.txt', header = T) +s = read.table('/Users/tiayyba/Desktop/ErrModel/Borneo/UnciaUncia/UU_F82/plots/F82_distRef2.txt', header = T) +u = read.table('/Users/tiayyba/Desktop/ErrModel/Borneo/UnciaUncia/UU_F82/plots/F82_distRef1.txt', header = T) +t = data.frame(count=s$Count,uu=u$Distance,cs=s$Distance,col=(s$Distance < u$Distance)+1) +t = data.frame(count=u$Count,uu=u$Distance,cs=s$Distance,col=(s$Distance < u$Distance)+1) +s = read.table('/Users/tiayyba/Desktop/abc'header = F) +s = read.table('/Users/tiayyba/Desktop/abc', header = F) +plot(s) +s +s = read.table('/Users/tiayyba/Desktop/abc', header = F) +s +plot(s$V2, s$V1) +plot(s$V1, s$V2) +plot(s$V1, s$V2, xlab="sequence number", ylab="sequence count") +s = read.table('/Users/tiayyba/Desktop/abc', header = F) +s +s = read.table('/Users/tiayyba/Desktop/abc', header = F) +s +Sr tacg gcta ctag actg par(mfrow=c(2,2)) + plot(s$V1, s$V2, xlab="sequence number", ylab="sequence count", main = "sample: tacg") + plot(s$V1, s$V3, xlab="sequence number", ylab="sequence count", main = "sample: gcta") + plot(s$V1, s$V4, xlab="sequence number", ylab="sequence count", main = "sample: ctag") + plot(s$V1, s$V5, xlab="sequence number", ylab="sequence count", main = "sample: actg") +s = read.table('/Users/tiayyba/Desktop/abc', header = F) +s + plot(s$V1, s$V2, xlab="sequence number", ylab="sequence count", main = "sample: Ranunculus_acris") +Sr tacg gcta ctag actg par(mfrow=c(2,2)) + plot(s$V1, s$V2, xlab="sequence number", ylab="sequence count", main = "sample: Ranunculus_acris") + plot(s$V1, s$V3, xlab="sequence number", ylab="sequence count", main = "sample: Luzula_sudetica") + plot(s$V1, s$V4, xlab="sequence number", ylab="sequence count", main = "sample: Deschampsia_cespitosa") + plot(s$V1, s$V5, xlab="sequence number", ylab="sequence count", main = "sample: Cardamine_pratensis_paludosa") +s = read.table('/Users/tiayyba/Desktop/abc', header = F) +par(mfrow=c(2,2)) + plot(s$V1, s$V2, xlab="sequence number", ylab="sequence count", main = "sample 1: Ranunculus_acris") + plot(s$V1, s$V3, xlab="sequence number", ylab="sequence count", main = "sample 2: Luzula_sudetica") + plot(s$V1, s$V4, xlab="sequence number", ylab="sequence count", main = "sample 3: Deschampsia_cespitosa") + plot(s$V1, s$V5, xlab="sequence number", ylab="sequence count", main = "sample 4: Cardamine_pratensis_paludosa") +s = read.table('/Users/tiayyba/Desktop/ErrModel/Borneo/UnciaUncia/UU_F83/plots/F83_dist.txt', header = F) +s = read.table('/Users/tiayyba/Desktop/ErrModel/Borneo/UnciaUncia/UU_F83/plots/F83_dist.txt', header = F, row.names = 1) +s = read.table('/Users/tiayyba/Desktop/ErrModel/Borneo/UnciaUncia/UU_F83/plots/F83_dist.txt', header = F, row.names=1) +s = read.table('/Users/tiayyba/Desktop/ErrModel/Borneo/UnciaUncia/UU_F83/plots/F83_dist.txt',row.names=1) +s + plot(s$count, s$uu) + plot(s$uu, s$count) + plot(s$uu, s$count, col = s$col) + plot(s$cs, s$count, col = s$col) + plot(s$cs, s$count, col = s$col, col = (s$uu < s$cs) +1) + plot(s$uu, s$count) + plot(log(s$uu), log(s$count)) + plot(s$uu, log(s$count)) + plot(log(s$uu), log(s$count)) + plot(s$uu, s$count) + plot(s$uu, log(s$count)) + plot(s$uu, log(s$count), xlab = "distance from Uncia uncia", ylab = "log(SequenceCount)") += read.table('/Users/tiayyba/Desktop/ErrModel/Borneo/UnciaUncia/UU_F83/plots/F83_dist.txt', header = T) +s= read.table('/Users/tiayyba/Desktop/ErrModel/Borneo/UnciaUncia/UU_F83/plots/F83_dist.txt', header = T) +s +par(mfrow = c(1,2)) +plot(s$cs, s$count, col = s$col) +plot(s$cs, s$count,log = 'xy', col = s$col) +par(mfrow = c(1,2)) +plot(s$cs, s$count,log = 'xy', col = s$col) +plot(s$uu, s$count,log = 'xy', col = s$col) +score = (0.407)*0.890*exp(-sqrt(692.33/1.247)) +score +score1 = (0.511)*0.904*exp(-sqrt(481/148.5)) +score1 +score1 = sqrt(481/148.5) +score1 +score = sqrt(692.33/1.247) +score +score = (0.407)^2*0.890*sqrt(692.33/1.247) +score +score1 = (0.511)^2*0.904*sqrt(481/148.5) +score1 +score = (0.407)*0.890*sqrt(692.33/1.247) +score +score1 = (0.511)*0.904*sqrt(481/148.5) +score1 +score = (0.407)*0.890*692.33/sqrt(1.247) +score +score1 = (0.511)*0.904*481/sqrt(148.5) +score1 +sum = 714 + 710 + 699 +sum +2123/3 +1760+3210+4950+2090 +12010+3300+220 +4400+385+55+495+715+800+450+2200+1540+1210+550 +944 - 220 +724 - 40 +684 -10 +364-278 +944-657 +250+220 +7*9 +q +quit +s = read.table('metazoas_Mdyn_T50.gv') +s = read.table('metazoas_Mdyn_T50.gv.hist.gv') +t = read.table('test.gv') +hist(t$V3) +hist(s$V3) diff --git a/src/Documents/CalculTM.xls b/src/Documents/CalculTM.xls new file mode 100644 index 0000000000000000000000000000000000000000..094eb31189a8b9004c77d195be2a80a1abbb183c GIT binary patch literal 35840 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 literal 0 HcmV?d00001 diff --git a/src/Makefile b/src/Makefile new file mode 100644 index 0000000..2098184 --- /dev/null +++ b/src/Makefile @@ -0,0 +1,78 @@ +EXEC=ecoPrimers + +PRIMER_SRC= ecoprimer.c +PRIMER_OBJ= $(patsubst %.c,%.o,$(PRIMER_SRC)) + + +SRCS= $(PRIMER_SRC) + +LIB= -lecoprimer -lecoPCR -lthermo -lz -lm + +LIBFILE= libecoPCR/libecoPCR.a \ + libecoprimer/libecoprimer.a \ + libthermo/libthermo.a \ + + + +include global.mk + +all: $(EXEC) + + +######## +# +# ecoPrimer compilation +# +######## + +# executable compilation and link + +ecoPrimers: $(PRIMER_OBJ) $(LIBFILE) + $(CC) -g $(LDFLAGS) -O5 -m64 -o $@ $< $(LIBPATH) $(LIB) + + +######## +# +# library compilation +# +######## + +libecoPCR/libecoPCR.a: + $(MAKE) -C libecoPCR + +libecoprimer/libecoprimer.a: + $(MAKE) -C libecoprimer + +libthermo/libthermo.a: + $(MAKE) -C libthermo + +######## +# +# project management +# +######## + +clean: + rm -f *.o + rm -f $(EXEC) + $(MAKE) -C libecoPCR clean + $(MAKE) -C libecoprimer clean + $(MAKE) -C libthermo clean + + + +######## +# +# clean for k2 to remove .o and .P files +# +######## + +k2clean: + rm -f *.o + rm -f *.P + rm -f libecoPCR/*.o + rm -f libecoPCR/*.P + rm -f libecoprimer/*.o + rm -f libecoprimer/*.P + rm -f libthermo/*.o + rm -f libthermo/*.P diff --git a/src/ecoPrimers b/src/ecoPrimers new file mode 100755 index 0000000000000000000000000000000000000000..9bbb2ead2ba35e36e982529b1c89b44a68998abe GIT binary patch literal 162352 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 +#include +#include +#include +#include +#include +#include +#include +#include"libthermo/nnparams.h" +#include"libthermo/thermostats.h" + + +#define VERSION "0.3" + /* TR: by default, statistics are made on species level*/ +#define DEFAULTTAXONRANK "species" + +static int cmpprintedpairs(const void* p1,const void* p2); +//float _Z27calculateMeltingTemperature_ (char * seq1, char * seq2); +pwordcount_t reduce_words_to_debug (pwordcount_t words, poptions_t options); +void print_wordwith_positions (primer_t prm, uint32_t seqdbsize, poptions_t options); + +void* lib_handle = NULL; +float (*calcMelTemp)(char*, char*); + +/* ----------------------------------------------- */ +/* printout help */ +/* ----------------------------------------------- */ +#define PP fprintf(stdout, + +static void PrintHelp() +{ + PP "------------------------------------------\n"); + PP " ecoPrimer Version %s\n", VERSION); + PP "------------------------------------------\n"); + PP "synopsis : finding primers and measureing the quality of primers and barcode region\n"); + PP "usage: ./ecoPrimer [options] \n"); + PP "------------------------------------------\n"); + PP "options:\n"); + PP "-d : [D]atabase : to match the expected format, the database\n"); + PP " has to be formated first by the ecoPCRFormat.py program located.\n"); + PP " in the ecoPCR/tools directory.\n"); + PP " ecoPCRFormat.py creates three file types :\n"); + PP " .sdx : contains the sequences\n"); + PP " .tdx : contains information concerning the taxonomy\n"); + PP " .rdx : contains the taxonomy rank\n\n"); + PP " ecoPrimer needs all the file type. As a result, you have to write the\n"); + PP " database radical without any extension. For example /ecoPrimerDB/fstvert\n\n"); + PP "-e : [E]rror : max error allowed by oligonucleotide (0 by default)\n\n"); + PP "-h : [H]elp - print help\n\n"); + PP "-i : [I]gnore the given taxonomy id (define the counterexample taxon set).\n\n"); + PP "-l : minimum [L]ength : define the minimum amplication length. \n\n"); + PP "-L : maximum [L]ength : define the maximum amplicationlength. \n\n"); + PP "-r : [R]estricts the search to the given taxonomic id (restrict the example taxon set).\n\n"); + PP "-E : [E]xception taxid allows to indicate than some subclade of example sequences are conterexamples.\n\n"); + PP "-c : Consider that the database sequences are [c]ircular\n\n"); + PP "-3 : Three prime strict match\n\n"); + PP "-q : Strict matching [q]uorum, percentage of the sequences in which strict primers are found. By default it is 70\n\n"); + PP "-s : [S]ensitivity quorum\n\n"); + PP "-t : required [t]axon level for results, by default the results are computed at species level\n\n"); + PP "-x : false positive quorum\n\n"); + PP "-D : set in [d]ouble strand mode\n\n"); + PP "-O : set the primer length (default 18) \n\n"); + PP "-S : Set in [s]ingle strand mode\n\n"); + PP "-m : Salt correction method for Tm computation (SANTALUCIA : 1 or OWCZARZY:2, default=1)\n\n"); + PP "-a : Salt contentration in M for Tm computation (default 0.05 M)\n\n"); + PP "-U : No multi match\n\n"); + PP "-R : Define the [R]eference sequence identifier (must be part of example set)\n\n"); + PP "-A : Print the list of all identifier of sequences present in the database\n\n"); + PP "-f : Remove data mining step during strict primer identification\n\n"); + PP "-v : Store statistic file about memory usage during strict primer identification\n\n"); + PP "-p : Print sets of primers\n\n"); + PP "-T : Ignore pairs having specificity below this Threshold\n\n"); + PP "\n"); + PP "------------------------------------------\n"); + PP "Table result description : \n"); + PP "column 1 : serial number\n"); + PP "column 2 : primer1\n"); + PP "column 3 : primer2\n"); + PP "column 4 : primer1 Tm without mismatch\n"); + PP "column 5 : primer1 lowest Tm against exemple sequences\n"); + PP "column 6 : primer2 Tm without mismatch\n"); + PP "column 7 : primer2 lowest Tm against exemple sequences\n"); + PP "column 8 : primer1 G+C count\n"); + PP "column 9 : primer2 G+C count\n"); + PP "column 10 : good/bad\n"); + PP "column 11 : amplified example sequence count\n"); + PP "column 12 : amplified counterexample sequence count\n"); + PP "column 13 : yule\n"); + PP "column 14 : amplified example taxa count\n"); + PP "column 15 : amplified counterexample taxa count\n"); + PP "column 16 : ratio of amplified example taxa versus all example taxa (Bc index)\n"); + PP "column 17 : unambiguously identified example taxa count\n"); + PP "column 18 : ratio of specificity unambiguously identified example taxa versus all example taxa (Bs index)\n"); + PP "column 19 : minimum amplified length\n"); + PP "column 20 : maximum amplified length\n"); + PP "column 21 : average amplified length\n"); + PP "------------------------------------------\n"); + PP " http://www.grenoble.prabi.fr/trac/ecoPrimer/\n"); + PP "------------------------------------------\n\n"); + PP "\n"); + +} + +static void ExitUsage(int stat) +{ + PP "usage: ecoprimer [-d database] [-l value] [-L value] [-e value] [-r taxid] [-i taxid] [-R rank] [-t taxon level]\n"); + PP "type \"ecoprimer -h\" for help\n"); + + if (stat) + exit(stat); +} + +#undef PP + +void initoptions(poptions_t options) +{ + options->statistics=FALSE; + options->filtering=TRUE; + options->lmin=0; //< Amplifia minimal length + options->lmax=1000; //< Amplifia maximal length + options->error_max=3; //**< maximum error count in fuzzy search + options->primer_length=18; //**< minimal length of the primers + options->restricted_taxid=NULL; //**< limit amplification below these taxid + options->ignored_taxid=NULL; //**< no amplification below these taxid + options->exception_taxid=NULL; //**< no amplification below these taxid + options->prefix=NULL; + options->reference=NULL; + options->refseq=NULL; + options->circular=0; + options->doublestrand=1; + options->strict_quorum=0.7; + options->strict_exclude_quorum=0.1; + options->sensitivity_quorum=0.9; + options->false_positive_quorum=0.1; + options->strict_three_prime=0; + options->r=0; + options->g=0; + options->e=0; + options->no_multi_match=FALSE; + options->pnparm = NULL; + strcpy(options->taxonrank, DEFAULTTAXONRANK); /*taxon level for results, species by default*/ + options->saltmethod = SALT_METHOD_SANTALUCIA; + options->salt = DEF_SALT; + options->printAC=FALSE; + options->print_sets_of_primers = FALSE; + options->specificity_threshold = 0.6; + options->links_cnt = 1; + options->max_links_percent = -1; /*graph only those primers having maximum 15% links*/ + options->filter_on_links = TRUE; +} + +void printapair(int32_t index,ppair_t pair, poptions_t options) +{ + bool_t asdirect1=pair->asdirect1; + bool_t asdirect2=pair->asdirect2; + bool_t asdirecttmp; + word_t w1=pair->p1->word; + word_t w2=pair->p2->word; + word_t wtmp; + bool_t good1=pair->p1->good; + bool_t good2=pair->p2->good; + bool_t goodtmp; + bool_t strand; + uint32_t i, j; + float temp; + CNNParams nnparams; + + //nparam_InitParams(&nnparams, DEF_CONC_PRIMERS,DEF_CONC_SEQUENCES,DEF_SALT,SALT_METHOD_SANTALUCIA); + + char *c; + char p1[32]; + char p2[32]; + + if (!asdirect1) + w1=ecoComplementWord(w1,options->primer_length); + + if (!asdirect2) + w2=ecoComplementWord(w2,options->primer_length); + + + if (w2 < w1) + { + wtmp=w1; + w1=w2; + w2=wtmp; + + asdirecttmp=asdirect1; + asdirect1=asdirect2; + asdirect2=asdirecttmp; + + goodtmp=good1; + good1=good2; + good2=goodtmp; + } + + //print serial number + printf("%6d\t",index); + + c = ecoUnhashWord(w1,options->primer_length); + strcpy (p1, c); + c = ecoUnhashWord(w2,options->primer_length); + strcpy (p2, c); + + //print primer1 + printf("%s\t", p1); + + //print primer2 + printf("%s", p2); + + //print primer1 melting temperature + printf ("\t%3.1f", pair->p1temp); + + //print minimum melting temperature of approximate versions of primer1 + printf ("\t%3.1f", pair->p1mintemp); + + //print primer2 melting temperature + printf ("\t%3.1f", pair->p2temp); + + //print minimum melting temperature of approximate versions of primer2 + printf ("\t%3.1f", pair->p2mintemp); + + //print gc contents of primer1 + printf ("\t%d",nparam_CountGCContent(p1)); + + //print gc contents of primer2 + printf ("\t%d",nparam_CountGCContent(p2)); + + //print good/bad pair indicator + printf("\t%c%c", "bG"[(int)good1],"bG"[(int)good2]); + + //print inexample count + printf("\t%d", pair->inexample); + + //print out example count + printf("\t%d", pair->outexample); + + //print yule + printf("\t%4.3f", pair->yule); + + //print in taxa count + printf("\t%d", pair->intaxa); + + //print out taxa count + printf("\t%d", pair->outtaxa); + + //print coverage + printf("\t%4.3f", (float)pair->bc); + + //print well identified taxa count + printf("\t%d", pair->intaxa - pair->notwellidentifiedtaxa); + + //print specificity + printf("\t%4.3f", pair->bs); + + //print min amplifia lenght + printf("\t%d", pair->mind); + + //print max amplifia lenght + printf("\t%d", pair->maxd); + + //print average amplifia lenght + printf("\t%3.2f", (float)pair->sumd/pair->amplifiacount); + + //print amplifia information about reference sequence if specified + if (options->refseq && pair->refsequence >=0) + { + printf("\t%s:",options->reference); + strand = pair->pcr.amplifias[pair->refsequence].strand; + + if (strand) + printf("join("); + else + printf("complement("); + + printf("%d..%d,%d..%d",pair->pcr.amplifias[pair->refsequence].begin - options->primer_length + 1, + pair->pcr.amplifias[pair->refsequence].begin, + pair->pcr.amplifias[pair->refsequence].end + 2, + pair->pcr.amplifias[pair->refsequence].end + options->primer_length + 1 + ); + printf(")"); + printf("\t"); + + for (c=pair->pcr.amplifias[pair->refsequence].amplifia, + i=pair->pcr.amplifias[pair->refsequence].begin; + i<=pair->pcr.amplifias[pair->refsequence].end; + i++, + c+=(strand)? 1:-1) + printf("%c","acgt"[(strand)? (*c):(~*c)&3]); + + + } + else + printf("\t\t"); + +/* j=0; + for (i=0; idbsize; i++) + if (pair->wellIdentifiedSeqs[i] == 1) + j++; + printf("%d", j);*/ + + printf("\n"); + +} + +static int cmpprintedpairs(const void* p1,const void* p2) +{ + float s1,s2; + ppair_t pair1,pair2; + + pair1=*((ppair_t*)p1); + pair2=*((ppair_t*)p2); + + s1 = pair1->yule * pair1->bs; + s2 = pair2->yule * pair2->bs; + +// fprintf(stderr,"s1 : %4.3f %4.3f %4.3f\n",pair1->yule , pair1->bs,s1); +// fprintf(stderr,"s2 : %4.3f %4.3f %4.3f\n\n",pair2->yule , pair2->bs,s2); + + if (s1 > s2) return -1; + if (s1 < s2) return 1; + return 0; +} + +uint32_t filterandsortpairs(ppair_t* sortedpairs,uint32_t count, poptions_t options, pecodnadb_t seqdb) +{ + uint32_t i,j; + float q,qfp; + + for (i=0,j=0;i < count;i++) + { + if (options->insamples) + q = (float)sortedpairs[i]->inexample/options->insamples; + else q=1.0; + + if (options->outsamples) + qfp = (float)sortedpairs[i]->outexample/options->outsamples; + else qfp=0.0; + + sortedpairs[i]->wellIdentifiedSeqs = NULL; //TR 05/09/10 - wellIdentified needed for primer sets + sortedpairs[i]->coveredSeqs = NULL; //TR 05/09/10 - wellIdentified needed for primer sets + sortedpairs[i]->quorumin = q; + sortedpairs[i]->quorumout = qfp; + sortedpairs[i]->yule = q - qfp; + sortedpairs[j]=sortedpairs[i]; + + if (q > options->sensitivity_quorum && + qfp < options->false_positive_quorum) + { + //TR 05/09/10 - wellIdentified needed for primer sets + sortedpairs[j]->wellIdentifiedSeqs = ECOMALLOC(options->dbsize * sizeof(int),"Cannot allocate well_identified_array"); + sortedpairs[j]->coveredSeqs = ECOMALLOC(options->dbsize * sizeof(int),"Cannot allocate well_identified_array"); + (void)taxonomycoverage(sortedpairs[j],options, seqdb, options->dbsize); + taxonomyspecificity(sortedpairs[j], seqdb, options->dbsize); + //j++; + //if specificity less than user provieded threshold (default 60%) then ignore this pair + if (sortedpairs[j]->bs >= options->specificity_threshold) + j++; + } + + } + qsort(sortedpairs,j,sizeof(ppair_t),cmpprintedpairs); + return j; +} + + +void printpairs (ppairtree_t pairs, poptions_t options,ecotaxonomy_t *taxonomy, pecodnadb_t seqdb) +{ + ppair_t* sortedpairs; + ppair_t* index; + ppairlist_t pl; + size_t i,j; + size_t count; + char *taxon[]={"taxon","taxa"}; + ecotx_t *current_taxon; + //pairset pair_sets; + pairset *pset = NULL; + + //printf("Index\tPrimer1\tPrimer2\tGB\tInexampleCount\tOutexampleCount\tYule\tIntaxaCount\tOuttaxaCount\tCoverage\tSpecificity\tMinAmplifiedLength\tMaxAmplifiedLength\tAvgAmplifiedLength\n"); + + fprintf(stderr,"Total pair count : %d\n",pairs->count); + + sortedpairs = ECOMALLOC(pairs->count*sizeof(ppair_t),"Cannot Allocate ordered pairs"); + index=sortedpairs; + pl=pairs->first; + j=0; + while(pl->next) + { + for (i=0;ipaircount;i++,j++) + sortedpairs[j]=pl->pairs+i; + pl=pl->next; + } + + for (i=0;ipaircount;i++,j++) + sortedpairs[j]=pl->pairs+i; + + count=filterandsortpairs(sortedpairs,pairs->count,options, seqdb); + getThermoProperties(sortedpairs, count, options); + + fprintf(stderr,"Total good pair count : %u\n",(uint32_t)count); + + printf("#\n"); + printf("# ecoPrimer version %s\n",VERSION); + printf("# Rank level optimisation : %s\n", options->taxonrank); + printf("# max error count by oligonucleotide : %d\n",options->error_max); + printf("#\n"); + + if (options->r) + { + printf("# Restricted to %s:\n",taxon[(options->r>1) ? 1:0]); + for(i=0;i<(uint32_t)options->r;i++) + { + current_taxon=eco_findtaxonbytaxid(taxonomy,options->restricted_taxid[i]); + printf("# %d : %s (%s)\n", current_taxon->taxid, + current_taxon->name, + taxonomy->ranks->label[current_taxon->rank] + ); + } + printf("#\n"); + } + if (options->g) + { + printf("# Ignore %s:\n",taxon[(options->g>1) ? 1:0]); + for(i=0;i<(uint32_t)options->r;i++) + { + current_taxon=eco_findtaxonbytaxid(taxonomy,options->ignored_taxid[i]); + printf("# %d : %s (%s)\n", current_taxon->taxid, + current_taxon->name, + taxonomy->ranks->label[current_taxon->rank] + ); + } + printf("#\n"); + } + printf("# strict primer quorum : %3.2f\n",options->strict_quorum); + printf("# example quorum : %3.2f\n",options->sensitivity_quorum); + if (options->g + options->r) + printf("# counterexample quorum : %3.2f\n",options->false_positive_quorum); + + printf("#\n"); + printf("# database : %s\n",options->prefix); + printf("# Database is constituted of %5d examples corresponding to %5d %s\n",options->insamples, + options->intaxa,options->taxonrank); + printf("# and %5d counterexamples corresponding to %5d %s\n",options->outsamples, + options->outtaxa,options->taxonrank); + printf("#\n"); + + if (options->lmin && options->lmax) + printf("# amplifiat length between [%d,%d] bp\n",options->lmin,options->lmax); + else if (options->lmin) + printf("# amplifiat length larger than %d bp\n",options->lmin); + else if (options->lmax) + printf("# amplifiat length smaller than %d bp\n",options->lmax); + if (options->circular) + printf("# DB sequences are considered as circular\n"); + else + printf("# DB sequences are considered as linear\n"); + printf("# Pairs having specificity less than %0.2f will be ignored\n", options->specificity_threshold); + printf("#\n"); + + + for (i=0;i < count;i++) + printapair(i,sortedpairs[i],options); + + if (options->filter_on_links) + { + fprintf (stderr, "Old size: %d, ", count); + count = primers_changeSortedArray (&sortedpairs, count, options); + //count = primers_filterWithGivenLinks (&sortedpairs, count, options); + fprintf (stderr, "New size: %d\n", count); + + if (count == 0) + { + fprintf (stderr, "No pairs passed the links constraints.\n"); + printf ("No pairs passed the links constraints.\n"); + return; + } + + for (i=0;i < count;i++) + printapair(i,sortedpairs[i],options); + } + + if (options->print_sets_of_primers == TRUE) + { + /*pair_sets = build_primers_set (sortedpairs, count, seqdb, options); + printf("Results from Greedy Algorithm and some other possibilities:\n"); + some_other_set_possibilities (&pair_sets, sortedpairs, count, seqdb, options); + printf("Results from simulated Anealing:\n"); + sets_by_SimulatedAnealing (&pair_sets, sortedpairs, count, seqdb, options); + printf("Results from Tabu Search:\n"); + sets_by_TabuSearch (&pair_sets, sortedpairs, count, seqdb, options);*/ + //pset = sets_by_BruteForce (sortedpairs, count, seqdb, options); + //if (pset) + /*/{ + printf("Results from simulated Anealing:\n"); + sets_by_SimulatedAnealing (pset, sortedpairs, count, seqdb, options); + printf("Results from Tabu Search:\n"); + sets_by_TabuSearch (pset, sortedpairs, count, seqdb, options); + + if (pset) + { + ECOFREE (pset->set_wellIdentifiedTaxa, "Could not free memory for pair set wi"); + ECOFREE (pset, "Could not free memory for pair"); + } + }*/ + build_and_print_sets (sortedpairs, count, seqdb, options); + } + //primers_graph_graphviz (sortedpairs, count, options); +} + + +/*updateseqparams: This function counts the insample and outsample sequences + * and with each sequences adds a tag of the taxon to which the sequence beongs*/ + +void updateseqparams (pecodnadb_t seqdb, uint32_t seqdbsize, ecotaxonomy_t *taxonomy, + poptions_t options, int32_t *insamples, int32_t *outsamples) +{ + uint32_t i; + int32_t taxid; + ecotx_t *tmptaxon; + + for (i=0;iisexample=isExampleTaxon(taxonomy,seqdb[i]->taxid,options); + if (seqdb[i]->isexample) + (*insamples)++; + else + (*outsamples)++; + + taxid = taxonomy->taxons->taxon[seqdb[i]->taxid].taxid; + tmptaxon = eco_findtaxonbytaxid(taxonomy, taxid); + if (tmptaxon) + tmptaxon = eco_findtaxonatrank(tmptaxon, options->taxonrankidx); + if (tmptaxon) + seqdb[i]->ranktaxonid = tmptaxon->taxid; + } +} + +void setresulttaxonrank (ecotaxonomy_t *taxonomy, poptions_t options) +{ + int32_t i; + + /*set taxon rank for which result is to be given*/ + for (i = 0; i < taxonomy->ranks->count; i++) + { + if (strcmp(taxonomy->ranks->label[i], options->taxonrank) == 0) + { + options->taxonrankidx = i; + break; + } + } + + if (i == taxonomy->ranks->count) + { + fprintf(stderr,"\nUnknown taxon level: '%s'\n", options->taxonrank); + exit(0); + } +} +/* to get db stats, totals of species, genus etc....*/ + +static void printAC(pecodnadb_t seqdb,uint32_t seqdbsize) +{ + uint32_t i; + + for (i=0; i< seqdbsize;i++) + printf("%15s (%8d bp ): %s\n",seqdb[i]->AC,seqdb[i]->SQ_length,seqdb[i]->DE); +} + +int main(int argc, char **argv) +{ + pecodnadb_t seqdb; /* of type ecoseq_t */ + uint32_t seqdbsize=0; + ecotaxonomy_t *taxonomy; + + options_t options; + int carg; + int32_t errflag=0; + + int32_t insamples=0; + int32_t outsamples=0; + uint32_t i; + + pwordcount_t words; +// pwordcount_t words2; + pprimercount_t primers; + ppairtree_t pairs; + + int32_t rankdbstats = 0; + + CNNParams nnparams; + + initoptions(&options); + + while ((carg = getopt(argc, argv, "hAfvcUDSpbE:d:l:L:e:i:r:R:q:3:s:x:t:O:m:a:T:k:M:")) != -1) { + + switch (carg) { + /* ---------------------------- */ + case 'v': /* set in single strand mode */ + /* ---------------------------- */ + options.statistics=TRUE; + break; + + /* ---------------------------- */ + case 'f': /* set in single strand mode */ + /* ---------------------------- */ + options.filtering=FALSE; + break; + + /* ---------------------------- */ + case 'A': /* set in single strand mode */ + /* ---------------------------- */ + options.printAC=TRUE; + break; + + /* -------------------- */ + case 'd': /* database name */ + /* -------------------- */ + options.prefix = ECOMALLOC(strlen(optarg)+1, + "Error on prefix allocation"); + strcpy(options.prefix,optarg); + break; + + /* -------------------- */ + case 'h': /* help */ + /* -------------------- */ + PrintHelp(); + exit(0); + break; + + /* ------------------------- */ + case 'l': /* min amplification lenght */ + /* ------------------------- */ + sscanf(optarg,"%d",&(options.lmin)); + break; + + /* -------------------------- */ + case 'L': /* max amplification lenght */ + /* -------------------------- */ + sscanf(optarg,"%d",&(options.lmax)); + break; + + /* -------------------- */ + case 'e': /* error max */ + /* -------------------- */ + sscanf(optarg,"%d",&(options.error_max)); + break; + + + /* ------------------------ */ + case '3': /* three prime strict match */ + /* ------------------------ */ + sscanf(optarg,"%d",&(options.strict_three_prime)); + break; + + /* -------------------- */ + case 'q': /* strict matching quorum */ + /* -------------------- */ + sscanf(optarg,"%f",&(options.strict_quorum)); + break; + + /* -------------------- */ + case 's': /* strict matching quorum */ + /* -------------------- */ + sscanf(optarg,"%f",&(options.sensitivity_quorum)); + break; + + /* -------------------- */ + case 't': /* required taxon level for results */ + /* -------------------- */ + strncpy(options.taxonrank, optarg, 19); + options.taxonrank[19] = 0; + break; + + /* -------------------- */ + case 'x': /* strict matching quorum */ + /* -------------------- */ + sscanf(optarg,"%f",&(options.false_positive_quorum)); + break; + + /* ---------------------------- */ + case 'D': /* set in double strand mode */ + /* ---------------------------- */ + options.doublestrand=1; + break; + + /* ---------------------------- */ + case 'S': /* set in single strand mode */ + /* ---------------------------- */ + options.doublestrand=0; + break; + + /* ---------------------------- */ + case 'U': /* set in single strand mode */ + /* ---------------------------- */ + options.no_multi_match=TRUE; + break; + + /* ------------------------------------------ */ + case 'r': /* stores the restricting search taxonomic id */ + /* ------------------------------------------ */ + options.restricted_taxid = ECOREALLOC(options.restricted_taxid,sizeof(int32_t)*(options.r+1), + "Error on restricted_taxid reallocation"); + sscanf(optarg,"%d",&(options.restricted_taxid[options.r])); + options.r++; + break; + + /* ------------------------------------------ */ + case 'E': /* stores the restricting search taxonomic id */ + /* ------------------------------------------ */ + options.exception_taxid = ECOREALLOC(options.exception_taxid,sizeof(int32_t)*(options.e+1), + "Error on exception_taxid reallocation"); + sscanf(optarg,"%d",&(options.exception_taxid[options.e])); + options.e++; + break; + + /* -------------------- */ + case 'R': /* reference sequence */ + /* -------------------- */ + options.reference = ECOMALLOC(strlen(optarg)+1, + "Error on prefix allocation"); + strcpy(options.reference,optarg); + break; + + /* --------------------------------- */ + case 'i': /* stores the taxonomic id to ignore */ + /* --------------------------------- */ + options.ignored_taxid = ECOREALLOC(options.ignored_taxid,sizeof(int32_t)*(options.g+1), + "Error on excluded_taxid reallocation"); + sscanf(optarg,"%d",&(options.ignored_taxid[options.g])); + options.g++; + break; + + /* --------------------------------- */ + case 'O': /* set primer size */ + /* --------------------------------- */ + sscanf(optarg,"%d",&(options.primer_length)); + break; + + /* --------------------------------- */ + case 'm': /* set salt method */ + /* --------------------------------- */ + sscanf(optarg,"%d",&(options.saltmethod)); + break; + + /* --------------------------------- */ + case 'a': /* set salt */ + /* --------------------------------- */ + sscanf(optarg,"%f",&(options.salt)); + break; + + /* -------------------- */ + case 'c': /* sequences are circular */ + /* --------------------------------- */ + options.circular = 1; + break; + + /* -------------------- */ + case 'p': /* print sets of primers */ + /* --------------------------------- */ + options.print_sets_of_primers = TRUE; + break; + + /* --------------------------------- */ + case 'T': /* Ignore pairs having specificity below this Threshold */ + /* --------------------------------- */ + sscanf(optarg,"%f",&(options.specificity_threshold)); + break; + + /* --------------------------------- */ + case 'M': /* Max link percentage for graph */ + /* --------------------------------- */ + sscanf(optarg,"%f",&(options.max_links_percent)); + break; + + /* --------------------------------- */ + case 'k': /* links count */ + /* --------------------------------- */ + sscanf(optarg,"%d",&(options.links_cnt)); + break; + + case 'b': + options.filter_on_links = FALSE; + break; + + case '?': /* bad option */ + /* -------------------- */ + errflag++; + } + + } + options.pnparm = &nnparams; + if (options.saltmethod != 2) //if not SALT_METHOD_OWCZARZY + options.saltmethod = SALT_METHOD_SANTALUCIA; //then force SALT_METHOD_SANTALUCIA + + if (options.salt < 0.01 || options.salt > 0.3) //if salt value out of literature values + options.salt = DEF_SALT; //set to default + + nparam_InitParams(&nnparams, DEF_CONC_PRIMERS,DEF_CONC_SEQUENCES,options.salt,options.saltmethod); + + fprintf(stderr,"Reading taxonomy database ..."); + taxonomy = read_taxonomy(options.prefix,0); + fprintf(stderr,"Ok\n"); + + setresulttaxonrank(taxonomy, &options); /*TR: set rank level for statistics*/ + + fprintf(stderr,"Reading sequence database ...\n"); + + seqdb = readdnadb(options.prefix,taxonomy,&seqdbsize, &options); + + if (options.printAC) + { + printAC(seqdb,seqdbsize); + exit(0); + } + if (options.reference) + for (i=0; i < seqdbsize;i++) + if (strcmp(seqdb[i]->AC,options.reference)==0) + { + options.refseq=seqdb[i]; + options.refseqid=i; + fprintf(stderr,"Reference sequence %s identified\n",options.reference); + } + + fprintf(stderr,"Ok\n"); + fprintf(stderr,"Sequence read : %d\n",(int32_t)seqdbsize); + + updateseqparams(seqdb, seqdbsize, taxonomy, &options, &insamples , &outsamples); + options.dbsize=seqdbsize; + options.insamples=insamples; + options.outsamples=outsamples; + + rankdbstats = getrankdbstats(seqdb, seqdbsize, taxonomy, &options); + + fprintf(stderr,"Database is constituted of %5d examples corresponding to %5d %s\n",insamples, + options.intaxa,options.taxonrank); + fprintf(stderr," and %5d counterexamples corresponding to %5d %s\n",outsamples, + options.outtaxa,options.taxonrank); + fprintf(stderr,"Total distinct %s count %d\n",options.taxonrank, rankdbstats); + + fprintf(stderr,"\nIndexing words in sequences\n"); + + words = lookforStrictPrimer(seqdb,seqdbsize,insamples,&options); + fprintf(stderr,"\n Strict primer count : %d\n",words->size); + + /*/TR Testing + fprintf(stderr,"\nReducing for debugging\n"); + words = reduce_words_to_debug (words, &options); + ///*/ +// options.filtering=FALSE; +// words2= lookforStrictPrimer(seqdb,seqdbsize,insamples,&options); +// fprintf(stderr,"\n Strict primer count : %d\n",words2->size); +// +// fprintf(stderr,"\n\n Primer sample : \n"); +// for (i=0; isize; i++) +// fprintf(stderr," + Primer : %s sequence count : %d\n",ecoUnhashWord(words->words[i],options.primer_length),words->strictcount[i]); +// fprintf(stderr,"\n\n Primer sample : \n"); +// for (i=0; isize; i++) +// fprintf(stderr," + Primer : %s sequence count : %d\n",ecoUnhashWord(words2->words[i],options.primer_length),words2->strictcount[i]); + + if (options.no_multi_match) + { + (void)filterMultiStrictPrimer(words); + fprintf(stderr,"\n Strict primer with single match count : %d\n",words->size); + } + + + fprintf(stderr,"\n\n Primer sample : \n"); + for (i=0; isize); i++) + fprintf(stderr," + Primer : %s sequence count : %d\n",ecoUnhashWord(words->words[i],options.primer_length),words->strictcount[i]); + + fprintf(stderr,"\nEncoding sequences for fuzzy pattern matching...\n"); + for (i=0;istrictcount,"Free strict primer count table"); + + if (options.error_max == 0)//aho, if(options.error_max == 0 && 0) old + primers = ahoc_lookforStrictPrimers (seqdb,seqdbsize,insamples,words,&options); + else + primers = lookforAproxPrimer(seqdb,seqdbsize,insamples,words,&options); + + //for (i=0; isize; i++) + // print_wordwith_positions (primers->primers[i], seqdbsize, &options); + + ECOFREE(words->words,"Free strict primer table"); + ECOFREE(words,"Free strict primer structure"); + fprintf(stderr,"\n\n Approximate repeats :%d \n", primers->size); + + fprintf(stderr,"\n\n Primer sample : \n"); + for (i=0; isize); i++) + fprintf(stderr," + Primer : %s example sequence count : %5d counterexample sequence count : %5d status : %s\n",ecoUnhashWord(primers->primers[i].word,options.primer_length), + primers->primers[i].inexample, + primers->primers[i].outexample, + primers->primers[i].good ? "good":"bad"); + + fprintf(stderr,"\n"); + + + pairs = buildPrimerPairs(seqdb, seqdbsize, primers, &options); + printpairs (pairs, &options,taxonomy, seqdb); + + return 0; +} + +#define DEBUG_WORDS_CNT 14 +pwordcount_t reduce_words_to_debug (pwordcount_t words, poptions_t options) +{ + uint32_t i, k; + pwordcount_t new_words; + char *rwrd; + char dwrd[20]; + /*char *strict_words[DEBUG_WORDS_CNT] = {"GAGTCTCTGCACCTATCC", "GCAATCCTGAGCCAAATC", "ACCCCTAACCACAACTCA", + "TCCGAACCGACTGATGTT", "GAAGCTTGGGTGAAACTA", "GGAGAACCAGCTAGCTCT", "GCTGGTTCTCCCCGAAAT", + "TCGATTTGGTACCGCTCT", "AAAGGAGAGAGAGGGATT", "GGATTGCTAATCCGTTGT", "CCCCCATCGTCTCACTGG", + "TGAGGCGCAGCAGTTGAC", "GCGCTACGGCGCTGAAGT", "TTTCCTGGGAGTATGGCA"};*/ + char *strict_words[DEBUG_WORDS_CNT] = {"CTCCGGTCTGAACTCAGA", "TGTTGGATCAGGACATCC", "TAGATAGAAACCGACCTG", + "TGGTGCAGCCGCTATTAA", "AGATAGAAACTGACCTGG", "TGGTGCAGCCGCTATTAA", "CTAATGGTGCAGCCGCTA", + "TAGAAACTGACCTGGATT", "AGATAGAAACCGACCTGG", "ATGGTGCAGCCGCTATTA", "ATAGATAGAAACCGACCT", + "GCCGCTATTAAGGGTTCG", "GGTGCAGCCGCTATTAAG", "TAGAAACTGACCTGGATT"}; + int word_seen[DEBUG_WORDS_CNT]; + + + new_words = ECOMALLOC(sizeof(wordcount_t),"Cannot allocate memory for word count structure"); + new_words->inseqcount = words->inseqcount; + new_words->outseqcount = words->outseqcount; + new_words->size = DEBUG_WORDS_CNT; + new_words->strictcount = ECOMALLOC((new_words->size*sizeof(uint32_t)), "Cannot allocate memory for word count table"); + new_words->words = ECOMALLOC(new_words->size*sizeof(word_t), "I cannot allocate memory for debug words"); + + for (k = 0; k < DEBUG_WORDS_CNT; k++) + word_seen[k] = 0; + + for (i=0; i < words->size; i++) + { + rwrd = ecoUnhashWord(words->words[i],options->primer_length); + strcpy (dwrd, rwrd); + rwrd = ecoUnhashWord(ecoComplementWord(words->words[i],options->primer_length),options->primer_length); + for (k = 0; k < DEBUG_WORDS_CNT; k++) + { + if (strcmp (dwrd, strict_words[k]) == 0) break; + if (strcmp (rwrd, strict_words[k]) == 0) break; + } + + if (k < DEBUG_WORDS_CNT) + { + if (word_seen[k] == 0) + { + new_words->words[k] = words->words[i]; + new_words->strictcount[k] = words->strictcount[i]; + } + word_seen[k]++; + } + } + + fprintf (stderr, "Debug Words Info:\n"); + for (k = 0; k < DEBUG_WORDS_CNT; k++) + fprintf (stderr, "%s:%d\n", strict_words[k], word_seen[k]); + + + //clean input wods; + ECOFREE(words->words,"Clean word table"); + ECOFREE(words->strictcount,"Clean word count table"); + ECOFREE(words,"Clean word structure"); + + return new_words; +} + +void print_wordwith_positions (primer_t prm, uint32_t seqdbsize, poptions_t options) +{ + char *wrd; + uint32_t i, j; + char *twrd = "GCCTGTTTACCAAAAACA"; + + wrd = ecoUnhashWord(prm.word,options->primer_length); + + if (strcmp (twrd, wrd) == 0) + { + printf ("Positions for Word: %s\n", wrd); + for (i=0; i 0) + { + printf ("%d:", i); + if (prm.directCount[i] == 1) + printf ("%d", prm.directPos[i].value); + else + for (j=0; j 0) + { + printf ("%d:", i); + if (prm.reverseCount[i] == 1) + printf ("%d", prm.reversePos[i].value); + else + for (j=0; j $@; \ + rm -f $*.d; [ -s $@ ] || rm -f $@ + +include $(SRCS:.c=.P) diff --git a/src/libecoPCR/Makefile b/src/libecoPCR/Makefile new file mode 100644 index 0000000..e2c1e3e --- /dev/null +++ b/src/libecoPCR/Makefile @@ -0,0 +1,30 @@ + +SOURCES = ecodna.c \ + ecoError.c \ + ecoIOUtils.c \ + ecoMalloc.c \ + ecorank.c \ + ecoseq.c \ + ecotax.c \ + ecofilter.c \ + econame.c + +SRCS=$(SOURCES) + +OBJECTS= $(patsubst %.c,%.o,$(SOURCES)) + +LIBFILE= libecoPCR.a +RANLIB= ranlib + + +include ../global.mk + + +all: $(LIBFILE) + +clean: + rm -rf $(OBJECTS) $(LIBFILE) + +$(LIBFILE): $(OBJECTS) + ar -cr $@ $? + $(RANLIB) $@ diff --git a/src/libecoPCR/ecoError.c b/src/libecoPCR/ecoError.c new file mode 100644 index 0000000..00bbfa2 --- /dev/null +++ b/src/libecoPCR/ecoError.c @@ -0,0 +1,26 @@ +#include "ecoPCR.h" +#include +#include + +/* + * print the message given as argument and exit the program + * @param error error number + * @param message the text explaining what's going on + * @param filename the file source where the program failed + * @param linenumber the line where it has failed + * filename and linenumber are written at pre-processing + * time by a macro + */ +void ecoError(int32_t error, + const char* message, + const char * filename, + int linenumber) +{ + fprintf(stderr,"Error %d in file %s line %d : %s\n", + error, + filename, + linenumber, + message); + + abort(); +} diff --git a/src/libecoPCR/ecoIOUtils.c b/src/libecoPCR/ecoIOUtils.c new file mode 100644 index 0000000..73fb812 --- /dev/null +++ b/src/libecoPCR/ecoIOUtils.c @@ -0,0 +1,122 @@ +#include "ecoPCR.h" +#include +#include + +#define SWAPINT32(x) ((((x) << 24) & 0xFF000000) | (((x) << 8) & 0xFF0000) | \ + (((x) >> 8) & 0xFF00) | (((x) >> 24) & 0xFF)) + + +int32_t is_big_endian() +{ + int32_t i=1; + + return (int32_t)((char*)&i)[0]; +} + + + + +int32_t swap_int32_t(int32_t i) +{ + return SWAPINT32(i); +} + + +/** + * Read part of the file + * @param *f the database + * @param recordSize the size to be read + * + * @return buffer + */ +void *read_ecorecord(FILE *f,int32_t *recordSize) +{ + static void *buffer =NULL; + int32_t buffersize=0; + int32_t read; + + if (!recordSize) + ECOERROR(ECO_ASSERT_ERROR, + "recordSize cannot be NULL"); + + read = fread(recordSize, + 1, + sizeof(int32_t), + f); + + if (feof(f)) + return NULL; + + if (read != sizeof(int32_t)) + ECOERROR(ECO_IO_ERROR,"Reading record size error"); + + if (is_big_endian()) + *recordSize=swap_int32_t(*recordSize); + + if (buffersize < *recordSize) + { + if (buffer) + buffer = ECOREALLOC(buffer,*recordSize, + "Increase size of record buffer"); + else + buffer = ECOMALLOC(*recordSize, + "Allocate record buffer"); + } + + read = fread(buffer, + 1, + *recordSize, + f); + + if (read != *recordSize) + ECOERROR(ECO_IO_ERROR,"Reading record data error"); + + return buffer; +}; + + + + + +/** + * Open the database and check it's readable + * @param filename name of the database (.sdx, .rdx, .tbx) + * @param sequencecount buffer - pointer to variable storing the number of occurence + * @param abort_on_open_error boolean to define the behaviour in case of error + * while opening the database + * @return FILE type + **/ +FILE *open_ecorecorddb(const char *filename, + int32_t *sequencecount, + int32_t abort_on_open_error) +{ + FILE *f; + int32_t read; + + f = fopen(filename,"rb"); + + if (!f) + { + if (abort_on_open_error) + ECOERROR(ECO_IO_ERROR,"Cannot open file"); + else + { + *sequencecount=0; + return NULL; + } + } + + read = fread(sequencecount, + 1, + sizeof(int32_t), + f); + + if (read != sizeof(int32_t)) + ECOERROR(ECO_IO_ERROR,"Reading record size error"); + + if (is_big_endian()) + *sequencecount=swap_int32_t(*sequencecount); + + return f; +} + diff --git a/src/libecoPCR/ecoMalloc.c b/src/libecoPCR/ecoMalloc.c new file mode 100644 index 0000000..d44ce10 --- /dev/null +++ b/src/libecoPCR/ecoMalloc.c @@ -0,0 +1,96 @@ +#include "ecoPCR.h" +#include + +static int eco_log_malloc = 0; +static size_t eco_amount_malloc=0; +static size_t eco_chunk_malloc=0; + +void eco_trace_memory_allocation() +{ + eco_log_malloc=1; +} + +void eco_untrace_memory_allocation() +{ + eco_log_malloc=0; +} + +void ecoMallocedMemory() +{ + //eco_amount_malloc; +} + +void *eco_malloc(int64_t chunksize, + const char *error_message, + const char *filename, + int32_t line) +{ + void * chunk; + + chunk = calloc(1,chunksize); + + + if (!chunk) + ecoError(ECO_MEM_ERROR,error_message,filename,line); + + eco_chunk_malloc++; + + if (eco_log_malloc) + fprintf(stderr, + "Memory segment located at %p of size %d is allocated (file : %s [%d])", + chunk, + chunksize, + filename, + line); + + return chunk; +} + +void *eco_realloc(void *chunk, + int64_t newsize, + const char *error_message, + const char *filename, + int32_t line) +{ + void *newchunk; + + newchunk = realloc(chunk,newsize); + + + if (!newchunk) + { + ecoError(ECO_MEM_ERROR,error_message,filename,line); + fprintf(stderr,"Requested memory : %d\n",newsize); + } + if (!chunk) + eco_chunk_malloc++; + + if (eco_log_malloc) + fprintf(stderr, + "Old memory segment %p is reallocated at %p with a size of %d (file : %s [%d])", + chunk, + newchunk, + newsize, + filename, + line); + + return newchunk; +} + +void eco_free(void *chunk, + const char *error_message, + const char *filename, + int32_t line) +{ + free(chunk); + + if (eco_log_malloc) + fprintf(stderr, + "Memory segment %p is released => %s (file : %s [%d])", + chunk, + error_message, + filename, + line); + + eco_chunk_malloc--; +} diff --git a/src/libecoPCR/ecoPCR.h b/src/libecoPCR/ecoPCR.h new file mode 100644 index 0000000..237ec32 --- /dev/null +++ b/src/libecoPCR/ecoPCR.h @@ -0,0 +1,270 @@ +#ifndef ECOPCR_H_ +#define ECOPCR_H_ + +#include +#include + +/***************************************************** + * + * Data type declarations + * + *****************************************************/ + +/* + * + * Sequence types + * + */ + +typedef struct { + + int32_t taxid; + char AC[20]; + int32_t DE_length; + int32_t SQ_length; + int32_t CSQ_length; /*what is this CSQ_length ? */ + + char data[1]; + +} ecoseqformat_t; + +typedef struct { + int32_t taxid; + int32_t SQ_length; + int32_t isexample; + char *AC; + char *DE; + char *SQ; + + int32_t ranktaxonid;/*TR: taxon id to which the sequence belongs*/ +} ecoseq_t, *pecoseq_t; + +/* + * + * Taxonomy taxon types + * + */ + + +typedef struct { + int32_t taxid; + int32_t rank; + int32_t parent; + int32_t namelength; + char name[1]; + +} ecotxformat_t; + +typedef struct ecotxnode { + int32_t taxid; + int32_t rank; + struct ecotxnode *parent; + char *name; +} ecotx_t; + +typedef struct { + int32_t count; + ecotx_t taxon[1]; +} ecotxidx_t; + + +/* + * + * Taxonomy rank types + * + */ + +typedef struct { + int32_t count; + char* label[1]; +} ecorankidx_t; + +/* + * + * Taxonomy name types + * + */ + +typedef struct { + int32_t is_scientificname; + int32_t namelength; + int32_t classlength; + int32_t taxid; + char names[1]; +} econameformat_t; + + + typedef struct { + char *name; + char *classname; + int32_t is_scientificname; + struct ecotxnode *taxon; +} econame_t; + + +typedef struct { + int32_t count; + econame_t names[1]; +} econameidx_t; + + + typedef struct { + ecorankidx_t *ranks; + econameidx_t *names; + ecotxidx_t *taxons; +} ecotaxonomy_t; + + +/***************************************************** + * + * Function declarations + * + *****************************************************/ + +/* + * + * Low level system functions + * + */ + +int32_t is_big_endian(); +int32_t swap_int32_t(int32_t); + +void *eco_malloc(int64_t chunksize, + const char *error_message, + const char *filename, + int32_t line); + + +void *eco_realloc(void *chunk, + int64_t chunksize, + const char *error_message, + const char *filename, + int32_t line); + +void eco_free(void *chunk, + const char *error_message, + const char *filename, + int32_t line); + +void eco_trace_memory_allocation(); +void eco_untrace_memory_allocation(); + +#define ECOMALLOC(size,error_message) \ + eco_malloc((size),(error_message),__FILE__,__LINE__) + +#define ECOREALLOC(chunk,size,error_message) \ + eco_realloc((chunk),(size),(error_message),__FILE__,__LINE__) + +#define ECOFREE(chunk,error_message) \ + eco_free((chunk),(error_message),__FILE__,__LINE__) + + + + +/* + * + * Error managment + * + */ + + +void ecoError(int32_t,const char*,const char *,int); + +#define ECOERROR(code,message) ecoError((code),(message),__FILE__,__LINE__) + +#define ECO_IO_ERROR (1) +#define ECO_MEM_ERROR (2) +#define ECO_ASSERT_ERROR (3) +#define ECO_NOTFOUND_ERROR (4) + + +/* + * + * Low level Disk access functions + * + */ + +FILE *open_ecorecorddb(const char *filename, + int32_t *sequencecount, + int32_t abort_on_open_error); + +void *read_ecorecord(FILE *,int32_t *recordSize); + + + +/* + * Read function in internal binary format + */ + +FILE *open_ecoseqdb(const char *filename, + int32_t *sequencecount); + +ecoseq_t *readnext_ecoseq(FILE *); + +ecorankidx_t *read_rankidx(const char *filename); + +econameidx_t *read_nameidx(const char *filename,ecotaxonomy_t *taxonomy); + + + + /** + * Read taxonomy data as formated by the ecoPCRFormat.py script. + * + * This function is normaly uses internaly by the read_taxonomy + * function and should not be called directly. + * + * @arg filename path to the *.tdx file of the reformated db + * + * @return pointer to a taxonomy index structure + */ + +ecotxidx_t *read_taxonomyidx(const char *filename); + +ecotaxonomy_t *read_taxonomy(const char *prefix,int32_t readAlternativeName); + +ecotx_t *eco_findtaxonbytaxid(ecotaxonomy_t *taxonomy, int32_t taxid); + +ecotx_t *eco_findtaxonatrank(ecotx_t *taxon, int32_t rankidx); + +int eco_isundertaxon(ecotx_t *taxon, int other_taxid); + +ecoseq_t *ecoseq_iterator(const char *prefix); + + + +ecoseq_t *new_ecoseq(); +int32_t delete_ecoseq(ecoseq_t *); +ecoseq_t *new_ecoseq_with_data( char *AC, + char *DE, + char *SQ, + int32_t taxid + ); + + +int32_t delete_taxon(ecotx_t *taxon); +int32_t delete_taxonomy(ecotxidx_t *index); + + +int32_t rank_index(const char* label,ecorankidx_t* ranks); + +//int32_t delete_apatseq(SeqPtr pseq); +//PatternPtr buildPattern(const char *pat, int32_t error_max); +//PatternPtr complementPattern(PatternPtr pat); +// +//SeqPtr ecoseq2apatseq(ecoseq_t *in,SeqPtr out,int32_t circular); + +char *ecoComplementPattern(char *nucAcSeq); +char *ecoComplementSequence(char *nucAcSeq); +char *getSubSequence(char* nucAcSeq,int32_t begin,int32_t end); + +ecotx_t *eco_getspecies(ecotx_t *taxon,ecotaxonomy_t *taxonomy); +ecotx_t *eco_getgenus(ecotx_t *taxon,ecotaxonomy_t *taxonomy); +ecotx_t *eco_getfamily(ecotx_t *taxon,ecotaxonomy_t *taxonomy); +ecotx_t *eco_getkingdom(ecotx_t *taxon,ecotaxonomy_t *taxonomy); +ecotx_t *eco_getsuperkingdom(ecotx_t *taxon,ecotaxonomy_t *taxonomy); + +int eco_is_taxid_ignored(int32_t *ignored_taxid, int32_t tab_len, int32_t taxid); +int eco_is_taxid_included(ecotaxonomy_t *taxonomy, int32_t *included_taxid, int32_t tab_len, int32_t taxid); + +#endif /*ECOPCR_H_*/ diff --git a/src/libecoPCR/ecoapat.c b/src/libecoPCR/ecoapat.c new file mode 100644 index 0000000..284e579 --- /dev/null +++ b/src/libecoPCR/ecoapat.c @@ -0,0 +1,202 @@ +#include "../libapat/libstki.h" +#include "../libapat/apat.h" + +#include "ecoPCR.h" + +#include + +static void EncodeSequence(SeqPtr seq); +static void UpperSequence(char *seq); + +/* -------------------------------------------- */ +/* uppercase sequence */ +/* -------------------------------------------- */ + +#define IS_LOWER(c) (((c) >= 'a') && ((c) <= 'z')) +#define TO_UPPER(c) ((c) - 'a' + 'A') + +void UpperSequence(char *seq) +{ + char *cseq; + + for (cseq = seq ; *cseq ; cseq++) + if (IS_LOWER(*cseq)) + *cseq = TO_UPPER(*cseq); +} + +#undef IS_LOWER +#undef TO_UPPER + + + + +/* -------------------------------------------- */ +/* encode sequence */ +/* IS_UPPER is slightly faster than isupper */ +/* -------------------------------------------- */ + +#define IS_UPPER(c) (((c) >= 'A') && ((c) <= 'Z')) + + + +void EncodeSequence(SeqPtr seq) +{ + int i; + UInt8 *data; + char *cseq; + + data = seq->data; + cseq = seq->cseq; + + while (*cseq) { + + *data = (IS_UPPER(*cseq) ? *cseq - 'A' : 0x0); + data++; + cseq++; + } + + for (i=0,cseq=seq->cseq;i < seq->circular; i++,cseq++,data++) + *data = (IS_UPPER(*cseq) ? *cseq - 'A' : 0x0); + + for (i = 0 ; i < MAX_PATTERN ; i++) + seq->hitpos[i]->top = seq->hiterr[i]->top = 0; + +} + +#undef IS_UPPER + + +SeqPtr ecoseq2apatseq(ecoseq_t *in,SeqPtr out,int32_t circular) +{ + int i; + + if (!out) + { + out = ECOMALLOC(sizeof(Seq), + "Error in Allocation of a new Seq structure"); + + for (i = 0 ; i < MAX_PATTERN ; i++) + { + + if (! (out->hitpos[i] = NewStacki(kMinStackiSize))) + ECOERROR(ECO_MEM_ERROR,"Error in hit stack Allocation"); + + if (! (out->hiterr[i] = NewStacki(kMinStackiSize))) + ECOERROR(ECO_MEM_ERROR,"Error in error stack Allocation"); + } + } + + + out->name = in->AC; + out->seqsiz = out->seqlen = in->SQ_length; + out->circular = circular; + + if (!out->data) + { + out->data = ECOMALLOC((out->seqlen+circular) *sizeof(UInt8), + "Error in Allocation of a new Seq data member"); + out->datsiz= out->seqlen+circular; + } + else if ((out->seqlen +circular) >= out->datsiz) + { + out->data = ECOREALLOC(out->data,(out->seqlen+circular), + "Error during Seq data buffer realloc"); + out->datsiz= out->seqlen+circular; + } + + out->cseq = in->SQ; + + EncodeSequence(out); + + return out; +} + +int32_t delete_apatseq(SeqPtr pseq) +{ + int i; + + if (pseq) { + + if (pseq->data) + ECOFREE(pseq->data,"Freeing sequence data buffer"); + + for (i = 0 ; i < MAX_PATTERN ; i++) { + if (pseq->hitpos[i]) FreeStacki(pseq->hitpos[i]); + if (pseq->hiterr[i]) FreeStacki(pseq->hiterr[i]); + } + + ECOFREE(pseq,"Freeing apat sequence structure"); + + return 0; + } + + return 1; +} + +/* + +PatternPtr buildPattern(const char *pat, int32_t error_max) +{ + PatternPtr pattern; + int32_t patlen; + + pattern = ECOMALLOC(sizeof(Pattern), + "Error in pattern allocation"); + + pattern->ok = Vrai; + pattern->hasIndel= Faux; + pattern->maxerr = error_max; + patlen = strlen(pat); + + pattern->cpat = ECOMALLOC(sizeof(char)*patlen+1, + "Error in sequence pattern allocation"); + + strncpy(pattern->cpat,pat,patlen); + pattern->cpat[patlen]=0; + UpperSequence(pattern->cpat); + + if (!CheckPattern(pattern)) + ECOERROR(ECO_ASSERT_ERROR,"Error in pattern checking"); + + if (! EncodePattern(pattern, dna)) + ECOERROR(ECO_ASSERT_ERROR,"Error in pattern encoding"); + + if (! CreateS(pattern, ALPHA_LEN)) + ECOERROR(ECO_ASSERT_ERROR,"Error in pattern compiling"); + + return pattern; + +} + +PatternPtr complementPattern(PatternPtr pat) +{ + PatternPtr pattern; + + pattern = ECOMALLOC(sizeof(Pattern), + "Error in pattern allocation"); + + pattern->ok = Vrai; + pattern->hasIndel= pat->hasIndel; + pattern->maxerr = pat->maxerr; + pattern->patlen = pat->patlen; + + pattern->cpat = ECOMALLOC(sizeof(char)*(strlen(pat->cpat)+1), + "Error in sequence pattern allocation"); + + strcpy(pattern->cpat,pat->cpat); + + ecoComplementPattern(pattern->cpat); + + if (!CheckPattern(pattern)) + ECOERROR(ECO_ASSERT_ERROR,"Error in pattern checking"); + + if (! EncodePattern(pattern, dna)) + ECOERROR(ECO_ASSERT_ERROR,"Error in pattern encoding"); + + if (! CreateS(pattern, ALPHA_LEN)) + ECOERROR(ECO_ASSERT_ERROR,"Error in pattern compiling"); + + return pattern; + +} +*/ diff --git a/src/libecoPCR/ecodna.c b/src/libecoPCR/ecodna.c new file mode 100644 index 0000000..7d29a0e --- /dev/null +++ b/src/libecoPCR/ecodna.c @@ -0,0 +1,153 @@ +#include +#include "ecoPCR.h" + +/* + * @doc: DNA alphabet (IUPAC) + */ +#define LX_BIO_DNA_ALPHA "ABCDEFGHIJKLMNOPQRSTUVWXYZ#![]" + +/* + * @doc: complementary DNA alphabet (IUPAC) + */ +#define LX_BIO_CDNA_ALPHA "TVGHEFCDIJMLKNOPQYSAABWXRZ#!][" + + +static char sNuc[] = LX_BIO_DNA_ALPHA; +static char sAnuc[] = LX_BIO_CDNA_ALPHA; + +static char LXBioBaseComplement(char nucAc); +static char *LXBioSeqComplement(char *nucAcSeq); +static char *reverseSequence(char *str,char isPattern); + + +/* ---------------------------- */ + +char LXBioBaseComplement(char nucAc) +{ + char *c; + + if ((c = strchr(sNuc, nucAc))) + return sAnuc[(c - sNuc)]; + else + return nucAc; +} + +/* ---------------------------- */ + +char *LXBioSeqComplement(char *nucAcSeq) +{ + char *s; + + for (s = nucAcSeq ; *s ; s++) + *s = LXBioBaseComplement(*s); + + return nucAcSeq; +} + + +char *reverseSequence(char *str,char isPattern) +{ + char *sb, *se, c; + + if (! str) + return str; + + sb = str; + se = str + strlen(str) - 1; + + while(sb <= se) { + c = *sb; + *sb++ = *se; + *se-- = c; + } + + sb = str; + se = str + strlen(str) - 1; + + if (isPattern) + for (;sb < se; sb++) + { + if (*sb=='#') + { + if (((se - sb) > 2) && (*(sb+2)=='!')) + { + *sb='!'; + sb+=2; + *sb='#'; + } + else + { + *sb=*(sb+1); + sb++; + *sb='#'; + } + } + else if (*sb=='!') + { + *sb=*(sb-1); + *(sb-1)='!'; + } + } + + return str; +} + +char *ecoComplementPattern(char *nucAcSeq) +{ + return reverseSequence(LXBioSeqComplement(nucAcSeq),1); +} + +char *ecoComplementSequence(char *nucAcSeq) +{ + return reverseSequence(LXBioSeqComplement(nucAcSeq),0); +} + + +char *getSubSequence(char* nucAcSeq,int32_t begin,int32_t end) +{ + static char *buffer = NULL; + static int32_t buffSize= 0; + int32_t length; + + if (begin < end) + { + length = end - begin; + + if (length >= buffSize) + { + buffSize = length+1; + if (buffer) + buffer=ECOREALLOC(buffer,buffSize, + "Error in reallocating sub sequence buffer"); + else + buffer=ECOMALLOC(buffSize, + "Error in allocating sub sequence buffer"); + + } + + strncpy(buffer,nucAcSeq + begin,length); + buffer[length]=0; + } + else + { + length = end + strlen(nucAcSeq) - begin; + + if (length >= buffSize) + { + buffSize = length+1; + if (buffer) + buffer=ECOREALLOC(buffer,buffSize, + "Error in reallocating sub sequence buffer"); + else + buffer=ECOMALLOC(buffSize, + "Error in allocating sub sequence buffer"); + + } + strncpy(buffer,nucAcSeq+begin,length - end); + strncpy(buffer+(length-end),nucAcSeq ,end); + buffer[length]=0; + } + + return buffer; +} + diff --git a/src/libecoPCR/ecofilter.c b/src/libecoPCR/ecofilter.c new file mode 100644 index 0000000..8c737c6 --- /dev/null +++ b/src/libecoPCR/ecofilter.c @@ -0,0 +1,20 @@ +#include "ecoPCR.h" + +int eco_is_taxid_included( ecotaxonomy_t *taxonomy, + int32_t *restricted_taxid, + int32_t tab_len, + int32_t taxid) +{ + int i; + ecotx_t *taxon; + + taxon = eco_findtaxonbytaxid(taxonomy, taxid); + + for (i=0; i < tab_len; i++) + if ( (taxon->taxid == restricted_taxid[i]) || + (eco_isundertaxon(taxon, restricted_taxid[i])) ) + return 1; + + return 0; +} + diff --git a/src/libecoPCR/econame.c b/src/libecoPCR/econame.c new file mode 100644 index 0000000..835d79c --- /dev/null +++ b/src/libecoPCR/econame.c @@ -0,0 +1,61 @@ +#include "ecoPCR.h" +#include +#include + +static econame_t *readnext_econame(FILE *f,econame_t *name,ecotaxonomy_t *taxonomy); + +econameidx_t *read_nameidx(const char *filename,ecotaxonomy_t *taxonomy) +{ + + int32_t count; + FILE *f; + econameidx_t *indexname; + int32_t i; + + f = open_ecorecorddb(filename,&count,1); + + indexname = (econameidx_t*) ECOMALLOC(sizeof(econameidx_t) + sizeof(econame_t) * (count-1),"Allocate names"); + + indexname->count=count; + + for (i=0; i < count; i++){ + readnext_econame(f,(indexname->names)+i,taxonomy); + } + + return indexname; +} + +econame_t *readnext_econame(FILE *f,econame_t *name,ecotaxonomy_t *taxonomy) +{ + + econameformat_t *raw; + int32_t rs; + + raw = read_ecorecord(f,&rs); + + if (!raw) + return NULL; + + if (is_big_endian()) + { + raw->is_scientificname = swap_int32_t(raw->is_scientificname); + raw->namelength = swap_int32_t(raw->namelength); + raw->classlength = swap_int32_t(raw->classlength); + raw->taxid = swap_int32_t(raw->taxid); + } + + name->is_scientificname=raw->is_scientificname; + + name->name = ECOMALLOC((raw->namelength+1) * sizeof(char),"Allocate name"); + strncpy(name->name,raw->names,raw->namelength); + name->name[raw->namelength]=0; + + name->classname = ECOMALLOC((raw->classlength+1) * sizeof(char),"Allocate classname"); + strncpy(name->classname,(raw->names+raw->namelength),raw->classlength); + name->classname[raw->classlength]=0; + + name->taxon = taxonomy->taxons->taxon + raw->taxid; + + return name; +} + diff --git a/src/libecoPCR/ecorank.c b/src/libecoPCR/ecorank.c new file mode 100644 index 0000000..4796088 --- /dev/null +++ b/src/libecoPCR/ecorank.c @@ -0,0 +1,52 @@ +#include "ecoPCR.h" +#include +#include + +static int compareRankLabel(const void *label1, const void *label2); + +ecorankidx_t *read_rankidx(const char *filename) +{ + int32_t count; + FILE *f; + ecorankidx_t *index; + int32_t i; + int32_t rs; + char *buffer; + + f = open_ecorecorddb(filename,&count,1); + + index = (ecorankidx_t*) ECOMALLOC(sizeof(ecorankidx_t) + sizeof(char*) * (count-1), + "Allocate rank index"); + + index->count=count; + + for (i=0; i < count; i++) + { + buffer = read_ecorecord(f,&rs); + index->label[i]=(char*) ECOMALLOC(rs+1, + "Allocate rank label"); + strncpy(index->label[i],buffer,rs); + } + + return index; +} + +int32_t rank_index(const char* label,ecorankidx_t* ranks) +{ + char **rep; + + rep = bsearch(label,ranks->label,ranks->count,sizeof(char*),compareRankLabel); + + if (rep) + return rep-ranks->label; + else + ECOERROR(ECO_NOTFOUND_ERROR,"Rank label not found"); + + return -1; +} + + +int compareRankLabel(const void *label1, const void *label2) +{ + return strcmp((const char*)label1,*(const char**)label2); +} diff --git a/src/libecoPCR/ecoseq.c b/src/libecoPCR/ecoseq.c new file mode 100644 index 0000000..1368be9 --- /dev/null +++ b/src/libecoPCR/ecoseq.c @@ -0,0 +1,233 @@ +#include "ecoPCR.h" +#include +#include +#include +#include +#include + +static FILE *open_seqfile(const char *prefix,int32_t index); + + +ecoseq_t *new_ecoseq() +{ + void *tmp; + + tmp = ECOMALLOC(sizeof(ecoseq_t),"Allocate new ecoseq structure"); + + return tmp; +} + +int32_t delete_ecoseq(ecoseq_t * seq) +{ + + if (seq) + { + if (seq->AC) + ECOFREE(seq->AC,"Free sequence AC"); + + if (seq->DE) + ECOFREE(seq->DE,"Free sequence DE"); + + if (seq->SQ) + ECOFREE(seq->SQ,"Free sequence SQ"); + + ECOFREE(seq,"Free sequence structure"); + + return 0; + + } + + return 1; +} + +ecoseq_t *new_ecoseq_with_data( char *AC, + char *DE, + char *SQ, + int32_t taxid_idx + ) +{ + ecoseq_t *tmp; + int32_t lstr; + tmp = new_ecoseq(); + + tmp->taxid=taxid_idx; + + if (AC) + { + lstr =strlen(AC); + tmp->AC=ECOMALLOC((lstr+1) * sizeof(char), + "Allocate sequence accession"); + strcpy(tmp->AC,AC); + } + + if (DE) + { + lstr =strlen(DE); + tmp->DE=ECOMALLOC((lstr+1) * sizeof(char), + "Allocate sequence definition"); + strcpy(tmp->DE,DE); + } + + if (SQ) + { + lstr =strlen(SQ); + tmp->SQ=ECOMALLOC((lstr+1) * sizeof(char), + "Allocate sequence data"); + strcpy(tmp->SQ,SQ); + } + + tmp->isexample=1; + + return tmp; + +} + +/** + * ?? used ?? + **/ +FILE *open_ecoseqdb(const char *filename, + int32_t *sequencecount) +{ + return open_ecorecorddb(filename,sequencecount,1); +} + +ecoseq_t *readnext_ecoseq(FILE *f) +{ + char *compressed=NULL; + + ecoseqformat_t *raw; + ecoseq_t *seq; + int32_t comp_status; + unsigned long int seqlength; + int32_t rs; + char *c; + int32_t i; + + raw = read_ecorecord(f,&rs); + + if (!raw) + return NULL; + + if (is_big_endian()) + { + raw->CSQ_length = swap_int32_t(raw->CSQ_length); + raw->DE_length = swap_int32_t(raw->DE_length); + raw->SQ_length = swap_int32_t(raw->SQ_length); + raw->taxid = swap_int32_t(raw->taxid); + } + + seq = new_ecoseq(); + + seq->taxid = raw->taxid; + + seq->AC = ECOMALLOC(strlen(raw->AC) +1, + "Allocate Sequence Accesion number"); + strncpy(seq->AC,raw->AC,strlen(raw->AC)); + + + seq->DE = ECOMALLOC(raw->DE_length+1, + "Allocate Sequence definition"); + strncpy(seq->DE,raw->data,raw->DE_length); + + seqlength = seq->SQ_length = raw->SQ_length; + + compressed = raw->data + raw->DE_length; + + seq->SQ = ECOMALLOC(seqlength+1, + "Allocate sequence buffer"); + + seq->isexample=1; + + comp_status = uncompress((unsigned char*)seq->SQ, + &seqlength, + (unsigned char*)compressed, + raw->CSQ_length); + + if (comp_status != Z_OK) + ECOERROR(ECO_IO_ERROR,"I cannot uncompress sequence data"); + + for (c=seq->SQ,i=0;iDE,seq->SQ_length); + return seq; +} + +/** + * Open the sequences database (.sdx file) + * @param prefix name of the database (radical without extension) + * @param index integer + * + * @return file object + */ +FILE *open_seqfile(const char *prefix,int32_t index) +{ + char filename_buffer[1024]; + int32_t filename_length; + FILE *input; + int32_t seqcount; + + filename_length = snprintf(filename_buffer, + 1023, + "%s_%03d.sdx", + prefix, + index); + + + + if (filename_length >= 1024) + ECOERROR(ECO_ASSERT_ERROR,"file name is too long"); + + filename_buffer[filename_length]=0; + + input=open_ecorecorddb(filename_buffer,&seqcount,0); + + if (input) + fprintf(stderr,"# Reading file %s containing %d sequences...\n", + filename_buffer, + seqcount); + + return input; +} + +ecoseq_t *ecoseq_iterator(const char *prefix) +{ + static FILE *current_seq_file= NULL; + static int32_t current_file_idx = 1; + static char current_prefix[1024]; + ecoseq_t *seq; + + if (prefix) + { + current_file_idx = 1; + + if (current_seq_file) + fclose(current_seq_file); + + strncpy(current_prefix,prefix,1023); + current_prefix[1024]=0; + + current_seq_file = open_seqfile(current_prefix, + current_file_idx); + + if (!current_seq_file) + return NULL; + + } + + seq = readnext_ecoseq(current_seq_file); + + if (!seq && feof(current_seq_file)) + { + current_file_idx++; + fclose(current_seq_file); + current_seq_file = open_seqfile(current_prefix, + current_file_idx); + + + if (current_seq_file) + seq = readnext_ecoseq(current_seq_file); + } + + return seq; +} diff --git a/src/libecoPCR/ecotax.c b/src/libecoPCR/ecotax.c new file mode 100644 index 0000000..a0ade86 --- /dev/null +++ b/src/libecoPCR/ecotax.c @@ -0,0 +1,329 @@ +#include "ecoPCR.h" +#include +#include +#include + +static ecotx_t *readnext_ecotaxon(FILE *f,ecotx_t *taxon); + + /** + * Open the taxonomy database + * @param pointer to the database (.tdx file) + * @return a ecotxidx_t structure + */ +ecotxidx_t *read_taxonomyidx(const char *filename) +{ + int32_t count; + FILE *f; + ecotxidx_t *index; + int32_t i; + + f = open_ecorecorddb(filename,&count,1); + + index = (ecotxidx_t*) ECOMALLOC(sizeof(ecotxidx_t) + sizeof(ecotx_t) * (count-1), + "Allocate taxonomy"); + + index->count=count; + for (i=0; i < count; i++){ + readnext_ecotaxon(f,&(index->taxon[i])); + index->taxon[i].parent=index->taxon + (size_t)index->taxon[i].parent; + } + return index; +} + + +int32_t delete_taxonomy(ecotxidx_t *index) +{ + int32_t i; + + if (index) + { + for (i=0; i< index->count; i++) + if (index->taxon[i].name) + ECOFREE(index->taxon[i].name,"Free scientific name"); + + ECOFREE(index,"Free Taxonomy"); + + return 0; + } + + return 1; +} + + + +int32_t delete_taxon(ecotx_t *taxon) +{ + if (taxon) + { + if (taxon->name) + ECOFREE(taxon->name,"Free scientific name"); + + ECOFREE(taxon,"Free Taxon"); + + return 0; + } + + return 1; +} + + +/** + * Read the database for a given taxon a save the data + * into the taxon structure(if any found) + * @param *f pointer to FILE type returned by fopen + * @param *taxon pointer to the structure + * + * @return a ecotx_t structure if any taxon found else NULL + */ +ecotx_t *readnext_ecotaxon(FILE *f,ecotx_t *taxon) +{ + + ecotxformat_t *raw; + int32_t rs; + + raw = read_ecorecord(f,&rs); + + if (!raw) + return NULL; + + if (is_big_endian()) + { + raw->namelength = swap_int32_t(raw->namelength); + raw->parent = swap_int32_t(raw->parent); + raw->rank = swap_int32_t(raw->rank); + raw->taxid = swap_int32_t(raw->taxid); + } + + taxon->parent = (ecotx_t*)(size_t)raw->parent; + taxon->taxid = raw->taxid; + taxon->rank = raw->rank; + + taxon->name = ECOMALLOC((raw->namelength+1) * sizeof(char), + "Allocate taxon scientific name"); + + strncpy(taxon->name,raw->name,raw->namelength); + + return taxon; +} + + +ecotaxonomy_t *read_taxonomy(const char *prefix,int32_t readAlternativeName) +{ + ecotaxonomy_t *tax; + char *filename; + int buffsize; + + tax = ECOMALLOC(sizeof(ecotaxonomy_t), + "Allocate taxonomy structure"); + + buffsize = strlen(prefix)+10; + + filename = ECOMALLOC(buffsize, + "Allocate filename"); + + snprintf(filename,buffsize,"%s.rdx",prefix); + + tax->ranks = read_rankidx(filename); + + snprintf(filename,buffsize,"%s.tdx",prefix); + + tax->taxons = read_taxonomyidx(filename); + + if (readAlternativeName) + { + snprintf(filename,buffsize,"%s.ndx",prefix); + tax->names=read_nameidx(filename,tax); + } + else + tax->names=NULL; + return tax; + +} + + + +int32_t delete_ecotaxonomy(ecotaxonomy_t *taxonomy) +{ + if (taxonomy) + { + if (taxonomy->ranks) + ECOFREE(taxonomy->ranks,"Free rank index"); + + if (taxonomy->taxons) + ECOFREE(taxonomy->taxons,"Free taxon index"); + + ECOFREE(taxonomy,"Free taxonomy structure"); + + return 0; + } + + return 1; +} + +ecotx_t *eco_findtaxonatrank(ecotx_t *taxon, + int32_t rankidx) +{ + ecotx_t *current_taxon; + ecotx_t *next_taxon; + + current_taxon = taxon; + next_taxon = current_taxon->parent; + + while ((current_taxon!=next_taxon) && // I' am the root node + (current_taxon->rank!=rankidx)) + { + current_taxon = next_taxon; + next_taxon = current_taxon->parent; + } + + if (current_taxon->rank==rankidx) + return current_taxon; + else + return NULL; +} + +/** + * Get back information concerning a taxon from a taxonomic id + * @param *taxonomy the taxonomy database + * @param taxid the taxonomic id + * + * @result a ecotx_t structure containing the taxonimic information + **/ +ecotx_t *eco_findtaxonbytaxid(ecotaxonomy_t *taxonomy, + int32_t taxid) +{ + ecotx_t *current_taxon; + int32_t taxoncount; + int32_t i; + + taxoncount=taxonomy->taxons->count; + + for (current_taxon=taxonomy->taxons->taxon, + i=0; + i < taxoncount; + i++, + current_taxon++){ + if (current_taxon->taxid==taxid){ + return current_taxon; + } + } + + return (ecotx_t*)NULL; +} + +/** + * Find out if taxon is son of other taxon (identified by its taxid) + * @param *taxon son taxon + * @param parent_taxid taxonomic id of the other taxon + * + * @return 1 is the other taxid math a parent taxid, else 0 + **/ +int eco_isundertaxon(ecotx_t *taxon, + int other_taxid) +{ + ecotx_t *next_parent; + + next_parent = taxon->parent; + + while ( (other_taxid != next_parent->taxid) && + (strcmp(next_parent->name, "root")) ) + { + next_parent = next_parent->parent; + } + + if (other_taxid == next_parent->taxid) + return 1; + else + return 0; +} + +ecotx_t *eco_getspecies(ecotx_t *taxon, + ecotaxonomy_t *taxonomy) +{ + static ecotaxonomy_t *tax=NULL; + static int32_t rankindex=-1; + + if (taxonomy && tax!=taxonomy) + { + rankindex = rank_index("species",taxonomy->ranks); + tax=taxonomy; + } + + if (!tax || rankindex < 0) + ECOERROR(ECO_ASSERT_ERROR,"No taxonomy defined"); + + return eco_findtaxonatrank(taxon,rankindex); +} + +ecotx_t *eco_getgenus(ecotx_t *taxon, + ecotaxonomy_t *taxonomy) +{ + static ecotaxonomy_t *tax=NULL; + static int32_t rankindex=-1; + + if (taxonomy && tax!=taxonomy) + { + rankindex = rank_index("genus",taxonomy->ranks); + tax=taxonomy; + } + + if (!tax || rankindex < 0) + ECOERROR(ECO_ASSERT_ERROR,"No taxonomy defined"); + + return eco_findtaxonatrank(taxon,rankindex); +} + + +ecotx_t *eco_getfamily(ecotx_t *taxon, + ecotaxonomy_t *taxonomy) +{ + static ecotaxonomy_t *tax=NULL; + static int32_t rankindex=-1; + + if (taxonomy && tax!=taxonomy) + { + rankindex = rank_index("family",taxonomy->ranks); + tax=taxonomy; + } + + if (!tax || rankindex < 0) + ECOERROR(ECO_ASSERT_ERROR,"No taxonomy defined"); + + return eco_findtaxonatrank(taxon,rankindex); +} + +ecotx_t *eco_getkingdom(ecotx_t *taxon, + ecotaxonomy_t *taxonomy) +{ + static ecotaxonomy_t *tax=NULL; + static int32_t rankindex=-1; + + if (taxonomy && tax!=taxonomy) + { + rankindex = rank_index("kingdom",taxonomy->ranks); + tax=taxonomy; + } + + if (!tax || rankindex < 0) + ECOERROR(ECO_ASSERT_ERROR,"No taxonomy defined"); + + return eco_findtaxonatrank(taxon,rankindex); +} + +ecotx_t *eco_getsuperkingdom(ecotx_t *taxon, + ecotaxonomy_t *taxonomy) +{ + static ecotaxonomy_t *tax=NULL; + static int32_t rankindex=-1; + + if (taxonomy && tax!=taxonomy) + { + rankindex = rank_index("superkingdom",taxonomy->ranks); + tax=taxonomy; + } + + if (!tax || rankindex < 0) + ECOERROR(ECO_ASSERT_ERROR,"No taxonomy defined"); + + return eco_findtaxonatrank(taxon,rankindex); +} diff --git a/src/libecoprimer/Makefile b/src/libecoprimer/Makefile new file mode 100644 index 0000000..878ea1b --- /dev/null +++ b/src/libecoprimer/Makefile @@ -0,0 +1,39 @@ + +SOURCES = goodtaxon.c \ + readdnadb.c \ + smothsort.c \ + sortword.c \ + hashsequence.c \ + strictprimers.c \ + aproxpattern.c \ + merge.c \ + queue.c \ + libstki.c \ + sortmatch.c \ + pairtree.c \ + pairs.c \ + taxstats.c \ + apat_search.c \ + filtering.c \ + PrimerSets.c \ + ahocorasick.c + +SRCS=$(SOURCES) + +OBJECTS= $(patsubst %.c,%.o,$(SOURCES)) + +LIBFILE= libecoprimer.a +RANLIB= ranlib + + +include ../global.mk + + +all: $(LIBFILE) + +clean: + rm -rf $(OBJECTS) $(LIBFILE) + +$(LIBFILE): $(OBJECTS) + ar -cr $@ $? + $(RANLIB) $@ diff --git a/src/libecoprimer/PrimerSets.c b/src/libecoprimer/PrimerSets.c new file mode 100644 index 0000000..ae4d957 --- /dev/null +++ b/src/libecoprimer/PrimerSets.c @@ -0,0 +1,1770 @@ +#include +#include +#include + +//#include "ecoprimer.h" +#include "PrimerSets.h" + +int TabuList[PRIMERS_IN_SET_COUNT]; +int next_tabu_slot = -1; +int total_pairs = -1; +//int32_t total_wi = -1; + +int32_t counttaxon(int32_t taxid); +int find_in_tabu (int index); + +int32_t count_taxons (int32_t taxid) +{ + static int32_t count = 0; + static int32_t slots = 0; + static int32_t *taxon_array = NULL; + int32_t i; + + if (taxid == -1) + { + if (taxon_array) + ECOFREE (taxon_array, "Could not free memory for taxon array"); + taxon_array = NULL; + slots = 0; + count = 0; + } + else + { + for (i = 0; i < count; i++) + { + if (taxid == taxon_array[i]) return count; + } + + if (count == slots) + { + slots += 500; + + if (taxon_array == NULL) + { + taxon_array = (int32_t *) ECOMALLOC(slots*sizeof (int32_t), + "Could not allocate memory for taxon array"); + } + else + taxon_array = (int32_t *) ECOREALLOC(taxon_array, slots*sizeof (int32_t), + "Could not reallocate memory for taxon array"); + } + taxon_array[count] = taxid; + count++; + } + return count; +} + +float get_set_coverage (pairset *p_set, SetParams *pparams, int32_t pidx_toexclude) +{ + int32_t i, j; + float cov; + int32_t s_intaxa = 0; + int32_t seqcount; + + //counttaxon(-1); + count_taxons (-1); + for (i = 0; i < PRIMERS_IN_SET_COUNT; i++) + { + if (p_set->set_pairs[i] == -1 || pidx_toexclude == i) continue; + + seqcount=pparams->sortedpairs[p_set->set_pairs[i]]->pcr.ampcount; + for (j=0; j < seqcount; j++) + if (pparams->sortedpairs[p_set->set_pairs[i]]->pcr.amplifias[j].sequence->isexample + && pparams->sortedpairs[p_set->set_pairs[i]]->pcr.amplifias[j].sequence->ranktaxonid > 0 ) + s_intaxa = count_taxons(pparams->sortedpairs[p_set->set_pairs[i]]->pcr.amplifias[j].sequence->ranktaxonid); + + } + //fprintf(stderr, "%d/%d\n", s_intaxa, pparams->options->intaxa); + p_set->set_intaxa = s_intaxa; + cov = s_intaxa*1.0/(pparams->options->intaxa*1.0); + count_taxons (-1); + return cov; +} + +void set_cov_spc (pairset *p_set, SetParams *pparams) +{ + int32_t i; + int32_t ssp = 0; + + count_taxons (-1); + for (i = 0; i < pparams->options->dbsize; i++) + if (p_set->set_wellIdentifiedTaxa[i] == 1) + ssp = count_taxons (pparams->seqdb[i]->ranktaxonid); + + //set coverage + p_set->set_coverage = get_set_coverage (p_set, pparams, -1); + + //set specificity + p_set->set_specificity = ((float)ssp)/((float)p_set->set_intaxa); + p_set->set_wi_cnt = ssp; + count_taxons (-1); +} + +//currently used only to open dead lock +void tabu_aspiration (pairset *pair_set) +{ + int i; + int count = 0; + + for (i=0; iset_pairs[i] != -1) + count++; + if (TabuList[i] != -1) + count++; + } + + if (count == total_pairs) + for (i=0; iset_pairs[i] == id) return 0; + + for (i = 0; i < PRIMERS_IN_SET_COUNT; i++) + if (pair_set->set_pairs[i] != -1) secnt++; + + //if (secnt == PRIMERS_IN_SET_COUNT) return 0; + if (secnt == 0) return 1; + + lnk_prcnt = 1.0; + if (secnt > pparams->options->links_cnt) + lnk_prcnt = (pparams->options->links_cnt*1.0)/(secnt*1.0); + + //TR 6/2/11: new elements must have some links with atleast one elem of set + if (get_links_distribution (id, pair_set, pparams) < lnk_prcnt) return 0; + + //if in tabu search search tabu list as well + if (next_tabu_slot != -1) + { + //effency_switch is only there to avoid tabu_aspiration execution + //each time + effency_switch++; + if ((effency_switch%5) == 0) + { + effency_switch=1; + tabu_aspiration(pair_set); + } + + i = find_in_tabu (id); + if (i != -1) return 0; + } + return 1; +} + +pairset build_primers_set_greedy_cov (SetParams *params) +{ + pairset pair_set; + int32_t i; + int32_t pset_idx; + int32_t prb_idx; + + memset (&pair_set, 0, sizeof(pairset)); + pair_set.set_wellIdentifiedTaxa = (int *) ECOMALLOC(params->options->dbsize*sizeof (int), + "Could not allocate memory for pair set"); + + for (i = 0; i < PRIMERS_IN_SET_COUNT; i++) + pair_set.set_pairs[i] = -1; + + pset_idx = 0; + prb_idx = 0; + //add first pair by default, this should be the one having highiest specificty + add_pair_in_set (&pair_set, pset_idx, prb_idx, params); + pset_idx++; + + while (pset_idx < PRIMERS_IN_SET_COUNT) + { + if (pair_set.set_coverage == 1.0) break; + prb_idx = get_next_option_increasing_cov (&pair_set, params); + if (prb_idx == 0) break; + add_pair_in_set (&pair_set, pset_idx, prb_idx, params); + pset_idx++; + } + //get_set_mean_cov_stats (&pair_set, ¶ms); + reset_set_props (&pair_set, params); + + return pair_set; +} + +int32_t get_next_option_increasing_cov (pairset *pair_set, SetParams *pparams) +{ + float ini_set_cov; + float set_cov; + float cov_diff = 0.; + int32_t i, id_slot = -1, max_id = 0; + + //coverage already 1, dont proceed. + if (pair_set->set_coverage == 1.0) return 0; + + //find next available slot in the set + for (i = 0; i < PRIMERS_IN_SET_COUNT; i++) + if (pair_set->set_pairs[i] == -1) + { + id_slot = i; + break; + } + //set already full + if (id_slot == -1) return 0; + //save original set coverage + ini_set_cov = pair_set->set_coverage; + for (i = 1; i < pparams->sorted_count; i++) + { + if (ok_to_add (i, pair_set, pparams) == 0) continue; + pair_set->set_pairs[id_slot] = i; + set_cov = get_set_coverage (pair_set, pparams, -1); + if ((set_cov - ini_set_cov) > cov_diff) + { + cov_diff = set_cov - ini_set_cov; + max_id = i; + } + } + pair_set->set_pairs[id_slot] = -1; + return max_id; +} + + +//1. Add in set the first pair having highiest specificity +//2. For the sequences not WI by primers in set, calculate count for each pair equal to number of seqs WI by it +//3. Take the pair with highiest such count and see its links with primers already in set, +//4. If no/insufficient links, take next pair else add pair in set +//5. repeate 3,4 untill pair gets added in set +//6. Repeate 2 to 5 until set completes + +pairset build_primers_set_greedy_spc (SetParams *params) +{ + pairset pair_set; + int32_t i; + int32_t pset_idx; + int32_t prb_idx; + int *pair_wi_count_sorted_ids; + + memset (&pair_set, 0, sizeof(pairset)); + pair_set.set_wellIdentifiedTaxa = (int *) ECOMALLOC(params->options->dbsize*sizeof (int), + "Could not allocate memory for pair set"); + + pair_wi_count_sorted_ids = (int *) ECOMALLOC(params->sorted_count*sizeof (int), + "Could not allocate memory for pair_wi_count_sorted"); + + for (i = 0; i < PRIMERS_IN_SET_COUNT; i++) + pair_set.set_pairs[i] = -1; + + pset_idx = 0; + prb_idx = 0; + //add first pair by default, this should be the one having highiest specificty + add_pair_in_set (&pair_set, pset_idx, prb_idx, params); + pset_idx++; + + while (pset_idx < PRIMERS_IN_SET_COUNT) + { + //get a sorted list of pair ids with the pair well identifying most of the remaining seqs at top + get_next_pair_options (pair_wi_count_sorted_ids, &pair_set, params); + + if (pair_wi_count_sorted_ids[0] == 0) + { + fprintf (stderr, "No further pair found, total so far %d\n", pset_idx); + break; + } + + for (prb_idx = 0; prb_idx < params->sorted_count; prb_idx++) + { + if (pair_wi_count_sorted_ids[prb_idx]) + if (ok_to_add (pair_wi_count_sorted_ids[prb_idx], &pair_set, params)) + { + //fprintf (stderr, "Oktoadd\n"); + add_pair_in_set (&pair_set, pset_idx, pair_wi_count_sorted_ids[prb_idx], params); + pset_idx++; + } + if (pset_idx == PRIMERS_IN_SET_COUNT) break; + } + + if (prb_idx == params->sorted_count) + { + fprintf (stderr, "No further pair found, total so far %d\n", pset_idx); + break; + } + + if (pair_set.set_specificity == 1.0) + { + fprintf (stderr, "Set Complete with total primers: %d\n", pset_idx); + break; + } + + } + //get_set_mean_cov_stats (&pair_set, ¶ms); + reset_set_props (&pair_set, params); + return pair_set; +} + +float get_links_distribution (int prb_idx, pairset *pair_set, SetParams *pparams) +{ + int i, j; + int *pair_link_count; + int *pwi; + int *pswi; + float pcnt = 0.0; + float pscnt = 0.0; + + pair_link_count = (int *) ECOMALLOC(PRIMERS_IN_SET_COUNT*sizeof (int), + "Could not allocate memory for pair_link_count"); + + pwi = pparams->sortedpairs[prb_idx]->wellIdentifiedSeqs; + //fprintf(stderr, "a,"); + for (i = 0; i < PRIMERS_IN_SET_COUNT; i++) + { + pair_link_count[i] = 0; + if (pair_set->set_pairs[i] != -1) + { + //fprintf(stderr, "b,"); + pswi = pparams->sortedpairs[pair_set->set_pairs[i]]->wellIdentifiedSeqs; + for (j = 0; j < pparams->options->dbsize; j++) + if (pwi[j] == 1 && pwi[j] == pswi[j]) + pair_link_count[i] += 1; + } + } + //fprintf(stderr, "c,"); + for (i = 0; i < PRIMERS_IN_SET_COUNT; i++) + { + if (pair_set->set_pairs[i] != -1) + pscnt++; + if (pair_link_count[i] > 0) + pcnt++; + } + ECOFREE (pair_link_count, "Could not free memory for pair_link_count"); + //fprintf(stderr, "d,"); + return (pcnt/pscnt); +} + + +void get_next_pair_options (int *pair_wi_count_sorted_ids, pairset *pair_set, SetParams *pparams) +{ + int *pair_count; + int32_t i, j; + int max; + int tmp; + + pair_count = (int *) ECOMALLOC(pparams->sorted_count*sizeof (int), + "Could not allocate memory for pair_count"); + + memset (pair_wi_count_sorted_ids, 0, pparams->sorted_count*sizeof(int)); + + for (i = 0; i < pparams->options->dbsize; i++) + { + if (pair_set->set_wellIdentifiedTaxa[i] == 1) continue; + + for (j = 0; j < pparams->sorted_count; j++) + { + if (pparams->sortedpairs[j]->wellIdentifiedSeqs[i] == 1) + pair_count[j] += 1; + } + } + + //set pair ids + for (j = 0; j < pparams->sorted_count; j++) + pair_wi_count_sorted_ids[j] = j; + + //set count of primers already in set to zero (it should already be zero) just for testing + for (i = 0; i < PRIMERS_IN_SET_COUNT; i++) + if (pair_set->set_pairs[i] != -1) + pair_count[pair_set->set_pairs[i]] = 0; + + //sort two arrays in descending wrt count + for (i = 0; i < pparams->sorted_count - 1; i++) + { + max = i; + for (j = i + 1; j < pparams->sorted_count; j++) + if (pair_count[max] < pair_count[j]) + max = j; + + if (max > i) + { + tmp = pair_count[i]; + pair_count[i] = pair_count[max]; + pair_count[max] = tmp; + + tmp = pair_wi_count_sorted_ids[i]; + pair_wi_count_sorted_ids[i] = pair_wi_count_sorted_ids[max]; + pair_wi_count_sorted_ids[max] = tmp; + } + } + + for (i = 0; i < pparams->sorted_count - 1; i++) + if (pair_count[i] == 0) + pair_wi_count_sorted_ids[i] = 0; + //else + // fprintf (stderr, "%d:%d, ", i, pair_count[i]); + + ECOFREE (pair_count, "Could not free memory for pair_count"); +} + +void add_pair_in_set (pairset *pair_set, int32_t pset_idx, int32_t prb_idx, SetParams *pparams) +{ + int *pwi; + int32_t i; + + if (prb_idx < 0 || prb_idx >= pparams->sorted_count) return; + pair_set->set_pairs[pset_idx] = prb_idx; + +// fprintf (stderr, "%d:", prb_idx); + //fprintf (stderr, "%d:", pparams->sortedpairs[prb_idx]); + //fprintf (stderr, "%d:", pparams->sortedpairs[prb_idx]->wellIdentifiedSeqs); + //fprintf (stderr, "%d:%d, ", i, pair_count[i]); + + pwi = pparams->sortedpairs[prb_idx]->wellIdentifiedSeqs; + for (i = 0; i < pparams->options->dbsize; i++) + if (pwi[i] == 1) + pair_set->set_wellIdentifiedTaxa[i] = 1; + + set_cov_spc (pair_set, pparams); +} + +int isthisset (pairset *pair_set) +{ + int set1[PRIMERS_IN_SET_COUNT]; + int set2[PRIMERS_IN_SET_COUNT]; + int i,j=0,k; + for (i=0; iset_pairs[i] != -1) set2[j++]=pair_set->set_pairs[i]; + } + set1[0]=0;set1[1]=2;set1[2]=7; + if (j==3) + { + for(i=0;i<3;i++) + { + for(k=0;k<3;k++) + if (set2[k]==set1[i])break; + if (k==3)break; + } + if(i==3) return 1;//found + } + + set1[0]=0;set1[1]=2;set1[2]=37; + if (j==3) + { + for(i=0;i<3;i++) + { + for(k=0;k<3;k++) + if (set2[k]==set1[i])break; + if (k==3)break; + } + if(i==3) return 1;//found + } + return 0; +} + +void get_set_mean_cov_stats (pairset *pair_set, SetParams *pparams) +{ + int32_t i, j, k; + int interseq_vals[PRIMERS_IN_SET_COUNT*PRIMERS_IN_SET_COUNT]; + int interseq_cnt = 0; + double msum; + int *p1wi; + int *p2wi; + int dbg=0; + + dbg=isthisset(pair_set); + + for (i = 0; i < PRIMERS_IN_SET_COUNT; i++) + { + if (pair_set->set_pairs[i] == -1) continue; + p1wi = pparams->sortedpairs[pair_set->set_pairs[i]]->wellIdentifiedSeqs; + + if(dbg) + { + printf ("\n\nWellIdentified for primer pair:%d\n",pair_set->set_pairs[i]); + for (k = 0; k < pparams->options->dbsize; k++) + if(p1wi[k]==1) + printf("%d,",k); + printf("\n"); + } + + for (j = i+1; j < PRIMERS_IN_SET_COUNT; j++) + { + if (pair_set->set_pairs[j] == -1) continue; + p2wi = pparams->sortedpairs[pair_set->set_pairs[j]]->wellIdentifiedSeqs; + interseq_vals[interseq_cnt] = 0; + + if (dbg) + { + printf ("Intersection for %d and %d:\n", pair_set->set_pairs[i], pair_set->set_pairs[j]); + } + + for (k = 0; k < pparams->options->dbsize; k++) + if (p1wi[k] == 1 && p2wi[k] == 1) + { + interseq_vals[interseq_cnt]++; + if(dbg) + printf("%d,",k); + } + if(dbg) + printf("\n"); + interseq_cnt++; + } + } + + //calculate mean + msum = 0; + pair_set->set_score = 0; + pair_set->set_lmean = 0; + pair_set->set_lcov = -1; + if (interseq_cnt == 0) return; + + for (i = 0; i < interseq_cnt; i++) + msum += interseq_vals[i]; + pair_set->set_lmean = msum/interseq_cnt; + + msum = 0; + for (i = 0; i < interseq_cnt; i++) + msum += (interseq_vals[i] - pair_set->set_lmean)*(interseq_vals[i] - pair_set->set_lmean); + pair_set->set_lcov = msum/interseq_cnt; + + if (pair_set->set_lcov != 0) + //pair_set->set_score = (pair_set->set_coverage*pair_set->set_specificity*pair_set->set_specificity*(sqrt(pair_set->set_lmean)))/sqrt(sqrt(pair_set->set_lcov)); + pair_set->set_score = (pair_set->set_coverage*pair_set->set_specificity*(pair_set->set_lmean))/sqrt(pair_set->set_lcov); +} + +void get_set_mean_cov_normalised_stats (pairset *pair_set, SetParams *pparams) +{ + int32_t i, j, k; + int interseq_vals[PRIMERS_IN_SET_COUNT*PRIMERS_IN_SET_COUNT]; + int interseq_cnt = 0; + double msum; + int *p1wi; + int *p2wi; + int dbg=0; + + dbg=isthisset(pair_set); + + for (i = 0; i < PRIMERS_IN_SET_COUNT; i++) + { + if (pair_set->set_pairs[i] == -1) continue; + p1wi = pparams->sortedpairs[pair_set->set_pairs[i]]->wellIdentifiedSeqs; + + if(dbg) + { + printf ("\n\nWellIdentified for primer pair:%d\n",pair_set->set_pairs[i]); + for (k = 0; k < pparams->options->dbsize; k++) + if(p1wi[k]==1) + printf("%d,",k); + printf("\n"); + } + + for (j = i+1; j < PRIMERS_IN_SET_COUNT; j++) + { + if (pair_set->set_pairs[j] == -1) continue; + p2wi = pparams->sortedpairs[pair_set->set_pairs[j]]->wellIdentifiedSeqs; + interseq_vals[interseq_cnt] = 0; + + if (dbg) + { + printf ("Intersection for %d and %d:\n", pair_set->set_pairs[i], pair_set->set_pairs[j]); + } + + for (k = 0; k < pparams->options->dbsize; k++) + if (p1wi[k] == 1 && p2wi[k] == 1) + { + interseq_vals[interseq_cnt]++; + if(dbg) + printf("%d,",k); + } + if(dbg) + printf("\n"); + interseq_cnt++; + } + } + + //calculate mean + msum = 0; + pair_set->set_score = 0; + pair_set->set_lmean = 0; + pair_set->set_lcov = -1; + if (interseq_cnt == 0) return; + + for (i = 0; i < interseq_cnt; i++) + msum += interseq_vals[i]; + pair_set->set_lmean = msum/interseq_cnt; + + msum = 0; + for (i = 0; i < interseq_cnt; i++) + msum += (interseq_vals[i] - pair_set->set_lmean)*(interseq_vals[i] - pair_set->set_lmean); + pair_set->set_lcov = msum/interseq_cnt; + + if (pair_set->set_lcov != 0) + { + //normalised links + double nl = pair_set->set_lmean/sqrt (pair_set->set_lcov); + nl = nl/pparams->options->insamples; //max links cannot be more than insample value + pair_set->set_score = pair_set->set_coverage*pair_set->set_specificity*nl; + } +} + +void reset_set_props (pairset *pair_set, SetParams *pparams) +{ + int *pwi; + int i, j; + + memset (pair_set->set_wellIdentifiedTaxa, 0, pparams->options->dbsize*sizeof(int)); + for (i = 0; i < PRIMERS_IN_SET_COUNT; i++) + { + if (pair_set->set_pairs[i] == -1) continue; + pwi = pparams->sortedpairs[pair_set->set_pairs[i]]->wellIdentifiedSeqs; + for (j = 0; j < pparams->options->dbsize; j++) + if (pwi[j] == 1) + pair_set->set_wellIdentifiedTaxa[j] = 1; + } + + set_cov_spc (pair_set, pparams); + + //TR 6/2/11: commented following, now score is just product of spc and cov + //get_set_mean_cov_stats (pair_set, pparams); + //get_set_mean_cov_normalised_stats (pair_set, pparams); + //pair_set->set_score = pair_set->set_coverage*pair_set->set_specificity; + pair_set->set_score = pair_set->set_coverage; + //pair_set->set_score = pair_set->set_specificity; +} + +void print_set_info (pairset *pair_set, SetParams *pparams) +{ + int i; + int printed1st = 0; + + //TR 6/2/11: commented following, now score is just product of spc and cov + //printf ("%4.3f\t%4.3f\t%4.3f\t%4.3f\t%4.3f\t", pair_set->set_specificity, + // pair_set->set_coverage,pair_set->set_lmean, + // sqrt(pair_set->set_lcov),pair_set->set_score); + + printf ("%4.3f\t%4.3f\t%4.3f\t", pair_set->set_coverage, + pair_set->set_specificity,pair_set->set_score); + + for (i = 0; i < PRIMERS_IN_SET_COUNT; i++) + { + if (pair_set->set_pairs[i] == -1) continue; + + if (printed1st) + printf (":%d", pair_set->set_pairs[i]); + else + printf ("%d", pair_set->set_pairs[i]); + printed1st = 1; + } + printf ("\t%d\t%d", pair_set->set_intaxa, pair_set->set_wi_cnt); + printf ("\n"); +} + +void some_other_set_possibilities (pairset *pair_set, + ppair_t * sortedpairs, int32_t sorted_count, pecodnadb_t seqdb, poptions_t options) +{ + SetParams params; + pairset tmp_pair_set; + int i, j; + int *wi; + + params.sortedpairs = sortedpairs; + params.sorted_count = sorted_count; + params.seqdb = seqdb; + params.options = options; + wi = (int *) ECOMALLOC(options->dbsize*sizeof (int), + "Could not allocate memory for pair set wi"); + //print stats for first original set + printf ("\nspecificity\tcoverage\tmean\tcovariance\tscore\tprimers\n"); + print_set_info (pair_set, ¶ms); + + for (i = 0; i < PRIMERS_IN_SET_COUNT; i++) + { + if (pair_set->set_pairs[i] == -1) continue; + + for (j = 0; j < sorted_count; j++) + { + if (ok_to_add (j, pair_set, ¶ms)) + { + tmp_pair_set = *pair_set; + tmp_pair_set.set_pairs[i] = j; + memset (wi, 0, options->dbsize*sizeof (int)); + tmp_pair_set.set_wellIdentifiedTaxa = wi; + reset_set_props (&tmp_pair_set, ¶ms); + print_set_info (&tmp_pair_set, ¶ms); + } + } + } + ECOFREE (wi, "Could not free memory for pair set wi"); +} + +pairset clone_set (pairset *s, int32_t dbsize) +{ + pairset clone; + + clone = *s; + clone.set_wellIdentifiedTaxa = (int *) ECOMALLOC(dbsize*sizeof (int), + "Could not allocate memory for pair set"); + memcpy (clone.set_wellIdentifiedTaxa, s->set_wellIdentifiedTaxa, dbsize*sizeof (int)); + return clone; +} + +void add_in_tabu (int index) +{ + if (next_tabu_slot == -1) return; + + TabuList[next_tabu_slot] = index; + next_tabu_slot++; + if (next_tabu_slot >= PRIMERS_IN_SET_COUNT) next_tabu_slot = 0; +} + +int find_in_tabu (int index) +{ + int i; + for (i = 0; i < PRIMERS_IN_SET_COUNT; i++) + if (TabuList[i] == index) return i; + + return -1; +} + +//do random changes in the seed set to generate new set +pairset get_neighbor (pairset *set, SetParams *params) +{ + int pinset = 0; + int i, j, id, cnt; + int how_many_to_replace; + pairset nset; + int replace_idx; + + //take the seed set as next neighbour sets + nset = clone_set (set, params->options->dbsize); + //see how many elements are in this set + for (i = 0; i < PRIMERS_IN_SET_COUNT; i++) + { + if (nset.set_pairs[i] != -1) pinset++; + } + + if (pinset == params->sorted_count) return nset; + + //Randomly get number of elements to be replaced + //with new unused elements + how_many_to_replace = rand ()%pinset + 1; + //replace these many elements in the seed set + for (i = 0; i < how_many_to_replace; i++) + { + do + { + //we wil choose a random unused element as new element + id = rand ()%params->sorted_count; + }while (ok_to_add (id, &nset, params) == 0); + //again choose a random element in the set to replace + replace_idx = rand ()%pinset+1; + cnt = 0; + for (j = 0; j < PRIMERS_IN_SET_COUNT; j++) + { + if (nset.set_pairs[j] != -1) cnt++; + if (cnt == replace_idx) + { + if (next_tabu_slot != -1) + add_in_tabu (nset.set_pairs[j]); + + nset.set_pairs[j] = id; + break; + } + } + } + reset_set_props (&nset, params); + return nset; +} + +//remove a random number of least contributing elements +//from the seed set with random elements from the remaining +pairset get_neighbor4 (pairset *set, SetParams *params) +{ + int pinset = 0; + int i, j, id, id2; + int how_many_to_replace; + pairset nset; + //int replace_idx; + float contribution[PRIMERS_IN_SET_COUNT]; + int usedids[PRIMERS_IN_SET_COUNT]; + float sscore; + float leastContri; + //float lastLeastcontri; + int k, l; + + //take the seed set as next neighbour sets + nset = clone_set (set, params->options->dbsize); + //see how many elements are in this set + for (i = 0; i < PRIMERS_IN_SET_COUNT; i++) + { + if (nset.set_pairs[i] != -1) pinset++; + } + + if (pinset == params->sorted_count) return nset; + + //Randomly get number of elements to be replaced + //with new unused elements + how_many_to_replace = rand ()%pinset + 1; + + //calculate contribution of each element in the set + sscore = nset.set_score; + //fprintf (stderr, "{%f-", sscore); + for (i = 0; i < PRIMERS_IN_SET_COUNT; i++) + { + contribution[i] = 10000.0; + if (nset.set_pairs[i] != -1) + { + id = nset.set_pairs[i]; + nset.set_pairs[i] = -1; + reset_set_props (&nset, params); + contribution[i] = sscore - nset.set_score; + //fprintf (stderr, "[%f;%f]", nset.set_score, contribution[i]); + nset.set_pairs[i] = id; + reset_set_props (&nset, params); + //fprintf (stderr, "%f:, ", nset.set_score); + } + usedids[i] = -1; + } + + //lastLeastcontri = 10000.0; + k=0; + //replace these many elements in the seed set + //fprintf (stderr, "} (%d) ", how_many_to_replace); + for (i = 0; i < how_many_to_replace; i++) + { + do + { + //we wil choose a random unused element as new element + id = rand ()%params->sorted_count; + }while (ok_to_add (id, &nset, params) == 0); + + leastContri = 10000.0; + id2 = -1; + for (j = 0; j < PRIMERS_IN_SET_COUNT; j++) + { + if (nset.set_pairs[j] == -1) continue; + for (l = 0; l < k; l++) + if (usedids[l] == j) break; + + if (leastContri > contribution[j] /*&& leastContri >= lastLeastcontri*/ && l == k) + { + leastContri = contribution[j]; + id2 = j; + //fprintf (stderr, "%f:%d, ", leastContri, id2); + } + } + + if (id2 != -1) + { + usedids[k++] = id2; + //lastLeastcontri = leastContri; + if (next_tabu_slot != -1) + add_in_tabu (nset.set_pairs[id2]); + + nset.set_pairs[id2] = id; + } + } + //fprintf (stderr, "\n"); + reset_set_props (&nset, params); + return nset; +} + +//by replacing one element of the set with next from unused +int which_one_to_replace; +int last_replaced_with; +pairset get_neighbor2 (pairset *set, SetParams *params) +{ + int pinset = 0; + int i, j; + pairset nset; + + //take the seed set as next neighbour sets + nset = clone_set (set, params->options->dbsize); + //see how many elements are in this set + for (i = 0; i < PRIMERS_IN_SET_COUNT; i++) + { + if (nset.set_pairs[i] != -1) pinset++; + } + + if (pinset == params->sorted_count) return nset; + + if (which_one_to_replace == pinset) which_one_to_replace = 0; + if (last_replaced_with == params->sorted_count) last_replaced_with = 0; + + j = -1; + for (i = 0; i < pinset; i++) + { + if (nset.set_pairs[i] != -1) j++; + if (j == which_one_to_replace) break; + } + + for (j = last_replaced_with; j < params->sorted_count; j++) + if (ok_to_add (j, &nset, params) == 1) break; + + if (j < params->sorted_count) + { + if (next_tabu_slot != -1) + add_in_tabu (nset.set_pairs[i]); + + nset.set_pairs[i] = j; + reset_set_props (&nset, params); + } + last_replaced_with++; + which_one_to_replace++; + + return nset; +} + +//replace element having least contribution with the next from the list +pairset get_neighbor3 (pairset *set, SetParams *params) +{ + int pinset = 0; + int i, j, id; + pairset nset; + float least_contribution; + float sscore; + + //take the seed set as next neighbour sets + nset = clone_set (set, params->options->dbsize); + //see how many elements are in this set + for (i = 0; i < PRIMERS_IN_SET_COUNT; i++) + { + if (nset.set_pairs[i] != -1) pinset++; + } + + if (pinset == params->sorted_count) return nset; + + if (last_replaced_with == params->sorted_count) last_replaced_with = 0; + + sscore = nset.set_score; + which_one_to_replace = -1; + least_contribution = 1000.0; //impossible + for (i = 0; i < PRIMERS_IN_SET_COUNT; i++) + { + if (nset.set_pairs[i] != -1) + { + id = nset.set_pairs[i]; + nset.set_pairs[i] = -1; + reset_set_props (&nset, params); + if ((sscore - nset.set_score) < least_contribution) + { + which_one_to_replace = i; + least_contribution = sscore - nset.set_score; + } + nset.set_pairs[i] = id; + } + } + + for (j = last_replaced_with; j < params->sorted_count; j++) + if (ok_to_add (j, &nset, params) == 1) break; + + if (j < params->sorted_count && which_one_to_replace != -1) + { + if (next_tabu_slot != -1) + add_in_tabu (nset.set_pairs[which_one_to_replace]); + + nset.set_pairs[which_one_to_replace] = j; + reset_set_props (&nset, params); + } + last_replaced_with++; + + return nset; +} + +float sa_P (float score, float nscore, float tem) +{ + if (nscore >= score) return 0.95; + if (nscore < score && tem > 0.3) return 0.1; + if (nscore < score && tem > 0.1) return 0.0001; + return 0.0; +} + +void extend_set_to (pairset *pair_set, SetParams *params, int extend_to_cnt) +{ + int pinset = 0; + int i, j; + if (extend_to_cnt > PRIMERS_IN_SET_COUNT) return; + + for (i = 0; i < PRIMERS_IN_SET_COUNT; i++) + if (pair_set->set_pairs[i] != -1) pinset++; + + if (pinset >= extend_to_cnt) return; + + for (i = 0; i < params->sorted_count; i++) + { + if (ok_to_add (i, pair_set, params) == 1) + { + for (j = 0; j < PRIMERS_IN_SET_COUNT; j++) + if (pair_set->set_pairs[j] == -1) break; + add_pair_in_set (pair_set, j, i, params); + reset_set_props (pair_set, params); + pinset++; + if (pinset >= extend_to_cnt) break; + } + } +} + +pairset * extend_set_randomly (pairset *pset, SetParams *params, int extend_to_cnt) +{ + int pinset = 0; + int i = 0; + int id; + pairset *pair_set; + + if (extend_to_cnt > PRIMERS_IN_SET_COUNT) return pset; + + if (pset == NULL) + { + pair_set = (pairset *) ECOMALLOC(sizeof (pairset), + "Could not allocate memory for pair"); + pair_set->set_wellIdentifiedTaxa = (int *) ECOMALLOC(params->options->dbsize*sizeof (int), + "Could not allocate memory for pair set WI"); + + for (i = 0; i < PRIMERS_IN_SET_COUNT; i++) + pair_set->set_pairs[i] = -1; + } + else + pair_set = pset; + + for (i = 0; i < PRIMERS_IN_SET_COUNT; i++) + if (pair_set->set_pairs[i] != -1) pinset++; + + if (pinset >= extend_to_cnt) return pair_set; + + i = 0; + if (pinset == 0) + { + id = rand ()%params->sorted_count; + add_pair_in_set (pair_set, i, id, params); + i++; + pinset++; + } + + while (pinset < extend_to_cnt) + { + do + { + //we wil choose a random unused element as new element + id = rand ()%params->sorted_count; + }while (ok_to_add (id, pair_set, params) == 0); + add_pair_in_set (pair_set, i, id, params); + i++; + pinset++; + } + return pair_set; +} + +void set_reduce_to_best (pairset *pair_set, SetParams *params) +{ + int original_members[PRIMERS_IN_SET_COUNT]; + int i; + int mcnt = 0; + float max_score; + int m_to_remove = -1; + int tmem; + + for (i = 0; i < PRIMERS_IN_SET_COUNT; i++) + { + original_members[i] = pair_set->set_pairs[i]; + if (original_members[i] != -1) mcnt++; + } + + while (mcnt > 3) + { + max_score = pair_set->set_score; + m_to_remove = -1; + + for (i = 0; i < PRIMERS_IN_SET_COUNT; i++) + { + if (pair_set->set_pairs[i] == -1) continue; + tmem = pair_set->set_pairs[i]; + pair_set->set_pairs[i] = -1; //remove current element temporarily + reset_set_props (pair_set, params); + pair_set->set_pairs[i] = tmem; //restore + + if (max_score <= pair_set->set_score) + { + max_score = pair_set->set_score; + m_to_remove = i; + } + } + + if (m_to_remove != -1) + { + pair_set->set_pairs[m_to_remove] = -1; //remove element + reset_set_props (pair_set, params); + mcnt--; + } + else + { + reset_set_props (pair_set, params); + break; + } + } +} + +float sa_temp (int k, int kmax) +{ + return ((kmax - k)*1.0)/(kmax*1.0); +} + +void sets_by_SimulatedAnealing (pairset *pair_set, + ppair_t * sortedpairs, int32_t sorted_count, pecodnadb_t seqdb, poptions_t options) +{ + SetParams params; + pairset set, bset, nset; + float score, bscore, nscore; + int k = 0, mcnt=0; + int kmax = sorted_count*10; + float max_score = 10000.0; + float min_spc, min_cov; + float max_spc, max_cov; + double randval = 0; + + int32_t count_per_size; + int32_t size_counter = 1; + + srand ( time(NULL) ); + params.sortedpairs = sortedpairs; + params.sorted_count = sorted_count; + params.seqdb = seqdb; + params.options = options; + which_one_to_replace = 0; + last_replaced_with = 0; + next_tabu_slot = -1; //dont use tabu search props + total_pairs = sorted_count; + + if (pair_set == NULL) + { + pair_set = extend_set_randomly (NULL, ¶ms, 3); + printf("\nStart Random seed set for Simulated :\n"); + print_set_info (&pair_set, ¶ms); + } + min_spc = max_spc = pair_set->set_specificity; + min_cov = max_cov = pair_set->set_coverage; + + for (k = 0; k < PRIMERS_IN_SET_COUNT; k++) + { + if (pair_set->set_pairs[k] != -1) mcnt++; + } + count_per_size = kmax/(PRIMERS_IN_SET_COUNT-mcnt); + k = 1; + + set = clone_set (pair_set, options->dbsize); + + /*if (mcnt < 5) + { + printf ("Set before extension:\n"); + print_set_info (&set, ¶ms); + extend_set_to (&set, ¶ms, 5); + printf ("Set after extension:\n"); + print_set_info (&set, ¶ms); + set_reduce_to_best (&set, ¶ms); + printf ("Set after reduction to best size:\n"); + print_set_info (&set, ¶ms); + }*/ + mcnt++; + extend_set_to (&set, ¶ms, mcnt); + + bset = clone_set (&set, options->dbsize); + score = bset.set_score; + bscore = score; + nset.set_wellIdentifiedTaxa = NULL; + + //srand ( time(NULL) ); + + while (k <= kmax && score < max_score) + { + if (k == (size_counter*count_per_size)) + { + size_counter++; + mcnt++; + extend_set_to (&set, ¶ms, mcnt); + } + //nset = get_neighbor (&set, ¶ms); //all random + //nset = get_neighbor2 (&set, ¶ms); //replace next with next available + //nset = get_neighbor3 (&set, ¶ms); //replace the one with least contribution with next + nset = get_neighbor4 (&set, ¶ms); //replace randome no of least contributing elements with random elements in the remaining set + + if (nset.set_specificity < min_spc) + min_spc = nset.set_specificity; + + if (nset.set_specificity > max_spc) + max_spc = nset.set_specificity; + + if (nset.set_coverage < min_cov) + min_cov = nset.set_coverage; + + if (nset.set_coverage > max_cov) + max_cov = nset.set_coverage; + + nscore = nset.set_score; + printf ("Neighbor: "); + print_set_info (&nset, ¶ms); + + if (nscore > bscore) + { + ECOFREE (bset.set_wellIdentifiedTaxa, "Could not free memory for pair set wi"); + bset = clone_set (&nset, options->dbsize); + bscore = nscore; + printf ("best: "); + print_set_info (&nset, ¶ms); + } + + randval = (double)rand()/(double)RAND_MAX; + if (sa_P (score, nscore, sa_temp (k,kmax)) > randval) + { + ECOFREE (set.set_wellIdentifiedTaxa, "Could not free memory for pair set wi"); + set = clone_set (&nset, options->dbsize); + score = nscore; + which_one_to_replace = 0; + last_replaced_with = 0; + printf ("Seed Set: "); + print_set_info (&set, ¶ms); + } + k++; + ECOFREE (nset.set_wellIdentifiedTaxa, "Could not free memory for pair set wi"); + } + printf ("Minimum specificity: %0.3f, Maximum specificity: %0.3f, range: %0.3f\n",min_spc, max_spc, max_spc-min_spc); + printf ("Minimum coverage: %0.3f, Maximum coverage: %0.3f, range: %0.3f\n",min_cov, max_cov, max_cov-min_cov); +} + + +void sets_by_TabuSearch (pairset *pair_set, + ppair_t * sortedpairs, int32_t sorted_count, pecodnadb_t seqdb, poptions_t options) +{ + SetParams params; + pairset set, bset, nset; + float bscore, nscore; + int k = 0, mcnt=0; + int kmax = sorted_count*10; + float max_score = 1000.0; + float min_spc, min_cov; + float max_spc, max_cov; + + int32_t count_per_size; + int32_t size_counter = 1; + + srand ( time(NULL) ); + params.sortedpairs = sortedpairs; + params.sorted_count = sorted_count; + params.seqdb = seqdb; + params.options = options; + which_one_to_replace = 0; + last_replaced_with = 0; + next_tabu_slot = 0; //use tabu search + total_pairs = sorted_count; + + if (pair_set == NULL) + pair_set = extend_set_randomly (NULL, ¶ms, 3); + min_spc = max_spc = pair_set->set_specificity; + min_cov = max_cov = pair_set->set_coverage; + + for (k = 0; k < PRIMERS_IN_SET_COUNT; k++) + { + if (pair_set->set_pairs[k] != -1) mcnt++; + } + count_per_size = kmax/(PRIMERS_IN_SET_COUNT-mcnt); + + set = clone_set (pair_set, options->dbsize); + /*if (mcnt < 5) + { + printf ("Set before extension:\n"); + print_set_info (&set, ¶ms); + extend_set_to (&set, ¶ms, 5); + printf ("Set after extension:\n"); + print_set_info (&set, ¶ms); + set_reduce_to_best (&set, ¶ms); + printf ("Set after reduction to best size:\n"); + print_set_info (&set, ¶ms); + }*/ + mcnt++; + extend_set_to (&set, ¶ms, mcnt); + + bset = clone_set (&set, options->dbsize); + bscore = bset.set_score; + nset.set_wellIdentifiedTaxa = NULL; + + for (k = 0; k < PRIMERS_IN_SET_COUNT; k++) + TabuList[k] = -1; + + k = 1; + while (k < kmax && bscore < max_score) + { + if (k == (size_counter*count_per_size)) + { + size_counter++; + mcnt++; + extend_set_to (&set, ¶ms, mcnt); + } + + //nset = get_neighbor (&set, ¶ms); //all random + //nset = get_neighbor2 (&set, ¶ms); //replace next with next available + //nset = get_neighbor3 (&set, ¶ms); //replace the one with least contribution with next + nset = get_neighbor4 (&set, ¶ms); //replace randome no of least contributing elements with random elements in the remaining set + + if (nset.set_specificity < min_spc) + min_spc = nset.set_specificity; + + if (nset.set_specificity > max_spc) + max_spc = nset.set_specificity; + + if (nset.set_coverage < min_cov) + min_cov = nset.set_coverage; + + if (nset.set_coverage > max_cov) + max_cov = nset.set_coverage; + + nscore = nset.set_score; + printf ("Neighbor: "); + print_set_info (&nset, ¶ms); + + if (nscore > bscore) + { + ECOFREE (bset.set_wellIdentifiedTaxa, "Could not free memory for pair set wi"); + bset = clone_set (&nset, options->dbsize); + bscore = nscore; + printf ("best: "); + print_set_info (&nset, ¶ms); + } + ECOFREE (set.set_wellIdentifiedTaxa, "Could not free memory for pair set wi"); + set = nset; + k++; + } + printf ("Minimum specificity: %0.3f, Maximum specificity: %0.3f, range: %0.3f\n",min_spc, max_spc, max_spc-min_spc); + printf ("Minimum coverage: %0.3f, Maximum coverage: %0.3f, range: %0.3f\n",min_cov, max_cov, max_cov-min_cov); +} + +pairset *sets_by_BruteForce (ppair_t * sortedpairs, +//void sets_by_BruteForce (ppair_t * sortedpairs, + int32_t sorted_count, pecodnadb_t seqdb, poptions_t options) +{ + SetParams params; + params.sortedpairs = sortedpairs; + params.sorted_count = sorted_count; + params.seqdb = seqdb; + params.options = options; + + pairset set; + pairset *pset = NULL; + if (sorted_count < 3) + { + printf ("Too few primer pairs to find a pair set.\n"); + return NULL; + } + + set.set_wellIdentifiedTaxa = (int *) ECOMALLOC(options->dbsize*sizeof (int), + "Could not allocate memory for pair set WI"); + int32_t set_indeces_array[PRIMERS_IN_SET_COUNT]; + //int start_elements = 3; + int end_elements = 3; + int current_elements = 3; + int32_t i, j; + float maxscore = -1000.0; + int maxcount = 2000; + int counter = 0; + + if (sorted_count <= PRIMERS_IN_SET_COUNT) + end_elements = sorted_count; + + if (end_elements < sorted_count) + { + pset = (pairset *) ECOMALLOC(sizeof (pairset), + "Could not allocate memory for pair"); + pset->set_wellIdentifiedTaxa = (int *) ECOMALLOC(options->dbsize*sizeof (int), + "Could not allocate memory for pair set WI"); + } + + while (current_elements <= end_elements) + { + for (i=0; idbsize*sizeof (int)); + for (i=0; i maxscore) + { + maxscore = set.set_score; + printf ("best: "); + print_set_info (&set, ¶ms); + + ECOFREE (pset->set_wellIdentifiedTaxa, "Could not free memory for pair set wi"); + *pset = clone_set (&set, options->dbsize); + } + else + { + printf ("set: "); + print_set_info (&set, ¶ms); + } + + for (i=current_elements-1; i>0; i--) + { + set_indeces_array[i]++; + if (set_indeces_array[i] == (sorted_count+(i-current_elements+1))) + { + set_indeces_array[i] = set_indeces_array[i-1]+2; + for (j=i+1; j= sorted_count) + { + break; + } + if (i < current_elements) //above loop broken? + { + current_elements++; + break; + } + counter++; + if (counter > maxcount) + break; + } + if (counter > maxcount) + break; + } + return pset; +} + +void build_and_print_sets (ppair_t * sortedpairs, int32_t sorted_count, pecodnadb_t seqdb, poptions_t options) +{ + SetParams params; + pairset pair_set; + pairset *pset; + + params.sortedpairs = sortedpairs; + params.sorted_count = sorted_count; + params.seqdb = seqdb; + params.options = options; + + pair_set = build_primers_set_greedy_spc (¶ms); + printf("Greedy algorithm results based on specificity:\n"); + print_set_info (&pair_set, ¶ms); + if (pair_set.set_wellIdentifiedTaxa) + ECOFREE (pair_set.set_wellIdentifiedTaxa, "Could not free memory for pair set wi"); + + pair_set = build_primers_set_greedy_cov (¶ms); + printf("\nGreedy algorithm results based on coverage:\n"); + print_set_info (&pair_set, ¶ms); + if (pair_set.set_wellIdentifiedTaxa) + ECOFREE (pair_set.set_wellIdentifiedTaxa, "Could not free memory for pair set wi"); + + pset = extend_set_randomly (NULL, ¶ms, 3); + printf("\nStart Random seed set:\n"); + print_set_info (pset, ¶ms); + + printf("\nResults from simulated Anealing:\n"); + sets_by_SimulatedAnealing (pset, sortedpairs, sorted_count, seqdb, options); + printf("\nResults from Tabu Search:\n"); + sets_by_TabuSearch (pset, sortedpairs, sorted_count, seqdb, options); +} + +void primers_graph_graphviz (ppair_t * sortedpairs, + int32_t sorted_count, poptions_t options) +{ + int32_t i, j, k, total_links; + char fileName[100] = "PrimerLinks"; + int *owi; + int *iwi; + int allowedtaxa; + FILE *of; + + srand ( time(NULL) ); + sprintf (fileName, "PrimerLinks_%d.gv", rand ()); + of = fopen (fileName, "w"); + + fprintf (of, "graph primerlinks {\n"); + for (i=0; iwellIdentifiedSeqs; + + for (j=i+1; jwellIdentifiedSeqs; + total_links = 0; + + for (k=0; kdbsize; k++) + if (owi[k] == 1 && iwi[k] == 1) + total_links++; + + //if (total_links > 0 && ((total_links*1.0) <= (options->max_links_percent*options->dbsize))) + //if (total_links > 0 && total_links <= options->max_links_percent) + + if((sortedpairs[i]->intaxa - sortedpairs[i]->notwellidentifiedtaxa) < (sortedpairs[j]->intaxa - sortedpairs[j]->notwellidentifiedtaxa)) + allowedtaxa = (sortedpairs[i]->intaxa - sortedpairs[i]->notwellidentifiedtaxa)/2; + else + allowedtaxa = (sortedpairs[j]->intaxa - sortedpairs[j]->notwellidentifiedtaxa)/2; + + + //if (total_links > 5 && (total_links <= options->max_links_percent || options->max_links_percent==-1)) + // fprintf (of, "\t%d -- %d [label=\"%d: %0.2f: %0.2f\"];\n", i, j, total_links,sortedpairs[i]->bc,sortedpairs[j]->bc ); + + allowedtaxa = options->max_links_percent; + if (total_links > 5 && total_links < allowedtaxa) + fprintf (of, "\t%d -- %d [label=\"%d: %0.2f: %0.2f\"];\n", i, j, total_links,sortedpairs[i]->bc,sortedpairs[j]->bc ); + //fprintf (of, "\t%d\t%d\t%d\n", i, j, total_links); + + //fprintf (of, "\t%d\t%d\t%d\n", i, j, total_links); + //fprintf (of, "\t%d -- %d;\n", i, j, total_links); + } + } + fprintf (of, "}\n"); + fclose (of); +} + +int32_t *addinset (int32_t *set, int32_t i, int32_t j, int32_t* slots, int32_t *index) +{ + int32_t k; + + if (*index == *slots) + { + *slots += 50; + set = ECOREALLOC(set, (*slots)*sizeof (int32_t), + "Could not allocate memory for index set."); + } + + if (i > -1) + { + for (k=0; k<*index; k++) + if (set[k] == i) break; + if (k== *index) + set[(*index)++] = i; + } + + if (j > -1) + { + for (k=0; k<*index; k++) + if (set[k] == j) break; + if (k== *index) + set[(*index)++] = j; + } + + return set; +} + +size_t primers_changeSortedArray (ppair_t ** pairs, + size_t sorted_count, poptions_t options) +{ + int32_t i, j, k, l, total_links; + int *owi; + int *iwi; + int allowedtaxa; + ppair_t *sortedpairs = *pairs; + bool_t passed; + + int32_t *idx_set = NULL; + int32_t slots=50, index=0; + + idx_set = ECOMALLOC(slots*sizeof (int32_t), + "Could not allocate memory for index set."); + + for (i=0; iwellIdentifiedSeqs; + passed = FALSE; + + for (j=0; jwellIdentifiedSeqs; + total_links = 0; + + for (k=0; kdbsize; k++) + if (owi[k] == 1 && iwi[k] == 1) + total_links++; + + //if (total_links > 0 && ((total_links*1.0) <= (options->max_links_percent*options->dbsize))) + //if (total_links > 0 && total_links <= options->max_links_percent) + + if((sortedpairs[i]->intaxa - sortedpairs[i]->notwellidentifiedtaxa) < (sortedpairs[j]->intaxa - sortedpairs[j]->notwellidentifiedtaxa)) + allowedtaxa = (sortedpairs[i]->intaxa - sortedpairs[i]->notwellidentifiedtaxa)/2; + else + allowedtaxa = (sortedpairs[j]->intaxa - sortedpairs[j]->notwellidentifiedtaxa)/2; + + + //if (total_links > 5 && (total_links <= options->max_links_percent || options->max_links_percent==-1)) + // fprintf (of, "\t%d -- %d [label=\"%d: %0.2f: %0.2f\"];\n", i, j, total_links,sortedpairs[i]->bc,sortedpairs[j]->bc ); + + if (options->max_links_percent > 0) + { + allowedtaxa = options->max_links_percent; + if (total_links > allowedtaxa) + passed = TRUE; + break; + } + else + if (!(total_links > 5 && total_links <= allowedtaxa)) + { + //idx_set = addinset (idx_set, i, j, &slots, &index); + passed = TRUE; + break; + } + } + if (passed == TRUE) + idx_set = addinset (idx_set, i, -1, &slots, &index); + } + + i=-1; + for (j=0; jwellIdentifiedSeqs, "Cannot free wi for changing sorted array"); + ECOFREE (sortedpairs[j]->pcr.amplifias, "Cannot free wi for changing sorted array"); + if (i == -1) i = j; + } + else + { + if (i != -1) + sortedpairs[i++] = sortedpairs[j]; + } + } + ECOFREE (idx_set, "Cannot free index set."); + if (i != -1) + { + *pairs = ECOREALLOC (*pairs, i*sizeof(pair_t), "Cannot free wi for changing sorted array"); + } + else i=sorted_count; + return i; +} + + +int32_t *addinset_withLinks (int32_t *set, int32_t i, int32_t* slots, int32_t *index, ppair_t *pairs, poptions_t options) +{ + int32_t j, k, total_links; + int *owi; + int *iwi; + bool_t passed = TRUE; + int allowedtaxa; + + //see if we need to extend the set array + if (*index == *slots) + { + *slots += 50; + set = ECOREALLOC(set, (*slots)*sizeof (int32_t), + "Could not allocate memory for index set."); + } + + //find no of links of current element i with all the elements + //in the set to see that they are within limit + owi = pairs[i]->coveredSeqs; + for (j=0; j<*index; j++) + { + iwi = pairs[set[j]]->coveredSeqs; + total_links = 0; + + for (k=0; kdbsize; k++) + if (owi[k] == 1 && iwi[k] == 1) + total_links++; + + //if((pairs[i]->intaxa - pairs[i]->notwellidentifiedtaxa) < (pairs[set[j]]->intaxa - pairs[set[j]]->notwellidentifiedtaxa)) + // allowedtaxa = (pairs[i]->intaxa - pairs[i]->notwellidentifiedtaxa)/2; + //else + // allowedtaxa = (pairs[set[j]]->intaxa - pairs[set[j]]->notwellidentifiedtaxa)/2; + + if(pairs[i]->intaxa < pairs[set[j]]->intaxa) + allowedtaxa = pairs[i]->intaxa/2; + else + allowedtaxa = pairs[set[j]]->intaxa/2; + + if (!(total_links > 5 && total_links <= allowedtaxa)) + passed = FALSE; + } + + //links respect the limits with all set elements + if (passed) + { + for (k=0; k<*index; k++) + if (set[k] == i) break; + if (k== *index) + set[(*index)++] = i; + } + + return set; +} + +size_t primers_filterWithGivenLinks (ppair_t ** pairs, + size_t sorted_count, poptions_t options) +{ + int32_t i, j, k; + ppair_t *sortedpairs = *pairs; + bool_t passed; + + int32_t *idx_set = NULL; + int32_t slots=50, index=0; + int *cov = ECOMALLOC(options->dbsize*sizeof (int), + "Could not allocate memory for index set."); + + idx_set = ECOMALLOC(slots*sizeof (int32_t), + "Could not allocate memory for index set."); + + for (i=sorted_count-1; i>=0; i--) + { + idx_set = addinset_withLinks (idx_set, i, &slots, &index, sortedpairs, options); + } + + i=-1; + for (j=0; jcoveredSeqs, "Cannot free wi for changing sorted array"); + ECOFREE (sortedpairs[j]->wellIdentifiedSeqs, "Cannot free wi for changing sorted array"); + ECOFREE (sortedpairs[j]->pcr.amplifias, "Cannot free wi for changing sorted array"); + if (i == -1) i = j; + } + else + { + if (i != -1) + sortedpairs[i++] = sortedpairs[j]; + } + } + ECOFREE (idx_set, "Cannot free index set."); + if (i != -1) + { + *pairs = ECOREALLOC (*pairs, i*sizeof(pair_t), "Cannot free wi for changing sorted array"); + } + else i=sorted_count; + + + for (j=0; jdbsize; k++) + if ((*pairs)[j]->coveredSeqs[k] == 1) + cov[k] = 1; + j=0; + for (k=0; kdbsize; k++) + if (cov[k] == 1) + j++; + fprintf (stderr, "\nALL ELEMENTS COVERAGE: (%d/%d) %0.2f\n", j, options->intaxa, j*1.0/options->intaxa); + ECOFREE (cov, "Cannot free cov"); + + return i; +} diff --git a/src/libecoprimer/PrimerSets.h b/src/libecoprimer/PrimerSets.h new file mode 100644 index 0000000..44d6294 --- /dev/null +++ b/src/libecoprimer/PrimerSets.h @@ -0,0 +1,58 @@ +#ifndef PRIMERSETS_H_ +#define PRIMERSETS_H_ + +#include "ecoprimer.h" + +#define PRIMERS_IN_SET_COUNT 10 + +typedef struct { + int *set_wellIdentifiedTaxa; + int32_t set_pairs[PRIMERS_IN_SET_COUNT]; + float set_specificity; + float set_coverage; + float set_lmean; + float set_lcov; + float set_score; + int32_t set_intaxa; + int32_t set_wi_cnt; +}pairset; + +typedef struct{ + ppair_t* sortedpairs; + int32_t sorted_count; + pecodnadb_t seqdb; + poptions_t options; +}SetParams; + +typedef struct{ + float t_spc; //specificity contribution + float t_cov; //coverage contribution + float t_lmd; //link spread difference + float len; //length + float score; //score +}primerscore; + +void add_pair_in_set (pairset *pair_set, int32_t pset_idx, int32_t prb_idx, SetParams *pparams); +void get_next_pair_options (int *pair_wi_count_sorted_ids, pairset *pair_set, SetParams *pparams); +float get_links_distribution (int prb_idx, pairset *prob_set, SetParams *pparams); +pairset build_primers_set_greedy_spc (SetParams *pparams); +void get_set_mean_cov_stats (pairset *prob_set, SetParams *pparams); +void some_other_set_possibilities (pairset *pair_set, + ppair_t * sortedpairs, int32_t sorted_count, pecodnadb_t seqdb, poptions_t options); +void sets_by_SimulatedAnealing (pairset *pair_set, + ppair_t * sortedpairs, int32_t sorted_count, pecodnadb_t seqdb, poptions_t options); +void sets_by_TabuSearch (pairset *pair_set, + ppair_t * sortedpairs, int32_t sorted_count, pecodnadb_t seqdb, poptions_t options); +pairset * sets_by_BruteForce (ppair_t * sortedpairs, + int32_t sorted_count, pecodnadb_t seqdb, poptions_t options); +pairset * extend_set_randomly (pairset *pair_set, SetParams *params, int extend_to_cnt); +void build_and_print_sets (ppair_t * sortedpairs, int32_t sorted_count, pecodnadb_t seqdb, poptions_t options); +int32_t get_next_option_increasing_cov (pairset *pair_set, SetParams *pparams); +void reset_set_props (pairset *pair_set, SetParams *pparams); +void primers_graph_graphviz (ppair_t * sortedpairs, + int32_t sorted_count, poptions_t options); +size_t primers_changeSortedArray (ppair_t ** pairs, + size_t sorted_count, poptions_t options); +size_t primers_filterWithGivenLinks (ppair_t ** pairs, + size_t sorted_count, poptions_t options); +#endif diff --git a/src/libecoprimer/ahocorasick.c b/src/libecoprimer/ahocorasick.c new file mode 100755 index 0000000..078be0d --- /dev/null +++ b/src/libecoprimer/ahocorasick.c @@ -0,0 +1,479 @@ +/* + * ahocorasick.h + * + * Created on: 26 march 2011 + * Author: tiayyba + */ +#include +#include "hashencoder.h" +#include "ahocorasick.h" + +void ahoc_graphKeywordTree (aho_state *root); +aho_state *groot = NULL; //just for graph testing + +#define BASEATINDEX(w, l, i) (uint8_t)((((w)&(0x3LLU<<(((l)-(i))*2)))>>(((l)-(i))*2)) & 0x3LLU) + +void ahoc_addOutputElement (aho_state *node, bool_t isdirect, uint32_t idx) +{ + if (!node) return; + if (node->output.count == 0) + node->output.out_set = ECOMALLOC(sizeof(aho_output), + "Cannot allocate memory for aho-corasick state output element"); + else + node->output.out_set = ECOREALLOC(node->output.out_set, (node->output.count+1)*sizeof(aho_output), + "Cannot allocate memory for aho-corasick state output element"); + node->output.out_set[node->output.count].wordidx = idx; + node->output.out_set[node->output.count].isdirect = isdirect; + node->output.count++; +} + +//is the passed output element in the set +bool_t ahoc_isOutputIn (aho_state *node, aho_output ot) +{ + uint32_t i; + + for (i=0; ioutput.count; i++) + if (node->output.out_set[i].isdirect == ot.isdirect && node->output.out_set[i].wordidx == ot.wordidx) return TRUE; + return FALSE; +} + +//take union of output of the two nodes and put in node1 +void ahoc_unionOutputElements (aho_state *node1, aho_state *node2) +{ + uint32_t i; + + for (i=0; ioutput.count; i++) + if (ahoc_isOutputIn (node1, node2->output.out_set[i]) == FALSE) + ahoc_addOutputElement (node1, node2->output.out_set[i].isdirect, node2->output.out_set[i].wordidx); +} + +void ahoc_addKeyword (aho_state *root, word_t w, bool_t isdirect, uint32_t idx, poptions_t options) +{ + uint32_t i; + aho_state *nextnode = root; + uint8_t basecode; + static uint32_t state_id = 0; + + //fprintf (stderr, "%s\n", ecoUnhashWord(w, options->primer_length)); + for (i=1; i<=options->primer_length; i++) + { + basecode = BASEATINDEX (w, options->primer_length, i); + //fprintf (stderr, "%d", basecode); + if (nextnode->next[basecode] == NULL) + { + //add new state + nextnode->next[basecode] = ECOMALLOC(sizeof(aho_state), + "Cannot allocate memory for aho-corasick state"); + nextnode = nextnode->next[basecode]; + //initialize state + nextnode->id = ++state_id; + nextnode->next[0]=nextnode->next[1]=nextnode->next[2]=nextnode->next[3]=NULL; + nextnode->fail = NULL; + nextnode->output.count = 0; + } + else + nextnode = nextnode->next[basecode]; + } + //fprintf (stderr, "\n", basecode); + //new pattern addess so add node ouptup element + ahoc_addOutputElement (nextnode, isdirect, idx); +} + +void ahoc_buildKeywordTree (aho_state *root, pwordcount_t words, poptions_t options) +{ + uint32_t i; + if (!root) return; + + //init root + root->id = 0; + root->next[0]=root->next[1]=root->next[2]=root->next[3]=NULL; + root->fail = NULL; + root->output.count = 0; + + //now add each word as a pattern in the keyword tree + for (i=0; isize; i++) + { + //add direct word + word_t w=WORD(words->words[i]); + ahoc_addKeyword (root, w, TRUE, i, options); + + //add reverse word + w=ecoComplementWord(w,options->primer_length); + ahoc_addKeyword (root, w, FALSE, i, options); + } + + //loop on root if some base has no out going edge from roots + for (i=0; i<4; i++) + if (root->next[i] == NULL) + root->next[i] = root; +} + +void ahoc_enqueue (aho_queue *ahoqueue, aho_state *node) +{ + queue_node *q; + if (node == NULL) return; + + q = ECOMALLOC(sizeof(queue_node), + "Cannot allocate memory for aho-corasick queue node"); + q->state_node = node; + q->next = NULL; + + if (ahoqueue->first == NULL) + { + ahoqueue->first = q; + ahoqueue->last = q; + } + else + { + ahoqueue->last->next = q; + ahoqueue->last = q; + } +} + +aho_state *ahoc_dequeue (aho_queue *ahoqueue) +{ + aho_state *node = NULL; + queue_node *q; + + if (ahoqueue->first == NULL) return node; + q = ahoqueue->first; + ahoqueue->first = q->next; + + node = q->state_node; + ECOFREE (q, "Cannot free memory for aho-corasick queue node"); + return node; +} + +//set fail links and output sets for the keyword tree +void ahoc_updateForFailAndOutput (aho_state *root) +{ + int32_t i; + aho_queue Q; + aho_state *node_r; + aho_state *node_u; + aho_state *node_v; + + //empty queue + Q.first = NULL; + Q.last = NULL; + + //for us alphabet has 4 elements, A=0, C=1, G=2 and T=3 + for (i=0; i<4; i++) + { + if (root->next[i] != root && root->next[i] != NULL) + { + root->next[i]->fail = root; + ahoc_enqueue (&Q, root->next[i]); + } + } + + //while queue not empty + while (Q.first != NULL) + { + node_r = ahoc_dequeue (&Q); + for (i=0; i<4; i++) + { + if (node_r->next[i] != NULL) + { + node_u = node_r->next[i]; + ahoc_enqueue (&Q, node_u); + node_v = node_r->fail; + while (node_v->next[i] == NULL) + node_v = node_v->fail; + node_u->fail = node_v->next[i]; + ahoc_unionOutputElements (node_u, node_u->fail); + } + } + } +} + +void ahoc_freeKeywordTree (aho_state *node) +{ + int i; + for (i=0; i<4; i++) + if (node->next[i]) + ahoc_freeKeywordTree (node->next[i]); + if (node->output.count > 0) + ECOFREE (node->output.out_set, "Free failed for node output"); + ECOFREE (node, "Free failed for node"); +} + +pprimercount_t ahoc_lookforStrictPrimers (pecodnadb_t database, uint32_t seqdbsize,uint32_t exampleCount, + pwordcount_t words,poptions_t options) +{ + aho_state automaton_root; + aho_state *curr_state; + //uint32_t inSequenceQuorum; + uint32_t outSequenceQuorum; + pprimer_t data; + pprimercount_t primers; + uint32_t i, j, k; + int32_t pos; + uint32_t lmax; + char *base; + int8_t code; + uint32_t goodPrimers=0; + static int iii=0; + + + //inSequenceQuorum = (uint32_t)floor((float)exampleCount * options->sensitivity_quorum); + outSequenceQuorum = (uint32_t)floor((float)(seqdbsize-exampleCount) * options->false_positive_quorum); + + //fprintf(stderr," Primers should be at least present in %d/%d example sequences\n",inSequenceQuorum,exampleCount); + fprintf(stderr," Primers should not be present in more than %d/%d counterexample sequences\n",outSequenceQuorum,(seqdbsize-exampleCount)); + + data = ECOMALLOC(words->size * sizeof(primer_t), + "Cannot allocate memory for fuzzy matching results"); + for (i=0; i < words->size; i++) + { + data[i].word=WORD(words->words[i]); + data[i].inexample = 0; + data[i].outexample= 0; + + data[i].directCount=ECOMALLOC(seqdbsize * sizeof(uint32_t), + "Cannot allocate memory for primer position"); + data[i].directPos = ECOMALLOC(seqdbsize * sizeof(poslist_t), + "Cannot allocate memory for primer position"); + data[i].reverseCount=ECOMALLOC(seqdbsize * sizeof(uint32_t), + "Cannot allocate memory for primer position"); + data[i].reversePos = ECOMALLOC(seqdbsize * sizeof(poslist_t), + "Cannot allocate memory for primer position"); + } + + //build keywords automaton + ahoc_buildKeywordTree (&automaton_root, words, options); + //set fail links and output sets + ahoc_updateForFailAndOutput (&automaton_root); + + //debug; print keywordtree in a gv file + //ahoc_graphKeywordTree (&automaton_root); + + //loop on each sequence for its each base and find words + for (i=0; i < seqdbsize; i++) + { + if(database[i]->SQ_length <= options->primer_length) continue; + + lmax = database[i]->SQ_length; + if (!options->circular) + lmax += options->primer_length-1; + curr_state = &automaton_root; + + for (j=0,base=database[i]->SQ; jSQ_length) base=database[i]->SQ; + + //code = encoder[(*base) - 'A']; + code = *base; + //if (iii++ < 30) + // fprintf (stderr, "%d:%d,", *base, code); + if (code < 0 || code > 3) + { + //if error char, start from root for next character + //+forget any incomplete words + curr_state = &automaton_root; + continue; + } + while (curr_state->next[code] == NULL) curr_state = curr_state->fail; + curr_state = curr_state->next[code]; + + //start position of primer is options->primer_length-1 chars back + pos = j-options->primer_length+1; + if (pos < 0) pos = database[i]->SQ_length+pos; + + //set output, if there is some output on this state then + //+all words in the output set complete here, so increment their + //+found properties for current sequence + for (k=0; koutput.count; k++) + { + if (curr_state->output.out_set[k].isdirect) + data[curr_state->output.out_set[k].wordidx].directCount[i]++; + else + data[curr_state->output.out_set[k].wordidx].reverseCount[i]++; + + if (options->no_multi_match) + { + if ((data[curr_state->output.out_set[k].wordidx].directCount[i] + + data[curr_state->output.out_set[k].wordidx].reverseCount[i]) > 1) + //since multimach not allowd, set an indication on 1st seq position that + //+ a multimatch was found, so that this word will be filtered out + //+ and because of first postion we wont have to search the whole array + //+ to find if it voilated nomultimatch constraint for some seq + data[curr_state->output.out_set[k].wordidx].directCount[0] = 2; + else + { + if (curr_state->output.out_set[k].isdirect) + //direct word found on jth position of ith sequence + data[curr_state->output.out_set[k].wordidx].directPos[i].value = (uint32_t)pos; + else + //reverse word found on jth position of ith sequence + data[curr_state->output.out_set[k].wordidx].reversePos[i].value = (uint32_t)pos; + } + } + else + { + //okay multi match allowed + if (curr_state->output.out_set[k].isdirect) + { + if (data[curr_state->output.out_set[k].wordidx].directCount[i] == 1) + data[curr_state->output.out_set[k].wordidx].directPos[i].value = (uint32_t)pos; + else + { + //need to create or extend the positions list + if (data[curr_state->output.out_set[k].wordidx].directCount[i] == 2) + { + //for second element, first was put in .value, so dont forget to copy that in the array too + data[curr_state->output.out_set[k].wordidx].directPos[i].pointer = ECOMALLOC(2 * sizeof(uint32_t), + "Cannot allocate memory for primer position"); + data[curr_state->output.out_set[k].wordidx].directPos[i].pointer[0] = data[curr_state->output.out_set[k].wordidx].directPos[i].value; + data[curr_state->output.out_set[k].wordidx].directPos[i].pointer[1] = (uint32_t)pos; + } + else + { + //for third or greater element + data[curr_state->output.out_set[k].wordidx].directPos[i].pointer = ECOREALLOC(data[curr_state->output.out_set[k].wordidx].directPos[i].pointer, + data[curr_state->output.out_set[k].wordidx].directCount[i] * sizeof(uint32_t), + "Cannot allocate memory for primer position"); + data[curr_state->output.out_set[k].wordidx].directPos[i].pointer[data[curr_state->output.out_set[k].wordidx].directCount[i]-1] = (uint32_t)pos; + } + } + } + else + { + if (data[curr_state->output.out_set[k].wordidx].reverseCount[i] == 1) + data[curr_state->output.out_set[k].wordidx].reversePos[i].value = (uint32_t)pos; + else + { + //need to create or extend the positions list + if (data[curr_state->output.out_set[k].wordidx].reverseCount[i] == 2) + { + //for second element, first was put in .value, so dont forget to copy that in the array too + data[curr_state->output.out_set[k].wordidx].reversePos[i].pointer = ECOMALLOC(2 * sizeof(uint32_t), + "Cannot allocate memory for primer position"); + data[curr_state->output.out_set[k].wordidx].reversePos[i].pointer[0] = data[curr_state->output.out_set[k].wordidx].reversePos[i].value; + data[curr_state->output.out_set[k].wordidx].reversePos[i].pointer[1] = (uint32_t)pos; + } + else + { + //for third or greater element + data[curr_state->output.out_set[k].wordidx].reversePos[i].pointer = ECOREALLOC(data[curr_state->output.out_set[k].wordidx].reversePos[i].pointer, + data[curr_state->output.out_set[k].wordidx].reverseCount[i] * sizeof(uint32_t), + "Cannot allocate memory for primer position"); + data[curr_state->output.out_set[k].wordidx].reversePos[i].pointer[data[curr_state->output.out_set[k].wordidx].reverseCount[i]-1] = (uint32_t)pos; + } + } + } + } + //dont forget to increment inexample or outexample count, but only once for a sequence + if ((data[curr_state->output.out_set[k].wordidx].directCount[i] + + data[curr_state->output.out_set[k].wordidx].reverseCount[i]) == 1) + { + if (database[i]->isexample) + data[curr_state->output.out_set[k].wordidx].inexample++; + else + data[curr_state->output.out_set[k].wordidx].outexample++; + } + } + } + } + + //Only thing that remains is to remove the failed words + for (i=0,j=0; isize; i++) + { + fprintf(stderr,"Primers %5d/%lld analyzed => sequence : %s in %d example and %d counterexample sequences \r", + i+1,words->size,ecoUnhashWord(data[i].word,options->primer_length), + data[i].inexample,data[i].outexample); + + //if (data[i].inexample < inSequenceQuorum || (data[i].directCount[0] == 2 && options->no_multi_match)) + if (data[i].directCount[0] == 2 && options->no_multi_match) + { + //bad word, delete from the array + for (k=0; k 1) + ECOFREE (data[i].directPos[k].pointer, "Cannot free position pointer."); + if (data[i].reverseCount[k] > 1) + ECOFREE (data[i].reversePos[k].pointer, "Cannot free position pointer."); + } + ECOFREE (data[i].directCount, "Cannot free position pointer."); + ECOFREE (data[i].directPos, "Cannot free position pointer."); + ECOFREE (data[i].reverseCount, "Cannot free position pointer."); + ECOFREE (data[i].reversePos, "Cannot free position pointer."); + } + else + { + //data[i].good = data[i].inexample >= inSequenceQuorum && data[i].outexample <= outSequenceQuorum; + data[i].good = data[i].outexample <= outSequenceQuorum; + goodPrimers+=data[i].good? 1:0; + if (j < i) + data[j] = data[i]; + j++; + } + } + fprintf(stderr,"\n\nOn %lld analyzed primers %d respect quorum conditions\n",words->size,goodPrimers); + fprintf(stderr,"Conserved primers for further analysis : %d/%lld\n",j,words->size); + + primers = ECOMALLOC(sizeof(primercount_t),"Cannot allocate memory for primer table"); + primers->primers=ECOREALLOC(data, + j * sizeof(primer_t), + "Cannot reallocate memory for fuzzy matching results"); + primers->size=j; + + //free memory of keyword table + for (i=0; i<4; i++) + if (automaton_root.next[i] != &automaton_root) + ahoc_freeKeywordTree (automaton_root.next[i]); + + return primers; +} + +void ahoc_graphPrintNodesInfo (aho_state *node, FILE* gfile) +{ + uint32_t i; + fprintf (gfile, "\"%d\"[\n", node->id); + fprintf (gfile, "label=\"%d\\n", node->id); + for (i=0; ioutput.count; i++) + fprintf (gfile, "%d%c,", node->output.out_set[i].wordidx, node->output.out_set[i].isdirect?'d':'r'); + fprintf (gfile, "\"\n];\n"); + + for (i=0; i<4; i++) + if (node->next[i] != NULL && node->next[i] != node) + ahoc_graphPrintNodesInfo (node->next[i], gfile); +} + +void ahoc_graphPrintNodesLinks (aho_state *node, FILE* gfile) +{ + uint32_t i; + static int j=0; + + for (i=0; i<4; i++) + if (node->next[i] != NULL && node->next[i] != node) + { + fprintf (gfile, "\"%d\" -> \"%d\" [\n", node->id, node->next[i]->id); + fprintf (gfile, "label=\"%c\"\n];\n", "ACGT"[i]); + } + + if (j++ < 40) + if (node->fail != NULL && node->fail != groot) + { + fprintf (gfile, "\"%d\" -> \"%d\" [\n", node->id, node->fail->id); + fprintf (gfile, "color= \"red\"\n];\n"); + } + + for (i=0; i<4; i++) + if (node->next[i] != NULL && node->next[i] != node) + ahoc_graphPrintNodesLinks (node->next[i], gfile); +} + +void ahoc_graphKeywordTree (aho_state *root) +{ + FILE *gfile; + + groot=root; + gfile = fopen ("keywordtree.gv", "w"); + fprintf (gfile, "digraph keywordtree {\n"); + ahoc_graphPrintNodesInfo (root, gfile); + ahoc_graphPrintNodesLinks (root, gfile); + fprintf (gfile, "}\n"); + fclose(gfile); +} + diff --git a/src/libecoprimer/ahocorasick.h b/src/libecoprimer/ahocorasick.h new file mode 100755 index 0000000..097af4f --- /dev/null +++ b/src/libecoprimer/ahocorasick.h @@ -0,0 +1,43 @@ +/* + * ahocorasick.h + * + * Created on: 26 march 2011 + * Author: tiayyba + */ + +#ifndef H_ahocorasick +#define H_ahocorasick + +#include "ecoprimer.h" + +typedef struct aho_output_t{ + uint32_t wordidx; //index of strict word (dont save the word of 64B) + bool_t isdirect; //we need to find both direct and reverse words so we must know which one is it +}aho_output; + +typedef struct aho_output_count_t{ + uint32_t count; + aho_output *out_set; +}aho_output_count; + +typedef struct aho_state_t{ + int32_t id; + struct aho_state_t *next[4]; //for labels A=0,C=1,G=2 and T=3 + struct aho_state_t *fail; + aho_output_count output; +}aho_state; + +typedef struct queue_node_t { + aho_state *state_node; + struct queue_node_t *next; +}queue_node; + +typedef struct{ + queue_node *first; + queue_node *last; +}aho_queue; + +pprimercount_t ahoc_lookforStrictPrimers (pecodnadb_t database, uint32_t seqdbsize,uint32_t exampleCount, + pwordcount_t words,poptions_t options); +#endif /* H_ahocorasick */ + diff --git a/src/libecoprimer/amplifiatree.c b/src/libecoprimer/amplifiatree.c new file mode 100644 index 0000000..3698dea --- /dev/null +++ b/src/libecoprimer/amplifiatree.c @@ -0,0 +1,131 @@ +/* + * amplifiatree.c + * + * Created on: 7 mars 2009 + * Author: coissac + */ + +#include "ecoprimer.h" +#include + +static void cleanamplifia(pamplifia_t amplifia); +static void deleteamplifialist(pamplifialist_t list); +static int cmpamplifia(const void* p1,const void*p2); + + +static void cleanamplifiatlist(pamplifiacount_t list) +{ + if (list->amplifias) + ECOFREE(list->amplifias, + "Free amplifia list"); +} + +static void cleanamplifia(pamplifia_t amplifia) +{ + cleanamplifiatlist(&(amplifia->pcr)); +} + +static pamplifialist_t newamplifialist(pamplifialist_t parent, size_t size) +{ + pamplifialist_t tmp; + + tmp=ECOMALLOC(sizeof(amplifialist_t)+sizeof(amplifia_t)*(size-1), + "Cannot allocate new amplifia list"); + + tmp->amplifiaslots=size; + tmp->amplifiacount=0; + tmp->next=NULL; + + if (parent) + parent->next=(void*)tmp; + + return tmp; +} + +static void deleteamplifialist(pamplifialist_t list) +{ + size_t i; + + if (list) + { + if (list->next) + { + deleteamplifialist(list->next); + list->next=NULL; + } + for (i=0; i < list->amplifiacount; i++) + cleanamplifia((list->amplifias)+i); + + ECOFREE(list,"Delete amplifia list"); + } + +} + +static int cmpamplifia(const void* p1,const void*p2) +{ + pamplifia_t pr1,pr2; + + pr1=(pamplifia_t)p1; + pr2=(pamplifia_t)p2; + + if (pr1->p1 < pr2->p1) return -1; + if (pr1->p1 > pr2->p1) return 1; + + if (pr1->asdirect1 < pr2->asdirect1) return -1; + if (pr1->asdirect1 > pr2->asdirect1) return 1; + + if (pr1->p2 < pr2->p2) return -1; + if (pr1->p2 > pr2->p2) return 1; + + if (pr1->asdirect2 < pr2->asdirect2) return -1; + if (pr1->asdirect2 > pr2->asdirect2) return 1; + + return 0; +} + +pamplifia_t amplifiaintree (amplifia_t key, + pamplifiatree_t amplifialist) +{ + if (!amplifialist->tree) + return NULL; + + return *((pamplifia_t*)tsearch((const void *)(&key), + &(amplifialist->tree), + cmpamplifia + )); +} + +pamplifia_t insertamplifia(amplifia_t key, + pamplifiatree_t list) +{ + pamplifia_t current; + pamplifia_t found; + + if (list->last->amplifiacount==list->last->amplifiaslots) + { + list->last->next=newamplifialist(list,100); + list->last=list->last->next; + } + + current = list->last->amplifias + list->last->amplifiacount; + *current=key; + + found = *((pamplifia_t*)tsearch((const void *)current, + &(list->tree), + cmpamplifia)); + if (found==current) + list->last->amplifiacount++; + + return found; +} + +pamplifiatree_t initamplifiatree(pamplifiatree_t tree) +{ + if (!tree) + tree = ECOMALLOC(sizeof(amplifiatree_t),"Cannot allocate amplifia tree"); + + tree->first=newamplifialist(NULL,500); + tree->last=tree->first; + + tree->tree=NULL; +} diff --git a/src/libecoprimer/apat.h b/src/libecoprimer/apat.h new file mode 100644 index 0000000..dd9ae06 --- /dev/null +++ b/src/libecoprimer/apat.h @@ -0,0 +1,120 @@ +/* ==================================================== */ +/* Copyright (c) Atelier de BioInformatique */ +/* Dec. 94 */ +/* File: apat.h */ +/* Purpose: pattern scan */ +/* History: */ +/* 28/12/94 : ascan first version */ +/* 14/05/99 : last revision */ +/* ==================================================== */ + + +#ifndef H_apat +#define H_apat + + +#include "libstki.h" +#include "inttypes.h" +#include "../libecoPCR/ecoPCR.h" + + +/* ----------------------------------------------- */ +/* constantes */ +/* ----------------------------------------------- */ + +#ifndef BUFSIZ +#define BUFSIZ 1024 /* io buffer size */ +#endif + +#define MAX_NAME_LEN BUFSIZ /* max length of sequence name */ + +#define ALPHA_LEN 4 /* alphabet length */ + /* *DO NOT* modify */ + +#define MAX_PATTERN 4 /* max # of patterns */ + /* *DO NOT* modify */ + +#define MAX_PAT_LEN 32 /* max pattern length */ + /* *DO NOT* modify */ + +#define MAX_PAT_ERR 32 /* max # of errors */ + /* *DO NOT* modify */ + +#define PATMASK 0x3ffffff /* mask for 26 symbols */ + /* *DO NOT* modify */ + +#define OBLIBIT 0x4000000 /* bit 27 to 1 -> oblig. pos */ + /* *DO NOT* modify */ + + /* mask for position */ +#define ONEMASK 0x80000000 /* mask for highest position */ + + /* masks for Levenhstein edit */ +#define OPER_IDT 0x00000000 /* identity */ +#define OPER_INS 0x40000000 /* insertion */ +#define OPER_DEL 0x80000000 /* deletion */ +#define OPER_SUB 0xc0000000 /* substitution */ + +#define OPER_SHFT 30 /* shift */ + + /* Levenhstein Opcodes */ +#define SOPER_IDT 0x0 /* identity */ +#define SOPER_INS 0x1 /* insertion */ +#define SOPER_DEL 0x2 /* deletion */ +#define SOPER_SUB 0x3 /* substitution */ + + /* Levenhstein Opcodes masks */ +#define OPERMASK 0xc0000000 /* mask for Opcodes */ +#define NOPERMASK 0x3fffffff /* negate of previous */ + + + +/* ----------------------------------------------- */ +/* data structures */ +/* ----------------------------------------------- */ + + +typedef uint32_t pattern_t[ALPHA_LEN], *ppattern_t; + + /* -------------------- */ +typedef struct { /* pattern */ + /* -------------------- */ +int patlen; /* pattern length */ +int maxerr; /* max # of errors */ +uint32_t omask; /* oblig. bits mask */ +bool_t circular; /* is circular sequence */ +} patternParam_t, *ppatternParam_t; + + +/* ----------------------------------------------- */ +/* macros */ +/* ----------------------------------------------- */ + +#ifndef NEW +#define NEW(typ) (typ*)malloc(sizeof(typ)) +#define NEWN(typ, dim) (typ*)malloc((unsigned long)(dim) * sizeof(typ)) +#define REALLOC(typ, ptr, dim) (typ*)realloc((void *) (ptr), (unsigned long)(dim) * sizeof(typ)) +#define FREE(ptr) free((void *) ptr) +#endif + +/* ----------------------------------------------- */ +/* prototypes */ +/* ----------------------------------------------- */ + + /* apat_search.c */ + +int32_t ManberNoErr(pecoseq_t pseq,ppattern_t pat, + ppatternParam_t param, + StackiPtr stkpos); + +int32_t ManberSub(pecoseq_t pseq,ppattern_t pat, + ppatternParam_t param, + StackiPtr stkpos); + +int32_t ManberAll(pecoseq_t pseq,ppattern_t pat, + ppatternParam_t param, + StackiPtr stkpos); + + +#endif /* H_apat */ + diff --git a/src/libecoprimer/apat_parse.c b/src/libecoprimer/apat_parse.c new file mode 100644 index 0000000..c11b3a7 --- /dev/null +++ b/src/libecoprimer/apat_parse.c @@ -0,0 +1,65 @@ +/* ==================================================== */ +/* Copyright (c) Atelier de BioInformatique */ +/* Mar. 92 */ +/* File: apat_parse.c */ +/* Purpose: Codage du pattern */ +/* History: */ +/* 00/07/94 : first version (stanford) */ +/* 00/11/94 : revised for DNA/PROTEIN */ +/* 30/12/94 : modified EncodePattern */ +/* for manber search */ +/* 14/05/99 : indels added */ +/* ==================================================== */ + +#include +#include +#include +#include + +#include "apat.h" +#include "ecoprimer.h" + + + /* IUPAC Dna */ +static int32_t sDnaCode[] = { + /* IUPAC */ + + 0x00000001 /* A */, 0x0000000E /* B */, 0x00000002 /* C */, + 0x0000000D /* D */, 0x00000000 /* E */, 0x00000000 /* F */, + 0x00000004 /* G */, 0x0000000B /* H */, 0x00000000 /* I */, + 0x00000000 /* J */, 0x0000000C /* K */, 0x00000000 /* L */, + 0x00000003 /* M */, 0x0000000F /* N */, 0x00000000 /* O */, + 0x00000000 /* P */, 0x00000000 /* Q */, 0x00000005 /* R */, + 0x00000006 /* S */, 0x00000008 /* T */, 0x00000008 /* U */, + 0x00000007 /* V */, 0x00000009 /* W */, 0x00000000 /* X */, + 0x0000000A /* Y */, 0x00000000 /* Z */ +}; + + +/* -------------------------------------------- */ +/* internal replacement of gets */ +/* -------------------------------------------- */ +static char *sGets(char *buffer, int size) { + + char *ebuf; + + if (! fgets(buffer, size-1, stdin)) + return NULL; + + /* remove trailing line feed */ + + ebuf = buffer + strlen(buffer); + + while (--ebuf >= buffer) { + if ((*ebuf == '\n') || (*ebuf == '\r')) + *ebuf = '\000'; + else + break; + } + + return buffer; +} + +/* -------------------------------------------- */ +/* Interface */ +/* -------------------------------------------- */ diff --git a/src/libecoprimer/apat_search.c b/src/libecoprimer/apat_search.c new file mode 100644 index 0000000..22ae905 --- /dev/null +++ b/src/libecoprimer/apat_search.c @@ -0,0 +1,155 @@ +/* ==================================================== */ +/* Copyright (c) Atelier de BioInformatique */ +/* Dec. 94 */ +/* File: apat_search.c */ +/* Purpose: recherche du pattern */ +/* algorithme de Baeza-Yates/Gonnet */ +/* Manber (agrep) */ +/* History: */ +/* 07/12/94 : first version */ +/* 28/12/94 : revised version */ +/* 14/05/99 : last revision */ +/* ==================================================== */ + + +#include +#include +#include + +#include "libstki.h" +#include "apat.h" + +#define POP PopiOut +#define PUSH(s,v) PushiIn(&(s),(v)) +#define TOPCURS CursiToTop +#define DOWNREAD ReadiDown + +#define KRONECK(x, msk) ((~x & msk) ? 0 : 1) +#define MIN(x, y) ((x) < (y) ? (x) : (y)) + + +/* -------------------------------------------- */ +/* Baeza-Yates/Manber algorithm */ +/* NoError */ +/* -------------------------------------------- */ +int32_t ManberNoErr(pecoseq_t pseq,ppattern_t pat, + ppatternParam_t param, + StackiPtr stkpos) +{ + int32_t pos; + uint32_t smask, r; + uint8_t *data; + int32_t end; + + end = (size_t)(pseq->SQ_length); + + if (param->circular) + end+=param->patlen - 1; + + + /* create local masks */ + smask = r = 0x1L << param->patlen; + /* init. scan */ + data = (uint8_t*)(pseq->SQ); + + /* loop on text data */ + for (pos = 0 ; pos < end ; pos++,data++) { + if (pos==pseq->SQ_length) + data=(uint8_t*)(pseq->SQ); + + if (*data < 4) + r = (r >> 1) & pat[*data]; + else + r=0; + + if (r & 0x1L) { + PUSH(stkpos, pos - param->patlen + 1); + } + + r |= smask; + } + return stkpos->top; /* aka # of hits */ +} + +/* -------------------------------------------- */ +/* Baeza-Yates/Manber algorithm */ +/* Substitution only */ +/* */ +/* Note : r array is stored as : */ +/* 0 0 r(0,j) r(0,j+1) r(1,j) r(1,j+1) ... */ +/* */ +/* -------------------------------------------- */ +int32_t ManberSub(pecoseq_t pseq,ppattern_t pat, + ppatternParam_t param, + StackiPtr stkpos) +{ + int e, found; + int32_t pos; + uint32_t smask, cmask, sindx; + uint32_t *pr, r[2 * MAX_PAT_ERR + 2]; + uint8_t *data; + int32_t end; + + end = (size_t)(pseq->SQ_length); + + if (param->circular) + end+=param->patlen - 1; + + /* create local masks */ + r[0] = r[1] = 0x0; + + cmask = smask = 0x1L << param->patlen; + + for (e = 0, pr = r + 3 ; e <= param->maxerr ; e++, pr += 2) + *pr = cmask; + + cmask = ~ param->omask; + /* init. scan */ + data = (uint8_t*)(pseq->SQ); + + /* loop on text data */ + + for (pos = 0 ; pos < end ; pos++,data++) { + if (pos==pseq->SQ_length) + data=(uint8_t*)(pseq->SQ); + + sindx = (*data==4) ? 0:pat[*data]; + + for (e = found = 0, pr = r ; e <= param->maxerr ; e++, pr += 2) { + + pr[2] = pr[3] | smask; + + pr[3] = ((pr[0] >> 1) & cmask) /* sub */ + | ((pr[2] >> 1) & sindx); /* ident */ + + if (pr[3] & 0x1L) { /* found */ + if (! found) { + PUSH(stkpos, pos - param->patlen + 1); + } + found++; + } + } + } + + return stkpos->top; /* aka # of hits */ +} + + +/* -------------------------------------------- */ +/* Baeza-Yates/Manber algorithm */ +/* API call to previous functions */ +/* -------------------------------------------- */ +int32_t ManberAll(pecoseq_t pseq,ppattern_t pat, + ppatternParam_t param, + StackiPtr stkpos) +{ + if (param->maxerr == 0) + return ManberNoErr(pseq, + pat, param, + stkpos); + else + return ManberSub(pseq, + pat, param, + stkpos); +} + diff --git a/src/libecoprimer/aproxpattern.c b/src/libecoprimer/aproxpattern.c new file mode 100644 index 0000000..0cf349e --- /dev/null +++ b/src/libecoprimer/aproxpattern.c @@ -0,0 +1,237 @@ +/* + * aproxpattern.c + * + * Created on: 20 nov. 2008 + * Author: coissac + */ + + +#include "ecoprimer.h" +#include "apat.h" +#include + +static uint8_t encoder[] = {0, // A + 4, // b + 1, // C + 4,4,4, // d, e, f + 2, // G + 4,4,4,4,4,4,4,4,4,4,4,4, // h,i,j,k,l,m,n,o,p,q,r,s + 3,3, // T,U + 4,4,4,4,4}; // v,w,x,y,z + + +ppattern_t buildPatternFromWord(word_t word, uint32_t patlen) +{ + static pattern_t pattern; + uint32_t i; + + for (i = 0 ; i < ALPHA_LEN ; i++) + pattern[i] = 0x0; + + for (i=0;i < patlen; i++) + { + pattern[word & 3LLU] |= 1 << i; + word>>=2; + } + + return pattern; + +} + + +#ifdef IS_UPPER +#undef IS_UPPER +#endif + +/* -------------------------------------------- */ +/* encode sequence */ +/* IS_UPPER is slightly faster than isupper */ +/* -------------------------------------------- */ + +#define IS_UPPER(c) (((c) >= 'A') && ((c) <= 'Z')) + +void encodeSequence(ecoseq_t *seq) +{ + int i; + uint8_t *data; + char *cseq; + + data = (uint8_t*)(seq->SQ); + cseq = seq->SQ; + + for (i=0;iSQ_length;i++,data++,cseq++) + { + *data = encoder[(IS_UPPER(*cseq) ? *cseq : 'Z') - 'A']; + } +} + +pprimercount_t lookforAproxPrimer(pecodnadb_t database, uint32_t seqdbsize,uint32_t exampleCount, + pwordcount_t words,poptions_t options) +{ + pprimer_t data; + pprimercount_t primers; + ppattern_t pattern; + patternParam_t params; + uint32_t i; + uint32_t w; + uint32_t j; + Stacki positions; + uint32_t count=1; + uint32_t goodPrimers=0; + + uint32_t inSequenceQuorum; + uint32_t outSequenceQuorum; + bool_t conserved = TRUE; + + //poslist_t ttt; + + + inSequenceQuorum = (uint32_t)floor((float)exampleCount * options->sensitivity_quorum); + outSequenceQuorum = (uint32_t)floor((float)(seqdbsize-exampleCount) * options->false_positive_quorum); + + fprintf(stderr," Primers should be at least present in %d/%d example sequences\n",inSequenceQuorum,exampleCount); + fprintf(stderr," Primers should not be present in more than %d/%d counterexample sequences\n",outSequenceQuorum,(seqdbsize-exampleCount)); + + data = ECOMALLOC(words->size * sizeof(primer_t), + "Cannot allocate memory for fuzzy matching results"); + + params.circular = options->circular; + params.maxerr = options->error_max; +// params.omask = (1 << options->strict_three_prime) -1; + params.omask = 0; + params.patlen = options->primer_length; + + positions.val=NULL; + + for (i=0,w=0; i < words->size; i++) + { + data[w].word=WORD(words->words[i]); + data[w].inexample = 0; + data[w].outexample= 0; + count = 1; + + if (conserved) + { + data[w].directCount=ECOMALLOC(seqdbsize * sizeof(uint32_t), + "Cannot allocate memory for primer position"); + data[w].directPos = ECOMALLOC(seqdbsize * sizeof(poslist_t), + "Cannot allocate memory for primer position"); + data[w].reverseCount=ECOMALLOC(seqdbsize * sizeof(uint32_t), + "Cannot allocate memory for primer position"); + data[w].reversePos = ECOMALLOC(seqdbsize * sizeof(poslist_t), + "Cannot allocate memory for primer position"); + } + + pattern = buildPatternFromWord(data[w].word,options->primer_length); + positions.val=NULL; + + for (j=0; j < seqdbsize && (count < 2 || !options->no_multi_match); j++) + { + positions.cursor=0; + positions.top =0; + if (!positions.val) + { + positions.size=1; + positions.val = ECOMALLOC(sizeof(uint32_t), + "Cannot allocate memory for primer position"); + } + + + count = ManberAll(database[j],pattern,¶ms,&positions); + data[w].directCount[j]=count; + + + if (count>1) + { + data[w].directPos[j].pointer = (uint32_t*)positions.val; + positions.val=NULL; + } + else + { + data[w].directPos[j].pointer=NULL; + if (count==1) + data[w].directPos[j].value = (uint32_t)*(positions.val); + } + + + } + + pattern = buildPatternFromWord(ecoComplementWord(data[w].word,options->primer_length), + options->primer_length); + + for (j=0; j < seqdbsize && (count < 2 || !options->no_multi_match); j++) + { + positions.cursor=0; + positions.top =0; + if (!positions.val) + { + positions.size=1; + positions.val = ECOMALLOC(sizeof(uint32_t), + "Cannot allocate memory for primer position"); + } + + count = ManberAll(database[j],pattern,¶ms,&positions); + data[w].reverseCount[j]=count; + + if (count>1) + { + data[w].reversePos[j].pointer = (uint32_t*)positions.val; + positions.val=NULL; + } + else + { + data[w].reversePos[j].pointer=NULL; + if (count==1) + data[w].reversePos[j].value = (uint32_t)*(positions.val); + } + + if (database[j]->isexample) + { + data[w].inexample+=(data[w].directCount[j] || data[w].reverseCount[j])? 1:0; + } + else + { + data[w].outexample+=(data[w].directCount[j] || data[w].reverseCount[j])? 1:0; + + } + + count+=data[w].directCount[j]; + } + + data[w].good = data[w].inexample >= inSequenceQuorum && data[w].outexample <= outSequenceQuorum; + goodPrimers+=data[w].good? 1:0; + + fprintf(stderr,"Primers %5d/%d analyzed => sequence : %s in %d example and %d counterexample sequences \r", + i+1,words->size,ecoUnhashWord(data[w].word,options->primer_length), + data[w].inexample,data[w].outexample); + + + conserved=data[w].inexample >= inSequenceQuorum; + conserved=conserved && (count < 2 || !options->no_multi_match); + + if (conserved) + w++; + } + + if (positions.val) + ECOFREE(positions.val,"Free stack position pointer"); + + if (!conserved) + { + ECOFREE(data[w].directCount,"Free direct count table"); + ECOFREE(data[w].directPos,"Free direct count table"); + ECOFREE(data[w].reverseCount,"Free direct count table"); + ECOFREE(data[w].reversePos,"Free direct count table"); + } + + fprintf(stderr,"\n\nOn %d analyzed primers %d respect quorum conditions\n",words->size,goodPrimers); + fprintf(stderr,"Conserved primers for further analysis : %d/%d\n",w,words->size); + + primers = ECOMALLOC(sizeof(primercount_t),"Cannot allocate memory for primer table"); + primers->primers=ECOREALLOC(data, + w * sizeof(primer_t), + "Cannot reallocate memory for fuzzy matching results"); + primers->size=w; + + return primers; +} diff --git a/src/libecoprimer/debug.h b/src/libecoprimer/debug.h new file mode 100644 index 0000000..48f473a --- /dev/null +++ b/src/libecoprimer/debug.h @@ -0,0 +1,29 @@ +/* + * debug.h + * + * Created on: 12 nov. 2008 + * Author: coissac + */ + +#ifndef DEBUG_H_ +#define DEBUG_H_ + +#include + + +#ifdef DEBUG + +#define DEBUG_LOG(message,...) { \ + char *text; \ + (void)asprintf(&text,(message),##__VA_ARGS__); \ + fprintf(stderr,"DEBUG %s (line %d) : %s\n",__FILE__,__LINE__,(text)); \ + free(text); \ + } + +#else + +#define DEBUG_LOG(message, ...) + +#endif + +#endif /* DEBUG_H_ */ diff --git a/src/libecoprimer/ecoprimer.h b/src/libecoprimer/ecoprimer.h new file mode 100755 index 0000000..37fefd1 --- /dev/null +++ b/src/libecoprimer/ecoprimer.h @@ -0,0 +1,366 @@ +/* + * epsort.h + * + * Created on: 6 nov. 2008 + * Author: coissac + */ + +#ifndef EPSORT_H_ +#define EPSORT_H_ + +#include +#include +#include +#include "ecotype.h" +#include "../libecoPCR/ecoPCR.h" +#include "../libthermo/nnparams.h" +#include "apat.h" + +#define DEBUG +#include "debug.h" + +/**** + * Word format used : + * + * bit 63 : bad word -> this word should not be used + * bit 62 : multi word -> this word is not uniq in at least one seq + * bits 0-61 : hashed dna word of max size 31 pb + * code used for a : 00 + * code used for c : 01 + * code used for g : 10 + * code used for t : 11 + */ + +typedef uint64_t word_t, *pword_t; + +#define WORD(x) ((x) & 0x3FFFFFFFFFFFFFFFLLU) +#define WORD(x) ((x) & 0x3FFFFFFFFFFFFFFFLLU) + +#define ISBADWORD(x) (((x) & 0x8000000000000000LLU) >> 63) +#define SETBADWORD(x) ((x) | 0x8000000000000000LLU) +#define RESETBADWORD(x) ((x) & 0x7FFFFFFFFFFFFFFFLLU) + +#define ISMULTIWORD(x) (((x) & 0x4000000000000000LLU) >> 62) +#define SETMULTIWORD(x) ((x) | 0x4000000000000000LLU) +#define RESETMULTIWORD(x) ((x) & 0xBFFFFFFFFFFFFFFFLLU) + + +#define WORDMASK(s) ((1LLU << ((s) * 2)) -1) +#define LSHIFTWORD(x,s) (((x) << 2) & WORDMASK(s)) +#define RSHIFTWORD(x,s) (((x) & WORDMASK(s))>> 2) +#define ERRORMASK(s) ((int32_t)((1LLU << (s)) -1)) + +#define RAPPENDBASE(x,s,c) (LSHIFTWORD((x),(s)) | (word_t)(c)) +#define LAPPENDBASE(x,s,c) (RSHIFTWORD((x),(s)) | ((word_t)((~(c)) & 3) << (((s)-1) *2))) + + +#define ECO_ASSERT(x,message) if (!(x)) \ + { \ + fprintf(stderr,"Assertion Error in %s (line %d): %s\n", \ + __FILE__,\ + __LINE__,\ + message\ + ); \ + exit(ECO_ASSERT_ERROR); \ + } + +#define MINI(x,y) (((x) < (y)) ? (x):(y)) +#define MAXI(x,y) (((x) < (y)) ? (y):(x)) + +#define FWORDSIZE (13) +#define FWORDMASK WORDMASK(FWORDSIZE) +#define FILTERWORD(x) ((uint32_t)((x) & FWORDMASK)) +#define CFILTERWORD(x,s) ((uint32_t)(((x) >> (((s)-FWORDSIZE)*2)) & FWORDMASK)) + + + +typedef struct { + pword_t words; + uint32_t *strictcount; + uint32_t inseqcount; + uint32_t outseqcount; + uint64_t size; +} wordcount_t, *pwordcount_t; + + +typedef union { + uint32_t *pointer; + uint32_t value; +} poslist_t, *pposlist_t; + + +/** + * primer_t structure store fuzzy match positions for a primer + * on all sequences + */ + +typedef struct { + word_t word; //< code for the primer + uint32_t *directCount; //< Occurrence count on direct strand + pposlist_t directPos; //< list of position list on direct strand + + uint32_t *reverseCount; //< Occurrence count on reverse strand + pposlist_t reversePos; //< list of position list on reverse strand + + bool_t good; //< primer match more than quorum example and no + // more counterexample quorum. + + uint32_t inexample; //< count of example sequences matching primer + uint32_t outexample; //< count of counterexample sequences matching primer +} primer_t, *pprimer_t; + +/** + * primercount_t structure store fuzzy match positions for all primers + * on all sequences as a list of primer_t + */ +typedef struct { + pprimer_t primers; + uint32_t size; +} primercount_t, *pprimercount_t; + +typedef struct { + pprimer_t primer; + uint32_t position; + bool_t strand; +} primermatch_t, *pprimermatch_t; + +/*TR: Added*/ +typedef struct { + pprimermatch_t matches; + uint32_t matchcount; +} primermatchcount_t, *pprimermatchcount_t; + +typedef struct { + pecoseq_t sequence; + bool_t strand; + const char *amplifia; + int32_t length; + uint32_t begin; + uint32_t end; +} amplifia_t, *pamplifia_t; + +typedef struct { + pamplifia_t amplifias; + uint32_t ampcount; + uint32_t ampslot; +} amplifiacount_t, *pamplifiacount_t; + +typedef struct { + char *amplifia; + int32_t *taxonids; + uint32_t seqidcount; + uint32_t seqidindex; +} ampseqset_t, *pampseqset_t; + +typedef struct { + int32_t taxonid; + char **amplifia; + uint32_t amplifiacount; + uint32_t amplifiaindex; +} taxampset_t, *ptaxampset_t; + +typedef struct { + pprimer_t p1; + bool_t asdirect1; + pprimer_t p2; + bool_t asdirect2; + + amplifiacount_t pcr; + + uint32_t inexample; //< example sequence count + uint32_t outexample; //< counterexample sequence count + uint32_t intaxa; //< example taxa count + uint32_t outtaxa; //< counterexample taxa count + uint32_t notwellidentifiedtaxa; + + int *wellIdentifiedSeqs; //< an array having elements equla to total seqs + // values are either 0 or 1, if seq is well identified + // its 1 else 0 + int *coveredSeqs; //< an array having elements equal to total seqs, 1 if seq is covered else 0 + + // these statistics are relative to inexample sequences + + uint32_t mind; //< minimum distance between primers + uint32_t maxd; //< maximum distance between primers + uint32_t sumd; //< distance sum + uint32_t amplifiacount; + float yule; + float quorumin; + float quorumout; + float bs; + float bc; + int32_t refsequence; +// +// uint32_t taxsetcount; +// uint32_t taxsetindex; +// ptaxampset_t taxset; +// +// uint32_t oktaxoncount; + uint32_t curseqid; + float p1temp; //strict primer1 melting temperature + float p1mintemp; //approx primer1 minimum melting temperature + float p2temp; //strict primer2 melting temperature + float p2mintemp; //approx primer2 minimum melting temperature +} pair_t, *ppair_t; + +/*TR: Added*/ + +typedef struct { + size_t paircount; + size_t pairslots; + void* next; + pair_t pairs[1]; +} pairlist_t, *ppairlist_t; + +typedef struct { + ppairlist_t first; + ppairlist_t last; + void *tree; + int32_t count; +} pairtree_t, *ppairtree_t; + +typedef struct { + pword_t words; + uint32_t *count; + uint32_t push; + uint32_t pop; + uint32_t size; + bool_t empty; + bool_t full; +} queue_t, *pqueue_t; + +typedef struct { + pword_t words; + uint32_t *count; + uint32_t write; + uint32_t read1; + uint32_t read2; + uint32_t size; +} merge_t, *pmerge_t; + +typedef struct { + const char *amplifia; + bool_t strand; + int32_t length; + int32_t taxoncount; + void *taxontree; +}amptotaxon_t, *pamptotaxon_t; + +typedef struct { + int32_t taxid; + void *amptree; +}taxontoamp_t, *ptaxontoamp_t; + +typedef struct { + bool_t printAC; + bool_t statistics; + bool_t filtering; + uint32_t lmin; //**< Amplifia minimal length + uint32_t lmax; //**< Amplifia maximal length + uint32_t error_max; //**< maximum error count in fuzzy search + uint32_t primer_length; //**< minimal length of the primers + int32_t *restricted_taxid; //**< limit amplification below these taxid + int32_t *ignored_taxid; //**< no amplification below these taxid + int32_t *exception_taxid; + char *prefix; + char *reference; + pecoseq_t refseq; + uint32_t refseqid; + uint32_t circular; + uint32_t doublestrand; + float strict_quorum; + float strict_exclude_quorum; + float sensitivity_quorum; + float false_positive_quorum; + uint32_t strict_three_prime; + int32_t r; //**< count of restrited taxa (restricted_taxid array size) + int32_t g; //**< count of ignored taxa (ignored_taxid array size) + int32_t e; //**< count of ignored taxa (ignored_taxid array size) + bool_t no_multi_match; + char taxonrank[20]; //TR to count ranks against a pair + int32_t taxonrankidx; //TR to count ranks against a pair + + // Some statistics useful for options filters + + int32_t dbsize; + int32_t insamples; + int32_t outsamples; + int32_t intaxa; + int32_t outtaxa; + int saltmethod; + float salt; + PNNParams pnparm; + bool_t print_sets_of_primers; + float specificity_threshold; + int links_cnt; + float max_links_percent; + bool_t filter_on_links; +} options_t, *poptions_t; + +typedef ecoseq_t **pecodnadb_t; + +void sortword(pword_t table,uint32_t N); + + +pecodnadb_t readdnadb(const char *name, ecotaxonomy_t *taxonomy, uint32_t *size,poptions_t options); + +int isGoodTaxon(ecotaxonomy_t *taxonomy,int32_t taxon,poptions_t options); +int isExampleTaxon(ecotaxonomy_t *taxonomy,int32_t taxon,poptions_t options); +int isCounterExampleTaxon(ecotaxonomy_t *taxonomy,int32_t taxon,poptions_t options); + +uint32_t ecoWordCount(uint32_t wordsize, uint32_t circular, ecoseq_t *seq); +pword_t ecoHashSequence(pword_t dest, uint32_t wordsize, uint32_t circular, uint32_t doublestrand, ecoseq_t *seq,uint32_t *size,int32_t *neededWords,uint32_t neededWordCount, + int32_t quorum); +uint32_t ecoCompactHashSequence(pword_t dest,uint32_t size); +const char* ecoUnhashWord(word_t word,uint32_t size); +word_t ecoComplementWord(word_t word,uint32_t size); +uint32_t ecoFindWord(pwordcount_t table,word_t word); + + +void ecomerge(pwordcount_t data,uint32_t s1,uint32_t s2,uint32_t remainingSeq,uint32_t seqQuorum); +pwordcount_t initCountTable(pwordcount_t table, uint32_t wordsize, uint32_t circular, uint32_t doublestrand,uint32_t seqQuorum,ecoseq_t *seq,int32_t *neededWords,uint32_t neededWordCount); +void addSeqToWordCountTable(pwordcount_t table, uint32_t wordsize, uint32_t circular, uint32_t doublestrand,uint32_t exampleCount,uint32_t seqQuorum,ecoseq_t *seq,int32_t *neededWords,uint32_t neededWordCount); + +pqueue_t newQueue(pqueue_t queue, uint32_t size); +pqueue_t resizeQueue(pqueue_t queue, uint32_t size); + +void pop(pqueue_t queue); +void push(pqueue_t queue, word_t word, uint32_t count); + +pqueue_t cleanQueue(pqueue_t queue); + +pwordcount_t lookforStrictPrimer(pecodnadb_t database, uint32_t seqdbsize, + uint32_t exampleCount, poptions_t options); +uint32_t filterMultiStrictPrimer(pwordcount_t strictprimers); + +void encodeSequence(ecoseq_t *seq); +ppattern_t buildPatternFromWord(word_t word, uint32_t patlen); + +pprimercount_t lookforAproxPrimer(pecodnadb_t database, uint32_t seqdbsize,uint32_t exampleCount, + pwordcount_t words,poptions_t options); + +void sortmatch(pprimermatch_t table,uint32_t N); + +ppairtree_t initpairtree(ppairtree_t tree); +ppair_t pairintree (pair_t key,ppairtree_t pairlist); +ppair_t insertpair(pair_t key,ppairtree_t list); + + +/*TR: Added*/ +ppairtree_t buildPrimerPairs(pecodnadb_t seqdb,uint32_t seqdbsize,pprimercount_t primers,poptions_t options); + +int32_t counttaxon(int32_t taxid); +int32_t getrankdbstats(pecodnadb_t seqdb, + uint32_t seqdbsize, + ecotaxonomy_t *taxonomy, + poptions_t options); +float taxonomycoverage(ppair_t pair, poptions_t options, pecodnadb_t seqdb,uint32_t seqdbsize); +char ecoComplementChar(char base); +void taxonomyspecificity (ppair_t pair, pecodnadb_t seqdb,uint32_t seqdbsize); + +int32_t *filteringSeq(pecodnadb_t database, uint32_t seqdbsize, + uint32_t exampleCount,poptions_t options,uint32_t *size,int32_t sequenceQuorum); + +void printSeqTest(pecodnadb_t seqdb,uint32_t seqdbsize); + +#endif /* EPSORT_H_ */ diff --git a/src/libecoprimer/ecotype.h b/src/libecoprimer/ecotype.h new file mode 100644 index 0000000..38ce5a8 --- /dev/null +++ b/src/libecoprimer/ecotype.h @@ -0,0 +1,14 @@ +/* + * ecotype.h + * + * Created on: 24 nov. 2008 + * Author: coissac + */ + +#ifndef ECOTYPE_H_ +#define ECOTYPE_H_ + +typedef enum { FALSE=0,TRUE=1} bool_t, *pbool_t; + + +#endif /* ECOTYPE_H_ */ diff --git a/src/libecoprimer/filtering.c b/src/libecoprimer/filtering.c new file mode 100644 index 0000000..24e1387 --- /dev/null +++ b/src/libecoprimer/filtering.c @@ -0,0 +1,188 @@ +/* + * filtering.c + * + * Created on: 12 mai 2009 + * Author: coissac + */ + +#include "ecoprimer.h" +#include +#include + +#include "hashencoder.h" + +static int32_t *ecoFilteringHashSequence(int32_t *dest, + uint32_t circular, + uint32_t doublestrand, + ecoseq_t *seq, + uint32_t *size); + + + + + +static int32_t *ecoFilteringHashSequence(int32_t *dest, + uint32_t circular, + uint32_t doublestrand, + ecoseq_t *seq, + uint32_t *size) +{ + static char *in_last_seq=NULL; + uint32_t i=0; + uint32_t j; + char *base; + int8_t code; + int32_t error=0; + word_t word=0; + word_t antiword=0; + uint32_t goodword; + uint32_t lmax=0; + + // run on the first call; + + + if (dest==(void*)-1) + { + if (in_last_seq) ECOFREE(in_last_seq,"Free in last seq table"); + return NULL; + } + + + *size = pow(4,FWORDSIZE); + + if (!in_last_seq) + in_last_seq = ECOMALLOC(*size*sizeof(char), + "Cannot allocate filtering hash table"); + + memset(in_last_seq,0,*size*sizeof(char)); + + + if (!dest) + { + dest = ECOMALLOC(*size*sizeof(int32_t), + "Cannot allocate filtering hash table"); + memset(dest,0,*size*sizeof(int32_t)); + } + + lmax = seq->SQ_length; + if (!circular) + lmax-= FWORDSIZE-1; + + + +// DEBUG_LOG("Sequence %s @ %d : %18.18s",seq->AC,i,(seq->SQ+i)); + + for (i=0, base = seq->SQ; i < FWORDSIZE && i < lmax; i++,base++) + { + error<<= 1; + error&=ERRORMASK(FWORDSIZE); + + code = encoder[(*base) - 'A']; + if (code <0) + { + code = 0; + error|= 1; + } + + + word=RAPPENDBASE(word,FWORDSIZE,code); + if (doublestrand) + antiword=LAPPENDBASE(antiword,FWORDSIZE,code); + } + + if (!error && i==FWORDSIZE) + { + + goodword=(uint32_t)((doublestrand) ? MINI(word,antiword):word); + + if (!in_last_seq[goodword]) + { + in_last_seq[goodword]=1; + dest[goodword]++; + } + } + + + for (j=1; j < lmax; j++,i++,base++) + { + +// DEBUG_LOG("Sequence %s @ %d : %18.18s",seq->AC,j,(seq->SQ+j)); + + /* roll over the sequence for circular ones */ + if (i==(uint32_t)seq->SQ_length) base=seq->SQ; + + error<<= 1; + error&=ERRORMASK(FWORDSIZE); + + //code = -1; + //if((*base) >= 'A' && (*base) <= 'Z') + code = encoder[(*base) - 'A']; + if (code <0) + { + code = 0; + error|= 1; + } + + word=RAPPENDBASE(word,FWORDSIZE,code); + if (doublestrand) + antiword=LAPPENDBASE(antiword,FWORDSIZE,code); + + if (!error) + { + if (doublestrand) + goodword=(uint32_t)MINI(word,antiword); + else + goodword=word; + if (!in_last_seq[goodword]) + { + in_last_seq[goodword]=1; + dest[goodword]++; + } + } + + } + + return dest; + +} + + +int32_t *filteringSeq(pecodnadb_t database, uint32_t seqdbsize, + uint32_t exampleCount,poptions_t options,uint32_t *size,int32_t sequenceQuorum) +{ + int32_t *wordscount=NULL; + int32_t keep=0; + uint32_t i,j=0; + + for (i=0;iisexample && database[i]->SQ_length > options->primer_length) + { + j++; + wordscount=ecoFilteringHashSequence(wordscount, + options->circular, + options->doublestrand, + database[i], + size); + } + fprintf(stderr," Filtered sequences %5u/%5u \r",j,exampleCount); + + } + + fprintf(stderr,"\n"); + + for (i=0;i<*size;i++) + if (wordscount[i] >= sequenceQuorum) + keep++; + + + (void)ecoFilteringHashSequence((int32_t*)-1, + options->circular, + options->doublestrand, + NULL, + NULL); + + fprintf(stderr,"ok\n Considered word of size %d for filtering : %d\n",FWORDSIZE,keep); + return wordscount; + +} diff --git a/src/libecoprimer/goodtaxon.c b/src/libecoprimer/goodtaxon.c new file mode 100644 index 0000000..68f940c --- /dev/null +++ b/src/libecoprimer/goodtaxon.c @@ -0,0 +1,64 @@ +/* + * goodtaxon.c + * + * Created on: 7 nov. 2008 + * Author: coissac + */ + + +#include "ecoprimer.h" + +int isGoodTaxon(ecotaxonomy_t *taxonomy,int32_t taxon,poptions_t options) +{ + int result; + + result=((options->r == 0) || (eco_is_taxid_included(taxonomy, + options->restricted_taxid, + options->r, + taxonomy->taxons->taxon[taxon].taxid) + )) && + ((options->e == 0) || !(eco_is_taxid_included(taxonomy, + options->exception_taxid, + options->e, + taxonomy->taxons->taxon[taxon].taxid) + )); + + return result; +} + +int isExampleTaxon(ecotaxonomy_t *taxonomy,int32_t taxon,poptions_t options) +{ + int result; + + result=( (options->r == 0) || (eco_is_taxid_included(taxonomy, + options->restricted_taxid, + options->r, + taxonomy->taxons->taxon[taxon].taxid) + )) && + ((options->e == 0) || !(eco_is_taxid_included(taxonomy, + options->exception_taxid, + options->e, + taxonomy->taxons->taxon[taxon].taxid) + )); + + return result; +} + + +int isCounterExampleTaxon(ecotaxonomy_t *taxonomy,int32_t taxon,poptions_t options) +{ + int result; + + result=((options->g != 0) && (eco_is_taxid_included(taxonomy, + options->ignored_taxid, + options->g, + taxonomy->taxons->taxon[taxon].taxid)) + ) || ((options->e != 0) && (eco_is_taxid_included(taxonomy, + options->exception_taxid, + options->e, + taxonomy->taxons->taxon[taxon].taxid)) + ); + + + return result; +} diff --git a/src/libecoprimer/hashencoder.h b/src/libecoprimer/hashencoder.h new file mode 100644 index 0000000..00540d7 --- /dev/null +++ b/src/libecoprimer/hashencoder.h @@ -0,0 +1,21 @@ +/* + * hashencoder.h + * + * Created on: 12 mai 2009 + * Author: coissac + */ + +#ifndef HASHENCODER_H_ +#define HASHENCODER_H_ + +static int8_t encoder[] = {0, // A + -1, // b + 1, // C + -1,-1,-1, // d, e, f + 2, // G + -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, // h,i,j,k,l,m,n,o,p,q,r,s + 3,3, // T,U + -1,-1,-1,-1,-1}; // v,w,x,y,z + + +#endif /* HASHENCODER_H_ */ diff --git a/src/libecoprimer/hashsequence.c b/src/libecoprimer/hashsequence.c new file mode 100644 index 0000000..2caea48 --- /dev/null +++ b/src/libecoprimer/hashsequence.c @@ -0,0 +1,243 @@ +/* + * hashsequence.c + * + * Created on: 7 nov. 2008 + * Author: coissac + */ + + +#include "ecoprimer.h" + +static int cmpword(const void *x,const void *y); + +#include "hashencoder.h" + +uint32_t ecoWordCount(uint32_t wordsize, uint32_t circular, ecoseq_t *seq) +{ + uint32_t wordcount; + + wordcount = seq->SQ_length; + + if (!circular) wordcount-=wordsize-1; + + return wordcount; +} + +pword_t ecoHashSequence(pword_t dest, + uint32_t wordsize, + uint32_t circular, + uint32_t doublestrand, + ecoseq_t *seq, + uint32_t *size, + int32_t *neededWords, + uint32_t neededWordCount, + int32_t quorum) +{ + uint32_t i=0; + uint32_t j; + char *base; + int8_t code; + int32_t error=0; + word_t word=0; + word_t antiword=0; + word_t goodword; + uint32_t lmax=0; + + (*size)=0; + + lmax = seq->SQ_length; + if (!circular) + lmax-= wordsize-1; + + if (!dest) + dest = ECOMALLOC(lmax*sizeof(word_t), + "I cannot allocate memory for sequence hashing" + ); + +// DEBUG_LOG("Sequence %s @ %d : %18.18s",seq->AC,i,(seq->SQ+i)); + + for (i=0, base = seq->SQ; i < wordsize && i < lmax; i++,base++) + { + + error<<= 1; + error&=ERRORMASK(wordsize); + + code = encoder[(*base) - 'A']; + if (code <0) + { + code = 0; + error|= 1; + } + + + word=RAPPENDBASE(word,wordsize,code); + + if (doublestrand) + antiword=LAPPENDBASE(antiword,wordsize,code); + + if (neededWordCount && i>=(FWORDSIZE-1)) + { + + goodword = (doublestrand) ? MINI(FILTERWORD(word),CFILTERWORD(antiword,wordsize)):FILTERWORD(word); + if (neededWords[(uint32_t)goodword]AC,j,(seq->SQ+j)); + + /* roll over the sequence for circular ones */ + + if (i==(uint32_t)seq->SQ_length) base=seq->SQ; + + error<<= 1; + error&=ERRORMASK(wordsize); + + code = encoder[(*base) - 'A']; + if (code <0) + { + code = 0; + error|= 1; + } + + word=RAPPENDBASE(word,wordsize,code); + if (doublestrand) + antiword=LAPPENDBASE(antiword,wordsize,code); + + if (neededWordCount) + { + goodword = (doublestrand) ? MINI(FILTERWORD(word),CFILTERWORD(antiword,wordsize)):FILTERWORD(word); + if (neededWords[(uint32_t)goodword]AC,goodword,neededWords[(uint32_t)goodword],quorum,i,error); + + } + + + if (!error) + { + dest[*size]=(doublestrand) ? MINI(word,antiword):word; + (*size)++; + } + + } + // DEBUG_LOG("%s goodword = %d",seq->AC,*size); + return dest; + +} + +uint32_t ecoCompactHashSequence(pword_t table,uint32_t size) +{ + uint32_t i,j; + word_t current; +// bool_t here=FALSE; + + sortword(table,size); + + current = 0; + current=SETMULTIWORD(current); /* build impossible word for the first loop cycle */ + +// if (strcmp(ecoUnhashWord(table[size-1],18),"GTTTGTTCAACGATTAAA")==0) +// here=TRUE; + + for (i=0,j=0; j < size;j++) + { + if (WORD(table[j])!=current) + { + current =table[j]; + table[i]=current; + i++; + } + else + table[i]=SETMULTIWORD(table[i]); + } + +// if (strcmp(ecoUnhashWord(WORD(table[i-1]),18),"TACGACCTCGATGTTGGA")==0) +// DEBUG_LOG("winner %d",i) + + return i; +} + +const char* ecoUnhashWord(word_t word,uint32_t size) +{ + static char buffer[32]; + static char decode[]="ACGT"; + + uint32_t i; + + for (i=0; i < size; i++) + { + buffer[i]=decode[(word >> (2 * (size - 1 -i))) & 3]; + } + + buffer[size]=0; + + return buffer; +} + +word_t ecoComplementWord(word_t word,uint32_t size) +{ + word_t rep=0; + uint32_t i; + +// DEBUG_LOG("%llx %llx",word,~word); + word=(~word) & WORDMASK(size); + for (i=0;i < size; i++) + { + + rep = RAPPENDBASE(rep,size,word & 3LLU); +// DEBUG_LOG("%016llx %016llx %016llx",word,word & 3LLU,rep); + word>>=2; + } +// DEBUG_LOG("Complemented = %s",ecoUnhashWord(rep,18)); + return rep; + +} + +static int cmpword(const void *x,const void *y) +{ + word_t w1 = *(pword_t)x; + word_t w2 = *(pword_t)y; + + w1 = WORD(w1); + w2 = WORD(w2); + + if (w1 < w2) + return -1; + if (w1 > w2) + return +1; + + return 0; +} + +uint32_t ecoFindWord(pwordcount_t table,word_t word) +{ + pword_t dest; + + dest = (pword_t)bsearch((const void*)&word,(const void*)table->words,table->size,sizeof(word_t),cmpword); + + if (dest) + return dest - table->words; + else + return ~0; +} + +char ecoComplementChar(char base) +{ + return (base < 4)? !base & 3: 4; +} + diff --git a/src/libecoprimer/libstki.c b/src/libecoprimer/libstki.c new file mode 100644 index 0000000..9bdebf2 --- /dev/null +++ b/src/libecoprimer/libstki.c @@ -0,0 +1,379 @@ +/* ==================================================== */ +/* Copyright (c) Atelier de BioInformatique */ +/* Mar. 92 */ +/* File: libstki.c */ +/* Purpose: A library to deal with 'stacks' of */ +/* integers */ +/* Note: 'stacks' are dynamic (i.e. size is */ +/* automatically readjusted when needed) */ +/* History: */ +/* 00/03/92 : first draft */ +/* 15/08/93 : revised version */ +/* 14/05/99 : last revision */ +/* ==================================================== */ + +#include +#include +#include + +#include "libstki.h" +#include "ecoprimer.h" + + +/* ============================ */ +/* Constantes et Macros locales */ +/* ============================ */ + +#define ExpandStack(stkh) ResizeStacki((stkh), (*stkh)->size << 1) + +#define ShrinkStack(stkh) ResizeStacki((stkh), (*stkh)->size >> 1) + + +static int16_t sStkiLastError = kStkiNoErr; + +/* -------------------------------------------- */ +/* gestion des erreurs */ +/* get/reset erreur flag */ +/* */ +/* @function: StkiError */ +/* -------------------------------------------- */ + +int16_t StkiError(bool_t reset) +{ + int16_t err; + + err = sStkiLastError; + + if (reset) + sStkiLastError = kStkiNoErr; + + return err; + +} /* end of StkiError */ + +/* -------------------------------------------- */ +/* creation d'un stack */ +/* */ +/* @function: NewStacki */ +/* -------------------------------------------- */ + +StackiPtr NewStacki(int32_t size) +{ + StackiPtr stki; + + if (! (stki = NEW(Stacki))) + return NULL; + + stki->size = size; + stki->top = 0; + stki->cursor = 0; + + if ( ! (stki->val = NEWN(int32_t, size))) { + sStkiLastError = kStkiMemErr; + return FreeStacki(stki); + } + + return stki; + +} /* end of NewStacki */ + + +/* -------------------------------------------- */ +/* liberation d'un stack */ +/* */ +/* @function: FreeStacki */ +/* -------------------------------------------- */ + +StackiPtr FreeStacki(StackiPtr stki) +{ + if (stki) { + if (stki->val) + ECOFREE(stki->val,"Free stack values"); + ECOFREE(stki,"Free stack"); + } + + return NULL; + +} /* end of FreeStacki */ + +/* -------------------------------------------- */ +/* creation d'un vecteur de stacks */ +/* */ +/* @function: NewStackiVector */ +/* -------------------------------------------- */ + +StackiHdle NewStackiVector(int32_t vectSize, int32_t stackSize) +{ + int32_t i; + StackiHdle stkh; + + if (! (stkh = NEWN(StackiPtr, vectSize))) { + sStkiLastError = kStkiMemErr; + return NULL; + } + + for (i = 0 ; i < vectSize ; i++) + if (! (stkh[i] = NewStacki(stackSize))) + return FreeStackiVector(stkh, i); + + return stkh; + +} /* end of NewStackiVector */ + + +/* -------------------------------------------- */ +/* liberation d'un vecteur de stacks */ +/* */ +/* @function: FreeStackiVector */ +/* -------------------------------------------- */ + +StackiHdle FreeStackiVector(StackiHdle stkh, int32_t vectSize) +{ + int32_t i; + + if (stkh) { + for (i = 0 ; i < vectSize ; i++) + (void) FreeStacki(stkh[i]); + ECOFREE(stkh,"Free stack vector"); + } + + return NULL; + +} /* end of FreeStackiVector */ + +/* -------------------------------------------- */ +/* resize d'un stack */ +/* */ +/* @function: ResizeStacki */ +/* -------------------------------------------- */ + +int32_t ResizeStacki(StackiHdle stkh, int32_t size) +{ + int32_t resize = 0; /* assume error */ + int32_t *val; + + if ((val = ECOREALLOC((*stkh)->val, size * sizeof(int32_t),"Cannot reallocate stack values"))) { + (*stkh)->size = resize = size; + (*stkh)->val = val; + } + + if (! resize) + sStkiLastError = kStkiMemErr; + + return resize; + +} /* end of ResizeStacki */ + +/* -------------------------------------------- */ +/* empilage(/lement) */ +/* */ +/* @function: PushiIn */ +/* -------------------------------------------- */ + +bool_t PushiIn(StackiHdle stkh, int32_t val) +{ + if (((*stkh)->top >= (*stkh)->size) && (! ExpandStack(stkh))) + return FALSE; + + (*stkh)->val[((*stkh)->top)++] = val; + + return TRUE; + +} /* end of PushiIn */ + +/* -------------------------------------------- */ +/* depilage(/lement) */ +/* */ +/* @function: PopiOut */ +/* -------------------------------------------- */ + +bool_t PopiOut(StackiHdle stkh, int32_t *val) +{ + if ((*stkh)->top <= 0) + return FALSE; + + *val = (*stkh)->val[--((*stkh)->top)]; + + if ( ((*stkh)->top < ((*stkh)->size >> 1)) + && ((*stkh)->top > kMinStackiSize)) + + (void) ShrinkStack(stkh); + + return TRUE; + +} /* end of PopiOut */ + +/* -------------------------------------------- */ +/* lecture descendante */ +/* */ +/* @function: ReadiDown */ +/* -------------------------------------------- */ + +bool_t ReadiDown(StackiPtr stki, int32_t *val) +{ + if (stki->cursor <= 0) + return FALSE; + + *val = stki->val[--(stki->cursor)]; + + return TRUE; + +} /* end of ReadiDown */ + +/* -------------------------------------------- */ +/* lecture ascendante */ +/* */ +/* @function: ReadiUp */ +/* -------------------------------------------- */ + +bool_t ReadiUp(StackiPtr stki, int32_t *val) +{ + if (stki->cursor >= stki->top) + return FALSE; + + *val = stki->val[(stki->cursor)++]; + + return TRUE; + +} /* end of ReadiUp */ + +/* -------------------------------------------- */ +/* remontee/descente du curseur */ +/* */ +/* @function: CursiToTop */ +/* @function: CursiToBottom */ +/* -------------------------------------------- */ + +void CursiToTop(StackiPtr stki) +{ + stki->cursor = stki->top; + +} /* end of CursiToTop */ + +void CursiToBottom(stki) + StackiPtr stki; +{ + stki->cursor = 0; + +} /* end of CursiToBottom */ + +/* -------------------------------------------- */ +/* echange des valeurs cursor <-> (top - 1) */ +/* */ +/* @function: CursiSwap */ +/* -------------------------------------------- */ + +void CursiSwap(StackiPtr stki) +{ + int32_t tmp; + + if ((stki->top <= 0) || (stki->cursor < 0)) + return; + + tmp = stki->val[stki->cursor]; + stki->val[stki->cursor] = stki->val[stki->top - 1]; + stki->val[stki->top - 1] = tmp; + +} /* end of CursiSwap */ + +/* -------------------------------------------- */ +/* Recherche d'une valeur en stack a partir du */ +/* curseur courant en descendant. */ +/* on laisse le curseur a l'endroit trouve */ +/* */ +/* @function: SearchDownStacki */ +/* -------------------------------------------- */ + +bool_t SearchDownStacki(StackiPtr stki, int32_t sval) +{ + int32_t val; + bool_t more; + + while ((more = ReadiDown(stki, &val))) + if (val == sval) + break; + + return more; + +} /* end of SearchDownStacki */ + +/* -------------------------------------------- */ +/* Recherche dichotomique d'une valeur en stack */ +/* le stack est suppose trie par valeurs */ +/* croissantes. */ +/* on place le curseur a l'endroit trouve */ +/* */ +/* @function: BinSearchStacki */ +/* -------------------------------------------- */ + +bool_t BinSearchStacki(StackiPtr stki, int32_t sval) +{ + int32_t midd, low, high, span; + + low = 0; + high = stki->top - 1; + + while (high >= low) { + + midd = (high + low) / 2; + + span = stki->val[midd] - sval; + + if (span == 0) { + stki->cursor = midd; + return TRUE; + } + + if (span > 0) + high = midd - 1; + else + low = midd + 1; + } + + return FALSE; + +} /* end of BinSearchStacki */ + +/* -------------------------------------------- */ +/* teste l'egalite *physique* de deux stacks */ +/* */ +/* @function: SameStacki */ +/* -------------------------------------------- */ + +bool_t SameStacki(StackiPtr stki1, StackiPtr stki2) +{ + if (stki1->top != stki2->top) + return FALSE; + + return ((memcmp(stki1->val, stki2->val, + stki1->top * sizeof(int32_t)) == 0) ? TRUE : FALSE); + +} /* end of SameStacki */ + + +/* -------------------------------------------- */ +/* inverse l'ordre des elements dans un stack */ +/* */ +/* @function: ReverseStacki */ +/* -------------------------------------------- */ + +bool_t ReverseStacki(StackiPtr stki) +{ + int32_t *t, *b, swp; + + if (stki->top <= 0) + return FALSE; + + b = stki->val; + t = b + stki->top - 1; + + while (t > b) { + swp = *t; + *t-- = *b; + *b++ = swp; + } + + return TRUE; + +} /* end of ReverseStacki */ + diff --git a/src/libecoprimer/libstki.h b/src/libecoprimer/libstki.h new file mode 100644 index 0000000..cad7d60 --- /dev/null +++ b/src/libecoprimer/libstki.h @@ -0,0 +1,89 @@ +/* ==================================================== */ +/* Copyright (c) Atelier de BioInformatique */ +/* Mar. 92 */ +/* File: libstki.h */ +/* Purpose: library of dynamic stacks holding */ +/* integer values */ +/* History: */ +/* 00/03/92 : first draft */ +/* 07/07/93 : complete revision */ +/* 10/03/94 : added xxxVector funcs */ +/* 14/05/99 : last revision */ +/* ==================================================== */ + +#ifndef _H_libstki +#define _H_libstki + + +#include "ecotype.h" + +/* ==================================================== */ +/* Constantes de dimensionnement */ +/* ==================================================== */ + +#ifndef kMinStackiSize +#define kMinStackiSize 2 /* taille mini stack */ +#endif + + +#define kStkiNoErr 0 /* ok */ +#define kStkiMemErr 1 /* not enough memory */ + +#define kStkiReset TRUE +#define kStkiGet FALSE + +/* ==================================================== */ +/* Macros standards */ +/* ==================================================== */ + +#ifndef NEW +#define NEW(typ) (typ*)malloc(sizeof(typ)) +#define NEWN(typ, dim) (typ*)malloc((uint32_t)(dim) * sizeof(typ)) +#define REALLOC(typ, ptr, dim) (typ*)realloc((void *) (ptr), (uint32_t)(dim) * sizeof(typ)) +#define FREE(ptr) free((Ptr) ptr) +#endif + + +/* ==================================================== */ +/* Types & Structures de donnees */ +/* ==================================================== */ + + /* -------------------- */ + /* structure : pile */ + /* -------------------- */ +typedef struct Stacki { + /* ---------------------*/ + int32_t size; /* stack size */ + int32_t top; /* current free pos. */ + int32_t cursor; /* current cursor */ + int32_t *val; /* values */ + /* ---------------------*/ +} Stacki, *StackiPtr, **StackiHdle; + + + +/* ==================================================== */ +/* Prototypes (generated by mproto) */ +/* ==================================================== */ + + /* libstki.c */ + +int16_t StkiError (bool_t reset ); +StackiPtr NewStacki (int32_t size ); +StackiPtr FreeStacki (StackiPtr stki ); +StackiHdle NewStackiVector (int32_t vectSize, int32_t stackSize ); +StackiHdle FreeStackiVector (StackiHdle stkh, int32_t vectSize ); +int32_t ResizeStacki (StackiHdle stkh , int32_t size ); +bool_t PushiIn (StackiHdle stkh , int32_t val ); +bool_t PopiOut (StackiHdle stkh , int32_t *val ); +bool_t ReadiDown (StackiPtr stki , int32_t *val ); +bool_t ReadiUp (StackiPtr stki , int32_t *val ); +void CursiToTop (StackiPtr stki ); +void CursiToBottom (StackiPtr stki ); +void CursiSwap (StackiPtr stki ); +bool_t SearchDownStacki (StackiPtr stki , int32_t sval ); +bool_t BinSearchStacki (StackiPtr stki , int32_t sval ); +bool_t SameStacki (StackiPtr stki1 , StackiPtr stki2 ); +bool_t ReverseStacki (StackiPtr stki ); + +#endif /* _H_libstki */ diff --git a/src/libecoprimer/mapping.c b/src/libecoprimer/mapping.c new file mode 100644 index 0000000..96c84bd --- /dev/null +++ b/src/libecoprimer/mapping.c @@ -0,0 +1,7 @@ +/* + * mapping.c + * + * Created on: 25 nov. 2008 + * Author: coissac + */ + diff --git a/src/libecoprimer/merge.c b/src/libecoprimer/merge.c new file mode 100644 index 0000000..a638ca9 --- /dev/null +++ b/src/libecoprimer/merge.c @@ -0,0 +1,152 @@ +/* + * merge.c + * + * Created on: 11 nov. 2008 + * Author: coissac + */ + +#include "ecoprimer.h" + +static pmerge_t mergeInit(pmerge_t merge,pwordcount_t data,uint32_t s1,uint32_t s2); + + +static pmerge_t mergeInit(pmerge_t merge, pwordcount_t data,uint32_t s1,uint32_t s2) +{ + merge->words = data->words; + merge->count = data->strictcount; + merge->write = 0; + merge->read1 = 0; + merge->read2 = s1; + merge->size = s1+s2; + return merge; +} + + +typedef enum {S1=1,S2=2,STACK=3} source_t; + +void ecomerge(pwordcount_t data,uint32_t s1,uint32_t s2,uint32_t remainingSeq,uint32_t seqQuorum) +{ + merge_t merged; + source_t source; + word_t currentword,tmpword; + uint32_t currentcount,tmpcount; + int same; + queue_t queue; + int nsame=0; + uint32_t maxcount=0; + bool_t writed=TRUE; + +// DEBUG_LOG("Coucou %p s1= %d s2= %d",data,s1,s2) + + (void)mergeInit(&merged,data,s1,s2); + (void)newQueue(&queue,MINI(s1,s2)); + + + while (merged.read1 < s1 || merged.read2 < merged.size) + { + if (! queue.empty) + { + currentword = queue.words[queue.pop]; + currentcount = queue.count[queue.pop]; + source=STACK; + } + else + { + currentword = merged.words[merged.read1]; + currentcount = merged.count[merged.read1]; + source=S1; + } + + if (merged.read2 < merged.size && + WORD(currentword) > WORD(merged.words[merged.read2])) + { + currentword = merged.words[merged.read2]; + currentcount = merged.count[merged.read2]; + source = S2; + } + + same = (source != S2) && (WORD(currentword) == WORD(merged.words[merged.read2])); + nsame+=same; + +// DEBUG_LOG("Merging : r1 = %d s1 = %d r2 = %d size = %d word = %s source=%u same=%u",merged.read1,s1,merged.read2-s1,merged.size,ecoUnhashWord(currentword,18),source,same) + + tmpword = merged.words[merged.write]; + tmpcount= merged.count[merged.write]; + + merged.words[merged.write] = currentword; + merged.count[merged.write] = currentcount; + + if (source != S2) + { + if (same) + { + merged.count[merged.write]+=merged.count[merged.read2]; + + if (ISMULTIWORD(currentword) || ISMULTIWORD(merged.words[merged.read2])) + merged.words[merged.write]=SETMULTIWORD(currentword); + + merged.read2++; + } + + if (source==STACK) + pop(&queue); + merged.read1++; + } + else + merged.read2++; + + if (writed && merged.read1 <= merged.write && merged.write < s1) + push(&queue,tmpword,tmpcount); + + if (merged.count[merged.write] > maxcount) + maxcount=merged.count[merged.write]; + + writed = remainingSeq + merged.count[merged.write] >= seqQuorum; + if (writed) + merged.write++; + + +// else +// DEBUG_LOG("Remove word : %s count : %d remainingSeq : %d total : %d Quorum : %d", +// ecoUnhashWord(currentword,18),merged.count[merged.write],remainingSeq,maxcount+remainingSeq,seqQuorum); + + } /* while loop */ + +// DEBUG_LOG("r1 : %d r2 : %d qsize : %d nsame : %d tot : %d write : %s count : %d source : %d size : %d pop : %d push : %d empty : %d",merged.read1,merged.read2-s1,qsize,nsame,qsize+nsame,ecoUnhashWord(currentword,18),currentcount,source,queue.size,queue.pop,queue.push,queue.empty) + + + if (merged.read2 < merged.size) + { + //DEBUG_LOG("end1 %d %d/%d %d/%d",merged.write,merged.read1,s1,merged.read2,merged.size); + for (;merged.read2 < merged.size;merged.read2++) + { + merged.words[merged.write]=merged.words[merged.read2]; + merged.count[merged.write]=merged.count[merged.read2]; + if (remainingSeq + merged.count[merged.write] >= seqQuorum) + merged.write++; + + } + } + else { + //DEBUG_LOG("end2 %d %d/%d %d/%d",merged.write,merged.read1,s1,merged.read2,merged.size); + while (! queue.empty) + { +// DEBUG_LOG("write : %s count : %d write : %d size : %d pop : %d push : %d empty : %d",ecoUnhashWord(queue.words[queue.pop],18),queue.count[queue.pop],merged.write,queue.size,queue.pop,queue.push,queue.empty) + merged.words[merged.write]=queue.words[queue.pop]; + merged.count[merged.write]=queue.count[queue.pop]; + pop(&queue); + if (remainingSeq + merged.count[merged.write] >= seqQuorum) + merged.write++; + } + } + + data->size = merged.write; + + cleanQueue(&queue); + +// DEBUG_LOG("Max count : %d remainingSeq : %d total : %d Quorum : %d",maxcount,remainingSeq,maxcount+remainingSeq,seqQuorum) +// DEBUG_LOG("Second word : %s",ecoUnhashWord(data->words[1],18)) +// DEBUG_LOG("Last word : %s",ecoUnhashWord(data->words[data->size-1],18)) + + +} diff --git a/src/libecoprimer/pairs.c b/src/libecoprimer/pairs.c new file mode 100644 index 0000000..88c1c4b --- /dev/null +++ b/src/libecoprimer/pairs.c @@ -0,0 +1,460 @@ +/* + * pairs.c + * + * Created on: 15 dŽc. 2008 + * Author: coissac + */ + +#include "ecoprimer.h" +#include +#include +#include "../libthermo/thermostats.h" + +static void buildPrimerPairsForOneSeq(uint32_t seqid, + pecodnadb_t seqdb, + pprimercount_t primers, + ppairtree_t pairs, + poptions_t options); + + + + + + +/************************************* + * + * pair collection management + * + *************************************/ + +#ifdef MASKEDCODE + +char *addamplifiasetelem (ppair_t pair, char* amplifia, int32_t taxid) +{ + uint32_t i; + uint32_t j; + char *ampused = NULL; + + if(pair->ampsetcount == 0) + { + pair->ampsetcount = 500; + pair->ampsetindex = 0; + pair->ampset = ECOMALLOC(pair->ampsetcount * sizeof(ampseqset_t),"Cannot allocate amplifia set"); + } + + for (i = 0; i < pair->ampsetindex; i++) + { + if (strcmp (pair->ampset[i].amplifia, amplifia) == 0) + { + ampused = pair->ampset[i].amplifia; + break; + } + } + + if (i == 0) + { + pair->ampset[i].seqidcount = 100; + pair->ampset[i].seqidindex = 0; + pair->ampset[i].taxonids = ECOMALLOC(pair->ampset[i].seqidcount * sizeof(uint32_t),"Cannot allocate amplifia sequence table"); + } + + if (pair->ampsetindex == pair->ampsetcount) + { + pair->ampsetcount += 500; + pair->ampset = ECOREALLOC(pair->ampset, pair->ampsetcount * sizeof(ampseqset_t), "Cannot allocate amplifia set"); + } + + if (pair->ampset[i].seqidindex == pair->ampset[i].seqidcount) + { + pair->ampset[i].seqidcount += 100; + pair->ampset[i].taxonids = ECOREALLOC(pair->ampset[i].taxonids, pair->ampset[i].seqidcount * sizeof(int32_t), "Cannot allocate amplifia sequence table"); + } + + if (pair->ampset[i].amplifia == NULL) + { + pair->ampset[i].amplifia = amplifia; + pair->ampsetindex++; + } + + for (j = 0; j < pair->ampset[i].seqidindex; j++) + { + if (pair->ampset[i].taxonids[j] == taxid) break; + } + + if (j == pair->ampset[i].seqidindex) + pair->ampset[i].taxonids[pair->ampset[i].seqidindex++] = taxid; + return ampused; +} + +void addtaxampsetelem (ppair_t pair, int32_t taxid, char *amplifia) +{ + uint32_t i; + uint32_t j; + + if(pair->taxsetcount == 0) + { + pair->taxsetcount = 500; + pair->taxsetindex = 0; + pair->taxset = ECOMALLOC(pair->taxsetcount * sizeof(taxampset_t),"Cannot allocate taxon set"); + } + + for (i = 0; i < pair->taxsetindex; i++) + { + if (pair->taxset[i].taxonid == taxid) break; + } + + if (i == 0) + { + pair->taxset[i].amplifiacount = 100; + pair->taxset[i].amplifiaindex = 0; + pair->taxset[i].amplifia = ECOMALLOC(pair->taxset[i].amplifiacount * sizeof(char *),"Cannot allocate amplifia table"); + } + + if (pair->taxsetindex == pair->taxsetcount) + { + pair->taxsetcount += 500; + pair->taxset = ECOREALLOC(pair->taxset, pair->taxsetcount * sizeof(taxampset_t), "Cannot allocate taxon set"); + } + + if (pair->taxset[i].amplifiaindex == pair->taxset[i].amplifiacount) + { + pair->taxset[i].amplifiacount += 100; + pair->taxset[i].amplifia = ECOREALLOC(pair->taxset[i].amplifia, pair->taxset[i].amplifiacount * sizeof(char *), "Cannot allocate amplifia table"); + } + + if (pair->taxset[i].taxonid == 0) + { + pair->taxset[i].taxonid = taxid; + pair->taxsetindex++; + } + + for (j = 0; j < pair->taxset[i].amplifiaindex; j++) + { + if (strcmp(pair->taxset[i].amplifia[j], amplifia) == 0) break; + } + + if (j == pair->taxset[i].amplifiaindex) + { + pair->taxset[i].amplifia[j] = amplifia; + pair->taxset[i].amplifiaindex++; + } +} + +char *getamplifia (pecoseq_t seq, uint32_t start, uint32_t len) +{ + fprintf(stderr,"start : %d length : %d\n",start,len); + char *amplifia = ECOMALLOC((len + 1) * sizeof(char),"Cannot allocate amplifia"); + char *seqc = &seq->SQ[start]; + + strncpy(amplifia, seqc, len); + return amplifia; +} + +#endif + +/*TR: Added*/ +ppairtree_t buildPrimerPairs(pecodnadb_t seqdb,uint32_t seqdbsize,pprimercount_t primers,poptions_t options) +{ + uint32_t i; + ppairtree_t primerpairs; + + primerpairs = initpairtree(NULL); + + for (i=0; i < seqdbsize; i++) + { + buildPrimerPairsForOneSeq(i, seqdb, primers, primerpairs, options); + } + return primerpairs; +} + +#define DMAX (2000000000) + +static void buildPrimerPairsForOneSeq(uint32_t seqid, + pecodnadb_t seqdb, + pprimercount_t primers, + ppairtree_t pairs, + poptions_t options) +{ + static uint32_t paircount=0; + uint32_t i,j,k; + uint32_t matchcount=0; + pprimermatch_t matches = NULL; + //primermatchcount_t seqmatchcount; + ppair_t pcurrent; + pair_t current; + pprimer_t wswp; + bool_t bswp; + size_t distance; + bool_t strand; + //char prmr[50]; + //float mtemp; + word_t w1, w1a, omask = (0x1L << (options->strict_three_prime*2)) -1; + word_t w2, w2a;//, wtmp; + uint32_t bp1,bp2; + + //prmr[options->primer_length] = '\0'; + + for (i=0;i < primers->size; i++) + { + matchcount+=primers->primers[i].directCount[seqid]; + matchcount+=primers->primers[i].reverseCount[seqid]; + } + + if (matchcount <= 0) + return; + + matches = ECOMALLOC(matchcount * sizeof(primermatch_t),"Cannot allocate primers match table"); + + for (i=0,j=0;i < primers->size; i++) + { + if (primers->primers[i].directCount[seqid]) + { + if (primers->primers[i].directCount[seqid]==1) + { + matches[j].primer = primers->primers+i; + matches[j].strand=TRUE; + matches[j].position=primers->primers[i].directPos[seqid].value; + j++; + } + else for (k=0; k < primers->primers[i].directCount[seqid]; k++,j++) + { + matches[j].primer = primers->primers+i; + matches[j].strand=TRUE; + matches[j].position=primers->primers[i].directPos[seqid].pointer[k]; + } + } + + if (primers->primers[i].reverseCount[seqid]) + { + if (primers->primers[i].reverseCount[seqid]==1) + { + matches[j].primer = primers->primers+i; + matches[j].strand=FALSE; + matches[j].position=primers->primers[i].reversePos[seqid].value; + j++; + } + else for (k=0; k < primers->primers[i].reverseCount[seqid]; k++,j++) + { + matches[j].primer = primers->primers+i; + matches[j].strand=FALSE; + matches[j].position=primers->primers[i].reversePos[seqid].pointer[k]; + } + } + } + + if (matchcount>1) + { +// fprintf(stderr,"\n====================================\n"); + + sortmatch(matches,matchcount); // sort in ascending order by position + + for (i=0; i < matchcount;i++) + { + // For all primers matching the sequence + + /*for(j=i+1; + (jprimer_length) < options->lmax); + j++ + )//*/ + for (j=i+1; jprimer_length) continue; + distance = matches[j].position - matches[i].position - options->primer_length; + if (distance >= options->lmax) break; + + + // For all not too far primers + + if ( (matches[i].primer->good || matches[j].primer->good) + && (distance > options->lmin) + ) + { + // If possible primer pair + current.p1 = matches[i].primer; + current.asdirect1=matches[i].strand; + current.p2 = matches[j].primer; + current.asdirect2= !matches[j].strand; + current.maxd=DMAX; + current.mind=DMAX; + current.sumd=0; + current.amplifiacount=0; + current.inexample=0; + current.outexample=0; + current.curseqid = 0; + current.refsequence=-1; + //current.p1temp = 100; + //current.p1mintemp = 100; + //current.p2temp = 100; + //current.p2mintemp = 100; + + // Standardize the pair + strand = current.p2->word > current.p1->word; + if (!strand) + { + wswp = current.p1; + current.p1=current.p2; + current.p2=wswp; + + bswp = current.asdirect1; + current.asdirect1=current.asdirect2; + current.asdirect2=bswp; + } + + + //Code to make sure that if -3 option is given then + //3' end must match upto given number of base pairs + if (options->strict_three_prime > 0) + { + w1 = current.p1->word; + w2 = current.p2->word; + if (!current.asdirect1) //make sure that word is from 5' to 3' + w1=ecoComplementWord(w1,options->primer_length); + + if (!current.asdirect2) //make sure that word is from 5' to 3' + w2=ecoComplementWord(w2,options->primer_length); + //now both w1 and w2 are from 5' to 3' end + bp1 = matches[i].position; + bp2 = matches[j].position; + if (!strand) + { + bp1 = matches[j].position; + bp2 = matches[i].position; + } + //get word of first approximate repeat + w1a = extractSite(seqdb[seqid]->SQ,bp1,options->primer_length,strand); + //get word of second approximate repeat + w2a = extractSite(seqdb[seqid]->SQ,bp2,options->primer_length,!strand); + + w1 = w1 & omask; //keep only strict_three_prime bases on the right (3') end + w2 = w2 & omask; //keep only strict_three_prime bases on the right (3') end + w1a = w1a & omask; //keep only strict_three_prime bases on the right (3') end + w2a = w2a & omask; //keep only strict_three_prime bases on the right (3') end + + //now check that both words and primers of amplifia have same bases on 3' end + if ((w1 ^ w1a) != 0) continue; + if ((w2 ^ w2a) != 0) continue; + } + + + + // Look for the new pair in already seen pairs + + pcurrent = insertpair(current,pairs); + + + if (seqdb[seqid]->isexample) + + { + //pcurrent->inexample++; + pcurrent->sumd+=distance; + pcurrent->amplifiacount++; + + if ((pcurrent->maxd==DMAX) || (distance > pcurrent->maxd)) + pcurrent->maxd = distance; + + if (distance < pcurrent->mind) + pcurrent->mind = distance; + } + //else + // pcurrent->outexample++; + + //for each pair we save current sequence id in the pair + //when we see this pair for the first time in currnet sequence + //because we want to increment inexample & outexample count + //only once for one sequence + if (pcurrent->curseqid != (seqid+1)) + { + if (seqdb[seqid]->isexample) + pcurrent->inexample++; + else + pcurrent->outexample++; + + if (pcurrent->curseqid != 0) + pcurrent->curseqid = seqid+1; + } + + /*if ((pcurrent->outexample+pcurrent->inexample)==0) + { + fprintf(stderr,"pcurrent->outexample+pcurrent->inexample=0!\n"); + exit(0); + }*/ + + if (pcurrent->curseqid == 0)//((pcurrent->outexample+pcurrent->inexample)==1) + { + pcurrent->curseqid = seqid+1; + paircount++; + pcurrent->pcr.ampslot=200; + pcurrent->pcr.ampcount=0; + pcurrent->pcr.amplifias = ECOMALLOC(sizeof(amplifia_t)*pcurrent->pcr.ampslot, + "Cannot allocate amplifia table"); + } + else + { + if (pcurrent->pcr.ampslot==pcurrent->pcr.ampcount) + { + pcurrent->pcr.ampslot+=200; + pcurrent->pcr.amplifias = ECOREALLOC(pcurrent->pcr.amplifias, + sizeof(amplifia_t)*pcurrent->pcr.ampslot, + "Cannot allocate amplifia table"); + } + } + + if (seqid==options->refseqid) + pcurrent->refsequence=seqid; + pcurrent->pcr.amplifias[pcurrent->pcr.ampcount].length=distance; + pcurrent->pcr.amplifias[pcurrent->pcr.ampcount].sequence=seqdb[seqid]; + pcurrent->pcr.amplifias[pcurrent->pcr.ampcount].strand=strand; + pcurrent->pcr.amplifias[pcurrent->pcr.ampcount].begin=matches[i].position + options->primer_length; + pcurrent->pcr.amplifias[pcurrent->pcr.ampcount].end= matches[j].position - 1; + + if (strand) + pcurrent->pcr.amplifias[pcurrent->pcr.ampcount].amplifia= seqdb[seqid]->SQ + matches[i].position + options->primer_length; + else + pcurrent->pcr.amplifias[pcurrent->pcr.ampcount].amplifia= seqdb[seqid]->SQ + matches[j].position - 1 ; + + + /*strncpy (prmr, seqdb[seqid]->SQ + matches[i].position, options->primer_length); + mtemp = nparam_CalcSelfTM (options->pnparm, prmr, options->primer_length) - 273.0; + if (mtemp < pcurrent->p1mintemp) + pcurrent->p1mintemp = mtemp; + //fprintf (stderr, "prmr1: %s\n", seqdb[seqid]->SQ); + strncpy (prmr, seqdb[seqid]->SQ + matches[j].position, options->primer_length); + mtemp = nparam_CalcSelfTM (options->pnparm, prmr, options->primer_length) - 273.0; + if (mtemp < pcurrent->p2mintemp) + pcurrent->p2mintemp = mtemp; + //fprintf (stderr, "prmr2: %s\n", prmr); + + if (pcurrent->p1temp == 100) + pcurrent->p1temp = nparam_CalcSelfTM (options->pnparm, ecoUnhashWord(pcurrent->p1->word, options->primer_length), 0) - 273.0; + if (pcurrent->p2temp == 100) + pcurrent->p2temp = nparam_CalcSelfTM (options->pnparm, ecoUnhashWord(pcurrent->p2->word, options->primer_length), 0) - 273.0; + */ + pcurrent->pcr.ampcount++; +// fprintf(stderr,"%c%c W1 : %s direct : %c", +// "bG"[(int)pcurrent->p1->good], +// "bG"[(int)pcurrent->p2->good], +// ecoUnhashWord(pcurrent->p1->word, options->primer_length), +// "><"[(int)pcurrent->asdirect1] +// ); +// +// fprintf(stderr," W2 : %s direct : %c distance : %d (min/max/avg : %d/%d/%f) in/out: %d/%d %c (%d pairs)\n", +// ecoUnhashWord(pcurrent->p2->word, options->primer_length), +// "><"[(int)pcurrent->asdirect2], +// distance, +// pcurrent->mind,pcurrent->maxd, +// (pcurrent->inexample) ? (float)pcurrent->sumd/pcurrent->inexample:0.0, +// pcurrent->inexample,pcurrent->outexample, +// " N"[(pcurrent->outexample+pcurrent->inexample)==1], +// paircount +// +// ); +// + + } + } + } + } + pairs->count=paircount; + +} diff --git a/src/libecoprimer/pairtree.c b/src/libecoprimer/pairtree.c new file mode 100644 index 0000000..7155104 --- /dev/null +++ b/src/libecoprimer/pairtree.c @@ -0,0 +1,136 @@ +/* + * pairtree.c + * + * Created on: 7 mars 2009 + * Author: coissac + */ + +#include "ecoprimer.h" +#include + +static void cleanpair(ppair_t pair); +static void deletepairlist(ppairlist_t list); +static int cmppair(const void* p1,const void*p2); + + +static void cleanamplifiatlist(pamplifiacount_t list) +{ + if (list->amplifias) + ECOFREE(list->amplifias, + "Free amplifia list"); +} + +static void cleanpair(ppair_t pair) +{ + cleanamplifiatlist(&(pair->pcr)); +} + +static ppairlist_t newpairlist(ppairlist_t parent, size_t size) +{ + ppairlist_t tmp; + + tmp=ECOMALLOC(sizeof(pairlist_t)+sizeof(pair_t)*(size-1), + "Cannot allocate new pair list"); + + tmp->pairslots=size; + tmp->paircount=0; + tmp->next=NULL; + + if (parent) + parent->next=(void*)tmp; + + + return tmp; +} + +static void deletepairlist(ppairlist_t list) +{ + size_t i; + + if (list) + { + if (list->next) + { + deletepairlist(list->next); + list->next=NULL; + } + for (i=0; i < list->paircount; i++) + cleanpair((list->pairs)+i); + + ECOFREE(list,"Delete pair list"); + } + +} + +static int cmppair(const void* p1,const void*p2) +{ + ppair_t pr1,pr2; + + pr1=(ppair_t)p1; + pr2=(ppair_t)p2; + + if (pr1->p1 < pr2->p1) return -1; + if (pr1->p1 > pr2->p1) return 1; + + if (pr1->asdirect1 < pr2->asdirect1) return -1; + if (pr1->asdirect1 > pr2->asdirect1) return 1; + + if (pr1->p2 < pr2->p2) return -1; + if (pr1->p2 > pr2->p2) return 1; + + if (pr1->asdirect2 < pr2->asdirect2) return -1; + if (pr1->asdirect2 > pr2->asdirect2) return 1; + + return 0; +} + +ppair_t pairintree (pair_t key, + ppairtree_t pairlist) +{ + if (!pairlist->tree) + return NULL; + + return *((ppair_t*)tsearch((const void *)(&key), + &(pairlist->tree), + cmppair + )); +} + +ppair_t insertpair(pair_t key, + ppairtree_t list) +{ + ppair_t current; + ppair_t found; + + if (list->last->paircount==list->last->pairslots) + { + list->last->next=newpairlist(list->last,100); + list->last=list->last->next; + } + + current = list->last->pairs + list->last->paircount; + *current=key; + + found = *((ppair_t*)tsearch((const void *)current, + &(list->tree), + cmppair)); + if (found==current) + list->last->paircount++; + + return found; +} + +ppairtree_t initpairtree(ppairtree_t tree) +{ + + if (!tree) + tree = ECOMALLOC(sizeof(pairtree_t),"Cannot allocate pair tree"); + + tree->first=newpairlist(NULL,300); + tree->last=tree->first; + + tree->tree=NULL; + tree->count=0; + + return tree; +} diff --git a/src/libecoprimer/queue.c b/src/libecoprimer/queue.c new file mode 100644 index 0000000..7d11b25 --- /dev/null +++ b/src/libecoprimer/queue.c @@ -0,0 +1,100 @@ +/* + * queue.c + * + * Created on: 14 nov. 2008 + * Author: coissac + */ + +#include "ecoprimer.h" + + + +pqueue_t newQueue(pqueue_t queue, uint32_t size) +{ + if (!queue) + queue = ECOMALLOC(sizeof(queue_t),"Cannot allocate queue structure"); + + queue->size=0; + + resizeQueue(queue,size); + + return queue; + +} + +pqueue_t resizeQueue(pqueue_t queue, uint32_t size) +{ + queue->pop=0; + queue->push=0; + queue->empty=TRUE; + queue->full=FALSE; + + if (!queue->size) + { + queue->count=ECOMALLOC(size * sizeof(uint32_t), + "Cannot allocate count queue array" + ); + queue->words=ECOMALLOC(size * sizeof(word_t), + "Cannot allocate word queue array" + ); + queue->size=size; + } + else if (size > queue->size) + { + queue->count=ECOREALLOC(queue->count, + size * sizeof(uint32_t), + "Cannot allocate count queue array" + ); + queue->words=ECOREALLOC(queue->words, + size * sizeof(word_t), + "Cannot allocate word queue array" + ); + + queue->size=size; + } + + return queue; +} + +pqueue_t cleanQueue(pqueue_t queue) +{ + if (queue->size) + { + if (queue->count) + ECOFREE(queue->count,"Free count queue"); + if (queue->words) + ECOFREE(queue->words,"Free words queue"); + } + + queue->size=0; + + return queue; +} + +void push(pqueue_t queue, word_t word, uint32_t count) +{ + ECO_ASSERT(!queue->full,"Queue is full"); + + queue->count[queue->push]=count; + queue->words[queue->push]=word; + + queue->push++; + + if (queue->push==queue->size) + queue->push=0; + + queue->full=queue->push==queue->pop; + queue->empty=FALSE; +} + +void pop(pqueue_t queue) +{ + ECO_ASSERT(!queue->empty,"Queue is empty"); + queue->pop++; + + if (queue->pop==queue->size) + queue->pop=0; + + queue->empty=queue->push==queue->pop; + queue->full=FALSE; +} diff --git a/src/libecoprimer/readdnadb.c b/src/libecoprimer/readdnadb.c new file mode 100644 index 0000000..ced45c5 --- /dev/null +++ b/src/libecoprimer/readdnadb.c @@ -0,0 +1,59 @@ +/* + * readdnadb.c + * + * Created on: 7 nov. 2008 + * Author: coissac + */ + +#include "ecoprimer.h" + +pecodnadb_t readdnadb(const char *name, ecotaxonomy_t *taxonomy, uint32_t *size,poptions_t options) +{ + ecoseq_t *seq; + uint32_t buffsize=100; + pecodnadb_t db; + + db = ECOMALLOC(buffsize*sizeof(ecoseq_t*),"I cannot allocate db memory"); + + + for(seq=ecoseq_iterator(name), *size=0; + seq; + seq=ecoseq_iterator(NULL) + ) + { + if (isExampleTaxon(taxonomy,seq->taxid,options) || + isCounterExampleTaxon(taxonomy,seq->taxid,options)) + { + if (*size==buffsize) + { + buffsize*=2; + db = ECOREALLOC(db,buffsize*sizeof(ecoseq_t*),"I cannot allocate db memory"); + } + db[*size]=seq; + (*size)++; + } + else + { + delete_ecoseq(seq); + } + }; + + db = ECOREALLOC(db,(*size)*sizeof(ecoseq_t*),"I cannot allocate db memory"); + + return db; +} + + +void printSeqTest(pecodnadb_t seqdb,uint32_t seqdbsize) +{ + uint32_t i; + char ch[11]; + ch [10] = '\0'; + + for (i=0; i < seqdbsize; i++) + { + strncpy (ch, seqdb[i]->SQ, 10); + fprintf (stderr, "seq %d = %s\n", i, ch); + } + exit (0); +} diff --git a/src/libecoprimer/smothsort.c b/src/libecoprimer/smothsort.c new file mode 100644 index 0000000..72ee444 --- /dev/null +++ b/src/libecoprimer/smothsort.c @@ -0,0 +1,265 @@ +/* + * This file is part of the Sofia-SIP package + * + * Copyright (C) 2005 Nokia Corporation. + * + * Contact: Pekka Pessi + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA + * + */ + +/**@file smoothsort.c + * @brief Smoothsort implementation + * + * Smoothsort is a in-place sorting algorithm with performance of O(NlogN) + * in worst case and O(n) in best case. + * + * @sa + * "Smoothsort, an alternative for sorting in-situ", E.D. Dijkstra, EWD796a, + * <http://www.enterag.ch/hartwig/order/smoothsort.pdf>. + * + * @author Pekka Pessi + */ + + +#include +#include +#include +#include /* add sto switch from size_t to uint32_t */ + +/** Description of current stretch */ +typedef struct { + uint32_t b, c; /**< Leonardo numbers */ + unsigned long long p; /**< Concatenation codification */ +} stretch; + +/** Description of array */ +typedef struct +{ + void *m; + int (*less)(void *m, uint32_t a, uint32_t b); + void (*swap)(void *m, uint32_t a, uint32_t b); +} array; + +static inline uint32_t stretch_up(stretch s[1]) +{ + uint32_t next; + + s->p >>= 1; + + next = s->b + s->c + 1, s->c = s->b, s->b = next; + + return next; +} + +static inline uint32_t stretch_down(stretch s[1], unsigned bit) +{ + uint32_t next; + + s->p <<= 1, s->p |= bit; + + next = s->c, s->c = s->b - s->c - 1, s->b = next; + + return next; +} + +#if DEBUG_SMOOTHSORT +static char const *binary(unsigned long long p) +{ + static char binary[65]; + int i; + + if (p == 0) + return "0"; + + binary[64] = 0; + + for (i = 64; p; p >>= 1) + binary[--i] = "01"[p & 1]; + + return binary + i; +} +#else +#define DEBUG(x) ((void)0) +#endif + +/** + * Sift the root of the stretch. + * + * The low values are sifted up (towards index 0) from root. + * + * @param array description of array to sort + * @param r root of the stretch + * @param s description of current stretch + */ +static void sift(array const *array, uint32_t r, stretch s) +{ + while (s.b >= 3) { + uint32_t r2 = r - s.b + s.c; + + if (!array->less(array->m, r - 1, r2)) { + r2 = r - 1; + stretch_down(&s, 0); + } + + if (array->less(array->m, r2, r)) + break; + + DEBUG(("\tswap(%p @%zu <=> @%zu)\n", array, r, r2)); + + array->swap(array->m, r, r2); r = r2; + + stretch_down(&s, 0); + } +} + +/** Trinkle the roots of the given stretches + * + * @param array description of array to sort + * @param r root of the stretch + * @param s description of stretches to concatenate + */ +static void trinkle(array const *array, uint32_t r, stretch s) +{ + DEBUG(("trinkle(%p, %zu, (%u, %s))\n", array, r, s.b, binary(s.p))); + + while (s.p != 0) { + uint32_t r2, r3; + + while ((s.p & 1) == 0) + stretch_up(&s); + + if (s.p == 1) + break; + + r3 = r - s.b; + + if (array->less(array->m, r3, r)) + break; + + s.p--; + + if (s.b < 3) { + DEBUG(("\tswap(%p @%zu <=> @%zu b=%u)\n", array, r, r3, s.b)); + array->swap(array->m, r, r3); r = r3; + continue; + } + + r2 = r - s.b + s.c; + + if (array->less(array->m, r2, r - 1)) { + r2 = r - 1; + stretch_down(&s, 0); + } + + if (array->less(array->m, r2, r3)) { + DEBUG(("swap(%p [%zu]=[%zu])\n", array, r, r3)); + array->swap(array->m, r, r3); r = r3; + continue; + } + + DEBUG(("\tswap(%p @%zu <=> @%zu b=%u)\n", array, r, r2, s.b)); + array->swap(array->m, r, r2); r = r2; + stretch_down(&s, 0); + break; + } + + sift(array, r, s); +} + +/** Trinkles the stretches when the adjacent stretches are already trusty. + * + * @param array description of array to sort + * @param r root of the stretch + * @param stretch description of stretches to trinkle + */ +static void semitrinkle(array const *array, uint32_t r, stretch s) +{ + uint32_t r1 = r - s.c; + + DEBUG(("semitrinkle(%p, %zu, (%u, %s))\n", array, r, s.b, binary(s.p))); + + if (array->less(array->m, r, r1)) { + DEBUG(("\tswap(%p @%zu <=> @%zu b=%u)\n", array, r, r1, s.b)); + array->swap(array->m, r, r1); + trinkle(array, r1, s); + } +} + +/** Sort array using smoothsort. + * + * Sort @a N elements from array @a base starting with index @a r with smoothsort. + * + * @param base pointer to array + * @param r lowest index to sort + * @param N number of elements to sort + * @param less comparison function returning nonzero if m[a] < m[b] + * @param swap swapper function exchanging elements m[a] and m[b] + */ +void su_smoothsort(void *base, uint32_t r, uint32_t N, + int (*less)(void *m, uint32_t a, uint32_t b), + void (*swap)(void *m, uint32_t a, uint32_t b)) +{ + stretch s = { 1, 1, 1 }; + uint32_t q; + + array const array[1] = {{ base, less, swap }}; + + assert(less && swap); + + if (base == NULL || N <= 1 || less == NULL || swap == NULL) + return; + + DEBUG(("\nsmoothsort(%p, %zu)\n", array, nmemb)); + + for (q = 1; q != N; q++, r++, s.p++) { + DEBUG(("loop0 q=%zu, b=%u, p=%s \n", q, s.b, binary(s.p))); + + if ((s.p & 7) == 3) { + sift(array, r, s), stretch_up(&s), stretch_up(&s); + } + else /* if ((s.p & 3) == 1) */ { assert((s.p & 3) == 1); + if (q + s.c < N) + sift(array, r, s); + else + trinkle(array, r, s); + + while (stretch_down(&s, 0) > 1) + ; + } + } + + trinkle(array, r, s); + + for (; q > 1; q--) { + s.p--; + + DEBUG(("loop1 q=%zu: b=%u p=%s\n", q, s.b, binary(s.p))); + + if (s.b <= 1) { + while ((s.p & 1) == 0) + stretch_up(&s); + --r; + } + else /* if b >= 3 */ { + if (s.p) semitrinkle(array, r - (s.b - s.c), s); + stretch_down(&s, 1); + semitrinkle(array, --r, s); + stretch_down(&s, 1); + } + } +} diff --git a/src/libecoprimer/sortmatch.c b/src/libecoprimer/sortmatch.c new file mode 100644 index 0000000..f3771b7 --- /dev/null +++ b/src/libecoprimer/sortmatch.c @@ -0,0 +1,51 @@ +/* + * sortmatch.c + * + * Created on: 15 dŽc. 2008 + * Author: coissac + */ + +/* + * sortword.c + * + * + * Created on: 6 nov. 2008 + * Author: coissac + */ + +#include "ecoprimer.h" +#include + +void su_smoothsort(void *base, uint32_t r, uint32_t N, + int (*less)(void *m, uint32_t a, uint32_t b), + void (*swap)(void *m, uint32_t a, uint32_t b)); + +static int less(void *m, uint32_t a, uint32_t b); +static void swap(void *m, uint32_t a, uint32_t b); + + +void sortmatch(pprimermatch_t table,uint32_t N) +{ + su_smoothsort((void*)table,0,N,less,swap); +} + +int less(void *m, uint32_t a, uint32_t b) +{ + pprimermatch_t t; + + t = (pprimermatch_t)m; + + return t[a].position <= t[b].position; +} + +void swap(void *m, uint32_t a, uint32_t b) +{ + primermatch_t tmp; + pprimermatch_t t; + + t = (pprimermatch_t)m; + tmp = t[a]; + t[a]= t[b]; + t[b]= tmp; +} + diff --git a/src/libecoprimer/sortword.c b/src/libecoprimer/sortword.c new file mode 100644 index 0000000..389630f --- /dev/null +++ b/src/libecoprimer/sortword.c @@ -0,0 +1,44 @@ +/* + * sortword.c + * + * + * Created on: 6 nov. 2008 + * Author: coissac + */ + +#include "ecoprimer.h" +#include + +void su_smoothsort(void *base, uint32_t r, uint32_t N, + int (*less)(void *m, uint32_t a, uint32_t b), + void (*swap)(void *m, uint32_t a, uint32_t b)); + +static int less(void *m, uint32_t a, uint32_t b); +static void swap(void *m, uint32_t a, uint32_t b); + + +void sortword(pword_t table,uint32_t N) +{ + su_smoothsort((void*)table,0,N,less,swap); +} + +int less(void *m, uint32_t a, uint32_t b) +{ + pword_t t; + + t = (pword_t)m; + + return WORD(t[a]) <= WORD(t[b]); +} + +void swap(void *m, uint32_t a, uint32_t b) +{ + word_t tmp; + pword_t t; + + t = (pword_t)m; + tmp = t[a]; + t[a]= t[b]; + t[b]= tmp; +} + diff --git a/src/libecoprimer/strictprimers.c b/src/libecoprimer/strictprimers.c new file mode 100644 index 0000000..b20587e --- /dev/null +++ b/src/libecoprimer/strictprimers.c @@ -0,0 +1,264 @@ +/* + * strictprimers.c + * + * Created on: 7 nov. 2008 + * Author: coissac + */ + +#define _GNU_SOURCE +#include "ecoprimer.h" +#include +#include +#include +#include +#include + +#ifndef RUSAGE_SELF +#define RUSAGE_SELF 0 +#define RUSAGE_CHILDREN -1 +#endif + +static double timeval_subtract (struct timeval *x, struct timeval *y); + + + /* Subtract the `struct timeval' values X and Y, + Return elapsed secondes as a double. */ + +double timeval_subtract (struct timeval *x, struct timeval *y) +{ + struct timeval result; + + /* Perform the carry for the later subtraction by updating y. */ + if (x->tv_usec < y->tv_usec) { + int nsec = (y->tv_usec - x->tv_usec) / 1000000 + 1; + y->tv_usec -= 1000000 * nsec; + y->tv_sec += nsec; + } + if (x->tv_usec - y->tv_usec > 1000000) { + int nsec = (x->tv_usec - y->tv_usec) / 1000000; + y->tv_usec += 1000000 * nsec; + y->tv_sec -= nsec; + } + + /* Compute the time remaining to wait. + tv_usec is certainly positive. */ + result.tv_sec = x->tv_sec - y->tv_sec; + result.tv_usec = x->tv_usec - y->tv_usec; + + return (double)result.tv_sec + (double)result.tv_usec/1e6; + } + +pwordcount_t initCountTable(pwordcount_t table, uint32_t wordsize, uint32_t circular, uint32_t doublestrand,uint32_t seqQuorum,ecoseq_t *seq,int32_t *neededWords,uint32_t neededWordCount) +{ + uint32_t i; + uint32_t buffsize; + //wordcount_t t; + + if (!table) + table = ECOMALLOC(sizeof(wordcount_t),"Cannot allocate memory for word count structure"); + + table->words=NULL; + table->size =0; + table->outseqcount=0; + table->inseqcount=0; + table->strictcount =0; + + if (seq) + { + table->words = ecoHashSequence(NULL,wordsize,circular,doublestrand,seq,&buffsize,neededWords,neededWordCount,seqQuorum); + table->size = ecoCompactHashSequence(table->words,buffsize); + + table->inseqcount=1; + table->strictcount =ECOMALLOC((table->size*sizeof(uint32_t)), + "Cannot allocate memory for word count table" + ); + + for (i=0; i < table->size; i++) table->strictcount[i]=1; + } + + return table; +} + +void addSeqToWordCountTable(pwordcount_t table, uint32_t wordsize, uint32_t circular, uint32_t doublestrand,uint32_t exampleCount,uint32_t seqQuorum,ecoseq_t *seq,int32_t *neededWords,uint32_t neededWordCount) +{ + uint32_t buffersize; + pword_t newtable; + uint32_t newsize; + uint32_t i; + + buffersize = table->size + ecoWordCount(wordsize,circular,seq); + + table->words = ECOREALLOC(table->words,buffersize*sizeof(word_t), + "\n\nCannot allocate memory to extend word table" ); + + + newtable = table->words + table->size; + +// DEBUG_LOG("Words = %x (%u) new = %x", table->words,table->size,newtable); + + (void)ecoHashSequence(newtable,wordsize,circular,doublestrand,seq,&newsize,neededWords,neededWordCount,seqQuorum); +// DEBUG_LOG("new seq wordCount : %d",newsize); + + newsize = ecoCompactHashSequence(newtable,newsize); + +// DEBUG_LOG("compacted wordCount : %d",newsize); + buffersize = table->size + newsize; + + // resize the count buffer + + table->inseqcount++; + + //fprintf (stderr, "\nOldAddress: %x", table->strictcount); + table->strictcount = ECOREALLOC(table->strictcount,(buffersize+5000)*sizeof(uint32_t), + "Cannot allocate memory to extend example word count table"); + //fprintf (stderr, " NewAddress: %x\n", table->strictcount); + + for (i=table->size; i < buffersize; i++) + table->strictcount[i]=1; + + + + // Now we have to merge in situ the two tables + + ecomerge(table,table->size,newsize,exampleCount - table->inseqcount,seqQuorum); +// DEBUG_LOG("Dictionnary size : %d",table->size); + +} + +pwordcount_t lookforStrictPrimer(pecodnadb_t database, uint32_t seqdbsize, + uint32_t exampleCount,poptions_t options) +{ + struct rusage start; + struct rusage usage; + double seconde; + char *logfilename; + FILE *logfile; + uint32_t i; + bool_t first=TRUE; + pwordcount_t strictprimers=NULL; + uint64_t totallength=0; + uint32_t sequenceQuorum = (uint32_t)floor((float)exampleCount * options->strict_quorum); + int32_t *neededWords; + uint32_t neededWordCount; + + fprintf(stderr,"Filtering... "); + + if (options->filtering) + neededWords = filteringSeq(database,seqdbsize,exampleCount,options,&neededWordCount,(int32_t)sequenceQuorum); + else + { + neededWordCount=0; + neededWords=NULL; + } + + if (options->statistics) + { + asprintf(&logfilename,"ecoprimer_%d.log",getpid()); + logfile = fopen(logfilename,"w"); + fprintf(logfile,"# seq\tlength\tsize\ttime\tspeed\n"); + fclose(logfile); + } + + + fprintf(stderr," Primers should be at least present in %d/%d example sequences\n",sequenceQuorum,exampleCount); + + strictprimers = initCountTable(NULL,options->primer_length, + options->circular, + options->doublestrand, + 0, + NULL,NULL,0); + + + getrusage(RUSAGE_SELF,&start); + + for (i=0;iisexample && database[i]->SQ_length > options->primer_length) + { + + if (first) + { + strictprimers = initCountTable(strictprimers,options->primer_length, + options->circular, + options->doublestrand, + sequenceQuorum, + database[i],neededWords,neededWordCount); + first=FALSE; + } + else + { + uint32_t s; + s = strictprimers->size; +// DEBUG_LOG("stack size : %u",s); + addSeqToWordCountTable(strictprimers,options->primer_length, + options->circular, + options->doublestrand, + exampleCount, + sequenceQuorum, + database[i],neededWords,neededWordCount); + }; + totallength+=database[i]->SQ_length; + getrusage(RUSAGE_SELF,&usage); + if (options->statistics) + { + asprintf(&logfilename,"ecoprimer_%d.log",getpid()); + logfile = fopen(logfilename,"a"); + seconde = timeval_subtract(&(usage.ru_utime),&(start.ru_utime)) + + timeval_subtract(&(usage.ru_stime),&(start.ru_stime)); + fprintf(logfile,"%d\t%llu\t%lu\t%8.3f\t%8.3e\n",i, + (long long unsigned)totallength, + strictprimers->size*(sizeof(int64_t)+sizeof(int32_t)), + seconde,seconde/(double)totallength); + fclose(logfile); + } + } + else + strictprimers->outseqcount++; + + fprintf(stderr," Indexed sequences %5d/%5d : considered words %-10llu \r", + (int32_t)i+1,(int32_t)seqdbsize, + (long long unsigned)strictprimers->size); + +// DEBUG_LOG("First word : %s ==> %d",ecoUnhashWord(strictprimers->words[0],18),strictprimers->incount[0]) +// DEBUG_LOG("Second word : %s ==> %d",ecoUnhashWord(strictprimers->words[1],18),strictprimers->incount[1]) + } + + strictprimers->strictcount = ECOREALLOC(strictprimers->strictcount, + sizeof(uint32_t)*strictprimers->size, + "Cannot reallocate strict primer count table"); + strictprimers->words = ECOREALLOC(strictprimers->words, + sizeof(word_t)*strictprimers->size, + "Cannot reallocate strict primer table"); + + if (neededWords) + ECOFREE(neededWords,"Clean needed word table"); + + return strictprimers; +} + +uint32_t filterMultiStrictPrimer(pwordcount_t strictprimers) +{ + uint32_t i; + uint32_t w; + + for (i=0,w=0;i < strictprimers->size;i++) + { + if (w < i) + { + strictprimers->words[w]=strictprimers->words[i]; + strictprimers->strictcount[w]=strictprimers->strictcount[i]; + } + if (! ISMULTIWORD(strictprimers->words[w])) + w++; + } + + strictprimers->size=w; + strictprimers->strictcount = ECOREALLOC(strictprimers->strictcount, + sizeof(uint32_t)*strictprimers->size, + "Cannot reallocate strict primer count table"); + strictprimers->words = ECOREALLOC(strictprimers->words, + sizeof(word_t)*strictprimers->size, + "Cannot reallocate strict primer table"); + + return w; +} diff --git a/src/libecoprimer/taxstats.c b/src/libecoprimer/taxstats.c new file mode 100644 index 0000000..0898303 --- /dev/null +++ b/src/libecoprimer/taxstats.c @@ -0,0 +1,378 @@ +/* + * taxstats.c + * + * Created on: 12 mars 2009 + * Author: coissac + */ + +#include +//void tdestroy (void *root, void (*free_node)(void *nodep)); + +#include "ecoprimer.h" + +static int cmptaxon(const void *t1, const void* t2); + +void **tree_root = NULL; +int delete_passes = 0; + +void delete_twalkaction (const void *node, VISIT order, int level) +{ + switch (order) + { + case preorder: + delete_passes++; + break; + case postorder: + delete_passes++; + break; + case endorder: + delete_passes++; + break; + case leaf: + if (tree_root) + tdelete (node, tree_root,cmptaxon); + delete_passes++; + break; + } +} + +void free_tree_nodes (void *tree) +{ + while (1) + { + delete_passes = 0; + twalk (tree, delete_twalkaction); + if (delete_passes <= 1) break; + } +} + +static int cmptaxon(const void *t1, const void* t2) +{ + const size_t taxid1=(size_t)t1; + const size_t taxid2=(size_t)t2; + + // fprintf(stderr,"==> counted taxid1 : %d\n",taxid1); + // fprintf(stderr,"==> counted taxid2 : %d\n",taxid2); + + if (taxid1 < taxid2) + return -1; + if (taxid1 > taxid2) + return +1; + return 0; +} + +int32_t counttaxon(int32_t taxid) +{ + static void* taxontree=NULL; + static int32_t taxoncount=0; + + // fprintf(stderr,"counted taxid : %d taxontree %p\n",taxid,taxontree); + + if (taxid==-1) + { + if (taxontree) + { + tree_root = (void **)&taxontree; + //free_tree_nodes (taxontree); + ECOFREE(taxontree,"Free taxon tree"); + tree_root = NULL; + } + taxontree=NULL; + taxoncount=0; + return 0; + } + + + if ((taxid > 0) && ((!taxontree) || (!tfind((void*)((size_t)taxid),&taxontree,cmptaxon)))) + { + tsearch((void*)((size_t)taxid),&taxontree,cmptaxon); + taxoncount++; + } + return taxoncount; +} + +int32_t getrankdbstats(pecodnadb_t seqdb, uint32_t seqdbsize, ecotaxonomy_t *taxonomy, + poptions_t options) +{ + + uint32_t i; + ecotx_t *taxon; + ecotx_t *tmptaxon; + + counttaxon(-1); + options->intaxa = 0; + + for (i=0;itaxons->taxon[seqdb[i]->taxid]); + seqdb[i]->isexample=isExampleTaxon(taxonomy,seqdb[i]->taxid,options); + + tmptaxon = eco_findtaxonatrank(taxon, + options->taxonrankidx); + + // fprintf(stderr,"Taxid : %d %p\n",taxon->taxid,tmptaxon); + + if (tmptaxon) + { + // fprintf(stderr,"orig : %d trans : %d\n",taxon->taxid, + // tmptaxon->taxid); + + seqdb[i]->ranktaxonid=tmptaxon->taxid; + if (seqdb[i]->isexample) + options->intaxa = counttaxon(tmptaxon->taxid); + } + else + seqdb[i]->ranktaxonid=-1; + } + + counttaxon(-1); + options->outtaxa = 0; + + for (i=0;iranktaxonid>=0 && !seqdb[i]->isexample) + options->outtaxa = counttaxon(seqdb[i]->ranktaxonid); + } + + return options->outtaxa + options->intaxa; +} + + +float taxonomycoverage(ppair_t pair, poptions_t options, pecodnadb_t seqdb,uint32_t seqdbsize) +{ + int32_t seqcount; + int32_t i; + int32_t incount=0; + int32_t outcount=0; + uint32_t j; + + + memset (pair->coveredSeqs, 0, seqdbsize*sizeof (int)); + seqcount=pair->pcr.ampcount; + + counttaxon(-1); + for (i=0; i < seqcount; i++) + if (pair->pcr.amplifias[i].sequence->isexample + && pair->pcr.amplifias[i].sequence->ranktaxonid > 0 ) + { + incount = counttaxon(pair->pcr.amplifias[i].sequence->ranktaxonid); + + for (j=0; jpcr.amplifias[i].sequence == seqdb[j]) + {pair->coveredSeqs[j] = 1; break;} + } + + counttaxon(-1); + for (i=0; i < seqcount; i++) + if (!pair->pcr.amplifias[i].sequence->isexample + && pair->pcr.amplifias[i].sequence->ranktaxonid) + outcount = counttaxon(pair->pcr.amplifias[i].sequence->ranktaxonid); + + + pair->intaxa=incount; + pair->outtaxa=outcount; + pair->bc=(float)incount/options->intaxa; + return pair->bc; +} + +/* +static int cmpamp(const void *ampf1, const void* ampf2) +{ + int i; + int j = 0; + int incr = 1; + char cd1; + char cd2; + int chd = 0; + int len = 0; + + pamptotaxon_t pampf1 = (pamptotaxon_t) ampf1; + pamptotaxon_t pampf2 = (pamptotaxon_t) ampf2; + + + if (pampf1->strand != pampf2->strand) + { + incr = -1; + j = pampf1->length - 1; + + if (pampf2->strand) + { + pampf1 = (pamptotaxon_t) ampf2; + pampf2 = (pamptotaxon_t) ampf1; + chd = 1; + } + //j = pampf2->length - 1; should have been here and pampf2 instead of pampf1? + } + + len = (pampf1->length <= pampf2->length)? pampf1->length: pampf2->length; + + for (i = 0; i < len; i++, j += incr) + { + cd1 = pampf1->amplifia[i]; + if (incr == -1) + cd2 = ecoComplementChar(pampf2->amplifia[j]); + else + cd2 = pampf2->amplifia[j]; + + if (cd1 < cd2) return chd ? 1: -1; + if (cd2 < cd1) return chd ? -1: 1; + } + + if (pampf1->length > pampf2->length) return chd ? -1: 1; + if (pampf2->length > pampf1->length) return chd ? 1: -1; + + return 0; +}*/ + + +static int cmpamp(const void *ampf1, const void* ampf2) +{ + int i; + char cd1; + char cd2; + int len = 0; + char *ch1; + char *ch2; + int incr1; + int incr2; + + pamptotaxon_t pampf1 = (pamptotaxon_t) ampf1; + pamptotaxon_t pampf2 = (pamptotaxon_t) ampf2; + + ch1 = pampf1->amplifia; + ch2 = pampf2->amplifia; + + incr1 = 1; + incr2 = 1; + + if (!pampf1->strand) + incr1 = -1; + if (!pampf2->strand) + incr2 = -1; + + len = (pampf1->length <= pampf2->length)? pampf1->length: pampf2->length; + for (i = 0; i < len; i++) + { + cd1 = *ch1; + if (incr1 == -1) + cd1 = ecoComplementChar(*ch1); + + cd2 = *ch2; + if (incr2 == -1) + cd2 = ecoComplementChar(*ch2); + + if (cd1 < cd2) return -1; + if (cd2 < cd1) return 1; + + ch1 += incr1; + ch2 += incr2; + } + + if (pampf1->length > pampf2->length) return 1; + if (pampf2->length > pampf1->length) return -1; + + return 0; +} + +void twalkaction (const void *node, VISIT order, int level) +{ + int32_t *taxid = (int32_t*)node; + //const size_t taxid=(size_t)node; + //printf ("\t%d:%p, ", *taxid, node); + counttaxon(*taxid); +} + +int32_t gtxid; +void twalkaction2 (const void *node, VISIT order, int level) +{ + int32_t *pt = (int32_t *) node; + gtxid = *pt; +} + +void taxonomyspecificity (ppair_t pair, pecodnadb_t seqdb,uint32_t seqdbsize) +{ + uint32_t i, j; + uint32_t ampfindex = 0; + int32_t taxid; + uint32_t wellidentifiedcount; + + void *ampftree = NULL; + pamptotaxon_t pcurrentampf; + pamptotaxon_t *ptmp; + + pamptotaxon_t ampfwithtaxtree = ECOMALLOC(sizeof(amptotaxon_t) * pair->pcr.ampcount,"Cannot allocate amplifia tree"); + + for (i = 0; i < pair->pcr.ampcount; i++) + { + /*populate taxon ids tree against each unique amplifia + i.e set of taxon ids for each amplifia*/ + if (pair->pcr.amplifias[i].sequence->isexample) + { + ampfwithtaxtree[ampfindex].amplifia = pair->pcr.amplifias[i].amplifia; + ampfwithtaxtree[ampfindex].strand = pair->pcr.amplifias[i].strand; + ampfwithtaxtree[ampfindex].length = pair->pcr.amplifias[i].length; + pcurrentampf = &fwithtaxtree[ampfindex]; + taxid = pair->pcr.amplifias[i].sequence->ranktaxonid; + ptmp = tfind((const void*)pcurrentampf, &ftree, cmpamp); + if (ptmp == NULL) + { + pcurrentampf = &fwithtaxtree[ampfindex]; + tsearch((void*)pcurrentampf,&ftree,cmpamp); + ampfindex++; + } + else + pcurrentampf = *ptmp; + + if (tfind((void*)((size_t)taxid), &(pcurrentampf->taxontree), cmptaxon) == NULL) + { + pcurrentampf->taxoncount++; + tsearch((void*)((size_t)taxid),&(pcurrentampf->taxontree),cmptaxon); + } + } + } + + memset (pair->wellIdentifiedSeqs, 0, seqdbsize*sizeof (int)); + //counttaxon(-1); + for (i = 0; i < ampfindex; i++) + { + if (ampfwithtaxtree[i].taxoncount > 1) + { + //printf ("\nampfwithtaxtree[i].taxoncount: %d\n", ampfwithtaxtree[i].taxoncount); + //twalk(ampfwithtaxtree[i].taxontree, twalkaction); + } + //TR 5/9/10 - added code for well identified seqs + else if(ampfwithtaxtree[i].taxoncount == 1) /*well identified*/ + { + gtxid = -1; + twalk(ampfwithtaxtree[i].taxontree, twalkaction2); + + if (gtxid != -1) + { + for (j = 0; j < seqdbsize; j++) + if (seqdb[j]->ranktaxonid == gtxid + && seqdb[j]->isexample + &&(pair->p1->directCount[j] > 0 + || pair->p1->reverseCount[j] > 0) + && (pair->p2->directCount[j] > 0 + || pair->p2->reverseCount[j] > 0)) + { + pair->wellIdentifiedSeqs[j] = 1; + } + } + } + } + //printf ("\n"); + counttaxon(-1); + wellidentifiedcount = 0; + for (j = 0; j < seqdbsize; j++) + if (pair->wellIdentifiedSeqs[j] == 1) + counttaxon(seqdb[j]->ranktaxonid); + wellidentifiedcount = counttaxon(-2); + //pair->notwellidentifiedtaxa = counttaxon(-2); + pair->notwellidentifiedtaxa = (pair->intaxa-wellidentifiedcount); //counttaxon(-2); + //pair->bs = ((float)pair->intaxa - (float)pair->notwellidentifiedtaxa) / pair->intaxa; + pair->bs = ((float)wellidentifiedcount) / (float)pair->intaxa; + + ECOFREE (ampfwithtaxtree, "Free amplifia table"); + +} diff --git a/src/libthermo/Makefile b/src/libthermo/Makefile new file mode 100644 index 0000000..1685cba --- /dev/null +++ b/src/libthermo/Makefile @@ -0,0 +1,23 @@ + +SOURCES = nnparams.c \ + thermostats.c + +SRCS=$(SOURCES) + +OBJECTS= $(patsubst %.c,%.o,$(SOURCES)) + +LIBFILE= libthermo.a +RANLIB= ranlib + + +include ../global.mk + + +all: $(LIBFILE) + +clean: + rm -rf $(OBJECTS) $(LIBFILE) + +$(LIBFILE): $(OBJECTS) + ar -cr $@ $? + $(RANLIB) $@ diff --git a/src/libthermo/nnparams.c b/src/libthermo/nnparams.c new file mode 100644 index 0000000..f4b4937 --- /dev/null +++ b/src/libthermo/nnparams.c @@ -0,0 +1,600 @@ +/* + * nnparams.cpp + * PHunterLib + * + * Nearest Neighbor Model / Parameters + * + * Created by Tiayyba Riaz on 7/2/09. + * + */ + +#include +#include +#include +#include +#include"nnparams.h" + + +double forbidden_entropy; + + +double nparam_GetInitialEntropy(PNNParams nparm) +{ + return -5.9f+nparm->rlogc; +} + + +//Retrieve Enthalpy for given NN-Pair from parameter table +double nparam_GetEnthalpy(PNNParams nparm, char x0, char x1, char y0, char y1) +{ + return ndH(x0,x1,y0,y1); //xx, yx are already numbers +} + + +//Retrieve Entropy for given NN-Pair from parameter table +double nparam_GetEntropy(PNNParams nparm, char x0, char x1, char y0, char y1) +{ + //xx and yx are already numbers + char nx0=x0;//nparam_convertNum(x0); + char nx1=x1;//nparam_convertNum(x1); + char ny0=y0;//nparam_convertNum(y0); + char ny1=y1;//nparam_convertNum(y1); + double answer = ndS(nx0,nx1,ny0,ny1); + /*Salt correction Santalucia*/ + if (nparm->saltMethod == SALT_METHOD_SANTALUCIA) { + if(nx0!=5 && 1<= nx1 && nx1<=4) { + answer += 0.5*nparm->kfac; + } + if(ny1!=5 && 1<= ny0 && ny0<=4) { + answer += 0.5*nparm->kfac; + } + } + /*Salt correction Owczarzy*/ + if (nparm->saltMethod == SALT_METHOD_OWCZARZY) { + double logk = log(nparm->kplus); + answer += ndH(nx0,nx1,ny0,ny1)*((4.29 * nparm->gcContent-3.95)*0.00001*logk+ 0.0000094*logk*logk); + } + return answer; +} + +/* PURPOSE: Return melting temperature TM for given entropy and enthalpy +* Assuming a one-state transition and using the formula +* TM = dH / (dS + R ln(Ct/4)) +* entropy = dS + R ln Ct/4 (must already be included!) +* enthaklpy = dH +* where +* dH = enthalpy +* dS = entropy +* R = Boltzmann factor +* Ct = Strand Concentration +* +* PARAMETERS: +* entrypy and enthalpy +* +* RETURN VALUE: +* temperature +*/ + +double nparam_CalcTM(double entropy,double enthalpy) +{ + double tm = 0; // absolute zero - return if model fails! + if (enthalpy>=forbidden_enthalpy) //||(entropy==-cfact)) + return 0; + if (entropy<0) // avoid division by zero and model errors! + { + tm = enthalpy/entropy;// - kfac; //LKFEB + if (tm<0) + return 0; + } + return tm; +} + + +void nparam_InitParams(PNNParams nparm, double c1, double c2, double kp, int sm) +{ + nparm->Ct1 = c1; + nparm->Ct2 = c2; + nparm->kplus = kp; + int maxCT = 1; + if(nparm->Ct2 > nparm->Ct1) + { + maxCT = 2; + } + double ctFactor; + if(nparm->Ct1 == nparm->Ct2) + { + ctFactor = nparm->Ct1/2; + } + else if (maxCT == 1) + { + ctFactor = nparm->Ct1-nparm->Ct2/2; + } + else + { + ctFactor = nparm->Ct2-nparm->Ct1/2; + } + nparm->rlogc = R * log(ctFactor); + forbidden_entropy = nparm->rlogc; + nparm->kfac = 0.368 * log (nparm->kplus); + nparm->saltMethod = sm; + int x,y,a,b; // variables used as counters... + + // Set all parameters to zero! + memset(nparm->dH,0,sizeof(nparm->dH)); + memset(nparm->dS,0,sizeof(nparm->dS)); + + // Set all X-/Y-, -X/Y- and X-/-Y so, that TM will be VERY small! + for (x=1;x<=4;x++) + { + for (y=1;y<=4;y++) + { + ndH(0,x,y,0)=forbidden_enthalpy; + ndS(0,x,y,0)=forbidden_entropy; + ndH(x,0,0,y)=forbidden_enthalpy; + ndS(x,0,0,y)=forbidden_entropy; + ndH(x,0,y,0)=forbidden_enthalpy; + ndS(x,0,y,0)=forbidden_entropy; + // forbid X-/Y$ and X$/Y- etc., i.e. terminal must not be paired with gap! + ndH(x,5,y,0)=forbidden_enthalpy; + ndS(x,5,y,0)=forbidden_entropy; + ndH(x,0,y,5)=forbidden_enthalpy; + ndS(x,0,y,5)=forbidden_entropy; + ndH(5,x,0,y)=forbidden_enthalpy; + ndS(5,x,0,y)=forbidden_entropy; + ndH(0,x,5,y)=forbidden_enthalpy; + ndS(0,x,5,y)=forbidden_entropy; + // forbid X$/-Y etc. + ndH(x,5,0,y)=forbidden_enthalpy; + ndS(x,5,0,y)=forbidden_entropy; + ndH(x,0,5,y)=forbidden_enthalpy; + ndS(x,0,5,y)=forbidden_entropy; + ndH(5,x,y,0)=forbidden_enthalpy; + ndS(5,x,y,0)=forbidden_entropy; + ndH(0,x,y,5)=forbidden_enthalpy; + ndS(0,x,y,5)=forbidden_entropy; + + } + // also, forbid x-/-- and --/x-, i.e. no two inner gaps paired + ndH(x,0,0,0)=forbidden_enthalpy; + ndS(x,0,0,0)=forbidden_entropy; + ndH(0,0,x,0)=forbidden_enthalpy; + ndS(0,0,x,0)=forbidden_entropy; + // x-/-$ + ndH(x,0,0,5)=forbidden_enthalpy; + ndS(x,0,0,5)=forbidden_entropy; + ndH(5,0,0,x)=forbidden_enthalpy; + ndS(5,0,0,x)=forbidden_entropy; + ndH(0,5,x,0)=forbidden_enthalpy; + ndS(x,0,0,5)=forbidden_entropy; + ndH(0,x,5,0)=forbidden_enthalpy; + ndS(0,x,5,0)=forbidden_entropy; + } + // forbid --/-- + ndH(0,0,0,0)=forbidden_enthalpy; + ndS(0,0,0,0)=forbidden_entropy; + + ndH(5,0,0,0)=forbidden_enthalpy; + ndS(5,0,0,0)=forbidden_entropy; + ndH(0,0,5,0)=forbidden_enthalpy; + ndS(0,0,5,0)=forbidden_entropy; + ndH(0,5,5,0)=forbidden_enthalpy; + ndS(0,5,5,0)=forbidden_entropy; + + // Interior loops (double Mismatches) + #define iloop_entropy -0.97f + #define iloop_enthalpy 0.0f + for (x=1; x<=4; x++) + for (y=1; y<=4; y++) + for (a=1; a<=4; a++) + for (b=1; b<=4; b++) + // AT and CG pair, and as A=1, C=2, G=3, T=4 this means + // we have Watson-Crick pairs if (x+a==5) and (y+b)==5. + if (!((x+a==5)||(y+b==5))) + { + // No watson-crick-pair, i.e. double mismatch! + // set enthalpy/entropy to loop expansion! + ndH(x,y,a,b) = iloop_enthalpy; + ndS(x,y,a,b) = iloop_entropy; + } + + // xy/-- and --/xy (Bulge Loops of size > 1) + #define bloop_entropy -1.3f + #define bloop_enthalpy 0.0f + for (x=1; x<=4; x++) + for (y=1; y<=4; y++) + { + ndH(x,y,0,0) = bloop_enthalpy; + ndS(x,y,0,0) = bloop_entropy; + ndH(0,0,x,y) = bloop_enthalpy; + ndS(0,0,x,y) = bloop_entropy; + } + + // x-/ya abd xa/y- as well as -x/ay and ax/-y + // bulge opening and closing parameters with + // adjacent matches / mismatches + // obulge_mism and cbulge_mism chosen so high to avoid + // AAAAAAAAA + // T--G----T + // being better than + // AAAAAAAAA + // TG------T + #define obulge_match_H (-2.66f * 1000) + #define obulge_match_S -14.22f + #define cbulge_match_H (-2.66f * 1000) + #define cbulge_match_S -14.22f + #define obulge_mism_H (0.0f * 1000) + #define obulge_mism_S -6.45f + #define cbulge_mism_H 0.0f + #define cbulge_mism_S -6.45f + for (x=1; x<=4; x++) + for (y=1; y<=4; y++) + for (a=1; a<=4; a++) + { + if (x+y==5) // other base pair matches! + { + ndH(x,0,y,a)=obulge_match_H; // bulge opening + ndS(x,0,y,a)=obulge_match_S; + ndH(x,a,y,0)=obulge_match_H; + ndS(x,a,y,0)=obulge_match_S; + ndH(0,x,a,y)=cbulge_match_H; // bulge closing + ndS(0,x,a,y)=cbulge_match_S; + ndH(a,x,0,y)=cbulge_match_H; + ndS(a,x,0,y)=cbulge_match_S; + } + else + { // mismatch in other base pair! + ndH(x,0,y,a)=obulge_mism_H; // bulge opening + ndS(x,0,y,a)=obulge_mism_S; + ndH(x,a,y,0)=obulge_mism_H; + ndS(x,a,y,0)=obulge_mism_S; + ndH(0,x,a,y)=cbulge_mism_H; // bulge closing + ndS(0,x,a,y)=cbulge_mism_S; + ndH(a,x,0,y)=cbulge_mism_H; + ndS(a,x,0,y)=cbulge_mism_S; + } + } + + // Watson-Crick pairs (note that only ten are unique, as obviously + // 5'-AG-3'/3'-TC-5' = 5'-CT-3'/3'-GA-5' etc. + ndH(1,1,4,4)=-7.6f*1000; ndS(1,1,4,4)=-21.3f; // AA/TT 04 + ndH(1,2,4,3)=-8.4f*1000; ndS(1,2,4,3)=-22.4f; // AC/TG adapted GT/CA + ndH(1,3,4,2)=-7.8f*1000; ndS(1,3,4,2)=-21.0f; // AG/TC adapted CT/GA + ndH(1,4,4,1)=-7.2f*1000; ndS(1,4,4,1)=-20.4f; // AT/TA 04 + ndH(2,1,3,4)=-8.5f*1000; ndS(2,1,3,4)=-22.7f; // CA/GT 04 + ndH(2,2,3,3)=-8.0f*1000; ndS(2,2,3,3)=-19.9f; // CC/GG adapted GG/CC + ndH(2,3,3,2)=-10.6f*1000; ndS(2,3,3,2)=-27.2f; // CG/GC 04 + ndH(2,4,3,1)=-7.8f*1000; ndS(2,4,3,1)=-21.0f; // CT/GA 04 + ndH(3,1,2,4)=-8.2f*1000; ndS(3,1,2,4)=-22.2f; // GA/CT 04 + ndH(3,2,2,3)=-9.8f*1000; ndS(3,2,2,3)=-24.4f; // GC/CG 04 + ndH(3,3,2,2)=-8.0f*1000; ndS(3,3,2,2)=-19.9f; // GG/CC 04 + ndH(3,4,2,1)=-8.4f*1000; ndS(3,4,2,1)=-22.4f; // GT/CA 04 + ndH(4,1,1,4)=-7.2f*1000; ndS(4,1,1,4)=-21.3f; // TA/AT 04 + ndH(4,2,1,3)=-8.2f*1000; ndS(4,2,1,3)=-22.2f; // TC/AG adapted GA/CT + ndH(4,3,1,2)=-8.5f*1000; ndS(4,3,1,2)=-22.7f; // TG/AC adapted CA/GT + ndH(4,4,1,1)=-7.6f*1000; ndS(4,4,1,1)=-21.3f; // TT/AA adapted AA/TT + + // A-C Mismatches (Values for pH 7.0) + ndH(1,1,2,4)=7.6f*1000; ndS(1,1,2,4)=20.2f; // AA/CT + ndH(1,1,4,2)=2.3f*1000; ndS(1,1,4,2)=4.6f; // AA/TC + ndH(1,2,2,3)=-0.7f*1000; ndS(1,2,2,3)=-3.8f; // AC/CG + ndH(1,2,4,1)=5.3f*1000; ndS(1,2,4,1)=14.6f; // AC/TA + ndH(1,3,2,2)=0.6f*1000; ndS(1,3,2,2)=-0.6f; // AG/CC + ndH(1,4,2,1)=5.3f*1000; ndS(1,4,2,1)=14.6f; // AT/CA + ndH(2,1,1,4)=3.4f*1000; ndS(2,1,1,4)=8.0f; // CA/AT + ndH(2,1,3,2)=1.9f*1000; ndS(2,1,3,2)=3.7f; // CA/GC + ndH(2,2,1,3)=5.2f*1000; ndS(2,2,1,3)=14.2f; // CC/AG + ndH(2,2,3,1)=0.6f*1000; ndS(2,2,3,1)=-0.6f; // CC/GA + ndH(2,3,1,2)=1.9f*1000; ndS(2,3,1,2)=3.7f; // CG/AC + ndH(2,4,1,1)=2.3f*1000; ndS(2,4,1,1)=4.6f; // CT/AA + ndH(3,1,2,2)=5.2f*1000; ndS(3,1,2,2)=14.2f; // GA/CC + ndH(3,2,2,1)=-0.7f*1000; ndS(3,2,2,1)=-3.8f; // GC/CA + ndH(4,1,1,2)=3.4f*1000; ndS(4,1,1,2)=8.0f; // TA/AC + ndH(4,2,1,1)=7.6f*1000; ndS(4,2,1,1)=20.2f; // TC/AA + + // C-T Mismatches + ndH(1,2,4,4)=0.7f*1000; ndS(1,2,4,4)=0.2f; // AC/TT + ndH(1,4,4,2)=-1.2f*1000; ndS(1,4,4,2)=-6.2f; // AT/TC + ndH(2,1,4,4)=1.0f*1000; ndS(2,1,4,4)=0.7f; // CA/TT + ndH(2,2,3,4)=-0.8f*1000; ndS(2,2,3,4)=-4.5f; // CC/GT + ndH(2,2,4,3)=5.2f*1000; ndS(2,2,4,3)=13.5f; // CC/TG + ndH(2,3,4,2)=-1.5f*1000; ndS(2,3,4,2)=-6.1f; // CG/TC + ndH(2,4,3,2)=-1.5f*1000; ndS(2,4,3,2)=-6.1f; // CT/GC + ndH(2,4,4,1)=-1.2f*1000; ndS(2,4,4,1)=-6.2f; // CT/TA + ndH(3,2,2,4)=2.3f*1000; ndS(3,2,2,4)=5.4f; // GC/CT + ndH(3,4,2,2)=5.2f*1000; ndS(3,4,2,2)=13.5f; // GT/CC + ndH(4,1,2,4)=1.2f*1000; ndS(4,1,2,4)=0.7f; // TA/CT + ndH(4,2,2,3)=2.3f*1000; ndS(4,2,2,3)=5.4f; // TC/CG + ndH(4,2,1,4)=1.2f*1000; ndS(4,2,1,4)=0.7f; // TC/AT + ndH(4,3,2,2)=-0.8f*1000; ndS(4,3,2,2)=-4.5f; // TG/CC + ndH(4,4,2,1)=0.7f*1000; ndS(4,4,2,1)=0.2f; // TT/CA + ndH(4,4,1,2)=1.0f*1000; ndS(4,4,1,2)=0.7f; // TT/AC + + // G-A Mismatches + ndH(1,1,3,4)=3.0f*1000; ndS(1,1,3,4)=7.4f; // AA/GT + ndH(1,1,4,3)=-0.6f*1000; ndS(1,1,4,3)=-2.3f; // AA/TG + ndH(1,2,3,3)=0.5f*1000; ndS(1,2,3,3)=3.2f; // AC/GG + ndH(1,3,3,2)=-4.0f*1000; ndS(1,3,3,2)=-13.2f; // AG/GC + ndH(1,3,4,1)=-0.7f*1000; ndS(1,3,4,1)=-2.3f; // AG/TA + ndH(1,4,3,1)=-0.7f*1000; ndS(1,4,3,1)=-2.3f; // AT/GA + ndH(2,1,3,3)=-0.7f*1000; ndS(2,1,3,3)=-2.3f; // CA/GG + ndH(2,3,3,1)=-4.0f*1000; ndS(2,3,3,1)=-13.2f; // CG/GA + ndH(3,1,1,4)=0.7f*1000; ndS(3,1,1,4)=0.7f; // GA/AT + ndH(3,1,2,3)=-0.6f*1000; ndS(3,1,2,3)=-1.0f; // GA/CG + ndH(3,2,1,3)=-0.6f*1000; ndS(3,2,1,3)=-1.0f; // GC/AG + ndH(3,3,1,2)=-0.7f*1000; ndS(3,3,1,2)=-2.3f; // GG/AC + ndH(3,3,2,1)=0.5f*1000; ndS(3,3,2,1)=3.2f; // GG/CA + ndH(3,4,1,1)=-0.6f*1000; ndS(3,4,1,1)=-2.3f; // GT/AA + ndH(4,1,1,3)=0.7f*1000; ndS(4,1,1,3)=0.7f; // TA/AG + ndH(4,3,1,1)=3.0f*1000; ndS(4,3,1,1)=7.4f; // TG/AA + + // G-T Mismatches + ndH(1,3,4,4)=1.0f*1000; ndS(1,3,4,4)=0.9f; // AG/TT + ndH(1,4,4,3)=-2.5f*1000; ndS(1,4,4,3)=-8.3f; // AT/TG + ndH(2,3,3,4)=-4.1f*1000; ndS(2,3,3,4)=-11.7f; // CG/GT + ndH(2,4,3,3)=-2.8f*1000; ndS(2,4,3,3)=-8.0f; // CT/GG + ndH(3,1,4,4)=-1.3f*1000; ndS(3,1,4,4)=-5.3f; // GA/TT + ndH(3,2,4,3)=-4.4f*1000; ndS(3,2,4,3)=-12.3f; // GC/TG + ndH(3,3,2,4)=3.3f*1000; ndS(3,3,2,4)=10.4f; // GG/CT + ndH(3,3,4,2)=-2.8f*1000; ndS(3,3,4,2)=-8.0f; // GG/TC +// ndH(3,3,4,4)=5.8f*1000; ndS(3,3,4,4)=16.3f; // GG/TT + ndH(3,4,2,3)=-4.4f*1000; ndS(3,4,2,3)=-12.3f; // GT/CG + ndH(3,4,4,1)=-2.5f*1000; ndS(3,4,4,1)=-8.3f; // GT/TA +// ndH(3,4,4,3)=4.1f*1000; ndS(3,4,4,3)=9.5f; // GT/TG + ndH(4,1,3,4)=-0.1f*1000; ndS(4,1,3,4)=-1.7f; // TA/GT + ndH(4,2,3,3)=3.3f*1000; ndS(4,2,3,3)=10.4f; // TC/GG + ndH(4,3,1,4)=-0.1f*1000; ndS(4,3,1,4)=-1.7f; // TG/AT + ndH(4,3,3,2)=-4.1f*1000; ndS(4,3,3,2)=-11.7f; // TG/GC +// ndH(4,3,3,4)=-1.4f*1000; ndS(4,3,3,4)=-6.2f; // TG/GT + ndH(4,4,1,3)=-1.3f*1000; ndS(4,4,1,3)=-5.3f; // TT/AG + ndH(4,4,3,1)=1.0f*1000; ndS(4,4,3,1)=0.9f; // TT/GA +// ndH(4,4,3,3)=5.8f*1000; ndS(4,4,3,3)=16.3f; // TT/GG + + // A-A Mismatches + ndH(1,1,1,4)=4.7f*1000; ndS(1,1,1,4)=12.9f; // AA/AT + ndH(1,1,4,1)=1.2f*1000; ndS(1,1,4,1)=1.7f; // AA/TA + ndH(1,2,1,3)=-2.9f*1000; ndS(1,2,1,3)=-9.8f; // AC/AG + ndH(1,3,1,2)=-0.9f*1000; ndS(1,3,1,2)=-4.2f; // AG/AC + ndH(1,4,1,1)=1.2f*1000; ndS(1,4,1,1)=1.7f; // AT/AA + ndH(2,1,3,1)=-0.9f*1000; ndS(2,1,3,1)=-4.2f; // CA/GA + ndH(3,1,2,1)=-2.9f*1000; ndS(3,1,2,1)=-9.8f; // GA/CA + ndH(4,1,1,1)=4.7f*1000; ndS(4,1,1,1)=12.9f; // TA/AA + + // C-C Mismatches + ndH(1,2,4,2)=0.0f*1000; ndS(1,2,4,2)=-4.4f; // AC/TC + ndH(2,1,2,4)=6.1f*1000; ndS(2,1,2,4)=16.4f; // CA/CT + ndH(2,2,2,3)=3.6f*1000; ndS(2,2,2,3)=8.9f; // CC/CG + ndH(2,2,3,2)=-1.5f*1000; ndS(2,2,3,2)=-7.2f; // CC/GC + ndH(2,3,2,2)=-1.5f*1000; ndS(2,3,2,2)=-7.2f; // CG/CC + ndH(2,4,2,1)=0.0f*1000; ndS(2,4,2,1)=-4.4f; // CT/CA + ndH(3,2,2,2)=3.6f*1000; ndS(3,2,2,2)=8.9f; // GC/CC + ndH(4,2,1,2)=6.1f*1000; ndS(4,2,1,2)=16.4f; // TC/AC + + // G-G Mismatches + ndH(1,3,4,3)=-3.1f*1000; ndS(1,3,4,3)=-9.5f; // AG/TG + ndH(2,3,3,3)=-4.9f*1000; ndS(2,3,3,3)=-15.3f; // CG/GG + ndH(3,1,3,4)=1.6f*1000; ndS(3,1,3,4)=3.6f; // GA/GT + ndH(3,2,3,3)=-6.0f*1000; ndS(3,2,3,3)=-15.8f; // GC/GG + ndH(3,3,2,3)=-6.0f*1000; ndS(3,3,2,3)=-15.8f; // GG/CG + ndH(3,3,3,2)=-4.9f*1000; ndS(3,3,3,2)=-15.3f; // GG/GC + ndH(3,4,3,1)=-3.1f*1000; ndS(3,4,3,1)=-9.5f; // GT/GA + ndH(4,3,1,3)=1.6f*1000; ndS(4,3,1,3)=3.6f; // TG/AG + + // T-T Mismatches + ndH(1,4,4,4)=-2.7f*1000; ndS(1,4,4,4)=-10.8f; // AT/TT + ndH(2,4,3,4)=-5.0f*1000; ndS(2,4,3,4)=-15.8f; // CT/GT + ndH(3,4,2,4)=-2.2f*1000; ndS(3,4,2,4)=-8.4f; // GT/CT + ndH(4,1,4,4)=0.2f*1000; ndS(4,1,4,4)=-1.5f; // TA/TT + ndH(4,2,4,3)=-2.2f*1000; ndS(4,2,4,3)=-8.4f; // TC/TG + ndH(4,3,4,2)=-5.0f*1000; ndS(4,3,4,2)=-15.8f; // TG/TC + ndH(4,4,1,4)=0.2f*1000; ndS(4,4,1,4)=-1.5f; // TT/AT + ndH(4,4,4,1)=-2.7f*1000; ndS(4,4,4,1)=-10.8f; // TT/TA + + // Dangling Ends + ndH(5,1,1,4)=-0.7f*1000; ndS(5,1,1,4)=-0.8f; // $A/AT + ndH(5,1,2,4)=4.4f*1000; ndS(5,1,2,4)=14.9f; // $A/CT + ndH(5,1,3,4)=-1.6f*1000; ndS(5,1,3,4)=-3.6f; // $A/GT + ndH(5,1,4,4)=2.9f*1000; ndS(5,1,4,4)=10.4f; // $A/TT + ndH(5,2,1,3)=-2.1f*1000; ndS(5,2,1,3)=-3.9f; // $C/AG + ndH(5,2,2,3)=-0.2f*1000; ndS(5,2,2,3)=-0.1f; // $C/CG + ndH(5,2,3,3)=-3.9f*1000; ndS(5,2,3,3)=-11.2f; // $C/GG + ndH(5,2,4,3)=-4.4f*1000; ndS(5,2,4,3)=-13.1f; // $C/TG + ndH(5,3,1,2)=-5.9f*1000; ndS(5,3,1,2)=-16.5f; // $G/AC + ndH(5,3,2,2)=-2.6f*1000; ndS(5,3,2,2)=-7.4f; // $G/CC + ndH(5,3,3,2)=-3.2f*1000; ndS(5,3,3,2)=-10.4f; // $G/GC + ndH(5,3,4,2)=-5.2f*1000; ndS(5,3,4,2)=-15.0f; // $G/TC + ndH(5,4,1,1)=-0.5f*1000; ndS(5,4,1,1)=-1.1f; // $T/AA + ndH(5,4,2,1)=4.7f*1000; ndS(5,4,2,1)=14.2f; // $T/CA + ndH(5,4,3,1)=-4.1f*1000; ndS(5,4,3,1)=-13.1f; // $T/GA + ndH(5,4,4,1)=-3.8f*1000; ndS(5,4,4,1)=-12.6f; // $T/TA + ndH(1,5,4,1)=-2.9f*1000; ndS(1,5,4,1)=-7.6f; // A$/TA + ndH(1,5,4,2)=-4.1f*1000; ndS(1,5,4,2)=-13.0f; // A$/TC + ndH(1,5,4,3)=-4.2f*1000; ndS(1,5,4,3)=-15.0f; // A$/TG + ndH(1,5,4,4)=-0.2f*1000; ndS(1,5,4,4)=-0.5f; // A$/TT + ndH(1,1,5,4)=0.2f*1000; ndS(1,1,5,4)=2.3f; // AA/$T + ndH(1,1,4,5)=-0.5f*1000; ndS(1,1,4,5)=-1.1f; // AA/T$ + ndH(1,2,5,3)=-6.3f*1000; ndS(1,2,5,3)=-17.1f; // AC/$G + ndH(1,2,4,5)=4.7f*1000; ndS(1,2,4,5)=14.2f; // AC/T$ + ndH(1,3,5,2)=-3.7f*1000; ndS(1,3,5,2)=-10.0f; // AG/$C + ndH(1,3,4,5)=-4.1f*1000; ndS(1,3,4,5)=-13.1f; // AG/T$ + ndH(1,4,5,1)=-2.9f*1000; ndS(1,4,5,1)=-7.6f; // AT/$A + ndH(1,4,4,5)=-3.8f*1000; ndS(1,4,4,5)=-12.6f; // AT/T$ + ndH(2,5,3,1)=-3.7f*1000; ndS(2,5,3,1)=-10.0f; // C$/GA + ndH(2,5,3,2)=-4.0f*1000; ndS(2,5,3,2)=-11.9f; // C$/GC + ndH(2,5,3,3)=-3.9f*1000; ndS(2,5,3,3)=-10.9f; // C$/GG + ndH(2,5,3,4)=-4.9f*1000; ndS(2,5,3,4)=-13.8f; // C$/GT + ndH(2,1,5,4)=0.6f*1000; ndS(2,1,5,4)=3.3f; // CA/$T + ndH(2,1,3,5)=-5.9f*1000; ndS(2,1,3,5)=-16.5f; // CA/G$ + ndH(2,2,5,3)=-4.4f*1000; ndS(2,2,5,3)=-12.6f; // CC/$G + ndH(2,2,3,5)=-2.6f*1000; ndS(2,2,3,5)=-7.4f; // CC/G$ + ndH(2,3,5,2)=-4.0f*1000; ndS(2,3,5,2)=-11.9f; // CG/$C + ndH(2,3,3,5)=-3.2f*1000; ndS(2,3,3,5)=-10.4f; // CG/G$ + ndH(2,4,5,1)=-4.1f*1000; ndS(2,4,5,1)=-13.0f; // CT/$A + ndH(2,4,3,5)=-5.2f*1000; ndS(2,4,3,5)=-15.0f; // CT/G$ + ndH(3,5,2,1)=-6.3f*1000; ndS(3,5,2,1)=-17.1f; // G$/CA + ndH(3,5,2,2)=-4.4f*1000; ndS(3,5,2,2)=-12.6f; // G$/CC + ndH(3,5,2,3)=-5.1f*1000; ndS(3,5,2,3)=-14.0f; // G$/CG + ndH(3,5,2,4)=-4.0f*1000; ndS(3,5,2,4)=-10.9f; // G$/CT + ndH(3,1,5,4)=-1.1f*1000; ndS(3,1,5,4)=-1.6f; // GA/$T + ndH(3,1,2,5)=-2.1f*1000; ndS(3,1,2,5)=-3.9f; // GA/C$ + ndH(3,2,5,3)=-5.1f*1000; ndS(3,2,5,3)=-14.0f; // GC/$G + ndH(3,2,2,5)=-0.2f*1000; ndS(3,2,2,5)=-0.1f; // GC/C$ + ndH(3,3,5,2)=-3.9f*1000; ndS(3,3,5,2)=-10.9f; // GG/$C + ndH(3,3,2,5)=-3.9f*1000; ndS(3,3,2,5)=-11.2f; // GG/C$ + ndH(3,4,5,1)=-4.2f*1000; ndS(3,4,5,1)=-15.0f; // GT/$A + ndH(3,4,2,5)=-4.4f*1000; ndS(3,4,2,5)=-13.1f; // GT/C$ + ndH(4,5,1,1)=0.2f*1000; ndS(4,5,1,1)=2.3f; // T$/AA + ndH(4,5,1,2)=0.6f*1000; ndS(4,5,1,2)=3.3f; // T$/AC + ndH(4,5,1,3)=-1.1f*1000; ndS(4,5,1,3)=-1.6f; // T$/AG + ndH(4,5,1,4)=-6.9f*1000; ndS(4,5,1,4)=-20.0f; // T$/AT + ndH(4,1,5,4)=-6.9f*1000; ndS(4,1,5,4)=-20.0f; // TA/$T + ndH(4,1,1,5)=-0.7f*1000; ndS(4,1,1,5)=-0.7f; // TA/A$ + ndH(4,2,5,3)=-4.0f*1000; ndS(4,2,5,3)=-10.9f; // TC/$G + ndH(4,2,1,5)=4.4f*1000; ndS(4,2,1,5)=14.9f; // TC/A$ + ndH(4,3,5,2)=-4.9f*1000; ndS(4,3,5,2)=-13.8f; // TG/$C + ndH(4,3,1,5)=-1.6f*1000; ndS(4,3,1,5)=-3.6f; // TG/A$ + ndH(4,4,5,1)=-0.2f*1000; ndS(4,4,5,1)=-0.5f; // TT/$A + ndH(4,4,1,5)=2.9f*1000; ndS(4,4,1,5)=10.4f; // TT/A$ + + return; +} + +int nparam_CountGCContent(char * seq ) { + int lseq = strlen(seq); + int k; + double count = 0; + for( k=0;krlogc; + double mtemp; + char c1; + char c2; + char c3; + char c4; + unsigned int i; + char nseq[50]; + char *useq = seq; + + nparam_CleanSeq (seq, nseq, len); + useq = nseq; + + for ( i=1;idH[c3][c4][c1][c2];//nparam_GetEnthalpy(nparm, c3,c4,c1,c2); + thedS += nparam_GetEntropy(nparm, c3,c4,c1,c2); + } + //printf("------------------\n"); + mtemp = nparam_CalcTM(thedS,thedH); + //fprintf(stderr,"Enthalpy: %f, entropy: %f, seq: %s rloc=%f\n", thedH, thedS, useq, nparm->rlogc); + //exit (0); + return mtemp; +} + +double nparam_CalcTwoTM(PNNParams nparm, char* seq1, char* seq2, int len) +{ + double thedH = 0; + //double thedS = nparam_GetInitialEntropy(nparm); + double thedS = -5.9f+nparm->rlogc; + double mtemp; + char c1; + char c2; + char c3; + char c4; + unsigned int i; + char nseq1[50]; + char nseq2[50]; + char *useq1; + char *useq2; + + nparam_CleanSeq (seq1, nseq1, len); + useq1 = nseq1; + + nparam_CleanSeq (seq2, nseq2, len); + useq2 = nseq2; + + //fprintf (stderr,"Primer : %s\n",useq); + for ( i=1;idH[c3][c4][c1][c2];//nparam_GetEnthalpy(nparm, c3,c4,c1,c2); + thedS += nparam_GetEntropy(nparm, c3,c4,c1,c2); + } + //fprintf(stderr,"------------------\n"); + mtemp = nparam_CalcTM(thedS,thedH); + //if (mtemp == 0) + //{ + // fprintf(stderr,"Enthalpy: %f, entropy: %f, seq: %s\n", thedH, thedS, useq); + //exit (0); + //} + return mtemp; +} + +double calculateMeltingTemperatureBasic (char * seq) { + int gccount; + double temp; + int seqlen; + + seqlen = strlen (seq); + gccount = nparam_CountGCContent (seq); + temp = 64.9 + 41*(gccount - 16.4)/seqlen; + return temp; +} diff --git a/src/libthermo/nnparams.h b/src/libthermo/nnparams.h new file mode 100644 index 0000000..5520ae1 --- /dev/null +++ b/src/libthermo/nnparams.h @@ -0,0 +1,72 @@ +/* + * nnparams.h + * PHunterLib + * + * Nearest Neighbor Model Parameters + * + * Created by Tiayyba Riaz on 02/07/09. + * + */ + +#ifndef NNPARAMS_H_ +#define NNPARAMS_H_ + +#include +#include +//#include "../libecoprimer/ecoprimer.h" + +// following defines to simplify coding... +#define ndH(a,b,c,d) nparm->dH[a][b][c][d] +#define ndS(a,b,c,d) nparm->dS[a][b][c][d] +#define forbidden_enthalpy 1000000000000000000.0f +#define R 1.987f +#define SALT_METHOD_SANTALUCIA 1 +#define SALT_METHOD_OWCZARZY 2 + +#define DEF_CONC_PRIMERS 0.0000008 +#define DEF_CONC_SEQUENCES 0 +#define DEF_SALT 0.05 + +#define GETNUMCODE(a) bpencoder[a - 'A'] +#define GETREVCODE(a) 5-bpencoder[a - 'A'] + + +extern double forbidden_entropy; + +static char bpencoder[] = { 1, // A + 0, // b + 2, // C + 0,0,0, // d, e, f + 3, // G + 0,0,0,0,0,0,0,0,0,0,0,0, // h,i,j,k,l,m,n,o,p,q,r,s + 4,0, // T,U + 0,0,0,0,0}; // v,w,x,y,z + + +typedef struct CNNParams_st +{ + double Ct1; + double Ct2; + double rlogc; + double kplus; + double kfac; + int saltMethod; + double gcContent; + double new_TM; + double dH[6][6][6][6]; // A-C-G-T + gap + initiation (dangling end, $ sign) + double dS[6][6][6][6]; +}CNNParams, * PNNParams; + +void nparam_InitParams(PNNParams nparm, double c1, double c2, double kp, int sm); +int nparam_CountGCContent(char * seq ); +double nparam_GetEntropy(PNNParams nparm, char x0, char x1, char y0, char y1); +double nparam_GetEnthalpy(PNNParams nparm, char x0, char x1, char y0, char y1); +double nparam_CalcTM(double entropy,double enthalpy); +double nparam_CalcSelfTM(PNNParams nparm, char* seq, int len); +double nparam_CalcTwoTM(PNNParams nparm, char* seq1, char* seq2, int len); + +double nparam_GetInitialEntropy(PNNParams nparm) ; +double calculateMeltingTemperatureBasic (char * seq); +//void getThermoProperties (ppair_t* pairs, size_t count, poptions_t options); + +#endif diff --git a/src/libthermo/thermostats.c b/src/libthermo/thermostats.c new file mode 100644 index 0000000..9141e17 --- /dev/null +++ b/src/libthermo/thermostats.c @@ -0,0 +1,115 @@ +#include +#include +#include +#include +#include "thermostats.h" + +word_t extractSite(char* sequence, size_t begin, size_t length, bool_t strand) +{ + char *c; + char *start; + uint32_t l; + word_t site = 0; + + start=sequence+begin; + if (!strand) + start+=length-1; + + + for (c=start, + l=0; + lp1->word; + w2 = pairs[i]->p2->word; + + if (!pairs[i]->asdirect1) + w1=ecoComplementWord(w1,options->primer_length); + + if (!pairs[i]->asdirect2) + w2=ecoComplementWord(w2,options->primer_length); + + strncpy(prmrd,ecoUnhashWord(w1, options->primer_length),options->primer_length); + strncpy(prmrr,ecoUnhashWord(w2, options->primer_length),options->primer_length); + prmrd[options->primer_length]=0; + prmrr[options->primer_length]=0; + pairs[i]->p1temp = nparam_CalcSelfTM (options->pnparm, prmrd, options->primer_length) - 273.0; + pairs[i]->p2temp = nparam_CalcSelfTM (options->pnparm, prmrr, options->primer_length) - 273.0; + pairs[i]->p1mintemp = 100; + pairs[i]->p2mintemp = 100; + + for (j = 0; j < pairs[i]->pcr.ampcount; j++) + if (pairs[i]->pcr.amplifias[j].sequence->isexample) + { + + sq = pairs[i]->pcr.amplifias[j].sequence->SQ; + strand = pairs[i]->pcr.amplifias[j].strand; + bp1 = pairs[i]->pcr.amplifias[j].begin - options->primer_length; + bp2 = pairs[i]->pcr.amplifias[j].end + 1; + + if (!strand) + { + uint32_t tmp; + tmp=bp1; + bp1=bp2; + bp2=tmp; + } + +// printf("%s : %s, %c",prmrd, +// ecoUnhashWord(extractSite(sq,bp1,options->primer_length,strand),options->primer_length), +// "rd"[strand]); + mtemp = nparam_CalcTwoTM(options->pnparm, + prmrd, + ecoUnhashWord(extractSite(sq,bp1,options->primer_length,strand),options->primer_length), + options->primer_length) - 273.0; +// printf(" %4.2f %4.2f\n",pairs[i]->p1temp,mtemp); + if (mtemp < pairs[i]->p1mintemp) + pairs[i]->p1mintemp = mtemp; + +// printf("%s : %s, %c\n",prmrr,ecoUnhashWord(extractSite(sq,bp2,options->primer_length,!strand),options->primer_length), +// "rd"[strand]); +// + mtemp = nparam_CalcTwoTM(options->pnparm, + prmrr, + ecoUnhashWord(extractSite(sq,bp2,options->primer_length,!strand),options->primer_length), + options->primer_length) - 273.0; + if (mtemp < pairs[i]->p2mintemp) + pairs[i]->p2mintemp = mtemp; + } + + if (w2 < w1) + { + mtemp = pairs[i]->p1temp; + pairs[i]->p1temp = pairs[i]->p2temp; + pairs[i]->p2temp = mtemp; + + mtemp = pairs[i]->p1mintemp; + pairs[i]->p1mintemp = pairs[i]->p2mintemp; + pairs[i]->p2mintemp = mtemp; + } + + } +} diff --git a/src/libthermo/thermostats.h b/src/libthermo/thermostats.h new file mode 100644 index 0000000..40c4806 --- /dev/null +++ b/src/libthermo/thermostats.h @@ -0,0 +1,9 @@ +#ifndef THERMOSTATS_H_ +#define THERMOSTATS_H_ + +#include "../libecoprimer/ecoprimer.h" + +void getThermoProperties (ppair_t* pairs, size_t count, poptions_t options); +word_t extractSite(char* sequence, size_t begin, size_t length, bool_t strand); + +#endif \ No newline at end of file diff --git a/tools/ecoPCRFormat.py b/tools/ecoPCRFormat.py new file mode 100755 index 0000000..3884001 --- /dev/null +++ b/tools/ecoPCRFormat.py @@ -0,0 +1,651 @@ +#!/usr/bin/env python + +import re +import gzip +import struct +import sys +import time +import getopt + +try: + import psycopg2 + _dbenable=True +except ImportError: + _dbenable=False + +##### +# +# +# Generic file function +# +# +##### + +def universalOpen(file): + if isinstance(file,str): + if file[-3:] == '.gz': + rep = gzip.open(file) + else: + rep = open(file) + else: + rep = file + return rep + +def universalTell(file): + if isinstance(file, gzip.GzipFile): + file=file.myfileobj + return file.tell() + +def fileSize(file): + if isinstance(file, gzip.GzipFile): + file=file.myfileobj + pos = file.tell() + file.seek(0,2) + length = file.tell() + file.seek(pos,0) + return length + +def progressBar(pos,max,reset=False,delta=[]): + if reset: + del delta[:] + if not delta: + delta.append(time.time()) + delta.append(time.time()) + + delta[1]=time.time() + elapsed = delta[1]-delta[0] + percent = float(pos)/max * 100 + remain = time.strftime('%H:%M:%S',time.gmtime(elapsed / percent * (100-percent))) + bar = '#' * int(percent/2) + bar+= '|/-\\-'[pos % 5] + bar+= ' ' * (50 - int(percent/2)) + sys.stderr.write('\r%5.1f %% |%s] remain : %s' %(percent,bar,remain)) + +##### +# +# +# NCBI Dump Taxonomy reader +# +# +##### + +def endLessIterator(endedlist): + for x in endedlist: + yield x + while(1): + yield endedlist[-1] + +class ColumnFile(object): + + def __init__(self,stream,sep=None,strip=True,types=None): + if isinstance(stream,str): + self._stream = open(stream) + elif hasattr(stream,'next'): + self._stream = stream + else: + raise ValueError,'stream must be string or an iterator' + self._delimiter=sep + self._strip=strip + if types: + self._types=[x for x in types] + for i in xrange(len(self._types)): + if self._types[i] is bool: + self._types[i]=ColumnFile.str2bool + else: + self._types=None + + def str2bool(x): + return bool(eval(x.strip()[0].upper(),{'T':True,'V':True,'F':False})) + + str2bool = staticmethod(str2bool) + + + def __iter__(self): + return self + + def next(self): + ligne = self._stream.next() + data = ligne.split(self._delimiter) + if self._strip or self._types: + data = [x.strip() for x in data] + if self._types: + it = endLessIterator(self._types) + data = [x[1](x[0]) for x in ((y,it.next()) for y in data)] + return data + +def taxonCmp(t1,t2): + if t1[0] < t2[0]: + return -1 + elif t1[0] > t2[0]: + return +1 + return 0 + +def bsearchTaxon(taxonomy,taxid): + taxCount = len(taxonomy) + begin = 0 + end = taxCount + oldcheck=taxCount + check = begin + end / 2 + while check != oldcheck and taxonomy[check][0]!=taxid : + if taxonomy[check][0] < taxid: + begin=check + else: + end=check + oldcheck=check + check = (begin + end) / 2 + + + if taxonomy[check][0]==taxid: + return check + else: + return None + + + +def readNodeTable(file): + + file = universalOpen(file) + + nodes = ColumnFile(file, + sep='|', + types=(int,int,str, + str,str,bool, + int,bool,int, + bool,bool,bool,str)) + print >>sys.stderr,"Reading taxonomy dump file..." + taxonomy=[[n[0],n[2],n[1]] for n in nodes] + print >>sys.stderr,"List all taxonomy rank..." + ranks =list(set(x[1] for x in taxonomy)) + ranks.sort() + ranks = dict(map(None,ranks,xrange(len(ranks)))) + + print >>sys.stderr,"Sorting taxons..." + taxonomy.sort(taxonCmp) + + print >>sys.stderr,"Indexing taxonomy..." + index = {} + for t in taxonomy: + index[t[0]]=bsearchTaxon(taxonomy, t[0]) + + print >>sys.stderr,"Indexing parent and rank..." + for t in taxonomy: + t[1]=ranks[t[1]] + t[2]=index[t[2]] + + + return taxonomy,ranks,index + +def nameIterator(file): + file = universalOpen(file) + names = ColumnFile(file, + sep='|', + types=(int,str, + str,str)) + for taxid,name,unique,classname,white in names: + yield taxid,name,classname + +def mergedNodeIterator(file): + file = universalOpen(file) + merged = ColumnFile(file, + sep='|', + types=(int,int,str)) + for taxid,current,white in merged: + yield taxid,current + +def deletedNodeIterator(file): + file = universalOpen(file) + deleted = ColumnFile(file, + sep='|', + types=(int,str)) + for taxid,white in deleted: + yield taxid + +def readTaxonomyDump(taxdir): + taxonomy,ranks,index = readNodeTable('%s/nodes.dmp' % taxdir) + + print >>sys.stderr,"Adding scientific name..." + + alternativeName=[] + for taxid,name,classname in nameIterator('%s/names.dmp' % taxdir): + alternativeName.append((name,classname,index[taxid])) + if classname == 'scientific name': + taxonomy[index[taxid]].append(name) + + print >>sys.stderr,"Adding taxid alias..." + for taxid,current in mergedNodeIterator('%s/merged.dmp' % taxdir): + index[taxid]=index[current] + + print >>sys.stderr,"Adding deleted taxid..." + for taxid in deletedNodeIterator('%s/delnodes.dmp' % taxdir): + index[taxid]=None + + return taxonomy,ranks,alternativeName,index + +def readTaxonomyDB(dbname): + connection = psycopg2.connect(database=dbname) + + cursor = connection.cursor() + cursor.execute("select numid,rank,parent from ncbi_taxonomy.taxon") + taxonomy=[list(x) for x in cursor] + + cursor.execute("select rank_class from ncbi_taxonomy.taxon_rank_class order by rank_class") + ranks=cursor.fetchall() + ranks = dict(map(None,(x[0] for x in ranks),xrange(len(ranks)))) + + print >>sys.stderr,"Sorting taxons..." + taxonomy.sort(taxonCmp) + + print >>sys.stderr,"Indexing taxonomy..." + index = {} + for t in taxonomy: + index[t[0]]=bsearchTaxon(taxonomy, t[0]) + + print >>sys.stderr,"Indexing parent and rank..." + for t in taxonomy: + t[1]=ranks[t[1]] + try: + t[2]=index[t[2]] + except KeyError,e: + if t[2] is None and t[0]==1: + t[2]=index[t[0]] + else: + raise e + + cursor.execute("select taxid,name,category from ncbi_taxonomy.name") + + alternativeName=[] + for taxid,name,classname in cursor: + alternativeName.append((name,classname,index[taxid])) + if classname == 'scientific name': + taxonomy[index[taxid]].append(name) + + cursor.execute("select old_numid,current_numid from ncbi_taxonomy.taxon_id_alias") + + print >>sys.stderr,"Adding taxid alias..." + for taxid,current in cursor: + if current is not None: + index[taxid]=index[current] + else: + index[taxid]=None + + + return taxonomy,ranks,alternativeName,index + +##### +# +# +# Genbank/EMBL sequence reader +# +# +##### + +def entryIterator(file): + file = universalOpen(file) + rep =[] + for ligne in file: + rep.append(ligne) + if ligne == '//\n': + rep = ''.join(rep) + yield rep + rep = [] + +def fastaEntryIterator(file): + file = universalOpen(file) + rep =[] + for ligne in file: + if ligne[0] == '>' and rep: + rep = ''.join(rep) + yield rep + rep = [] + rep.append(ligne) + if rep: + rep = ''.join(rep) + yield rep + +_cleanSeq = re.compile('[ \n0-9]+') + +def cleanSeq(seq): + return _cleanSeq.sub('',seq) + + +_gbParseID = re.compile('(?<=^LOCUS {7})[^ ]+(?= )',re.MULTILINE) +_gbParseDE = re.compile('(?<=^DEFINITION {2}).+?\. *$(?=[^ ])',re.MULTILINE+re.DOTALL) +_gbParseSQ = re.compile('(?<=^ORIGIN).+?(?=^//$)',re.MULTILINE+re.DOTALL) +_gbParseTX = re.compile('(?<= /db_xref="taxon:)[0-9]+(?=")') + +def genbankEntryParser(entry): + Id = _gbParseID.findall(entry)[0] + De = ' '.join(_gbParseDE.findall(entry)[0].split()) + Sq = cleanSeq(_gbParseSQ.findall(entry)[0].upper()) + try: + Tx = int(_gbParseTX.findall(entry)[0]) + except IndexError: + Tx = None + return {'id':Id,'taxid':Tx,'definition':De,'sequence':Sq} + +###################### + +_cleanDef = re.compile('[\nDE]') + +def cleanDef(definition): + return _cleanDef.sub('',definition) + +_emblParseID = re.compile('(?<=^ID {3})[^ ]+(?=;)',re.MULTILINE) +_emblParseDE = re.compile('(?<=^DE {3}).+?\. *$(?=[^ ])',re.MULTILINE+re.DOTALL) +_emblParseSQ = re.compile('(?<=^ ).+?(?=^//$)',re.MULTILINE+re.DOTALL) +_emblParseTX = re.compile('(?<= /db_xref="taxon:)[0-9]+(?=")') + +def emblEntryParser(entry): + Id = _emblParseID.findall(entry)[0] + De = ' '.join(cleanDef(_emblParseDE.findall(entry)[0]).split()) + Sq = cleanSeq(_emblParseSQ.findall(entry)[0].upper()) + try: + Tx = int(_emblParseTX.findall(entry)[0]) + except IndexError: + Tx = None + return {'id':Id,'taxid':Tx,'definition':De,'sequence':Sq} + + +###################### + +_fastaSplit=re.compile(';\W*') + +def parseFasta(seq): + seq=seq.split('\n') + title = seq[0].strip()[1:].split(None,1) + id=title[0] + if len(title) == 2: + field = _fastaSplit.split(title[1]) + else: + field=[] + info = dict(x.split('=',1) for x in field if '=' in x) + definition = ' '.join([x for x in field if '=' not in x]) + seq=(''.join([x.strip() for x in seq[1:]])).upper() + return id,seq,definition,info + + +def fastaEntryParser(entry): + id,seq,definition,info = parseFasta(entry) + Tx = info.get('taxid',None) + if Tx is not None: + Tx=int(Tx) + return {'id':id,'taxid':Tx,'definition':definition,'sequence':seq} + + +def sequenceIteratorFactory(entryParser,entryIterator): + def sequenceIterator(file): + for entry in entryIterator(file): + yield entryParser(entry) + return sequenceIterator + + +def taxonomyInfo(entry,connection): + taxid = entry['taxid'] + curseur = connection.cursor() + curseur.execute(""" + select taxid,species,genus,family, + taxonomy.scientificName(taxid) as sn, + taxonomy.scientificName(species) as species_sn, + taxonomy.scientificName(genus) as genus_sn, + taxonomy.scientificName(family) as family_sn + from + ( + select alias as taxid, + taxonomy.getSpecies(alias) as species, + taxonomy.getGenus(alias) as genus, + taxonomy.getFamily(alias) as family + from taxonomy.aliases + where id=%d ) as tax + """ % taxid) + rep = curseur.fetchone() + entry['current_taxid']=rep[0] + entry['species']=rep[1] + entry['genus']=rep[2] + entry['family']=rep[3] + entry['scientific_name']=rep[4] + entry['species_sn']=rep[5] + entry['genus_sn']=rep[6] + entry['family_sn']=rep[7] + return entry + +##### +# +# +# Binary writer +# +# +##### + +def ecoSeqPacker(sq): + + compactseq = gzip.zlib.compress(sq['sequence'],9) + cptseqlength = len(compactseq) + delength = len(sq['definition']) + + totalSize = 4 + 20 + 4 + 4 + 4 + cptseqlength + delength + + packed = struct.pack('> I I 20s I I I %ds %ds' % (delength,cptseqlength), + totalSize, + sq['taxid'], + sq['id'], + delength, + len(sq['sequence']), + cptseqlength, + sq['definition'], + compactseq) + + assert len(packed) == totalSize+4, "error in sequence packing" + + return packed + +def ecoTaxPacker(tx): + + namelength = len(tx[3]) + + totalSize = 4 + 4 + 4 + 4 + namelength + + packed = struct.pack('> I I I I I %ds' % namelength, + totalSize, + tx[0], + tx[1], + tx[2], + namelength, + tx[3]) + + return packed + +def ecoRankPacker(rank): + + namelength = len(rank) + + packed = struct.pack('> I %ds' % namelength, + namelength, + rank) + + return packed + +def ecoNamePacker(name): + + namelength = len(name[0]) + classlength= len(name[1]) + totalSize = namelength + classlength + 4 + 4 + 4 + 4 + + packed = struct.pack('> I I I I I %ds %ds' % (namelength,classlength), + totalSize, + int(name[1]=='scientific name'), + namelength, + classlength, + name[2], + name[0], + name[1]) + + return packed + +def ecoSeqWriter(file,input,taxindex,parser): + output = open(file,'wb') + input = universalOpen(input) + inputsize = fileSize(input) + entries = parser(input) + seqcount=0 + skipped = [] + + output.write(struct.pack('> I',seqcount)) + + progressBar(1, inputsize,reset=True) + for entry in entries: + if entry['taxid'] is not None: + try: + entry['taxid']=taxindex[entry['taxid']] + except KeyError: + entry['taxid']=None + if entry['taxid'] is not None: + seqcount+=1 + output.write(ecoSeqPacker(entry)) + else: + skipped.append(entry['id']) + where = universalTell(input) + progressBar(where, inputsize) + print >>sys.stderr," Readed sequences : %d " % seqcount, + else: + skipped.append(entry['id']) + + print >>sys.stderr + output.seek(0,0) + output.write(struct.pack('> I',seqcount)) + + output.close() + return skipped + + +def ecoTaxWriter(file,taxonomy): + output = open(file,'wb') + output.write(struct.pack('> I',len(taxonomy))) + + for tx in taxonomy: + output.write(ecoTaxPacker(tx)) + + output.close() + +def ecoRankWriter(file,ranks): + output = open(file,'wb') + output.write(struct.pack('> I',len(ranks))) + + rankNames = ranks.keys() + rankNames.sort() + + for rank in rankNames: + output.write(ecoRankPacker(rank)) + + output.close() + +def nameCmp(n1,n2): + name1=n1[0].upper() + name2=n2[0].upper() + if name1 < name2: + return -1 + elif name1 > name2: + return 1 + return 0 + + +def ecoNameWriter(file,names): + output = open(file,'wb') + output.write(struct.pack('> I',len(names))) + + names.sort(nameCmp) + + for name in names: + output.write(ecoNamePacker(name)) + + output.close() + +def ecoDBWriter(prefix,taxonomy,seqFileNames,parser): + + ecoRankWriter('%s.rdx' % prefix, taxonomy[1]) + ecoTaxWriter('%s.tdx' % prefix, taxonomy[0]) + ecoNameWriter('%s.ndx' % prefix, taxonomy[2]) + + filecount = 0 + for filename in seqFileNames: + filecount+=1 + sk=ecoSeqWriter('%s_%03d.sdx' % (prefix,filecount), + filename, + taxonomy[3], + parser) + if sk: + print >>sys.stderr,"Skipped entry :" + print >>sys.stderr,sk + +def ecoParseOptions(arguments): + opt = { + 'prefix' : 'ecodb', + 'taxdir' : 'taxdump', + 'parser' : sequenceIteratorFactory(genbankEntryParser, + entryIterator) + } + + o,filenames = getopt.getopt(arguments, + 'ht:T:n:gfe', + ['help', + 'taxonomy=', + 'taxonomy_db=', + 'name=', + 'genbank', + 'fasta', + 'embl']) + + for name,value in o: + if name in ('-h','--help'): + printHelp() + exit() + elif name in ('-t','--taxonomy'): + opt['taxmod']='dump' + opt['taxdir']=value + elif name in ('-T','--taxonomy_db'): + opt['taxmod']='db' + opt['taxdb']=value + elif name in ('-n','--name'): + opt['prefix']=value + elif name in ('-g','--genbank'): + opt['parser']=sequenceIteratorFactory(genbankEntryParser, + entryIterator) + + elif name in ('-f','--fasta'): + opt['parser']=sequenceIteratorFactory(fastaEntryParser, + fastaEntryIterator) + + elif name in ('-e','--embl'): + opt['parser']=sequenceIteratorFactory(emblEntryParser, + entryIterator) + else: + raise ValueError,'Unknown option %s' % name + + return opt,filenames + +def printHelp(): + print "-----------------------------------" + print " ecoPCRFormat.py" + print "-----------------------------------" + print "ecoPCRFormat.py [option] " + print "-----------------------------------" + print "-e --embl :[E]mbl format" + print "-f --fasta :[F]asta format" + print "-g --genbank :[G]enbank format" + print "-h --help :[H]elp - print this help" + print "-n --name :[N]ame of the new database created" + print "-t --taxonomy :[T]axonomy - path to the taxonomy database" + print " :bcp-like dump from GenBank taxonomy database." + print "-----------------------------------" + +if __name__ == '__main__': + + opt,filenames = ecoParseOptions(sys.argv[1:]) + + if opt['taxmod']=='dump': + taxonomy = readTaxonomyDump(opt['taxdir']) + elif opt['taxmod']=='db': + taxonomy = readTaxonomyDB(opt['taxdb']) + + + ecoDBWriter(opt['prefix'], taxonomy, filenames, opt['parser']) +