File indexing completed on 2024-11-16 09:02:48
0001
0002
0003
0004
0005
0006
0007
0008 require 'pp'
0009
0010
0011 CrossingAngle = -25
0012
0013
0014 if ARGV.length < 3
0015 puts "ERROR: not enough arguments" if ARGV.length > 0
0016 puts """
0017 USAGE: #{$0} [config_file] [energy] [list_files...]
0018
0019 [config_file]: name of output config file
0020 [energy]: beam energy, such as 5x41 or 10x100
0021 [list_files...]: list of \"list files\", generated by one of the
0022 `s3tools/s3tool.rb` scripts
0023 """
0024 exit 2
0025 end
0026
0027
0028 globalSettings = Hash.new
0029 configFile = ARGV[0]
0030 globalSettings[:eleBeamEn], globalSettings[:ionBeamEn] = ARGV[1].split('x').map{ |e| e.gsub /-.*/, '' }
0031 listFiles = ARGV[2..]
0032 globalSettings[:crossingAngle] = CrossingAngle
0033 puts "="*50, "generating config file".upcase, "="*50
0034 puts "configFile: #{configFile}"
0035 pp "globalSettings:", globalSettings
0036 pp "listFiles:", listFiles
0037
0038
0039 groupSettings = Hash.new
0040 listFiles.map{ |f| File.open(f,'r').readlines }.each do |listFileLines|
0041
0042 listFileLines.each do |line|
0043
0044 rootFile, crossSection, q2min, q2max = line.split.map do |token|
0045 token.match?(/\.root$/) ? token : token.to_f
0046 end
0047
0048 q2key = "#{q2min},#{q2max}"
0049
0050 unless groupSettings.has_key? q2key
0051 groupSettings[q2key] = Hash.new
0052 groupSettings[q2key][:files] = Array.new
0053 groupSettings[q2key][:q2min], groupSettings[q2key][:q2max] = q2key.split(',').map &:to_f
0054 groupSettings[q2key][:crossSection] = crossSection.to_f
0055 end
0056 groupSettings[q2key][:files] << rootFile
0057 puts "ERROR: conflicting cross section" if crossSection!=groupSettings[q2key][:crossSection]
0058 end
0059 end
0060
0061
0062
0063
0064 groupSettingsSorted = groupSettings.sort_by{ |s| s.last[:crossSection] }.reverse.to_h
0065 puts "\ngroupSettings, sorted by cross section:"
0066 pp groupSettingsSorted
0067
0068
0069 globalSettings[:totalCrossSection] = groupSettings.values.map{ |s| s[:crossSection] }.max
0070
0071
0072 configOut = File.open configFile, 'w'
0073 writeSetting = Proc.new{ |k,v| configOut.puts ":#{k} #{v}" }
0074 configOut.puts "\#"*60
0075 configOut.puts "\# configuration file, auto-generated from:".upcase
0076 listFiles.each{ |f| configOut.puts "\# #{f}" }
0077 configOut.puts "\#"*60
0078
0079
0080 configOut.puts """
0081 \# Global Settings
0082 \# ===============
0083 """
0084 globalSettings.each{ |k,v| writeSetting.call k, v }
0085
0086
0087 configOut.puts """
0088 \# Group Settings | NOTE: they must be sorted by increasing strictness
0089 \# ============== | of Q2 cuts, or at least by decreasing cross section
0090 """
0091 groupSettingsSorted.values.each_with_index do |settingsHash,i|
0092 configOut.puts "\n\# Q2 range #{i+1}"
0093 settingsHash.each do |key,value|
0094 unless key == :files
0095 next if key==:q2max and value==0.0
0096 writeSetting.call key, value
0097 end
0098 end
0099 settingsHash[:files].each{ |f| configOut.puts f }
0100 end
0101
0102
0103 configOut.close
0104 puts """
0105 #{"="*50}
0106 CONFIG FILE: #{configFile}
0107 #{"="*50}
0108 """
0109 system "cat #{configFile}"
0110 puts "="*50, "PRODUCED CONFIG FILE #{configFile}\n\n"