Example #1
0
def convert_baseline_to_scenario(request, baseline_id):
    dim_user = DimUser.objects.get(username=request.user.username)
    emod_scenario = EMODBaseline.from_dw(id=baseline_id)
    dim_scenario = DimBaseline.objects.get(id=baseline_id)

    extra_metadata = {}

    # This doesn't all need to be here, but it is simpler just to leave it
    if dim_scenario.metadata:
        metadata = json.loads(dim_scenario.metadata)

        if 'representative' in metadata:
            emod_scenario.is_representative = True
            extra_metadata = metadata
            if 'is_complete' in metadata['representative']:
                emod_scenario.representative_is_completed = True
            else:
                emod_scenario.representative_is_completed = False
            emod_scenario.name = derive_autoname(dim_scenario)
        else:
            emod_scenario.is_representative = False

    # Create simulation group if one is not already made
    if not dim_scenario.simulation_group:
        simulation_group = SimulationGroup(submitted_by=dim_user)
        simulation_group.save()

        simulation = add_simulation(dim_user, sim_model.EMOD, dim_scenario.template.model_version.split('v')[1], simulation_group, baseline_id)

        scenario = Scenario.objects.create(
            name=dim_scenario.name,
            description=dim_scenario.description,
            user=dim_user,
            simulation=simulation,
            metadata={},
            extra_metadata=extra_metadata
        )

        # Modify config
        config_json = json.loads(scenario.config_file.get_contents())
        config_json['parameters']['Land_Temperature_Filename'] = 'temperature.bin'
        config_json['parameters']['Rainfall_Filename'] = 'rainfall.bin'
        config_json['parameters']['Relative_Humidity_Filename'] = 'humidity.bin'
        config_json['parameters']['Air_Temperature_Filename'] = 'temperature.bin'
        config_json['parameters']['Campaign_Filename'] = 'campaign.json'
        config_json['parameters']['Demographics_Filename'] = 'demographics.compiled.json'
        contents = json.dumps(config_json)
        scenario.set_file_by_type('config', contents)

        set_notification('alert-success', '<strong>Success!</strong> Converted baseline to scenario.', request.session)

        # This makes sure we don't try to convert the same baseline twice
        dim_scenario.simulation_group = simulation_group
        dim_scenario.save()
    else:
        simulation_group = dim_scenario.simulation_group
        try:
            simulation = simulation_group.simulations.all()[0]
            scenario = simulation.emod_scenario_set.all()[0]
        except Exception as exception:
            set_notification(
                'alert-error',
                '<strong>Error!</strong> Simulation group exists but there is no matching scenario. ' + str(exception),
                request.session
            )
            return redirect("ts.index")
        set_notification('alert-success', '<strong>Success!</strong> This baseline has already been converted.', request.session)

    return redirect("ts_emod2.details", scenario_id=scenario.id)
Example #2
0
    def get_context_data(self, **kwargs):
        """Extension of get_context_data

        Add context data to drive menu nav highlights, breadcrumbs and pagers.
        """
        context = super(ScenarioBrowseView, self).get_context_data(**kwargs)
        the_request = self.request

        context['nav_button'] = 'scenario_browse'

        pager_size = the_request.POST.get('pager_size') or the_request.GET.get('pager_size')
        if pager_size is None:
            pager_size = 10
        else:
            pager_size = int(pager_size)

        # Get list of folders in this folder (if no current folder, include folders with no parent)
        if 'folder_id' in kwargs.keys():
            current_folder = kwargs['folder_id'] or the_request.POST.get('folder_id') or the_request.GET.get('folder_id') or None
            context['current_folder'] = Folder.objects.get(pk=current_folder)
        else:
            current_folder = None

        # get a list of all scenarios in order to get count of sims in each folder
        scenario_list_all = list(DimBaseline.objects.filter(user=DimUser.objects.get(username=self.request.user.username),
                                                is_deleted=False))
        my_count = {}
        for scen in scenario_list_all:
            if scen.folder_id in my_count.keys():
                my_count[scen.folder_id] += 1
            else:
                my_count[scen.folder_id] = 1

        # create a dictionary of children (keys are parents, value is list of children)
        folder_list_all = list(Folder.objects.filter(user=DimUser.objects.get(username=self.request.user.username),
                                                     is_deleted=False))
        my_dict = defaultdict(list)

        for folder in folder_list_all:
            if folder.id in my_count.keys():
                counter = ' (' + str(my_count[folder.id]) + ')'
            else:
                counter = ''
            if folder.parent is None:
                my_dict[0].append({'id': folder.id, 'name': folder.name, 'child_count': counter})
            else:
                my_dict[folder.parent.id].append({'id': folder.id, 'name': folder.name, 'child_count': counter})

        current_found = 0  # Set flag that deterimines if the current folder has been visited in the tree

        if None in my_count.keys():
            counter_root = ' (' + str(my_count[None]) + ')'
        else:
            counter_root = ''

        folder_tree = '{title: "My Simulations' + counter_root + '", folder: true, expanded: true'
        if current_folder is None:
            folder_tree += ', active: true'
            current_found = 1

        # context['folder_tree'] = '{title: "My Tororo Folder full of Simulations (and folders) in home folder ", folder: true }, ' \
        #                          '{title: "Folder 2", folder: true, ' \
        #                              'children: [ ' \
        #                                 '{ title: "Sub-item 2.1", folder: true }, ' \
        #                                 '{ title: "Sub-item 2.2" }] }, ' \
        #                          '{ title: "Item 3" }'
        # without root:
        # context['folder_tree'] = '{title: "Solomon Islands", folder: true}, {title: "Second folder", folder: true, children: [ {title: "subfolder", folder: true}] }'
        #folder_tree = add_children(0, my_dict)
        # with root:
        # context['folder_tree'] = '{title: "My Simulations", folder: true, children: [ {title: "Solomon Islands", folder: true}, {title: "Second folder", folder: true, children: [ {title: "subfolder", folder: true}] }] }'

        folder_tree += add_children(0, my_dict, current_folder, current_found) + '}'

        context['folder_tree'] = str(folder_tree)

        # Get list of scenarios
        scenario_list = list(DimBaseline.objects.filter(user=DimUser.objects.get(username=self.request.user.username),
                                                        folder=current_folder,
                                                        is_deleted=False))

        if scenario_list is None:
            return context

        # sort descending by id (for those old scenarios that all have the same old time_created
        scenario_list = sorted(scenario_list, key=lambda x: x.id, reverse=True)
        # sort descending by time_saved (version)
        scenario_list = sorted(scenario_list, key=lambda x: x.last_modified, reverse=True)

        # merge folders into scenario list
        # - show folders in file list
        #scenario_list = folder_list + scenario_list

        # Flag scenarios that are representative
        for scenario in scenario_list:
            # Hack for now. I don't remember if it is still needed, but I will fix it later. Not currently important.
            if scenario.description == "Made with representative workflow" and not scenario.metadata:
                scenario.metadata = json.dumps({'representative': ''})
                scenario.save()
            if scenario.metadata:
                metadata = json.loads(scenario.metadata)

                if 'representative' in metadata:
                    scenario.is_representative = True
                    if 'is_complete' in metadata['representative']:
                        scenario.representative_is_complete = metadata['representative']['is_complete']
                    else:
                        scenario.representative_is_complete = False
                    scenario.name = derive_autoname(scenario)
                else:
                    scenario.is_representative = False

        paginator = Paginator(scenario_list, pager_size)
        page = int(the_request.GET.get('page') or 1)

        try:
            scenarios = paginator.page(page)
        except PageNotAnInteger:
            # If page is not an integer, deliver first page.
            scenarios = paginator.page(1)
        except EmptyPage:
            # If page is out of range (e.g. 9999), deliver last page of results.
            scenarios = paginator.page(paginator.num_pages)

        scenario_count = len(scenario_list)

        context['pager_size'] = pager_size
        context['scenarios'] = scenarios
        context['scenario_range'] = range(paginator.num_pages)
        context['scenario_count'] = scenario_count
        context['current_start'] = (page-1)*pager_size + 1
        context['current_stop'] = min(scenario_count, (page-1)*pager_size + pager_size)
        context['my_username'] = self.request.user.username

        # get locations (need name from dict by id)
        adapter = EMOD_Adapter(self.request.user.username)
        template_list = adapter.fetch_template_list()
        location_dict = adapter.fetch_locations()  # gets list based on EMOD_buffer list in model_adapter.py

        # determine which step edit buttons link to
        step_list = [i[0] for i in named_baseline_forms]
        for scenario in scenario_list:
            if scenario._meta.object_name != 'Folder':
                try:
                    # check to see if it has a campaign file (besides the empty default)
                    if scenario.is_approved:
                        my_scenario = EMODBaseline.from_dw(pk=scenario['id'])
                        try:
                            scenario_campaign = json.dumps(ast.literal_eval(my_scenario.get_file_by_type('campaign').content),
                                                           sort_keys=True, indent=4, separators=(',', ': '))
                        except (AttributeError, ObjectDoesNotExist):
                            try:
                                # if file list was returned, use last file
                                scenario_campaign = json.dumps(ast.literal_eval(
                                    my_scenario.get_file_by_type('campaign')[my_scenario.get_file_by_type('campaign').count()
                                                                             - 1].content), sort_keys=True, indent=4,
                                                               separators=(',', ': '))
                            except ObjectDoesNotExist:
                                pass

                        if len(json.loads(scenario_campaign)['Events']) > 0:
                            scenario['has_interventions'] = 1

                    if scenario.template:
                        scenario.location_name = str(DimTemplate.objects.get(id=scenario.template.id).location_key)

                        # add model version to scenario
                        scenario.model_version = DimTemplate.objects.get(id=scenario.template.id)\
                            .model_version.replace('emod ',  '')
                except:
                    pass
        return context
Example #3
0
    def get_context_data(self, **kwargs):
        """Extension of get_context_data

        Add context data to drive menu nav highlights and breadcrumbs.
        """
        context = super(ScenarioDetailView, self).get_context_data(**kwargs)
        context['nav_button'] = "browse_scenario"

        self.request.session['emod_nav_button'] = "browse_scenario"

        # This is here so that Alex can run this later and change all production database entries
        # all_runs = DimRun.objects.all()
        # for run in all_runs:
        #     if run.start_date_key and run.start_date_key.timestamp:
        #         run.new_start_date_key = run.start_date_key.timestamp
        #     if run.end_date_key and run.end_date_key.timestamp:
        #         run.new_end_date_key = run.end_date_key.timestamp
        #     print run.new_start_date_key
        #     print run.new_end_date_key
        #     run.save()

        scenario_id = kwargs['scenario_id']

        scenario = EMODBaseline.from_dw(pk=scenario_id)
        # Hack until DimBaseline/EMODBaseline issues are sorted out
        dim_scenario = DimBaseline.objects.get(id=scenario_id)

        # Hack for calibration
        species_info = {}
        the_config = ast.literal_eval(scenario.get_config_file().content)
        the_species = the_config['parameters']['Vector_Species_Params']
        for specie in the_species:
            species_info[specie] = {}
            if 'EIR' in the_species[specie]:
                eir = the_species[specie]['EIR']
            else:
                eir = 20.0 / float(len(the_species))
            if 'Sporozoite_Rate' in the_species[specie]:
                sporozoite = the_species[specie]['Sporozoite_Rate']
            else:
                sporozoite = 0.003
            species_info[specie]['eir'] = eir
            species_info[specie]['sporozoite'] = sporozoite
        context['species_info'] = species_info
        print species_info
        # data_to_send = {}
        # data_to_send['eir'] = []
        # data_to_send['sporozoite'] = []
        # the_config = ast.literal_eval(scenario.get_config_file().content)
        # the_species = the_config['parameters']['Vector_Species_Params']
        # for i in range(len(the_species)):
        #     data_to_send['eir'].append(20)
        #     data_to_send['sporozoite'].append(0.003)
        # context['data_to_send'] = data_to_send
        if dim_scenario.metadata and 'calibration_status' in dim_scenario.metadata:
            scenario.calibration_status = json.loads(dim_scenario.metadata)['calibration_status']
        else:
            scenario.calibration_status = "Ready"
        if dim_scenario.metadata:
            current_metadata = json.loads(dim_scenario.metadata)
        else:
            current_metadata = {}
        if 'calibration_verification_run_id' in current_metadata:
            calibration_verification_run = DimRun.objects.get(id=current_metadata['calibration_verification_run_id'])

            if calibration_verification_run.status == '1/1/0':
                vector_species_parameters = the_config['parameters']['Vector_Species_Params']
                calibration_verification_info = {}
                for species in vector_species_parameters:
                    calibration_verification_info[species] = {}
                    calibration_verification_info[species]['sporozoite_rate'] = {}
                    calibration_verification_info[species]['eir'] = {}
                    calibration_verification_info[species]['biting_rate'] = {}

                    target_sporozoite_rate = vector_species_parameters[species]['Sporozoite_Rate']
                    daily_sporozoite_rate_2_3 = get_average_daily_sporozoite_rate(calibration_verification_run, species, 2, 3)
                    daily_sporozoite_rate_4_9 = get_average_daily_sporozoite_rate(calibration_verification_run, species, 4, 9)
                    daily_sporozoite_rate_10_20 = get_average_daily_sporozoite_rate(calibration_verification_run, species, 10, 20)

                    calibration_verification_info[species]['sporozoite_rate']['target'] = target_sporozoite_rate
                    calibration_verification_info[species]['sporozoite_rate']['years_2_3'] = daily_sporozoite_rate_2_3
                    calibration_verification_info[species]['sporozoite_rate']['years_4_9'] = daily_sporozoite_rate_4_9
                    calibration_verification_info[species]['sporozoite_rate']['years_10_20'] = daily_sporozoite_rate_10_20

                    target_average_annual_eir = vector_species_parameters[species]['EIR']
                    annual_eir_2_3 = get_average_daily_eir(calibration_verification_run, species, 2, 3) * 365
                    annual_eir_4_9 = get_average_daily_eir(calibration_verification_run, species, 4, 9) * 365
                    annual_eir_10_20 = get_average_daily_eir(calibration_verification_run, species, 10, 20) * 365

                    calibration_verification_info[species]['eir']['target'] = target_average_annual_eir
                    calibration_verification_info[species]['eir']['years_2_3'] = annual_eir_2_3
                    calibration_verification_info[species]['eir']['years_4_9'] = annual_eir_4_9
                    calibration_verification_info[species]['eir']['years_10_20'] = annual_eir_10_20

                    target_average_daily_biting_rate = 'NA'
                    daily_biting_rate_2_3 = get_average_daily_biting_rate(calibration_verification_run, species, 2, 3)
                    daily_biting_rate_4_9 = get_average_daily_biting_rate(calibration_verification_run, species, 4, 9)
                    daily_biting_rate_10_20 = get_average_daily_biting_rate(calibration_verification_run, species, 10, 20)

                    calibration_verification_info[species]['biting_rate']['target'] = target_average_daily_biting_rate
                    calibration_verification_info[species]['biting_rate']['years_2_3'] = daily_biting_rate_2_3
                    calibration_verification_info[species]['biting_rate']['years_4_9'] = daily_biting_rate_4_9
                    calibration_verification_info[species]['biting_rate']['years_10_20'] = daily_biting_rate_10_20

                context['calibration_verification_info'] = calibration_verification_info

        context['scenario_id'] = kwargs['scenario_id']

        context['scenario_userid'] = scenario.user.id
        context['dim_user'] = DimUser.objects.get_or_create(username=self.request.user.username)[0]

        scenario.last_edited = scenario._last_edited
        scenario.is_public = scenario._is_public

        # Hack until DimBaseline/EMODBaseline issues are sorted out
        if dim_scenario.metadata:
            metadata = json.loads(dim_scenario.metadata)

            if 'representative' in metadata:
                scenario.is_representative = True
                if 'is_complete' in metadata['representative']:
                    scenario.representative_is_completed = True
                else:
                    scenario.representative_is_completed = False
                scenario.name = derive_autoname(dim_scenario)
            else:
                scenario.is_representative = False

        context['scenario'] = scenario

        file_list = []
        for my_file in scenario.files:
            if my_file['type'] == 'config':
                try:
                    context['config'] = json.dumps(ast.literal_eval(scenario.get_file_by_type('config').content),
                                                   sort_keys=True, indent=4, separators=(',', ': '))
                except AttributeError:
                    # if file list was returned, use last file
                    context['config'] = json.dumps(ast.literal_eval(
                        scenario.get_file_by_type('config')[scenario.get_file_by_type('config').count()
                                                               - 1].content), sort_keys=True, indent=4,
                                                   separators=(',', ': '))
            elif my_file['type'] == 'campaign':
                try:
                    scenario_campaign = json.dumps(ast.literal_eval(scenario.get_file_by_type('campaign').content),
                                                   sort_keys=True, indent=4, separators=(',', ': '))
                    if len(json.loads(scenario_campaign)['Events']) > 0:
                        context['campaign'] = scenario_campaign
                    else:
                        context['has_campaign'] = None
                except AttributeError:
                    # if file list was returned, use last file
                    context['campaign'] = json.dumps(ast.literal_eval(
                        scenario.get_file_by_type('campaign')[scenario.get_file_by_type('campaign').count()
                                                                 - 1].content), sort_keys=True, indent=4,
                                                     separators=(',', ': '))
            else:
                file_list.append(my_file['name'])

        context['file_list'] = file_list

        # Get a list of the runs for this scenario
        adapter = EMOD_Adapter(self.request.user.username)
        run_list = DimRun.objects.filter(baseline_key=scenario.id)
        dim_scenario = DimBaseline.objects.get(id=scenario.id)

        if dim_scenario.simulation_group:
            simulation_group = dim_scenario.simulation_group
            simulation_list = Simulation.objects.filter(group=simulation_group)

            for simulation in simulation_list:
                if simulation.status == sim_status.SCRIPT_DONE:
                    simulation.is_complete = True
                elif simulation.status == sim_status.SCRIPT_ERROR:
                    simulation.has_failed = True

            context['simulation_list'] = simulation_list

        # sort descending by id (for those old runs that all have the same old time_created
        context['run_list'] = sorted(run_list, key=lambda x: x.id, reverse=True)
        # sort descending by time_saved
        context['run_list'] = sorted(context['run_list'], key=lambda x: x.time_created, reverse=True)

        note_list = []
        for run in context['run_list']:
            try:
                run_diffs = []

                # config diffs
                run_config = run.jcd.jcdict['config.json']['Changes'][0]['config.json/parameters']
                scenario_config = json.loads(context['config'])['parameters']

                for key in scenario_config:
                    if scenario_config[key] != run_config[key]:
                        run_diffs.append({'key': key, 'run': run_config[key], 'scenario': scenario_config[key]})
                # ToDo: split out each key difference of Vector Species Parameters in both

                # campaign diffs
                if 'campaign.json' not in run.jcd.jcdict:
                    run_diffs.append({'key': 'Interventions', 'run': 'None'})
                else:
                    run_campaign = run.jcd.jcdict['campaign.json']['Changes'][0]['campaign.json/Events']
                    if json.loads(scenario_campaign)['Events'] != run_campaign:
                        run_diffs.append({'key': 'Interventions', 'run': run_campaign,
                                          'scenario': str(json.loads(scenario_campaign)['Events'])})
                    # ToDo: split out each key difference of each Intervention in both
                    # else:
                        # run_diffs.append({'key': 'Interventions', 'run': 'See below',
                        #                 'scenario': '<a class="btn tooltip_link" href="#campaign">see below</a>'})
                run.diffs = run_diffs
            except (AttributeError, KeyError):
                # no JCD?
                run.diffs = [{'Unknown Error Occurred:': 'no changes found.'}]

            # get the status of each run
            status = adapter.run_status(run.id)
            if status is None:
                run.my_completed = None
            else:
                run.my_completed = status[0]
                run.my_total = status[1]
                run.my_failed = status[2]
                run.percent_complete = (run.my_completed + run.my_failed) / run.my_total
                run.my_incomplete = int(run.my_total) - (int(run.my_completed) + int(run.my_failed))
                if int(status[0]) > 0:
                    context['has_results'] = 1

            note_list.extend(adapter.fetch_notes(run_id=int(run.id), as_object=True))

        if note_list != []:
            context['note_list'] = note_list

        return context