nodes: 0, module; 1, function_definition; 2, function_name:pmt_angles; 3, parameters; 4, block; 5, identifier:self; 6, expression_statement; 7, if_statement; 8, return_statement; 9, comment:"""A list of PMT directions sorted by PMT channel, on DU-1, floor-1"""; 10, comparison_operator:self._pmt_angles == []; 11, block; 12, attribute; 13, attribute; 14, list; 15, expression_statement; 16, expression_statement; 17, identifier:self; 18, identifier:_pmt_angles; 19, identifier:self; 20, identifier:_pmt_angles; 21, assignment; 22, assignment; 23, identifier:mask; 24, binary_operator:(self.pmts.du == 1) & (self.pmts.floor == 1); 25, attribute; 26, subscript; 27, parenthesized_expression; 28, parenthesized_expression; 29, identifier:self; 30, identifier:_pmt_angles; 31, attribute; 32, identifier:mask; 33, comparison_operator:self.pmts.du == 1; 34, comparison_operator:self.pmts.floor == 1; 35, attribute; 36, identifier:dir; 37, attribute; 38, integer:1; 39, attribute; 40, integer:1; 41, identifier:self; 42, identifier:pmts; 43, attribute; 44, identifier:du; 45, attribute; 46, identifier:floor; 47, identifier:self; 48, identifier:pmts; 49, identifier:self; 50, identifier:pmts
code: def pmt_angles(self):
          """A list of PMT directions sorted by PMT channel, on DU-1, floor-1"""
          if self._pmt_angles == []:
              mask = (self.pmts.du == 1) & (self.pmts.floor == 1)
              self._pmt_angles = self.pmts.dir[mask]
          return self._pmt_angles