import sys import os import numpy as np import math import argparse #The script requiers python 3 to run correctly !! def parse_detx(file): in_F=open(file, 'r') line1=in_F.readline() sp=line1.split() no_DOMs = sp[1] Dom_X = [] Dom_Y = [] Dom_Z = [] String_id=[] Dom_ID=[] Dom_Phi = [] Dom_Theta= [] # Reference angles for GDML of the second PMT in OM oriented in a standard way (pmt 1 facing [0,0,-1] ) Phi_Ref = 162.565125 Theta_Ref = -27.390596 while True: line=in_F.readline() if line=='': break #print(len(line.split())) if len(line.split())==4: sp = line.split() pmts=int(sp[3]) String_id.append(int(sp[1])) Dom_ID.append(int(sp[0])) print(sp) print(pmts) for k in range(pmts): split=in_F.readline().split() dx=float(split[4]) dy=float(split[5]) dz=float(split[6]) if k==0: if dz is not -1.: Dom_Z.append(float(split[3])-0.2*dz) Dom_Y.append(float(split[2])-0.2*dy) Dom_X.append(float(split[1])-0.2*dx) else: Dom_X.append(float(split[1])) Dom_Y.append(float(split[2])) Dom_Z.append(float(split[3])+0.20) Phi=math.atan2(dy,dz)*(180/np.pi) if Phi<0: Phi=Phi+360 #theta_y=math.atan2(dx,dz)*(180/np.pi) Theta=math.asin(-dx/np.sqrt(dx**2+dy**2+dz**2))*(180/np.pi) if k==1: #if not math.isclose(Phi,Phi_Ref, abs_tol=0.01): if not abs(Phi-Phi_Ref)<0.01: Dom_Phi.append(Phi-Phi_Ref) else: Dom_Phi.append(0.0) #if not math.isclose(Theta, Theta_Ref, abs_tol=0.01): if not abs(Theta-Theta_Ref)<0.01: Dom_Theta.append(Theta-Theta_Ref) else: Dom_Theta.append(0.0) #theta_y=math.asin(dz/0.2) #theta_z=math.atan2(dy,dx)*(180/np.pi) print (Phi, Theta) #print (["%0.2f" % i for i in Dom_Z]) return String_id, Dom_ID, Dom_X, Dom_Y, Dom_Z, Dom_Phi, Dom_Theta def write_gdml(String_id, Dom_ID, Dom_X, Dom_Y, Dom_Z, Dom_Phi, Dom_Theta, output): out_F = open(output, 'w') out_F.write('\n\n\n\n') out_F.write('\n') out_F.write('\n\n') out_F.write('\n') out_F.write('\n') out_F.write('\n') out_F.write('\n') out_F.write('\n') out_F.write('\n') out_F.write('\n') out_F.write('\n') out_F.write('\n') out_F.write('\n') out_F.write('\n') out_F.write('\n') out_F.write('\n') out_F.write('\n') out_F.write('\n') out_F.write('\n') out_F.write('\n') out_F.write('\n') out_F.write('\n') out_F.write('\n') out_F.write('\n') out_F.write('\n') out_F.write('\n') out_F.write('\n') out_F.write('\n') out_F.write('\n') out_F.write('\n') out_F.write('\n') out_F.write('\n') out_F.write('\n') out_F.write('\n') out_F.write('\n') out_F.write('\n') out_F.write('\n') out_F.write('\n') out_F.write('\n') out_F.write('\n') out_F.write('\n') out_F.write('\n') out_F.write('\n') out_F.write('\n') out_F.write('\n') out_F.write('\n') out_F.write('\n') out_F.write('\n') out_F.write('\n') out_F.write('\n') out_F.write('\n') out_F.write('\n') out_F.write('\n') out_F.write('\n') out_F.write('\n') out_F.write('\n') out_F.write('\n') out_F.write('\n') out_F.write('\n') out_F.write('\n') out_F.write('\n') out_F.write('\n') out_F.write('\n') out_F.write('\n') out_F.write('\n') out_F.write('\n\n\n\n') # Detector height is bascially just a distance between the highest and the lowest DOM Detector_Height = max(Dom_Z)-min(Dom_Z) # Distance from the center of the lowest DOM to the seabed Seabed_Distance = min(Dom_Z) # To translate Z coordinate from detx format which corresponds to the distance from the seabed one has to perform a following calculation # Dom_Z_GDML = Dom_Z_Detx - Distance to the seabed from the lowest DOM - Detector_height/2 for i in range(0,len(Dom_ID)): out_F.write('\n'.format(String_id[i], Dom_ID[i], Dom_X[i], Dom_Y[i], round(Dom_Z[i] - Seabed_Distance-Detector_Height/2.,1))) DistanceOfSeabedFromLowestOM = Seabed_Distance # For now, the size of the WorldBox is fixed to 2200 meters WorldBoxHeight = 2200. # Below formula comes directly from the note by Apostolos Crust_Z_size = WorldBoxHeight/2.-Detector_Height/2.-DistanceOfSeabedFromLowestOM Crust_Z_position = -WorldBoxHeight/4.-Detector_Height/4.-DistanceOfSeabedFromLowestOM/2. print(Crust_Z_size) print(Crust_Z_position) out_F.write('\n\n\n') out_F.write('\n\n'.format(round(Crust_Z_position,1))) out_F.write('\n') out_F.write('\n') out_F.write('\n') out_F.write('\n') out_F.write(' \n') out_F.write(' \n'.format(round(Crust_Z_size,1))) out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write('\n\n\n') out_F.write('\n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write('\n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write('\n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write('\n') out_F.write('\n') out_F.write(' \n') out_F.write(' \n') out_F.write('\n') out_F.write('\n') out_F.write('\n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') out_F.write(' \n') for i in range(len(String_id)): out_F.write(' \n') out_F.write(' \n') out_F.write(' \n'.format(String_id[i], Dom_ID[i])) out_F.write(' \n'.format(Dom_Phi[i], Dom_Theta[i])) out_F.write(' \n') out_F.write('\n') out_F.write('\n') out_F.write('\n') out_F.write('\n') out_F.write('\n') out_F.write('\n') out_F.close() file='orca_115strings_20mhorizontal_18OMs_6.0mvertical.detx' parser = argparse.ArgumentParser(description='Converts detx file to GDML format') parser.add_argument('-i', help='Name of the detx file to process') parser.add_argument('-o', help='Name of the output GDML file') #parser.add_argument('--sum', dest='accumulate', action='store_const', # const=sum, default=max, # help='sum the integers (default: find the max)') args = parser.parse_args() String_id, Dom_ID, Dom_X, Dom_Y, Dom_Z, Dom_Phi, Dom_Theta = parse_detx(args.i) write_gdml(String_id, Dom_ID, Dom_X, Dom_Y, Dom_Z, Dom_Phi, Dom_Theta, args.o)