/* * Copyright 2015 OpenCB * * 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 org.opencb.hpg.bigdata.core.converters.variation; import htsjdk.variant.vcf.VCFCompoundHeaderLine; import htsjdk.variant.vcf.VCFCompoundHeaderLine.SupportedHeaderLineType; import htsjdk.variant.vcf.VCFFilterHeaderLine; import htsjdk.variant.vcf.VCFFormatHeaderLine; import htsjdk.variant.vcf.VCFHeaderLine; import htsjdk.variant.vcf.VCFHeaderLineCount; import htsjdk.variant.vcf.VCFHeaderLineType; import htsjdk.variant.vcf.VCFInfoHeaderLine; import htsjdk.variant.vcf.VCFSimpleHeaderLine; import java.util.Collections; import java.util.List; import java.util.Map; import org.apache.commons.lang3.StringUtils; import org.ga4gh.models.VariantSetMetadata; import org.opencb.hpg.bigdata.core.converters.Converter; /** * @author mh719 * */ public class VcfHeaderLine2VariantSetMetadataConverter implements Converter<VCFHeaderLine, VariantSetMetadata> { @Override public VariantSetMetadata forward(VCFHeaderLine hl) { if (null == hl) { return null; } if (hl instanceof VCFInfoHeaderLine) { return convert((VCFInfoHeaderLine) hl); } if (hl instanceof VCFFormatHeaderLine) { return convert((VCFFormatHeaderLine) hl); } // if(hl instanceof VCFContigHeaderLine ) // return convert((VCFContigHeaderLine) hl); if (hl instanceof VCFFilterHeaderLine) { return convert((VCFFilterHeaderLine) hl); } // if(VCFHeaderLine.class.equals(hl.getClass())){ // return convert(hl); // } // if(VCFSimpleHeaderLine.class.equals(hl.getClass())){ // return convert((VCFSimpleHeaderLine) hl); // } throw new UnsupportedOperationException(String.format("Header line not supported yet: %s", hl.getClass())); } private VariantSetMetadata convertHeaderLine(VCFHeaderLine hl) { VariantSetMetadata vsm = new VariantSetMetadata(); vsm.setKey(hl.getKey()); vsm.setValue(hl.getValue()); return vsm; } private VariantSetMetadata convert(VCFSimpleHeaderLine hl) { VariantSetMetadata vsm = convertHeaderLine((VCFHeaderLine) hl); vsm.setId(hl.getID()); return vsm; } private VariantSetMetadata convert(VCFFilterHeaderLine hl) { return convert((VCFSimpleHeaderLine) hl); } private VariantSetMetadata convert(VCFCompoundHeaderLine hl) { VariantSetMetadata vsm = convertHeaderLine((VCFHeaderLine) hl); vsm.setId(hl.getID()); if (hl.isFixedCount()) { vsm.setNumber(Integer.toString(hl.getCount())); } else { vsm.setNumber(hl.getCountType().name()); } vsm.setType(hl.getType().name()); vsm.setDescription(hl.getDescription()); // Empty for the moment Map<String, List<String>> infoMap = Collections.emptyMap(); vsm.setInfo(infoMap); return vsm; } private VariantSetMetadata convert(VCFFormatHeaderLine hl) { return convert((VCFCompoundHeaderLine) hl); } private VariantSetMetadata convert(VCFInfoHeaderLine hl) { return convert((VCFCompoundHeaderLine) hl); } private VCFInfoHeaderLine convertToInfo(VariantSetMetadata vsm) { String nbr = vsm.getNumber().toString(); VCFHeaderLineCount cl = valueOfLineCountHeader(nbr); VCFInfoHeaderLine hl; if (null != cl) { hl = new VCFInfoHeaderLine(vsm.getId().toString(), cl, VCFHeaderLineType.valueOf(vsm.getType().toString()), vsm.getDescription().toString()); } else { hl = new VCFInfoHeaderLine(vsm.getId().toString(), Integer.valueOf(vsm.getNumber().toString()), VCFHeaderLineType.valueOf(vsm.getType().toString()), vsm.getDescription().toString()); } return hl; } private VCFHeaderLineCount valueOfLineCountHeader(String nbr) { for (VCFHeaderLineCount lc : VCFHeaderLineCount.values()) { if (StringUtils.equals(lc.name(), nbr)) { return lc; } } return null; } private VCFHeaderLine convertToFormat(VariantSetMetadata vsm) { String nbr = vsm.getNumber().toString(); VCFHeaderLineCount cl = valueOfLineCountHeader(nbr); VCFFormatHeaderLine hl; if (null != cl) { hl = new VCFFormatHeaderLine(vsm.getId().toString(), cl, VCFHeaderLineType.valueOf(vsm.getType().toString()), vsm.getDescription().toString()); } else { hl = new VCFFormatHeaderLine(vsm.getId().toString(), Integer.valueOf(nbr), VCFHeaderLineType.valueOf(vsm.getType().toString()), vsm.getDescription().toString()); } return hl; } @Override public VCFHeaderLine backward(VariantSetMetadata vsm) { if (null == vsm) { return null; } else if (StringUtils.equals(vsm.getKey().toString(), SupportedHeaderLineType.INFO.name())) { return convertToInfo(vsm); } else if (StringUtils.equals(vsm.getKey().toString(), SupportedHeaderLineType.FORMAT.name())) { return convertToFormat(vsm); } else if (StringUtils.equals("contig", vsm.getKey().toString())) { throw new UnsupportedOperationException( String.format("Header line not supported yet: %s", vsm.getKey().toString())); } else if (StringUtils.equals("fileformat", vsm.getKey().toString())) { return convertTo(vsm.getKey(), vsm.getValue()); } throw new UnsupportedOperationException( String.format("Header line currently not supported: %s", vsm.getKey().toString())); } private VCFHeaderLine convertTo(String key, String value) { return new VCFHeaderLine(key.toString(), value.toString()); } }