Gk-arrays
Efficient read indexing
gkSABuilder.h
00001 /******************************************************************************
00002 *                                                                             *
00003 *  Copyright © 2010-2013 -- IRB/INSERM                                        *
00004 *                           (Institut de Recherches en Biothérapie /          *
00005 *                           Institut National de la Santé et de la Recherche  *
00006 *                           Médicale)                                         *
00007 *                           LIFL/INRIA                                        *
00008 *                           (Laboratoire d'Informatique Fondamentale de       *
00009 *                           Lille / Institut National de Recherche en         *
00010 *                           Informatique et Automatique)                      *
00011 *                           LIRMM/CNRS                                        *
00012 *                           (Laboratoire d'Informatique, de Robotique et de   *
00013 *                           Microélectronique de Montpellier /                *
00014 *                           Centre National de la Recherche Scientifique)     *
00015 *                           LITIS                                             *
00016 *                           (Laboratoire d'Informatique, du Traitement de     *
00017 *                           l'Information et des Systèmes).                   *
00018 *                                                                             *
00019 *                                                                             *
00020 *  Auteurs/Authors: Nicolas PHILIPPE <nicolas.philippe@lirmm.fr>              *
00021 *                   Mikaël SALSON    <mikael.salson@lifl.fr>                  *
00022 *                   Thierry LECROQ   <thierry.lecroq@univ-rouen.fr>           *
00023 *                   Martine LÉONARD  <Martine.Leonard@univ-rouen.fr>          *
00024 *                   Éric RIVALS      <eric.rivals@lirmm.fr>                   *
00025 *                                                                             *
00026 *  Programmeurs                                                               *
00027 *      /Progammers: Nicolas PHILIPPE <nicolas.philippe@lirmm.fr>              *
00028 *                   Mikaël SALSON    <mikael.salson@lifl.fr>                  *
00029 *                   Jérôme AUDOUX    <jerome.audoux@etud.univ-montp2.fr>      *
00030 *  with additional contribution for the packaging of:                         *
00031 *                   Alban MANCHERON  <alban.mancheron@lirmm.fr>               *
00032 *                                                                             *
00033 *  Contact:         Gk-Arrays list   <crac-gkarrays@lists.gforge.inria.fr>    *
00034 *                                                                             *
00035 *  -------------------------------------------------------------------------  *
00036 *                                                                             *
00037 *  Ce fichier fait partie de la librairie Gk-arrays.                          *
00038 *                                                                             *
00039 *  La librairie Gk-arrays  a  pour objectif d'indexer de grands ensembles de  *
00040 *  lectures de séquences issues du séquençage haut-débit.                     *
00041 *                                                                             *
00042 *  Ce logiciel est régi par la licence CeCILL-C soumise au droit français et  *
00043 *  respectant les principes  de diffusion des logiciels libres.  Vous pouvez  *
00044 *  utiliser, modifier et/ou redistribuer ce programme sous les conditions de  *
00045 *  la licence CeCILL-C telle que diffusée par le CEA, le CNRS et l'INRIA sur  *
00046 *  le site "http://www.cecill.info".                                          *
00047 *                                                                             *
00048 *  En contrepartie de l'accessibilité au code source et des droits de copie,  *
00049 *  de modification et de redistribution accordés par cette licence, il n'est  *
00050 *  offert aux utilisateurs qu'une garantie limitée.  Pour les mêmes raisons,  *
00051 *  seule une responsabilité  restreinte pèse  sur l'auteur du programme,  le  *
00052 *  titulaire des droits patrimoniaux et les concédants successifs.            *
00053 *                                                                             *
00054 *  À  cet égard  l'attention de  l'utilisateur est  attirée sur  les risques  *
00055 *  associés  au chargement,  à  l'utilisation,  à  la modification  et/ou au  *
00056 *  développement  et à la reproduction du  logiciel par  l'utilisateur étant  *
00057 *  donné  sa spécificité  de logiciel libre,  qui peut le rendre  complexe à  *
00058 *  manipuler et qui le réserve donc à des développeurs et des professionnels  *
00059 *  avertis  possédant  des  connaissances  informatiques  approfondies.  Les  *
00060 *  utilisateurs  sont donc  invités  à  charger  et  tester  l'adéquation du  *
00061 *  logiciel  à leurs besoins  dans des conditions  permettant  d'assurer  la  *
00062 *  sécurité de leurs systêmes et ou de leurs données et,  plus généralement,  *
00063 *  à l'utiliser et l'exploiter dans les mêmes conditions de sécurité.         *
00064 *                                                                             *
00065 *  Le fait  que vous puissiez accéder  à cet en-tête signifie  que vous avez  *
00066 *  pris connaissance de la licence CeCILL-C, et que vous en avez accepté les  *
00067 *  termes.                                                                    *
00068 *                                                                             *
00069 *  -------------------------------------------------------------------------  *
00070 *                                                                             *
00071 *  This File is part of the Gk-arrays library.                                *
00072 *                                                                             *
00073 *  The Gk-arrays library aims at indexing k-factors from a huge set of        *
00074 *  sequencing reads.                                                          *
00075 *                                                                             *
00076 *  This software is governed by the CeCILL-C license under French law and     *
00077 *  abiding by the rules of distribution of free software. You can use,        *
00078 *  modify and/ or redistribute the software under the terms of the CeCILL-C   *
00079 *  license as circulated by CEA, CNRS and INRIA at the following URL          *
00080 *  "http://www.cecill.info".                                                  *
00081 *                                                                             *
00082 *  As a counterpart to the access to the source code and rights to copy,      *
00083 *  modify and redistribute granted by the license, users are provided only    *
00084 *  with a limited warranty and the software's author, the holder of the       *
00085 *  economic rights, and the successive licensors have only limited            *
00086 *  liability.                                                                 *
00087 *                                                                             *
00088 *  In this respect, the user's attention is drawn to the risks associated     *
00089 *  with loading, using, modifying and/or developing or reproducing the        *
00090 *  software by the user in light of its specific status of free software,     *
00091 *  that may mean that it is complicated to manipulate, and that also          *
00092 *  therefore means that it is reserved for developers and experienced         *
00093 *  professionals having in-depth computer knowledge. Users are therefore      *
00094 *  encouraged to load and test the software's suitability as regards their    *
00095 *  requirements in conditions enabling the security of their systems and/or   *
00096 *  data to be ensured and, more generally, to use and operate it in the same  *
00097 *  conditions as regards security.                                            *
00098 *                                                                             *
00099 *  The fact that you are presently reading this means that you have had       *
00100 *  knowledge of the CeCILL-C license and that you accept its terms.           *
00101 *                                                                             *
00102 ******************************************************************************/
00103 
00104 #ifndef GKSABUILDER_H
00105 #define GKSABUILDER_H
00106 
00107 #include "gkArraysTypes.h"
00108 #include "gkArrays.h"
00109 #include "solArray.h"
00110 #include <semaphore.h>
00111 
00112 using namespace std;
00113 
00114 namespace gkarrays {
00115 
00116 struct qs
00117 {
00118   SolArray *gkSA;
00119   SolArray *values;
00120   int64_t start;
00121   int64_t end;
00122   int threshold_sort;
00123   sem_t *s_threads;
00124 };
00125 
00129  void init_qs_ptr(struct qs *data, SolArray *sa, SolArray *val, int64_t start,
00130                   int64_t end, int threshold_sort, sem_t *s_threads);
00131 
00132 struct subGkSA
00133 {
00134   //general features
00135   unsigned char *cr;
00136   SolArray *gkSA;
00137   SolArray *values;
00138   int m;
00139   int k;
00140   gkArrays *gk;
00141   //subGkSA features
00142   uintSA start;
00143   uintSA end;
00144   uintSA offset;
00145 };
00146 
00147 class GkSABuilder {
00148   
00149  private:
00150   SolArray *gkSA;
00151   
00152  public:
00153  
00154   GkSABuilder();
00155   ~GkSABuilder();
00156 
00169   void build(SolArray *values, unsigned char* cr, uintSA length, int k, 
00170              gkArrays *gk, int threshold_sort, 
00171              array_type type, uint nb_threads);  
00172 
00176   SolArray *getGkSA();
00177   
00178 };
00179 
00191  void quickSort(SolArray *sa, SolArray values[], int64_t start, int64_t end,int threshold_sort,sem_t *s_threads, bool is_threaded=false);
00192 
00199 void* quickSortT(void* data);
00200 
00210 int64_t partition(SolArray *sa,SolArray *values,uintSA start, uintSA end,uintSA p);
00211 
00216 void insertion_sort(SolArray *sa , SolArray *values, int64_t &start, int64_t &end);
00217 
00218 //return the value at pos p on the strand forward
00219 //the last parameter is just for the compatibility with valns
00220 uintSA vals(uintSA p,unsigned char dna[],int k,int64_t *last,uintSA *valfwd, uintSA *val=NULL);
00221 
00222   //return the minumum value of the k-mer at pos p between strand rev and stran fwd
00223 uintSA valns(uintSA p, unsigned char dna[],int k,int64_t *last,uintSA *valfwd,uintSA *valrev);
00224 
00225 // It is a function that is common to calcs and calcns
00226 // It performs all the computations for putting the values in GkSA, and dedicates
00227 // the GkSA value calculation to the function given in parameter
00228  void *calc_gkSASubPart(void *data);
00229  
00230  inline void swap(SolArray *sa,SolArray *values, uintSA &a, uintSA &b){
00231    if(a!=b){
00232      uintSA temp = values->get(a);
00233      uintSA temp2= sa->get(a);
00234      values->set(a, values->get(b));
00235      values->set(b, temp);
00236      sa->set(a,sa->get(b));
00237      sa->set(b,temp2);
00238    }
00239  }
00240 
00246   inline uintSA med(SolArray *array,uintSA a,uintSA b,uintSA c){
00247     uintSA x=array->get(a);
00248     uintSA y=array->get(b);
00249     uintSA z=array->get(c);
00250     uintSA max;
00251     uintSA min;
00252     if(x<y){
00253       min = a;
00254       max = b;
00255     }else{
00256       min = b;
00257       max = a;
00258     }
00259     if(array->get(max)<z){
00260       return max;
00261     }else{
00262       if(z>array->get(min)){
00263     return c;
00264       }
00265       return min;
00266     }
00267   }
00268 }
00269 #endif
 All Classes Functions