def make_cluster(self, ptc, detname, fraction=1.0, size=None): """adds a cluster in a given detector, with a given fraction of the particle energy.""" detector = self.detector.elements[detname] propagator(ptc.q()).propagate_one(ptc, detector.volume.inner, self.detector.elements["field"].magnitude) if size is None: size = detector.cluster_size(ptc) cylname = detector.volume.inner.name if not cylname in ptc.points: # TODO Colin particle was not extrapolated here... # issue must be solved! errormsg = """ SimulationError : cannot make cluster for particle: particle: {ptc} with vertex rho={rho:5.2f}, z={zed:5.2f} cannot be extrapolated to : {det}\n""".format( ptc=ptc, rho=ptc.vertex.Perp(), zed=ptc.vertex.Z(), det=detector.volume.inner ) self.logger.warning(errormsg) raise SimulationError( "Particle not extrapolated to the detector, so cannot make a cluster there. No worries for now, problem will be solved :-)" ) cluster = Cluster(ptc.p4().E() * fraction, ptc.points[cylname], size, cylname, ptc) ptc.clusters[cylname] = cluster pdebugger.info(" ".join(("Made", cluster.__str__()))) return cluster
def make_cluster(self, ptc, detname, fraction=1., size=None): '''adds a cluster in a given detector, with a given fraction of the particle energy.''' detector = self.detector.elements[detname] propagator(ptc.q()).propagate_one( ptc, detector.volume.inner, self.detector.elements['field'].magnitude) if size is None: size = detector.cluster_size(ptc) cylname = detector.volume.inner.name if not cylname in ptc.points: # TODO Colin particle was not extrapolated here... # issue must be solved! errormsg = ''' SimulationError : cannot make cluster for particle: particle: {ptc} with vertex rho={rho:5.2f}, z={zed:5.2f} cannot be extrapolated to : {det}\n'''.format(ptc=ptc, rho=ptc.vertex.Perp(), zed=ptc.vertex.Z(), det=detector.volume.inner) self.logger.warning(errormsg) raise SimulationError( 'Particle not extrapolated to the detector, so cannot make a cluster there. No worries for now, problem will be solved :-)' ) cluster = Cluster(ptc.p4().E() * fraction, ptc.points[cylname], size, cylname, ptc) ptc.clusters[cylname] = cluster pdebugger.info(" ".join(("Made", cluster.__str__()))) return cluster
def test_layerfan(self): c1 = Cluster(10, TVector3(1, 0, 0), 1., 'ecal_in') c2 = Cluster(20, TVector3(1, 0, 0), 1., 'hcal_in') p3 = c1.position.Unit()*100. p4 = TLorentzVector() p4.SetVectM(p3, 1.) path = StraightLine(p4, TVector3(0,0,0)) charge = 1. tr = Track(p3, charge, path) tr.path.points['ecal_in'] = c1.position tr.path.points['hcal_in'] = c2.position elems = [c1, c2, tr] for ele in elems: link_type, link_ok, distance = ruler(ele, ele) if ele!=tr: self.assertTrue(link_ok) elif ele==tr: self.assertFalse(link_ok) #ecal hcal no longer linked to match c++ so have adjusted test accordingly link_type, link_ok, distance = ruler(c2, c1) self.assertFalse(link_ok) self.assertEqual(link_type, None) link_type, link_ok, distance = ruler(tr, c1) self.assertTrue(link_ok) link_type, link_ok, distance = ruler(tr, c2) self.assertTrue(link_ok)
def make_and_store_cluster(self, ptc, detname, fraction=1., size=None): '''adds a cluster in a given detector, with a given fraction of the particle energy. Stores the cluster in the appropriate collection and records cluster in the history''' detector = self.detector.elements[detname] propagator(ptc.q()).propagate_one(ptc, detector.volume.inner, self.detector.elements['field'].magnitude) if size is None: size = detector.cluster_size(ptc) cylname = detector.volume.inner.name if not cylname in ptc.points: # TODO Colin particle was not extrapolated here... # issue must be solved! errormsg = ''' SimulationError : cannot make cluster for particle: particle: {ptc} with vertex rho={rho:5.2f}, z={zed:5.2f} cannot be extrapolated to : {det}\n'''.format(ptc=ptc, rho=ptc.vertex.Perp(), zed=ptc.vertex.Z(), det=detector.volume.inner) self.logger.warning(errormsg) raise SimulationError('Particle not extrapolated to the detector, so cannot make a cluster there. No worries for now, problem will be solved :-)') clusters = self.cluster_collection(cylname) cluster = Cluster(ptc.p4().E()*fraction, ptc.points[cylname], size, cylname, len(clusters), ptc) #update collections and history ptc.clusters[cylname] = cluster clusters[cluster.uniqueid] = cluster self.update_history(ptc.uniqueid, cluster.uniqueid,) pdebugger.info(" ".join(("Made", cluster.__str__()))) return cluster
def test_merge_different_layers(self): clusters = [ Cluster(20, TVector3(1, 0, 0), 0.04, 'ecal_in'), Cluster(20, TVector3(1, 0, 0), 0.04, 'hcal_in') ] merge_clusters(clusters, 'hcal_in') self.assertEqual(len(clusters), 2)
def test_merge_pair_away(self): clusters = [ Cluster(20, TVector3(1,0,0), 0.04, 'hcal_in'), Cluster(20, TVector3(1,1.1,0.0), 0.04, 'hcal_in')] merge_clusters(clusters, 'hcal_in') self.assertEqual( len(clusters), 2 ) self.assertEqual( len(clusters[0].subclusters), 1) self.assertEqual( len(clusters[1].subclusters), 1)
def test_ecal_hcal(self): c1 = Cluster(10, TVector3(1, 0, 0), 4., 'ecal_in') c2 = Cluster(20, TVector3(1, 0, 0), 4., 'hcal_in') link_type, link_ok, distance = ruler(c1, c2) self.assertFalse(link_ok) #adjusted to match cpp self.assertEqual(distance, None) pos3 = TVector3(c1.position) pos3.RotateZ(0.059) c3 = Cluster(30, pos3, 5, 'hcal_in') link_type, link_ok, distance = ruler(c2, c3) self.assertEqual(distance, 0.059)
def test_merge_pair(self): clusters = [ Cluster(20, TVector3(1, 0, 0), 0.1, 'hcal_in'), Cluster(20, TVector3(1.,0.05,0.), 0.1, 'hcal_in')] merged_clusters = merge_clusters(clusters, 'hcal_in') self.assertEqual( len(merged_clusters), 1 ) self.assertEqual( merged_clusters[0].energy, clusters[0].energy + clusters[1].energy) self.assertEqual( merged_clusters[0].position.X(), (clusters[0].position.X() + clusters[1].position.X())/2.) self.assertEqual( len(merged_clusters[0].subclusters), 2) self.assertEqual( merged_clusters[0].subclusters[0], clusters[0]) self.assertEqual( merged_clusters[0].subclusters[1], clusters[1])
def test_inside(self): clusters = [ Cluster(20, TVector3(1, 0, 0), 0.055, 'hcal_in'), Cluster(20, TVector3(1.,0.1, 0.0), 0.055, 'hcal_in')] merged_clusters = merge_clusters(clusters, 'hcal_in') self.assertEqual( len(merged_clusters), 1 ) cluster = merged_clusters[0] self.assertEqual( (True, 0.), cluster.is_inside(TVector3(1, 0 , 0)) ) self.assertEqual( (True, 0.), cluster.is_inside(TVector3(1, 0.1, 0)) ) in_the_middle = cluster.is_inside(TVector3(1, 0.06, 0)) self.assertTrue(in_the_middle[0]) self.assertAlmostEqual(in_the_middle[1], 0.04000) self.assertFalse( cluster.is_inside(TVector3(1, 0.156, 0))[0] )