org.drugis.addis.util.convertors.NetworkMetaAnalysisConverter.java Source code

Java tutorial

Introduction

Here is the source code for org.drugis.addis.util.convertors.NetworkMetaAnalysisConverter.java

Source

/*
 * This file is part of ADDIS (Aggregate Data Drug Information System).
 * ADDIS is distributed from http://drugis.org/.
 * Copyright (C) 2009 Gert van Valkenhoef, Tommi Tervonen.
 * Copyright (C) 2010 Gert van Valkenhoef, Tommi Tervonen, 
 * Tijs Zwinkels, Maarten Jacobs, Hanno Koeslag, Florin Schimbinschi, 
 * Ahmad Kamal, Daniel Reid.
 * Copyright (C) 2011 Gert van Valkenhoef, Ahmad Kamal, 
 * Daniel Reid, Florin Schimbinschi.
 * Copyright (C) 2012 Gert van Valkenhoef, Daniel Reid, 
 * Jol Kuiper, Wouter Reckman.
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

package org.drugis.addis.util.convertors;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang.ArrayUtils;
import org.drugis.addis.entities.AdverseEvent;
import org.drugis.addis.entities.Arm;
import org.drugis.addis.entities.Domain;
import org.drugis.addis.entities.Drug;
import org.drugis.addis.entities.DrugSet;
import org.drugis.addis.entities.Endpoint;
import org.drugis.addis.entities.Indication;
import org.drugis.addis.entities.Study;
import org.drugis.addis.entities.analysis.NetworkMetaAnalysis;
import org.drugis.addis.entities.data.Alternative;
import org.drugis.addis.entities.data.AlternativePair;
import org.drugis.addis.entities.data.AnalysisArms;
import org.drugis.addis.entities.data.ArmReference;
import org.drugis.addis.entities.data.ConsistencyResults;
import org.drugis.addis.entities.data.Drugs;
import org.drugis.addis.entities.data.EvidenceTypeEnum;
import org.drugis.addis.entities.data.InconsistencyParameter;
import org.drugis.addis.entities.data.InconsistencyResults;
import org.drugis.addis.entities.data.MCMCSettings;
import org.drugis.addis.entities.data.NodeSplitResults;
import org.drugis.addis.entities.data.ParameterSummary;
import org.drugis.addis.entities.data.QuantileType;
import org.drugis.addis.entities.data.RelativeEffectParameter;
import org.drugis.addis.entities.data.RelativeEffectQuantileSummary;
import org.drugis.addis.entities.data.RelativeEffectsQuantileSummary;
import org.drugis.addis.entities.data.RelativeEffectsSummary;
import org.drugis.addis.entities.data.VarianceParameter;
import org.drugis.addis.entities.data.VarianceParameterType;
import org.drugis.addis.entities.mtcwrapper.ConsistencyWrapper;
import org.drugis.addis.entities.mtcwrapper.InconsistencyWrapper;
import org.drugis.addis.entities.mtcwrapper.MTCModelWrapper;
import org.drugis.addis.entities.mtcwrapper.NodeSplitWrapper;
import org.drugis.addis.util.JAXBConvertor;
import org.drugis.addis.util.JAXBConvertor.ConversionException;
import org.drugis.mtc.MCMCSettingsCache;
import org.drugis.mtc.Parameter;
import org.drugis.mtc.model.Treatment;
import org.drugis.mtc.parameterization.BasicParameter;
import org.drugis.mtc.parameterization.ParameterComparator;
import org.drugis.mtc.parameterization.SplitParameter;
import org.drugis.mtc.summary.ConvergenceSummary;
import org.drugis.mtc.summary.MultivariateNormalSummary;
import org.drugis.mtc.summary.NodeSplitPValueSummary;
import org.drugis.mtc.summary.QuantileSummary;
import org.drugis.mtc.summary.RankProbabilitySummary;
import org.drugis.mtc.summary.SimpleMultivariateNormalSummary;

import edu.uci.ics.jung.graph.util.Pair;

public class NetworkMetaAnalysisConverter {

    // From JAXB to ADDIS (load)
    public static NetworkMetaAnalysis convertNetworkMetaAnalysis(
            org.drugis.addis.entities.data.NetworkMetaAnalysis nma, Domain domain) throws ConversionException {
        String name = nma.getName();
        Indication indication = JAXBConvertor.findNamedItem(domain.getIndications(), nma.getIndication().getName());
        org.drugis.addis.entities.OutcomeMeasure om = JAXBConvertor.findOutcomeMeasure(domain, nma);
        List<Study> studies = new ArrayList<Study>();
        List<DrugSet> drugs = new ArrayList<DrugSet>();
        Map<Study, Map<DrugSet, Arm>> armMap = new HashMap<Study, Map<DrugSet, Arm>>();
        for (org.drugis.addis.entities.data.Alternative a : nma.getAlternative()) {
            DrugSet drugSet = JAXBConvertor.convertDrugSet(a.getDrugs(), domain);
            drugs.add(drugSet);
            for (ArmReference armRef : a.getArms().getArm()) {
                Study study = JAXBConvertor.findNamedItem(domain.getStudies(), armRef.getStudy());
                if (!studies.contains(study)) {
                    studies.add(study);
                    armMap.put(study, new HashMap<DrugSet, Arm>());
                }
                Arm arm = JAXBConvertor.findArm(armRef.getName(), study.getArms());
                armMap.get(study).put(drugSet, arm);
            }
        }

        NetworkMetaAnalysis networkMetaAnalysis = new NetworkMetaAnalysis(name, indication, om, armMap);

        if (nma.getInconsistencyResults() != null) {
            loadInconsistencyModel(nma, networkMetaAnalysis, domain);
        }
        if (nma.getConsistencyResults() != null) {
            loadConsistencyModel(nma, networkMetaAnalysis, domain);
        }

        for (NodeSplitResults nodeSplit : nma.getNodeSplitResults()) {
            loadNodeSplitModel(nodeSplit, nma, networkMetaAnalysis, domain);
        }

        return networkMetaAnalysis;
    }

    private static void loadNodeSplitModel(NodeSplitResults results,
            org.drugis.addis.entities.data.NetworkMetaAnalysis nma, NetworkMetaAnalysis networkMetaAnalysis,
            Domain domain) {
        final HashMap<Parameter, QuantileSummary> quantileSummaries = new HashMap<Parameter, QuantileSummary>();
        final HashMap<Parameter, ConvergenceSummary> convergenceSummaries = new HashMap<Parameter, ConvergenceSummary>();
        addParameterSummaries(networkMetaAnalysis, quantileSummaries, convergenceSummaries, results.getSummary(),
                domain);
        NodeSplitPValueSummary nodeSplitPValueSummary = new NodeSplitPValueSummary(results.getPValue());

        List<Drugs> alternatives = results.getSplitNode().getAlternative();
        Treatment base = networkMetaAnalysis
                .getTreatment(JAXBConvertor.convertDrugSet(alternatives.get(0), domain));
        Treatment subj = networkMetaAnalysis
                .getTreatment(JAXBConvertor.convertDrugSet(alternatives.get(1), domain));

        BasicParameter splitParameter = new BasicParameter(base, subj);

        networkMetaAnalysis.loadNodeSplitModel(splitParameter, buildMCMCSettingsCache(results.getMcmcSettings()),
                quantileSummaries, convergenceSummaries, nodeSplitPValueSummary);

    }

    private static MCMCSettingsCache buildMCMCSettingsCache(MCMCSettings settings) {
        return new MCMCSettingsCache(settings.getInferenceIterations(), settings.getSimulationIterations(),
                settings.getThinningInterval(), settings.getTuningIterations(), settings.getVarianceScalingFactor(),
                settings.getNumberOfChains());
    }

    private static void loadInconsistencyModel(org.drugis.addis.entities.data.NetworkMetaAnalysis nma,
            NetworkMetaAnalysis networkMetaAnalysis, Domain domain) {
        final InconsistencyResults results = nma.getInconsistencyResults();
        final HashMap<Parameter, QuantileSummary> quantileSummaries = new HashMap<Parameter, QuantileSummary>();
        final HashMap<Parameter, ConvergenceSummary> convergenceSummaries = new HashMap<Parameter, ConvergenceSummary>();

        addRelativeEffectQuantileSummaries(networkMetaAnalysis, quantileSummaries,
                results.getRelativeEffectsQuantileSummary().getRelativeEffectQuantileSummary(), domain);
        addParameterSummaries(networkMetaAnalysis, quantileSummaries, convergenceSummaries, results.getSummary(),
                domain);
        networkMetaAnalysis.loadInconsistencyModel(buildMCMCSettingsCache(results.getMcmcSettings()),
                quantileSummaries, convergenceSummaries);
    }

    private static void loadConsistencyModel(org.drugis.addis.entities.data.NetworkMetaAnalysis nma,
            NetworkMetaAnalysis networkMetaAnalysis, Domain domain) {
        final ConsistencyResults results = nma.getConsistencyResults();
        final HashMap<Parameter, QuantileSummary> quantileSummaries = new HashMap<Parameter, QuantileSummary>();
        final HashMap<Parameter, ConvergenceSummary> convergenceSummaries = new HashMap<Parameter, ConvergenceSummary>();

        addRelativeEffectQuantileSummaries(networkMetaAnalysis, quantileSummaries,
                results.getRelativeEffectsQuantileSummary().getRelativeEffectQuantileSummary(), domain);
        addParameterSummaries(networkMetaAnalysis, quantileSummaries, convergenceSummaries, results.getSummary(),
                domain);

        RelativeEffectsSummary relativeEffects = results.getRelativeEffectsSummary();
        double[] mean = ArrayUtils.toPrimitive(relativeEffects.getMeans()
                .toArray(new Double[results.getRelativeEffectsSummary().getMeans().size()]));
        int covarianceSize = calcCovMatrixDim(relativeEffects.getCovariance().size());

        double[][] covarianceMatrix = new double[covarianceSize][covarianceSize];
        int covIdx = 0;
        for (int row = 0; row < covarianceSize; row++) {
            for (int col = row; col < covarianceSize; col++) {
                double x = relativeEffects.getCovariance().get(covIdx);
                covarianceMatrix[row][col] = x;
                covarianceMatrix[col][row] = x;
                covIdx++;
            }
        }
        MultivariateNormalSummary relativeEffectsSummary = new SimpleMultivariateNormalSummary(mean,
                covarianceMatrix);

        // DrugSets are always sorted in their natural order
        List<Treatment> treatments = new ArrayList<Treatment>();
        for (DrugSet d : networkMetaAnalysis.getIncludedDrugs()) {
            treatments.add(networkMetaAnalysis.getTreatment(d));
        }
        double[][] rankProbabilityMatrix = new double[treatments.size()][treatments.size()];
        int rankIdx = 0;
        for (int row = treatments.size() - 1; row >= 0; row--) {
            for (int col = 0; col < treatments.size(); ++col) {
                rankProbabilityMatrix[col][row] = results.getRankProbabilitySummary().get(rankIdx);
                rankIdx++;
            }
        }
        RankProbabilitySummary rankProbabilitySummary = new RankProbabilitySummary(rankProbabilityMatrix,
                treatments);
        networkMetaAnalysis.loadConsistencyModel(buildMCMCSettingsCache(results.getMcmcSettings()),
                quantileSummaries, convergenceSummaries, relativeEffectsSummary, rankProbabilitySummary);
    }

    private static int calcCovMatrixDim(int entries) {
        return (intSqrt(1 + 8 * entries) - 1) / 2;
    }

    private static int intSqrt(int n) {
        int r = (int) Math.round(Math.sqrt(n));
        if (r * r != n) {
            throw new RuntimeException(n + " does not have an integer square root.");
        }
        return r;
    }

    private static void addRelativeEffectQuantileSummaries(NetworkMetaAnalysis networkMetaAnalysis,
            final HashMap<Parameter, QuantileSummary> quantileSummaries,
            final List<RelativeEffectQuantileSummary> relativeEffects, Domain domain) {
        for (final RelativeEffectQuantileSummary reqs : relativeEffects) {
            BasicParameter p = convertRelativeEffect(domain, networkMetaAnalysis, reqs.getRelativeEffect());
            final QuantileSummary q = convertQuantileSummary(reqs.getQuantile());
            quantileSummaries.put(p, q);
        }
    }

    private static BasicParameter convertRelativeEffect(Domain domain, NetworkMetaAnalysis networkMetaAnalysis,
            final RelativeEffectParameter relativeEffectParameter) {
        Treatment baseTreatment = networkMetaAnalysis.getTreatment(
                JAXBConvertor.convertDrugSet(relativeEffectParameter.getAlternative().get(0), domain));
        Treatment subjTreatment = networkMetaAnalysis.getTreatment(
                JAXBConvertor.convertDrugSet(relativeEffectParameter.getAlternative().get(1), domain));
        return new org.drugis.mtc.parameterization.BasicParameter(baseTreatment, subjTreatment);
    }

    private static SplitParameter convertNodeSplit(Domain domain, NetworkMetaAnalysis networkMetaAnalysis,
            final RelativeEffectParameter relativeEffectParameter, boolean isDirect) {
        Treatment baseTreatment = networkMetaAnalysis.getTreatment(
                JAXBConvertor.convertDrugSet(relativeEffectParameter.getAlternative().get(0), domain));
        Treatment subjTreatment = networkMetaAnalysis.getTreatment(
                JAXBConvertor.convertDrugSet(relativeEffectParameter.getAlternative().get(1), domain));
        return new org.drugis.mtc.parameterization.SplitParameter(baseTreatment, subjTreatment, isDirect);
    }

    private static void addParameterSummaries(NetworkMetaAnalysis networkMetaAnalysis,
            final HashMap<Parameter, QuantileSummary> quantileSummaries,
            final HashMap<Parameter, ConvergenceSummary> convergenceSummaries, List<ParameterSummary> summaries,
            Domain domain) {
        for (ParameterSummary ps : summaries) {
            Parameter p = createParameter(domain, networkMetaAnalysis, ps);
            final QuantileSummary q = convertQuantileSummary(ps.getQuantile());
            if (ps.getPsrf() != null) {
                final ConvergenceSummary c = new ConvergenceSummary(ps.getPsrf());
                convergenceSummaries.put(p, c);
            }
            quantileSummaries.put(p, q);
        }
    }

    private static Parameter createParameter(Domain domain, NetworkMetaAnalysis networkMetaAnalysis,
            ParameterSummary ps) {
        Parameter p = null;
        if (ps.getInconsistency() != null) {
            ArrayList<DrugSet> alternatives = new ArrayList<DrugSet>();
            ArrayList<Treatment> alternativeTreatments = new ArrayList<Treatment>();
            for (Drugs drugs : ps.getInconsistency().getAlternative()) {
                DrugSet drugSet = JAXBConvertor.convertDrugSet(drugs, domain);
                alternatives.add(drugSet);
                alternativeTreatments.add(networkMetaAnalysis.getTreatment(drugSet));
            }
            p = new org.drugis.mtc.parameterization.InconsistencyParameter(alternativeTreatments);
        } else if (ps.getVariance() != null) {
            VarianceParameterType name = ps.getVariance().getName();
            if (name == VarianceParameterType.VAR_W) {
                p = new org.drugis.mtc.parameterization.InconsistencyVariance();
            }
            if (name == VarianceParameterType.VAR_D) {
                p = new org.drugis.mtc.parameterization.RandomEffectsVariance();
            }
        } else if (ps.getRelativeEffect() != null) {
            if (ps.getRelativeEffect().getWhichEvidence() == EvidenceTypeEnum.ALL) {
                p = convertRelativeEffect(domain, networkMetaAnalysis, ps.getRelativeEffect());
            }
            if (ps.getRelativeEffect().getWhichEvidence() == EvidenceTypeEnum.DIRECT) {
                p = convertNodeSplit(domain, networkMetaAnalysis, ps.getRelativeEffect(), true);
            }
            if (ps.getRelativeEffect().getWhichEvidence() == EvidenceTypeEnum.INDIRECT) {
                p = convertNodeSplit(domain, networkMetaAnalysis, ps.getRelativeEffect(), false);
            }
        }
        return p;
    }

    private static QuantileSummary convertQuantileSummary(List<QuantileType> quantile) {
        double[] probs = new double[quantile.size()];
        double[] values = new double[quantile.size()];
        for (int i = 0; quantile.size() > i; ++i) {
            probs[i] = quantile.get(i).getLevel();
            values[i] = quantile.get(i).getValue();
        }
        return new QuantileSummary(probs, values);
    }

    //  From ADDIS to JAXB (save)
    public static org.drugis.addis.entities.data.NetworkMetaAnalysis convertNetworkMetaAnalysis(
            NetworkMetaAnalysis ma) throws ConversionException {
        org.drugis.addis.entities.data.NetworkMetaAnalysis nma = new org.drugis.addis.entities.data.NetworkMetaAnalysis();
        nma.setName(ma.getName());
        nma.setIndication(JAXBConvertor.nameReference(ma.getIndication().getName()));
        if (ma.getOutcomeMeasure() instanceof Endpoint) {
            nma.setEndpoint(JAXBConvertor.nameReference(ma.getOutcomeMeasure().getName()));
        } else if (ma.getOutcomeMeasure() instanceof AdverseEvent) {
            nma.setAdverseEvent(JAXBConvertor.nameReference(ma.getOutcomeMeasure().getName()));
        } else {
            throw new ConversionException("Outcome Measure type not supported: " + ma.getOutcomeMeasure());
        }
        for (DrugSet d : ma.getIncludedDrugs()) {
            Alternative alt = new Alternative();
            alt.setDrugs(JAXBConvertor.convertAnalysisDrugSet(d));
            AnalysisArms arms = new AnalysisArms();

            for (Study study : ma.getIncludedStudies()) {
                Arm arm = ma.getArm(study, d);
                if (arm != null) {
                    arms.getArm().add(JAXBConvertor.armReference(study.getName(), arm.getName()));
                }
            }
            alt.setArms(arms);
            nma.getAlternative().add(alt);
        }

        nma.setInconsistencyResults(convertInconsistencyResults(ma));
        nma.setConsistencyResults(convertConsistencyResults(ma));

        for (NodeSplitWrapper model : ma.getNodeSplitModels()) {
            if (model.isApproved()) {
                nma.getNodeSplitResults().add(convertNodeSplitResults(ma, model));
            }
        }
        return nma;
    }

    private static NodeSplitResults convertNodeSplitResults(NetworkMetaAnalysis ma, NodeSplitWrapper model) {
        NodeSplitResults results = new NodeSplitResults();
        results.setMcmcSettings(convertMCMCSettings(model));
        convertParameterSummaries(ma, model, results.getSummary());
        results.setPValue(model.getNodeSplitPValueSummary().getPvalue());
        AlternativePair alternativePair = new AlternativePair();
        BasicParameter splitNode = (BasicParameter) model.getSplitNode();
        alternativePair.getAlternative().add(JAXBConvertor.convertDrugSet(ma.getDrugSet(splitNode.getBaseline())));
        alternativePair.getAlternative().add(JAXBConvertor.convertDrugSet(ma.getDrugSet(splitNode.getSubject())));
        results.setSplitNode(alternativePair);
        return results;
    }

    private static InconsistencyResults convertInconsistencyResults(NetworkMetaAnalysis ma) {
        InconsistencyResults results = new InconsistencyResults();
        InconsistencyWrapper model = ma.getInconsistencyModel();
        if (model.isApproved()) {
            results.setMcmcSettings(convertMCMCSettings(model));
            convertParameterSummaries(ma, model, results.getSummary());
            results.setRelativeEffectsQuantileSummary(convertRelativeEffectQuantileSummaries(ma, model));
            return results;
        }
        return null;
    }

    private static ConsistencyResults convertConsistencyResults(NetworkMetaAnalysis ma) {
        ConsistencyResults results = new ConsistencyResults();
        ConsistencyWrapper model = ma.getConsistencyModel();
        if (model.isApproved()) {
            results.setMcmcSettings(convertMCMCSettings(model));
            convertParameterSummaries(ma, model, results.getSummary());
            results.setRelativeEffectsQuantileSummary(convertRelativeEffectQuantileSummaries(ma, model));
            RelativeEffectsSummary relativeEffectSummary = new RelativeEffectsSummary();
            List<Double> list = relativeEffectSummary.getCovariance();
            double[][] matrix = model.getRelativeEffectsSummary().getCovarianceMatrix();
            for (int row = 0; row < matrix.length; ++row) {
                for (int col = row; col < matrix.length; ++col) {
                    list.add(matrix[row][col]);
                }
            }
            List<Double> meanVector = Arrays
                    .asList(ArrayUtils.toObject(model.getRelativeEffectsSummary().getMeanVector()));
            relativeEffectSummary.getMeans().addAll(meanVector);
            results.setRelativeEffectsSummary(relativeEffectSummary);

            RankProbabilitySummary rankProbabilities = model.getRankProbabilities();
            int rankProababilitySize = rankProbabilities.getTreatments().size();
            for (int row = 0; row < rankProababilitySize; ++row) {
                for (int col = 0; col < rankProababilitySize; ++col) {
                    results.getRankProbabilitySummary()
                            .add(rankProbabilities.getValue(rankProbabilities.getTreatments().get(col), row + 1));
                }
            }
            return results;
        }
        return null;
    }

    private static RelativeEffectsQuantileSummary convertRelativeEffectQuantileSummaries(NetworkMetaAnalysis ma,
            MTCModelWrapper model) {
        RelativeEffectsQuantileSummary relativeEffectsSummary = new RelativeEffectsQuantileSummary();
        relativeEffectsSummary.getRelativeEffectQuantileSummary()
                .addAll(convertRelativeEffectParameters(ma, model));
        return relativeEffectsSummary;
    }

    private static void convertParameterSummaries(NetworkMetaAnalysis ma, MTCModelWrapper model,
            List<ParameterSummary> summaries) {
        List<Parameter> parameters = new ArrayList<Parameter>(Arrays.asList(model.getParameters()));
        if (model instanceof NodeSplitWrapper) {
            parameters.add(((NodeSplitWrapper) model).getIndirectEffect());
        }
        Collections.sort(parameters, new ParameterComparator());
        for (Parameter p : parameters) {
            summaries.add(convertParameterSummary(p, model, ma));
        }
    }

    private static ParameterSummary convertParameterSummary(Parameter p, MTCModelWrapper mtc,
            NetworkMetaAnalysis nma) {
        ParameterSummary ps = new ParameterSummary();
        ps.setPsrf(mtc.getConvergenceSummary(p).getScaleReduction());
        ps.getQuantile().addAll(convertQuantileSummary(mtc.getQuantileSummary(p)));
        if (p instanceof org.drugis.mtc.parameterization.InconsistencyParameter) {
            org.drugis.mtc.parameterization.InconsistencyParameter ip = (org.drugis.mtc.parameterization.InconsistencyParameter) p;
            ps.setInconsistency(new InconsistencyParameter());
            for (Treatment t : ip.getCycle()) {
                Drugs drugs = new Drugs();
                for (Drug d : nma.getDrugSet(t).getContents()) {
                    drugs.getDrug().add(JAXBConvertor.convertDrug(d));
                }
                ps.getInconsistency().getAlternative().add(drugs);
            }
        } else if (p instanceof org.drugis.mtc.parameterization.InconsistencyVariance) {
            VarianceParameter value = new VarianceParameter();
            value.setName(VarianceParameterType.VAR_W);
            ps.setVariance(value);
        } else if (p instanceof org.drugis.mtc.parameterization.RandomEffectsVariance) {
            VarianceParameter value = new VarianceParameter();
            value.setName(VarianceParameterType.VAR_D);
            ps.setVariance(value);
        } else if (p instanceof org.drugis.mtc.parameterization.BasicParameter) {
            DrugSet base = nma.getDrugSet(((org.drugis.mtc.parameterization.BasicParameter) p).getBaseline());
            DrugSet subj = nma.getDrugSet(((org.drugis.mtc.parameterization.BasicParameter) p).getSubject());
            Pair<DrugSet> relEffect = new Pair<DrugSet>(base, subj);
            ps.setRelativeEffect(convertRelativeEffectsParameter(relEffect));
        } else if (p instanceof org.drugis.mtc.parameterization.SplitParameter) {
            org.drugis.mtc.parameterization.SplitParameter np = (org.drugis.mtc.parameterization.SplitParameter) p;
            DrugSet base = nma.getDrugSet(np.getBaseline());
            DrugSet subj = nma.getDrugSet(np.getSubject());
            Pair<DrugSet> relEffect = new Pair<DrugSet>(base, subj);
            ps.setRelativeEffect(convertNodeSplitParameter(relEffect, np.isDirect()));
        }
        return ps;
    }

    private static List<QuantileType> convertQuantileSummary(QuantileSummary qs) {
        List<QuantileType> l = new ArrayList<QuantileType>();
        for (int i = 0; qs.getSize() > i; ++i) {
            QuantileType q = new QuantileType();
            q.setLevel(qs.getProbability(i));
            q.setValue(qs.getQuantile(i));
            l.add(q);
        }
        return l;
    }

    private static List<RelativeEffectQuantileSummary> convertRelativeEffectParameters(NetworkMetaAnalysis ma,
            MTCModelWrapper mtc) {
        List<DrugSet> includedDrugs = ma.getIncludedDrugs();
        List<RelativeEffectQuantileSummary> reqs = new ArrayList<RelativeEffectQuantileSummary>();
        for (int i = 0; i < includedDrugs.size(); ++i) {
            for (int j = 0; j < includedDrugs.size(); ++j) {
                if (j != i) {
                    Pair<DrugSet> relEffect = new Pair<DrugSet>(includedDrugs.get(i), includedDrugs.get(j));
                    RelativeEffectQuantileSummary qs = new RelativeEffectQuantileSummary();
                    qs.setRelativeEffect(convertRelativeEffectsParameter(relEffect));
                    qs.getQuantile().addAll(convertQuantileSummary(mtc.getQuantileSummary(
                            mtc.getRelativeEffect(includedDrugs.get(i), includedDrugs.get(j)))));
                    reqs.add(qs);
                }
            }
        }
        return reqs;
    }

    private static RelativeEffectParameter convertNodeSplitParameter(Pair<DrugSet> pair, boolean direct) {
        return convertRelativeEffectParameter(pair, direct ? EvidenceTypeEnum.DIRECT : EvidenceTypeEnum.INDIRECT);
    }

    private static RelativeEffectParameter convertRelativeEffectsParameter(Pair<DrugSet> pair) {
        return convertRelativeEffectParameter(pair, EvidenceTypeEnum.ALL);
    }

    private static RelativeEffectParameter convertRelativeEffectParameter(Pair<DrugSet> pair,
            EvidenceTypeEnum evidenceType) {
        RelativeEffectParameter rel = new RelativeEffectParameter();
        rel.setWhichEvidence(evidenceType);
        Drugs first = JAXBConvertor.convertDrugSet(pair.getFirst());
        Drugs second = JAXBConvertor.convertDrugSet(pair.getSecond());
        rel.getAlternative().addAll(Arrays.asList(first, second));
        return rel;
    }

    private static MCMCSettings convertMCMCSettings(MTCModelWrapper wrapper) {
        MCMCSettings s = new MCMCSettings();
        s.setSimulationIterations(wrapper.getSettings().getSimulationIterations());
        s.setTuningIterations(wrapper.getSettings().getTuningIterations());
        s.setThinningInterval(wrapper.getSettings().getThinningInterval());
        s.setInferenceIterations(wrapper.getSettings().getInferenceSamples());
        s.setVarianceScalingFactor(wrapper.getSettings().getVarianceScalingFactor());
        s.setNumberOfChains(wrapper.getSettings().getNumberOfChains());
        return s;
    }

}