Author: [log in to unmask] Date: Tue Aug 4 17:59:33 2015 New Revision: 3335 Log: read BPM data to calculate integrated current Modified: java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtBiasConditionsLoader.java Modified: java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtBiasConditionsLoader.java ============================================================================= --- java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtBiasConditionsLoader.java (original) +++ java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtBiasConditionsLoader.java Tue Aug 4 17:59:33 2015 @@ -1,16 +1,22 @@ package org.hps.conditions.svt; import hep.aida.*; - +import java.io.BufferedReader; import java.io.File; +import java.io.FileReader; +import java.io.IOException; import java.sql.SQLException; +import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Collections; import java.util.Date; import java.util.GregorianCalendar; +import java.util.HashMap; import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.Set; +import java.util.TimeZone; import java.util.logging.Level; import java.util.logging.Logger; import org.apache.commons.cli.CommandLine; @@ -167,6 +173,7 @@ options.addOption(new Option("t", false, "use run table format (from crawler) for bias")); options.addOption(new Option("d", false, "discard first line of MYA data (for myaData output)")); options.addOption(new Option("g", false, "Actually load stuff into DB")); + options.addOption(new Option("b", true, "beam current file")); options.addOption(new Option("s", false, "Show plots")); final CommandLineParser parser = new PosixParser(); @@ -247,6 +254,10 @@ } } + if (cl.hasOption("b") && cl.hasOption("m") && cl.hasOption("p")) { + readBeamData(new File(cl.getOptionValue("b")), runList, positionRunRanges, biasRunRanges); + } + // load to DB if (cl.hasOption("g")) { if (cl.hasOption("m")) { @@ -408,4 +419,97 @@ } } } + + private static void readBeamData(File file, List<RunData> runList, List<SvtPositionRunRange> positionRanges, List<SvtBiasRunRange> biasRanges) { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); + dateFormat.setTimeZone(TimeZone.getTimeZone("America/New_York")); + + Map<Integer, SvtPositionRunRange> positionRangeMap = new HashMap<Integer, SvtPositionRunRange>(); + for (SvtPositionRunRange range : positionRanges) { + positionRangeMap.put(range.getRun().getRun(), range); + } + Map<Integer, SvtBiasRunRange> biasRangeMap = new HashMap<Integer, SvtBiasRunRange>(); + for (SvtBiasRunRange range : biasRanges) { + biasRangeMap.put(range.getRun().getRun(), range); + } + + try { + BufferedReader br = new BufferedReader(new FileReader(file)); + String line; + System.out.println("myaData header: " + br.readLine()); //discard the first line + + for (RunData run : runList) { + double totalCharge = 0; + double totalChargeWithBias = 0; + double totalChargeWithBiasAtNominal = 0; + double totalChargeWithBiasAt1pt5 = 0; + Date lastDate = null; + + while ((line = br.readLine()) != null) { + String arr[] = line.split(" +"); + + if (arr.length != 3) { + throw new java.text.ParseException("this line is not correct.", 0); + } + Date date = dateFormat.parse(arr[0] + " " + arr[1]); + if (date.after(run.getEndDate())) { + break; + } + if (date.before(run.getStartDate())) { + continue; + } + + double current; + if (arr[2].equals("<undefined>")) { + current = 0; + } else { + current = Double.parseDouble(arr[2]); + } + + if (date.after(run.getStartDate())) { + if (lastDate != null) { + double dt = (date.getTime() - lastDate.getTime()) / 1000.0; + double dq = dt * current; // nC + + totalCharge += dq; + SvtBiasRunRange biasRunRange = biasRangeMap.get(run.getRun()); + if (biasRunRange != null) { + for (SvtBiasMyaRange biasRange : biasRunRange.getRanges()) { + if (biasRange.includes(date)) { + totalChargeWithBias += dq; + + SvtPositionRunRange positionRunRange = positionRangeMap.get(run.getRun()); + if (positionRunRange != null) { + for (SvtPositionMyaRange positionRange : positionRunRange.getRanges()) { + if (positionRange.includes(date)) { + if (Math.abs(positionRange.getBottom()) < 0.0001 && Math.abs(positionRange.getTop()) < 0.0001) { + totalChargeWithBiasAtNominal += dq; + } else if (Math.abs(positionRange.getBottom() - 0.0033) < 0.0001 && Math.abs(positionRange.getTop() - 0.0031) < 0.0001) { + totalChargeWithBiasAt1pt5 += dq; + } + break; + } + } + } + + break; + } + } + } + + } + } + lastDate = date; + } + + System.out.format("run\t%d\ttotalQ\t%.0f\ttotalQBias\t%.0f\tfracBias\t%f\ttotalQNom\t%.0f\tfracNom\t%f\ttotalQ1pt5\t%.0f\tfrac1pt5\t%f\n", run.getRun(), totalCharge, totalChargeWithBias, totalChargeWithBias / totalCharge, totalChargeWithBiasAtNominal, totalChargeWithBiasAtNominal / totalCharge, totalChargeWithBiasAt1pt5, totalChargeWithBiasAt1pt5 / totalCharge); + } + br.close(); + + } catch (IOException e) { + throw new RuntimeException(e); + } catch (java.text.ParseException e) { + throw new RuntimeException(e); + } + } }