docs: def _splitGenoGeneWindow(self,annotation_file=None,cis=1e4,funct='protein_coding',minSnps=1.,maxSnps=SP.inf):
          """
          split into windows based on genes
          """
           #1. load annotation
          assert annotation_file is not None, 'Splitter:: specify annotation file'
          try:
              f = h5py.File(annotation_file,'r')
              geneID = f['geneID'][:]
              gene_chrom = f['chrom'][:]
              gene_start = f['start'][:]
              gene_end = f['end'][:]
              gene_strand = f['strand'][:]
              gene_function = f['function'][:]
              f.close()
          except:
              print('Splitter:: format annotation file not valid')
  
          # if funct is not None, it has to be a list
          if funct is not None and funct!=list:   funct=[funct]
  
          windows = []
          nSnps   = []
          Igene   = []
          #2. calculates windows 
          for gene_i in range(geneID.shape[0]):
              if funct is not None:
                  if gene_function[gene_i] not in funct:
                      Igene.append(False)
                      continue
              wnd = [gene_chrom[gene_i],gene_start[gene_i]-cis,gene_end[gene_i]+cis]
              Ir = (self.chrom==wnd[0])*(self.pos>=wnd[1])*(self.pos<=wnd[2])
              _nSnps = Ir.sum()
              if _nSnps>=minSnps and _nSnps<=maxSnps:
                  windows.append(wnd)
                  nSnps.append(_nSnps)
                  Igene.append(True)
              else:
                  Igene.append(False)
          Igene = SP.array(Igene)
          self.info['nSnps'] = SP.array(nSnps)
          self.info['geneID']        = geneID[Igene]
          self.info['gene_start']    = gene_start[Igene]
          self.info['gene_end']      = gene_end[Igene]
          self.info['gene_strand']   = gene_strand[Igene]
          self.info['gene_function'] = gene_function[Igene]
          return SP.array(windows)