Author: [log in to unmask] Date: Fri Aug 7 15:18:20 2015 New Revision: 3354 Log: added stuff for integrating current Added: java/trunk/users/src/main/java/org/hps/users/spaul/GetChargeFromScalersMultirun.java java/trunk/users/src/main/java/org/hps/users/spaul/timinginfo.txt Added: java/trunk/users/src/main/java/org/hps/users/spaul/GetChargeFromScalersMultirun.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/spaul/GetChargeFromScalersMultirun.java (added) +++ java/trunk/users/src/main/java/org/hps/users/spaul/GetChargeFromScalersMultirun.java Fri Aug 7 15:18:20 2015 @@ -0,0 +1,161 @@ +package org.hps.users.spaul; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.PrintWriter; +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; +import java.util.Scanner; +/** + * sums up the charge from multiple runs. + * @author sebouhpaul + * + */ +public class GetChargeFromScalersMultirun { + private static ArrayList<String> runs; + private static ArrayList<Date> starts; + private static ArrayList<Date> ends; + + public static void main(String[] arg) throws FileNotFoundException, ParseException{ + String inputFile = arg[0]; + String timingInfoFile = arg[1]; + String outputFile = arg[2]; + + + readTimingInfoFile(timingInfoFile); + + Map map = getCharges(runs, starts, ends, inputFile); + mergeBiasIntervals(map); + + ArrayList<String> keys = new ArrayList(map.keySet()); + Collections.sort(keys); + + + PrintWriter pw = new PrintWriter(new File(outputFile)); + for(String s : keys){ + pw.println(s + "\t" + map.get(s)); + System.out.println(s + "\t" + map.get(s)); + } + pw.close(); + } + + static void readTimingInfoFile(String s) throws FileNotFoundException, ParseException{ + Scanner scanner = new Scanner(new File(s)); + scanner.useDelimiter("[\n\t]"); + runs = new ArrayList(); + starts = new ArrayList(); + ends = new ArrayList(); + DateFormat df = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss z"); + + while(scanner.hasNext()){ + runs.add(scanner.next()); + String n = scanner.next(); + if(n.matches("\\d+")) + starts.add(new Date(Long.parseLong(n))); + else + starts.add(df.parse(n)); + n = scanner.next(); + if(n.matches("\\d+")) + ends.add(new Date(Long.parseLong(n))); + else + ends.add(df.parse(n)); + + } + scanner.close(); + } + + + + + + /** + * returns charge in microCoulombs + * @param runs names of the runs + * @param starts starting times of the runs + * @param ends ending times of the runs + * @param file the mya file that we need to use + * @return a map relating the runs to the charges (uC). + * @throws FileNotFoundException + */ + + static Map<String, Double> getCharges(ArrayList<String> runs, ArrayList<Date> starts, ArrayList<Date> ends, String file) throws FileNotFoundException{ + Scanner s = new Scanner(new File(file)); + HashMap<String, Double> map = new HashMap(); + long prev = 0; + long time = 0; + for(int i = 0; i< runs.size(); i++){ + long endt = ends.get(i).getTime(); + long startt = starts.get(i).getTime(); + + double charge = 0; + boolean started = false; + double prevval = 0; + if(time > endt){ + s.close(); + s = new Scanner(new File(file)); + } + inner : while(s.hasNext()){ + String var = s.next(); + prev = time; + time = s.nextLong()*1000; //convert from s to ms + + double val = s.nextDouble(); + if(!var.equals("scaler_calc1")) + continue; + + if(!started && time> startt){ //first sample in the run + charge += (val)/2.*(time-startt); + started= true; + } + + else if(time > startt && endt > time){ //middle samples in the run + charge += (val/*+prevval*/)/*/2.*/*(time-prev); + + } + + if(endt < time){ //last sample that is in the run + charge += (/*prev*/val)/2.*(endt-prev); + break inner; + } + prevval = val; + } + charge/=1e6; + map.put(runs.get(i), charge); + } + s.close(); + return map; + + } + + /** + * If the subsections of the runs in which the bias is on are labeled according to a scheme, + they will be added together. + for instance, 5779a, 5779b, 5779c, etc. will be added up as 5779bias. + * @param map the map of run names (and portions of runs that have bias labeled as [run number][a,b,c,d...], + * corresponding to the total charge in that run (or piece of a run). + */ + static void mergeBiasIntervals(Map<String, Double> map){ + Map<String, Double> map2 = new HashMap(); + for(Map.Entry<String, Double> entry : map.entrySet()){ + String key1 = entry.getKey(); + if(!entry.getKey().matches("\\d+a")) + continue; + double charge = entry.getValue(); + for(Map.Entry<String, Double> entry2 : map.entrySet()){ + if(entry2.getKey().matches(key1.substring(0, 4) + "[b-z]")) + charge += entry2.getValue(); + } + map2.put(key1.substring(0, 4) + "bias", charge); + + } + for(Map.Entry<String, Double> e : map2.entrySet()){ + map.put(e.getKey(), e.getValue()); + } + } +} Added: java/trunk/users/src/main/java/org/hps/users/spaul/timinginfo.txt ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/spaul/timinginfo.txt (added) +++ java/trunk/users/src/main/java/org/hps/users/spaul/timinginfo.txt Fri Aug 7 15:18:20 2015 @@ -0,0 +1,7 @@ +5779a 05/17/2015 13:18:41 EDT 05/17/2015 13:20:03 EDT +5779b 05/17/2015 13:21:29 EDT 05/17/2015 13:32:03 EDT +5779c 05/17/2015 13:33:59 EDT 05/17/2015 13:49:32 EDT +5781a 05/17/2015 14:00:09 EDT 05/17/2015 14:29:12 EDT +5781b 05/17/2015 14:30:04 EDT 05/17/2015 14:33:39 EDT +5779 05/17/2015 13:18:41 EDT 05/17/2015 13:49:32 EDT +5781 05/17/2015 14:00:09 EDT 05/17/2015 14:33:39 EDT