/* * This file is part of ADDIS (Aggregate Data Drug Information System). * ADDIS is distributed from http://drugis.org/. * Copyright © 2009 Gert van Valkenhoef, Tommi Tervonen. * Copyright © 2010 Gert van Valkenhoef, Tommi Tervonen, Tijs Zwinkels, * Maarten Jacobs, Hanno Koeslag, Florin Schimbinschi, Ahmad Kamal, Daniel * Reid. * Copyright © 2011 Gert van Valkenhoef, Ahmad Kamal, Daniel Reid, Florin * Schimbinschi. * Copyright © 2012 Gert van Valkenhoef, Daniel Reid, Joël Kuiper, Wouter * Reckman. * Copyright © 2013 Gert van Valkenhoef, Joël Kuiper. * * 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.presentation; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.TreeSet; import org.drugis.addis.entities.OutcomeMeasure; import org.drugis.addis.entities.analysis.MetaAnalysis; import org.drugis.addis.entities.analysis.MetaBenefitRiskAnalysis; import org.drugis.addis.entities.analysis.NetworkMetaAnalysis; import org.drugis.addis.gui.AddisMCMCPresentation; import org.drugis.addis.entities.treatment.TreatmentDefinition; import org.drugis.addis.mcmcmodel.AbstractBaselineModel; import org.drugis.common.threading.Task; import org.drugis.common.threading.ThreadHandler; import org.drugis.common.threading.status.TaskTerminatedModel; import org.drugis.common.validation.BooleanAndModel; import org.drugis.mtc.presentation.MCMCModelWrapper; import org.drugis.mtc.presentation.MTCModelWrapper; import com.jgoodies.binding.list.ArrayListModel; import com.jgoodies.binding.list.ObservableList; import com.jgoodies.binding.value.ValueModel; @SuppressWarnings("serial") public class MetaBenefitRiskPresentation extends AbstractBenefitRiskPresentation<TreatmentDefinition, MetaBenefitRiskAnalysis> { private ValueHolder<Boolean> d_measurementsReadyModel; private HashMap<MCMCModelWrapper, AddisMCMCPresentation> d_models; public MetaBenefitRiskPresentation(final MetaBenefitRiskAnalysis bean, final PresentationModelFactory pmf) { super(bean, pmf); d_pmf = pmf; } @Override protected void initSimulations() { d_models = new HashMap<MCMCModelWrapper, AddisMCMCPresentation>(); initAllBaselineModels(); initNetworkMetaAnalysisModels(); } @Override protected void startSMAA() { if (getMeasurementsReadyModel().getValue()) { getSMAAPresentation().startSMAA(); } getMeasurementsReadyModel().addValueChangeListener(new PropertyChangeListener() { @Override public void propertyChange(final PropertyChangeEvent evt) { getSMAAPresentation().startSMAA(); } }); } @Override protected void startLyndOBrien() { if (getMeasurementsReadyModel().getValue()) { getLyndOBrienPresentation().startLyndOBrien(); } getMeasurementsReadyModel().addValueChangeListener(new PropertyChangeListener() { @Override public void propertyChange(final PropertyChangeEvent evt) { getLyndOBrienPresentation().startLyndOBrien(); } }); } public ObservableList<MetaAnalysis> getAnalysesModel() { return new ArrayListModel<MetaAnalysis>(getBean().getMetaAnalyses()); } @Override public ValueHolder<Boolean> getMeasurementsReadyModel() { if (d_measurementsReadyModel != null) { return d_measurementsReadyModel; } final List<ValueModel> models = new ArrayList<ValueModel>(); for (final MCMCModelWrapper wrapper : d_models.keySet()) { if (!wrapper.isSaved()) { models.add(new TaskTerminatedModel(wrapper.getModel().getActivityTask())); } } d_measurementsReadyModel = new ValueModelWrapper<Boolean>(new BooleanAndModel(models)); return d_measurementsReadyModel; } public List<Task> getMeasurementTasks() { final List<Task> tasks = getBaselineTasks(); tasks.addAll(getBean().getNetworkTasks()); return tasks; } private List<Task> getBaselineTasks() { final List<Task> tasks = new ArrayList<Task>(); for (final AddisMCMCPresentation model : d_models.values()) { if(model.getModel() instanceof AbstractBaselineModel) { tasks.add(model.getModel().getActivityTask()); } } return tasks; } private void initAllBaselineModels() { for (final OutcomeMeasure om : getBean().getCriteria()) { addBaselineModel(om); } } private void addBaselineModel(final OutcomeMeasure om) { final MCMCModelWrapper baselineModel = getBean().getBaselineModel(om); d_models.put(baselineModel, new AddisMCMCPresentation(baselineModel, om, om.getName() + " \u2014 " + baselineModel.getDescription())); baselineModel.addPropertyChangeListener(new PropertyChangeListener() { @Override public void propertyChange(final PropertyChangeEvent evt) { if(evt.getPropertyName().equals(MCMCModelWrapper.PROPERTY_DESTROYED)) { final MCMCModelWrapper source = (MCMCModelWrapper) evt.getSource(); source.removePropertyChangeListener(this); d_models.remove(source); addBaselineModel(om); } } }); } private void initNetworkMetaAnalysisModels() { for (final MetaAnalysis ma : getBean().getMetaAnalyses()) { if (ma instanceof NetworkMetaAnalysis) { final NetworkMetaAnalysis nma = (NetworkMetaAnalysis)ma; addConsistencyModel(nma); } } } private void addConsistencyModel(final NetworkMetaAnalysis nma) { d_models.put(nma.getConsistencyModel(), new AddisMCMCPresentation(nma.getConsistencyModel(), nma.getOutcomeMeasure(), nma.getName() + " \u2014 " + nma.getConsistencyModel().getDescription())); nma.getConsistencyModel().addPropertyChangeListener(new PropertyChangeListener() { @Override public void propertyChange(final PropertyChangeEvent evt) { if(evt.getPropertyName().equals(MTCModelWrapper.PROPERTY_DESTROYED)) { final MCMCModelWrapper source = (MCMCModelWrapper) evt.getSource(); source.removePropertyChangeListener(this); d_models.remove(source); addConsistencyModel(nma); } } }); } public BRBaselineMeasurementTableModel getBaselineMeasurementTableModel() { return new BRBaselineMeasurementTableModel(getBean()); } public BRRelativeMeasurementTableModel getRelativeMeasurementTableModel() { return new BRRelativeMeasurementTableModel(getBean()); } public BenefitRiskMeasurementTableModel<TreatmentDefinition> getMeasurementTableModel() { return new BenefitRiskMeasurementTableModel<TreatmentDefinition>(getBean()); } public TreatmentDefinition getBaseline() { return getBean().getBaseline(); } public Collection<AddisMCMCPresentation> getWrappedModels() { return new TreeSet<AddisMCMCPresentation>( d_models.values() ); } public synchronized void startAllSimulations() { ThreadHandler.getInstance().scheduleTasks(getMeasurementTasks()); } }