SiLeBAT/FSK-Lab

View on GitHub
de.bund.bfr.knime.pmm.nodes/src/de/bund/bfr/knime/pmm/editor/ModelEditorNodeModel.java

Summary

Maintainability
F
1 wk
Test Coverage
package de.bund.bfr.knime.pmm.editor;

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

import org.knime.core.data.DataTableSpec;
import org.knime.core.node.BufferedDataContainer;
import org.knime.core.node.BufferedDataTable;
import org.knime.core.node.ExecutionContext;
import org.knime.core.node.InvalidSettingsException;
import org.knime.core.node.NodeSettingsRO;
import org.knime.core.node.NodeSettingsWO;
import org.knime.core.node.port.PortObject;
import org.knime.core.node.port.PortType;
import org.knime.core.node.web.ValidationError;
import org.knime.js.core.node.AbstractWizardNodeModel;

import de.bund.bfr.knime.pmm.common.AgentXml;
import de.bund.bfr.knime.pmm.common.CatalogModelXml;
import de.bund.bfr.knime.pmm.common.DepXml;
import de.bund.bfr.knime.pmm.common.EstModelXml;
import de.bund.bfr.knime.pmm.common.IndepXml;
import de.bund.bfr.knime.pmm.common.LiteratureItem;
import de.bund.bfr.knime.pmm.common.MatrixXml;
import de.bund.bfr.knime.pmm.common.MdInfoXml;
import de.bund.bfr.knime.pmm.common.MiscXml;
import de.bund.bfr.knime.pmm.common.ParamXml;
import de.bund.bfr.knime.pmm.common.PmmXmlDoc;
import de.bund.bfr.knime.pmm.common.TimeSeriesXml;
import de.bund.bfr.knime.pmm.common.generictablemodel.KnimeTuple;
import de.bund.bfr.knime.pmm.common.pmmtablemodel.Model1Schema;
import de.bund.bfr.knime.pmm.common.pmmtablemodel.Model2Schema;
import de.bund.bfr.knime.pmm.common.pmmtablemodel.PmmUtilities;
import de.bund.bfr.knime.pmm.common.pmmtablemodel.SchemaFactory;
import de.bund.bfr.knime.pmm.common.pmmtablemodel.TimeSeriesSchema;
import de.bund.bfr.knime.pmm.js.common.Agent;
import de.bund.bfr.knime.pmm.js.common.CatalogModel;
import de.bund.bfr.knime.pmm.js.common.Dep;
import de.bund.bfr.knime.pmm.js.common.EstModel;
import de.bund.bfr.knime.pmm.js.common.Indep;
import de.bund.bfr.knime.pmm.js.common.IndepList;
import de.bund.bfr.knime.pmm.js.common.Literature;
import de.bund.bfr.knime.pmm.js.common.LiteratureList;
import de.bund.bfr.knime.pmm.js.common.Matrix;
import de.bund.bfr.knime.pmm.js.common.MdInfo;
import de.bund.bfr.knime.pmm.js.common.Misc;
import de.bund.bfr.knime.pmm.js.common.MiscList;
import de.bund.bfr.knime.pmm.js.common.Model1DataTuple;
import de.bund.bfr.knime.pmm.js.common.ModelList;
import de.bund.bfr.knime.pmm.js.common.Param;
import de.bund.bfr.knime.pmm.js.common.ParamList;
import de.bund.bfr.knime.pmm.js.common.TimeSeries;
import de.bund.bfr.knime.pmm.js.common.TimeSeriesList;

/**
 * Model Editor node model.
 *
 * @author Miguel Alba
 */
public final class ModelEditorNodeModel
        extends AbstractWizardNodeModel<ModelEditorViewRepresentation, ModelEditorViewValue> {

    private boolean m_executed = false;
    private final ModelEditorViewConfig m_config;

    /** Constructor of (@code ModelEditorNodeModel). */
    protected ModelEditorNodeModel() {
        super(new PortType[] { BufferedDataTable.TYPE }, new PortType[] { BufferedDataTable.TYPE }, "Model editor");
        m_config = new ModelEditorViewConfig();
    }

    /** {@inheritDoc} */
    @Override
    public ModelEditorViewRepresentation createEmptyViewRepresentation() {
        return new ModelEditorViewRepresentation();
    }

    /** {@inheritDoc} */
    @Override
    public ModelEditorViewValue createEmptyViewValue() {
        return new ModelEditorViewValue();
    }

    @Override
    public String getJavascriptObjectID() {
        return "de.bund.bfr.knime.pmm.editor";
    }

    @Override
    public boolean isHideInWizard() {
        return false;
    }

    @Override
    public ValidationError validateViewValue(ModelEditorViewValue viewContent) {
        synchronized (getLock()) {
            // Nothing to do.
        }
        return null;
    }

    @Override
    public void saveCurrentValue(NodeSettingsWO settings) {
        getViewValue().getModels().saveToNodeSettings(settings);
    }

    @Override
    public DataTableSpec[] configure(DataTableSpec[] inSpecs) throws InvalidSettingsException {
        if (!SchemaFactory.createM1DataSchema().conforms(inSpecs[0])) {
            throw new InvalidSettingsException("Wrong input. Only works so far with M1DataSchema");
        }
        return new DataTableSpec[] { null };
    }

    @Override
    protected PortObject[] performExecute(PortObject[] inObjects, ExecutionContext exec) throws Exception {
        final BufferedDataTable table = (BufferedDataTable) inObjects[0];
        final List<KnimeTuple> tuples = PmmUtilities.getTuples(table, SchemaFactory.createM1DataSchema());

        ModelEditorViewValue viewValue = getViewValue();
        if (viewValue == null) {
            viewValue = createEmptyViewValue();
            setViewValue(viewValue);
        }

        if (!m_executed) {
            // Config of JavaScript view
            // viewValue.setModels(m_config.getModels());

            // Convert KNIME tuples to Model1DataTuple
            final Model1DataTuple[] m1DataTuples = new Model1DataTuple[tuples.size()];
            for (int i = 0; i < tuples.size(); i++) {
                m1DataTuples[i] = codeTuple(tuples.get(i));
            }
            final ModelList modelList = new ModelList();
            modelList.setModels(m1DataTuples);
            viewValue.setModels(modelList);

            setViewValue(viewValue);
            m_executed = true;
        }

        exec.setProgress(1);

        // return edited table
        final BufferedDataContainer container = exec
                .createDataContainer(SchemaFactory.createM1DataSchema().createSpec());
        final ModelList outModelList = getViewValue().getModels();
        for (final Model1DataTuple m1DataTuple : outModelList.getModels()) {
            final KnimeTuple outTuple = decodeTuple(m1DataTuple);
            container.addRowToTable(outTuple);
        }
        container.close();
        return new BufferedDataTable[] { container.getTable() };
    }

    @Override
    protected void performReset() {
        m_executed = false;
    }

    @Override
    protected void useCurrentValueAsDefault() {
    }

    @Override
    protected void saveSettingsTo(NodeSettingsWO settings) {
        m_config.saveSettings(settings);
    }

    @Override
    protected void validateSettings(NodeSettingsRO settings) throws InvalidSettingsException {
        new ModelEditorViewConfig().loadSettings(settings);
    }

    @Override
    protected void loadValidatedSettingsFrom(NodeSettingsRO settings) throws InvalidSettingsException {
        m_config.loadSettings(settings);
    }

    ////////////////////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////////////////

    // TODO: Move to another class: --> Model1DataTuple
    public static Model1DataTuple codeTuple(KnimeTuple inTuple) {
        final Model1DataTuple outTuple = new Model1DataTuple();
        // process
        outTuple.condId = inTuple.getInt(TimeSeriesSchema.ATT_CONDID);
        outTuple.combaseId = inTuple.getString(TimeSeriesSchema.ATT_COMBASEID);
        outTuple.globalModelId = inTuple.getInt(TimeSeriesSchema.ATT_GLOBALMODELID);

        final PmmXmlDoc miscDoc = inTuple.getPmmXml(TimeSeriesSchema.ATT_MISC);
        if (miscDoc != null) {
            final Misc[] miscs = new Misc[miscDoc.size()];
            for (int i = 0; i < miscDoc.size(); i++) {
                final MiscXml miscXml = (MiscXml) miscDoc.get(i);
                final Misc misc = new Misc();
                misc.id = miscXml.id;
                misc.name = miscXml.name;
                misc.description = miscXml.description;
                misc.value = miscXml.value;
                misc.categories = miscXml.categories.toArray(new String[miscXml.categories.size()]);
                misc.unit = miscXml.unit;
                misc.origUnit = miscXml.origUnit;
                misc.dbuuid = miscXml.dbuuid;
                miscs[i] = misc;
            }
            outTuple.miscList = new MiscList();
            outTuple.miscList.setMiscs(miscs);
        }

        final AgentXml agentXml = (AgentXml) inTuple.getPmmXml(TimeSeriesSchema.ATT_AGENT).get(0);
        if (agentXml != null) {
            final Agent agent = new Agent();
            agent.id = agentXml.id;
            agent.name = agentXml.name;
            agent.detail = agentXml.detail;
            agent.dbuuid = agentXml.dbuuid;
            outTuple.agent = agent;
        }

        final MatrixXml matrixXml = (MatrixXml) inTuple.getPmmXml(TimeSeriesSchema.ATT_MATRIX).get(0);
        if (matrixXml != null) {
            final Matrix matrix = new Matrix();
            matrix.id = matrixXml.id;
            matrix.name = matrixXml.name;
            matrix.detail = matrixXml.detail;
            matrix.dbuuid = matrixXml.dbuuid;
            outTuple.matrix = matrix;
        }

        final PmmXmlDoc timeSeriesDoc = inTuple.getPmmXml(TimeSeriesSchema.ATT_TIMESERIES);
        if (timeSeriesDoc != null) {
            final TimeSeries[] timeSeriesArray = new TimeSeries[timeSeriesDoc.size()];
            for (int i = 0; i < timeSeriesDoc.size(); i++) {
                final TimeSeriesXml timeSeriesXml = (TimeSeriesXml) timeSeriesDoc.get(i);

                final TimeSeries timeSeries = new TimeSeries();
                timeSeries.name = timeSeriesXml.name;
                timeSeries.time = timeSeriesXml.time;
                timeSeries.timeUnit = timeSeriesXml.timeUnit;
                timeSeries.origTimeUnit = timeSeriesXml.origTimeUnit;
                timeSeries.concentration = timeSeriesXml.concentration;
                timeSeries.concentrationUnit = timeSeriesXml.concentrationUnit;
                timeSeries.concentrationUnitObjectType = timeSeriesXml.concentrationUnitObjectType;
                timeSeries.origConcentrationUnit = timeSeriesXml.origConcentrationUnit;
                timeSeries.concentrationStdDev = timeSeriesXml.concentrationStdDev;
                timeSeries.numberOfMeasurements = timeSeriesXml.numberOfMeasurements;
                timeSeriesArray[i] = timeSeries;
            }

            outTuple.timeSeriesList = new TimeSeriesList();
            outTuple.timeSeriesList.setTimeSeries(timeSeriesArray);
        }

        final PmmXmlDoc mdInfoAtt = inTuple.getPmmXml(TimeSeriesSchema.ATT_MDINFO);
        MdInfoXml mdInfoXml = null;
        if (mdInfoAtt != null) {
            mdInfoXml = (MdInfoXml) mdInfoAtt.get(0);
        }

        if (mdInfoXml != null) {
            final MdInfo mdInfo = new MdInfo();
            mdInfo.id = mdInfoXml.id;
            mdInfo.name = mdInfoXml.name;
            mdInfo.comment = mdInfoXml.comment;
            mdInfo.qualityScore = mdInfoXml.qualityScore;
            mdInfo.checked = mdInfoXml.checked;
            outTuple.mdInfo = mdInfo;
        }

        final PmmXmlDoc mdLitDoc = inTuple.getPmmXml(TimeSeriesSchema.ATT_LITMD);
        if (mdLitDoc != null) {
            final Literature[] mdLiteratureArray = new Literature[mdLitDoc.size()];
            for (int i = 0; i < mdLitDoc.size(); i++) {
                final LiteratureItem literatureItem = (LiteratureItem) mdLitDoc.get(i);

                final Literature literature = new Literature();
                literature.author = literatureItem.author;
                literature.year = literatureItem.year;
                literature.title = literatureItem.title;
                literature.abstractText = literatureItem.abstractText;
                literature.journal = literatureItem.journal;
                literature.volume = literatureItem.volume;
                literature.issue = literatureItem.issue;
                literature.page = literatureItem.page;
                literature.approvalMode = literatureItem.approvalMode;
                literature.website = literatureItem.website;
                literature.type = literatureItem.type;
                literature.comment = literatureItem.comment;
                literature.id = literature.id;
                literature.dbuuid = literature.dbuuid;

                mdLiteratureArray[i] = literature;
            }
            outTuple.litMd = new LiteratureList();
            outTuple.litMd.setLiterature(mdLiteratureArray);
        }

        outTuple.dbuuid = inTuple.getString(TimeSeriesSchema.ATT_DBUUID); // deprecated?

        final CatalogModelXml catalogModelXml = (CatalogModelXml) inTuple.getPmmXml(Model1Schema.ATT_MODELCATALOG)
                .get(0);
        if (catalogModelXml != null) {
            final CatalogModel catalogModel = new CatalogModel();
            catalogModel.id = catalogModelXml.id;
            catalogModel.name = catalogModelXml.name;
            catalogModel.formula = catalogModelXml.formula;
            catalogModel.modelClass = catalogModelXml.modelClass;
            catalogModel.comment = catalogModelXml.comment;
            catalogModel.dbuuid = catalogModelXml.dbuuid;
            outTuple.catModel = catalogModel;
        }

        final PmmXmlDoc catalogModelSecAtt = inTuple.getPmmXml(Model2Schema.ATT_MODELCATALOG);
        CatalogModelXml catalogModelSecXml = null;
        if (catalogModelSecAtt != null) {
            catalogModelSecXml = (CatalogModelXml) catalogModelSecAtt.get(0);
        }

        if (catalogModelSecXml != null) {
            final CatalogModel catalogModelSec = new CatalogModel();
            catalogModelSec.id = catalogModelSecXml.id;
            catalogModelSec.name = catalogModelSecXml.name;
            catalogModelSec.formula = catalogModelSecXml.formula;
            catalogModelSec.modelClass = catalogModelSecXml.modelClass;
            catalogModelSec.comment = catalogModelSecXml.comment;
            catalogModelSec.dbuuid = catalogModelSecXml.dbuuid;
            outTuple.catModelSec = catalogModelSec;
        }

        final PmmXmlDoc estModelAtt = inTuple.getPmmXml(Model1Schema.ATT_ESTMODEL);
        EstModelXml estModelXml = null;
        if (estModelAtt != null) {
            estModelXml = (EstModelXml) estModelAtt.get(0);
        }

        if (estModelXml != null) {
            final EstModel estModel = new EstModel();
            estModel.id = estModelXml.id;
            estModel.name = estModelXml.name;
            estModel.sse = estModelXml.sse;
            estModel.rms = estModelXml.rms;
            estModel.r2 = estModelXml.r2;
            estModel.aic = estModelXml.aic;
            estModel.bic = estModelXml.bic;
            estModel.dof = estModelXml.dof;
            estModel.qualityScore = estModelXml.qualityScore;
            estModel.checked = estModelXml.checked;
            estModel.comment = estModelXml.comment;
            estModel.dbuuid = estModelXml.dbuuid;
            outTuple.estModel = estModel;
        }

        final PmmXmlDoc depAtt = inTuple.getPmmXml(Model1Schema.ATT_DEPENDENT);
        DepXml depXml = null;
        if (depAtt != null) {
            depXml = (DepXml) depAtt.get(0);
        }

        if (depXml != null) {
            final Dep dep = new Dep();
            dep.name = depXml.name;
            dep.origname = depXml.origName;
            dep.min = depXml.min;
            dep.max = depXml.max;
            dep.category = depXml.category;
            dep.unit = depXml.unit;
            dep.description = depXml.description;
            outTuple.dep = dep;
        }

        final PmmXmlDoc paramDoc = inTuple.getPmmXml(Model1Schema.ATT_PARAMETER);
        final Param[] paramArray = new Param[paramDoc.size()];
        for (int i = 0; i < paramDoc.size(); i++) {
            final ParamXml paramXml = (ParamXml) paramDoc.get(i);

            final HashMap<String, Double> obtainedCorrelations = paramXml.correlations;
            final String[] obtainedCorrelationNames = new String[obtainedCorrelations.size()];
            final double[] obtainedCorrelationValues = new double[obtainedCorrelations.size()];
            int j = 0;
            for (final Map.Entry<String, Double> entry : obtainedCorrelations.entrySet()) {
                obtainedCorrelationNames[j] = entry.getKey();
                obtainedCorrelationValues[j] = entry.getValue();
                j++;
            }

            final Param param = new Param();
            param.name = paramXml.name;
            param.origName = paramXml.origName;
            param.isStart = paramXml.isStartParam;
            param.value = paramXml.value;
            param.error = paramXml.error;
            param.min = paramXml.min;
            param.max = paramXml.max;
            param.p = paramXml.P;
            param.t = paramXml.t;
            param.minGuess = paramXml.minGuess;
            param.maxGuess = paramXml.maxGuess;
            param.category = paramXml.category;
            param.unit = paramXml.unit;
            param.description = paramXml.description;
            param.correlationNames = obtainedCorrelationNames;
            param.correlationValues = obtainedCorrelationValues;

            paramArray[i] = param;
        }
        outTuple.params = new ParamList();
        outTuple.params.setParams(paramArray);

        final PmmXmlDoc paramSecDoc = inTuple.getPmmXml(Model2Schema.ATT_PARAMETER);
        if (paramSecDoc != null) {
            final Param[] paramSecArray = new Param[paramSecDoc.size()];
            for (int i = 0; i < paramSecDoc.size(); i++) {
                final ParamXml paramSecXml = (ParamXml) paramSecDoc.get(i);

                final HashMap<String, Double> obtainedCorrelations = paramSecXml.correlations;
                final String[] obtainedCorrelationNames = new String[obtainedCorrelations.size()];
                final double[] obtainedCorrelationValues = new double[obtainedCorrelations.size()];
                int j = 0;
                for (final Map.Entry<String, Double> entry : obtainedCorrelations.entrySet()) {
                    obtainedCorrelationNames[j] = entry.getKey();
                    obtainedCorrelationValues[j] = entry.getValue();
                    j++;
                }

                final Param paramSec = new Param();
                paramSec.name = paramSecXml.name;
                paramSec.origName = paramSecXml.origName;
                paramSec.isStart = paramSecXml.isStartParam;
                paramSec.value = paramSecXml.value;
                paramSec.error = paramSecXml.error;
                paramSec.min = paramSecXml.min;
                paramSec.max = paramSecXml.max;
                paramSec.p = paramSecXml.P;
                paramSec.t = paramSecXml.t;
                paramSec.minGuess = paramSecXml.minGuess;
                paramSec.maxGuess = paramSecXml.maxGuess;
                paramSec.category = paramSecXml.category;
                paramSec.unit = paramSecXml.unit;
                paramSec.description = paramSecXml.description;
                paramSec.correlationNames = obtainedCorrelationNames;
                paramSec.correlationValues = obtainedCorrelationValues;

                paramSecArray[i] = paramSec;
            }
            outTuple.paramsSec = new ParamList();
            outTuple.paramsSec.setParams(paramSecArray);
        }

        final PmmXmlDoc indepDoc = inTuple.getPmmXml(Model1Schema.ATT_INDEPENDENT);
        if (indepDoc != null) {
            final Indep[] indepArray = new Indep[indepDoc.size()];
            for (int i = 0; i < indepDoc.size(); i++) {
                final IndepXml indepXml = (IndepXml) indepDoc.get(i);
                final Indep indep = new Indep();
                indep.name = indepXml.name;
                indep.origname = indepXml.origName;
                indep.min = indepXml.min;
                indep.max = indepXml.max;
                indep.category = indepXml.category;
                indep.unit = indepXml.unit;
                indep.description = indepXml.description;
                indepArray[i] = indep;
            }
            outTuple.indeps = new IndepList();
            outTuple.indeps.setIndeps(indepArray);
        }

        final PmmXmlDoc indepSecDoc = inTuple.getPmmXml(Model2Schema.ATT_INDEPENDENT);
        if (indepSecDoc != null) {
            final Indep[] indepSecArray = new Indep[indepSecDoc.size()];
            for (int i = 0; i < indepSecDoc.size(); i++) {
                final IndepXml indepSecXml = (IndepXml) indepSecDoc.get(i);
                final Indep indepSec = new Indep();
                indepSec.name = indepSecXml.name;
                indepSec.origname = indepSecXml.origName;
                indepSec.min = indepSecXml.min;
                indepSec.max = indepSecXml.max;
                indepSec.category = indepSecXml.category;
                indepSec.unit = indepSecXml.unit;
                indepSec.description = indepSecXml.description;
                indepSecArray[i] = indepSec;
            }

            outTuple.indepsSec = new IndepList();
            outTuple.indepsSec.setIndeps(indepSecArray);
        }

        final PmmXmlDoc mLitDoc = inTuple.getPmmXml(Model1Schema.ATT_MLIT);
        if (mLitDoc != null) {
            final Literature[] mLiteratureArray = new Literature[mLitDoc.size()];
            for (int i = 0; i < mLitDoc.size(); i++) {
                final LiteratureItem literatureItem = (LiteratureItem) mLitDoc.get(i);
                final Literature literature = new Literature();
                literature.author = literatureItem.author;
                literature.year = literatureItem.year;
                literature.title = literatureItem.title;
                literature.abstractText = literatureItem.abstractText;
                literature.journal = literatureItem.journal;
                literature.volume = literatureItem.volume;
                literature.issue = literatureItem.issue;
                literature.page = literatureItem.page;
                literature.approvalMode = literatureItem.approvalMode;
                literature.website = literatureItem.website;
                literature.type = literatureItem.type;
                literature.comment = literatureItem.comment;
                literature.id = literatureItem.id;
                literature.dbuuid = literatureItem.dbuuid;

                mLiteratureArray[i] = literature;
            }
            outTuple.mLit = new LiteratureList();
            outTuple.mLit.setLiterature(mLiteratureArray);
        }

        final PmmXmlDoc emLitDoc = inTuple.getPmmXml(Model1Schema.ATT_EMLIT);
        if (emLitDoc != null) {
            final Literature[] emLiteratureArray = new Literature[emLitDoc.size()];
            for (int i = 0; i < emLitDoc.size(); i++) {
                final LiteratureItem literatureItem = (LiteratureItem) emLitDoc.get(i);

                final Literature literature = new Literature();
                literature.author = literatureItem.author;
                literature.year = literatureItem.year;
                literature.title = literatureItem.title;
                literature.abstractText = literatureItem.abstractText;
                literature.journal = literatureItem.journal;
                literature.volume = literatureItem.volume;
                literature.issue = literatureItem.issue;
                literature.page = literatureItem.page;
                literature.approvalMode = literatureItem.approvalMode;
                literature.website = literatureItem.website;
                literature.type = literatureItem.type;
                literature.comment = literatureItem.comment;
                literature.id = literatureItem.id;
                literature.dbuuid = literatureItem.dbuuid;

                emLiteratureArray[i] = literature;
            }
            outTuple.emLit = new LiteratureList();
            outTuple.emLit.setLiterature(emLiteratureArray);
        }

        if (inTuple.getInt(Model1Schema.ATT_DATABASEWRITABLE) != null) {
            outTuple.databaseWritable = Model1Schema.WRITABLE == inTuple.getInt(Model1Schema.ATT_DATABASEWRITABLE);
        } else {
            outTuple.databaseWritable = false; // default is false
        }

        return outTuple;
    }

    // TODO: Move to another class: --> Model1DataTuple
    public static KnimeTuple decodeTuple(final Model1DataTuple m1DataTuple) {
        final KnimeTuple outTuple = new KnimeTuple(SchemaFactory.createM1DataSchema());

        outTuple.setValue(TimeSeriesSchema.ATT_CONDID, m1DataTuple.condId);
        outTuple.setValue(TimeSeriesSchema.ATT_COMBASEID, m1DataTuple.combaseId);

        final PmmXmlDoc miscDoc = new PmmXmlDoc();
        for (final Misc misc : m1DataTuple.miscList.getMiscs()) {
            miscDoc.add(new MiscXml(misc.id, misc.name, misc.description, misc.value, Arrays.asList(misc.categories),
                    misc.unit, misc.origUnit, misc.dbuuid));
        }
        outTuple.setValue(TimeSeriesSchema.ATT_MISC, miscDoc);

        final Agent agent = m1DataTuple.agent;
        final PmmXmlDoc agentDoc = new PmmXmlDoc(new AgentXml(agent.id, agent.name, agent.detail, agent.dbuuid));
        outTuple.setValue(TimeSeriesSchema.ATT_AGENT, agentDoc);

        final Matrix matrix = m1DataTuple.matrix;
        final PmmXmlDoc matrixDoc = new PmmXmlDoc(new MatrixXml(matrix.id, matrix.name, matrix.detail, matrix.dbuuid));
        outTuple.setValue(TimeSeriesSchema.ATT_MATRIX, matrixDoc);

        final PmmXmlDoc timeSeriesDoc = new PmmXmlDoc();
        for (final TimeSeries timeSeries : m1DataTuple.timeSeriesList.getTimeSeries()) {
            timeSeriesDoc.add(new TimeSeriesXml(timeSeries.name, timeSeries.time, timeSeries.timeUnit,
                    timeSeries.origTimeUnit, timeSeries.concentration, timeSeries.concentrationUnit,
                    timeSeries.concentrationUnitObjectType, timeSeries.origConcentrationUnit,
                    timeSeries.concentrationStdDev, timeSeries.numberOfMeasurements));
        }
        outTuple.setValue(TimeSeriesSchema.ATT_TIMESERIES, timeSeriesDoc);

        final MdInfo mdInfo = m1DataTuple.mdInfo;
        final PmmXmlDoc mdInfoDoc = new PmmXmlDoc(
                new MdInfoXml(mdInfo.id, mdInfo.name, mdInfo.comment, mdInfo.qualityScore, mdInfo.checked));
        outTuple.setValue(TimeSeriesSchema.ATT_MDINFO, mdInfoDoc);

        final PmmXmlDoc mdLitDoc = new PmmXmlDoc();
        for (final Literature literature : m1DataTuple.litMd.getLiterature()) {
            mdLitDoc.add(new LiteratureItem(literature.author, literature.year, literature.title,
                    literature.abstractText, literature.journal, literature.volume, literature.issue, literature.page,
                    literature.approvalMode, literature.website, literature.type, literature.comment, literature.id,
                    literature.dbuuid));
        }
        outTuple.setValue(TimeSeriesSchema.ATT_LITMD, mdLitDoc);

        outTuple.setValue(TimeSeriesSchema.ATT_DBUUID, m1DataTuple.dbuuid);
        outTuple.setValue(Model1Schema.ATT_DBUUID, m1DataTuple.dbuuid);

        final CatalogModel catalogModel = m1DataTuple.catModel;
        final CatalogModelXml catalogModelXml = new CatalogModelXml(catalogModel.id, catalogModel.name,
                catalogModel.formula, catalogModel.modelClass, catalogModel.dbuuid);
        catalogModelXml.comment = catalogModel.comment;
        final PmmXmlDoc catalogModelDoc = new PmmXmlDoc(catalogModelXml);
        outTuple.setValue(Model1Schema.ATT_MODELCATALOG, catalogModelDoc);

        final EstModel estModel = m1DataTuple.estModel;
        final EstModelXml estModelXml = new EstModelXml(estModel.id, estModel.name, estModel.sse, estModel.rms,
                estModel.r2, estModel.aic, estModel.bic, estModel.dof, true, estModel.qualityScore, estModel.dbuuid);
        estModelXml.comment = estModel.comment;
        final PmmXmlDoc estModelDoc = new PmmXmlDoc(estModelXml);
        outTuple.setValue(Model1Schema.ATT_ESTMODEL, estModelDoc);

        final Dep dep = m1DataTuple.dep;
        final DepXml depXml = new DepXml(dep.name, dep.origname, dep.category, dep.unit, dep.description);
        depXml.min = dep.min;
        depXml.max = dep.max;
        outTuple.setValue(Model1Schema.ATT_DEPENDENT, new PmmXmlDoc(depXml));

        final PmmXmlDoc paramDoc = new PmmXmlDoc();
        final ParamList paramList = m1DataTuple.params;
        for (final Param param : paramList.getParams()) {
            final HashMap<String, Double> correlations = new HashMap<>();
            if (param.correlationNames != null && param.correlationValues != null) {
                for (int i = 0; i < param.correlationNames.length; i++) {
                    final String correlationName = param.correlationNames[i];
                    final Double correlationValue = param.correlationValues[i];
                    correlations.put(correlationName, correlationValue);
                }
            }
            final ParamXml paramXml = new ParamXml(param.name, param.origName, param.isStart, param.value, param.error,
                    param.min, param.max, param.p, param.t, param.minGuess, param.maxGuess, param.category, param.unit,
                    param.description, correlations);
            paramDoc.add(paramXml);
        }
        outTuple.setValue(Model1Schema.ATT_PARAMETER, paramDoc);

        final PmmXmlDoc indepDoc = new PmmXmlDoc();
        final IndepList indepList = m1DataTuple.indeps;
        for (final Indep indep : indepList.getIndeps()) {
            final IndepXml indepXml = new IndepXml(indep.name, indep.origname, indep.min, indep.max, indep.category,
                    indep.unit, indep.description);
            indepDoc.add(indepXml);
        }
        outTuple.setValue(Model1Schema.ATT_INDEPENDENT, indepDoc);

        final PmmXmlDoc mLitDoc = new PmmXmlDoc();
        for (final Literature literature : m1DataTuple.mLit.getLiterature()) {
            mLitDoc.add(new LiteratureItem(literature.author, literature.year, literature.title,
                    literature.abstractText, literature.journal, literature.volume, literature.issue, literature.page,
                    literature.approvalMode, literature.website, literature.type, literature.comment, literature.id,
                    literature.dbuuid));
        }
        outTuple.setValue(Model1Schema.ATT_MLIT, mLitDoc);

        final PmmXmlDoc emLitDoc = new PmmXmlDoc();
        for (final Literature literature : m1DataTuple.emLit.getLiterature()) {
            emLitDoc.add(new LiteratureItem(literature.author, literature.year, literature.title,
                    literature.abstractText, literature.journal, literature.volume, literature.issue, literature.page,
                    literature.approvalMode, literature.website, literature.type, literature.comment, literature.id,
                    literature.dbuuid));
        }
        outTuple.setValue(Model1Schema.ATT_EMLIT, emLitDoc);

        outTuple.setValue(Model1Schema.ATT_DATABASEWRITABLE, m1DataTuple.databaseWritable ? 1 : 0);

        return outTuple;
    }

    @Override
    public void setHideInWizard(boolean hide) {
    }

}