int main(int argc, char** argv) { try { TCLAP::CmdLine cmd("Query tool", ' '); TCLAP::SwitchArg showArg("", "show", "Show fields and exit", false); TCLAP::ValueArg<std::string> selectArg("s", "select", "Comma separated list of field names to select, if omitted, all fields are selected", false, "", "Field selection"); TCLAP::ValueArg<std::string> filterArg("f", "filter", "Filter expression in the form FIELDNAME=\"value\", filters selction", false, "", "Filter expression"); TCLAP::ValueArg<std::string> orderArg("o", "order", "Comma separated list of field names with which to order a selection", false, "", "Order by"); TCLAP::ValueArg<std::string> datastoreFileArg("d", "db", "JSON database file name to load or create", false, "db.json", "Database file"); cmd.add(showArg); cmd.add(selectArg); cmd.add(filterArg); cmd.add(orderArg); cmd.add(datastoreFileArg); cmd.parse(argc, argv); DataStore::DatabasePtrH database = DataStore::DataStorageJson::Load(datastoreFileArg.getValue().c_str()); DataStore::IFieldDescriptorConstListConstPtrH allFields = database->getScheme()->getFieldDescriptors(); // // Show fields and exit? // if (showArg.isSet()) { printFields(*(allFields.get())); return 0; } // // Parse selection (-s) into a list of field descriptors // DataStore::IFieldDescriptorConstListPtrH selectedFields; if (selectArg.isSet()) { selectedFields = parseFieldNameList(selectArg.getValue(), *(allFields.get())); } // // Parse filter (-f) expression into a logical expression AST // DataStore::Predicate filter = DataStore::Predicate::AlwaysTrue(); if (filterArg.isSet()) { DataStore::IQualifierPtrH filterAst = parseFilterExpression(filterArg.getValue(), *(allFields.get())); filter = DataStore::Predicate(filterAst); } // // Parse order (-o) in to list of field descriptors, order is // always ascending. // DataStore::IFieldDescriptorConstListPtrH orderByFields; if (orderArg.isSet()) { orderByFields = parseFieldNameList(orderArg.getValue(), *(allFields.get())); } // // Perform query, and print result // DataStore::IQueryResultConstPtrH result = database->query(selectedFields, &filter, orderByFields); printResult(*(result.get())); } catch (TCLAP::ArgException &e) { std::cerr << "error: " << e.error() << " for arg " << e.argId() << std::endl; return 1; } catch (std::exception& ex) { std::cerr << "error: " << ex.what() << std::endl; return 1; } return 0; }
int main(int argc, char* argv[]) { std::ofstream logFile("dump_log.txt"); /* // output test spectra. double mioSpectraComparePerSecond; double mioSpectraAdaptionPerSecond; SpectraBaseHelpers::testSpectraPerformance( mioSpectraComparePerSecond, mioSpectraAdaptionPerSecond ); Helpers::print( Helpers::numberToString<double>(mioSpectraComparePerSecond) +std::string(" million spectra compares per second.\n"), &logFile ); Helpers::print( Helpers::numberToString<double>(mioSpectraAdaptionPerSecond) +std::string(" million spectra adaption per second.\n"), &logFile ); return; */ Helpers::print("Welcome to SDSS Dump "+sstrSDSSVersionString+" !\n\n\n", &logFile); Helpers::print("Dump can do the following:\n", &logFile); Helpers::print("(1) Read SDSS spectra as FITS files from a given directory (and subdirectories) and dumps the data to a single binary file. Use -d\n", &logFile); Helpers::print(" DR12 spectra can be downloaded here: http://data.sdss3.org/sas/dr12/sdss/spectro/redux/26/spectra \n\n", &logFile); Helpers::print("(2) Generation of n sine test spectra with increasing frequency. Use -t\n\n", &logFile); Helpers::print("(3) Reads binary dump files and extracts text tables out of it. Use -i\n\n", &logFile); Helpers::print("(4) Uploads spectra from binary dump files to ASPECT-FPGA-Accelerator (AFA). Use -a\n\n", &logFile); std::string sstrDataDir = FileHelpers::getCurrentDirectory()+DATADIR; std::string sstrDumpFile = DUMPFILE; int sineTestSpectra = 0; unsigned int spectraFilter = SPT_DEFAULTFILTER; std::string sstrInputDumpFile(""); std::string sstrAfaDumpFile(""); std::string sstrSelectionListFilename(""); try { std::string sstrExamples("examples:\n"); sstrExamples += std::string("Write FITS files to binary dump file: \n dump.exe -d F:/SDSS_ANALYZE/fits/spectro/data/* -o allSpectra.bin -f 25 -s selectionlist.txt\n"); sstrExamples += std::string("Write 1000 sine test spectra: \n dump.exe -t 1000 -o allSpectra.bin\n"); sstrExamples += std::string("Outputs a linear list of the network: \n dump.exe -i sofmnet.bin\n"); sstrExamples += std::string("Uploads spectra dump to ASPECT-FPGA-Accelerator (AFA) \n dump.exe -a allSpectra.bin\n"); TCLAP::CmdLine cmd(sstrExamples, ' ', sstrSDSSVersionString); std::string sstrFilterDesc = std::string("where <filter> is any added combination of:\n"); sstrFilterDesc += std::string( " SPEC_UNKNOWN = 2\n"); sstrFilterDesc += std::string( " SPEC_STAR = 4\n"); sstrFilterDesc += std::string( " SPEC_GALAXY = 8\n"); sstrFilterDesc += std::string( " SPEC_QSO = 16\n"); TCLAP::ValueArg<std::string> dataDirArg("d", "datadir", "example: F:/SDSS_ANALYZE/fits/spectro/data/*", false, sstrDataDir, "datadir/*"); TCLAP::ValueArg<unsigned int> sineTestArg("t", "sinetest", "generate n sine test spectra", false, 0, "Number of sine test spectra."); TCLAP::ValueArg<std::string> outputFilenameArg("o", "outputdumpfile", "example: allSpectra.bin", false, sstrDumpFile, "outputfilename.bin"); TCLAP::ValueArg<unsigned int> filterArg("f", "filter", sstrFilterDesc, false, spectraFilter, "Dump only FITS files with the given filter type."); TCLAP::ValueArg<std::string> inputFilenameArg("i", "inputdumpfile", "example: sofmnet.bin. If input dump file is specified, then all other arguments are ignored. Outputs a linear list of the network.", false, sstrInputDumpFile, "Dumpfile for reverse reads."); TCLAP::ValueArg<std::string> selectionListFilenameArg("s", "selection", "Optional selection list of FITS files to dump a small subset of input spectra. File should contain plate-mjd-fiber pairs, e.g. 3586 55181 0001. First line in the file is the header and is ignored.", false, sstrSelectionListFilename, "selectionlist.txt"); TCLAP::ValueArg<std::string> afaFilenameArg("a", "afaupload", "example: allSpectra.bin. If afa upload is specified, then upload spectra dump to ASPECT-FPGA-Accelerator (AFA). All other arguments are ignored.", false, sstrAfaDumpFile, "Dumpfile for AFA upload."); cmd.add( dataDirArg ); cmd.add( outputFilenameArg ); cmd.add( sineTestArg ); cmd.add( filterArg ); cmd.add( inputFilenameArg ); cmd.add( selectionListFilenameArg ); cmd.add( afaFilenameArg ); cmd.parse( argc, argv ); sstrDataDir = dataDirArg.getValue(); sstrDumpFile = outputFilenameArg.getValue(); sineTestSpectra = sineTestArg.getValue(); spectraFilter = filterArg.getValue(); sstrInputDumpFile = inputFilenameArg.getValue(); sstrAfaDumpFile = afaFilenameArg.getValue(); sstrSelectionListFilename = selectionListFilenameArg.getValue(); } catch (TCLAP::ArgException &e) { Helpers::print( "error: "+e.error()+" for argument "+e.argId()+"\n", &logFile ); } const bool bExtractFilenames = !sstrInputDumpFile.empty(); const bool bAfaUpload = !sstrAfaDumpFile.empty(); if ( sineTestSpectra > 0 ) { // generate sine test spectra. /////////////////////////////////////////////////////////////////////////////////// Helpers::print( "Generating : "+Helpers::numberToString<int>(sineTestSpectra)+" sine test spectra.\n", &logFile ); Helpers::print( "dumpfile: "+sstrInputDumpFile+"\n", &logFile ); SpectraVFS::write( sineTestSpectra, 0.0f, sstrDumpFile ); Helpers::print( "fin.\n", &logFile ); return 0; } else if ( bExtractFilenames ) { // extract FITS filenames from a given binary dump. /////////////////////////////////////////////////////////////////////////////////// Helpers::print( "Filename extraction from dumpfile with following parameters:\n", &logFile); Helpers::print( "dumpfile: "+sstrInputDumpFile+"\n", &logFile ); SpectraVFS vfs(sstrInputDumpFile, true); size_t numSpectra( vfs.getNumSpectra() ); if ( numSpectra == 0) { return 1; } std::string sstrOutFileName(FileHelpers::getFileNameMinusExtension(sstrDumpFile)); sstrOutFileName += ".txt"; std::ofstream fon(sstrOutFileName.c_str()); for (size_t i=0;i<numSpectra;i++) { Spectra *a = vfs.beginRead(i); fon << a->getFileName() + std::string("\n"); vfs.endRead(i); } Helpers::print( "fin.\n", &logFile ); return 0; } else if ( bAfaUpload ) { // upload spectra dump file to AFA /////////////////////////////////////////////////////////////////////////////////// Helpers::print( "Uploading spectra to ASPECT-FPGA-Accelerator (AFA) with following parameters:\n", &logFile); Helpers::print( "dumpfile: "+sstrAfaDumpFile+"\n", &logFile ); SpectraVFS vfs(sstrAfaDumpFile, true); size_t numSpectra( vfs.getNumSpectra() ); if ( numSpectra == 0) { return 1; } AfaConnector afaConnector; if ( !afaConnector.isAFADeviceAvailable() ) { Helpers::print( "Could not find ASPECT-FPGA-Accelerator:\n", &logFile ); Helpers::print( afaConnector.getErrorMsg()+"\n", &logFile ); return 1; } if ( !afaConnector.writeSpectra(vfs) ) { Helpers::print( "Error transferring data to ASPECT-FPGA-Accelerator:\n", &logFile ); Helpers::print( afaConnector.getErrorMsg(), &logFile ); return 1; } Helpers::print( "Finished transfer of "+ Helpers::numberToString<int>(numSpectra) +" spectra to ASPECT-FPGA-Accelerator.\n", &logFile ); return 0; } else { // load spectra and pack all necessary information into a single binary file. /////////////////////////////////////////////////////////////////////////////////// Helpers::print( "Creating binary dump with following parameters:\n", &logFile); Helpers::print( "datadir: "+sstrDataDir+"\n", &logFile ); Helpers::print( "dumpfile: "+sstrDumpFile+"\n", &logFile ); Helpers::print( "filter: "+Spectra::spectraFilterToString(spectraFilter)+"\n", &logFile ); Helpers::print( "selectionlist: "+sstrSelectionListFilename+"\n", &logFile ); Helpers::print( "each spectrum contains " + Helpers::numberToString<size_t>(sizeof(Spectra)) + " bytes.\n\n", &logFile ); std::set<std::string> FITSFilenameSet; if ( !sstrSelectionListFilename.empty() ) { bool bSuccess = SpectraHelpers::readSelectionList(sstrSelectionListFilename, FITSFilenameSet); if ( !bSuccess || FITSFilenameSet.empty() ) { Helpers::print( "Selection list not found or empty.\n", &logFile ); } } Helpers::print( "starting dump...\n", &logFile ); size_t writtenSpectra = SpectraVFS::write( sstrDataDir, sstrDumpFile, spectraFilter, &logFile, &FITSFilenameSet ); Helpers::print( "...finished writing "+ Helpers::numberToString<size_t>(writtenSpectra) +" spectra.\n", &logFile ); } return 0; }