Skip to content

Commit de3d5f4

Browse files
committed
Manually create ped file for KING
1 parent e33f944 commit de3d5f4

File tree

1 file changed

+76
-13
lines changed

1 file changed

+76
-13
lines changed

SequenceAnalysis/src/org/labkey/sequenceanalysis/run/variant/KingInferenceStep.java

Lines changed: 76 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import org.jetbrains.annotations.Nullable;
1212
import org.json.JSONObject;
1313
import org.labkey.api.pipeline.PipelineJobException;
14+
import org.labkey.api.reader.Readers;
1415
import org.labkey.api.sequenceanalysis.SequenceAnalysisService;
1516
import org.labkey.api.sequenceanalysis.pipeline.AbstractVariantProcessingStepProvider;
1617
import org.labkey.api.sequenceanalysis.pipeline.PedigreeToolParameterDescriptor;
@@ -24,12 +25,18 @@
2425
import org.labkey.api.sequenceanalysis.run.AbstractCommandPipelineStep;
2526
import org.labkey.api.sequenceanalysis.run.AbstractCommandWrapper;
2627
import org.labkey.api.util.Compress;
28+
import org.labkey.api.writer.PrintWriters;
2729
import org.labkey.sequenceanalysis.pipeline.ProcessVariantsHandler;
2830

31+
import java.io.BufferedReader;
2932
import java.io.File;
3033
import java.io.IOException;
34+
import java.io.PrintWriter;
3135
import java.util.ArrayList;
36+
import java.util.Arrays;
37+
import java.util.HashMap;
3238
import java.util.List;
39+
import java.util.Map;
3340

3441
public class KingInferenceStep extends AbstractCommandPipelineStep<KingInferenceStep.KingWrapper> implements VariantProcessingStep
3542
{
@@ -121,19 +128,6 @@ public Output processVariants(File inputVCF, File outputDirectory, ReferenceGeno
121128
plinkArgs.add("--max-alleles");
122129
plinkArgs.add("2");
123130

124-
String demographicsProviderName = getProvider().getParameterByName(PedigreeToolParameterDescriptor.NAME).extractValue(getPipelineCtx().getJob(), getProvider(), getStepIdx());
125-
if (demographicsProviderName != null)
126-
{
127-
File pedFile = ProcessVariantsHandler.getPedigreeFile(getPipelineCtx().getSourceDirectory(true), demographicsProviderName);
128-
if (!pedFile.exists())
129-
{
130-
throw new PipelineJobException("Unable to find pedigree file: " + pedFile.getPath());
131-
}
132-
133-
plinkArgs.add("--ped");
134-
plinkArgs.add(pedFile.getPath());
135-
}
136-
137131
plinkArgs.add("--out");
138132
plinkArgs.add(plinkOut.getPath());
139133

@@ -166,6 +160,23 @@ public Output processVariants(File inputVCF, File outputDirectory, ReferenceGeno
166160
kingArgs.add("--prefix");
167161
kingArgs.add(SequenceAnalysisService.get().getUnzippedBaseName(inputVCF.getName()));
168162

163+
// Update the pedigree / fam file:
164+
String demographicsProviderName = getProvider().getParameterByName(PedigreeToolParameterDescriptor.NAME).extractValue(getPipelineCtx().getJob(), getProvider(), getStepIdx());
165+
if (demographicsProviderName != null)
166+
{
167+
File pedFile = ProcessVariantsHandler.getPedigreeFile(getPipelineCtx().getSourceDirectory(true), demographicsProviderName);
168+
if (!pedFile.exists())
169+
{
170+
throw new PipelineJobException("Unable to find pedigree file: " + pedFile.getPath());
171+
}
172+
173+
File kingFam = createFamFile(pedFile, new File(plinkOutBed.getParentFile(), "plink.fam"), kingArgs);
174+
kingArgs.add("--ped");
175+
kingArgs.add(kingFam.getPath());
176+
177+
output.addIntermediateFile(kingFam);
178+
}
179+
169180
if (threads != null)
170181
{
171182
kingArgs.add("--cpus");
@@ -202,6 +213,58 @@ public Output processVariants(File inputVCF, File outputDirectory, ReferenceGeno
202213
return output;
203214
}
204215

216+
private File createFamFile(File pedFile, File famFile, List<String> kingArgs) throws PipelineJobException
217+
{
218+
File newFamFile = new File(famFile.getParentFile(), "king.fam");
219+
220+
Map<String, String> pedMap = new HashMap<>();
221+
try (BufferedReader reader = Readers.getReader(pedFile))
222+
{
223+
String line;
224+
while ((line = reader.readLine()) != null)
225+
{
226+
String[] tokens = line.split(" ");
227+
if (tokens.length != 6)
228+
{
229+
throw new PipelineJobException("Improper ped line length: " + tokens.length);
230+
}
231+
232+
pedMap.put(tokens[1], StringUtils.join(Arrays.asList("0", tokens[1], tokens[2], tokens[3], tokens[4], "-9"), "\t"));
233+
}
234+
}
235+
catch (IOException e)
236+
{
237+
throw new PipelineJobException(e);
238+
}
239+
240+
try (BufferedReader reader = Readers.getReader(famFile);PrintWriter writer = PrintWriters.getPrintWriter(newFamFile))
241+
{
242+
String line;
243+
while ((line = reader.readLine()) != null)
244+
{
245+
String[] tokens = line.split("\t");
246+
if (tokens.length != 6)
247+
{
248+
throw new PipelineJobException("Improper ped line length: " + tokens.length);
249+
}
250+
251+
String newRow = pedMap.get(tokens[1]);
252+
if (newRow == null)
253+
{
254+
throw new PipelineJobException("Unable to find pedigree entry for: " + tokens[1]);
255+
}
256+
257+
writer.println(newRow);
258+
}
259+
}
260+
catch (IOException e)
261+
{
262+
throw new PipelineJobException(e);
263+
}
264+
265+
return newFamFile;
266+
}
267+
205268
public static class KingWrapper extends AbstractCommandWrapper
206269
{
207270
public KingWrapper(@Nullable Logger logger)

0 commit comments

Comments
 (0)