Initial commit for this soft
git-svn-id: https://www.grenoble.prabi.fr/svn/LECASofts/ecoPrimers/trunk@175 60f365c0-8329-0410-b2a4-ec073aeeaa1d
This commit is contained in:
151
.cproject
Normal file
151
.cproject
Normal file
@ -0,0 +1,151 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<?fileVersion 4.0.0?>
|
||||
|
||||
<cproject>
|
||||
<storageModule moduleId="org.eclipse.cdt.core.settings">
|
||||
<cconfiguration id="cdt.managedbuild.toolchain.gnu.macosx.base.2134184396">
|
||||
<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="cdt.managedbuild.toolchain.gnu.macosx.base.2134184396" moduleId="org.eclipse.cdt.core.settings" name="MacOSX GCC">
|
||||
<externalSettings/>
|
||||
<extensions>
|
||||
<extension id="org.eclipse.cdt.core.MachO" point="org.eclipse.cdt.core.BinaryParser"/>
|
||||
<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||
<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||
<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||
<extension id="org.eclipse.cdt.core.MakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||
</extensions>
|
||||
</storageModule>
|
||||
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
|
||||
<configuration artifactName="ecoPrimers" buildProperties="" id="cdt.managedbuild.toolchain.gnu.macosx.base.2134184396" name="MacOSX GCC" parent="org.eclipse.cdt.build.core.emptycfg">
|
||||
<folderInfo id="cdt.managedbuild.toolchain.gnu.macosx.base.2134184396.1840911077" name="/" resourcePath="">
|
||||
<toolChain id="cdt.managedbuild.toolchain.gnu.macosx.base.766054112" name="cdt.managedbuild.toolchain.gnu.macosx.base" superClass="cdt.managedbuild.toolchain.gnu.macosx.base">
|
||||
<targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.MachO" id="cdt.managedbuild.target.gnu.platform.macosx.base.2057035265" name="Debug Platform" osList="macosx" superClass="cdt.managedbuild.target.gnu.platform.macosx.base"/>
|
||||
<builder id="cdt.managedbuild.target.gnu.builder.macosx.base.783726363" managedBuildOn="false" name="Gnu Make Builder.MacOSX GCC" superClass="cdt.managedbuild.target.gnu.builder.macosx.base"/>
|
||||
<tool id="cdt.managedbuild.tool.macosx.c.linker.macosx.base.914103467" name="MacOS X C Linker" superClass="cdt.managedbuild.tool.macosx.c.linker.macosx.base">
|
||||
<inputType id="cdt.managedbuild.tool.macosx.c.linker.input.62980206" superClass="cdt.managedbuild.tool.macosx.c.linker.input">
|
||||
<additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
|
||||
<additionalInput kind="additionalinput" paths="$(LIBS)"/>
|
||||
</inputType>
|
||||
</tool>
|
||||
<tool id="cdt.managedbuild.tool.macosx.cpp.linker.macosx.base.691108439" name="MacOS X C++ Linker" superClass="cdt.managedbuild.tool.macosx.cpp.linker.macosx.base"/>
|
||||
<tool id="cdt.managedbuild.tool.gnu.assembler.macosx.base.695639877" name="GCC Assembler" superClass="cdt.managedbuild.tool.gnu.assembler.macosx.base">
|
||||
<inputType id="cdt.managedbuild.tool.gnu.assembler.input.1507665054" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
|
||||
</tool>
|
||||
<tool id="cdt.managedbuild.tool.gnu.archiver.macosx.base.1786370580" name="GCC Archiver" superClass="cdt.managedbuild.tool.gnu.archiver.macosx.base"/>
|
||||
<tool id="cdt.managedbuild.tool.gnu.cpp.compiler.macosx.base.454329831" name="GCC C++ Compiler" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.macosx.base"/>
|
||||
<tool id="cdt.managedbuild.tool.gnu.c.compiler.macosx.base.1928774909" name="GCC C Compiler" superClass="cdt.managedbuild.tool.gnu.c.compiler.macosx.base">
|
||||
<inputType id="cdt.managedbuild.tool.gnu.c.compiler.input.330854350" superClass="cdt.managedbuild.tool.gnu.c.compiler.input"/>
|
||||
</tool>
|
||||
</toolChain>
|
||||
</folderInfo>
|
||||
</configuration>
|
||||
</storageModule>
|
||||
<storageModule moduleId="scannerConfiguration">
|
||||
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile"/>
|
||||
<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
|
||||
<buildOutputProvider>
|
||||
<openAction enabled="true" filePath=""/>
|
||||
<parser enabled="true"/>
|
||||
</buildOutputProvider>
|
||||
<scannerInfoProvider id="specsFile">
|
||||
<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
|
||||
<parser enabled="true"/>
|
||||
</scannerInfoProvider>
|
||||
</profile>
|
||||
<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
|
||||
<buildOutputProvider>
|
||||
<openAction enabled="true" filePath=""/>
|
||||
<parser enabled="true"/>
|
||||
</buildOutputProvider>
|
||||
<scannerInfoProvider id="makefileGenerator">
|
||||
<runAction arguments="-f ${project_name}_scd.mk" command="make" useDefault="true"/>
|
||||
<parser enabled="true"/>
|
||||
</scannerInfoProvider>
|
||||
</profile>
|
||||
<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile">
|
||||
<buildOutputProvider>
|
||||
<openAction enabled="true" filePath=""/>
|
||||
<parser enabled="true"/>
|
||||
</buildOutputProvider>
|
||||
<scannerInfoProvider id="specsFile">
|
||||
<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
|
||||
<parser enabled="true"/>
|
||||
</scannerInfoProvider>
|
||||
</profile>
|
||||
<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP">
|
||||
<buildOutputProvider>
|
||||
<openAction enabled="true" filePath=""/>
|
||||
<parser enabled="true"/>
|
||||
</buildOutputProvider>
|
||||
<scannerInfoProvider id="specsFile">
|
||||
<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
|
||||
<parser enabled="true"/>
|
||||
</scannerInfoProvider>
|
||||
</profile>
|
||||
<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC">
|
||||
<buildOutputProvider>
|
||||
<openAction enabled="true" filePath=""/>
|
||||
<parser enabled="true"/>
|
||||
</buildOutputProvider>
|
||||
<scannerInfoProvider id="specsFile">
|
||||
<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
|
||||
<parser enabled="true"/>
|
||||
</scannerInfoProvider>
|
||||
</profile>
|
||||
<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile">
|
||||
<buildOutputProvider>
|
||||
<openAction enabled="true" filePath=""/>
|
||||
<parser enabled="true"/>
|
||||
</buildOutputProvider>
|
||||
<scannerInfoProvider id="specsFile">
|
||||
<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
|
||||
<parser enabled="true"/>
|
||||
</scannerInfoProvider>
|
||||
</profile>
|
||||
<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP">
|
||||
<buildOutputProvider>
|
||||
<openAction enabled="true" filePath=""/>
|
||||
<parser enabled="true"/>
|
||||
</buildOutputProvider>
|
||||
<scannerInfoProvider id="specsFile">
|
||||
<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
|
||||
<parser enabled="true"/>
|
||||
</scannerInfoProvider>
|
||||
</profile>
|
||||
<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC">
|
||||
<buildOutputProvider>
|
||||
<openAction enabled="true" filePath=""/>
|
||||
<parser enabled="true"/>
|
||||
</buildOutputProvider>
|
||||
<scannerInfoProvider id="specsFile">
|
||||
<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
|
||||
<parser enabled="true"/>
|
||||
</scannerInfoProvider>
|
||||
</profile>
|
||||
<profile id="org.eclipse.cdt.managedbuilder.xlc.core.XLCManagedMakePerProjectProfile">
|
||||
<buildOutputProvider>
|
||||
<openAction enabled="false" filePath=""/>
|
||||
<parser enabled="false"/>
|
||||
</buildOutputProvider>
|
||||
<scannerInfoProvider id="specsFile">
|
||||
<runAction arguments="-E -v ${plugin_state_location}/${specs_file}" command="${XL_compilerRoot}/xlc" useDefault="true"/>
|
||||
<parser enabled="true"/>
|
||||
</scannerInfoProvider>
|
||||
</profile>
|
||||
<profile id="org.eclipse.cdt.managedbuilder.xlc.core.XLCManagedMakePerProjectProfileCPP">
|
||||
<buildOutputProvider>
|
||||
<openAction enabled="false" filePath=""/>
|
||||
<parser enabled="false"/>
|
||||
</buildOutputProvider>
|
||||
<scannerInfoProvider id="specsFile">
|
||||
<runAction arguments="-E -v ${plugin_state_location}/${specs_file}" command="${XL_compilerRoot}/xlC" useDefault="true"/>
|
||||
<parser enabled="true"/>
|
||||
</scannerInfoProvider>
|
||||
</profile>
|
||||
</storageModule>
|
||||
<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
|
||||
</cconfiguration>
|
||||
</storageModule>
|
||||
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
|
||||
<project id="ecoPrimers.null.1292969001" name="ecoPrimers"/>
|
||||
</storageModule>
|
||||
</cproject>
|
77
.project
Normal file
77
.project
Normal file
@ -0,0 +1,77 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<projectDescription>
|
||||
<name>ecoPrimers</name>
|
||||
<comment></comment>
|
||||
<projects>
|
||||
</projects>
|
||||
<buildSpec>
|
||||
<buildCommand>
|
||||
<name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name>
|
||||
<triggers>clean,full,incremental,</triggers>
|
||||
<arguments>
|
||||
<dictionary>
|
||||
<key>org.eclipse.cdt.make.core.fullBuildTarget</key>
|
||||
<value>all</value>
|
||||
</dictionary>
|
||||
<dictionary>
|
||||
<key>?name?</key>
|
||||
<value></value>
|
||||
</dictionary>
|
||||
<dictionary>
|
||||
<key>org.eclipse.cdt.make.core.enableAutoBuild</key>
|
||||
<value>false</value>
|
||||
</dictionary>
|
||||
<dictionary>
|
||||
<key>org.eclipse.cdt.make.core.enableFullBuild</key>
|
||||
<value>true</value>
|
||||
</dictionary>
|
||||
<dictionary>
|
||||
<key>org.eclipse.cdt.make.core.enableCleanBuild</key>
|
||||
<value>true</value>
|
||||
</dictionary>
|
||||
<dictionary>
|
||||
<key>org.eclipse.cdt.make.core.cleanBuildTarget</key>
|
||||
<value>clean</value>
|
||||
</dictionary>
|
||||
<dictionary>
|
||||
<key>org.eclipse.cdt.make.core.append_environment</key>
|
||||
<value>true</value>
|
||||
</dictionary>
|
||||
<dictionary>
|
||||
<key>org.eclipse.cdt.make.core.contents</key>
|
||||
<value>org.eclipse.cdt.make.core.activeConfigSettings</value>
|
||||
</dictionary>
|
||||
<dictionary>
|
||||
<key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
|
||||
<value>true</value>
|
||||
</dictionary>
|
||||
<dictionary>
|
||||
<key>org.eclipse.cdt.make.core.buildArguments</key>
|
||||
<value></value>
|
||||
</dictionary>
|
||||
<dictionary>
|
||||
<key>org.eclipse.cdt.make.core.buildCommand</key>
|
||||
<value>make</value>
|
||||
</dictionary>
|
||||
<dictionary>
|
||||
<key>org.eclipse.cdt.make.core.autoBuildTarget</key>
|
||||
<value>all</value>
|
||||
</dictionary>
|
||||
<dictionary>
|
||||
<key>org.eclipse.cdt.make.core.stopOnError</key>
|
||||
<value>true</value>
|
||||
</dictionary>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
<buildCommand>
|
||||
<name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
</buildSpec>
|
||||
<natures>
|
||||
<nature>org.eclipse.cdt.core.cnature</nature>
|
||||
<nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
|
||||
<nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>
|
||||
</natures>
|
||||
</projectDescription>
|
BIN
Documents/CalculTM.xls
Normal file
BIN
Documents/CalculTM.xls
Normal file
Binary file not shown.
506
Licence_CeCILL_V2-en.txt
Normal file
506
Licence_CeCILL_V2-en.txt
Normal file
@ -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 <20> 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-<2D>-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.
|
512
Licence_CeCILL_V2-fr.txt
Normal file
512
Licence_CeCILL_V2-fr.txt
Normal file
@ -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<70>side <20>
|
||||
sa r<>daction:
|
||||
|
||||
* d'une part, le respect des principes de diffusion des logiciels
|
||||
libres: acc<63>s au code source, droits <20>tendus conf<6E>r<EFBFBD>s aux
|
||||
utilisateurs,
|
||||
* d'autre part, la d<>signation d'un droit applicable, le droit
|
||||
fran<61>ais, auquel elle est conforme, tant au regard du droit de la
|
||||
responsabilit<69> civile que du droit de la propri<72>t<EFBFBD> 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 <20> l'Energie Atomique - CEA, <20>tablissement public de
|
||||
recherche <20> caract<63>re scientifique, technique et industriel, dont le
|
||||
si<EFBFBD>ge est situ<74> 25 rue Leblanc, immeuble Le Ponant D, 75015 Paris.
|
||||
|
||||
Centre National de la Recherche Scientifique - CNRS, <20>tablissement
|
||||
public <20> caract<63>re scientifique et technologique, dont le si<73>ge est
|
||||
situ<EFBFBD> 3 rue Michel-Ange, 75794 Paris cedex 16.
|
||||
|
||||
Institut National de Recherche en Informatique et en Automatique -
|
||||
INRIA, <20>tablissement public <20> caract<63>re scientifique et technologique,
|
||||
dont le si<73>ge est situ<74> Domaine de Voluceau, Rocquencourt, BP 105, 78153
|
||||
Le Chesnay cedex.
|
||||
|
||||
|
||||
Pr<50>ambule
|
||||
|
||||
Ce contrat est une licence de logiciel libre dont l'objectif est de
|
||||
conf<EFBFBD>rer aux utilisateurs la libert<72> de modification et de
|
||||
redistribution du logiciel r<>gi par cette licence dans le cadre d'un
|
||||
mod<EFBFBD>le de diffusion en logiciel libre.
|
||||
|
||||
L'exercice de ces libert<72>s est assorti de certains devoirs <20> la charge
|
||||
des utilisateurs afin de pr<70>server ce statut au cours des
|
||||
redistributions ult<6C>rieures.
|
||||
|
||||
L'accessibilit<69> 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<69>e et de ne faire peser sur
|
||||
l'auteur du logiciel, le titulaire des droits patrimoniaux et les
|
||||
conc<EFBFBD>dants successifs qu'une responsabilit<69> restreinte.
|
||||
|
||||
A cet <20>gard l'attention de l'utilisateur est attir<69>e sur les risques
|
||||
associ<EFBFBD>s au chargement, <20> l'utilisation, <20> la modification et/ou au
|
||||
d<EFBFBD>veloppement et <20> la reproduction du logiciel par l'utilisateur <20>tant
|
||||
donn<EFBFBD> sa sp<73>cificit<69> de logiciel libre, qui peut le rendre complexe <20>
|
||||
manipuler et qui le r<>serve donc <20> des d<>veloppeurs ou des
|
||||
professionnels avertis poss<73>dant des connaissances informatiques
|
||||
approfondies. Les utilisateurs sont donc invit<69>s <20> charger et tester
|
||||
l'ad<61>quation du logiciel <20> leurs besoins dans des conditions permettant
|
||||
d'assurer la s<>curit<69> de leurs syst<73>mes et/ou de leurs donn<6E>es et, plus
|
||||
g<EFBFBD>n<EFBFBD>ralement, <20> l'utiliser et l'exploiter dans les m<>mes conditions de
|
||||
s<EFBFBD>curit<EFBFBD>. Ce contrat peut <20>tre reproduit et diffus<75> librement, sous
|
||||
r<EFBFBD>serve de le conserver en l'<27>tat, sans ajout ni suppression de clauses.
|
||||
|
||||
Ce contrat est susceptible de s'appliquer <20> 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 <20>crits avec une
|
||||
lettre capitale, auront la signification suivante:
|
||||
|
||||
Contrat: d<>signe le pr<70>sent contrat de licence, ses <20>ventuelles versions
|
||||
post<EFBFBD>rieures et annexes.
|
||||
|
||||
Logiciel: d<>signe le logiciel sous sa forme de Code Objet et/ou de Code
|
||||
Source et le cas <20>ch<63>ant sa documentation, dans leur <20>tat au moment de
|
||||
l'acceptation du Contrat par le Licenci<63>.
|
||||
|
||||
Logiciel Initial: d<>signe le Logiciel sous sa forme de Code Source et
|
||||
<EFBFBD>ventuellement de Code Objet et le cas <20>ch<63>ant sa documentation, dans
|
||||
leur <20>tat au moment de leur premi<6D>re diffusion sous les termes du Contrat.
|
||||
|
||||
Logiciel Modifi<66>: d<>signe le Logiciel modifi<66> par au moins une
|
||||
Contribution.
|
||||
|
||||
Code Source: d<>signe l'ensemble des instructions et des lignes de
|
||||
programme du Logiciel et auquel l'acc<63>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<EFBFBD>: d<>signe le ou les utilisateurs du Logiciel ayant accept<70> le
|
||||
Contrat.
|
||||
|
||||
Contributeur: d<>signe le Licenci<63> auteur d'au moins une Contribution.
|
||||
|
||||
Conc<EFBFBD>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<69>s int<6E>gr<67>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<69>s ou services
|
||||
suppl<EFBFBD>mentaires <20> ceux fournis par le Logiciel.
|
||||
|
||||
Module Externe: d<>signe tout Module, non d<>riv<69> du Logiciel, tel que ce
|
||||
Module et le Logiciel s'ex<65>cutent dans des espaces d'adressage
|
||||
diff<EFBFBD>rents, l'un appelant l'autre au moment de leur ex<65>cution.
|
||||
|
||||
Module Interne: d<>signe tout Module li<6C> au Logiciel de telle sorte
|
||||
qu'ils s'ex<65>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<6C>rieure, telle que publi<6C>e par Free Software Foundation
|
||||
Inc.
|
||||
|
||||
Parties: d<>signe collectivement le Licenci<63> et le Conc<6E>dant.
|
||||
|
||||
Ces termes s'entendent au singulier comme au pluriel.
|
||||
|
||||
|
||||
Article 2 - OBJET
|
||||
|
||||
Le Contrat a pour objet la concession par le Conc<6E>dant au Licenci<63> d'une
|
||||
licence non exclusive, cessible et mondiale du Logiciel telle que
|
||||
d<EFBFBD>finie ci-apr<70>s <20> l'article 5 pour toute la dur<75>e de protection des droits
|
||||
portant sur ce Logiciel.
|
||||
|
||||
|
||||
Article 3 - ACCEPTATION
|
||||
|
||||
3.1 L'acceptation par le Licenci<63> des termes du Contrat est r<>put<75>e
|
||||
acquise du fait du premier des faits suivants:
|
||||
|
||||
* (i) le chargement du Logiciel par tout moyen notamment par
|
||||
t<>l<EFBFBD>chargement <20> partir d'un serveur distant ou par chargement <20>
|
||||
partir d'un support physique;
|
||||
* (ii) le premier exercice par le Licenci<63> de l'un quelconque des
|
||||
droits conc<6E>d<EFBFBD>s par le Contrat.
|
||||
|
||||
3.2 Un exemplaire du Contrat, contenant notamment un avertissement
|
||||
relatif aux sp<73>cificit<69>s du Logiciel, <20> la restriction de garantie et <20>
|
||||
la limitation <20> un usage par des utilisateurs exp<78>riment<6E>s a <20>t<EFBFBD> mis <20>
|
||||
disposition du Licenci<63> pr<70>alablement <20> son acceptation telle que
|
||||
d<EFBFBD>finie <20> l'article 3.1 ci dessus et le Licenci<63> reconna<6E>t en avoir pris
|
||||
connaissance.
|
||||
|
||||
|
||||
Article 4 - ENTREE EN VIGUEUR ET DUREE
|
||||
|
||||
|
||||
4.1 ENTREE EN VIGUEUR
|
||||
|
||||
Le Contrat entre en vigueur <20> la date de son acceptation par le Licenci<63>
|
||||
telle que d<>finie en 3.1.
|
||||
|
||||
|
||||
4.2 DUREE
|
||||
|
||||
Le Contrat produira ses effets pendant toute la dur<75>e l<>gale de
|
||||
protection des droits patrimoniaux portant sur le Logiciel.
|
||||
|
||||
|
||||
Article 5 - ETENDUE DES DROITS CONCEDES
|
||||
|
||||
Le Conc<6E>dant conc<6E>de au Licenci<63>, qui accepte, les droits suivants sur
|
||||
le Logiciel pour toutes destinations et pour la dur<75>e du Contrat dans
|
||||
les conditions ci-apr<70>s d<>taill<6C>es.
|
||||
|
||||
Par ailleurs, si le Conc<6E>dant d<>tient ou venait <20> d<>tenir un ou
|
||||
plusieurs brevets d'invention prot<6F>geant tout ou partie des
|
||||
fonctionnalit<EFBFBD>s du Logiciel ou de ses composants, il s'engage <20> ne pas
|
||||
opposer les <20>ventuels droits conf<6E>r<EFBFBD>s par ces brevets aux Licenci<63>s
|
||||
successifs qui utiliseraient, exploiteraient ou modifieraient le
|
||||
Logiciel. En cas de cession de ces brevets, le Conc<6E>dant s'engage <20>
|
||||
faire reprendre les obligations du pr<70>sent alin<69>a aux cessionnaires.
|
||||
|
||||
|
||||
5.1 DROIT D'UTILISATION
|
||||
|
||||
Le Licenci<63> est autoris<69> <20> utiliser le Logiciel, sans restriction quant
|
||||
aux domaines d'application, <20>tant ci-apr<70>s pr<70>cis<69> 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<65>cution, ou le stockage du
|
||||
Logiciel sur tout support.
|
||||
|
||||
3. la possibilit<69> d'en observer, d'en <20>tudier, ou d'en tester le
|
||||
fonctionnement afin de d<>terminer les id<69>es et principes qui sont
|
||||
<20> la base de n'importe quel <20>l<EFBFBD>ment de ce Logiciel; et ceci,
|
||||
lorsque le Licenci<63> effectue toute op<6F>ration de chargement,
|
||||
d'affichage, d'ex<65>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<63> est autoris<69> <20> apporter toute Contribution au Logiciel sous
|
||||
r<EFBFBD>serve de mentionner, de fa<66>on explicite, son nom en tant qu'auteur de
|
||||
cette Contribution et la date de cr<63>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<63> <20> titre
|
||||
on<EFBFBD>reux ou gratuit, un ou des exemplaires du Logiciel par tout proc<6F>d<EFBFBD>.
|
||||
|
||||
Le Licenci<63> est autoris<69> <20> distribuer des copies du Logiciel, modifi<66> ou
|
||||
non, <20> des tiers dans les conditions ci-apr<70>s d<>taill<6C>es.
|
||||
|
||||
|
||||
5.3.1 DISTRIBUTION DU LOGICIEL SANS MODIFICATION
|
||||
|
||||
Le Licenci<63> est autoris<69> <20> distribuer des copies conformes du Logiciel,
|
||||
sous forme de Code Source ou de Code Objet, <20> condition que cette
|
||||
distribution respecte les dispositions du Contrat dans leur totalit<69> et
|
||||
soit accompagn<67>e:
|
||||
|
||||
1. d'un exemplaire du Contrat,
|
||||
|
||||
2. d'un avertissement relatif <20> la restriction de garantie et de
|
||||
responsabilit<69> du Conc<6E>dant telle que pr<70>vue aux articles 8
|
||||
et 9,
|
||||
|
||||
et que, dans le cas o<> seul le Code Objet du Logiciel est redistribu<62>,
|
||||
le Licenci<63> permette aux futurs Licenci<63>s d'acc<63>der facilement au Code
|
||||
Source complet du Logiciel en indiquant les modalit<69>s d'acc<63>s, <20>tant
|
||||
entendu que le co<63>t additionnel d'acquisition du Code Source ne devra
|
||||
pas exc<78>der le simple co<63>t de transfert des donn<6E>es.
|
||||
|
||||
|
||||
5.3.2 DISTRIBUTION DU LOGICIEL MODIFIE
|
||||
|
||||
Lorsque le Licenci<63> apporte une Contribution au Logiciel, les conditions
|
||||
de distribution du Logiciel Modifi<66> en r<>sultant sont alors soumises <20>
|
||||
l'int<6E>gralit<69> des dispositions du Contrat.
|
||||
|
||||
Le Licenci<63> est autoris<69> <20> distribuer le Logiciel Modifi<66>, sous forme de
|
||||
code source ou de code objet, <20> condition que cette distribution
|
||||
respecte les dispositions du Contrat dans leur totalit<69> et soit
|
||||
accompagn<EFBFBD>e:
|
||||
|
||||
1. d'un exemplaire du Contrat,
|
||||
|
||||
2. d'un avertissement relatif <20> la restriction de garantie et de
|
||||
responsabilit<69> du Conc<6E>dant telle que pr<70>vue aux articles 8
|
||||
et 9,
|
||||
|
||||
et que, dans le cas o<> seul le code objet du Logiciel Modifi<66> est
|
||||
redistribu<EFBFBD>, le Licenci<63> permette aux futurs Licenci<63>s d'acc<63>der
|
||||
facilement au code source complet du Logiciel Modifi<66> en indiquant les
|
||||
modalit<EFBFBD>s d'acc<63>s, <20>tant entendu que le co<63>t additionnel d'acquisition
|
||||
du code source ne devra pas exc<78>der le simple co<63>t de transfert des donn<6E>es.
|
||||
|
||||
|
||||
5.3.3 DISTRIBUTION DES MODULES EXTERNES
|
||||
|
||||
Lorsque le Licenci<63> a d<>velopp<70> un Module Externe les conditions du
|
||||
Contrat ne s'appliquent pas <20> ce Module Externe, qui peut <20>tre distribu<62>
|
||||
sous un contrat de licence diff<66>rent.
|
||||
|
||||
|
||||
5.3.4 COMPATIBILITE AVEC LA LICENCE GNU GPL
|
||||
|
||||
Le Licenci<63> peut inclure un code soumis aux dispositions d'une des
|
||||
versions de la licence GNU GPL dans le Logiciel modifi<66> ou non et
|
||||
distribuer l'ensemble sous les conditions de la m<>me version de la
|
||||
licence GNU GPL.
|
||||
|
||||
Le Licenci<63> peut inclure le Logiciel modifi<66> 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<6C> de modifier les conditions de
|
||||
diffusion de ce Logiciel Initial.
|
||||
|
||||
Le Titulaire s'engage <20> ce que le Logiciel Initial reste au moins r<>gi
|
||||
par le Contrat et ce, pour la dur<75>e vis<69>e <20> l'article 4.2.
|
||||
|
||||
|
||||
6.2 SUR LES CONTRIBUTIONS
|
||||
|
||||
Le Licenci<63> qui a d<>velopp<70> une Contribution est titulaire sur celle-ci
|
||||
des droits de propri<72>t<EFBFBD> intellectuelle dans les conditions d<>finies par
|
||||
la l<>gislation applicable.
|
||||
|
||||
|
||||
6.3 SUR LES MODULES EXTERNES
|
||||
|
||||
Le Licenci<63> qui a d<>velopp<70> un Module Externe est titulaire sur celui-ci
|
||||
des droits de propri<72>t<EFBFBD> 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<63> s'engage express<73>ment:
|
||||
|
||||
1. <20> ne pas supprimer ou modifier de quelque mani<6E>re que ce soit les
|
||||
mentions de propri<72>t<EFBFBD> intellectuelle appos<6F>es sur le Logiciel;
|
||||
|
||||
2. <20> reproduire <20> l'identique lesdites mentions de propri<72>t<EFBFBD>
|
||||
intellectuelle sur les copies du Logiciel modifi<66> ou non.
|
||||
|
||||
Le Licenci<63> s'engage <20> ne pas porter atteinte, directement ou
|
||||
indirectement, aux droits de propri<72>t<EFBFBD> intellectuelle du Titulaire et/ou
|
||||
des Contributeurs sur le Logiciel et <20> prendre, le cas <20>ch<63>ant, <20>
|
||||
l'<27>gard de son personnel toutes les mesures n<>cessaires pour assurer le
|
||||
respect des dits droits de propri<72>t<EFBFBD> intellectuelle du Titulaire et/ou
|
||||
des Contributeurs.
|
||||
|
||||
|
||||
Article 7 - SERVICES ASSOCIES
|
||||
|
||||
7.1 Le Contrat n'oblige en aucun cas le Conc<6E>dant <20> la r<>alisation de
|
||||
prestations d'assistance technique ou de maintenance du Logiciel.
|
||||
|
||||
Cependant le Conc<6E>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<69>s dans un acte s<>par<61>. Ces actes de
|
||||
maintenance et/ou assistance technique n'engageront que la seule
|
||||
responsabilit<EFBFBD> du Conc<6E>dant qui les propose.
|
||||
|
||||
7.2 De m<>me, tout Conc<6E>dant est libre de proposer, sous sa seule
|
||||
responsabilit<EFBFBD>, <20> ses licenci<63>s une garantie, qui n'engagera que lui,
|
||||
lors de la redistribution du Logiciel et/ou du Logiciel Modifi<66> et ce,
|
||||
dans les conditions qu'il souhaite. Cette garantie et les modalit<69>s
|
||||
financi<EFBFBD>res de son application feront l'objet d'un acte s<>par<61> entre le
|
||||
Conc<EFBFBD>dant et le Licenci<63>.
|
||||
|
||||
|
||||
Article 8 - RESPONSABILITE
|
||||
|
||||
8.1 Sous r<>serve des dispositions de l'article 8.2, le Licenci<63> a la
|
||||
facult<EFBFBD>, sous r<>serve de prouver la faute du Conc<6E>dant concern<72>, de
|
||||
solliciter la r<>paration du pr<70>judice direct qu'il subirait du fait du
|
||||
Logiciel et dont il apportera la preuve.
|
||||
|
||||
8.2 La responsabilit<69> du Conc<6E>dant est limit<69>e aux engagements pris en
|
||||
application du Contrat et ne saurait <20>tre engag<61>e en raison notamment:
|
||||
(i) des dommages dus <20> l'inex<65>cution, totale ou partielle, de ses
|
||||
obligations par le Licenci<63>, (ii) des dommages directs ou indirects
|
||||
d<EFBFBD>coulant de l'utilisation ou des performances du Logiciel subis par le
|
||||
Licenci<EFBFBD> et (iii) plus g<>n<EFBFBD>ralement d'un quelconque dommage indirect. En
|
||||
particulier, les Parties conviennent express<73>ment que tout pr<70>judice
|
||||
financier ou commercial (par exemple perte de donn<6E>es, perte de
|
||||
b<EFBFBD>n<EFBFBD>fices, perte d'exploitation, perte de client<6E>le ou de commandes,
|
||||
manque <20> gagner, trouble commercial quelconque) ou toute action dirig<69>e
|
||||
contre le Licenci<63> par un tiers, constitue un dommage indirect et
|
||||
n'ouvre pas droit <20> r<>paration par le Conc<6E>dant.
|
||||
|
||||
|
||||
Article 9 - GARANTIE
|
||||
|
||||
9.1 Le Licenci<63> reconna<6E>t que l'<27>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'<27>ventuels d<>fauts. L'attention
|
||||
du Licenci<63> a <20>t<EFBFBD> attir<69>e sur ce point sur les risques associ<63>s au
|
||||
chargement, <20> l'utilisation, la modification et/ou au d<>veloppement et <20>
|
||||
la reproduction du Logiciel qui sont r<>serv<72>s <20> des utilisateurs avertis.
|
||||
|
||||
Il rel<65>ve de la responsabilit<69> du Licenci<63> de contr<74>ler, par tous
|
||||
moyens, l'ad<61>quation du produit <20> 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<6E>dant d<>clare de bonne foi <20>tre en droit de conc<6E>der
|
||||
l'ensemble des droits attach<63>s au Logiciel (comprenant notamment les
|
||||
droits vis<69>s <20> l'article 5).
|
||||
|
||||
9.3 Le Licenci<63> reconna<6E>t que le Logiciel est fourni "en l'<27>tat" par le
|
||||
Conc<EFBFBD>dant sans autre garantie, expresse ou tacite, que celle pr<70>vue <20>
|
||||
l'article 9.2 et notamment sans aucune garantie sur sa valeur commerciale,
|
||||
son caract<63>re s<>curis<69>, innovant ou pertinent.
|
||||
|
||||
En particulier, le Conc<6E>dant ne garantit pas que le Logiciel est exempt
|
||||
d'erreur, qu'il fonctionnera sans interruption, qu'il sera compatible
|
||||
avec l'<27>quipement du Licenci<63> et sa configuration logicielle ni qu'il
|
||||
remplira les besoins du Licenci<63>.
|
||||
|
||||
9.4 Le Conc<6E>dant ne garantit pas, de mani<6E>re expresse ou tacite, que le
|
||||
Logiciel ne porte pas atteinte <20> un quelconque droit de propri<72>t<EFBFBD>
|
||||
intellectuelle d'un tiers portant sur un brevet, un logiciel ou sur tout
|
||||
autre droit de propri<72>t<EFBFBD>. Ainsi, le Conc<6E>dant exclut toute garantie au
|
||||
profit du Licenci<63> contre les actions en contrefa<66>on qui pourraient <20>tre
|
||||
diligent<EFBFBD>es au titre de l'utilisation, de la modification, et de la
|
||||
redistribution du Logiciel. N<>anmoins, si de telles actions sont
|
||||
exerc<EFBFBD>es contre le Licenci<63>, le Conc<6E>dant lui apportera son aide
|
||||
technique et juridique pour sa d<>fense. Cette aide technique et
|
||||
juridique est d<>termin<69>e au cas par cas entre le Conc<6E>dant concern<72> et
|
||||
le Licenci<63> dans le cadre d'un protocole d'accord. Le Conc<6E>dant d<>gage
|
||||
toute responsabilit<69> quant <20> l'utilisation de la d<>nomination du
|
||||
Logiciel par le Licenci<63>. Aucune garantie n'est apport<72>e quant <20>
|
||||
l'existence de droits ant<6E>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<63> aux obligations mises <20> sa
|
||||
charge par le Contrat, le Conc<6E>dant pourra r<>silier de plein droit le
|
||||
Contrat trente (30) jours apr<70>s notification adress<73>e au Licenci<63> et
|
||||
rest<EFBFBD>e sans effet.
|
||||
|
||||
10.2 Le Licenci<63> dont le Contrat est r<>sili<6C> n'est plus autoris<69> <20>
|
||||
utiliser, modifier ou distribuer le Logiciel. Cependant, toutes les
|
||||
licences qu'il aura conc<6E>d<EFBFBD>es ant<6E>rieurement <20> la r<>siliation du Contrat
|
||||
resteront valides sous r<>serve qu'elles aient <20>t<EFBFBD> effectu<74>es en
|
||||
conformit<EFBFBD> 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<65>cution du Contrat qui serait d<> <20> un cas de force majeure, un cas
|
||||
fortuit ou une cause ext<78>rieure, telle que, notamment, le mauvais
|
||||
fonctionnement ou les interruptions du r<>seau <20>lectrique ou de
|
||||
t<EFBFBD>l<EFBFBD>communication, la paralysie du r<>seau li<6C>e <20> une attaque
|
||||
informatique, l'intervention des autorit<69>s gouvernementales, les
|
||||
catastrophes naturelles, les d<>g<EFBFBD>ts des eaux, les tremblements de terre,
|
||||
le feu, les explosions, les gr<67>ves et les conflits sociaux, l'<27>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<70>valoir d'une ou plusieurs dispositions du
|
||||
Contrat, ne pourra en aucun cas impliquer renonciation par la Partie
|
||||
int<EFBFBD>ress<EFBFBD>e <20> s'en pr<70>valoir ult<6C>rieurement.
|
||||
|
||||
11.3 Le Contrat annule et remplace toute convention ant<6E>rieure, <20>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 <20> l'<27>gard des Parties <20> moins
|
||||
d'<27>tre faite par <20>crit et sign<67>e par leurs repr<70>sentants d<>ment habilit<69>s.
|
||||
|
||||
11.4 Dans l'hypoth<74>se o<> une ou plusieurs des dispositions du Contrat
|
||||
s'av<61>rerait contraire <20> une loi ou <20> un texte applicable, existants ou
|
||||
futurs, cette loi ou ce texte pr<70>vaudrait, et les Parties feraient les
|
||||
amendements n<>cessaires pour se conformer <20> cette loi ou <20> ce texte.
|
||||
Toutes les autres dispositions resteront en vigueur. De m<>me, la
|
||||
nullit<EFBFBD>, pour quelque raison que ce soit, d'une des dispositions du
|
||||
Contrat ne saurait entra<72>ner la nullit<69> de l'ensemble du Contrat.
|
||||
|
||||
|
||||
11.5 LANGUE
|
||||
|
||||
Le Contrat est r<>dig<69> en langue fran<61>aise et en langue anglaise, ces
|
||||
deux versions faisant <20>galement foi.
|
||||
|
||||
|
||||
Article 12 - NOUVELLES VERSIONS DU CONTRAT
|
||||
|
||||
12.1 Toute personne est autoris<69>e <20> copier et distribuer des copies de
|
||||
ce Contrat.
|
||||
|
||||
12.2 Afin d'en pr<70>server la coh<6F>rence, le texte du Contrat est prot<6F>g<EFBFBD>
|
||||
et ne peut <20>tre modifi<66> que par les auteurs de la licence, lesquels se
|
||||
r<EFBFBD>servent le droit de publier p<>riodiquement des mises <20> jour ou de
|
||||
nouvelles versions du Contrat, qui poss<73>deront chacune un num<75>ro
|
||||
distinct. Ces versions ult<6C>rieures seront susceptibles de prendre en
|
||||
compte de nouvelles probl<62>matiques rencontr<74>es par les logiciels libres.
|
||||
|
||||
12.3 Tout Logiciel diffus<75> sous une version donn<6E>e du Contrat ne pourra
|
||||
faire l'objet d'une diffusion ult<6C>rieure que sous la m<>me version du
|
||||
Contrat ou une version post<73>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<61>aise. Les Parties conviennent
|
||||
de tenter de r<>gler <20> l'amiable les diff<66>rends ou litiges qui
|
||||
viendraient <20> se produire par suite ou <20> l'occasion du Contrat.
|
||||
|
||||
13.2 A d<>faut d'accord amiable dans un d<>lai de deux (2) mois <20> compter
|
||||
de leur survenance et sauf situation relevant d'une proc<6F>dure d'urgence,
|
||||
les diff<66>rends ou litiges seront port<72>s par la Partie la plus diligente
|
||||
devant les Tribunaux comp<6D>tents de Paris.
|
||||
|
||||
|
||||
Version 2.0 du 2006-09-05.
|
63
src/Makefile
Normal file
63
src/Makefile
Normal file
@ -0,0 +1,63 @@
|
||||
EXEC=ecoPrimer
|
||||
|
||||
PRIMER_SRC= ecoprimer.c
|
||||
PRIMER_OBJ= $(patsubst %.c,%.o,$(PRIMER_SRC))
|
||||
|
||||
|
||||
SRCS= $(PRIMER_SRC)
|
||||
|
||||
LIB= -lecoPCR -lapat -lKMRK -lz -lm
|
||||
|
||||
LIBFILE= libapat/libapat.a \
|
||||
libecoPCR/libecoPCR.a \
|
||||
libKMRK/libKMRK.a
|
||||
|
||||
|
||||
include global.mk
|
||||
|
||||
all: $(EXEC)
|
||||
|
||||
|
||||
########
|
||||
#
|
||||
# ecoPrimer compilation
|
||||
#
|
||||
########
|
||||
|
||||
# executable compilation and link
|
||||
|
||||
ecoPrimer: $(PRIMER_OBJ) $(LIBFILE)
|
||||
$(CC) $(LDFLAGS) -o $@ $< $(LIBPATH) $(LIB)
|
||||
|
||||
|
||||
########
|
||||
#
|
||||
# library compilation
|
||||
#
|
||||
########
|
||||
|
||||
libapat/libapat.a:
|
||||
$(MAKE) -C libapat
|
||||
|
||||
libecoPCR/libecoPCR.a:
|
||||
$(MAKE) -C libecoPCR
|
||||
|
||||
libKMRK/libKMRK.a:
|
||||
$(MAKE) -C libKMRK
|
||||
|
||||
|
||||
########
|
||||
#
|
||||
# project management
|
||||
#
|
||||
########
|
||||
|
||||
clean:
|
||||
rm -f *.o
|
||||
rm -f $(EXEC)
|
||||
$(MAKE) -C libapat clean
|
||||
$(MAKE) -C libecoPCR clean
|
||||
$(MAKE) -C libKMRK clean
|
||||
|
||||
|
||||
|
0
src/ecoprimer.c
Normal file
0
src/ecoprimer.c
Normal file
18
src/global.mk
Normal file
18
src/global.mk
Normal file
@ -0,0 +1,18 @@
|
||||
MACHINE=MAC_OS_X
|
||||
LIBPATH= -Llibapat -LlibecoPCR -LlibKMRK
|
||||
MAKEDEPEND = gcc -D$(MACHINE) -M $(CPPFLAGS) -o $*.d $<
|
||||
|
||||
CC=gcc
|
||||
CFLAGS= -W -Wall -O2 -g
|
||||
|
||||
default: all
|
||||
|
||||
%.o: %.c
|
||||
$(CC) -D$(MACHINE) $(CFLAGS) -c -o $@ $<
|
||||
|
||||
%.P : %.c
|
||||
$(MAKEDEPEND)
|
||||
@sed 's/\($*\)\.o[ :]*/\1.o $@ : /g' < $*.d > $@; \
|
||||
rm -f $*.d; [ -s $@ ] || rm -f $@
|
||||
|
||||
include $(SRCS:.c=.P)
|
1009
src/libKMRK/KMRK.c
Normal file
1009
src/libKMRK/KMRK.c
Normal file
File diff suppressed because it is too large
Load Diff
309
src/libKMRK/KMRK.h
Normal file
309
src/libKMRK/KMRK.h
Normal file
@ -0,0 +1,309 @@
|
||||
#ifndef _KMRK_H_
|
||||
#define _KMRK_H_
|
||||
|
||||
/********************************************
|
||||
********************************************
|
||||
**
|
||||
** Declaration of struct
|
||||
**
|
||||
********************************************
|
||||
********************************************/
|
||||
|
||||
#include <stdint.h>
|
||||
#include "repseek_types.h"
|
||||
#include "KMRK_mask.h"
|
||||
|
||||
/**
|
||||
* Structure used to manipulate simultanously
|
||||
* the v and n vector
|
||||
*
|
||||
*/
|
||||
|
||||
typedef struct {
|
||||
|
||||
int32_t size; /**< size of vectors */
|
||||
int32_t seqCount; /**< count of concatenated sequences */
|
||||
int32_t complement; /**< if seqCount > 1 and complement !=0
|
||||
* then second sequence is the inverted complement
|
||||
* strand of first one */
|
||||
int32_t symbmax;
|
||||
int32_t* v; /**< sequence vector */
|
||||
int32_t* n; /**< linked list vector */
|
||||
int32_t limits[1]; /**< array of end limits of concatenated
|
||||
* sequences in v (array size is seqCount) */
|
||||
} vn_type;
|
||||
|
||||
|
||||
|
||||
/********************************************
|
||||
********************************************
|
||||
**
|
||||
** Declaration of public macro
|
||||
**
|
||||
********************************************
|
||||
********************************************/
|
||||
|
||||
// Return a pointer to a vector from a vn_type structure
|
||||
#define GETVECTOR(x,vector) (((x)->vector) - 1)
|
||||
|
||||
#define IS_MARKED(x,i) ((x)[i] < 0)
|
||||
#define MARK(x,i) ((x)[i]) = -ABS((x)[i])
|
||||
#define UNMARK(x,i) ((x)[i]) = ABS((x)[i])
|
||||
|
||||
#define SET(x,i,v) ((x)[i]) = (v)
|
||||
|
||||
// set and mark in one operation
|
||||
#define SETMARKED(x,i,v) ((x)[i]) = -(v)
|
||||
|
||||
//internal macro
|
||||
#define GET(x,i) ABS((x)[i])
|
||||
|
||||
// get symbole at position i in vector x
|
||||
#define SYMBOLE(x,i) ((IS_MARKED((x),(i))) ? (i): (GET(x,i)))
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Macro used to declare a pointer to a quorum function.
|
||||
*
|
||||
* @param name name of the pointer
|
||||
*
|
||||
*/
|
||||
|
||||
#define KMRK_QUORUM_FUNC_PTR(name) int32_t (*name)(vn_type* x, \
|
||||
int32_t pos, \
|
||||
int32_t count, \
|
||||
int32_t countSeq)
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Macro used to declare a pointer to an initialisation function.
|
||||
*
|
||||
* @param name name of the pointer
|
||||
* @param quorum name used for the quorum assiciated function
|
||||
*
|
||||
* @see KMRK_QUORUM_FUNC_PTR
|
||||
*
|
||||
*/
|
||||
|
||||
#define KMRK_INIT_FUNC_PTR(name,quorum) vn_type* (*name)(char *sequence, \
|
||||
int32_t complement, \
|
||||
int32_t count, \
|
||||
int32_t countSeq, \
|
||||
int32_t *k, \
|
||||
KMRK_QUORUM_FUNC_PTR(quorum),\
|
||||
masked_area_table_t *mask)
|
||||
|
||||
|
||||
/********************************************
|
||||
********************************************
|
||||
**
|
||||
** Declaration of public functions
|
||||
**
|
||||
********************************************
|
||||
********************************************/
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Initialise a vn_type record from one sequence to run KMRK algorithm
|
||||
*
|
||||
* @param sequence pointer to a C string containing the sequence
|
||||
* @param complement != 0 means that seq one and two are the two strands of
|
||||
* the same sequence.
|
||||
* @param count parameter count passed to the quorun function
|
||||
* @param countSeq parametter countSeq passed to the quorun function
|
||||
* @param k length of the word represented by each symbole of v.
|
||||
* k is an output parametter
|
||||
* @param quorum pointer to a quorum function
|
||||
*
|
||||
* @return a pointer to vn_type structure correctly initialized
|
||||
* to be used by KMRK_RunKMRK
|
||||
*
|
||||
* @see KMRK_HashOneSequence
|
||||
*/
|
||||
|
||||
vn_type* KMRK_InitOneSequence(char *sequence,
|
||||
int32_t complement,
|
||||
int32_t count,
|
||||
int32_t countSeq,
|
||||
int32_t *k,
|
||||
KMRK_QUORUM_FUNC_PTR(quorum),
|
||||
masked_area_table_t *mask);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Initialise a vn_type record from one sequence to run KMRK algorithme.
|
||||
* In more than KMRK_InitOneSequence, KMRK_HashOneSequence construct
|
||||
* word of len k with an hash algorithm. k used is a function of
|
||||
* sequence size and alphabet size. If calculed k is superior to lmax
|
||||
* then k = lmax.
|
||||
*
|
||||
* @param sequence pointer to a C string containing the sequence
|
||||
* @param complement != 0 means that seq one and two are the two strands of
|
||||
* the same sequence.
|
||||
* @param count parametter count passed to the quorun function
|
||||
* @param countSeq parametter countSeq passed to the quorun function
|
||||
* @param k maximum length of the created word (input)
|
||||
* length of the word represented by each symbole
|
||||
* of v (output).
|
||||
* @param quorum pointer to a quorum function
|
||||
*
|
||||
* @return a pointer to vn_type structure correctly initialized
|
||||
* to be used by KMRK_RunKMRK
|
||||
*
|
||||
* @see KMRK_InitOneSequence
|
||||
*/
|
||||
|
||||
vn_type* KMRK_HashOneSequence(char *sequence,
|
||||
int32_t complement,
|
||||
int32_t count,
|
||||
int32_t countSeq,
|
||||
int32_t *k,
|
||||
KMRK_QUORUM_FUNC_PTR(quorum),
|
||||
masked_area_table_t *mask);
|
||||
|
||||
|
||||
/**
|
||||
* An example of quorum function testing than a factor is
|
||||
* present a least two times. Because of definition of this
|
||||
* quorum function count and countSeq parametter have no meanning
|
||||
* in this instance of quorum function
|
||||
*
|
||||
* @param x a pointer to vn_type structure to check
|
||||
* @param pos position in n of the beginning of the linked list to test
|
||||
* @param count minimal number of occurence of factor
|
||||
* @param countSeq minimal number of sequences concerned
|
||||
*
|
||||
* @return 1 if quorum is ok 0 otherwise.
|
||||
*/
|
||||
|
||||
int32_t KMRK_CoupleQuorum(vn_type* x,
|
||||
int32_t pos,
|
||||
int32_t count,
|
||||
int32_t countSeq);
|
||||
|
||||
|
||||
/**
|
||||
* An example of quorum function testing than a factor is
|
||||
* present a least two times in the direct strand of a sequence or
|
||||
* at least one time in the direct strand and one time in the reverse
|
||||
* strand. Because of definition of this
|
||||
* quorum function count and countSeq parametter have no meanning
|
||||
* in this instance of quorum function
|
||||
*
|
||||
* @param x a pointer to vn_type structure to check
|
||||
* @param pos position in n of the beginning of the linked list to test
|
||||
* @param count minimal number of occurence of factor
|
||||
* @param countSeq minimal number of sequences concerned
|
||||
*
|
||||
* @return 1 if quorum is ok 0 otherwise.
|
||||
*/
|
||||
|
||||
int32_t KMRK_DirInvQuorum(vn_type* x,
|
||||
int32_t pos,
|
||||
int32_t count,
|
||||
int32_t countSeq);
|
||||
|
||||
/**
|
||||
* An example of quorum function testing than a factor is
|
||||
* present a least one time in the direct strand and one time in the reverse
|
||||
* strand. Because of definition of this
|
||||
* quorum function count and countSeq parametter have no meanning
|
||||
* in this instance of quorum function
|
||||
*
|
||||
* @param x a pointer to vn_type structure to check
|
||||
* @param pos position in n of the beginning of the linked list to test
|
||||
* @param count minimal number of occurence of factor
|
||||
* @param countSeq minimal number of sequences concerned
|
||||
*
|
||||
* @return 1 if quorum is ok 0 otherwise.
|
||||
*/
|
||||
|
||||
int32_t KMRK_InvQuorum(vn_type* x,
|
||||
int32_t pos,
|
||||
int32_t count,
|
||||
int32_t countSeq);
|
||||
|
||||
int32_t KMRK_Int12Quorum(vn_type* x,
|
||||
int32_t pos,
|
||||
int32_t count,
|
||||
int32_t countSeq);
|
||||
|
||||
int32_t KMRK_IntInv12Quorum(vn_type* x,
|
||||
int32_t pos,
|
||||
int32_t count,
|
||||
int32_t countSeq);
|
||||
|
||||
int32_t KMRK_IntDirInv12Quorum(vn_type* x,
|
||||
int32_t pos,
|
||||
int32_t count,
|
||||
int32_t countSeq);
|
||||
/**
|
||||
* realize one cycle of KMR.
|
||||
*
|
||||
* @param x a pointer to vn_type created by an intialisation
|
||||
* function or returned by this function.
|
||||
* @param k step used to join two words
|
||||
* @param count parametter count passed to the quorun function
|
||||
* @param countSeq parametter countSeq passed to the quorun function
|
||||
* @param KMRK_QUORUM_FUNC_PTR quorum pointer to a quorum function
|
||||
*/
|
||||
|
||||
void KMRK_RunKMRK(vn_type *x,
|
||||
int32_t k,
|
||||
int32_t count,
|
||||
int32_t countSeq,
|
||||
KMRK_QUORUM_FUNC_PTR(quorum));
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* realises serveral run of KMR cycle to make from a sequence
|
||||
* a vn_type structure describing sequences of factors of a precise size.
|
||||
*
|
||||
* @param sequence pointer to a C string containing the sequence
|
||||
* @param size word size to construct
|
||||
* @param count parametter count passed to the quorun function
|
||||
* @param countSeq parametter countSeq passed to the quorun function
|
||||
* @param quorum pointer to a quorum function
|
||||
* @param init pointer to a initialisation function
|
||||
*
|
||||
* @return a vn_type pointer to a structure containing sequences of factors
|
||||
*/
|
||||
|
||||
vn_type *KMRK_RunTo(char *sequence,
|
||||
int32_t size,
|
||||
int32_t complement,
|
||||
int32_t count,
|
||||
int32_t countSeq,
|
||||
KMRK_QUORUM_FUNC_PTR(quorum),
|
||||
KMRK_INIT_FUNC_PTR(init,quorum),
|
||||
masked_area_table_t *mask);
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* free memory associated to a vn_type pointer
|
||||
*
|
||||
* @param x a pointer to vn_type structure
|
||||
*/
|
||||
|
||||
void KMRK_FreeVN(vn_type *x);
|
||||
|
||||
|
||||
int32_t KMRK_upperCoupleCount(vn_type *x);
|
||||
int32_t KMRK_upperInvertedCount(vn_type* x,int32_t wordsize);
|
||||
int32_t KMRK_upperInterCount(vn_type* x,int32_t seq1,int32_t seq2,int32_t wordsize);
|
||||
|
||||
void KMRK_markStart(vn_type* x);
|
||||
|
||||
#endif //_KMRK_H_
|
908
src/libKMRK/KMRK_Seeds.c
Normal file
908
src/libKMRK/KMRK_Seeds.c
Normal file
@ -0,0 +1,908 @@
|
||||
#include "KMRK_Seeds.h"
|
||||
#include "memory.h"
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include "sequence.h"
|
||||
|
||||
|
||||
static void SetMultipleLenInvSeeds(SmallSeed_type* seeds,
|
||||
int32_t nseeds,
|
||||
int32_t wordSize,
|
||||
int8_t same,
|
||||
AllSeeds_type *PtrAllSeeds);
|
||||
|
||||
|
||||
/*
|
||||
Concatenate
|
||||
DirSeq\0InvSeq\0
|
||||
*/
|
||||
static char* makeDirInvSeq(char* seq, int32_t size)
|
||||
{
|
||||
char *SeqInv;
|
||||
|
||||
seq = (char *)MyRealloc( (void *)seq, (size*2+2)*sizeof(char),
|
||||
(size+1)* sizeof(char), "Cannot allocate space for reverse sequence");
|
||||
|
||||
SeqInv= seq + size + 1;
|
||||
seq[size]=0;
|
||||
invseq(seq, SeqInv);
|
||||
seq[size]='@';
|
||||
SeqInv[size]=0;
|
||||
|
||||
return seq;
|
||||
}
|
||||
|
||||
/*
|
||||
Merge the seq1 with seq2
|
||||
*/
|
||||
static char *merge2seq(char* seq1, char* seq2,
|
||||
int32_t size1, int32_t size2)
|
||||
{
|
||||
char * dest;
|
||||
|
||||
seq1 = (char *)MyRealloc((void *)seq1, (size1+size2+2) *sizeof(char),
|
||||
(size1+1)*sizeof(char), "Cannot allocate space for reverse sequence");
|
||||
|
||||
dest = seq1 + size1 + 1;
|
||||
seq1[size1]='@';
|
||||
memcpy(dest,seq2,size2);
|
||||
dest[size2]=0;
|
||||
|
||||
return seq1;
|
||||
}
|
||||
|
||||
static int32_t dirDelta(SmallSeed_type* seed)
|
||||
{
|
||||
return seed->pos2 - seed->pos1;
|
||||
}
|
||||
|
||||
void KMRK_SetMultipleLenDirSeeds(SmallSeed_type* seeds,
|
||||
int32_t nseeds,
|
||||
int32_t wordSize,
|
||||
AllSeeds_type *PtrAllSeeds)
|
||||
{
|
||||
|
||||
int32_t i,j; /* dummy counters j=kept seeds ; i = current seed */
|
||||
int32_t curLen=wordSize; /* Length of the current seed */
|
||||
int32_t delta;
|
||||
SmallSeed_type *mainSeed;
|
||||
SmallSeed_type *curSeed;
|
||||
int32_t add;
|
||||
|
||||
/* fprintf(stderr,"New Version\n");*/
|
||||
|
||||
KMRK_sortSeeds(seeds,nseeds,KMRK_cmpDeltaSeedsPos);
|
||||
|
||||
for(j=0,mainSeed=seeds ;
|
||||
j < nseeds;
|
||||
j=i,mainSeed=curSeed)
|
||||
{
|
||||
/* foreach seed */
|
||||
delta = dirDelta(mainSeed);
|
||||
curLen=wordSize;
|
||||
|
||||
for (i=j+1,curSeed=mainSeed+1;
|
||||
i < nseeds &&
|
||||
dirDelta(curSeed)==delta &&
|
||||
(curSeed->pos1 - mainSeed->pos1) <= curLen;
|
||||
i++,curSeed++)
|
||||
{
|
||||
add=wordSize - mainSeed->pos1 - curLen + curSeed->pos1;
|
||||
if (add < 0) add = 0;
|
||||
curLen+=add;
|
||||
}
|
||||
|
||||
KMRK_pushSeed(PtrAllSeeds,
|
||||
seeds[j].pos1,seeds[j].pos2,
|
||||
curLen,
|
||||
1);
|
||||
}
|
||||
}
|
||||
|
||||
static int32_t invDelta(SmallSeed_type* seed)
|
||||
{
|
||||
return seed->pos2 + seed->pos1;
|
||||
}
|
||||
|
||||
static void SetMultipleLenInvSeeds(SmallSeed_type* seeds,
|
||||
int32_t nseeds,
|
||||
int32_t wordSize,
|
||||
int8_t same,
|
||||
AllSeeds_type *PtrAllSeeds)
|
||||
{
|
||||
|
||||
int32_t i,j; /* dummy counters j=kept seeds ; i = current seed */
|
||||
int32_t curLen=wordSize; /* Length of the current seed */
|
||||
int32_t delta;
|
||||
int32_t pos2;
|
||||
SmallSeed_type *mainSeed;
|
||||
SmallSeed_type *curSeed;
|
||||
int32_t add;
|
||||
|
||||
/* fprintf(stderr,"New Version\n");*/
|
||||
|
||||
KMRK_sortSeeds(seeds,nseeds,KMRK_cmpDeltaInvSeedsPos);
|
||||
|
||||
for(j=0,mainSeed=seeds ;
|
||||
j < nseeds;
|
||||
j=i,mainSeed=curSeed)
|
||||
{
|
||||
/* foreach seed */
|
||||
delta = invDelta(mainSeed);
|
||||
curLen=wordSize;
|
||||
|
||||
for (i=j+1,curSeed=mainSeed+1;
|
||||
i < nseeds &&
|
||||
invDelta(curSeed)==delta &&
|
||||
(curSeed->pos1 - mainSeed->pos1) <= curLen;
|
||||
i++,curSeed++)
|
||||
{
|
||||
add=wordSize - mainSeed->pos1 - curLen + curSeed->pos1;
|
||||
if (add < 0) add = 0;
|
||||
curLen+=add;
|
||||
}
|
||||
|
||||
if ( same && (seeds[j].pos1+curLen>= seeds[i-1].pos2))
|
||||
{
|
||||
curLen = (seeds[i-1].pos2 - seeds[j].pos1 + 1) * 2;
|
||||
pos2 = seeds[j].pos1;
|
||||
}
|
||||
else
|
||||
pos2 = seeds[i-1].pos2;
|
||||
|
||||
KMRK_pushSeed(PtrAllSeeds,
|
||||
seeds[j].pos1,pos2,
|
||||
curLen,
|
||||
0);
|
||||
}
|
||||
}
|
||||
|
||||
AllSeeds_type *KMRK_allocSeeds(AllSeeds_type *AllSeeds,
|
||||
int32_t size,
|
||||
int8_t opt_dir,
|
||||
int8_t opt_inv)
|
||||
{
|
||||
|
||||
AllSeeds_type *reponse;
|
||||
|
||||
if(opt_inv != 1 && opt_dir != 1)
|
||||
{
|
||||
fprintf(stderr,"AllocSeeds: requiere at least "
|
||||
"one of opt_dir and opt_inv to be 1\n");
|
||||
exit(4);
|
||||
}
|
||||
|
||||
reponse = AllSeeds;
|
||||
|
||||
if (!reponse)
|
||||
reponse = MyCalloc( 1, sizeof(AllSeeds_type),"KMRK_allocSeeds: cannot allocate new data structure");
|
||||
|
||||
if(opt_dir)
|
||||
{
|
||||
if (reponse->dirSeeds==NULL)
|
||||
reponse->dirSeeds = (Seed_type *)MyCalloc( size,sizeof(Seed_type),"KMRK_allocSeeds: cannot allocate new data structure");
|
||||
else
|
||||
{
|
||||
if(size)
|
||||
reponse->dirSeeds = (Seed_type *)MyRealloc( (void *)reponse->dirSeeds,
|
||||
size*sizeof(Seed_type), reponse->cDirSeeds*sizeof(Seed_type),
|
||||
"allocSeeds: cannot reallocate data structure" );
|
||||
else
|
||||
{
|
||||
MyFree(reponse->dirSeeds, reponse->cDirSeeds*sizeof(Seed_type));
|
||||
reponse->dirSeeds=NULL;
|
||||
reponse->cDirSeeds=0;
|
||||
}
|
||||
}
|
||||
|
||||
reponse->cDirSeeds=size;
|
||||
}
|
||||
|
||||
|
||||
if(opt_inv)
|
||||
{
|
||||
if (reponse->invSeeds==NULL)
|
||||
reponse->invSeeds = (Seed_type *)MyCalloc( size, sizeof(Seed_type),"KMRK_allocSeeds: cannot allocate new data structure");
|
||||
else
|
||||
{
|
||||
if(size)
|
||||
reponse->invSeeds = (Seed_type *)MyRealloc( (void *)reponse->invSeeds,
|
||||
size*sizeof(Seed_type), reponse->cInvSeeds*sizeof(Seed_type),
|
||||
"allocSeeds: cannot reallocate data structure" );
|
||||
else
|
||||
{
|
||||
MyFree(reponse->invSeeds, reponse->cInvSeeds*sizeof(Seed_type));
|
||||
reponse->invSeeds=NULL;
|
||||
reponse->cInvSeeds=0;
|
||||
}
|
||||
}
|
||||
|
||||
reponse->cInvSeeds=size;
|
||||
}
|
||||
|
||||
|
||||
return reponse;
|
||||
}
|
||||
|
||||
void KMRK_freeSeeds(AllSeeds_type *AllSeeds)
|
||||
{
|
||||
if (!AllSeeds)
|
||||
return;
|
||||
|
||||
if (AllSeeds->dirSeeds)
|
||||
MyFree(AllSeeds->dirSeeds, AllSeeds->cDirSeeds*sizeof(Seed_type) );
|
||||
AllSeeds->dirSeeds=NULL;
|
||||
|
||||
if (AllSeeds->invSeeds)
|
||||
MyFree(AllSeeds->invSeeds, AllSeeds->cInvSeeds*sizeof(Seed_type) );
|
||||
AllSeeds->dirSeeds=NULL;
|
||||
|
||||
MyFree(AllSeeds, 1*sizeof( AllSeeds_type ) );
|
||||
}
|
||||
|
||||
void KMRK_compactSeeds(AllSeeds_type *AllSeeds)
|
||||
{
|
||||
if (AllSeeds)
|
||||
{
|
||||
if (AllSeeds->dirSeeds)
|
||||
KMRK_allocSeeds(AllSeeds,
|
||||
AllSeeds->nDirSeeds,
|
||||
1,
|
||||
0);
|
||||
|
||||
if (AllSeeds->invSeeds)
|
||||
KMRK_allocSeeds(AllSeeds,
|
||||
AllSeeds->nInvSeeds,
|
||||
0,
|
||||
1);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void KMRK_pushSeed(AllSeeds_type *AllSeeds,
|
||||
int32_t pos1,
|
||||
int32_t pos2,
|
||||
int32_t length,
|
||||
int8_t dir)
|
||||
{
|
||||
Seed_type* stack;
|
||||
int32_t maxcount;
|
||||
int32_t index;
|
||||
|
||||
if (dir)
|
||||
{
|
||||
dir = 1;
|
||||
stack = AllSeeds->dirSeeds;
|
||||
maxcount = AllSeeds->cDirSeeds;
|
||||
index = AllSeeds->nDirSeeds;
|
||||
}
|
||||
else
|
||||
{
|
||||
dir = 0;
|
||||
stack = AllSeeds->invSeeds;
|
||||
maxcount = AllSeeds->cInvSeeds;
|
||||
index = AllSeeds->nInvSeeds;
|
||||
}
|
||||
|
||||
if (index == maxcount)
|
||||
{
|
||||
(void) KMRK_allocSeeds(AllSeeds,
|
||||
maxcount * 2,
|
||||
dir,
|
||||
!dir);
|
||||
|
||||
if (dir)
|
||||
stack = AllSeeds->dirSeeds;
|
||||
else
|
||||
stack = AllSeeds->invSeeds;
|
||||
}
|
||||
|
||||
stack+=index;
|
||||
|
||||
stack->pos1 = pos1;
|
||||
stack->pos2 = pos2;
|
||||
stack->length = length;
|
||||
|
||||
if (dir)
|
||||
AllSeeds->nDirSeeds++;
|
||||
else
|
||||
AllSeeds->nInvSeeds++;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
AllSeeds_type* KMRK_enumerateDirectCouple(AllSeeds_type* Seeds,
|
||||
int32_t expected,
|
||||
int32_t wordSize,
|
||||
vn_type* stack,
|
||||
int32_t seq)
|
||||
{
|
||||
|
||||
int32_t xmin;
|
||||
int32_t xmax;
|
||||
int32_t i;
|
||||
int32_t j;
|
||||
int32_t k;
|
||||
int32_t next;
|
||||
int32_t* n;
|
||||
int32_t nseeds;
|
||||
|
||||
SmallSeed_type *list;
|
||||
|
||||
list = (SmallSeed_type *)MyCalloc( expected, sizeof(SmallSeed_type) ,
|
||||
"KMRK_enumerateDirectCouple: cannot allocate DirectCouple memory");
|
||||
|
||||
nseeds = 0;
|
||||
|
||||
n = GETVECTOR(stack,n);
|
||||
|
||||
if (seq)
|
||||
xmin = stack->limits[seq-1];
|
||||
else
|
||||
xmin = 0;
|
||||
|
||||
xmax = stack->limits[seq];
|
||||
|
||||
for (i=1; i <= xmax; i++)
|
||||
if (IS_MARKED(n,i)) /* Check begining of chained list */
|
||||
{
|
||||
/* Look for begining of sequence of interest */
|
||||
for( ;(i <= xmin) && (i != GET(n,i));
|
||||
i=GET(n,i));
|
||||
|
||||
/* for each factor in sequence of interest */
|
||||
for (j=i;
|
||||
(j != GET(n,j)) && (j <= xmax);
|
||||
j = GET(n,j))
|
||||
{
|
||||
next = GET(n,j);
|
||||
if (next <= xmax)
|
||||
do
|
||||
{
|
||||
k = next;
|
||||
next = GET(n,k);
|
||||
list[nseeds].pos1 = j-1;
|
||||
list[nseeds].pos2 = k-1;
|
||||
nseeds++;
|
||||
} while ((k!=next) && (next <= xmax));
|
||||
}
|
||||
} ;
|
||||
|
||||
Seeds = KMRK_allocSeeds(Seeds,
|
||||
expected/20+1,
|
||||
1,0);
|
||||
|
||||
/* fprintf(stderr,"Expected direct couple : %d\n",expected);*/
|
||||
|
||||
KMRK_SetMultipleLenDirSeeds(list,nseeds,wordSize,Seeds);
|
||||
MyFree(list, expected*sizeof(SmallSeed_type) );
|
||||
KMRK_compactSeeds(Seeds);
|
||||
|
||||
return Seeds;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
From KMR-K Stacks to SmallSeeds
|
||||
*/
|
||||
AllSeeds_type* KMRK_enumerateInvertedCouple(AllSeeds_type* Seeds,
|
||||
int32_t expected,
|
||||
int32_t wordSize,
|
||||
vn_type* stack)
|
||||
{
|
||||
int32_t xmax;
|
||||
int32_t invmax;
|
||||
int32_t posinv;
|
||||
int32_t i;
|
||||
int32_t j;
|
||||
int32_t k;
|
||||
int32_t memk;
|
||||
int32_t* n;
|
||||
int32_t next;
|
||||
|
||||
int32_t nseeds; /* number of seeds */
|
||||
|
||||
SmallSeed_type *list; /* seed list with only pos1 and pos2 --simple output from kmrk */
|
||||
|
||||
|
||||
list = (SmallSeed_type *)MyCalloc( expected, sizeof(SmallSeed_type) ,
|
||||
"KMRK_enumerateInvertedCouple: cannot allocate InvertedCouple memory");
|
||||
|
||||
nseeds = 0;
|
||||
|
||||
n = GETVECTOR(stack,n);
|
||||
|
||||
xmax = stack->limits[0];
|
||||
invmax = stack->limits[1];
|
||||
|
||||
for (i=1; i <= xmax; i++)
|
||||
if (IS_MARKED(n,i))
|
||||
{
|
||||
for(memk=i ;
|
||||
(memk < xmax) &&
|
||||
memk != GET(n,memk) &&
|
||||
(memk <= invmax);
|
||||
memk=GET(n,memk));
|
||||
|
||||
if ((memk > xmax) && (memk <= invmax))
|
||||
for (j=i;
|
||||
(j <= xmax) && (j != GET(n,j));
|
||||
j=GET(n,j))
|
||||
{
|
||||
next = memk;
|
||||
do
|
||||
{
|
||||
k = next;
|
||||
next = GET(n,k);
|
||||
posinv = 2 * xmax - k -wordSize + 3;
|
||||
if (j <= posinv)
|
||||
{
|
||||
list[nseeds].pos1=j-1;
|
||||
list[nseeds].pos2=posinv-1;
|
||||
nseeds++;
|
||||
}
|
||||
} while ((next <= invmax) && (k != next));
|
||||
}
|
||||
}
|
||||
|
||||
Seeds = KMRK_allocSeeds(Seeds,
|
||||
expected/20+1,
|
||||
0,1);
|
||||
|
||||
/* fprintf(stderr,"Expected inverted couple : %d\n",expected);*/
|
||||
|
||||
SetMultipleLenInvSeeds(list,nseeds,wordSize,1,Seeds); /* turn the Small seeds into merged seeds */
|
||||
MyFree(list, expected*sizeof(SmallSeed_type) );
|
||||
KMRK_compactSeeds(Seeds);
|
||||
|
||||
|
||||
return Seeds;
|
||||
}
|
||||
|
||||
AllSeeds_type* KMRK_enumerateInterCouple(AllSeeds_type* Seeds,
|
||||
int32_t seq1,
|
||||
int32_t seq2,
|
||||
int32_t expected,
|
||||
int32_t wordSize,
|
||||
vn_type* stack)
|
||||
{
|
||||
int32_t xmin;
|
||||
int32_t xmax;
|
||||
int32_t ymax;
|
||||
int32_t ymin;
|
||||
int32_t pos1;
|
||||
int32_t pos2;
|
||||
int32_t i;
|
||||
int32_t j;
|
||||
int32_t k;
|
||||
int32_t memj;
|
||||
int32_t memk;
|
||||
int32_t* n;
|
||||
int32_t next;
|
||||
|
||||
int32_t nseeds;
|
||||
|
||||
|
||||
SmallSeed_type *list;
|
||||
nseeds=0;
|
||||
|
||||
list = (SmallSeed_type *)MyCalloc( expected, sizeof(SmallSeed_type) ,
|
||||
"KMRK_enumerateInterCouple: cannot allocate InterCouple memory");
|
||||
|
||||
n = GETVECTOR(stack,n);
|
||||
|
||||
if (seq1==0)
|
||||
xmin=0;
|
||||
else
|
||||
xmin = stack->limits[seq1-1];
|
||||
|
||||
xmax = stack->limits[seq1];
|
||||
ymin = stack->limits[seq2-1];
|
||||
ymax = stack->limits[seq2];
|
||||
|
||||
for (i=1; i <= xmax; i++)
|
||||
if (IS_MARKED(n,i))
|
||||
{
|
||||
for(memj=i ;
|
||||
(memj < xmin) &&
|
||||
memj != GET(n,memj);
|
||||
memj=GET(n,memj));
|
||||
|
||||
if ((memj > xmin) && (memj <= xmax))
|
||||
{
|
||||
for(memk=memj ;
|
||||
(memk < ymin) &&
|
||||
memk != GET(n,memk);
|
||||
memk=GET(n,memk));
|
||||
|
||||
if ((memk > ymin) && (memk <= ymax))
|
||||
for (j=memj;
|
||||
(j <= xmax) && (j != GET(n,j));
|
||||
j=GET(n,j))
|
||||
{
|
||||
next = memk;
|
||||
do
|
||||
{
|
||||
k = next;
|
||||
next = GET(n,k);
|
||||
if (seq1 > 0)
|
||||
pos1 = j - xmin - 1;
|
||||
else
|
||||
pos1 = j;
|
||||
pos2 = k - ymin - 1;
|
||||
list[nseeds].pos1 = pos1 - 1;
|
||||
list[nseeds].pos2 = pos2 - 1;
|
||||
nseeds++;
|
||||
} while ((next <= ymax) && (k != next));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Seeds = KMRK_allocSeeds(Seeds,
|
||||
expected/20+1,
|
||||
1,0);
|
||||
|
||||
/* fprintf(stderr,"Expected inter-direct couple : %d\n",expected);*/
|
||||
KMRK_SetMultipleLenDirSeeds(list,nseeds,wordSize,Seeds);
|
||||
|
||||
MyFree(list, expected*sizeof(SmallSeed_type) );
|
||||
|
||||
KMRK_compactSeeds(Seeds);
|
||||
|
||||
return Seeds;
|
||||
}
|
||||
|
||||
AllSeeds_type* KMRK_enumerateInterInvertedCouple(AllSeeds_type* Seeds,
|
||||
int32_t seq2,
|
||||
int32_t expected,
|
||||
int32_t wordSize,
|
||||
vn_type* stack)
|
||||
|
||||
{
|
||||
int32_t xmin;
|
||||
int32_t xmax;
|
||||
int32_t ymax;
|
||||
int32_t ymin;
|
||||
int32_t posinv;
|
||||
int32_t pos2;
|
||||
int32_t i;
|
||||
int32_t j;
|
||||
int32_t k;
|
||||
int32_t memj;
|
||||
int32_t memk;
|
||||
int32_t* n;
|
||||
int32_t next;
|
||||
|
||||
int32_t nseeds;
|
||||
|
||||
SmallSeed_type *list;
|
||||
|
||||
list = (SmallSeed_type *)MyCalloc( expected, sizeof(SmallSeed_type) ,
|
||||
"KMRK_enumerateInterCouple: cannot allocate InterCouple memory");
|
||||
|
||||
|
||||
nseeds = 0;
|
||||
n = GETVECTOR(stack,n);
|
||||
|
||||
if (seq2 < 2)
|
||||
{
|
||||
fprintf(stderr,"enumerateInterInvertedCouple: seq2 must be differente to 0");
|
||||
exit(4);
|
||||
}
|
||||
|
||||
|
||||
xmin = stack->limits[0];
|
||||
xmax = stack->limits[1];
|
||||
|
||||
ymin = stack->limits[seq2-1];
|
||||
ymax = stack->limits[seq2];
|
||||
|
||||
Seeds = KMRK_allocSeeds(Seeds,
|
||||
expected,
|
||||
0,1);
|
||||
|
||||
for (i=1; i <= xmax; i++)
|
||||
if (IS_MARKED(n,i))
|
||||
{
|
||||
for(memj=i ;
|
||||
(memj < xmin) &&
|
||||
memj != GET(n,memj);
|
||||
memj=GET(n,memj));
|
||||
|
||||
if ((memj > xmin) && (memj <= xmax))
|
||||
{
|
||||
for(memk=memj ;
|
||||
(memk < ymin) &&
|
||||
memk != GET(n,memk);
|
||||
memk=GET(n,memk));
|
||||
|
||||
if ((memk > ymin) && (memk <= ymax))
|
||||
for (j=memj;
|
||||
(j <= xmax) && (j != GET(n,j));
|
||||
j=GET(n,j))
|
||||
{
|
||||
next = memk;
|
||||
do
|
||||
{
|
||||
k = next;
|
||||
next = GET(n,k);
|
||||
posinv = 2 * xmin - j -wordSize + 3;
|
||||
pos2 = k - ymin - 1;
|
||||
list[nseeds].pos1=posinv-1;
|
||||
list[nseeds].pos2=pos2-1;
|
||||
nseeds++;
|
||||
} while ((next <= ymax) && (k != next));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Seeds = KMRK_allocSeeds(Seeds,
|
||||
expected/20+1,
|
||||
0,1);
|
||||
|
||||
/* fprintf(stderr,"Expected inter-inverted couple : %d\n",expected);*/
|
||||
SetMultipleLenInvSeeds(list,nseeds,wordSize,0,Seeds);
|
||||
MyFree(list, expected* sizeof(SmallSeed_type) );
|
||||
KMRK_compactSeeds(Seeds);
|
||||
|
||||
|
||||
return Seeds;
|
||||
}
|
||||
|
||||
|
||||
int32_t KMRK_cmpSeedsPos(SmallSeed_type *s1, SmallSeed_type *s2)
|
||||
{
|
||||
if (s1->pos1==s2->pos1)
|
||||
return s1->pos2 - s2->pos2;
|
||||
else
|
||||
return s1->pos1 - s2->pos1;
|
||||
}
|
||||
|
||||
int32_t KMRK_cmpDeltaSeedsPos(SmallSeed_type *s1, SmallSeed_type *s2)
|
||||
{
|
||||
int32_t delta1 = s1->pos2-s1->pos1;
|
||||
int32_t delta2 = s2->pos2-s2->pos1;
|
||||
|
||||
if (delta1==delta2)
|
||||
return s1->pos1 - s2->pos1;
|
||||
else
|
||||
return delta1 - delta2;
|
||||
}
|
||||
|
||||
int32_t KMRK_cmpDeltaInvSeedsPos(SmallSeed_type *s1, SmallSeed_type *s2)
|
||||
{
|
||||
int32_t delta1 = s1->pos2+s1->pos1;
|
||||
int32_t delta2 = s2->pos2+s2->pos1;
|
||||
|
||||
if (delta1==delta2)
|
||||
|
||||
return s1->pos1 - s2->pos1;
|
||||
else
|
||||
return delta1 - delta2;
|
||||
}
|
||||
|
||||
|
||||
void KMRK_sortSeeds(SmallSeed_type* seeds,
|
||||
int32_t nseeds,
|
||||
KMRK_SORT_SEEDS_FUNC_PTR(compare))
|
||||
{
|
||||
|
||||
qsort(seeds,
|
||||
nseeds,
|
||||
sizeof(SmallSeed_type),
|
||||
(int (*)(const void *, const void *))compare);
|
||||
}
|
||||
|
||||
AllSeeds_type* KMRK_get_seeds(char **seq,
|
||||
int32_t SimpleSeqLen,
|
||||
int16_t Lmin,
|
||||
int8_t opt_dir,
|
||||
int8_t opt_inv,
|
||||
int8_t opt_verbose,
|
||||
masked_area_table_t *mask)
|
||||
{
|
||||
AllSeeds_type* AllSeeds;
|
||||
char *SeqDir = *seq;
|
||||
vn_type * stacks;
|
||||
int32_t dirExpect=0;
|
||||
int32_t invExpect=0;
|
||||
KMRK_QUORUM_FUNC_PTR(quorum);
|
||||
|
||||
if(opt_inv != 1 &&
|
||||
opt_dir != 1)
|
||||
{
|
||||
fprintf(stderr,
|
||||
"get_seeds: requiered at least "
|
||||
"opt_dir or opt_inv to be 1\n");
|
||||
exit(4);
|
||||
}
|
||||
|
||||
if(opt_inv)
|
||||
SeqDir = makeDirInvSeq(SeqDir,SimpleSeqLen); /* create a sequence with "DirSeq\0InvSeq\0" */
|
||||
|
||||
if (opt_inv){ /* Are we interested in dir, inv or both ? */
|
||||
if (opt_dir)
|
||||
quorum = KMRK_DirInvQuorum;
|
||||
else
|
||||
quorum = KMRK_InvQuorum;
|
||||
}
|
||||
else
|
||||
quorum = KMRK_CoupleQuorum;
|
||||
|
||||
stacks = KMRK_RunTo(SeqDir,
|
||||
Lmin,
|
||||
opt_inv,
|
||||
2,
|
||||
1,
|
||||
quorum,
|
||||
KMRK_HashOneSequence,
|
||||
mask);
|
||||
|
||||
invExpect =0;
|
||||
|
||||
KMRK_markStart(stacks);
|
||||
|
||||
if (opt_inv)
|
||||
{
|
||||
SeqDir = (char *)MyRealloc( (void *)SeqDir, (SimpleSeqLen+1)*sizeof(char),
|
||||
(2*SimpleSeqLen+2)*sizeof(char) , "KRMK_get_seeds: Cannot shrink memory"); /* reset mem to a sigle sequence */
|
||||
SeqDir[SimpleSeqLen]=0;
|
||||
}
|
||||
|
||||
if(opt_inv)
|
||||
invExpect = KMRK_upperInvertedCount(stacks,Lmin);
|
||||
|
||||
if(opt_dir)
|
||||
dirExpect = KMRK_upperCoupleCount(stacks);
|
||||
|
||||
|
||||
AllSeeds = NULL;
|
||||
|
||||
|
||||
MyFree(stacks->v, stacks->size * sizeof(int32_t));
|
||||
stacks->v=NULL;
|
||||
|
||||
|
||||
if (opt_dir)
|
||||
AllSeeds = KMRK_enumerateDirectCouple(AllSeeds,dirExpect,Lmin ,stacks,0);
|
||||
|
||||
if (opt_inv)
|
||||
AllSeeds = KMRK_enumerateInvertedCouple(AllSeeds,invExpect,Lmin,stacks);
|
||||
|
||||
KMRK_FreeVN(stacks);
|
||||
|
||||
*seq = SeqDir;
|
||||
|
||||
return AllSeeds;
|
||||
}
|
||||
|
||||
AllSeeds_type* KMRK_get_seeds_2seqs(char **seq1,
|
||||
char **seq2,
|
||||
int32_t size1,
|
||||
int32_t size2,
|
||||
int16_t Lmin,
|
||||
int8_t opt_dir,
|
||||
int8_t opt_inv,
|
||||
int8_t opt_verbose,
|
||||
masked_area_table_t *mask)
|
||||
{
|
||||
|
||||
AllSeeds_type* AllSeeds;
|
||||
char *sequence1 = *seq1;
|
||||
char *sequence2 = *seq2;
|
||||
vn_type * stacks;
|
||||
int32_t dirExpect=0;
|
||||
int32_t invExpect=0;
|
||||
KMRK_QUORUM_FUNC_PTR(quorum);
|
||||
int32_t sizef;
|
||||
|
||||
if(opt_inv != 1 &&
|
||||
opt_dir != 1)
|
||||
{
|
||||
fprintf(stderr,
|
||||
"get_seeds_2seqs: requiered at least "
|
||||
"opt_dir or opt_inv to be 1\n");
|
||||
exit(4);
|
||||
}
|
||||
|
||||
sizef = size1;
|
||||
|
||||
if(opt_inv)
|
||||
{
|
||||
sequence1 = makeDirInvSeq(sequence1,size1);
|
||||
sizef+=(1+size1);
|
||||
}
|
||||
|
||||
sequence1 = merge2seq(sequence1,sequence2,sizef,size2);
|
||||
|
||||
if (opt_inv)
|
||||
if (opt_dir)
|
||||
quorum = KMRK_IntDirInv12Quorum;
|
||||
else
|
||||
quorum = KMRK_IntInv12Quorum;
|
||||
else
|
||||
quorum = KMRK_Int12Quorum;
|
||||
|
||||
stacks = KMRK_RunTo(sequence1,
|
||||
Lmin,
|
||||
opt_inv,
|
||||
2,
|
||||
2,
|
||||
quorum,
|
||||
KMRK_HashOneSequence,
|
||||
mask);
|
||||
|
||||
KMRK_markStart(stacks);
|
||||
|
||||
sequence1= (char *)MyRealloc(
|
||||
(void *)sequence1,
|
||||
(size1+1)*sizeof(char),
|
||||
(sizef+size2+2)*sizeof(char),
|
||||
"KMRK_get_seeds_2seqs: shrink memory from 3N to 1N... ???");
|
||||
|
||||
sequence1[size1]=0;
|
||||
|
||||
if (opt_dir){
|
||||
if (opt_inv)
|
||||
dirExpect = KMRK_upperInterCount(stacks,0,2,Lmin);
|
||||
else
|
||||
dirExpect = KMRK_upperInterCount(stacks,0,1,Lmin);
|
||||
}
|
||||
if (opt_inv)
|
||||
invExpect = KMRK_upperInterCount(stacks,1,2,Lmin);
|
||||
|
||||
AllSeeds = NULL;
|
||||
MyFree(stacks->v, stacks->size*sizeof(int32_t));
|
||||
stacks->v=NULL;
|
||||
|
||||
if (opt_dir){
|
||||
if (opt_inv)
|
||||
AllSeeds = KMRK_enumerateInterCouple(AllSeeds,
|
||||
0,2,
|
||||
dirExpect,
|
||||
Lmin ,
|
||||
stacks);
|
||||
else
|
||||
AllSeeds = KMRK_enumerateInterCouple(AllSeeds,
|
||||
0,1,
|
||||
dirExpect,
|
||||
Lmin ,
|
||||
stacks);
|
||||
|
||||
}
|
||||
if (opt_inv)
|
||||
AllSeeds = KMRK_enumerateInterInvertedCouple(AllSeeds,
|
||||
2,
|
||||
invExpect,
|
||||
Lmin ,
|
||||
stacks);
|
||||
|
||||
|
||||
KMRK_FreeVN(stacks);
|
||||
|
||||
*seq1 = sequence1;
|
||||
|
||||
return AllSeeds;
|
||||
}
|
||||
|
||||
#define SIGN(x) (((x)<0) ? -1:(((x)>0) ? 1:0))
|
||||
|
||||
static int32_t compareSeedsByPos(Seed_type* s1,Seed_type* s2)
|
||||
{
|
||||
if (s1->pos1 == s2->pos1)
|
||||
return SIGN(s1->pos2 - s2->pos2);
|
||||
else
|
||||
return SIGN(s1->pos1 - s2->pos1);
|
||||
}
|
||||
|
||||
void KMRK_sortSeedsByPos(Seed_type* seeds, int32_t count)
|
||||
{
|
||||
qsort(seeds,
|
||||
count,
|
||||
sizeof(Seed_type),
|
||||
(int (*)(const void *, const void *))compareSeedsByPos);
|
||||
};
|
126
src/libKMRK/KMRK_Seeds.h
Normal file
126
src/libKMRK/KMRK_Seeds.h
Normal file
@ -0,0 +1,126 @@
|
||||
#ifndef KMRK_Seeds_h
|
||||
#define KMRK_Seeds_h
|
||||
|
||||
/********************************************
|
||||
********************************************
|
||||
**
|
||||
** Declaration of struct
|
||||
**
|
||||
********************************************
|
||||
********************************************/
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
#include "KMRK.h"
|
||||
|
||||
|
||||
|
||||
|
||||
#define KMRK_SORT_SEEDS_FUNC_PTR(name) int32_t (*name)(SmallSeed_type*, \
|
||||
SmallSeed_type*)
|
||||
|
||||
#define KMRK_DELTA_SEEDS_FUNC_PTR(name) int32_t (*name)(SmallSeed_type*)
|
||||
|
||||
/********************************************
|
||||
********************************************
|
||||
**
|
||||
** Declaration of public functions
|
||||
**
|
||||
********************************************
|
||||
********************************************/
|
||||
|
||||
|
||||
AllSeeds_type *KMRK_allocSeeds(AllSeeds_type *AllSeeds,
|
||||
int32_t size,
|
||||
int8_t opt_dir,
|
||||
int8_t opt_inv);
|
||||
|
||||
void KMRK_SetMultipleLenDirSeeds(SmallSeed_type* seeds,
|
||||
int32_t nseeds,
|
||||
int32_t wordSize,
|
||||
AllSeeds_type *PtrAllSeeds);
|
||||
|
||||
|
||||
void KMRK_freeSeeds(AllSeeds_type *AllSeeds);
|
||||
|
||||
void KMRK_compactSeeds(AllSeeds_type *AllSeeds);
|
||||
|
||||
void KMRK_pushSeed(AllSeeds_type *AllSeeds,
|
||||
int32_t pos1,
|
||||
int32_t pos2,
|
||||
int32_t length,
|
||||
int8_t dir);
|
||||
|
||||
AllSeeds_type* KMRK_enumerateDirectCouple(AllSeeds_type* Seeds,
|
||||
int32_t expected,
|
||||
int32_t wordSize,
|
||||
vn_type* stack,
|
||||
int32_t seq);
|
||||
|
||||
AllSeeds_type* KMRK_enumerateInvertedCouple(AllSeeds_type* Seeds,
|
||||
int32_t expected,
|
||||
int32_t wordSize,
|
||||
vn_type* stack);
|
||||
|
||||
AllSeeds_type* KMRK_enumerateInterCouple(AllSeeds_type* Seeds,
|
||||
int32_t seq1,
|
||||
int32_t seq2,
|
||||
int32_t expected,
|
||||
int32_t wordSize,
|
||||
vn_type* stack);
|
||||
|
||||
AllSeeds_type* KMRK_enumerateInterInvertedCouple(AllSeeds_type* Seeds,
|
||||
int32_t seq2,
|
||||
int32_t expected,
|
||||
int32_t wordSize,
|
||||
vn_type* stack);
|
||||
|
||||
|
||||
/**
|
||||
* Compare two seeds and return an integer less than, equal to or greater
|
||||
* than zero considering the relative order of the two seeds. This
|
||||
* version take into account only pos1 and pos2 of seeds without taking
|
||||
* account of the sequences or of the relative direction
|
||||
*
|
||||
* @param s1 pointer to seed one
|
||||
* @param s2 pointer to seed two
|
||||
*
|
||||
* @return a integer less than, equal to or greater than zero
|
||||
*/
|
||||
|
||||
int32_t KMRK_cmpSeedsPos(SmallSeed_type *s1, SmallSeed_type *s2);
|
||||
int32_t KMRK_cmpDeltaSeedsPos(SmallSeed_type *s1, SmallSeed_type *s2);
|
||||
int32_t KMRK_cmpDeltaInvSeedsPos(SmallSeed_type *s1, SmallSeed_type *s2);
|
||||
|
||||
void KMRK_sortSeeds(SmallSeed_type* seeds,
|
||||
int32_t nseeds,
|
||||
KMRK_SORT_SEEDS_FUNC_PTR(compare));
|
||||
|
||||
|
||||
AllSeeds_type* KMRK_get_seeds(char **seq,
|
||||
int32_t SimpleSeqLen,
|
||||
int16_t Lmin,
|
||||
int8_t opt_dir,
|
||||
int8_t opt_inv,
|
||||
int8_t opt_verbose,
|
||||
masked_area_table_t *mask);
|
||||
|
||||
AllSeeds_type* KMRK_get_seeds_2seqs(char **seq1,
|
||||
char **seq2,
|
||||
int32_t size1,
|
||||
int32_t size2,
|
||||
int16_t Lmin,
|
||||
int8_t opt_dir,
|
||||
int8_t opt_inv,
|
||||
int8_t opt_verbose,
|
||||
masked_area_table_t *mask);
|
||||
|
||||
/**
|
||||
* Order an array of seeds by pos1,pos2
|
||||
*
|
||||
* @param seeds pointer to an array of Seed_type object to sort
|
||||
* @param count count of element in the array
|
||||
*/
|
||||
void KMRK_sortSeedsByPos(Seed_type* seeds, int32_t count);
|
||||
|
||||
#endif /* KMRK_Seeds_h */
|
259
src/libKMRK/KMRK_mask.c
Normal file
259
src/libKMRK/KMRK_mask.c
Normal file
@ -0,0 +1,259 @@
|
||||
/*
|
||||
* KMRK_mask.c
|
||||
* repseek
|
||||
*
|
||||
* Created by Eric Coissac on 04/12/04.
|
||||
* Copyright 2004 __MyCompanyName__. All rights reserved.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "KMRK_mask.h"
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include "memory.h"
|
||||
|
||||
#define MASKED_AREA_TABLE_SIZE(seqcount) (sizeof(masked_area_table_t) + (sizeof(masked_area_list_t*) * ((seqcount)-1)))
|
||||
#define MASKED_AREA_LIST_SIZE(areacount) (sizeof(masked_area_list_t) + (sizeof(masked_area_t) * ((areacount)-1)))
|
||||
|
||||
#define AREA_COUNT_INIT (1000)
|
||||
|
||||
static masked_area_table_t *new_masked_area_table(int32_t seqcount, int32_t areacount);
|
||||
static masked_area_list_t *new_masked_area_list(int32_t areacount);
|
||||
static masked_area_list_t *realloc_masked_area_list(masked_area_list_t *list,int32_t areacount);
|
||||
static int32_t push_area(masked_area_table_t* table,int32_t sequence,int32_t begin,int32_t end);
|
||||
static void sort_area_table(masked_area_table_t* table);
|
||||
static int32_t compare_area(const masked_area_t* v1,const masked_area_t* v2);
|
||||
static int32_t search_area(const masked_area_t* v1,const masked_area_t* v2);
|
||||
|
||||
static masked_area_list_t *strip_area_list(masked_area_list_t* list);
|
||||
static void strip_area_table(masked_area_table_t* table);
|
||||
|
||||
|
||||
static masked_area_list_t *new_masked_area_list(int32_t areacount)
|
||||
{
|
||||
masked_area_list_t *list;
|
||||
|
||||
list = MyCalloc(1,MASKED_AREA_LIST_SIZE(areacount),"Not enougth memory for mask table");
|
||||
list->reserved=areacount;
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
static masked_area_list_t *realloc_masked_area_list(masked_area_list_t *list,int32_t areacount)
|
||||
{
|
||||
list = MyRealloc(list,
|
||||
MASKED_AREA_LIST_SIZE(areacount),
|
||||
MASKED_AREA_LIST_SIZE(list->reserved),
|
||||
"Not enougth memory for mask table");
|
||||
|
||||
list->reserved=areacount;
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
static masked_area_table_t *new_masked_area_table(int32_t seqcount, int32_t areacount)
|
||||
{
|
||||
masked_area_table_t *table;
|
||||
int32_t i;
|
||||
|
||||
table = MyCalloc(1,MASKED_AREA_TABLE_SIZE(seqcount),"Not enougth memory for mask table");
|
||||
table->seqcount=seqcount;
|
||||
|
||||
for (i=0;i<seqcount;i++)
|
||||
table->sequence[i]=new_masked_area_list(areacount);
|
||||
|
||||
return table;
|
||||
}
|
||||
|
||||
static int32_t push_area(masked_area_table_t* table,int32_t sequence,int32_t begin,int32_t end)
|
||||
{
|
||||
masked_area_list_t * list;
|
||||
|
||||
if (sequence >= table->seqcount)
|
||||
return -1;
|
||||
|
||||
list = table->sequence[sequence];
|
||||
|
||||
if (list->reserved == list->count)
|
||||
{
|
||||
list = realloc_masked_area_list(list,list->reserved*2);
|
||||
table->sequence[sequence]=list;
|
||||
}
|
||||
|
||||
list->area[list->count].begin=begin;
|
||||
list->area[list->count].end=end;
|
||||
|
||||
list->count++;
|
||||
table->total++;
|
||||
|
||||
return table->total;
|
||||
}
|
||||
|
||||
static int32_t compare_area(const masked_area_t* v1,const masked_area_t* v2)
|
||||
{
|
||||
return v1->begin - v2->begin;
|
||||
}
|
||||
|
||||
static void sort_area_table(masked_area_table_t* table)
|
||||
{
|
||||
int32_t i;
|
||||
|
||||
for (i=0; i<table->seqcount;i++)
|
||||
{
|
||||
qsort(table->sequence[i]->area,
|
||||
table->sequence[i]->count,
|
||||
sizeof(masked_area_t),
|
||||
(int (*)(const void *, const void *))compare_area);
|
||||
}
|
||||
}
|
||||
|
||||
static masked_area_list_t *strip_area_list(masked_area_list_t* list)
|
||||
{
|
||||
int32_t i;
|
||||
int32_t j;
|
||||
int32_t count;
|
||||
int32_t newcount;
|
||||
|
||||
count = list->count;
|
||||
newcount=count;
|
||||
|
||||
for (i=1;i<count;i++)
|
||||
{
|
||||
/* fprintf(stderr,"\n%d->%d %d->%d ==>",list->area[i-1].begin,list->area[i-1].end,list->area[i].begin,list->area[i].end); */
|
||||
if ((list->area[i].begin-1) <= list->area[i-1].end)
|
||||
{
|
||||
/* fprintf(stderr," joined"); */
|
||||
list->area[i].begin=list->area[i-1].begin;
|
||||
list->area[i-1].begin=-1;
|
||||
newcount--;
|
||||
}
|
||||
}
|
||||
list->count=newcount;
|
||||
|
||||
for (i=0,j=0;i<count;i++)
|
||||
{
|
||||
if (list->area[i].begin>=0)
|
||||
{
|
||||
if (i!=j)
|
||||
list->area[j]=list->area[i];
|
||||
j++;
|
||||
}
|
||||
}
|
||||
|
||||
return realloc_masked_area_list(list,newcount);
|
||||
|
||||
}
|
||||
|
||||
static void strip_area_table(masked_area_table_t* table)
|
||||
{
|
||||
int32_t seq;
|
||||
int32_t oldcount;
|
||||
masked_area_list_t* list;
|
||||
|
||||
sort_area_table(table);
|
||||
|
||||
for (seq=0; seq < table->seqcount;seq++)
|
||||
{
|
||||
list = table->sequence[seq];
|
||||
oldcount = list->count;
|
||||
table->sequence[seq]=strip_area_list(list);
|
||||
table->total-=oldcount - table->sequence[seq]->count;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static int32_t search_area(const masked_area_t* v1,const masked_area_t* v2)
|
||||
{
|
||||
int32_t pos;
|
||||
|
||||
pos = v1->begin;
|
||||
|
||||
if (pos < v2->begin)
|
||||
return -1;
|
||||
|
||||
if (pos > v2->end)
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
masked_area_table_t *KMRK_ReadMaskArea(char *areafile,int32_t seqcount,int32_t complement)
|
||||
{
|
||||
FILE* area;
|
||||
char buffer[1000];
|
||||
char *ok;
|
||||
int32_t begin;
|
||||
int32_t end;
|
||||
int32_t sequence;
|
||||
int32_t column;
|
||||
int32_t linecount;
|
||||
masked_area_table_t *table;
|
||||
|
||||
if (complement > 0)
|
||||
seqcount++;
|
||||
else
|
||||
complement=0;
|
||||
|
||||
area = fopen(areafile,"r");
|
||||
linecount=0;
|
||||
table=new_masked_area_table(seqcount,AREA_COUNT_INIT);
|
||||
|
||||
do {
|
||||
linecount++;
|
||||
ok = fgets(buffer,999,area);
|
||||
if (ok)
|
||||
{
|
||||
column = sscanf(buffer,"%d %d %d",&begin,&end,&sequence);
|
||||
if (column > 1 && begin <= end)
|
||||
{
|
||||
begin--;
|
||||
end--;
|
||||
if (column==3)
|
||||
sequence--;
|
||||
else
|
||||
sequence=0;
|
||||
|
||||
if (sequence && complement)
|
||||
sequence++;
|
||||
|
||||
push_area(table,sequence,begin,end);
|
||||
|
||||
if (!sequence && complement)
|
||||
push_area(table,1,complement -1 - end,complement -1 -begin);
|
||||
|
||||
}
|
||||
|
||||
if (column==1)
|
||||
fprintf(stderr,"WARNING in mask file reading line %d\n",linecount);
|
||||
|
||||
}
|
||||
} while (ok);
|
||||
|
||||
fprintf(stderr,"\nread %d masked areas from file\n",table->total);
|
||||
strip_area_table(table);
|
||||
fprintf(stderr,"strip to %d non overlaping areas\n",table->total);
|
||||
|
||||
return table;
|
||||
}
|
||||
|
||||
char KMRK_isMasked(masked_area_table_t *mask,int32_t seq, int32_t position)
|
||||
{
|
||||
masked_area_t input;
|
||||
int32_t result;
|
||||
masked_area_list_t *list;
|
||||
|
||||
if (! mask || (seq >= mask->seqcount))
|
||||
return 0;
|
||||
|
||||
list = mask->sequence[seq];
|
||||
input.begin=position;
|
||||
|
||||
result = bsearch(&input,
|
||||
list->area,
|
||||
list->count,
|
||||
sizeof(masked_area_t),
|
||||
(int (*)(const void *, const void *))search_area) != NULL;
|
||||
|
||||
return result;
|
||||
}
|
37
src/libKMRK/KMRK_mask.h
Normal file
37
src/libKMRK/KMRK_mask.h
Normal file
@ -0,0 +1,37 @@
|
||||
/*
|
||||
* KMRK_mask.h
|
||||
* repseek
|
||||
*
|
||||
* Created by Eric Coissac on 04/12/04.
|
||||
* Copyright 2004 __MyCompanyName__. All rights reserved.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#ifndef _KMRK_MASK_H_
|
||||
#define _KMRK_MASK_H_
|
||||
|
||||
typedef struct {
|
||||
int32_t begin;
|
||||
int32_t end;
|
||||
} masked_area_t;
|
||||
|
||||
typedef struct {
|
||||
int32_t reserved;
|
||||
int32_t count;
|
||||
|
||||
masked_area_t area[1];
|
||||
} masked_area_list_t;
|
||||
|
||||
typedef struct {
|
||||
int32_t seqcount;
|
||||
int32_t total;
|
||||
|
||||
masked_area_list_t *sequence[1];
|
||||
} masked_area_table_t;
|
||||
|
||||
masked_area_table_t *KMRK_ReadMaskArea(char *areafile,int32_t seqcount,int32_t complement);
|
||||
char KMRK_isMasked(masked_area_table_t *mask,int32_t seq, int32_t position);
|
||||
|
||||
#endif
|
123
src/libKMRK/KMRK_merge_seeds.c
Normal file
123
src/libKMRK/KMRK_merge_seeds.c
Normal file
@ -0,0 +1,123 @@
|
||||
/**
|
||||
* @file KMRK_merge_seeds.c
|
||||
* @author Eric Coissac <coissac@inrialpes.fr>
|
||||
* @date Wed Mar 3 11:15:57 2004
|
||||
*
|
||||
* @brief Merge function of overlapping seeds
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
#include "KMRK_merge_seeds.h"
|
||||
|
||||
void KMRK_MergeSeeds(AllSeeds_type *AllSeeds,
|
||||
int8_t opt_dir,
|
||||
int8_t opt_inv)
|
||||
{
|
||||
|
||||
int32_t i; /* the current seed */
|
||||
int32_t j; /* the checked seed */
|
||||
|
||||
int32_t N; /* the kept ones */
|
||||
Seed_type* seeds;
|
||||
|
||||
|
||||
if(opt_dir){
|
||||
seeds = AllSeeds->dirSeeds;
|
||||
for(i=0, N=0 ;i<AllSeeds->nDirSeeds; i++){
|
||||
|
||||
if(seeds[i].pos1==-1) /* any seed at -1 is removed */
|
||||
continue;
|
||||
|
||||
|
||||
j=i+1;
|
||||
|
||||
while( (seeds[j].pos1!=-1) &&
|
||||
(seeds[i].pos1!=-1) &&
|
||||
(j < AllSeeds->nDirSeeds) &&
|
||||
(seeds[j].pos1 < seeds[i].pos1+ seeds[i].length))
|
||||
{
|
||||
|
||||
if(
|
||||
((seeds[j].pos2 >= seeds[i].pos2) &&
|
||||
(seeds[j].pos2 < seeds[i].pos2 + seeds[i].length)) || /* if the seeds are overlapping */
|
||||
((seeds[j].pos2 + seeds[j].length >= seeds[i].pos2) &&
|
||||
(seeds[j].pos2 + seeds[j].length < seeds[i].pos2 + seeds[i].length)))
|
||||
{
|
||||
if(seeds[j].length <= seeds[i].length)
|
||||
seeds[j].pos1=seeds[j].pos2=seeds[j].length=-1; /* removed the smallest */
|
||||
else
|
||||
seeds[i].pos1=seeds[i].pos2=seeds[i].length=-1;
|
||||
}
|
||||
|
||||
j++;
|
||||
}
|
||||
|
||||
if(seeds[i].pos1 !=-1)
|
||||
{ /* if this seed is not out, store it */
|
||||
|
||||
seeds[N].pos1 = seeds[i].pos1;
|
||||
seeds[N].pos2 = seeds[i].pos2;
|
||||
seeds[N].length = seeds[i].length;
|
||||
N++;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
AllSeeds->nFilteredDirSeeds += AllSeeds->nDirSeeds-N;
|
||||
AllSeeds->nDirSeeds=N;
|
||||
|
||||
|
||||
}
|
||||
|
||||
if(opt_inv){
|
||||
seeds = AllSeeds->invSeeds;
|
||||
|
||||
for(i=0, N=0 ;i<AllSeeds->nInvSeeds; i++){
|
||||
|
||||
if(seeds[i].pos1==-1)
|
||||
continue;
|
||||
|
||||
|
||||
j=i+1;
|
||||
|
||||
while( (seeds[j].pos1!=-1 ) &&
|
||||
(seeds[i].pos1!=-1 ) &&
|
||||
(j < AllSeeds->nInvSeeds) &&
|
||||
(seeds[j].pos1 < seeds[i].pos1+seeds[i].length))
|
||||
{
|
||||
|
||||
if(
|
||||
((seeds[j].pos2 >= seeds[i].pos2) && /* if the seeds are overlapping */
|
||||
(seeds[j].pos2 < seeds[i].pos2+seeds[i].length)) ||
|
||||
((seeds[j].pos2 + seeds[j].length >= seeds[i].pos2) &&
|
||||
(seeds[j].pos2 + seeds[j].length < seeds[i].pos2+seeds[i].length)))
|
||||
{
|
||||
|
||||
if(seeds[j].length <= seeds[i].length)
|
||||
seeds[j].pos1=seeds[j].pos2=seeds[j].length=-1; /* removed the smallest */
|
||||
else
|
||||
seeds[i].pos1=seeds[i].pos2=seeds[i].length=-1;
|
||||
}
|
||||
|
||||
j++;
|
||||
}
|
||||
|
||||
if(seeds[i].pos1!=-1)
|
||||
{ /* if this seed is not out, store it */
|
||||
|
||||
seeds[N].pos1 = seeds[i].pos1;
|
||||
seeds[N].pos2 = seeds[i].pos2;
|
||||
seeds[N].length = seeds[i].length;
|
||||
N++;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
AllSeeds->nFilteredInvSeeds += AllSeeds->nInvSeeds-N;
|
||||
AllSeeds->nInvSeeds=N;
|
||||
}
|
||||
|
||||
KMRK_compactSeeds(AllSeeds);
|
||||
|
||||
}
|
11
src/libKMRK/KMRK_merge_seeds.h
Normal file
11
src/libKMRK/KMRK_merge_seeds.h
Normal file
@ -0,0 +1,11 @@
|
||||
#ifndef KMRK_merge_seeds_h
|
||||
#define KMRK_merge_seeds_h
|
||||
|
||||
#include "KMRK_Seeds.h"
|
||||
|
||||
void KMRK_MergeSeeds(AllSeeds_type *AllSeeds,
|
||||
int8_t opt_dir,
|
||||
int8_t opt_inv);
|
||||
|
||||
|
||||
#endif /* KMRK_MergeSeeds */
|
25
src/libKMRK/Makefile
Normal file
25
src/libKMRK/Makefile
Normal file
@ -0,0 +1,25 @@
|
||||
|
||||
SOURCES = KMRK.c \
|
||||
KMRK_mask.c \
|
||||
KMRK_merge_seeds.c \
|
||||
KMRK_Seeds.c
|
||||
|
||||
SRCS=$(SOURCES)
|
||||
|
||||
OBJECTS= $(patsubst %.c,%.o,$(SOURCES))
|
||||
|
||||
LIBFILE= libKMRK.a
|
||||
RANLIB= ranlib
|
||||
|
||||
|
||||
include ../global.mk
|
||||
|
||||
|
||||
all: $(LIBFILE)
|
||||
|
||||
clean:
|
||||
rm -rf $(OBJECTS) $(LIBFILE)
|
||||
|
||||
$(LIBFILE): $(OBJECTS)
|
||||
ar -cr $@ $?
|
||||
$(RANLIB) $@
|
224
src/libKMRK/memory.c
Normal file
224
src/libKMRK/memory.c
Normal file
@ -0,0 +1,224 @@
|
||||
/******
|
||||
file : memory.c
|
||||
function : All about memory of the KMR, Seeds and Repeats
|
||||
All MyMalloc() series is about follwoing how mauch memory has been used
|
||||
|
||||
created : 19 Sep 2003
|
||||
modif : Oct 2003, Feb 2004
|
||||
modif : Dec 2004 <EC> ; Corrected Memory declaration
|
||||
author : amikezor
|
||||
*****/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include "repseek_types.h"
|
||||
#include "memory.h"
|
||||
|
||||
|
||||
MemUsage Memory;
|
||||
|
||||
|
||||
/*
|
||||
Functions to count the memory usage all along
|
||||
dybamic allocation and free
|
||||
*/
|
||||
void PrintMem(char *Comment){
|
||||
|
||||
extern MemUsage Memory;
|
||||
|
||||
fprintf(stderr,"\n%s\nMemory Usage\n\t* Max is: %d bytes, %.2f Kb, %.2f Mb\n\t* Cur is: %d bytes, %.2f Kb, %.2f Mb\n",
|
||||
Comment,
|
||||
Memory.Max, (float)Memory.Max/1024, (float)Memory.Max/(1024*1024),
|
||||
Memory.Current, (float)Memory.Current/1024, (float)Memory.Current/(1024*1024));
|
||||
}
|
||||
void PrintMaxMem( void ){
|
||||
|
||||
extern MemUsage Memory;
|
||||
|
||||
if(Memory.Max < 1024)
|
||||
fprintf(stderr,"Max Memory Usage.. %d bytes\n", Memory.Max);
|
||||
else if(Memory.Max < 1024*1024)
|
||||
fprintf(stderr,"Max Memory Usage.. %.2f Kilobytes\n", (float)Memory.Max/1024);
|
||||
else if(Memory.Max < 1024*1024*1024)
|
||||
fprintf(stderr,"Max Memory Usage.. %.2f Megabytes\n", (float)Memory.Max/(1024*1024));
|
||||
else
|
||||
fprintf(stderr,"Max Memory Usage.. %.2f Gigabytes\n", (float)Memory.Max/(1024*1024*1024));
|
||||
}
|
||||
void Update_Mem(int32_t Value){
|
||||
|
||||
extern MemUsage Memory;
|
||||
|
||||
Memory.Current += Value;
|
||||
Memory.Max = (Memory.Current>Memory.Max)?Memory.Current:Memory.Max;
|
||||
}
|
||||
void Init_Mem(int32_t Value){
|
||||
|
||||
extern MemUsage Memory;
|
||||
|
||||
Memory.Current = Value;
|
||||
Memory.Max = Value;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Replace functions of dynamic allocation
|
||||
to allow the tracking of memory usage
|
||||
*/
|
||||
void *MyMalloc( int32_t size , char *Error ){
|
||||
|
||||
void *pointer;
|
||||
|
||||
pointer = malloc(size);
|
||||
if(!pointer)fprintf(stderr,"%s\n",Error),exit(3);
|
||||
|
||||
Update_Mem(size);
|
||||
|
||||
return pointer;
|
||||
}
|
||||
void *MyCalloc( int32_t number, int32_t TypeSize , char *Error ){
|
||||
|
||||
void *pointer;
|
||||
|
||||
pointer = calloc(number, TypeSize);
|
||||
if(!pointer)fprintf(stderr,"%s\n",Error),exit(3);
|
||||
|
||||
Update_Mem(number*TypeSize );
|
||||
|
||||
return pointer;
|
||||
}
|
||||
void MyFree( void *Pointer, int32_t size){
|
||||
free(Pointer);
|
||||
Pointer=NULL;
|
||||
Update_Mem(-size);
|
||||
}
|
||||
void *MyRealloc( void *Pointer, int32_t newsize, int32_t oldsize, char *Error){
|
||||
|
||||
Pointer = realloc(Pointer,newsize);
|
||||
if(!Pointer)fprintf(stderr,"%s\n",Error),exit(3);
|
||||
Update_Mem( newsize-oldsize );
|
||||
return Pointer;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Deal with Stacks structure for KMR
|
||||
|
||||
void MallocStack(Stacks *s, int32_t number, int32_t *histo, int32_t AllValues){
|
||||
|
||||
int32_t i;
|
||||
|
||||
s->nStacks = number;
|
||||
s->nValues = AllValues;
|
||||
|
||||
s->ppStacks = (int32_t **)MyMalloc( number * sizeof(int32_t *),
|
||||
"MallocStack: ppStacks malloc error, bye\n");
|
||||
s->lenStacks = (int32_t *)MyMalloc( number * sizeof(int32_t),
|
||||
"MallocStack: lenStacks malloc error, bye\n");
|
||||
s->ppStacks[0] = (int32_t *)MyMalloc( AllValues * sizeof(int32_t),
|
||||
"MallocStack: ppStacks[0] malloc error, bye\n");
|
||||
s->lenStacks[0]=0;
|
||||
|
||||
for(i=1;i < number; i++){
|
||||
s->lenStacks[i]=0;
|
||||
s->ppStacks[i] = s->ppStacks[i-1] + histo[i] ;
|
||||
}
|
||||
}
|
||||
|
||||
void FreeStack( Stacks *p){
|
||||
MyFree(p->ppStacks[0] , p->nValues*sizeof(int32_t) );
|
||||
MyFree(p->ppStacks , p->nStacks*sizeof(int32_t *) );
|
||||
MyFree(p->lenStacks , p->nStacks*sizeof(int32_t));
|
||||
}
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
Deal with the Seeds part
|
||||
|
||||
|
||||
void free_Seeds(Seeds AllSeeds)
|
||||
{
|
||||
|
||||
if( AllSeeds.nDirSeeds ){
|
||||
MyFree(AllSeeds.DirPos1, AllSeeds.nDirSeeds*sizeof(int32_t));
|
||||
MyFree(AllSeeds.DirPos2, AllSeeds.nDirSeeds*sizeof(int32_t));
|
||||
MyFree(AllSeeds.DirLen, AllSeeds.nDirSeeds*sizeof(int32_t));
|
||||
MyFree(AllSeeds.DirMeanR, AllSeeds.nDirSeeds*sizeof(float));
|
||||
}
|
||||
|
||||
if(AllSeeds.nInvSeeds ){
|
||||
MyFree(AllSeeds.InvPos1, AllSeeds.nInvSeeds*sizeof(int32_t));
|
||||
MyFree(AllSeeds.InvPos2, AllSeeds.nInvSeeds*sizeof(int32_t));
|
||||
MyFree(AllSeeds.InvLen, AllSeeds.nInvSeeds*sizeof(int32_t));
|
||||
MyFree(AllSeeds.InvMeanR, AllSeeds.nInvSeeds*sizeof(float));
|
||||
}
|
||||
|
||||
}
|
||||
*/
|
||||
/*
|
||||
Malloc if it is the first time otherwise readjust
|
||||
|
||||
void AllocSeeds(Seeds *AllSeeds, int32_t size, int32_t old_size, int8_t opt_dir, int8_t opt_inv){
|
||||
|
||||
if(opt_inv != 1 && opt_dir != 1)
|
||||
fprintf(stderr,"AllocSeeds: requiere at least one of opt_dir and opt_inv to be 1\n"),exit(4);
|
||||
|
||||
if(opt_dir == 1){
|
||||
if( AllSeeds->DirPos1 == NULL){
|
||||
AllSeeds->DirPos1 = (int32_t *)MyCalloc(size , sizeof(int32_t),"AllocSeeds: Alloc for DirPos1 failed, bye");
|
||||
AllSeeds->DirPos2 = (int32_t *)MyCalloc(size , sizeof(int32_t),"AllocSeeds: Alloc for DirPos2 failed, bye");
|
||||
}
|
||||
else{
|
||||
AllSeeds->DirPos1 = (int32_t *)MyRealloc(AllSeeds->DirPos1, size * sizeof(int32_t), old_size* sizeof(int32_t),
|
||||
"AllocSeeds: realloc for DirPos1 failed, bye");
|
||||
AllSeeds->DirPos2 = (int32_t *)MyRealloc(AllSeeds->DirPos2, size * sizeof(int32_t), old_size* sizeof(int32_t),
|
||||
"AllocSeeds: realloc for DirPos2 failed, bye");
|
||||
}
|
||||
}
|
||||
|
||||
if(opt_inv == 1){
|
||||
if( AllSeeds->InvPos1 == NULL){
|
||||
AllSeeds->InvPos1 = (int32_t *)MyCalloc(size , sizeof(int32_t), "AllocSeeds: Alloc for InvPos1 failed, bye");
|
||||
AllSeeds->InvPos2 = (int32_t *)MyCalloc(size , sizeof(int32_t), "AllocSeeds: Alloc for InvPos2 failed, bye");
|
||||
}
|
||||
else{
|
||||
AllSeeds->InvPos1 = (int32_t *)MyRealloc(AllSeeds->InvPos1, size * sizeof(int32_t), old_size* sizeof(int32_t),
|
||||
"AllocSeeds: realloc for InvPos1 failed, bye");
|
||||
AllSeeds->InvPos2 = (int32_t *)MyRealloc(AllSeeds->InvPos2, size * sizeof(int32_t), old_size* sizeof(int32_t),
|
||||
"AllocSeeds: realloc for InvPos2 failed, bye");
|
||||
}
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
/*
|
||||
Deal with the Repeats structure
|
||||
*/
|
||||
Repeats mem_Repeats(int32_t Ndir, int32_t Ninv){
|
||||
|
||||
Repeats AllRepeats; /* All Repeats structure */
|
||||
|
||||
AllRepeats.nDirRep = Ndir; /* set the number of repeats to the number of seeds */
|
||||
AllRepeats.nInvRep = Ninv;
|
||||
AllRepeats.nDirBadRep = 0; /* set the "bad" repet (included into another rep) as 0 */
|
||||
AllRepeats.nInvBadRep = 0;
|
||||
|
||||
if(AllRepeats.nDirRep)
|
||||
AllRepeats.DirRep = (Rep *)MyMalloc( (AllRepeats.nDirRep)*sizeof(Rep), "init_Repeats: repdir malloc error" );
|
||||
else
|
||||
AllRepeats.DirRep = NULL;
|
||||
|
||||
if(AllRepeats.nInvRep)
|
||||
AllRepeats.InvRep = (Rep *)MyMalloc( (AllRepeats.nInvRep)*sizeof(Rep), "init_Repeats: repinv malloc error" );
|
||||
else
|
||||
AllRepeats.InvRep = NULL;
|
||||
|
||||
return AllRepeats;
|
||||
}
|
||||
void free_Repeats(Repeats AllRep)
|
||||
{
|
||||
if(AllRep.nDirRep)
|
||||
MyFree(AllRep.DirRep, AllRep.nDirRep*sizeof(Rep));
|
||||
if(AllRep.nInvRep)
|
||||
MyFree(AllRep.InvRep, AllRep.nInvRep*sizeof(Rep));
|
||||
}
|
105
src/libKMRK/memory.h
Normal file
105
src/libKMRK/memory.h
Normal file
@ -0,0 +1,105 @@
|
||||
/**
|
||||
* @file memory.h
|
||||
* @author Achaz G
|
||||
* @date April 2004
|
||||
*
|
||||
* @brief header for memory alloc/dealloc
|
||||
* modif : Dec 2004 <EC> ; Corrected Memory declaration
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _MEMORY_H_
|
||||
#define _MEMORY_H_
|
||||
|
||||
#include "repseek_types.h"
|
||||
|
||||
typedef struct { /********** Memory Usage structure **************/
|
||||
|
||||
int32_t Max;
|
||||
int32_t Current;
|
||||
|
||||
} MemUsage;
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
/********** **********
|
||||
|
||||
Global Variable(s)
|
||||
|
||||
********** **********/
|
||||
|
||||
extern MemUsage Memory; /* Instance of the global variable for memory tracking */
|
||||
|
||||
/*
|
||||
Follow memory usage
|
||||
*/
|
||||
void PrintMem(char *Comment);
|
||||
void PrintMaxMem( void );
|
||||
void Update_Mem(int32_t Value);
|
||||
void Init_Mem(int32_t Value);
|
||||
/*
|
||||
All Alloc/Free to follow of memory usage
|
||||
*/
|
||||
void *MyMalloc( int32_t size , char *Error );
|
||||
void *MyCalloc( int32_t number, int32_t TypeSize , char *Error );
|
||||
void MyFree( void *Pointer, int32_t size);
|
||||
void *MyRealloc( void *Pointer, int32_t newsize, int32_t oldsize, char *Error);
|
||||
/*
|
||||
For Stacks
|
||||
|
||||
void MallocStack(Stacks *s, int32_t number, int32_t *histo, int32_t AllValues);
|
||||
void FreeStack( Stacks *p);
|
||||
|
||||
For Seeds
|
||||
|
||||
void free_Seeds(Seeds AllSeeds);
|
||||
void AllocSeeds(Seeds *AllSeeds, int32_t size, int32_t old_size, int8_t opt_dir, int8_t opt_inv);
|
||||
*/
|
||||
|
||||
/*
|
||||
For Repeats
|
||||
*/
|
||||
Repeats mem_Repeats(int32_t Ndir, int32_t Ninv);
|
||||
void free_Repeats(Repeats AllRep);
|
||||
|
||||
|
||||
|
||||
|
||||
/*
|
||||
Not used anymore, but just in case
|
||||
*/
|
||||
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#define KMRK_MALLOC(var,type,size,message) { \
|
||||
var = (type*) malloc(size); \
|
||||
if (!var) \
|
||||
{ \
|
||||
fprintf(stderr,"%s\n",message); \
|
||||
exit(4); \
|
||||
} \
|
||||
}
|
||||
|
||||
#define KMRK_CALLOC(var,type,length,message) { \
|
||||
var = (type*) calloc(length,sizeof(type)); \
|
||||
if (!var) \
|
||||
{ \
|
||||
fprintf(stderr,"%s\n",message); \
|
||||
exit(4); \
|
||||
} \
|
||||
}
|
||||
|
||||
#define KMRK_REALLOC(var,type,size,message) { \
|
||||
var = (type*) realloc(var,size); \
|
||||
if (!var) \
|
||||
{ \
|
||||
fprintf(stderr,"%s\n",message); \
|
||||
exit(4); \
|
||||
} \
|
||||
}
|
||||
|
||||
|
||||
#endif /* _MEMORY_H_*/
|
197
src/libKMRK/repseek_types.h
Normal file
197
src/libKMRK/repseek_types.h
Normal file
@ -0,0 +1,197 @@
|
||||
/**
|
||||
* @file repseek_types.h
|
||||
* @author Guillaume Achaz <gachaz@oeb.harvard.edu>
|
||||
* @date April 2004
|
||||
* @modif July 2004 turn scores into doubles
|
||||
* @brief definition of general types and macros for repseek
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
|
||||
#ifndef _REPSEEK_TYPES_
|
||||
#define _REPSEEK_TYPES_
|
||||
|
||||
/*
|
||||
Version of the program
|
||||
*/
|
||||
#define REPSEEK_VERSION "4.2"
|
||||
#define REPSEEK_DATE "Nov 2004"
|
||||
|
||||
|
||||
|
||||
/********** **********
|
||||
|
||||
General Macros
|
||||
|
||||
********** **********/
|
||||
|
||||
/*
|
||||
Macros to compare 2 or three values
|
||||
*/
|
||||
#define MAX2( A, B ) ( ((A)>(B))?(A):(B) )
|
||||
#define MAX3( A, B, C ) ( ((MAX2(A,B))>(C))?(MAX2(A,B)):(C) )
|
||||
#define MIN2( A, B ) ( ((A)<(B))?(A):(B) )
|
||||
|
||||
#define MAX( A, B ) MAX2( A, B )
|
||||
#define MIN( A, B ) MIN2( A, B )
|
||||
|
||||
/*
|
||||
Absolute values
|
||||
*/
|
||||
#define ABS(x) (( (x)>=0 )? (x) : -(x))
|
||||
|
||||
|
||||
|
||||
/********** **********
|
||||
|
||||
All types used in repseek
|
||||
|
||||
********** **********/
|
||||
|
||||
#include <stdio.h> /* The type FILE * is defined here */
|
||||
#include <stdint.h> /* all, the int??_t are defined in there */
|
||||
|
||||
|
||||
/**
|
||||
* Store informations about one STRICT repeat (seeds)
|
||||
*
|
||||
*/
|
||||
typedef struct { /* the complete seed structure */
|
||||
|
||||
int32_t pos1; /**< position of the first copy */
|
||||
int32_t pos2; /**< position of the second copy */
|
||||
|
||||
int32_t length; /**< length of the strict repeats */
|
||||
float rmean; /**< mean repeat leavel */
|
||||
|
||||
} Seed_type;
|
||||
|
||||
typedef struct { /* Just after a KMRK length X, only the 2 pos matter */
|
||||
|
||||
int32_t pos1; /**< postion of the first copy */
|
||||
int32_t pos2; /**< postion of the second copy */
|
||||
|
||||
} SmallSeed_type;
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Store informations about all strict repeat (seeds)
|
||||
*
|
||||
*/
|
||||
typedef struct {
|
||||
|
||||
int32_t cDirSeeds; /**< currently allocated space in dirSeeds array */
|
||||
int32_t nDirSeeds; /**< count of direct strict repeats */
|
||||
int32_t nFilteredDirSeeds; /**< ??? */
|
||||
|
||||
Seed_type* dirSeeds; /**< array of direct repeats */
|
||||
|
||||
int32_t cInvSeeds; /**< currently allocated space in invSeeds array */
|
||||
int32_t nInvSeeds; /**< count of inverted strict repeats */
|
||||
int32_t nFilteredInvSeeds; /**< ??? */
|
||||
|
||||
Seed_type* invSeeds; /**< array of inverted repeats */
|
||||
|
||||
} AllSeeds_type;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Store informations about one GENERIC repeat
|
||||
*
|
||||
*/
|
||||
typedef struct{
|
||||
|
||||
char type[20]; /* its name; i.e. Tandem, Palindrome, etc... */
|
||||
|
||||
int32_t pos1, pos2, /* both copies postions */
|
||||
len1, len2, /* both copies length */
|
||||
seed_pos1,seed_pos2, /* pos1 and pos2 of the originate seed */
|
||||
seed_len, /* len of the seed */
|
||||
|
||||
match, align_len; /* number of match and length of alignment */
|
||||
|
||||
double score; /* the alignment score */
|
||||
|
||||
float seed_meanR; /* the seed meanR */
|
||||
|
||||
float meanR; /* The mean R-level of the repeat */
|
||||
int32_t mainR; /* its Mode R */
|
||||
float fraction_mainR; /* the fraction of length containing the Mode R */
|
||||
|
||||
|
||||
} Rep;
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Store informations about All GENERIC repeats
|
||||
*
|
||||
*/
|
||||
typedef struct {
|
||||
|
||||
int32_t nDirRep; /* Total Number of Direct Repats in Mem */
|
||||
int32_t nDirBadRep; /* Direct repeats set to -1 -- filtered out and co. */
|
||||
Rep *DirRep; /* The array of Dir Rep */
|
||||
|
||||
int32_t nInvRep; /* Total Number of Inverted Repats in Mem */
|
||||
int32_t nInvBadRep; /* Inverted Repeats set to -1 -- filtered out and co. */
|
||||
Rep *InvRep; /* The array of Inverted Rep */
|
||||
|
||||
} Repeats;
|
||||
|
||||
|
||||
#define MATRIX_SIZE 26
|
||||
|
||||
typedef struct { /******* The scoring Matrix ************/
|
||||
|
||||
double matrix[MATRIX_SIZE][MATRIX_SIZE]; /* the matrix of match/missmatch */
|
||||
double gap_open; /* value of gap-open */
|
||||
double gap_ext; /* value of gap_ext */
|
||||
double expect;
|
||||
|
||||
} SCORING;
|
||||
|
||||
|
||||
|
||||
typedef struct { /******* The Results of Alignement by Dynamik programming ************/
|
||||
|
||||
|
||||
double *scores; /* the score strings (+/- 'matrix') */
|
||||
double *pscore; /* pointer to the current score */
|
||||
char *traces; /* the path matrix - could take values 'l'eft, 'd'iagonal, or 'a'bove or 'u'nknown */
|
||||
|
||||
double *F; /* *Above -- needed for memorizing deletion in seq2 */
|
||||
|
||||
double *pBestScore; /* pointer to it */
|
||||
int32_t BestScore_row; /* its row and col */
|
||||
int32_t BestScore_col;
|
||||
|
||||
char *traceback; /* all you need for bactracking */
|
||||
char *traceback_f; /* memory for forward traceback and then check other seeds */
|
||||
char *traceback_b; /* memory needed for backward traceback - to avoid erasing the forward one */
|
||||
|
||||
int32_t alignment_len; /* guess ?? */
|
||||
int32_t matches; /* number of match (score>0 in scoring matrix) */
|
||||
|
||||
int32_t nSegment; /* number of segment */
|
||||
int32_t *Segment_begin; /* begin and end of each segment */
|
||||
int32_t *Segment_end;
|
||||
|
||||
int32_t max_scores; /* size of the matrices only for memory purposes */
|
||||
int32_t max_col;
|
||||
int32_t max_row;
|
||||
int32_t max_alignlen;
|
||||
|
||||
} RESULTS;
|
||||
|
||||
|
||||
|
||||
#endif /* _REPSEEK_TYPES_ */
|
||||
|
25
src/libKMRK/sequence.h
Normal file
25
src/libKMRK/sequence.h
Normal file
@ -0,0 +1,25 @@
|
||||
/**
|
||||
* @file KMRK_sequence.h
|
||||
* @author Eric Coissac <coissac@inrialpes.fr>
|
||||
* @date Tue Feb 24 22:22:57 2004
|
||||
*
|
||||
* @brief Header file for sequence utilities
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef KMRK_sequence_h
|
||||
#define KMRK_sequence_h
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
int8_t CheckSeq(char *seq, char *alpha);
|
||||
|
||||
void nonACGTXtoN(char *seq);
|
||||
|
||||
void UpperSequence(char *seq);
|
||||
|
||||
void invseq(char *seqsrc, char *seqdest);
|
||||
|
||||
|
||||
#endif /* KMRK_sequence_h */
|
14
src/libapat/CODES/dft_code.h
Normal file
14
src/libapat/CODES/dft_code.h
Normal file
@ -0,0 +1,14 @@
|
||||
/* ----------------------------------------------- */
|
||||
/* dft_pat_seq_code.h */
|
||||
/* default alphabet encoding for alpha */
|
||||
/* ----------------------------------------------- */
|
||||
|
||||
0x00000001 /* A */, 0x00000002 /* B */, 0x00000004 /* C */,
|
||||
0x00000008 /* D */, 0x00000010 /* E */, 0x00000020 /* F */,
|
||||
0x00000040 /* G */, 0x00000080 /* H */, 0x00000100 /* I */,
|
||||
0x00000200 /* J */, 0x00000400 /* K */, 0x00000800 /* L */,
|
||||
0x00001000 /* M */, 0x00002000 /* N */, 0x00004000 /* O */,
|
||||
0x00008000 /* P */, 0x00010000 /* Q */, 0x00020000 /* R */,
|
||||
0x00040000 /* S */, 0x00080000 /* T */, 0x00100000 /* U */,
|
||||
0x00200000 /* V */, 0x00400000 /* W */, 0x00800000 /* X */,
|
||||
0x01000000 /* Y */, 0x02000000 /* Z */
|
71
src/libapat/CODES/dna_code.h
Normal file
71
src/libapat/CODES/dna_code.h
Normal file
@ -0,0 +1,71 @@
|
||||
/* ----------------------------------------------- */
|
||||
/* dna_code.h */
|
||||
/* alphabet encoding for dna/rna */
|
||||
/* ----------------------------------------- */
|
||||
/* IUPAC encoding */
|
||||
/* ----------------------------------------- */
|
||||
/* G/A/T/C */
|
||||
/* U=T */
|
||||
/* R=AG */
|
||||
/* Y=CT */
|
||||
/* M=AC */
|
||||
/* K=GT */
|
||||
/* S=CG */
|
||||
/* W=AT */
|
||||
/* H=ACT */
|
||||
/* B=CGT */
|
||||
/* V=ACG */
|
||||
/* D=AGT */
|
||||
/* N=ACGT */
|
||||
/* X=ACGT */
|
||||
/* EFIJLOPQZ not recognized */
|
||||
/* ----------------------------------------- */
|
||||
/* dual encoding */
|
||||
/* ----------------------------------------- */
|
||||
/* A=ADHMNRVW */
|
||||
/* B=BCDGHKMNRSTUVWY */
|
||||
/* C=BCHMNSVY */
|
||||
/* D=ABDGHKMNRSTUVWY */
|
||||
/* G=BDGKNRSV */
|
||||
/* H=ABCDHKMNRSTUVWY */
|
||||
/* K=BDGHKNRSTUVWY */
|
||||
/* M=ABCDHMNRSVWY */
|
||||
/* N=ABCDGHKMNRSTUVWY */
|
||||
/* R=ABDGHKMNRSVW */
|
||||
/* S=BCDGHKMNRSVY */
|
||||
/* T=BDHKNTUWY */
|
||||
/* U=BDHKNTUWY */
|
||||
/* V=ABCDGHKMNRSVWY */
|
||||
/* W=ABDHKMNRTUVWY */
|
||||
/* X=ABCDGHKMNRSTUVWY */
|
||||
/* Y=BCDHKMNSTUVWY */
|
||||
/* EFIJLOPQZ not recognized */
|
||||
/* ----------------------------------------------- */
|
||||
|
||||
#ifndef USE_DUAL
|
||||
|
||||
/* IUPAC */
|
||||
|
||||
0x00000001 /* A */, 0x00080044 /* B */, 0x00000004 /* C */,
|
||||
0x00080041 /* D */, 0x00000000 /* E */, 0x00000000 /* F */,
|
||||
0x00000040 /* G */, 0x00080005 /* H */, 0x00000000 /* I */,
|
||||
0x00000000 /* J */, 0x00080040 /* K */, 0x00000000 /* L */,
|
||||
0x00000005 /* M */, 0x00080045 /* N */, 0x00000000 /* O */,
|
||||
0x00000000 /* P */, 0x00000000 /* Q */, 0x00000041 /* R */,
|
||||
0x00000044 /* S */, 0x00080000 /* T */, 0x00080000 /* U */,
|
||||
0x00000045 /* V */, 0x00080001 /* W */, 0x00080045 /* X */,
|
||||
0x00080004 /* Y */, 0x00000000 /* Z */
|
||||
|
||||
#else
|
||||
/* DUAL */
|
||||
|
||||
0x00623089 /* A */, 0x017e34ce /* B */, 0x01243086 /* C */,
|
||||
0x017e34cb /* D */, 0x00000000 /* E */, 0x00000000 /* F */,
|
||||
0x0026244a /* G */, 0x017e348f /* H */, 0x00000000 /* I */,
|
||||
0x00000000 /* J */, 0x017e24ca /* K */, 0x00000000 /* L */,
|
||||
0x0166308f /* M */, 0x017e34cf /* N */, 0x00000000 /* O */,
|
||||
0x00000000 /* P */, 0x00000000 /* Q */, 0x006634cb /* R */,
|
||||
0x012634ce /* S */, 0x0158248a /* T */, 0x0158248a /* U */,
|
||||
0x016634cf /* V */, 0x017a348b /* W */, 0x017e34cf /* X */,
|
||||
0x017c348e /* Y */, 0x00000000 /* Z */
|
||||
#endif
|
51
src/libapat/CODES/prot_code.h
Normal file
51
src/libapat/CODES/prot_code.h
Normal file
@ -0,0 +1,51 @@
|
||||
/* ----------------------------------------------- */
|
||||
/* prot_code.h */
|
||||
/* alphabet encoding for proteins */
|
||||
/* ----------------------------------------- */
|
||||
/* IUPAC encoding */
|
||||
/* ----------------------------------------- */
|
||||
/* B=DN */
|
||||
/* Z=EQ */
|
||||
/* X=any - {X} */
|
||||
/* JOU not recognized */
|
||||
/* ----------------------------------------- */
|
||||
/* dual encoding */
|
||||
/* ----------------------------------------- */
|
||||
/* B=BDN */
|
||||
/* D=BD */
|
||||
/* E=EZ */
|
||||
/* N=BN */
|
||||
/* Q=QZ */
|
||||
/* X=any - {X} */
|
||||
/* Z=EQZ */
|
||||
/* JOU not recognized */
|
||||
/* ----------------------------------------------- */
|
||||
|
||||
#ifndef USE_DUAL
|
||||
|
||||
/* IUPAC */
|
||||
|
||||
0x00000001 /* A */, 0x00002008 /* B */, 0x00000004 /* C */,
|
||||
0x00000008 /* D */, 0x00000010 /* E */, 0x00000020 /* F */,
|
||||
0x00000040 /* G */, 0x00000080 /* H */, 0x00000100 /* I */,
|
||||
0x00000000 /* J */, 0x00000400 /* K */, 0x00000800 /* L */,
|
||||
0x00001000 /* M */, 0x00002000 /* N */, 0x00000000 /* O */,
|
||||
0x00008000 /* P */, 0x00010000 /* Q */, 0x00020000 /* R */,
|
||||
0x00040000 /* S */, 0x00080000 /* T */, 0x00000000 /* U */,
|
||||
0x00200000 /* V */, 0x00400000 /* W */, 0x037fffff /* X */,
|
||||
0x01000000 /* Y */, 0x00010010 /* Z */
|
||||
|
||||
#else
|
||||
/* DUAL */
|
||||
|
||||
0x00000001 /* A */, 0x0000200a /* B */, 0x00000004 /* C */,
|
||||
0x0000000a /* D */, 0x02000010 /* E */, 0x00000020 /* F */,
|
||||
0x00000040 /* G */, 0x00000080 /* H */, 0x00000100 /* I */,
|
||||
0x00000000 /* J */, 0x00000400 /* K */, 0x00000800 /* L */,
|
||||
0x00001000 /* M */, 0x00002002 /* N */, 0x00000000 /* O */,
|
||||
0x00008000 /* P */, 0x02010000 /* Q */, 0x00020000 /* R */,
|
||||
0x00040000 /* S */, 0x00080000 /* T */, 0x00000000 /* U */,
|
||||
0x00200000 /* V */, 0x00400000 /* W */, 0x037fffff /* X */,
|
||||
0x01000000 /* Y */, 0x02010010 /* Z */
|
||||
|
||||
#endif
|
97
src/libapat/Gmach.h
Normal file
97
src/libapat/Gmach.h
Normal file
@ -0,0 +1,97 @@
|
||||
/* ---------------------------------------------------------------- */
|
||||
/* Copyright (c) Atelier de BioInformatique */
|
||||
/* @file: Gmach.h */
|
||||
/* @desc: machine dependant setup */
|
||||
/* @+ *should* be included in all ABI softs */
|
||||
/* */
|
||||
/* @history: */
|
||||
/* @+ <Gloup> : Jul 95 : MWC first draft */
|
||||
/* @+ <Gloup> : Jan 96 : adapted to Pwg */
|
||||
/* @+ <Gloup> : Nov 00 : adapted to Mac_OS_X */
|
||||
/* ---------------------------------------------------------------- */
|
||||
|
||||
#ifndef _H_Gmach
|
||||
|
||||
/* OS names */
|
||||
|
||||
#define _H_Gmach
|
||||
|
||||
/* Macintosh Classic */
|
||||
/* Think C environment */
|
||||
#ifdef THINK_C
|
||||
#define MACINTOSH
|
||||
#define MAC_OS_C
|
||||
#endif
|
||||
|
||||
|
||||
/* Macintosh Classic */
|
||||
/* Code-Warrior */
|
||||
#ifdef __MWERKS__
|
||||
#define MACINTOSH
|
||||
#define MAC_OS_C
|
||||
#endif
|
||||
|
||||
/* Macintosh OS-X */
|
||||
#ifdef MAC_OS_X
|
||||
#define MACINTOSH
|
||||
#define UNIX
|
||||
#define UNIX_BSD
|
||||
#endif
|
||||
|
||||
/* LINUX */
|
||||
#ifdef LINUX
|
||||
#define UNIX
|
||||
#define UNIX_BSD
|
||||
#endif
|
||||
|
||||
/* other Unix Boxes */
|
||||
/* SunOS / Solaris */
|
||||
#ifdef SUN
|
||||
#define UNIX
|
||||
#ifdef SOLARIS
|
||||
#define UNIX_S7
|
||||
#else
|
||||
#define UNIX_BSD
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* SGI Irix */
|
||||
#ifdef SGI
|
||||
#define UNIX
|
||||
#define UNIX_S7
|
||||
#endif
|
||||
|
||||
/* ansi setup */
|
||||
/* for unix machines see makefile */
|
||||
|
||||
#ifndef PROTO
|
||||
#define PROTO 1
|
||||
#endif
|
||||
|
||||
#ifndef ANSI_PROTO
|
||||
#define ANSI_PROTO PROTO
|
||||
#endif
|
||||
|
||||
#ifndef ANSI_STR
|
||||
#define ANSI_STR 1
|
||||
#endif
|
||||
|
||||
/* unistd.h header file */
|
||||
|
||||
#ifdef UNIX
|
||||
#define HAS_UNISTD_H <unistd.h>
|
||||
#endif
|
||||
|
||||
/* getopt.h header file */
|
||||
|
||||
#ifdef MAC_OS_C
|
||||
#define HAS_GETOPT_H "getopt.h"
|
||||
#endif
|
||||
|
||||
#ifdef SGI
|
||||
#define HAS_GETOPT_H <getopt.h>
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
#endif
|
104
src/libapat/Gtypes.h
Normal file
104
src/libapat/Gtypes.h
Normal file
@ -0,0 +1,104 @@
|
||||
/* ---------------------------------------------------------------- */
|
||||
/* Copyright (c) Atelier de BioInformatique */
|
||||
/* @file: Gtypes.h */
|
||||
/* @desc: general & machine dependant types */
|
||||
/* @+ *should* be included in all ABI softs */
|
||||
/* */
|
||||
/* @history: */
|
||||
/* @+ <Gloup> : Jan 91 : MWC first draft */
|
||||
/* @+ <Gloup> : Jul 95 : Gmach addition */
|
||||
/* ---------------------------------------------------------------- */
|
||||
|
||||
#define _H_Gtypes
|
||||
|
||||
#ifndef _H_Gmach
|
||||
#include "Gmach.h"
|
||||
#endif
|
||||
|
||||
#ifndef NULL
|
||||
#include <stdio.h> /* is the official NULL here ? */
|
||||
#endif
|
||||
|
||||
/* ==================================================== */
|
||||
/* constantes */
|
||||
/* ==================================================== */
|
||||
|
||||
#ifndef PROTO
|
||||
#define PROTO 1 /* prototypes flag */
|
||||
#endif
|
||||
|
||||
#ifdef MAC_OS_C
|
||||
#define Vrai true /* TC boolean values */
|
||||
#define Faux false /* */
|
||||
#else
|
||||
#define Vrai 0x1 /* bool values = TRUE */
|
||||
#define Faux 0x0 /* = FALSE */
|
||||
#endif
|
||||
|
||||
#define Nil NULL /* nil pointer */
|
||||
|
||||
#define kBigInt16 0x7fff /* plus grand 16 bits signe */
|
||||
#define kBigInt32 0x7fffffff /* plus grand 32 bits signe */
|
||||
#define kBigUInt16 0xffff /* plus grand 16 bits ~signe */
|
||||
#define kBigUInt32 0xffffffff /* plus grand 32 bits ~signe */
|
||||
|
||||
#ifdef MAC_OS_C
|
||||
/* ==================================================== */
|
||||
/* Types (for Macintosh ThinK C || MWerks) */
|
||||
/* ==================================================== */
|
||||
|
||||
/* --- specific sizes --------- */
|
||||
typedef long Int32; /* Int32 = 32 bits signe */
|
||||
typedef unsigned long UInt32; /* UInt32 = 32 bits ~signe */
|
||||
typedef short Int16; /* Int16 = 16 bits signe */
|
||||
typedef unsigned short UInt16; /* UInt32 = 16 bits ~signe */
|
||||
typedef char Int8; /* Int8 = 8 bits signe */
|
||||
typedef unsigned char UInt8; /* UInt8 = 8 bits ~signe */
|
||||
|
||||
/* --- default types ---------- */
|
||||
|
||||
typedef Boolean Bool; /* booleen */
|
||||
|
||||
typedef long Int; /* 'natural' int (>= 32 bits) */
|
||||
|
||||
typedef void *Ptr; /* pointeur */
|
||||
|
||||
#elif ((defined SUN) || (defined SGI) || (defined UNIX))
|
||||
/* ==================================================== */
|
||||
/* Types (for Sun & Iris - 32 bits machines) */
|
||||
/* ==================================================== */
|
||||
|
||||
/* --- specific sizes --------- */
|
||||
typedef int Int32; /* Int32 = 32 bits signe */
|
||||
typedef unsigned int UInt32; /* UInt32 = 32 bits ~signe */
|
||||
typedef short Int16; /* Int16 = 16 bits signe */
|
||||
typedef unsigned short UInt16; /* UInt32 = 16 bits ~signe */
|
||||
typedef char Int8; /* Int8 = 8 bits signe */
|
||||
typedef unsigned char UInt8; /* UInt8 = 8 bits ~signe */
|
||||
|
||||
/* --- default types ---------- */
|
||||
|
||||
typedef int Bool; /* booleen (int for ANSI) */
|
||||
|
||||
typedef int Int; /* 'natural' int (>= 32 bits) */
|
||||
|
||||
typedef void *Ptr; /* pointeur */
|
||||
|
||||
#else
|
||||
/* ==================================================== */
|
||||
/* Types (for undefined machines) */
|
||||
/* ==================================================== */
|
||||
|
||||
#error undefined MACHINE <please edit Gmach.h>
|
||||
|
||||
#endif
|
||||
|
||||
/* ==================================================== */
|
||||
/* special macro for prototypes */
|
||||
/* ==================================================== */
|
||||
|
||||
#if PROTO
|
||||
#define P(s) s
|
||||
#else
|
||||
#define P(s) ()
|
||||
#endif
|
24
src/libapat/Makefile
Normal file
24
src/libapat/Makefile
Normal file
@ -0,0 +1,24 @@
|
||||
|
||||
SOURCES = apat_parse.c \
|
||||
apat_search.c \
|
||||
libstki.c
|
||||
|
||||
SRCS=$(SOURCES)
|
||||
|
||||
|
||||
OBJECTS= $(patsubst %.c,%.o,$(SOURCES))
|
||||
|
||||
LIBFILE= libapat.a
|
||||
RANLIB=ranlib
|
||||
|
||||
|
||||
include ../global.mk
|
||||
|
||||
all: $(LIBFILE)
|
||||
|
||||
clean:
|
||||
rm -rf $(OBJECTS) $(LIBFILE)
|
||||
|
||||
$(LIBFILE): $(OBJECTS)
|
||||
ar -cr $@ $?
|
||||
$(RANLIB) $@
|
173
src/libapat/apat.h
Normal file
173
src/libapat/apat.h
Normal file
@ -0,0 +1,173 @@
|
||||
/* ==================================================== */
|
||||
/* Copyright (c) Atelier de BioInformatique */
|
||||
/* Dec. 94 */
|
||||
/* File: apat.h */
|
||||
/* Purpose: pattern scan */
|
||||
/* History: */
|
||||
/* 28/12/94 : <Gloup> ascan first version */
|
||||
/* 14/05/99 : <Gloup> last revision */
|
||||
/* ==================================================== */
|
||||
|
||||
#ifndef _H_Gtypes
|
||||
#include "Gtypes.h"
|
||||
#endif
|
||||
|
||||
#ifndef _H_libstki
|
||||
#include "libstki.h"
|
||||
#endif
|
||||
|
||||
#define H_apat
|
||||
|
||||
/* ----------------------------------------------- */
|
||||
/* constantes */
|
||||
/* ----------------------------------------------- */
|
||||
|
||||
#ifndef BUFSIZ
|
||||
#define BUFSIZ 1024 /* io buffer size */
|
||||
#endif
|
||||
|
||||
#define MAX_NAME_LEN BUFSIZ /* max length of sequence name */
|
||||
|
||||
#define ALPHA_LEN 26 /* 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 /* <unused> 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 */
|
||||
|
||||
/* special chars in pattern */
|
||||
#define PATCHARS "[]!#"
|
||||
|
||||
/* 26 letter alphabet */
|
||||
/* in alphabetical order */
|
||||
|
||||
#define ORD_ALPHA "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
||||
|
||||
/* protein alphabet */
|
||||
|
||||
#define PROT_ALPHA "ACDEFGHIKLMNPQRSTVWY"
|
||||
|
||||
/* dna/rna alphabet */
|
||||
|
||||
#define DNA_ALPHA "ABCDGHKMNRSTUVWXY"
|
||||
|
||||
|
||||
/* ----------------------------------------------- */
|
||||
/* data structures */
|
||||
/* ----------------------------------------------- */
|
||||
|
||||
/* -------------------- */
|
||||
typedef enum { /* data encoding */
|
||||
/* -------------------- */
|
||||
alpha = 0, /* [A-Z] */
|
||||
dna, /* IUPAC DNA */
|
||||
protein /* IUPAC proteins */
|
||||
} CodType;
|
||||
|
||||
/* -------------------- */
|
||||
typedef struct { /* sequence */
|
||||
/* -------------------- */
|
||||
char *name; /* sequence name */
|
||||
Int32 seqlen; /* sequence length */
|
||||
Int32 seqsiz; /* sequence buffer size */
|
||||
Int32 datsiz; /* data buffer size */
|
||||
Int32 circular;
|
||||
UInt8 *data; /* data buffer */
|
||||
char *cseq; /* sequence buffer */
|
||||
StackiPtr hitpos[MAX_PATTERN]; /* stack of hit pos. */
|
||||
StackiPtr hiterr[MAX_PATTERN]; /* stack of errors */
|
||||
} Seq, *SeqPtr;
|
||||
|
||||
/* -------------------- */
|
||||
typedef struct { /* pattern */
|
||||
/* -------------------- */
|
||||
int patlen; /* pattern length */
|
||||
int maxerr; /* max # of errors */
|
||||
char *cpat; /* pattern string */
|
||||
Int32 *patcode; /* encoded pattern */
|
||||
UInt32 *smat; /* S matrix */
|
||||
UInt32 omask; /* oblig. bits mask */
|
||||
Bool hasIndel; /* are indels allowed */
|
||||
Bool ok; /* is pattern ok */
|
||||
} Pattern, *PatternPtr;
|
||||
|
||||
/* ----------------------------------------------- */
|
||||
/* 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_seq.c */
|
||||
|
||||
SeqPtr FreeSequence (SeqPtr pseq);
|
||||
SeqPtr NewSequence (void);
|
||||
int ReadNextSequence (SeqPtr pseq);
|
||||
int WriteSequence (FILE *filou , SeqPtr pseq);
|
||||
|
||||
/* apat_parse.c */
|
||||
|
||||
Int32 *GetCode (CodType ctype);
|
||||
int CheckPattern (Pattern *ppat);
|
||||
int EncodePattern (Pattern *ppat, CodType ctype);
|
||||
int ReadPattern (Pattern *ppat);
|
||||
void PrintDebugPattern (Pattern *ppat);
|
||||
|
||||
/* apat_search.c */
|
||||
|
||||
int CreateS (Pattern *ppat, Int32 lalpha);
|
||||
Int32 ManberNoErr (Seq *pseq , Pattern *ppat, int patnum,int begin,int length);
|
||||
Int32 ManberSub (Seq *pseq , Pattern *ppat, int patnum,int begin,int length);
|
||||
Int32 ManberIndel (Seq *pseq , Pattern *ppat, int patnum,int begin,int length);
|
||||
Int32 ManberAll (Seq *pseq , Pattern *ppat, int patnum,int begin,int length);
|
||||
Int32 NwsPatAlign (Seq *pseq , Pattern *ppat, Int32 nerr ,
|
||||
Int32 *reslen , Int32 *reserr);
|
||||
|
||||
/* apat_sys.c */
|
||||
|
||||
float UserCpuTime (int reset);
|
||||
float SysCpuTime (int reset);
|
||||
char *StrCpuTime (int reset);
|
||||
void Erreur (char *msg , int stat);
|
||||
int AccessFile (char *path, char *mode);
|
||||
|
369
src/libapat/apat_parse.c
Normal file
369
src/libapat/apat_parse.c
Normal file
@ -0,0 +1,369 @@
|
||||
/* ==================================================== */
|
||||
/* Copyright (c) Atelier de BioInformatique */
|
||||
/* Mar. 92 */
|
||||
/* File: apat_parse.c */
|
||||
/* Purpose: Codage du pattern */
|
||||
/* History: */
|
||||
/* 00/07/94 : <Gloup> first version (stanford) */
|
||||
/* 00/11/94 : <Gloup> revised for DNA/PROTEIN */
|
||||
/* 30/12/94 : <Gloup> modified EncodePattern */
|
||||
/* for manber search */
|
||||
/* 14/05/99 : <Gloup> indels added */
|
||||
/* ==================================================== */
|
||||
|
||||
#include <ctype.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "Gtypes.h"
|
||||
#include "apat.h"
|
||||
/* -------------------- */
|
||||
/* default char */
|
||||
/* encodings */
|
||||
/* -------------------- */
|
||||
|
||||
static Int32 sDftCode[] = {
|
||||
|
||||
#include "CODES/dft_code.h"
|
||||
|
||||
};
|
||||
/* -------------------- */
|
||||
/* char encodings */
|
||||
/* IUPAC */
|
||||
/* -------------------- */
|
||||
|
||||
/* IUPAC Proteins */
|
||||
static Int32 sProtCode[] = {
|
||||
|
||||
#include "CODES/prot_code.h"
|
||||
|
||||
};
|
||||
/* IUPAC Dna/Rna */
|
||||
static Int32 sDnaCode[] = {
|
||||
|
||||
#include "CODES/dna_code.h"
|
||||
|
||||
};
|
||||
|
||||
|
||||
/* -------------------------------------------- */
|
||||
/* 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;
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
/* returns actual code associated to type */
|
||||
/* -------------------------------------------- */
|
||||
|
||||
Int32 *GetCode(CodType ctype)
|
||||
{
|
||||
Int32 *code = sDftCode;
|
||||
|
||||
switch (ctype) {
|
||||
case dna : code = sDnaCode ; break;
|
||||
case protein : code = sProtCode ; break;
|
||||
default : code = sDftCode ; break;
|
||||
}
|
||||
|
||||
return code;
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
|
||||
#define BAD_IF(tst) if (tst) return 0
|
||||
|
||||
int CheckPattern(Pattern *ppat)
|
||||
{
|
||||
int lev;
|
||||
char *pat;
|
||||
|
||||
pat = ppat->cpat;
|
||||
|
||||
BAD_IF (*pat == '#');
|
||||
|
||||
for (lev = 0; *pat ; pat++)
|
||||
|
||||
switch (*pat) {
|
||||
|
||||
case '[' :
|
||||
BAD_IF (lev);
|
||||
BAD_IF (*(pat+1) == ']');
|
||||
lev++;
|
||||
break;
|
||||
|
||||
case ']' :
|
||||
lev--;
|
||||
BAD_IF (lev);
|
||||
break;
|
||||
|
||||
case '!' :
|
||||
BAD_IF (lev);
|
||||
BAD_IF (! *(pat+1));
|
||||
BAD_IF (*(pat+1) == ']');
|
||||
break;
|
||||
|
||||
case '#' :
|
||||
BAD_IF (lev);
|
||||
BAD_IF (*(pat-1) == '[');
|
||||
break;
|
||||
|
||||
default :
|
||||
if (! isupper(*pat))
|
||||
return 0;
|
||||
break;
|
||||
}
|
||||
|
||||
return (lev ? 0 : 1);
|
||||
}
|
||||
|
||||
#undef BAD_IF
|
||||
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static char *skipOblig(char *pat)
|
||||
{
|
||||
return (*(pat+1) == '#' ? pat+1 : pat);
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static char *splitPattern(char *pat)
|
||||
{
|
||||
switch (*pat) {
|
||||
|
||||
case '[' :
|
||||
for (; *pat; pat++)
|
||||
if (*pat == ']')
|
||||
return skipOblig(pat);
|
||||
return NULL;
|
||||
break;
|
||||
|
||||
case '!' :
|
||||
return splitPattern(pat+1);
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
return skipOblig(pat);
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static Int32 valPattern(char *pat, Int32 *code)
|
||||
{
|
||||
Int32 val;
|
||||
|
||||
switch (*pat) {
|
||||
|
||||
case '[' :
|
||||
return valPattern(pat+1, code);
|
||||
break;
|
||||
|
||||
case '!' :
|
||||
val = valPattern(pat+1, code);
|
||||
return (~val & PATMASK);
|
||||
break;
|
||||
|
||||
default :
|
||||
val = 0x0;
|
||||
while (isupper(*pat)) {
|
||||
val |= code[*pat - 'A'];
|
||||
pat++;
|
||||
}
|
||||
return val;
|
||||
}
|
||||
|
||||
return 0x0;
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static Int32 obliBitPattern(char *pat)
|
||||
{
|
||||
return (*(pat + strlen(pat) - 1) == '#' ? OBLIBIT : 0x0);
|
||||
}
|
||||
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static int lenPattern(char *pat)
|
||||
{
|
||||
int lpat;
|
||||
|
||||
lpat = 0;
|
||||
|
||||
while (*pat) {
|
||||
|
||||
if (! (pat = splitPattern(pat)))
|
||||
return 0;
|
||||
|
||||
pat++;
|
||||
|
||||
lpat++;
|
||||
}
|
||||
|
||||
return lpat;
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
/* Interface */
|
||||
/* -------------------------------------------- */
|
||||
|
||||
/* -------------------------------------------- */
|
||||
/* encode un pattern */
|
||||
/* -------------------------------------------- */
|
||||
int EncodePattern(Pattern *ppat, CodType ctype)
|
||||
{
|
||||
int pos, lpat;
|
||||
Int32 *code;
|
||||
char *pp, *pa, c;
|
||||
|
||||
ppat->ok = Faux;
|
||||
|
||||
code = GetCode(ctype);
|
||||
|
||||
ppat->patlen = lpat = lenPattern(ppat->cpat);
|
||||
|
||||
if (lpat <= 0)
|
||||
return 0;
|
||||
|
||||
if (! (ppat->patcode = NEWN(Int32, lpat)))
|
||||
return 0;
|
||||
|
||||
pa = pp = ppat->cpat;
|
||||
|
||||
pos = 0;
|
||||
|
||||
while (*pa) {
|
||||
|
||||
pp = splitPattern(pa);
|
||||
|
||||
c = *++pp;
|
||||
|
||||
*pp = '\000';
|
||||
|
||||
ppat->patcode[pos++] = valPattern(pa, code) | obliBitPattern(pa);
|
||||
|
||||
*pp = c;
|
||||
|
||||
pa = pp;
|
||||
}
|
||||
|
||||
ppat->ok = Vrai;
|
||||
|
||||
return lpat;
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
/* remove blanks */
|
||||
/* -------------------------------------------- */
|
||||
static char *RemBlanks(char *s)
|
||||
{
|
||||
char *sb, *sc;
|
||||
|
||||
for (sb = sc = s ; *sb ; sb++)
|
||||
if (! isspace(*sb))
|
||||
*sc++ = *sb;
|
||||
|
||||
return s;
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
/* count non blanks */
|
||||
/* -------------------------------------------- */
|
||||
static Int32 CountAlpha(char *s)
|
||||
{
|
||||
Int32 n;
|
||||
|
||||
for (n = 0 ; *s ; s++)
|
||||
if (! isspace(*s))
|
||||
n++;
|
||||
|
||||
return n;
|
||||
}
|
||||
|
||||
|
||||
/* -------------------------------------------- */
|
||||
/* lit un pattern */
|
||||
/* <pattern> #mis */
|
||||
/* ligne starting with '/' are comments */
|
||||
/* -------------------------------------------- */
|
||||
int ReadPattern(Pattern *ppat)
|
||||
{
|
||||
int val;
|
||||
char *spac;
|
||||
char buffer[BUFSIZ];
|
||||
|
||||
ppat->ok = Vrai;
|
||||
|
||||
if (! sGets(buffer, sizeof(buffer)))
|
||||
return 0;
|
||||
|
||||
if (*buffer == '/')
|
||||
return ReadPattern(ppat);
|
||||
|
||||
if (! CountAlpha(buffer))
|
||||
return ReadPattern(ppat);
|
||||
|
||||
for (spac = buffer ; *spac ; spac++)
|
||||
if ((*spac == ' ') || (*spac == '\t'))
|
||||
break;
|
||||
|
||||
ppat->ok = Faux;
|
||||
|
||||
if (! *spac)
|
||||
return 0;
|
||||
|
||||
if (sscanf(spac, "%d", &val) != 1)
|
||||
return 0;
|
||||
|
||||
ppat->hasIndel = (val < 0);
|
||||
|
||||
ppat->maxerr = ((val >= 0) ? val : -val);
|
||||
|
||||
*spac = '\000';
|
||||
|
||||
(void) RemBlanks(buffer);
|
||||
|
||||
if ((ppat->cpat = NEWN(char, strlen(buffer)+1)))
|
||||
strcpy(ppat->cpat, buffer);
|
||||
|
||||
ppat->ok = (ppat->cpat != NULL);
|
||||
|
||||
return (ppat->ok ? 1 : 0);
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
/* ecrit un pattern - Debug - */
|
||||
/* -------------------------------------------- */
|
||||
void PrintDebugPattern(Pattern *ppat)
|
||||
{
|
||||
int i;
|
||||
|
||||
printf("Pattern : %s\n", ppat->cpat);
|
||||
printf("Encoding : \n\t");
|
||||
|
||||
for (i = 0 ; i < ppat->patlen ; i++) {
|
||||
printf("0x%8.8x ", ppat->patcode[i]);
|
||||
if (i%4 == 3)
|
||||
printf("\n\t");
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
|
339
src/libapat/apat_search.c
Normal file
339
src/libapat/apat_search.c
Normal file
@ -0,0 +1,339 @@
|
||||
/* ==================================================== */
|
||||
/* 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 : <MFS> first version */
|
||||
/* 28/12/94 : <Gloup> revised version */
|
||||
/* 14/05/99 : <Gloup> last revision */
|
||||
/* ==================================================== */
|
||||
|
||||
#if 0
|
||||
#ifndef THINK_C
|
||||
#include <sys/types.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "Gtypes.h"
|
||||
#include "libstki.h"
|
||||
#include "apat.h"
|
||||
|
||||
#define POP PopiOut
|
||||
#define PUSH PushiIn
|
||||
#define TOPCURS CursiToTop
|
||||
#define DOWNREAD ReadiDown
|
||||
|
||||
#define KRONECK(x, msk) ((~x & msk) ? 0 : 1)
|
||||
#define MIN(x, y) ((x) < (y) ? (x) : (y))
|
||||
|
||||
/* -------------------------------------------- */
|
||||
/* Construction de la matrice S */
|
||||
/* -------------------------------------------- */
|
||||
|
||||
int CreateS(Pattern *ppat, Int32 lalpha)
|
||||
{
|
||||
Int32 i, j, indx;
|
||||
UInt32 pindx, amask, omask, *smat;
|
||||
|
||||
ppat->ok = Faux;
|
||||
|
||||
omask = 0x0L;
|
||||
|
||||
if (! (smat = NEWN(UInt32, lalpha)))
|
||||
return 0;
|
||||
|
||||
for (i = 0 ; i < lalpha ; i++)
|
||||
smat[i] = 0x0;
|
||||
|
||||
for (i = ppat->patlen - 1, amask = 0x1L ; i >= 0 ; i--, amask <<= 1) {
|
||||
|
||||
indx = ppat->patcode[i];
|
||||
|
||||
if (ppat->patcode[i] & OBLIBIT)
|
||||
omask |= amask;
|
||||
|
||||
for (j = 0, pindx = 0x1L ; j < lalpha ; j++, pindx <<= 1)
|
||||
if (indx & pindx)
|
||||
smat[j] |= amask;
|
||||
}
|
||||
|
||||
ppat->smat = smat;
|
||||
|
||||
ppat->omask = omask;
|
||||
|
||||
ppat->ok = Vrai;
|
||||
|
||||
return 1;
|
||||
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
/* Baeza-Yates/Manber algorithm */
|
||||
/* NoError */
|
||||
/* -------------------------------------------- */
|
||||
Int32 ManberNoErr(Seq *pseq, Pattern *ppat, int patnum,int begin,int length)
|
||||
{
|
||||
UInt32 pos;
|
||||
UInt32 smask, r;
|
||||
UInt8 *data;
|
||||
StackiPtr *stkpos, *stkerr;
|
||||
UInt32 end;
|
||||
|
||||
end = begin + length;
|
||||
end = (end <= (size_t)(pseq->seqlen+pseq->circular)) ? end:(size_t)(pseq->seqlen+pseq->circular);
|
||||
|
||||
|
||||
/* create local masks */
|
||||
|
||||
smask = r = 0x1L << ppat->patlen;
|
||||
|
||||
/* init. scan */
|
||||
data = pseq->data + begin;
|
||||
stkpos = pseq->hitpos + patnum;
|
||||
stkerr = pseq->hiterr + patnum;
|
||||
|
||||
/* loop on text data */
|
||||
|
||||
for (pos = begin ; pos < end ; pos++) {
|
||||
|
||||
r = (r >> 1) & ppat->smat[*data++];
|
||||
|
||||
if (r & 0x1L) {
|
||||
PUSH(stkpos, pos - ppat->patlen + 1);
|
||||
PUSH(stkerr, 0);
|
||||
}
|
||||
|
||||
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 ManberSub(Seq *pseq, Pattern *ppat, int patnum,int begin,int length)
|
||||
{
|
||||
int e, emax, found;
|
||||
UInt32 pos;
|
||||
UInt32 smask, cmask, sindx;
|
||||
UInt32 *pr, r[2 * MAX_PAT_ERR + 2];
|
||||
UInt8 *data;
|
||||
StackiPtr *stkpos, *stkerr;
|
||||
UInt32 end;
|
||||
|
||||
end = begin + length;
|
||||
end = (end <= (size_t)(pseq->seqlen+pseq->circular)) ? end:(size_t)(pseq->seqlen+pseq->circular);
|
||||
|
||||
/* create local masks */
|
||||
emax = ppat->maxerr;
|
||||
|
||||
r[0] = r[1] = 0x0;
|
||||
|
||||
cmask = smask = 0x1L << ppat->patlen;
|
||||
|
||||
for (e = 0, pr = r + 3 ; e <= emax ; e++, pr += 2)
|
||||
*pr = cmask;
|
||||
|
||||
cmask = ~ ppat->omask;
|
||||
|
||||
/* init. scan */
|
||||
data = pseq->data + begin;
|
||||
stkpos = pseq->hitpos + patnum;
|
||||
stkerr = pseq->hiterr + patnum;
|
||||
|
||||
/* loop on text data */
|
||||
|
||||
for (pos = begin ; pos < end ; pos++) {
|
||||
|
||||
sindx = ppat->smat[*data++];
|
||||
|
||||
for (e = found = 0, pr = r ; e <= emax ; 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 - ppat->patlen + 1);
|
||||
PUSH(stkerr, e);
|
||||
}
|
||||
found++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return (*stkpos)->top; /* aka # of hits */
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
/* Baeza-Yates/Manber algorithm */
|
||||
/* Substitution + Indels */
|
||||
/* */
|
||||
/* Note : r array is stored as : */
|
||||
/* 0 0 r(0,j) r(0,j+1) r(1,j) r(1,j+1) ... */
|
||||
/* */
|
||||
/* Warning: may return shifted pos. */
|
||||
/* */
|
||||
/* -------------------------------------------- */
|
||||
Int32 ManberIndel(Seq *pseq, Pattern *ppat, int patnum,int begin,int length)
|
||||
{
|
||||
int e, emax, found;
|
||||
UInt32 pos;
|
||||
UInt32 smask, cmask, sindx;
|
||||
UInt32 *pr, r[2 * MAX_PAT_ERR + 2];
|
||||
UInt8 *data;
|
||||
StackiPtr *stkpos, *stkerr;
|
||||
UInt32 end;
|
||||
|
||||
end = begin + length;
|
||||
end = (end <= (size_t)(pseq->seqlen+pseq->circular)) ? end:(size_t)(pseq->seqlen+pseq->circular);
|
||||
|
||||
/* create local masks */
|
||||
emax = ppat->maxerr;
|
||||
|
||||
r[0] = r[1] = 0x0;
|
||||
|
||||
cmask = smask = 0x1L << ppat->patlen;
|
||||
|
||||
for (e = 0, pr = r + 3 ; e <= emax ; e++, pr += 2) {
|
||||
*pr = cmask;
|
||||
cmask = (cmask >> 1) | smask;
|
||||
}
|
||||
|
||||
cmask = ~ ppat->omask;
|
||||
|
||||
/* init. scan */
|
||||
data = pseq->data + begin;
|
||||
stkpos = pseq->hitpos + patnum;
|
||||
stkerr = pseq->hiterr + patnum;
|
||||
|
||||
/* loop on text data */
|
||||
|
||||
for (pos = begin ; pos < end ; pos++) {
|
||||
|
||||
sindx = ppat->smat[*data++];
|
||||
|
||||
for (e = found = 0, pr = r ; e <= emax ; e++, pr += 2) {
|
||||
|
||||
pr[2] = pr[3] | smask;
|
||||
|
||||
pr[3] = (( pr[0] /* ins */
|
||||
| (pr[0] >> 1) /* sub */
|
||||
| (pr[1] >> 1)) /* del */
|
||||
& cmask)
|
||||
| ((pr[2] >> 1) & sindx); /* ident */
|
||||
|
||||
if (pr[3] & 0x1L) { /* found */
|
||||
if (! found) {
|
||||
PUSH(stkpos, pos - ppat->patlen + 1);
|
||||
PUSH(stkerr, e);
|
||||
}
|
||||
found++;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
return (*stkpos)->top; /* aka # of hits */
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
/* Baeza-Yates/Manber algorithm */
|
||||
/* API call to previous functions */
|
||||
/* -------------------------------------------- */
|
||||
Int32 ManberAll(Seq *pseq, Pattern *ppat, int patnum,int begin,int length)
|
||||
{
|
||||
if (ppat->maxerr == 0)
|
||||
return ManberNoErr(pseq, ppat, patnum, begin, length);
|
||||
else if (ppat->hasIndel)
|
||||
return ManberIndel(pseq, ppat, patnum, begin, length);
|
||||
else
|
||||
return ManberSub(pseq, ppat, patnum, begin, length);
|
||||
}
|
||||
|
||||
|
||||
/* -------------------------------------------- */
|
||||
/* Alignement NWS */
|
||||
/* pour edition des hits */
|
||||
/* (avec substitution obligatoire aux bords) */
|
||||
/* -------------------------------------------- */
|
||||
|
||||
Int32 NwsPatAlign(pseq, ppat, nerr, reslen, reserr)
|
||||
Seq *pseq;
|
||||
Pattern *ppat;
|
||||
Int32 nerr, *reslen, *reserr;
|
||||
{
|
||||
UInt8 *sseq, *px;
|
||||
Int32 i, j, lseq, lpat, npos, dindel, dsub,
|
||||
*pc, *pi, *pd, *ps;
|
||||
UInt32 amask;
|
||||
|
||||
static Int32 sTab[(MAX_PAT_LEN+MAX_PAT_ERR+1) * (MAX_PAT_LEN+1)];
|
||||
|
||||
lseq = pseq->seqlen;
|
||||
|
||||
pc = sTab; /* |----|----| --> i */
|
||||
pi = pc - 1; /* | ps | pd | | */
|
||||
pd = pi - lseq; /* |----|----| | */
|
||||
ps = pd - 1; /* | pi | pc | v j */
|
||||
/* |---------| */
|
||||
|
||||
lseq = pseq->seqlen;
|
||||
lpat = ppat->patlen;
|
||||
|
||||
sseq = pseq->data - 1;
|
||||
|
||||
amask = ONEMASK >> lpat;
|
||||
|
||||
for (j = 0 ; j <= lpat ; j++) {
|
||||
|
||||
for (i = 0 , px = sseq ; i <= lseq ; i++, px++) {
|
||||
|
||||
if (i && j) {
|
||||
dindel = MIN(*pi, *pd) + 1;
|
||||
dsub = *ps + KRONECK(ppat->smat[*px], amask);
|
||||
*pc = MIN(dindel, dsub);
|
||||
}
|
||||
else if (i) /* j == 0 */
|
||||
*pc = *pi + 1;
|
||||
else if (j) /* i == 0 */
|
||||
*pc = *pd + 1;
|
||||
else /* root */
|
||||
*pc = 0;
|
||||
|
||||
pc++;
|
||||
pi++;
|
||||
pd++;
|
||||
ps++;
|
||||
}
|
||||
|
||||
amask <<= 1;
|
||||
}
|
||||
|
||||
pc--;
|
||||
|
||||
for (i = lseq, npos = 0 ; i >= 0 ; i--, pc--) {
|
||||
if (*pc <= nerr) {
|
||||
*reslen++ = i;
|
||||
*reserr++ = *pc;
|
||||
npos++;
|
||||
}
|
||||
}
|
||||
|
||||
return npos;
|
||||
}
|
379
src/libapat/libstki.c
Normal file
379
src/libapat/libstki.c
Normal file
@ -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 : <Gloup> first draft */
|
||||
/* 15/08/93 : <Gloup> revised version */
|
||||
/* 14/05/99 : <Gloup> last revision */
|
||||
/* ==================================================== */
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "Gtypes.h"
|
||||
#include "libstki.h"
|
||||
|
||||
|
||||
/* ============================ */
|
||||
/* Constantes et Macros locales */
|
||||
/* ============================ */
|
||||
|
||||
#define ExpandStack(stkh) ResizeStacki((stkh), (*stkh)->size << 1)
|
||||
|
||||
#define ShrinkStack(stkh) ResizeStacki((stkh), (*stkh)->size >> 1)
|
||||
|
||||
|
||||
static Int16 sStkiLastError = kStkiNoErr;
|
||||
|
||||
/* -------------------------------------------- */
|
||||
/* gestion des erreurs */
|
||||
/* get/reset erreur flag */
|
||||
/* */
|
||||
/* @function: StkiError */
|
||||
/* -------------------------------------------- */
|
||||
|
||||
Int16 StkiError(Bool reset)
|
||||
{
|
||||
Int16 err;
|
||||
|
||||
err = sStkiLastError;
|
||||
|
||||
if (reset)
|
||||
sStkiLastError = kStkiNoErr;
|
||||
|
||||
return err;
|
||||
|
||||
} /* end of StkiError */
|
||||
|
||||
/* -------------------------------------------- */
|
||||
/* creation d'un stack */
|
||||
/* */
|
||||
/* @function: NewStacki */
|
||||
/* -------------------------------------------- */
|
||||
|
||||
StackiPtr NewStacki(Int32 size)
|
||||
{
|
||||
StackiPtr stki;
|
||||
|
||||
if (! (stki = NEW(Stacki)))
|
||||
return NULL;
|
||||
|
||||
stki->size = size;
|
||||
stki->top = 0;
|
||||
stki->cursor = 0;
|
||||
|
||||
if ( ! (stki->val = NEWN(Int32, 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)
|
||||
FREE(stki->val);
|
||||
FREE(stki);
|
||||
}
|
||||
|
||||
return NULL;
|
||||
|
||||
} /* end of FreeStacki */
|
||||
|
||||
/* -------------------------------------------- */
|
||||
/* creation d'un vecteur de stacks */
|
||||
/* */
|
||||
/* @function: NewStackiVector */
|
||||
/* -------------------------------------------- */
|
||||
|
||||
StackiHdle NewStackiVector(Int32 vectSize, Int32 stackSize)
|
||||
{
|
||||
Int32 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 vectSize)
|
||||
{
|
||||
Int32 i;
|
||||
|
||||
if (stkh) {
|
||||
for (i = 0 ; i < vectSize ; i++)
|
||||
(void) FreeStacki(stkh[i]);
|
||||
FREE(stkh);
|
||||
}
|
||||
|
||||
return NULL;
|
||||
|
||||
} /* end of FreeStackiVector */
|
||||
|
||||
/* -------------------------------------------- */
|
||||
/* resize d'un stack */
|
||||
/* */
|
||||
/* @function: ResizeStacki */
|
||||
/* -------------------------------------------- */
|
||||
|
||||
Int32 ResizeStacki(StackiHdle stkh, Int32 size)
|
||||
{
|
||||
Int32 resize = 0; /* assume error */
|
||||
Int32 *val;
|
||||
|
||||
if ((val = REALLOC(Int32, (*stkh)->val, size))) {
|
||||
(*stkh)->size = resize = size;
|
||||
(*stkh)->val = val;
|
||||
}
|
||||
|
||||
if (! resize)
|
||||
sStkiLastError = kStkiMemErr;
|
||||
|
||||
return resize;
|
||||
|
||||
} /* end of ResizeStacki */
|
||||
|
||||
/* -------------------------------------------- */
|
||||
/* empilage(/lement) */
|
||||
/* */
|
||||
/* @function: PushiIn */
|
||||
/* -------------------------------------------- */
|
||||
|
||||
Bool PushiIn(StackiHdle stkh, Int32 val)
|
||||
{
|
||||
if (((*stkh)->top >= (*stkh)->size) && (! ExpandStack(stkh)))
|
||||
return Faux;
|
||||
|
||||
(*stkh)->val[((*stkh)->top)++] = val;
|
||||
|
||||
return Vrai;
|
||||
|
||||
} /* end of PushiIn */
|
||||
|
||||
/* -------------------------------------------- */
|
||||
/* depilage(/lement) */
|
||||
/* */
|
||||
/* @function: PopiOut */
|
||||
/* -------------------------------------------- */
|
||||
|
||||
Bool PopiOut(StackiHdle stkh, Int32 *val)
|
||||
{
|
||||
if ((*stkh)->top <= 0)
|
||||
return Faux;
|
||||
|
||||
*val = (*stkh)->val[--((*stkh)->top)];
|
||||
|
||||
if ( ((*stkh)->top < ((*stkh)->size >> 1))
|
||||
&& ((*stkh)->top > kMinStackiSize))
|
||||
|
||||
(void) ShrinkStack(stkh);
|
||||
|
||||
return Vrai;
|
||||
|
||||
} /* end of PopiOut */
|
||||
|
||||
/* -------------------------------------------- */
|
||||
/* lecture descendante */
|
||||
/* */
|
||||
/* @function: ReadiDown */
|
||||
/* -------------------------------------------- */
|
||||
|
||||
Bool ReadiDown(StackiPtr stki, Int32 *val)
|
||||
{
|
||||
if (stki->cursor <= 0)
|
||||
return Faux;
|
||||
|
||||
*val = stki->val[--(stki->cursor)];
|
||||
|
||||
return Vrai;
|
||||
|
||||
} /* end of ReadiDown */
|
||||
|
||||
/* -------------------------------------------- */
|
||||
/* lecture ascendante */
|
||||
/* */
|
||||
/* @function: ReadiUp */
|
||||
/* -------------------------------------------- */
|
||||
|
||||
Bool ReadiUp(StackiPtr stki, Int32 *val)
|
||||
{
|
||||
if (stki->cursor >= stki->top)
|
||||
return Faux;
|
||||
|
||||
*val = stki->val[(stki->cursor)++];
|
||||
|
||||
return Vrai;
|
||||
|
||||
} /* 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 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 SearchDownStacki(StackiPtr stki, Int32 sval)
|
||||
{
|
||||
Int32 val;
|
||||
Bool 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 BinSearchStacki(StackiPtr stki, Int32 sval)
|
||||
{
|
||||
Int32 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 Vrai;
|
||||
}
|
||||
|
||||
if (span > 0)
|
||||
high = midd - 1;
|
||||
else
|
||||
low = midd + 1;
|
||||
}
|
||||
|
||||
return Faux;
|
||||
|
||||
} /* end of BinSearchStacki */
|
||||
|
||||
/* -------------------------------------------- */
|
||||
/* teste l'egalite *physique* de deux stacks */
|
||||
/* */
|
||||
/* @function: SameStacki */
|
||||
/* -------------------------------------------- */
|
||||
|
||||
Bool SameStacki(StackiPtr stki1, StackiPtr stki2)
|
||||
{
|
||||
if (stki1->top != stki2->top)
|
||||
return Faux;
|
||||
|
||||
return ((memcmp(stki1->val, stki2->val,
|
||||
stki1->top * sizeof(Int32)) == 0) ? Vrai : Faux);
|
||||
|
||||
} /* end of SameStacki */
|
||||
|
||||
|
||||
/* -------------------------------------------- */
|
||||
/* inverse l'ordre des elements dans un stack */
|
||||
/* */
|
||||
/* @function: ReverseStacki */
|
||||
/* -------------------------------------------- */
|
||||
|
||||
Bool ReverseStacki(StackiPtr stki)
|
||||
{
|
||||
Int32 *t, *b, swp;
|
||||
|
||||
if (stki->top <= 0)
|
||||
return Faux;
|
||||
|
||||
b = stki->val;
|
||||
t = b + stki->top - 1;
|
||||
|
||||
while (t > b) {
|
||||
swp = *t;
|
||||
*t-- = *b;
|
||||
*b++ = swp;
|
||||
}
|
||||
|
||||
return Vrai;
|
||||
|
||||
} /* end of ReverseStacki */
|
||||
|
87
src/libapat/libstki.h
Normal file
87
src/libapat/libstki.h
Normal file
@ -0,0 +1,87 @@
|
||||
/* ==================================================== */
|
||||
/* Copyright (c) Atelier de BioInformatique */
|
||||
/* Mar. 92 */
|
||||
/* File: libstki.h */
|
||||
/* Purpose: library of dynamic stacks holding */
|
||||
/* integer values */
|
||||
/* History: */
|
||||
/* 00/03/92 : <Gloup> first draft */
|
||||
/* 07/07/93 : <Gloup> complete revision */
|
||||
/* 10/03/94 : <Gloup> added xxxVector funcs */
|
||||
/* 14/05/99 : <Gloup> last revision */
|
||||
/* ==================================================== */
|
||||
|
||||
#ifndef _H_Gtypes
|
||||
#include "Gtypes.h"
|
||||
#endif
|
||||
|
||||
#define _H_libstki
|
||||
|
||||
/* ==================================================== */
|
||||
/* Constantes de dimensionnement */
|
||||
/* ==================================================== */
|
||||
|
||||
#ifndef kMinStackiSize
|
||||
#define kMinStackiSize 2 /* taille mini stack */
|
||||
#endif
|
||||
|
||||
|
||||
#define kStkiNoErr 0 /* ok */
|
||||
#define kStkiMemErr 1 /* not enough memory */
|
||||
|
||||
#define kStkiReset Vrai
|
||||
#define kStkiGet Faux
|
||||
|
||||
/* ==================================================== */
|
||||
/* Macros standards */
|
||||
/* ==================================================== */
|
||||
|
||||
#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((Ptr) ptr)
|
||||
#endif
|
||||
|
||||
|
||||
/* ==================================================== */
|
||||
/* Types & Structures de donnees */
|
||||
/* ==================================================== */
|
||||
|
||||
/* -------------------- */
|
||||
/* structure : pile */
|
||||
/* -------------------- */
|
||||
typedef struct Stacki {
|
||||
/* ---------------------*/
|
||||
Int32 size; /* stack size */
|
||||
Int32 top; /* current free pos. */
|
||||
Int32 cursor; /* current cursor */
|
||||
Int32 *val; /* values */
|
||||
/* ---------------------*/
|
||||
} Stacki, *StackiPtr, **StackiHdle;
|
||||
|
||||
|
||||
|
||||
/* ==================================================== */
|
||||
/* Prototypes (generated by mproto) */
|
||||
/* ==================================================== */
|
||||
|
||||
/* libstki.c */
|
||||
|
||||
Int16 StkiError (Bool reset );
|
||||
StackiPtr NewStacki (Int32 size );
|
||||
StackiPtr FreeStacki (StackiPtr stki );
|
||||
StackiHdle NewStackiVector (Int32 vectSize, Int32 stackSize );
|
||||
StackiHdle FreeStackiVector (StackiHdle stkh, Int32 vectSize );
|
||||
Int32 ResizeStacki (StackiHdle stkh , Int32 size );
|
||||
Bool PushiIn (StackiHdle stkh , Int32 val );
|
||||
Bool PopiOut (StackiHdle stkh , Int32 *val );
|
||||
Bool ReadiDown (StackiPtr stki , Int32 *val );
|
||||
Bool ReadiUp (StackiPtr stki , Int32 *val );
|
||||
void CursiToTop (StackiPtr stki );
|
||||
void CursiToBottom (StackiPtr stki );
|
||||
void CursiSwap (StackiPtr stki );
|
||||
Bool SearchDownStacki (StackiPtr stki , Int32 sval );
|
||||
Bool BinSearchStacki (StackiPtr stki , Int32 sval );
|
||||
Bool SameStacki (StackiPtr stki1 , StackiPtr stki2 );
|
||||
Bool ReverseStacki (StackiPtr stki );
|
31
src/libecoPCR/Makefile
Normal file
31
src/libecoPCR/Makefile
Normal file
@ -0,0 +1,31 @@
|
||||
|
||||
SOURCES = ecoapat.c \
|
||||
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) $@
|
26
src/libecoPCR/ecoError.c
Normal file
26
src/libecoPCR/ecoError.c
Normal file
@ -0,0 +1,26 @@
|
||||
#include "ecoPCR.h"
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
/*
|
||||
* 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();
|
||||
}
|
122
src/libecoPCR/ecoIOUtils.c
Normal file
122
src/libecoPCR/ecoIOUtils.c
Normal file
@ -0,0 +1,122 @@
|
||||
#include "ecoPCR.h"
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#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;
|
||||
}
|
||||
|
79
src/libecoPCR/ecoMalloc.c
Normal file
79
src/libecoPCR/ecoMalloc.c
Normal file
@ -0,0 +1,79 @@
|
||||
#include "ecoPCR.h"
|
||||
#include <stdlib.h>
|
||||
|
||||
static int eco_log_malloc = 0;
|
||||
|
||||
void eco_trace_memory_allocation()
|
||||
{
|
||||
eco_log_malloc=1;
|
||||
}
|
||||
|
||||
void eco_untrace_memory_allocation()
|
||||
{
|
||||
eco_log_malloc=0;
|
||||
}
|
||||
|
||||
|
||||
void *eco_malloc(int32_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);
|
||||
|
||||
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,
|
||||
int32_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);
|
||||
|
||||
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);
|
||||
}
|
269
src/libecoPCR/ecoPCR.h
Normal file
269
src/libecoPCR/ecoPCR.h
Normal file
@ -0,0 +1,269 @@
|
||||
#ifndef ECOPCR_H_
|
||||
#define ECOPCR_H_
|
||||
|
||||
#include <stdio.h>
|
||||
#include <inttypes.h>
|
||||
|
||||
#ifndef H_apat
|
||||
#include "../libapat/apat.h"
|
||||
#endif
|
||||
|
||||
/*****************************************************
|
||||
*
|
||||
* 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;
|
||||
|
||||
char data[1];
|
||||
|
||||
} ecoseqformat_t;
|
||||
|
||||
typedef struct {
|
||||
int32_t taxid;
|
||||
int32_t SQ_length;
|
||||
char *AC;
|
||||
char *DE;
|
||||
char *SQ;
|
||||
} ecoseq_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(int32_t chunksize,
|
||||
const char *error_message,
|
||||
const char *filename,
|
||||
int32_t line);
|
||||
|
||||
|
||||
void *eco_realloc(void *chunk,
|
||||
int32_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);
|
||||
|
||||
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_*/
|
199
src/libecoPCR/ecoapat.c
Normal file
199
src/libecoPCR/ecoapat.c
Normal file
@ -0,0 +1,199 @@
|
||||
#include "../libapat/libstki.h"
|
||||
#include "../libapat/apat.h"
|
||||
|
||||
#include "ecoPCR.h"
|
||||
|
||||
#include <string.h>
|
||||
|
||||
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;
|
||||
|
||||
}
|
153
src/libecoPCR/ecodna.c
Normal file
153
src/libecoPCR/ecodna.c
Normal file
@ -0,0 +1,153 @@
|
||||
#include <string.h>
|
||||
#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;
|
||||
}
|
||||
|
19
src/libecoPCR/ecofilter.c
Normal file
19
src/libecoPCR/ecofilter.c
Normal file
@ -0,0 +1,19 @@
|
||||
#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;
|
||||
}
|
61
src/libecoPCR/econame.c
Normal file
61
src/libecoPCR/econame.c
Normal file
@ -0,0 +1,61 @@
|
||||
#include "ecoPCR.h"
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
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;
|
||||
}
|
||||
|
52
src/libecoPCR/ecorank.c
Normal file
52
src/libecoPCR/ecorank.c
Normal file
@ -0,0 +1,52 @@
|
||||
#include "ecoPCR.h"
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
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);
|
||||
}
|
223
src/libecoPCR/ecoseq.c
Normal file
223
src/libecoPCR/ecoseq.c
Normal file
@ -0,0 +1,223 @@
|
||||
#include "ecoPCR.h"
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <zlib.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
|
||||
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);
|
||||
}
|
||||
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;
|
||||
|
||||
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");
|
||||
|
||||
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");
|
||||
|
||||
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);
|
||||
|
||||
fprintf(stderr,"# Coucou %s\n",filename_buffer);
|
||||
|
||||
|
||||
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;
|
||||
}
|
329
src/libecoPCR/ecotax.c
Normal file
329
src/libecoPCR/ecotax.c
Normal file
@ -0,0 +1,329 @@
|
||||
#include "ecoPCR.h"
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
|
||||
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 + (int32_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*)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);
|
||||
}
|
31
src/libtm/tm.c
Normal file
31
src/libtm/tm.c
Normal file
@ -0,0 +1,31 @@
|
||||
|
||||
/**
|
||||
*
|
||||
* J Jr SantaLucia.
|
||||
* A uni<6E>ed view of polymer, dumbbell, and oligonucleotide
|
||||
* dna nearest-neighbor thermodynamics.
|
||||
* Proc Natl Acad Sci U S A, 95(4):1460<36>1465, 1998 Feb 17.
|
||||
*/
|
||||
|
||||
|
||||
//Nearest-neighbor sequence
|
||||
//(5'-3'/5'-3') deltaH deltaS
|
||||
// kcal/mol cal/(mol<6F>K)
|
||||
//AA/TT -7.9 -22.2
|
||||
//AG/CT -7.8 -21.0
|
||||
//AT/AT -7.2 -20.4
|
||||
//AC/GT -8.4 -22.4
|
||||
//GA/TC -8.2 -22.2
|
||||
//GG/CC -8.0 -19.9
|
||||
//GC/GC -9.8 -24.4
|
||||
//TA/TA -7.2 -21.3
|
||||
//TG/CA -8.5 -22.7
|
||||
//CG/CG -10.6 -27.2
|
||||
//Terminal A-T base pair 2.3 4.1
|
||||
//Terminal G-C base pair 0.1 -2.8
|
||||
|
||||
|
||||
float nearestNeighborTm(const char *oligo,float probe,float target)
|
||||
{
|
||||
|
||||
}
|
Reference in New Issue
Block a user