16 """A subclass of the standard optparse OptionParser for gdb 18 GdbOptionParser raises GdbError rather than exiting when asked for help, or 19 when given an illegal value. E.g. 21 parser = gdb.printing.GdbOptionParser("show image") 22 parser.add_option("-a", "--all", action="store_true", 23 help="Display the whole image") 24 parser.add_option("-w", "--width", type="int", default=8, 25 help="Field width for pixels") 27 opts, args = parser.parse_args(args) 32 Like optparse.OptionParser's API, but with an initial command name argument 35 if not kwargs.get(
"prog"):
37 optparse.OptionParser.__init__(self, *args, **kwargs)
40 """Call OptionParser.parse_args after running gdb.string_to_argv""" 44 args = gdb.string_to_argv(args)
48 help = (
"-h" in args
or "--help" in args)
49 opts, args = optparse.OptionParser.parse_args(self, args, values)
56 def exit(self, status=0, msg=""):
57 """Raise GdbError rather than exiting""" 60 print(msg, file=sys.stderr)
62 raise gdb.GdbError(msg)
76 return "shared_ptr(%s)" % self.
val[
"px"].dereference()
81 "Print a boost::gil pixel" 89 return self.
val[
"_v0"]
92 m_storage = val[
"m_storage"]
94 nx, ny = m_storage[
"m_cols"], m_storage[
"m_rows"]
97 nx, ny = val.type.template_argument(1), \
98 val.type.template_argument(2)
101 size = m_storage[
"m_data"][
"array"].type.sizeof
102 size0 = m_storage[
"m_data"][
"array"].dereference().type.sizeof
104 nx = int(math.sqrt(size/size0))
110 if re.search(
r"Matrix", str(var.type)):
112 return var[
"operator()(int, int)"](x, y)
116 if x < 0
or x >= NX
or y < 0
or y >= NY:
117 raise gdb.GdbError(
"Element (%d, %d) is out of range 0:%d, 0:%d" %
118 (x, y, NX - 1, NY - 1))
120 m_data = var[
"m_storage"][
"m_data"]
125 m_data = m_data.address.cast(m_data.type)
128 val = m_data[x + y*NX]
130 val = m_data[
"array"][x + y*NX]
133 return var[
"operator()(int)"](x)
139 "Element (%d) is out of range 0:%d" % (x, NX - 1))
141 m_data = var[
"m_storage"][
"m_data"]
145 m_data = m_data.address.cast(m_data.type)
150 val = m_data[
"array"][x]
152 if val.type.code == gdb.TYPE_CODE_INT:
154 elif val.type.code == gdb.TYPE_CODE_FLT:
160 "Print an Eigen Matrix" 168 return "%s{%dx%d}" % (self.
val.type, nx, ny)
171 "Print an Eigen Vector" 177 m_storage = self.
val[
"m_storage"]
183 n = m_storage.type.template_argument(1)
187 size = m_storage[
"m_data"][
"array"].type.sizeof
188 size0 = m_storage[
"m_data"][
"array"].dereference(
190 n = math.sqrt(size/size0)
195 """Print an eigen Matrix or Vector 196 Usage: show eigen <matrix> [x0 y0 [nx ny]] 197 show eigen <vector> [x0 [nx]] 201 super(PrintEigenCommand, self).
__init__(
"show eigen",
205 def _mget(self, var, x, y=0):
208 def _vget(self, var, x):
215 parser.add_option(
"-d",
"--dataFmt", default=
"%.2f",
216 help=
"Format for values")
217 parser.add_option(
"-f",
"--formatWidth", type=
"int",
218 default=8, help=
"Field width for values")
219 parser.add_option(
"-o",
"--origin", type=
"str", nargs=
"+",
220 help=
"Origin of the part of the object to print")
223 "eigenObject", help=
"Expression giving Eigen::Matrix/Vector to show")
225 "nx", help=
"Width of patch to print", type=
"int", default=0, nargs=
"?")
227 "ny", help=
"Height of patch to print", type=
"int", default=0, nargs=
"?")
229 opts = parser.parse_args(args)
233 (opts, args) = parser.parse_args(args)
238 raise gdb.GdbError(
"Please specify an object")
239 opts.eigenObject = args.pop(0)
241 opts.nx, opts.ny = 0, 0
243 opts.nx = int(args.pop(0))
245 opts.ny = int(args.pop(0))
249 "Unrecognised trailing arguments: %s" %
" ".join(args))
251 var = gdb.parse_and_eval(opts.eigenObject)
253 if not re.search(
r"(Eigen|LinearTransform)::(Matrix|Vector)", str(var.type)):
255 "Please specify an eigen matrix or vector, not %s" % var.type)
257 if re.search(
r"shared_ptr<", str(var.type)):
258 var = var[
"px"].dereference()
260 if var.type.code == gdb.TYPE_CODE_PTR:
261 var = var.dereference()
263 isMatrix = re.search(
r"Matrix", str(var.type))
268 if len(opts.origin) != 2:
269 raise gdb.GdbError(
"Please specify both x0 and y0")
271 x0 = gdb.parse_and_eval(opts.origin[0])
272 y0 = gdb.parse_and_eval(opts.origin[1])
283 if nx == 1
and ny == 1:
284 print(
"%g" % self.
_vget(var, x0))
287 NX = 0, var[
"m_storage"][
"n"]
290 if len(opts.origin) != 1:
291 raise gdb.GdbError(
"Please only specify x0")
293 x0 = gdb.parse_and_eval(opts.origin[0])
302 print(
"%g" % self.
_vget(var, x0))
308 print(
"%-4s" %
"", end=
' ')
309 for x
in range(x0,
min(NX, x0 + nx)):
310 print(
"%*d" % (opts.formatWidth, x), end=
' ')
313 for y
in range(y0,
min(NY, y0 + ny)):
314 print(
"%-4d" % y, end=
' ')
315 for x
in range(x0,
min(NX, x0 + nx)):
316 print(
"%*s" % (opts.formatWidth, (opts.dataFmt %
317 self.
_mget(var, x, y))), end=
' ')
320 for x
in range(x0,
min(NX, x0 + nx)):
321 print(
"%*s" % (opts.formatWidth, (opts.dataFmt %
322 self.
_vget(var, x))), end=
' ')
330 "Print a BaseSourceAttributes" 336 return "Base: {id=%d astrom=(%.3f, %.3f)}" % (self.
val[
"_id"],
337 self.
val[
"_xAstrom"],
338 self.
val[
"_yAstrom"])
347 return "Source{id=%d astrom=(%.3f, %.3f)}" % (self.
val[
"_id"],
348 self.
val[
"_xAstrom"],
349 self.
val[
"_yAstrom"])
352 "Print a cameraGeom::Detector" 358 return "Detector{name: %s id: %s type: %s bbox: %s}" % (self.
val[
"_name"], self.
val[
"_id"],
359 self.
val[
"_type"], self.
val[
"_bbox"])
370 nspan = self.
val[
"_spans"][
"size"]()
372 vec_impl = self.
val[
"_spans"][
"_M_impl"]
373 nspan = vec_impl[
"_M_finish"] - vec_impl[
"_M_start"]
375 return "Footprint{id=%d, nspan=%d, area=%d; BBox %s}" % (self.
val[
"_fid"], nspan,
376 self.
val[
"_area"], self.
val[
"_bbox"])
379 "Print a FootprintSet" 385 return "FootprintSet{%s; %s}" % (self.
val[
"_region"], self.
val[
"_footprints"])
394 return "Peak{%d, (%.2f, %.2f)}" % (self.
val[
"_id"], self.
val[
"_fx"], self.
val[
"_fy"])
400 return "%s" % (self.typeName())
411 if type.code == gdb.TYPE_CODE_REF:
419 return "Box2{(%s,%s)--(%s,%s)}" % (llc[0], llc[1],
420 llc[0] + dims[0] - 1, llc[1] + dims[1] - 1)
426 "Print a CoordinateBase" 432 return self.
val[
"_vector"][
"m_storage"][
"m_data"][
"array"]
438 "Print an ellipse::Axes" 444 vec = self.
val[
"_vector"]
448 "Print an ellipse::Quadrupole" 454 mat = self.
val[
"_matrix"]
463 "Print an ImageBase or derived class" 471 if type.code == gdb.TYPE_CODE_REF:
474 gilView = val[
"_gilView"]
475 arr = val[
"_origin"][
"_vector"][
"m_storage"][
"m_data"][
"array"]
477 x0, y0 = arr[0], arr[1]
478 return "%dx%d%s%d%s%d" % (
480 gilView[
"_dimensions"][
"x"], gilView[
"_dimensions"][
"y"],
482 [
"",
"+"][x0 >= 0], x0,
483 [
"",
"+"][y0 >= 0], y0)
496 "Print a MaskedImage" 506 self.
dimenStr(self.
val[
"_maskedImage"][
"_image"][
"px"].dereference()))
512 super(PrintImageCommand, self).
__init__(
"show image",
518 return var[
"operator()(int, int, bool)"](x, y,
True)
520 dimensions = var[
"_gilView"][
"_dimensions"]
521 if x < 0
or x >= dimensions[
"x"]
or y < 0
or y >= dimensions[
"y"]:
522 raise gdb.GdbError(
"Pixel (%d, %d) is out of range 0:%d, 0:%d" %
523 (x, y, dimensions[
"x"] - 1, dimensions[
"y"] - 1))
525 pixels = var[
"_gilView"][
"_pixels"][
"_p"]
526 step = pixels[
"_step_fn"][
"_step"] / \
527 var.type.template_argument(0).sizeof
529 return pixels[
"m_iterator"][x + y*step][
"_v0"]
535 "show image" + (
"" if argparse
else " <image> [<nx> [<ny>]]"))
536 parser.add_option(
"-a",
"--all", action=
"store_true",
537 help=
"Display the whole image/mask")
538 parser.add_option(
"-c",
"--center", type=
"str", nargs=2, default=(
None,
None,),
539 help=
"Center the output at (x, y)")
540 parser.add_option(
"-o",
"--origin", type=
"str", nargs=2, default=(
None,
None,),
541 help=
"Print the region starting at (x, y)")
542 parser.add_option(
"-x",
"--xy0", action=
"store_true",
543 help=
"Obey the image's (x0, y0)")
544 parser.add_option(
"-f",
"--formatWidth", type=
"int",
545 default=8, help=
"Field width for values")
546 parser.add_option(
"-d",
"--dataFmt", default=
"%.2f",
547 help=
"Format for values")
551 "image", help=
"Expression giving image to show")
553 "width", help=
"Width of patch to print", default=1, nargs=
"?")
555 "height", help=
"Height of patch to print", default=1, nargs=
"?")
557 opts = parser.parse_args(args)
561 opts, args = parser.parse_args(args)
566 raise gdb.GdbError(
"Please specify an image")
568 opts.image = args.pop(0)
570 opts.width, opts.height = 1, 1
572 opts.width = int(args.pop(0))
574 opts.height = int(args.pop(0))
578 "Unrecognised trailing arguments: %s" %
" ".join(args))
582 if opts.origin[i]
is None:
583 if opts.center[i]
is not None:
587 if opts.center[i]
is not None:
589 "You may not specify both --center and --origin")
591 val = gdb.parse_and_eval(val)
600 nx, ny = opts.width, opts.height
602 var = gdb.parse_and_eval(opts.image)
604 if re.search(
r"shared_ptr<", str(var.type)):
605 var = var[
"px"].dereference()
607 if not re.search(
r"(lsst::afw::image::)?(Image|Mask|MaskedImage)", str(var.type.unqualified())):
609 "Please specify an image, not %s" % var.type)
611 if re.search(
r"MaskedImage", str(var.type))
and \
612 not re.search(
r"::Image(\s*&)?$", str(var.type)):
613 print(
"N.b. %s is a MaskedImage; showing image" % (opts.image))
616 if re.search(
r"shared_ptr<", str(var.type)):
617 var = var[
"px"].dereference()
619 if var.type.code == gdb.TYPE_CODE_PTR:
620 var = var.dereference()
622 pixelTypeName = str(var.type.template_argument(0))
624 dataFmt = opts.dataFmt
625 elif pixelTypeName
in [
"short",
"unsigned short"]:
627 elif pixelTypeName
in [
"int",
"unsigned int"]:
633 nx = var[
"_gilView"][
"_dimensions"][
"x"]
635 ny = var[
"_gilView"][
"_dimensions"][
"y"]
641 if opts.xy0
and not opts.all:
642 arr = var[
"_origin"][
"_vector"][
"m_storage"][
"m_data"][
"array"]
649 print(
"%-4s" %
"", end=
' ')
650 for x
in range(x0, x0 + nx):
651 print(
"%*d" % (opts.formatWidth, x), end=
' ')
654 for y
in reversed(
list(range(y0, y0 + ny))):
655 print(
"%-4d" % y, end=
' ')
656 for x
in range(x0, x0 + nx):
657 print(
"%*s" % (opts.formatWidth, dataFmt %
658 self.
get(var, x, y)), end=
' ')
671 return "Background(%dx%d) %s %s" % (
672 self.
val[
"_imgWidth"], self.
val[
"_imgHeight"],
676 "Print a BackgroundControl" 683 return "{%s %s %s %s}" % (re.sub(
r"lsst::afw::math::Interpolate::",
"", str(self.
val[
"_style"])),
684 re.sub(
r"lsst::afw::math::",
"",
685 str(self.
val[
"_prop"])),
686 re.sub(
r"lsst::afw::math::",
"", str(
687 self.
val[
"_undersampleStyle"])),
688 self.
val[
"_sctrl"][
"px"].dereference())
698 return "%s(%dx%d)" % (self.
typename,
699 self.
val[
"_width"], self.
val[
"_height"])
702 "Print a StatisticsControl" 709 return "{nSigma=%g nIter=%d ignore=0x%x}" % (self.
val[
"_numSigmaClip"],
710 self.
val[
"_numIter"],
711 self.
val[
"_andMask"])
714 "Print a table::Table" 721 return "{schema = %s, md=%s}" % (self.
val[
"_schema"], self.
val[
"_metadata"])
724 "Print a table::Schema" 731 names = str(self.
val[
"_impl"][
"px"][
"_names"])
732 names = re.sub(
r"^[^{]*{|}|[\[\]\"\"]|\s*=\s*[^,]*",
"", names)
734 return "%s" % (names)
739 "Register my pretty-printers with objfile Obj." 745 gdb.printing.register_pretty_printer(obj, p, replace=
True)
748 """Surely this must be somewhere standard?""" 750 printer = gdb.printing.RegexpCollectionPrettyPrinter(
"rhl-boost")
752 printer.add_printer(
'boost::shared_ptr',
753 '^(boost|tr1|std)::shared_ptr', SharedPtrPrinter)
754 printer.add_printer(
'boost::gil::pixel',
755 'boost::gil::.*pixel_t', GilPixelPrinter)
762 """Surely this must be somewhere standard?""" 764 printer = gdb.printing.RegexpCollectionPrettyPrinter(
"rhl-eigen")
766 printer.add_printer(
'eigen::Matrix',
767 '^Eigen::Matrix', EigenMatrixPrinter)
768 printer.add_printer(
'eigen::Vector',
769 '^Eigen::Vector', EigenVectorPrinter)
776 printer = gdb.printing.RegexpCollectionPrettyPrinter(
"afw")
778 printer.add_printer(
'lsst::afw::cameraGeom::Detector',
779 '^lsst::afw::cameraGeom::(Amp|Ccd|Detector|DetectorMosaic)$', DetectorPrinter)
781 printer.add_printer(
'lsst::afw::detection::Footprint',
782 '^lsst::afw::detection::Footprint$', FootprintPrinter)
783 printer.add_printer(
'lsst::afw::detection::FootprintSet',
784 '^lsst::afw::detection::FootprintSet', FootprintSetPrinter)
785 printer.add_printer(
'lsst::afw::detection::Peak',
786 '^lsst::afw::detection::Peak$', PeakPrinter)
787 printer.add_printer(
'lsst::afw::detection::Psf',
788 '^lsst::afw::detection::Psf$', PsfPrinter)
789 printer.add_printer(
'lsst::afw::detection::Source',
790 '^lsst::afw::detection::Source$', SourcePrinter)
791 printer.add_printer(
'lsst::afw::detection::BaseSourceAttributes',
792 '^lsst::afw::detection::BaseSourceAttributes$', BaseSourceAttributesPrinter)
794 printer.add_printer(
'lsst::afw::geom::Box',
795 '^lsst::afw::geom::Box', Box2Printer)
796 printer.add_printer(
'lsst::afw::geom::Extent',
797 '^lsst::afw::geom::Extent', CoordinateBasePrinter)
798 printer.add_printer(
'lsst::afw::geom::Point',
799 '^lsst::afw::geom::Point', CoordinateBasePrinter)
801 printer.add_printer(
'lsst::afw::geom::ellipses::Axes',
802 '^lsst::afw::geom::ellipses::Axes', AxesPrinter)
803 printer.add_printer(
'lsst::afw::geom::ellipses::Quadrupole',
804 '^lsst::afw::geom::ellipses::Quadrupole', QuadrupolePrinter)
806 printer.add_printer(
'lsst::afw::image::ImageBase',
807 'lsst::afw::image::ImageBase<[^>]+>$', ImagePrinter)
808 printer.add_printer(
'lsst::afw::image::Image',
809 'lsst::afw::image::Image<[^>]+>$', ImagePrinter)
810 printer.add_printer(
'lsst::afw::image::Mask',
811 '^lsst::afw::image::Mask<[^>]+>$', ImagePrinter)
812 printer.add_printer(
'lsst::afw::image::MaskedImage',
813 '^lsst::afw::image::MaskedImage<[^>]+>$', MaskedImagePrinter)
814 printer.add_printer(
'lsst::afw::image::Exposure',
815 '^lsst::afw::image::Exposure', ExposurePrinter)
817 printer.add_printer(
'lsst::afw::math::Background',
818 '^lsst::afw::math::Background$', BackgroundPrinter)
819 printer.add_printer(
'lsst::afw::math::BackgroundControl',
820 '^lsst::afw::math::BackgroundControl$', BackgroundControlPrinter)
821 printer.add_printer(
'lsst::afw::math::Kernel',
822 '^lsst::afw::math::.*Kernel', KernelPrinter)
823 printer.add_printer(
'lsst::afw::math::StatisticsControl',
824 '^lsst::afw::math::StatisticsControl', StatisticsControlPrinter)
826 printer.add_printer(
'lsst::afw::table::Table',
827 '^lsst::afw::table::.*Table$', TablePrinter)
828 printer.add_printer(
'lsst::afw::table::Schema',
829 '^lsst::afw::table::Schema$', TableSchemaPrinter)
836 printer = gdb.printing.RegexpCollectionPrettyPrinter(
"daf::base")
841 except ImportError
as e:
843 from .printers_oldgdb
import *
def build_daf_base_dictionary()
def __init__(self, prog, args, kwargs)
def build_boost_dictionary()
def build_afw_dictionary()
def getEigenValue(var, x, y=0)
def dimenStr(self, val=None)
def build_eigen_dictionary()
def parse_args(self, args, values=None)
def getEigenMatrixDimensions(val)
def exit(self, status=0, msg="")
def invoke(self, args, fromTty)
daf::base::PropertyList * list
def invoke(self, args, fromTty)
def _mget(self, var, x, y=0)