843 def write_paramCard(self, output_location=None):
844 """Write the updated card, preserving section headers and comments.
845
846 Only BLOCK and DECAY headers delimit sections; empty lines do not.
847 Decay dictionary values already contain their header and branching
848 ratios, so they must not be written as ordinary key/value entries.
849 """
850 if self.paramCard_default_loc is None or not os.path.isfile(self.paramCard_default_loc):
851 self.paramCard_default_loc = self.paramCard_loc + '.old_to_be_deleted'
852 os.rename(self.paramCard_loc, self.paramCard_default_loc)
853
854 with open(self.paramCard_default_loc) as card:
855 lines = card.readlines()
856
857 block_names = {name.lower(): name for name in self.paramCardDict}
858 written = {name:
set()
for name
in self.paramCardDict}
859 output = self.paramCard_loc if output_location is None else output_location
860 with open(output, 'w') as newCard:
861 def write_entry(name, key):
862 value = self.paramCardDict[name][key]
863 if name.lower() == 'decay':
864 newCard.write(str(value).rstrip() + '\n')
865 else:
866 newCard.write(f' {key} {value}\n')
867 written[name].
add(key)
868
869 def finish_block(name):
870 if name is not None and name.lower() != 'decay':
871 for key in self.paramCardDict[name]:
872 if key not in written[name]:
873 write_entry(name, key)
874
875 name = None
876 for line in lines:
877 columns = line.partition(
'#')[0].
split()
878 if not columns:
879 newCard.write(line.rstrip('\r\n') + '\n')
880 elif columns[0].lower() == 'block':
881 finish_block(name)
882 block = self._block_name(line)
883 if block.lower() not in block_names:
884 raise RuntimeError('Cannot find %s in paramCardDict' % block)
885 name = block_names[block.lower()]
886 newCard.write(line.rstrip() + '\n')
887 elif columns[0].lower() == 'decay':
888 finish_block(name)
889 name = block_names['decay']
890 key = columns[1]
891 if key not in written[name]:
892 write_entry(name, key)
893 elif name is None:
894 newCard.write(line.rstrip('\r\n') + '\n')
895 elif name.lower() != 'decay':
896 key = ' '.join(columns[:-1])
897 write_entry(name, key)
898
899
900 finish_block(name)
901
902
903
904 for name, settings in self.paramCardDict.items():
905 missing = [key for key in settings if key not in written[name]]
906 if not missing:
907 continue
908 newCard.write('\n')
909 if name.lower() != 'decay':
910 newCard.write(f'Block {name}\n')
911 for key in missing:
912 write_entry(name, key)
913
914 mglog.info('Finished writing paramCardDict to ' + str(output))
bool add(const std::string &hname, TKey *tobj)