code: public KAlignmentResult<P> align(NucleotideSequence sequence, int from, int to, boolean restrictToRange, BitArray filter) {
          KMappingResult kResult = mapper.align(sequence, from, to, filter);
  
          KAlignmentResult<P> result;
          if (restrictToRange)
              result = new KAlignmentResult<>(this, kResult, sequence, from, to);
          else
              result = new KAlignmentResult<>(this, kResult, sequence, 0, sequence.size());
  
          if (!lazyResults)
              result.calculateAllAlignments();
          else
              result.sortAccordingToMapperScores();
  
          return result;
      }
docs: Performs a comprehensive alignment of a sequence.
  <p/>
  <p>The procedure consists of 2 steps:</p>
  <ul>
  <li>1. Obtaining {@link KMappingResult} from {@link
  KMapper}
  using {@link KMapper#align(com.milaboratory.core.sequence.NucleotideSequence)}
  which contains preliminary hits
  </li>
  <li>2. Using {@link KMappingResult} from step 1, obtaining {@link
  KAlignmentResult}
  by {@link #align(com.milaboratory.core.sequence.NucleotideSequence, int, int, boolean, BitArray)} method,
  where all hit alignments may be loaded lazily (at first request) or immediately (depends on {@link #lazyResults}
  flag value)
  </li>
  </ul>
  
  @param sequence        sequence to be aligned
  @param from            first nucleotide to be aligned by {@link KMapper}
  (inclusive)
  @param to              last nucleotide to be aligned by {@link KMapper}
  (exclusive)
  @param restrictToRange {@code} true if hits alignments from obtained {@link KAlignmentResult}
  should be
  restricted by the same range ({@code from} - {@code to})
  @return a list of hits found in target sequence