diff --git a/MAC/APL/PAC/IBS_Protocol/src/IBS_Protocol.prot b/MAC/APL/PAC/IBS_Protocol/src/IBS_Protocol.prot index 821831ecaf96d5ef57ff2edb86b5ba2fc8f8e06d..747a98b738b0da2f19d0d3700f82fb137ec95246 100644 --- a/MAC/APL/PAC/IBS_Protocol/src/IBS_Protocol.prot +++ b/MAC/APL/PAC/IBS_Protocol/src/IBS_Protocol.prot @@ -132,7 +132,12 @@ event = { type = "string"; }; - // how the subbands should be allocated to which beamlets + param = { + name = "band"; + type = "string"; + }; + + // how the subbands should be allocated to which beamlets // e.g. // beamlet 0 -> subband 384 // beamlet 1 -> subband 385 @@ -157,10 +162,10 @@ event = { }; // NEW: temporarely(?) for selecting the right calibrationTable. - param = { - name = "rcuMode"; - type = "uint32"; - }; + //param = { + // name = "rcuMode"; + // type = "uint32"; + //}; }; event = { @@ -189,7 +194,7 @@ event = { name = "beamName"; type = "string"; }; - + // New mapping of beamlets to subbands, the left-hand side of // the mapping (the beamlets) must be identical to the left-hand // side of the mapping specified in the BEAMALLOC event. @@ -205,7 +210,7 @@ event = { event = { signal = BEAMMODIFYACK; dir = OUT; - + // handle param = { name = "beamName"; diff --git a/MAC/APL/PAC/ITRFBeamServer/src/AnalogueBeam.cc b/MAC/APL/PAC/ITRFBeamServer/src/AnalogueBeam.cc index 7407bc8648598b5b81ec3e1860b3c4d357c1105a..6ee517809e421faa6016065c1095d771e4c9a91a 100644 --- a/MAC/APL/PAC/ITRFBeamServer/src/AnalogueBeam.cc +++ b/MAC/APL/PAC/ITRFBeamServer/src/AnalogueBeam.cc @@ -46,11 +46,12 @@ using namespace RTC; // // AnalogueBeam(name, subarray, nrSubbands) // -AnalogueBeam::AnalogueBeam(const string& name, - const string& antennaSet, +AnalogueBeam::AnalogueBeam(const string& name, + const string& antennaSetName, + const string& bandName, const bitset<MAX_RCUS>& rcuMask, uint rankNr) : - Beam (name, antennaSet, rcuMask), + Beam (name, antennaSetName, bandName, rcuMask), itsRankNr (rankNr) {} diff --git a/MAC/APL/PAC/ITRFBeamServer/src/AnalogueBeam.h b/MAC/APL/PAC/ITRFBeamServer/src/AnalogueBeam.h index 4e0e8974c860db46cc27de2051d9a470694c0cc3..26ad1165bb7a911cf674d113be88459bf9105777 100644 --- a/MAC/APL/PAC/ITRFBeamServer/src/AnalogueBeam.h +++ b/MAC/APL/PAC/ITRFBeamServer/src/AnalogueBeam.h @@ -39,8 +39,9 @@ public: // key-value logger as nodeid. // @param rcuMask The RCUs that participate in this beam. // @param ringNr The serdes segment the allocation is ment for. - AnalogueBeam(const string& name, - const string& antennaSet, + AnalogueBeam(const string& name, + const string& antennaSetName, + const string& bandName, const bitset<MAX_RCUS>& rcuMask, uint rankNr); AnalogueBeam() : itsRankNr(0) {}; diff --git a/MAC/APL/PAC/ITRFBeamServer/src/Beam.cc b/MAC/APL/PAC/ITRFBeamServer/src/Beam.cc index 1389c2ce7d5c4a28302724aad0f455384ad8d951..1387e6c94909ef842ef9faa54b8166bf4bc6b164 100644 --- a/MAC/APL/PAC/ITRFBeamServer/src/Beam.cc +++ b/MAC/APL/PAC/ITRFBeamServer/src/Beam.cc @@ -34,11 +34,13 @@ using namespace std; // // Beam(name, rcuMask) // -Beam::Beam(const string& name, +Beam::Beam(const string& name, const string& antennaSet, + const string& band, const bitset<MAX_RCUS>& rcuMask) : - itsName (name), + itsName (name), itsAntennaSet(antennaSet), + itsBand (band), itsRCUs (rcuMask) {} @@ -71,7 +73,7 @@ void Beam::_resolveGaps() ++iter; } } - + // Loop over the new list and fill the gaps again. iter = itsPointings.begin(); end = itsPointings.end(); @@ -82,7 +84,7 @@ void Beam::_resolveGaps() Pointing nilPointing(0.0 ,0.0, "NONE", endTime, int(iter->time()-endTime.sec())); itsPointings.insert(iter, nilPointing); } - + if (iter->duration() == 0) { // current pointings lasts forever?, delete rest of pointings. itsPointings.erase(++iter, end); return; @@ -108,7 +110,7 @@ bool Beam::_pointingOverlaps(const IBS_Protocol::Pointing& pt) const return (true); } ++iter; - } + } return (false); } @@ -147,7 +149,7 @@ Pointing Beam::pointingAtTime(const Timestamp& time) } // if nothing found, return NIL pointing - if (iter == end) { + if (iter == end) { return (Pointing()); } diff --git a/MAC/APL/PAC/ITRFBeamServer/src/Beam.h b/MAC/APL/PAC/ITRFBeamServer/src/Beam.h index 0e825d3d0cd12a3800bcb0ef94b730896f605081..85ef3ee8c3c424aa4d4e17d919b3ef055d5bea76 100644 --- a/MAC/APL/PAC/ITRFBeamServer/src/Beam.h +++ b/MAC/APL/PAC/ITRFBeamServer/src/Beam.h @@ -44,8 +44,9 @@ public: // @param name String identifying this beam uniquely in the OTDB, used with // key-value logger as nodeid. // @param rcuMask The RCUs that participate in this beam. - Beam(const string& name, + Beam(const string& name, const string& antennaSet, + const string& band, const bitset<MAX_RCUS>& rcuMask); Beam() {}; @@ -56,7 +57,7 @@ public: int addPointing(const IBS_Protocol::Pointing& pointing); // @return Current pointing. - IBS_Protocol::Pointing currentPointing() const { return (itsCurrentPointing); } + IBS_Protocol::Pointing currentPointing() const { return (itsCurrentPointing); } // @return Current pointing. IBS_Protocol::Pointing pointingAtTime(const RTC::Timestamp& time); @@ -70,6 +71,9 @@ public: // Get the name of the subarray on which this beam operates. string antennaSetName() const { return (itsAntennaSet); } + // Get the name of the band on which this beam operates. + string bandName() const { return (itsBand); } + // Get beam name (unique name, can be used as key in key-value logger). const bitset<MAX_RCUS>& rcuMask() const { return (itsRCUs); } @@ -97,6 +101,9 @@ private: // Name of the AntennaSet the beam is allocated on. string itsAntennaSet; + // Name of the AntennaSet the beam is allocated on. + string itsBand; + // RCUs participating in the beam bitset<MAX_RCUS> itsRCUs; diff --git a/MAC/APL/PAC/ITRFBeamServer/src/BeamServer.cc b/MAC/APL/PAC/ITRFBeamServer/src/BeamServer.cc index ab50479090c1a2b95f3b64e25f43a4de889d77ef..d530ee62d53ecbe7110091d575e93ce2193c7188 100644 --- a/MAC/APL/PAC/ITRFBeamServer/src/BeamServer.cc +++ b/MAC/APL/PAC/ITRFBeamServer/src/BeamServer.cc @@ -79,11 +79,21 @@ BeamServer::BeamServer(const string& name, long timestamp) : itsCalServer (0), itsBeamsModified (false), itsAnaBeamMgr (0), - itsCalTableMode1 (0), - itsCalTableMode3 (0), - itsCalTableMode5 (0), - itsCalTableMode6 (0), - itsCalTableMode7 (0), + itsCalTable_LBA_INNER_10_90 (0), + itsCalTable_LBA_INNER_30_90 (0), + itsCalTable_LBA_OUTER_10_90 (0), + itsCalTable_LBA_OUTER_30_90 (0), + itsCalTable_LBA_SPARSE_EVEN_10_90 (0), + itsCalTable_LBA_SPARSE_EVEN_30_90 (0), + itsCalTable_LBA_SPARSE_ODD_10_90 (0), + itsCalTable_LBA_SPARSE_ODD_30_90 (0), + itsCalTable_LBA_X_10_90 (0), + itsCalTable_LBA_X_30_90 (0), + itsCalTable_LBA_Y_10_90 (0), + itsCalTable_LBA_Y_30_90 (0), + itsCalTable_HBA_110_190 (0), + itsCalTable_HBA_170_230 (0), + itsCalTable_HBA_210_250 (0), itsUpdateInterval (0), itsComputeInterval (0), itsHBAUpdateInterval (0), @@ -145,11 +155,21 @@ BeamServer::BeamServer(const string& name, long timestamp) : // read static calibrationtables if available StationConfig SC; if (itsStaticCalEnabled) { - _loadCalTable(1, SC.nrRSPs); - _loadCalTable(3, SC.nrRSPs); - _loadCalTable(5, SC.nrRSPs); - _loadCalTable(6, SC.nrRSPs); - _loadCalTable(7, SC.nrRSPs); + _loadCalTable("LBA_INNER", "10_90", SC.nrRSPs); + _loadCalTable("LBA_INNER", "30_90", SC.nrRSPs); + _loadCalTable("LBA_OUTER", "10_90", SC.nrRSPs); + _loadCalTable("LBA_OUTER", "30_90", SC.nrRSPs); + _loadCalTable("LBA_SPARSE_EVEN", "10_90", SC.nrRSPs); + _loadCalTable("LBA_SPARSE_EVEN", "30_90", SC.nrRSPs); + _loadCalTable("LBA_SPARSE_ODD", "10_90", SC.nrRSPs); + _loadCalTable("LBA_SPARSE_ODD", "30_90", SC.nrRSPs); + _loadCalTable("LBA_X", "10_90", SC.nrRSPs); + _loadCalTable("LBA_X", "30_90", SC.nrRSPs); + _loadCalTable("LBA_Y", "10_90", SC.nrRSPs); + _loadCalTable("LBA_Y", "30_90", SC.nrRSPs); + _loadCalTable("HBA", "110_190", SC.nrRSPs); + _loadCalTable("HBA", "170_230", SC.nrRSPs); + _loadCalTable("HBA", "210_250", SC.nrRSPs); } else { LOG_WARN("Static calibration is disabled!"); @@ -588,11 +608,21 @@ GCFEvent::TResult BeamServer::enabled(GCFEvent& event, GCFPortInterface& port) case IBS_GETCALINFO: { IBSGetcalinfoackEvent answer; ostringstream oss; - if (itsCalTableMode1) oss << *itsCalTableMode1 << endl; - if (itsCalTableMode3) oss << *itsCalTableMode3 << endl; - if (itsCalTableMode5) oss << *itsCalTableMode5 << endl; - if (itsCalTableMode6) oss << *itsCalTableMode6 << endl; - if (itsCalTableMode7) oss << *itsCalTableMode7 << endl; + if (itsCalTable_LBA_INNER_10_90) oss << *itsCalTable_LBA_INNER_10_90 << endl; + if (itsCalTable_LBA_INNER_30_90) oss << *itsCalTable_LBA_INNER_30_90 << endl; + if (itsCalTable_LBA_OUTER_10_90) oss << *itsCalTable_LBA_OUTER_10_90 << endl; + if (itsCalTable_LBA_OUTER_30_90) oss << *itsCalTable_LBA_OUTER_30_90 << endl; + if (itsCalTable_LBA_SPARSE_EVEN_10_90) oss << *itsCalTable_LBA_SPARSE_EVEN_10_90 << endl; + if (itsCalTable_LBA_SPARSE_EVEN_30_90) oss << *itsCalTable_LBA_SPARSE_EVEN_30_90 << endl; + if (itsCalTable_LBA_SPARSE_ODD_10_90) oss << *itsCalTable_LBA_SPARSE_ODD_10_90 << endl; + if (itsCalTable_LBA_SPARSE_ODD_30_90) oss << *itsCalTable_LBA_SPARSE_ODD_30_90 << endl; + if (itsCalTable_LBA_X_10_90) oss << *itsCalTable_LBA_X_10_90 << endl; + if (itsCalTable_LBA_X_30_90) oss << *itsCalTable_LBA_X_30_90 << endl; + if (itsCalTable_LBA_Y_10_90) oss << *itsCalTable_LBA_Y_10_90 << endl; + if (itsCalTable_LBA_Y_30_90) oss << *itsCalTable_LBA_Y_30_90 << endl; + if (itsCalTable_HBA_110_190) oss << *itsCalTable_HBA_110_190 << endl; + if (itsCalTable_HBA_170_230) oss << *itsCalTable_HBA_170_230 << endl; + if (itsCalTable_HBA_210_250) oss << *itsCalTable_HBA_210_250 << endl; answer.info = oss.str(); port.send(answer); } @@ -988,7 +1018,7 @@ bool BeamServer::beamalloc_start(IBSBeamallocEvent& ba, { // allocate the beam int beamError(IBS_NO_ERR); - DigitalBeam* beam = checkBeam(&port, ba.beamName, ba.antennaSet, ba.allocation, ba.rcumask, ba.ringNr, ba.rcuMode, &beamError); + DigitalBeam* beam = checkBeam(&port, ba.beamName, ba.antennaSet, ba.band, ba.allocation, ba.rcumask, ba.ringNr, &beamError); if (!beam) { LOG_FATAL_STR("BEAMALLOC: failed to allocate beam " << ba.beamName << " on " << ba.antennaSet); @@ -1088,7 +1118,7 @@ int BeamServer::beampointto_action(IBSPointtoEvent& ptEvent, // note we don't know if we added the beam before, just do it again and ignore returnvalue. itsAnaBeamMgr->addBeam(AnalogueBeam(ptEvent.beamName, beamIter->second->antennaSetName(), - beamIter->second->rcuMask(), ptEvent.rank)); + beamIter->second->bandName(), beamIter->second->rcuMask(), ptEvent.rank)); if (!itsAnaBeamMgr->addPointing(ptEvent.beamName, ptEvent.pointing)) { return (IBS_UNKNOWN_BEAM_ERR); } @@ -1221,10 +1251,10 @@ void BeamServer::destroyAllBeams(GCFPortInterface* port) DigitalBeam* BeamServer::checkBeam(GCFPortInterface* port, std::string name, std::string antennaSetName, + std::string band, IBS_Protocol::Beamlet2SubbandMap allocation, bitset<LOFAR::MAX_RCUS> rcumask, uint ringNr, - uint rcuMode, int* beamError) { LOG_TRACE_FLOW_STR("checkBeam(port=" << port->getName() << ", name=" << name << ", subarray=" << antennaSetName @@ -1283,7 +1313,7 @@ DigitalBeam* BeamServer::checkBeam(GCFPortInterface* port, return (0); } - DigitalBeam* beam = new DigitalBeam(name, antennaSetName, allocation, rcumask, ringNr, rcuMode); + DigitalBeam* beam = new DigitalBeam(name, antennaSetName, band, allocation, rcumask, ringNr); if (beam) { // register new beam itsClientBeams[port].insert(beam); @@ -1502,58 +1532,61 @@ void BeamServer::_logBeamAdministration() // // _getCalFactor(rcumode, rcu, subbandNr) // -complex<double> BeamServer::_getCalFactor(uint rcuMode, uint rcu, uint subbandNr) +complex<double> BeamServer::_getCalFactor(const string& antennaSet, const string& band, uint rcu, uint subbandNr) { complex<double> result(1.0, 0.0); - switch (rcuMode) { - case 1: - case 2: - if (itsCalTableMode1) { result = itsCalTableMode1->calFactor(rcu, subbandNr); } break; - case 3: - case 4: - if (itsCalTableMode3) { result = itsCalTableMode3->calFactor(rcu, subbandNr); } break; - case 5: - if (itsCalTableMode5) { result = itsCalTableMode5->calFactor(rcu, subbandNr); } break; - case 6: - if (itsCalTableMode6) { result = itsCalTableMode6->calFactor(rcu, subbandNr); } break; - case 7: - if (itsCalTableMode7) { result = itsCalTableMode7->calFactor(rcu, subbandNr); } break; - default: - break; - } - -// LOG_DEBUG_STR("calFactor(" << rcuMode << "," << rcu << "," << subbandNr << ")=" << result); + string name; + name = name + antennaSet + "-" + band;; + + if (name == "LBA_INNER-10_90") result = itsCalTable_LBA_INNER_10_90->calFactor(rcu, subbandNr); + else if (name == "LBA_INNER-30_90") result = itsCalTable_LBA_INNER_30_90->calFactor(rcu, subbandNr); + else if (name == "LBA_OUTER-10_90") result = itsCalTable_LBA_OUTER_10_90->calFactor(rcu, subbandNr); + else if (name == "LBA_OUTER-30_90") result = itsCalTable_LBA_OUTER_30_90->calFactor(rcu, subbandNr); + else if (name == "LBA_SPARSE_EVEN-10_90") result = itsCalTable_LBA_SPARSE_EVEN_10_90->calFactor(rcu, subbandNr); + else if (name == "LBA_SPARSE_EVEN-30_90") result = itsCalTable_LBA_SPARSE_EVEN_30_90->calFactor(rcu, subbandNr); + else if (name == "LBA_SPARSE_ODD-10_90") result = itsCalTable_LBA_SPARSE_ODD_10_90->calFactor(rcu, subbandNr); + else if (name == "LBA_SPARSE_ODD-30_90") result = itsCalTable_LBA_SPARSE_ODD_30_90->calFactor(rcu, subbandNr); + else if (name == "LBA_X-10_90") result = itsCalTable_LBA_X_10_90->calFactor(rcu, subbandNr); + else if (name == "LBA_X-30_90") result = itsCalTable_LBA_X_30_90->calFactor(rcu, subbandNr); + else if (name == "LBA_Y-10_90") result = itsCalTable_LBA_Y_10_90->calFactor(rcu, subbandNr); + else if (name == "LBA_Y-30_90") result = itsCalTable_LBA_Y_30_90->calFactor(rcu, subbandNr); + else if (name == "HBA-110_190") result = itsCalTable_HBA_110_190->calFactor(rcu, subbandNr); + else if (name == "HBA-170_230") result = itsCalTable_HBA_170_230->calFactor(rcu, subbandNr); + else if (name == "HBA-210_250") result = itsCalTable_HBA_210_250->calFactor(rcu, subbandNr); + +// LOG_DEBUG_STR("calFactor(" << antennaSet << "," << band << "," << rcu << "," << subbandNr << ")=" << result); return (result); } -void BeamServer::_loadCalTable(uint rcuMode, uint nrRSPBoards) +void BeamServer::_loadCalTable(const string& antennaSet, const string& band, uint nrRSPBoards) { StatCal** tableHandle(0); - switch (rcuMode) { - case 1: - case 2: tableHandle = &itsCalTableMode1; break; - case 3: - case 4: tableHandle = &itsCalTableMode3; break; - case 5: tableHandle = &itsCalTableMode5; break; - case 6: tableHandle = &itsCalTableMode6; break; - case 7: tableHandle = &itsCalTableMode7; break; - default: return; - } - - (*tableHandle) = new StatCal(rcuMode, nrRSPBoards); + string name; + name = name + antennaSet + "-" + band; + + if (name == "LBA_INNER-10_90") tableHandle = &itsCalTable_LBA_INNER_10_90; + else if (name == "LBA_INNER-30_90") tableHandle = &itsCalTable_LBA_INNER_30_90; + else if (name == "LBA_OUTER-10_90") tableHandle = &itsCalTable_LBA_OUTER_10_90; + else if (name == "LBA_OUTER-30_90") tableHandle = &itsCalTable_LBA_OUTER_30_90; + else if (name == "LBA_SPARSE_EVEN-10_90") tableHandle = &itsCalTable_LBA_SPARSE_EVEN_10_90; + else if (name == "LBA_SPARSE_EVEN-30_90") tableHandle = &itsCalTable_LBA_SPARSE_EVEN_30_90; + else if (name == "LBA_SPARSE_ODD-10_90") tableHandle = &itsCalTable_LBA_SPARSE_ODD_10_90; + else if (name == "LBA_SPARSE_ODD-30_90") tableHandle = &itsCalTable_LBA_SPARSE_ODD_30_90; + else if (name == "LBA_X-10_90") tableHandle = &itsCalTable_LBA_X_10_90; + else if (name == "LBA_X-30_90") tableHandle = &itsCalTable_LBA_X_30_90; + else if (name == "LBA_Y-10_90") tableHandle = &itsCalTable_LBA_Y_10_90; + else if (name == "LBA_Y-30_90") tableHandle = &itsCalTable_LBA_Y_30_90; + else if (name == "HBA-110_190") tableHandle = &itsCalTable_HBA_110_190; + else if (name == "HBA-170_230") tableHandle = &itsCalTable_HBA_170_230; + else if (name == "HBA-210_250") tableHandle = &itsCalTable_HBA_210_250; + else return; + + (*tableHandle) = new StatCal(antennaSet, band, nrRSPBoards); if ((*tableHandle) && !(*tableHandle)->isValid()) { delete (*tableHandle); (*tableHandle) = 0; - switch (rcuMode) { - case 1: - case 2: LOG_WARN ("NO CALIBRATION TABLE FOUND FOR MODE 1 AND 2"); break; - case 3: - case 4: LOG_WARN ("NO CALIBRATION TABLE FOUND FOR MODE 3 AND 4"); break; - case 5: - case 6: - case 7: LOG_WARN_STR ("NO CALIBRATION TABLE FOUND FOR MODE " << rcuMode); break; - } + LOG_WARN_STR ("NO CALIBRATION TABLE FOUND FOR ANTENNASET " << antennaSet << ", BAND " << band); return; } @@ -1705,8 +1738,8 @@ void BeamServer::compute_weights(Timestamp weightTime) continue; } - complex<double> CalFactor = _getCalFactor(beamIter->second->rcuMode(), rcu, - itsBeamletAllocation[beamlet+firstBeamlet].subbandNr); + complex<double> CalFactor = _getCalFactor(beamIter->second->antennaSetName(), beamIter->second->bandName(), + rcu, itsBeamletAllocation[beamlet+firstBeamlet].subbandNr); int bitPlane = beamlet / beamletsPerPlane; itsWeights(rcu, bitPlane, beamlet % beamletsPerPlane) = CalFactor * exp(itsBeamletAllocation[beamlet+firstBeamlet].scaling * diff --git a/MAC/APL/PAC/ITRFBeamServer/src/BeamServer.h b/MAC/APL/PAC/ITRFBeamServer/src/BeamServer.h index 3a5ded97e48bb60de3578d34a206a9b9bb371a7e..0bb20151f5d44d882243e7d26d04ea915c3b5a04 100644 --- a/MAC/APL/PAC/ITRFBeamServer/src/BeamServer.h +++ b/MAC/APL/PAC/ITRFBeamServer/src/BeamServer.h @@ -88,13 +88,13 @@ private: void destroyAllBeams(GCFPortInterface* port); // Create new beam and update administration - DigitalBeam* checkBeam(GCFPortInterface* port, - string name, - string subarrayname, + DigitalBeam* checkBeam(GCFPortInterface* port, + string name, + string antennaSetName, + string band, IBS_Protocol::Beamlet2SubbandMap allocation, bitset<LOFAR::MAX_RCUS> rcumask, uint ringNr, - uint rcuMode, int* beamError); // Destroy beam of specified transaction. @@ -179,8 +179,8 @@ private: void _logBeamAdministration(); // RCU calibration - std::complex<double> _getCalFactor(uint rcuMode, uint rcu, uint subbandNr); - void _loadCalTable(uint rcuMode, uint nrRSPBoards); + std::complex<double> _getCalFactor(const string& antennaSet, const string& band, uint rcu, uint subbandNr); + void _loadCalTable(const string& antennaSet, const string& band, uint nrRSPBoards); // ### data members ### @@ -203,7 +203,7 @@ private: blitz::Array<std::complex<double>, 3> itsWeights; blitz::Array<std::complex<int16_t>, 3> itsWeights16; - // RCU Allocations in the AntennaArrays. Remember that each RCU can participate + // RCU Allocations in the AntennaArrays. Remember that each RCU can participate // in more than one beam. bitset<MAX_RCUS> itsLBAallocation; // which RCUs are used for LBA bitset<MAX_RCUS> itsHBAallocation; // which RCUs are used for HBA @@ -233,12 +233,22 @@ private: map<string, DigitalBeam*> itsBeamPool; // AnaBeamMgr* itsAnaBeamMgr; // for managing the analogue beams - StatCal* itsCalTableMode1; // table for mode 1 and 2 - StatCal* itsCalTableMode3; // table for mode 3 and 4 - StatCal* itsCalTableMode5; // table for mode 5 - StatCal* itsCalTableMode6; // table for mode 6 - StatCal* itsCalTableMode7; // table for mode 7 - + StatCal* itsCalTable_LBA_INNER_10_90; + StatCal* itsCalTable_LBA_INNER_30_90; + StatCal* itsCalTable_LBA_OUTER_10_90; + StatCal* itsCalTable_LBA_OUTER_30_90; + StatCal* itsCalTable_LBA_SPARSE_EVEN_10_90; + StatCal* itsCalTable_LBA_SPARSE_EVEN_30_90; + StatCal* itsCalTable_LBA_SPARSE_ODD_10_90; + StatCal* itsCalTable_LBA_SPARSE_ODD_30_90; + StatCal* itsCalTable_LBA_X_10_90; + StatCal* itsCalTable_LBA_X_30_90; + StatCal* itsCalTable_LBA_Y_10_90; + StatCal* itsCalTable_LBA_Y_30_90; + StatCal* itsCalTable_HBA_110_190; + StatCal* itsCalTable_HBA_170_230; + StatCal* itsCalTable_HBA_210_250; + // constants uint itsMaxRCUs; // uint itsMaxRSPboards; // diff --git a/MAC/APL/PAC/ITRFBeamServer/src/DigitalBeam.cc b/MAC/APL/PAC/ITRFBeamServer/src/DigitalBeam.cc index 65badc0c0283ad066b1c79f11d7beed8191990e8..f4f5587202b219edc39eb4d4b9bece31c8c70e54 100644 --- a/MAC/APL/PAC/ITRFBeamServer/src/DigitalBeam.cc +++ b/MAC/APL/PAC/ITRFBeamServer/src/DigitalBeam.cc @@ -48,16 +48,15 @@ using namespace RTC; // // DigitalBeam(name, subarray, nrSubbands) // -DigitalBeam::DigitalBeam(const string& name, - const string& antennaSet, - const Beamlet2SubbandMap& allocation, +DigitalBeam::DigitalBeam(const string& name, + const string& antennaSetName, + const string& bandName, + const Beamlet2SubbandMap& allocation, const bitset<MAX_RCUS>& rcuMask, - uint ringNr, - uint rcuMode) : - Beam (name, antennaSet, rcuMask), - itsBeamletAllocation(allocation), - itsRingNr (ringNr), - itsRCUmode (rcuMode) + uint ringNr) : + Beam (name, antennaSetName, bandName, rcuMask), + itsBeamletAllocation(allocation), + itsRingNr (ringNr) {} // diff --git a/MAC/APL/PAC/ITRFBeamServer/src/DigitalBeam.h b/MAC/APL/PAC/ITRFBeamServer/src/DigitalBeam.h index 9815dfd0fb10cf1ce68a90f2fe5fc43caab0192d..b4e001c891ffe1c8eb89a744484dac8e1df068e9 100644 --- a/MAC/APL/PAC/ITRFBeamServer/src/DigitalBeam.h +++ b/MAC/APL/PAC/ITRFBeamServer/src/DigitalBeam.h @@ -51,11 +51,11 @@ public: // @param rcuMask The RCUs that participate in this beam. // @param ringNr The serdes segment the allocation is ment for. DigitalBeam(const string& name, - const string& antenneSet, + const string& antenneSetName, + const string& band, const IBS_Protocol::Beamlet2SubbandMap& allocation, const bitset<MAX_RCUS>& rcuMask, - uint ringNr, - uint rcuMode); + uint ringNr); // Default destructor. virtual ~DigitalBeam(); @@ -73,10 +73,7 @@ public: // Get number of ringSegment uint ringNr() const { return (itsRingNr); } - // Get rcuMode of beam - uint rcuMode() const { return (itsRCUmode); } - - // Set handle (=uniq ID) from the CalServer + // Set handle (=uniq ID) from the CalServer void calibrationHandle(const string& name) { itsCShandle = name; } string calibrationHandle() { return (itsCShandle); } @@ -90,15 +87,12 @@ private: //# ----- DATAMEMBERS ----- - // Allocation. + // Allocation. IBS_Protocol::Beamlet2SubbandMap itsBeamletAllocation; // ringSegment the beam is allocated on uint itsRingNr; - // temp: rcumode of the beam (will become obsolete when new CalServer is used). - uint itsRCUmode; - // The antenna array. // CAL::SubArray itsSubArray; diff --git a/MAC/APL/PAC/ITRFBeamServer/src/StatCal.cc b/MAC/APL/PAC/ITRFBeamServer/src/StatCal.cc index a71a278506b328cbb94ecffd3e69725dcbd609e9..b87b402ce8b8ed5c1792919223564ca661988e22 100644 --- a/MAC/APL/PAC/ITRFBeamServer/src/StatCal.cc +++ b/MAC/APL/PAC/ITRFBeamServer/src/StatCal.cc @@ -40,18 +40,20 @@ namespace LOFAR { // // StatCal() // -StatCal::StatCal(uint mode, uint nrRSPBoards): - itsNantennas(nrRSPBoards*NR_ANTENNAS_PER_RSPBOARD), - itsNpols (2), - itsNsubbands(512), - itsMode (mode), +StatCal::StatCal(const string& antennaSet, const string& band, uint nrRSPBoards): + itsNantennas(nrRSPBoards*NR_ANTENNAS_PER_RSPBOARD), + itsNpols (2), + itsNsubbands(512), + itsAntennaSet(antennaSet), + itsBand(band), itsIsValid (false) { - LOG_DEBUG(formatString("StatCal(mode=%d,#Ant=%d,#Pol=%d,#Sub=%d)",mode, itsNantennas, itsNpols, itsNsubbands)); + LOG_DEBUG(formatString("StatCal(antset=%s,band=%s,#Ant=%d,#Pol=%d,#Sub=%d)", + antennaSet.c_str(), band.c_str(), itsNantennas, itsNpols, itsNsubbands)); itsStaticCalibration.resize(itsNantennas, itsNpols, itsNsubbands); itsStaticCalibration = complex<double>(0.0,0.0); - itsIsValid = _readData(mode); + itsIsValid = _readData(antennaSet, band); } // @@ -64,13 +66,15 @@ StatCal::~StatCal() // // _readData(mode) // -bool StatCal::_readData(uint mode) +bool StatCal::_readData(const string& antennaSet, const string& band) { ConfigLocator CL; char baseName[256]; - snprintf(baseName, sizeof baseName, "CalTable_mode%d.dat", mode); + snprintf(baseName, sizeof baseName, "CalTable-%s-%s.dat", antennaSet.c_str(), band.c_str()); itsFileName = CL.locate(baseName); + LOG_INFO_STR("### baseName = " << baseName << ", itsFileName = " << itsFileName); + // try to open the file FILE *file; if (!(file = fopen(itsFileName.c_str(), "r"))) { @@ -79,7 +83,7 @@ bool StatCal::_readData(uint mode) } // read and check the headerinformation - if (!_readHeaderInfo(file) || !_checkHeaderInfo(mode)) { + if (!_readHeaderInfo(file) || !_checkHeaderInfo(antennaSet, band)) { return (false); } @@ -87,9 +91,9 @@ bool StatCal::_readData(uint mode) complex<double> value; for (uint sb = 0; sb < itsNsubbands; sb++) { for (uint ant = 0; ant < itsNantennas; ant++) { - for (uint pol = 0; pol < itsNpols; pol++) { + for (uint pol = 0; pol < itsNpols; pol++) { if (fread(&value, sizeof(complex<double>), 1, file) != 1) { - LOG_ERROR_STR("Error while loading calibrationtable " << itsFileName << " at element " << + LOG_ERROR_STR("Error while loading calibrationtable " << itsFileName << " at element " << (sb*itsNantennas+ant)*itsNpols+pol); fclose(file); return(false); @@ -99,7 +103,7 @@ bool StatCal::_readData(uint mode) } } fclose(file); - LOG_INFO_STR("Static CalibrationTable loaded for mode " << mode << ", first value = " << itsStaticCalibration(0,0,0)); + LOG_INFO_STR("Static CalibrationTable loaded for antennaSet " << antennaSet << ", band " << band << ", first value = " << itsStaticCalibration(0,0,0)); return (true); } @@ -115,7 +119,7 @@ bool StatCal::_readHeaderInfo(FILE* file) return (true); } - while (fgets(line, 1024,file)) { + while (fgets(line, 1024, file)) { if (line[strlen(line)-1] == '\n') { // cut trailing newline character if any line[strlen(line)-1] = '\0'; } @@ -125,8 +129,10 @@ bool StatCal::_readHeaderInfo(FILE* file) } if (strstr(line, "CalTableHeader.Observation.Station")) itsHI.station = ltrim(value); - else if (strstr(line, "CalTableHeader.Observation.Mode")) - itsHI.mode = atoi(value); + else if (strstr(line, "CalTableHeader.Observation.AntennaSet")) + itsHI.antennaSet = ltrim(value); + else if (strstr(line, "CalTableHeader.Observation.Band")) + itsHI.band = ltrim(value); else if (strstr(line, "CalTableHeader.Observation.Source")) itsHI.source = ltrim(value); else if (strstr(line, "CalTableHeader.Observation.Date")) @@ -152,19 +158,24 @@ bool StatCal::_readHeaderInfo(FILE* file) // // _checkHeaderInfo(mode) // -bool StatCal::_checkHeaderInfo(uint mode) const +bool StatCal::_checkHeaderInfo(const string& antennaSet, const string& band) const { - if (itsHI.mode == -1) { // file without header? + if (itsHI.antennaSet == "") { // file without header? return (true); } - if ((uint)itsHI.mode != mode) { - LOG_ERROR_STR("CALTABLE FOR MODE " << mode << " CONTAINS WEIGHTS FOR MODE " << itsHI.mode); + if (itsHI.antennaSet != antennaSet) { + LOG_ERROR_STR("CALTABLE FOR ANTENNASET " << antennaSet << " CONTAINS WEIGHTS FOR ANTENNASET " << itsHI.antennaSet); + return (false); + } + + if ((itsHI.antennaSet == "HBA") && (itsHI.band != band)) { + LOG_ERROR_STR("CALTABLE FOR BAND " << band << " CONTAINS WEIGHTS FOR BAND " << itsHI.band); return (false); } if (itsHI.station != PVSSDatabaseName()) { - LOG_ERROR_STR("CALTABLE FOR MODE " << mode << " IS MENT FOR STATION " << itsHI.station); + LOG_ERROR_STR("CALTABLE NOT FOR THIS STATION " << itsHI.station); return (false); } @@ -178,7 +189,8 @@ ostream& StatCal::print(ostream& os)const { os << "Filename : " << itsFileName << endl; os << "Station : " << itsHI.station << endl; - os << "Mode : " << itsHI.mode << endl; + os << "AntennaSet : " << itsHI.antennaSet << endl; + os << "Band : " << itsHI.band << endl; os << "Source : " << itsHI.source << endl; os << "Date : " << itsHI.date << endl; os << "CalVersion : " << itsHI.calVersion << endl; @@ -200,7 +212,7 @@ complex<double> StatCal::calFactor(uint rcuNr, uint subbandNr) const return (itsStaticCalibration((int)rcuNr/2, (int)rcuNr%2, (int)subbandNr)); } - + } // namespace BS } // namespace LOFAR diff --git a/MAC/APL/PAC/ITRFBeamServer/src/StatCal.h b/MAC/APL/PAC/ITRFBeamServer/src/StatCal.h index 2f273b8ca70c217be0cc7bf216c4d2e673392bcd..32e79207a74b8a4d582fe0d4ba6e1a05f52ba438 100644 --- a/MAC/APL/PAC/ITRFBeamServer/src/StatCal.h +++ b/MAC/APL/PAC/ITRFBeamServer/src/StatCal.h @@ -38,7 +38,7 @@ class StatCal { public: // constructor and destructor - explicit StatCal(uint rcumode, uint nrRSPBoards); + explicit StatCal(const string& antennaSet, const string& band, uint nrRSPBoards); ~StatCal(); std::complex<double> calFactor(uint rcuNr, uint subbandNr) const; @@ -57,23 +57,25 @@ private: StatCal& operator= (const StatCal&); // not implemented // helper functions - bool _readData (uint mode); + bool _readData (const string& antennaSet, const string& band); bool _readHeaderInfo (FILE* file); - bool _checkHeaderInfo(uint mode) const; - + bool _checkHeaderInfo(const string& antennaSet, const string& band) const; + uint itsNantennas; uint itsNpols; uint itsNsubbands; - uint itsMode; + string itsAntennaSet; + string itsBand; string itsFileName; bool itsIsValid; class headerinfo { public: - headerinfo() : mode(-1) {}; + headerinfo() : antennaSet("") {}; // datamembers string station; - int mode; + string antennaSet; + string band; string source; string date; string calVersion; @@ -84,8 +86,8 @@ private: }; headerinfo itsHI; - // two - blitz::Array<std::complex<double>, 3> itsStaticCalibration; // + // two + blitz::Array<std::complex<double>, 3> itsStaticCalibration; // }; //# -------------------- inline functions -------------------- diff --git a/MAC/APL/PAC/ITRFBeamServer/src/beamctl.cc b/MAC/APL/PAC/ITRFBeamServer/src/beamctl.cc index 502e7c8edd0876242e62793ee2f7eed1046487a8..8990390c85735daacac0872b256dc1a5d774e01e 100644 --- a/MAC/APL/PAC/ITRFBeamServer/src/beamctl.cc +++ b/MAC/APL/PAC/ITRFBeamServer/src/beamctl.cc @@ -277,11 +277,11 @@ GCFEvent::TResult beamctl::create_beam(GCFEvent& event, GCFPortInterface& port) IBSBeamallocEvent alloc; alloc.beamName = BEAMCTL_BEAM + formatString("_%d", getpid()); alloc.antennaSet = itsAntSet; + alloc.band = itsBandStr; alloc.rcumask = getRCUMask() & globalAntennaSets()->RCUallocation(itsAntSet); // assume beamletnumbers are right so the ring can be extracted from those numbers. // when the user did this wrong the BeamServer will complain. alloc.ringNr = itsBeamlets.front() >= BEAMLET_RING_OFFSET; - alloc.rcuMode = itsRCUmode; list<int>::iterator its = itsSubbands.begin(); list<int>::iterator itb = itsBeamlets.begin(); @@ -523,7 +523,7 @@ void beamctl::usage() const " beamctl <rcuspec> <anapointing> [<anapointing> ...] [<dataspec> <digpointing> [<digpointing> ...]] FOR HBA ANTENNAS\n" " beamctl --calinfo\n" "where:\n" - " <rcuspec> = --antennaset [--rcus] --band \n" + " <rcuspec> = --antennaset --rcus --band \n" " <dataspec> = --subbands --beamlets \n" " <digpointing> = --digdir \n" " <anapointing> = --anadir \n" @@ -532,7 +532,7 @@ void beamctl::usage() const " # name = LBA_INNER | LBA_OUTER | LBA_SPARSE_EVEN | LBA_SPARSE_ODD |\n" " # LBA_X | LBA_Y | HBA_ZERO | HBA_ONE | HBA_DUAL | HBA_JOINED |\n" " # HBA_ZERO_INNER | HBA_ONE_INNER | HBA_DUAL_INNER | HBA_JOINED_INNER\n" - " --rcus=<set> # optional subselection of RCU's\n" + " --rcus=<set> # subselection of RCU's\n" " --band=name # name of band selection, may not conflict with antennaset\n" " # name = 10_90 | 30_90 | 110_190 | 170_230 | 210_250\n" " --subbands=<set> # set of subbands to use for this beam\n" @@ -670,22 +670,28 @@ bool beamctl::checkOptions() case 1: case 3: { itsBand = BAND_10_90; + itsBandStr = "10_90"; } break; case 2: case 4: { itsBand = BAND_30_90; + itsBandStr = "30_90"; } break; case 5: { itsBand = BAND_110_190; + itsBandStr = "110_190"; } break; case 6: { itsBand = BAND_170_230; + itsBandStr = "170_230"; } break; case 7: { itsBand = BAND_210_250; + itsBandStr = "210_250"; } break; default : { itsBand = BAND_UNDEFINED; + itsBandStr = "unknown"; } break; } } @@ -775,17 +781,17 @@ bool beamctl::parseOptions(int myArgc, char** myArgv) break; case 'B': { // band - string band (optarg); - - if (band == "10_90") itsBand = BAND_10_90; - else if (band == "10_70") itsBand = BAND_10_70; - else if (band == "30_70") itsBand = BAND_30_70; - else if (band == "30_90") itsBand = BAND_30_90; - else if (band == "110_190") itsBand = BAND_110_190; - else if (band == "170_230") itsBand = BAND_170_230; - else if (band == "210_250") itsBand = BAND_210_250; + itsBandStr = optarg; + + if (itsBandStr == "10_90") itsBand = BAND_10_90; + else if (itsBandStr == "10_70") itsBand = BAND_10_70; + else if (itsBandStr == "30_70") itsBand = BAND_30_70; + else if (itsBandStr == "30_90") itsBand = BAND_30_90; + else if (itsBandStr == "110_190") itsBand = BAND_110_190; + else if (itsBandStr == "170_230") itsBand = BAND_170_230; + else if (itsBandStr == "210_250") itsBand = BAND_210_250; else itsBand = BAND_UNDEFINED; - cout << "band : " << band << endl; + cout << "band : " << itsBandStr << endl; } break; diff --git a/MAC/APL/PAC/ITRFBeamServer/src/beamctl.h b/MAC/APL/PAC/ITRFBeamServer/src/beamctl.h index 2e8f710f068111b033478fe2773976057271805c..61dd27fef3f9f83b52895f1a827a5b86c3e786ba 100644 --- a/MAC/APL/PAC/ITRFBeamServer/src/beamctl.h +++ b/MAC/APL/PAC/ITRFBeamServer/src/beamctl.h @@ -80,6 +80,7 @@ private: // place to store the argument values. string itsAntSet; // name of the antennaSet + string itsBandStr; // name of the band list<int> itsRCUs; // selection of rcus list<int> itsSubbands; // selection of subbands list<int> itsBeamlets; // selection of beamlets diff --git a/MAC/APL/PAC/ITRFBeamServer/test/tAnaBeamMgr.cc b/MAC/APL/PAC/ITRFBeamServer/test/tAnaBeamMgr.cc index 635a91319a4fa26d6113aff6dcb2c4eeb850d0a7..6402d7435adf573a230023c3c64eab87208272b1 100644 --- a/MAC/APL/PAC/ITRFBeamServer/test/tAnaBeamMgr.cc +++ b/MAC/APL/PAC/ITRFBeamServer/test/tAnaBeamMgr.cc @@ -37,7 +37,7 @@ using namespace RTC; using namespace BS; using namespace IBS_Protocol; -int main(int, char* argv[]) +int main(int, char* argv[]) { INIT_LOGGER(argv[0]); @@ -52,7 +52,7 @@ int main(int, char* argv[]) bitset<MAX_RCUS> rcuMask4(0x00000F00); // overlaps with 2 // In these first tests we test the addPointing mechanism of the Beam class. - AnalogueBeam beam1("beam1", "LBA_INNER", rcuMask1, 1); + AnalogueBeam beam1("beam1", "LBA_INNER", "10_90", rcuMask1, 1); LOG_DEBUG("--- POINTING TEST 1: are contiguous pointings added in the right order"); beam1.addPointing(Pointing(0.1, 0.1, "J2000", Timestamp(1262700000,0), 1000)); beam1.addPointing(Pointing(0.1, 0.11, "J2000", Timestamp(1262700000+1000,0), 1100)); @@ -65,23 +65,23 @@ int main(int, char* argv[]) LOG_DEBUG("--- POINTING TEST 3: are overlapping pointings rejected"); beam1.addPointing(Pointing(0.1, 0.3, "J2000", Timestamp(1262700000+1200,0), 200)); beam1.showPointings(); - + LOG_DEBUG("--- POINTING TEST 4: are gaps splitted when a new pointing is inserted in the gap"); beam1.addPointing(Pointing(0.1, 0.4, "J2000", Timestamp(1262700000+3000,0), 500)); beam1.showPointings(); - + LOG_DEBUG("--- POINTING TEST 5: can we insert a pointing in 'reverse' order'"); beam1.addPointing(Pointing(0.1, 0.5, "J2000", Timestamp(1262700000-600,0), 600)); beam1.showPointings(); - + LOG_DEBUG("--- POINTING TEST 6: can we insert an everlasting pointing in the middle"); beam1.addPointing(Pointing(0.1, 0.6, "J2000", Timestamp(1262700000+4000,0), 0)); beam1.showPointings(); - + LOG_DEBUG("--- POINTING TEST 7: can we add an everlasting pointing at the end"); beam1.addPointing(Pointing(0.1, 0.7, "J2000", Timestamp(1262700000+9000,0), 0)); beam1.showPointings(); - + // In the second set of tests we test the mechanism of activating the right analogueBeams. // Remember that this depends on many conditions like rank, rcu overlap and consistency in // staying active when a beam is active. @@ -97,11 +97,11 @@ int main(int, char* argv[]) beamMgr1.showAdmin(); LOG_DEBUG("--- SCHEDULE TEST 3: are NONE pointings also scheduled and are old pointings deleted"); - beamMgr1.activateBeams(Timestamp(1262700000+2500, 0)); + beamMgr1.activateBeams(Timestamp(1262700000+2500, 0)); beamMgr1.showAdmin(); LOG_DEBUG("--- SCHEDULE TEST 4: can we add an overlapping beam with the another rank"); - AnalogueBeam beam2("beam2", "LBA_INNER", rcuMask2, 3); + AnalogueBeam beam2("beam2", "LBA_INNER", "10_90", rcuMask2, 3); beam2.addPointing(Pointing(0.2, 0.6, "AZEL", Timestamp(1262700000+2200,0), 400)); beamMgr1.addBeam(beam2); beamMgr1.showAdmin(); @@ -111,7 +111,7 @@ int main(int, char* argv[]) beamMgr1.showAdmin(); LOG_DEBUG("--- SCHEDULE TEST 6: can we add an overlapping beam with a higher rank as the previous beam"); - AnalogueBeam beam3("beam3", "LBA_INNER", rcuMask3, 2); + AnalogueBeam beam3("beam3", "LBA_INNER", "10_90", rcuMask3, 2); beam3.addPointing(Pointing(0.3, 0.6, "ITRF", Timestamp(1262700000+2000,0), 1400)); beamMgr1.addBeam(beam3); beamMgr1.showAdmin(); @@ -121,7 +121,7 @@ int main(int, char* argv[]) beamMgr1.showAdmin(); LOG_DEBUG("--- SCHEDULE TEST 8: add an NON overlapping beam with an equal rank as the first beam which starts earlier"); - AnalogueBeam beam4("beam4", "LBA_INNER", rcuMask4, 1); + AnalogueBeam beam4("beam4", "LBA_INNER", "10_90", rcuMask4, 1); beam4.addPointing(Pointing(0.4, 0.6, "MOON", Timestamp(1262700000+2000,0), 1400)); beamMgr1.addBeam(beam4); beamMgr1.showAdmin(); @@ -131,7 +131,7 @@ int main(int, char* argv[]) beamMgr1.showAdmin(); LOG_DEBUG("--- SCHEDULE TEST 10: delete beam 1"); - beamMgr1.deleteBeam(beam1.name()); + beamMgr1.deleteBeam(beam1.name()); beamMgr1.showAdmin(); LOG_DEBUG("--- SCHEDULE TEST 11: will the third beam become active also (it should)"); diff --git a/MAC/APL/PAC/ITRFBeamServer/test/tStatCal.cc b/MAC/APL/PAC/ITRFBeamServer/test/tStatCal.cc index 0034865e51ac6a684a82d71c2733894bf5751951..a0bde1558ebaf4de8e087d10ddac6e468fecd538 100644 --- a/MAC/APL/PAC/ITRFBeamServer/test/tStatCal.cc +++ b/MAC/APL/PAC/ITRFBeamServer/test/tStatCal.cc @@ -33,11 +33,11 @@ using namespace blitz; using namespace LOFAR; using namespace BS; -int main(int, char* argv[]) +int main(int, char* argv[]) { INIT_LOGGER(argv[0]); - StatCal theCalTable(1,12); + StatCal theCalTable("LBA_INNER", "10_90", 12); blitz::Array<std::complex<double>,3> theData = theCalTable(); cout << "RCU 5: X,Y for subband 10..15: " << endl; diff --git a/MAC/APL/StationCU/src/BeamControl/BeamControl.cc b/MAC/APL/StationCU/src/BeamControl/BeamControl.cc index c49d0fd94a06080d3a4dc618eac7d9f6c26f607a..5e8c4ac4df990bc0a1f7571be729461968545d44 100644 --- a/MAC/APL/StationCU/src/BeamControl/BeamControl.cc +++ b/MAC/APL/StationCU/src/BeamControl/BeamControl.cc @@ -61,7 +61,7 @@ namespace LOFAR { namespace StationCU { #define MAX2(a,b) ((a)>(b)?(a):(b)) - + // static pointer to this object for signal handler static BeamControl* thisBeamControl = 0; @@ -155,7 +155,7 @@ void BeamControl::setState(CTState::CTstateNr newState) CTState cts; itsPropertySet->setValue(PN_FSM_CURRENT_ACTION, GCFPVString(cts.name(newState))); } -} +} // @@ -163,20 +163,20 @@ void BeamControl::setState(CTState::CTstateNr newState) // // Connect to PVSS and report state back to startdaemon // -GCFEvent::TResult BeamControl::initial_state(GCFEvent& event, +GCFEvent::TResult BeamControl::initial_state(GCFEvent& event, GCFPortInterface& port) { LOG_DEBUG_STR ("initial:" << eventName(event) << "@" << port.getName()); GCFEvent::TResult status = GCFEvent::HANDLED; - + switch (event.signal) { case F_ENTRY: break; case F_INIT: { // Get access to my own propertyset. - string propSetName(createPropertySetName(PSN_BEAM_CONTROL, getName(), + string propSetName(createPropertySetName(PSN_BEAM_CONTROL, getName(), globalParameterSet()->getString("_DPname"))); LOG_INFO_STR ("Activating PropertySet" << propSetName); itsPropertySet = new RTDBPropertySet(propSetName, @@ -201,7 +201,7 @@ GCFEvent::TResult BeamControl::initial_state(GCFEvent& event, itsTimerPort->setTimer(0.0); } break; - + case F_TIMER: if (!itsPropertySetInitialized) { itsPropertySetInitialized = true; @@ -226,7 +226,7 @@ GCFEvent::TResult BeamControl::initial_state(GCFEvent& event, // itsPropertySet->setValue(PN_BC_ANGLETIMES, GCFPVDynArr(LPT_DYNUNSIGNED, dpeValues)); itsPropertySet->setValue(PN_BC_DIRECTION_TYPE, GCFPVDynArr(LPT_DYNSTRING, dpeValues)); itsPropertySet->setValue(PN_BC_BEAM_NAME, GCFPVDynArr(LPT_DYNSTRING, dpeValues)); - + // Start ParentControl task LOG_DEBUG ("Enabling ParentControl task and wait for my name"); itsParentPort = itsParentControl->registerTask(this); @@ -241,7 +241,7 @@ GCFEvent::TResult BeamControl::initial_state(GCFEvent& event, case F_DISCONNECTED: case F_EXIT: break; - + case CONTROL_CONNECT: { CONTROLConnectEvent msg(event); LOG_DEBUG_STR("Received CONNECT(" << msg.cntlrName << ")"); @@ -297,7 +297,7 @@ GCFEvent::TResult BeamControl::started_state(GCFEvent& event, GCFPortInterface& break; case F_CONNECTED: { - ASSERTSTR (&port == itsBeamServer, "F_CONNECTED event from port " + ASSERTSTR (&port == itsBeamServer, "F_CONNECTED event from port " << port.getName()); itsTimerPort->cancelAllTimers(); LOG_INFO ("Connected with BeamServer, going to claimed state"); @@ -310,14 +310,14 @@ GCFEvent::TResult BeamControl::started_state(GCFEvent& event, GCFPortInterface& case F_DISCONNECTED: { port.close(); - ASSERTSTR (&port == itsBeamServer, + ASSERTSTR (&port == itsBeamServer, "F_DISCONNECTED event from port " << port.getName()); LOG_WARN ("Connection with BeamServer failed, retry in 2 seconds"); itsTimerPort->setTimer(2.0); break; } - case F_TIMER: + case F_TIMER: // GCFTimerEvent& timerEvent=static_cast<GCFTimerEvent&>(event); LOG_DEBUG ("Trying to (re)connect to BeamServer"); itsBeamServer->open(); // will result in F_CONN or F_DISCONN @@ -370,7 +370,7 @@ GCFEvent::TResult BeamControl::claimed_state(GCFEvent& event, GCFPortInterface& case F_DISCONNECTED: { port.close(); - ASSERTSTR (&port == itsBeamServer, + ASSERTSTR (&port == itsBeamServer, "F_DISCONNECTED event from port " << port.getName()); LOG_WARN("Connection with BeamServer lost, may be due to splitter change, going to reconnect."); setObjectState("Connection with BeamServer lost!", itsPropertySet->getFullScope(), RTDB_OBJ_STATE_BROKEN); @@ -423,12 +423,11 @@ int32 BeamControl::convertFilterSelection(const string& filterselection, const s if (filterselection == "HBA_170_230") { return(6); } // 160 Mhz if (filterselection == "HBA_210_250") { return(7); } // 200 Mhz - LOG_WARN_STR ("filterselection value '" << filterselection << + LOG_WARN_STR ("filterselection value '" << filterselection << "' not recognized, using LBA_10_70"); return (1); } - // // allocBeams_state(event, port) // @@ -448,7 +447,7 @@ GCFEvent::TResult BeamControl::allocBeams_state(GCFEvent& event, GCFPortInterfac // Create a new subarray // switch (event.signal) { - case F_ENTRY: + case F_ENTRY: itsTimerPort->cancelAllTimers(); itsTimerPort->setTimer(0.01); // give CalControl + CalServer some time to allocated the beams. break; @@ -464,11 +463,13 @@ GCFEvent::TResult BeamControl::allocBeams_state(GCFEvent& event, GCFPortInterfac IBSBeamallocEvent beamAllocEvent; beamAllocEvent.beamName = curBeamName; beamAllocEvent.antennaSet = allocatingDigitalBeams ? itsObs->beams[beamIdx].antennaSet : itsObs->anaBeams[beamIdx].antennaSet; - LOG_DEBUG_STR("beam@antennaSet : " << beamAllocEvent.beamName << "@" << beamAllocEvent.antennaSet); - beamAllocEvent.rcumask = itsObs->getRCUbitset(0, 0, beamAllocEvent.antennaSet) & - globalAntennaSets()->RCUallocation(beamAllocEvent.antennaSet); + + beamAllocEvent.band = itsObs->filter.substr(4, string::npos); + + LOG_DEBUG_STR("beam@antennaSet : " << beamAllocEvent.beamName << "@" << beamAllocEvent.antennaSet); + beamAllocEvent.rcumask = itsObs->getRCUbitset(0, 0, beamAllocEvent.antennaSet) & + globalAntennaSets()->RCUallocation(beamAllocEvent.antennaSet); beamAllocEvent.ringNr = 0; - beamAllocEvent.rcuMode = convertFilterSelection(itsObs->filter, beamAllocEvent.antennaSet); // digital part if (!itsObs->beams.empty()) { // fill digital part if any @@ -514,7 +515,7 @@ GCFEvent::TResult BeamControl::allocBeams_state(GCFEvent& event, GCFPortInterfac case IBS_BEAMALLOCACK: { IBSBeamallocackEvent ack(event); if (ack.status != IBS_NO_ERR) { - LOG_ERROR_STR("Beamlet allocation for beam " << ack.beamName + LOG_ERROR_STR("Beamlet allocation for beam " << ack.beamName << " failed with errorcode: " << errorName(ack.status)); setObjectState("Beamlet alloc error", itsPropertySet->getFullScope(), RTDB_OBJ_STATE_BROKEN); setState(CTState::CLAIMED); @@ -575,7 +576,7 @@ GCFEvent::TResult BeamControl::sendPointings_state(GCFEvent& event, GCFPortInter RTC::Timestamp(ptIter->startTime,0), ptIter->duration); ptEvent.analogue = !sendingDigitalPts; ptEvent.rank = sendingDigitalPts ? 0 : itsObs->anaBeams[beamIdx].rank; // rank not used by digital beams - + // find next pt if any. ++ptIter; LOG_DEBUG_STR("sendingDigitalPts=" << sendingDigitalPts); @@ -666,7 +667,7 @@ GCFEvent::TResult BeamControl::sendPointings_state(GCFEvent& event, GCFPortInter // // active_state(event, port) // -// Normal operation state. +// Normal operation state. // GCFEvent::TResult BeamControl::active_state(GCFEvent& event, GCFPortInterface& port) { @@ -695,7 +696,7 @@ GCFEvent::TResult BeamControl::active_state(GCFEvent& event, GCFPortInterface& p // TRAN(BeamControl::started_state); break; } - + // -------------------- EVENTS RECEIVED FROM PARENT CONTROL -------------------- case CONTROL_SCHEDULE: { @@ -794,7 +795,7 @@ GCFEvent::TResult BeamControl::quiting_state(GCFEvent& event, GCFPortInterface& itsTimerPort->setTimer(1.0); // wait 1 second to let message go away break; } - + case F_TIMER: GCFScheduler::instance()->stop(); break; @@ -876,7 +877,7 @@ bool BeamControl::handleBeamFreeAck(GCFEvent& event) if (ack.status != IBS_NO_ERR) { LOG_ERROR_STR("Beam de-allocation failed with errorcode: " << errorName(ack.status)); itsPropertySet->setValue(PN_FSM_ERROR,GCFPVString("De-allocation of the beam failed.")); - return (false); + return (false); } set<string>::iterator iter = itsBeamIDs.begin(); @@ -903,7 +904,7 @@ bool BeamControl::handleBeamFreeAck(GCFEvent& event) // _defaultEventHandler(event, port) // -GCFEvent::TResult BeamControl::_defaultEventHandler(GCFEvent& event, +GCFEvent::TResult BeamControl::_defaultEventHandler(GCFEvent& event, GCFPortInterface& port) { CTState cts; @@ -925,7 +926,7 @@ GCFEvent::TResult BeamControl::_defaultEventHandler(GCFEvent& event, result = GCFEvent::HANDLED; } break; - + case CONTROL_QUIT: TRAN(BeamControl::quiting_state); break; @@ -943,7 +944,7 @@ GCFEvent::TResult BeamControl::_defaultEventHandler(GCFEvent& event, break; case DP_CHANGED: { - LOG_DEBUG_STR("DP " << DPChangedEvent(event).DPname << " was changed"); + LOG_DEBUG_STR("DP " << DPChangedEvent(event).DPname << " was changed"); result = GCFEvent::HANDLED; } break; @@ -954,7 +955,7 @@ GCFEvent::TResult BeamControl::_defaultEventHandler(GCFEvent& event, } if (result == GCFEvent::NOT_HANDLED) { - LOG_WARN_STR("Event " << eventName(event) << " NOT handled in state " << + LOG_WARN_STR("Event " << eventName(event) << " NOT handled in state " << cts.name(itsState)); }