def printPixelMap_v2(): import os dirpath = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) det_geom = DetectorGeometry( "/data2/segmentlinking/phase2_2020_0428.txt".format(dirpath)) neta = 40. nphi = 72. maps = {} pt_bounds = [0.9, 2.0, 4.0, 10., 50.] for ipt in xrange(len(pt_bounds) - 1): for ieta in xrange(int(neta)): for iphi in xrange(int(nphi)): maps[(ipt, ieta, iphi)] = {} maps[(ipt, ieta, iphi, 1)] = {} maps[(ipt, ieta, iphi, -1)] = {} for layer in [1, 2, 3, 4, 5, 6]: for subdet in [4, 5]: maps[(ipt, ieta, iphi)][(layer, subdet)] = [] maps[(ipt, ieta, iphi, 1)][(layer, subdet)] = [] maps[(ipt, ieta, iphi, -1)][(layer, subdet)] = [] for detid in tqdm(det_geom.getDetIds()): module = Module(detid) layer = module.layer() subdet = module.subdet() if module.isLower() != 1 or module.moduleType() != 0: continue # if module.subdet() == 4: # if module.ring() != 1 and module.ring() != 2: # continue for ipt in xrange(len(pt_bounds) - 1): pt_lo = pt_bounds[ipt] pt_hi = pt_bounds[ipt + 1] etamin = det_geom.getCompatibleEtaRange(detid, -30, 30)[0] etamax = det_geom.getCompatibleEtaRange(detid, -30, 30)[1] ietamin = int((etamin + 2.6) / (5.2 / neta)) ietamax = int((etamax + 2.6) / (5.2 / neta)) prelim_etabins = range(ietamin, ietamax + 1) etabins = [] for ieta in prelim_etabins: if ieta >= 0 and ieta < neta: etabins.append(ieta) iphimin_pos = int( (det_geom.getCompatiblePhiRange(detid, pt_lo, pt_hi)[0][0] + math.pi) / (2 * math.pi / nphi)) iphimax_pos = int( (det_geom.getCompatiblePhiRange(detid, pt_lo, pt_hi)[0][1] + math.pi) / (2 * math.pi / nphi)) iphimin_neg = int( (det_geom.getCompatiblePhiRange(detid, pt_lo, pt_hi)[1][0] + math.pi) / (2 * math.pi / nphi)) iphimax_neg = int( (det_geom.getCompatiblePhiRange(detid, pt_lo, pt_hi)[1][1] + math.pi) / (2 * math.pi / nphi)) if iphimin_pos <= iphimax_pos: phibins_pos = range(iphimin_pos, iphimax_pos) else: phibins_pos = range(0, iphimax_pos) + range(iphimin_pos, 72) if iphimin_neg <= iphimax_neg: phibins_neg = range(iphimin_neg, iphimax_neg) else: phibins_neg = range(0, iphimax_neg) + range(iphimin_neg, 72) for ieta in etabins: for iphi in phibins_pos: maps[(ipt, ieta, iphi)][(layer, subdet)].append(detid) for iphi in phibins_neg: maps[(ipt, ieta, iphi)][(layer, subdet)].append(detid) for iphi in phibins_pos: maps[(ipt, ieta, iphi, 1)][(layer, subdet)].append(detid) for iphi in phibins_neg: maps[(ipt, ieta, iphi, -1)][(layer, subdet)].append(detid) import os os.system("mkdir -p pixelmap") g = open("pixelmap/pLS_map_ElCheapo.txt", "w") g_pos = open("pixelmap/pLS_map_pos_ElCheapo.txt", "w") g_neg = open("pixelmap/pLS_map_neg_ElCheapo.txt", "w") fs = {} for layer in [1, 2, 3, 4, 5, 6]: for subdet in [4, 5]: fs[(layer, subdet)] = open( "pixelmap/pLS_map_layer{}_subdet{}.txt".format(layer, subdet), "w") fs[(layer, subdet, 1)] = open( "pixelmap/pLS_map_pos_layer{}_subdet{}.txt".format( layer, subdet), "w") fs[(layer, subdet, -1)] = open( "pixelmap/pLS_map_neg_layer{}_subdet{}.txt".format( layer, subdet), "w") for ipt in xrange(len(pt_bounds) - 1): for ieta in xrange(int(neta)): for iphi in xrange(int(nphi)): isuperbin = (ipt * nphi * neta) + (ieta * nphi) + iphi all_detids = [] all_pos_detids = [] all_neg_detids = [] for layer in [1, 2, 3, 4, 5, 6]: for subdet in [4, 5]: maps[(ipt, ieta, iphi)][(layer, subdet)] = list( set(maps[(ipt, ieta, iphi)][(layer, subdet)])) maps[(ipt, ieta, iphi, 1)][(layer, subdet)] = list( set(maps[(ipt, ieta, iphi, 1)][(layer, subdet)])) maps[(ipt, ieta, iphi, -1)][(layer, subdet)] = list( set(maps[(ipt, ieta, iphi, -1)][(layer, subdet)])) fs[(layer, subdet)].write("{} {} {}\n".format( int(isuperbin), len(maps[(ipt, ieta, iphi)][(layer, subdet)]), " ".join([ str(x) for x in maps[(ipt, ieta, iphi)][(layer, subdet)] ]))) fs[(layer, subdet, 1)].write("{} {} {}\n".format( int(isuperbin), len(maps[(ipt, ieta, iphi, 1)][(layer, subdet)]), " ".join([ str(x) for x in maps[(ipt, ieta, iphi, 1)][(layer, subdet)] ]))) fs[(layer, subdet, -1)].write("{} {} {}\n".format( int(isuperbin), len(maps[(ipt, ieta, iphi, -1)][(layer, subdet)]), " ".join([ str(x) for x in maps[(ipt, ieta, iphi, -1)][(layer, subdet)] ]))) all_detids += maps[(ipt, ieta, iphi)][(layer, subdet)] all_pos_detids += maps[(ipt, ieta, iphi, 1)][(layer, subdet)] all_neg_detids += maps[(ipt, ieta, iphi, -1)][(layer, subdet)] g.write("{} {} {}\n".format( int(isuperbin), len(all_detids), " ".join([str(x) for x in all_detids]))) g_pos.write("{} {} {}\n".format( int(isuperbin), len(all_pos_detids), " ".join([str(x) for x in all_pos_detids]))) g_neg.write("{} {} {}\n".format( int(isuperbin), len(all_neg_detids), " ".join([str(x) for x in all_neg_detids])))
def printPixelMap_v3(): """ To print out pixel maps """ import os # The text file is a json file with "detid" -> {xyz of 4 corners of the module} det_geom = DetectorGeometry("/data2/segmentlinking/phase2_2020_0428.txt") # Define the binning of "super bins" neta = 25. nphi = 72. nz = 25. # pt_bounds = [0.9, 2.0, 4.0, 10., 50.] pt_bounds = [ptthresh, 2.0, 10000.] # Grand map object that will hold the mapping of the pixel map # maps[(ipt, ieta, iphi, iz)][(layer, subdet)] = [] # for both positive and negative # maps[(ipt, ieta, iphi, iz, 1)][(layer, subdet)] = [] # for positive oly # maps[(ipt, ieta, iphi, iz,-1)][(layer, subdet)] = [] # for negative oly maps = {} # Initialize empty lists for the pixel map for ipt in xrange(len(pt_bounds) - 1): for ieta in xrange(int(neta)): for iphi in xrange(int(nphi)): for iz in xrange(int(nz)): # Maps without split by charge maps[(ipt, ieta, iphi, iz)] = {} # Maps with split by charge (positive) maps[(ipt, ieta, iphi, iz, 1)] = {} # Maps with split by charge (negative) maps[(ipt, ieta, iphi, iz, -1)] = {} # The maps will then be split by (layer, subdet) for layer in [1, 2, 3, 4, 5, 6]: for subdet in [4, 5]: # Maps without split by charge maps[(ipt, ieta, iphi, iz)][(layer, subdet)] = [] # Maps split by charge maps[(ipt, ieta, iphi, iz, 1)][(layer, subdet)] = [] # Maps split by charge maps[(ipt, ieta, iphi, iz, -1)][(layer, subdet)] = [] # Loop over the detids and for each detid compute which superbins it is connected to for detid in tqdm(det_geom.getDetIds()): # Parse the layer and subdet module = Module(detid) layer = module.layer() subdet = module.subdet() # Skip if the module is not PS module and is not lower module if module.isLower() != 1 or module.moduleType() != 0: continue # For this module, now compute which super bins they belong to # To compute which super bins it belongs to, one needs to provide at least pt and z window to compute compatible eta and phi range # So we have a loop in pt and Z for ipt in xrange(len(pt_bounds) - 1): for iz in xrange(int(nz)): # The zmin, zmax of consideration zmin = -30 + iz * (60. / nz) zmax = -30 + (iz + 1) * (60. / nz) zmin -= 0.05 zmin += 0.05 # The ptmin, ptmax of consideration pt_lo = pt_bounds[ipt] pt_hi = pt_bounds[ipt + 1] # Based on the zmin and zmax, and the detid we can get eta min and eta max of compatible range etamin = det_geom.getCompatibleEtaRange(detid, zmin, zmax)[0] etamax = det_geom.getCompatibleEtaRange(detid, zmin, zmax)[1] etamin -= 0.05 etamax += 0.05 # Compute the indices of the compatible eta range ietamin = int((etamin + 2.6) / (5.2 / neta)) ietamax = int((etamax + 2.6) / (5.2 / neta)) # Since the etas are restricted to 2.6, need to chop it off if it's out of bounds # prelim_etabins = range(ietamin-1, ietamax+2) # add -1 and +1 to cover some inefficiencies prelim_etabins = range( ietamin, ietamax + 1) # add -1 and +1 to cover some inefficiencies etabins = [] for ieta in prelim_etabins: if ieta >= 0 and ieta < neta: etabins.append(ieta) # Now compute the ranges of iphi min and max for given pt ranges iphimin_pos = int( (det_geom.getCompatiblePhiRange(detid, pt_lo, pt_hi)[0][0] + math.pi) / (2 * math.pi / nphi)) iphimax_pos = int( (det_geom.getCompatiblePhiRange(detid, pt_lo, pt_hi)[0][1] + math.pi) / (2 * math.pi / nphi)) iphimin_neg = int( (det_geom.getCompatiblePhiRange(detid, pt_lo, pt_hi)[1][0] + math.pi) / (2 * math.pi / nphi)) iphimax_neg = int( (det_geom.getCompatiblePhiRange(detid, pt_lo, pt_hi)[1][1] + math.pi) / (2 * math.pi / nphi)) # if the range is crossing the -pi v. pi boundary special care is needed if iphimin_pos <= iphimax_pos: phibins_pos = range(iphimin_pos, iphimax_pos) else: phibins_pos = range(0, iphimax_pos) + range( iphimin_pos, int(nphi)) if iphimin_neg <= iphimax_neg: phibins_neg = range(iphimin_neg, iphimax_neg) else: phibins_neg = range(0, iphimax_neg) + range( iphimin_neg, int(nphi)) # Now we have a list of (ipt, ieta, iphi, iz)'s that are compatible so we fill the map for ieta in etabins: for iphi in phibins_pos: maps[(ipt, ieta, iphi, iz)][(layer, subdet)].append(detid) for iphi in phibins_neg: maps[(ipt, ieta, iphi, iz)][(layer, subdet)].append(detid) for iphi in phibins_pos: maps[(ipt, ieta, iphi, iz, 1)][(layer, subdet)].append(detid) for iphi in phibins_neg: maps[(ipt, ieta, iphi, iz, -1)][(layer, subdet)].append(detid) # Writing out the pixel map results import os os.system("mkdir -p pixelmap") # Grand map txt file that will hold everything regardless of the layers g = open("pixelmap/pLS_map_ElCheapo.txt", "w") g_pos = open("pixelmap/pLS_map_pos_ElCheapo.txt", "w") g_neg = open("pixelmap/pLS_map_neg_ElCheapo.txt", "w") # pixel maps split by layers fs = {} for layer in [1, 2, 3, 4, 5, 6]: for subdet in [4, 5]: fs[(layer, subdet)] = open( "pixelmap/pLS_map_layer{}_subdet{}.txt".format(layer, subdet), "w") fs[(layer, subdet, 1)] = open( "pixelmap/pLS_map_pos_layer{}_subdet{}.txt".format( layer, subdet), "w") fs[(layer, subdet, -1)] = open( "pixelmap/pLS_map_neg_layer{}_subdet{}.txt".format( layer, subdet), "w") # Loop over the super bins for ipt in xrange(len(pt_bounds) - 1): for ieta in xrange(int(neta)): for iphi in xrange(int(nphi)): for iz in xrange(int(nz)): # Compute the superbin index the phase-space belongs to isuperbin = (ipt * nphi * neta * nz) + (ieta * nphi * nz) + nz * iphi + iz # Temporary list to aggregate the detids all_detids = [] all_pos_detids = [] all_neg_detids = [] # Loop over the possible layer and subdets for layer in [1, 2, 3, 4, 5, 6]: for subdet in [4, 5]: # Obtain unique set of detids maps[(ipt, ieta, iphi, iz)][(layer, subdet)] = list( set(maps[(ipt, ieta, iphi, iz)][(layer, subdet)])) maps[(ipt, ieta, iphi, iz, 1)][(layer, subdet)] = list( set(maps[(ipt, ieta, iphi, iz, 1)][(layer, subdet)])) maps[(ipt, ieta, iphi, iz, -1)][(layer, subdet)] = list( set(maps[(ipt, ieta, iphi, iz, -1)][(layer, subdet)])) # Write out to the individual map files fs[(layer, subdet)].write("{} {} {}\n".format( int(isuperbin), len(maps[(ipt, ieta, iphi, iz)][(layer, subdet)]), " ".join([ str(x) for x in maps[(ipt, ieta, iphi, iz)][(layer, subdet)] ]))) fs[(layer, subdet, 1)].write("{} {} {}\n".format( int(isuperbin), len(maps[(ipt, ieta, iphi, iz, 1)][(layer, subdet)]), " ".join([ str(x) for x in maps[(ipt, ieta, iphi, iz, 1)][(layer, subdet)] ]))) fs[(layer, subdet, -1)].write("{} {} {}\n".format( int(isuperbin), len(maps[(ipt, ieta, iphi, iz, -1)][(layer, subdet)]), " ".join([ str(x) for x in maps[(ipt, ieta, iphi, iz, -1)][(layer, subdet)] ]))) # Aggregate all the detids for a given superbin in order to later write out to the grand map txt file that holds all detids regardless of layers all_detids += maps[(ipt, ieta, iphi, iz)][(layer, subdet)] all_pos_detids += maps[(ipt, ieta, iphi, iz, 1)][(layer, subdet)] all_neg_detids += maps[(ipt, ieta, iphi, iz, -1)][(layer, subdet)] maps[(ipt, ieta, iphi, iz)]["all"] = list(set(all_detids)) maps[(ipt, ieta, iphi, iz, 1)]["all"] = list(set(all_pos_detids)) maps[(ipt, ieta, iphi, iz, -1)]["all"] = list(set(all_neg_detids)) # Now write the entire detid for the entire outer tracker regardless of layers for the superbin at hand g.write("{} {} {}\n".format( int(isuperbin), len(maps[(ipt, ieta, iphi, iz)]["all"]), " ".join([ str(x) for x in maps[(ipt, ieta, iphi, iz)]["all"] ]))) g_pos.write("{} {} {}\n".format( int(isuperbin), len(maps[(ipt, ieta, iphi, iz, 1)]["all"]), " ".join([ str(x) for x in maps[(ipt, ieta, iphi, iz, 1)]["all"] ]))) g_neg.write("{} {} {}\n".format( int(isuperbin), len(maps[(ipt, ieta, iphi, iz, -1)]["all"]), " ".join([ str(x) for x in maps[(ipt, ieta, iphi, iz, -1)]["all"] ]))) # Declaring histograms for mapping multiplicities ofile = r.TFile("pixelmap/pLS_map.root", "recreate") nconns = {} for ipt in xrange(len(pt_bounds) - 1): for iz in xrange(int(nz)): nconns[(ipt, iz)] = r.TH2F( "pLS_map_ElCheapo_ipt{}_iz{}".format(ipt, iz), "", int(nphi), -math.pi, math.pi, int(neta), -2.6, 2.6) nconns[(ipt, iz, 1)] = r.TH2F( "pLS_map_pos_ElCheapo_ipt{}_iz{}".format(ipt, iz), "", int(nphi), -math.pi, math.pi, int(neta), -2.6, 2.6) nconns[(ipt, iz, -1)] = r.TH2F( "pLS_map_neg_ElCheapo_ipt{}_iz{}".format(ipt, iz), "", int(nphi), -math.pi, math.pi, int(neta), -2.6, 2.6) for layer in [1, 2, 3, 4, 5, 6]: for subdet in [4, 5]: nconns[(ipt, iz, layer, subdet)] = r.TH2F( "pLS_map_layer{}_subdet{}_ipt{}_iz{}".format( layer, subdet, ipt, iz), "", int(nphi), -math.pi, math.pi, int(neta), -2.6, 2.6) nconns[(ipt, iz, layer, subdet, 1)] = r.TH2F( "pLS_map_pos_layer{}_subdet{}_ipt{}_iz{}".format( layer, subdet, ipt, iz), "", int(nphi), -math.pi, math.pi, int(neta), -2.6, 2.6) nconns[(ipt, iz, layer, subdet, -1)] = r.TH2F( "pLS_map_neg_layer{}_subdet{}_ipt{}_iz{}".format( layer, subdet, ipt, iz), "", int(nphi), -math.pi, math.pi, int(neta), -2.6, 2.6) # Now filling the histograms for ipt in xrange(len(pt_bounds) - 1): for iz in xrange(int(nz)): for ieta in xrange(int(neta)): for iphi in xrange(int(nphi)): nconns[(ipt, iz)].SetBinContent( iphi + 1, ieta + 1, len(maps[(ipt, ieta, iphi, iz)]["all"])) nconns[(ipt, iz, 1)].SetBinContent( iphi + 1, ieta + 1, len(maps[(ipt, ieta, iphi, iz, 1)]["all"])) nconns[(ipt, iz, -1)].SetBinContent( iphi + 1, ieta + 1, len(maps[(ipt, ieta, iphi, iz, -1)]["all"])) for layer in [1, 2, 3, 4, 5, 6]: for subdet in [4, 5]: for ieta in xrange(int(neta)): for iphi in xrange(int(nphi)): nconns[(ipt, iz, layer, subdet)].SetBinContent( iphi + 1, ieta + 1, len(maps[(ipt, ieta, iphi, iz)][(layer, subdet)])) nconns[(ipt, iz, layer, subdet, 1)].SetBinContent( iphi + 1, ieta + 1, len(maps[(ipt, ieta, iphi, iz, 1)][(layer, subdet)])) nconns[(ipt, iz, layer, subdet, -1)].SetBinContent( iphi + 1, ieta + 1, len(maps[(ipt, ieta, iphi, iz, -1)][(layer, subdet)])) # Write the Histograms ofile.cd() for ipt in xrange(len(pt_bounds) - 1): for iz in xrange(int(nz)): nconns[(ipt, iz)].Write() nconns[(ipt, iz, 1)].Write() nconns[(ipt, iz, -1)].Write() for layer in [1, 2, 3, 4, 5, 6]: for subdet in [4, 5]: nconns[(ipt, iz, layer, subdet)].Write() nconns[(ipt, iz, layer, subdet, 1)].Write() nconns[(ipt, iz, layer, subdet, -1)].Write()
nconns_barrel_per_layer[5] = [] nconns_barrel_per_layer[6] = [] nconns_endcap_per_layer[1] = [] nconns_endcap_per_layer[2] = [] nconns_endcap_per_layer[3] = [] nconns_endcap_per_layer[4] = [] nconns_endcap_per_layer[5] = [] for line in tqdm(lines, desc="Looping over connection map"): ls = line.split() ref_detid = int(ls[0]) nconn = int(ls[1]) target_detids = [ int(x) for x in ls[2:] ] module = Module(ref_detid) layer = module.layer() subdet = module.subdet() if subdet == 5: nconns_barrel_per_layer[layer].append(nconn) else: nconns_endcap_per_layer[layer].append(nconn) if nconn >= 20: n_outliers += 1 detids += target_detids detids.append(ref_detid) centroid_ref = centroidDB.getCentroid(ref_detid) outlier_ref_detid.append(ref_detid) outlier_tar_detids.append(target_detids) ref_x = centroid_ref[0]