Author: [log in to unmask]
Date: Thu Sep 1 04:30:45 2016
New Revision: 4479
Log:
added more options to SvtChargeIntegrator (with Sho's permission)
Modified:
java/trunk/users/src/main/java/org/hps/users/meeg/SvtChargeIntegrator.java
Modified: java/trunk/users/src/main/java/org/hps/users/meeg/SvtChargeIntegrator.java
=============================================================================
--- java/trunk/users/src/main/java/org/hps/users/meeg/SvtChargeIntegrator.java (original)
+++ java/trunk/users/src/main/java/org/hps/users/meeg/SvtChargeIntegrator.java Thu Sep 1 04:30:45 2016
@@ -38,375 +38,441 @@
*/
public class SvtChargeIntegrator {
- private static final double angleTolerance = 1e-4;
- private static final double burstModeNoiseEfficiency = 0.965;
-
- /**
- *
- * @param args the command line arguments (requires a CSV run/file log file
- * and a MYA dump file.)
- */
- public static void main(String[] args) {
-
- Options options = new Options();
- options.addOption(new Option("r", false, "use per-run CSV log file (default is per-file)"));
- options.addOption(new Option("t", false, "use TI timestamp instead of Unix time (higher precision, but requires TI time offset in run DB)"));
- options.addOption(new Option("c", false, "get TI time offset from CSV log file instead of run DB"));
- options.addOption(new Option("e", true, "header error file"));
-
- final CommandLineParser parser = new PosixParser();
- CommandLine cl = null;
- try {
- cl = parser.parse(options, args);
- } catch (ParseException e) {
- throw new RuntimeException("Cannot parse.", e);
- }
-
- boolean perRun = cl.hasOption("r");
- boolean useTI = cl.hasOption("t");
- boolean useCrawlerTI = cl.hasOption("c");
-
- Map<Integer, Long> runErrorMap = new HashMap<Integer, Long>();
- if (cl.hasOption("e")) {
- try {
- BufferedReader br = new BufferedReader(new FileReader(cl.getOptionValue("e")));
- String line;
- System.err.println("header error file header: " + br.readLine()); //discard the first line
- while ((line = br.readLine()) != null) {
- String arr[] = line.split(" +");
- int run = Integer.parseInt(arr[1]);
- long errorTime = Long.parseLong(arr[4]);
- runErrorMap.put(run, errorTime);
-// System.out.format("%d %d\n", run, errorTime);
- }
- } catch (FileNotFoundException ex) {
- Logger.getLogger(SvtChargeIntegrator.class.getName()).log(Level.SEVERE, null, ex);
- } catch (IOException ex) {
- Logger.getLogger(SvtChargeIntegrator.class.getName()).log(Level.SEVERE, null, ex);
- }
- }
-
- if (cl.getArgs().length != 2) {
- printUsage(options);
- return;
- }
-
- List<CSVRecord> records = null;
- try {
- FileReader reader = new FileReader(cl.getArgs()[0]);
- final CSVParser csvParser = new CSVParser(reader, CSVFormat.DEFAULT);
-
- records = csvParser.getRecords();
-
- csvParser.close();
- } catch (FileNotFoundException ex) {
- Logger.getLogger(SvtChargeIntegrator.class.getName()).log(Level.SEVERE, null, ex);
- } catch (IOException ex) {
- Logger.getLogger(SvtChargeIntegrator.class.getName()).log(Level.SEVERE, null, ex);
- }
-
- SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
- dateFormat.setTimeZone(TimeZone.getTimeZone("America/New_York"));
-
- try {
- BufferedReader br = new BufferedReader(new FileReader(cl.getArgs()[1]));
- String line;
- System.err.println("myaData header: " + br.readLine()); //discard the first line
- if (perRun) {
- if (cl.hasOption("e")) {
- System.out.println("run_num\tnominal_position\tnEvents\ttotalQ\ttotalQ_withbias\ttotalQ_atnom\ttotalQ_noerror\tgatedQ\tgatedQ_withbias\tgatedQ_atnom\tgatedQ_noerror\tgoodQ\tgoodQ_withbias\tgoodQ_atnom\tgoodQ_noerror");
- } else {
- System.out.println("run_num\tnominal_position\tnEvents\ttotalQ\ttotalQ_withbias\ttotalQ_atnom\tgatedQ\tgatedQ_withbias\tgatedQ_atnom\tgoodQ\tgoodQ_withbias\tgoodQ_atnom");
- }
- } else {
- if (cl.hasOption("e")) {
- System.out.println("run_num\tfile_num\tnominal_position\tnEvents\ttotalQ\ttotalQ_withbias\ttotalQ_atnom\ttotalQ_noerror\tgatedQ\tgatedQ_withbias\tgatedQ_atnom\tgatedQ_noerror\tgoodQ\tgoodQ_withbias\tgoodQ_atnom\tgoodQ_noerror");
- } else {
- System.out.println("run_num\tfile_num\tnominal_position\tnEvents\ttotalQ\ttotalQ_withbias\ttotalQ_atnom\tgatedQ\tgatedQ_withbias\tgatedQ_atnom\tgoodQ\tgoodQ_withbias\tgoodQ_atnom");
- }
- }
-
- int currentRun = 0;
- double nominalAngleTop = -999;
- double nominalAngleBottom = -999;
- String nominalPosition = null;
- long tiTimeOffset = 0;
- double efficiency = 0;
- SvtBiasConstantCollection svtBiasConstants = null;
- SvtMotorPositionCollection svtPositionConstants = null;
- SvtAlignmentConstant.SvtAlignmentConstantCollection alignmentConstants = null;
- Date date = null;
- Date lastDate;
-
- for (CSVRecord record : records) {
- int runNum = Integer.parseInt(record.get(0));
- if (useCrawlerTI) {
- if (perRun) {
- tiTimeOffset = Long.parseLong(record.get(12));
- } else {
- tiTimeOffset = Long.parseLong(record.get(8));
- }
- if (tiTimeOffset == 0) {
- continue;
- }
- }
-
- if (runNum != currentRun) {
- if (useTI && !useCrawlerTI) {
- RunManager.getRunManager().setRun(runNum);
- if (!RunManager.getRunManager().runExists() || RunManager.getRunManager().getRunSummary().getTiTimeOffset() == null) {
- continue;
- }
- tiTimeOffset = RunManager.getRunManager().getRunSummary().getTiTimeOffset();
- if (tiTimeOffset == 0) {
- continue;
- }
- }
-
- try {
- DatabaseConditionsManager.getInstance().setDetector("HPS-EngRun2015-Nominal-v3", runNum);
- } catch (Exception ex) {
- continue;
- }
-
- try {
- svtBiasConstants = DatabaseConditionsManager.getInstance().getCachedConditions(SvtBiasConstant.SvtBiasConstantCollection.class, "svt_bias_constants").getCachedData();
- } catch (Exception ex) {
- svtBiasConstants = null;
- }
- try {
- svtPositionConstants = DatabaseConditionsManager.getInstance().getCachedConditions(SvtMotorPosition.SvtMotorPositionCollection.class, "svt_motor_positions").getCachedData();
- } catch (Exception ex) {
- svtPositionConstants = null;
- }
-
- try {
- alignmentConstants = DatabaseConditionsManager.getInstance().getCachedConditions(SvtAlignmentConstant.SvtAlignmentConstantCollection.class, "svt_alignments").getCachedData();
- for (final SvtAlignmentConstant constant : alignmentConstants) {
- switch (constant.getParameter()) {
- case 13100:
- nominalAngleTop = constant.getValue();
- break;
- case 23100:
- nominalAngleBottom = -constant.getValue();
- break;
- }
- }
- if (Math.abs(nominalAngleBottom) < angleTolerance && Math.abs(nominalAngleTop) < angleTolerance) {
- nominalPosition = "0pt5";
- } else if (Math.abs(nominalAngleBottom - 0.0033) < angleTolerance && Math.abs(nominalAngleTop - 0.0031) < angleTolerance) {
- nominalPosition = "1pt5";
- } else {
- nominalPosition = "unknown";
- }
- } catch (Exception ex) {
- alignmentConstants = null;
- nominalPosition = "unknown";
- }
- efficiency = burstModeNoiseEfficiency;
- SvtTimingConstants svtTimingConstants;
- try {
- svtTimingConstants = DatabaseConditionsManager.getInstance().getCachedConditions(SvtTimingConstants.SvtTimingConstantsCollection.class, "svt_timing_constants").getCachedData().get(0);
- } catch (Exception ex) {
- svtTimingConstants = null;
- }
- if (svtTimingConstants != null) {
- if (svtTimingConstants.getOffsetTime() > 27) {
- efficiency *= 2.0 / 3.0; // bad latency: drop 2 out of 6 trigger phases
- }// otherwise, we have good latency
- } else {
- efficiency = 0;
- }//no latency info in conditions: give up
- currentRun = runNum;
- }
-
- Date startDate, endDate;
- long firstTime, lastTime;//Unix time from head bank
- long firstTI, lastTI;//TI timestamp from TI bank
-
- if (perRun) {
- firstTime = Long.parseLong(record.get(7));
- lastTime = Long.parseLong(record.get(8));
- firstTI = Long.parseLong(record.get(10));
- lastTI = Long.parseLong(record.get(11));
-
- } else {
- firstTime = Long.parseLong(record.get(4));
- lastTime = Long.parseLong(record.get(5));
- firstTI = Long.parseLong(record.get(6));
- lastTI = Long.parseLong(record.get(7));
- }
-
- if (useTI) {
- if (firstTI == 0 || lastTI == 0) {
- continue;
- }
- startDate = new Date((firstTI + tiTimeOffset) / 1000000);
- endDate = new Date((lastTI + tiTimeOffset) / 1000000);
- } else {
- if (firstTime == 0 || lastTime == 0) {
- continue;
- }
- startDate = new Date(firstTime * 1000);
- endDate = new Date(lastTime * 1000);
- }
-
- Long errorTime = runErrorMap.get(runNum);
- Date errorDate = null;
- if (errorTime != null) {
- errorDate = new Date(errorTime / 1000000);
- boolean isGood = Math.abs(errorDate.getTime() - startDate.getTime()) < 10 * 60 * 60 * 1000; //10 hours
- if (!isGood && useTI) {
- errorDate = new Date((errorTime + tiTimeOffset) / 1000000);
-// boolean isPlusOffsetGood = Math.abs(errorDatePlusOffset.getTime() - startDate.getTime()) < 10 * 60 * 60 * 1000; //10 hours
-// System.out.format("%d, %d, %d: %s (good: %b), %s (good: %b)\n", runNum, errorTime, tiTimeOffset, errorDate, isGood, errorDatePlusOffset, isPlusOffsetGood);
- }
- }
-
- double totalCharge = 0;
- double totalChargeWithBias = 0;
- double totalChargeWithBiasAtNominal = 0;
- double totalChargeWithBiasAtNominalNoError = 0;
- double totalGatedCharge = 0;
- double totalGatedChargeWithBias = 0;
- double totalGatedChargeWithBiasAtNominal = 0;
- double totalGatedChargeWithBiasAtNominalNoError = 0;
- double totalGoodCharge = 0;
- double totalGoodChargeWithBias = 0;
- double totalGoodChargeWithBiasAtNominal = 0;
- double totalGoodChargeWithBiasAtNominalNoError = 0;
- br.mark(1000);
-
- while ((line = br.readLine()) != null) {
- String arr[] = line.split(" +");
-
- if (arr.length != 4) {
- throw new RuntimeException("this line is not correct.");
- }
- lastDate = date;
- date = dateFormat.parse(arr[0] + " " + arr[1]);
- if (date.before(startDate)) { //not in the file's time range yet; keep reading the file
- continue;
- }
-
- double current, livetime;
- if (arr[2].equals("<undefined>")) {
- current = 0;
- } else {
- current = Double.parseDouble(arr[2]);
- }
- if (arr[3].equals("<undefined>")) {
- livetime = 0;
- } else {
- livetime = Math.min(100.0, Math.max(0.0, Double.parseDouble(arr[3]))) / 100.0;
- }
-
- boolean biasGood = false;
- boolean positionGood = false;
- SvtBiasConstant biasConstant = null;
- if (svtBiasConstants != null) {
- biasConstant = svtBiasConstants.find(date);
- if (biasConstant == null && lastDate != null) {
- biasConstant = svtBiasConstants.find(lastDate);
- }
- if (biasConstant != null) {
- biasGood = true;
- }
- }
- SvtMotorPosition positionConstant = null;
- if (svtPositionConstants != null) {
- positionConstant = svtPositionConstants.find(date);
- if (positionConstant == null && lastDate != null) {
- positionConstant = svtPositionConstants.find(lastDate);
- }
- if (positionConstant != null && alignmentConstants != null) {
-// System.out.format("%f %f %f %f\n", positionConstant.getBottom(), nominalAngleBottom, positionConstant.getTop(), nominalAngleTop);
- if (Math.abs(positionConstant.getBottom() - nominalAngleBottom) < angleTolerance && Math.abs(positionConstant.getTop() - nominalAngleTop) < angleTolerance) {
- positionGood = true;
- }
- }
- }
-
- if (lastDate != null) {
- double biasDt = 0;
- double positionDt = 0;
- long dtStart = Math.max(startDate.getTime(), lastDate.getTime());
- long dtEnd = Math.min(date.getTime(), endDate.getTime());
- double dt = (dtEnd - dtStart) / 1000.0;
- double errorDt = 0;
- if (biasConstant != null) {
- long biasStart = Math.max(dtStart, biasConstant.getStart());
- long biasEnd = Math.min(dtEnd, biasConstant.getEnd());
- biasDt = Math.max(0, biasEnd - biasStart) / 1000.0;
- if (positionConstant != null) {
- long positionStart = Math.max(biasStart, positionConstant.getStart());
- long positionEnd = Math.min(biasEnd, positionConstant.getEnd());
- positionDt = Math.max(0, positionEnd - positionStart) / 1000.0;
-
- long errorEnd = positionStart;
- if (errorDate == null) {
- errorEnd = positionEnd;
- } else if (errorDate.getTime() > dtStart) {
- errorEnd = Math.min(positionEnd, errorDate.getTime());
- }
- errorDt = Math.max(0, errorEnd - positionStart) / 1000.0;
- }
- }
-// System.out.format("start %d end %d date %d lastDate %d current %f dt %f\n", startDate.getTime(), endDate.getTime(), date.getTime(), lastDate.getTime(), current, dt);
- totalCharge += dt * current; // nC
- totalGatedCharge += dt * current * livetime;
- totalGoodCharge += dt * current * livetime * efficiency;
- if (biasGood) {
- totalChargeWithBias += biasDt * current;
- totalGatedChargeWithBias += biasDt * current * livetime;
- totalGoodChargeWithBias += biasDt * current * livetime * efficiency;
- if (positionGood) {
- totalChargeWithBiasAtNominal += positionDt * current;
- totalGatedChargeWithBiasAtNominal += positionDt * current * livetime;
- totalGoodChargeWithBiasAtNominal += positionDt * current * livetime * efficiency;
-
- totalChargeWithBiasAtNominalNoError += errorDt * current;
- totalGatedChargeWithBiasAtNominalNoError += errorDt * current * livetime;
- totalGoodChargeWithBiasAtNominalNoError += errorDt * current * livetime * efficiency;
- }
- }
- }
- if (date.after(endDate)) {//this is the last interval overlapping the file's time range; backtrack so this line will be read again for the next file
- date = lastDate;
- try {
- br.reset();
- } catch (IOException e) {
- }
- break;
- }
- br.mark(1000);
- }
- if (perRun) {
- int nEvents = Integer.parseInt(record.get(9));
- if (cl.hasOption("e")) {
- System.out.format("%d\t%s\t%d\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f\n", runNum, nominalPosition, nEvents, totalCharge, totalChargeWithBias, totalChargeWithBiasAtNominal, totalChargeWithBiasAtNominalNoError, totalGatedCharge, totalGatedChargeWithBias, totalGatedChargeWithBiasAtNominal, totalGatedChargeWithBiasAtNominalNoError, totalGoodCharge, totalGoodChargeWithBias, totalGoodChargeWithBiasAtNominal, totalGoodChargeWithBiasAtNominalNoError);
- } else {
- System.out.format("%d\t%s\t%d\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f\n", runNum, nominalPosition, nEvents, totalCharge, totalChargeWithBias, totalChargeWithBiasAtNominal, totalGatedCharge, totalGatedChargeWithBias, totalGatedChargeWithBiasAtNominal, totalGoodCharge, totalGoodChargeWithBias, totalGoodChargeWithBiasAtNominal);
- }
- } else {
- int fileNum = Integer.parseInt(record.get(1));
- int nEvents = Integer.parseInt(record.get(2));
- if (cl.hasOption("e")) {
- System.out.format("%d\t%d\t%s\t%d\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f\n", runNum, fileNum, nominalPosition, nEvents, totalCharge, totalChargeWithBias, totalChargeWithBiasAtNominal, totalChargeWithBiasAtNominalNoError, totalGatedCharge, totalGatedChargeWithBias, totalGatedChargeWithBiasAtNominal, totalGatedChargeWithBiasAtNominalNoError, totalGoodCharge, totalGoodChargeWithBias, totalGoodChargeWithBiasAtNominal, totalGoodChargeWithBiasAtNominalNoError);
- } else {
- System.out.format("%d\t%d\t%s\t%d\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f\n", runNum, fileNum, nominalPosition, nEvents, totalCharge, totalChargeWithBias, totalChargeWithBiasAtNominal, totalGatedCharge, totalGatedChargeWithBias, totalGatedChargeWithBiasAtNominal, totalGoodCharge, totalGoodChargeWithBias, totalGoodChargeWithBiasAtNominal);
- }
- }
- }
- } catch (Exception ex) {
- Logger.getLogger(SvtChargeIntegrator.class.getName()).log(Level.SEVERE, null, ex);
- }
-
- }
-
- private static void printUsage(Options options) {
- HelpFormatter formatter = new HelpFormatter();
- System.err.println("SvtChargeIntegrator <CSV log file> <MYA dump file>");
- formatter.printHelp("Need to adhere to these options", options);
- }
+ private static final double angleTolerance = 1e-4;
+ private static final double burstModeNoiseEfficiency = 0.965;
+ //below this number, the current is counted as zero.
+ private static double zeroPointThreshold = .1;
+
+ /**
+ *
+ * @param args the command line arguments (requires a CSV run/file log file
+ * and a MYA dump file.)
+ */
+ public static void main(String[] args) {
+
+ Options options = new Options();
+ options.addOption(new Option("r", false, "use per-run CSV log file (default is per-file)"));
+ options.addOption(new Option("t", false, "use TI timestamp instead of Unix time (higher precision, but requires TI time offset in run DB)"));
+ options.addOption(new Option("c", false, "get TI time offset from CSV log file instead of run DB"));
+ options.addOption(new Option("e", true, "header error file"));
+ options.addOption(new Option("d", false, "use 0.5 as the nominal svt position (rather than look in run DB for it)"));
+ options.addOption(new Option("z", true, "use zeropoint value from a file"));
+
+
+ final CommandLineParser parser = new PosixParser();
+ CommandLine cl = null;
+ try {
+ cl = parser.parse(options, args);
+ } catch (ParseException e) {
+ throw new RuntimeException("Cannot parse.", e);
+ }
+
+ boolean perRun = cl.hasOption("r");
+ boolean useTI = cl.hasOption("t");
+ boolean useCrawlerTI = cl.hasOption("c");
+ boolean useDefaultNominalSvtPos = cl.hasOption("d");
+
+ Map<Integer, Long> runErrorMap = new HashMap<Integer, Long>();
+ if (cl.hasOption("e")) {
+ try {
+ BufferedReader br = new BufferedReader(new FileReader(cl.getOptionValue("e")));
+ String line;
+ System.err.println("header error file header: " + br.readLine()); //discard the first line
+ while ((line = br.readLine()) != null) {
+ String arr[] = line.split(" +");
+ int run = Integer.parseInt(arr[1]);
+ long errorTime = Long.parseLong(arr[4]);
+ runErrorMap.put(run, errorTime);
+ // System.out.format("%d %d\n", run, errorTime);
+ }
+ } catch (FileNotFoundException ex) {
+ Logger.getLogger(SvtChargeIntegrator.class.getName()).log(Level.SEVERE, null, ex);
+ } catch (IOException ex) {
+ Logger.getLogger(SvtChargeIntegrator.class.getName()).log(Level.SEVERE, null, ex);
+ }
+ }
+ Map<Integer, Double> zeropointMap = new HashMap<Integer, Double>();
+ Map<Integer, Double> attenuationMap = new HashMap<Integer, Double>();
+ if(cl.hasOption("z")){
+ try {
+ BufferedReader br = new BufferedReader(new FileReader(cl.getOptionValue("z")));
+ String line;
+ System.err.println("zero point file header: " + br.readLine()); //discard the first line
+ double zeropoint = 0;
+ double attenuation = 0;
+ while ((line = br.readLine()) != null) {
+ String arr[] = line.split("[ \t]+");
+ int run = Integer.parseInt(arr[0]);
+
+ //if the zero point is unknown (ie, a very short run),
+ // use the zeropoint of the previous run
+ if(Double.parseDouble(arr[1]) != 0)
+ zeropoint = Double.parseDouble(arr[1]);
+ if(arr[2].equals("NaN"))
+ attenuation = Double.NaN;
+ else attenuation = Double.parseDouble(arr[2]);
+
+ zeropointMap.put(run, zeropoint);
+ attenuationMap.put(run, attenuation);
+ // System.out.format("%d %d\n", run, errorTime);
+ }
+ } catch (FileNotFoundException ex) {
+ Logger.getLogger(SvtChargeIntegrator.class.getName()).log(Level.SEVERE, null, ex);
+ } catch (IOException ex) {
+ Logger.getLogger(SvtChargeIntegrator.class.getName()).log(Level.SEVERE, null, ex);
+ }
+ }
+
+ if (cl.getArgs().length != 2) {
+ printUsage(options);
+ return;
+ }
+
+ List<CSVRecord> records = null;
+ try {
+ FileReader reader = new FileReader(cl.getArgs()[0]);
+ final CSVParser csvParser = new CSVParser(reader, CSVFormat.DEFAULT);
+
+ records = csvParser.getRecords();
+
+ csvParser.close();
+ } catch (FileNotFoundException ex) {
+ Logger.getLogger(SvtChargeIntegrator.class.getName()).log(Level.SEVERE, null, ex);
+ } catch (IOException ex) {
+ Logger.getLogger(SvtChargeIntegrator.class.getName()).log(Level.SEVERE, null, ex);
+ }
+
+ SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
+ dateFormat.setTimeZone(TimeZone.getTimeZone("America/New_York"));
+
+ try {
+ BufferedReader br = new BufferedReader(new FileReader(cl.getArgs()[1]));
+ String line;
+ System.err.println("myaData header: " + br.readLine()); //discard the first line
+ if (perRun) {
+ if (cl.hasOption("e")) {
+ System.out.println("run_num\tnominal_position\tnEvents\ttotalQ\ttotalQ_withbias\ttotalQ_atnom\ttotalQ_noerror\tgatedQ\tgatedQ_withbias\tgatedQ_atnom\tgatedQ_noerror\tgoodQ\tgoodQ_withbias\tgoodQ_atnom\tgoodQ_noerror");
+ } else {
+ if (cl.hasOption("z"))
+ System.out.println("run_num\tnominal_position\tnEvents\ttotalQ\ttotalQ_withbias\ttotalQ_atnom\tgatedQ\tgatedQ_withbias\tgatedQ_atnom\tgoodQ\tgoodQ_withbias\tgoodQ_atnom\tzeropoint\tscale");
+ else
+ System.out.println("run_num\tnominal_position\tnEvents\ttotalQ\ttotalQ_withbias\ttotalQ_atnom\tgatedQ\tgatedQ_withbias\tgatedQ_atnom\tgoodQ\tgoodQ_withbias\tgoodQ_atnom");
+ }
+ } else {
+ if (cl.hasOption("e")) {
+ System.out.println("run_num\tfile_num\tnominal_position\tnEvents\ttotalQ\ttotalQ_withbias\ttotalQ_atnom\ttotalQ_noerror\tgatedQ\tgatedQ_withbias\tgatedQ_atnom\tgatedQ_noerror\tgoodQ\tgoodQ_withbias\tgoodQ_atnom\tgoodQ_noerror");
+ } else {
+ if (cl.hasOption("z"))
+ System.out.println("run_num\tfile_num\tnominal_position\tnEvents\ttotalQ\ttotalQ_withbias\ttotalQ_atnom\tgatedQ\tgatedQ_withbias\tgatedQ_atnom\tgoodQ\tgoodQ_withbias\tgoodQ_atnom\tzeropoint\tscale");
+ else
+ System.out.println("run_num\tfile_num\tnominal_position\tnEvents\ttotalQ\ttotalQ_withbias\ttotalQ_atnom\tgatedQ\tgatedQ_withbias\tgatedQ_atnom\tgoodQ\tgoodQ_withbias\tgoodQ_atnom");
+ }
+ }
+
+ int currentRun = 0;
+ double nominalAngleTop = -999;
+ double nominalAngleBottom = -999;
+ String nominalPosition = null;
+ long tiTimeOffset = 0;
+ double efficiency = 0;
+ SvtBiasConstantCollection svtBiasConstants = null;
+ SvtMotorPositionCollection svtPositionConstants = null;
+ SvtAlignmentConstant.SvtAlignmentConstantCollection alignmentConstants = null;
+ Date date = null;
+ Date lastDate;
+
+ for (CSVRecord record : records) {
+ int runNum = Integer.parseInt(record.get(0));
+ if (useCrawlerTI) {
+ if (perRun) {
+ tiTimeOffset = Long.parseLong(record.get(12));
+ } else {
+ tiTimeOffset = Long.parseLong(record.get(8));
+ }
+ if (tiTimeOffset == 0) {
+ continue;
+ }
+ }
+ double zeropoint = zeropointMap.containsKey(runNum) ? zeropointMap.get(runNum) : 0;
+ double attenuation = attenuationMap.containsKey(runNum) ? attenuationMap.get(runNum) : 1;
+
+ if (runNum != currentRun) {
+ if (useTI && !useCrawlerTI) {
+ RunManager.getRunManager().setRun(runNum);
+ if (!RunManager.getRunManager().runExists() || RunManager.getRunManager().getRunSummary().getTiTimeOffset() == null) {
+ continue;
+ }
+ tiTimeOffset = RunManager.getRunManager().getRunSummary().getTiTimeOffset();
+ if (tiTimeOffset == 0) {
+ continue;
+ }
+ }
+
+ try {
+ DatabaseConditionsManager.getInstance().setDetector("HPS-EngRun2015-Nominal-v3", runNum);
+ } catch (Exception ex) {
+ continue;
+ }
+
+ try {
+ svtBiasConstants = DatabaseConditionsManager.getInstance().getCachedConditions(SvtBiasConstant.SvtBiasConstantCollection.class, "svt_bias_constants").getCachedData();
+ } catch (Exception ex) {
+ svtBiasConstants = null;
+ }
+ try {
+ svtPositionConstants = DatabaseConditionsManager.getInstance().getCachedConditions(SvtMotorPosition.SvtMotorPositionCollection.class, "svt_motor_positions").getCachedData();
+ } catch (Exception ex) {
+ svtPositionConstants = null;
+ }
+ if(!useDefaultNominalSvtPos){
+ try {
+ alignmentConstants = DatabaseConditionsManager.getInstance().getCachedConditions(SvtAlignmentConstant.SvtAlignmentConstantCollection.class, "svt_alignments").getCachedData();
+ for (final SvtAlignmentConstant constant : alignmentConstants) {
+ switch (constant.getParameter()) {
+ case 13100:
+ nominalAngleTop = constant.getValue();
+ break;
+ case 23100:
+ nominalAngleBottom = -constant.getValue();
+ break;
+ }
+ }
+ if (Math.abs(nominalAngleBottom) < angleTolerance && Math.abs(nominalAngleTop) < angleTolerance) {
+ nominalPosition = "0pt5";
+ } else if (Math.abs(nominalAngleBottom - 0.0033) < angleTolerance && Math.abs(nominalAngleTop - 0.0031) < angleTolerance) {
+ nominalPosition = "1pt5";
+ } else {
+ nominalPosition = "unknown";
+ }
+ } catch (Exception ex) {
+ alignmentConstants = null;
+ nominalPosition = "unknown";
+ }
+ } else {
+ nominalPosition = "0pt5";
+ nominalAngleTop = 0;
+ nominalAngleBottom = 0;
+ }
+ efficiency = burstModeNoiseEfficiency;
+ SvtTimingConstants svtTimingConstants;
+ try {
+ svtTimingConstants = DatabaseConditionsManager.getInstance().getCachedConditions(SvtTimingConstants.SvtTimingConstantsCollection.class, "svt_timing_constants").getCachedData().get(0);
+ } catch (Exception ex) {
+ svtTimingConstants = null;
+ }
+ if (svtTimingConstants != null) {
+ if (svtTimingConstants.getOffsetTime() > 27) {
+ efficiency *= 2.0 / 3.0; // bad latency: drop 2 out of 6 trigger phases
+ }// otherwise, we have good latency
+ } else {
+ efficiency = 0;
+ }//no latency info in conditions: give up
+ currentRun = runNum;
+ }
+
+ Date startDate, endDate;
+ long firstTime, lastTime;//Unix time from head bank
+ long firstTI, lastTI;//TI timestamp from TI bank
+
+ if (perRun) {
+ firstTime = Long.parseLong(record.get(7));
+ lastTime = Long.parseLong(record.get(8));
+ firstTI = Long.parseLong(record.get(10));
+ lastTI = Long.parseLong(record.get(11));
+
+ } else {
+ firstTime = Long.parseLong(record.get(4));
+ lastTime = Long.parseLong(record.get(5));
+ firstTI = Long.parseLong(record.get(6));
+ lastTI = Long.parseLong(record.get(7));
+ }
+
+ if (useTI) {
+ if (firstTI == 0 || lastTI == 0) {
+ continue;
+ }
+ startDate = new Date((firstTI + tiTimeOffset) / 1000000);
+ endDate = new Date((lastTI + tiTimeOffset) / 1000000);
+ } else {
+ if (firstTime == 0 || lastTime == 0) {
+ continue;
+ }
+ startDate = new Date(firstTime * 1000);
+ endDate = new Date(lastTime * 1000);
+ }
+
+ Long errorTime = runErrorMap.get(runNum);
+ Date errorDate = null;
+ if (errorTime != null) {
+ errorDate = new Date(errorTime / 1000000);
+ boolean isGood = Math.abs(errorDate.getTime() - startDate.getTime()) < 10 * 60 * 60 * 1000; //10 hours
+ if (!isGood && useTI) {
+ errorDate = new Date((errorTime + tiTimeOffset) / 1000000);
+ // boolean isPlusOffsetGood = Math.abs(errorDatePlusOffset.getTime() - startDate.getTime()) < 10 * 60 * 60 * 1000; //10 hours
+ // System.out.format("%d, %d, %d: %s (good: %b), %s (good: %b)\n", runNum, errorTime, tiTimeOffset, errorDate, isGood, errorDatePlusOffset, isPlusOffsetGood);
+ }
+ }
+
+ double totalCharge = 0;
+ double totalChargeWithBias = 0;
+ double totalChargeWithBiasAtNominal = 0;
+ double totalChargeWithBiasAtNominalNoError = 0;
+ double totalGatedCharge = 0;
+ double totalGatedChargeWithBias = 0;
+ double totalGatedChargeWithBiasAtNominal = 0;
+ double totalGatedChargeWithBiasAtNominalNoError = 0;
+ double totalGoodCharge = 0;
+ double totalGoodChargeWithBias = 0;
+ double totalGoodChargeWithBiasAtNominal = 0;
+ double totalGoodChargeWithBiasAtNominalNoError = 0;
+ br.mark(1000);
+
+ //take into account the previous current sample.
+ double prevCurrent = 0;
+ while ((line = br.readLine()) != null) {
+ String arr[] = line.split(" +");
+
+ if (arr.length != 4) {
+ throw new RuntimeException("this line is not correct.");
+ }
+ lastDate = date;
+ date = dateFormat.parse(arr[0] + " " + arr[1]);
+ if (date.before(startDate)) { //not in the file's time range yet; keep reading the file
+ continue;
+ }
+
+ double thisCurrent, livetime;
+ if (arr[2].equals("<undefined>")) {
+ thisCurrent = 0;
+ } else {
+ thisCurrent = Double.parseDouble(arr[2]);
+ }
+ if (arr[3].equals("<undefined>")) {
+ livetime = 0;
+ } else {
+ livetime = Math.min(100.0, Math.max(0.0, Double.parseDouble(arr[3]))) / 100.0;
+ }
+
+ boolean biasGood = false;
+ boolean positionGood = false;
+ SvtBiasConstant biasConstant = null;
+ if (svtBiasConstants != null) {
+ biasConstant = svtBiasConstants.find(date);
+ if (biasConstant == null && lastDate != null) {
+ biasConstant = svtBiasConstants.find(lastDate);
+ }
+ if (biasConstant != null) {
+ biasGood = true;
+ }
+ }
+ SvtMotorPosition positionConstant = null;
+ if (svtPositionConstants != null) {
+ positionConstant = svtPositionConstants.find(date);
+ if (positionConstant == null && lastDate != null) {
+ positionConstant = svtPositionConstants.find(lastDate);
+ }
+ if (positionConstant != null && alignmentConstants != null) {
+ // System.out.format("%f %f %f %f\n", positionConstant.getBottom(), nominalAngleBottom, positionConstant.getTop(), nominalAngleTop);
+ if (Math.abs(positionConstant.getBottom() - nominalAngleBottom) < angleTolerance && Math.abs(positionConstant.getTop() - nominalAngleTop) < angleTolerance) {
+ positionGood = true;
+ }
+ }
+ }
+
+ if (lastDate != null) {
+ double biasDt = 0;
+ double positionDt = 0;
+ long dtStart = Math.max(startDate.getTime(), lastDate.getTime());
+ long dtEnd = Math.min(date.getTime(), endDate.getTime());
+ double dt = (dtEnd - dtStart) / 1000.0;
+ double errorDt = 0;
+ if (biasConstant != null) {
+ long biasStart = Math.max(dtStart, biasConstant.getStart());
+ long biasEnd = Math.min(dtEnd, biasConstant.getEnd());
+ biasDt = Math.max(0, biasEnd - biasStart) / 1000.0;
+ if (positionConstant != null) {
+ long positionStart = Math.max(biasStart, positionConstant.getStart());
+ long positionEnd = Math.min(biasEnd, positionConstant.getEnd());
+ positionDt = Math.max(0, positionEnd - positionStart) / 1000.0;
+
+ long errorEnd = positionStart;
+ if (errorDate == null) {
+ errorEnd = positionEnd;
+ } else if (errorDate.getTime() > dtStart) {
+ errorEnd = Math.min(positionEnd, errorDate.getTime());
+ }
+ errorDt = Math.max(0, errorEnd - positionStart) / 1000.0;
+ }
+ }
+ // System.out.format("start %d end %d date %d lastDate %d current %f dt %f\n", startDate.getTime(), endDate.getTime(), date.getTime(), lastDate.getTime(), current, dt);
+
+ // you should only use the attenuation and zeropoint file when using scalerS2b.
+ // if no file is specified, then attenuation = 1 and zeropoint = 0.
+ double current = (thisCurrent -zeropoint)/attenuation;
+
+
+ totalCharge += dt * current; // nC
+ totalGatedCharge += dt * current * livetime;
+ totalGoodCharge += dt * current * livetime * efficiency;
+ if (biasGood) {
+ totalChargeWithBias += biasDt * current;
+ totalGatedChargeWithBias += biasDt * current * livetime;
+ totalGoodChargeWithBias += biasDt * current * livetime * efficiency;
+ if (positionGood) {
+ totalChargeWithBiasAtNominal += positionDt * current;
+ totalGatedChargeWithBiasAtNominal += positionDt * current * livetime;
+ totalGoodChargeWithBiasAtNominal += positionDt * current * livetime * efficiency;
+
+ totalChargeWithBiasAtNominalNoError += errorDt * current;
+ totalGatedChargeWithBiasAtNominalNoError += errorDt * current * livetime;
+ totalGoodChargeWithBiasAtNominalNoError += errorDt * current * livetime * efficiency;
+ }
+ }
+ prevCurrent = thisCurrent;
+ }
+ if (date.after(endDate)) {//this is the last interval overlapping the file's time range; backtrack so this line will be read again for the next file
+ date = lastDate;
+ try {
+ br.reset();
+ } catch (IOException e) {
+ }
+ break;
+ }
+ br.mark(1000);
+ //current = nextCurrent;
+ }
+ if (perRun) {
+ int nEvents = Integer.parseInt(record.get(9));
+ if (cl.hasOption("e")) {
+ System.out.format("%d\t%s\t%d\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f\n", runNum, nominalPosition, nEvents, totalCharge, totalChargeWithBias, totalChargeWithBiasAtNominal, totalChargeWithBiasAtNominalNoError, totalGatedCharge, totalGatedChargeWithBias, totalGatedChargeWithBiasAtNominal, totalGatedChargeWithBiasAtNominalNoError, totalGoodCharge, totalGoodChargeWithBias, totalGoodChargeWithBiasAtNominal, totalGoodChargeWithBiasAtNominalNoError);
+ } else {
+ if(cl.hasOption("z"))
+ System.out.format("%d\t%s\t%d\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f\n", runNum, nominalPosition, nEvents, totalCharge, totalChargeWithBias, totalChargeWithBiasAtNominal, totalGatedCharge, totalGatedChargeWithBias, totalGatedChargeWithBiasAtNominal, totalGoodCharge, totalGoodChargeWithBias, totalGoodChargeWithBiasAtNominal, zeropoint, attenuation);
+ else
+ System.out.format("%d\t%s\t%d\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f\n", runNum, nominalPosition, nEvents, totalCharge, totalChargeWithBias, totalChargeWithBiasAtNominal, totalGatedCharge, totalGatedChargeWithBias, totalGatedChargeWithBiasAtNominal, totalGoodCharge, totalGoodChargeWithBias, totalGoodChargeWithBiasAtNominal);
+ }
+ } else {
+ int fileNum = Integer.parseInt(record.get(1));
+ int nEvents = Integer.parseInt(record.get(2));
+ if (cl.hasOption("e")) {
+ System.out.format("%d\t%d\t%s\t%d\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f\n", runNum, fileNum, nominalPosition, nEvents, totalCharge, totalChargeWithBias, totalChargeWithBiasAtNominal, totalChargeWithBiasAtNominalNoError, totalGatedCharge, totalGatedChargeWithBias, totalGatedChargeWithBiasAtNominal, totalGatedChargeWithBiasAtNominalNoError, totalGoodCharge, totalGoodChargeWithBias, totalGoodChargeWithBiasAtNominal, totalGoodChargeWithBiasAtNominalNoError);
+ } else {
+ if(cl.hasOption("z"))
+ System.out.format("%d\t%d\t%s\t%d\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f\n", runNum, fileNum, nominalPosition, nEvents, totalCharge, totalChargeWithBias, totalChargeWithBiasAtNominal, totalGatedCharge, totalGatedChargeWithBias, totalGatedChargeWithBiasAtNominal, totalGoodCharge, totalGoodChargeWithBias, totalGoodChargeWithBiasAtNominal, zeropoint, attenuation);
+ else
+ System.out.format("%d\t%d\t%s\t%d\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f\n", runNum, fileNum, nominalPosition, nEvents, totalCharge, totalChargeWithBias, totalChargeWithBiasAtNominal, totalGatedCharge, totalGatedChargeWithBias, totalGatedChargeWithBiasAtNominal, totalGoodCharge, totalGoodChargeWithBias, totalGoodChargeWithBiasAtNominal);
+ }
+ }
+ }
+ } catch (Exception ex) {
+ Logger.getLogger(SvtChargeIntegrator.class.getName()).log(Level.SEVERE, null, ex);
+ }
+
+ }
+
+ private static void printUsage(Options options) {
+ HelpFormatter formatter = new HelpFormatter();
+ System.err.println("SvtChargeIntegrator <CSV log file> <MYA dump file>");
+ formatter.printHelp("Need to adhere to these options", options);
+ }
}
|