rootgrp.Conventions = 'SOFA' rootgrp.Version = SOFAAPI.getAPIVersion() rootgrp.SOFAConventions = 'AmbisonicsDRIR' rootgrp.SOFAConventionsVersion = SOFAAmbisonicsDRIR.getConventionVersion() rootgrp.APIName = 'pysofaconventions' rootgrp.APIVersion = SOFAAPI.getAPIVersion() rootgrp.AuthorContact = '*****@*****.**' rootgrp.Organization = 'Eurecat - UPF' rootgrp.License = 'Please ask authors for permission' rootgrp.DataType = 'FIRE' rootgrp.RoomType = 'reverberant' rootgrp.DateCreated = time.ctime(time.time()) rootgrp.DateModified = time.ctime(time.time()) rootgrp.Title = 'AudioBooth' rootgrp.AmbisonicsOrder = '1' #----------Required Dimensions----------# M = 1 N = 65536 R = 4 E = 17 I = 1 C = 3 rootgrp.createDimension('M', M) rootgrp.createDimension('N', N) rootgrp.createDimension('R', R) rootgrp.createDimension('E', E) rootgrp.createDimension('I', I) rootgrp.createDimension('C', C)
def test_isValid(): fd, path = tempfile.mkstemp() def raiseWarning(warningString): ambisonicsDRIR = SOFAAmbisonicsDRIR(path, 'r') with pytest.warns(SOFAWarning) as record: assert not ambisonicsDRIR.isValid() assert warningString in str(record[-1].message) ambisonicsDRIR.close() ## Validity of SOFAFile # File not valid rootgrp = Dataset(path, 'w', format='NETCDF4') rootgrp.close() raiseWarning('Missing required attribute: APIName') os.remove(path) # SOFA File valid rootgrp = Dataset(path, 'w', format='NETCDF4') # Attributes rootgrp.Conventions = 'SOFA' rootgrp.Version = '1.0' rootgrp.SOFAConventions = 'GeneralFIR' rootgrp.SOFAConventionsVersion = '0.2' rootgrp.APIName = 'pysofaconventions' rootgrp.APIVersion = '0.1' rootgrp.APIVersion = '0.1' rootgrp.AuthorContact = '*****@*****.**' rootgrp.Organization = 'Eurecat - UPF' rootgrp.License = 'WTFPL - Do What the F**k You Want to Public License' rootgrp.DataType = 'FIRE' rootgrp.RoomType = 'reverberant' rootgrp.DateCreated = time.ctime(time.time()) rootgrp.DateModified = time.ctime(time.time()) rootgrp.Title = 'testpysofaconventions' # Dimensions rootgrp.createDimension('I', 1) rootgrp.createDimension('N', 2) rootgrp.createDimension('C', 3) rootgrp.createDimension('M', 4) rootgrp.createDimension('R', 5) rootgrp.createDimension('E', 6) # Variables sr = rootgrp.createVariable('Data.SamplingRate', 'f8', ('I', )) sr.Units = 'hertz' rootgrp.createVariable('Data.Delay', 'f8', ('M', 'R', 'E')) rootgrp.createVariable('Data.IR', 'f8', ('M', 'R', 'E', 'N')) listenerPositionVar = rootgrp.createVariable('ListenerPosition', 'f8', ('I', 'C')) listenerPositionVar.Units = 'metre' listenerPositionVar.Type = 'cartesian' sourcePositionVar = rootgrp.createVariable('SourcePosition', 'f8', ('I', 'C')) sourcePositionVar.Units = 'metre' sourcePositionVar.Type = 'cartesian' receiverPositionVar = rootgrp.createVariable('ReceiverPosition', 'f8', ('R', 'C', 'I')) receiverPositionVar.Units = 'metre' receiverPositionVar.Type = 'cartesian' emitterPositionVar = rootgrp.createVariable('EmitterPosition', 'f8', ('E', 'C', 'M')) emitterPositionVar.Units = 'metre' emitterPositionVar.Type = 'cartesian' rootgrp.close() ## Specific validity # SOFAConventions should be AmbisonicsDRIR raiseWarning('SOFAConventions is not "AmbisonicsDRIR", got: "GeneralFIR"') rootgrp = Dataset(path, 'a') rootgrp.SOFAConventions = 'AmbisonicsDRIR' rootgrp.close() # Required global attribute AmbisonicsOrder raiseWarning('Missing required Global Attribute "AmbisonicsOrder"') rootgrp = Dataset(path, 'a') rootgrp.AmbisonicsOrder = 1 rootgrp.close() # Required attribute Data.IR:ChannelOrdering raiseWarning('Missing required Data.IR Attribute "ChannelOrdering"') rootgrp = Dataset(path, 'a') dataIR = rootgrp.variables['Data.IR'] dataIR.ChannelOrdering = 'fuma' rootgrp.close() # Required attribute Data.IR:Normalization raiseWarning('Missing required Data.IR Attribute "Normalization"') rootgrp = Dataset(path, 'a') dataIR = rootgrp.variables['Data.IR'] dataIR.Normalization = 'fuma' rootgrp.close() # Requiered variables ListenerUp and ListenerView raiseWarning('Missing required Variables "ListenerUp" and "ListenerView"') rootgrp = Dataset(path, 'a') up = rootgrp.createVariable('ListenerUp', 'f8', ('I', 'C')) up.Units = 'metre' up.Type = 'cartesian' view = rootgrp.createVariable('ListenerView', 'f8', ('I', 'C')) view.Units = 'metre' view.Type = 'cartesian' rootgrp.close() # Requiered variables SourceUp and SourceView raiseWarning('Missing required Variables "SourceUp" and "SourceView"') rootgrp = Dataset(path, 'a') up = rootgrp.createVariable('SourceUp', 'f8', ('I', 'C')) up.Units = 'metre' up.Type = 'cartesian' view = rootgrp.createVariable('SourceView', 'f8', ('I', 'C')) view.Units = 'metre' view.Type = 'cartesian' rootgrp.close() # All right ambisonicsDRIR = SOFAAmbisonicsDRIR(path, 'r') assert ambisonicsDRIR.isValid() ambisonicsDRIR.close() os.remove(path) # Test separately the data type (renaming it on the fly might crash the netcdf4) rootgrp = Dataset(path, 'w', format='NETCDF4') # Attributes rootgrp.Conventions = 'SOFA' rootgrp.Version = '1.0' rootgrp.SOFAConventions = 'GeneralFIR' rootgrp.SOFAConventionsVersion = '0.2' rootgrp.APIName = 'pysofaconventions' rootgrp.APIVersion = '0.1' rootgrp.APIVersion = '0.1' rootgrp.AuthorContact = '*****@*****.**' rootgrp.Organization = 'Eurecat - UPF' rootgrp.License = 'WTFPL - Do What the F**k You Want to Public License' rootgrp.DataType = 'FIR' rootgrp.RoomType = 'reverberant' rootgrp.DateCreated = time.ctime(time.time()) rootgrp.DateModified = time.ctime(time.time()) rootgrp.Title = 'testpysofaconventions' # Dimensions rootgrp.createDimension('I', 1) rootgrp.createDimension('N', 2) rootgrp.createDimension('C', 3) rootgrp.createDimension('M', 4) rootgrp.createDimension('R', 5) rootgrp.createDimension('E', 6) # Variables sr = rootgrp.createVariable('Data.SamplingRate', 'f8', ('I', )) sr.Units = 'hertz' rootgrp.createVariable('Data.Delay', 'f8', ('M', 'R')) rootgrp.createVariable('Data.IR', 'f8', ('M', 'R', 'N')) listenerPositionVar = rootgrp.createVariable('ListenerPosition', 'f8', ('I', 'C')) listenerPositionVar.Units = 'metre' listenerPositionVar.Type = 'cartesian' sourcePositionVar = rootgrp.createVariable('SourcePosition', 'f8', ('I', 'C')) sourcePositionVar.Units = 'metre' sourcePositionVar.Type = 'cartesian' receiverPositionVar = rootgrp.createVariable('ReceiverPosition', 'f8', ('R', 'C', 'I')) receiverPositionVar.Units = 'metre' receiverPositionVar.Type = 'cartesian' emitterPositionVar = rootgrp.createVariable('EmitterPosition', 'f8', ('E', 'C', 'M')) emitterPositionVar.Units = 'metre' emitterPositionVar.Type = 'cartesian' rootgrp.close() # Data type should be FIRE raiseWarning('DataType is not "FIRE", got: "FIR"')