def single_line_manual_with_z(self, slopey, slopez, intercepty=0.0, interceptz=0.0): # no container needed vec = euclid.Vector3(1.0, slopey, slopez) pos = euclid.Point3(0.0, intercepty, interceptz) # fix at x=0 plane -> foil plane return euclid.Line3(pos, vec)
def hits(self, line=None, side=0): """ Input: A euclid line3 object The tracker side (=0 -> left tracker default) Process: Determine the nearest wires given a line throught the initial grid and cut on those wires closer than the lattice constant. Output: 2 Lists of wire coordinates and radii = shortest distance wire to line """ zvec = euclid.Vector3(0.0,0.0,1.0) # zaxis vector for 3D wire line darr = np.zeros((self.rows, self.columns)) zcoord = np.zeros((self.rows, self.columns)) if side < 1: sign = -1 tracker = self.grid_left else: sign = 1 tracker = self.grid_right self.wireinfo = [] # clean start m = 0 for entry in tracker: # rows for n in range(len(entry)): # columns if isinstance(line, euclid.Line3): # input was a Line3 object pos = euclid.Point3(entry[n][0], entry[n][1], 0.0) # point of wire in grid wire = euclid.Line3(pos,zvec) # wire into a vertical 3D line segm = wire.connect(line) zcoord[m][n] = segm.p.z darr[m][n] = segm.length # shortest distance line to line in 3D elif isinstance(line, HX.helix): # input was a Helix object distance = line.GetDistanceToPoint((entry[n][0]*1.0e-3, entry[n][1]*1.0e-3, 0.0)) # input in [m] zcoord[m][n] = sign*line.tanlambda * entry[n][0] # [mm] darr[m][n] = distance[0]*1.0e3 # [mm] shortest distance helix to wire point in 2D else: print 'grid ERROR: input type unknown, not line nor helix' return [], [] m += 1 cells = [] radius = [] iarr,jarr = np.where(darr <= (0.51*self.d)) #allow minimal overlap for ind,item in enumerate(iarr): jind = jarr[ind] pair = list(tracker[item][jind]) pair.append(zcoord[item][jind]) #print 'hit: ',pair self.wireinfo.append((side, jind, item)) # side, row, column cells.append(pair) # wire (x,y) and z concatenated radius.append(darr[item][jind]) return cells, radius
def single_line_manual_atplane(self, slope, interceptx, intercepty): # no container needed vec = euclid.Vector3(1.0, slope,0.0) pos = euclid.Point3(interceptx, intercepty, 0.0) # fix at icx, iy point return euclid.Line3(pos,vec)
def single_line_manual(self, slope, intercept = 0.0): # no container needed vec = euclid.Vector3(1.0, slope,0.0) pos = euclid.Point3(0.0, intercept, 0.0) # fix at x=0 plane -> foil plane return euclid.Line3(pos,vec)
euclid.Vector2(0.0, 1.0)) breakpoint = original.intersect(layerline) bpoints.append((breakpoint.x, breakpoint.y)) blayer.append(bl) c, r, i = remove_hits(bl + 1, 9, cells, radii, info) # return numpy arrays cluster[1] = (c, r, i) # next line continuing from breakpoint scat_angle = random.gauss(0.0, scatter_angle * math.pi / 180.0) # random scattering angle newangle = angle + scat_angle # altering original slope angle with new angle sl = math.tan(newangle) nextdummy = euclid.Line3( euclid.Point3(breakpoint.x, breakpoint.y, 5.0), euclid.Vector3(1.0, sl, 0.0)) caloinfo = dcalo.calohits(nextdummy, lrtracker) while len(caloinfo) < 1: # no calo was hit, try again scat_angle = random.gauss(0.0, scatter_angle * math.pi / 180.0) # random scattering angle newangle = angle + scat_angle # altering original slope angle with new angle sl = math.tan(newangle) nextdummy = euclid.Line3( euclid.Point3(breakpoint.x, breakpoint.y, 5.0), euclid.Vector3(1.0, sl, 0.0)) caloinfo = dcalo.calohits(nextdummy, lrtracker) bangles.append(scat_angle) lines.append(nextdummy) ncells, nradii = wgr.hits(nextdummy, lrtracker) # left/right tracker half