11from .svgdrawing
import attributemaps
12from .
import svgdrawing
13from datetime
import datetime
18from ROOT
import Belle2
21from ROOT
import gSystem
23gSystem.Load(
'libframework')
25gSystem.Load(
'libtracking')
28class CDCSVGDisplayModule(basf2.Module):
31 Personal two dimensional event display based on scalable vector graphics
34 def __init__(self, output_folder=tempfile.gettempdir(), interactive=
True):
41 Target folder for the output
42 interactive : bool, optional
43 Switch to display each event to the user and ask to continue after each event
51 self.interactive = interactive
54 self.output_folder = output_folder
65 self.forward_fade =
False
74 self.use_python =
False
77 self._draw_wires =
True
82 self.draw_interaction_point =
True
85 self.draw_superlayer_boundaries =
False
88 self.draw_walls =
False
94 self.draw_takenflag =
False
97 self.draw_mcparticle_id =
False
100 self.draw_mcparticle_pdgcode =
False
103 self.draw_mcparticle_primary =
False
106 self.draw_mcparticle_trajectories =
False
109 self.draw_simhits =
False
112 self.draw_simhit_tof =
False
115 self.draw_simhit_posflag =
False
118 self.draw_simhit_pdgcode =
False
122 self.draw_simhit_bkgtag =
False
125 self.draw_simhit_isbkg =
False
128 self.draw_nloops =
False
133 self.draw_connect_tof =
False
137 self.draw_rlinfo =
False
142 self.draw_reassigned =
False
145 self.draw_mcsegments =
False
148 self.draw_mcaxialsegmentpairs =
False
151 self.draw_mcsegmentpairs =
False
154 self.draw_mcsegmenttriples =
False
160 self.draw_superclusters =
False
163 self.draw_clusters =
False
166 self.draw_segments =
False
169 self.draw_segment_trajectories =
False
172 self.draw_tangentsegments =
False
175 self.draw_segment_mctrackids =
False
179 self.draw_segment_fbinfos =
False
182 self.draw_segment_firstInTrackIds =
False
185 self.draw_segment_lastInTrackIds =
False
189 self.draw_segment_firstNPassedSuperLayers =
False
193 self.draw_segment_lastNPassedSuperLayers =
False
196 self.draw_axialsegmentpairs =
False
199 self.draw_segmentpairs =
False
202 self.draw_segmenttriples =
False
205 self.draw_segmenttriple_trajectories =
False
208 self.draw_tracks =
False
211 self.draw_track_trajectories =
False
216 self.draw_recotracks =
False
219 self.draw_mcrecotracks =
False
222 self.draw_recotrack_matching =
False
225 self.draw_mcrecotrack_matching =
False
228 self.draw_recotrack_seed_trajectories =
False
231 self.draw_recotrack_fit_trajectories =
False
234 self.draw_wrong_rl_infos_in_segments =
False
237 self.draw_wrong_rl_infos_in_tracks =
False
240 self.cdc_hits_store_array_name =
"CDCHits"
243 self.reco_tracks_store_array_name =
"RecoTracks"
246 self.mc_reco_tracks_store_array_name =
"MCRecoTracks"
249 self.cdc_wire_hit_cluster_store_obj_name =
"CDCWireHitClusterVector"
252 self.cdc_segment_vector_store_obj_name =
'CDCSegment2DVector'
258 self.filename_prefix =
"CDCDisplay"
261 self.use_time_in_filename =
False
264 def drawoptions(self):
266 Property that collects the various names of the draw options to a list
267 that are not related to the CDC cellular automaton track finder.
268 @return list of strings naming the different switches that can be activated.
273 'draw_superlayer_boundaries',
275 'draw_interaction_point',
276 'draw_mcparticle_id',
277 'draw_mcparticle_pdgcode',
278 'draw_mcparticle_primary',
279 'draw_mcparticle_trajectories',
283 'draw_simhit_posflag',
284 'draw_simhit_pdgcode',
285 'draw_simhit_bkgtag',
293 'draw_recotrack_matching',
294 'draw_mcrecotrack_matching',
295 'draw_recotrack_seed_trajectories',
296 'draw_recotrack_fit_trajectories',
322 if not hasattr(self, name):
323 raise NameError(
'%s is not a valid draw option. Fix the misspelling.'
329 def all_drawoptions(self):
331 Property that collects the all names of the draw options to a list.
332 Note that some draw options only make sense after running the CDC
333 cellular automaton track finder.
334 @return list of strings naming the different switches that can be activated.
336 result = self.drawoptions
339 draw_options = [option
for option
in self.__dict__
340 if option.startswith(
'draw_')]
341 _draw_options = [option[1:]
for option
in self.__dict__
342 if option.startswith(
'_draw_')]
344 result.extend(draw_options)
345 result.extend(_draw_options)
350 def draw_wires(self):
352 Getter for the draw option that indicates if all wires shall be drawn.
353 Since this has some performance impact in animated events the wires
354 are prevented from being drawn in this case.
357 return self._draw_wires
and not self.animate
360 def draw_wires(self, draw_wires):
362 Setter for the option to draw all wires.
365 self._draw_wires = draw_wires
367 def initialize(self):
369 Initialisation method of the module.
370 Creates the output folder if it is not present yet.
373 output_folder = self.output_folder
374 if not os.path.exists(output_folder):
375 print(
"CDCSVGDisplay.__init__ : Output folder '", output_folder,
377 answer = input(
'Create it? (y or n)')
379 os.makedirs(output_folder)
382 if not self.use_cpp
and not self.use_python:
388 plotter = svgdrawing.CDCSVGPlotter(animate=self.animate)
394 theCDCWireTopology = \
398 cppplotter.drawWires(theCDCWireTopology)
400 plotter.draw(theCDCWireTopology)
404 self.prefilled_cppplotter = cppplotter
407 self.prefilled_plotter = plotter
410 segment_relation_filter.initialize()
414 Begin run method of the module. Empty here.
421 Event method of the module. Draws the event into a new svg file.
426 cppplotter = self.prefilled_cppplotter.clone()
428 plotter = self.prefilled_plotter.clone()
430 self.file_number += 1
445 basf2.B2INFO(
"Skip empty event")
452 cppplotter.drawHits(self.cdc_hits_store_array_name,
'ZeroDriftLengthColorMap',
'ZeroDriftLengthStrokeWidthMap')
454 styleDict = {
'stroke': attributemaps.ZeroDriftLengthColorMap(),
455 'stroke-width': attributemaps.ZeroDriftLengthStrokeWidthMap()}
456 plotter.draw_storearray(self.cdc_hits_store_array_name, **styleDict)
459 if self.draw_takenflag:
461 cppplotter.drawHits(self.cdc_hits_store_array_name,
'TakenFlagColorMap',
'')
463 styleDict = {
'stroke': attributemaps.TakenFlagColorMap(), }
464 plotter.draw_storearray(self.cdc_hits_store_array_name, **styleDict)
467 if self.draw_mcparticle_id:
469 cppplotter.drawHits(self.cdc_hits_store_array_name,
'MCParticleColorMap',
'')
471 styleDict = {
'stroke': attributemaps.MCParticleColorMap()}
472 plotter.draw_storearray(self.cdc_hits_store_array_name, **styleDict)
475 if self.draw_mcparticle_pdgcode:
477 cppplotter.drawHits(self.cdc_hits_store_array_name,
'MCPDGCodeColorMap',
'')
479 styleDict = {
'stroke': attributemaps.MCPDGCodeColorMap()}
480 plotter.draw_storearray(self.cdc_hits_store_array_name, **styleDict)
483 if self.draw_mcparticle_primary:
485 cppplotter.drawHits(self.cdc_hits_store_array_name,
'MCPrimaryColorMap',
'')
487 styleDict = {
'stroke': attributemaps.MCPrimaryColorMap()}
488 plotter.draw_storearray(self.cdc_hits_store_array_name, **styleDict)
491 if self.draw_simhits:
493 cppplotter.drawSimHits(self.cdc_hits_store_array_name,
'',
'.2')
497 simHits_related_to_hits = [hit.getRelated(
'CDCSimHits')
498 for hit
in hit_storearray]
499 styleDict = {
'stroke-width':
'0.2'}
500 plotter.draw_iterable(simHits_related_to_hits, **styleDict)
503 if self.draw_simhit_posflag:
505 cppplotter.drawHits(self.cdc_hits_store_array_name,
'PosFlagColorMap',
'')
507 styleDict = {
'stroke': attributemaps.PosFlagColorMap()}
508 plotter.draw_storearray(self.cdc_hits_store_array_name, **styleDict)
514 cppplotter.drawHits(self.cdc_hits_store_array_name,
'RLColorMap',
'')
516 styleDict = {
'stroke': attributemaps.RLColorMap()}
517 plotter.draw_storearray(self.cdc_hits_store_array_name, **styleDict)
520 if self.draw_simhit_tof:
522 cppplotter.drawHits(self.cdc_hits_store_array_name,
'TOFColorMap',
'')
524 styleDict = {
'stroke': attributemaps.TOFColorMap()}
525 plotter.draw_storearray(self.cdc_hits_store_array_name, **styleDict)
528 if self.draw_simhit_pdgcode:
530 cppplotter.drawHits(self.cdc_hits_store_array_name,
"SimHitPDGCodeColorMap",
"")
532 def color_map(iHit, hit):
533 simHit = hit.getRelated(
'CDCSimHits')
534 pdgCode = simHit.getPDGCode()
536 attributemaps.MCPDGCodeColorMap.color_by_pdgcode.get(pdgCode,
540 styleDict = {
'stroke': color_map}
541 plotter.draw_storearray(self.cdc_hits_store_array_name, **styleDict)
544 if self.draw_simhit_bkgtag:
546 cppplotter.drawHits(self.cdc_hits_store_array_name,
'BackgroundTagColorMap',
'')
548 styleDict = {
'stroke': attributemaps.BackgroundTagColorMap()}
549 plotter.draw_storearray(self.cdc_hits_store_array_name, **styleDict)
552 if self.draw_simhit_isbkg:
554 cppplotter.drawHits(self.cdc_hits_store_array_name,
'SimHitIsBkgColorMap',
'')
556 def color_map(iHit, hit):
557 simHit = hit.getRelated(
'CDCSimHits')
558 bkgTag = simHit.getBackgroundTag()
559 color = (
'gray' if bkgTag
else 'red')
562 styleDict = {
'stroke': color_map}
563 plotter.draw_storearray(self.cdc_hits_store_array_name, **styleDict)
569 cppplotter.drawHits(self.cdc_hits_store_array_name,
'NLoops',
'')
571 print(
'No Python-function defined')
573 if self.draw_connect_tof:
575 cppplotter.drawSimHitsConnectByToF(self.cdc_hits_store_array_name,
"black",
".2")
578 if cdchits_storearray:
579 simhits_related_to_cdchit = [cdchit.getRelated(
'CDCSimHits')
580 for cdchit
in cdchits_storearray]
583 simhits_by_mcparticle = {}
584 for simhit
in simhits_related_to_cdchit:
585 mcparticle = simhit.getRelated(
'MCParticles')
586 if not mcparticle ==
None:
587 mcTrackId = mcparticle.getArrayIndex()
588 simhits_by_mcparticle.setdefault(mcTrackId, [])
589 simhits_by_mcparticle[mcTrackId].append(simhit)
591 for simhits_for_mcparticle
in list(simhits_by_mcparticle.values()):
592 simhits_for_mcparticle.sort(key=
lambda simhit:
593 simhit.getFlightTime())
595 nSimHits = len(simhits_for_mcparticle)
596 for iSimHit
in range(nSimHits - 1):
597 fromSimHit = simhits_for_mcparticle[iSimHit]
598 toSimHit = simhits_for_mcparticle[iSimHit + 1]
600 styleDict = {
'stroke-width':
'0.2',
"stroke":
"black"}
602 fromHit = fromSimHit.getRelated(self.cdc_hits_store_array_name)
603 toHit = toSimHit.getRelated(self.cdc_hits_store_array_name)
618 plotter.draw(tangent, **styleDict)
621 if self.draw_reassigned:
623 cppplotter.drawHits(self.cdc_hits_store_array_name,
'ReassignedSecondaryMap',
'')
625 styleDict = {
'stroke': attributemaps.ReassignedSecondaryMap()}
626 plotter.draw_storearray(self.cdc_hits_store_array_name, **styleDict)
629 if self.draw_mcsegments:
632 cppplotter.drawHits(self.cdc_hits_store_array_name,
'MCSegmentIdColorMap',
'')
634 styleDict = {
'stroke': attributemaps.MCSegmentIdColorMap()}
635 plotter.draw_storearray(self.cdc_hits_store_array_name, **styleDict)
638 if self.draw_superclusters:
640 cppplotter.drawClusters(
'CDCWireHitSuperClusterVector',
643 styleDict = {
'stroke': attributemaps.listColors}
644 plotter.draw_storevector(
'CDCWireHitSuperClusterVector', **styleDict)
647 if self.draw_clusters:
649 cppplotter.drawClusters(self.cdc_wire_hit_cluster_store_obj_name,
652 styleDict = {
'stroke': attributemaps.listColors}
653 plotter.draw_storevector(self.cdc_wire_hit_cluster_store_obj_name, **styleDict)
657 if self.draw_segments:
659 cppplotter.drawSegments(self.cdc_segment_vector_store_obj_name,
662 styleDict = {
'stroke': attributemaps.listColors}
663 plotter.draw_storevector(self.cdc_segment_vector_store_obj_name, **styleDict)
665 if self.draw_segment_mctrackids:
668 cppplotter.drawSegments(self.cdc_segment_vector_store_obj_name,
669 "SegmentMCTrackIdColorMap",
"")
671 styleDict = {
'stroke': attributemaps.SegmentMCTrackIdColorMap()}
672 plotter.draw_storevector(self.cdc_segment_vector_store_obj_name, **styleDict)
674 if self.draw_segment_fbinfos:
676 cppplotter.drawSegments(self.cdc_segment_vector_store_obj_name,
677 "SegmentFBInfoColorMap",
"")
679 styleDict = {
'stroke': attributemaps.SegmentFBInfoColorMap()}
680 plotter.draw_storevector(self.cdc_segment_vector_store_obj_name, **styleDict)
682 if self.draw_segment_firstInTrackIds:
684 cppplotter.drawSegments(self.cdc_segment_vector_store_obj_name,
685 "SegmentFirstInTrackIdColorMap",
"")
688 {
'stroke': attributemaps.SegmentFirstInTrackIdColorMap()}
689 plotter.draw_storevector(self.cdc_segment_vector_store_obj_name, **styleDict)
691 if self.draw_segment_lastInTrackIds:
693 cppplotter.drawSegments(self.cdc_segment_vector_store_obj_name,
694 "SegmentLastInTrackIdColorMap",
"")
697 {
'stroke': attributemaps.SegmentLastInTrackIdColorMap()}
698 plotter.draw_storevector(self.cdc_segment_vector_store_obj_name, **styleDict)
700 if self.draw_segment_firstNPassedSuperLayers:
703 cppplotter.drawSegments(self.cdc_segment_vector_store_obj_name,
704 "SegmentFirstNPassedSuperLayersColorMap",
"")
707 {
'stroke': attributemaps.SegmentFirstNPassedSuperLayersColorMap()}
708 plotter.draw_storevector(self.cdc_segment_vector_store_obj_name, **styleDict)
710 if self.draw_segment_lastNPassedSuperLayers:
713 cppplotter.drawSegments(self.cdc_segment_vector_store_obj_name,
714 "SegmentLastNPassedSuperLayersColorMap",
"")
717 {
'stroke': attributemaps.SegmentLastNPassedSuperLayersColorMap()}
718 plotter.draw_storevector(self.cdc_segment_vector_store_obj_name, **styleDict)
720 if self.draw_segmentpairs:
722 cppplotter.drawSegmentPairs(
'CDCSegmentPairs',
'black',
'')
724 styleDict = {
"stroke":
"black"}
725 plotter.draw_storearray(
'CDCSegmentPairs', **styleDict)
728 if self.draw_mcaxialsegmentpairs:
730 cppplotter.drawMCAxialSegmentPairs(self.cdc_segment_vector_store_obj_name,
"black",
'')
733 if segment_storevector:
734 segments = segment_storevector.obj().unwrap()
735 axial_segments = [segment
for segment
in segments
736 if segment.getStereoType() == 0]
738 mc_axial_segment_pair_segment_filter = \
740 axial_segment_pair_relations = \
742 for startSegment
in axial_segments
743 for endSegment
in axial_segments)
745 def is_good_pair(pair):
746 weight = mc_axial_segment_pair_segment_filter(pair)
747 return weight == weight
749 good_axial_segment_pair_relations = [pair
for pair
in
750 axial_segment_pair_relations
if is_good_pair(pair)]
751 styleDict = {
"stroke":
"black"}
752 plotter.draw_iterable(good_axial_segment_pair_relations, **styleDict)
754 if self.draw_mcsegmentpairs:
756 cppplotter.drawMCSegmentPairs(self.cdc_segment_vector_store_obj_name,
"black",
'')
758 print(
'No Python-function defined')
760 if self.draw_mcsegmenttriples:
762 cppplotter.drawMCSegmentTriples(self.cdc_segment_vector_store_obj_name,
'',
'')
765 if segment_storevector:
766 segments = segment_storevector.obj().unwrap()
767 axial_segments = [segment
for segment
in segments
768 if segment.getStereoType() == 0]
770 stereo_segments = [segment
for segment
in segments
771 if segment.getStereoType() != 0]
774 mc_axial_segment_pair_segment_filter = \
776 mc_segment_lookup = \
781 middleSegment, endSegment)
for startSegment
in
782 axial_segments
for middleSegment
in stereo_segments
783 for endSegment
in axial_segments)
785 def is_good_triple(triple):
786 start = triple.getStartSegment()
787 middle = triple.getMiddleSegment()
788 end = triple.getEndSegment()
791 mc_axial_segment_pair_segment_filter(triple)
793 if not pairWeight == pairWeight:
796 startToMiddleFBInfo = \
797 mc_segment_lookup.areAlignedInMCTrack(start, middle)
798 if abs(startToMiddleFBInfo) > 1:
801 middleToEndFBInfo = \
802 mc_segment_lookup.areAlignedInMCTrack(middle, end)
803 if abs(middleToEndFBInfo) > 1:
806 if startToMiddleFBInfo == middleToEndFBInfo:
811 good_segment_triples = [triple
for triple
in segment_triples
812 if is_good_triple(triple)]
814 styleDict = {
"stroke":
"black"}
815 plotter.draw_iterable(good_segment_triples, **styleDict)
818 if self.draw_tangentsegments:
820 print(
'No CPP-function defined')
822 styleDict = {
'stroke-width':
'0.2'}
823 plotter.draw_storearray(
'CDCTangentSegments', **styleDict)
826 if self.draw_axialsegmentpairs:
828 cppplotter.drawAxialSegmentPairs(
'CDCAxialSegmentPairVector',
'',
'')
830 styleDict = {
'stroke': attributemaps.listColors}
831 plotter.draw_storevector(
'CDCAxialSegmentPairVector', **styleDict)
834 if self.draw_segmenttriples:
836 cppplotter.drawSegmentTriples(
'CDCSegmentTripleVector',
'',
'')
838 styleDict = {
'stroke': attributemaps.listColors}
839 plotter.draw_storevector(
'CDCSegmentTriples', **styleDict)
844 cppplotter.drawTracks(
'CDCTrackVector',
'',
'')
846 styleDict = {
'stroke': attributemaps.listColors}
847 plotter.draw_storevector(
'CDCTrackVector', **styleDict)
850 if self.draw_wrong_rl_infos_in_tracks:
853 cppplotter.drawWrongRLHitsInTracks(
'CDCTrackVector')
855 styleDict = {
'stroke': attributemaps.WrongRLColorMap()}
860 wrapped_vector = pystoreobj.obj()
861 vector = wrapped_vector.get()
864 plotter.draw_iterable(list(track.items()), **styleDict)
866 if self.draw_wrong_rl_infos_in_segments:
869 cppplotter.drawWrongRLHitsInSegments(self.cdc_segment_vector_store_obj_name)
871 styleDict = {
'stroke': attributemaps.WrongRLColorMap()}
876 wrapped_vector = pystoreobj.obj()
877 vector = wrapped_vector.get()
880 plotter.draw_iterable(list(track.items()), **styleDict)
883 if self.draw_recotracks:
885 cppplotter.drawRecoTracks(self.reco_tracks_store_array_name,
'ListColors',
'')
887 styleDict = {
'stroke': attributemaps.listColors}
888 plotter.draw_storearray(self.reco_tracks_store_array_name, **styleDict)
891 if self.draw_mcrecotracks:
893 cppplotter.drawRecoTracks(self.mc_reco_tracks_store_array_name,
'ListColors',
'')
895 styleDict = {
'stroke': attributemaps.listColors}
896 plotter.draw_storearray(self.mc_reco_tracks_store_array_name, **styleDict)
899 if self.draw_recotrack_matching:
901 cppplotter.drawRecoTracks(self.reco_tracks_store_array_name,
'MatchingStatus',
'')
903 print(
'No Python-function defined')
906 if self.draw_mcrecotrack_matching:
908 cppplotter.drawRecoTracks(self.mc_reco_tracks_store_array_name,
'MCMatchingStatus',
'')
910 print(
'No Python-function defined')
913 if self.draw_interaction_point:
915 cppplotter.drawInteractionPoint()
917 plotter.draw_interaction_point()
920 if self.draw_superlayer_boundaries:
922 cppplotter.drawSuperLayerBoundaries()
924 plotter.draw_superlayer_boundaries()
929 cppplotter.drawOuterCDCWall(
'black')
930 cppplotter.drawInnerCDCWall(
'black')
932 styleDict = {
'stroke':
'black'}
933 plotter.draw_outer_cdc_wall(**styleDict)
934 plotter.draw_inner_cdc_wall(**styleDict)
937 if self.draw_mcparticle_trajectories:
939 cppplotter.drawMCParticleTrajectories(
"MCParticles",
'black',
'')
941 print(
"Python backend can not draw mc particles")
944 if self.draw_segment_trajectories:
946 cppplotter.drawSegmentTrajectories(self.cdc_segment_vector_store_obj_name,
950 if segment_storevector:
951 segments = segment_storevector.obj().unwrap()
953 iterTrajectories = (segment.getTrajectory2D()
for segment
in segments)
954 plotter.draw_iterable(iterTrajectories)
957 if self.draw_segmenttriple_trajectories:
958 cppplotter.drawSegmentTripleTrajectories(
"CDCSegmentTriples",
963 if segmentTriple_storearray:
964 iterSegmentTriples = iter(segmentTriple_storearray)
965 iterTrajectories = (segmentTriple.getTrajectory2D()
966 for segmentTriple
in iterSegmentTriples)
967 plotter.draw_iterable(iterTrajectories)
970 if self.draw_track_trajectories:
972 cppplotter.drawTrackTrajectories(
"CDCTrackVector",
975 styleDict = {
'stroke': attributemaps.listColors}
977 if track_storevector:
978 tracks = track_storevector.obj().unwrap()
979 iterTrajectories = (cdcTrack.getStartTrajectory3D().getTrajectory2D()
980 for cdcTrack
in tracks)
981 plotter.draw_iterable(iterTrajectories, **styleDict)
984 if self.draw_recotrack_seed_trajectories:
987 if recotrack_storearray:
988 def color_map(iTrajectory, trajectory):
990 return attributemaps.listColors[iTrajectory
991 % len(attributemaps.listColors)]
993 styleDict = {
'stroke': color_map}
996 for recotrack
in recotrack_storearray:
997 tMomentum = recotrack.getMomentumSeed()
998 charge = recotrack.getChargeSeed()
999 tPosition = recotrack.getPositionSeed()
1000 time = recotrack.getTimeSeed()
1010 trajectories.append(trajectory)
1012 plotter.draw_iterable(trajectories, **styleDict)
1015 raise NotImplementedError
1017 if self.draw_recotrack_fit_trajectories:
1019 cppplotter.drawRecoTrackTrajectories(self.reco_tracks_store_array_name,
'',
'')
1022 raise NotImplementedError
1024 fileName = self.new_output_filename()
1025 cppfileName = self.new_output_filename()
1028 cppplotter.saveFile(cppfileName)
1030 plotter.saveSVGFile(fileName)
1032 if self.interactive:
1034 print(
" Use the 'display' command to show the svg file", fileName,
1035 'generated for the last event')
1037 print(
" Use the 'display' command to show the svg file", cppfileName,
1038 'generated for the last event with cpp')
1042 subprocess.Popen([
'eog', fileName])
1044 subprocess.Popen([
'eog', cppfileName])
1048 input(
'Hit enter for next event')
1052 endRun method of the module. Empty here.
1057 def terminate(self):
1059 terminate method of the module. Empty here.
1064 def new_output_basename(self):
1066 Generates a new unique name for the current event without the folder prefix
1069 if self.use_time_in_filename:
1070 output_basename = datetime.now().isoformat() +
'.svg'
1072 output_basename = self.filename_prefix + str(self.file_number).zfill(4) +
'.svg'
1073 return output_basename
1075 def new_output_filename(self):
1077 Generates a new unique name for the current event with the folder prefix
1080 return os.path.join(self.output_folder, self.new_output_basename())
A (simplified) python wrapper for StoreArray.
a (simplified) python wrapper for StoreObjPtr.
Class representing a pair of reconstructed axial segments in adjacent superlayer.
static const CDCMCHitLookUp & getInstance()
Getter for the singletone instance.
static const CDCMCSegment2DLookUp & getInstance()
Getter for the singletone instance.
Class representing an oriented hit wire including a hypotheses whether the causing track passes left ...
Class representing a two dimensional reconstructed hit in the central drift chamber.
Helper class to generated the svg image from the various tracking objects.
Class representing a triple of reconstructed segments in adjacent superlayer.
Class representing a linear track piece between two oriented wire hits.
Particle trajectory as it is seen in xy projection represented as a circle.
Class representing a hit wire in the central drift chamber.
static CDCWireTopology & getInstance()
Getter for the singleton instance of the wire topology.
Filter for the construction of axial to axial segment pairs based on simple criteria.
Filter for the construction of segment pairs based on simple criteria without the common fit.
A two dimensional vector which is equipped with functions for correct handling of orientation relate...
A three dimensional vector.