diff --git a/Appl/CEP/CS1/CS1_Interface/include/CS1_Interface/CS1_Parset.h b/Appl/CEP/CS1/CS1_Interface/include/CS1_Interface/CS1_Parset.h index 18003e40d05c6e3aaee20d07090685fa91fd2384..bc132934280f6ca2e9bebef7431fa9c9edbd2711 100644 --- a/Appl/CEP/CS1/CS1_Interface/include/CS1_Interface/CS1_Parset.h +++ b/Appl/CEP/CS1/CS1_Interface/include/CS1_Interface/CS1_Parset.h @@ -84,7 +84,6 @@ public: double timeInterval() const; uint32 nrBGLNodesPerCell() const; vector<double> refFreqs() const; - vector<string> msNames() const; double chanWidth() const; vector<string> delay_Ports() const; vector<string> getPortsOf(const string& aKey) const; @@ -95,6 +94,7 @@ public: bool useGather() const; uint32 nrOutputsPerInputNode() const; uint32 nrInputsPerStorageNode() const; + string getMSname(unsigned firstSB, unsigned lastSB) const; //# Datamembers string name; diff --git a/Appl/CEP/CS1/CS1_Interface/src/CS1_Parset.cc b/Appl/CEP/CS1/CS1_Interface/src/CS1_Parset.cc index 4926c62b68eace7716775ad5bf2954d82c01e4bb..7c1663fd60c6f4efff0551b8c3cbcdd848de2a29 100644 --- a/Appl/CEP/CS1/CS1_Interface/src/CS1_Parset.cc +++ b/Appl/CEP/CS1/CS1_Interface/src/CS1_Parset.cc @@ -29,6 +29,12 @@ //#include <APL/APLCommon/APLUtilities.h> #include <CS1_Interface/CS1_Parset.h> +#include <boost/algorithm/string.hpp> +#include <boost/algorithm/string/classification.hpp> +#include <boost/algorithm/string/split.hpp> +#include <boost/format.hpp> + + namespace LOFAR { using namespace ACC::APS; namespace CS1 { @@ -79,52 +85,34 @@ vector<double> CS1_Parset::refFreqs() const for (uint i = 0; i < nrSubbands(); i++) { - refFreqs.push_back((getUint32("Observation.nyquistZone")-1)*(getUint32("Observation.sampleClock")*1000000/2) + sampleRate()*subbandIDs[i]); + } return refFreqs; } -vector<string> CS1_Parset::msNames() const +string CS1_Parset::getMSname(unsigned firstSB, unsigned lastSB) const { - uint32 first, last; - string msName; - vector<string> msNames; - char obsid[32]; - char subbandID[32]; - - if (!isDefined("Observation.MSNameMask")) - { - sprintf(obsid, "%05u", getUint32("Observation.treeID")); - string msNumber = "/data/L" + getString("Observation.year") + "_" + string(obsid); - - if (getUint32("OLAP.subbandsPerPset") == 1 ) - { - for (uint i = 0; i < nrSubbands(); i++) - { - sprintf(subbandID, "_SB%u", i); - msName = msNumber + string(subbandID) + ".MS"; - msNames.push_back(msName); - } - } - else - { - for (uint i = 0; i < nrSubbands()/getUint32("OLAP.subbandsPerPset") ; i++) - { - first = i * getUint32("OLAP.subbandsPerPset"); - last = first + getUint32("OLAP.subbandsPerPset") -1; - sprintf(subbandID, "_SB%u-%u", first, last); - msName = msNumber + string(subbandID) + ".MS"; - msNames.push_back(msName); - } - } - } - else - return getStringVector("Observation.MSNameMask"); - - return (msNames); + using namespace boost; + + string name = getString("Observation.MSNameMask"); + string startTime = getString("Observation.startTime"); + vector<string> splitStartTime; + split(splitStartTime, startTime, is_any_of("- :")); + + replace_all(name, "${YEAR}", splitStartTime[0]); + replace_all(name, "${MONTH}", splitStartTime[1]); + replace_all(name, "${DAY}", splitStartTime[2]); + replace_all(name, "${HOURS}", splitStartTime[3]); + replace_all(name, "${MINUTES}", splitStartTime[4]); + replace_all(name, "${SECONDS}", splitStartTime[5]); + + replace_all(name, "${MSNUMBER}", str(format("%05u") % getUint32("Observation.ObsId"))); + replace_all(name, "${SUBBAND}", str(firstSB != lastSB ? format("%u-%u") % firstSB % lastSB : format("%d") % firstSB)); + + return name; } vector<string> CS1_Parset::delay_Ports() const diff --git a/Appl/CEP/CS1/CS1_Run/src/CS1.parset b/Appl/CEP/CS1/CS1_Run/src/CS1.parset index 7ec53633039d26594d7f9f05ecdd95905c57cbf4..512bc850fd4febd331c09135c2616fc0f4be7b2d 100644 --- a/Appl/CEP/CS1/CS1_Run/src/CS1.parset +++ b/Appl/CEP/CS1/CS1_Run/src/CS1.parset @@ -47,6 +47,7 @@ OLAP.IONProc.integrationSteps = 1 OLAP.StorageProc.integrationSteps = 60 OLAP.StorageProc.subbandsPerMS = 1 +Observation.MSNameMask = /data/L${YEAR}_${MSNUMBER}/SB${SUBBAND}.MS # Variables for the DelayCompensation OLAP.DelayComp.converterType = IMPL # should be one of IMPL, CLIENT diff --git a/Appl/CEP/CS1/CS1_Run/src/CS1_Run.py b/Appl/CEP/CS1/CS1_Run/src/CS1_Run.py index ae115cb7ca4d2f6082ee31c22dfb5006a5ea5549..c407e3baaa3d0fed67834afb3a4e2788f8fa7249 100755 --- a/Appl/CEP/CS1/CS1_Run/src/CS1_Run.py +++ b/Appl/CEP/CS1/CS1_Run/src/CS1_Run.py @@ -157,51 +157,35 @@ if __name__ == '__main__': runningNumberFile = '/log/nextMSNumber' MSdatabaseFile = '/log/MSList' - if not 'Observation.MSNameMask' in parset: - try: - inf = open(runningNumberFile, 'r') - measurementnumber = int(inf.readline()) - inf.close() - - # MS name is L<yyyy>_<nnnnn>_<mmm>.MS - # the <mmm> is filled in by the subbandwriter - - #MSNumber = '/data/L' + parset.getString(Observation.year) + '_' + parset.getString('Observation.treeID') - - year = str(time.gmtime()[0]) - MSNumber = '/data/L' + year + '_' + '%05d' % measurementnumber - MSName = MSNumber + '.MS' - subbandsPerStorage = parset.getInt32('OLAP.subbandsPerPset') * parset.getInt32('OLAP.psetsPerStorage') - subbandsPerMS = parset.getInt32('OLAP.StorageProc.subbandsPerMS') - - if (subbandsPerMS == 1): - MSName = '\'' + MSNumber + '/SB%01d' % 0 + '.MS' + '\'' - for i in range(1, len(parset.getInt32Vector('Observation.subbandList'))): - MSName = MSName + ', \\\n' + '\'' + MSNumber + '/SB%01d' % i + '.MS' + '\'' - else: - MSName = '\'' + MSNumber + '/SB%01d' % 0 + '-%01d' % (subbandsPerMS - 1) +'.MS' + '\'' - for i in range(1, len(parset.getInt32Vector('Observation.subbandList')) / subbandsPerMS): - first = i * subbandsPerMS - last = first + subbandsPerMS - 1 - MSName = MSName + ', \\\n' + '\'' + MSNumber + '/SB%01d' % first + '-%01d' % last +'.MS' + '\'' - - outf = open(runningNumberFile, 'w') - outf.write(str(measurementnumber + 1) + '\n') - outf.close() - - dbfile = open(MSdatabaseFile, 'a') - nodesStr = str([1] * parset.getNCells() + [0] * (12 - parset.getNCells()))[1:-1] - dateStr = time.strftime('%Y %0m %0d', time.gmtime()) - dbfile.write(MSNumber + '\t' + dateStr + '\t' + nodesStr + '\n') - dbfile.close() - except: - MSName = '/data/Test.MS' - sys.exit(1) - - parset['Observation.MSNameMask'] = '[' + MSName + ']' - + try: + inf = open(runningNumberFile, 'r') + measurementnumber = int(inf.readline()) + inf.close() + parset['Observation.ObsId'] = measurementnumber + outf = open(runningNumberFile, 'w') + outf.write(str(measurementnumber + 1) + '\n') + outf.close() + + dbfile = open(MSdatabaseFile, 'a') + nodesStr = str([1] * parset.getNCells() + [0] * (12 - parset.getNCells()))[1:-1] + dateStr = time.strftime('%Y %0m %0d %H %M %S', time.gmtime()).split() + MS = parset.getString('Observation.MSNameMask') + MS = MS.replace('${YEAR}', dateStr[0]) + MS = MS.replace('${MONTH}', dateStr[1]) + MS = MS.replace('${DAY}', dateStr[2]) + MS = MS.replace('${HOURS}', dateStr[3]) + MS = MS.replace('${MINUTES}', dateStr[4]) + MS = MS.replace('${SECONDS}', dateStr[5]) + MS = MS.replace('${MSNUMBER}', '%05d' % parset['Observation.ObsId']) + MS = MS.replace('${SUBBAND}', '*') + + dbfile.write(MS + '\t' + ' '.join(dateStr[0:3]) + '\t' + nodesStr + '\n') + dbfile.close() + except: + sys.exit(1) + - obsID = 'L' + year + '_' + '%05d' % measurementnumber + obsID = 'L' + dateStr[0] + '_' + '%05d' % measurementnumber # start the observation doObservation(obsID, parset) diff --git a/Appl/CEP/CS1/CS1_Storage/src/WH_SubbandWriter.cc b/Appl/CEP/CS1/CS1_Storage/src/WH_SubbandWriter.cc index ff7e752d27cf0f512eabd30805183b7f7e70a92c..fb46e13458127ee2ecdfcd7df5ae3e602074a684 100644 --- a/Appl/CEP/CS1/CS1_Storage/src/WH_SubbandWriter.cc +++ b/Appl/CEP/CS1/CS1_Storage/src/WH_SubbandWriter.cc @@ -137,27 +137,6 @@ namespace LOFAR }; #endif - // create MSWriter object - vector<string> msNames = itsCS1PS->msNames(); - -#if 0 - // split name in base part and extension (if any) - string::size_type idx = msName.rfind('.'); - pair<string,string> ms(msName.substr(0,idx), - idx == string::npos ? "" : msName.substr(idx)); - // insert subband-id into the name - ostringstream oss; - oss << '.' << setfill('0') << setw(3) << itsSubbandID; - // rebuild the MS name string - msName = ms.first + oss.str() + ms.second; -#endif - -#if defined HAVE_MPI - LOG_TRACE_VAR_STR("Creating MS-file \"" << msNames[TH_MPI::getCurrentRank()] << "\""); -#else - LOG_TRACE_VAR_STR("Creating MS-file \"" << msNames[0] << "\""); -#endif - double startTime = itsCS1PS->startTime(); LOG_TRACE_VAR_STR("startTime = " << startTime); @@ -173,17 +152,20 @@ namespace LOFAR itsNrSubbandsPerMS = itsCS1PS->getUint32("OLAP.StorageProc.subbandsPerMS"); ASSERT(itsCS1PS->getUint32("OLAP.subbandsPerPset") * itsCS1PS->getUint32("OLAP.psetsPerStorage") % itsNrSubbandsPerMS == 0); - itsWriters.resize(itsCS1PS->getUint32("OLAP.subbandsPerPset") * itsCS1PS->getUint32("OLAP.psetsPerStorage") / itsNrSubbandsPerMS); - itsFieldIDs.resize(itsWriters.size()); + unsigned mssesPerStorage = itsCS1PS->getUint32("OLAP.subbandsPerPset") * itsCS1PS->getUint32("OLAP.psetsPerStorage") / itsNrSubbandsPerMS; + itsWriters.resize(mssesPerStorage); + itsFieldIDs.resize(mssesPerStorage); - for (unsigned i = 0; i < itsWriters.size(); i ++) { - itsWriters[i] = new MSWriter( - + for (unsigned i = 0; i < mssesPerStorage; i ++) { #if defined HAVE_MPI - msNames[TH_MPI::getCurrentRank() * itsWriters.size() + i].c_str(), + unsigned firstSubband = (TH_MPI::getCurrentRank() * mssesPerStorage + i) * itsNrSubbandsPerMS; #else - msNames[i].c_str(), + unsigned firstSubband = i * itsNrSubbandsPerMS; #endif + unsigned lastSubband = firstSubband + itsNrSubbandsPerMS - 1; + + itsWriters[i] = new MSWriter( + itsCS1PS->getMSname(firstSubband, lastSubband).c_str(), startTime, itsCS1PS->storageIntegrationTime(), itsNChannels, itsNPolSquared, itsNBeams, itsNStations, antPos, storageStationNames, itsTimesToIntegrate, itsNrSubbandsPerMS);