def write(self, name, data): filename = self.get_filename(ext='json') try: self.lock.acquire() if os.path.isfile(filename): alldata = read_json(filename) else: alldata = {} alldata[name] = data write_json(filename, alldata) finally: self.lock.release()
def run_single(self, name): self.log('Running', name) try: atoms = self.create_system(name) except Exception: self.log(name, 'FAILED') traceback.print_exc(file=self.logfile) return atoms.calc = self.calcfactory(self.get_filename(name), atoms) tstart = time() try: data = self.calculate(name, atoms) if self.after: exec self.after except KeyboardInterrupt: raise except Exception: self.log(name, 'FAILED') traceback.print_exc(file=self.logfile) return tstop = time() data['time'] = tstop - tstart filename = self.get_filename(ext='json') try: self.lock.acquire() if os.path.isfile(filename): alldata = read_json(filename) else: alldata = {} alldata[name] = data write_json(filename, alldata) finally: self.lock.release() for write in self.write_funcs: filenamebase = self.get_filename(name) write(filenamebase, atoms, data) return atoms
def run(self, atoms, name): args = self.args if self.lock is None: # Create lock object: if args.use_lock_file: self.lock = Lock(self.get_filename(ext='lock')) else: self.lock = OpenLock() skip = False if args.use_lock_file: try: filename = self.get_filename(ext='json') self.lock.acquire() if os.path.isfile(filename): data = read_json(filename) if name in data: skip = True else: data[name] = {} write_json(filename, data) else: write_json(filename, {name: {}}) finally: self.lock.release() if not skip: self.set_calculator(atoms, name) tstart = time.time() try: data = self.calculate(atoms, name) except KeyboardInterrupt: raise except Exception: self.log(name, 'FAILED') traceback.print_exc(file=self.logfile) else: tstop = time.time() data['time'] = tstop - tstart self.write(name, data)
def clean_json_file(self, names=None): self.read(skipempty=False) n = len(self.data) if names: for name in names: del self.data[name] else: self.data = dict((key, value) for key, value in self.data.items() if value) filename = self.get_filename(ext='json') try: self.lock.acquire() write_json(filename, self.data) finally: self.lock.release() n -= len(self.data) self.log('Cleaned', n, ['tasks', 'task'][n == 1])
def clean_json_file(self, names=None): self.read(skipempty=False) n = len(self.data) if names: for name in names: del self.data[name] else: self.data = dict( (key, value) for key, value in self.data.items() if value) filename = self.get_filename(ext='json') try: self.lock.acquire() write_json(filename, self.data) finally: self.lock.release() n -= len(self.data) self.log('Cleaned', n, ['tasks', 'task'][n == 1])
def run(self, names=None): """Run task for all names. The task will be one of these four: * Open ASE's GUI * Write configuration to file * Write summary * Do the actual calculation """ if self.lock is None: # Create lock object: self.lock = Lock(self.get_filename(ext='lock')) if self.clean: self.clean_json_file(names) return if names is None or len(names) == 0: names = self.collection.keys() names = self.expand(names) names = names[self.slice] names = self.exclude(names) if self.gui: for name in names: view(self.create_system(name)) return if self.write_to_file: if self.write_to_file[0] == '.': for name in names: filename = self.get_filename(name, self.write_to_file) write(filename, self.create_system(name)) else: assert len(names) == 1 write(self.write_to_file, self.create_system(names[0])) return if self.write_summary: self.read() self.analyse() self.summarize(names) return atoms = None for name in names: if self.use_lock_files: try: filename = self.get_filename(ext='json') self.lock.acquire() if os.path.isfile(filename): data = read_json(filename) if name not in data: data[name] = {} write_json(filename, data) else: self.log('Skipping', name) continue else: write_json(filename, {name: {}}) finally: self.lock.release() if atoms is not None: del atoms.calc atoms = self.run_single(name) return atoms