Source code for fuelsegmentsgroups

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# This file is part of the Cortix toolkit environment
# https://cortix.org
#
# All rights reserved, see COPYRIGHT for full restrictions.
# https://github.com/dpploy/cortix/blob/master/COPYRIGHT.txt
#
# Licensed under the University of Massachusetts Lowell LICENSE:
# https://github.com/dpploy/cortix/blob/master/LICENSE.txt
'''
Author: Valmor de Almeida dealmeidav@ornl.gov; vfda

Fuel segment

VFdALib support classes

Sat Jun 27 14:46:49 EDT 2015
'''
#*********************************************************************************
import os
import sys
import io
import time
import datetime
import math
import random

from cortix.support.nuclear.fuel_segment import FuelSegment
#*********************************************************************************

[docs]class FuelSegmentsGroups(): ''' Creates a dictionary of lists of fuel segment objects, with the keys typically being timestamps. Each fuel segment object has two data members, a `Pandas` Series for geometry spec and a panda DataFrame for property density. ''' #********************************************************************************* # Construction #********************************************************************************* def __init__(self, key=None, fuelSegments=None ): # constructor # FuelSegmentsGroups simply encapsulates a dictionary of a list of # FuelSegment objects. The key is typically a time stamp. # A FuelSegment object has two data members, a pandas Series for geometry spec # and a pandas DataFrame for property density. # This is the central member data self.groups = dict() assert key not in self.groups.keys() if fuelSegments is not None: assert isinstance(fuelSegments, list) assert isinstance(fuelSegments[-1], FuelSegment) self.groups[key] = fuelSegments else: self.groups[key] = list() return #********************************************************************************* # Public Member Functions #*********************************************************************************
[docs] def HasGroup(self, key): ''' Checks if the specified key has a group of fuel segments associated with it. Parameters ---------- key: str Returns ------- key: str ''' return key in self.groups.keys()
[docs] def AddGroup(self, key, fuelSegments=None): ''' Appends the dictionary with a new key and associated list of fuelSegments. If the specified key is already present in the dictionary, then the specified list of fuel segments will be appended to the list of fuel segments already associated with the specified key. Parameters ---------- key: str fuelSegments: list ''' self.__AddGroup(key, fuelSegments) return
[docs] def GetAttribute(self, groupKey=None, attributeName=None, nuclideSymbol=None, nuclideSeries=None): ''' Returns the average value of an attribute amongst all elements in a group (WARNING: keys with no values associated with them will lower this average!). If groupKey is not specified, the function will return the average attribute value of every fuel segment element in the entire dictionary. If attribute is not specified, the function call will fail. If the key value specified does not match any keys in the dictionary, the function will return a value of 0. Parameters ---------- groupKey: str attributeName: str nuclideSymbol: str nuclideSeries: str Returns ------- groupAttribute: float ''' return self.__GetGroupAttribute( groupKey, attributeName, nuclideSymbol, nuclideSeries)
[docs] def GetFuelSegments(self, groupKey=None): ''' Returns a list of fuel segments associated with a specified groupkey. If no group key is specified, then all elements in the dictionary will be returned. If the specified group key does not exist, then the function will return an empty list. Parameters ---------- groupKey: str Returns ---------- fuelSegments: list ''' return self.__GetFuelSegments(groupKey)
[docs] def RemoveFuelSegment(self, groupKey, fuelSegment): ''' Removes a fuel segment from a list associated with a specified group key. If the specified group key or fuel segment do not exist, the function will fail. Parameters ---------- groupKey: str fuelSegment: str Returns ------- empty: ''' return self.__RemoveFuelSegment(groupKey, fuelSegment)
# def __str__( self ): # s = ' %5s %5s %5s '+' molar mass: %6s '+' molar cc: %6s '+' mass cc: %6s '+' flag: %s '+'# atoms: %s'+' atoms: %s\n' # return s % (self.name, self.formula, self.phase, self.molarMass, self.molarCC, self.massCC, self.flag, self.nAtoms, self.atoms) # # def __repr__( self ): # s = ' %5s %5s %5s '+' molar mass: %6s '+' molar cc: %6s '+' mass cc: %6s '+' flag: %s '+'# atoms: %s'+' atoms: %s\n' # return s % (self.name, self.formula, self.phase, self.molarMass, self.molarCC, self.massCC, self.flag, self.nAtoms, self.atoms) #********************************************************************************* # Private helper functions (internal use: __) #********************************************************************************* # If an attibute is not found, Return 0 even if a groupKey is not found # Don't change this behavior; it will break user's code. def __GetGroupAttribute(self, groupKey=None, attributeName=None, symbol=None, series=None): ''' Returns the cumulative or average densities of all fuel segments in all groups. Use this function with discretion, as groups with no segments will reduce the average density value. Parameters ---------- groupKey: str attributeName: str symbol: str series: list Returns ------- attribute: float ''' assert attributeName is not None, 'fatal.' attribute = None if groupKey is None: attribute = 0 for (key, fuelSegments) in self.groups.items(): assert isinstance(fuelSegments, list), 'fail.' if len(fuelSegments) == 0: continue # this will reduce the average value groupAttribute = 0 for fuelSegment in fuelSegments: groupAttribute += fuelSegment.get_attribute( attributeName, symbol, series) if attributeName[-4:] == 'Dens' or attributeName[-2:] == 'CC': groupAttribute /= len(fuelSegments) attribute += groupAttribute if attribute != 0 and \ (attributeName[-4:] == 'Dens' or attributeName[-2:] == 'CC'): attribute /= len(self.groups) # if attributeName[-4:] == 'Dens' or attributeName[-2:] == 'CC': # print('HELLO density '+attributeName+' ', attribute) # Get average property in all fuel segments within a groupKey else: if groupKey not in self.groups.keys(): return 0 fuelSegments = self.groups[groupKey] if len(fuelSegments) is 0: return 0 attribute = 0 for fuelSegment in fuelSegments: attribute += fuelSegment.get_attribute( attributeName, symbol, series) if attribute != 0 and \ (attributeName[-4:] == 'Dens' or attributeName[-2:] == 'CC'): attribute /= len(fuelSegments) return attribute def __GetFuelSegments(self, groupKey=None): ''' Returns a list of fuel segments associated with a given group (if groupKey is specified), or an ordered list of pairs of all segments in all groups and their keys. [ (timeStamp, fuelSegment), (timeStamp, fuelSegment), ..]. If the specified groupKey does not exist, this function will return an empty list. Parameters ---------- groupKey: str Returns ------- sorted_data: type or self.groups[groupKey]: type or list(): list ''' if groupKey is None: # return an ordered list of all fuelSegments tmp = list() timeStamp = list() for (key, fuelSegments) in self.groups.items(): if fuelSegments is None: continue tmp += fuelSegments # all fuel segments in the group have timeStamp += [key for i in fuelSegments] # the same time stamp # sort fuelSegments in order of their keys data = zip(timeStamp, tmp) # this is a list of pairs sorted_data = sorted( data, key=lambda entry: entry[0], reverse=False) #tmp = [ y for (x,y) in sorted_data ] # oldest first return sorted_data else: if groupKey not in self.groups.keys(): return list() return self.groups[groupKey] def __AddGroup(self, groupKey, fuelSegments=None): ''' If a list of fuel segments and a group key is specified, the fuelSegment list is appended to the specified groupKey. If the groupKey specified does not already exist, a new one is created and the fuelSegments list is appended to it. fuelSegments is ALWAYS a list, and may be empty. A group will ALWAYS have a fuelSegments list. Parameters ---------- groupKey: str fuelSegments: list ''' if fuelSegments is None: fuelSegments = list() else: assert isinstance(fuelSegments, list), 'fail.' if groupKey in self.groups.keys(): self.groups[groupKey] += fuelSegments else: self.groups[groupKey] = fuelSegments return def __RemoveFuelSegment(self, groupKey, fuelSegment_remove): ''' Removes a fuel segment from a list associated with a specified group key. If the specified group key or fuel segment do not exist, the function will fail. Parameters ---------- groupKey: str fuelSegment: str ''' assert groupKey in self.groups.keys(), 'fail.' fuelSegments = self.groups[groupKey] nSegments = len(fuelSegments) for fuelSegment in fuelSegments: if fuelSegment.get_attribute( 'segmentId') == fuelSegment_remove.get_attribute('segmentId'): fuelSegments.remove(fuelSegment) assert len(self.groups[groupKey]) == nSegments - 1, 'fatal.' return
#========================= end class FuelSegmentsGroups ==========================