def choose_obs_subj_behav_category(pj: dict, selected_observations: list, maxTime=0, flagShowIncludeModifiers: bool = True, flagShowExcludeBehaviorsWoEvents: bool = True, by_category: bool = False, show_time: bool = False, timeFormat: str = HHMMSS): """ show window for: - selection of subjects - selection of behaviors (based on selected subjects) - selection of time interval - inclusion/exclusion of modifiers - inclusion/exclusion of behaviors without events (flagShowExcludeBehaviorsWoEvents == True) Returns: dict: {"selected subjects": selectedSubjects, "selected behaviors": selectedBehaviors, "include modifiers": True/False, "exclude behaviors": True/False, "time": TIME_FULL_OBS / TIME_EVENTS / TIME_ARBITRARY_INTERVAL "start time": startTime, "end time": endTime } """ paramPanelWindow = param_panel.Param_panel() paramPanelWindow.resize(600, 500) paramPanelWindow.setWindowTitle("Select subjects and behaviors") paramPanelWindow.selectedObservations = selected_observations paramPanelWindow.pj = pj if not flagShowIncludeModifiers: paramPanelWindow.cbIncludeModifiers.setVisible(False) if not flagShowExcludeBehaviorsWoEvents: paramPanelWindow.cbExcludeBehaviors.setVisible(False) if by_category: paramPanelWindow.cbIncludeModifiers.setVisible(False) paramPanelWindow.cbExcludeBehaviors.setVisible(False) paramPanelWindow.frm_time_interval.setEnabled(False) if timeFormat == HHMMSS: paramPanelWindow.teStartTime.setTime(QTime.fromString("00:00:00.000", "hh:mm:ss.zzz")) paramPanelWindow.teEndTime.setTime(QTime.fromString(utilities.seconds2time(maxTime), "hh:mm:ss.zzz")) paramPanelWindow.dsbStartTime.setVisible(False) paramPanelWindow.dsbEndTime.setVisible(False) if timeFormat == S: paramPanelWindow.dsbStartTime.setValue(0.0) paramPanelWindow.dsbEndTime.setValue(maxTime) paramPanelWindow.teStartTime.setVisible(False) paramPanelWindow.teEndTime.setVisible(False) # hide max time if not maxTime: paramPanelWindow.frm_time.setVisible(False) if selected_observations: observedSubjects = project_functions.extract_observed_subjects(pj, selected_observations) else: # load all subjects and "No focal subject" observedSubjects = [pj[SUBJECTS][x][SUBJECT_NAME] for x in pj[SUBJECTS]] + [""] selectedSubjects = [] # add 'No focal subject' if "" in observedSubjects: selectedSubjects.append(NO_FOCAL_SUBJECT) paramPanelWindow.item = QListWidgetItem(paramPanelWindow.lwSubjects) paramPanelWindow.ch = QCheckBox() paramPanelWindow.ch.setText(NO_FOCAL_SUBJECT) paramPanelWindow.ch.stateChanged.connect(paramPanelWindow.cb_changed) paramPanelWindow.ch.setChecked(True) paramPanelWindow.lwSubjects.setItemWidget(paramPanelWindow.item, paramPanelWindow.ch) all_subjects = [pj[SUBJECTS][x][SUBJECT_NAME] for x in utilities.sorted_keys(pj[SUBJECTS])] for subject in all_subjects: paramPanelWindow.item = QListWidgetItem(paramPanelWindow.lwSubjects) paramPanelWindow.ch = QCheckBox() paramPanelWindow.ch.setText(subject) paramPanelWindow.ch.stateChanged.connect(paramPanelWindow.cb_changed) if subject in observedSubjects: selectedSubjects.append(subject) paramPanelWindow.ch.setChecked(True) paramPanelWindow.lwSubjects.setItemWidget(paramPanelWindow.item, paramPanelWindow.ch) logging.debug(f'selectedSubjects: {selectedSubjects}') if selected_observations: observedBehaviors = paramPanelWindow.extract_observed_behaviors(selected_observations, selectedSubjects) # not sorted else: # load all behaviors observedBehaviors = [pj[ETHOGRAM][x][BEHAVIOR_CODE] for x in pj[ETHOGRAM]] logging.debug(f'observed behaviors: {observedBehaviors}') if BEHAVIORAL_CATEGORIES in pj: categories = pj[BEHAVIORAL_CATEGORIES][:] # check if behavior not included in a category try: if "" in [pj[ETHOGRAM][idx][BEHAVIOR_CATEGORY] for idx in pj[ETHOGRAM] if BEHAVIOR_CATEGORY in pj[ETHOGRAM][idx]]: categories += [""] except Exception: categories = ["###no category###"] else: categories = ["###no category###"] for category in categories: if category != "###no category###": if category == "": paramPanelWindow.item = QListWidgetItem("No category") paramPanelWindow.item.setData(34, "No category") else: paramPanelWindow.item = QListWidgetItem(category) paramPanelWindow.item.setData(34, category) font = QFont() font.setBold(True) paramPanelWindow.item.setFont(font) paramPanelWindow.item.setData(33, "category") paramPanelWindow.item.setData(35, False) paramPanelWindow.lwBehaviors.addItem(paramPanelWindow.item) for behavior in [pj[ETHOGRAM][x][BEHAVIOR_CODE] for x in utilities.sorted_keys(pj[ETHOGRAM])]: if ((categories == ["###no category###"]) or (behavior in [pj[ETHOGRAM][x][BEHAVIOR_CODE] for x in pj[ETHOGRAM] if BEHAVIOR_CATEGORY in pj[ETHOGRAM][x] and pj[ETHOGRAM][x][BEHAVIOR_CATEGORY] == category])): paramPanelWindow.item = QListWidgetItem(behavior) if behavior in observedBehaviors: paramPanelWindow.item.setCheckState(Qt.Checked) else: paramPanelWindow.item.setCheckState(Qt.Unchecked) if category != "###no category###": paramPanelWindow.item.setData(33, "behavior") if category == "": paramPanelWindow.item.setData(34, "No category") else: paramPanelWindow.item.setData(34, category) paramPanelWindow.lwBehaviors.addItem(paramPanelWindow.item) if not paramPanelWindow.exec_(): return {SELECTED_SUBJECTS: [], SELECTED_BEHAVIORS: []} selectedSubjects = paramPanelWindow.selectedSubjects selectedBehaviors = paramPanelWindow.selectedBehaviors logging.debug(f"selected subjects: {selectedSubjects}") logging.debug(f"selected behaviors: {selectedBehaviors}") if timeFormat == HHMMSS: startTime = utilities.time2seconds(paramPanelWindow.teStartTime.time().toString(HHMMSSZZZ)) endTime = utilities.time2seconds(paramPanelWindow.teEndTime.time().toString(HHMMSSZZZ)) if timeFormat == S: startTime = Decimal(paramPanelWindow.dsbStartTime.value()) endTime = Decimal(paramPanelWindow.dsbEndTime.value()) if startTime > endTime: QMessageBox.warning(None, programName, "The start time is after the end time", QMessageBox.Ok | QMessageBox.Default, QMessageBox.NoButton) return {SELECTED_SUBJECTS: [], SELECTED_BEHAVIORS: []} if paramPanelWindow.rb_full.isChecked(): time_param = TIME_FULL_OBS if paramPanelWindow.rb_limit.isChecked(): time_param = TIME_EVENTS if paramPanelWindow.rb_interval.isChecked(): time_param = TIME_ARBITRARY_INTERVAL return {SELECTED_SUBJECTS: selectedSubjects, SELECTED_BEHAVIORS: selectedBehaviors, INCLUDE_MODIFIERS: paramPanelWindow.cbIncludeModifiers.isChecked(), EXCLUDE_BEHAVIORS: paramPanelWindow.cbExcludeBehaviors.isChecked(), "time": time_param, START_TIME: startTime, END_TIME: endTime }
def select_observations(pj: dict, mode: str, windows_title: str = "") -> tuple: """ allow user to select observations mode: accepted values: OPEN, EDIT, SINGLE, MULTIPLE, SELECT1 Args: pj (dict): BORIS project dictionary mode (str): mode foe selection: OPEN, EDIT, SINGLE, MULTIPLE, SELECT1 windows_title (str): title for windows Returns: str: selected mode: OPEN, EDIT, VIEW list: list of selected observations """ obsListFields = ["id", "date", "description", "subjects", "media"] indepVarHeader, column_type = [], [TEXT] * len(obsListFields) if INDEPENDENT_VARIABLES in pj: for idx in utilities.sorted_keys(pj[INDEPENDENT_VARIABLES]): indepVarHeader.append(pj[INDEPENDENT_VARIABLES][idx]["label"]) column_type.append(pj[INDEPENDENT_VARIABLES][idx]["type"]) data = [] for obs in sorted(list(pj[OBSERVATIONS].keys())): date = pj[OBSERVATIONS][obs]["date"].replace("T", " ") descr = utilities.eol2space(pj[OBSERVATIONS][obs][DESCRIPTION]) # subjects observedSubjects = [NO_FOCAL_SUBJECT if x == "" else x for x in project_functions.extract_observed_subjects(pj, [obs])] ''' removed 2020-01-13 if "" in observedSubjects: observedSubjects.remove("") ''' subjectsList = ", ".join(observedSubjects) mediaList = [] if pj[OBSERVATIONS][obs][TYPE] in [MEDIA]: if pj[OBSERVATIONS][obs][FILE]: for player in sorted(pj[OBSERVATIONS][obs][FILE].keys()): for media in pj[OBSERVATIONS][obs][FILE][player]: mediaList.append(f"#{player}: {media}") if len(mediaList) > 8: media = " ".join(mediaList) else: media = "\n".join(mediaList) elif pj[OBSERVATIONS][obs][TYPE] in [LIVE]: media = LIVE # independent variables indepvar = [] if INDEPENDENT_VARIABLES in pj[OBSERVATIONS][obs]: for var_label in indepVarHeader: if var_label in pj[OBSERVATIONS][obs][INDEPENDENT_VARIABLES]: indepvar.append(pj[OBSERVATIONS][obs][INDEPENDENT_VARIABLES][var_label]) else: indepvar.append("") data.append([obs, date, descr, subjectsList, media] + indepvar) obsList = observations_list.observationsList_widget(data, header=obsListFields + indepVarHeader, column_type=column_type) if windows_title: obsList.setWindowTitle(windows_title) obsList.pbOpen.setVisible(False) obsList.pbView.setVisible(False) obsList.pbEdit.setVisible(False) obsList.pbOk.setVisible(False) obsList.pbSelectAll.setVisible(False) obsList.pbUnSelectAll.setVisible(False) obsList.mode = mode if mode == OPEN: obsList.view.setSelectionMode(QAbstractItemView.SingleSelection) obsList.pbOpen.setVisible(True) if mode == VIEW: obsList.view.setSelectionMode(QAbstractItemView.SingleSelection) obsList.pbView.setVisible(True) if mode == EDIT: obsList.view.setSelectionMode(QAbstractItemView.SingleSelection) obsList.pbEdit.setVisible(True) if mode == SINGLE: obsList.view.setSelectionMode(QAbstractItemView.SingleSelection) obsList.pbOpen.setVisible(True) obsList.pbView.setVisible(True) obsList.pbEdit.setVisible(True) if mode == MULTIPLE: obsList.view.setSelectionMode(QAbstractItemView.MultiSelection) obsList.pbOk.setVisible(True) obsList.pbSelectAll.setVisible(True) obsList.pbUnSelectAll.setVisible(True) if mode == SELECT1: obsList.view.setSelectionMode(QAbstractItemView.SingleSelection) obsList.pbOk.setVisible(True) obsList.resize(900, 600) obsList.view.sortItems(0, Qt.AscendingOrder) for row in range(obsList.view.rowCount()): obsList.view.resizeRowToContents(row) selectedObs = [] result = obsList.exec_() if result: if obsList.view.selectedIndexes(): for idx in obsList.view.selectedIndexes(): if idx.column() == 0: # first column selectedObs.append(idx.data()) if result == 0: # cancel resultStr = "" if result == 1: # select resultStr = "ok" if result == 2: # open resultStr = OPEN if result == 3: # edit resultStr = EDIT if result == 4: # view resultStr = VIEW return resultStr, selectedObs
def select_observations(pj, mode): """ allow user to select observations mode: accepted values: OPEN, EDIT, SINGLE, MULTIPLE, SELECT1 Args: pj (dict): BORIS project dictionary mode (str): mode foe selection: OPEN, EDIT, SINGLE, MULTIPLE, SELECT1 """ obsListFields = ["id", "date", "description", "subjects", "media"] indepVarHeader, column_type = [], [TEXT] * len(obsListFields) if INDEPENDENT_VARIABLES in pj: for idx in sorted_keys(pj[INDEPENDENT_VARIABLES]): indepVarHeader.append(pj[INDEPENDENT_VARIABLES][idx]["label"]) column_type.append(pj[INDEPENDENT_VARIABLES][idx]["type"]) data = [] for obs in sorted(list(pj[OBSERVATIONS].keys())): date = pj[OBSERVATIONS][obs]["date"].replace("T", " ") descr = pj[OBSERVATIONS][obs]["description"] # subjects observedSubjects = project_functions.extract_observed_subjects(pj, [obs]) # remove when No focal subject if "" in observedSubjects: observedSubjects.remove("") subjectsList = ", ".join(observedSubjects) mediaList = [] if pj[OBSERVATIONS][obs][TYPE] in [MEDIA]: if pj[OBSERVATIONS][obs][FILE]: for player in sorted(pj[OBSERVATIONS][obs][FILE].keys()): for media in pj[OBSERVATIONS][obs][FILE][player]: mediaList.append("#{0}: {1}".format(player, media)) media = os.linesep.join(mediaList) elif pj[OBSERVATIONS][obs][TYPE] in [LIVE]: media = LIVE # independent variables indepvar = [] if INDEPENDENT_VARIABLES in pj[OBSERVATIONS][obs]: for var_label in indepVarHeader: if var_label in pj[OBSERVATIONS][obs][INDEPENDENT_VARIABLES]: indepvar.append(pj[OBSERVATIONS][obs][INDEPENDENT_VARIABLES][var_label]) else: indepvar.append("") data.append([obs, date, descr, subjectsList, media] + indepvar) obsList = observations_list.observationsList_widget(data, header=obsListFields + indepVarHeader, column_type=column_type) obsList.pbOpen.setVisible(False) obsList.pbView.setVisible(False) obsList.pbEdit.setVisible(False) obsList.pbOk.setVisible(False) obsList.pbSelectAll.setVisible(False) obsList.pbUnSelectAll.setVisible(False) obsList.mode = mode if mode == OPEN: obsList.view.setSelectionMode(QAbstractItemView.SingleSelection) obsList.pbOpen.setVisible(True) if mode == VIEW: obsList.view.setSelectionMode(QAbstractItemView.SingleSelection) obsList.pbView.setVisible(True) if mode == EDIT: obsList.view.setSelectionMode(QAbstractItemView.SingleSelection) obsList.pbEdit.setVisible(True) if mode == SINGLE: obsList.view.setSelectionMode(QAbstractItemView.SingleSelection) obsList.pbOpen.setVisible(True) obsList.pbView.setVisible(True) obsList.pbEdit.setVisible(True) if mode == MULTIPLE: obsList.view.setSelectionMode(QAbstractItemView.MultiSelection) obsList.pbOk.setVisible(True) obsList.pbSelectAll.setVisible(True) obsList.pbUnSelectAll.setVisible(True) if mode == SELECT1: obsList.view.setSelectionMode(QAbstractItemView.SingleSelection) obsList.pbOk.setVisible(True) obsList.resize(900, 600) obsList.view.sortItems(0, Qt.AscendingOrder) selectedObs = [] result = obsList.exec_() if result: if obsList.view.selectedIndexes(): for idx in obsList.view.selectedIndexes(): if idx.column() == 0: # first column selectedObs.append(idx.data()) if result == 0: # cancel resultStr = "" if result == 1: # select resultStr = "ok" if result == 2: # open resultStr = OPEN if result == 3: # edit resultStr = EDIT if result == 4: # view resultStr = VIEW return resultStr, selectedObs
def select_observations(pj: dict, mode: str) -> tuple: """ allow user to select observations mode: accepted values: OPEN, EDIT, SINGLE, MULTIPLE, SELECT1 Args: pj (dict): BORIS project dictionary mode (str): mode foe selection: OPEN, EDIT, SINGLE, MULTIPLE, SELECT1 Returns: str: selected mode: OPEN, EDIT, VIEW list: list of selected observations """ obsListFields = ["id", "date", "description", "subjects", "media"] indepVarHeader, column_type = [], [TEXT] * len(obsListFields) if INDEPENDENT_VARIABLES in pj: for idx in utilities.sorted_keys(pj[INDEPENDENT_VARIABLES]): indepVarHeader.append(pj[INDEPENDENT_VARIABLES][idx]["label"]) column_type.append(pj[INDEPENDENT_VARIABLES][idx]["type"]) data = [] for obs in sorted(list(pj[OBSERVATIONS].keys())): date = pj[OBSERVATIONS][obs]["date"].replace("T", " ") descr = utilities.eol2space(pj[OBSERVATIONS][obs]["description"]) # subjects observedSubjects = project_functions.extract_observed_subjects(pj, [obs]) # remove when No focal subject if "" in observedSubjects: observedSubjects.remove("") subjectsList = ", ".join(observedSubjects) mediaList = [] if pj[OBSERVATIONS][obs][TYPE] in [MEDIA]: if pj[OBSERVATIONS][obs][FILE]: for player in sorted(pj[OBSERVATIONS][obs][FILE].keys()): for media in pj[OBSERVATIONS][obs][FILE][player]: mediaList.append("#{0}: {1}".format(player, media)) if len(mediaList) > 8: media = " ".join(mediaList) else: media = "\n".join(mediaList) elif pj[OBSERVATIONS][obs][TYPE] in [LIVE]: media = LIVE # independent variables indepvar = [] if INDEPENDENT_VARIABLES in pj[OBSERVATIONS][obs]: for var_label in indepVarHeader: if var_label in pj[OBSERVATIONS][obs][INDEPENDENT_VARIABLES]: indepvar.append(pj[OBSERVATIONS][obs][INDEPENDENT_VARIABLES][var_label]) else: indepvar.append("") data.append([obs, date, descr, subjectsList, media] + indepvar) obsList = observations_list.observationsList_widget(data, header=obsListFields + indepVarHeader, column_type=column_type) obsList.pbOpen.setVisible(False) obsList.pbView.setVisible(False) obsList.pbEdit.setVisible(False) obsList.pbOk.setVisible(False) obsList.pbSelectAll.setVisible(False) obsList.pbUnSelectAll.setVisible(False) obsList.mode = mode if mode == OPEN: obsList.view.setSelectionMode(QAbstractItemView.SingleSelection) obsList.pbOpen.setVisible(True) if mode == VIEW: obsList.view.setSelectionMode(QAbstractItemView.SingleSelection) obsList.pbView.setVisible(True) if mode == EDIT: obsList.view.setSelectionMode(QAbstractItemView.SingleSelection) obsList.pbEdit.setVisible(True) if mode == SINGLE: obsList.view.setSelectionMode(QAbstractItemView.SingleSelection) obsList.pbOpen.setVisible(True) obsList.pbView.setVisible(True) obsList.pbEdit.setVisible(True) if mode == MULTIPLE: obsList.view.setSelectionMode(QAbstractItemView.MultiSelection) obsList.pbOk.setVisible(True) obsList.pbSelectAll.setVisible(True) obsList.pbUnSelectAll.setVisible(True) if mode == SELECT1: obsList.view.setSelectionMode(QAbstractItemView.SingleSelection) obsList.pbOk.setVisible(True) obsList.resize(900, 600) obsList.view.sortItems(0, Qt.AscendingOrder) for row in range(obsList.view.rowCount()): obsList.view.resizeRowToContents(row) selectedObs = [] result = obsList.exec_() if result: if obsList.view.selectedIndexes(): for idx in obsList.view.selectedIndexes(): if idx.column() == 0: # first column selectedObs.append(idx.data()) if result == 0: # cancel resultStr = "" if result == 1: # select resultStr = "ok" if result == 2: # open resultStr = OPEN if result == 3: # edit resultStr = EDIT if result == 4: # view resultStr = VIEW return resultStr, selectedObs