Пример #1
0
    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
Пример #2
0
    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
Пример #3
0
 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)
Пример #4
0
    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
Пример #5
0
 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)
Пример #6
0
    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)
Пример #7
0
 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)
Пример #8
0
 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])
Пример #9
0
 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]  )