@@ -27,14 +27,14 @@ using namespace OnixSourcePlugin;
2727Neuropixels2e::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++)
@@ -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}
@@ -342,6 +346,16 @@ bool Neuropixels2e::updateSettings()
342346 {
343347 if (probeMetadata[i].getProbeSerialNumber () != 0 )
344348 {
349+ if (! NeuropixelsProbeMetadata::validateProbeTypeAndPartNumber (settings[i]->probeType , probeMetadata[i]))
350+ {
351+ Onix1::showWarningMessageBoxAsync (" Probe Type Mismatch" ,
352+ " The selected probe type is '" + ProbeTypeString.at (settings[i]->probeType )
353+ + " ', but the connected probe is '" + NeuropixelsProbeMetadata::getProbeTypeString (probeMetadata[i].getProbePartNumber ())
354+ + " '. Please select the correct probe type to match the connected probe."
355+ + " .\n\n Probe serial number: " + std::to_string (probeMetadata[i].getProbeSerialNumber ()));
356+ return false ;
357+ }
358+
345359 if (gainCorrectionFilePath[i] == " None" || gainCorrectionFilePath[i] == " " )
346360 {
347361 Onix1::showWarningMessageBoxAsync (" Missing File" , " Missing gain correction file for probe " + std::to_string (probeMetadata[i].getProbeSerialNumber ()));
@@ -598,7 +612,7 @@ void Neuropixels2e::processFrames()
598612 }
599613}
600614
601- void Neuropixels2e::writeConfiguration (ProbeSettings<numberOfChannels, numberOfElectrodes> * settings)
615+ void Neuropixels2e::writeConfiguration (ProbeSettings* settings)
602616{
603617 auto baseBits = makeBaseBits (getReference (settings->referenceIndex ));
604618 writeShiftRegister (SR_CHAIN5, baseBits[0 ]);
@@ -716,7 +730,7 @@ Neuropixels2e::BaseBitsArray Neuropixels2e::makeBaseBits (NeuropixelsV2Reference
716730 return baseBits;
717731}
718732
719- Neuropixels2e::ShankBitsArray Neuropixels2e::makeShankBits (NeuropixelsV2Reference reference, std::array <ElectrodeMetadata, numberOfElectrodes > channelMap)
733+ Neuropixels2e::ShankBitsArray Neuropixels2e::makeShankBits (NeuropixelsV2Reference reference, std::vector <ElectrodeMetadata> channelMap)
720734{
721735 ShankBitsArray shankBits;
722736
@@ -766,7 +780,7 @@ Neuropixels2e::ShankBitsArray Neuropixels2e::makeShankBits (NeuropixelsV2Referen
766780 return shankBits;
767781}
768782
769- void Neuropixels2e::setSettings (ProbeSettings<NeuropixelsV2eValues::numberOfChannels, NeuropixelsV2eValues::numberOfElectrodes> * settings_, int index)
783+ void Neuropixels2e::setSettings (ProbeSettings* settings_, int index)
770784{
771785 if (index >= settings.size ())
772786 {
@@ -777,12 +791,13 @@ void Neuropixels2e::setSettings (ProbeSettings<NeuropixelsV2eValues::numberOfCha
777791 settings[index]->updateProbeSettings (settings_);
778792}
779793
780- void Neuropixels2e::defineMetadata (ProbeSettings<numberOfChannels, numberOfElectrodes> * settings)
794+ void Neuropixels2e::defineMetadata (ProbeSettings* settings, ProbeType probeType )
781795{
782- auto shankCount = NeuropixelsV2eValues::numberOfShanks ;
796+ settings-> probeType = probeType ;
783797
784- settings->probeType = ProbeType::NPX_V2;
785- settings->probeMetadata .name = " Neuropixels 2.0e" + (shankCount == 1 ) ? " - Single Shank" : " - Quad Shank" ;
798+ auto shankCount = probeType == ProbeType::NPX_V2_QUAD_SHANK ? NeuropixelsV2eValues::quadShankCount : NeuropixelsV2eValues::singleShankCount;
799+
800+ settings->probeMetadata .name = " Neuropixels 2.0e" + (probeType == ProbeType::NPX_V2_QUAD_SHANK) ? " - Single Shank" : " - Quad Shank" ;
786801
787802 constexpr float shankTipY = 0 .0f ;
788803 constexpr float shankBaseY = 155 .0f ;
@@ -827,14 +842,6 @@ void Neuropixels2e::defineMetadata (ProbeSettings<numberOfChannels, numberOfElec
827842 settings->probeMetadata .num_adcs = 24 ;
828843 settings->probeMetadata .adc_bits = 12 ;
829844
830- settings->availableBanks = {
831- Bank::A,
832- Bank::B,
833- Bank::C,
834- Bank::D,
835- Bank::NONE // disconnected
836- };
837-
838845 for (int i = 0 ; i < settings->probeMetadata .electrodes_per_shank * settings->probeMetadata .shank_count ; i++)
839846 {
840847 ElectrodeMetadata metadata;
@@ -1099,14 +1106,18 @@ void Neuropixels2e::defineMetadata (ProbeSettings<numberOfChannels, numberOfElec
10991106 settings->apFilterState = false ;
11001107
11011108 settings->electrodeConfigurationIndex = (int32_t ) ElectrodeConfigurationSingleShank::BankA;
1102- auto selection = selectElectrodeConfiguration (settings->electrodeConfigurationIndex );
1109+ auto selection = selectElectrodeConfiguration (settings->electrodeConfigurationIndex , probeType );
11031110 settings->selectElectrodes (selection);
11041111
11051112 settings->availableReferences .add (" Ext" );
1106- settings->availableReferences .add (" Tip1" );
11071113
1108- if (shankCount == 4 )
1114+ if (probeType == ProbeType::NPX_V2_SINGLE_SHANK)
1115+ {
1116+ settings->availableReferences .add (" Tip" );
1117+ }
1118+ else if (probeType == ProbeType::NPX_V2_QUAD_SHANK)
11091119 {
1120+ settings->availableReferences .add (" Tip1" );
11101121 settings->availableReferences .add (" Tip2" );
11111122 settings->availableReferences .add (" Tip3" );
11121123 settings->availableReferences .add (" Tip4" );
0 commit comments