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():