get beamline definition from all_elements,
            expand iteratively with the elements from all_elements
            e.g.
            element 'doub1' in
            chi   : line=(DBLL2 , doub1 , DP4FH , DP4SH , DBLL5 , DBD   ,
                          B11   , DB11  , B12   , DB12  , PF2   , DB13  ,
                          B13   , DB14  , B14   , DBD   , DBLL5 , doub2 ,
                          DP5FH , DP5SH , DBLL2 , PSTN1)
            should be expaned with 'doub1' configuration:
            doub1 : line=(DQD3, Q05, DQD2, Q06, DQD3)

            since:
            getBeamline('doub1') = [u'dqd3', u'q05', u'dqd2', u'q06', u'dqd3'] = A
            getBeamline('doub2') = [u'dqd3', u'q05', u'dqd2', u'q06', u'dqd3'] = B
            getBeamline('chi') = [u'dbll2', u'doub1', u'dp4fh', u'dp4sh', u'dbll5', u'dbd', u'b11', u'db11', u'b12',
                                  u'db12', u'pf2', u'db13', u'b13', u'db14', u'b14', u'dbd', u'dbll5', u'doub2',
                                  u'dp5fh', u'dp5sh', u'dbll2', u'pstn1']

            thus: getFullBeamline('chi') should return:
            [u'dbll2', A, u'dp4fh', u'dp4sh', u'dbll5', u'dbd', u'b11', u'db11', u'b12', u'db12', u'pf2', u'db13',
             u'b13', u'db14', u'b14', u'dbd', u'dbll5', B, u'dp5fh', u'dp5sh', u'dbll2', u'pstn1']

            :param extend: if extend mode should be envoked, by default False
            if extend = True, element like '2*D01' would be expended to be D01, D01

def getFullBeamline(self, beamlineKw, extend=False):
        """ get beamline definition from all_elements,
            expand iteratively with the elements from all_elements
            e.g.
            element 'doub1' in
            chi   : line=(DBLL2 , doub1 , DP4FH , DP4SH , DBLL5 , DBD   ,
                          B11   , DB11  , B12   , DB12  , PF2   , DB13  ,
                          B13   , DB14  , B14   , DBD   , DBLL5 , doub2 ,
                          DP5FH , DP5SH , DBLL2 , PSTN1)
            should be expaned with 'doub1' configuration:
            doub1 : line=(DQD3, Q05, DQD2, Q06, DQD3)

            since:
            getBeamline('doub1') = [u'dqd3', u'q05', u'dqd2', u'q06', u'dqd3'] = A
            getBeamline('doub2') = [u'dqd3', u'q05', u'dqd2', u'q06', u'dqd3'] = B
            getBeamline('chi') = [u'dbll2', u'doub1', u'dp4fh', u'dp4sh', u'dbll5', u'dbd', u'b11', u'db11', u'b12',
                                  u'db12', u'pf2', u'db13', u'b13', u'db14', u'b14', u'dbd', u'dbll5', u'doub2',
                                  u'dp5fh', u'dp5sh', u'dbll2', u'pstn1']

            thus: getFullBeamline('chi') should return:
            [u'dbll2', A, u'dp4fh', u'dp4sh', u'dbll5', u'dbd', u'b11', u'db11', u'b12', u'db12', u'pf2', u'db13',
             u'b13', u'db14', u'b14', u'dbd', u'dbll5', B, u'dp5fh', u'dp5sh', u'dbll2', u'pstn1']

            :param extend: if extend mode should be envoked, by default False
            if extend = True, element like '2*D01' would be expended to be D01, D01
        """
        try:
            assert beamlineKw.upper() in self.kws_bl
            rawbl = self.getBeamline(beamlineKw)
            fullbl = []
            if not extend:
                for ele in rawbl:
                    if self.isBeamline(ele):
                        fullbl.extend(self.getFullBeamline(ele))
                    else:  # if not beamline, do not expand
                        fullbl.append(ele)
            else:  # extend
                for ele in rawbl:
                    ele_num_name_dict = self.rinseElement(ele)
                    elename = ele_num_name_dict['name']
                    elenum = ele_num_name_dict['num']
                    if self.isBeamline(elename):
                        fullbl.extend(self.getFullBeamline(elename, extend=True) * elenum)
                    else:
                        fullbl.extend([elename] * elenum)
            return fullbl
        except AssertionError:
            print('ERROR: %s is not a right defined beamline.' % beamlineKw)