24 #include <ns3/boolean.h>
25 #include <ns3/callback.h>
26 #include <ns3/data-collection-object.h>
27 #include <ns3/distribution-collector.h>
28 #include <ns3/double-probe.h>
31 #include <ns3/mac48-address.h>
32 #include <ns3/magister-gnuplot-aggregator.h>
33 #include <ns3/multi-file-aggregator.h>
35 #include <ns3/object-map.h>
36 #include <ns3/object-vector.h>
37 #include <ns3/probe.h>
38 #include <ns3/satellite-geo-net-device.h>
39 #include <ns3/satellite-helper.h>
40 #include <ns3/satellite-id-mapper.h>
41 #include <ns3/satellite-net-device.h>
42 #include <ns3/satellite-phy-rx-carrier.h>
43 #include <ns3/satellite-phy-rx.h>
44 #include <ns3/satellite-phy.h>
45 #include <ns3/scalar-collector.h>
46 #include <ns3/singleton.h>
47 #include <ns3/string.h>
48 #include <ns3/unit-conversion-collector.h>
52 NS_LOG_COMPONENT_DEFINE(
"SatStatsLinkRxPowerHelper");
57 NS_OBJECT_ENSURE_REGISTERED(SatStatsLinkRxPowerHelper);
63 NS_LOG_FUNCTION(
this << satHelper);
68 NS_LOG_FUNCTION(
this);
74 static TypeId tid = TypeId(
"ns3::SatStatsLinkRxPowerHelper").SetParent<
SatStatsHelper>();
81 NS_LOG_FUNCTION(
this << averagingMode);
85 Callback<void, double, const Address&>
94 NS_LOG_FUNCTION(
this);
100 <<
" is not a valid output type for this statistics.");
110 "EnableContextPrinting",
118 EnumValue(ScalarCollector::INPUT_DATA_TYPE_DOUBLE));
121 EnumValue(ScalarCollector::OUTPUT_TYPE_AVERAGE_PER_SAMPLE));
125 &MultiFileAggregator::Write1d);
140 EnumValue(UnitConversionCollector::TRANSPARENT));
144 &MultiFileAggregator::Write2d);
159 "EnableContextPrinting",
163 Ptr<MultiFileAggregator> fileAggregator =
165 NS_ASSERT(fileAggregator !=
nullptr);
169 DistributionCollector::OutputType_t outputType =
170 DistributionCollector::OUTPUT_TYPE_HISTOGRAM;
173 outputType = DistributionCollector::OUTPUT_TYPE_PROBABILITY;
177 outputType = DistributionCollector::OUTPUT_TYPE_CUMULATIVE;
184 MakeCallback(&MultiFileAggregator::Write2d, fileAggregator));
188 MakeCallback(&MultiFileAggregator::AddContextHeading, fileAggregator));
192 MakeCallback(&MultiFileAggregator::EnableContextWarning, fileAggregator));
197 EnumValue(ScalarCollector::INPUT_DATA_TYPE_DOUBLE));
200 EnumValue(ScalarCollector::OUTPUT_TYPE_AVERAGE_PER_SAMPLE));
202 Callback<void, double> callback =
208 it->second->TraceConnectWithoutContext(
"Output", callback);
222 DistributionCollector::OutputType_t outputType =
223 DistributionCollector::OUTPUT_TYPE_HISTOGRAM;
226 outputType = DistributionCollector::OUTPUT_TYPE_PROBABILITY;
230 outputType = DistributionCollector::OUTPUT_TYPE_CUMULATIVE;
236 &MultiFileAggregator::Write2d);
239 &MultiFileAggregator::AddContextHeading);
242 &MultiFileAggregator::EnableContextWarning);
251 <<
" is not a valid output type for this statistics.");
261 Ptr<MagisterGnuplotAggregator> plotAggregator =
263 NS_ASSERT(plotAggregator !=
nullptr);
265 plotAggregator->SetLegend(
"RX Power (in dB)",
"Frequency");
266 plotAggregator->Set2dDatasetDefaultStyle(Gnuplot2dDataset::LINES);
271 EnumValue(UnitConversionCollector::TRANSPARENT));
277 const std::string context = it->second->GetName();
278 plotAggregator->Add2dDataset(context, context);
282 &MagisterGnuplotAggregator::Write2d);
297 Ptr<MagisterGnuplotAggregator> plotAggregator =
299 NS_ASSERT(plotAggregator !=
nullptr);
301 plotAggregator->SetLegend(
"RX Power (in dB)",
"Frequency");
302 plotAggregator->Set2dDatasetDefaultStyle(Gnuplot2dDataset::LINES);
308 DistributionCollector::OutputType_t outputType =
309 DistributionCollector::OUTPUT_TYPE_HISTOGRAM;
312 outputType = DistributionCollector::OUTPUT_TYPE_PROBABILITY;
316 outputType = DistributionCollector::OUTPUT_TYPE_CUMULATIVE;
323 MakeCallback(&MagisterGnuplotAggregator::Write2d, plotAggregator));
329 EnumValue(ScalarCollector::INPUT_DATA_TYPE_DOUBLE));
332 EnumValue(ScalarCollector::OUTPUT_TYPE_AVERAGE_PER_SAMPLE));
334 Callback<void, double> callback =
340 it->second->TraceConnectWithoutContext(
"Output", callback);
351 Ptr<MagisterGnuplotAggregator> plotAggregator =
353 NS_ASSERT(plotAggregator !=
nullptr);
355 plotAggregator->SetLegend(
"RX Power (in dB)",
"Frequency");
356 plotAggregator->Set2dDatasetDefaultStyle(Gnuplot2dDataset::LINES);
360 DistributionCollector::OutputType_t outputType =
361 DistributionCollector::OUTPUT_TYPE_HISTOGRAM;
364 outputType = DistributionCollector::OUTPUT_TYPE_PROBABILITY;
368 outputType = DistributionCollector::OUTPUT_TYPE_CUMULATIVE;
376 const std::string context = it->second->GetName();
377 plotAggregator->Add2dDataset(context, context);
381 &MagisterGnuplotAggregator::Write2d);
388 NS_FATAL_ERROR(
"SatStatsLinkDelayHelper - Invalid output type");
402 if (from.IsInvalid())
404 NS_LOG_WARN(
this <<
" discarding a packet RX power of " << rxPowerDb <<
"dB"
405 <<
" from statistics collection because of"
406 <<
" invalid sender address");
408 else if (Mac48Address::ConvertFrom(from).IsBroadcast())
418 std::map<const Address, uint32_t>::const_iterator it =
m_identifierMap.find(from);
426 NS_LOG_WARN(
this <<
" discarding a packet RX power of " << rxPowerDb <<
"dB"
427 <<
" from statistics collection because of"
428 <<
" unknown sender address " << from);
436 NS_LOG_FUNCTION(
this << utNode->GetId());
438 const SatIdMapper* satIdMapper = Singleton<SatIdMapper>::Get();
441 if (addr.IsInvalid())
443 NS_LOG_WARN(
this <<
" Node " << utNode->GetId() <<
" is not a valid UT");
449 NS_LOG_INFO(
this <<
" associated address " << addr <<
" with identifier " << identifier);
456 NS_LOG_FUNCTION(
this << probe << probe->GetName() << identifier);
466 &ScalarCollector::TraceSinkDouble);
474 &UnitConversionCollector::TraceSinkDouble);
488 &ScalarCollector::TraceSinkDouble);
495 &DistributionCollector::TraceSinkDouble);
501 <<
" is not a valid output type for this statistics.");
507 NS_LOG_INFO(
this <<
" created probe " << probe->GetName() <<
", connected to collector "
512 NS_LOG_WARN(
this <<
" unable to connect probe " << probe->GetName() <<
" to collector "
525 NS_ASSERT_MSG(collector !=
nullptr,
"Unable to find collector with identifier " << identifier);
531 Ptr<ScalarCollector> c = collector->GetObject<ScalarCollector>();
532 NS_ASSERT(c !=
nullptr);
533 c->TraceSinkDouble(0.0, rxPowerDb);
539 Ptr<UnitConversionCollector> c = collector->GetObject<UnitConversionCollector>();
540 NS_ASSERT(c !=
nullptr);
541 c->TraceSinkDouble(0.0, rxPowerDb);
553 Ptr<ScalarCollector> c = collector->GetObject<ScalarCollector>();
554 NS_ASSERT(c !=
nullptr);
555 c->TraceSinkDouble(0.0, rxPowerDb);
559 Ptr<DistributionCollector> c = collector->GetObject<DistributionCollector>();
560 NS_ASSERT(c !=
nullptr);
561 c->TraceSinkDouble(0.0, rxPowerDb);
567 <<
" is not a valid output type for this statistics.");
586 Ptr<const SatHelper> satHelper)
589 NS_LOG_FUNCTION(
this << satHelper);
594 NS_LOG_FUNCTION(
this);
608 NS_LOG_FUNCTION(
this);
610 NodeContainer uts =
GetSatHelper()->GetBeamHelper()->GetUtNodes();
612 for (NodeContainer::Iterator it = uts.Begin(); it != uts.End(); ++it)
618 NodeContainer sats =
GetSatHelper()->GetBeamHelper()->GetGeoSatNodes();
620 for (NodeContainer::Iterator it = sats.Begin(); it != sats.End(); ++it)
624 NS_ASSERT(satGeoDev !=
nullptr);
625 std::map<uint32_t, Ptr<SatPhy>> satGeoFeederPhys = satGeoDev->GetFeederPhy();
627 satGeoDev->GetAttribute(
"FeederPhy", phy);
628 NS_LOG_DEBUG(
this <<
" GeoSat Node ID " << (*it)->GetId() <<
" device #"
629 << dev->GetIfIndex() <<
" has " << phy.GetN() <<
" PHY instance(s)");
631 for (ObjectMapValue::Iterator itPhy = phy.Begin(); itPhy != phy.End(); ++itPhy)
633 Ptr<SatPhy> satPhy = itPhy->second->GetObject<
SatPhy>();
634 NS_ASSERT(satPhy !=
nullptr);
635 Ptr<SatPhyRx> satPhyRx = satPhy->GetPhyRx();
636 NS_ASSERT(satPhyRx !=
nullptr);
637 ObjectVectorValue carriers;
638 satPhyRx->GetAttribute(
"RxCarrierList", carriers);
639 NS_LOG_DEBUG(
this <<
" PHY #" << itPhy->first <<
" has " << carriers.GetN()
640 <<
" RX carrier(s)");
642 for (ObjectVectorValue::Iterator itCarrier = carriers.Begin();
643 itCarrier != carriers.End();
647 if (!itCarrier->second->TraceConnectWithoutContext(
"RxPowerTrace",
650 NS_FATAL_ERROR(
"Error connecting to RxPowerTrace trace source"
651 <<
" of SatPhyRxCarrier"
652 <<
" at GeoSat node ID " << (*it)->GetId() <<
" device #"
653 << dev->GetIfIndex() <<
" PHY #" << itPhy->first
654 <<
" RX carrier #" << itCarrier->first);
671 NS_LOG_FUNCTION(
this << satHelper);
676 NS_LOG_FUNCTION(
this);
690 NS_LOG_FUNCTION(
this);
692 NodeContainer uts =
GetSatHelper()->GetBeamHelper()->GetUtNodes();
693 for (NodeContainer::Iterator it = uts.Begin(); it != uts.End(); ++it)
703 Ptr<SatNetDevice> satDev = dev->GetObject<
SatNetDevice>();
704 NS_ASSERT(satDev !=
nullptr);
705 Ptr<SatPhy> satPhy = satDev->GetPhy();
706 NS_ASSERT(satPhy !=
nullptr);
707 Ptr<SatPhyRx> satPhyRx = satPhy->GetPhyRx();
708 NS_ASSERT(satPhyRx !=
nullptr);
709 ObjectVectorValue carriers;
710 satPhyRx->GetAttribute(
"RxCarrierList", carriers);
711 NS_LOG_DEBUG(
this <<
" Node ID " << (*it)->GetId() <<
" device #" << dev->GetIfIndex()
712 <<
" has " << carriers.GetN() <<
" RX carriers");
714 for (ObjectVectorValue::Iterator itCarrier = carriers.Begin(); itCarrier != carriers.End();
718 if (!itCarrier->second->TraceConnectWithoutContext(
"RxPowerTrace",
721 NS_FATAL_ERROR(
"Error connecting to RxPowerTrace trace source"
722 <<
" of SatPhyRxCarrier"
723 <<
" at node ID " << (*it)->GetId() <<
" device #"
724 << dev->GetIfIndex() <<
" RX carrier #" << itCarrier->first);
738 Ptr<const SatHelper> satHelper)
741 NS_LOG_FUNCTION(
this << satHelper);
746 NS_LOG_FUNCTION(
this);
760 NS_LOG_FUNCTION(
this);
762 NodeContainer uts =
GetSatHelper()->GetBeamHelper()->GetUtNodes();
763 for (NodeContainer::Iterator it = uts.Begin(); it != uts.End(); ++it)
769 NodeContainer gws =
GetSatHelper()->GetBeamHelper()->GetGwNodes();
770 for (NodeContainer::Iterator it = gws.Begin(); it != gws.End(); ++it)
774 for (NetDeviceContainer::Iterator itDev = devs.Begin(); itDev != devs.End(); ++itDev)
776 Ptr<SatNetDevice> satDev = (*itDev)->GetObject<
SatNetDevice>();
777 NS_ASSERT(satDev !=
nullptr);
778 Ptr<SatPhy> satPhy = satDev->GetPhy();
779 NS_ASSERT(satPhy !=
nullptr);
780 Ptr<SatPhyRx> satPhyRx = satPhy->GetPhyRx();
781 NS_ASSERT(satPhyRx !=
nullptr);
782 ObjectVectorValue carriers;
783 satPhyRx->GetAttribute(
"RxCarrierList", carriers);
784 NS_LOG_DEBUG(
this <<
" Node ID " << (*it)->GetId() <<
" device #"
785 << (*itDev)->GetIfIndex() <<
" has " << carriers.GetN()
788 for (ObjectVectorValue::Iterator itCarrier = carriers.Begin();
789 itCarrier != carriers.End();
793 if (!itCarrier->second->TraceConnectWithoutContext(
"RxPowerTrace",
796 NS_FATAL_ERROR(
"Error connecting to RxPowerTrace trace source"
797 <<
" of SatPhyRxCarrier"
798 <<
" at node ID " << (*it)->GetId() <<
" device #"
799 << (*itDev)->GetIfIndex() <<
" RX carrier #"
800 << itCarrier->first);
818 NS_LOG_FUNCTION(
this << satHelper);
823 NS_LOG_FUNCTION(
this);
837 NS_LOG_FUNCTION(
this);
839 NodeContainer uts =
GetSatHelper()->GetBeamHelper()->GetUtNodes();
840 for (NodeContainer::Iterator it = uts.Begin(); it != uts.End(); ++it)
846 NodeContainer sats =
GetSatHelper()->GetBeamHelper()->GetGeoSatNodes();
848 for (NodeContainer::Iterator it = sats.Begin(); it != sats.End(); ++it)
852 NS_ASSERT(satGeoDev !=
nullptr);
854 std::map<uint32_t, Ptr<SatPhy>> satGeoUserPhys = satGeoDev->GetUserPhy();
855 for (std::map<uint32_t, Ptr<SatPhy>>::iterator it2 = satGeoUserPhys.begin();
856 it2 != satGeoUserPhys.end();
859 satPhy = it2->second;
860 NS_ASSERT(satPhy !=
nullptr);
861 Ptr<SatPhyRx> satPhyRx = satPhy->GetPhyRx();
862 NS_ASSERT(satPhyRx !=
nullptr);
863 ObjectVectorValue carriers;
864 satPhyRx->GetAttribute(
"RxCarrierList", carriers);
865 NS_LOG_DEBUG(
this <<
" Node ID " << (*it)->GetId() <<
" device #"
866 << satGeoDev->GetIfIndex() <<
" has " << carriers.GetN()
869 for (ObjectVectorValue::Iterator itCarrier = carriers.Begin();
870 itCarrier != carriers.End();
874 if (!itCarrier->second->TraceConnectWithoutContext(
"RxPowerTrace",
877 NS_FATAL_ERROR(
"Error connecting to RxPowerTrace trace source"
878 <<
" of SatPhyRxCarrier"
879 <<
" at node ID " << (*it)->GetId() <<
" device #"
880 << satGeoDev->GetIfIndex() <<
" RX carrier #"
881 << itCarrier->first);
SatGeoNetDevice to be utilized in geostationary satellite.
Address GetUtMacWithNode(Ptr< Node > utNode) const
SatNetDevice to be utilized in the UT and GW nodes.
The SatPhy models the basic physical layer of the satellite system.
Produce forward feeder link RX power statistics from a satellite module simulation.
static TypeId GetTypeId()
inherited from ObjectBase base class
virtual ~SatStatsFwdFeederLinkRxPowerHelper()
/ Destructor.
SatStatsFwdFeederLinkRxPowerHelper(Ptr< const SatHelper > satHelper)
Produce forward user link RX power statistics from a satellite module simulation.
SatStatsFwdUserLinkRxPowerHelper(Ptr< const SatHelper > satHelper)
static TypeId GetTypeId()
inherited from ObjectBase base class
virtual ~SatStatsFwdUserLinkRxPowerHelper()
/ Destructor.
Parent abstract class of all satellite statistics helpers.
Ptr< const SatHelper > GetSatHelper() const
static NetDeviceContainer GetGwSatNetDevice(Ptr< Node > gwNode)
static std::string GetOutputTypeName(OutputType_t outputType)
static Ptr< NetDevice > GetSatSatGeoNetDevice(Ptr< Node > satNode)
virtual std::string GetIdentifierHeading(std::string dataLabel) const
virtual std::string GetOutputPath() const
Ptr< DataCollectionObject > CreateAggregator(std::string aggregatorTypeId, std::string n1="", const AttributeValue &v1=EmptyAttributeValue(), std::string n2="", const AttributeValue &v2=EmptyAttributeValue(), std::string n3="", const AttributeValue &v3=EmptyAttributeValue(), std::string n4="", const AttributeValue &v4=EmptyAttributeValue(), std::string n5="", const AttributeValue &v5=EmptyAttributeValue())
Create the aggregator according to the output type.
virtual std::string GetOutputFileName() const
Compute the path and file name where statistics output should be written to.
uint32_t CreateCollectorPerIdentifier(CollectorMap &collectorMap) const
Create one collector instance for each identifier in the simulation.
static Ptr< NetDevice > GetUtSatNetDevice(Ptr< Node > utNode)
OutputType_t GetOutputType() const
uint32_t GetIdentifierForUt(Ptr< Node > utNode) const
std::string GetName() const
virtual std::string GetTimeHeading(std::string dataLabel) const
virtual std::string GetDistributionHeading(std::string dataLabel) const
Base class for link RX power statistics helpers.
SatStatsLinkRxPowerHelper(Ptr< const SatHelper > satHelper)
virtual void DoInstallProbes()=0
void DoInstall()
Install the probes, collectors, and aggregators necessary to produce the statistics output.
CollectorMap m_terminalCollectors
Maintains a list of collectors created by this helper.
bool ConnectProbeToCollector(Ptr< Probe > probe, uint32_t identifier)
Connect the probe to the right collector.
static TypeId GetTypeId()
inherited from ObjectBase base class
Ptr< DataCollectionObject > m_aggregator
The aggregator created by this helper.
void SetAveragingMode(bool averagingMode)
virtual ~SatStatsLinkRxPowerHelper()
/ Destructor.
bool m_averagingMode
AveragingMode attribute.
void PassSampleToCollector(double rxPowerDb, uint32_t identifier)
Find a collector with the right identifier and pass a sample data to it.
Ptr< DistributionCollector > m_averagingCollector
The final collector utilized in averaged output (histogram, PDF, and CDF).
void InstallProbes()
Set up several probes or other means of listeners and connect them to the collectors.
void SaveAddressAndIdentifier(Ptr< Node > utNode)
Save the address and the proper identifier from the given UT node.
Callback< void, double, const Address & > m_traceSinkCallback
Callback< void, double, const Address & > GetTraceSinkCallback() const
void RxPowerCallback(double rxPowerDb, const Address &addr)
Receive inputs from trace sources and forward them to the collector.
std::map< const Address, uint32_t > m_identifierMap
Map of address and the identifier associated with it (for return link).
Produce return feeder link RX power statistics from a satellite module simulation.
SatStatsRtnFeederLinkRxPowerHelper(Ptr< const SatHelper > satHelper)
virtual ~SatStatsRtnFeederLinkRxPowerHelper()
/ Destructor.
static TypeId GetTypeId()
inherited from ObjectBase base class
Produce return user link RX power statistics from a satellite module simulation.
static TypeId GetTypeId()
inherited from ObjectBase base class
SatStatsRtnUserLinkRxPowerHelper(Ptr< const SatHelper > satHelper)
virtual ~SatStatsRtnUserLinkRxPowerHelper()
/ Destructor.
SatArqSequenceNumber is handling the sequence numbers for the ARQ process.