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(
"SatStatsLinkSinrHelper");
57 NS_OBJECT_ENSURE_REGISTERED(SatStatsLinkSinrHelper);
63 NS_LOG_FUNCTION(
this << satHelper);
68 NS_LOG_FUNCTION(
this);
74 static TypeId tid = TypeId(
"ns3::SatStatsLinkSinrHelper").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(
"SINR (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(
"SINR (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(
"SINR (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 with a sinr of " << sinrDb <<
"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 with a sinr of " << sinrDb <<
"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, sinrDb);
539 Ptr<UnitConversionCollector> c = collector->GetObject<UnitConversionCollector>();
540 NS_ASSERT(c !=
nullptr);
541 c->TraceSinkDouble(0.0, sinrDb);
553 Ptr<ScalarCollector> c = collector->GetObject<ScalarCollector>();
554 NS_ASSERT(c !=
nullptr);
555 c->TraceSinkDouble(0.0, sinrDb);
559 Ptr<DistributionCollector> c = collector->GetObject<DistributionCollector>();
560 NS_ASSERT(c !=
nullptr);
561 c->TraceSinkDouble(0.0, sinrDb);
567 <<
" is not a valid output type for this statistics.");
588 NS_LOG_FUNCTION(
this << satHelper);
593 NS_LOG_FUNCTION(
this);
607 NS_LOG_FUNCTION(
this);
609 NodeContainer uts =
GetSatHelper()->GetBeamHelper()->GetUtNodes();
611 for (NodeContainer::Iterator it = uts.Begin(); it != uts.End(); ++it)
617 NodeContainer sats =
GetSatHelper()->GetBeamHelper()->GetGeoSatNodes();
619 for (NodeContainer::Iterator it = sats.Begin(); it != sats.End(); ++it)
623 NS_ASSERT(satGeoDev !=
nullptr);
624 std::map<uint32_t, Ptr<SatPhy>> satGeoFeederPhys = satGeoDev->GetFeederPhy();
626 satGeoDev->GetAttribute(
"FeederPhy", phy);
627 NS_LOG_DEBUG(
this <<
" GeoSat Node ID " << (*it)->GetId() <<
" device #"
628 << dev->GetIfIndex() <<
" has " << phy.GetN() <<
" PHY instance(s)");
630 for (ObjectMapValue::Iterator itPhy = phy.Begin(); itPhy != phy.End(); ++itPhy)
632 Ptr<SatPhy> satPhy = itPhy->second->GetObject<
SatPhy>();
633 NS_ASSERT(satPhy !=
nullptr);
634 Ptr<SatPhyRx> satPhyRx = satPhy->GetPhyRx();
635 NS_ASSERT(satPhyRx !=
nullptr);
636 ObjectVectorValue carriers;
637 satPhyRx->GetAttribute(
"RxCarrierList", carriers);
638 NS_LOG_DEBUG(
this <<
" PHY #" << itPhy->first <<
" has " << carriers.GetN()
639 <<
" RX carrier(s)");
641 for (ObjectVectorValue::Iterator itCarrier = carriers.Begin();
642 itCarrier != carriers.End();
646 if (!itCarrier->second->TraceConnectWithoutContext(
"LinkSinr",
649 NS_FATAL_ERROR(
"Error connecting to LinkSinr trace source"
650 <<
" of SatPhyRxCarrier"
651 <<
" at GeoSat node ID " << (*it)->GetId() <<
" device #"
652 << dev->GetIfIndex() <<
" PHY #" << itPhy->first
653 <<
" RX carrier #" << itCarrier->first);
670 NS_LOG_FUNCTION(
this << satHelper);
675 NS_LOG_FUNCTION(
this);
689 NS_LOG_FUNCTION(
this);
691 NodeContainer uts =
GetSatHelper()->GetBeamHelper()->GetUtNodes();
692 for (NodeContainer::Iterator it = uts.Begin(); it != uts.End(); ++it)
702 Ptr<SatNetDevice> satDev = dev->GetObject<
SatNetDevice>();
703 NS_ASSERT(satDev !=
nullptr);
704 Ptr<SatPhy> satPhy = satDev->GetPhy();
705 NS_ASSERT(satPhy !=
nullptr);
706 Ptr<SatPhyRx> satPhyRx = satPhy->GetPhyRx();
707 NS_ASSERT(satPhyRx !=
nullptr);
708 ObjectVectorValue carriers;
709 satPhyRx->GetAttribute(
"RxCarrierList", carriers);
710 NS_LOG_DEBUG(
this <<
" Node ID " << (*it)->GetId() <<
" device #" << dev->GetIfIndex()
711 <<
" has " << carriers.GetN() <<
" RX carriers");
713 for (ObjectVectorValue::Iterator itCarrier = carriers.Begin(); itCarrier != carriers.End();
719 NS_FATAL_ERROR(
"Error connecting to LinkSinr trace source"
720 <<
" of SatPhyRxCarrier"
721 <<
" at node ID " << (*it)->GetId() <<
" device #"
722 << dev->GetIfIndex() <<
" RX carrier #" << itCarrier->first);
738 NS_LOG_FUNCTION(
this << satHelper);
743 NS_LOG_FUNCTION(
this);
757 NS_LOG_FUNCTION(
this);
759 NodeContainer uts =
GetSatHelper()->GetBeamHelper()->GetUtNodes();
760 for (NodeContainer::Iterator it = uts.Begin(); it != uts.End(); ++it)
766 NodeContainer gws =
GetSatHelper()->GetBeamHelper()->GetGwNodes();
767 for (NodeContainer::Iterator it = gws.Begin(); it != gws.End(); ++it)
771 for (NetDeviceContainer::Iterator itDev = devs.Begin(); itDev != devs.End(); ++itDev)
773 Ptr<SatNetDevice> satDev = (*itDev)->GetObject<
SatNetDevice>();
774 NS_ASSERT(satDev !=
nullptr);
775 Ptr<SatPhy> satPhy = satDev->GetPhy();
776 NS_ASSERT(satPhy !=
nullptr);
777 Ptr<SatPhyRx> satPhyRx = satPhy->GetPhyRx();
778 NS_ASSERT(satPhyRx !=
nullptr);
779 ObjectVectorValue carriers;
780 satPhyRx->GetAttribute(
"RxCarrierList", carriers);
781 NS_LOG_DEBUG(
this <<
" Node ID " << (*it)->GetId() <<
" device #"
782 << (*itDev)->GetIfIndex() <<
" has " << carriers.GetN()
785 for (ObjectVectorValue::Iterator itCarrier = carriers.Begin();
786 itCarrier != carriers.End();
790 if (!itCarrier->second->TraceConnectWithoutContext(
"LinkSinr",
793 NS_FATAL_ERROR(
"Error connecting to LinkSinr trace source"
794 <<
" of SatPhyRxCarrier"
795 <<
" at node ID " << (*it)->GetId() <<
" device #"
796 << (*itDev)->GetIfIndex() <<
" RX carrier #"
797 << itCarrier->first);
815 NS_LOG_FUNCTION(
this << satHelper);
820 NS_LOG_FUNCTION(
this);
834 NS_LOG_FUNCTION(
this);
836 NodeContainer uts =
GetSatHelper()->GetBeamHelper()->GetUtNodes();
837 for (NodeContainer::Iterator it = uts.Begin(); it != uts.End(); ++it)
843 NodeContainer sats =
GetSatHelper()->GetBeamHelper()->GetGeoSatNodes();
845 for (NodeContainer::Iterator it = sats.Begin(); it != sats.End(); ++it)
849 NS_ASSERT(satGeoDev !=
nullptr);
851 std::map<uint32_t, Ptr<SatPhy>> satGeoUserPhys = satGeoDev->GetUserPhy();
852 for (std::map<uint32_t, Ptr<SatPhy>>::iterator it2 = satGeoUserPhys.begin();
853 it2 != satGeoUserPhys.end();
856 satPhy = it2->second;
857 NS_ASSERT(satPhy !=
nullptr);
858 Ptr<SatPhyRx> satPhyRx = satPhy->GetPhyRx();
859 NS_ASSERT(satPhyRx !=
nullptr);
860 ObjectVectorValue carriers;
861 satPhyRx->GetAttribute(
"RxCarrierList", carriers);
862 NS_LOG_DEBUG(
this <<
" Node ID " << (*it)->GetId() <<
" device #"
863 << satGeoDev->GetIfIndex() <<
" has " << carriers.GetN()
866 for (ObjectVectorValue::Iterator itCarrier = carriers.Begin();
867 itCarrier != carriers.End();
871 if (!itCarrier->second->TraceConnectWithoutContext(
"LinkSinr",
874 NS_FATAL_ERROR(
"Error connecting to LinkSinr trace source"
875 <<
" of SatPhyRxCarrier"
876 <<
" at node ID " << (*it)->GetId() <<
" device #"
877 << satGeoDev->GetIfIndex() <<
" RX carrier #"
878 << 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 SINR statistics from a satellite module simulation.
static TypeId GetTypeId()
inherited from ObjectBase base class
SatStatsFwdFeederLinkSinrHelper(Ptr< const SatHelper > satHelper)
virtual ~SatStatsFwdFeederLinkSinrHelper()
/ Destructor.
Produce forward user link SINR statistics from a satellite module simulation.
SatStatsFwdUserLinkSinrHelper(Ptr< const SatHelper > satHelper)
virtual ~SatStatsFwdUserLinkSinrHelper()
/ Destructor.
static TypeId GetTypeId()
inherited from ObjectBase base class
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 SINR statistics helpers.
Ptr< DistributionCollector > m_averagingCollector
The final collector utilized in averaged output (histogram, PDF, and CDF).
virtual ~SatStatsLinkSinrHelper()
/ Destructor.
Callback< void, double, const Address & > m_traceSinkCallback
Ptr< DataCollectionObject > m_aggregator
The aggregator created by this helper.
bool ConnectProbeToCollector(Ptr< Probe > probe, uint32_t identifier)
Connect the probe to the right collector.
virtual void DoInstallProbes()=0
void PassSampleToCollector(double sinrDb, uint32_t identifier)
Find a collector with the right identifier and pass a sample data to it.
bool m_averagingMode
AveragingMode attribute.
CollectorMap m_terminalCollectors
Maintains a list of collectors created by this helper.
void DoInstall()
Install the probes, collectors, and aggregators necessary to produce the statistics output.
void SinrCallback(double sinrDb, const Address &addr)
Receive inputs from trace sources and forward them to the collector.
Callback< void, double, const Address & > GetTraceSinkCallback() const
void SetAveragingMode(bool averagingMode)
void InstallProbes()
Set up several probes or other means of listeners and connect them to the collectors.
static TypeId GetTypeId()
inherited from ObjectBase base class
void SaveAddressAndIdentifier(Ptr< Node > utNode)
Save the address and the proper identifier from the given UT node.
std::map< const Address, uint32_t > m_identifierMap
Map of address and the identifier associated with it (for return link).
SatStatsLinkSinrHelper(Ptr< const SatHelper > satHelper)
Produce return feeder link SINR statistics from a satellite module simulation.
SatStatsRtnFeederLinkSinrHelper(Ptr< const SatHelper > satHelper)
static TypeId GetTypeId()
inherited from ObjectBase base class
virtual ~SatStatsRtnFeederLinkSinrHelper()
/ Destructor.
Produce return user link SINR statistics from a satellite module simulation.
static TypeId GetTypeId()
inherited from ObjectBase base class
virtual ~SatStatsRtnUserLinkSinrHelper()
/ Destructor.
SatStatsRtnUserLinkSinrHelper(Ptr< const SatHelper > satHelper)
SatArqSequenceNumber is handling the sequence numbers for the ARQ process.