6 parser = argparse.ArgumentParser(description=
'Flattens Wrapper Files')
7 parser.add_argument(
'inname', metavar=
'inputfile', type=str, nargs=
'+',
8 help=
'input file name (should be FPGATrackSim Wrapper File)')
9 parser.add_argument(
'--evts', action=
'store', type=int,
10 help=
'number of events to process', default=(1<<30))
11 parser.add_argument(
'--trim', action=
'store', type=float,
12 help=
'trim modules with less than given fraction of tracks', default=
None)
13 parser.add_argument(
'--nslices', action=
'store', type=int,
14 help=
'number of slices to build', default=6)
15 parser.add_argument(
'--keylayer', action=
'store', type=str,
16 help=
'keylayer as det,bec,layer', default=
"strip,barrel,2")
17 parser.add_argument(
'--keylayer2', action=
'store', type=str,
18 help=
'second keylayer subdivides slices', default=
None)
19 parser.add_argument(
'--outfilelabel', action=
'store', type=str,
20 help=
'label to start outfile with', default=
"Unlabled")
21 parser.add_argument(
'--etarange', action=
'store', type=str,
22 help=
'range of eta for slice', default=
"-100,100")
23 parser.add_argument(
'--fullgran', action=
'store_true')
24 parser.add_argument(
'--test1slice', action=
'store_true')
26 args = parser.parse_args()
34 from collections
import defaultdict
45 defaultdictlambda=
lambda : defaultdict(defaultdictlambda)
49 for key,val
in tree.items():
50 if 'dict' in type(val).__name__:
53 if 'list' in type(val).__name__:
54 retv[key]=[func(subval)
for subval
in val]
63 dets=[
"pixel",
"strip"]
64 regs=[
"barrel",
"endcap"]
67 int2det = {1:
"pixel", 0:
"strip"}
68 det2int = {v:k
for k,v
in int2det.items()}
69 int2reg = {0:
"barrel", 2:
"endcap"}
70 reg2int = {v:k
for k,v
in int2reg.items()}
74 striprows={
'barrel' : {0:[
None]+[4]*14,
82 'endcap' : {i:[4,4,2,4,2,2]
for i
in range(12)}
87 abcchipsperrow={
'barrel' : {i+1:[10,10,10,10]
for i
in range(14)},
88 'endcap' : {0:[8,8,9,9],
99 for reg
in stripsperrow:
101 for mod
in stripsperrow[reg]:
102 rowbounds[reg][mod]=[
sum(stripsperrow[reg][mod][0:i+1])
for i
in range(len(stripsperrow[reg][mod]))]
107 if "ITK-22" in args.inname:
109 elif "ITK-23" in args.inname:
113 layers={
"pixel": {
"barrel":5,
"endcap": 8
if geom==
"ITK-22" else 8 },
"strip" : {
"barrel":8,
"endcap":12}}
121 if name
not in hists:
122 hists[name]=makehist(name)
131 if len(args.inname)==1
and os.path.isdir(args.inname[0]):
132 fileList = glob.glob(
"%s/*.root" % args.inname)
135 Data = ROOT.TChain(
"ExtrapolationEngineTest")
137 for file
in fileList:
138 msg.info(
"Adding file %s" %(file))
141 num_entries =
min(args.evts,Data.GetEntries())
142 msg.info(
"reading track input: %d entries\n" % (num_entries))
151 key_det,key_reg,key_lyr = keystring.split(
",")
152 key[
"lyr"]=
int(key_lyr)
153 key[
"det"]=det2int[key_det]
154 key[
"reg"]=reg2int[key_reg]
165 min_eta,max_eta = [
float(s)
for s
in args.etarange.split(
",")]
172 if trk.SensitiveIsPixel[hit_idx] == 0:
173 layer = 2*trk.SensitiveLayerDisc[hit_idx]+trk.SensitiveSide[hit_idx]
175 layer = trk.SensitiveLayerDisc[hit_idx]
180 strip = trk.SensitivePhiIndex[hit_idx]
181 bec=int2reg[abs(trk.SensitiveBarrelEndcap[hit_idx])]
183 etamod=trk.SensitiveEtaModule[hit_idx]
184 localrow,globalrow=
None,
None
185 r=trk.SensitivePosR[hit_idx]
186 z=trk.SensitivePosZ[hit_idx]
189 if trk.SensitiveIsPixel[hit_idx] == 0:
191 if "strip_number" not in hists:
192 hists[
"strip_number"]=ROOT.TH2D(
"strip_number_hist",
";module;strip",500,0,500,800,0,8000)
193 hists[
"strip_number"].Fill(reg2int[bec]*100+layer*10+etamod,strip)
196 localrow = bisect.bisect_left(rowbounds[bec][abs(etamod)],strip)
198 rows_in_module=striprows[bec][layer][abs(etamod)]
200 if localrow > rows_in_module:
201 msg.error(
"Error row(%d) greater than number of rows in module %d" %(localrow,rows_in_module))
202 globalrow=rows_in_module*etamod+localrow
206 if "z_mod6" not in hists:
207 hists[
"z_mod6"]=ROOT.TH2D(
"z_mod6",
";z;lyr",2500,0,500,10,0,10)
208 hists[
"z_mod6"].Fill(z,layer)
211 localrow=trk.SensitiveEtaModule[hit_idx]
214 lambda n: ROOT.TH2D(n,
";z[mm]; r[mm]",3000,0,+3000,1000,0,1000)).Fill(z,r)
216 return localrow,globalrow
223 if key[
"det"]!=trk.SensitiveIsPixel[hit_idx]:
225 if key[
"reg"]!=abs(trk.SensitiveBarrelEndcap[hit_idx]):
227 if getLayer(trk,hit_idx)!=key[
"lyr"]:
236 for hit_idx
in range(len(trk.SensitivePosX)):
238 rownew=
getRow(trk,hit_idx)[1]
239 if row
and (rownew!=row):
242 return row
if not mixedrows
else None
248 modules = defaultdict(defaultdictlambda)
250 for hit_idx
in range(len(trk.SensitivePosX)):
251 det = trk.SensitiveIsPixel[hit_idx]
252 reg = abs(trk.SensitiveBarrelEndcap[hit_idx])
254 row =
getRow(trk,hit_idx)[1]
255 phimod = trk.SensitivePhiModule[hit_idx]
256 r=trk.SensitivePosR[hit_idx]
257 z=trk.SensitivePosZ[hit_idx]
258 if reg==reg2int[
'barrel']:
259 if lyr
not in modules[det][reg]
or r < modules[det][reg][lyr][3]:
260 modules[det][reg][lyr]=(row,phimod,hit_idx,r,z)
262 if lyr
not in modules[det][reg]
or z < modules[det][reg][lyr][4]:
263 modules[det][reg][lyr]=(row,phimod,hit_idx,r,z)
265 for reg
in modules[det2int[
'strip']]:
266 if reg==reg2int[
'barrel']:
273 for lyr
in sorted(modules[det][reg].
keys(),reverse=
True):
274 if varlast < modules[det][reg][lyr][varidx]:
275 del modules[det][reg][lyr]
276 elif lyr+1==lastlyr
and lyr%2==0
and (varlast-modules[det][reg][lyr][varidx]) > 10.0:
277 del modules[det][reg][lyr+1]
280 varlast=modules[det][reg][lyr][varidx]
292 eta_vals_for_key_layer=
set()
301 if trk.StartEta > max_eta
or trk.StartEta < min_eta:
305 if not key1[
"lyr"]
in modules[key1[
"det"]][key1[
"reg"]]:
309 eta_vals_for_key_layer.add(modules[key1[
"det"]][key1[
"reg"]][key1[
"lyr"]][0])
313 msg.info(
"%d eta rows:",len(eta_vals_for_key_layer))
314 msg.info(
sorted(eta_vals_for_key_layer))
315 msg.info(
"Tracks Used = %d", tracks_used)
316 return eta_vals_for_key_layer
324 key_modules_per_slice =
float(len(eta_vals_for_key_layer))/nslices
325 key_modules_for_slices=[[]]
327 for i,row
in enumerate(
sorted(eta_vals_for_key_layer)):
328 if i >= len(key_modules_for_slices)*key_modules_per_slice:
329 key_modules_for_slices.append([])
330 key_modules_for_slices[-1].
append(row)
332 msg.info(
"Modules in slices %d", key_modules_for_slices)
337 return {m:i
for i,s
in enumerate(key_modules_for_slices)
for m
in s }
346 slice_modules=defaultdict(
lambda :
350 d:defaultdict(
lambda:0)
for d
in dirs}
351 for lyr
in range(layers[det][reg]) }
356 slice_tracks=defaultdict(
lambda:0)
361 missing_keylayer_hit=0
368 if trk.StartEta > max_eta
or trk.StartEta < min_eta:
373 if not key1[
"lyr"]
in modules[key1[
"det"]][key1[
"reg"]]:
374 missing_keylayer_hit+=1
376 mod1 = modules[key1[
"det"]][key1[
"reg"]][key1[
"lyr"]][0]
377 slicenum = mod_slice_map[mod1]
378 if args.test1slice
and slicenum!=0:
382 if not key2[
"lyr"]
in modules[key2[
"det"]][key2[
"reg"]]:
383 missing_keylayer_hit+=1
385 mod2 = modules[key2[
"det"]][key2[
"reg"]][key2[
"lyr"]][0]
386 slicenum=(slicenum,mod2)
392 for reg
in modules[det]:
393 for lyr
in modules[det][reg]:
394 modidxs=modules[det][reg][lyr]
395 slice_modules[slicenum][int2det[det]][int2reg[reg]][lyr][
"eta"][modidxs[0]]+=1
396 slice_modules[slicenum][int2det[det]][int2reg[reg]][lyr][
"phi"][modidxs[1]]+=1
400 if slicenum
not in slice_hists:
401 sliceid2int[slicenum]=len(slice_modules)-1
402 slice_hists[slicenum]=ROOT.TH2D(
"rz"+
str(sliceid2int[slicenum]),
"rz"+
str(slicenum)+
"; z[mm]; r[mm]",800,-200,+600,1000,0,1000)
403 slice_hists[slicenum].Fill(trk.SensitivePosZ[hit_idx],trk.SensitivePosR[hit_idx])
405 hname=int2det[det]+
"_"+int2reg[reg]+
"_"+
str(lyr)+
"_"+
str(modidxs[0])
406 if hname
not in slice_hists:
407 slice_hists[hname]=ROOT.TH1D(hname,hname+
"; z[mm]",800,-200,+600)
408 slice_hists[hname].Fill(trk.SensitivePosZ[hit_idx])
412 slice_tracks[slicenum]+=1
414 msg.info(
"Tracks Used=%d" %(tracks_used))
415 msg.info(
"%d tracks with no keylayer hit found or multiple hits in keylayer" %(
int(
str(missing_keylayer_hit))))
417 for hist
in slice_hists.values():
420 return slice_modules,sliceid2int,slice_tracks
430 for sliceid
in slice_modules:
433 for lyr
in slice_modules[sliceid][det][reg]:
434 for mod
in list(slice_modules[sliceid][det][reg][lyr][
"eta"]):
435 if slice_modules[sliceid][det][reg][lyr][
"eta"][mod]/
float(slice_tracks[sliceid]) < args.trim:
436 del slice_modules[sliceid][det][reg][lyr][
"eta"][mod]
443 nslices=len(sliceid2int)
444 rmap =
open(args.outfilelabel+
'_KeyLayer-%s%s%s_NSlices-%d.rmap' % (
445 args.keylayer.replace(
",",
"_"),
446 "_KeyLayer2-"+args.keylayer2.replace(
",",
"_")
if args.keylayer2
else "",
447 (
"_trim_%1.3f" % (args.trim,)).
replace(
".",
"_")
if args.trim
else "",
450 rmap.write(
"towers "+
str(nslices)+
" phi 16\n\n")
452 int2sliceid={v:k
for k,v
in sliceid2int.items()}
453 for i
in range(len(slice_modules)):
454 rmap.write(
"\n%d \n" % i)
455 sliceid=int2sliceid[i]
457 mindefault =
lambda x,default=0:
min(x)
if len(x)
else default
458 maxdefault =
lambda x,default=0:
max(x)
if len(x)
else default
462 for lyr
in range(layers[det][reg]):
463 rmap.write(
"%d %d %d %d %d %d %d %d %d\n" % (
464 1
if det==
"pixel" else 0,
465 1
if reg==
"endcap" else 0,
467 mindefault(slice_modules[sliceid][det][reg][lyr][
"phi"].
keys(),default=0),
468 maxdefault(slice_modules[sliceid][det][reg][lyr][
"phi"].
keys(),default=0),
469 len(slice_modules[sliceid][det][reg][lyr][
"phi"]),
470 mindefault(slice_modules[sliceid][det][reg][lyr][
"eta"].
keys(),default=0),
471 maxdefault(slice_modules[sliceid][det][reg][lyr][
"eta"].
keys(),default=0),
472 len(slice_modules[sliceid][det][reg][lyr][
"eta"])))
485 lyr:defaultdict(
lambda: 0)
for lyr
in range(layers[det][reg]) }
489 for sliceid
in slice_modules:
490 for det
in slice_modules[sliceid].
keys():
491 for reg
in slice_modules[sliceid][det].
keys():
492 for lyr
in slice_modules[sliceid][det][reg].
keys():
493 for etamod
in slice_modules[sliceid][det][reg][lyr][
"eta"].
keys():
494 duplication_count[det][reg][lyr][etamod]+=1
497 barrel_occupancies_4mrad_100mm={
"pixel": [2.5,1.2,0.9,0.75,0.6],
498 "strip": [0.4,0.4,0.3,0.3,0.2,0.2,0.2,0.2]}
499 barrel_lengths={
"pixel": [20,40,40,40,40],
500 "strip": [25,25,25,25,50,50,50,50]}
501 occupancies_per_module = {det:{reg: []
for reg
in regs}
for det
in dets}
503 for i
in range(len(barrel_lengths[det])):
504 occupancies_per_module[det][
'barrel'].
append(barrel_occupancies_4mrad_100mm[det][i]*barrel_lengths[det][i]/
float(100))
506 occupancies_per_module[det][
'endcap']=[0
for i
in range(layers[det][reg])]
508 layer_options = {
"FPGATrackSimlike" : {
"pixel" : [4],
"strip":[0,2,3,4,5,6,7]},
509 "Outer5" : {
"pixel" : [4],
"strip":[0,2,4,6]},
510 "Inner5" : {
"pixel" : [0,1,2,4,5],
"strip":[]},
511 "Mid5" : {
"pixel" : [2,4,5],
"strip":[0,2]}}
513 layer_options_occ = defaultdict(
lambda:1)
515 msg.info(
"%-5s %-6s %-5s %-12s %-10s %-10s" % (
"",
"",
"",
"",
"min/max",
"min/max",))
516 msg.info(
"%-5s %-6s %-5s %-12s %-10s %-10s" % (
"det",
"reg",
"lyr",
"duplication",
"modules",
"occupancy",))
519 for lyr
in range(layers[det][reg]):
521 if len(duplication_count[det][reg][lyr])!=0:
522 dup =
sum(duplication_count[det][reg][lyr].
values())/
float(len(duplication_count[det][reg][lyr]))
523 occs = [occupancies_per_module[det][reg][lyr]*len(slice_modules[sliceid][det][reg][lyr][
"eta"])
for sliceid
in slice_modules]
524 lens = [len(slice_modules[sliceid][det][reg][lyr][
"eta"])
for sliceid
in slice_modules]
526 for opt,config
in layer_options.items():
527 if lyr
in config[det]:
528 layer_options_occ[opt]*=
sum(occs)/
float(len(occs))
530 msg.info(
"%5s %5s %-5d %2.2f [%2d,%2d] [%2.2f,%2.2f]" % (det,reg,lyr,dup,
min(lens),
max(lens),
min(occs),
max(occs)))
532 msg.info(
"\nOccupancies:\n")
533 for opt,occ
in layer_options_occ.items():
549 for hit_idx
in range(len(trk.SensitivePosX)):
550 det = trk.SensitiveIsPixel[hit_idx]
551 reg = abs(trk.SensitiveBarrelEndcap[hit_idx])
553 row =
getRow(trk,hit_idx)[1]
554 r=trk.SensitivePosR[hit_idx]
555 z=trk.SensitivePosZ[hit_idx]
557 for sliceid,modules
in slice_modules.items():
559 lambda n: ROOT.TH2D(n,
"; z[mm]; r[mm]",3500,-500,+3000,1000,0,1000))
561 if row
in modules[int2det[det]][int2reg[reg]][lyr][
"eta"]:
570 histfile = ROOT.TFile(
"test.root",
'recreate')
577 nslices=len(eta_vals_for_key_layer)
584 msg.info(
"%d, two layers slices found"%(len(slice_modules)))
585 for x
in slice_modules.keys():
588 if args.trim:
trimSlice(slice_modules,slice_tracks)
596 for hist
in hists.values():