Main Page | Namespace List | Class Hierarchy | Class List | Directories | File List | Class Members | File Members

SynapseParametersDialog.cpp

Go to the documentation of this file.
00001 /***************************************************************************
00002  *   SpikeStream Application                                               *
00003  *   Copyright (C) 2007 by David Gamez                                     *
00004  *   david@davidgamez.eu                                                   *
00005  *   Version 0.1                                                           *
00006  *                                                                         *
00007  *   This program is free software; you can redistribute it and/or modify  *
00008  *   it under the terms of the GNU General Public License as published by  *
00009  *   the Free Software Foundation; either version 2 of the License, or     *
00010  *   (at your option) any later version.                                   *
00011  *                                                                         *
00012  *   This program is distributed in the hope that it will be useful,       *
00013  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
00014  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
00015  *   GNU General Public License for more details.                          *
00016  *                                                                         *
00017  *   You should have received a copy of the GNU General Public License     *
00018  *   along with this program; if not, write to the                         *
00019  *   Free Software Foundation, Inc.,                                       *
00020  *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
00021  ***************************************************************************/
00022 
00023 //SpikeStream includes
00024 #include "SynapseParametersDialog.h"
00025 #include "Debug.h"
00026 #include "Utilities.h"
00027 #include "SpikeStreamMainWindow.h"
00028 
00029 //Qt includes
00030 #include <qlayout.h>
00031 #include <qfile.h>
00032 #include <qmessagebox.h>
00033 
00034 //Other includes
00035 #include <mysql++.h>
00036 #include <iostream>
00037 using namespace std;
00038 using namespace mysqlpp;
00039 
00040 
00041 /*! Constructor. */
00042 SynapseParametersDialog::SynapseParametersDialog(QWidget *parent, DBInterface* netDBInter, SimulationManager* simMan) : QDialog(parent, "SynParamDlg", false){
00043         //Store reference to database
00044         networkDBInterface = netDBInter;
00045 
00046         //Store reference to simulation manager
00047         simulationManager = simMan;
00048 
00049         //Set caption
00050         this->setCaption("Synapse Parameters"); 
00051 
00052         //Set up pixmap that user clicks on to edit parameters
00053         editPixmap = new QPixmap(SpikeStreamMainWindow::workingDirectory + "/images/edit_parameters.xpm");
00054 
00055         //Record the maximum width of the tables
00056         unsigned int maxTableWidth = 0;
00057 
00058         //Create box to organise dialog
00059         QVBoxLayout *verticalBox = new QVBoxLayout(this, 2, 2);
00060 
00061         //Work through each synapse type and create a parameter table for each type
00062         try{
00063                 Query query = networkDBInterface->getQuery();
00064                 query.reset();
00065                 query<<"SELECT TypeID, Description, ParameterTableName FROM SynapseTypes";
00066                 Result synapseTypesResult = query.store();
00067                 for(Result::iterator synTypesIter = synapseTypesResult.begin(); synTypesIter != synapseTypesResult.end(); ++synTypesIter){
00068                         Row synapseTypesRow(*synTypesIter);
00069                         unsigned short synapseTypeID = Utilities::getUShort((std::string) synapseTypesRow["TypeID"]);
00070         
00071                         //Create table
00072                         paramTableMap[synapseTypeID] = new ParameterTable(this, synapseTypeID, (std::string)synapseTypesRow["ParameterTableName"]);
00073                         paramTableMap[synapseTypeID]->setShowGrid(false);
00074                         paramTableMap[synapseTypeID]->setSorting(false);
00075                         paramTableMap[synapseTypeID]->setSelectionMode(QTable::NoSelection);
00076                         paramTableMap[synapseTypeID]->verticalHeader()->hide();
00077                         paramTableMap[synapseTypeID]->setLeftMargin(0);
00078                         paramTableHeaderMap[synapseTypeID] = paramTableMap[synapseTypeID]->horizontalHeader();
00079         
00080                         //Add up the total width of the columns to set the minimum size
00081                         unsigned int tempTotalColumnWidth = 0;
00082         
00083                         //Add column to edit value
00084                         unsigned int insertionPoint = paramTableMap[synapseTypeID]->numCols();
00085                         paramTableMap[synapseTypeID]->insertColumns(insertionPoint, 1);
00086                         paramTableHeaderMap[synapseTypeID]->setLabel( insertionPoint, "Edit" );
00087                         paramTableMap[synapseTypeID]->setColumnWidth( insertionPoint, 30);
00088                         editColumn = insertionPoint;
00089                         tempTotalColumnWidth += 30;
00090         
00091                         //Add column for connection group id
00092                         insertionPoint = paramTableMap[synapseTypeID]->numCols();
00093                         paramTableMap[synapseTypeID]->insertColumns(insertionPoint, 1);
00094                         paramTableHeaderMap[synapseTypeID]->setLabel(insertionPoint, "ConnGrpID" );
00095                         paramTableMap[synapseTypeID]->setColumnWidth(insertionPoint, 70);
00096                         connGrpIDColumn = insertionPoint;
00097                         tempTotalColumnWidth += 70;
00098         
00099                         //Add column for from neuron group
00100                         insertionPoint = paramTableMap[synapseTypeID]->numCols();
00101                         paramTableMap[synapseTypeID]->insertColumns(insertionPoint, 1);
00102                         paramTableHeaderMap[synapseTypeID]->setLabel(insertionPoint, "From");
00103                         paramTableMap[synapseTypeID]->setColumnWidth(insertionPoint, 120);
00104                         fromGrpColumn = insertionPoint;
00105                         tempTotalColumnWidth += 120;
00106         
00107                         //Add column for to neuron group
00108                         insertionPoint = paramTableMap[synapseTypeID]->numCols();
00109                         paramTableMap[synapseTypeID]->insertColumns(insertionPoint, 1);
00110                         paramTableHeaderMap[synapseTypeID]->setLabel(insertionPoint, "To");
00111                         paramTableMap[synapseTypeID]->setColumnWidth(insertionPoint, 120);
00112                         toGrpColumn = insertionPoint;
00113                         tempTotalColumnWidth += 120;
00114         
00115         
00116                         //Store the start position of the parameters
00117                         paramStartColumn = paramTableMap[synapseTypeID]->numCols();
00118                 
00119                         /* Add a column for each of the parameters in the parameters table
00120                                 Also store the names of the parameters so that their values can be loaded later
00121                                 Also need to store link between a description and a default value. */
00122                 
00123                         /* The descriptions and values are on separate lines, so store them in two temporary
00124                                 maps and combine them afterwards */
00125                         map<const char*, double, charKeyCompare> tempValueMap;
00126         
00127                         //Create a string lists to hold the field names and value names
00128                         fieldNamesMap[synapseTypeID] = new QStringList();
00129                         valueNamesMap[synapseTypeID] = new QStringList();
00130         
00131                         //Do the querying to get the names
00132                         query.reset();
00133                         query<<"SHOW COLUMNS FROM "<<((std::string)synapseTypesRow["ParameterTableName"]);
00134                         Result showResult = query.store();
00135                         for(Result::iterator iter = showResult.begin(); iter != showResult.end(); ++iter){
00136                                 Row showRow(*iter);
00137         
00138                                 //Get the column name
00139                                 QString fieldName((std::string)showRow["Field"]);
00140                 
00141                                 //If it is a description of a parameter
00142                                 if(fieldName.contains("_desc")){
00143                                         //Store field name to query it later
00144                                         (*fieldNamesMap[synapseTypeID]) += fieldName.section("_", 0, 0);
00145         
00146                                         //Add column for parameter
00147                                         unsigned int insertionPoint = paramTableMap[synapseTypeID]->numCols();
00148                                         paramTableMap[synapseTypeID]->insertColumns(insertionPoint, 1);
00149                                         QString headerText((std::string)showRow["Default"]);
00150                                         tempTotalColumnWidth += headerText.length() * 7;
00151                                         paramTableHeaderMap[synapseTypeID]->setLabel( insertionPoint, headerText );
00152                                         paramTableMap[synapseTypeID]->setColumnWidth( insertionPoint, headerText.length() * 7);
00153                 
00154                                         //Store link between field name and columns
00155                                         descriptionColumnMap[synapseTypeID][headerText.ascii()] = insertionPoint;
00156         
00157                                         //Store link between parameter name and a description 
00158                                         paramDescMap[synapseTypeID][(*fieldNamesMap[synapseTypeID]).last().ascii()] = paramTableHeaderMap[synapseTypeID]->label(insertionPoint).ascii();
00159         
00160                                         //Stores link between description and parameter name
00161                                         descParamMap[synapseTypeID][paramTableHeaderMap[synapseTypeID]->label(insertionPoint).ascii()] = (*fieldNamesMap[synapseTypeID]).last().ascii();
00162         
00163                                 }
00164                                 else if(fieldName.contains("_val")){
00165                                         //Convert value name to value description
00166                                         QString valueName = fieldName.section("_", 0, 0);
00167                                 
00168                                         //Store keys for querying the database
00169                                         (*valueNamesMap[synapseTypeID]) += valueName;
00170                 
00171                                         //If the value is a boolean, store this fact
00172                                         QString valueType((std::string)showRow["Type"]);
00173                                         if(valueType == "tinyint(1)")
00174                                                 checkBoxMap[synapseTypeID][(*valueNamesMap[synapseTypeID]).last().ascii()] = true;//This value will be loaded as a check box
00175                                         else{
00176                                                 //Get the default value for any other data types
00177                                                 double defaultValue = Utilities::getDouble((std::string)showRow["Default"]);
00178                 
00179                                                 //Store link between description and default value
00180                                                 tempValueMap[valueName.ascii()] = defaultValue;
00181                                         }
00182                 
00183                                 }
00184                         }
00185                 
00186                         /*Have now two maps, one linking parameter names with values and another
00187                                 linking parameter names and descriptions. Need to combine them into a
00188                                 single default value map */
00189                         for(map<const char*, double>::iterator iter = tempValueMap.begin(); iter != tempValueMap.end(); ++iter){
00190                                 defaultValueMap[synapseTypeID][ paramDescMap[synapseTypeID][iter->first] ] = iter->second;
00191                         }
00192         
00193                         //See if the width of this table is greater than the maximum width
00194                         tempTotalColumnWidth += 10;
00195                         if(tempTotalColumnWidth > maxTableWidth)
00196                                 maxTableWidth = tempTotalColumnWidth;
00197         
00198                         //Add label for table
00199                         QHBoxLayout *labelBox = new QHBoxLayout();
00200                         QString labelString((std::string)synapseTypesRow["Description"]);
00201                         labelString += " Parameters";
00202                         tableLabelMap[synapseTypeID] = new QLabel(labelString, this);
00203                         tableLabelMap[synapseTypeID] ->setPaletteForegroundColor(QColor(0,86,126));
00204                         labelBox->addSpacing(5);
00205                         labelBox->addWidget(tableLabelMap[synapseTypeID]);
00206                         labelBox->addStretch(5);
00207         
00208                         verticalBox->addLayout(labelBox);
00209         
00210                         //Add table to layout
00211                         verticalBox->addWidget(paramTableMap[synapseTypeID]);
00212                 
00213                         //Set up table so that clicks on edit pixmap launch edit dialog
00214                         connect (paramTableMap[synapseTypeID], SIGNAL(parameterTableClicked(int, int, unsigned short)), this, SLOT(parameterTableClicked(int, int, unsigned short)));
00215                 
00216                         //Listen for changes in the check boxes
00217                         connect (paramTableMap[synapseTypeID], SIGNAL(parameterTableValueChanged(int, int, unsigned short)), this, SLOT(parameterTableValueChanged(int, int, unsigned short)));
00218                 }
00219         }
00220         catch (const BadQuery& er) {// Handle any query errors
00221                 cerr<<"SynapseParametersDialog: MYSQL QUERY EXCEPTION \""<<er.what()<<"\""<<endl;
00222                 QString errorString = "Bad query when  loading information about synapse parameters: \"";
00223                 errorString += er.what();
00224                 errorString += "\"";
00225                 QMessageBox::critical( 0, "Synapse Parameters Error", errorString);
00226         }
00227         catch (const Exception& er) {// Catch-all for any other MySQL++ exceptions
00228                 cerr<<"SynapseParametersDialog: MYSQL EXCEPTION \""<<er.what()<<"\""<<endl;
00229                 QString errorString = "Exception thrown loading information about synapse parameters: \"";
00230                 errorString += er.what();
00231                 errorString += "\"";
00232                 QMessageBox::critical( 0, "Synapse Parameters Error", errorString);
00233         }
00234         catch(std::exception& er){// Catch-all for any other exceptions
00235                 cerr<<"SynapseParametersDialog: STD EXCEPTION \""<<er.what()<<"\""<<endl;
00236                 QString errorString = "Exception thrown loading information about synapse parameters: \"";
00237                 errorString += er.what();
00238                 errorString += "\"";
00239                 QMessageBox::critical( 0, "Synapse Parameters Error", errorString);
00240         }
00241 
00242         
00243         //Resize dialog to maximise the number of visible parameters
00244         if(maxTableWidth < 1200)
00245                 this->resize(maxTableWidth, 200);
00246         else
00247                 this->resize(1200, 200);
00248         
00249 
00250         //Set up buttons
00251         QHBoxLayout *buttonBox = new QHBoxLayout();
00252         QPushButton *okButton = new QPushButton("Ok", this);
00253         buttonBox->addWidget(okButton);
00254         connect (okButton, SIGNAL(clicked()), this, SLOT(okButtonPressed()));
00255 
00256         applyButton = new QPushButton("Apply", this);
00257         buttonBox->addWidget(applyButton);
00258         connect (applyButton, SIGNAL(clicked()), this, SLOT(applyButtonPressed()));
00259 
00260         QPushButton *defaultsButton = new QPushButton("Load Defaults", this);
00261         buttonBox->addWidget(defaultsButton);
00262         connect (defaultsButton, SIGNAL(clicked()), this, SLOT(defaultsButtonPressed()));
00263 
00264         QPushButton *cancelButton = new QPushButton("Cancel", this);    
00265         buttonBox->addWidget(cancelButton);
00266         connect (cancelButton, SIGNAL(clicked()), this, SLOT(cancelButtonPressed()));
00267 
00268         verticalBox->addLayout(buttonBox);
00269 }
00270 
00271 
00272 /*! Destructor. */
00273 SynapseParametersDialog::~SynapseParametersDialog(){
00274         #ifdef MEMORY_DEBUG
00275                 cout<<"DESTROYING SYNAPSE PARAMETERS DIALOG"<<endl;
00276         #endif//MEMORY_DEBUG
00277 
00278         //Delete any class members allocated on heap and not linked to Qt
00279         delete editPixmap;
00280 
00281         //Clean up the maps holding the field and value names
00282         for(map<unsigned short, QStringList*>::iterator iter = fieldNamesMap.begin(); iter != fieldNamesMap.end(); ++iter)
00283                 delete iter->second;
00284 
00285         for(map<unsigned short, QStringList*>::iterator iter = valueNamesMap.begin(); iter != valueNamesMap.end(); ++iter)
00286                 delete iter->second;
00287 }
00288 
00289 
00290 //--------------------------------------------------------------------------------
00291 //----------------------      PUBLIC METHODS       -------------------------------
00292 //--------------------------------------------------------------------------------
00293 
00294 /*! Loads up the synapse parameters into the table. */
00295 bool SynapseParametersDialog::loadSynapseParameters(){
00296         //Clear the tables
00297         for(map<unsigned short, ParameterTable*>::iterator iter = paramTableMap.begin(); iter != paramTableMap.end(); ++iter)
00298                 iter->second->setNumRows(0);
00299 
00300         //Parameters are fresh from the database so reset change monitor
00301         parameterValuesChanged = false;
00302 
00303         //Disable apply button - no changes to apply
00304         applyButton->setEnabled(false);
00305 
00306         //Work through each of the synapse types and fill up the appropriate table
00307         try{
00308                 Query query = networkDBInterface->getQuery();
00309                 query.reset();
00310                 query<<"SELECT TypeID, ParameterTableName FROM SynapseTypes";
00311                 Result synapseTypesResult = query.store();
00312                 for(Result::iterator synTypesIter = synapseTypesResult.begin(); synTypesIter != synapseTypesResult.end(); ++synTypesIter){
00313                         Row synapseTypesRow(*synTypesIter);
00314                         unsigned short synapseTypeID = Utilities::getUShort((std::string) synapseTypesRow["TypeID"]);
00315         
00316                         //Generate and execute query for this synapse type 
00317                         query.reset();
00318                         query<<"SELECT ConnGrpID, ";
00319                         for(unsigned int i=0; i<fieldNamesMap[synapseTypeID]->size() - 1; ++i){
00320                                 query<<(*fieldNamesMap[synapseTypeID])[i]<<"_val, ";
00321                         }
00322                         query<<(*fieldNamesMap[synapseTypeID])[fieldNamesMap[synapseTypeID]->size() - 1]<<"_val FROM "<<((std::string)synapseTypesRow["ParameterTableName"]);
00323                         Result valueResult = query.store();
00324         
00325                         //Add a row of parameters for each synapse group
00326                         for(Result::iterator iter = valueResult.begin(); iter != valueResult.end(); ++iter){
00327                                 Row valueRow(*iter);
00328         
00329                                 //Add new row to the table
00330                                 int currentRowNumber = paramTableMap[synapseTypeID]->numRows();
00331                                 paramTableMap[synapseTypeID]->insertRows(currentRowNumber, 1);
00332                 
00333                                 //Add pixmap to launch editing dialog
00334                                 paramTableMap[synapseTypeID]->setPixmap(currentRowNumber, editColumn, *editPixmap);
00335                 
00336                                 //Add synapse group id
00337                                 paramTableMap[synapseTypeID]->setItem(currentRowNumber, connGrpIDColumn, new QTableItem(paramTableMap[synapseTypeID], QTableItem::Never, (std::string)valueRow["ConnGrpID"]));
00338         
00339                                 //Extract the from and to neuron group names for this connection group
00340                                 query.reset();
00341                                 query<<"SELECT FromNeuronGrpID, ToNeuronGrpID FROM ConnectionGroups WHERE ConnGrpID = "<<(std::string)valueRow["ConnGrpID"];
00342                                 Result fromToIDRes = query.store();
00343                                 Row fromToIDRow(*fromToIDRes.begin());
00344                 
00345                                 //Add from neuron group to table
00346                                 paramTableMap[synapseTypeID]->setItem(currentRowNumber, fromGrpColumn, new QTableItem(paramTableMap[synapseTypeID], QTableItem::Never, getNeuronGroupName(QString((std::string)fromToIDRow["FromNeuronGrpID"]))));
00347                 
00348                                 //Add to neuron group to table
00349                                 paramTableMap[synapseTypeID]->setItem(currentRowNumber, toGrpColumn, new QTableItem(paramTableMap[synapseTypeID], QTableItem::Never, getNeuronGroupName(QString((std::string)fromToIDRow["ToNeuronGrpID"]))));
00350                 
00351                                 //Work through parameters and load them into the table
00352                                 for(unsigned int i=0; i<fieldNamesMap[synapseTypeID]->size(); ++i){
00353                                         QString valueQueryName = (*fieldNamesMap[synapseTypeID])[i] + "_val";
00354                                         
00355                                         if(checkBoxMap[synapseTypeID].count((*fieldNamesMap[synapseTypeID])[i])){//Add a check box for the value
00356                                                 unsigned int booleanValue = Utilities::getInt((std::string)valueRow[valueQueryName.ascii()]);
00357                                                 QCheckTableItem *tempCheckTableItem = new QCheckTableItem( paramTableMap[synapseTypeID], QString(""));
00358                                                 
00359                                                 if(booleanValue == 0)
00360                                                         tempCheckTableItem->setChecked(false);
00361                                                 else if(booleanValue == 1)
00362                                                         tempCheckTableItem->setChecked(true);
00363                                                 paramTableMap[synapseTypeID]->setItem(currentRowNumber, paramStartColumn + i, tempCheckTableItem);
00364                                         }
00365                                         else{//Add a regular number cell
00366                                                 paramTableMap[synapseTypeID]->setItem(currentRowNumber, paramStartColumn + i, 
00367                                                                 new QTableItem(paramTableMap[synapseTypeID], QTableItem::Never, (std::string)valueRow[valueQueryName.ascii()]));
00368                                         }
00369                                 }
00370                         }
00371                 }
00372         }
00373         catch (const BadQuery& er) {// Handle any query errors
00374                 cerr<<"SynapseParametersDialog: MYSQL QUERY EXCEPTION \""<<er.what()<<"\""<<endl;
00375                 QString errorString = "Bad query when  loading synapse parameters: \"";
00376                 errorString += er.what();
00377                 errorString += "\"";
00378                 QMessageBox::critical( 0, "Synapse Parameters Error", errorString);
00379                 return false;
00380         }
00381         catch (const Exception& er) {// Catch-all for any other MySQL++ exceptions
00382                 cerr<<"SynapseParametersDialog: MYSQL EXCEPTION \""<<er.what()<<"\""<<endl;
00383                 QString errorString = "Exception thrown loading synapse parameters: \"";
00384                 errorString += er.what();
00385                 errorString += "\"";
00386                 QMessageBox::critical( 0, "Synapse Parameters Error", errorString);
00387                 return false;
00388         }
00389         catch(std::exception& er){// Catch-all for any other exceptions
00390                 cerr<<"SynapseParametersDialog: STD EXCEPTION \""<<er.what()<<"\""<<endl;
00391                 QString errorString = "Exception thrown loading synapse parameters: \"";
00392                 errorString += er.what();
00393                 errorString += "\"";
00394                 QMessageBox::critical( 0, "Synapse Parameters Error", errorString);
00395                 return false;
00396         }
00397 
00398 
00399         //Hide tables that have no entries in them
00400         for(map<unsigned short, ParameterTable*>::iterator iter = paramTableMap.begin(); iter != paramTableMap.end(); ++iter){
00401                 if(iter->second->numRows() <= 0){
00402                         iter->second->hide();
00403                         tableLabelMap[iter->first]->hide();
00404                 }
00405                 else{
00406                         iter->second->show();
00407                         tableLabelMap[iter->first]->show();
00408                 }
00409         }
00410 
00411         //Everything should be ok if we have reached this point
00412         return true;
00413 }
00414 
00415 
00416 //-------------------------------------------------------------------------------
00417 //------------------------        SLOTS           -------------------------------
00418 //-------------------------------------------------------------------------------
00419 
00420 /*! Stores the parameters without closing the dialog. */
00421 void SynapseParametersDialog::applyButtonPressed(){
00422         //Store parameters in database
00423         storeSynapseParameters();
00424 
00425         //Instruct simulation manager to send message instructing tasks to load parameters
00426         simulationManager->setSynapseParameters();
00427 
00428         //Now changes have been applied, reset button and change monitor
00429         parameterValuesChanged = false;
00430         applyButton->setEnabled(false);
00431 }
00432 
00433 
00434 /*! Hides the dialog when the cancel button is pressed. */
00435 void SynapseParametersDialog::cancelButtonPressed(){
00436         this->hide();
00437 }
00438 
00439 
00440 /*! Loads the default parameters into the table. */
00441 //FIXME NOT IMPLEMENTED YET
00442 void SynapseParametersDialog::defaultsButtonPressed(){
00443 }
00444 
00445 
00446 /*! Stores the parameters and closes the dialog. */
00447 void SynapseParametersDialog::okButtonPressed(){
00448         if(parameterValuesChanged){
00449                 //Store parameters in database
00450                 storeSynapseParameters();
00451         
00452                 //Instruct simulation manager to send message instructing tasks to load parameters
00453                 simulationManager->setSynapseParameters();
00454         }
00455         this->hide();
00456 }
00457 
00458 
00459 /*! Launches a dialog to edit the parameters.
00460         This changes the values in the table, but they are not updated in the database
00461         until ok or apply is clicked. */
00462 void SynapseParametersDialog::parameterTableClicked(int row, int col, unsigned short typeID){
00463         if(col == editColumn){//Want a list of ConnectionGrpIDs to send to the NetworkViewer
00464                 //Get Connection Group ID - set value in try-catch block
00465                 unsigned int connGrpID = 0;
00466 
00467                 //Create a map linking the descriptions with the values
00468                 map<const char*, double, charKeyCompare> descValueMap;
00469 
00470                 try{
00471                         connGrpID = Utilities::getUInt(paramTableMap[typeID]->item(row, connGrpIDColumn)->text().ascii());
00472                         for(int i=paramStartColumn; i<paramTableMap[typeID]->numCols(); ++i){
00473                                 //Get parameter value if it is not a check box column
00474                                 if(checkBoxMap[typeID].count(descParamMap[typeID][paramTableHeaderMap[typeID]->label(i).ascii()]) == 0 ){
00475                                         double tempVal = Utilities::getDouble(paramTableMap[typeID]->text(row, i).ascii());
00476                                         descValueMap[paramTableHeaderMap[typeID]->label(i).ascii()] = tempVal;
00477                                 }
00478                         }
00479                 }
00480                 catch(std::exception& er){// Catch-all for any other exceptions
00481                         cerr<<"SynapseParametersDialog: STD EXCEPTION \""<<er.what()<<"\""<<endl;
00482                         QString errorString = "Exception thrown loading information for Edit Parameters Dialog: \"";
00483                         errorString += er.what();
00484                         errorString += "\"";
00485                         QMessageBox::critical( 0, "Synapse Parameters Error", errorString);
00486                         return;
00487                 }
00488 
00489                 //Launch edit synapse parameters dialog to adjust the parameters of this row
00490                 EditSynapseParametersDialog *edParamDlg = new EditSynapseParametersDialog(this, descValueMap, &defaultValueMap[typeID], connGrpID);
00491                 if ( edParamDlg->exec() == QDialog::Accepted ) {
00492                         //Get the map linking parameter descriptions to line edits
00493                         map<const char*, QLineEdit*, charKeyCompare> *tempMap = edParamDlg->getDescriptionLineEditMap();
00494 
00495                         //Work through map
00496                         for(map<const char*, QLineEdit*>::iterator iter = tempMap->begin(); iter != tempMap->end(); ++iter){
00497                                 //Get the parameter text
00498                                 QString parameterText = iter->second->text();
00499 
00500                                 //Get the position of this column in the table
00501                                 int columnNumber = descriptionColumnMap[typeID][iter->first];
00502 
00503                                 //Set the value in the table
00504                                 paramTableMap[typeID]->setItem(row, columnNumber, new QTableItem(paramTableMap[typeID], QTableItem::Never, parameterText));
00505                         }
00506 
00507                         //Parameters have been changed
00508                         parameterValuesChanged = true;
00509                 
00510                         //Enable apply button
00511                         applyButton->setEnabled(true);
00512                 }
00513 
00514                 //Clean up
00515                 delete edParamDlg;
00516         }
00517 }
00518 
00519 
00520 /*! Tracks whether a check box has been checked or cleared in the table. */
00521 void SynapseParametersDialog::parameterTableValueChanged(int, int, unsigned short){
00522         //Learning state may have been changed, so want to enable apply button and change monitor
00523         parameterValuesChanged = true;
00524         applyButton->setEnabled(true);
00525 }
00526 
00527 
00528 //----------------------------------------------------------------------------------
00529 //-----------------------       PRIVATE METHODS     --------------------------------
00530 //----------------------------------------------------------------------------------
00531 
00532 /*! Gets the name of the neuron group given the neuron group id. */
00533 QString SynapseParametersDialog::getNeuronGroupName(QString neuronGrpID){
00534         QString neuronGrpName("");
00535         try{
00536                 Query query = networkDBInterface->getQuery();
00537                 query.reset();
00538                 query<<"SELECT Name FROM NeuronGroups WHERE NeuronGrpID = "<<neuronGrpID;
00539                 Result tempResult = query.store();
00540                 Row tempFromRow(*tempResult.begin());
00541                 neuronGrpName = (std::string)tempFromRow["Name"] + " [";
00542                 neuronGrpName += neuronGrpID + "]";
00543         }
00544         catch (const BadQuery& er) {// Handle any query errors
00545                 cerr<<"SynapseParametersDialog: MYSQL QUERY EXCEPTION \""<<er.what()<<"\""<<endl;
00546                 QString errorString = "Bad query when getting neuron group name: \"";
00547                 errorString += er.what();
00548                 errorString += "\"";
00549                 QMessageBox::critical( 0, "Neuron Group Error", errorString);
00550                 return QString("Unknown");
00551         }
00552         catch (const Exception& er) {// Catch-all for any other MySQL++ exceptions
00553                 cerr<<"SynapseParametersDialog: MYSQL EXCEPTION \""<<er.what()<<"\""<<endl;
00554                 QString errorString = "Exception thrown getting neuron group name: \"";
00555                 errorString += er.what();
00556                 errorString += "\"";
00557                 QMessageBox::critical( 0, "Neuron Group Error", errorString);
00558                 return QString("Unknown");
00559         }
00560         catch(std::exception& er){// Catch-all for any other exceptions
00561                 cerr<<"SynapseParametersDialog: STD EXCEPTION \""<<er.what()<<"\""<<endl;
00562                 QString errorString = "Exception thrown getting neuron group name: \"";
00563                 errorString += er.what();
00564                 errorString += "\"";
00565                 QMessageBox::critical( 0, "Neuron Group Error", errorString);
00566                 return QString("Unknown");
00567         }
00568         return neuronGrpName;
00569 }
00570 
00571 
00572 /*! Stores the synapse parameters in the database. */
00573 void SynapseParametersDialog::storeSynapseParameters(){
00574         try{
00575                 Query query = networkDBInterface->getQuery();
00576         
00577                 //Work through each of the tables of synapse parameters
00578                 for(map<unsigned short, ParameterTable*>::iterator paramTableIter = paramTableMap.begin(); paramTableIter != paramTableMap.end(); ++paramTableIter){
00579                 
00580                         //Work through parameters and load them into the table
00581                         for(int rowNum=0; rowNum< paramTableIter->second->numRows(); ++rowNum){
00582                                 QString connGrpIDText = paramTableIter->second->text(rowNum, connGrpIDColumn);
00583                                 unsigned short synTypeID = paramTableIter->first;
00584                 
00585                                 //Create the first part of the query
00586                                 QString queryString = "UPDATE ";
00587                                 queryString += paramTableIter->second->getParameterTableName(); 
00588                                 queryString += " SET ";
00589                 
00590                                 for(unsigned int i = 0; i < fieldNamesMap[synTypeID]->size(); ++i){
00591                                         QString valueName = (*fieldNamesMap[synTypeID])[i] + "_val";
00592                                         QString valueText = "";
00593         
00594                                         //Determine whether it is a check box column
00595                                         if(checkBoxMap[synTypeID].count((*valueNamesMap[synTypeID])[i])){
00596                                                 QCheckTableItem * item = (QCheckTableItem*)paramTableIter->second->item(rowNum, i + paramStartColumn);
00597                                                 if(item->isChecked())
00598                                                         valueText = "1";
00599                                                 else
00600                                                         valueText = "0";
00601                                         }
00602                                         else {
00603                                                 valueText = paramTableIter->second->text(rowNum, i+paramStartColumn);
00604                                         }
00605         
00606                                         queryString += valueName;
00607                                         queryString += " = ";
00608                                         queryString += valueText;
00609                                         queryString += ", ";
00610                                 }
00611         
00612                                 //Trim last comma and space
00613                                 queryString.remove(queryString.length() - 2, 2);
00614         
00615                                 //Finish off query string
00616                                 queryString += " WHERE ConnGrpID = ";
00617                                 queryString += connGrpIDText;
00618                 
00619                                 //Execute query
00620                                 query.reset();
00621                                 query<<queryString;
00622                                 query.execute();
00623                         }
00624                 }
00625         }
00626         catch (const BadQuery& er) {// Handle any query errors
00627                 cerr<<"SynapseParametersDialog: MYSQL QUERY EXCEPTION \""<<er.what()<<"\""<<endl;
00628                 QString errorString = "Bad query when storing synapse parameters: \"";
00629                 errorString += er.what();
00630                 errorString += "\"";
00631                 QMessageBox::critical( 0, "Synapse Parameters Error", errorString);
00632         }
00633         catch (const Exception& er) {// Catch-all for any other MySQL++ exceptions
00634                 cerr<<"SynapseParametersDialog: MYSQL EXCEPTION \""<<er.what()<<"\""<<endl;
00635                 QString errorString = "Exception thrown storing synapse parameters: \"";
00636                 errorString += er.what();
00637                 errorString += "\"";
00638                 QMessageBox::critical( 0, "Synapse Parameters Error", errorString);
00639         }
00640         catch(std::exception& er){// Catch-all for any other exceptions
00641                 cerr<<"SynapseParametersDialog: STD EXCEPTION \""<<er.what()<<"\""<<endl;
00642                 QString errorString = "Exception thrown storing synapse parameters: \"";
00643                 errorString += er.what();
00644                 errorString += "\"";
00645                 QMessageBox::critical( 0, "Synapse Parameters Error", errorString);
00646         }
00647 }
00648 
00649 
00650 

Generated on Mon Sep 3 22:29:04 2007 for SpikeStream Application by  doxygen 1.4.4