Loading .clang-format 0 → 100644 +115 −0 Original line number Diff line number Diff line --- Language: Cpp AccessModifierOffset: -2 AlignAfterOpenBracket: DontAlign AlignConsecutiveAssignments: false AlignConsecutiveDeclarations: false AlignEscapedNewlines: Right AlignOperands: true AlignTrailingComments: true AllowAllParametersOfDeclarationOnNextLine: true AllowShortBlocksOnASingleLine: true AllowShortCaseLabelsOnASingleLine: false AllowShortFunctionsOnASingleLine: All AllowShortIfStatementsOnASingleLine: true AllowShortLoopsOnASingleLine: true AlwaysBreakAfterDefinitionReturnType: None AlwaysBreakAfterReturnType: None AlwaysBreakBeforeMultilineStrings: false AlwaysBreakTemplateDeclarations: false BinPackArguments: true BinPackParameters: true BraceWrapping: AfterClass: false AfterControlStatement: false AfterEnum: false AfterFunction: false AfterNamespace: false AfterObjCDeclaration: false AfterStruct: false AfterUnion: false AfterExternBlock: false BeforeCatch: false BeforeElse: false IndentBraces: false SplitEmptyFunction: true SplitEmptyRecord: true SplitEmptyNamespace: true BreakBeforeBinaryOperators: None BreakBeforeBraces: Attach BreakBeforeInheritanceComma: false BreakBeforeTernaryOperators: true BreakConstructorInitializersBeforeComma: false BreakConstructorInitializers: BeforeColon BreakAfterJavaFieldAnnotations: false BreakStringLiterals: true ColumnLimit: 80 CommentPragmas: '^ IWYU pragma:' CompactNamespaces: false ConstructorInitializerAllOnOneLineOrOnePerLine: false ConstructorInitializerIndentWidth: 4 ContinuationIndentWidth: 8 Cpp11BracedListStyle: true DerivePointerAlignment: false DisableFormat: false ExperimentalAutoDetectBinPacking: false FixNamespaceComments: true ForEachMacros: - foreach - Q_FOREACH - BOOST_FOREACH IncludeBlocks: Preserve IncludeCategories: - Regex: '^"(llvm|llvm-c|clang|clang-c)/' Priority: 2 - Regex: '^(<|"(gtest|gmock|isl|json)/)' Priority: 3 - Regex: '.*' Priority: 1 IncludeIsMainRegex: '(Test)?$' IndentCaseLabels: false IndentPPDirectives: None IndentWidth: 4 IndentWrappedFunctionNames: false JavaScriptQuotes: Leave JavaScriptWrapImports: true KeepEmptyLinesAtTheStartOfBlocks: true MacroBlockBegin: '' MacroBlockEnd: '' MaxEmptyLinesToKeep: 1 NamespaceIndentation: None ObjCBlockIndentWidth: 2 ObjCSpaceAfterProperty: false ObjCSpaceBeforeProtocolList: true PenaltyBreakAssignment: 2 PenaltyBreakBeforeFirstCallParameter: 19 PenaltyBreakComment: 300 PenaltyBreakFirstLessLess: 120 PenaltyBreakString: 1000 PenaltyExcessCharacter: 1000000 PenaltyReturnTypeOnItsOwnLine: 60 PointerAlignment: Right RawStringFormats: - Delimiter: pb Language: TextProto BasedOnStyle: google ReflowComments: true SortIncludes: false SortUsingDeclarations: false SpaceAfterCStyleCast: true SpaceAfterTemplateKeyword: true SpaceBeforeAssignmentOperators: true SpaceBeforeParens: Always SpaceInEmptyParentheses: false SpacesBeforeTrailingComments: 3 SpacesInAngles: false SpacesInContainerLiterals: true SpacesInCStyleCastParentheses: false SpacesInParentheses: false SpacesInSquareBrackets: false Standard: Cpp11 TabWidth: 4 UseTab: ForIndentation #UseTab: Never ... EEG/EEG.cpp +59 −74 Original line number Diff line number Diff line Loading @@ -85,12 +85,11 @@ autoEEG EEG_create (double tmin, double tmax) { } } integer EEG_getChannelNumber (EEG me, const char32 *channelName) { integer EEG_getChannelNumber (EEG me, conststring32 channelName) { for (integer ichan = 1; ichan <= my numberOfChannels; ichan ++) { if (Melder_equ (my channelNames [ichan], channelName)) { if (Melder_equ (my channelNames [ichan].get(), channelName)) return ichan; } } return 0; } Loading Loading @@ -125,7 +124,7 @@ autoEEG EEG_readFromBdfFile (MelderFile file) { if (numberOfBytesInHeaderRecord != (numberOfChannels + 1) * 256) Melder_throw (U"Number of bytes in header record (", numberOfBytesInHeaderRecord, U") doesn't match number of channels (", numberOfChannels, U")."); autostring32vector channelNames (1, numberOfChannels); autostring32vector channelNames (numberOfChannels); for (integer ichannel = 1; ichannel <= numberOfChannels; ichannel ++) { fread (buffer, 1, 16, f); buffer [16] = '\0'; // labels of the channels /* Loading @@ -139,9 +138,9 @@ autoEEG EEG_readFromBdfFile (MelderFile file) { } } channelNames [ichannel] = Melder_8to32 (buffer); trace (U"Channel <<", channelNames [ichannel], U">>"); trace (U"Channel <<", channelNames [ichannel].get(), U">>"); } bool hasLetters = str32equ (channelNames [numberOfChannels], U"EDF Annotations"); bool hasLetters = str32equ (channelNames [numberOfChannels].get(), U"EDF Annotations"); double samplingFrequency = undefined; for (integer channel = 1; channel <= numberOfChannels; channel ++) { fread (buffer, 1, 80, f); buffer [80] = '\0'; // transducer type Loading @@ -149,22 +148,22 @@ autoEEG EEG_readFromBdfFile (MelderFile file) { for (integer channel = 1; channel <= numberOfChannels; channel ++) { fread (buffer, 1, 8, f); buffer [8] = '\0'; // physical dimension of channels } autonumvec physicalMinimum (numberOfChannels, kTensorInitializationType::RAW); autoVEC physicalMinimum (numberOfChannels, kTensorInitializationType::RAW); for (integer ichannel = 1; ichannel <= numberOfChannels; ichannel ++) { fread (buffer, 1, 8, f); buffer [8] = '\0'; physicalMinimum [ichannel] = atof (buffer); } autonumvec physicalMaximum (numberOfChannels, kTensorInitializationType::RAW); autoVEC physicalMaximum (numberOfChannels, kTensorInitializationType::RAW); for (integer ichannel = 1; ichannel <= numberOfChannels; ichannel ++) { fread (buffer, 1, 8, f); buffer [8] = '\0'; physicalMaximum [ichannel] = atof (buffer); } autonumvec digitalMinimum (numberOfChannels, kTensorInitializationType::RAW); autoVEC digitalMinimum (numberOfChannels, kTensorInitializationType::RAW); for (integer ichannel = 1; ichannel <= numberOfChannels; ichannel ++) { fread (buffer, 1, 8, f); buffer [8] = '\0'; digitalMinimum [ichannel] = atof (buffer); } autonumvec digitalMaximum (numberOfChannels, kTensorInitializationType::RAW); autoVEC digitalMaximum (numberOfChannels, kTensorInitializationType::RAW); for (integer ichannel = 1; ichannel <= numberOfChannels; ichannel ++) { fread (buffer, 1, 8, f); buffer [8] = '\0'; digitalMaximum [ichannel] = atof (buffer); Loading Loading @@ -193,26 +192,26 @@ autoEEG EEG_readFromBdfFile (MelderFile file) { his numberOfChannels = numberOfChannels; autoSound me = Sound_createSimple (numberOfChannels, duration, samplingFrequency); Melder_assert (my nx == numberOfSamplesPerDataRecord * numberOfDataRecords); autoNUMvector <unsigned char> dataBuffer ((integer) 0, 3 * numberOfSamplesPerDataRecord - 1); autoNUMvector <uint8> dataBuffer ((integer) 0, 3 * numberOfSamplesPerDataRecord - 1); for (integer record = 1; record <= numberOfDataRecords; record ++) { for (integer channel = 1; channel <= numberOfChannels; channel ++) { double factor = channel == numberOfChannels ? 1.0 : physicalMinimum [channel] / digitalMinimum [channel]; if (channel < numberOfChannels - EEG_getNumberOfExtraSensors (him.get())) factor /= 1000000.0; if (is24bit) { fread (& dataBuffer [0], 3, (size_t) numberOfSamplesPerDataRecord, f); unsigned char *p = & dataBuffer [0]; uint8 *p = & dataBuffer [0]; for (integer i = 1; i <= numberOfSamplesPerDataRecord; i ++) { integer sample = i + (record - 1) * numberOfSamplesPerDataRecord; Melder_assert (sample <= my nx); uint8_t lowByte = *p ++, midByte = *p ++, highByte = *p ++; uint32_t externalValue = ((uint32_t) highByte << 16) | ((uint32_t) midByte << 8) | (uint32_t) lowByte; uint8 lowByte = *p ++, midByte = *p ++, highByte = *p ++; uint32 externalValue = ((uint32) highByte << 16) | ((uint32) midByte << 8) | (uint32) lowByte; if ((highByte & 128) != 0) // is the 24-bit sign bit on? externalValue |= 0xFF000000; // extend negative sign to 32 bits my z [channel] [sample] = (int32_t) externalValue * factor; externalValue |= 0xFF00'0000; // extend negative sign to 32 bits my z [channel] [sample] = (int32) externalValue * factor; } } else { fread (& dataBuffer [0], 2, (size_t) numberOfSamplesPerDataRecord, f); unsigned char *p = & dataBuffer [0]; uint8 *p = & dataBuffer [0]; for (integer i = 1; i <= numberOfSamplesPerDataRecord; i ++) { integer sample = i + (record - 1) * numberOfSamplesPerDataRecord; Melder_assert (sample <= my nx); Loading @@ -226,7 +225,7 @@ autoEEG EEG_readFromBdfFile (MelderFile file) { int numberOfStatusBits = 8; for (integer i = 1; i <= my nx; i ++) { uint32 value = (uint32) (int32) my z [numberOfChannels] [i]; if (value & 0x0000FF00) { if (value & 0x0000'FF00) { numberOfStatusBits = 16; } } Loading @@ -237,9 +236,9 @@ autoEEG EEG_readFromBdfFile (MelderFile file) { double time = undefined; for (integer i = 1; i <= my nx; i ++) { uint32 value = (uint32) (int32) my z [numberOfChannels] [i]; for (int byte = 1; byte <= numberOfStatusBits / 8; byte ++) { uint32 mask = byte == 1 ? 0x000000ff : 0x0000ff00; char32 kar = byte == 1 ? (value & mask) : (value & mask) >> 8; for (int ibyte = 1; ibyte <= numberOfStatusBits / 8; ibyte ++) { uint32 mask = ( ibyte == 1 ? 0x0000'00ff : 0x0000'ff00 ); char32 kar = ( ibyte == 1 ? (value & mask) : (value & mask) >> 8 ); if (kar != U'\0' && kar != 20) { MelderString_appendCharacter (& letters, kar); } else if (letters. string [0] != U'\0') { Loading Loading @@ -302,7 +301,7 @@ autoEEG EEG_readFromBdfFile (MelderFile file) { } } f.close (file); his channelNames = channelNames.transfer(); his channelNames = std::move (channelNames); his sound = me.move(); his textgrid = thee.move(); if (EEG_getNumberOfCapElectrodes (him.get()) == 32) { Loading Loading @@ -449,15 +448,13 @@ void EEG_filter (EEG me, double lowFrequency, double lowWidth, double highFreque } } void EEG_setChannelName (EEG me, integer channelNumber, const char32 *a_name) { autostring32 l_name = Melder_dup (a_name); Melder_free (my channelNames [channelNumber]); my channelNames [channelNumber] = l_name.transfer(); void EEG_setChannelName (EEG me, integer channelNumber, conststring32 newName) { my channelNames [channelNumber] = Melder_dup (newName); } void EEG_setExternalElectrodeNames (EEG me, const char32 *nameExg1, const char32 *nameExg2, const char32 *nameExg3, const char32 *nameExg4, const char32 *nameExg5, const char32 *nameExg6, const char32 *nameExg7, const char32 *nameExg8) conststring32 nameExg1, conststring32 nameExg2, conststring32 nameExg3, conststring32 nameExg4, conststring32 nameExg5, conststring32 nameExg6, conststring32 nameExg7, conststring32 nameExg8) { if (EEG_getNumberOfExternalElectrodes (me) != 8) Melder_throw (U"There aren't 8 external electrodes."); Loading @@ -472,13 +469,13 @@ void EEG_setExternalElectrodeNames (EEG me, EEG_setChannelName (me, firstExternalElectrode + 7, nameExg8); } void EEG_subtractReference (EEG me, const char32 *channelNumber1_text, const char32 *channelNumber2_text) { integer channelNumber1 = EEG_getChannelNumber (me, channelNumber1_text); void EEG_subtractReference (EEG me, conststring32 channelName1, conststring32 channelName2) { integer channelNumber1 = EEG_getChannelNumber (me, channelName1); if (channelNumber1 == 0) Melder_throw (me, U": no channel named \"", channelNumber1_text, U"\"."); integer channelNumber2 = EEG_getChannelNumber (me, channelNumber2_text); if (channelNumber2 == 0 && channelNumber2_text [0] != '\0') Melder_throw (me, U": no channel named \"", channelNumber2_text, U"\"."); Melder_throw (me, U": no channel named \"", channelName1, U"\"."); integer channelNumber2 = EEG_getChannelNumber (me, channelName2); if (channelNumber2 == 0 && channelName2 [0] != '\0') Melder_throw (me, U": no channel named \"", channelName2, U"\"."); const integer numberOfElectrodeChannels = my numberOfChannels - EEG_getNumberOfExtraSensors (me); for (integer isamp = 1; isamp <= my sound -> nx; isamp ++) { double referenceValue = channelNumber2 == 0 ? my sound -> z [channelNumber1] [isamp] : Loading Loading @@ -523,7 +520,7 @@ void EEG_setChannelToZero (EEG me, integer channelNumber) { } } void EEG_setChannelToZero (EEG me, const char32 *channelName) { void EEG_setChannelToZero (EEG me, conststring32 channelName) { try { integer channelNumber = EEG_getChannelNumber (me, channelName); if (channelNumber == 0) Loading @@ -534,9 +531,9 @@ void EEG_setChannelToZero (EEG me, const char32 *channelName) { } } void EEG_removeTriggers (EEG me, kMelder_string which, const char32 *criterion) { void EEG_removeTriggers (EEG me, kMelder_string which, conststring32 criterion) { try { if (my textgrid -> tiers->size < 2 || ! Melder_equ (my textgrid -> tiers->at [2] -> name, U"Trigger")) if (my textgrid -> tiers->size < 2 || ! Melder_equ (my textgrid -> tiers->at [2] -> name.get(), U"Trigger")) Melder_throw (me, U" does not have a Trigger channel."); TextGrid_removePoints (my textgrid.get(), 2, which, criterion); } catch (MelderError) { Loading @@ -550,8 +547,8 @@ autoEEG EEG_extractChannel (EEG me, integer channelNumber) { Melder_throw (U"No channel ", channelNumber, U"."); autoEEG thee = EEG_create (my xmin, my xmax); thy numberOfChannels = 1; thy channelNames = NUMvector <char32 *> (1, 1); thy channelNames [1] = Melder_dup (my channelNames [1]); thy channelNames = autostring32vector (1); thy channelNames [1] = Melder_dup (my channelNames [1].get()); thy sound = Sound_extractChannel (my sound.get(), channelNumber); thy textgrid = Data_copy (my textgrid.get()); return thee; Loading @@ -560,7 +557,7 @@ autoEEG EEG_extractChannel (EEG me, integer channelNumber) { } } autoEEG EEG_extractChannel (EEG me, const char32 *channelName) { autoEEG EEG_extractChannel (EEG me, conststring32 channelName) { try { integer channelNumber = EEG_getChannelNumber (me, channelName); if (channelNumber == 0) Loading @@ -571,7 +568,7 @@ autoEEG EEG_extractChannel (EEG me, const char32 *channelName) { } } autoEEG EEG_extractChannels (EEG me, numvec channelNumbers) { autoEEG EEG_extractChannels (EEG me, constVEC channelNumbers) { try { integer numberOfChannels = channelNumbers.size; Melder_require (numberOfChannels > 0, Loading @@ -579,10 +576,10 @@ autoEEG EEG_extractChannels (EEG me, numvec channelNumbers) { autoEEG you = EEG_create (my xmin, my xmax); your sound = Sound_extractChannels (my sound.get(), channelNumbers); your numberOfChannels = numberOfChannels; your channelNames = NUMvector <char32 *> (1, numberOfChannels); your channelNames = autostring32vector (numberOfChannels); for (integer ichan = 1; ichan <= numberOfChannels; ichan ++) { integer originalChannelNumber = Melder_iround (channelNumbers [ichan]); your channelNames [ichan] = Melder_dup (my channelNames [originalChannelNumber]); your channelNames [ichan] = Melder_dup (my channelNames [originalChannelNumber].get()); } your textgrid = Data_copy (my textgrid.get()); return you; Loading Loading @@ -611,10 +608,10 @@ void EEG_removeChannel (EEG me, integer channelNumber) { try { if (channelNumber < 1 || channelNumber > my numberOfChannels) Melder_throw (U"No channel ", channelNumber, U"."); Melder_free (my channelNames [channelNumber]); for (integer ichan = channelNumber; ichan < my numberOfChannels; ichan ++) { my channelNames [ichan] = my channelNames [ichan + 1]; my channelNames [ichan] = my channelNames [ichan + 1].move(); } my channelNames [my numberOfChannels]. reset(); my numberOfChannels -= 1; Sound_removeChannel (my sound.get(), channelNumber); } catch (MelderError) { Loading @@ -622,7 +619,7 @@ void EEG_removeChannel (EEG me, integer channelNumber) { } } void EEG_removeChannel (EEG me, const char32 *channelName) { void EEG_removeChannel (EEG me, conststring32 channelName) { try { integer channelNumber = EEG_getChannelNumber (me, channelName); if (channelNumber == 0) Loading @@ -639,14 +636,16 @@ autoEEG EEGs_concatenate (OrderedOf<structEEG>* me) { Melder_throw (U"Cannot concatenate zero EEG objects."); EEG first = my at [1]; integer numberOfChannels = first -> numberOfChannels; char32 **channelNames = first -> channelNames; autostring32vector channelNames; channelNames. copyFrom (first -> channelNames); for (integer ieeg = 2; ieeg <= my size; ieeg ++) { EEG other = my at [ieeg]; if (other -> numberOfChannels != numberOfChannels) Melder_throw (U"The number of channels of ", other, U" does not match the number of channels of ", first, U"."); for (integer ichan = 1; ichan <= numberOfChannels; ichan ++) { if (! Melder_equ (other -> channelNames [ichan], channelNames [ichan])) Melder_throw (U"Channel ", ichan, U" has a different name in ", other, U" (", other -> channelNames [ichan], U") than in ", first, U" (", channelNames [ichan], U")."); if (! Melder_equ (other -> channelNames [ichan].get(), channelNames [ichan].get())) Melder_throw (U"Channel ", ichan, U" has a different name in ", other, U" (", other -> channelNames [ichan].get(), U") than in ", first, U" (", channelNames [ichan].get(), U")."); } } OrderedOf<structSound> soundList; Loading @@ -658,10 +657,7 @@ autoEEG EEGs_concatenate (OrderedOf<structEEG>* me) { } autoEEG thee = Thing_new (EEG); thy numberOfChannels = numberOfChannels; thy channelNames = NUMvector <char32 *> (1, numberOfChannels); for (integer ichan = 1; ichan <= numberOfChannels; ichan ++) { thy channelNames [ichan] = Melder_dup (channelNames [ichan]); } thy channelNames = std::move (channelNames); thy sound = Sounds_concatenate (soundList, 0.0); thy textgrid = TextGrids_concatenate (& textgridList); thy xmin = thy textgrid -> xmin; Loading @@ -676,10 +672,7 @@ autoEEG EEG_extractPart (EEG me, double tmin, double tmax, bool preserveTimes) { try { autoEEG thee = Thing_new (EEG); thy numberOfChannels = my numberOfChannels; thy channelNames = NUMvector <char32 *> (1, my numberOfChannels); for (integer ichan = 1; ichan <= my numberOfChannels; ichan ++) { thy channelNames [ichan] = Melder_dup (my channelNames [ichan]); } thy channelNames. copyFrom (my channelNames); thy sound = Sound_extractPart (my sound.get(), tmin, tmax, kSound_windowShape::RECTANGULAR, 1.0, preserveTimes); thy textgrid = TextGrid_extractPart (my textgrid.get(), tmin, tmax, preserveTimes); thy xmin = thy textgrid -> xmin; Loading Loading @@ -707,7 +700,7 @@ autoMixingMatrix EEG_to_MixingMatrix (EEG me, autoMixingMatrix thee = MixingMatrix_create (my sound -> ny, my sound -> ny); MixingMatrix_setRandomGauss (thee.get(), 0.0, 1.0); for (integer ichan = 1; ichan <= my numberOfChannels; ichan ++) { TableOfReal_setRowLabel (thee.get(), ichan, my channelNames [ichan]); TableOfReal_setRowLabel (thee.get(), ichan, my channelNames [ichan].get()); TableOfReal_setColumnLabel (thee.get(), ichan, Melder_cat (U"ic", ichan)); } MixingMatrix_CrossCorrelationTableList_improveUnmixing (thee.get(), tables.get(), maxNumberOfIterations, tol, method); Loading @@ -722,20 +715,16 @@ autoEEG EEG_MixingMatrix_to_EEG_unmix (EEG me, MixingMatrix you) { U"To be able to unmix, the number of channels in ", me, U" (", my numberOfChannels, U")", U" should be equal to the number of rows in ", you, U" (", your numberOfRows, U")."); for (integer ichan = 1; ichan <= your numberOfRows; ichan ++) { Melder_require (Melder_equ (my channelNames [ichan], your rowLabels [ichan]), Melder_require (Melder_equ (my channelNames [ichan].get(), your rowLabels [ichan].get()), U"To be able to unmix, the name of channel ", ichan, U" should be the same in ", me, U" (where it is ", my channelNames [ichan], U")", U" as in ", you, U" (where it is ", your rowLabels [ichan], U")."); U" should be the same in ", me, U" (where it is ", my channelNames [ichan].get(), U")", U" as in ", you, U" (where it is ", your rowLabels [ichan].get(), U")."); } autoEEG him = EEG_create (my xmin, my xmax); his sound = Sound_MixingMatrix_unmix (my sound.get(), you); his textgrid = Data_copy (my textgrid.get()); his numberOfChannels = your numberOfColumns; his channelNames = NUMvector <char32 *> (1, his numberOfChannels); //his channelNames = NUMstrings_copy (your columnLabels, 1, his numberOfChannels); for (integer ichan = 1; ichan <= his numberOfChannels; ichan ++) { his channelNames [ichan] = Melder_dup (your columnLabels [ichan]); } his channelNames. copyFrom (your columnLabels); return him; } Loading @@ -744,20 +733,16 @@ autoEEG EEG_MixingMatrix_to_EEG_mix (EEG me, MixingMatrix you) { U"To be able to mix, the number of channels in ", me, U" (", my numberOfChannels, U")", U" should be equal to the number of columns in ", you, U" (", your numberOfColumns, U")."); for (integer ichan = 1; ichan <= your numberOfColumns; ichan ++) { Melder_require (Melder_equ (my channelNames [ichan], your columnLabels [ichan]), Melder_require (Melder_equ (my channelNames [ichan].get(), your columnLabels [ichan].get()), U"To be able to mix, the name of channel ", ichan, U" should be the same in ", me, U" (where it is ", my channelNames [ichan], U")", U" as in ", you, U" (where it is ", your columnLabels [ichan], U")."); U" should be the same in ", me, U" (where it is ", my channelNames [ichan].get(), U")", U" as in ", you, U" (where it is ", your columnLabels [ichan].get(), U")."); } autoEEG him = EEG_create (my xmin, my xmax); his sound = Sound_MixingMatrix_mix (my sound.get(), you); his textgrid = Data_copy (my textgrid.get()); his numberOfChannels = your numberOfRows; his channelNames = NUMvector <char32 *> (1, his numberOfChannels); //his channelNames = NUMstrings_copy (your rowLabels, 1, his numberOfChannels); for (integer ichan = 1; ichan <= his numberOfChannels; ichan ++) { his channelNames [ichan] = Melder_dup (your rowLabels [ichan]); } his channelNames. copyFrom (your rowLabels); return him; } Loading EEG/EEG.h +11 −11 Original line number Diff line number Diff line Loading @@ -2,7 +2,7 @@ #define _EEG_h_ /* EEG.h * * Copyright (C) 2011-2012,2014,2015,2017,2018 Paul Boersma * Copyright (C) 2011-2012,2014-2018 Paul Boersma * * This code is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by Loading Loading @@ -31,8 +31,8 @@ autoEEG EEG_readFromBdfFile (MelderFile file); autoEEG EEGs_concatenate (OrderedOf<structEEG>* me); void EEG_init (EEG me, double tmin, double tmax); integer EEG_getChannelNumber (EEG me, const char32 *channelName); void EEG_setChannelName (EEG me, integer channelNumber, const char32 *a_name); integer EEG_getChannelNumber (EEG me, conststring32 channelName); void EEG_setChannelName (EEG me, integer channelNumber, conststring32 newName); static inline integer EEG_getNumberOfCapElectrodes (EEG me) { return (my numberOfChannels - 1) & ~ 15L; // BUG } Loading @@ -42,20 +42,20 @@ static inline integer EEG_getNumberOfExtraSensors (EEG me) { static inline integer EEG_getNumberOfExternalElectrodes (EEG me) { return my numberOfChannels - EEG_getNumberOfCapElectrodes (me) - EEG_getNumberOfExtraSensors (me); } void EEG_setExternalElectrodeNames (EEG me, const char32 *nameExg1, const char32 *nameExg2, const char32 *nameExg3, const char32 *nameExg4, const char32 *nameExg5, const char32 *nameExg6, const char32 *nameExg7, const char32 *nameExg8); void EEG_setExternalElectrodeNames (EEG me, conststring32 nameExg1, conststring32 nameExg2, conststring32 nameExg3, conststring32 nameExg4, conststring32 nameExg5, conststring32 nameExg6, conststring32 nameExg7, conststring32 nameExg8); void EEG_detrend (EEG me); void EEG_filter (EEG me, double lowFrequency, double lowWidth, double highFrequency, double highWidth, bool doNotch50Hz); void EEG_subtractReference (EEG me, const char32 *channelNumber1, const char32 *channelNumber2); void EEG_subtractReference (EEG me, conststring32 channelName1, conststring32 channelName2); void EEG_subtractMeanChannel (EEG me, integer fromChannel, integer toChannel); void EEG_setChannelToZero (EEG me, integer channelNumber); void EEG_setChannelToZero (EEG me, const char32 *channelName); void EEG_removeTriggers (EEG me, kMelder_string which, const char32 *criterion); void EEG_setChannelToZero (EEG me, conststring32 channelName); void EEG_removeTriggers (EEG me, kMelder_string which, conststring32 criterion); autoEEG EEG_extractChannel (EEG me, integer channelNumber); autoEEG EEG_extractChannel (EEG me, const char32 *channelName); autoEEG EEG_extractChannels (EEG me, numvec channelNumbers); autoEEG EEG_extractChannel (EEG me, conststring32 channelName); autoEEG EEG_extractChannels (EEG me, constVEC channelNumbers); void EEG_removeChannel (EEG me, integer channelNumber); void EEG_removeChannel (EEG me, const char32 *channelName); void EEG_removeChannel (EEG me, conststring32 channelName); static inline autoSound EEG_extractSound (EEG me) { return Data_copy (my sound.get()); } static inline autoTextGrid EEG_extractTextGrid (EEG me) { return Data_copy (my textgrid.get()); } autoEEG EEG_extractPart (EEG me, double tmin, double tmax, bool preserveTimes); Loading EEG/EEGWindow.cpp +4 −4 Original line number Diff line number Diff line Loading @@ -39,9 +39,9 @@ void structEEGWindow :: v_createHelpMenuItems (EditorMenu menu) { EditorMenu_addCommand (menu, U"EEGWindow help", '?', menu_cb_EEGWindowHelp); } const char32 * structEEGWindow :: v_getChannelName (integer channelNumber) { conststring32 structEEGWindow :: v_getChannelName (integer channelNumber) { Melder_assert (our eeg != nullptr); return our eeg -> channelNames [channelNumber]; return our eeg -> channelNames [channelNumber].get(); } static void menu_cb_ExtractSelectedEEG_preserveTimes (EEGWindow me, EDITOR_ARGS_DIRECT) { Loading Loading @@ -70,12 +70,12 @@ void structEEGWindow :: v_updateMenuItems_file () { GuiThing_setSensitive (our extractSelectedEEGTimeFromZeroButton, our endSelection > our startSelection); } void EEGWindow_init (EEGWindow me, const char32 *title, EEG eeg) { void EEGWindow_init (EEGWindow me, conststring32 title, EEG eeg) { my eeg = eeg; // before initing, because initing will already draw! TextGridEditor_init (me, title, eeg -> textgrid.get(), eeg -> sound.get(), false, nullptr, nullptr); } autoEEGWindow EEGWindow_create (const char32 *title, EEG eeg) { autoEEGWindow EEGWindow_create (conststring32 title, EEG eeg) { try { autoEEGWindow me = Thing_new (EEGWindow); EEGWindow_init (me.get(), title, eeg); Loading EEG/EEGWindow.h +4 −4 File changed.Preview size limit exceeded, changes collapsed. Show changes Loading
.clang-format 0 → 100644 +115 −0 Original line number Diff line number Diff line --- Language: Cpp AccessModifierOffset: -2 AlignAfterOpenBracket: DontAlign AlignConsecutiveAssignments: false AlignConsecutiveDeclarations: false AlignEscapedNewlines: Right AlignOperands: true AlignTrailingComments: true AllowAllParametersOfDeclarationOnNextLine: true AllowShortBlocksOnASingleLine: true AllowShortCaseLabelsOnASingleLine: false AllowShortFunctionsOnASingleLine: All AllowShortIfStatementsOnASingleLine: true AllowShortLoopsOnASingleLine: true AlwaysBreakAfterDefinitionReturnType: None AlwaysBreakAfterReturnType: None AlwaysBreakBeforeMultilineStrings: false AlwaysBreakTemplateDeclarations: false BinPackArguments: true BinPackParameters: true BraceWrapping: AfterClass: false AfterControlStatement: false AfterEnum: false AfterFunction: false AfterNamespace: false AfterObjCDeclaration: false AfterStruct: false AfterUnion: false AfterExternBlock: false BeforeCatch: false BeforeElse: false IndentBraces: false SplitEmptyFunction: true SplitEmptyRecord: true SplitEmptyNamespace: true BreakBeforeBinaryOperators: None BreakBeforeBraces: Attach BreakBeforeInheritanceComma: false BreakBeforeTernaryOperators: true BreakConstructorInitializersBeforeComma: false BreakConstructorInitializers: BeforeColon BreakAfterJavaFieldAnnotations: false BreakStringLiterals: true ColumnLimit: 80 CommentPragmas: '^ IWYU pragma:' CompactNamespaces: false ConstructorInitializerAllOnOneLineOrOnePerLine: false ConstructorInitializerIndentWidth: 4 ContinuationIndentWidth: 8 Cpp11BracedListStyle: true DerivePointerAlignment: false DisableFormat: false ExperimentalAutoDetectBinPacking: false FixNamespaceComments: true ForEachMacros: - foreach - Q_FOREACH - BOOST_FOREACH IncludeBlocks: Preserve IncludeCategories: - Regex: '^"(llvm|llvm-c|clang|clang-c)/' Priority: 2 - Regex: '^(<|"(gtest|gmock|isl|json)/)' Priority: 3 - Regex: '.*' Priority: 1 IncludeIsMainRegex: '(Test)?$' IndentCaseLabels: false IndentPPDirectives: None IndentWidth: 4 IndentWrappedFunctionNames: false JavaScriptQuotes: Leave JavaScriptWrapImports: true KeepEmptyLinesAtTheStartOfBlocks: true MacroBlockBegin: '' MacroBlockEnd: '' MaxEmptyLinesToKeep: 1 NamespaceIndentation: None ObjCBlockIndentWidth: 2 ObjCSpaceAfterProperty: false ObjCSpaceBeforeProtocolList: true PenaltyBreakAssignment: 2 PenaltyBreakBeforeFirstCallParameter: 19 PenaltyBreakComment: 300 PenaltyBreakFirstLessLess: 120 PenaltyBreakString: 1000 PenaltyExcessCharacter: 1000000 PenaltyReturnTypeOnItsOwnLine: 60 PointerAlignment: Right RawStringFormats: - Delimiter: pb Language: TextProto BasedOnStyle: google ReflowComments: true SortIncludes: false SortUsingDeclarations: false SpaceAfterCStyleCast: true SpaceAfterTemplateKeyword: true SpaceBeforeAssignmentOperators: true SpaceBeforeParens: Always SpaceInEmptyParentheses: false SpacesBeforeTrailingComments: 3 SpacesInAngles: false SpacesInContainerLiterals: true SpacesInCStyleCastParentheses: false SpacesInParentheses: false SpacesInSquareBrackets: false Standard: Cpp11 TabWidth: 4 UseTab: ForIndentation #UseTab: Never ...
EEG/EEG.cpp +59 −74 Original line number Diff line number Diff line Loading @@ -85,12 +85,11 @@ autoEEG EEG_create (double tmin, double tmax) { } } integer EEG_getChannelNumber (EEG me, const char32 *channelName) { integer EEG_getChannelNumber (EEG me, conststring32 channelName) { for (integer ichan = 1; ichan <= my numberOfChannels; ichan ++) { if (Melder_equ (my channelNames [ichan], channelName)) { if (Melder_equ (my channelNames [ichan].get(), channelName)) return ichan; } } return 0; } Loading Loading @@ -125,7 +124,7 @@ autoEEG EEG_readFromBdfFile (MelderFile file) { if (numberOfBytesInHeaderRecord != (numberOfChannels + 1) * 256) Melder_throw (U"Number of bytes in header record (", numberOfBytesInHeaderRecord, U") doesn't match number of channels (", numberOfChannels, U")."); autostring32vector channelNames (1, numberOfChannels); autostring32vector channelNames (numberOfChannels); for (integer ichannel = 1; ichannel <= numberOfChannels; ichannel ++) { fread (buffer, 1, 16, f); buffer [16] = '\0'; // labels of the channels /* Loading @@ -139,9 +138,9 @@ autoEEG EEG_readFromBdfFile (MelderFile file) { } } channelNames [ichannel] = Melder_8to32 (buffer); trace (U"Channel <<", channelNames [ichannel], U">>"); trace (U"Channel <<", channelNames [ichannel].get(), U">>"); } bool hasLetters = str32equ (channelNames [numberOfChannels], U"EDF Annotations"); bool hasLetters = str32equ (channelNames [numberOfChannels].get(), U"EDF Annotations"); double samplingFrequency = undefined; for (integer channel = 1; channel <= numberOfChannels; channel ++) { fread (buffer, 1, 80, f); buffer [80] = '\0'; // transducer type Loading @@ -149,22 +148,22 @@ autoEEG EEG_readFromBdfFile (MelderFile file) { for (integer channel = 1; channel <= numberOfChannels; channel ++) { fread (buffer, 1, 8, f); buffer [8] = '\0'; // physical dimension of channels } autonumvec physicalMinimum (numberOfChannels, kTensorInitializationType::RAW); autoVEC physicalMinimum (numberOfChannels, kTensorInitializationType::RAW); for (integer ichannel = 1; ichannel <= numberOfChannels; ichannel ++) { fread (buffer, 1, 8, f); buffer [8] = '\0'; physicalMinimum [ichannel] = atof (buffer); } autonumvec physicalMaximum (numberOfChannels, kTensorInitializationType::RAW); autoVEC physicalMaximum (numberOfChannels, kTensorInitializationType::RAW); for (integer ichannel = 1; ichannel <= numberOfChannels; ichannel ++) { fread (buffer, 1, 8, f); buffer [8] = '\0'; physicalMaximum [ichannel] = atof (buffer); } autonumvec digitalMinimum (numberOfChannels, kTensorInitializationType::RAW); autoVEC digitalMinimum (numberOfChannels, kTensorInitializationType::RAW); for (integer ichannel = 1; ichannel <= numberOfChannels; ichannel ++) { fread (buffer, 1, 8, f); buffer [8] = '\0'; digitalMinimum [ichannel] = atof (buffer); } autonumvec digitalMaximum (numberOfChannels, kTensorInitializationType::RAW); autoVEC digitalMaximum (numberOfChannels, kTensorInitializationType::RAW); for (integer ichannel = 1; ichannel <= numberOfChannels; ichannel ++) { fread (buffer, 1, 8, f); buffer [8] = '\0'; digitalMaximum [ichannel] = atof (buffer); Loading Loading @@ -193,26 +192,26 @@ autoEEG EEG_readFromBdfFile (MelderFile file) { his numberOfChannels = numberOfChannels; autoSound me = Sound_createSimple (numberOfChannels, duration, samplingFrequency); Melder_assert (my nx == numberOfSamplesPerDataRecord * numberOfDataRecords); autoNUMvector <unsigned char> dataBuffer ((integer) 0, 3 * numberOfSamplesPerDataRecord - 1); autoNUMvector <uint8> dataBuffer ((integer) 0, 3 * numberOfSamplesPerDataRecord - 1); for (integer record = 1; record <= numberOfDataRecords; record ++) { for (integer channel = 1; channel <= numberOfChannels; channel ++) { double factor = channel == numberOfChannels ? 1.0 : physicalMinimum [channel] / digitalMinimum [channel]; if (channel < numberOfChannels - EEG_getNumberOfExtraSensors (him.get())) factor /= 1000000.0; if (is24bit) { fread (& dataBuffer [0], 3, (size_t) numberOfSamplesPerDataRecord, f); unsigned char *p = & dataBuffer [0]; uint8 *p = & dataBuffer [0]; for (integer i = 1; i <= numberOfSamplesPerDataRecord; i ++) { integer sample = i + (record - 1) * numberOfSamplesPerDataRecord; Melder_assert (sample <= my nx); uint8_t lowByte = *p ++, midByte = *p ++, highByte = *p ++; uint32_t externalValue = ((uint32_t) highByte << 16) | ((uint32_t) midByte << 8) | (uint32_t) lowByte; uint8 lowByte = *p ++, midByte = *p ++, highByte = *p ++; uint32 externalValue = ((uint32) highByte << 16) | ((uint32) midByte << 8) | (uint32) lowByte; if ((highByte & 128) != 0) // is the 24-bit sign bit on? externalValue |= 0xFF000000; // extend negative sign to 32 bits my z [channel] [sample] = (int32_t) externalValue * factor; externalValue |= 0xFF00'0000; // extend negative sign to 32 bits my z [channel] [sample] = (int32) externalValue * factor; } } else { fread (& dataBuffer [0], 2, (size_t) numberOfSamplesPerDataRecord, f); unsigned char *p = & dataBuffer [0]; uint8 *p = & dataBuffer [0]; for (integer i = 1; i <= numberOfSamplesPerDataRecord; i ++) { integer sample = i + (record - 1) * numberOfSamplesPerDataRecord; Melder_assert (sample <= my nx); Loading @@ -226,7 +225,7 @@ autoEEG EEG_readFromBdfFile (MelderFile file) { int numberOfStatusBits = 8; for (integer i = 1; i <= my nx; i ++) { uint32 value = (uint32) (int32) my z [numberOfChannels] [i]; if (value & 0x0000FF00) { if (value & 0x0000'FF00) { numberOfStatusBits = 16; } } Loading @@ -237,9 +236,9 @@ autoEEG EEG_readFromBdfFile (MelderFile file) { double time = undefined; for (integer i = 1; i <= my nx; i ++) { uint32 value = (uint32) (int32) my z [numberOfChannels] [i]; for (int byte = 1; byte <= numberOfStatusBits / 8; byte ++) { uint32 mask = byte == 1 ? 0x000000ff : 0x0000ff00; char32 kar = byte == 1 ? (value & mask) : (value & mask) >> 8; for (int ibyte = 1; ibyte <= numberOfStatusBits / 8; ibyte ++) { uint32 mask = ( ibyte == 1 ? 0x0000'00ff : 0x0000'ff00 ); char32 kar = ( ibyte == 1 ? (value & mask) : (value & mask) >> 8 ); if (kar != U'\0' && kar != 20) { MelderString_appendCharacter (& letters, kar); } else if (letters. string [0] != U'\0') { Loading Loading @@ -302,7 +301,7 @@ autoEEG EEG_readFromBdfFile (MelderFile file) { } } f.close (file); his channelNames = channelNames.transfer(); his channelNames = std::move (channelNames); his sound = me.move(); his textgrid = thee.move(); if (EEG_getNumberOfCapElectrodes (him.get()) == 32) { Loading Loading @@ -449,15 +448,13 @@ void EEG_filter (EEG me, double lowFrequency, double lowWidth, double highFreque } } void EEG_setChannelName (EEG me, integer channelNumber, const char32 *a_name) { autostring32 l_name = Melder_dup (a_name); Melder_free (my channelNames [channelNumber]); my channelNames [channelNumber] = l_name.transfer(); void EEG_setChannelName (EEG me, integer channelNumber, conststring32 newName) { my channelNames [channelNumber] = Melder_dup (newName); } void EEG_setExternalElectrodeNames (EEG me, const char32 *nameExg1, const char32 *nameExg2, const char32 *nameExg3, const char32 *nameExg4, const char32 *nameExg5, const char32 *nameExg6, const char32 *nameExg7, const char32 *nameExg8) conststring32 nameExg1, conststring32 nameExg2, conststring32 nameExg3, conststring32 nameExg4, conststring32 nameExg5, conststring32 nameExg6, conststring32 nameExg7, conststring32 nameExg8) { if (EEG_getNumberOfExternalElectrodes (me) != 8) Melder_throw (U"There aren't 8 external electrodes."); Loading @@ -472,13 +469,13 @@ void EEG_setExternalElectrodeNames (EEG me, EEG_setChannelName (me, firstExternalElectrode + 7, nameExg8); } void EEG_subtractReference (EEG me, const char32 *channelNumber1_text, const char32 *channelNumber2_text) { integer channelNumber1 = EEG_getChannelNumber (me, channelNumber1_text); void EEG_subtractReference (EEG me, conststring32 channelName1, conststring32 channelName2) { integer channelNumber1 = EEG_getChannelNumber (me, channelName1); if (channelNumber1 == 0) Melder_throw (me, U": no channel named \"", channelNumber1_text, U"\"."); integer channelNumber2 = EEG_getChannelNumber (me, channelNumber2_text); if (channelNumber2 == 0 && channelNumber2_text [0] != '\0') Melder_throw (me, U": no channel named \"", channelNumber2_text, U"\"."); Melder_throw (me, U": no channel named \"", channelName1, U"\"."); integer channelNumber2 = EEG_getChannelNumber (me, channelName2); if (channelNumber2 == 0 && channelName2 [0] != '\0') Melder_throw (me, U": no channel named \"", channelName2, U"\"."); const integer numberOfElectrodeChannels = my numberOfChannels - EEG_getNumberOfExtraSensors (me); for (integer isamp = 1; isamp <= my sound -> nx; isamp ++) { double referenceValue = channelNumber2 == 0 ? my sound -> z [channelNumber1] [isamp] : Loading Loading @@ -523,7 +520,7 @@ void EEG_setChannelToZero (EEG me, integer channelNumber) { } } void EEG_setChannelToZero (EEG me, const char32 *channelName) { void EEG_setChannelToZero (EEG me, conststring32 channelName) { try { integer channelNumber = EEG_getChannelNumber (me, channelName); if (channelNumber == 0) Loading @@ -534,9 +531,9 @@ void EEG_setChannelToZero (EEG me, const char32 *channelName) { } } void EEG_removeTriggers (EEG me, kMelder_string which, const char32 *criterion) { void EEG_removeTriggers (EEG me, kMelder_string which, conststring32 criterion) { try { if (my textgrid -> tiers->size < 2 || ! Melder_equ (my textgrid -> tiers->at [2] -> name, U"Trigger")) if (my textgrid -> tiers->size < 2 || ! Melder_equ (my textgrid -> tiers->at [2] -> name.get(), U"Trigger")) Melder_throw (me, U" does not have a Trigger channel."); TextGrid_removePoints (my textgrid.get(), 2, which, criterion); } catch (MelderError) { Loading @@ -550,8 +547,8 @@ autoEEG EEG_extractChannel (EEG me, integer channelNumber) { Melder_throw (U"No channel ", channelNumber, U"."); autoEEG thee = EEG_create (my xmin, my xmax); thy numberOfChannels = 1; thy channelNames = NUMvector <char32 *> (1, 1); thy channelNames [1] = Melder_dup (my channelNames [1]); thy channelNames = autostring32vector (1); thy channelNames [1] = Melder_dup (my channelNames [1].get()); thy sound = Sound_extractChannel (my sound.get(), channelNumber); thy textgrid = Data_copy (my textgrid.get()); return thee; Loading @@ -560,7 +557,7 @@ autoEEG EEG_extractChannel (EEG me, integer channelNumber) { } } autoEEG EEG_extractChannel (EEG me, const char32 *channelName) { autoEEG EEG_extractChannel (EEG me, conststring32 channelName) { try { integer channelNumber = EEG_getChannelNumber (me, channelName); if (channelNumber == 0) Loading @@ -571,7 +568,7 @@ autoEEG EEG_extractChannel (EEG me, const char32 *channelName) { } } autoEEG EEG_extractChannels (EEG me, numvec channelNumbers) { autoEEG EEG_extractChannels (EEG me, constVEC channelNumbers) { try { integer numberOfChannels = channelNumbers.size; Melder_require (numberOfChannels > 0, Loading @@ -579,10 +576,10 @@ autoEEG EEG_extractChannels (EEG me, numvec channelNumbers) { autoEEG you = EEG_create (my xmin, my xmax); your sound = Sound_extractChannels (my sound.get(), channelNumbers); your numberOfChannels = numberOfChannels; your channelNames = NUMvector <char32 *> (1, numberOfChannels); your channelNames = autostring32vector (numberOfChannels); for (integer ichan = 1; ichan <= numberOfChannels; ichan ++) { integer originalChannelNumber = Melder_iround (channelNumbers [ichan]); your channelNames [ichan] = Melder_dup (my channelNames [originalChannelNumber]); your channelNames [ichan] = Melder_dup (my channelNames [originalChannelNumber].get()); } your textgrid = Data_copy (my textgrid.get()); return you; Loading Loading @@ -611,10 +608,10 @@ void EEG_removeChannel (EEG me, integer channelNumber) { try { if (channelNumber < 1 || channelNumber > my numberOfChannels) Melder_throw (U"No channel ", channelNumber, U"."); Melder_free (my channelNames [channelNumber]); for (integer ichan = channelNumber; ichan < my numberOfChannels; ichan ++) { my channelNames [ichan] = my channelNames [ichan + 1]; my channelNames [ichan] = my channelNames [ichan + 1].move(); } my channelNames [my numberOfChannels]. reset(); my numberOfChannels -= 1; Sound_removeChannel (my sound.get(), channelNumber); } catch (MelderError) { Loading @@ -622,7 +619,7 @@ void EEG_removeChannel (EEG me, integer channelNumber) { } } void EEG_removeChannel (EEG me, const char32 *channelName) { void EEG_removeChannel (EEG me, conststring32 channelName) { try { integer channelNumber = EEG_getChannelNumber (me, channelName); if (channelNumber == 0) Loading @@ -639,14 +636,16 @@ autoEEG EEGs_concatenate (OrderedOf<structEEG>* me) { Melder_throw (U"Cannot concatenate zero EEG objects."); EEG first = my at [1]; integer numberOfChannels = first -> numberOfChannels; char32 **channelNames = first -> channelNames; autostring32vector channelNames; channelNames. copyFrom (first -> channelNames); for (integer ieeg = 2; ieeg <= my size; ieeg ++) { EEG other = my at [ieeg]; if (other -> numberOfChannels != numberOfChannels) Melder_throw (U"The number of channels of ", other, U" does not match the number of channels of ", first, U"."); for (integer ichan = 1; ichan <= numberOfChannels; ichan ++) { if (! Melder_equ (other -> channelNames [ichan], channelNames [ichan])) Melder_throw (U"Channel ", ichan, U" has a different name in ", other, U" (", other -> channelNames [ichan], U") than in ", first, U" (", channelNames [ichan], U")."); if (! Melder_equ (other -> channelNames [ichan].get(), channelNames [ichan].get())) Melder_throw (U"Channel ", ichan, U" has a different name in ", other, U" (", other -> channelNames [ichan].get(), U") than in ", first, U" (", channelNames [ichan].get(), U")."); } } OrderedOf<structSound> soundList; Loading @@ -658,10 +657,7 @@ autoEEG EEGs_concatenate (OrderedOf<structEEG>* me) { } autoEEG thee = Thing_new (EEG); thy numberOfChannels = numberOfChannels; thy channelNames = NUMvector <char32 *> (1, numberOfChannels); for (integer ichan = 1; ichan <= numberOfChannels; ichan ++) { thy channelNames [ichan] = Melder_dup (channelNames [ichan]); } thy channelNames = std::move (channelNames); thy sound = Sounds_concatenate (soundList, 0.0); thy textgrid = TextGrids_concatenate (& textgridList); thy xmin = thy textgrid -> xmin; Loading @@ -676,10 +672,7 @@ autoEEG EEG_extractPart (EEG me, double tmin, double tmax, bool preserveTimes) { try { autoEEG thee = Thing_new (EEG); thy numberOfChannels = my numberOfChannels; thy channelNames = NUMvector <char32 *> (1, my numberOfChannels); for (integer ichan = 1; ichan <= my numberOfChannels; ichan ++) { thy channelNames [ichan] = Melder_dup (my channelNames [ichan]); } thy channelNames. copyFrom (my channelNames); thy sound = Sound_extractPart (my sound.get(), tmin, tmax, kSound_windowShape::RECTANGULAR, 1.0, preserveTimes); thy textgrid = TextGrid_extractPart (my textgrid.get(), tmin, tmax, preserveTimes); thy xmin = thy textgrid -> xmin; Loading Loading @@ -707,7 +700,7 @@ autoMixingMatrix EEG_to_MixingMatrix (EEG me, autoMixingMatrix thee = MixingMatrix_create (my sound -> ny, my sound -> ny); MixingMatrix_setRandomGauss (thee.get(), 0.0, 1.0); for (integer ichan = 1; ichan <= my numberOfChannels; ichan ++) { TableOfReal_setRowLabel (thee.get(), ichan, my channelNames [ichan]); TableOfReal_setRowLabel (thee.get(), ichan, my channelNames [ichan].get()); TableOfReal_setColumnLabel (thee.get(), ichan, Melder_cat (U"ic", ichan)); } MixingMatrix_CrossCorrelationTableList_improveUnmixing (thee.get(), tables.get(), maxNumberOfIterations, tol, method); Loading @@ -722,20 +715,16 @@ autoEEG EEG_MixingMatrix_to_EEG_unmix (EEG me, MixingMatrix you) { U"To be able to unmix, the number of channels in ", me, U" (", my numberOfChannels, U")", U" should be equal to the number of rows in ", you, U" (", your numberOfRows, U")."); for (integer ichan = 1; ichan <= your numberOfRows; ichan ++) { Melder_require (Melder_equ (my channelNames [ichan], your rowLabels [ichan]), Melder_require (Melder_equ (my channelNames [ichan].get(), your rowLabels [ichan].get()), U"To be able to unmix, the name of channel ", ichan, U" should be the same in ", me, U" (where it is ", my channelNames [ichan], U")", U" as in ", you, U" (where it is ", your rowLabels [ichan], U")."); U" should be the same in ", me, U" (where it is ", my channelNames [ichan].get(), U")", U" as in ", you, U" (where it is ", your rowLabels [ichan].get(), U")."); } autoEEG him = EEG_create (my xmin, my xmax); his sound = Sound_MixingMatrix_unmix (my sound.get(), you); his textgrid = Data_copy (my textgrid.get()); his numberOfChannels = your numberOfColumns; his channelNames = NUMvector <char32 *> (1, his numberOfChannels); //his channelNames = NUMstrings_copy (your columnLabels, 1, his numberOfChannels); for (integer ichan = 1; ichan <= his numberOfChannels; ichan ++) { his channelNames [ichan] = Melder_dup (your columnLabels [ichan]); } his channelNames. copyFrom (your columnLabels); return him; } Loading @@ -744,20 +733,16 @@ autoEEG EEG_MixingMatrix_to_EEG_mix (EEG me, MixingMatrix you) { U"To be able to mix, the number of channels in ", me, U" (", my numberOfChannels, U")", U" should be equal to the number of columns in ", you, U" (", your numberOfColumns, U")."); for (integer ichan = 1; ichan <= your numberOfColumns; ichan ++) { Melder_require (Melder_equ (my channelNames [ichan], your columnLabels [ichan]), Melder_require (Melder_equ (my channelNames [ichan].get(), your columnLabels [ichan].get()), U"To be able to mix, the name of channel ", ichan, U" should be the same in ", me, U" (where it is ", my channelNames [ichan], U")", U" as in ", you, U" (where it is ", your columnLabels [ichan], U")."); U" should be the same in ", me, U" (where it is ", my channelNames [ichan].get(), U")", U" as in ", you, U" (where it is ", your columnLabels [ichan].get(), U")."); } autoEEG him = EEG_create (my xmin, my xmax); his sound = Sound_MixingMatrix_mix (my sound.get(), you); his textgrid = Data_copy (my textgrid.get()); his numberOfChannels = your numberOfRows; his channelNames = NUMvector <char32 *> (1, his numberOfChannels); //his channelNames = NUMstrings_copy (your rowLabels, 1, his numberOfChannels); for (integer ichan = 1; ichan <= his numberOfChannels; ichan ++) { his channelNames [ichan] = Melder_dup (your rowLabels [ichan]); } his channelNames. copyFrom (your rowLabels); return him; } Loading
EEG/EEG.h +11 −11 Original line number Diff line number Diff line Loading @@ -2,7 +2,7 @@ #define _EEG_h_ /* EEG.h * * Copyright (C) 2011-2012,2014,2015,2017,2018 Paul Boersma * Copyright (C) 2011-2012,2014-2018 Paul Boersma * * This code is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by Loading Loading @@ -31,8 +31,8 @@ autoEEG EEG_readFromBdfFile (MelderFile file); autoEEG EEGs_concatenate (OrderedOf<structEEG>* me); void EEG_init (EEG me, double tmin, double tmax); integer EEG_getChannelNumber (EEG me, const char32 *channelName); void EEG_setChannelName (EEG me, integer channelNumber, const char32 *a_name); integer EEG_getChannelNumber (EEG me, conststring32 channelName); void EEG_setChannelName (EEG me, integer channelNumber, conststring32 newName); static inline integer EEG_getNumberOfCapElectrodes (EEG me) { return (my numberOfChannels - 1) & ~ 15L; // BUG } Loading @@ -42,20 +42,20 @@ static inline integer EEG_getNumberOfExtraSensors (EEG me) { static inline integer EEG_getNumberOfExternalElectrodes (EEG me) { return my numberOfChannels - EEG_getNumberOfCapElectrodes (me) - EEG_getNumberOfExtraSensors (me); } void EEG_setExternalElectrodeNames (EEG me, const char32 *nameExg1, const char32 *nameExg2, const char32 *nameExg3, const char32 *nameExg4, const char32 *nameExg5, const char32 *nameExg6, const char32 *nameExg7, const char32 *nameExg8); void EEG_setExternalElectrodeNames (EEG me, conststring32 nameExg1, conststring32 nameExg2, conststring32 nameExg3, conststring32 nameExg4, conststring32 nameExg5, conststring32 nameExg6, conststring32 nameExg7, conststring32 nameExg8); void EEG_detrend (EEG me); void EEG_filter (EEG me, double lowFrequency, double lowWidth, double highFrequency, double highWidth, bool doNotch50Hz); void EEG_subtractReference (EEG me, const char32 *channelNumber1, const char32 *channelNumber2); void EEG_subtractReference (EEG me, conststring32 channelName1, conststring32 channelName2); void EEG_subtractMeanChannel (EEG me, integer fromChannel, integer toChannel); void EEG_setChannelToZero (EEG me, integer channelNumber); void EEG_setChannelToZero (EEG me, const char32 *channelName); void EEG_removeTriggers (EEG me, kMelder_string which, const char32 *criterion); void EEG_setChannelToZero (EEG me, conststring32 channelName); void EEG_removeTriggers (EEG me, kMelder_string which, conststring32 criterion); autoEEG EEG_extractChannel (EEG me, integer channelNumber); autoEEG EEG_extractChannel (EEG me, const char32 *channelName); autoEEG EEG_extractChannels (EEG me, numvec channelNumbers); autoEEG EEG_extractChannel (EEG me, conststring32 channelName); autoEEG EEG_extractChannels (EEG me, constVEC channelNumbers); void EEG_removeChannel (EEG me, integer channelNumber); void EEG_removeChannel (EEG me, const char32 *channelName); void EEG_removeChannel (EEG me, conststring32 channelName); static inline autoSound EEG_extractSound (EEG me) { return Data_copy (my sound.get()); } static inline autoTextGrid EEG_extractTextGrid (EEG me) { return Data_copy (my textgrid.get()); } autoEEG EEG_extractPart (EEG me, double tmin, double tmax, bool preserveTimes); Loading
EEG/EEGWindow.cpp +4 −4 Original line number Diff line number Diff line Loading @@ -39,9 +39,9 @@ void structEEGWindow :: v_createHelpMenuItems (EditorMenu menu) { EditorMenu_addCommand (menu, U"EEGWindow help", '?', menu_cb_EEGWindowHelp); } const char32 * structEEGWindow :: v_getChannelName (integer channelNumber) { conststring32 structEEGWindow :: v_getChannelName (integer channelNumber) { Melder_assert (our eeg != nullptr); return our eeg -> channelNames [channelNumber]; return our eeg -> channelNames [channelNumber].get(); } static void menu_cb_ExtractSelectedEEG_preserveTimes (EEGWindow me, EDITOR_ARGS_DIRECT) { Loading Loading @@ -70,12 +70,12 @@ void structEEGWindow :: v_updateMenuItems_file () { GuiThing_setSensitive (our extractSelectedEEGTimeFromZeroButton, our endSelection > our startSelection); } void EEGWindow_init (EEGWindow me, const char32 *title, EEG eeg) { void EEGWindow_init (EEGWindow me, conststring32 title, EEG eeg) { my eeg = eeg; // before initing, because initing will already draw! TextGridEditor_init (me, title, eeg -> textgrid.get(), eeg -> sound.get(), false, nullptr, nullptr); } autoEEGWindow EEGWindow_create (const char32 *title, EEG eeg) { autoEEGWindow EEGWindow_create (conststring32 title, EEG eeg) { try { autoEEGWindow me = Thing_new (EEGWindow); EEGWindow_init (me.get(), title, eeg); Loading