예제 #1
0
def example1():

    #
    np.random.seed(47117)

    nTry = 1000  #: number of tries
    nLayer = 5  #: number of detector layers
    print " Gbltst $Rev$ ", nTry, nLayer
    start = time.clock()
    # track direction
    sinLambda = 0.3
    cosLambda = math.sqrt(1.0 - sinLambda**2)
    sinPhi = 0.
    cosPhi = math.sqrt(1.0 - sinPhi**2)
    # Curvilinear system: track direction T, U = Z x T / |Z x T|, V = T x U
    tuvDir = np.array([[cosLambda * cosPhi, cosLambda * sinPhi, sinLambda], \
                       [-sinPhi, cosPhi, 0.], \
                       [-sinLambda * cosPhi, -sinLambda * sinPhi, cosLambda]])
    # measurement resolution
    measErr = np.array([0.001, 0.001])  # 10 mu
    measPrec = 1.0 / measErr**2
    # scattering error
    scatErr = 0.001  # 1 mrad
    # RMS of CurviLinear track parameters (Q/P, slopes, offsets)
    clErr = np.array([0.001, -0.1, 0.2, -0.15, 0.25])
    # precision matrix for external seed (in local system)
    locSeed = None
    seedLabel = 0  # label of point with seed
    if seedLabel != 0:
        print " external seed at label ", seedLabel
#
    bfac = 0.2998  # Bz*c for Bz=1
    step = 1.5 / cosLambda  # constant steps in RPhi
    #
    Chi2Sum = 0.
    NdfSum = 0
    LostSum = 0.
    #
    binaryFile = open("milleBinaryISN.dat", "wb")
    #
    for iTry in range(nTry):
        # generate (CurviLinear) track parameters
        clNorm = np.random.normal(0., 1., 5)
        clPar = clErr * clNorm
        # covariance matrix
        clCov = np.eye(5)
        for i in range(5):
            clCov[i, i] = clErr[i]**2
# arclength
        s = 0.
        # point-to-point jacobian (from previous point)
        jacPointToPoint = np.eye(5)
        # additional (local or global) derivatives
        addDer = np.array([[1.0], [0.0]])
        labGlobal = np.array([[4711], [4711]])
        # create trajectory
        traj = GblTrajectory(bfac != 0.)

        # at previous point: transformation from local to curvilinear system
        oldL2c = np.eye(5)

        for iLayer in range(nLayer):
            #print " layer ", iLayer
            # measurement directions (J,K) from stereo angle
            sinStereo = (0. if iLayer % 2 == 0 else 0.1)
            cosStereo = math.sqrt(1.0 - sinStereo**2)
            # measurement system: I, J ,K
            ijkDir = np.array([[1., 0., 0.], \
                               [0., cosStereo, sinStereo], \
                               [0., -sinStereo, cosStereo]])
            # local system: measurement or curvilinear
            #local = gblMeasSystem(ijkDir, tuvDir)
            local = gblCurviSystem(ijkDir, tuvDir)
            # projections
            proL2m = local.getTransLocalToMeas()
            proL2c = local.getTransLocalToCurvi()
            proC2l = np.linalg.inv(proL2c)
            # projection curvilinear to measurement directions
            proC2m = local.getTransCurviToMeas()
            # measurement - prediction in measurement system with error
            measNorm = np.random.normal(0., 1., 2)
            meas = np.dot(proC2m, clPar[3:5]) + measErr * measNorm
            # jacobian is calculated in curvilinear system and transformed
            jac = np.dot(proC2l, np.dot(jacPointToPoint, oldL2c))
            # point with (independent) measurements (in measurement system)
            point = GblPoint(jac)
            point.addMeasurement([proL2m, meas, measPrec])
            # additional local parameters?
            #      point.addLocals(addDer)
            # additional global parameters?
            point.addGlobals(labGlobal, addDer)
            addDer = -addDer  # locDer flips sign every measurement
            # add point to trajectory
            iLabel = traj.addPoint(point)
            if iLabel == abs(seedLabel):
                clSeed = np.linalg.inv(clCov)
                locSeed = np.dot(proL2c, np.dot(clSeed, proL2c.T))
# propagate to scatterer
            jacPointToPoint = gblSimpleJacobian(step, cosLambda, bfac)
            clPar = np.dot(jacPointToPoint, clPar)
            clCov = np.dot(jacPointToPoint, np.dot(clCov, jacPointToPoint.T))
            s += step
            if (iLayer < nLayer - 1):
                scat = np.array([0., 0.])
                # point with scatterer
                jac = np.dot(proC2l, np.dot(jacPointToPoint, proL2c))
                point = GblPoint(jac)
                if scatErr > 0:
                    scatP = local.getScatPrecision(scatErr)
                    point.addScatterer([scat, scatP])
                iLabel = traj.addPoint(point)
                if iLabel == abs(seedLabel):
                    clSeed = np.linalg.inv(clCov)
                    locSeed = np.dot(proL2c, np.dot(clSeed, proL2c.T))

# scatter a little
                scatNorm = np.random.normal(0., 1., 2)
                clPar[1:3] = clPar[1:3] + scatErr * scatNorm
                # propagate to next measurement layer
                clPar = np.dot(jacPointToPoint, clPar)
                clCov = np.dot(jacPointToPoint, np.dot(clCov,
                                                       jacPointToPoint.T))
                s += step
            oldL2c = proL2c

# add external seed
        if locSeed is not None:
            traj.addExternalSeed(seedLabel, locSeed)

# fit trajectory
        Chi2, Ndf, Lost = traj.fit()
        print " Record, Chi2, Ndf, Lost", iTry, Chi2, Ndf, Lost
        # dump trajectory
        #traj.printPoints()
        #traj.printData()
        # write to MP binary file
        #    traj.milleOut(binaryFile)
        # sum up
        Chi2Sum += Chi2
        NdfSum += Ndf
        LostSum += Lost
        # get corrections and covariance matrix at points
        if (iTry == 0):
            for i in range(1, nLayer + 1):
                locPar, locCov = traj.getResults(-i)
                print " >Point ", i
                print " locPar ", locPar
                #print " locCov ", locCov
                locPar, locCov = traj.getResults(i)
                print " Point> ", i
                print " locPar ", locPar
                #print " locCov ", locCov
# check residuals
            for i in range(traj.getNumPoints()):
                numData, aResiduals, aMeasErr, aResErr, aDownWeight = traj.getMeasResults(
                    i + 1)
                for j in range(numData):
                    print " measRes ", i, j, aResiduals[j], aMeasErr[
                        j], aResErr[j], aDownWeight[j]
                numData, aResiduals, aMeasErr, aResErr, aDownWeight = traj.getScatResults(
                    i + 1)
                for j in range(numData):
                    print " scatRes ", i, j, aResiduals[j], aMeasErr[
                        j], aResErr[j], aDownWeight[j]
#
    end = time.clock()
    print " Time [s] ", end - start
    print " Chi2Sum/NdfSum ", Chi2Sum / NdfSum
    print " LostSum/nTry ", LostSum / nTry
예제 #2
0
def example1():

#
  np.random.seed(47117)

  nTry = 1000  #: number of tries
  nLayer = 5  #: number of detector layers
  print " Gbltst $Rev: 95 $ ", nTry, nLayer
  start = time.clock()
# track direction
  sinLambda = 0.3
  cosLambda = math.sqrt(1.0 - sinLambda ** 2)
  sinPhi = 0.
  cosPhi = math.sqrt(1.0 - sinPhi ** 2)
# Curvilinear system: track direction T, U = Z x T / |Z x T|, V = T x U
  tuvDir = np.array([[cosLambda * cosPhi, cosLambda * sinPhi, sinLambda], \
                     [-sinPhi, cosPhi, 0.], \
                     [-sinLambda * cosPhi, -sinLambda * sinPhi, cosLambda]])
# measurement resolution
  measErr = np.array([ 0.001, 0.001])  # 10 mu
  measPrec = 1.0 / measErr ** 2
# scattering error
  scatErr = 0.001  # 1 mread
# RMS of CurviLinear track parameters (Q/P, slopes, offsets)
  clErr = np.array([0.001, -0.1, 0.2, -0.15, 0.25])
  # precision matrix for external seed (in local system)
  locSeed = None
  seedLabel = 0  # label of point with seed
  if seedLabel != 0:
    print " external seed at label ", seedLabel
#
  bfac = 0.2998  # Bz*c for Bz=1
  step = 1.5 / cosLambda  # constant steps in RPhi
#
  Chi2Sum = 0.
  NdfSum = 0
  LostSum = 0.
#
  binaryFile = open("milleBinaryISN.dat", "wb")
#
  for iTry in range(nTry):
# generate (CurviLinear) track parameters 
    clNorm = np.random.normal(0., 1., 5)  
    clPar = clErr * clNorm
    # covariance matrix
    clCov = np.eye(5)
    for i in range(5):
      clCov[i, i] = clErr[i] ** 2
# arclength
    s = 0.
# point-to-point jacobian (from previous point)    
    jacPointToPoint = np.eye(5)
# additional (local or global) derivatives    
    addDer = np.array([[1.0], [0.0]])
    labGlobal = np.array([[4711], [4711]])
# create trajectory
    traj = GblTrajectory(bfac != 0.)

# at previous point: transformation from local to curvilinear system 
    oldL2c = np.eye(5)
   
    for iLayer in range(nLayer):
      #print " layer ", iLayer
# measurement directions (J,K) from stereo angle
      sinStereo = (0. if iLayer % 2 == 0 else 0.1) 
      cosStereo = math.sqrt(1.0 - sinStereo ** 2)    
# measurement system: I, J ,K    
      ijkDir = np.array([[1., 0., 0.], \
                         [0., cosStereo, sinStereo], \
                         [0., -sinStereo, cosStereo]])
# local system: measurement or curvilinear 
      #local = gblMeasSystem(ijkDir, tuvDir)
      local = gblCurviSystem(ijkDir, tuvDir)
# projections
      proL2m = local.getTransLocalToMeas()
      proL2c = local.getTransLocalToCurvi()
      proC2l = np.linalg.inv(proL2c)
# projection curvilinear to measurement directions
      proC2m = local.getTransCurviToMeas()
# measurement - prediction in measurement system with error
      measNorm = np.random.normal(0., 1., 2)  
      meas = np.dot(proC2m, clPar[3:5]) + measErr * measNorm
# jacobian is calculated in curvilinear system and transformed
      jac = np.dot(proC2l, np.dot(jacPointToPoint, oldL2c))
# point with (independent) measurements (in measurement system)
      point = GblPoint(jac)
      point.addMeasurement([proL2m, meas, measPrec])
# additional local parameters?
#      point.addLocals(addDer)
# additional global parameters?
      point.addGlobals(labGlobal, addDer)
      addDer = -addDer  # locDer flips sign every measurement      
# add point to trajectory      
      iLabel = traj.addPoint(point)
      if iLabel == abs(seedLabel):
        clSeed = np.linalg.inv(clCov)
        locSeed = np.dot(proL2c, np.dot(clSeed, proL2c.T))
# propagate to scatterer
      jacPointToPoint = gblSimpleJacobian(step, cosLambda, bfac)
      clPar = np.dot(jacPointToPoint, clPar)
      clCov = np.dot(jacPointToPoint, np.dot(clCov, jacPointToPoint.T))
      s += step
      if (iLayer < nLayer - 1):
        scat = np.array([0., 0.])
# point with scatterer
        jac = np.dot(proC2l, np.dot(jacPointToPoint, proL2c))
        point = GblPoint(jac)
        scatP = local.getScatPrecision(scatErr)
        point.addScatterer([scat, scatP])
        iLabel = traj.addPoint(point)
        if iLabel == abs(seedLabel):
          clSeed = np.linalg.inv(clCov)
          locSeed = np.dot(proL2c, np.dot(clSeed, proL2c.T))

# scatter a little    
        scatNorm = np.random.normal(0., 1., 2)  
        clPar[1:3] = clPar[1:3] + scatErr * scatNorm
# propagate to next measurement layer    
        clPar = np.dot(jacPointToPoint, clPar)
        clCov = np.dot(jacPointToPoint, np.dot(clCov, jacPointToPoint.T))
        s += step
      oldL2c = proL2c
 
# add external seed
    if locSeed is not None:    
      traj.addExternalSeed(seedLabel, locSeed)
# dump trajectory
#    traj.dump()
  
# fit trajectory
    Chi2, Ndf, Lost = traj.fit()
    print " Record, Chi2, Ndf, Lost", iTry, Chi2, Ndf, Lost
# write to MP binary file    
#    traj.milleOut(binaryFile)
# sum up    
    Chi2Sum += Chi2
    NdfSum += Ndf
    LostSum += Lost
# get corrections and covariance matrix at points 
    if (iTry == 0):
      for i in range(1, nLayer + 1):      
        locPar, locCov = traj.getResults(-i)
        print " >Point ", i
        print " locPar ", locPar
        #print " locCov ", locCov      
        locPar, locCov = traj.getResults(i)
        print " Point> ", i
        print " locPar ", locPar
        #print " locCov ", locCov
# check residuals        
      for i in range(traj.getNumPoints()):
        numData, aResiduals, aMeasErr, aResErr, aDownWeight = traj.getMeasResults(i + 1)
        for j in range(numData):
          print " measRes " , i, j, aResiduals[j], aMeasErr[j], aResErr[j], aDownWeight[j]   
        numData, aResiduals, aMeasErr, aResErr, aDownWeight = traj.getScatResults(i + 1)
        for j in range(numData):
          print " scatRes " , i, j, aResiduals[j], aMeasErr[j], aResErr[j], aDownWeight[j]   
#
  end = time.clock()
  print " Time [s] ", end - start
  print " Chi2Sum/NdfSum ", Chi2Sum / NdfSum
  print " LostSum/nTry ", LostSum / nTry
예제 #3
0
def example1():
  '''
  Create points on initial trajectory, create trajectory from points,
  fit and write trajectory to MP-II binary file,
  get track parameter corrections and covariance matrix at points.
  
  Equidistant measurement layers and thin scatterers, propagation 
  with simple jacobian (quadratic in arc length differences).
  Curvilinear system (U,V,T) as local coordinate system.
  '''  
  def gblSimpleJacobian(ds, cosl, bfac):
    '''
    Simple jacobian: quadratic in arc length difference.
    
    @param ds: arc length difference
    @type ds: float
    @param cosl: cos(lambda)
    @type cosl: float
    @param bfac: Bz*c
    @type bfac: float
    @return: jacobian to move by 'ds' on trajectory
    @rtype: matrix(float)
    '''
    jac = np.eye(5)
    jac[1, 0] = -bfac * ds * cosl
    jac[3, 0] = -0.5 * bfac * ds * ds * cosl
    jac[3, 1] = ds
    jac[4, 2] = ds  
    return jac
#
  np.random.seed(47117)

  nTry = 1000 #: number of tries
  nLayer = 5   #: number of detector layers
  print " Gbltst $Rev: 234 $ ", nTry, nLayer
  start = time.clock()
# track direction
  sinLambda = 0.3
  cosLambda = math.sqrt(1.0 - sinLambda ** 2)
  sinPhi = 0.
  cosPhi = math.sqrt(1.0 - sinPhi ** 2)
#  tDir = np.array([cosLambda * cosPhi, cosLambda * sinPhi, sinLambda])
# U = Z x T / |Z x T|, V = T x U
  uvDir = np.array([[-sinPhi, cosPhi, 0.], \
                  [-sinLambda * cosPhi, -sinLambda * sinPhi, cosLambda]])
# measurement resolution
  measErr = np.array([ 0.001, 0.001]) # 10 mu
  measPrec = 1.0 / measErr ** 2
# scattering error
  scatErr = np.array([ 0.001, 0.001]) # 1 mread
  scatPrec = 1.0 / scatErr ** 2
# RMS of CurviLinear track parameters (Q/P, slopes, offsets)
  clErr = np.array([0.001, -0.1, 0.2, -0.15, 0.25])
  clSeed = None
  seedLabel = 0 # label of point with seed
  if seedLabel != 0:
    print " external seed at label ", seedLabel
#
  bfac = 0.2998 # Bz*c for Bz=1
  step = 1.5 / cosLambda # constant steps in RPhi
#
  Chi2Sum = 0.
  NdfSum = 0
  LostSum = 0.
#
  binaryFile = open("milleBinaryISN.dat", "wb")
#
  for iTry in range(nTry):
# generate (CurviLinear) track parameters 
    clNorm = np.random.normal(0., 1., 5)  
    clPar = clErr * clNorm
    # covariance matrix
    clCov = np.eye(5)
    for i in range(5):
      clCov[i, i] = clErr[i] ** 2
# arclength
    s = 0.
    sPoint = []
# point-to-point jacobian (from previous point)    
    jacPointToPoint = np.eye(5)
# additional (local or global) derivatives    
    addDer = np.array([[1.0], [0.0]])
    labGlobal = np.array([[4711], [4711]])
# create trajectory
    traj = GblTrajectory(bfac != 0.)
    
    for iLayer in range(nLayer):
#     measurement directions   
      sinStereo = (0. if iLayer % 2 == 0 else 0.5) 
      cosStereo = math.sqrt(1.0 - sinStereo ** 2)    
      mDir = np.array([[sinStereo, cosStereo, 0.0], [0., 0, 1.]])
# projection measurement to local (curvilinear uv) directions (duv/dm)
      proM2l = np.dot(uvDir, mDir.T)
# projection local (uv) to measurement directions (dm/duv)
      proL2m = np.linalg.inv(proM2l)
# measurement - prediction in measurement system with error
      measNorm = np.random.normal(0., 1., 2)  
      meas = np.dot(proL2m, clPar[3:5]) + measErr * measNorm
# point with measurement
      point = GblPoint(jacPointToPoint)
      point.addMeasurement([proL2m, meas, measPrec])
# additional local parameters?
#      point.addLocals(addDer)
# additional global parameters?
      point.addGlobals(labGlobal, addDer)
      addDer = -addDer # locDer flips sign every measurement      
# add point to trajectory      
      iLabel = traj.addPoint(point)
      sPoint.append(s)
      if iLabel == abs(seedLabel):
        clSeed = np.linalg.inv(clCov)
# propagate to scatterer
      jacPointToPoint = gblSimpleJacobian(step, cosLambda, bfac)
      clPar = np.dot(jacPointToPoint, clPar)
      clCov = np.dot(jacPointToPoint, np.dot(clCov, jacPointToPoint.T))
      s += step
      if (iLayer < nLayer - 1):
        scat = np.array([0., 0.])
# point with scatterer
        point = GblPoint(jacPointToPoint)
        point.addScatterer([scat, scatPrec])
        iLabel = traj.addPoint(point)
        sPoint.append(s)
        if iLabel == abs(seedLabel):
          clSeed = np.linalg.inv(clCov)

# scatter a little    
        scatNorm = np.random.normal(0., 1., 2)  
        clPar[1:3] = clPar[1:3] + scatErr * scatNorm
# propagate to next measurement layer    
        clPar = np.dot(jacPointToPoint, clPar)
        clCov = np.dot(jacPointToPoint, np.dot(clCov, jacPointToPoint.T))
        s += step
 
# add external seed
    if clSeed is not None:    
      traj.addExternalSeed(seedLabel, clSeed)
# dump trajectory
#    traj.dump()
  
# fit trajectory
    Chi2, Ndf, Lost = traj.fit()
    print " Record, Chi2, Ndf, Lost", iTry, Chi2, Ndf, Lost
# write to MP binary file    
#    traj.milleOut(binaryFile)
# sum up    
    Chi2Sum += Chi2
    NdfSum += Ndf
    LostSum += Lost
# get corrections and covariance matrix at points 
    if (iTry == 0):
      for i in range(1, 1):      
        locPar, locCov = traj.getResults(i)
        print " Point< ", i
        print " locPar ", locPar
        print " locCov ", locCov      
        locPar, locCov = traj.getResults(-i)
        print " Point> ", i
        print " locPar ", locPar
        print " locCov ", locCov  
#
  end = time.clock()
  print " Time [s] ", end - start
  print " Chi2Sum/NdfSum ", Chi2Sum / NdfSum
  print " LostSum/nTry ", LostSum / nTry