IOConfig::IOConfig( const GRIDSection& grid, const RUNSPECSection& runspec, bool nosim, const std::string& input_path ) : m_write_INIT_file( grid.hasKeyword( "INIT" ) ), m_write_EGRID_file( write_egrid_file( grid ) ), m_UNIFIN( runspec.hasKeyword( "UNIFIN" ) ), m_UNIFOUT( runspec.hasKeyword( "UNIFOUT" ) ), m_FMTIN( runspec.hasKeyword( "FMTIN" ) ), m_FMTOUT( runspec.hasKeyword( "FMTOUT" ) ), m_deck_filename( input_path ), m_output_dir( outputdir( input_path ) ), m_base_name( basename( input_path ) ), m_nosim( nosim ) {}
static void WriteFIDStructure(const char *odir, db::Database *thedb, bool karma) { fidmap[0x100] = 0x100; std::string outputdir(util::posix::Canonicalise(odir)); // Allocate tunes first, to cause minimum pressure on dynamic data area PreAllocateFIDs(thedb, mediadb::TUNE); PreAllocateFIDs(thedb, mediadb::SPOKEN); printf("Highest tune fid: 0x%x\n", next_fid - 0x10); PreAllocateFIDs(thedb, mediadb::DIR); PreAllocateFIDs(thedb, mediadb::PLAYLIST); printf("Highest fid: 0x%x\n", next_fid - 0x10); uint64_t drivesize[2]; drivesize[0] = 0; drivesize[1] = 0; karma::DBWriter kdbwriter; for (fidmap_t::const_iterator i = fidmap.begin(); i != fidmap.end(); ++i) { db::QueryPtr qp = thedb->CreateQuery(); qp->Where(qp->Restrict(mediadb::ID, db::EQ, i->first)); db::RecordsetPtr rs = qp->Execute(); if (rs && !rs->IsEOF() && i->second) { unsigned int destfid = i->second; std::string s = outputdir; char outputleaf[40]; unsigned int drive; std::string playlist; db::RecordsetPtr krs(db::FreeRecordset::Create()); krs->SetInteger(mediadb::ID, destfid); if (karma) { drive = 0; } else { drive = (drivesize[0] > drivesize[1]) ? 1 : 0; } sprintf(outputleaf, "/drive%u/_%05x/%03x", drive^1, destfid/4096, destfid & 4095); unlink((s+outputleaf).c_str()); sprintf(outputleaf, "/drive%u/_%05x/%03x", drive, destfid/4096, destfid & 4095); unlink((s+outputleaf).c_str()); util::MkdirParents((s+outputleaf).c_str()); unsigned int type = rs->GetInteger(mediadb::TYPE); unsigned int length; if (type == mediadb::TUNE || type == mediadb::SPOKEN) { unsigned int highfid = rs->GetInteger(mediadb::IDHIGH); if (highfid) { qp = thedb->CreateQuery(); qp->Where(qp->Restrict(mediadb::ID, db::EQ, highfid)); db::RecordsetPtr rs2 = qp->Execute(); if (rs2 && !rs2->IsEOF()) rs = rs2; else TRACE << "Highfid " << highfid << " failed (" << rs->GetString(mediadb::IDHIGH) << ")\n"; } util::posix::MakeRelativeLink(s+outputleaf, rs->GetString(mediadb::PATH)); drivesize[drive] += rs->GetInteger(mediadb::SIZEBYTES); length = rs->GetInteger(mediadb::SIZEBYTES); } else { std::vector<unsigned int> children; if (karma) { std::vector<unsigned int> rawChildren; mediadb::ChildrenToVector(rs->GetString(mediadb::CHILDREN), &rawChildren); children.reserve(rawChildren.size()*2 + 1); children.push_back(0x2ff); // new-type-playlist marker for (std::vector<unsigned int>::const_iterator j = rawChildren.begin(); j != rawChildren.end(); ++j) { if (*j) { unsigned lefid = fidmap[*j]; if (lefid) { children.push_back(lefid); children.push_back(1); // "fid generation" } } } } else { std::vector<unsigned int> rawChildren; mediadb::ChildrenToVector(rs->GetString(mediadb::CHILDREN), &rawChildren); children.reserve(rawChildren.size()); for (std::vector<unsigned int>::const_iterator j = rawChildren.begin(); j != rawChildren.end(); ++j) { if (*j) { unsigned lefid = fidmap[*j]; if (lefid) { children.push_back(lefid); } } } } /// @todo if (karma) write to krs too length = 0; FILE *f = fopen((s+outputleaf).c_str(), "w"); if (f) { for (unsigned int j=0; j<children.size(); ++j) { unsigned lefid = children[j]; length += (unsigned int)fwrite(&lefid, 1, 4, f); } fclose(f); } } destfid |= 1; sprintf(outputleaf, "/drive%u/_%05x/%03x", drive^1, destfid/4096, destfid & 4095); unlink((s+outputleaf).c_str()); sprintf(outputleaf, "/drive%u/_%05x/%03x", drive, destfid/4096, destfid & 4095); unlink((s+outputleaf).c_str()); FILE *f = fopen((s+outputleaf).c_str(), "w"); if (f) { /// @todo Write fields to krs too krs->SetString(mediadb::TITLE, rs->GetString(mediadb::TITLE)); krs->SetString(mediadb::TYPE, typemap[type]); krs->SetInteger(mediadb::SIZEBYTES, length); fprintf(f, "type=%s\n", typemap[type]); fprintf(f, "title=%s\n", rs->GetString(mediadb::TITLE).c_str()); fprintf(f, "length=%u\n", length); if (type == mediadb::TUNE || type == mediadb::SPOKEN) { unsigned int rate = rs->GetInteger(mediadb::BITSPERSEC)/1000; std::string ebr =(boost::format("vs%u") % rate).str(); fprintf(f, "bitrate=%s\n", ebr.c_str()); fprintf(f, "codec=%s\n", codecmap[rs->GetInteger(mediadb::AUDIOCODEC)]); fprintf(f, "duration=%u\n", rs->GetInteger(mediadb::DURATIONMS)); fprintf(f, "samplerate=%u\n", rs->GetInteger(mediadb::SAMPLERATE)); MaybeWriteString(f, rs, "artist", mediadb::ARTIST); MaybeWriteString(f, rs, "genre", mediadb::GENRE); MaybeWriteString(f, rs, "source", mediadb::ALBUM); MaybeWriteInt(f, rs, "tracknr", mediadb::TRACKNUMBER); MaybeWriteInt(f, rs, "year", mediadb::YEAR); if (karma) { MaybeWriteInt(f, rs, "ctime", mediadb::CTIME); fprintf(f, "fid_generation=1\n"); } krs->SetString(mediadb::ARTIST, rs->GetString(mediadb::ARTIST)); krs->SetString(mediadb::ALBUM, rs->GetString(mediadb::ALBUM)); krs->SetString(mediadb::GENRE, rs->GetString(mediadb::GENRE)); krs->SetString(mediadb::YEAR, rs->GetString(mediadb::YEAR)); krs->SetString(mediadb::BITSPERSEC, ebr.c_str()); } else if (karma) { fprintf(f, "fid_generation=1\n"); } fclose(f); } if (karma) { kdbwriter.addRecord(krs); } } } if (karma) { std::string smalldb(outputdir); smalldb += "/smalldb"; std::unique_ptr<util::Stream> fs; unsigned rc = OpenFileStream(smalldb.c_str(), util::WRITE, &fs); if (rc) { perror("open smalldb"); } else { rc = kdbwriter.write(fs.get()); if (rc) { perror("write smalldb"); } } } printf("Drive 0: %llu bytes used\n", (unsigned long long)drivesize[0]); printf("Drive 1: %llu bytes used\n", (unsigned long long)drivesize[1]); }
IOConfig::IOConfig( const std::string& input_path ) : m_timemap( TimeMap{ Deck{} } ), m_deck_filename( input_path ), m_output_dir( outputdir( input_path ) ), m_base_name( basename( input_path ) ) {}
int main( int argc, char* argv[] ) { if( argc > 1 ) { energy = atoi(argv[1]); } setStyle(); std::string dataDir(Form("../data_%dGeV", energy)); if( cef3_thickness==3. ) dataDir = std::string(Form("../data_3mm_%dGeV", energy)); std::vector<DataFile> dataFiles; dataFiles.push_back(DataFile("EEShash_LYSO_tung25_nLayers28.root", dataDir) ); if( cef3_thickness==5. ) { dataFiles.push_back(DataFile("EEShash_CeF3_tung15_nLayers34.root", dataDir) ); dataFiles.push_back(DataFile("EEShash_CeF3_tung20_nLayers28.root", dataDir) ); dataFiles.push_back(DataFile("EEShash_CeF3_tung25_nLayers24.root", dataDir) ); dataFiles.push_back(DataFile("EEShash_CeF3_tung30_nLayers21.root", dataDir) ); dataFiles.push_back(DataFile("EEShash_CeF3_tung35_nLayers19.root", dataDir) ); dataFiles.push_back(DataFile("EEShash_CeF3_tung40_nLayers17.root", dataDir) ); dataFiles.push_back(DataFile("EEShash_CeF3_tung45_nLayers16.root", dataDir) ); dataFiles.push_back(DataFile("EEShash_CeF3_tung50_nLayers14.root", dataDir) ); dataFiles.push_back(DataFile("EEShash_CeF3_tung55_nLayers13.root", dataDir) ); dataFiles.push_back(DataFile("EEShash_CeF3_tung60_nLayers12.root", dataDir) ); dataFiles.push_back(DataFile("EEShash_CeF3_tung65_nLayers12.root", dataDir) ); dataFiles.push_back(DataFile("EEShash_CeF3_tung70_nLayers11.root", dataDir) ); dataFiles.push_back(DataFile("EEShash_CeF3_tung75_nLayers10.root", dataDir) ); dataFiles.push_back(DataFile("EEShash_CeF3_tung80_nLayers10.root", dataDir) ); } else if( cef3_thickness==3. ) { dataFiles.push_back(DataFile("EEShash_CeF3_tung30_nLayers24.root", dataDir) ); dataFiles.push_back(DataFile("EEShash_CeF3_tung35_nLayers21.root", dataDir) ); dataFiles.push_back(DataFile("EEShash_CeF3_tung40_nLayers19.root", dataDir) ); dataFiles.push_back(DataFile("EEShash_CeF3_tung45_nLayers17.root", dataDir) ); dataFiles.push_back(DataFile("EEShash_CeF3_tung50_nLayers15.root", dataDir) ); dataFiles.push_back(DataFile("EEShash_CeF3_tung55_nLayers14.root", dataDir) ); dataFiles.push_back(DataFile("EEShash_CeF3_tung60_nLayers13.root", dataDir) ); dataFiles.push_back(DataFile("EEShash_CeF3_tung65_nLayers12.root", dataDir) ); dataFiles.push_back(DataFile("EEShash_CeF3_tung70_nLayers12.root", dataDir) ); dataFiles.push_back(DataFile("EEShash_CeF3_tung75_nLayers11.root", dataDir) ); //dataFiles.push_back(DataFile("EEShash_CeF3_tung80_nLayers10.root", dataDir) ); } std::string outputdir(Form("Plots_CeF3_vs_LYSO_%dGeV", energy)); if( cef3_thickness!=5. ) outputdir = std::string(Form("Plots_CeF3_vs_LYSO_%dGeV_%.0fmm", energy, cef3_thickness)); system( Form("mkdir -p %s", outputdir.c_str()) ); TGraphErrors* gr_mol = getMoliereGraph( dataFiles ); TGraphErrors* gr_vol = getVolumeGraph( dataFiles ); std::pair<TGraphErrors*, TGraphErrors*> gr_resp_reso = getResponseGraphs( outputdir, dataFiles ); std::vector< TGraphErrors* > graphs; graphs.push_back( gr_mol ); graphs.push_back( gr_vol ); graphs.push_back( gr_resp_reso.first ); graphs.push_back( gr_resp_reso.second ); for( unsigned i=0; i<graphs.size(); ++i ) drawSingleGraph( outputdir, graphs[i] ); drawCompareAll( outputdir, graphs ); return 0; }
IOConfig::IOConfig( const std::string& input_path ) : m_deck_filename( input_path ), m_output_dir( outputdir( input_path ) ), m_base_name( basename( input_path ) ) {}
IOConfig::IOConfig( const std::string& input_path ) : m_deck_filename( input_path ), m_output_dir( outputdir( input_path ) ) { this->setBaseName(basename(input_path)); }