# <<BEGIN-copyright>>
# <<END-copyright>>
accuracy = 1e-6
from xData import link as linkModule
from xData import standards as standardsModule
from xData import axes as axesModule
from xData import XYs as XYsModule
from xData import regions as regionsModule
from . import group as groupModule
def _toLinear( func ) :
if( isinstance( func, XYsModule.XYs1d ) ) :
if( func.interpolation == standardsModule.interpolation.linlinToken ) : return( func )
func = func.copy( )
return( func.toPointwise_withLinearXYs( accuracy = accuracy, upperEps = 1e-8 ) )
elif( isinstance( func, regionsModule.regions1d ) ) :
return( func.toPointwise_withLinearXYs( accuracy = accuracy, upperEps = 1e-8 ) )
from fudge.core.utilities import brb
brb.objectoutline( func )
raise Exception( 'FIX ME' )
def _groupFunctionsAndFluxInit( style, tempInfo, f1 ) :
reactionSuite = tempInfo['reactionSuite']
groupBoundaries = style.transportables[reactionSuite.projectile].group.boundaries
flux = style.flux.getFluxAtLegendreOrder( 0 )
if( f1 is not None ) :
domainMin, domainMax = f1.domainMin, f1.domainMax
flux = flux.domainSlice( domainMin, domainMax )
return( groupBoundaries, flux )
def _mutualifyGrouping3Data( f1, f2, f3, printMutualDomainWarning = False ) :
domainMin1, domainMax1 = f1.domainMin, f1.domainMax
domainMin2, domainMax2 = f2.domainMin, f2.domainMax
if( len( f3 ) == 0 ) :
domainMin3, domainMax3 = domainMin2, domainMax2
else :
domainMin3, domainMax3 = f3.domainMin, f3.domainMax
if( ( domainMin1 != domainMin2 ) or ( domainMin1 != domainMin3 ) or ( domainMax1 != domainMax2 ) or ( domainMax1 != domainMax3 ) ) :
domainMin, domainMax = max( domainMin1, domainMin2, domainMin3 ), min( domainMax1, domainMax2, domainMax3 )
if( printMutualDomainWarning ) : print "WARNING: making domains mutual for grouping,", domainMin1, domainMin2, domainMin3, domainMax1, domainMax2, domainMax3
f1 = f1.domainSlice( domainMin = domainMin, domainMax = domainMax )
f2 = f2.domainSlice( domainMin = domainMin, domainMax = domainMax )
if( len( f3 ) > 0 ) : f3 = f3.domainSlice( domainMin = domainMin, domainMax = domainMax )
return( f1, f2, f3 )
[docs]def groupOneFunctionAndFlux( style, tempInfo, f1, styleFilter = None ) :
if( isinstance( f1, linkModule.link ) ) : f1 = style.findFormMatchingDerivedStyle( f1.link, styleFilter = styleFilter )
f1 = _toLinear( f1 )
groupBoundaries, flux = _groupFunctionsAndFluxInit( style, tempInfo, f1 )
return( f1.groupTwoFunctions( groupBoundaries, flux, norm = tempInfo['groupedFlux'] ) )
[docs]def groupTwoFunctionsAndFlux( style, tempInfo, f1, f2, norm = None, printMutualDomainWarning = False ) :
f1 = _toLinear( f1 )
f2 = _toLinear( f2 )
groupBoundaries, flux = _groupFunctionsAndFluxInit( style, tempInfo, f1 )
f1, f2, flux = _mutualifyGrouping3Data( f1, f2, flux, printMutualDomainWarning = printMutualDomainWarning )
return( f1.groupThreeFunctions( groupBoundaries, flux, f2, norm = norm ) )
[docs]def groupFunctionCrossSectionAndFlux( cls, style, tempInfo, f1, printMutualDomainWarning = False ) :
crossSection = tempInfo['crossSection']
norm = tempInfo['groupedFlux']
grouped = groupTwoFunctionsAndFlux( style, tempInfo, f1, crossSection, norm = norm, printMutualDomainWarning = printMutualDomainWarning )
unit = crossSection.axes[0].unit
if( f1.axes[0].unit != '' ) : unit = '%s * %s' % ( f1.axes[0].unit, unit )
axis = axesModule.axis( label = '%s * %s' % ( f1.axes[0].label, crossSection.axes[0].label ), unit = unit, index = 0 )
axes = f1.axes.copy( )
axes[0] = axis
return( groupModule.toMultiGroup1d( cls, style, tempInfo, axes, grouped ) )