00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include "ArchiveStatisticsDialog.h"
00025 #include "Utilities.h"
00026
00027
00028 #include <qbuttongroup.h>
00029 #include <qlayout.h>
00030 #include <qpushbutton.h>
00031 #include <qmessagebox.h>
00032 #include <qvalidator.h>
00033 #include <qregexp.h>
00034 #include <qlabel.h>
00035
00036
00037 #include <iostream>
00038 using namespace std;
00039
00040
00041
00042 ArchiveStatisticsDialog::ArchiveStatisticsDialog(QWidget* parent, vector<NeuronGroup*> neurGrpVect) : QDialog(parent) {
00043
00044 neuronGrpVector = neurGrpVect;
00045
00046
00047 initialiseDialog();
00048 }
00049
00050
00051
00052 ArchiveStatisticsDialog::ArchiveStatisticsDialog(QWidget* parent, vector<NeuronGroup*> neurGrpVect, ArchiveStatisticsHolder* archStatsHold) : QDialog(parent) {
00053
00054 neuronGrpVector = neurGrpVect;
00055
00056
00057 initialiseDialog();
00058
00059
00060 archStatsNameText->setText(archStatsHold->description);
00061
00062
00063 if(archStatsHold->archStatVector.size() == 1 && archStatsHold->archStatVector[0]->getType() == ArchiveStatistic::NEURON_GROUP){
00064
00065 unsigned int tmpNeurGrpID = ((NeuronGrpArchiveStatistic*)archStatsHold->archStatVector[0])->getNeuronGrpID();
00066 for(int i=0; i < neuronGrpCombo->count(); ++i){
00067 try{
00068 unsigned int comboNeurGrpID = Utilities::getNeuronGrpID(neuronGrpCombo->text(i));
00069 if(comboNeurGrpID == tmpNeurGrpID){
00070 neuronGrpCombo->setCurrentItem(i);
00071 return;
00072 }
00073 }
00074 catch(std::exception& er){
00075 cerr<<"ArchiveStatisticsDialog: STD EXCEPTION \""<<er.what()<<"\""<<endl;
00076 QString errorString = "Exception thrown getting neuron group id: \"";
00077 errorString += er.what();
00078 errorString += "\"";
00079 QMessageBox::critical( 0, "NeuronGrpID Error", errorString);
00080 return;
00081 }
00082 }
00083
00084 cerr<<"ArchiveStatisticsDialog: COULD NOT FIND NEURON GROUP ID "<<tmpNeurGrpID<<" IN COMBO BOX."<<endl;
00085 QMessageBox::critical( 0, "NeuronGrpID Error", "Could not find neuron group ID");
00086 return;
00087 }
00088
00089
00090 else{
00091
00092 neurIDRadioButt->setChecked(true);
00093 neurIDText->setEnabled(true);
00094 neuronGrpCombo->setEnabled(false);
00095
00096
00097 QString neurIDStr = "";
00098 for(vector<ArchiveStatistic*>::iterator iter = archStatsHold->archStatVector.begin(); iter != archStatsHold->archStatVector.end(); ++iter){
00099 neurIDStr += (*iter)->toQString();
00100 if((iter + 1) != archStatsHold->archStatVector.end())
00101 neurIDStr += ", ";
00102 }
00103 neurIDText->setText(neurIDStr);
00104 }
00105 }
00106
00107
00108
00109
00110 void ArchiveStatisticsDialog::initialiseDialog(){
00111
00112
00113 this->setCaption("Statistics");
00114
00115
00116 QVBoxLayout *mainVerticalBox = new QVBoxLayout(this, 5, 10, "vertical1");
00117
00118
00119 QRegExp regExp( "([0-9]|[A-Z]|[a-z]|_|\\s){1,50}" );
00120 QValidator* archStatsNameValidator = new QRegExpValidator(regExp, this);
00121 QHBoxLayout *archStatsNameBox = new QHBoxLayout();
00122 archStatsNameBox->addSpacing(10);
00123 archStatsNameBox->addWidget(new QLabel("Name", this));
00124 archStatsNameText = new QLineEdit("UNTITLED", this);
00125 archStatsNameText->setValidator(archStatsNameValidator);
00126 archStatsNameBox->addWidget(archStatsNameText);
00127 archStatsNameBox->addSpacing(5);
00128 mainVerticalBox->addLayout(archStatsNameBox);
00129
00130
00131 QButtonGroup* buttonGroup = new QButtonGroup();
00132 neurGrpRadioButt = new QRadioButton("Neuron group", this);
00133 neurGrpRadioButt->setChecked(true);
00134 connect (neurGrpRadioButt, SIGNAL(clicked()), this, SLOT(neurGrpRadioButtonClicked()));
00135 buttonGroup->insert(neurGrpRadioButt);
00136 mainVerticalBox->addWidget(neurGrpRadioButt);
00137
00138
00139 QHBoxLayout* neurGrpBox = new QHBoxLayout();
00140 neuronGrpCombo = new QComboBox(this);
00141 for(vector<NeuronGroup*>::iterator iter = neuronGrpVector.begin(); iter != neuronGrpVector.end(); ++iter){
00142 QString tmpNeurGrpName = (*iter)->name;
00143 tmpNeurGrpName += " [";
00144 tmpNeurGrpName += QString::number((*iter)->neuronGrpID);
00145 tmpNeurGrpName += "]";
00146 neuronGrpCombo->insertItem(tmpNeurGrpName);
00147 }
00148 neurGrpBox->addSpacing(10);
00149 neurGrpBox->addWidget(neuronGrpCombo);
00150 neurGrpBox->addStretch(5);
00151 mainVerticalBox->addLayout(neurGrpBox);
00152
00153
00154 neurIDRadioButt = new QRadioButton("Neuron IDs", this);
00155 neurIDRadioButt->setChecked(false);
00156 connect (neurIDRadioButt, SIGNAL(clicked()), this, SLOT(neurIDRadioButtonClicked()));
00157 buttonGroup->insert(neurIDRadioButt);
00158 mainVerticalBox->addWidget(neurIDRadioButt);
00159
00160
00161 neurIDText = new QTextEdit(this);
00162 neurIDText->setTextFormat(Qt::PlainText);
00163 neurIDText->setEnabled(false);
00164 mainVerticalBox->addWidget(neurIDText);
00165
00166
00167 QHBoxLayout *buttonBox = new QHBoxLayout();
00168 QPushButton* okButton = new QPushButton("Ok", this, "okButton");
00169 QPushButton* cancelButton = new QPushButton("Cancel", this, "cancelButton");
00170 buttonBox->addWidget(okButton);
00171 buttonBox->addWidget(cancelButton);
00172 mainVerticalBox->addLayout(buttonBox);
00173
00174 connect (okButton, SIGNAL(clicked()), this, SLOT(okButtonPressed()));
00175 connect (cancelButton, SIGNAL(clicked()), this, SLOT(cancelButtonPressed()));
00176
00177
00178 this->resize(600, 400);
00179 }
00180
00181
00182
00183 ArchiveStatisticsDialog::~ArchiveStatisticsDialog(){
00184 #ifdef MEMORY_DEBUG
00185 cout<<"DESTROYING ARCHIVE STATISTICS DIALOG"<<endl;
00186 #endif//MEMORY_DEBUG
00187 }
00188
00189
00190
00191
00192
00193
00194
00195 ArchiveStatisticsHolder* ArchiveStatisticsDialog::getArchiveStatistics(){
00196 return archStatsHolder;
00197 }
00198
00199
00200
00201
00202
00203
00204
00205 void ArchiveStatisticsDialog::cancelButtonPressed(){
00206 this->reject();
00207 }
00208
00209
00210
00211 void ArchiveStatisticsDialog::neurGrpRadioButtonClicked(){
00212 neurIDText->setEnabled(false);
00213 neuronGrpCombo->setEnabled(true);
00214 }
00215
00216
00217
00218 void ArchiveStatisticsDialog::neurIDRadioButtonClicked(){
00219 neurIDText->setEnabled(true);
00220 neuronGrpCombo->setEnabled(false);
00221 }
00222
00223
00224
00225
00226
00227
00228 void ArchiveStatisticsDialog::okButtonPressed(){
00229
00230 archStatsHolder = new ArchiveStatisticsHolder;
00231 archStatsHolder->firingNeuronCount = 0;
00232 archStatsHolder->firingNeuronTotal = 0;
00233
00234
00235 archStatsHolder->description = archStatsNameText->text().ascii();
00236
00237
00238
00239 if(neurGrpRadioButt->isOn()){
00240 try{
00241 unsigned int selectedNeurGrpID = Utilities::getNeuronGrpID(neuronGrpCombo->currentText());
00242 ArchiveStatistic* tmpArchStat = new NeuronGrpArchiveStatistic(&archStatsHolder->firingNeuronCount, &archStatsHolder->firingNeuronTotal, selectedNeurGrpID);
00243 archStatsHolder->archStatVector.push_back(tmpArchStat);
00244 this->accept();
00245 return;
00246 }
00247 catch(std::exception& er){
00248 cerr<<"ArchiveStatisticsDialog: STD EXCEPTION \""<<er.what()<<"\""<<endl;
00249 QString errorString = "Exception thrown getting neuron group id: \"";
00250 errorString += er.what();
00251 errorString += "\"";
00252 QMessageBox::critical( 0, "NeuronGrpID Error", errorString);
00253 this->reject();
00254 return;
00255 }
00256 }
00257
00258
00259
00260 QString neurIDStr = neurIDText->text();
00261
00262
00263 for(unsigned int i=0; i<neurIDStr.length(); ++i){
00264 if(neurIDStr.at(i).isSpace()){
00265 neurIDStr.remove(i, 1);
00266 --i;
00267 }
00268 }
00269 cout<<"STRIPPED STRING: "<<neurIDStr<<endl;
00270
00271
00272 QStringList tempStringList = QStringList::split(",", neurIDStr);
00273
00274
00275
00276
00277 int tmpIndex = 0;
00278 neuronIDError = false;
00279 for(unsigned int i=0; i<tempStringList.size(); ++i){
00280 if((tmpIndex = tempStringList[i].contains('&'))){
00281 unsigned int firstNeuronID = checkNeuronID(tempStringList[i].section('&', 0, 0));
00282 unsigned int secondNeuronID = checkNeuronID(tempStringList[i].section('&', -1, -1));
00283 ArchiveStatistic* tmpArchStat = new AndArchiveStatistic(&archStatsHolder->firingNeuronCount, &archStatsHolder->firingNeuronTotal, firstNeuronID, secondNeuronID);
00284 archStatsHolder->archStatVector.push_back(tmpArchStat);
00285 }
00286 else if((tmpIndex = tempStringList[i].contains('|'))){
00287 unsigned int firstNeuronID = checkNeuronID(tempStringList[i].section('|', 0, 0));
00288 unsigned int secondNeuronID = checkNeuronID(tempStringList[i].section('|', -1, -1));
00289 ArchiveStatistic* tmpArchStat = new OrArchiveStatistic(&archStatsHolder->firingNeuronCount, &archStatsHolder->firingNeuronTotal, firstNeuronID, secondNeuronID);
00290 archStatsHolder->archStatVector.push_back(tmpArchStat);
00291 }
00292 else if((tmpIndex = tempStringList[i].contains('-'))){
00293 unsigned int firstNeuronID = checkNeuronID(tempStringList[i].section('-', 0, 0));
00294 unsigned int secondNeuronID = checkNeuronID(tempStringList[i].section('-', -1, -1));
00295 ArchiveStatistic* tmpArchStat = new RangeArchiveStatistic(&archStatsHolder->firingNeuronCount, &archStatsHolder->firingNeuronTotal, firstNeuronID, secondNeuronID);
00296 archStatsHolder->archStatVector.push_back(tmpArchStat);
00297 }
00298 else {
00299 unsigned int neuronID = checkNeuronID(tempStringList[i]);
00300 ArchiveStatistic* tmpArchStat = new NeuronIDArchiveStatistic(&archStatsHolder->firingNeuronCount, &archStatsHolder->firingNeuronTotal, neuronID);
00301 archStatsHolder->archStatVector.push_back(tmpArchStat);
00302 }
00303 }
00304 if(neuronIDError){
00305 QMessageBox::critical( 0, "Neuron ID Error", "Neuron ID information is incorrectly formatted or does not match the available neuron groups.");
00306 return;
00307 }
00308
00309 this->accept();
00310 }
00311
00312
00313
00314
00315 unsigned int ArchiveStatisticsDialog::checkNeuronID(QString idStr){
00316
00317 unsigned int neuronID = idStr.toUInt();
00318 if(neuronID == 0){
00319 neuronIDError = true;
00320 cerr<<"Malformed neuron ID string: "<<idStr<<endl;
00321 return 0;
00322 }
00323
00324
00325 for(vector<NeuronGroup*>::iterator iter = neuronGrpVector.begin(); iter != neuronGrpVector.end(); ++iter){
00326 if( neuronID >= (*iter)->startNeuronID && neuronID < ( (*iter)->startNeuronID + ((*iter)->width * (*iter)->length) ) ){
00327 return neuronID;
00328 }
00329 }
00330
00331
00332 neuronIDError = true;
00333 cerr<<"Neuron ID does not lie within the range of any of the available neuron groups: "<<neuronID<<endl;
00334 return 0;
00335 }
00336