コード例 #1
0
def helper_set_current_effect(ma_unit, txt_boxes, current_effect, group_str, data_type, mult=None):
    '''Fills in text boxes on calculator forms with data from ma unit.
    I noticed all 3 set_current_effect functions in the 3 calculators are
    nearly identical so it makes sense to share the similiar parts'''
    
    if mult is None:
        raise ValueError("mult must be specified")
    
    if data_type == "binary":
        conv_to_disp_scale = lambda x: meta_py_r.binary_convert_scale(x, current_effect, convert_to="display.scale")
    elif data_type == "continuous":
        conv_to_disp_scale = lambda x: meta_py_r.continuous_convert_scale(x, current_effect, convert_to="display.scale")
    elif data_type == "diagnostic":
        conv_to_disp_scale = lambda x: meta_py_r.diagnostic_convert_scale(x, current_effect, convert_to="display.scale")
    else:
        raise Exception("data_type unrecognized")
    effect_tbox, lower_tbox, upper_tbox = [txt_boxes[box_name] for box_name in ("effect","lower","upper")]
    
    (est,lower,upper) = ma_unit.get_effect_and_ci(current_effect, group_str, mult)
    (d_est,d_lower,d_upper) = [conv_to_disp_scale(x) for x in (est,lower,upper)]
    for val, txt_box in zip((d_est,d_lower,d_upper),
                          [effect_tbox, lower_tbox, upper_tbox]):
        txt_box.blockSignals(True)
        if val is not None:
            txt_box.setText(QString("%s" % round(val, CALC_NUM_DIGITS)))
        else:
            txt_box.setText(QString(""))
        txt_box.blockSignals(False)
コード例 #2
0
 def f(study_a, study_b):
     ma_unit_A = study_a.get_ma_unit(outcome_name,follow_up)
     ma_unit_B = study_b.get_ma_unit(outcome_name,follow_up)
     
     if outcome_type is BINARY:
         to_display_scale = lambda x: meta_py_r.binary_convert_scale(x, current_effect, convert_to="display.scale")
     elif outcome_type is CONTINUOUS:
         to_display_scale = lambda x: meta_py_r.continuous_convert_scale(x, current_effect, convert_to="display.scale")
     elif outcome_type is DIAGNOSTIC:
         to_display_scale = lambda x: meta_py_r.diagnostic_convert_scale(x, current_effect, convert_to="display.scale")
     
     if outcome_type in (BINARY,CONTINUOUS):
         outcome_data_A = ma_unit_A.get_effect_and_ci(current_effect, group_str, mult)
         outcome_data_B = ma_unit_B.get_effect_and_ci(current_effect, group_str, mult)                    
         outcome_data_A = [to_display_scale(c_val) for c_val in outcome_data_A]
         outcome_data_B = [to_display_scale(c_val) for c_val in outcome_data_B]
     elif outcome_type == DIAGNOSTIC:
         #                                  /\/\/\/\
         (outcome_data_A, outcome_data_B) = ([],[])
         #                                     |
         #                                  \_____/
         for diag_metric in ["Sens","Spec"]: # this order corresponds to the order displayed on the spreadsheet
             est_and_ci_A = ma_unit_A.get_effect_and_ci(diag_metric, group_str, mult)
             est_and_ci_B = ma_unit_B.get_effect_and_ci(diag_metric, group_str, mult)
             est_and_ci_A = [to_display_scale(c_val) for c_val in est_and_ci_A]
             est_and_ci_B = [to_display_scale(c_val) for c_val in est_and_ci_B]
             
             outcome_data_A.extend(est_and_ci_A)
             outcome_data_B.extend(est_and_ci_B)
     study_a_val = outcome_data_A[data_index]
     study_b_val = outcome_data_B[data_index]
     
     return self._meta_cmp_wrapper(study_a, study_b, study_a_val, study_b_val, reverse)
コード例 #3
0
    def val_changed(self, val_str):
        # Backup form state
        old_ma_unit, old_table = self._save_ma_unit_and_table_state(
            table=self.raw_data_table,
            ma_unit=self.ma_unit,
            use_old_value=False)

        new_text = self._get_txt_from_val_str(val_str)

        no_errors, display_scale_val = self._text_box_value_is_between_bounds(
            val_str, new_text)
        if no_errors is False:  # There are errors
            self.restore_ma_unit_and_table(old_ma_unit, old_table)
            calc_fncs.block_signals(self.entry_widgets, True)
            if val_str == "est":
                self.effect_txt_box.setFocus()
            elif val_str == "lower":
                self.low_txt_box.setFocus()
            elif val_str == "upper":
                self.high_txt_box.setFocus()
            calc_fncs.block_signals(self.entry_widgets, False)
            return

        # If we got to this point it means everything is ok so far
        try:
            if display_scale_val not in EMPTY_VALS:
                display_scale_val = float(display_scale_val)
            else:
                display_scale_val = None
        except ValueError:
            # a number wasn't entered; ignore
            # should probably clear out the box here, too.
            print "fail."
            return None

        calc_scale_val = meta_py_r.binary_convert_scale(
            display_scale_val, self.cur_effect, convert_to="calc.scale")

        if val_str == "est":
            self.ma_unit.set_effect(self.cur_effect, self.group_str,
                                    calc_scale_val)
        elif val_str == "lower":
            self.ma_unit.set_lower(self.cur_effect, self.group_str,
                                   calc_scale_val)
        elif val_str == "upper":
            self.ma_unit.set_upper(self.cur_effect, self.group_str,
                                   calc_scale_val)

        new_ma_unit, new_table = self._save_ma_unit_and_table_state(
            table=self.raw_data_table,
            ma_unit=self.ma_unit,
            use_old_value=False)
        restore_old_f = lambda: self.restore_ma_unit_and_table(
            old_ma_unit, old_table)
        restore_new_f = lambda: self.restore_ma_unit_and_table(
            new_ma_unit, new_table)
        command = calc_fncs.CommandFieldChanged(restore_new_f=restore_new_f,
                                                restore_old_f=restore_old_f,
                                                parent=self)
        self.undoStack.push(command)
コード例 #4
0
        def build_back_calc_args_dict():

            d = {}
            d["metric"] = str(self.cur_effect)

            est, lower, upper = self.ma_unit.get_effect_and_ci(
                self.cur_effect, self.group_str, self.mult)
            conv_to_disp_scale = lambda x: meta_py_r.binary_convert_scale(
                x, self.cur_effect, convert_to="display.scale")
            d_est, d_lower, d_upper = [
                conv_to_disp_scale(x) for x in [est, lower, upper]
            ]
            for i, R_key in enumerate(["estimate", "lower", "upper"]):
                try:
                    d["%s" % R_key] = float([d_est, d_lower, d_upper][i])
                except:
                    d["%s" % R_key] = None

            d["conf.level"] = self.global_conf_level

            d["Ev_A"] = float(self._get_int(
                0, 0)) if not self._is_empty(0, 0) else None
            d["N_A"] = float(self._get_int(
                0, 2)) if not self._is_empty(0, 2) else None
            d["Ev_B"] = float(self._get_int(
                1, 0)) if not self._is_empty(1, 0) else None
            d["N_B"] = float(self._get_int(
                1, 2)) if not self._is_empty(1, 2) else None

            return d
コード例 #5
0
            def f(study_a, study_b):
                ma_unit_A = study_a.get_ma_unit(outcome_name, follow_up)
                ma_unit_B = study_b.get_ma_unit(outcome_name, follow_up)

                if outcome_type is BINARY:
                    to_display_scale = lambda x: meta_py_r.binary_convert_scale(
                        x, current_effect, convert_to="display.scale")
                elif outcome_type is CONTINUOUS:
                    to_display_scale = lambda x: meta_py_r.continuous_convert_scale(
                        x, current_effect, convert_to="display.scale")
                elif outcome_type is DIAGNOSTIC:
                    to_display_scale = lambda x: meta_py_r.diagnostic_convert_scale(
                        x, current_effect, convert_to="display.scale")

                if outcome_type in (BINARY, CONTINUOUS):
                    outcome_data_A = ma_unit_A.get_effect_and_ci(
                        current_effect, group_str, mult)
                    outcome_data_B = ma_unit_B.get_effect_and_ci(
                        current_effect, group_str, mult)
                    outcome_data_A = [
                        to_display_scale(c_val) for c_val in outcome_data_A
                    ]
                    outcome_data_B = [
                        to_display_scale(c_val) for c_val in outcome_data_B
                    ]
                elif outcome_type == DIAGNOSTIC:
                    #                                  /\/\/\/\
                    (outcome_data_A, outcome_data_B) = ([], [])
                    #                                     |
                    #                                  \_____/
                    for diag_metric in [
                            "Sens", "Spec"
                    ]:  # this order corresponds to the order displayed on the spreadsheet
                        est_and_ci_A = ma_unit_A.get_effect_and_ci(
                            diag_metric, group_str, mult)
                        est_and_ci_B = ma_unit_B.get_effect_and_ci(
                            diag_metric, group_str, mult)
                        est_and_ci_A = [
                            to_display_scale(c_val) for c_val in est_and_ci_A
                        ]
                        est_and_ci_B = [
                            to_display_scale(c_val) for c_val in est_and_ci_B
                        ]

                        outcome_data_A.extend(est_and_ci_A)
                        outcome_data_B.extend(est_and_ci_B)
                study_a_val = outcome_data_A[data_index]
                study_b_val = outcome_data_B[data_index]

                return self._meta_cmp_wrapper(study_a, study_b, study_a_val,
                                              study_b_val, reverse)
コード例 #6
0
 def val_changed(self, val_str):
     # Backup form state
     old_ma_unit, old_table = self._save_ma_unit_and_table_state(
                             table = self.raw_data_table,
                             ma_unit = self.ma_unit, 
                             use_old_value=False)
     
     new_text = self._get_txt_from_val_str(val_str)
     
     no_errors, display_scale_val = self._text_box_value_is_between_bounds(val_str, new_text)
     if no_errors is False: # There are errors
         self.restore_ma_unit_and_table(old_ma_unit,old_table)
         calc_fncs.block_signals(self.entry_widgets, True)
         if val_str == "est":
             self.effect_txt_box.setFocus()
         elif val_str == "lower":
             self.low_txt_box.setFocus()
         elif val_str == "upper":
             self.high_txt_box.setFocus()
         calc_fncs.block_signals(self.entry_widgets, False)
         return
     
     # If we got to this point it means everything is ok so far
     try:
         if display_scale_val not in EMPTY_VALS:
             display_scale_val = float(display_scale_val)
         else:
             display_scale_val = None
     except ValueError:
         # a number wasn't entered; ignore
         # should probably clear out the box here, too.
         print "fail."
         return None
         
     calc_scale_val = meta_py_r.binary_convert_scale(display_scale_val,
                                     self.cur_effect, convert_to="calc.scale")
                   
     if val_str == "est":
         self.ma_unit.set_effect(self.cur_effect, self.group_str, calc_scale_val)
     elif val_str == "lower":
         self.ma_unit.set_lower(self.cur_effect, self.group_str, calc_scale_val)
     elif val_str == "upper":
         self.ma_unit.set_upper(self.cur_effect, self.group_str, calc_scale_val)
     
     new_ma_unit, new_table = self._save_ma_unit_and_table_state(
             table = self.raw_data_table, ma_unit = self.ma_unit,
             use_old_value=False)
     restore_old_f = lambda: self.restore_ma_unit_and_table(old_ma_unit, old_table)
     restore_new_f = lambda: self.restore_ma_unit_and_table(new_ma_unit, new_table)
     command = calc_fncs.CommandFieldChanged(restore_new_f=restore_new_f, restore_old_f=restore_old_f, parent=self)
     self.undoStack.push(command)
コード例 #7
0
 def reset_conf_level(self):
     print("Re-scaling est, low, high to standard confidence level")
     
     old_effect_and_ci = self.ma_unit.get_effect_and_ci(self.cur_effect, self.group_str)
     
     argument_d = {"est"  : old_effect_and_ci[0],
                   "low"  : old_effect_and_ci[1],
                   "high" : old_effect_and_ci[2],
                   "orig.conf.level": self.CI_spinbox.value(),
                   "target.conf.level": meta_py_r.get_global_conf_level()}
     
     res = meta_py_r.rescale_effect_and_ci_conf_level(argument_d)
     if "FAIL" in res:
         print("Could not reset confidence level")
         return
     
     res["display_est"] = meta_py_r.binary_convert_scale(res["est"], self.cur_effect, convert_to="display.scale")
     res["display_low"] = meta_py_r.binary_convert_scale(res["low"], self.cur_effect, convert_to="display.scale")
     res["display_high"] = meta_py_r.binary_convert_scale(res["high"], self.cur_effect, convert_to="display.scale")
     
     # Save results in ma_unit
     self.ma_unit.set_effect_and_ci(self.cur_effect, self.group_str, res["est"], res["low"], res["high"])
     self.ma_unit.set_display_effect_and_ci(self.cur_effect, self.group_str, res["display_est"], res["display_low"], res["display_high"])
コード例 #8
0
def helper_set_current_effect(ma_unit,
                              txt_boxes,
                              current_effect,
                              group_str,
                              data_type,
                              mult=None):
    '''Fills in text boxes on calculator forms with data from ma unit.
    I noticed all 3 set_current_effect functions in the 3 calculators are
    nearly identical so it makes sense to share the similiar parts'''

    if mult is None:
        raise ValueError("mult must be specified")

    if data_type == "binary":
        conv_to_disp_scale = lambda x: meta_py_r.binary_convert_scale(
            x, current_effect, convert_to="display.scale")
    elif data_type == "continuous":
        conv_to_disp_scale = lambda x: meta_py_r.continuous_convert_scale(
            x, current_effect, convert_to="display.scale")
    elif data_type == "diagnostic":
        conv_to_disp_scale = lambda x: meta_py_r.diagnostic_convert_scale(
            x, current_effect, convert_to="display.scale")
    else:
        raise Exception("data_type unrecognized")
    effect_tbox, lower_tbox, upper_tbox = [
        txt_boxes[box_name] for box_name in ("effect", "lower", "upper")
    ]

    (est, lower, upper) = ma_unit.get_effect_and_ci(current_effect, group_str,
                                                    mult)
    (d_est, d_lower,
     d_upper) = [conv_to_disp_scale(x) for x in (est, lower, upper)]
    for val, txt_box in zip((d_est, d_lower, d_upper),
                            [effect_tbox, lower_tbox, upper_tbox]):
        txt_box.blockSignals(True)
        if val is not None:
            txt_box.setText(QString("%s" % round(val, CALC_NUM_DIGITS)))
        else:
            txt_box.setText(QString(""))
        txt_box.blockSignals(False)
コード例 #9
0
        def build_back_calc_args_dict():

            d = {}
            d["metric"] = str(self.cur_effect)

            est,lower,upper = self.ma_unit.get_effect_and_ci(self.cur_effect, self.group_str, self.mult)
            conv_to_disp_scale = lambda x: meta_py_r.binary_convert_scale(x, self.cur_effect, convert_to="display.scale")
            d_est,d_lower,d_upper = [conv_to_disp_scale(x) for x in [est,lower,upper]]
            for i,R_key in enumerate(["estimate", "lower", "upper"]):
                try:
                    d["%s" % R_key] = float([d_est,d_lower,d_upper][i])
                except:
                    d["%s" % R_key] = None

            d["conf.level"] = self.global_conf_level

            d["Ev_A"] = float(self._get_int(0, 0)) if not self._is_empty(0, 0) else None
            d["N_A"]  = float(self._get_int(0, 2)) if not self._is_empty(0, 2) else None
            d["Ev_B"] = float(self._get_int(1, 0)) if not self._is_empty(1, 0) else None
            d["N_B"]  = float(self._get_int(1, 2)) if not self._is_empty(1, 2) else None

            return d
コード例 #10
0
    def val_changed(self, val_str):        
        print "--------------\nEntering val_changed...."
        
        def is_between_bounds(est=self.form_effects_dict[self.cur_effect]["est"],
                              low=self.form_effects_dict[self.cur_effect]["lower"],
                              high=self.form_effects_dict[self.cur_effect]["upper"]):
            return meta_globals.between_bounds(est=est, low=low, high=high)

        ###### ERROR CHECKING CODE#####
        # Make sure entered value is numeric and between the appropriate bounds
        self.block_all_signals(True)
        float_msg = "Must be numeric!"

        try:
            if val_str == "est" and not _is_empty(self.candidate_est):
                # Check type
                if not _is_a_float(self.candidate_est) :
                    QMessageBox.warning(self, "whoops", float_msg)
                    raise Exception("error")
                (good_result, msg) = is_between_bounds(est=self.candidate_est)
                if not good_result:
                    QMessageBox.warning(self, "whoops", msg)
                    raise Exception("error")
                display_scale_val = float(self.candidate_est)
            elif val_str == "lower" and not _is_empty(self.candidate_lower):
                if not _is_a_float(self.candidate_lower) :
                    QMessageBox.warning(self, "whoops", float_msg)
                    raise Exception("error")
                (good_result, msg) = is_between_bounds(low=self.candidate_lower)
                if not good_result:
                    QMessageBox.warning(self, "whoops", msg)
                    raise Exception("error")
                display_scale_val = float(self.candidate_lower)
            elif val_str == "upper" and not _is_empty(self.candidate_upper): 
                if not _is_a_float(self.candidate_upper) :
                    QMessageBox.warning(self, "whoops", float_msg)
                    raise Exception("error")
                (good_result, msg) = is_between_bounds(high=self.candidate_upper)
                if not good_result:
                    QMessageBox.warning(self, "whoops", msg)
                    raise Exception("error")
                display_scale_val = float(self.candidate_upper)
        except:
            print "Error flag is true"
            self.restore_form_state()
            self.block_all_signals(True)
            if val_str == "est":
                self.effect_txt_box.setFocus()
            elif val_str == "lower":
                self.low_txt_box.setFocus()
            elif val_str == "upper":
                self.high_txt_box.setFocus()
            self.block_all_signals(False)
            return
        
        self.block_all_signals(False)
        # If we got to this point it means everything is ok so far
        
        try:
            display_scale_val = float(display_scale_val)
        except:
            # a number wasn't entered; ignore
            # should probably clear out the box here, too.
            print "fail."
            return None
            
        calc_scale_val = meta_py_r.binary_convert_scale(display_scale_val, \
                                        self.cur_effect, convert_to="calc.scale")
                      
        if val_str == "est":
            self.ma_unit.set_effect(self.cur_effect, self.group_str, calc_scale_val)
            self.ma_unit.set_display_effect(self.cur_effect, self.group_str, display_scale_val)
        elif val_str == "lower":
            self.ma_unit.set_lower(self.cur_effect, self.group_str, calc_scale_val)
            self.ma_unit.set_display_lower(self.cur_effect, self.group_str, display_scale_val)
        else:
            self.ma_unit.set_upper(self.cur_effect, self.group_str, calc_scale_val)
            self.ma_unit.set_display_upper(self.cur_effect, self.group_str, display_scale_val)
        
        self.enable_txt_box_input()
        self.save_form_state()
        self.enable_back_calculation_btn()