/*
* Copyright 2015 MiLaboratory.com
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.milaboratory.core.sequence;
import com.milaboratory.util.HashFunctions;
/**
* Don't use this class.
*
* @author Dmitry Bolotin
* @author Stanislav Poslavsky
*/
public final class UnsafeFactory {
private UnsafeFactory() {
}
public static NSequenceWithQuality fastqParse(
byte[] buffer,
int fromSequence,
int fromQuality,
int length,
byte qualityValueOffset,
long id,
boolean replaceWildcards) {
// Seed for random generator of letters substituting wildcards
long seed = id;
// Creating builders for sequence and quality
SequenceBuilder<NucleotideSequence> sequence = NucleotideSequence.ALPHABET.createBuilder().ensureCapacity(length);
SequenceQualityBuilder quality = new SequenceQualityBuilder().ensureCapacity(length);
byte qual, code;
int pointerSeq = fromSequence, pointerQua = fromQuality;
// Parsing quality and sequence
for (int i = 0; i < length; ++i) {
qual = (byte) (buffer[pointerQua++] - qualityValueOffset);
code = NucleotideAlphabet.byteSymbolToCode(buffer[pointerSeq++]);
if (code == -1) {
if (buffer[pointerSeq - 1] == '.')
code = NucleotideAlphabet.N;
else
throw new IllegalArgumentException("Unknown letter \"" + buffer[pointerSeq - 1] + "\"");
}
if (replaceWildcards && NucleotideSequence.ALPHABET.isWildcard(code)) {
seed = HashFunctions.JenkinWang64shift(seed + i);
code = NucleotideSequence.ALPHABET.codeToWildcard(code).getUniformlyDistributedBasicCode(seed);
qual = 0;
}
sequence.append(code);
quality.append(qual);
}
// Returning result
return new NSequenceWithQuality(sequence.createAndDestroy(),
quality.createAndDestroy());
}
}