#! /usr/bin/env python2 """ Make a geant4 macro to check the field values at values within a plane""" from math import * ### Handle ctrl-C import signal import sys def signal_handler(signal, frame): print ' You pressed Ctrl+C!' sys.exit(0) signal.signal(signal.SIGINT, signal_handler) ### Set up parameters origin=[0,0,0] #mm normal=[0,1,0] up_vector=[-1,0,0] steps_side=50 steps_up=steps_side range_side=300 range_up=range_side units="cm" ### Set up functions def Scale(factor,vector): temp=[] for i in vector: temp.append(i*factor) return temp def Dot(left,right): Value=0 for i,j in zip(left,right): Value+=i*j return Value def Cross(left,right): Vector=[] for i in range(0,3): j=(i+1)%3 k=(i+2)%3 Vector.append(left[j]*right[k]-left[k]*right[j]) return Vector def Sum(left,right): Vector=[] for i,j in zip(left,right): Vector.append(i+j) return Vector def Mag(vector): Value=0 for i in vector: Value=Value+i*i return sqrt(Value) def Norm(vector): mag=Mag(vector) temp=[] for i in vector: temp.append(i/mag) return temp def PrintField(vector): print "/field/getField "," ".join(map(str,vector)),units ################## # Main body ################# ### Clean parameters normal=Norm(normal) ### Pick mesh directions temp=Scale(-1*Dot(up_vector,normal),normal) temp=Sum(up_vector,temp) up=Norm(temp) side=Cross(up,normal) ## Set step size up=Scale(range_up/steps_up,up) side=Scale(range_side/steps_side,side) print "/control/echo Starting to Check field" ## Build Mesh signs=[1,-1] for i_side in range(0,steps_side): if i_side is 0: sign_side_range=[0] else: sign_side_range=signs for sign_side in sign_side_range: current_side=Scale(i_side*sign_side,side) for i_up in range(0,steps_up): if i_up is 0: sign_up_range=[0] else: sign_up_range=signs for sign_up in sign_up_range: current_up=Scale(i_up*sign_up,up) PrintField(Sum(origin,Sum(current_up,current_side))) print "/control/echo Finished Check field"