<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def _init_h2us(self, fnc_most_specific):
 """Given a set of user GO ids, return GO ids grouped under the "GO high" terms. Example of a grouped go list: gos = ['GO:0044464':[ # grp_term: D1 cell part 'GO:0005737', # child: D3 cytoplasm 'GO:0048471', # child: D4 perinuclear region of cytoplasm 'GO:0016020':[ # grp_term: D1 membrane 'GO:0098589', # child: D2 membrane region 'GO:0005886', # child: D2 plasma membrane ] """

        # Header GO IDs are main. User GO IDs are as specified by the user
        hdrgo2usrgos = cx.defaultdict(set)
        # Contains user GO IDs which are also header GO IDs, plus user main GO if needed
        hdrgo_is_usrgo = set()
        _go2nt = self.gosubdag.go2nt
        objhi = GrouperInit.GetGoidHigh(self.gosubdag, self.hdrobj.hdrgos,
                                        self.most_specific_fncs[fnc_most_specific])
        for goid_usr in self.usrgos:
            goid_main = _go2nt[goid_usr].id
            # Add current GO ID to parents_all in case curr GO ID is a high GO.
            goid_high = objhi.get_goid_high(goid_main)
            # Don't add user GO ID if it is also the GO header
            if goid_main != goid_high:
                hdrgo2usrgos[goid_high].add(goid_usr)
            elif goid_high not in hdrgo2usrgos:
                hdrgo2usrgos[goid_high] = set()
            if goid_main == goid_high:
                hdrgo_is_usrgo.add(goid_main)
                if goid_main != goid_usr:
                    hdrgo_is_usrgo.add(goid_usr)
        # Initialize data members
        self.hdrgo2usrgos = hdrgo2usrgos
        self.hdrgo_is_usrgo = hdrgo_is_usrgo