3 from svgfig
import rgb, SVG, pathtoPath, load
as load_svg
4 from geometryXMLparser
import *
5 from signConventions
import *
8 return rgb(0.1, 0.9, 0.)
11 return rgb(0.1, 0.9, 0.)
13 def draw_station(geom1, geom2, station, filename, length_factor=100., angle_factor=100., colors=dt_colors, template_dir='./'):
15 station_template = load_svg(template_dir +
"station4_template.svg")
17 station_template = load_svg(template_dir +
"station_template.svg")
19 if station == 1: x_scale_factor = 1/6.
20 if station == 2: x_scale_factor = 1/7.
21 if station == 3: x_scale_factor = 1/8.5
22 if station == 4: x_scale_factor = 1/10.
29 for treeindex, svgitem
in station_template:
30 if isinstance(svgitem, SVG)
and "id" in svgitem.attr
and svgitem[
"id"][:3] ==
"MB_":
31 m = re.match(
"MB_([0-9mpz]+)_([0-9]+)", svgitem[
"id"])
32 if m
is None:
raise Exception
35 if wheel ==
"m2": wheel = -2
36 elif wheel ==
"m1": wheel = -1
37 elif wheel ==
"z": wheel = 0
38 elif wheel ==
"p1": wheel = 1
39 elif wheel ==
"p2": wheel = 2
40 sector = int(m.group(2))
42 xdiff = x_scale_factor * length_factor * (geom1.dt[wheel, station, sector].x - geom2.dt[wheel, station, sector].x) * signConventions[
"DT", wheel, station, sector][0]
43 ydiff = -y_scale_factor * length_factor * (geom1.dt[wheel, station, sector].y - geom2.dt[wheel, station, sector].y) * signConventions[
"DT", wheel, station, sector][1]
44 phizdiff = -angle_factor * (geom1.dt[wheel, station, sector].phiz - geom2.dt[wheel, station, sector].phiz) * signConventions[
"DT", wheel, station, sector][2]
46 sx = float(svgitem[
"x"]) + float(svgitem[
"width"])/2.
47 sy = float(svgitem[
"y"]) + float(svgitem[
"height"])/2.
49 svgitem[
"transform"] =
"translate(%g,%g)" % (sx, sy)
50 svgitem[
"x"] = -float(svgitem[
"width"])/2.
51 svgitem[
"y"] = -float(svgitem[
"height"])/2.
53 svgitem[
"style"] =
"fill:#e1e1e1;fill-opacity:1;stroke:#000000;stroke-width:1.0;stroke-dasharray:1, 1;stroke-dashoffset:0"
55 newBox = svgitem.clone()
56 newBox[
"transform"] =
"translate(%g,%g) rotate(%g) " % (sx + xdiff, sy + ydiff, phizdiff * 180./pi)
57 newBox[
"style"] =
"fill:%s;fill-opacity:0.5;stroke:#000000;stroke-width:1.0;stroke-opacity:1;stroke-dasharray:none" %
colors(wheel, station, sector)
59 new_boxes.append(newBox)
61 for treeindex, svgitem
in station_template:
62 if isinstance(svgitem, SVG)
and svgitem.t ==
"g" and "id" in svgitem.attr
and svgitem[
"id"] ==
"chambers":
63 svgitem.append(new_boxes)
65 elif isinstance(svgitem, SVG)
and "id" in svgitem.attr
and svgitem[
"id"] ==
"stationx":
66 svgitem[0] =
"Station %d" % station
67 svgitem[0] +=
" (length x%g, angle x%g)" % (length_factor, angle_factor)
69 station_template.save(filename)
71 def draw_wheel(geom1, geom2, wheel, filename, length_factor=100., angle_factor=100., colors=dt_colors, template_dir='./'):
72 wheel_template = load_svg(template_dir +
"wheel_template.svg")
78 for treeindex, svgitem
in wheel_template:
79 if isinstance(svgitem, SVG)
and "id" in svgitem.attr
and svgitem[
"id"][:3] ==
"MB_":
80 m = re.match(
"MB_([0-9]+)_([0-9]+)", svgitem[
"id"])
81 if m
is None:
raise Exception
83 station, sector = int(m.group(1)), int(m.group(2))
84 xdiff = -length_factor * (geom1.dt[wheel, station, sector].x - geom2.dt[wheel, station, sector].x) * signConventions[
"DT", wheel, station, sector][0]
85 zdiff = length_factor * (geom1.dt[wheel, station, sector].z - geom2.dt[wheel, station, sector].z) * signConventions[
"DT", wheel, station, sector][2]
86 phiydiff = -angle_factor * (geom1.dt[wheel, station, sector].phiy - geom2.dt[wheel, station, sector].phiy) * signConventions[
"DT", wheel, station, sector][1]
88 m = re.search(
"translate\(([0-9\.\-\+eE]+),\s([0-9\.\-\+eE]+)\)\srotate\(([0-9\.\-\+eE]+)\)",svgitem[
"transform"])
90 tx = float(m.group(1))
91 ty = float(m.group(2))
92 tr = float(m.group(3))
94 newBox = svgitem.clone()
96 svgitem[
"style"] =
"fill:#e1e1e1;fill-opacity:1;stroke:#000000;stroke-width:5.0;stroke-dasharray:1, 1;stroke-dashoffset:0"
97 newBox[
"style"] =
"fill:%s;fill-opacity:0.5;stroke:#000000;stroke-width:5.0;stroke-opacity:1;stroke-dasharray:none" %
colors(wheel, station, sector)
98 newBox[
"id"] = newBox[
"id"] +
"_moved"
100 newBox[
"transform"] =
"translate(%g,%g) rotate(%g)" % (tx - xdiff*
cos(tr*pi/180.) + zdiff*
sin(tr*pi/180.), ty - xdiff*
sin(tr*pi/180.) - zdiff*
cos(tr*pi/180.), tr - phiydiff*180./pi)
102 new_boxes.append(newBox)
104 for treeindex, svgitem
in wheel_template:
105 if isinstance(svgitem, SVG)
and svgitem.t ==
"g" and "id" in svgitem.attr
and svgitem[
"id"] ==
"chambers":
106 svgitem.append(new_boxes)
108 elif isinstance(svgitem, SVG)
and "id" in svgitem.attr
and svgitem[
"id"] ==
"wheelx":
109 if wheel == 0: svgitem[0] =
"Wheel 0"
110 else: svgitem[0] =
"Wheel %+d" % wheel
111 svgitem[0] +=
" (length x%g, angle x%g)" % (length_factor, angle_factor)
113 wheel_template.save(filename)
115 def draw_disk(geom1, geom2, endcap, station, filename, length_factor=1., angle_factor=100., colors=csc_colors, template_dir='./'):
117 disk_template = load_svg(template_dir +
"disk1_template.svg")
118 if station
in (2, 3):
119 disk_template = load_svg(template_dir +
"disk23_template.svg")
120 if endcap == 1
and station == 4:
121 disk_template = load_svg(template_dir +
"diskp4_template.svg")
122 if endcap == 2
and station == 4:
123 disk_template = load_svg(template_dir +
"diskm4_template.svg")
129 for treeindex, svgitem
in disk_template:
130 if isinstance(svgitem, SVG)
and "id" in svgitem.attr
and svgitem[
"id"] ==
"fakecenter":
135 for i, di
in enumerate(fakecenter.d):
136 if di[0]
in (
"M",
"L"):
143 for treeindex, svgitem
in disk_template:
144 if isinstance(svgitem, SVG)
and "id" in svgitem.attr
and svgitem[
"id"][:3] ==
"ME_":
145 m = re.match(
"ME_([0-9]+)_([0-9]+)", svgitem[
"id"])
146 if m
is None:
raise Exception
148 ring, chamber = int(m.group(1)), int(m.group(2))
149 xdiff = scale_factor * length_factor * (geom1.csc[endcap, station, ring, chamber].x - geom2.csc[endcap, station, ring, chamber].x) * signConventions[
"CSC", endcap, station, ring, chamber][0]
150 ydiff = -scale_factor * length_factor * (geom1.csc[endcap, station, ring, chamber].y - geom2.csc[endcap, station, ring, chamber].y) * signConventions[
"CSC", endcap, station, ring, chamber][1]
151 phizdiff = -angle_factor * (geom1.csc[endcap, station, ring, chamber].phiz - geom2.csc[endcap, station, ring, chamber].phiz) * signConventions[
"CSC", endcap, station, ring, chamber][2]
153 svgitem[
"style"] =
"fill:#e1e1e1;fill-opacity:1;stroke:#000000;stroke-width:1.0;stroke-dasharray:1, 1;stroke-dashoffset:0"
159 for i, di
in enumerate(newBox.d):
160 if not first
and di[0] ==
"m":
163 newBox.d[i] = tuple(di)
173 for i, di
in enumerate(newBox.d):
181 phipos = atan2(centery - originy, centerx - originx) - pi/2.
182 for i, di
in enumerate(newBox.d):
183 if di[0]
in (
"M",
"L"):
185 di[1] +=
cos(phipos)*xdiff -
sin(phipos)*ydiff
186 di[2] +=
sin(phipos)*xdiff +
cos(phipos)*ydiff
187 newBox.d[i] = tuple(di)
189 centerx +=
cos(phipos)*xdiff -
sin(phipos)*ydiff
190 centery +=
sin(phipos)*xdiff +
cos(phipos)*ydiff
192 for i, di
in enumerate(newBox.d):
193 if di[0]
in (
"M",
"L"):
195 dispx =
cos(phizdiff) * (di[1] - centerx) -
sin(phizdiff) * (di[2] - centery)
196 dispy =
sin(phizdiff) * (di[1] - centerx) +
cos(phizdiff) * (di[2] - centery)
197 di[1] = dispx + centerx
198 di[2] = dispy + centery
199 newBox.d[i] = tuple(di)
201 newBox = newBox.SVG()
202 newBox[
"style"] =
"fill:%s;fill-opacity:0.5;stroke:#000000;stroke-width:1.0;stroke-opacity:1;stroke-dasharray:none" %
colors(endcap, station, ring, chamber)
203 newBox[
"id"] = newBox[
"id"] +
"_moved"
205 new_boxes.append(newBox)
207 for treeindex, svgitem
in disk_template:
208 if isinstance(svgitem, SVG)
and svgitem.t ==
"g" and "id" in svgitem.attr
and svgitem[
"id"] ==
"chambers":
209 svgitem.append(new_boxes)
211 elif isinstance(svgitem, SVG)
and "id" in svgitem.attr
and svgitem[
"id"] ==
"diskx":
212 if endcap == 1: svgitem[0] =
"Disk %+d" % station
213 else: svgitem[0] =
"Disk %+d" % (-station)
214 svgitem[0] +=
" (length x%g, angle x%g)" % (length_factor, angle_factor)
216 disk_template.save(filename)
Sin< T >::type sin(const T &t)
Cos< T >::type cos(const T &t)
How EventSelector::AcceptEvent() decides whether to accept an event for output otherwise it is excluding the probing of A single or multiple positive and the trigger will pass if any such matching triggers are PASS or EXCEPTION[A criterion thatmatches no triggers at all is detected and causes a throw.] A single negative with an expectation of appropriate bit checking in the decision and the trigger will pass if any such matching triggers are FAIL or EXCEPTION A wildcarded negative criterion that matches more than one trigger in the trigger list("!*","!HLTx*"if it matches 2 triggers or more) will accept the event if all the matching triggers are FAIL.It will reject the event if any of the triggers are PASS or EXCEPTION(this matches the behavior of"!*"before the partial wildcard feature was incorporated).Triggers which are in the READY state are completely ignored.(READY should never be returned since the trigger paths have been run