Skip to content

Commit 994793d

Browse files
committed
Refactor ProbeSettings to allow settings with different numbers of electrodes
1 parent 39e5f6f commit 994793d

15 files changed

+100
-114
lines changed

Source/Devices/Neuropixels1.cpp

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ Neuropixels1::Neuropixels1 (std::string name, std::string hubName, OnixDeviceTyp
4747
{
4848
}
4949

50-
void Neuropixels1::setSettings (ProbeSettings<NeuropixelsV1Values::numberOfChannels, NeuropixelsV1Values::numberOfElectrodes>* settings_, int index)
50+
void Neuropixels1::setSettings (ProbeSettings* settings_, int index)
5151
{
5252
if (index >= settings.size())
5353
{
@@ -169,9 +169,9 @@ void Neuropixels1::updateLfpOffsets (std::array<float, numLfpSamples>& samples,
169169
}
170170
}
171171

172-
void Neuropixels1::defineMetadata (ProbeSettings<numberOfChannels, numberOfElectrodes>* settings)
172+
void Neuropixels1::defineMetadata (ProbeSettings* settings, ProbeType probeType)
173173
{
174-
settings->probeType = ProbeType::NPX_V1;
174+
settings->probeType = probeType;
175175
settings->probeMetadata.name = "Neuropixels 1.0";
176176

177177
std::vector<std::array<float, 2>> shankOutline {
@@ -200,13 +200,6 @@ void Neuropixels1::defineMetadata (ProbeSettings<numberOfChannels, numberOfElect
200200
settings->probeMetadata.num_adcs = 32; // NB: Is this right for 1.0e?
201201
settings->probeMetadata.adc_bits = 10; // NB: Is this right for 1.0e?
202202

203-
settings->availableBanks = {
204-
Bank::A,
205-
Bank::B,
206-
Bank::C,
207-
Bank::NONE // disconnected
208-
};
209-
210203
Array<float> xpositions = { 27.0f, 59.0f, 11.0f, 43.0f };
211204

212205
for (int i = 0; i < numberOfElectrodes; i++)
@@ -296,8 +289,6 @@ void Neuropixels1::defineMetadata (ProbeSettings<numberOfChannels, numberOfElect
296289
settings->electrodeConfigurationIndex = (int32_t) ElectrodeConfiguration::BankA;
297290
auto selection = selectElectrodeConfiguration (settings->electrodeConfigurationIndex);
298291
settings->selectElectrodes (selection);
299-
300-
settings->isValid = true;
301292
}
302293

303294
uint64_t Neuropixels1::getProbeSerialNumber (int index)

Source/Devices/Neuropixels1.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,12 +47,12 @@ class Neuropixels1 : public INeuropixel<NeuropixelsV1Values::numberOfChannels, N
4747
void setGainCalibrationFilePath (std::string filepath);
4848

4949
// INeuropixels methods
50-
void defineMetadata (ProbeSettings<numberOfChannels, numberOfElectrodes>* settings) override;
50+
void defineMetadata (ProbeSettings* settings, ProbeType probeType) override;
5151

5252
/** Select a preset electrode configuration, based on the index of the given enum */
5353
std::vector<int> selectElectrodeConfiguration (int electrodeConfigurationIndex) override;
5454

55-
void setSettings (ProbeSettings<numberOfChannels, numberOfElectrodes>* settings_, int index = 0) override;
55+
void setSettings (ProbeSettings* settings_, int index = 0) override;
5656

5757
uint64_t getProbeSerialNumber (int index = 0) override;
5858
std::string getProbePartNumber (int index = 0) override;

Source/Devices/Neuropixels1e.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ Neuropixels1e::Neuropixels1e (std::string name, std::string hubName, const oni_d
107107
"lfp");
108108
streamInfos.add (lfpStream);
109109

110-
defineMetadata (settings[0].get());
110+
defineMetadata (settings[0].get(), ProbeType::NPX_V1);
111111

112112
adcCalibrationFilePath = "None";
113113
gainCalibrationFilePath = "None";

Source/Devices/Neuropixels1f.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ Neuropixels1f::Neuropixels1f (std::string name, std::string hubName, const oni_d
9595
"lfp");
9696
streamInfos.add (lfpStream);
9797

98-
defineMetadata (settings[0].get());
98+
defineMetadata (settings[0].get(), ProbeType::NPX_V1);
9999

100100
adcCalibrationFilePath = "None";
101101
gainCalibrationFilePath = "None";

Source/Devices/Neuropixels2e.cpp

Lines changed: 17 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -27,14 +27,14 @@ using namespace OnixSourcePlugin;
2727
Neuropixels2e::Neuropixels2e (std::string name, std::string hubName, const oni_dev_idx_t deviceIdx_, std::shared_ptr<Onix1> ctx_)
2828
: OnixDevice (name, hubName, Neuropixels2e::getDeviceType(), deviceIdx_, ctx_, true),
2929
I2CRegisterContext (ProbeI2CAddress, deviceIdx_, ctx_),
30-
INeuropixel (NeuropixelsV2eValues::numberOfSettings, NeuropixelsV2eValues::numberOfShanks)
30+
INeuropixel (NeuropixelsV2eValues::numberOfSettings, NeuropixelsV2eValues::quadShankCount)
3131
{
3232
frameCount.fill (0);
3333
sampleNumber.fill (0);
3434

3535
for (int i = 0; i < NeuropixelsV2eValues::numberOfSettings; i++)
3636
{
37-
defineMetadata (settings[i].get());
37+
defineMetadata (settings[i].get(), ProbeType::NPX_V2_QUAD_SHANK);
3838
}
3939

4040
for (int i = 0; i < NumberOfProbes; i++)
@@ -592,7 +592,7 @@ void Neuropixels2e::processFrames()
592592
}
593593
}
594594

595-
void Neuropixels2e::writeConfiguration (ProbeSettings<numberOfChannels, numberOfElectrodes>* settings)
595+
void Neuropixels2e::writeConfiguration (ProbeSettings* settings)
596596
{
597597
auto baseBits = makeBaseBits (getReference (settings->referenceIndex));
598598
writeShiftRegister (SR_CHAIN5, baseBits[0]);
@@ -710,7 +710,7 @@ Neuropixels2e::BaseBitsArray Neuropixels2e::makeBaseBits (NeuropixelsV2Reference
710710
return baseBits;
711711
}
712712

713-
Neuropixels2e::ShankBitsArray Neuropixels2e::makeShankBits (NeuropixelsV2Reference reference, std::array<ElectrodeMetadata, numberOfElectrodes> channelMap)
713+
Neuropixels2e::ShankBitsArray Neuropixels2e::makeShankBits (NeuropixelsV2Reference reference, std::vector<ElectrodeMetadata> channelMap)
714714
{
715715
ShankBitsArray shankBits;
716716

@@ -760,7 +760,7 @@ Neuropixels2e::ShankBitsArray Neuropixels2e::makeShankBits (NeuropixelsV2Referen
760760
return shankBits;
761761
}
762762

763-
void Neuropixels2e::setSettings (ProbeSettings<NeuropixelsV2eValues::numberOfChannels, NeuropixelsV2eValues::numberOfElectrodes>* settings_, int index)
763+
void Neuropixels2e::setSettings (ProbeSettings* settings_, int index)
764764
{
765765
if (index >= settings.size())
766766
{
@@ -771,12 +771,13 @@ void Neuropixels2e::setSettings (ProbeSettings<NeuropixelsV2eValues::numberOfCha
771771
settings[index]->updateProbeSettings (settings_);
772772
}
773773

774-
void Neuropixels2e::defineMetadata (ProbeSettings<numberOfChannels, numberOfElectrodes>* settings)
774+
void Neuropixels2e::defineMetadata (ProbeSettings* settings, ProbeType probeType)
775775
{
776-
auto shankCount = NeuropixelsV2eValues::numberOfShanks;
776+
settings->probeType = probeType;
777777

778-
settings->probeType = ProbeType::NPX_V2;
779-
settings->probeMetadata.name = "Neuropixels 2.0e" + (shankCount == 1) ? " - Single Shank" : " - Quad Shank";
778+
auto shankCount = probeType == ProbeType::NPX_V2_QUAD_SHANK ? NeuropixelsV2eValues::quadShankCount : NeuropixelsV2eValues::singleShankCount;
779+
780+
settings->probeMetadata.name = "Neuropixels 2.0e" + (probeType == ProbeType::NPX_V2_QUAD_SHANK) ? " - Single Shank" : " - Quad Shank";
780781

781782
constexpr float shankTipY = 0.0f;
782783
constexpr float shankBaseY = 155.0f;
@@ -787,8 +788,8 @@ void Neuropixels2e::defineMetadata (ProbeSettings<numberOfChannels, numberOfElec
787788
constexpr float shankPitchX = 250.0f;
788789

789790
std::vector<std::array<float, 2>> probeContour {
790-
{ 0, probeLengthY },
791-
{ 0, shankLengthY },
791+
{0, probeLengthY},
792+
{0, shankLengthY},
792793
};
793794

794795
for (int i = 0; i < shankCount; i++)
@@ -805,11 +806,11 @@ void Neuropixels2e::defineMetadata (ProbeSettings<numberOfChannels, numberOfElec
805806
probeContour.emplace_back (std::array<float, 2> { 0.0f, probeLengthY });
806807

807808
std::vector<std::array<float, 2>> shankOutline {
808-
{ 27, 31 },
809-
{ 27, 514 },
810-
{ 27 + 5, 522 },
811-
{ 27 + 10, 514 },
812-
{ 27 + 10, 31 }
809+
{ 27, 31},
810+
{ 27, 514},
811+
{ 27 + 5, 522},
812+
{27 + 10, 514},
813+
{27 + 10, 31}
813814
};
814815

815816
settings->probeMetadata.shank_count = shankCount;
@@ -821,14 +822,6 @@ void Neuropixels2e::defineMetadata (ProbeSettings<numberOfChannels, numberOfElec
821822
settings->probeMetadata.num_adcs = 24;
822823
settings->probeMetadata.adc_bits = 12;
823824

824-
settings->availableBanks = {
825-
Bank::A,
826-
Bank::B,
827-
Bank::C,
828-
Bank::D,
829-
Bank::NONE // disconnected
830-
};
831-
832825
for (int i = 0; i < settings->probeMetadata.electrodes_per_shank * settings->probeMetadata.shank_count; i++)
833826
{
834827
ElectrodeMetadata metadata;

Source/Devices/Neuropixels2e.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ enum class NeuropixelsV2Status : uint32_t
4646
/*
4747
Configures and streams data from a Neuropixels 2.0e device (aka a configured raw deserializer)
4848
*/
49-
class Neuropixels2e : public INeuropixel<NeuropixelsV2eValues::numberOfChannels, NeuropixelsV2eValues::numberOfElectrodes>,
49+
class Neuropixels2e : public INeuropixel<NeuropixelsV2eValues::numberOfChannels, NeuropixelsV2eValues::numberOfQuadShankElectrodes>,
5050
public OnixDevice,
5151
public I2CRegisterContext
5252
{
@@ -76,7 +76,7 @@ class Neuropixels2e : public INeuropixel<NeuropixelsV2eValues::numberOfChannels,
7676
using ShankBitsArray = std::array<std::bitset<registersPerShank>, 4>;
7777

7878
BaseBitsArray static makeBaseBits (NeuropixelsV2Reference reference);
79-
ShankBitsArray static makeShankBits (NeuropixelsV2Reference reference, std::array<ElectrodeMetadata, NeuropixelsV2eValues::numberOfElectrodes> channelMap);
79+
ShankBitsArray static makeShankBits (NeuropixelsV2Reference reference, std::vector<ElectrodeMetadata> channelMap);
8080

8181
template <int N>
8282
void writeShiftRegister (uint32_t srAddress, std::bitset<N> bits);
@@ -91,8 +91,8 @@ class Neuropixels2e : public INeuropixel<NeuropixelsV2eValues::numberOfChannels,
9191
std::string getProbePartNumber (int index) override;
9292
std::string getFlexPartNumber (int index) override;
9393
std::string getFlexVersion (int index) override;
94-
void defineMetadata (ProbeSettings<NeuropixelsV2eValues::numberOfChannels, NeuropixelsV2eValues::numberOfElectrodes>*) override;
95-
void setSettings (ProbeSettings<numberOfChannels, numberOfElectrodes>* settings_, int index) override;
94+
void defineMetadata (ProbeSettings* settings, ProbeType probeType) override;
95+
void setSettings (ProbeSettings* settings_, int index) override;
9696
static OnixDeviceType getDeviceType();
9797

9898
private:
@@ -120,7 +120,7 @@ class Neuropixels2e : public INeuropixel<NeuropixelsV2eValues::numberOfChannels,
120120
static void selectProbe (I2CRegisterContext* serializer, uint8_t probeSelect);
121121

122122
void configureProbeStreaming();
123-
void writeConfiguration (ProbeSettings<numberOfChannels, numberOfElectrodes>*);
123+
void writeConfiguration (ProbeSettings*);
124124

125125
void selectElectrodesInRange (std::vector<int>& selection, int startIndex, int numberOfElectrodes);
126126
void selectElectrodesAcrossShanks (std::vector<int>& selection, int startIndex, int numberOfElectrodes);

Source/Formats/ProbeInterface.h

Lines changed: 3 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,7 @@ class ProbeInterfaceJson
3737
return File (recordingDirectory.getFullPathName() + File::getSeparatorString() + String (name) + String (ProbeInterfaceJson::FileExtension));
3838
}
3939

40-
template <int numChannels, int numElectrodes>
41-
static bool writeProbeSettingsToJson (File& file, ProbeSettings<numChannels, numElectrodes>* settings)
40+
static bool writeProbeSettingsToJson (File& file, ProbeSettings* settings)
4241
{
4342
DynamicObject output;
4443

@@ -88,8 +87,7 @@ class ProbeInterfaceJson
8887
DynamicObject::Ptr probe = new DynamicObject();
8988
DynamicObject::Ptr annotations = new DynamicObject();
9089
annotations->setProperty (Identifier ("manufacturer"), "imec");
91-
auto probeName = getProbeName (settings->probeType);
92-
annotations->setProperty (Identifier ("name"), String (probeName));
90+
annotations->setProperty (Identifier ("name"), String (settings->probeMetadata.name));
9391

9492
probe->setProperty (Identifier ("ndim"), 2);
9593
probe->setProperty (Identifier ("si_units"), "um");
@@ -127,8 +125,7 @@ class ProbeInterfaceJson
127125
return true;
128126
}
129127

130-
template <int numChannels, int numElectrodes>
131-
static bool readProbeSettingsFromJson (File& file, ProbeSettings<numChannels, numElectrodes>* settings)
128+
static bool readProbeSettingsFromJson (File& file, ProbeSettings* settings)
132129
{
133130
auto json = JSON::parse (file);
134131

@@ -290,7 +287,6 @@ class ProbeInterfaceJson
290287
settings->electrodeMetadata[ch].shank = int (shank_ids->getReference (ch));
291288
}
292289

293-
settings->clearElectrodeSelection();
294290
std::vector<int> selectedChannels {};
295291

296292
for (int ch = 0; ch < device_channel_indices->size(); ch++)
@@ -311,20 +307,5 @@ class ProbeInterfaceJson
311307

312308
return true;
313309
}
314-
315-
static std::string getProbeName (ProbeType type)
316-
{
317-
switch (type)
318-
{
319-
case OnixSourcePlugin::ProbeType::NONE:
320-
return "";
321-
case OnixSourcePlugin::ProbeType::NPX_V1:
322-
return "Neuropixels 1.0";
323-
case OnixSourcePlugin::ProbeType::NPX_V2:
324-
return "Neuropixels 2.0";
325-
default:
326-
return "";
327-
}
328-
}
329310
};
330311
} // namespace OnixSourcePlugin

0 commit comments

Comments
 (0)