73 const std::string &title, |
73 const std::string &title, |
74 const std::string &xLegend, |
74 const std::string &xLegend, |
75 const std::string &yLegend, |
75 const std::string &yLegend, |
76 const std::string &terminalType = ".png"); |
76 const std::string &terminalType = ".png"); |
77 |
77 |
78 The second statement hooks the ``Probe`` of interest: |
78 The second statement hooks the trace source of interest: |
79 |
79 |
80 :: |
80 :: |
81 |
81 |
82 void PlotProbe (const std::string &typeId, |
82 void PlotProbe (const std::string &typeId, |
83 const std::string &path, |
83 const std::string &path, |
85 const std::string &title); |
85 const std::string &title); |
86 |
86 |
87 The arguments are as follows: |
87 The arguments are as follows: |
88 |
88 |
89 * typeId: The |ns3| TypeId of the Probe |
89 * typeId: The |ns3| TypeId of the Probe |
90 * path: The path in the |ns3| configuration namespace to one or more probes |
90 * path: The path in the |ns3| configuration namespace to one or more trace sources |
91 * probeTraceSource: Which output of the probe should be connected to |
91 * probeTraceSource: Which output of the probe (itself a trace source) should be plotted |
92 * title: The title to associate with the dataset (in the gnuplot legend) |
92 * title: The title to associate with the dataset(s) (in the gnuplot legend) |
93 |
93 |
94 A variant on the PlotProbe above is to specify a fifth optional argument |
94 A variant on the PlotProbe above is to specify a fifth optional argument |
95 that controls where in the plot the key (legend) is placed. |
95 that controls where in the plot the key (legend) is placed. |
96 |
96 |
97 A fully worked example (from ``seventh.cc``) is shown below: |
97 A fully worked example (from ``seventh.cc``) is shown below: |
100 |
100 |
101 // Create the gnuplot helper. |
101 // Create the gnuplot helper. |
102 GnuplotHelper plotHelper; |
102 GnuplotHelper plotHelper; |
103 |
103 |
104 // Configure the plot. |
104 // Configure the plot. |
|
105 // Configure the plot. The first argument is the file name prefix |
|
106 // for the output files generated. The second, third, and fourth |
|
107 // arguments are, respectively, the plot title, x-axis, and y-axis labels |
105 plotHelper.ConfigurePlot ("seventh-packet-byte-count", |
108 plotHelper.ConfigurePlot ("seventh-packet-byte-count", |
106 "Packet Byte Count vs. Time", |
109 "Packet Byte Count vs. Time", |
107 "Time (Seconds)", |
110 "Time (Seconds)", |
108 "Packet Byte Count", |
111 "Packet Byte Count", |
109 "png"); |
112 "png"); |
110 |
113 |
111 // Plot the values generated by the probe. |
114 // Specify the probe type, trace source path (in configuration namespace), and |
112 plotHelper.PlotProbe ("ns3::Ipv4PacketProbe", |
115 // probe output trace source ("OutputBytes") to plot. The fourth argument |
113 "/NodeList/*/$ns3::Ipv4L3Protocol/Tx", |
116 // specifies the name of the data series label on the plot. The last |
|
117 // argument formats the plot by specifying where the key should be placed. |
|
118 plotHelper.PlotProbe (probeType, |
|
119 tracePath, |
114 "OutputBytes", |
120 "OutputBytes", |
115 "Packet Byte Count", |
121 "Packet Byte Count", |
116 GnuplotAggregator::KEY_BELOW); |
122 GnuplotAggregator::KEY_BELOW); |
117 |
123 |
118 Note that the path specified may contain wildcards. In this case, multiple |
124 In this example, the ``probeType`` and ``tracePath`` are as follows (for IPv4): |
|
125 |
|
126 :: |
|
127 |
|
128 probeType = "ns3::Ipv4PacketProbe"; |
|
129 tracePath = "/NodeList/*/$ns3::Ipv4L3Protocol/Tx"; |
|
130 |
|
131 The probeType is a key parameter for this helper to work. This TypeId |
|
132 must be registered in the system, and the signature on the Probe's trace |
|
133 sink must match that of the trace source it is being hooked to. Probe |
|
134 types are pre-defined for a number of data types corresponding to |ns3| |
|
135 traced values, and for a few other trace source signatures such as the |
|
136 'Tx' trace source of ``ns3::Ipv4L3Protocol`` class. |
|
137 |
|
138 Note that the trace source path specified may contain wildcards. |
|
139 In this case, multiple |
119 datasets are plotted on one plot; one for each matched path. |
140 datasets are plotted on one plot; one for each matched path. |
120 |
141 |
121 The main output produced will be three files: |
142 The main output produced will be three files: |
122 |
143 |
123 :: |
144 :: |
222 |
243 |
223 +------------------+------------------------------+ |
244 +------------------+------------------------------+ |
224 | Argument | Description | |
245 | Argument | Description | |
225 +==================+==============================+ |
246 +==================+==============================+ |
226 | typeId | The type ID for the probe | |
247 | typeId | The type ID for the probe | |
227 | | used when it is created. | |
248 | | created by this helper. | |
228 +------------------+------------------------------+ |
249 +------------------+------------------------------+ |
229 | path | Config path to access the | |
250 | path | Config path to access the | |
230 | | probe. | |
251 | | trace source. | |
231 +------------------+------------------------------+ |
252 +------------------+------------------------------+ |
232 | probeTraceSource | The probe trace source to | |
253 | probeTraceSource | The probe trace source to | |
233 | | access. | |
254 | | access. | |
234 +------------------+------------------------------+ |
255 +------------------+------------------------------+ |
235 | title | The title to be associated | |
256 | title | The title to be associated | |
240 | | location is inside. | |
261 | | location is inside. | |
241 +------------------+------------------------------+ |
262 +------------------+------------------------------+ |
242 |
263 |
243 The GnuplotHelper's ``PlotProbe()`` function |
264 The GnuplotHelper's ``PlotProbe()`` function |
244 plots a dataset generated by hooking the |ns3| trace source with a |
265 plots a dataset generated by hooking the |ns3| trace source with a |
245 probe, and then plotting the values from the probeTraceSource. |
266 probe created by the helper, and then plotting the values from the |
|
267 probeTraceSource. |
246 The dataset will have the provided title, and will consist of |
268 The dataset will have the provided title, and will consist of |
247 the 'newValue' at each timestamp. |
269 the 'newValue' at each timestamp. |
248 |
270 |
249 If the config path has more than one match in the system because |
271 If the config path has more than one match in the system because |
250 there is a wildcard, then one dataset for each match will |
272 there is a wildcard, then one dataset for each match will |
254 is the string "bytes", and there are two wildcards in the path, |
276 is the string "bytes", and there are two wildcards in the path, |
255 then dataset titles like "bytes-0 0" or "bytes-12 9" will be |
277 then dataset titles like "bytes-0 0" or "bytes-12 9" will be |
256 possible as labels for the datasets that are plotted. |
278 possible as labels for the datasets that are plotted. |
257 |
279 |
258 An example of how to use this function can be seen in the |
280 An example of how to use this function can be seen in the |
259 ``seventh.cc`` code described above where it was used as follows: |
281 ``seventh.cc`` code described above where it was used (with |
|
282 variable substitution) as follows: |
260 |
283 |
261 :: |
284 :: |
262 |
285 |
263 plotHelper.PlotProbe ("ns3::Ipv4PacketProbe", |
286 plotHelper.PlotProbe ("ns3::Ipv4PacketProbe", |
264 "/NodeList/*/$ns3::Ipv4L3Protocol/Tx", |
287 "/NodeList/*/$ns3::Ipv4L3Protocol/Tx", |
271 |
294 |
272 Gnuplot Helper Example |
295 Gnuplot Helper Example |
273 ~~~~~~~~~~~~~~~~~~~~~~ |
296 ~~~~~~~~~~~~~~~~~~~~~~ |
274 |
297 |
275 A slightly simpler example than the ``seventh.cc`` example can be |
298 A slightly simpler example than the ``seventh.cc`` example can be |
276 found in ``src/stats/examples/gnuplot-helper-example.cc``. It |
299 found in ``src/stats/examples/gnuplot-helper-example.cc``. The |
277 is more of a toy example than ``seventh.cc`` because it has |
300 following 2-D gnuplot was created using the example. |
278 a made-up trace source created for demonstration purposes. |
|
279 |
|
280 The following 2-D gnuplot was created using the example. |
|
281 |
301 |
282 .. _gnuplot-helper-example: |
302 .. _gnuplot-helper-example: |
283 |
303 |
284 .. figure:: figures/gnuplot-helper-example.png |
304 .. figure:: figures/gnuplot-helper-example.png |
285 |
305 |
286 2-D Gnuplot Created by gnuplot-helper-example.cc Example. |
306 2-D Gnuplot Created by gnuplot-helper-example.cc Example. |
287 |
307 |
288 In this example, there is an Emitter object that increments |
308 In this example, there is an Emitter object that increments |
289 its counter at various random times and then emits the counter's |
309 its counter according to a Poisson process and then emits the counter's |
290 value as a trace source. |
310 value as a trace source. |
291 |
311 |
292 :: |
312 :: |
293 |
313 |
294 Ptr<Emitter> emitter = CreateObject<Emitter> (); |
314 Ptr<Emitter> emitter = CreateObject<Emitter> (); |
295 Names::Add ("/Names/Emitter", emitter); |
315 Names::Add ("/Names/Emitter", emitter); |
296 |
|
297 The following code is probing the Counter exported by the |
|
298 emitter object. This DoubleProbe is using a path in the |
|
299 configuration namespace to make the connection. Note that |
|
300 the emitter registered itself in the configuration namespace |
|
301 after it was created; otherwise, the ConnectByPath would not work. |
|
302 |
|
303 :: |
|
304 |
|
305 Ptr<DoubleProbe> probe = CreateObject<DoubleProbe> (); |
|
306 probe->SetName ("PathProbe"); |
|
307 Names::Add ("/Names/Probe", probe); |
|
308 |
|
309 // Note, no return value is checked here. |
|
310 probe->ConnectByPath ("/Names/Emitter/Counter"); |
|
311 |
316 |
312 Note that because there are no wildcards in the path |
317 Note that because there are no wildcards in the path |
313 used below, only 1 datastream was drawn in the plot. |
318 used below, only 1 datastream was drawn in the plot. |
314 This single datastream in the plot is simply labeled |
319 This single datastream in the plot is simply labeled |
315 "Emitter Count", with no extra suffixes like you would |
320 "Emitter Count", with no extra suffixes like one would |
316 see if there were wildcards in the path. |
321 see if there were wildcards in the path. |
317 |
322 |
318 :: |
323 :: |
319 |
324 |
320 // Create the gnuplot helper. |
325 // Create the gnuplot helper. |
490 |
495 |
491 +------------------+------------------------------+ |
496 +------------------+------------------------------+ |
492 | Argument | Description | |
497 | Argument | Description | |
493 +==================+==============================+ |
498 +==================+==============================+ |
494 | typeId | The type ID for the probe | |
499 | typeId | The type ID for the probe | |
495 | | used when it is created. | |
500 | | to be created. | |
496 +------------------+------------------------------+ |
501 +------------------+------------------------------+ |
497 | path | Config path to access the | |
502 | path | Config path to access the | |
498 | | probe. | |
503 | | trace source. | |
499 +------------------+------------------------------+ |
504 +------------------+------------------------------+ |
500 | probeTraceSource | The probe trace source to | |
505 | probeTraceSource | The probe trace source to | |
501 | | access. | |
506 | | access. | |
502 +------------------+------------------------------+ |
507 +------------------+------------------------------+ |
503 |
508 |
504 The FileHelper's ``WriteProbe()`` function |
509 The FileHelper's ``WriteProbe()`` function |
505 creates output text files generated by hooking the ns-3 trace source |
510 creates output text files generated by hooking the ns-3 trace source |
506 with a probe, and then writing the values from the |
511 with a probe created by the helper, and then writing the values from the |
507 probeTraceSource. The output file names will have the text stored |
512 probeTraceSource. The output file names will have the text stored |
508 in the member variable m_outputFileNameWithoutExtension plus ".txt", |
513 in the member variable m_outputFileNameWithoutExtension plus ".txt", |
509 and will consist of the 'newValue' at each timestamp. |
514 and will consist of the 'newValue' at each timestamp. |
510 |
515 |
511 If the config path has more than one match in the system because |
516 If the config path has more than one match in the system because |
535 File Helper Example |
540 File Helper Example |
536 ~~~~~~~~~~~~~~~~~~~ |
541 ~~~~~~~~~~~~~~~~~~~ |
537 |
542 |
538 A slightly simpler example than the ``seventh.cc`` example can be |
543 A slightly simpler example than the ``seventh.cc`` example can be |
539 found in ``src/stats/examples/file-helper-example.cc``. |
544 found in ``src/stats/examples/file-helper-example.cc``. |
540 This example only uses the FileHelper, not the FileHelper. It |
545 This example only uses the FileHelper. |
541 is also more of a toy example than ``seventh.cc`` because it has |
|
542 a made-up trace source created for demonstration purposes. |
|
543 |
546 |
544 The following text file with 2 columns of formatted values named |
547 The following text file with 2 columns of formatted values named |
545 ``file-helper-example.txt`` was created using the example. |
548 ``file-helper-example.txt`` was created using the example. |
546 Only the first 10 lines of this file are shown here for brevity. |
549 Only the first 10 lines of this file are shown here for brevity. |
547 |
550 |
548 .. sourcecode:: text |
551 .. sourcecode:: text |
549 |
552 |
550 Time (Seconds) = 4.995e-01 Count = 1 |
553 Time (Seconds) = 0.203 Count = 1 |
551 Time (Seconds) = 1.463e+00 Count = 2 |
554 Time (Seconds) = 0.702 Count = 2 |
552 Time (Seconds) = 1.678e+00 Count = 3 |
555 Time (Seconds) = 1.404 Count = 3 |
553 Time (Seconds) = 3.972e+00 Count = 4 |
556 Time (Seconds) = 2.368 Count = 4 |
554 Time (Seconds) = 4.150e+00 Count = 5 |
557 Time (Seconds) = 3.364 Count = 5 |
555 Time (Seconds) = 8.066e+00 Count = 6 |
558 Time (Seconds) = 3.579 Count = 6 |
556 Time (Seconds) = 8.731e+00 Count = 7 |
559 Time (Seconds) = 5.873 Count = 7 |
557 Time (Seconds) = 9.807e+00 Count = 8 |
560 Time (Seconds) = 6.410 Count = 8 |
558 Time (Seconds) = 1.078e+01 Count = 9 |
561 Time (Seconds) = 6.472 Count = 9 |
559 Time (Seconds) = 1.083e+01 Count = 10 |
|
560 |
|
561 ... |
562 ... |
562 |
563 |
563 In this example, there is an Emitter object that increments |
564 In this example, there is an Emitter object that increments |
564 its counter at various random times and then emits the counter's |
565 its counter according to a Poisson process and then emits the counter's |
565 value as a trace source. |
566 value as a trace source. |
566 |
567 |
567 :: |
568 :: |
568 |
569 |
569 Ptr<Emitter> emitter = CreateObject<Emitter> (); |
570 Ptr<Emitter> emitter = CreateObject<Emitter> (); |
570 Names::Add ("/Names/Emitter", emitter); |
571 Names::Add ("/Names/Emitter", emitter); |
571 |
|
572 The following code is probing the Counter exported by the |
|
573 emitter object. This DoubleProbe is using a path in the |
|
574 configuration namespace to make the connection. Note that |
|
575 the emitter registered itself in the configuration namespace |
|
576 after it was created; otherwise, the ConnectByPath would not work. |
|
577 |
|
578 :: |
|
579 |
|
580 Ptr<DoubleProbe> probe = CreateObject<DoubleProbe> (); |
|
581 probe->SetName ("PathProbe"); |
|
582 Names::Add ("/Names/Probe", probe); |
|
583 |
|
584 // Note, no return value is checked here. |
|
585 probe->ConnectByPath ("/Names/Emitter/Counter"); |
|
586 |
572 |
587 Note that because there are no wildcards in the path |
573 Note that because there are no wildcards in the path |
588 used below, only 1 text file was created. |
574 used below, only 1 text file was created. |
589 This single text file is simply named |
575 This single text file is simply named |
590 "file-helper-example.txt", with no extra suffixes like |
576 "file-helper-example.txt", with no extra suffixes like |
602 // Set the labels for this formatted output file. |
588 // Set the labels for this formatted output file. |
603 fileHelper.Set2dFormat ("Time (Seconds) = %.3e\tCount = %.0f"); |
589 fileHelper.Set2dFormat ("Time (Seconds) = %.3e\tCount = %.0f"); |
604 |
590 |
605 // Write the values generated by the probe. The path that we |
591 // Write the values generated by the probe. The path that we |
606 // provide helps to disambiguate the source of the trace. |
592 // provide helps to disambiguate the source of the trace. |
607 fileHelper.WriteProbe ("ns3::DoubleProbe", |
593 fileHelper.WriteProbe ("ns3::Uinteger32Probe", |
608 "/Names/Probe/Output", |
594 "/Names/Emitter/Counter", |
609 "Output"); |
595 "Output"); |
610 |
596 |
611 Scope and Limitations |
597 Scope and Limitations |
612 ===================== |
598 ===================== |
613 |
599 |
621 - Uinteger32Probe |
607 - Uinteger32Probe |
622 - PacketProbe |
608 - PacketProbe |
623 - ApplicationPacketProbe |
609 - ApplicationPacketProbe |
624 - Ipv4PacketProbe |
610 - Ipv4PacketProbe |
625 |
611 |
626 These Probes, therefore, are the only ones available to be used |
612 These Probes, therefore, are the only TypeIds available to be used |
627 in ``PlotProbe()`` and ``WriteProbe()``. |
613 in ``PlotProbe()`` and ``WriteProbe()``. |
628 |
614 |
629 In the next few sections, we cover each of the fundamental object |
615 In the next few sections, we cover each of the fundamental object |
630 types (Probe, Collector, and Aggregator) in more detail, and show |
616 types (Probe, Collector, and Aggregator) in more detail, and show |
631 how they can be connected together using lower-level API. |
617 how they can be connected together using lower-level API. |