Skip to content

Commit

Permalink
Merge branch 'release/v2.0.4'
Browse files Browse the repository at this point in the history
  • Loading branch information
dbolotin committed Feb 4, 2017
2 parents 5e53233 + 04140fb commit 4cb38f2
Show file tree
Hide file tree
Showing 12 changed files with 237 additions and 27 deletions.
3 changes: 3 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
[submodule "repseqio"]
path = repseqio
url = https://github.com/repseqio/repseqio.git
23 changes: 23 additions & 0 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
language: java

sudo: false

git:
submodules: false

before_install:
- sed -i 's/git@github.com:/https:\/\/github.com\//' .gitmodules
- git submodule update --init --recursive
- rm -rf ./repseqio/.cache
- mv .cache ./repseqio/.cache
- cd repseqio/milib && mvn clean install -DskipTests -B && cd ..
- mvn clean install -DskipTests -B && cd ..
- mv ./repseqio/.cache .cache

jdk:
- openjdk7

cache:
directories:
- $HOME/.m2
- .cache
8 changes: 8 additions & 0 deletions CHANGELOG
Original file line number Diff line number Diff line change
@@ -1,4 +1,12 @@

MiXCR 2.0.4 ( 4 Feb 2017)
========================

-- Fix for NPE in `-nMutations ...` `-aaMutations ...`
-- Correct visualization of D gene P segments in exportAlignmentsPretty
-- minor: Fix for error in export when fields are given in the file


MiXCR 2.0.3 (26 Dec 2016)
========================

Expand Down
23 changes: 23 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
[![Build Status](https://travis-ci.org/milaboratory/mixcr.svg)](https://travis-ci.org/milaboratory/mixcr)

## Overview

MiXCR is a universal software for fast and accurate analysis of raw T- or B- cell receptor repertoire sequencing data.
Expand Down Expand Up @@ -42,6 +44,27 @@ For more details see documentation.

Detailed documentation can be found at https://mixcr.readthedocs.io/

## Build

Dependancy:

- Maven 3 (https://maven.apache.org/)

To build MiXCR from source:

- Refresh git submodules

```
git submodule update --init --recursive
```

- Run build script. First build may take several minuties to download sequences for built-in V/D/J/C gene libraries from NCBI.

```
./build.sh
```


## License

Copyright (c) 2014-2015, Bolotin Dmitry, Chudakov Dmitry, Shugay Mikhail
Expand Down
83 changes: 83 additions & 0 deletions build.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
#!/bin/bash

# Linux readlink -f alternative for Mac OS X
function readlinkUniversal() {
targetFile=$1

cd `dirname $targetFile`
targetFile=`basename $targetFile`

# iterate down a (possible) chain of symlinks
while [ -L "$targetFile" ]
do
targetFile=`readlink $targetFile`
cd `dirname $targetFile`
targetFile=`basename $targetFile`
done

# compute the canonicalized name by finding the physical path
# for the directory we're in and appending the target file.
phys_dir=`pwd -P`
result=$phys_dir/$targetFile
echo $result
}

os=`uname`
delta=100

dir=""

case $os in
Darwin)
dir=$(dirname "$(readlinkUniversal "$0")")
;;
Linux)
dir="$(dirname "$(readlink -f "$0")")"
;;
FreeBSD)
dir=$(dirname "$(readlinkUniversal "$0")")
;;
*)
echo "Unknown OS."
exit 1
;;
esac

if [[ ! -f ${dir}/repseqio/milib/pom.xml ]];
then
echo "Please init git submodules. Try:"
echo "git submodule update --init --recursive"
exit 1
fi

function error_exit {
echo -e "$1"
exit "${2:-1}"
}

GREEN='\033[0;32m'
RED='\033[0;31m'
NC='\033[0m' # No Color

echo "Building MiLib."
cd ${dir}/repseqio/milib
mvn clean install -DskipTests -B || error_exit "${RED}Problem building MiLib!${NC}" 1

echo "Building RepSeq.IO util/lib"
cd ${dir}/repseqio
mvn clean install -DskipTests -B || error_exit "${RED}Problem building RepSeq.IO util!${NC}" 1

echo "Building MiXCR."
cd ${dir}
mvn clean install -DskipTests -B || error_exit "${RED}Problem building MiXCR util!${NC}" 1

echo -e "${GREEN}Build successfull!${NC}"
echo "The following is the output of \"mixcr -v\" command:"
${dir}/mixcr -v || error_exit "${RED}Something went wrong!${NC}" 1
echo -e "${GREEN}Everything seems OK!${NC}"
echo ""
echo "Add mixcr script from this folder to your PATH variable or add symlink to your bin folder."
echo ""
echo "MiXCR is free for Academic use. For commertial use please contact licensing@milaboratory.com ."
echo ""
echo "If you discover bugs or have any questions, contact us at https://github.com/milaboratory/mixcr/issues ."
6 changes: 3 additions & 3 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@

<groupId>com.milaboratory</groupId>
<artifactId>mixcr</artifactId>
<version>2.0.3</version>
<version>2.0.4</version>
<packaging>jar</packaging>
<name>MiXCR</name>

Expand All @@ -44,14 +44,14 @@

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<milib.version>1.7</milib.version>
<milib.version>1.7.1</milib.version>
</properties>

<dependencies>
<dependency>
<groupId>io.repseq</groupId>
<artifactId>repseqio</artifactId>
<version>1.2.4</version>
<version>1.2.6</version>
</dependency>

<dependency>
Expand Down
1 change: 1 addition & 0 deletions repseqio
Submodule repseqio added at 199a91
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,20 @@ public boolean accept(SequencePartitioning object) {
return object.isAvailable(ReferencePoint.VEnd) && object.getPosition(ReferencePoint.VEnd) != object.getPosition(ReferencePoint.VEndTrimmed);
}
};
public static final Filter<SequencePartitioning> IsDPLeft = new Filter<SequencePartitioning>() {
@Override
public boolean accept(SequencePartitioning object) {
return object.isAvailable(ReferencePoint.DBegin) && object.getPosition(ReferencePoint.DBegin) != object.getPosition(ReferencePoint.DBeginTrimmed);
}
};
public static final Filter<SequencePartitioning> IsDPRight = new Filter<SequencePartitioning>() {
@Override
public boolean accept(SequencePartitioning object) {
return object.isAvailable(ReferencePoint.DEnd) && object.getPosition(ReferencePoint.DEnd) != object.getPosition(ReferencePoint.DEndTrimmed);
}
};
public static final Filter<SequencePartitioning> NotDPLeft = FilterUtil.not(IsDPLeft);
public static final Filter<SequencePartitioning> NotDPRight = FilterUtil.not(IsDPRight);
public static final Filter<SequencePartitioning> NotVP = FilterUtil.not(IsVP);


Expand All @@ -130,8 +144,15 @@ public boolean accept(SequencePartitioning object) {
pd(ReferencePoint.VEndTrimmed, "V>", -1, NotVP),
pd(ReferencePoint.VEnd, "V><VP", IsVP),
pd(ReferencePoint.VEndTrimmed, "VP>", -1, IsVP),
pd(ReferencePoint.DBeginTrimmed, "<D"),
pd(ReferencePoint.DEndTrimmed, "D>", -1),

pd(ReferencePoint.DBeginTrimmed, "<D", NotDPLeft),
pd(ReferencePoint.DBegin, "DP><D", IsDPLeft),
pd(ReferencePoint.DBeginTrimmed, "<DP", IsDPLeft),

pd(ReferencePoint.DEndTrimmed, "D>", -1, NotDPRight),
pd(ReferencePoint.DEnd, "D><DP", IsDPRight),
pd(ReferencePoint.DEndTrimmed, "DP>", IsDPRight),

pd(ReferencePoint.JBeginTrimmed, "<J"),
pd(ReferencePoint.CDR3End, "CDR3><FR4"),
pd(ReferencePoint.FR4End, "FR4>", -1),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -195,6 +195,7 @@ public static ArrayList<FieldExtractor> parseFile(OutputMode outputMode, Class c
String line;
while ((line = reader.readLine()) != null) {
line = line.trim();
line = line.replace("\"", "");
if (!line.isEmpty())
options.addAll(Arrays.asList(line.split(" ")));
}
Expand Down
80 changes: 64 additions & 16 deletions src/main/java/com/milaboratory/mixcr/export/FeatureExtractors.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,7 @@
import com.milaboratory.core.sequence.TranslationParameters;
import com.milaboratory.mixcr.basictypes.VDJCHit;
import com.milaboratory.mixcr.basictypes.VDJCObject;
import io.repseq.core.GeneFeature;
import io.repseq.core.GeneType;
import io.repseq.core.ReferencePoints;
import io.repseq.core.VDJCGene;
import io.repseq.core.*;

import static com.milaboratory.mixcr.export.FieldExtractors.NULL;

Expand All @@ -32,7 +29,10 @@ static abstract class WithHeader extends FieldWithParameters<VDJCObject, GeneFea

void validate(GeneFeature[] features) {
if (features.length == 2 && !features[1].contains(features[0]))
throw new IllegalArgumentException(String.format("%s: Base feature %s does not contain relative feature %s", command, features[1], features[0]));
throw new IllegalArgumentException(String.format("%s: Base feature %s does not contain relative feature %s",
command, GeneFeature.encode(features[1]), GeneFeature.encode(features[0])));

//todo bigfeature nofloating bounds
}

private String header0(String[] prefixes, GeneFeature[] features) {
Expand Down Expand Up @@ -88,43 +88,91 @@ static abstract class MutationsExtractor extends WithHeader {
super(command, description, nArgs, hPrefix, sPrefix);
}

@Override
void validate(GeneFeature[] features) {
super.validate(features);
for (GeneFeature feature : features)
if (feature.getGeneType() == null)
throw new IllegalArgumentException(String.format("%s: Gene feature %s covers several gene types " +
"(not possible to select corresponding alignment)", command, GeneFeature.encode(feature)));
}

@Override
protected String extractValue(VDJCObject object, GeneFeature[] parameters) {
GeneFeature smallGeneFeature = parameters[0];
GeneFeature bigGeneFeature = parameters[parameters.length - 1];

GeneType geneType = bigGeneFeature.getGeneType();
assert geneType != null;

VDJCHit hit = object.getBestHit(geneType);

if (hit == null)
return "-";

GeneFeature alignedFeature = hit.getAlignedFeature();
if (!alignedFeature.contains(smallGeneFeature))
return "-";
// if (!alignedFeature.contains(smallGeneFeature))
// return "-";

VDJCGene gene = hit.getGene();
ReferencePoints partitioning = gene.getPartitioning();
if (!partitioning.isAvailable(bigGeneFeature))
ReferencePoints germlinePartitioning = gene.getPartitioning();
if (!germlinePartitioning.isAvailable(bigGeneFeature))
return "-";

Range smallTargetRage = partitioning.getRelativeRange(alignedFeature, smallGeneFeature);
Range smallTargetRage = germlinePartitioning.getRelativeRange(alignedFeature, smallGeneFeature);
if (smallTargetRage == null)
for (int i = 0; i < object.numberOfTargets(); i++) {
SequencePartitioning pt = object.getPartitionedTarget(i).getPartitioning();
Range range = pt.getRange(smallGeneFeature);
if (range == null)
continue;
Alignment<NucleotideSequence> alignment = object.getBestHit(geneType).getAlignment(i);
smallTargetRage = alignment.convertToSeq1Range(range);
if (smallTargetRage != null)
break;
}

if (smallTargetRage == null)
return "-";

for (int i = 0; i < hit.numberOfTargets(); i++) {
GeneFeature intersectionBigAligned = GeneFeature.intersectionStrict(bigGeneFeature, alignedFeature);

for (int i = 0; i < hit.numberOfTargets(); ++i) {
Alignment<NucleotideSequence> alignment = hit.getAlignment(i);

if (alignment == null || !alignment.getSequence1Range().contains(smallTargetRage))
continue;

Mutations<NucleotideSequence> mutations = alignment.getAbsoluteMutations().extractRelativeMutationsForRange(smallTargetRage);
Mutations<NucleotideSequence> mutations;
if (parameters.length == 2) {
int shift = partitioning.getRelativePosition(bigGeneFeature, smallGeneFeature.getFirstPoint());
if (shift < 0)
mutations = alignment.getAbsoluteMutations().extractAbsoluteMutationsForRange(smallTargetRage);

ReferencePoint baIntersectionBegin = intersectionBigAligned.getFirstPoint();

int referencePosition = germlinePartitioning.getRelativePosition(alignedFeature, baIntersectionBegin);
int bigFeaturePosition = germlinePartitioning.getRelativePosition(bigGeneFeature, baIntersectionBegin);

if (bigFeaturePosition < 0 || referencePosition < 0)
continue;

int shift = bigFeaturePosition - referencePosition;

if (shift < 0)
mutations = mutations.getRange(Mutations.pabs(mutations.firstMutationWithPosition(-shift)), mutations.size());

mutations = mutations.move(shift);
}

return convert(mutations, gene.getFeature(bigGeneFeature), object.getFeature(smallGeneFeature).getSequence(), partitioning.getTranslationParameters(bigGeneFeature));
// int shift = germlinePartitioning.getRelativePosition(bigGeneFeature, smallGeneFeature.getFirstPoint());
// if (shift < 0)
// continue;
// mutations = mutations.move(shift);
// mutations = mutations.extractRelativeMutationsForRange(bigRange);
// if (mutations == null)
// continue;
} else
mutations = alignment.getAbsoluteMutations().extractRelativeMutationsForRange(smallTargetRage);

return convert(mutations, gene.getFeature(bigGeneFeature), object.getFeature(smallGeneFeature).getSequence(), germlinePartitioning.getTranslationParameters(bigGeneFeature));
}
return "-";
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
import com.milaboratory.mixcr.basictypes.Clone;
import com.milaboratory.mixcr.basictypes.VDJCAlignments;
import com.milaboratory.mixcr.basictypes.VDJCObject;
import com.milaboratory.mixcr.cli.Main;
import com.milaboratory.mixcr.cli.Util;
import io.repseq.core.GeneType;
import org.junit.Ignore;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@
import com.milaboratory.core.sequence.SequenceBuilder;
import com.milaboratory.core.sequence.SequenceQuality;
import com.milaboratory.mixcr.basictypes.*;
import com.milaboratory.mixcr.cli.ReportHelper;
import com.milaboratory.mixcr.util.RunMiXCR;
import com.milaboratory.mixcr.vdjaligners.VDJCAlignerParameters;
import com.milaboratory.mixcr.vdjaligners.VDJCParametersPresets;
Expand Down Expand Up @@ -214,9 +213,8 @@ public static TestResult processData(PairedRead[] data, InputTestData input) thr
params.alignerParameters.setAllowPartialAlignments(true);

final RunMiXCR.AlignResult inputAlignments = RunMiXCR.align(params);
inputAlignments.report.writeReport(new ReportHelper(System.out));
System.out.println("\n");

//inputAlignments.report.writeReport(new ReportHelper(System.out));
//System.out.println("\n");

for (VDJCAlignments al : inputAlignments.alignments) {
for (GeneType gt : GeneType.VJC_REFERENCE) {
Expand Down Expand Up @@ -250,8 +248,8 @@ public static TestResult processData(PairedRead[] data, InputTestData input) thr
try (final VDJCAlignmentsReader reader = inputAlignments.resultReader()) {
assembler.searchOverlaps(reader);
}
assembler.writeReport(new ReportHelper(System.out));
System.out.println("\n");
//assembler.writeReport(new ReportHelper(System.out));
//System.out.println("\n");
}


Expand Down

0 comments on commit 4cb38f2

Please sign in to comment.