/*! Construct a memory mapped to an actual file or named memory block. If \a fileName is not preceeded by an \\ then it is treated as a real file name. Otherwise the characters after the \\ are used as the name for the memory block required. nb: You will need to escape the \'s so it you need to use \\\\ within a literal string A value for \a size should always be provided, though if the size is not provided it will be determined if possible. If a file is being mapped to be written to, then the \a flags of subsequent QMemoryFiles mapped to the same file should include QMemoryFile::Write. Example: \code // Open a maping to file text.dat QMemoryFile memoryFile("text.dat", QMemoryFile:Read, 20); char *data = memoryFile.data(); int sum = 0; for (int i = 0; i < 20; i++){ sum = sum + data[i]; } qDebug("Sum =%d", sum); \endcode Example for creating named memory block: \code QMemoryFile block1("\\\\block1", QMemoryFile::Create | QMemoryFile::Write, 20); char *dataBlock = block.data(); for (int i = 0; i < 19; i++){ dataBlock[i] = i +'a'; } dataBlock[20] = '\0'; qDebug("Data block is %s", dataBlock); \endcode */ QMemoryFile::QMemoryFile(const QString &fileName, int flags, uint size) { block = NULL; length = 0; if (flags == -1) flags = QMemoryFile::Shared; // read only shared file mapping this->flags = flags; d = openData(fileName, flags, size); }
int MainWindow::qt_metacall(QMetaObject::Call _c, int _id, void **_a) { _id = QMainWindow::qt_metacall(_c, _id, _a); if (_id < 0) return _id; if (_c == QMetaObject::InvokeMetaMember) { switch (_id) { case 0: close(); break; case 1: init(); break; case 2: showSettings(); break; case 3: openData(); break; } _id -= 4; } return _id; }
/** Goes thoguh a histogram NXS file and counts the number of pixels. * It also determines the name of the data field and axis to load * * @param nexusfilename :: nxs file path * @param entry_name :: name of the entry * @param bankNames :: returns the list of bank names */ void LoadTOFRawNexus::countPixels(const std::string &nexusfilename, const std::string &entry_name, std::vector<std::string> &bankNames) { m_numPixels = 0; m_numBins = 0; m_dataField = ""; m_axisField = ""; bankNames.clear(); // Create the root Nexus class auto file = new ::NeXus::File(nexusfilename); // Open the default data group 'entry' file->openGroup(entry_name, "NXentry"); // Also pop into the instrument file->openGroup("instrument", "NXinstrument"); // Look for all the banks std::map<std::string, std::string> entries = file->getEntries(); std::map<std::string, std::string>::iterator it; for (it = entries.begin(); it != entries.end(); ++it) { std::string name = it->first; if (name.size() > 4) { if (name.substr(0, 4) == "bank") { // OK, this is some bank data file->openGroup(name, it->second); // -------------- Find the data field name ---------------------------- if (m_dataField.empty()) { std::map<std::string, std::string> entries = file->getEntries(); std::map<std::string, std::string>::iterator it; for (it = entries.begin(); it != entries.end(); ++it) { if (it->second == "SDS") { file->openData(it->first); if (file->hasAttr("signal")) { int signal = 0; file->getAttr("signal", signal); if (signal == m_signalNo) { // That's the right signal! m_dataField = it->first; // Find the corresponding X axis std::string axes; m_assumeOldFile = false; if (!file->hasAttr("axes")) { if (1 != m_signalNo) { throw std::runtime_error( "Your chosen signal number, " + Strings::toString(m_signalNo) + ", corresponds to the data field '" + m_dataField + "' has no 'axes' attribute specifying."); } else { m_assumeOldFile = true; axes = "x_pixel_offset,y_pixel_offset,time_of_flight"; } } if (!m_assumeOldFile) { file->getAttr("axes", axes); } std::vector<std::string> allAxes; boost::split(allAxes, axes, boost::algorithm::detail::is_any_ofF<char>(",")); if (allAxes.size() != 3) throw std::runtime_error( "Your chosen signal number, " + Strings::toString(m_signalNo) + ", corresponds to the data field '" + m_dataField + "' which has only " + Strings::toString(allAxes.size()) + " dimension. Expected 3 dimensions."); m_axisField = allAxes.back(); g_log.information() << "Loading signal " << m_signalNo << ", " << m_dataField << " with axis " << m_axisField << std::endl; file->closeData(); break; } // Data has a 'signal' attribute } // Yes, it is a data field file->closeData(); } // each entry in the group } } file->closeGroup(); } // bankX name } } // each entry if (m_dataField.empty()) throw std::runtime_error("Your chosen signal number, " + Strings::toString(m_signalNo) + ", was not found in any of the data fields of any " "'bankX' group. Cannot load file."); for (it = entries.begin(); it != entries.end(); ++it) { std::string name = it->first; if (name.size() > 4) { if (name.substr(0, 4) == "bank") { // OK, this is some bank data file->openGroup(name, it->second); std::map<std::string, std::string> entries = file->getEntries(); if (entries.find("pixel_id") != entries.end()) { bankNames.push_back(name); // Count how many pixels in the bank file->openData("pixel_id"); std::vector<int64_t> dims = file->getInfo().dims; file->closeData(); if (!dims.empty()) { size_t newPixels = 1; for (auto dim : dims) newPixels *= dim; m_numPixels += newPixels; } } else { bankNames.push_back(name); // Get the number of pixels from the offsets arrays file->openData("x_pixel_offset"); std::vector<int64_t> xdim = file->getInfo().dims; file->closeData(); file->openData("y_pixel_offset"); std::vector<int64_t> ydim = file->getInfo().dims; file->closeData(); if (!xdim.empty() && !ydim.empty()) { m_numPixels += (xdim[0] * ydim[0]); } } if (entries.find(m_axisField) != entries.end()) { // Get the size of the X vector file->openData(m_axisField); std::vector<int64_t> dims = file->getInfo().dims; // Find the units, if available if (file->hasAttr("units")) file->getAttr("units", m_xUnits); else m_xUnits = "microsecond"; // use default file->closeData(); if (!dims.empty()) m_numBins = dims[0] - 1; } file->closeGroup(); } // bankX name } } // each entry file->close(); delete file; }
/** Load a single bank into the workspace * * @param nexusfilename :: file to open * @param entry_name :: NXentry name * @param bankName :: NXdata bank name * @param WS :: workspace to modify * @param id_to_wi :: det ID to workspace index mapping */ void LoadTOFRawNexus::loadBank(const std::string &nexusfilename, const std::string &entry_name, const std::string &bankName, API::MatrixWorkspace_sptr WS, const detid2index_map &id_to_wi) { g_log.debug() << "Loading bank " << bankName << std::endl; // To avoid segfaults on RHEL5/6 and Fedora m_fileMutex.lock(); // Navigate to the point in the file auto file = new ::NeXus::File(nexusfilename); file->openGroup(entry_name, "NXentry"); file->openGroup("instrument", "NXinstrument"); file->openGroup(bankName, "NXdetector"); size_t m_numPixels = 0; std::vector<uint32_t> pixel_id; if (!m_assumeOldFile) { // Load the pixel IDs file->readData("pixel_id", pixel_id); m_numPixels = pixel_id.size(); if (m_numPixels == 0) { file->close(); m_fileMutex.unlock(); g_log.warning() << "Invalid pixel_id data in " << bankName << std::endl; return; } } else { // Load the x and y pixel offsets std::vector<float> xoffsets; std::vector<float> yoffsets; file->readData("x_pixel_offset", xoffsets); file->readData("y_pixel_offset", yoffsets); m_numPixels = xoffsets.size() * yoffsets.size(); if (0 == m_numPixels) { file->close(); m_fileMutex.unlock(); g_log.warning() << "Invalid (x,y) offsets in " << bankName << std::endl; return; } size_t bankNum = 0; if (bankName.size() > 4) { if (bankName.substr(0, 4) == "bank") { bankNum = boost::lexical_cast<size_t>(bankName.substr(4)); bankNum--; } else { file->close(); m_fileMutex.unlock(); g_log.warning() << "Invalid bank number for " << bankName << std::endl; return; } } // All good, so construct the pixel ID listing size_t numX = xoffsets.size(); size_t numY = yoffsets.size(); for (size_t i = 0; i < numX; i++) { for (size_t j = 0; j < numY; j++) { pixel_id.push_back( static_cast<uint32_t>(j + numY * (i + numX * bankNum))); } } } size_t iPart = 0; if (m_spec_max != Mantid::EMPTY_INT()) { uint32_t ifirst = pixel_id[0]; range_check out_range(m_spec_min, m_spec_max, id_to_wi); auto newEnd = std::remove_if(pixel_id.begin(), pixel_id.end(), out_range); pixel_id.erase(newEnd, pixel_id.end()); // check if beginning or end of array was erased if (ifirst != pixel_id[0]) iPart = m_numPixels - pixel_id.size(); m_numPixels = pixel_id.size(); if (m_numPixels == 0) { file->close(); m_fileMutex.unlock(); g_log.warning() << "No pixels from " << bankName << std::endl; return; }; } // Load the TOF vector std::vector<float> tof; file->readData(m_axisField, tof); size_t m_numBins = tof.size() - 1; if (tof.size() <= 1) { file->close(); m_fileMutex.unlock(); g_log.warning() << "Invalid " << m_axisField << " data in " << bankName << std::endl; return; } // Make a shared pointer MantidVecPtr Xptr; MantidVec &X = Xptr.access(); X.resize(tof.size(), 0); X.assign(tof.begin(), tof.end()); // Load the data. Coerce ints into double. std::string errorsField = ""; std::vector<double> data; file->openData(m_dataField); file->getDataCoerce(data); if (file->hasAttr("errors")) file->getAttr("errors", errorsField); file->closeData(); // Load the errors bool hasErrors = !errorsField.empty(); std::vector<double> errors; if (hasErrors) { try { file->openData(errorsField); file->getDataCoerce(errors); file->closeData(); } catch (...) { g_log.information() << "Error loading the errors field, '" << errorsField << "' for bank " << bankName << ". Will use sqrt(counts). " << std::endl; hasErrors = false; } } /*if (data.size() != m_numBins * m_numPixels) { file->close(); m_fileMutex.unlock(); g_log.warning() << "Invalid size of '" << m_dataField << "' data in " << bankName << std::endl; return; } if (hasErrors && (errors.size() != m_numBins * m_numPixels)) { file->close(); m_fileMutex.unlock(); g_log.warning() << "Invalid size of '" << errorsField << "' errors in " << bankName << std::endl; return; } */ // Have all the data I need m_fileMutex.unlock(); file->close(); for (size_t i = iPart; i < iPart + m_numPixels; i++) { // Find the workspace index for this detector detid_t pixelID = pixel_id[i - iPart]; size_t wi = id_to_wi.find(pixelID)->second; // Set the basic info of that spectrum ISpectrum *spec = WS->getSpectrum(wi); spec->setSpectrumNo(specid_t(wi + 1)); spec->setDetectorID(pixel_id[i - iPart]); // Set the shared X pointer spec->setX(X); // Extract the Y MantidVec &Y = spec->dataY(); Y.assign(data.begin() + i * m_numBins, data.begin() + (i + 1) * m_numBins); MantidVec &E = spec->dataE(); if (hasErrors) { // Copy the errors from the loaded document E.assign(errors.begin() + i * m_numBins, errors.begin() + (i + 1) * m_numBins); } else { // Now take the sqrt(Y) to give E E = Y; std::transform(E.begin(), E.end(), E.begin(), (double (*)(double))sqrt); } } // Done! }
MainWidget::MainWidget(QWidget *parent) :QMainWindow(parent) { QString str1; QString str2; // // Fix the Window Size // setMinimumWidth(sizeHint().width()); setMinimumHeight(sizeHint().height()); // // Load Local Configs // str1=QString("RDCastManager")+" v"+VERSION+" - "+tr("Host"); str2=QString(tr("User: [Unknown]")); setCaption(QString().sprintf("%s: %s, %s",(const char *)str1, (const char *)rda->config()->stationName(), (const char *)str2)); // // RIPC Connection // #ifndef WIN32 connect(rda->ripc(),SIGNAL(userChanged()),this,SLOT(userChangedData())); rda->ripc()->connectHost("localhost",RIPCD_TCP_PORT,rda->config()->password()); #endif // WIN32 // // User // rda->setUser(RD_USER_LOGIN_NAME); // // Create Fonts // QFont default_font("Helvetica",12,QFont::Normal); default_font.setPixelSize(12); qApp->setFont(default_font); QFont button_font=QFont("Helvetica",12,QFont::Bold); button_font.setPixelSize(12); // // Create Icons // cast_rivendell_map=new QPixmap(rivendell_xpm); setIcon(*cast_rivendell_map); cast_greencheckmark_map=new QPixmap(greencheckmark_xpm); cast_redx_map=new QPixmap(redx_xpm); // // Feed List // cast_feed_list=new RDListView(this); cast_feed_list->setFont(default_font); cast_feed_list->setAllColumnsShowFocus(true); cast_feed_list->setItemMargin(5); connect(cast_feed_list, SIGNAL(doubleClicked(QListViewItem *,const QPoint &,int)), this, SLOT(feedDoubleclickedData(QListViewItem *,const QPoint &,int))); cast_feed_list->addColumn(""); cast_feed_list->setColumnAlignment(0,Qt::AlignCenter); cast_feed_list->addColumn(tr("Key Name")); cast_feed_list->setColumnAlignment(1,Qt::AlignHCenter); cast_feed_list->addColumn(tr("Feed Name")); cast_feed_list->setColumnAlignment(2,Qt::AlignLeft); cast_feed_list->addColumn(tr("Description")); cast_feed_list->setColumnAlignment(3,Qt::AlignLeft); cast_feed_list->addColumn(tr("Casts")); cast_feed_list->setColumnAlignment(3,Qt::AlignCenter); // // Open Button // cast_open_button=new QPushButton(this); cast_open_button->setFont(button_font); cast_open_button->setText(tr("&View\nFeed")); connect(cast_open_button,SIGNAL(clicked()),this,SLOT(openData())); // // Close Button // cast_close_button=new QPushButton(this); cast_close_button->setFont(button_font); cast_close_button->setText(tr("&Close")); connect(cast_close_button,SIGNAL(clicked()),this,SLOT(quitMainWidget())); }
void MainWidget::feedDoubleclickedData(QListViewItem *,const QPoint &,int) { openData(); }
DataWindow::DataWindow(Information *info, int ind) { index = ind; xindex = STARTING_XPIN_INDEX; yindex = STARTING_YPIN_INDEX; ui = new Ui::DataWindow; ui->setupUi(this); widgetState = WIDGET_OPENED; widgetOpenAnimation = new QPropertyAnimation(ui->actionsContainerWidget, "maximumWidth", this); widgetOpenAnimation->setDuration(WIDGET_ANIMATION_TIME); widgetOpenAnimation->setEasingCurve(QEasingCurve::OutCubic); widgetCloseAnimation = new QPropertyAnimation(ui->actionsContainerWidget, "maximumWidth", this); widgetCloseAnimation->setDuration(WIDGET_ANIMATION_TIME); widgetCloseAnimation->setEasingCurve(QEasingCurve::OutCubic); windowOpenAnimation = new QPropertyAnimation(this, "geometry", this); windowOpenAnimation->setDuration(WIDGET_ANIMATION_TIME); windowOpenAnimation->setEasingCurve(QEasingCurve::OutCubic); windowCloseAnimation = new QPropertyAnimation(this, "geometry", this); windowCloseAnimation->setDuration(WIDGET_ANIMATION_TIME); windowCloseAnimation->setEasingCurve(QEasingCurve::OutCubic); openAnimation = new QParallelAnimationGroup(this); openAnimation->addAnimation(widgetOpenAnimation); openAnimation->addAnimation(windowOpenAnimation); connect(openAnimation, SIGNAL(finished()), this, SLOT(animationFinished())); closeAnimation = new QParallelAnimationGroup(this); closeAnimation->addAnimation(widgetCloseAnimation); closeAnimation->addAnimation(windowCloseAnimation); connect(closeAnimation, SIGNAL(finished()), this, SLOT(animationFinished())); connect(ui->retractionButton, SIGNAL(released()), this, SLOT(startAnimation())); setWindowTitle(tr("Data fill window: data") + QString::number(ind+1)); information = info; selectorSide = COLUMN_SELECTION; dataTable = new DataTable(info, STARTING_ROW_COUNT, STARTING_COLUMN_COUNT, ROW_HEIGHT, COLUMN_WIDTH); columnSelector = new ColumnSelectorWidget(STARTING_COLUMN_COUNT, STARTING_XPIN_INDEX, STARTING_YPIN_INDEX, STARTING_SELECTOR_INDEX); columnActionsWidget = new ColumnActionsWidget(dataTable, info, STARTING_COLUMN_COUNT); rowSelector = new RowSelectorWidget(STARTING_ROW_COUNT); rowActionsWidget = new RowActionsWidget(STARTING_ROW_COUNT); QHBoxLayout *columnSelectorLayout = new QHBoxLayout(); columnSelectorLayout->setMargin(0); columnSelectorLayout->setSpacing(0); columnSelectorSpacer = new QWidget(); columnSelector->setFixedHeight(COLUMN_SELECTOR_HEIGHT); columnSelectorLayout->addWidget(columnSelectorSpacer); columnSelectorLayout->addWidget(columnSelector); columnSelectorLayout->addStretch(); ui->tableLayout->addLayout(columnSelectorLayout); QVBoxLayout *rowSelectorLayout = new QVBoxLayout(); rowSelectorLayout->setMargin(0); rowSelectorLayout->setSpacing(0); rowSelectorSpacer = new QWidget(); rowSelector->setFixedWidth(ROW_SELECTOR_WIDTH); rowSelectorLayout->addWidget(rowSelectorSpacer); rowSelectorLayout->addWidget(rowSelector); rowSelectorLayout->addStretch(); QHBoxLayout *secondLayout = new QHBoxLayout(); secondLayout->setMargin(0); secondLayout->setSpacing(0); secondLayout->addLayout(rowSelectorLayout); secondLayout->addWidget(dataTable); ui->tableLayout->addLayout(secondLayout); ui->tableLayout->addStretch(); updateSelectorsSize(); connect(dataTable, SIGNAL(newPosCorrections()), this, SLOT(updateSelectorsSize())); connect(dataTable, SIGNAL(newColumnCount(int)), this, SLOT(updateSelectorsSize())); connect(dataTable, SIGNAL(newRowCount(int)), this, SLOT(updateSelectorsSize())); columnSelector->updateSelectorsPos(); rowSelector->updateSelectorsPos(); ui->actionsLayout->addWidget(columnActionsWidget); ui->actionsLayout->addWidget(rowActionsWidget); rowActionsWidget->hide(); csvHandler = new CSVhandler(this); connect(csvHandler, SIGNAL(dataFromCSV(QList<QStringList>)), dataTable, SLOT(addData(QList<QStringList>))); connect(ui->open, SIGNAL(released()), this, SLOT(openData())); connect(ui->save, SIGNAL(released()), this, SLOT(saveData())); connect(columnSelector, SIGNAL(newSelectorPos(bool,int)), columnActionsWidget, SLOT(setSelectorPos(bool,int))); connect(columnSelector, SIGNAL(askForSelector()), rowSelector, SLOT(askedForSelector())); connect(columnSelector, SIGNAL(askForSelector()), this, SLOT(selectorInColumnSelection())); connect(columnSelector, SIGNAL(newSelectorPos(bool,int)), this, SLOT(selectorPosChanged(bool,int))); connect(columnSelector, SIGNAL(newXIndex(int)), this, SLOT(dataChanged())); connect(columnSelector, SIGNAL(newYIndex(int)), this, SLOT(dataChanged())); connect(rowSelector, SIGNAL(askForSelector()), this, SLOT(selectorInRowSelection())); connect(rowSelector, SIGNAL(askForSelector()), columnSelector, SLOT(askedForSelector())); connect(rowSelector, SIGNAL(newIndex(bool,int)), this, SLOT(selectorPosChanged(bool,int))); connect(rowSelector, SIGNAL(newIndex(bool,int)), rowActionsWidget, SLOT(setSelectorPos(bool,int))); connect(rowActionsWidget, SIGNAL(insertRowClicked(int)), dataTable, SLOT(insertRow(int))); connect(rowActionsWidget, SIGNAL(removeRowClicked(int)), dataTable, SLOT(removeRow(int))); connect(columnActionsWidget, SIGNAL(insertColumnClicked(int)), dataTable, SLOT(insertColumn(int))); connect(columnActionsWidget, SIGNAL(removeColumnClicked(int)), dataTable, SLOT(removeColumn(int))); connect(dataTable, SIGNAL(newColumnCount(int)), columnSelector, SLOT(setColumnCount(int))); connect(dataTable, SIGNAL(newColumnCount(int)), columnActionsWidget, SLOT(setColumnCount(int))); connect(dataTable, SIGNAL(newRowCount(int)), rowSelector, SLOT(setRowCount(int))); connect(dataTable, SIGNAL(newRowCount(int)), rowActionsWidget, SLOT(setRowCount(int))); connect(dataTable, SIGNAL(valEdited(int,int)), this, SLOT(cellValChanged(int,int))); connect(dataTable, SIGNAL(newColumnName(int)), this, SLOT(columnNameChanged(int))); connect(dataTable, SIGNAL(columnMoved(int,int,int)), this, SLOT(columnMoved(int,int,int))); connect(ui->cartesian, SIGNAL(toggled(bool)), columnSelector, SLOT(setCoordinateSystem(bool))); connect(ui->cartesian, SIGNAL(toggled(bool)), this, SLOT(remakeDataList())); //connect to row actions widget connect(ui->addModel, SIGNAL(released()), this, SLOT(addModel())); connect(ui->polar, SIGNAL(toggled(bool)), this, SLOT(coordinateSystemChanged(bool))); connect(ui->help, SIGNAL(released()), this, SIGNAL(showHelpWindow())); }
int main( int argc, char *argv[] ) { int rc; char countryCode[3]; char description[81]; char msg[256]; unsigned int keyLength, dataLength; int i, k = 0; if ( argc < 3 ) { fprintf( stderr, "Usage: %s iso_3166_data_file quasar_address\n", argv[0] ); return 1; } rc = openData( argv[1] ); if ( rc != 0 ) return 1; /* Initialize shared memory and create our session */ rc = psoInit( argv[2], "FastPerf" ); if ( rc != 0 ) { fprintf( stderr, "At line %d, psoInit error: %d\n", __LINE__, rc ); return 1; } rc = psoInitSession( &session1 ); if ( rc != 0 ) { fprintf( stderr, "At line %d, psoInitSession error: %d\n", __LINE__, rc ); return 1; } /* Create a hash map object */ rc = createMap(); if ( rc != 0 ) { cleanup(); return 1; } fprintf( stderr, "Map created\n" ); for ( i = 0, k = 0; i < 100000; ++i ) { rc = psoFastMapGetFirst( map1, countryCode, 2, description, 80, &keyLength, &dataLength ); while ( rc == PSO_OK ) { countryCode[keyLength] = 0; description[dataLength] = 0; ++k; //fprintf( stderr, "Country code: %s, country: %s\n", countryCode, // description ); rc = psoFastMapGetNext( map1, countryCode, 2, description, 80, &keyLength, &dataLength ); } } if ( rc != PSO_REACHED_THE_END ) { psoErrorMsg(session1, msg, 256 ); fprintf( stderr, "At line %d, Hash Map loop abnormal error: %s\n", __LINE__, msg ); cleanup(); return 1; } fprintf( stderr, "Num of loops = %d\n", k ); if ( fp != NULL ) fclose( fp ); cleanup(); return 0; }