sumaclust_v1.0.36+ds/0000755000175000017500000000000013645057275014047 5ustar pierrepierresumaclust_v1.0.36+ds/mtcompare_sumaclust.h0000644000175000017500000000050012551664362020276 0ustar pierrepierre/* * mtcompare.h * * Created on: 12 mars 2013 * Author: celinemercier */ #ifndef MTCOMPARE_H_ #define MTCOMPARE_H_ int mt_compare_sumaclust(fastaSeqPtr* db, int n, BOOL fast, double threshold, BOOL normalize, int reference, BOOL lcsmode, int threads_number, double max_ratio); #endif /* MTCOMPARE_H_ */ sumaclust_v1.0.36+ds/global.mk0000644000175000017500000000052013446627704015634 0ustar pierrepierre LIBSUMAPATH = -L./sumalibs LIBSUMA = ./sumalibs/libsuma.a CC=gcc LDFLAGS= ifeq ($(CC),gcc) CFLAGS = -O3 -s -DOMP_SUPPORT -fopenmp -w else CFLAGS = -O3 -w endif default: all %.o: %.c $(CC) $(CFLAGS) -c -o $@ $< $(LIB) ######## # # libraries compilation # ######## ./sumalibs/libsuma.a: $(MAKE) -C ./sumalibs sumaclust_v1.0.36+ds/Makefile0000644000175000017500000000137313446717535015514 0ustar pierrepierrePREFIX=/usr/local CFLAGS=-I$(PREFIX)/include EXEC = sumaclust SUMACLUST_SRC = sumaclust.c \ mtcompare_sumaclust.c SUMACLUST_OBJ = $(patsubst %.c,%.o,$(SUMACLUST_SRC)) SRCS = $(SUMACLUST_SRC) LIB = -lsuma -lm #-ll include ./global.mk all: $(EXEC) ######## # # sumaclust compilation # ######## # executable compilation and link ifeq ($(CC),gcc) LFLAGS = -fopenmp else LFLAGS = endif sumaclust: $(SUMACLUST_OBJ) $(LIBSUMA) $(CC) $(LDFLAGS) -o $@ $(LFLAGS) $(SUMACLUST_OBJ) $(LIB) $(LIBSUMAPATH) ######## # # project management # ######## clean: rm -f $(SUMACLUST_OBJ) rm -f $(EXEC) $(MAKE) -C ./sumalibs clean install: all install -d $(DESTDIR)$(PREFIX)/bin/ install -m 755 $(EXEC) $(DESTDIR)$(PREFIX)/bin/ sumaclust_v1.0.36+ds/Licence_CeCILL_V2-en.txt0000644000175000017500000005115112551664362020173 0ustar pierrepierre CeCILL FREE SOFTWARE LICENSE AGREEMENT Notice This Agreement is a Free Software license agreement that is the result of discussions between its authors in order to ensure compliance with the two main principles guiding its drafting: * firstly, compliance with the principles governing the distribution of Free Software: access to source code, broad rights granted to users, * secondly, the election of a governing law, French law, with which it is conformant, both as regards the law of torts and intellectual property law, and the protection that it offers to both authors and holders of the economic rights over software. The authors of the CeCILL (for Ce[a] C[nrs] I[nria] L[ogiciel] L[ibre]) license are: Commissariat l'Energie Atomique - CEA, a public scientific, technical and industrial research establishment, having its principal place of business at 25 rue Leblanc, immeuble Le Ponant D, 75015 Paris, France. Centre National de la Recherche Scientifique - CNRS, a public scientific and technological establishment, having its principal place of business at 3 rue Michel-Ange, 75794 Paris cedex 16, France. Institut National de Recherche en Informatique et en Automatique - INRIA, a public scientific and technological establishment, having its principal place of business at Domaine de Voluceau, Rocquencourt, BP 105, 78153 Le Chesnay cedex, France. Preamble The purpose of this Free Software license agreement is to grant users the right to modify and redistribute the software governed by this license within the framework of an open source distribution model. The exercising of these rights is conditional upon certain obligations for users so as to preserve this status for all subsequent redistributions. In consideration of access to the source code and the rights to copy, modify and redistribute granted by the license, users are provided only with a limited warranty and the software's author, the holder of the economic rights, and the successive licensors only have limited liability. In this respect, the risks associated with loading, using, modifying and/or developing or reproducing the software by the user are brought to the user's attention, given its Free Software status, which may make it complicated to use, with the result that its use is reserved for developers and experienced professionals having in-depth computer knowledge. Users are therefore encouraged to load and test the suitability of the software as regards their requirements in conditions enabling the security of their systems and/or data to be ensured and, more generally, to use and operate it in the same conditions of security. This Agreement may be freely reproduced and published, provided it is not altered, and that no provisions are either added or removed herefrom. This Agreement may apply to any or all software for which the holder of the economic rights decides to submit the use thereof to its provisions. Article 1 - DEFINITIONS For the purpose of this Agreement, when the following expressions commence with a capital letter, they shall have the following meaning: Agreement: means this license agreement, and its possible subsequent versions and annexes. Software: means the software in its Object Code and/or Source Code form and, where applicable, its documentation, "as is" when the Licensee accepts the Agreement. Initial Software: means the Software in its Source Code and possibly its Object Code form and, where applicable, its documentation, "as is" when it is first distributed under the terms and conditions of the Agreement. Modified Software: means the Software modified by at least one Contribution. Source Code: means all the Software's instructions and program lines to which access is required so as to modify the Software. Object Code: means the binary files originating from the compilation of the Source Code. Holder: means the holder(s) of the economic rights over the Initial Software. Licensee: means the Software user(s) having accepted the Agreement. Contributor: means a Licensee having made at least one Contribution. Licensor: means the Holder, or any other individual or legal entity, who distributes the Software under the Agreement. Contribution: means any or all modifications, corrections, translations, adaptations and/or new functions integrated into the Software by any or all Contributors, as well as any or all Internal Modules. Module: means a set of sources files including their documentation that enables supplementary functions or services in addition to those offered by the Software. External Module: means any or all Modules, not derived from the Software, so that this Module and the Software run in separate address spaces, with one calling the other when they are run. Internal Module: means any or all Module, connected to the Software so that they both execute in the same address space. GNU GPL: means the GNU General Public License version 2 or any subsequent version, as published by the Free Software Foundation Inc. Parties: mean both the Licensee and the Licensor. These expressions may be used both in singular and plural form. Article 2 - PURPOSE The purpose of the Agreement is the grant by the Licensor to the Licensee of a non-exclusive, transferable and worldwide license for the Software as set forth in Article 5 hereinafter for the whole term of the protection granted by the rights over said Software. Article 3 - ACCEPTANCE 3.1 The Licensee shall be deemed as having accepted the terms and conditions of this Agreement upon the occurrence of the first of the following events: * (i) loading the Software by any or all means, notably, by downloading from a remote server, or by loading from a physical medium; * (ii) the first time the Licensee exercises any of the rights granted hereunder. 3.2 One copy of the Agreement, containing a notice relating to the characteristics of the Software, to the limited warranty, and to the fact that its use is restricted to experienced users has been provided to the Licensee prior to its acceptance as set forth in Article 3.1 hereinabove, and the Licensee hereby acknowledges that it has read and understood it. Article 4 - EFFECTIVE DATE AND TERM 4.1 EFFECTIVE DATE The Agreement shall become effective on the date when it is accepted by the Licensee as set forth in Article 3.1. 4.2 TERM The Agreement shall remain in force for the entire legal term of protection of the economic rights over the Software. Article 5 - SCOPE OF RIGHTS GRANTED The Licensor hereby grants to the Licensee, who accepts, the following rights over the Software for any or all use, and for the term of the Agreement, on the basis of the terms and conditions set forth hereinafter. Besides, if the Licensor owns or comes to own one or more patents protecting all or part of the functions of the Software or of its components, the Licensor undertakes not to enforce the rights granted by these patents against successive Licensees using, exploiting or modifying the Software. If these patents are transferred, the Licensor undertakes to have the transferees subscribe to the obligations set forth in this paragraph. 5.1 RIGHT OF USE The Licensee is authorized to use the Software, without any limitation as to its fields of application, with it being hereinafter specified that this comprises: 1. permanent or temporary reproduction of all or part of the Software by any or all means and in any or all form. 2. loading, displaying, running, or storing the Software on any or all medium. 3. entitlement to observe, study or test its operation so as to determine the ideas and principles behind any or all constituent elements of said Software. This shall apply when the Licensee carries out any or all loading, displaying, running, transmission or storage operation as regards the Software, that it is entitled to carry out hereunder. 5.2 ENTITLEMENT TO MAKE CONTRIBUTIONS The right to make Contributions includes the right to translate, adapt, arrange, or make any or all modifications to the Software, and the right to reproduce the resulting software. The Licensee is authorized to make any or all Contributions to the Software provided that it includes an explicit notice that it is the author of said Contribution and indicates the date of the creation thereof. 5.3 RIGHT OF DISTRIBUTION In particular, the right of distribution includes the right to publish, transmit and communicate the Software to the general public on any or all medium, and by any or all means, and the right to market, either in consideration of a fee, or free of charge, one or more copies of the Software by any means. The Licensee is further authorized to distribute copies of the modified or unmodified Software to third parties according to the terms and conditions set forth hereinafter. 5.3.1 DISTRIBUTION OF SOFTWARE WITHOUT MODIFICATION The Licensee is authorized to distribute true copies of the Software in Source Code or Object Code form, provided that said distribution complies with all the provisions of the Agreement and is accompanied by: 1. a copy of the Agreement, 2. a notice relating to the limitation of both the Licensor's warranty and liability as set forth in Articles 8 and 9, and that, in the event that only the Object Code of the Software is redistributed, the Licensee allows future Licensees unhindered access to the full Source Code of the Software by indicating how to access it, it being understood that the additional cost of acquiring the Source Code shall not exceed the cost of transferring the data. 5.3.2 DISTRIBUTION OF MODIFIED SOFTWARE When the Licensee makes a Contribution to the Software, the terms and conditions for the distribution of the resulting Modified Software become subject to all the provisions of this Agreement. The Licensee is authorized to distribute the Modified Software, in source code or object code form, provided that said distribution complies with all the provisions of the Agreement and is accompanied by: 1. a copy of the Agreement, 2. a notice relating to the limitation of both the Licensor's warranty and liability as set forth in Articles 8 and 9, and that, in the event that only the object code of the Modified Software is redistributed, the Licensee allows future Licensees unhindered access to the full source code of the Modified Software by indicating how to access it, it being understood that the additional cost of acquiring the source code shall not exceed the cost of transferring the data. 5.3.3 DISTRIBUTION OF EXTERNAL MODULES When the Licensee has developed an External Module, the terms and conditions of this Agreement do not apply to said External Module, that may be distributed under a separate license agreement. 5.3.4 COMPATIBILITY WITH THE GNU GPL The Licensee can include a code that is subject to the provisions of one of the versions of the GNU GPL in the Modified or unmodified Software, and distribute that entire code under the terms of the same version of the GNU GPL. The Licensee can include the Modified or unmodified Software in a code that is subject to the provisions of one of the versions of the GNU GPL, and distribute that entire code under the terms of the same version of the GNU GPL. Article 6 - INTELLECTUAL PROPERTY 6.1 OVER THE INITIAL SOFTWARE The Holder owns the economic rights over the Initial Software. Any or all use of the Initial Software is subject to compliance with the terms and conditions under which the Holder has elected to distribute its work and no one shall be entitled to modify the terms and conditions for the distribution of said Initial Software. The Holder undertakes that the Initial Software will remain ruled at least by this Agreement, for the duration set forth in Article 4.2. 6.2 OVER THE CONTRIBUTIONS The Licensee who develops a Contribution is the owner of the intellectual property rights over this Contribution as defined by applicable law. 6.3 OVER THE EXTERNAL MODULES The Licensee who develops an External Module is the owner of the intellectual property rights over this External Module as defined by applicable law and is free to choose the type of agreement that shall govern its distribution. 6.4 JOINT PROVISIONS The Licensee expressly undertakes: 1. not to remove, or modify, in any manner, the intellectual property notices attached to the Software; 2. to reproduce said notices, in an identical manner, in the copies of the Software modified or not. The Licensee undertakes not to directly or indirectly infringe the intellectual property rights of the Holder and/or Contributors on the Software and to take, where applicable, vis--vis its staff, any and all measures required to ensure respect of said intellectual property rights of the Holder and/or Contributors. Article 7 - RELATED SERVICES 7.1 Under no circumstances shall the Agreement oblige the Licensor to provide technical assistance or maintenance services for the Software. However, the Licensor is entitled to offer this type of services. The terms and conditions of such technical assistance, and/or such maintenance, shall be set forth in a separate instrument. Only the Licensor offering said maintenance and/or technical assistance services shall incur liability therefor. 7.2 Similarly, any Licensor is entitled to offer to its licensees, under its sole responsibility, a warranty, that shall only be binding upon itself, for the redistribution of the Software and/or the Modified Software, under terms and conditions that it is free to decide. Said warranty, and the financial terms and conditions of its application, shall be subject of a separate instrument executed between the Licensor and the Licensee. Article 8 - LIABILITY 8.1 Subject to the provisions of Article 8.2, the Licensee shall be entitled to claim compensation for any direct loss it may have suffered from the Software as a result of a fault on the part of the relevant Licensor, subject to providing evidence thereof. 8.2 The Licensor's liability is limited to the commitments made under this Agreement and shall not be incurred as a result of in particular: (i) loss due the Licensee's total or partial failure to fulfill its obligations, (ii) direct or consequential loss that is suffered by the Licensee due to the use or performance of the Software, and (iii) more generally, any consequential loss. In particular the Parties expressly agree that any or all pecuniary or business loss (i.e. loss of data, loss of profits, operating loss, loss of customers or orders, opportunity cost, any disturbance to business activities) or any or all legal proceedings instituted against the Licensee by a third party, shall constitute consequential loss and shall not provide entitlement to any or all compensation from the Licensor. Article 9 - WARRANTY 9.1 The Licensee acknowledges that the scientific and technical state-of-the-art when the Software was distributed did not enable all possible uses to be tested and verified, nor for the presence of possible defects to be detected. In this respect, the Licensee's attention has been drawn to the risks associated with loading, using, modifying and/or developing and reproducing the Software which are reserved for experienced users. The Licensee shall be responsible for verifying, by any or all means, the suitability of the product for its requirements, its good working order, and for ensuring that it shall not cause damage to either persons or properties. 9.2 The Licensor hereby represents, in good faith, that it is entitled to grant all the rights over the Software (including in particular the rights set forth in Article 5). 9.3 The Licensee acknowledges that the Software is supplied "as is" by the Licensor without any other express or tacit warranty, other than that provided for in Article 9.2 and, in particular, without any warranty as to its commercial value, its secured, safe, innovative or relevant nature. Specifically, the Licensor does not warrant that the Software is free from any error, that it will operate without interruption, that it will be compatible with the Licensee's own equipment and software configuration, nor that it will meet the Licensee's requirements. 9.4 The Licensor does not either expressly or tacitly warrant that the Software does not infringe any third party intellectual property right relating to a patent, software or any other property right. Therefore, the Licensor disclaims any and all liability towards the Licensee arising out of any or all proceedings for infringement that may be instituted in respect of the use, modification and redistribution of the Software. Nevertheless, should such proceedings be instituted against the Licensee, the Licensor shall provide it with technical and legal assistance for its defense. Such technical and legal assistance shall be decided on a case-by-case basis between the relevant Licensor and the Licensee pursuant to a memorandum of understanding. The Licensor disclaims any and all liability as regards the Licensee's use of the name of the Software. No warranty is given as regards the existence of prior rights over the name of the Software or as regards the existence of a trademark. Article 10 - TERMINATION 10.1 In the event of a breach by the Licensee of its obligations hereunder, the Licensor may automatically terminate this Agreement thirty (30) days after notice has been sent to the Licensee and has remained ineffective. 10.2 A Licensee whose Agreement is terminated shall no longer be authorized to use, modify or distribute the Software. However, any licenses that it may have granted prior to termination of the Agreement shall remain valid subject to their having been granted in compliance with the terms and conditions hereof. Article 11 - MISCELLANEOUS 11.1 EXCUSABLE EVENTS Neither Party shall be liable for any or all delay, or failure to perform the Agreement, that may be attributable to an event of force majeure, an act of God or an outside cause, such as defective functioning or interruptions of the electricity or telecommunications networks, network paralysis following a virus attack, intervention by government authorities, natural disasters, water damage, earthquakes, fire, explosions, strikes and labor unrest, war, etc. 11.2 Any failure by either Party, on one or more occasions, to invoke one or more of the provisions hereof, shall under no circumstances be interpreted as being a waiver by the interested Party of its right to invoke said provision(s) subsequently. 11.3 The Agreement cancels and replaces any or all previous agreements, whether written or oral, between the Parties and having the same purpose, and constitutes the entirety of the agreement between said Parties concerning said purpose. No supplement or modification to the terms and conditions hereof shall be effective as between the Parties unless it is made in writing and signed by their duly authorized representatives. 11.4 In the event that one or more of the provisions hereof were to conflict with a current or future applicable act or legislative text, said act or legislative text shall prevail, and the Parties shall make the necessary amendments so as to comply with said act or legislative text. All other provisions shall remain effective. Similarly, invalidity of a provision of the Agreement, for any reason whatsoever, shall not cause the Agreement as a whole to be invalid. 11.5 LANGUAGE The Agreement is drafted in both French and English and both versions are deemed authentic. Article 12 - NEW VERSIONS OF THE AGREEMENT 12.1 Any person is authorized to duplicate and distribute copies of this Agreement. 12.2 So as to ensure coherence, the wording of this Agreement is protected and may only be modified by the authors of the License, who reserve the right to periodically publish updates or new versions of the Agreement, each with a separate number. These subsequent versions may address new issues encountered by Free Software. 12.3 Any Software distributed under a given version of the Agreement may only be subsequently distributed under the same version of the Agreement or a subsequent version, subject to the provisions of Article 5.3.4. Article 13 - GOVERNING LAW AND JURISDICTION 13.1 The Agreement is governed by French law. The Parties agree to endeavor to seek an amicable solution to any disagreements or disputes that may arise during the performance of the Agreement. 13.2 Failing an amicable solution within two (2) months as from their occurrence, and unless emergency proceedings are necessary, the disagreements or disputes shall be referred to the Paris Courts having jurisdiction, by the more diligent Party. Version 2.0 dated 2006-09-05. sumaclust_v1.0.36+ds/._sumaclust_user_manual.pdf0000644000175000017500000000041213447150660021357 0ustar pierrepierreMac OS X  2 ATTR :com.apple.lastuseddate#PS*$com.apple.metadata:_kMDItemUserTagsќ\V.4bplist00 sumaclust_v1.0.36+ds/._sumaclust_user_manual.md0000644000175000017500000000026013447147451021213 0ustar pierrepierreMac OS X  2~ATTRcom.apple.lastuseddate#PSќ\z5 sumaclust_v1.0.36+ds/mtcompare_sumaclust.c0000644000175000017500000002155013641111346020267 0ustar pierrepierre/* * mtcompare_cumaclust.c * * Author: Celine Mercier * */ #ifdef OMP_SUPPORT #include #endif #include #include #include #include #include "sumalibs/libfasta/sequence.h" #include "sumalibs/libutils/utilities.h" #include "sumalibs/liblcs/upperband.h" #include "sumalibs/liblcs/sse_banded_LCS_alignment.h" #include "sumaclust.h" static double computeScore(void* c, int32_t seed_number, int32_t i, int thread_number,int32_t maxcount) { thread_control_t *control=(thread_control_t*)c; fastaSeqPtr* db = control->db; fastaSeqPtr db_i = db[i]; fastaSeqPtr db_seed_number = db[seed_number]; int LCSmin; double score; score = control->worstscore; if (db_i->count <= maxcount) filters(db_i, db_seed_number, control->threshold, control->normalize, control->reference, control->lcsmode, &score, &LCSmin); if (score == -1.0) score = alignForSumathings(db_seed_number->sequence, control->iseqs1[thread_number], db_i->sequence, control->iseqs2[thread_number], db_seed_number->length, db_i->length, control->normalize, control->reference, control->lcsmode, control->addresses[thread_number], control->sizeForSeqs, LCSmin); return score; } inline void putSeqInClusterMT(void *c, int32_t center_idx, int32_t seq, double score) { // saves a sequence as belonging to a cluster and its score with the seed thread_control_t *control=(thread_control_t*)c; fastaSeqPtr* db = control->db; fastaSeqPtr pseq = db[seq]; pseq->center = db+center_idx; pseq->center_index = center_idx; // saves cluster pseq->score = score; // saves score with the seed pseq->cluster_center = FALSE; } int64_t timevaldiff(struct timeval *starttime, struct timeval *finishtime) { int64_t msec; msec=(finishtime->tv_sec-starttime->tv_sec)*1000000; msec+=(finishtime->tv_usec-starttime->tv_usec)/1000000; return msec; } void computeOneSeed(void* c) { thread_control_t *control=(thread_control_t*)c; BOOL found; int32_t seed_number; int32_t nextone=control->n; int64_t elapsedtime; struct timeval current; struct timeval start; seed_number = control->next; found = FALSE; //printf("\n seed = %d, n = %d", seed_number, control->n); #ifdef OMP_SUPPORT omp_set_num_threads(control->threads_number); #endif gettimeofday(&start,NULL); #ifdef OMP_SUPPORT #pragma omp parallel default(none) \ firstprivate(found) \ firstprivate(seed_number) \ firstprivate(control) \ shared(nextone) #endif { int32_t i; double score; int32_t current_seed; #ifdef OMP_SUPPORT int thread_id=omp_get_thread_num(); #else int thread_id=0; #endif int nseq = control->n; BOOL fast = control->fast; BOOL lcsmode = control->lcsmode; int normalize = control->normalize; double threshold = control->threshold; BOOL first = TRUE; BOOL not_already_in_a_cluster; BOOL threshold_bad; int32_t priv_nextone=control->n; int32_t maxcount = (double)(control->db[seed_number]->count) * control->max_ratio; fastaSeqPtr* db = control->db; #ifdef OMP_SUPPORT #pragma omp for schedule(dynamic,10) #endif for (i=seed_number+1; \ i < nseq; \ i++) { current_seed = db[i]->center_index; not_already_in_a_cluster = current_seed == i; // At the beginning all the sequences are their own center if ((! fast) || not_already_in_a_cluster) { score = computeScore((void*)control, seed_number, i, thread_id,maxcount); // computes LCS score or 0 if k-mer filter not passed if (lcsmode || normalize) threshold_bad = (score < threshold); else threshold_bad = (score > threshold); if (threshold_bad) // similarity under threshold { if (!found && not_already_in_a_cluster && (i < priv_nextone)) { priv_nextone=i; // saves potential next seed // *potential_nexts_list = i; found = TRUE; // saves the fact that a next seed // has been found for this thread } } else if (not_already_in_a_cluster || \ ((! fast) && \ (db[i]->score < score))) { // if seq matching with current seed : // clustering with seed if seq doesn't belong to any cluster yet // OR in exact mode and the score is better with this seed if (! lcsmode && normalize) score = 1.0 - score; putSeqInClusterMT((void*)control, seed_number, i, score); // saves new seed for this seq } } // if ((! fast) || on_current_seed) } // for (i=seed_number+1;... #ifdef OMP_SUPPORT #pragma omp flush(nextone) #endif if (priv_nextone < nextone) #ifdef OMP_SUPPORT #pragma omp critical #endif if (priv_nextone < nextone) nextone=priv_nextone; } gettimeofday(¤t,NULL); elapsedtime = timevaldiff(&start,¤t); control->elapsedtime+=elapsedtime; control->next=nextone; if (control->next < (control->n)-1) (control->seeds_counter)++; else if (control->next == (control->n)-1) { control->stop = TRUE; (control->seeds_counter)++; } else if (control->next == control->n) control->stop = TRUE; } void initializeCentersAndScores(void *c) { // Initializing the scores table for each seq : thread_control_t *control = (thread_control_t*) c; int32_t i; fastaSeqPtr *db_i; int scoremax; if (control->normalize && control->lcsmode) scoremax = 1.0; else if (!control->lcsmode) scoremax = 0.0; else scoremax = (*(control->db))->length; for (i=0, db_i = control->db; i <= control->n-1; i++,db_i++) { (*db_i)->center = (control->db)+i; (*db_i)->center_index = i; (*db_i)->score = scoremax; (*db_i)->cluster_center = TRUE; } } void freeEverything(void *c) { thread_control_t *control=(thread_control_t*)c; int i; // free(control->potential_nexts_list); if ((control->reference == ALILEN) && (control->normalize || !control->lcsmode)) { for (i=0; i < control->threads_number; i++) free(control->addresses[i]); free(control->addresses); } free(control->iseqs1); free(control->iseqs2); } int mt_compare_sumaclust(fastaSeqPtr* db, int n, BOOL fast, double threshold, BOOL normalize, int reference, BOOL lcsmode, int threads_number, double max_ratio) { thread_control_t control; int32_t i; int lmax, lmin; if (lcsmode || normalize) fprintf(stderr,"Clustering sequences when similarity >= %lf\n", threshold); else fprintf(stderr,"Clustering sequences when distance <= %lf\n", threshold); fprintf(stderr,"Aligning and clustering... \n"); #ifdef OMP_SUPPORT control.threads_number = omp_get_max_threads(); #else control.threads_number = 1; #endif if (threads_number < control.threads_number) control.threads_number = threads_number; calculateMaxAndMinLen(db, n, &lmax, &lmin); control.addresses = (int16_t**) malloc(control.threads_number*sizeof(int16_t*)); control.iseqs1 = (int16_t**) malloc(control.threads_number*sizeof(int16_t*)); control.iseqs2 = (int16_t**) malloc(control.threads_number*sizeof(int16_t*)); for (i=0; i < control.threads_number; i++) control.sizeForSeqs = prepareTablesForSumathings(lmax, lmin, threshold, normalize, reference, lcsmode, (control.addresses)+i, (control.iseqs1)+i, (control.iseqs2)+i); control.db = db; control.next = 0; control.normalize = normalize; control.reference = reference; control.threshold = threshold; control.max_ratio = max_ratio; control.lcsmode = lcsmode; control.stop = FALSE; control.fast = fast; control.seeds_counter = 1; // control.potential_nexts_list = (int*) calloc(control.threads_number, sizeof(int)); control.n = n; if (lcsmode || normalize) control.worstscore = 0.0; else control.worstscore = lmax; control.elapsedtime=0; fprintf(stderr, "%d threads running\n", control.threads_number); // initialize scores table : initializeCentersAndScores(&control); while (control.stop == FALSE) { if ((control.next)%100 == 0) { float p = ((float)(control.next)/(float)n)*100; fprintf(stderr,"\rDone : %f %% ",p); } computeOneSeed(&control); } for (i=0; i < control.threads_number; i++) { free((*((control.iseqs1)+i))-(control.sizeForSeqs)+lmax); free((*((control.iseqs2)+i))-(control.sizeForSeqs)+lmax); } freeEverything(&control); fprintf(stderr,"\rDone : 100 %% %d clusters created. \n\n", control.seeds_counter); fprintf(stderr,"Pure computation time %f \n\n", (double)control.elapsedtime/1000000.); return(control.seeds_counter); } sumaclust_v1.0.36+ds/sumaclust.c0000644000175000017500000010553413645051131016224 0ustar pierrepierre/** * FileName: sumaclust.c * Author: Celine Mercier * Description: star clustering of DNA sequences * **/ #include #include #include #include #include #include #include "sumalibs/libutils/utilities.h" #include "sumalibs/libfasta/sequence.h" #include "sumalibs/libfasta/fasta_header_parser.h" #include "sumalibs/libfasta/fasta_header_handler.h" #include "sumalibs/libfasta/fasta_seq_writer.h" #include "sumalibs/liblcs/upperband.h" #include "sumalibs/liblcs/sse_banded_LCS_alignment.h" #include "mtcompare_sumaclust.h" #include "sumaclust.h" #define VERSION "1.0.36" /* ----------------------------------------------- */ /* printout help */ /* ----------------------------------------------- */ #define PP fprintf(stdout, static void PrintHelp() { PP "------------------------------------------------------------\n"); PP " SUMACLUST Version %s\n", VERSION); PP "------------------------------------------------------------\n"); PP " Synopsis : star clustering of sequences.\n"); PP " Usage: sumaclust [options] \n"); PP "------------------------------------------------------------\n"); PP " Options:\n"); PP " -h : [H]elp - print help\n\n"); PP " -l : Reference sequence length is the shortest. \n\n"); PP " -L : Reference sequence length is the largest. \n\n"); PP " -a : Reference sequence length is the alignment length (default). \n\n"); PP " -n : Score is normalized by reference sequence length (default).\n\n"); PP " -r : Raw score, not normalized. \n\n"); PP " -d : Score is expressed in distance (default : score is expressed in similarity). \n\n"); PP " -t ##.## : Score threshold for clustering. If the score is normalized and expressed in similarity (default),\n"); PP " it is an identity, e.g. 0.95 for an identity of 95%%. If the score is normalized\n"); PP " and expressed in distance, it is (1.0 - identity), e.g. 0.05 for an identity of 95%%.\n"); PP " If the score is not normalized and expressed in similarity, it is the length of the\n"); PP " Longest Common Subsequence. If the score is not normalized and expressed in distance,\n"); PP " it is (reference length - LCS length).\n"); PP " Only sequences with a similarity above ##.## with the center sequence of a cluster\n"); PP " are assigned to that cluster. Default: 0.97.\n\n"); PP " -e : Exact option : A sequence is assigned to the cluster with the center sequence presenting the\n"); PP " highest similarity score > threshold, as opposed to the default 'fast' option where a sequence is\n"); PP " assigned to the first cluster found with a center sequence presenting a score > threshold.\n\n"); PP " -R ## : Maximum ratio between the counts of two sequences so that the less abundant one can be considered\n"); PP " as a variant of the more abundant one. Default: 1.0.\n\n"); PP " -p ## : Multithreading with ## threads using openMP.\n\n"); PP " -s #### : Sorting by ####. Must be 'None' for no sorting, or a key in the fasta header of each sequence,\n"); PP " except for the count that can be computed (default : sorting by count).\n\n"); PP " -o : Sorting is in ascending order (default : descending).\n\n"); PP " -g : n's are replaced with a's (default: sequences with n's are discarded).\n\n"); PP " -B ### : Output of the OTU table in BIOM format is activated, and written to file ###.\n\n"); PP " -O ### : Output of the OTU map (observation map) is activated, and written to file ###.\n\n"); PP " -F ### : Output in FASTA format is written to file ### instead of standard output.\n\n"); PP " -f : Output in FASTA format is deactivated.\n"); PP "\n"); PP "------------------------------------------------------------\n"); PP " Argument : the nucleotide dataset to cluster (or nothing \n"); PP " if the standard input should be used). \n"); PP "------------------------------------------------------------\n"); PP " http://metabarcoding.org/sumaclust\n"); PP "------------------------------------------------------------\n\n"); } #undef PP /* ----------------------------------------------- */ /* printout usage and exit */ /* ----------------------------------------------- */ #define PP fprintf(stderr, static void ExitUsage(stat) int stat; { PP "usage: sumaclust [-l|L|a|n|r|d|e|o|g|f] [-t threshold_value] [-s sorting_key] [-R maximum_ratio] [-p number_of_threads]\n"); PP "[-B file_name_for_BIOM-formatted_output] [-O file_name_for_OTU_table-formatted_output] [-F file_name_for_FASTA-formatted_output] dataset\n"); PP "type \"sumaclust -h\" for help\n"); if (stat) exit(stat); } #undef PP static char* sortingKey="count"; static int sortSeqsP(const void **s1, const void **s2) { int res; double r1; double r2; r1 = atof(getItemFromHeader(sortingKey, ((fastaSeqPtr) *s2)->header)); r2 = atof(getItemFromHeader(sortingKey, ((fastaSeqPtr) *s2)->header)); if (r2 > r1) res = 1; else if (r2 < r1) res = -1; else res = 0; return(res); } static int reverseSortSeqsP(const void **s1, const void **s2) { int res; double r1; double r2; r1 = atof(getItemFromHeader(sortingKey, ((fastaSeqPtr) *s2)->header)); r2 = atof(getItemFromHeader(sortingKey, ((fastaSeqPtr) *s2)->header)); if (r1 > r2) res = 1; else if (r1 < r2) res = -1; else res = 0; return(res); } int uniqSeqsDoubleSortFunction(const void *s1, const void *s2) { int c; char* str_r1; double r1; double r2; c = strcmp(((fastaSeqPtr) s1)->sequence, ((fastaSeqPtr) s2)->sequence); if (c == 0) { str_r1 = getItemFromHeader(sortingKey, ((fastaSeqPtr) s1)->header); if (str_r1 == NULL) { fprintf(stderr, "\nERROR: '%s' not in sequence header(s).\n\n", sortingKey); exit(1); } r1 = atof(str_r1); r2 = atof(getItemFromHeader(sortingKey, ((fastaSeqPtr) s2)->header)); if (r2 > r1) c = 1; else if (r2 < r1) c = -1; else c = 0; } return(c); } int uniqSeqsDoubleReverseSortFunction(const void *s1, const void *s2) { int c; char* str_r1; double r1; double r2; c = strcmp(((fastaSeqPtr) s1)->sequence, ((fastaSeqPtr) s2)->sequence); if (c == 0) { str_r1 = getItemFromHeader(sortingKey, ((fastaSeqPtr) s1)->header); if (str_r1 == NULL) { fprintf(stderr, "\nERROR: '%s' not in sequence header(s).\n\n", sortingKey); exit(1); } r1 = atof(str_r1); r2 = atof(getItemFromHeader(sortingKey, ((fastaSeqPtr) s2)->header)); if (r1 > r2) c = 1; else if (r1 < r2) c = -1; else c = 0; } return(c); } void printInBIOMformat(fastaSeqPtr* uniqSeqs, int count, int numberOfCenters, char* biomFile_name) { int i, j, n; FILE* biomFile; struct tm* tm_info; time_t timer; char buffer_date[20]; fastaSeqPtr* c; fastaSeqPtr* seq; int id_len; int row_number; BOOL first_center = TRUE; int buffer_col_rows; int buffer_col_rows_1; int buffer_col_rows_2; buffer_col_rows = 29; buffer_col_rows_1 = 9; buffer_col_rows_2 = 20; n = 0; biomFile = fopen(biomFile_name, "w"); if (biomFile == NULL) fprintf(stderr, "\nCan't open BIOM output file.\n"); //, %s outputFilename); for (i=0; iaccession_id); j=0; if ((*seq)->cluster_center) // center sequence { n++; (*seq)->cluster_weight_unique_ids = 1; if (first_center) { (*seq)->columns_BIOM_size = id_len + buffer_col_rows; (*seq)->columns_BIOM = (char*) malloc(((*seq)->columns_BIOM_size)*sizeof(char)); strcpy((*seq)->columns_BIOM, "{\"id\": \""); first_center = FALSE; } else { (*seq)->columns_BIOM_size = id_len + buffer_col_rows + 1; (*seq)->columns_BIOM = (char*) malloc(((*seq)->columns_BIOM_size)*sizeof(char)); strcpy((*seq)->columns_BIOM, ",{\"id\": \""); } memcpy((*seq)->columns_BIOM + (*seq)->columns_BIOM_size - id_len - buffer_col_rows_2 - 1, (*seq)->accession_id, id_len); memcpy((*seq)->columns_BIOM + (*seq)->columns_BIOM_size - buffer_col_rows_2 - 1, "\", \"metadata\": null}", buffer_col_rows_2+1); if ((*seq)->next != NULL) // not last sequence { for (j=1; ((((*seq)+j)->next != NULL) && (((*seq)+j)->uniqHead == FALSE)); j++) // identical sequences { id_len = strlen((*(seq)+j)->accession_id); n++; (*seq)->cluster_weight_unique_ids++; (*seq)->columns_BIOM_size = (*seq)->columns_BIOM_size + id_len + buffer_col_rows; (*seq)->columns_BIOM = realloc((*seq)->columns_BIOM, ((*seq)->columns_BIOM_size) * sizeof(char)); memcpy((*seq)->columns_BIOM + (*seq)->columns_BIOM_size - buffer_col_rows - id_len - 1, ",{\"id\": \"", buffer_col_rows_1); memcpy((*seq)->columns_BIOM + (*seq)->columns_BIOM_size - id_len - buffer_col_rows_2 - 1, (*(seq)+j)->accession_id, id_len); memcpy((*seq)->columns_BIOM + (*seq)->columns_BIOM_size - buffer_col_rows_2 - 1, "\", \"metadata\": null}", buffer_col_rows_2+1); } if ((((*seq)+j)->next == NULL) && (((*seq)+j)->uniqHead == FALSE)) // last sequence { id_len = strlen((*(seq)+j)->accession_id); n++; (*seq)->cluster_weight_unique_ids++; (*seq)->columns_BIOM_size = (*seq)->columns_BIOM_size + id_len + buffer_col_rows; (*seq)->columns_BIOM = realloc((*seq)->columns_BIOM, ((*seq)->columns_BIOM_size) * sizeof(char)); memcpy((*seq)->columns_BIOM + (*seq)->columns_BIOM_size - buffer_col_rows - id_len - 1, ",{\"id\": \"", buffer_col_rows_1); memcpy((*seq)->columns_BIOM + (*seq)->columns_BIOM_size - id_len - buffer_col_rows_2 - 1, (*(seq)+j)->accession_id, id_len); memcpy((*seq)->columns_BIOM + (*seq)->columns_BIOM_size - buffer_col_rows_2 - 1, "\", \"metadata\": null}", buffer_col_rows_2+1); } } } else // not a center sequence { n++; c = (*seq)->center; id_len = strlen((*seq)->accession_id); n++; (*c)->cluster_weight_unique_ids++; (*c)->columns_BIOM_size = (*c)->columns_BIOM_size + id_len + buffer_col_rows; (*c)->columns_BIOM = realloc((*c)->columns_BIOM, ((*c)->columns_BIOM_size) * sizeof(char)); memcpy((*c)->columns_BIOM + (*c)->columns_BIOM_size - buffer_col_rows - id_len - 1, ",{\"id\": \"", buffer_col_rows_1); memcpy((*c)->columns_BIOM + (*c)->columns_BIOM_size - id_len - buffer_col_rows_2 - 1, (*seq)->accession_id, id_len); memcpy((*c)->columns_BIOM + (*c)->columns_BIOM_size - buffer_col_rows_2 - 1, "\", \"metadata\": null}", buffer_col_rows_2+1); if ((*seq)->next != NULL) // not last sequence { for (j=1; ((((*seq)+j)->next != NULL) && (((*seq)+j)->uniqHead == FALSE)); j++) // identical sequences { id_len = strlen((*(seq)+j)->accession_id); n++; (*c)->cluster_weight_unique_ids++; (*c)->columns_BIOM_size = (*c)->columns_BIOM_size + id_len + buffer_col_rows; (*c)->columns_BIOM = realloc((*c)->columns_BIOM, ((*c)->columns_BIOM_size) * sizeof(char)); memcpy((*c)->columns_BIOM + (*c)->columns_BIOM_size - buffer_col_rows - id_len - 1, ",{\"id\": \"", buffer_col_rows_1); memcpy((*c)->columns_BIOM + (*c)->columns_BIOM_size - id_len - buffer_col_rows_2 - 1, (*(seq)+j)->accession_id, id_len); memcpy((*c)->columns_BIOM + (*c)->columns_BIOM_size - buffer_col_rows_2 - 1, "\", \"metadata\": null}", buffer_col_rows_2+1); } if ((((*seq)+j)->next == NULL) && (((*seq)+j)->uniqHead == FALSE)) // last sequence { id_len = strlen((*(seq)+j)->accession_id); n++; (*c)->cluster_weight_unique_ids++; (*c)->columns_BIOM_size = (*c)->columns_BIOM_size + id_len + buffer_col_rows; (*c)->columns_BIOM = realloc((*c)->columns_BIOM, ((*c)->columns_BIOM_size) * sizeof(char)); memcpy((*c)->columns_BIOM + (*c)->columns_BIOM_size - buffer_col_rows - id_len - 1, ",{\"id\": \"", buffer_col_rows_1); memcpy((*c)->columns_BIOM + (*c)->columns_BIOM_size - id_len - buffer_col_rows_2 - 1, (*(seq)+j)->accession_id, id_len); memcpy((*c)->columns_BIOM + (*c)->columns_BIOM_size - buffer_col_rows_2 - 1, "\", \"metadata\": null}", buffer_col_rows_2+1); } } } } time(&timer); tm_info = localtime(&timer); strftime(buffer_date, 20, "%Y-%m-%dT%H:%M:%S", tm_info); fprintf(biomFile, "{\"id\": \"None\",\"format\": \"Biological Observation Matrix 1.0.0\"," "\"format_url\": \"http://biom-format.org\",\"type\": \"OTU table\"," "\"generated_by\": \"SUMACLUST %s\",\"date\": \"%s\",\"matrix_type\": \"sparse\"," "\"matrix_element_type\": \"int\",\"shape\": [%d, %d],", VERSION, buffer_date, numberOfCenters, n); // print data row_number = 0; n = 0; fprintf(biomFile, "\"data\": ["); for (i=0; icluster_center) // center sequence { for (j=0; j<(*seq)->cluster_weight_unique_ids; j++) { if ((row_number == (numberOfCenters - 1)) && (j == ((*seq)->cluster_weight_unique_ids - 1))) // last seq to print fprintf(biomFile, "[%d,%d,1]],", row_number, n); else fprintf(biomFile, "[%d,%d,1],", row_number, n); n++; } row_number++; } } // end data // Print rows first_center = TRUE; for (i=0; icluster_center) // center sequence { if (first_center) { fprintf(biomFile, "\"rows\": [{\"id\": \"%s\", \"metadata\": null}", (*seq)->accession_id); first_center = FALSE; } else fprintf(biomFile, ",{\"id\": \"%s\", \"metadata\": null}", (*seq)->accession_id); } } // Print columns fprintf(biomFile, "],\"columns\": ["); for (i=0; icluster_center) // center sequence fprintf(biomFile, (*seq)->columns_BIOM); } fprintf(biomFile, "]}"); fclose(biomFile); } void printInOTUtableFormat(fastaSeqPtr* uniqSeqs, int count, char* OTUtableFile_name) { int i, j; FILE* OTUtableFile; fastaSeqPtr* c; fastaSeqPtr* seq; int id_len; OTUtableFile = fopen(OTUtableFile_name, "w"); if (OTUtableFile == NULL) fprintf(stderr, "\nCan't open OTU table output file.\n"); //, %s outputFilename); for (i=0; iaccession_id); j=0; if ((*seq)->cluster_center) // center sequence { (*seq)->line_OTU_table_size = id_len*2 + 2; (*seq)->line_OTU_table = (char*) malloc(((*seq)->line_OTU_table_size)*sizeof(char)); strcpy((*seq)->line_OTU_table, (*seq)->accession_id); memcpy((*seq)->line_OTU_table + (*seq)->line_OTU_table_size - id_len - 2, "\t", 1); memcpy((*seq)->line_OTU_table + (*seq)->line_OTU_table_size - id_len - 1, (*seq)->accession_id, id_len); memcpy((*seq)->line_OTU_table + (*seq)->line_OTU_table_size - 1, "\0", 1); if ((*seq)->next != NULL) // not last sequence { for (j=1; ((((*seq)+j)->next != NULL) && (((*seq)+j)->uniqHead == FALSE)); j++) // identical sequences { id_len = strlen((*(seq)+j)->accession_id); (*seq)->line_OTU_table_size = (*seq)->line_OTU_table_size + id_len + 1; (*seq)->line_OTU_table = realloc((*seq)->line_OTU_table, ((*seq)->line_OTU_table_size) * sizeof(char)); memcpy((*seq)->line_OTU_table + (*seq)->line_OTU_table_size - id_len - 2, "\t", 1); memcpy((*seq)->line_OTU_table + (*seq)->line_OTU_table_size - id_len - 1, (*(seq)+j)->accession_id, id_len); memcpy((*seq)->line_OTU_table + (*seq)->line_OTU_table_size - 1, "\0", 1); } if ((((*seq)+j)->next == NULL) && (((*seq)+j)->uniqHead == FALSE)) // last sequence { id_len = strlen((*(seq)+j)->accession_id); (*seq)->line_OTU_table_size = (*seq)->line_OTU_table_size + id_len + 1; (*seq)->line_OTU_table = realloc((*seq)->line_OTU_table, ((*seq)->line_OTU_table_size) * sizeof(char)); memcpy((*seq)->line_OTU_table + (*seq)->line_OTU_table_size - id_len - 2, "\t", 1); memcpy((*seq)->line_OTU_table + (*seq)->line_OTU_table_size - id_len - 1, (*(seq)+j)->accession_id, id_len); memcpy((*seq)->line_OTU_table + (*seq)->line_OTU_table_size - 1, "\0", 1); } } } else // not a center sequence { c = (*seq)->center; (*c)->line_OTU_table_size = (*c)->line_OTU_table_size + id_len + 1; (*c)->line_OTU_table = realloc((*c)->line_OTU_table, ((*c)->line_OTU_table_size) * sizeof(char)); memcpy((*c)->line_OTU_table + (*c)->line_OTU_table_size - id_len - 2, "\t", 1); memcpy((*c)->line_OTU_table + (*c)->line_OTU_table_size - id_len - 1, (*seq)->accession_id, id_len); memcpy((*c)->line_OTU_table + (*c)->line_OTU_table_size - 1, "\0", 1); if ((*seq)->next != NULL) // not last sequence { for (j=1; ((((*seq)+j)->next != NULL) && (((*seq)+j)->uniqHead == FALSE)); j++) // identical sequences { id_len = strlen((*(seq)+j)->accession_id); (*c)->line_OTU_table_size = (*c)->line_OTU_table_size + id_len + 1; (*c)->line_OTU_table = realloc((*c)->line_OTU_table, ((*c)->line_OTU_table_size) * sizeof(char)); memcpy((*c)->line_OTU_table + (*c)->line_OTU_table_size - id_len - 2, "\t", 1); memcpy((*c)->line_OTU_table + (*c)->line_OTU_table_size - id_len - 1, (*(seq)+j)->accession_id, id_len); memcpy((*c)->line_OTU_table + (*c)->line_OTU_table_size - 1, "\0", 1); } if ((((*seq)+j)->next == NULL) && (((*seq)+j)->uniqHead == FALSE)) // last sequence { id_len = strlen((*(seq)+j)->accession_id); (*c)->line_OTU_table_size = (*c)->line_OTU_table_size + id_len + 1; (*c)->line_OTU_table = realloc((*c)->line_OTU_table, ((*c)->line_OTU_table_size) * sizeof(char)); memcpy((*c)->line_OTU_table + (*c)->line_OTU_table_size - id_len - 2, "\t", 1); memcpy((*c)->line_OTU_table + (*c)->line_OTU_table_size - id_len - 1, (*(seq)+j)->accession_id, id_len); memcpy((*c)->line_OTU_table + (*c)->line_OTU_table_size - 1, "\0", 1); } } } } // Print rows for (i=0; icluster_center) // center sequence { fprintf(OTUtableFile, (*seq)->line_OTU_table); fprintf(OTUtableFile, "\n"); } } fclose(OTUtableFile); } void printSeq(fastaSeqPtr* seq, fastaSeqPtr* center, double score, FILE* output) { int i; char* score_n; char* score_v; char* cluster_n; char* cluster_v; char* center_n; char* center_true; char* center_false; int id_size; score_n = (char*) malloc(14*sizeof(char)); score_v = (char*) malloc(20*sizeof(char)); strcpy(score_n, "cluster_score"); sprintf(score_v,"%f", score); id_size = strlen((*center)->accession_id); cluster_n = (char*) malloc(8*sizeof(char)); cluster_v = (char*) malloc((id_size+1)*sizeof(char)); strcpy(cluster_n, "cluster"); strcpy(cluster_v, (*center)->accession_id); center_n = (char*) malloc(15*sizeof(char)); strcpy(center_n, "cluster_center"); center_true = (char*) malloc(5*sizeof(char)); strcpy(center_true, "True"); center_false = (char*) malloc(6*sizeof(char)); strcpy(center_false, "False"); (*seq)->header = table_header_add_field((*seq)->header, cluster_n, cluster_v); (*seq)->header = table_header_add_field((*seq)->header, score_n, score_v); if ((*seq)->cluster_center) (*seq)->header = table_header_add_field((*seq)->header, center_n, center_true); else (*seq)->header = table_header_add_field((*seq)->header, center_n, center_false); printOnlyHeaderFromTable((*seq)->header, output); printOnlySeqFromFastaSeqPtr((*seq), output); if ((*seq)->next != NULL) { for (i=1; ((((*seq)+i)->next != NULL) && (((*seq)+i)->uniqHead == FALSE)); i++) { ((*seq)+i)->header = table_header_add_field(((*seq)+i)->header, cluster_n, cluster_v); ((*seq)+i)->header = table_header_add_field(((*seq)+i)->header, score_n, score_v); ((*seq)+i)->header = table_header_add_field(((*seq)+i)->header, center_n, center_false); printOnlyHeaderFromTable(((*seq)+i)->header, output); printOnlySeqFromFastaSeqPtr(((*seq)+i), output); } if ((((*seq)+i)->next == NULL) && (((*seq)+i)->uniqHead == FALSE)) // last sequence { ((*seq)+i)->header = table_header_add_field(((*seq)+i)->header, cluster_n, cluster_v); ((*seq)+i)->header = table_header_add_field(((*seq)+i)->header, score_n, score_v); ((*seq)+i)->header = table_header_add_field(((*seq)+i)->header, center_n, center_false); printOnlyHeaderFromTable(((*seq)+i)->header, output); printOnlySeqFromFastaSeqPtr(((*seq)+i), output); } } } void putSeqInCluster(fastaSeqPtr* seq, fastaSeqPtr* center, double score) { (*seq)->center = center; (*seq)->score = score; } int compare(fastaSeqPtr* db, int n, BOOL fastOption, double threshold, BOOL normalize, int reference, BOOL lcsmode, double max_ratio) { double score; double scoremax; double worstscore; BOOL toCluster; static BOOL first=TRUE; int32_t i,j,k; int center; float p; BOOL found; int lmax, lmin; int16_t* address; int16_t* iseq1; int16_t* iseq2; int l1; int l2; char* s1; char* s2; int sizeForSeqs; int LCSmin; if (lcsmode || normalize) fprintf(stderr,"Clustering sequences when similarity >= %lf\n", threshold); else fprintf(stderr,"Clustering sequences when distance <= %lf\n", threshold); fprintf(stderr,"Aligning and clustering... \n"); int* centers = (int*) malloc(n * sizeof(int)); for (i=0; i < n; i++) centers[i] = -1; k=0; found = FALSE; calculateMaxAndMinLen(db, n, &lmax, &lmin); sizeForSeqs = prepareTablesForSumathings(lmax, lmin, threshold, normalize, reference, lcsmode, &address, &iseq1, &iseq2); if (lcsmode || normalize) worstscore = 0.0; else worstscore = lmax; for (i=0; i < n; i++) { if (i%100 == 0) { p = (i/(float)n)*100; fprintf(stderr,"\rDone : %f %% %d clusters created",p,k); } if (first) { first = FALSE; if (normalize && lcsmode) score = 1.0; else if (!lcsmode) score = 0.0; else score = (*(db+i))->length; (*(db+i))->cluster_center = TRUE; putSeqInCluster(db+i, db+i, score); centers[k] = i; k++; } else { scoremax = worstscore; center = 0; found = FALSE; toCluster = FALSE; j=0; s1 = (*(db+i))->sequence; l1 = (*(db+i))->length; while (((found == FALSE) && (centers[j] != -1) && (fastOption == TRUE)) || ((fastOption == FALSE) && (centers[j] != -1))) { score = worstscore; if ((double) ((*(db+i))->count) / (double) ((*(db+centers[j]))->count) <= max_ratio) { filters((*(db+i)), (*(db+centers[j])), threshold, normalize, reference, lcsmode, &score, &LCSmin); } if (score == -1.0) { s2 = (*(db+centers[j]))->sequence; l2 = (*(db+centers[j]))->length; score = alignForSumathings(s1, iseq1, s2, iseq2, l1, l2, normalize, reference, lcsmode, address, sizeForSeqs, LCSmin); } if (((score >= threshold) && (lcsmode || normalize) && (score > scoremax)) || ((!lcsmode && !normalize) && (score <= threshold) && (score < scoremax))) { toCluster = TRUE; scoremax = score; center = centers[j]; if (fastOption == TRUE) found = TRUE; } j++; } if (toCluster) { if (!lcsmode && normalize) scoremax = 1.0 - scoremax; (*(db+i))->cluster_center = FALSE; putSeqInCluster(db+i, db+center, scoremax); } else { if (normalize && lcsmode) score = 1.0; else if (!lcsmode) score = 0.0; else score = (*(db+i))->length; (*(db+i))->cluster_center = TRUE; putSeqInCluster(db+i, db+i, score); centers[k] = i; k++; } } } fprintf(stderr,"\rDone : 100 %% %d clusters created. \n",k); free(centers); free(iseq1-sizeForSeqs+lmax); free(iseq2-sizeForSeqs+lmax); if (normalize && (reference == ALILEN)) free(address); return(k); } void computeClusterWeights(fastaSeqPtr* uniqSeqs, int n) { int i,j; fastaSeqPtr* seq; fastaSeqPtr* center; char* cluster_weight_n; char* cluster_weight_v; int cluster_weight; for (i=0; icluster_center) (*seq)->cluster_weight = (*seq)->count; else { center = (*seq)->center; ((*center)->cluster_weight)+=(*seq)->count; } } for (i=0; icluster_center) cluster_weight = (*seq)->cluster_weight; else { center = (*seq)->center; cluster_weight = (*center)->cluster_weight; } cluster_weight_n = (char*) malloc(15*sizeof(char)); cluster_weight_v = (char*) malloc(20*sizeof(char)); strcpy(cluster_weight_n, "cluster_weight"); sprintf(cluster_weight_v,"%d", cluster_weight); (*seq)->header = table_header_add_field((*seq)->header, cluster_weight_n, cluster_weight_v); if ((*seq)->next != NULL) // not the last sequence { for (j=1; ((((*seq)+j)->next != NULL) && (((*seq)+j)->uniqHead == FALSE)); j++) (*(seq)+j)->header = table_header_add_field((*(seq)+j)->header, cluster_weight_n, cluster_weight_v); if ((((*seq)+j)->next == NULL) && (((*seq)+j)->uniqHead == FALSE)) // last sequence (*(seq)+j)->header = table_header_add_field((*(seq)+j)->header, cluster_weight_n, cluster_weight_v); } } } int main(int argc, char** argv) { int32_t carg = 0; int32_t errflag = 0; char* sort; double threshold = 0.97; double max_ratio = 1.0; BOOL lcsmode = TRUE; BOOL fastOption = TRUE; BOOL normalize = TRUE; BOOL reverse = FALSE; BOOL onlyATGC = TRUE; int reference = ALILEN; int nproc = 1; BOOL printBIOM = FALSE; BOOL printOTUtable = FALSE; BOOL printFASTA = TRUE; BOOL printFASTAtofile = FALSE; FILE* FASTA_output = stdout; fastaSeqCount db; int i,n; fastaSeqPtr* uniqSeqs; char* biomFile_name; char* OTUtableFile_name; char* FASTA_file_name; int numberOfCenters; sort = malloc(1024*sizeof(char)); strcpy(sort, "count"); biomFile_name = malloc(1024*sizeof(char)); OTUtableFile_name = malloc(1024*sizeof(char)); FASTA_file_name = malloc(1024*sizeof(char)); while ((carg = getopt(argc, argv, "hlLanrdet:p:s:ogB:O:R:fF:")) != -1) { switch (carg) { /* -------------------- */ case 'h': /* help */ /* -------------------- */ PrintHelp(); exit(0); break; /* -------------------------------------------------- */ case 'l': /* Normalize LCS/Error by the shortest sequence length*/ /* -------------------------------------------------- */ reference=MINLEN; break; /* -------------------------------------------------- */ case 'L': /* Normalize LCS/Error by the largest sequence length */ /* -------------------------------------------------- */ reference=MAXLEN; break; /* -------------------------------------------------- */ case 'a': /* Normalize LCS/Error by the alignment length */ /* -------------------------------------------------- */ reference=ALILEN; break; /* -------------------------------------------------- */ case 'n': /* Normalize LCS by the reference length */ /* -------------------------------------------------- */ normalize=TRUE; break; /* -------------------------------------------------- */ case 'r': /* No normalization */ /* -------------------------------------------------- */ normalize=FALSE; break; /* -------------------------------------------------- */ case 'd': /* Score is expressed in distance */ /* -------------------------------------------------- */ lcsmode=FALSE; break; /* ---------------------------------------------------------------------------------------------------------- */ case 'e': /* center with the best score > threshold is chosen, otherwise first center with a score > threshold */ /* ---------------------------------------------------------------------------------------------------------- */ fastOption=FALSE; break; /* ------------------------------------------------------------------- */ case 't': /* Clusters only pairs with similarity higher than (threshold) */ /* ------------------------------------------------------------------- */ sscanf(optarg,"%lf",&threshold); break; /* ------------------------------------------------------------------- */ case 'R': /* maximum ratio between counts of two sequences connected by an edge */ /* ------------------------------------------------------------------- */ sscanf(optarg,"%lf",&max_ratio); break; /* -------------------------------------------------- */ case 'p': /* number of processors to use */ /* -------------------------------------------------- */ sscanf(optarg,"%d",&nproc); break; /* -------------------------------------------------- */ case 's': /* Sorting option */ /* -------------------------------------------------- */ sscanf(optarg, "%s", sort); sortingKey = sort; break; /* -------------------------------------------------- */ case 'o': /* reverse sorting */ /* -------------------------------------------------- */ reverse=TRUE; break; /* -------------------------------------------------- */ case 'g': /* replace n's with a's in sequences */ /* -------------------------------------------------- */ onlyATGC=FALSE; break; /* -------------------------------------------------- */ case 'B': /* file name to print results in BIOM format */ /* -------------------------------------------------- */ sscanf(optarg, "%s", biomFile_name); printBIOM=TRUE; break; /* -------------------------------------------------- */ case 'O': /* file name to print results in OTU table format */ /* -------------------------------------------------- */ sscanf(optarg, "%s", OTUtableFile_name); printOTUtable=TRUE; break; /* -------------------------------------------------- */ case 'f': /* don't print results in FASTA format */ /* -------------------------------------------------- */ printFASTA=FALSE; break; /* ---------------------------------------------- */ case 'F': /* file name to print results in FASTA format */ /* ---------------------------------------------- */ sscanf(optarg, "%s", FASTA_file_name); printFASTAtofile=TRUE; break; case '?': /* invalid option */ errflag++; break; } } if (errflag) ExitUsage(errflag); fprintf(stderr,"===========================================================\n"); fprintf(stderr," SUMACLUST version %s\n",VERSION); #ifdef __SSE2__ fprintf(stderr," Alignment using SSE2 instructions.\n"); #else fprintf(stderr," Alignment using standard code, SSE2 unavailable.\n"); #endif fprintf(stderr,"===========================================================\n"); if ((threshold == 0.0) || (normalize && (threshold > 1.0))) { fprintf(stderr, "\nERROR: Please specify a threshold > 0, and < 1 when scores are normalized.\n\n"); exit(1); } fprintf(stderr,"Reading dataset..."); db = seq_readAllSeq2(argv[optind], TRUE, onlyATGC); fprintf(stderr,"\n%d sequences\n",db.count); if (db.count == 0) { fprintf(stderr, "\nNo valid sequences. Exiting program.\n\n"); exit(1); } if (!onlyATGC) (void)cleanDB(db); if (!lcsmode && normalize) threshold = 1.0 - threshold; if (threshold > 0) (void)hashDB(db); addCounts(&db); // first sorting of sequences to have good unique heads if ((strcmp(sortingKey, "None") != 0) && (strcmp(sortingKey, "none") != 0)) { if (reverse == FALSE) qsort((void*) db.fastaSeqs, db.count, sizeof(fastaSeq), uniqSeqsDoubleSortFunction); else qsort((void*) db.fastaSeqs, db.count, sizeof(fastaSeq), uniqSeqsDoubleReverseSortFunction); } // getting the vector of unique seqs uniqSeqs = (fastaSeqPtr*) malloc((db.count)*sizeof(fastaSeqPtr)); n = uniqSeqsVector(&db, &uniqSeqs); uniqSeqs = realloc(uniqSeqs, n*sizeof(fastaSeqPtr)); // putting a flag on the last sequence for (i=0; i<(db.count-1); i++) ((db.fastaSeqs)+i)->next = (db.fastaSeqs)+i-1; ((db.fastaSeqs)+(db.count)-1)->next = NULL; // sorting unique sequences if (strcmp(sortingKey, "count") == 0) { fprintf(stderr,"Sorting sequences by count...\n", n); if (reverse == FALSE) qsort((void*) uniqSeqs, n, sizeof(fastaSeqPtr), sortSeqsWithCounts); else qsort((void*) uniqSeqs, n, sizeof(fastaSeqPtr), reverseSortSeqsWithCounts); } else if ((strcmp(sortingKey, "None") != 0) && (strcmp(sortingKey, "none") != 0)) { fprintf(stderr,"Sorting sequences by %s...\n", sortingKey); if (reverse == FALSE) qsort((void*) uniqSeqs, n, sizeof(fastaSeqPtr), sortSeqsP); else qsort((void*) uniqSeqs, n, sizeof(fastaSeqPtr), reverseSortSeqsP); } if (max_ratio > 0) fprintf(stderr,"Maximum ratio between the counts of two sequences to connect them: %lf\n", max_ratio); // Computing if (nproc==1) numberOfCenters = compare(uniqSeqs, n, fastOption, threshold, normalize, reference, lcsmode, max_ratio); else numberOfCenters = mt_compare_sumaclust(uniqSeqs, n, fastOption, threshold, normalize, reference, lcsmode, nproc, max_ratio); // Computing cluster weights computeClusterWeights(uniqSeqs, n); // Printing results // FASTA file if (printFASTA) { if (printFASTAtofile) { FASTA_output = fopen(FASTA_file_name, "w"); if (FASTA_output == NULL) fprintf(stderr, "\nCan't open FASTA output file.\n"); //, %s outputFilename); } for (i=0; icenter, (*(uniqSeqs+i))->score, FASTA_output); } fprintf(stderr,"Done.\n"); } // BIOM file if (printBIOM) { fprintf(stderr,"Printing results in BIOM format...\n"); printInBIOMformat(uniqSeqs, n, numberOfCenters, biomFile_name); fprintf(stderr,"Done.\n"); } // OTU table file if (printOTUtable) { fprintf(stderr,"Printing results in OTU table format...\n"); printInOTUtableFormat(uniqSeqs, n, OTUtableFile_name); fprintf(stderr,"Done.\n"); } // Freeing for (i=0; i < db.count; i++) { free(((db.fastaSeqs)[i]).table); free_header_table(((db.fastaSeqs)[i]).header); } free(db.fastaSeqs); free(sort); free(uniqSeqs); return(0); } sumaclust_v1.0.36+ds/sumaclust_user_manual.md0000644000175000017500000002416513447147451021010 0ustar pierrepierre# Sumaclust: fast and exact clustering of sequences [metabarcoding.org/sumaclust](metabarcoding.org/sumaclust) ## Introduction With the development of next-generation sequencing, efficient tools are needed to handle millions of sequences in reasonable amounts of time. Sumaclust is a program developed by the [LECA](http://www-leca.ujf-grenoble.fr/?lang=en). Sumaclust aims to cluster sequences in a way that is fast and exact at the same time. This tool has been developed to be adapted to the type of data generated by DNA metabarcoding, i.e. entirely sequenced, short markers. Sumaclust clusters sequences using the same clustering algorithm as UCLUST and CD-HIT. This algorithm is mainly useful to detect the 'erroneous' sequences created during amplification and sequencing protocols, deriving from 'true' sequences. Currently, Sumaclust is available as a program that you can download and install on Unix-like machines. ## Download and installation of Sumaclust ### Download Sumaclust can be downloaded from the metabarcoding.org GitLab. The archive of the latest tagged version can be downloaded on the GitLab wiki page: [https://git.metabarcoding.org/obitools/sumaclust/wikis/home](https://git.metabarcoding.org/obitools/sumaclust/wikis/home) The versions downloaded this way are for Unix-like systems compatible with SIMD SSE2 instructions and POSIX threads. Pre-compiled versions of GCC for OS X can be found [here](http://hpc.sourceforge.net/), that might be helpful if you encounter problems compiling the programs. Send an email at for other versions, or if you have any inquiries. ### Installation Untar the archive, go into the newly created directory and compile: ``` tar –zxvf sumaclust_v[x.x.xx].tar.gz cd sumaclust_v[x.x.xx] make -C sumalibs install make install ``` You can compile Sumaclust with `clang`, which deactivates `OpenMP`, with: ``` make CC=clang ``` ## Documentation Sumaclust clusters sequences using the same clustering algorithm as UCLUST and CD-HIT. This algorithm is mainly useful to detect the "erroneous" sequences created during amplification and sequencing protocols, deriving from "true" sequences. ### Using Sumaclust #### Input The input can be either the standard input (stdin), or a file in FASTA format. #### Usage ``` sumaclust [-l|L|a|n|r|d|e|o|g|f] [-t threshold_value] [-s sorting_key] [-R maximum_ratio] [-p number_of_threads] [-B file_name_for_BIOM-formatted_output] [-O file_name_for_OTU_table-formatted_output] [-F file_name_for_FASTA-formatted_output] [dataset] ``` Argument: the sequence dataset to cluster. For help : ``` sumaclust -h ``` #### Examples ``` sumaclust -t 0.97 my_dataset.fasta > clusters_of_seqs_with_similarity_>_97%.fasta ``` ``` sumaclust -d -r -t 2 my_dataset.fasta > clusters_of_seqs_with_distance_<=_2_differences.fasta ``` #### Options ``` -h : [H]elp - print the help -l : Reference sequence length is the shortest. -L : Reference sequence length is the largest. -a : Reference sequence length is the alignment length (default). -n : Score is normalized by reference sequence length (default). -r : Raw score, not normalized. -d : Score is expressed in distance (default : score is expressed in similarity). -t ##.## : Score threshold for clustering. If the score is normalized and expressed in similarity (default), it is an identity, e.g. 0.95 for an identity of 95%. If the score is normalized and expressed in distance, it is (1.0 - identity), e.g. 0.05 for an identity of 95%. If the score is not normalized and expressed in similarity, it is the length of the Longest Common Subsequence. If the score is not normalized and expressed in distance, it is (reference length - LCS length). Only sequences with a similarity above ##.## with the representative sequence of a cluster are assigned to that cluster. Default: 0.97. -e : Exact option : A sequence is assigned to the cluster with the representative sequence presenting the highest similarity score > threshold, as opposed to the default 'fast' option where a sequence is assigned to the first cluster found with a representative sequence presenting a score > threshold. -R ## : Maximum ratio between the counts of two sequences so that the less abundant one can be considered as a variant of the more abundant one. Default: 1.0. -p ## : Multithreading with ## threads using openMP. -s #### : Sorting by ####. Must be 'None' for no sorting, or a key in the fasta header of each sequence, except for the count that can be computed (default : sorting by count). -o : Sorting is in ascending order (default: descending). -g : n's are replaced with a's (default: sequences with n's are discarded). -B ### : Output of the OTU table in BIOM format is activated, and written to file ###. -O ### : Output of the OTU map (observation map) is activated, and written to file ###. -F ### : Output in FASTA format is written to file ### instead of standard output. -f : Output in FASTA format is deactivated. ``` #### Output Sumaclust's default output is in fasta format. There are four fields added in the headers of all sequences. Those fields are of the form [key=value;]. The four keys are `cluster`, `cluster_score`, `cluster_center` and `cluster_weight` and their values correspond respectively to the identifier of the center of the sequence's cluster, the similarity score of the sequence with this center, a boolean indicating whether the sequence is the center of its cluster, and the total number of sequences in the cluster to which the sequence belongs. Example where `seq_1` is a cluster center and `seq_2` is clustered with `seq_1`: ``` >seq_1 species=Heracleum maximum; count=3; cluster=seq_1; cluster_score=1.0; cluster_center=True; cluster_weight=5; atcctattttccaaaaacaaacaaaggcccagaaggtgaaaaaag >seq_2 species=Cnidium cnidiifolium; count=2; cluster=seq_1; cluster_score=0.955556; cluster_center=False; cluster_weight=5; atcctattttccaaaaacaacaaaggcccataaggtgaaaaaag ``` There is a possibility to print the clusters in BIOM format with the `–B` option, and/or in OTU map (observation map) format with the `–O` option. The FASTA output can then be deactivated with the `–f` option. The FASTA output is written to the standard output by default, but can be written to a file using the `–F` option. In the following examples, the first one prints results in FASTA and BIOM formats, and the second one prints results in BIOM and OTU map formats: ``` sumaclust -B clusters_of_seqs_with_similarity_>_97%.biom my_dataset.fasta > clusters_of_seqs_with_similarity_>_97%.fasta ``` ``` sumaclust -F -B clusters_of_seqs_with_similarity_>_97%.biom -O clusters_of_seqs_with_similarity_>_97%.txt my_dataset.fasta ``` ### How SUMACLUST works #### Clustering algorithm Sumaclust clusters sequences using the same clustering algorithm as UCLUST and CD-HIT. The problem is defined as follows: Sumaclust browses through the dataset, in the order in which the sequences have been sorted with the -s option. By default, sequences are sorted by decreasing abundance, because this enables to identify 'true' and 'erroneous' sequences the best, as 'true' sequences tend to end up as cluster centers. The first sequence of the ordered list is considered the center of the first cluster. Each sequence, following the ordered list, is compared with the centers of the existing clusters, respecting the initial list's order. If the similarity of the query sequence with a center is above a chosen threshold, and their abundance ratio is below the maximum ratio chosen, the sequence is grouped in the cluster of this center. Otherwise, a new cluster is created with the query sequence as the center. #### About the abundance ratio An edge is created between a query sequence and a center sequence only if their abundance ratio, i.e. the query sequence’s count divided by the center sequence’s count, is below the maximum ratio chosen with the `–R` option. This can prevent sequences that are very abundant, and therefore likely true sequences, to be considered a variant of another true sequence that is only a little more abundant and very close to them. #### Similarity computation ##### Similarity indice A good way to evaluate the similarities between full-length sequences is to use indices based on the length of the Longest Common Subsequence (LCS), and in particular, a good similarity indice is the length of the LCS divided by the length of the shortest alignment representing this LCS, giving an identity percentage. This is the similarity indice used by Sumatra by default. Other similarity indices are available through the options. ##### Fast computation of the similarity *Lossless k-mer filter.* Since we are usually interested in higly similar sequences, Sumatra uses similarity thresholds under which similarities are not reported. A lossless filtering step enables to only align couples of sequences that potentially have an identity greater than the chosen threshold. This filter is based on the number of overlapping k-mers that the sequences must share in order to have an identity at least equal to the threshold. With typical DNA metabarcoding datasets (a few millions sequences of 50-300 bp and threshold around 90-95% id), we empirically determined that the most efficient filtering was achieved with 4-mers and 5-mers. *Alignment within a diagonal band.* Alignments are computed using a Needleman-Wunsch algorithm. In the scoring system used, matches are rewarded by one point, and mismatches and insertions/deletions are not penalised. The computation of the length of the LCS and the length of the alignment by the NWS algorithm has a quadratic complexity in time. It is responsible for most of the computation time. At high identity thresholds, the alignment computation can be done only in a diagonal band of the alignment matrix, gaining a considerable amount of time depending on the threshold. *Parallelization.* There are two levels of parallelization implemented in Sumatra. Both the filtering and the alignments steps are optimized with the use of Simple Instruction Multiple Data instructions (SIMD). Since 4-mers enable to work easily with SIMD instructions, we implemented a 4-mer filter. Moreover, the program can be run on multiple threads. sumaclust_v1.0.36+ds/Licence_CeCILL_V2-fr.txt0000644000175000017500000005173312551664362020206 0ustar pierrepierre 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 prside sa rdaction: * d'une part, le respect des principes de diffusion des logiciels libres: accs au code source, droits tendus confrs aux utilisateurs, * d'autre part, la dsignation d'un droit applicable, le droit franais, auquel elle est conforme, tant au regard du droit de la responsabilit civile que du droit de la proprit intellectuelle et de la protection qu'il offre aux auteurs et titulaires des droits patrimoniaux sur un logiciel. Les auteurs de la licence CeCILL (pour Ce[a] C[nrs] I[nria] L[ogiciel] L[ibre]) sont: Commissariat l'Energie Atomique - CEA, tablissement public de recherche caractre scientifique, technique et industriel, dont le sige est situ 25 rue Leblanc, immeuble Le Ponant D, 75015 Paris. Centre National de la Recherche Scientifique - CNRS, tablissement public caractre scientifique et technologique, dont le sige est situ 3 rue Michel-Ange, 75794 Paris cedex 16. Institut National de Recherche en Informatique et en Automatique - INRIA, tablissement public caractre scientifique et technologique, dont le sige est situ Domaine de Voluceau, Rocquencourt, BP 105, 78153 Le Chesnay cedex. Prambule Ce contrat est une licence de logiciel libre dont l'objectif est de confrer aux utilisateurs la libert de modification et de redistribution du logiciel rgi par cette licence dans le cadre d'un modle de diffusion en logiciel libre. L'exercice de ces liberts est assorti de certains devoirs la charge des utilisateurs afin de prserver ce statut au cours des redistributions ultrieures. L'accessibilit au code source et les droits de copie, de modification et de redistribution qui en dcoulent ont pour contrepartie de n'offrir aux utilisateurs qu'une garantie limite et de ne faire peser sur l'auteur du logiciel, le titulaire des droits patrimoniaux et les concdants successifs qu'une responsabilit restreinte. A cet gard l'attention de l'utilisateur est attire sur les risques associs au chargement, l'utilisation, la modification et/ou au dveloppement et la reproduction du logiciel par l'utilisateur tant donn sa spcificit de logiciel libre, qui peut le rendre complexe manipuler et qui le rserve donc des dveloppeurs ou des professionnels avertis possdant des connaissances informatiques approfondies. Les utilisateurs sont donc invits charger et tester l'adquation du logiciel leurs besoins dans des conditions permettant d'assurer la scurit de leurs systmes et/ou de leurs donnes et, plus gnralement, l'utiliser et l'exploiter dans les mmes conditions de scurit. Ce contrat peut tre reproduit et diffus librement, sous rserve de le conserver en l'tat, sans ajout ni suppression de clauses. Ce contrat est susceptible de s'appliquer tout logiciel dont le titulaire des droits patrimoniaux dcide de soumettre l'exploitation aux dispositions qu'il contient. Article 1 - DEFINITIONS Dans ce contrat, les termes suivants, lorsqu'ils seront crits avec une lettre capitale, auront la signification suivante: Contrat: dsigne le prsent contrat de licence, ses ventuelles versions postrieures et annexes. Logiciel: dsigne le logiciel sous sa forme de Code Objet et/ou de Code Source et le cas chant sa documentation, dans leur tat au moment de l'acceptation du Contrat par le Licenci. Logiciel Initial: dsigne le Logiciel sous sa forme de Code Source et ventuellement de Code Objet et le cas chant sa documentation, dans leur tat au moment de leur premire diffusion sous les termes du Contrat. Logiciel Modifi: dsigne le Logiciel modifi par au moins une Contribution. Code Source: dsigne l'ensemble des instructions et des lignes de programme du Logiciel et auquel l'accs est ncessaire en vue de modifier le Logiciel. Code Objet: dsigne les fichiers binaires issus de la compilation du Code Source. Titulaire: dsigne le ou les dtenteurs des droits patrimoniaux d'auteur sur le Logiciel Initial. Licenci: dsigne le ou les utilisateurs du Logiciel ayant accept le Contrat. Contributeur: dsigne le Licenci auteur d'au moins une Contribution. Concdant: dsigne le Titulaire ou toute personne physique ou morale distribuant le Logiciel sous le Contrat. Contribution: dsigne l'ensemble des modifications, corrections, traductions, adaptations et/ou nouvelles fonctionnalits intgres dans le Logiciel par tout Contributeur, ainsi que tout Module Interne. Module: dsigne un ensemble de fichiers sources y compris leur documentation qui permet de raliser des fonctionnalits ou services supplmentaires ceux fournis par le Logiciel. Module Externe: dsigne tout Module, non driv du Logiciel, tel que ce Module et le Logiciel s'excutent dans des espaces d'adressage diffrents, l'un appelant l'autre au moment de leur excution. Module Interne: dsigne tout Module li au Logiciel de telle sorte qu'ils s'excutent dans le mme espace d'adressage. GNU GPL: dsigne la GNU General Public License dans sa version 2 ou toute version ultrieure, telle que publie par Free Software Foundation Inc. Parties: dsigne collectivement le Licenci et le Concdant. Ces termes s'entendent au singulier comme au pluriel. Article 2 - OBJET Le Contrat a pour objet la concession par le Concdant au Licenci d'une licence non exclusive, cessible et mondiale du Logiciel telle que dfinie ci-aprs l'article 5 pour toute la dure de protection des droits portant sur ce Logiciel. Article 3 - ACCEPTATION 3.1 L'acceptation par le Licenci des termes du Contrat est rpute acquise du fait du premier des faits suivants: * (i) le chargement du Logiciel par tout moyen notamment par tlchargement partir d'un serveur distant ou par chargement partir d'un support physique; * (ii) le premier exercice par le Licenci de l'un quelconque des droits concds par le Contrat. 3.2 Un exemplaire du Contrat, contenant notamment un avertissement relatif aux spcificits du Logiciel, la restriction de garantie et la limitation un usage par des utilisateurs expriments a t mis disposition du Licenci pralablement son acceptation telle que dfinie l'article 3.1 ci dessus et le Licenci reconnat en avoir pris connaissance. Article 4 - ENTREE EN VIGUEUR ET DUREE 4.1 ENTREE EN VIGUEUR Le Contrat entre en vigueur la date de son acceptation par le Licenci telle que dfinie en 3.1. 4.2 DUREE Le Contrat produira ses effets pendant toute la dure lgale de protection des droits patrimoniaux portant sur le Logiciel. Article 5 - ETENDUE DES DROITS CONCEDES Le Concdant concde au Licenci, qui accepte, les droits suivants sur le Logiciel pour toutes destinations et pour la dure du Contrat dans les conditions ci-aprs dtailles. Par ailleurs, si le Concdant dtient ou venait dtenir un ou plusieurs brevets d'invention protgeant tout ou partie des fonctionnalits du Logiciel ou de ses composants, il s'engage ne pas opposer les ventuels droits confrs par ces brevets aux Licencis successifs qui utiliseraient, exploiteraient ou modifieraient le Logiciel. En cas de cession de ces brevets, le Concdant s'engage faire reprendre les obligations du prsent alina aux cessionnaires. 5.1 DROIT D'UTILISATION Le Licenci est autoris utiliser le Logiciel, sans restriction quant aux domaines d'application, tant ci-aprs prcis 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'excution, ou le stockage du Logiciel sur tout support. 3. la possibilit d'en observer, d'en tudier, ou d'en tester le fonctionnement afin de dterminer les ides et principes qui sont la base de n'importe quel lment de ce Logiciel; et ceci, lorsque le Licenci effectue toute opration de chargement, d'affichage, d'excution, 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 rsultant. Le Licenci est autoris apporter toute Contribution au Logiciel sous rserve de mentionner, de faon explicite, son nom en tant qu'auteur de cette Contribution et la date de cration de celle-ci. 5.3 DROIT DE DISTRIBUTION Le droit de distribution comporte notamment le droit de diffuser, de transmettre et de communiquer le Logiciel au public sur tout support et par tout moyen ainsi que le droit de mettre sur le march titre onreux ou gratuit, un ou des exemplaires du Logiciel par tout procd. Le Licenci est autoris distribuer des copies du Logiciel, modifi ou non, des tiers dans les conditions ci-aprs dtailles. 5.3.1 DISTRIBUTION DU LOGICIEL SANS MODIFICATION Le Licenci est autoris distribuer des copies conformes du Logiciel, sous forme de Code Source ou de Code Objet, condition que cette distribution respecte les dispositions du Contrat dans leur totalit et soit accompagne: 1. d'un exemplaire du Contrat, 2. d'un avertissement relatif la restriction de garantie et de responsabilit du Concdant telle que prvue aux articles 8 et 9, et que, dans le cas o seul le Code Objet du Logiciel est redistribu, le Licenci permette aux futurs Licencis d'accder facilement au Code Source complet du Logiciel en indiquant les modalits d'accs, tant entendu que le cot additionnel d'acquisition du Code Source ne devra pas excder le simple cot de transfert des donnes. 5.3.2 DISTRIBUTION DU LOGICIEL MODIFIE Lorsque le Licenci apporte une Contribution au Logiciel, les conditions de distribution du Logiciel Modifi en rsultant sont alors soumises l'intgralit des dispositions du Contrat. Le Licenci est autoris distribuer le Logiciel Modifi, sous forme de code source ou de code objet, condition que cette distribution respecte les dispositions du Contrat dans leur totalit et soit accompagne: 1. d'un exemplaire du Contrat, 2. d'un avertissement relatif la restriction de garantie et de responsabilit du Concdant telle que prvue aux articles 8 et 9, et que, dans le cas o seul le code objet du Logiciel Modifi est redistribu, le Licenci permette aux futurs Licencis d'accder facilement au code source complet du Logiciel Modifi en indiquant les modalits d'accs, tant entendu que le cot additionnel d'acquisition du code source ne devra pas excder le simple cot de transfert des donnes. 5.3.3 DISTRIBUTION DES MODULES EXTERNES Lorsque le Licenci a dvelopp un Module Externe les conditions du Contrat ne s'appliquent pas ce Module Externe, qui peut tre distribu sous un contrat de licence diffrent. 5.3.4 COMPATIBILITE AVEC LA LICENCE GNU GPL Le Licenci peut inclure un code soumis aux dispositions d'une des versions de la licence GNU GPL dans le Logiciel modifi ou non et distribuer l'ensemble sous les conditions de la mme version de la licence GNU GPL. Le Licenci peut inclure le Logiciel modifi ou non dans un code soumis aux dispositions d'une des versions de la licence GNU GPL et distribuer l'ensemble sous les conditions de la mme version de la licence GNU GPL. Article 6 - PROPRIETE INTELLECTUELLE 6.1 SUR LE LOGICIEL INITIAL Le Titulaire est dtenteur des droits patrimoniaux sur le Logiciel Initial. Toute utilisation du Logiciel Initial est soumise au respect des conditions dans lesquelles le Titulaire a choisi de diffuser son oeuvre et nul autre n'a la facult de modifier les conditions de diffusion de ce Logiciel Initial. Le Titulaire s'engage ce que le Logiciel Initial reste au moins rgi par le Contrat et ce, pour la dure vise l'article 4.2. 6.2 SUR LES CONTRIBUTIONS Le Licenci qui a dvelopp une Contribution est titulaire sur celle-ci des droits de proprit intellectuelle dans les conditions dfinies par la lgislation applicable. 6.3 SUR LES MODULES EXTERNES Le Licenci qui a dvelopp un Module Externe est titulaire sur celui-ci des droits de proprit intellectuelle dans les conditions dfinies par la lgislation applicable et reste libre du choix du contrat rgissant sa diffusion. 6.4 DISPOSITIONS COMMUNES Le Licenci s'engage expressment: 1. ne pas supprimer ou modifier de quelque manire que ce soit les mentions de proprit intellectuelle apposes sur le Logiciel; 2. reproduire l'identique lesdites mentions de proprit intellectuelle sur les copies du Logiciel modifi ou non. Le Licenci s'engage ne pas porter atteinte, directement ou indirectement, aux droits de proprit intellectuelle du Titulaire et/ou des Contributeurs sur le Logiciel et prendre, le cas chant, l'gard de son personnel toutes les mesures ncessaires pour assurer le respect des dits droits de proprit intellectuelle du Titulaire et/ou des Contributeurs. Article 7 - SERVICES ASSOCIES 7.1 Le Contrat n'oblige en aucun cas le Concdant la ralisation de prestations d'assistance technique ou de maintenance du Logiciel. Cependant le Concdant 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 dtermins dans un acte spar. Ces actes de maintenance et/ou assistance technique n'engageront que la seule responsabilit du Concdant qui les propose. 7.2 De mme, tout Concdant est libre de proposer, sous sa seule responsabilit, ses licencis une garantie, qui n'engagera que lui, lors de la redistribution du Logiciel et/ou du Logiciel Modifi et ce, dans les conditions qu'il souhaite. Cette garantie et les modalits financires de son application feront l'objet d'un acte spar entre le Concdant et le Licenci. Article 8 - RESPONSABILITE 8.1 Sous rserve des dispositions de l'article 8.2, le Licenci a la facult, sous rserve de prouver la faute du Concdant concern, de solliciter la rparation du prjudice direct qu'il subirait du fait du Logiciel et dont il apportera la preuve. 8.2 La responsabilit du Concdant est limite aux engagements pris en application du Contrat et ne saurait tre engage en raison notamment: (i) des dommages dus l'inexcution, totale ou partielle, de ses obligations par le Licenci, (ii) des dommages directs ou indirects dcoulant de l'utilisation ou des performances du Logiciel subis par le Licenci et (iii) plus gnralement d'un quelconque dommage indirect. En particulier, les Parties conviennent expressment que tout prjudice financier ou commercial (par exemple perte de donnes, perte de bnfices, perte d'exploitation, perte de clientle ou de commandes, manque gagner, trouble commercial quelconque) ou toute action dirige contre le Licenci par un tiers, constitue un dommage indirect et n'ouvre pas droit rparation par le Concdant. Article 9 - GARANTIE 9.1 Le Licenci reconnat que l'tat actuel des connaissances scientifiques et techniques au moment de la mise en circulation du Logiciel ne permet pas d'en tester et d'en vrifier toutes les utilisations ni de dtecter l'existence d'ventuels dfauts. L'attention du Licenci a t attire sur ce point sur les risques associs au chargement, l'utilisation, la modification et/ou au dveloppement et la reproduction du Logiciel qui sont rservs des utilisateurs avertis. Il relve de la responsabilit du Licenci de contrler, par tous moyens, l'adquation du produit ses besoins, son bon fonctionnement et de s'assurer qu'il ne causera pas de dommages aux personnes et aux biens. 9.2 Le Concdant dclare de bonne foi tre en droit de concder l'ensemble des droits attachs au Logiciel (comprenant notamment les droits viss l'article 5). 9.3 Le Licenci reconnat que le Logiciel est fourni "en l'tat" par le Concdant sans autre garantie, expresse ou tacite, que celle prvue l'article 9.2 et notamment sans aucune garantie sur sa valeur commerciale, son caractre scuris, innovant ou pertinent. En particulier, le Concdant ne garantit pas que le Logiciel est exempt d'erreur, qu'il fonctionnera sans interruption, qu'il sera compatible avec l'quipement du Licenci et sa configuration logicielle ni qu'il remplira les besoins du Licenci. 9.4 Le Concdant ne garantit pas, de manire expresse ou tacite, que le Logiciel ne porte pas atteinte un quelconque droit de proprit intellectuelle d'un tiers portant sur un brevet, un logiciel ou sur tout autre droit de proprit. Ainsi, le Concdant exclut toute garantie au profit du Licenci contre les actions en contrefaon qui pourraient tre diligentes au titre de l'utilisation, de la modification, et de la redistribution du Logiciel. Nanmoins, si de telles actions sont exerces contre le Licenci, le Concdant lui apportera son aide technique et juridique pour sa dfense. Cette aide technique et juridique est dtermine au cas par cas entre le Concdant concern et le Licenci dans le cadre d'un protocole d'accord. Le Concdant dgage toute responsabilit quant l'utilisation de la dnomination du Logiciel par le Licenci. Aucune garantie n'est apporte quant l'existence de droits antrieurs sur le nom du Logiciel et sur l'existence d'une marque. Article 10 - RESILIATION 10.1 En cas de manquement par le Licenci aux obligations mises sa charge par le Contrat, le Concdant pourra rsilier de plein droit le Contrat trente (30) jours aprs notification adresse au Licenci et reste sans effet. 10.2 Le Licenci dont le Contrat est rsili n'est plus autoris utiliser, modifier ou distribuer le Logiciel. Cependant, toutes les licences qu'il aura concdes antrieurement la rsiliation du Contrat resteront valides sous rserve qu'elles aient t effectues en conformit avec le Contrat. Article 11 - DISPOSITIONS DIVERSES 11.1 CAUSE EXTERIEURE Aucune des Parties ne sera responsable d'un retard ou d'une dfaillance d'excution du Contrat qui serait d un cas de force majeure, un cas fortuit ou une cause extrieure, telle que, notamment, le mauvais fonctionnement ou les interruptions du rseau lectrique ou de tlcommunication, la paralysie du rseau lie une attaque informatique, l'intervention des autorits gouvernementales, les catastrophes naturelles, les dgts des eaux, les tremblements de terre, le feu, les explosions, les grves et les conflits sociaux, l'tat de guerre... 11.2 Le fait, par l'une ou l'autre des Parties, d'omettre en une ou plusieurs occasions de se prvaloir d'une ou plusieurs dispositions du Contrat, ne pourra en aucun cas impliquer renonciation par la Partie intresse s'en prvaloir ultrieurement. 11.3 Le Contrat annule et remplace toute convention antrieure, crite ou orale, entre les Parties sur le mme objet et constitue l'accord entier entre les Parties sur cet objet. Aucune addition ou modification aux termes du Contrat n'aura d'effet l'gard des Parties moins d'tre faite par crit et signe par leurs reprsentants dment habilits. 11.4 Dans l'hypothse o une ou plusieurs des dispositions du Contrat s'avrerait contraire une loi ou un texte applicable, existants ou futurs, cette loi ou ce texte prvaudrait, et les Parties feraient les amendements ncessaires pour se conformer cette loi ou ce texte. Toutes les autres dispositions resteront en vigueur. De mme, la nullit, pour quelque raison que ce soit, d'une des dispositions du Contrat ne saurait entraner la nullit de l'ensemble du Contrat. 11.5 LANGUE Le Contrat est rdig en langue franaise et en langue anglaise, ces deux versions faisant galement foi. Article 12 - NOUVELLES VERSIONS DU CONTRAT 12.1 Toute personne est autorise copier et distribuer des copies de ce Contrat. 12.2 Afin d'en prserver la cohrence, le texte du Contrat est protg et ne peut tre modifi que par les auteurs de la licence, lesquels se rservent le droit de publier priodiquement des mises jour ou de nouvelles versions du Contrat, qui possderont chacune un numro distinct. Ces versions ultrieures seront susceptibles de prendre en compte de nouvelles problmatiques rencontres par les logiciels libres. 12.3 Tout Logiciel diffus sous une version donne du Contrat ne pourra faire l'objet d'une diffusion ultrieure que sous la mme version du Contrat ou une version postrieure, sous rserve des dispositions de l'article 5.3.4. Article 13 - LOI APPLICABLE ET COMPETENCE TERRITORIALE 13.1 Le Contrat est rgi par la loi franaise. Les Parties conviennent de tenter de rgler l'amiable les diffrends ou litiges qui viendraient se produire par suite ou l'occasion du Contrat. 13.2 A dfaut d'accord amiable dans un dlai de deux (2) mois compter de leur survenance et sauf situation relevant d'une procdure d'urgence, les diffrends ou litiges seront ports par la Partie la plus diligente devant les Tribunaux comptents de Paris. Version 2.0 du 2006-09-05. sumaclust_v1.0.36+ds/sumaclust_user_manual.pdf0000644000175000017500000024657713447150660021172 0ustar pierrepierre%PDF-1.3 % 4 0 obj << /Length 5 0 R /Filter /FlateDecode >> stream x[S4fw<8/!JHK6& _ϒ3uKݕvӧϽO޸Wț*2o~6/ܗ{Ѷt+utE]Pɛͫ/zw|ڮu*_l*/n2®\m] 3Pw"ʺEWg/./eY"3rz$+*ѡtљv2Y6H7Ͱth GkMffLm[IϨiQKQZkY7%yr(#u`A"2RGz^>6_6jC2U}׺[ݲcɔ#IwUaj2mdޔumѓp ; [fvbU]6 1F+`a5zfߵmFkI$ZQ$򀦫\e5mY'_Ų? ]C/Ά[^=[_Ε[=3>٬~T^>@Nβi'i׌ƭ1RJumn̫t*5yߗ>Q{ʢɫRyk1譾{+3e}o)yPzҳ!(+Y>le0& \55Ry @/|aO' /Ojl: ̨cElA{ǩ`LzI-H&zġ= 2bY|o8o8@wjЧpd"p(f '#5ZK˳,fFR.x"Ko@(n4`FF= &஡BPv4W)r 1=~ļ5ՏEC@}PH'eQ:.v,WEsP8wx7AblM[yM<׷][EV:_)mlT9aOcŊUVZojȫe_GQEٺ&hw٨+|XFoC_P5mCh x\G7K*_Nl}J+" *#w?b]D/p-肸C C >Bny *0R *;KP#_1WiasdԀD@Bu{lp?-6D^ AIqn5SC+`xxD !)QDd#zhp~6EzB3g>):O+ׇy:ߛAdžD rwЈEѕxBSK鷢q$ǙiC?[l&}s,ح:rBf1Y)[@47#LKq I16ԙ(qShNe2[aLS`BǫNϠM﷌lW=!nb 9ܧ>F$;2Ʈl{)gICfrOBZWf +R% aZ.3)yV[Ѽ_ٌMⒹ2(B@-SFLq)`oy"vZM d iClqsGtdqEaBx*ͲY2{%FM8Y@|9H|b2fh>ϗ}F܅O8#/qWiigOkqq*8cJүM t3Í!B!)|/jmiWe2iN_(Pηi:[KIgJHQA*Iuy["3hHoCQӼ{IE8i. _MHE~Ci Tق!i_p'ڸ+t>{tdUdAkjA0'׈}n796X*F42cJqAI_xsN3/gI2_0G(I8NТiaviMOfx3>ax(>:ZĞ<:Dk|vY>OxţEKgZ_>'0=ewKM'z(*wWVcY|Unt!x}\<~WQiU!g'ȂYo{6툈~Em*Ll>v8n><}pYv!E^;-PJBbcjd;jfOTOުڿ [/m\ @"Y bmDV o*mWlTڡ2H+ b \qŊ3},7.v8|:myt9*G\ل8۾x׫"KX|VsN[{!9>'i+ѮGaO&GV=E{ҎZ`ү0MQAF/玌hv7n]{v2>CQwCNvQ iK;Tk0B>~a> endobj 6 0 obj << /ProcSet [ /PDF /Text ] /ColorSpace << /Cs1 7 0 R >> /Font << /TT4 17 0 R /TT1 8 0 R /TT3 10 0 R >> >> endobj 11 0 obj [ 12 0 R 13 0 R 14 0 R 15 0 R 16 0 R ] endobj 18 0 obj << /Length 19 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >> stream xwTSϽ7" %z ;HQIP&vDF)VdTG"cE b PQDE݌k 5ޚYg}׺PtX4X\XffGD=HƳ.d,P&s"7C$ E6<~&S2)212 "įl+ɘ&Y4Pޚ%ᣌ\%g|eTI(L0_&l2E9r9hxgIbטifSb1+MxL 0oE%YmhYh~S=zU&ϞAYl/$ZUm@O ޜl^ ' lsk.+7oʿ9V;?#I3eE妧KD d9i,UQ h A1vjpԁzN6p\W p G@ K0ށiABZyCAP8C@&*CP=#t] 4}a ٰ;GDxJ>,_“@FXDBX$!k"EHqaYbVabJ0՘cVL6f3bձX'?v 6-V``[a;p~\2n5׌ &x*sb|! ߏƿ' Zk! $l$T4QOt"y\b)AI&NI$R$)TIj"]&=&!:dGrY@^O$ _%?P(&OJEBN9J@y@yCR nXZOD}J}/G3ɭk{%Oחw_.'_!JQ@SVF=IEbbbb5Q%O@%!BӥyҸM:e0G7ӓ e%e[(R0`3R46i^)*n*|"fLUo՝mO0j&jajj.ϧwϝ_4갺zj=U45nɚ4ǴhZ ZZ^0Tf%9->ݫ=cXgN].[7A\SwBOK/X/_Q>QG[ `Aaac#*Z;8cq>[&IIMST`ϴ kh&45ǢYYF֠9<|y+ =X_,,S-,Y)YXmĚk]c}džjcΦ浭-v};]N"&1=xtv(}'{'IߝY) Σ -rqr.d._xpUەZM׍vm=+KGǔ ^WWbj>:>>>v}/avO8 FV> 2 u/_$\BCv< 5 ]s.,4&yUx~xw-bEDCĻHGKwFGEGME{EEKX,YFZ ={$vrK .3\rϮ_Yq*©L_wד+]eD]cIIIOAu_䩔)3ѩiB%a+]3='/40CiU@ёL(sYfLH$%Y jgGeQn~5f5wugv5k֮\۹Nw]m mHFˍenQQ`hBBQ-[lllfjۗ"^bO%ܒY}WwvwXbY^Ю]WVa[q`id2JjGէ{׿m>PkAma꺿g_DHGGu;776ƱqoC{P38!9 ҝˁ^r۽Ug9];}}_~imp㭎}]/}.{^=}^?z8hc' O*?f`ϳgC/Oϩ+FFGGόzˌㅿ)ѫ~wgbk?Jި9mdwi獵ޫ?cǑOO?w| x&mf endstream endobj 19 0 obj 2612 endobj 7 0 obj [ /ICCBased 18 0 R ] endobj 21 0 obj << /Length 22 0 R /Filter /FlateDecode >> stream x[mbSU$W1sQ\>cR>H,%O3+lr~vgz2˼-:o6h~ȯϿ_䛓*+?bvMvUWmU VE.bm1+y_7E.#rY邼ѩQ 红o1W[U#UC1}U}1DېDbuk w+oV#8z մU$:%e'(u$=7JZ$R5l\$@eYRD2'&7̂aBO}!Hw-HFeWM',PIQRO)}؍ ~M \hD9aTp0'Db Eϑ(qDU_}b "* 㿴 H="C̲tP#>5n(:hPLPpUS@ r-˰$fLqS@@^Xd&Š3@ݻb'" *V@Ģ}d0ѡ{ݔEݸI G=]/)e P(cFʉ9jnn\ݗD PIۨ$ A+'џMto+a3踃ڟG}'`HbQC8bN$ <4}#2)}XIXч`7D@+0* L|롻+lFPf eYJݐM]曳3):Ξȗ_cbUJu 3 >W¾~s>|RT e+JB6G<|3?, EiaC :ƹJ0쐐u=xgv?Gơ t^E^Qj?@ [c@+iA٠#G3Ǿ{\<|BxdĐƿctlyiT?ϖ;O%r `K M>3Xo)AJn-c9S2 +6M]b][ f$g BOPkr" L7`W&(DWd4l "-]PFԄ Zp_fJ̧j&G[xeAjY,O$kmK )XY(!p YV8ӀM5&C` pMQ!"_;ӯ%/aF@,F,ІiMC2I~*(,L br4'(*ba7hZ$2>|\<= Dk;iwygg/}i@ӎ%cm0 o`YM9F[h$ΤeRb:rI}}Hd\}SVxjnO8Q~ثV9lC4g71zO vrvYlmu6IӈiD{nv,۟ӊ]fy/]4řEGE5z WhssR315vL6T\]ٔ&\Ixs F \\fް#i.cK&GHj6͗C(a/ϷQAX { vngj( qsڬ &eKHdޜ ]m̖oG(\VFܳLh%g1~j1Šܚ(_` 4-8MCr[Jl3,TՕ9 '0f쫛ď&5ztW[˒3 Y#;jw&[~qQ`ģ'wd"*r+0o<&g,)_ie$+QnibQfJ3 4 N^EP.[er72Hmr'KFE ]j0DAaȡtY1{oEn2^Mˇᚘܼ7IhwܱFY$7{))߽J(-ァb|V.vZ+fr40q>l;ŝl_$bjv^xwiWrų܌vqf> zJ BBB]@A\.7,&v.Yug zsrڬכz<8{`w41 [\WqԹw}C'!M][icHSM;Cv1old NC KcgZlipBA+b7 ZAz֠>_怆 0 5xSH-բs!3fǶr5C 9C #ȩ퓇"hllַؚЩڲƝj_͡6Jdfb_(D!]l7b͡qY?s.iDIe cW@&B "2=RgZh1_Bil24`RGdu-|Id:{1H}1Uӓ=ǁ(2SLqQM4zef7+3 *) ~bafe(ʜ:[ϟ@/N?9;=:mNӓSwze?[u'E9_΋;h6s{ _;Ǜl<Ž;tG~"f-Xt{ns:9|ÿt<ͺfsrgٝ}3/7;E;A9=Y 'A *~^JOk**ZשP;&nG)U>*ʻ{f-ݦ@kFov'n6x:_uGZkX^l-ɏ_ e|g6SH/ڜ57&вy/uA%^VCM|eG~pc3/HyZ6y2tNp\{d1M\!!E!NB;N O?c"ViL M,j: ~{F?v?iӮ'n͗[:J;â% w։HM&ϗs5a}< endstream endobj 22 0 obj 4255 endobj 20 0 obj << /Type /Page /Parent 3 0 R /Resources 23 0 R /Contents 21 0 R /MediaBox [0 0 595 842] >> endobj 23 0 obj << /ProcSet [ /PDF /Text ] /ColorSpace << /Cs1 7 0 R >> /Font << /TT5 24 0 R /TT4 17 0 R /TT1 8 0 R /TT3 10 0 R >> >> endobj 26 0 obj << /Length 27 0 R /Filter /FlateDecode >> stream x]vO13Fh[\Jc-I,g-cyԽt)R*'PuQ].~Xn۴UU-ڱ]Mm~XxdUZW׵/|iC+ݰVUnwc|xbQ6 ~âơxxpqa}^||q- Z?.'}y{޲jql')Ki o{ETBM)u #[@%ӱ8=bۙjK7-B/ATn [^#N^yv/ݓ,S}~?&8^3j[̴R's2DRn4ĻWm3"C`v[Chr[U]xcvWr-y=4r7ES ۦ-V۾Krݶov&1Ȫm(*@BJeJ)e*1*131HW:7Eb:\.<˾kৌfXxf yN]Պ's33Cty< urg Tpgbrż0@wf1;pݶuzuCp8l⋄vhK4R"Jwm1JEم˶]]uW 9 aP ,ogkFCVg4Hછ07svatϮ^0J頍svg/-.q38̊]5c6Uq=vnf,ZT<1Ƽ%Vm5)ߖcצV}{˱`>AF,%AIuKG +VhP2'CsC"e!/]nׄA)H}NT464!_[i 7*]g>ӑi,LDBlxԡjB<2,űGng"t:vۺl2-J9D\8B# W nj*8"75U*i4le4D;Ǻq}I_l8t5lz݁lc۟d$b̮;$)ndj2 q+ zwĕ6$KZv@m_Y-l20y-ѐ Ǫ.03+4!' Hu&u"@-}SgPj_`1KF)7(A{O@EyȖ| +4$er8ܠ2X+ bWj5S]}r`.IK^(D֩S7Q^j{;'609X~W_q+]ZFS5 b]|QűP>n4S7YMdufsgr6ME5j0!ފ-ymr6Ep߱*:H5&4ԉ=^o"[H{;YQwf{.?OZGZc~qȉ(bTL Q4mY7rb.8(;p){ؘRXb 5e^?Y.^a|^̳4팺#|y$ Z0%4 {y, V׭E\<_Vmean*jI{P0l+,OP< m؅b+*Qc6( CkkvM: $"(yc'h0,_ƺ$ŢJ$ @4%f`!@njNLi9ϩϹ^<y&q(LW}Ƈ<1ts6Xƍ|G em6)Aa-jyj} ߑ= v}SDz6$J~ed0b9t5](u::{ő=3=~e(=gWi E" k\7_=weڡxNݢ p(p2"jBT #V:L6J M6iK6}iKavwg߇w f; 0lK^Kߣ9ھK vTooGE Hw[V=Y3V9($aHF24bPq=Ccư9 w6lh6 >r{4(b'vfvہ3^dHF[%xlL?{*&{.ٌ3#@ Uu[v^:B{:2ͨ:Y8 GP5E%:?0R'';߃Cۤj{A5Ck00iP~Q\n& V(.U 8&ɔ-[`b"Ơ$$ͭw"0׵L h %k%\VU[:̎5KLߔP"ιZbž;ۘ3:#0($@GSdHbxo0Zp7~ծŲ0 HD',>=Tm_;;e 2 }bX/"у*eˌ@Mgl] |pA[Toζ`IlןͶ`kllZrVH/nz$tnD K~/Du !vO@cWűJU|ͱyJ1n %UTTRYrnj l:"-¸%ޡO58f =Yv~auryDŽd4Π-_3?C5fbmp [z|ID~2 .s. 왭*ATfІFQxB&IX0Gq#shKMh9xQxBt2M6N\ZM3BCU)᯾K0&'F—o*!*I. q1m%uZܪvxqޟ36I^GZH";3mOX{IT\ؚ|jޡ&@0?U2fPVR3̩&<݂GB+̼q(pXOAЬv(9AgGlN̕K/2$`dp:D 3vIxA4 ZRH%Н(\Ӝ-} xg,rσzhژMsK FPK XXr2}LDhʉ&HE Su{*,UX}/ll[uk%a xHqh" QU@\q(SITˡTpT%9KJa"ipw: ZjUkkZ+{PdsTxTKPN롟sixG`Wi^c7g BdzJj' U<7 !T*~"d:Cv,@ֺnecn^%-ASVѢbV8ăJ'6QrhQ¥{)R@xDO ”2,,p%U}9I(4].KX9ř5&*Iqx#83 4dwL[OV981QX11QB@048wA`Dy+_P41 3ED۽\eFv-vθQ_! ^ypXs(2h3A 35! n*WvVLD LU6!wPBVbpCm$(̓Szi'TSOFFwq Ka?bBo9=e/̤^bo,(KеZUXTfMS*HJpv6En,~uSQ4) Xe1> \˙O%H868+i& vi=bOq ga">kNhұ!-jDbL{pPQSpG:eC`h ٽ %X"Dذx<5-@V}iA8̃*@#`a 15)ق9KQ\XD3u8 JOlOu&C`_20*#Ԡi\ k_)jSV^>E~*} LNuZ77HC}~N0c ^2fȈ];;lwT$uq| e]owJt7d[t٭|` '4~]xXZ6;kQ,`P G^* ۄj,klQv;T_+lRc{w]M G!Bk3u,ZbӋX @#H^hjF ,$" g,cL8JO(lOf$.U ѐ3$Xw(c*#Jle?k=1u1qklٕ;r HJ8b-N)ˀR3q,b%ʄ1JC8lJ(!$f{ǁI&Y; &DBnHmh04 -4YqȈƒ@vH6!2|F'YR `xeI b랋绽1xO9OAaɺ_?9ϖnȀu6䥯u;;֛^>ZѲ,=, ^LLu>OD/nvuTJŝ /i;OTZJ g'mjWO7fN<u6pgG'ߺfjWʼn<22W3t1\ s MNT֓nOٺ7˕ bM^x2 ;? @5%nϥ~tmOO71.׿zz/޹au\gHٿqi֯cş;<IӧOcٗs/~~G=go(>w;w츖vmAob3~p~rr~CF˃f~/\ 8gw7#j|pzxs _G97mkhEY3V n9 ^-e/cۀ2l.^(t>A$mdFӝ(a`#،xÿ A'&?ݚ}%f%}ƆOGoY)}PLqvc3Lkb{/ zk<>cv]w<-KesѰYoܯ͵>+3"C8???пZ?=F <\K}SҍSG}byܓGݪ1 C/"Yz;W)o|9Kg5zmWLYRBU0Pgkպޱ|hc{I Ƶ[>",u=YFAvA\j1zcVb D7%6';66Y#P:~{Uf ξïSpL1yt#O߸lKs ޿{^n1=[W: bᩥQբPKh5s7lMڟ{dZՙSA\cy e>#yya CG* iUKm'_lb~fR+lH&(.hӧKk;=]?OaڿnY(p!3l̀S9bo0Vho_ȢD>pF>\m7$1c$TrmЍ#N(@UdUi/48yƑ{eϐaF %΢eS!\dȾӎ|DXq1 Kv4oÙ-P8ƑzJQz#É{Nb  ~uK{,z*/qlሞ +{MPv*e L`9;NIWXH,M00d1U8%3@$Kو$] JxLgib,e7#سVVro6F  Z`2F(*^isE@<ȃT}yjt+XZ@Evx+',>>0<>8ce`;f3}Hӓ0%JOI:d g$nRbz Gq>'{GɯGG$,1ᲝtH΃t8nIfAsd!I Kdfd%1ߒL{r2;/!3>auyJcass߿uZZ,u˿dM~9u^CG:m> endobj 28 0 obj << /ProcSet [ /PDF /Text ] /ColorSpace << /Cs1 7 0 R >> /Font << /TT5 24 0 R /TT4 17 0 R /TT1 8 0 R /TT3 10 0 R >> >> endobj 30 0 obj << /Length 31 0 R /Filter /FlateDecode >> stream x˒#q1-$Ew <"X/a0`[zÖg,[=us-3+ʟygM\.vӖf1kպ<*(((wr1;Fzjzf]S}\4r^}vܾ.^V/)Ų_{}U7"i^i(#c?!^zPh)%=`>{&ʅ#ćjVhoi|$R>=(.?چ{L$4zt<|.>Їۛr<EO֬^*I|uŠr9a4P2o?֧Op-^Ţf0!b }VTy¬7DIQ~QP "YtN# D%D{cEJB%/Bp@vD /nt^MGuiW2mV˶! ݪYn$-{OǺjVj9k7EYզ+WD>+l/lS;Ɗr|y-ƪA5̴mMd-MW8MA0Q4yXKԁs7ufbSq1 #2*jnZR1&$0;<3v^p c+8R5&q{240Voz߬Wus%X;kn\ŕa7=j vmc1ZX4 1YƋtlSڵuI!^EKf=>3cU 88+2'vveRp߼ a,-듻vQ^Z4x[Ko!QMO|!~H7&d :CHSlH!tW ,rErKR)(*m$\L?KTFv^/ TPG32cKDۈ+Ԝ1D2ɪ.? `Y[]>5;ZpNAe+ и?JF2Yg8Sl%6z% +01TοHȢdҋTI v<+*O9|,g5>CvfĈ4kF;Z  QTAHcСa[/'v~ )&[(^h@^Y㕝+0{]'$˿1Qk~Ya˛g׾7|HnzĄSY'bܺV8Q_)n8ppTbL "8T 75i2W/&DK)g1ǦΪ2IMܢWMZ„T@II ڄ' +l )413ӵWl> :9D$<U6yq^60A"lh k|,&wf|6#ϊ᫡ 6m-br{8#4R,%25FgrUC|JDbi ʉ(GyW2߄M>?Nb1%ڐ9~o)@ غ ztGhZ={~ ȶ q'D@#CRU'1`u:KvW34/N Mf"$_5z睢_ejN(r#ֻA2V(3dNzҋN7K)KBjr{B/ݘtIV\)h@H퐆9$IH\-j>*{)AkճQzh- E}[B0^Lc`{Sʹ2w!g7g',Z]\DXNrg`QD@' [\?֖A֛"7\%|DKѓĂgp^"45mSJNjH>O0 d?MvO/N1#ڜ0Fimk2k< )>Y! ?߸W—,y~}("QOnL}Je!уDvLVwhP  ZI ~LTŊAL"5I +vzήG2@M]P'WD g'իg#%z66$f}P></|kOr6;qءfQmA4Pvb ҢȶG|;9N$POHj xKWis}çb/!FX{>G߆?{xڭRObHL "!p4%o˺8Wзw\Z?,F'`gKtM)8rT|lEkcْ6rAFw >XctfiTW73#A?2βz`<^cOk00yT6iÊ:drCs%>;0.aq~ G=sha\ }Pwo5> endobj 32 0 obj << /ProcSet [ /PDF /Text ] /ColorSpace << /Cs1 7 0 R >> /Font << /TT5 24 0 R /TT6 33 0 R /TT4 17 0 R /TT1 8 0 R >> >> endobj 35 0 obj << /Length 36 0 R /Filter /FlateDecode >> stream xrFE$/񱴝,\qU^Yشb$?6ߒ!4!DQy ӏ{o "a8 d<2ijg(8}!_dp1hnUM"NaXmj5K1WU,|b~~ vA'Gl+g+87=o> &$oe6_a0!Cy<'§ֱzoً!@^{1oj*jB͟*/5yƴ n dLz\`?BA$8fBѼǂl-e).pNQa)Mwa "L>3&li rwFt#I'9>rljORȥ0_Ju:ͯvc?Ԍx`7NNџR p02/bggq% `&L S쒂UWsZ]a$Oh >M^L&~lKݰrhɎ&R(y\̲$sOJ3v&Mg#kQCFuDR_(O&@\gֹ.;Mza˻\<ѴΚ1o]&ythbʆG\ d+n-DYo/hSGNT+ ͥ'^9ke JFrlGjp5RLK-<?%>2sH[8MOwO JzJæR,葬:n2ۖ p 4alO[(p & |9`['y(WDHI"MF>!Gl@t$ZF 5M]|MI$G`qj-KZQ3 Ie:rGyzEN,|xh@e&DYyoRN pW[[ؘteKjEjrrAkX3C'/#}|(wK3xn 7\q'jsb}}Iy)6 q@v׀ l1 D"/ɥGp7b;,[?"*n ,ȓk?AAMJL;4XCͿ=i36M}Ev_T&o0]Vx&8]\ P^`Li@qK.("n K@I+rI"etKTȑ{r4^Kۡ"i zӏm%Z#$F(.x2|e~6{I|"C @$ Nٰ8f1:`ϧE%4C% 8eE7W#^d%IDud+>oHdIĹAhNLy!q endstream endobj 36 0 obj 1595 endobj 34 0 obj << /Type /Page /Parent 3 0 R /Resources 37 0 R /Contents 35 0 R /MediaBox [0 0 595 842] >> endobj 37 0 obj << /ProcSet [ /PDF /Text ] /ColorSpace << /Cs1 7 0 R >> /Font << /TT6 33 0 R /TT1 8 0 R >> >> endobj 3 0 obj << /Type /Pages /MediaBox [0 0 595 842] /Count 5 /Kids [ 2 0 R 20 0 R 25 0 R 29 0 R 34 0 R ] >> endobj 38 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 16 0 obj << /A 39 0 R /Border [ 0 0 0 ] /Type /Annot /Subtype /Link /Rect [342.633 236.2396 517.2716 249.0525] >> endobj 39 0 obj << /Type /Action /S /URI /URI 40 0 R >> endobj 40 0 obj (mailto:celine.mercier@metabarcoding.org) endobj 15 0 obj << /A 41 0 R /Border [ 0 0 0 ] /Type /Annot /Subtype /Link /Rect [379.9957 253.8573 402.4308 266.6703] >> endobj 41 0 obj << /Type /Action /S /URI /URI 42 0 R >> endobj 42 0 obj (http://hpc.sourceforge.net/) endobj 14 0 obj << /A 43 0 R /Border [ 0 0 0 ] /Type /Annot /Subtype /Link /Rect [30.43069 301.105 326.4167 313.9179] >> endobj 43 0 obj << /Type /Action /S /URI /URI 44 0 R >> endobj 44 0 obj (https://git.metabarcoding.org/obitools/sumaclust/wikis/home) endobj 13 0 obj << /A 45 0 R /Border [ 0 0 0 ] /Type /Annot /Subtype /Link /Rect [453.5824 569.3755 482.8619 582.1884] >> endobj 45 0 obj << /Type /Action /S /URI /URI 46 0 R >> endobj 46 0 obj (http://www-leca.ujf-grenoble.fr/?lang=en) endobj 12 0 obj << /A 47 0 R /Border [ 0 0 0 ] /Type /Annot /Subtype /Link /Rect [30.43069 663.8708 177.4915 676.6837] >> endobj 47 0 obj << /Type /Action /S /URI /URI 48 0 R >> endobj 48 0 obj (file:///Users/celinemercier/Documents/workspace/sumaclust/metabarcoding.org/sumaclust) endobj 10 0 obj << /Type /Font /Subtype /TrueType /BaseFont /MJKBCR+Consolas /FontDescriptor 49 0 R /ToUnicode 50 0 R /FirstChar 33 /LastChar 101 /Widths [ 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 ] >> endobj 50 0 obj << /Length 51 0 R /Filter /FlateDecode >> stream x]j0F~ -;9t(d1?Lf`8qy9M3tq%]HV/qX|jwyq0vs>.s>(׮-ٻLŊy؟\Uέ~0Wwܝ}<zٛe~c狺v])6V6~>,{F:enjQަԞ|6xE}]EMF벮.oJ@Z׊'D ΍D n,6DJ@LΝbGuD j}ꉁĽ"{qrUPAWA\JwI\|&p\Q pD|•j%{ *G\Q WJZ+|@+Zv?*V hl: ZW}k4$qtV\h5oY͗56TAkQ 9 ~#$)%Q: oANx Ix'(gOQ'!!*(eD0[UQXm?cY`PJ3k]Ad[ o2\> endobj 52 0 obj << /Length 53 0 R /Length1 20668 /Filter /FlateDecode >> stream x|y|EvUܓ$LBf2$L! B&'!LAS/ CT@ P@#x,*U\E2yJ|쐧u{Yn z$nj "}z^m3Cw h1q*?~u<!1j9NkB?}=ΚcB 2z'y]'6vj_c} ]i!!e")' 1RȣG Q@dQ E2շεJ#8շVug,>_dqNcYGPgd,ޗ{8-?]Y#e,N,ޔE,ސ8!8&d,,,Ze,,b,hG{e,vb,v%Y(dCb,O*-xNd,Ӳ(dAO YX'X#dZͲxD+eBb,2Y,_eH e1_d1Wsd1K3eq,b,b,&YLE,&ʢQ E,&ȢV5/q+1-jYTb,FȢR(E,JdQ,&!,Y"[nYd"Se!HE,ReG.Y"YIpʢ>6Ie za9fR#!}#%N{1Dq/ 3QX%8.0f[]*<$,y#E$ Ho`.B8_|P? pet.M(&m\l>9]̎&dGNJlXِX_Y86YU#OW9(aƨ/G #++*iEbyeV9=^NHe%ŕ3n)3 B: iAb~e^bneNbvU)8,wi >8"D½ p^o7{A zGEbz#zHD;98up馷[|d+wN9_9 wpUNW82K~sw tWްxz;/9}osgSNt'>tGxЇptӟ9Nosz)N'9ɩ^tqN8UNG9t!NސldN9ട>N^N-NN'76 up8 C@+ p8^{.`'"xllggSI `=8X V#J`M0]<` LEsYL>`:0 L&&`"4@0j8`,0 TUH`P Te@)PÁa`0Pـ2@HҀTRd pI{^A=ELEti$3I3@vP3r!'; U:Se8 Λ?.ƨ*N#\N||>x7;{u^D#XHv]٨\|QyŲdll0ov=2<%Cd=f|,$42|?y,#8~+#dy&5y\B!,.Kc9Raw4q:5C YK6x@/RPVJ6Jʻ`9][![]%aW=^rY8/]CdOWP=(g_^E^b3Vr!GɫI;as5y!o39 zKΐG+r _oQQ'7;?+*:)5>ӓ^~ˆE@,\obLS11_ S%ʟ^Jtpk#D(:d!AǍ3zTuUeEyYiIaC .T9iމ =c{8"C,fAj*BZ.!QPcx1DvE@5 ccbn};&5 |s:akJW9mK&iEtbݎ;l!My6{ 45%&.ב۠KL -:=1H%!"=#F{JJj)JiyTmy&l- Ǜm5 5~1U75+JooDքף}6ڪw5Wjf0yz} B-GF=hJYm!V#g.<*~j4g9?1:7qkna[/Y @602{W0%̯? zJ6bOK:2|''7϶''Q,bjG+%OoHuthJp -((U a-gb^uڸݎ^nHF'HhT߸ ps]bev[ ]҉?B (ƠjzwNThJ@*NJn(j{jUk-> *[TP(i\(؀.R u\a!Shk]dwvA]/_Ɯ?O#|$'xIșmm 9 *NEZv9RgmV\Pg\P!?$gP'ga Mn(J7R L^qlo'偆R}2qx7nPl|\ƒG@W[WG{ѺM WwİҎ_RJһއ6xA>[Vzʫ@/6Rr"J(5yh9\^BM%'E6bFKp[bbQF!JIK/<\ƿ<(+8([(*'r1\fee.EM'WO#a%^v| ^Eex9NA ٳ+4^_* :~f:fA]IO}FG44Q|Æ[7"HWe}%T%d+ F¶ȝibܙ6bd0i4zYq?ТTCwVP+DO ~:RE\]֌2ЌL !m)l1u iբCEG+КR gXؚȓ~SI3v\;t 45ˎxńE j:=:vԘʐ-DFʥR\J:۝) 4 fVm4Ќzoٴe;\UT8V| GR}*©L,Kz%Y ? u(ԟiilWaH1;W:# > ^y1|Ȋcz [0bAqI^(gP10XUG&:0&FYcƢf-ؠ \T4lLM`2G>ۼtFwEɡ8c.qUs5gp7xNpE(EnJIh`kJ.:Xf _gr1H]&rtֳWOm%5휱 Slxo;5+Kݷ}RrA҇lkmIY&SF=0,sju)p|+(ghze"4`nC&"ߺni1?[y?spalܷJ{zYMa$x[٫v뱩1j Kwxqc3L_Utdk.YXӿCKÊه=Sڮ@:ac{kLlCS',1,*Q58"u>+ټ4ubBIF*[FWOJ#*>ծ0-+\Xf*lsiXYk'hA k>;+1b_Ѡ,yWȜk9>KOMٻ0={{8֖a8x ч5 R|5c[;nmߟ)֧4**VJ14Y̿$\S~냭Ox=kX\h>Q*u@HYgwd({ip쥣&~!mq"z{xvĊ„aMOxYc(};,)7."Wbhk/ṙ#xW}nE /іG}QKRׄ9b5s)ž?j3o\W}xMѮ #JZSvݓ4`jyY#C| 7.;qAɥ|kLzΟ z}SSJn?w} bWfDЈ"2˖/0g% F:[kuwޚ}C>2cӆ/ tKItB{ybg d͞dMpa1unewOβgSjȤ?[Q=B˫KOBMz͠cq׸ew ZZP$3ԑ3ܵgWqqY†Y3%:7qsrn\+hl|S)(גBmqطjShK1t,L -Wx0VYUĄ,RlPEOï蠠蔈.ǬuJ-%&((&[Dr Dmt$iDĤ&" ]36Q^[,ԢBY0Bli^T/a7^BX76w}X<oqllA>˥f~G.΢*nKuJH ["BZ^oh{VSu-$ZTIDtXxqXAu#e| ,wE.;;luڶC$嚰>{VNuǽ*qpCҪ; -}Ft,{6dOy}9F]x‡ZT<<6M!uHKiTNhZFCKn"gy Y.XH[/Wm#8U$yMyCsCGdv,d VGTR~$}{С3)~P6(=bԶXNm zuTCvS C#_+Q1|ܓlJm/-1lg㮲=# L4:ofER츭^>-:=$(zP; H`nqsՏ0Z^B2 $ +зg{:ZcׄM r/=/eNKY:V!lʶ2tɍėz~[a՗9sF}]-Ԓ;O2FXL񆏍 lx:@ol“L/!ֈmþ&UbiIiⳛebڎؑ) E` E:ngE@㋟K.x ޖ) (؈QW {Y)@ztzQC!DV|jRP̎:]Nd >v@U:?' 2j_al3-^i&}Y,%Ui,$81!jG?Ԏ2/)鉚?O:KZPD?Eo}W}_*R8|}lkIjBJK`hipphXPk (GFt 4IAU#-B\aQ*sٵ?{Z'"|H7|` lݲvi wx%N d46X@V 묲.eH֖r쩒gӷ HX8'Ҿ)7CI!bXJ[T,I$F@k0_imxU38!Gr8#2wZw듐;&$b uct(PH| {zwQJz4x8[ӻ֨7MvhFd߸иKwı{cLe4G2Uϓk0ĵ!+1]9{-ʍ;,8.v86Pk1%JA HBZtlɿfDL Ǩr `<'QaH=}q~,!w{5|,)oGv_\Ո̋r?7YoX ˷o5dc]Hɶ.odyH'(_m4pۯSONJ t+1[>W}K|ڎ]r՟;ѷ;_k,Mwg#446- DTz:}+8[UFI,6᝔ yǍD) \.}HI1'fڤ'gqjbMTW "D; i ODw/S׎}::{oǃt܃t ÃmtolW]+@buHKHT+]w YtIÍM!QS_lT*K&=2cy"{AV M@!N ?| Lڽ 's=JԼ:vRQ]b opoTЧ*ˑU#Ӯ̨e'ЖV`cا:XgT/tfZ=4|gjo;Qݬf.zNghmO|vs)ϹH =j5žv VIa V@Se@,ÙOwZvʭeM,ai#̨rb5M=KV\n%e\I#sb9|\ U-y`evo!wid!Ow)Vgi!jX0kSBNZ}J\Vli dnv.i]/=zs]=|Q z&_Sk,y$jذͬw'#7[٤sV&_eڤ~ubż5IE(}=NntAkQ#nC>*rnQWC&` K%_鐊ƽHrC].y=YWkVDnNVhڪA%KF%~]8}㼫*ڭ3xlԐ`io]TC Tn Khk.o;(Jp),dDDZ2jS{kyOpal`Nty%${K/l@,_ݳjY=Yr0bEyz jK7<;7_?.}cƵսM\[;67j XrSBtDGT Nckrm!k\6 |)!c8K1 mON"FiO azV>q'fTxu+fp㴟MJfwMGwmK.΁MmKəyy{FdDN]jاaXf57sԔY3)o-?+ʔ1Z.?)"^~3oWxx^mt D郼e6X! usf]:ľʉ%| /m~UQvq6;0}RH? c>\> ,́3S5SxazOK5b`[R[;}SjլQ endstream endobj 53 0 obj 12637 endobj 8 0 obj << /Type /Font /Subtype /TrueType /BaseFont /MSZGIW+Helvetica /FontDescriptor 54 0 R /Encoding /MacRomanEncoding /FirstChar 32 /LastChar 222 /Widths [ 278 0 355 0 0 889 0 191 333 333 0 0 278 333 278 278 556 0 556 556 556 556 0 0 0 556 278 278 0 584 0 0 1015 667 667 722 722 667 611 778 722 278 0 0 556 833 722 778 667 0 0 667 611 722 0 944 667 667 0 278 0 278 0 0 0 556 556 500 556 556 278 556 556 222 0 500 222 833 556 556 556 556 333 500 278 556 500 722 500 500 500 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 222 0 0 0 0 0 0 0 0 500 ] >> endobj 54 0 obj << /Type /FontDescriptor /FontName /MSZGIW+Helvetica /Flags 32 /FontBBox [-951 -481 1445 1122] /ItalicAngle 0 /Ascent 770 /Descent -230 /CapHeight 717 /StemV 98 /XHeight 523 /StemH 85 /AvgWidth 441 /MaxWidth 1500 /FontFile2 55 0 R >> endobj 55 0 obj << /Length 56 0 R /Length1 21268 /Filter /FlateDecode >> stream x|yxT9w{gd2L=!!" oBThTA `T¢K,bU,.mZ_ }}Lss.sn[0I+ɰL%gfB;&͞0'Y&n2?-Y3 gM3mv,?D.0m;.R)&'8Nljd1}Eɲ wϺmRuݺu=|rO&̞|3v;;389tOо7 z ђ[D8bw,!p]|[R#Y-2i9rLNhώ,%W!o'#rP5s~ ̠ŠՠABwi{ rEx^h:}v9hOPFo$tqL)KH#ɤ[d ǥP+WSJޟZ|"7Q*. ~VWbJE)<x4ˠ=Kp Sy yXO_\^۳?X7P$p>k)ʹ3CܖJ#qKXKXn%tȢdol?=ИYiK⥍cHV},M'uR#eJQ)$$lͲI6:YvC=d,pR8BUO>{HdN&Lx9hf9d^Ш9M;}@Գrẕ<2G6v YlvW[Y*kdzJ?4жqЈ݁B 4_}%?/)599/>2gԺ))mLwNLK7sGO4'LiR63\E]Sp>2Ʀ}SSj[jL7g~ּY5yYxXvy"{XYgQs|HgZ݌Aim#0-mBsm;݁ xţ$Sl%^! =;*#;?O2|%0#N"Vh.3831ǐ=JH+};LN3d*y' d17WHO$; $GIj]G::\y"Pr\99s/^ euN'nRm#WKz=9O n'#]JOmTL'/P^|A[|n]AaRCiF[sf~>ZgI=^L!-wtjhoڟKCt͍䚸"s~(?_N]/7kwG:OtK\$@n&2@.RuiV:V;L0zү%N s=+oawB?i"DeO: +F % RL~^<^q9~?~A .j^ZH;^OQ"/m@pZ¹8?7ZwVg^|OK( k|w›bO*$ŵ$fffk7PۤS_A4/$?!h-H6b4 d k2C2;7eSHǐYH,TJv 5$ nEzCX4NA}^tmVh봲W]~|Z[t| 76rxNLxL崶kiKcKǝS{OモӪHUnpZojit M6ܜ֡懨ռP?HsOMk[_ۋ^LqĉUFOX K;ڼں6Oy\#u&  5N o3r{hC;ɽ,7aLS?䴹µm%,^խb0eM}[|`.+g kQ4" r+芮F6DKYs6!2~fZ6\fx0 o{UF5=j!az8ر2^<{?8hx7(@xٖ6I}H-gɔrfR9O3E7g=8 i#&ҌƍY_F_cpښ`LJ;̄3;.6:Jz=ƷESNXfjKk x}kn+Im0|Tq܋ڌZ<^8B.WZ=\d%mMښפէM0  S4烃#'r#oug47A=iF 3jQ=M{aM74aMm ͸h6ٸ^K+h^9)j;fo or;%=OĻNv cy;m1ChV3i1DDg9\n -U9\pſ>+[z Jww wǻۍF^U8p^zqÍpxF#Uqxȿn56_8|_;on79QM!w8oqpx48|s76rnv\1D+*8%å6n7Y8q/GĻbP h}Hx& ڄ8n4) 2 ~M[gc-DPf[ApP JA8DZ/h9=AZ+QrvmU/qׅr+z<ʎ ݍiރr%TrEKtdE2<JfAHM-:Cx S!IWKaģ$ #瓟Dt z(bRBJIb gK[5_in]יRuFz?}tʽÏ h+q&~qjHNF[3ut+Vt*l,5.3 4rcJ0*.<˶l7[::^w;q~z۝c|]}ϧMG8po!XNln'-+#<<ɋ!7弈D{YBFX~Oыۅ!}\n\׳"q;yD fB䑵JH#t Uޔ_n\x4qϫz >Mw9(rv?r\p5_9'K+Q[IT6N~̝t\`XNE4l--)5z5ryp>]m4r pNrg'?͝O_O"Ӛyy gf 9B#݋'wظCqlR_=eE3g4eLJMN%QPV'c8wP]%&K!Jfe~w^ dnܵJ$EHFk9\0wӑ  fk14j#birgB'#g 282C3E@faT̹I.,qXR\f YK-\8]">~Q˔?)ʲ-d͎E>>9qgʇTZya/? RyWN(=*>#>TF~$u9]hϭ;Wܟ)3F]'ﭞyC->si:Q͒|E( 7^|qrF2&tseF#q*J2psI-Ћ_I۩y(?kMĔ.T% U8TY*TqX Kͯ@O[*E( RBXݿw:P6~[Q`mb<i* Qi6l0JknZ`٬4M"6UǽƟLkA(I;0Zrm<-!:c;4y$c };H\O4я9u#A!h|HdOrn0uabz,,UcZ$)*v.KXo||ˡֱ+H<ַ0w،רұW/32lky9e^R^kX |_`n0hO<#戙FM8]\ǻ٫P,VӹC%fQ(p%JJ-*ȸH|wf2/ZV>1.%5i0mFhzJF&IfRD(ML!^&b]I1 $gl& YRl-J9a7(Bjo-hվo/hšVN}+Oog",pU|/VpѭZէBH ^1[ \ S&:9莤10w1c&2}z!t.^mH8ۖm:IHVd3DΪffbŒc꫏(nw=c](Jsoo92|,Ɨ}4FJī8tgL9U齃iO$0 KR_k2bV'Jg7ͥōӵb3MY:'Sٷ/74rC7XH)4yxt~q:^Eu7EGuyu<'@Y8/L|kGyrU'ޱVTwsNUmh>﹠XLDcsb( Uu˘&ENWYoM\J *(siɈvtݪMMz t+|OO'%OӇq pSYxKWSS3G[bT $}Wqjl.>6锿$l=k׶4$rVDG$f"VbZ" 9 ,U@5ǵX~huҮhdQc0n Hx)S_ #7$j5R|U*p&o^FLN8oabsUbR=C|бqnCc̈.Jen_t32]іLLnaH`lp9"maLNuqԘ,fZG$nLMN"g!fj1`u{ED%CEJLߍE!UYIj1rǗdA]#CC TY*^}!s'5P>N燅ЯT$F}Km mΏ唎z@*Fwb> )>q(AX*qM!+C'8\j/*o mL2`HGWs|803ه][ENm!1ͅjI1K~DR m($)V$WS shl&SvNJ2u! \"&pXHŖWB߿xܫ$}̋!SL9wdM5EQ~t_5#.Y.yƈjY4 P9Хx:-GT# 'YFoHV}!P"+zf3iPEb8 [S?қ+F*+{w;b5;Zhޥ͢+ʙU}@l&tz {CR TTZ9U  R5rxv?pCP_8FSJdhˆ/s.q8AfbڋGƈnn mW+4R^}NNGvR}2˧3&&34lb09Ӭ+8>@JBS7v.sr)NQXnڬV'w>^m Tk;7B_iؼ]A'ɦ͜l`'p )̃Gꩊ]M^1#i4 >$(x-OϜV9NPW K92 ]o3EП)寎ޖ3w<:[:f!TC68r:IF.'x W"A+ ,.:Nr?7qS<.!6`O '|~xd{IAKDJ`gf4s4 MuaZI=Y*ڨ}Q~t[ 7p8.Ki,וQ\ 'E&uo7Xy"G R7ꂼ^0P.a BԶ`#;c"\@BEQQ1Gfu}FC;}X`q*qHޒ*1y,MΛK獝k i)n).-`a oz הKQܷ^~T| ,f/l%n/41@85RcCr(u:1*(x _iGo蒘+=fۓJ Yб0L~()/s}Ž.݌1gX 5^HrʝO4eGG9_o-ཀྵ'~3m[H !‡ >THC *dP!!_!!$lުKCfCZbI,vkypqe+>2o?:Lg_UR$|P'U)'7/(q' >о ņ%Vdn_b$9b6)YiAk^goyIo[0)6J꺄Z6潏|뢚ەtʝяN>әX/Ty3=Ɖ)qY)p4Zj* 5D'Ffho&Wk6M7Nu>:^Ws}'GۛәdKFz0wo; G2e{ dp~tP"]娰^%XT=$3$2墹 A!yĂsΡ7r6ϡ=C^Bj* fԙ<$11G wSUg0 廜Av.0M_FiT<1 ~ī7 gHJڶ|nX<7嫭[yn=ti_TTU2k zWN;~~%`b0͌u⸗jR 2 %%GfN= UsJf>2-_"R,o(ދߊ&&ݰ̞UĪx%r3#ǬuN]1x4b܏6\cgL*U1U4C)+>_o XU֮^ǟ *S݃4@_#XM .kWѕ@q|0DѭWNr'II?M_ͭWJs )i>u#;u$^t\̺L1 `A(D`KKfe\ :N{UOJǸlψ**C2JFQ*H-]5$cU^LA-DO2Z:-qUx&f5Wb n Rtx DPamC JfqI-wb2`v45vMKGZXuqNYvFyVsFi)a-ʥ~ VbLZi4[$߃e\X.OEG5Qd`U(k#V^+(}I6"b%`;^#OSÁc= [z!YZCy8#ԃCfm}y3)B:Cq?߹ӉrD 7fų=SXy'6"^4#FxV z/`[\8Q<讈i;QU7 Bn§ÚZېC2FXWeԁܶea_ 6nU%q?'f/Y Z@h߄fu;e iCԘ 0(B 'pz=Wfӽji. EW4ojUI.優ՂW0PVhs; vI>g:3|>T2'C?TN$%.5c7͛gΣYXbU+2v|WT` ֳT:5:VR65 fqclBXaر83O?XX?h++ AP.(J[ex_/4njf0TC3C7wɻ@ٲvM+6$eY),ހ.t 4oiĠgUC:**XL~3v-bpd3 o𖐊($Z& SęD[$ukA!&|"{S^e }σsM0줻w~|-5#xa4ʴSx'Fd;&H6p<[9b1'5*4'%vlnVG(u7?D瓣:5Nk0JX[tKXrt͈}}(S~7A\b hſQ?; ^?E ś䇽;hRDdMqㆸ]Au}p}֟rcd1ȨH3KS6wagJ/ztɂ@L2ڑ~D迓Pq!&cJQE*Ti'awBEA`5v 5龌(I#(M h]R(5NHd7 +`4S2.;ܱd.pZ*&  #E ~R~~co>ዯ~R+ucHBí#o5_6a~3 -lZDu`  E"x>/4O~l-[?wr.WNq^5Kr1!f[ -ea%1KHÑE5ĤNaqLREe1Pga,EˈépBh~4q-%N29^Ҹ_Lpjxur%;cK'wc`lo!|KGZ/.z3>}d0\Q4qfJ<̟awcYr!%U`G"f\%R%j yăF'itNԙZê| qcaN%_q*Y]:$}cn}se*ӳmIœ8FkObُ IWoA ؙ"^)ɒI]&WJLA6znO78 \#B7mL( K~o{92۩j!:oqcɯlIJK\W<.j湭C{eT=1Gn2Cެ9Sw7_ѷ:n\(㾸uغ# =&)>3n#kn=b)^6x}T o&nO):ia,\J.D#r:!Jsě%lW!6W6[ŠaI:D\{Om {YGejf>MٱqC9ϟS{P9ǙOԢ" +㽞wL9o1i)Ec &.f醲S%rwɽw5iMzIrؽحүk߫:~]]/h0F9g"!~IKbnV& aaо`'¼=>pm]6ngۄM}pgoq$5`ҁW i!ǣ1>j,$9֢5d6,:k̷%A$(UL3,WT>,$Nui 6źKxǓgAå[9e;/,0yʵōև5Xi>Ԑ)cTljƴbbbSKx~]l<\>1Wȳ 9)ptNȱ_lےϗ&3'P7vc~Q)-0c~$]OL)fXw+v!, f3 \H6d 6*(P( XqgwhZJzMF9 hDJ@j2eu*\lAffҿb ZoV_7ڟ-F=As5$eC@.H|+@ď @fOH'K2DFuWsw>~oU`"#7nbހn?e:~H[ G0tܹj}\zg{捷?8:rwG_ }/ v'gaNn#6fo3XqrE[Qd)>P6ş++yXWVbRq(F'kwy[MiB~־omvlrnr"F2:jEn`6%fdnˉaЧds>59ýp~;0Xu TšF!386 Msrs\ggGu\l a#2SҲ~ Љknfg b?24 R!sԃI&Bbžg [)4Q@3iYf5[XB DG?W%$~ [t <á]ao蕺MǖQpPi /[s''0@Vv)VLI}(Mi |vL> endobj 57 0 obj << /Type /FontDescriptor /FontName /XFAJQH+Helvetica-Oblique /Flags 96 /FontBBox [-933 -481 1571 1138] /ItalicAngle -6 /Ascent 770 /Descent -230 /CapHeight 717 /StemV 98 /XHeight 523 /StemH 85 /AvgWidth -441 /MaxWidth 1500 /FontFile2 58 0 R >> endobj 58 0 obj << /Length 59 0 R /Length1 11360 /Filter /FlateDecode >> stream xZ tTU= UJzEe$A(B*9&! D(Fl "*ȠTU$"EPI" Bw;vjVT}_U%.Z^뿗޽Cjͪ5LM$RIyeC-WZzEe'){(g"qGmÒt@>n;G8j*{ʩan2"h #IYɬ榳P6%ST 5,뤱r^QrNSβ4Q[)r5N4bv$*Owzc&;id$=}3 H>D=T;U:&%hQhi3gEj` gOi1Ӕ6P1GO.7W9j4ADs3,%o(^b'͟4uS`sN H3[b>iI'-7wG[ͻ < ӓ{͋S:VHϳs-q:tfTs?!^SPi`66BQ|=ya(hMl@=1)5y8exmM-NNLjNL-JNF|Elm6EhcP]n.HtZ'{uYZ 3k9d'{R';f=ttNmd-m "#DNjԘɎ<,<$0@wjqqc # Q?}Yc٥#qelqǕ^7"?Y)8ذ^cWX5 }uFGS_ TQU]GбZoTP\ˋǩ>xhV*X_[{ZU#mVWlUj[׀~H4ԡT:3,\%i9ʒ0{n+s]/|ݣEvK3t4t^~zgm6ų&$rTz첻~9C)߬w *BO(~Mi$jI_sn͢tZkdeDž0nD[PrC)[ j"ֹ4L_f܍KfHm#vLtwmihvS.Ζ5l7lfMW{\̉i%m6tAC_3"_GqqoŽ}$ &=҄BNX/|&LwWKy~VZEлstHdfbl4+` q7]8Y.#_'kvB! kBpNxCJ|Hmk h[$Y`Nmn(cyzL'db_@X(alle1ց?%BBhނĊid\ l!z}D|LYJY*hGiXџg<+,Qk.HYdP-5-5%9)1:Ģ`F0D"#B !AV#K(n-PI)Z\JdTeT`+8]%iÛ޴y޴B14&3C[ ,EBkJOS`-|؍uU(vGQc]03>3{4r#/Mo1B#ڊ8D{bGR{aRSsu>pUz3!3bCNThSУ\րu*(!`)bUd^a9Mbw {8ϥuZۨi4^Rjq(eb3cJJ3:0mqBgp}$23fAlhR8WfyfHD5DAMsY] hZFkF,^>eajVV^VL*)Yh*u `з斕὚Bc  9-ÆY?]zav twUU= q7>lx^塗\A=%7xRȿy̫v(gN4`\)&0hR\v6tv. {։?L`NW1=жEՇxC/w /g:?[!^= aɎj$+:’dυ=_NOp}sՕ})bjךlǯϚȧ?g%zIUpO¸M?c2spC3FxMc1ɐ86c3E4MYK cSf@q}!xoj+^= t-@Ct-@t-@t-@t-@t-@t-@ׂfHmH }u #dүef:~ɾ_1nZ?(zѻް[g.S,ȝ8%fř Z[D365ZzU* 3es(+]0rpx@bmmmmmmmmޚQ[؊l`+[ Vl`+[ VЌ/٧i24MV<<'Bn,l< 9?4pE到=G1Ujmn̛ؖswzSy=o.Ϙ.޺Orڷ`R$o<Pgb?Y,E7"|&ijb7sKC` a! ̅0/8ݶv֨c@tykC׷?2zf O5>vEUKX5_æ̻꛻ KCV{S,T))[53г*ɵw7z;=J KJ𛞘S`9*jI!3Y?{mQtw ZS%]:nGתٿ/.U7Bs~4^G[u]] #J(}v>ge$DQccN |(pH]K4r(|i:>G<.iUfi|BČ5fu>Y>m)SG n}5c}F>8ggOŲ<$tȞ؛stEXRwzU tϺ)8RRRRRw,iλ wEth̐]d˘Qtoy1# F^&SIGUVx$}=[Q$Ư"< l Xb HZ%b X+%b/a XR]q\ç1ipzb=\XW+>W+{\ ۆ d"94T2;~-)g?sGb>!u‡[[>e[\=Xz76חƠxx`@oȧMXA>A>p σ(P'4[WFSJHLȶSћaxFٯHS)4v2Ot/ܷcW9߮IIaYY yr r.%؈Ia/Ju?߮&|Wk&݄wnL` l2M&6&7}HŒnĬ>VDE1Y`L,70v-asغ9Ƥ0ӆLY1h۝#˕x׵_?Jʇr˭ȸ!i~u7gOn+Jʰ?kK(͏Y](yv $xOwhELpF3)/̚^;ik1 6<8>"bO4.rCr[{aL\pΰ n5}_7Z)#v!mx`0,*X 4YRVw8]xxsom>P?!nI>{Xq~ $fɳhI,1m87ृw :1מN]!fFFu7>VVn-+ kj3$DZcge'Ʒo='~Ode\mMn/vv/<0/\ي@RO^(rpteD9~Gم/VLAh5kWWfΨZ^;~a]! ܓ8!]b@!ŐRHd=dd?0 y{3R3H: ]2 ]9 ]5 x@Z~K^6 q\ Կ|omym蟾Zv endstream endobj 59 0 obj 6271 endobj 24 0 obj << /Type /Font /Subtype /TrueType /BaseFont /NADBOA+Courier /FontDescriptor 60 0 R /Encoding /MacRomanEncoding /FirstChar 49 /LastChar 208 /Widths [ 600 600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 600 0 0 0 600 0 0 0 0 0 0 600 0 600 600 0 600 0 0 0 0 0 0 0 0 0 0 0 0 600 0 600 0 600 0 600 600 600 600 600 0 0 600 0 600 600 600 600 600 600 600 600 0 600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 600 ] >> endobj 60 0 obj << /Type /FontDescriptor /FontName /NADBOA+Courier /Flags 32 /FontBBox [-655 -409 1063 1090] /ItalicAngle 0 /Ascent 754 /Descent -246 /CapHeight 587 /StemV 76 /XHeight 457 /StemH 70 /MaxWidth 823 /FontFile2 61 0 R >> endobj 61 0 obj << /Length 62 0 R /Length1 12548 /Filter /FlateDecode >> stream x՚{t[՝9Ȳ-KȲ,+-{ohӆ˕Kݡtpu+o lׯY)_˦>ڸb5VVWtke;Jbˬi]Z5Z}[\t.?iҭ竓kYn?~Pn޸)߿6,߯@imоoUSj;Szjlm-6œG۬[7˗NUlx*7/V}yZ㺲hCʰ/И& zhy-Vsd.Q/0Bn*mHգ{ybJQ[~O+?RܚwD?i n?zGٽqGgԖбHh`ߠ뻴?2=g`_peF̼࠺5/ N&1!n= 7gjepSYz^pP/쿤^(9xla^h`ŕbٽrlOy5ej`nHhݻGD1H9# K$䗁H(b<ۑwYLV u\ *\z~uX_=e "0,ka sf?_uTvm.60c6Z?=qMeX|xiASNP Tjg jGyUSFG_󛫝]d>i*kO/("[qqݨ3cU}͵<^M=`(;QYgC5 |\=ZqR -\mhhimCXZaurW} fYI˲ <hP:dvhnTg(.fQ3|Q&<ڦUip;6Ek׹ =[r5%AY?<КLy"l8hlcGz%/ߔGXᅲUv0cTF2G_5}j"9`]`xy fiVfs۝'eJvd*R\)"6+bPZdACp4B.4B.4B.4B.4B.4B]*g̹ ž-me0\se0\se0ajSAlj!YN+;:(j3, +הzkeR/v$U쎯i՘-yLd,`>\bmlk: O-UL(o Sя޼gmxnZ$,_z/iK۶ݳx޶ځ_}bHO}<}jjtt5: hik8P+󔩏i=lV`'xGk$i5*ƇU{Viܙ;{CjgЋ/zm>l«]{Lv"Yt֟ (!xna=;,(.ܦN?2%Ǜ2XbZ,Ceh -2XXrU0gڌpM$Bo*B T[|i悚ʊ6մ3ZGs#CJ%&YނlyxCoK0  _zʨ͵nڼqBd0Ys  pUهY])&Rt/E11HQhEˬ4G5(ѐ0T").:'⩦CEE,DkY|Te3=gKVZ*||*)>+7j4iҼt$ܷ{9s<4! oc=n7/[a'3Ӑq_`u!x$6nh$0~gwq:mj u:w-莳0vϝ*3ș}{z&7&;dpnMv7&;D!4N!g2v'9|Ns2d>'9I0$N3>_ò|XaY>,ˇe,ò|X`Y>,džyif%ba~_< zi oǚ|}#:o(kj#Oc1O|yߦVE#=!;:bf S]h1KD*jV#EG(:BPt# i>m\Bg aPV`'xGk`Q倕բB5oO~YZ~-̪3mwU?~gGoڳ ;|nG=eM0ѷ3ʬ*F¡U\%6ڒ'ҶIuHw{DvRO9NMAIlIFf1+ɛbRXh!4roniN 8<./?\whi5㹃F#RDmiӏMыNLgCsqnm00TI;K2yEWtxEWtxEWtxEWtxEWtx%o&8L^H1*M˨d MI8Z~Ѵ 0f/+Y*X\G\m%HP' :O:O:O:O:O:O8+H5e7u "|%TR05뀅D _Gmޜx8{1M'3扑AT(<1T*j';NԜ homܒDswAl P+4L)iUZ~_fđ<2īHS&Mj&<a¡i-y d֊CuۨĴ)iD,9E2Jim/5$Zd<ӄLӮPT ۶q{P4 c2WsXY3V#¾J!Vwa`%G."O,mkNhs$7sI:cOS(}eh=ReW y D|EObJ+UjZS" 2:\cDwdx1e8  %.%2)uހE$ř$ġX$ġ8T'q$ġ8TM$q$sPU,: 3XI~RWP6)PB>ϡZlJe2KyTESpPѾgq(۶`2)jL%S13iF0TVH !h20V[.<] D*FlS'rT :b :|ALuSIT"S&ʺY*l;^x ~9LbFݲ ;V!'D3ڱ ;Va*XcvŽUر ;V!KIvJ4Ԑ̼YV|W{r'?(wR~޽/i}ռVT֤fITڝÄ;qJ<{.w",r",r",r",r",rZ[) [΢›<75/K]N4*w9-Ic#iK,i`5(8b#af*j'NIԹ|5뮘|%f9_}u [cMfzfS4vd$RZM.9)8}2Y䃍GתΪWo8|u=Y&Qr*DuKrrn^v>=k vi;Yg&v1Dqv>p%X(` %PX*S@B VkGv.ކUEy$QJjr}|rNdCQ9|[=Kt&,bvف?;gvLp) ÎNl\ĸhX*%翇n?=x]O?}O6N9|˹Z\{߸7o͒Pebɸ'޵ç훗{Zu_:/WvA)=q31E}S^8C"38'ˋk?{gIP-PQETVM#&I\V"if!*΁6CH3'{&roM˂\ض1R}b˦c'߼U}dž}OuQQO.%L.d$dazM5&d ^k2xM5ԬJbɘ^SKVU%`*X %`*X %`*تXMW*w\Q|ė&g L :kSؾqݜgJ{c9* _%||2,J|Ns2d>'9|NsZ@覑UŬX Jb14^Kcxi /a14((̒$BYQ<A?XApwDnꫧp^xen%eNzZf؅C5ԁoc7?#&oKxK'wɺ)N']ӯu=;ݖD63mkl.lǞԍڰ~~u1DSa]m oK=G̵/ZIEYY`寡m;Z?̱H'.q5_rYR!N>Y@ӷKr7^or TD:/ s>d KD͍,Y֤-@/w4ghaj?vDR^Ҕ: uRbH^*U5I|^gJ$K wcK|6R9Z~5B%hLi5 Ra,&QWJ8p#JLS憍k~+ފ7oNɮ}7hk뿹i*m(4#f~&MC+B:&:A+=ps3ayRqNE7?ǘHc`Gq.1DiTBGAoA,x >h!X^=Ǽ֠#}#G/_8#׏蛿/Y1tԬѿiD#Fmyo8iD󈾔(JHm endstream endobj 62 0 obj 7270 endobj 17 0 obj << /Type /Font /Subtype /TrueType /BaseFont /ONKNYY+Helvetica-Bold /FontDescriptor 63 0 R /Encoding /MacRomanEncoding /FirstChar 32 /LastChar 121 /Widths [ 278 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 333 0 0 0 0 0 0 722 0 722 722 667 611 0 722 278 0 0 611 833 0 778 0 0 0 667 611 722 0 0 0 0 0 0 0 0 0 0 0 556 611 556 611 556 333 611 611 278 0 556 278 889 611 611 611 611 389 556 333 611 0 778 556 556 ] >> endobj 63 0 obj << /Type /FontDescriptor /FontName /ONKNYY+Helvetica-Bold /Flags 32 /FontBBox [-1018 -481 1436 1159] /ItalicAngle 0 /Ascent 770 /Descent -230 /CapHeight 720 /StemV 149 /XHeight 532 /StemH 127 /AvgWidth 621 /MaxWidth 1500 /FontFile2 64 0 R >> endobj 64 0 obj << /Length 65 0 R /Length1 13688 /Filter /FlateDecode >> stream x{ xTU9wK;5Kw;MHB `"  d4PVqCE\ 42q\y:(/0(f\&J_v!|7;gԩSEwv -Zh0kR>yY ڻK9kbgf@9].Rouf7;;g EP.H= / c 5Yv/̏By{p< Ҕ;~8\= iWעH0z B(/`_RoC v igfD~ 2ެ5$꯯WJO.UNEHJ>jIFi%ŴH*`/,E׏$f-uZ&\kQ1W!Vzu^Q-TGxc8 `)緎+yzroAc'ʡq<-@A'`).ǟS/tzױw9X<$yxgQp<o]4l ?xw8ZLt~%}zc'1ĒhS8QO;pԒ{RxÎ pz0~ƣ[[i`MJƻ(9Hp2{?ƢT<%kRgױkR%(HS ~?|*̻>^ A},I$``(y=Eƣ1/)G|ՕMlLc)n{y$o%QO6.߸wUͿqIտfӹrm3guÿQtkT<47+iUSM:*{*w{e 7̵ah1Wՠ<7l 55 5(sW͝\>d`Lvg*P@h#z~%hp )Bw?GB] f B+C~@dEuh)hL79_.`fF>cƇ6 va7N7.@plA{C%ܗ+M@+aO'tDքAT4 ]h;څWzdX_j~&+2]s+f$3t G0 Tx6b2]cT=WCtQ3h<ĿʧZU& %KFp pN@ih$I uw݉~amC9,b=ƹx,oƷA" ʦ|wS^O*11L|ϱb.'ɿυ2CC;/fzP*D1T\'7vYE؇OЗ p,.Kp ovp/>XƇi|_lʤnک݉So+.:Τkɡ}7L3YȬdz#l;v[qousy/2N\8 ^JwAكuiM~ ~@}idp39 7?ѿFAPV+5RSIwH۬)&hGxeh *wuӟg55n*NIkzJsΰR4띥43YvOT<}Rt7;J^oVZȻ\Y6gzIgOU[ef>$a ffCIHM1@1Gܐ6:}aRSUe՜cfgy<J0 ̘Fl l#&?t]鷬`x-WF?TS6I7Avin{9{xc"mӯrW;{QCS]W*&ٔBf!. ʡrtYWӿ ן#u!m &s~,h3f S JtM_39F{gey*]9*[~0Ξopō5.I-"C"KGRIطDa5֪*LέL083jHд8tOUq 4[ A!#*\ aj"gϸ=jg'Ӝ dAS\~9v(<"#нFR*;3jaU Mk*cRe3 r0W͵FpsҠ=/< 5k`2&Cv]  )R@ pig!qb.@4Y)\87"y!y"!Lo ,y&!$︎}|؋.A`; =| i}s{6·:m*]+4+! i0 0ҍ|_6J_ӗ3ǚ *c R 7VR݅l$,nDwF9KWI?&R(:ͮdTiz;w}3?Y72ſ0P|h=Uo ` ]Sic]0[bGowE'؜)PPo/+74崘-do;2Ř󊋊]r9^ffB'=ǧf;pn|PG637u``Cϼ6￿2Ϸkԛ'pmժ`M1/xy8ϸD0=vfyZKTif$pz 'lV[;# kK\X.&=OB%~ǝ}ߩ#7?V_Q7x9:8'>ZN_{-ϼ)~D= RWlrCN@$z /)z4h\x0 Po 蜫O0>jW$ЃŒOc(-v5-$l:`φl p.n3v1`<\.퓃! s\jT(ʼni4RZX!k)ui}OhRe,}w\Jy_}_GSoW:XBPg8} m,ܑpkbX;0ɋy;أ f/ERrV<r4''Xvpu7ѫc+ /mP eD}fÂMBcH3B8u; нhaz*"|cQe*7yh17dGebqU.)1hP myZg@N^ylф@OgZz,AW-> /7-lGxQPT%l"|X?ߕ/S'kR/?v5y7X rrCg>=Vίrk֘}e,x̙sOcOӸ>}.8,=o?>so`Hr \ 4OdeqYh:s/dS{w~T4CuՑdujƚN)OWe[f,)\G&Te ?)Em,4!"JQl zJL1CS TTJ]jwI҆]`'| {ۖ_[Ec5 ڑw5kոo`Ԝ+)Ij6kwJ򷘿Ȥr~9rϣI4brnꥒLlT}.rP? *XOt 9"9.ߐأիc#)}!6 XS\Ae6bJlO%LFP\$Q(Ą>Oɟxoz. I%۫tkje7GL 3l8& y/'b:- )tI3YYiU'ƚ3F84Q]FNc3B?cвDKyą j:r`!Yر(~XjQ(|D%+萀-&WBOw"HG9toŤ-OL:#-AUc7Rt\VGַ,~x]`Rio|)Fً%=вyWdMmkDYïO5w)2) ##r )ITdyj:ʞZJj96G~8 -P dh-XkQnX;?:ݘ?qEKV$v<<"׿ao|+˽EΆ l_p.%opq6WtS Nۥ=f;35;ƀLS'ΛuFPQ'苢(ow E'b' o|`,))B+,01Rzzӱ0..ST-NWA}gfr,uxTnu[?݋ >û^Lw/R% XxJO#GsbGTh{s^im ΃r"-OBuA[P+v`|yԮK郫;F7srzJQބ , .zצٴOCg0zVW-tl;*ӳZZ?y/'!fmu:8{2~|w~<֯g0۷Hu3twh.$x1#VmDȲ21MFCiʡے`s{פg+ؽ86}[ bvryWD+\h$'a~όT̵T`nM'q!^y <5H͋i, _ȾV]PQ> PLPcj GT^ j-{Лh^Ar4zz?ap L#JZ@^a^ ^,WRDUP(& l~+9J-pV.fRL.nsezf#_{-7Ʈg ׄ3Ujx?,oRpJdhNEZ,zکQKjF ^NS[?F69-tFW4CFqQ [AO]*ynlųpoWȗ#NyFp6>R~j#xh a%Ɨva{ Ax)5]txhy=*.kHkH 1y C @>p-w 4h -ĩ2AO$ZF0Qգ%U&t X 50Հj&l'+N般ivMY` YH>ɗ)lL%iHSauG;K&7gT& NNY0.О1qbfsꑊ23ad߶"QZ)&qSaSy@Y(@|v1r2_d˵xYKڒ`G6ueZ&RۦeMYY$U]LpD zz=mZhicj".l6{/?t܅lC&ѝEhˆTNx~oD&L]UWQYSĆco޻{}wΑSONM-Hx)-qvVt֪-9GK{Q9LưqjpȪ*4W WwQڸtUCD>TGǦip"a ӂ|0//HeExŲZs6-b\ju8N=UI=M NȘ=#3)ꌌ(7'L>ɞAQ>ݖu5>qJſ .8(fw٧KTyƢNvs<9;YYZkqjl!МxBpT݉/9'%Eoeij7SLEKԤ/dK3^h;L=Yw65GFBU X@~ "'k9M$G"$Dޣnzj/N>/G{/i՗iECdek[ z)f"'Ne-QAxyC<| ^`02,5Ba z`*VyvVQaN"8n**U<64E}bro!<D+cc~' StaYhֿbճ髄KCmlSOb-ĭ`Wx œ坐P)U>KX$Pޗ4qE--9.7h3yv[yr.k"mjz:bb4rj4^Z-r</V4iNB*#ڡ@#V `~h!4 yf筃@+P~@Qny@0\`5.[J~䂇I5B0 tWT<{RF(m܅G陿HrV-fYsLs1Q>!VxK7^ѭĻ"ŕ`uUû5hx^ oO߱ޕmDxw ޛnH889qBK:ϝ՞Yq٤׵@N| UClxpc :r$6.5+BP3pX1\>]=_9jXzXfXY1++OV<> endobj xref 0 72 0000000000 65535 f 0000083633 00000 n 0000003998 00000 n 0000027350 00000 n 0000000022 00000 n 0000003978 00000 n 0000004117 00000 n 0000007029 00000 n 0000042904 00000 n 0000000000 00000 n 0000028744 00000 n 0000004238 00000 n 0000028462 00000 n 0000028225 00000 n 0000027970 00000 n 0000027746 00000 n 0000027511 00000 n 0000073762 00000 n 0000004293 00000 n 0000007008 00000 n 0000011417 00000 n 0000007065 00000 n 0000011396 00000 n 0000011524 00000 n 0000065603 00000 n 0000020379 00000 n 0000011658 00000 n 0000020358 00000 n 0000020486 00000 n 0000025200 00000 n 0000020620 00000 n 0000025179 00000 n 0000025307 00000 n 0000058350 00000 n 0000027133 00000 n 0000025441 00000 n 0000027112 00000 n 0000027240 00000 n 0000027461 00000 n 0000027632 00000 n 0000027688 00000 n 0000027868 00000 n 0000027924 00000 n 0000028091 00000 n 0000028147 00000 n 0000028347 00000 n 0000028403 00000 n 0000028584 00000 n 0000028640 00000 n 0000029906 00000 n 0000029181 00000 n 0000029886 00000 n 0000030154 00000 n 0000042882 00000 n 0000043596 00000 n 0000043846 00000 n 0000058328 00000 n 0000058960 00000 n 0000059220 00000 n 0000065582 00000 n 0000066147 00000 n 0000066380 00000 n 0000073741 00000 n 0000074195 00000 n 0000074453 00000 n 0000083412 00000 n 0000083433 00000 n 0000083473 00000 n 0000083526 00000 n 0000083552 00000 n 0000083594 00000 n 0000083613 00000 n trailer << /Size 72 /Root 38 0 R /Info 1 0 R /ID [ <67a6a604db234baabb96891b8c06513b> <67a6a604db234baabb96891b8c06513b> ] >> startxref 83777 %%EOF sumaclust_v1.0.36+ds/README.md0000644000175000017500000000011313170202054015275 0ustar pierrepierre[See the wiki](https://git.metabarcoding.org/obitools/sumaclust/wikis/home)sumaclust_v1.0.36+ds/sumaclust.h0000644000175000017500000000115212551664362016233 0ustar pierrepierre/* * sumaclust.h * * Created on: april 2, 2012 * Author: mercier */ #ifndef SUMACLUST_H_ #define SUMACLUST_H_ typedef struct { int32_t next; int32_t threads_number; int* potential_nexts_list; fastaSeqPtr* db; int n; int normalize; int reference; BOOL lcsmode; BOOL fast; double threshold; BOOL stop; int sizeForSeqs; int16_t** addresses; int16_t** iseqs1; int16_t** iseqs2; int seeds_counter; double worstscore; double max_ratio; int64_t elapsedtime; } thread_control_t; #endif /* SUMACLUST_H_ */ sumaclust_v1.0.36+ds/._global.mk0000644000175000017500000000025313446627704016054 0ustar pierrepierreMac OS X  2yTEXTATTRcom.apple.TextEncodingUTF-8;134217984