Skip to content

Commit ca4f131

Browse files
committed
Add Neuropixels 2.0 single-shank
- Add drop-down menu for NPX 2.0e devices to switch between quad- and single-shank probes
1 parent 2f6359f commit ca4f131

9 files changed

+617
-505
lines changed

Source/Devices/Neuropixels1.cpp

Lines changed: 40 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -58,47 +58,55 @@ void Neuropixels1::setSettings (ProbeSettings* settings_, int index)
5858
settings[index]->updateProbeSettings (settings_);
5959
}
6060

61-
std::vector<int> Neuropixels1::selectElectrodeConfiguration (int electrodeConfigurationIndex)
61+
std::vector<int> Neuropixels1::selectElectrodeConfiguration (int electrodeConfigurationIndex, ProbeType probeType)
6262
{
6363
std::vector<int> selection;
6464

65-
if (electrodeConfigurationIndex == (int32_t) ElectrodeConfiguration::BankA)
65+
if (probeType == ProbeType::NPX_V1)
6666
{
67-
for (int i = 0; i < 384; i++)
68-
selection.emplace_back (i);
69-
}
70-
else if (electrodeConfigurationIndex == (int32_t) ElectrodeConfiguration::BankB)
71-
{
72-
for (int i = 384; i < 768; i++)
73-
selection.emplace_back (i);
74-
}
75-
else if (electrodeConfigurationIndex == (int32_t) ElectrodeConfiguration::BankC)
76-
{
77-
for (int i = 576; i < 960; i++)
78-
selection.emplace_back (i);
79-
}
80-
else if (electrodeConfigurationIndex == (int32_t) ElectrodeConfiguration::SingleColumn)
81-
{
82-
for (int i = 0; i < 384; i += 2)
83-
selection.emplace_back (i);
84-
85-
for (int i = 385; i < 768; i += 2)
86-
selection.emplace_back (i);
87-
}
88-
else if (electrodeConfigurationIndex == (int32_t) ElectrodeConfiguration::Tetrodes)
89-
{
90-
for (int i = 0; i < 384; i += 8)
67+
if (electrodeConfigurationIndex == (int32_t) ElectrodeConfiguration::BankA)
9168
{
92-
for (int j = 0; j < 4; j++)
93-
selection.emplace_back (i + j);
69+
for (int i = 0; i < 384; i++)
70+
selection.emplace_back (i);
9471
}
72+
else if (electrodeConfigurationIndex == (int32_t) ElectrodeConfiguration::BankB)
73+
{
74+
for (int i = 384; i < 768; i++)
75+
selection.emplace_back (i);
76+
}
77+
else if (electrodeConfigurationIndex == (int32_t) ElectrodeConfiguration::BankC)
78+
{
79+
for (int i = 576; i < 960; i++)
80+
selection.emplace_back (i);
81+
}
82+
else if (electrodeConfigurationIndex == (int32_t) ElectrodeConfiguration::SingleColumn)
83+
{
84+
for (int i = 0; i < 384; i += 2)
85+
selection.emplace_back (i);
9586

96-
for (int i = 388; i < 768; i += 8)
87+
for (int i = 385; i < 768; i += 2)
88+
selection.emplace_back (i);
89+
}
90+
else if (electrodeConfigurationIndex == (int32_t) ElectrodeConfiguration::Tetrodes)
9791
{
98-
for (int j = 0; j < 4; j++)
99-
selection.emplace_back (i + j);
92+
for (int i = 0; i < 384; i += 8)
93+
{
94+
for (int j = 0; j < 4; j++)
95+
selection.emplace_back (i + j);
96+
}
97+
98+
for (int i = 388; i < 768; i += 8)
99+
{
100+
for (int j = 0; j < 4; j++)
101+
selection.emplace_back (i + j);
102+
}
100103
}
101104
}
105+
else
106+
{
107+
LOGE ("Invalid probe type given for a Neuropixels 2.0 device: ", ProbeTypeString.at (probeType));
108+
return selection;
109+
}
102110

103111
assert (selection.size() == numberOfChannels && "Invalid number of selected channels.");
104112

@@ -521,7 +529,7 @@ void Neuropixels1::setGainCalibrationFilePath (std::string filepath)
521529
gainCalibrationFilePath = filepath;
522530
}
523531

524-
bool Neuropixels1::validateProbeTypeAndPartNumber ()
532+
bool Neuropixels1::validateProbeTypeAndPartNumber()
525533
{
526534
if (! NeuropixelsProbeMetadata::validateProbeTypeAndPartNumber (settings[0]->probeType, probeMetadata.getProbePartNumber()))
527535
{

Source/Devices/Neuropixels1.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ class Neuropixels1 : public INeuropixel<NeuropixelsV1Values::numberOfChannels, N
5050
void defineMetadata (ProbeSettings* settings, ProbeType probeType) override;
5151

5252
/** Select a preset electrode configuration, based on the index of the given enum */
53-
std::vector<int> selectElectrodeConfiguration (int electrodeConfigurationIndex) override;
53+
std::vector<int> selectElectrodeConfiguration (int electrodeConfigurationIndex, ProbeType probeType = ProbeType::NPX_V1) override;
5454

5555
void setSettings (ProbeSettings* settings_, int index = 0) override;
5656

Source/Devices/Neuropixels2e.cpp

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -98,13 +98,11 @@ void Neuropixels2e::selectElectrodesAcrossShanks (std::vector<int>& selection, i
9898
}
9999
}
100100

101-
std::vector<int> Neuropixels2e::selectElectrodeConfiguration (int electrodeConfigurationIndex)
101+
std::vector<int> Neuropixels2e::selectElectrodeConfiguration (int electrodeConfigurationIndex, ProbeType probeType)
102102
{
103-
static int numberOfElectrodesAcrossShanks = 96;
104-
105103
std::vector<int> selection;
106104

107-
if (numberOfShanks == 1)
105+
if (probeType == ProbeType::NPX_V2_SINGLE_SHANK)
108106
{
109107
if (electrodeConfigurationIndex == (int32_t) ElectrodeConfigurationSingleShank::BankA)
110108
{
@@ -124,8 +122,10 @@ std::vector<int> Neuropixels2e::selectElectrodeConfiguration (int electrodeConfi
124122
selectElectrodesInRange (selection, bankDOffset, numberOfChannels);
125123
}
126124
}
127-
else if (numberOfShanks == 4)
125+
else if (probeType == ProbeType::NPX_V2_QUAD_SHANK)
128126
{
127+
static int numberOfElectrodesAcrossShanks = 96;
128+
129129
if (electrodeConfigurationIndex == (int32_t) ElectrodeConfigurationQuadShank::Shank1BankA)
130130
{
131131
selectElectrodesInRange (selection, 0, numberOfChannels);
@@ -227,6 +227,10 @@ std::vector<int> Neuropixels2e::selectElectrodeConfiguration (int electrodeConfi
227227
selectElectrodesAcrossShanks (selection, numberOfElectrodesAcrossShanks * 12, numberOfElectrodesAcrossShanks);
228228
}
229229
}
230+
else
231+
{
232+
LOGE ("Invalid probe type given for a Neuropixels 2.0 device: ", ProbeTypeString.at(probeType));
233+
}
230234

231235
return selection;
232236
}
@@ -344,7 +348,7 @@ bool Neuropixels2e::updateSettings()
344348
{
345349
if (! NeuropixelsProbeMetadata::validateProbeTypeAndPartNumber (settings[i]->probeType, probeMetadata[i].getProbePartNumber()))
346350
{
347-
Onix1::showWarningMessageBoxAsync ("Probe Type / Number Mismatch", "The selected probe type is " + ProbeTypeString.at (settings[i]->probeType) + ", but the probe part number is " + probeMetadata[i].getProbePartNumber() + ".");
351+
Onix1::showWarningMessageBoxAsync ("Probe Type Mismatch", "The selected probe type is '" + ProbeTypeString.at (settings[i]->probeType) + "', but the connected probe is '" + NeuropixelsProbeMetadata::getProbeTypeString (probeMetadata[i].getProbePartNumber()) + "'. Please select the correct probe type to match the connected probe.");
348352
return false;
349353
}
350354

@@ -1092,14 +1096,18 @@ void Neuropixels2e::defineMetadata (ProbeSettings* settings, ProbeType probeType
10921096
settings->apFilterState = false;
10931097

10941098
settings->electrodeConfigurationIndex = (int32_t) ElectrodeConfigurationSingleShank::BankA;
1095-
auto selection = selectElectrodeConfiguration (settings->electrodeConfigurationIndex);
1099+
auto selection = selectElectrodeConfiguration (settings->electrodeConfigurationIndex, probeType);
10961100
settings->selectElectrodes (selection);
10971101

10981102
settings->availableReferences.add ("Ext");
1099-
settings->availableReferences.add ("Tip1");
11001103

1101-
if (shankCount == 4)
1104+
if (probeType == ProbeType::NPX_V2_SINGLE_SHANK)
1105+
{
1106+
settings->availableReferences.add ("Tip");
1107+
}
1108+
else if (probeType == ProbeType::NPX_V2_QUAD_SHANK)
11021109
{
1110+
settings->availableReferences.add ("Tip1");
11031111
settings->availableReferences.add ("Tip2");
11041112
settings->availableReferences.add ("Tip3");
11051113
settings->availableReferences.add ("Tip4");

Source/Devices/Neuropixels2e.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ class Neuropixels2e : public INeuropixel<NeuropixelsV2eValues::numberOfChannels,
8686

8787
// INeuropixel Methods
8888

89-
std::vector<int> selectElectrodeConfiguration (int electrodeConfigurationIndex) override;
89+
std::vector<int> selectElectrodeConfiguration (int electrodeConfigurationIndex, ProbeType probeType) override;
9090
uint64_t getProbeSerialNumber (int index) override;
9191
std::string getProbePartNumber (int index) override;
9292
std::string getFlexPartNumber (int index) override;

0 commit comments

Comments
 (0)