de.randi2.services.ChartsServiceImpl.java Source code

Java tutorial

Introduction

Here is the source code for de.randi2.services.ChartsServiceImpl.java

Source

/* 
 * (c) 2008- RANDI2 Core Development Team
 * 
 * This file is part of RANDI2.
 * 
 * RANDI2 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.
 * 
 * RANDI2 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
 * RANDI2. If not, see <http://www.gnu.org/licenses/>.
 */
package de.randi2.services;

import java.util.ArrayList;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import de.randi2.dao.TrialDao;
import de.randi2.model.TreatmentArm;
import de.randi2.model.Trial;
import de.randi2.model.TrialSite;
import de.randi2.model.TrialSubject;
import de.randi2.utility.Pair;

@Service("chartsService")
public class ChartsServiceImpl implements ChartsService {

    @Autowired
    private TrialDao trialDao;

    @Override
    @Transactional(propagation = Propagation.REQUIRED)
    public ChartData generateRecruitmentChart(Trial trial) {
        trial = trialDao.refresh(trial);
        ChartData tempD = new ChartData();

        int plannedSubjects = 0;
        for (TreatmentArm arm : trial.getTreatmentArms()) {
            plannedSubjects += arm.getPlannedSubjects();
        }

        List<double[]> data = new ArrayList<double[]>();
        GregorianCalendar startDate = trial.getStartDate();
        GregorianCalendar endDate = trial.getEndDate();
        int monthStart = startDate.get(GregorianCalendar.MONTH);
        int monthEnd = endDate.get(GregorianCalendar.MONTH);
        ArrayList<String> xL = new ArrayList<String>();

        for (int year = startDate.get(GregorianCalendar.YEAR); year <= endDate
                .get(GregorianCalendar.YEAR); year++) {

            if (year != endDate.get(GregorianCalendar.YEAR)) {
                monthEnd = startDate.getMaximum(GregorianCalendar.MONTH);
            } else {
                monthEnd = endDate.get(GregorianCalendar.MONTH);
            }
            for (int month = monthStart; month <= monthEnd; month++) {
                double[] values = new double[2];
                values[0] = 0;
                if (data.size() > 0) {
                    values[1] = data.get(data.size() - 1)[1];
                } else
                    values[1] = 0;

                for (TrialSubject subject : trial.getSubjects()) {
                    if (subject.getCreatedAt().get(GregorianCalendar.MONTH) == month
                            && subject.getCreatedAt().get(GregorianCalendar.YEAR) == year) {
                        values[1] = values[1] + 1.0;
                    }
                }
                xL.add((month + 1) + "." + year);
                data.add(values);
            }
            monthStart = startDate.getMinimum(GregorianCalendar.MONTH);
        }

        for (int i = 1; i <= data.size(); i++) {
            data.get(i - 1)[0] = i * (plannedSubjects / data.size());
        }

        tempD.setXLabels(xL);
        tempD.setData(data);
        return tempD;
    }

    @Override
    @Transactional(propagation = Propagation.REQUIRED)
    public ChartData generateArmChart(Trial trial) {
        ChartData chData = new ChartData();
        int i = 1;
        ArrayList<String> xL = new ArrayList<String>();
        ArrayList<double[]> data = new ArrayList<double[]>();
        for (TreatmentArm t : trial.getTreatmentArms()) {
            data.add(new double[] { t.getSubjects().size() });
            xL.add(Integer.toString(i));
            i++;
        }
        chData.setData(data);
        chData.setXLabels(xL);
        return chData;
    }

    @Override
    @Transactional(propagation = Propagation.REQUIRED)
    public ChartData generateRecruitmentChartTrialSite(Trial trial) {
        trial = trialDao.refresh(trial);
        ChartData chData = new ChartData();
        ArrayList<String> xL = new ArrayList<String>();
        ArrayList<double[]> data = new ArrayList<double[]>();

        ArrayList<TrialSubject> subjects1 = new ArrayList<TrialSubject>(trial.getSubjects());
        double[] count = new double[trial.getParticipatingSites().size()];
        int i = 0;
        for (TrialSite site : trial.getParticipatingSites()) {
            ArrayList<TrialSubject> subjects = new ArrayList<TrialSubject>(subjects1);
            xL.add(site.getName());

            count[i] = 0;
            for (TrialSubject subject : subjects) {
                if (subject.getTrialSite().getName().equals(site.getName())) {
                    count[i]++;
                    subjects1.remove(subject);
                }
            }
            i++;
        }
        for (double j : count) {
            data.add(new double[] { j });
        }
        chData.setData(data);
        chData.setXLabels(xL);
        return chData;
    }

    @Override
    @Transactional(propagation = Propagation.REQUIRED)
    public ChartData generateRecruitmentChartFactors(Trial trial) {
        trial = trialDao.refresh(trial);
        ChartData chData = new ChartData();
        ArrayList<String> xL = new ArrayList<String>();
        ArrayList<double[]> data = new ArrayList<double[]>();
        HashMap<String, Double> strataCountMap = new HashMap<String, Double>();
        HashMap<String, String> strataNameMap = new HashMap<String, String>();

        Pair<List<String>, List<String>> pair = trial.getAllStrataIdsAndNames();
        for (int i = 0; i < pair.first().size(); i++) {
            strataCountMap.put(pair.first().get(i), new Double(0));
            strataNameMap.put(pair.first().get(i), pair.last().get(i));
        }

        for (TrialSubject subject : trial.getSubjects()) {
            String stratum = "";
            if (trial.isStratifyTrialSite()) {
                stratum = subject.getTrialSite().getId() + "__";
            }
            stratum += subject.getStratum();
            Double count = strataCountMap.get(stratum);
            count++;
            strataCountMap.put(stratum, count);
        }

        double[] dataTable;
        int i = 0;
        for (String s : strataCountMap.keySet()) {
            dataTable = new double[strataCountMap.size()];
            for (int j = 0; j < dataTable.length; j++) {
                if (j != i) {
                    dataTable[j] = 0;
                }
            }
            dataTable[i] = strataCountMap.get(s);
            xL.add(strataNameMap.get(s));
            i++;
            data.add(dataTable);
        }
        chData.setData(data);
        chData.setXLabels(xL);
        return chData;
    }

}