Author: [log in to unmask] Date: Sat Mar 7 16:10:48 2015 New Revision: 2359 Log: Merge r2331 through r2358 into prod branch. Added: java/branches/prod/monitoring-drivers/src/main/java/org/hps/monitoring/ecal/plots/EcalEventDisplayWithRawWaveform.java - copied unchanged from r2358, java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/ecal/plots/EcalEventDisplayWithRawWaveform.java java/branches/prod/steering-files/src/main/resources/org/hps/steering/recon/EngineeringRun2015ECalRecon.lcsim - copied unchanged from r2358, java/trunk/steering-files/src/main/resources/org/hps/steering/recon/EngineeringRun2015ECalRecon.lcsim java/branches/prod/steering-files/src/main/resources/org/hps/steering/users/celentan/LedAnalysisFromEvio.lcsim - copied unchanged from r2358, java/trunk/steering-files/src/main/resources/org/hps/steering/users/celentan/LedAnalysisFromEvio.lcsim Removed: java/branches/prod/monitoring-app/src/main/java/org/hps/monitoring/application/model/ConfigurationListener.java java/branches/prod/tracking/src/main/java/org/hps/recon/tracking/SvtSensorSetup.java java/branches/prod/tracking/src/test/java/org/hps/recon/tracking/SvtSensorSetupTest.java Modified: java/branches/prod/ (props changed) java/branches/prod/conditions/src/main/java/org/hps/conditions/cli/CommandLineTool.java java/branches/prod/conditions/src/main/java/org/hps/conditions/cli/PrintCommand.java java/branches/prod/conditions/src/main/java/org/hps/conditions/database/DatabaseConditionsManager.java java/branches/prod/conditions/src/main/java/org/hps/conditions/svt/SvtDetectorSetup.java java/branches/prod/conditions/src/test/java/org/hps/conditions/ConditionsDriverTest.java java/branches/prod/ecal-recon/src/main/java/org/hps/recon/ecal/EcalRawConverter.java java/branches/prod/ecal-recon/src/main/java/org/hps/recon/ecal/EcalRawConverterDriver.java java/branches/prod/ecal-recon/src/test/java/org/hps/recon/ecal/cluster/ClustererTest.java java/branches/prod/monitoring-app/ (props changed) java/branches/prod/monitoring-app/src/main/java/org/hps/monitoring/application/DataSourceComboBox.java java/branches/prod/monitoring-app/src/main/java/org/hps/monitoring/application/MonitoringApplication.java java/branches/prod/monitoring-app/src/main/java/org/hps/monitoring/application/MonitoringApplicationFrame.java java/branches/prod/monitoring-app/src/main/java/org/hps/monitoring/application/model/Configuration.java java/branches/prod/monitoring-app/src/main/java/org/hps/monitoring/application/model/ConfigurationModel.java java/branches/prod/steering-files/src/main/resources/org/hps/steering/analysis/StarterAnalysis.lcsim java/branches/prod/steering-files/src/main/resources/org/hps/steering/monitoring/ECalLedCommissioning.lcsim java/branches/prod/steering-files/src/main/resources/org/hps/steering/monitoring/TriggerDiagnosticsMonitoring.lcsim java/branches/prod/steering-files/src/main/resources/org/hps/steering/readout/HPS2014ReadoutNoPileup.lcsim java/branches/prod/steering-files/src/main/resources/org/hps/steering/readout/HPS2014ReadoutToEvio.lcsim java/branches/prod/steering-files/src/main/resources/org/hps/steering/readout/HPS2014ReadoutToLcio.lcsim java/branches/prod/steering-files/src/main/resources/org/hps/steering/readout/HPS2014TruthReadoutToLcio.lcsim java/branches/prod/steering-files/src/main/resources/org/hps/steering/readout/HPSTrackingDefaults.lcsim java/branches/prod/steering-files/src/main/resources/org/hps/steering/readout/LcioToEvio.lcsim java/branches/prod/steering-files/src/main/resources/org/hps/steering/readout/TestRunNoPileup.lcsim java/branches/prod/steering-files/src/main/resources/org/hps/steering/readout/TestRunReadoutToEvio.lcsim java/branches/prod/steering-files/src/main/resources/org/hps/steering/readout/TestRunReadoutToLcio.lcsim java/branches/prod/steering-files/src/main/resources/org/hps/steering/readout/TestRunReadoutToLcio2014.lcsim java/branches/prod/steering-files/src/main/resources/org/hps/steering/recon/GBLReco.lcsim java/branches/prod/steering-files/src/main/resources/org/hps/steering/recon/HPS2014OfflineNoPileupRecon.lcsim java/branches/prod/steering-files/src/main/resources/org/hps/steering/recon/HPS2014OfflineRecon.lcsim java/branches/prod/steering-files/src/main/resources/org/hps/steering/recon/HPS2014OfflineTruthRecon.lcsim java/branches/prod/steering-files/src/main/resources/org/hps/steering/recon/HPSTrackingDefaultsRecon.lcsim java/branches/prod/steering-files/src/main/resources/org/hps/steering/recon/SimpleMCRecon.lcsim java/branches/prod/steering-files/src/main/resources/org/hps/steering/recon/TestRunOfflineRecon.lcsim java/branches/prod/steering-files/src/main/resources/org/hps/steering/recon/TestRunOfflineReconTwoTrkFilter.lcsim java/branches/prod/steering-files/src/main/resources/org/hps/steering/users/mgraham/AlignmentMonitorTest.lcsim java/branches/prod/steering-files/src/main/resources/org/hps/steering/users/mgraham/MattsScrewAround.lcsim java/branches/prod/steering-files/src/main/resources/org/hps/steering/users/mgraham/NoTimeNoTriggerRecon.lcsim java/branches/prod/users/src/main/java/org/hps/users/celentan/LedAnalysis.java Modified: java/branches/prod/conditions/src/main/java/org/hps/conditions/cli/CommandLineTool.java ============================================================================= --- java/branches/prod/conditions/src/main/java/org/hps/conditions/cli/CommandLineTool.java (original) +++ java/branches/prod/conditions/src/main/java/org/hps/conditions/cli/CommandLineTool.java Sat Mar 7 16:10:48 2015 @@ -4,6 +4,7 @@ import java.util.HashMap; import java.util.Map; import java.util.logging.Level; +import java.util.logging.Logger; import org.apache.commons.cli.CommandLine; import org.apache.commons.cli.HelpFormatter; @@ -13,6 +14,8 @@ import org.apache.commons.cli.PosixParser; import org.hps.conditions.database.DatabaseConditionsManager; import org.lcsim.conditions.ConditionsManager.ConditionsNotFoundException; +import org.lcsim.util.log.DefaultLogFormatter; +import org.lcsim.util.log.LogUtil; /** * <p> @@ -25,6 +28,8 @@ * @author Jeremy McCormick <[log in to unmask]> */ public class CommandLineTool { + + static Logger logger = LogUtil.create(CommandLineTool.class.getSimpleName(), new DefaultLogFormatter(), Level.WARNING); Options options = new Options(); Map<String, AbstractCommand> commands = new HashMap<String, AbstractCommand>(); @@ -42,12 +47,12 @@ printUsage(); exit(0); } - + CommandLine commandLine = null; try { commandLine = parser.parse(options, arguments, true); } catch (ParseException e) { - e.printStackTrace(); + logger.log(Level.SEVERE, "error parsing the options", e); printUsage(); exit(1); } @@ -57,22 +62,29 @@ exit(0); } + // Set verbosity. if (commandLine.hasOption("v")) { + logger.setLevel(Level.ALL); + logger.getHandlers()[0].setLevel(Level.ALL); verbose = true; + logger.config("verbose mode enabled"); } + // Setup conditions manager from command line options. setupConditionsManager(commandLine); + // Get the sub-command to use. String commandName = commandLine.getArgs()[0]; - AbstractCommand command = commands.get(commandName); if (command == null) { throw new IllegalArgumentException("Unknown command " + commandName); } + // Copy remaining arguments for sub-command. String[] commandArguments = new String[commandLine.getArgs().length - 1]; System.arraycopy(commandLine.getArgs(), 1, commandArguments, 0, commandArguments.length); + // Excecute the sub-command. command.setVerbose(verbose); command.execute(commandArguments); } catch (Exception e) { @@ -83,40 +95,64 @@ } } - private void setupConditionsManager(CommandLine commandLine) { + void setupConditionsManager(CommandLine commandLine) { + + logger.info("setting up conditions manager"); + + // Create new manager. conditionsManager = new DatabaseConditionsManager(); - if (verbose) { - conditionsManager.setLogLevel(Level.ALL); - } else { - conditionsManager.setLogLevel(Level.WARNING); - } + + // Set log level. + conditionsManager.setLogLevel(logger.getLevel()); + + // Connection properties. if (commandLine.hasOption("p")) { File connectionPropertiesFile = new File(commandLine.getOptionValue("p")); - if (verbose) - System.out.println("using connection properties file " + connectionPropertiesFile.getPath()); conditionsManager.setConnectionProperties(connectionPropertiesFile); + logger.config("connection properties -p " + connectionPropertiesFile); } + + // XML config. if (commandLine.hasOption("x")) { File xmlConfigFile = new File(commandLine.getOptionValue("x")); conditionsManager.setXmlConfig(xmlConfigFile); - } + logger.config("XML config -x " + xmlConfigFile); + } - String detectorName = null; - if (commandLine.hasOption("d")) { - detectorName = commandLine.getOptionValue("d"); - } else { - throw new RuntimeException("Missing -d argument with name of detector."); - } - int runNumber = 0; - if (commandLine.hasOption("r")) { - runNumber = Integer.parseInt(commandLine.getOptionValue("r")); - } else { - throw new RuntimeException("Missing -r argument with run number."); - } - try { - DatabaseConditionsManager.getInstance().setDetector(detectorName, runNumber); - } catch (ConditionsNotFoundException e) { - throw new RuntimeException(e); + // If there is a run number or detector number then attempt to initialize the conditions system. + if (commandLine.hasOption("r") || commandLine.hasOption("d")) { + + logger.config("detector name or run number supplied so manager will be initialized"); + + // Set detector name. + String detectorName = null; + if (commandLine.hasOption("d")) { + detectorName = commandLine.getOptionValue("d"); + logger.config("detector -d " + detectorName); + } else { + detectorName = "HPS-ECalCommissioning-v2"; + logger.config("default detector " + detectorName + " is being used"); + } + + // Get run number. + Integer run = null; + if (commandLine.hasOption("r")) { + run = Integer.parseInt(commandLine.getOptionValue("r")); + logger.config("run -r " + run); + } else { + run = 0; + logger.config("default run number " + run + " is being used"); + } + + // Setup the conditions manager with user detector name and run number. + try { + logger.config("initializing conditions manager with detector " + detectorName + " and run " + run); + DatabaseConditionsManager.getInstance().setDetector(detectorName, run); + logger.config("conditions manager initialized successfully"); + logger.getHandlers()[0].flush(); + } catch (ConditionsNotFoundException e) { + throw new RuntimeException(e); + } } } @@ -143,10 +179,8 @@ static CommandLineTool create() { CommandLineTool cli = new CommandLineTool(); cli.options.addOption(new Option("h", false, "Print help and exit")); - cli.options.addOption(new Option("d", true, "Set the detector name (required)")); - cli.options.getOption("d").setRequired(true); - cli.options.addOption(new Option("r", true, "Set the run number (required)")); - cli.options.getOption("r").setRequired(true); + cli.options.addOption(new Option("d", true, "Set the detector name")); + cli.options.addOption(new Option("r", true, "Set the run number")); cli.options.addOption(new Option("v", false, "Enable verbose print output")); cli.options.addOption(new Option("p", true, "Set the database connection properties file")); cli.options.addOption(new Option("x", true, "Set the conditions XML configuration file")); @@ -155,4 +189,4 @@ cli.registerCommand(new AddCommand()); return cli; } -} +} Modified: java/branches/prod/conditions/src/main/java/org/hps/conditions/cli/PrintCommand.java ============================================================================= --- java/branches/prod/conditions/src/main/java/org/hps/conditions/cli/PrintCommand.java (original) +++ java/branches/prod/conditions/src/main/java/org/hps/conditions/cli/PrintCommand.java Sat Mar 7 16:10:48 2015 @@ -36,13 +36,16 @@ // Field delimited for print out. char fieldDelimiter = ' '; + // Output file. + File outputFile; + DatabaseConditionsManager conditionsManager; PrintCommand() { super("print", "Print the table data for a conditions set"); this.options.addOption(new Option("t", true, "Set the table name")); this.options.addOption(new Option("i", false, "Print the ID for the records (off by default)")); - this.options.addOption(new Option("f", true, "Write print output to a file")); + this.options.addOption(new Option("f", true, "Write print output to a file (must be used with -t option)")); this.options.addOption(new Option("H", false, "Suppress printing of conditions record and table info")); this.options.addOption(new Option("d", false, "Use tabs for field delimiter instead of spaces")); this.options.addOption(new Option("T", true, "Specify a conditions tag to use for filtering records")); @@ -55,6 +58,10 @@ super.execute(arguments); conditionsManager = DatabaseConditionsManager.getInstance(); + + if (!conditionsManager.isInitialized()) { + throw new RuntimeException("conditions system is not initialized"); + } // User specified tag of conditions records. if (this.commandLine.hasOption("T")) { @@ -68,17 +75,19 @@ } // Setup an output file for the print out if requested. - File outputFile = null; if (this.commandLine.hasOption("f")) { - outputFile = new File(commandLine.getOptionValue("f")); + if (!this.commandLine.hasOption("t")) { + throw new IllegalArgumentException("An output file may only be specified when using the -t option."); + } + String path = commandLine.getOptionValue("f"); + if (new File(path).exists()) { + throw new IllegalArgumentException("File already exists: " + path); + } + outputFile = new File(path); try { ps = new PrintStream(new BufferedOutputStream(new FileOutputStream(outputFile, false))); } catch (FileNotFoundException e) { - throw new RuntimeException(e); - } - if (outputFile.exists()) { - System.err.println("Specified output file already exists."); - System.exit(1); + throw new IllegalArgumentException(e); } } @@ -102,15 +111,14 @@ // Did the user specify a table to use? if (userConditionsKey == null) { - ps.println("printing all conditions"); + System.out.println("printing all conditions"); // Use all table names if there was not one specified. conditionsRecords.addAll(conditionsManager.getConditionsRecords()); } else { - ps.println("printing conditions with name: " + userConditionsKey); + System.out.println("printing conditions with name: " + userConditionsKey); // Get records only for the user specified table name. conditionsRecords.addAll(conditionsManager.findConditionsRecords(userConditionsKey)); } - System.out.println(conditionsRecords.size() + " conditions records found"); // Sort the records by key (table name). conditionsRecords.sortByKey(); @@ -122,15 +130,18 @@ printConditionsRecords(conditionsKeys); ps.flush(); ps.close(); + + if (outputFile != null) { + System.out.println("wrote collection data to file " + outputFile.getPath()); + } } private void printConditionsRecords(Set<String> conditionsKeys) { - ps.print("printing conditions sets: "); + System.out.print("printing conditions sets: "); for (String conditionsKey : conditionsKeys) { - ps.print(conditionsKey + " "); - } - ps.println(); - ps.println(); + System.out.print(conditionsKey + " "); + } + System.out.println(); // Loop over the conditions keys from the conditions records. for (String conditionsKey : conditionsKeys) { @@ -165,8 +176,8 @@ } printColumnNames(collection.getTableMetaData()); printCollection(collection); - ps.println(); - } + System.out.println(); + } ps.flush(); } @@ -180,16 +191,17 @@ buffer.setLength(buffer.length() - 1); buffer.append('\n'); } + buffer.setLength(buffer.length() - 1); ps.print(buffer.toString()); ps.flush(); } private void printCollectionHeader(ConditionsObjectCollection<?> collection) { - ps.println("--------------------------------------"); - ps.print(collection.getConditionsRecord()); - ps.println("--------------------------------------"); - ps.println(); - ps.flush(); + System.out.println("--------------------------------------"); + System.out.print(collection.getConditionsRecord()); + System.out.println("--------------------------------------"); + System.out.println(); + System.out.flush(); } private void printColumnNames(TableMetaData tableMetaData) { Modified: java/branches/prod/conditions/src/main/java/org/hps/conditions/database/DatabaseConditionsManager.java ============================================================================= --- java/branches/prod/conditions/src/main/java/org/hps/conditions/database/DatabaseConditionsManager.java (original) +++ java/branches/prod/conditions/src/main/java/org/hps/conditions/database/DatabaseConditionsManager.java Sat Mar 7 16:10:48 2015 @@ -697,6 +697,13 @@ public Subdetector getEcalSubdetector() { return this.getDetectorObject().getSubdetector(ecalName); } + + /** + * True if conditions manager is properly initialized. + */ + public boolean isInitialized() { + return isInitialized; + } /* ******************************* Modified: java/branches/prod/conditions/src/main/java/org/hps/conditions/svt/SvtDetectorSetup.java ============================================================================= --- java/branches/prod/conditions/src/main/java/org/hps/conditions/svt/SvtDetectorSetup.java (original) +++ java/branches/prod/conditions/src/main/java/org/hps/conditions/svt/SvtDetectorSetup.java Sat Mar 7 16:10:48 2015 @@ -57,12 +57,17 @@ if (enabled) { DatabaseConditionsManager manager = (DatabaseConditionsManager) event.getConditionsManager(); Subdetector subdetector = manager.getDetectorObject().getSubdetector(svtName); - if (manager.isTestRun()) { - TestRunSvtConditions svtConditions = manager.getCachedConditions(TestRunSvtConditions.class, "test_run_svt_conditions").getCachedData(); - loadTestRun(subdetector, svtConditions); + if (subdetector != null) { + if (manager.isTestRun()) { + TestRunSvtConditions svtConditions = manager.getCachedConditions(TestRunSvtConditions.class, "test_run_svt_conditions").getCachedData(); + loadTestRun(subdetector, svtConditions); + } else { + SvtConditions svtConditions = manager.getCachedConditions(SvtConditions.class, "svt_conditions").getCachedData(); + loadDefault(subdetector, svtConditions); + } } else { - SvtConditions svtConditions = manager.getCachedConditions(SvtConditions.class, "svt_conditions").getCachedData(); - loadDefault(subdetector, svtConditions); + logger.warning("no SVT detector was found so SvtDetectorSetup was NOT activated"); + enabled = false; } } else { logger.config("disabled"); Modified: java/branches/prod/conditions/src/test/java/org/hps/conditions/ConditionsDriverTest.java ============================================================================= --- java/branches/prod/conditions/src/test/java/org/hps/conditions/ConditionsDriverTest.java (original) +++ java/branches/prod/conditions/src/test/java/org/hps/conditions/ConditionsDriverTest.java Sat Mar 7 16:10:48 2015 @@ -19,6 +19,8 @@ public class ConditionsDriverTest extends TestCase { public void testConditionsDriverTestRun() throws Exception { + + new DatabaseConditionsManager(); FileCache cache = new FileCache(); File inputFile = cache.getCachedFile(new URL("http://www.lcsim.org/test/hps-java/ConditionsTest.slcio")); Modified: java/branches/prod/ecal-recon/src/main/java/org/hps/recon/ecal/EcalRawConverter.java ============================================================================= --- java/branches/prod/ecal-recon/src/main/java/org/hps/recon/ecal/EcalRawConverter.java (original) +++ java/branches/prod/ecal-recon/src/main/java/org/hps/recon/ecal/EcalRawConverter.java Sat Mar 7 16:10:48 2015 @@ -1,5 +1,7 @@ package org.hps.recon.ecal; +import java.awt.List; +import java.util.ArrayList; import java.util.Map; import org.hps.conditions.database.DatabaseConditionsManager; @@ -16,18 +18,33 @@ /** * This class is used to convert {@link org.lcsim.event.RawCalorimeterHit} - * objects to {@link org.lcsim.event.CalorimeterHit} objects with energy - * information. It has methods to convert pedestal subtracted ADC counts to - * energy. - * - * TODO: Switch all mode's HitDtoAs to use a clipped pedestal for clipped pulses. - * This requires another parameter, the window size. + * and {@link org.lcsim.event.RawTrackerHit} to {@link org.lcsim.event.CalorimeterHit} + * objects with energy information. * * @author Sho Uemura <[log in to unmask]> * @author Jeremy McCormick <[log in to unmask]> * @author Andrea Celentano <[log in to unmask]> - * @author <[log in to unmask]> + * @author Nathan Baltzell <[log in to unmask]> + * + * + * baltzell: New in 2015: (default behavior is still unchanged) + * + * Implemented conversion of Mode-1 to Mode-3. * + * Now using NSA/NSB for pedestal subtraction instead of integralWindow, to allow + * treating all FADC Modes uniformly. (New) NSA+NSB == (Old) integralWindow*4(ns) + * + * Pedestal subtracting clipped pulses more correctly for all Modes. + * + * Changed threshold cut for Mode-1 to >= instead of > to emulate SSP instead of + * FADC firmware for trigger diagnostics. + * + * Implemented finding multiple peaks for Mode-1. + * + * Implemented conversion of Mode-1 to Mode-7 with high-resolution timing. + * Only some of the special cases in the firmware for when this algorithm fails due + * to bad pulses (e.g. clipping) are already implemented. Not yet writing Mode-7's + * min/max to data stream. */ public class EcalRawConverter { @@ -43,23 +60,46 @@ private static final int nsPerSample = 4; /* - * The leading-edge threshold, relative to pedestal, for readout and pulse time - * determination. Units = ADC. This is used to convert mode-1 readout into - * mode-3/7 for clustering. + * The leading-edge threshold, relative to pedestal, for pulse-finding and + * time determination. Units = ADC. Used to convert mode-1 readout into + * mode-3/7 used by clustering. * * The default value of 12 is what we used for most of the 2014 run. */ private double leadingEdgeThreshold=12; /* - * Integration range after (NSA) and before (NSB) threshold crossing. (units = ns) - * These must be multiples of 4 ns. + * Integration range after (NSA) and before (NSB) threshold crossing. Units=ns, + * same as the DAQ configuration files. These must be multiples of 4 ns. Used + * for pulse integration in Mode-1, and pedestal subtraction in all modes. * * The default values of 20/100 are what we had during the entire 2014 run. */ private int NSB=20; private int NSA=100; - + + /* + * The number of samples in the FADC readout window. Needed in order to + * properly pedestal-correct clipped pulses for Mode-3/7. Ignored for + * mode-1 input, since it already knows its number of samples. + * + * A non-positive number disables pulse-clipped pedestals and reverts to + * the old behavior which assumed integration range was constant. + * + */ + private int windowSamples=-1; + + /* + * The maximum number of peaks to be searched for. + */ + private int nPeak=3; + + /* + * Convert Mode-1 into Mode-7, else Mode-3. + */ + private boolean mode7=false; + + private EcalConditions ecalConditions = null; public EcalRawConverter() { @@ -80,7 +120,20 @@ } NSB=nsb; } - + public void setWindowSamples(int windowSamples) { + this.windowSamples=windowSamples; + } + public void setNPeak(int nPeak) { + if (nPeak<1 || nPeak>3) { + throw new RuntimeException("Npeak must be 1, 2, or 3."); + } + this.nPeak=nPeak; + } + public void setMode7(boolean mode7) + { + this.mode7=mode7; + } + public void setGain(double gain) { constantGain = true; this.gain = gain; @@ -93,25 +146,48 @@ public void setUseRunningPedestal(boolean useRunningPedestal) { this.useRunningPedestal=useRunningPedestal; } - + public void setUseTimeWalkCorrection(boolean useTimeWalkCorrection) { this.useTimeWalkCorrection=useTimeWalkCorrection; } - - /* - * NAB 2015/02/11 - * Choose whether to use static pedestal from database or running pedestal. - * This can only used for Mode-7 data. - */ - public double getMode7Pedestal(EventHeader event,RawCalorimeterHit hit) - { - if (useRunningPedestal) { + + /* + * This should probably be deprecated. It just integrates the entire window. + */ + public int sumADC(RawTrackerHit hit) { + EcalChannelConstants channelData = findChannel(hit.getCellID()); + double pedestal = channelData.getCalibration().getPedestal(); + int sum = 0; + short samples[] = hit.getADCValues(); + for (int isample = 0; isample < samples.length; ++isample) { + sum += (samples[isample] - pedestal); + } + return sum; + } + + /* + * This should probably be deprecated. HitDtoA(EventHeader,RawTrackerHit) + * has the same functionality if NSA+NSB > windowSamples, with the exception + * that that one also finds pulse time instead of this one's always reporting zero. + */ + public CalorimeterHit HitDtoA(RawTrackerHit hit) { + double time = hit.getTime(); + long id = hit.getCellID(); + double rawEnergy = adcToEnergy(sumADC(hit), id); + return CalorimeterHitUtilities.create(rawEnergy, time, id); + } + + /* + * Get pedestal for a single ADC sample. + * Choose whether to use static pedestal from database or running pedestal from mode-7. + */ + public double getSingleSamplePedestal(EventHeader event,long cellID) { + if (useRunningPedestal && event!=null) { if (event.hasItem("EcalRunningPedestals")) { Map<EcalChannel, Double> runningPedMap= (Map<EcalChannel, Double>) event.get("EcalRunningPedestals"); - EcalChannel chan = ecalConditions.getChannelCollection(). - findGeometric(hit.getCellID()); + EcalChannel chan = ecalConditions.getChannelCollection().findGeometric(cellID); if (!runningPedMap.containsKey(chan)){ System.err.println("************** Missing Pedestal"); } else { @@ -125,65 +201,39 @@ useRunningPedestal = false; } } - return findChannel(hit.getCellID()).getCalibration().getPedestal(); - } - - public short sumADC(RawTrackerHit hit) { - EcalChannelConstants channelData = findChannel(hit.getCellID()); - double pedestal = channelData.getCalibration().getPedestal(); - short sum = 0; + return findChannel(cellID).getCalibration().getPedestal(); + } + + /* + * Get pedestal for entire pulse integral. Account for clipping if + * windowSamples is greater than zero. + */ + public double getPulsePedestal(EventHeader event,long cellID,int windowSamples,int thresholdCrossing) { + int firstSample,lastSample; + if ( windowSamples>0 && (NSA+NSB)/nsPerSample >= windowSamples ) { + // special case where firmware always integrates entire window + firstSample = 0; + lastSample = windowSamples-1; + } else { + firstSample = thresholdCrossing - NSB/nsPerSample; + lastSample = thresholdCrossing + NSA/nsPerSample-1; + if (windowSamples > 0) { + // properly pedestal subtract pulses clipped by edge(s) of readout window: + if (firstSample < 0) firstSample=0; + if (lastSample >= windowSamples) lastSample=windowSamples-1; + } + } + return (lastSample-firstSample+1)*getSingleSamplePedestal(event,cellID); + } + + + /* + * Emulate the FADC250 firmware emulation Mode-1 waveform to a Mode-3/7 pulse, + * given a time for threshold crossing. + */ + public double[] convertWaveformToPulse(RawTrackerHit hit,int thresholdCrossing,boolean mode7) { short samples[] = hit.getADCValues(); - for (int isample = 0; isample < samples.length; ++isample) { - sum += (samples[isample] - pedestal); - } - return sum; - } - - /* - * This should this be replaced by firmwareHitDtoA, as that has the - * same functionality if NSA+NSB > window size. Left for now. - */ - public CalorimeterHit HitDtoA(RawTrackerHit hit) { - double time = hit.getTime(); - long id = hit.getCellID(); - double rawEnergy = adcToEnergy(sumADC(hit), id); - return CalorimeterHitUtilities.create(rawEnergy, time, id); - } - - /* - * NAB 2015/02/26 - * This HitDtoA is for emulating the conversion of Mode-1 readout (RawTrackerHit) - * into what EcalRawConverter would have created from a Mode-3 readout. - * - */ - public CalorimeterHit firmwareHitDtoA(RawTrackerHit hit) { - - long id = hit.getCellID(); - short samples[] = hit.getADCValues(); - if (samples.length==0) return null; - EcalChannelConstants channelData = findChannel(hit.getCellID()); - double pedestal = channelData.getCalibration().getPedestal(); - double absoluteThreshold = pedestal+leadingEdgeThreshold; - - // find threshold crossing: - int thresholdCrossing = -1; - if (samples[0] > absoluteThreshold) { - // special case, first sample above threshold: - thresholdCrossing=0; - } else { - for (int ii = 1; ii < samples.length; ++ii) { - if ( samples[ii] >absoluteThreshold && - samples[ii-1]<=absoluteThreshold) - { - // found threshold crossing: - thresholdCrossing = ii; - // one pulse only: - break; - } - } - } - if (thresholdCrossing < 0) return null; - + // choose integration range: int firstSample,lastSample; if ((NSA+NSB)/nsPerSample >= samples.length) { @@ -194,43 +244,154 @@ firstSample = thresholdCrossing - NSB/nsPerSample; lastSample = thresholdCrossing + NSA/nsPerSample - 1; } - + + // mode-7 min and max: + double minADC=0; + double maxADC=0; + int sampleMaxADC=0; + // pulse integral: - short sum = 0; + short sumADC = 0; + for (int jj=firstSample; jj<=lastSample; jj++) { + if (jj<0) continue; if (jj>=samples.length) break; - sum += samples[jj]; - } - - // pedestal subtraction: - sum -= pedestal*(NSA+NSB)/nsPerSample; + + // integrate pulse: + sumADC += samples[jj]; + + // compute "minimum" at beginning of window: + if (jj<4) minADC+=samples[jj]; + + // find pulse maximum: + if (jj>firstSample && jj<samples.length-5) { + if (samples[jj+1]<samples[jj]) { + sampleMaxADC=jj; + maxADC=samples[jj]; + } + } + } + + // minADC is the average of first four samples: + minADC/=4; - // conversion of ADC to energy: - double rawEnergy = adcToEnergy(sum, id); - - // pulse time: - double time = thresholdCrossing*nsPerSample; - if (useTimeWalkCorrection) { - time = EcalTimeWalk.correctTimeWalk(time,rawEnergy); - } - - return CalorimeterHitUtilities.create(rawEnergy, time, id); - } - - /* - * This HitDtoA is for Mode-3 data. - * A time-walk correction can be applied. - */ - public CalorimeterHit HitDtoA(RawCalorimeterHit hit, double timeOffset) { + // pulse time with 4ns resolution: + double pulseTime=thresholdCrossing*nsPerSample; + + // calculate Mode-7 high-resolution time: + if (mode7) { + if (thresholdCrossing < 4) { + maxADC=0; + } + else if (maxADC>0) { + // linear interpolation between threshold crossing and + // pulse maximum to find time at pulse half-height: + double t0 = thresholdCrossing*nsPerSample; + double a0 = samples[thresholdCrossing]; + double t1 = sampleMaxADC*nsPerSample; + double a1 = maxADC; + double slope = (a1-a0)/(t1-t0); + double halfMax = (maxADC+minADC)/2; + double tmpTime = t1 - (a1 - halfMax) / slope; + if (slope>0 && tmpTime>0) { + pulseTime = tmpTime; + } + } + } + + return new double []{pulseTime,sumADC,minADC,maxADC}; + } + + + /* + * This HitDtoA is for emulating the conversion of Mode-1 readout (RawTrackerHit) + * into what EcalRawConverter would have created from a Mode-3 or Mode-7 readout. + * Clustering classes will read the resulting CalorimeterHits same as if they were + * directly readout from the FADCs in Mode-3/7. + * + * For Mode-3, hit time is just the time of threshold crossing, with an optional + * time-walk correction. For Mode-7, it is a "high-resolution" one calculated + * by linear interpolation between threshold crossing and pulse maximum. + * + * TODO: Generate GenericObject (and corresponding LCRelation) to store min and max + * to fully emulate mode-7. This is less important for now. + * + * NOTE: March 7, 2015. Threshold crossing requirement currently emulates the current + * SSP firmware (>=) instead of FADC firmware (>) to aid trigger studies. Firmware will + * be changed to make them identical. But for now this code prefers SSP over FADC. + */ + public ArrayList <CalorimeterHit> HitDtoA(EventHeader event,RawTrackerHit hit) { + + final long cellID = hit.getCellID(); + final short samples[] = hit.getADCValues(); + if (samples.length==0) return null; + + // threshold is pedestal plus threshold configuration parameter: + final int absoluteThreshold = (int)(getSingleSamplePedestal(event,cellID)+leadingEdgeThreshold); + + ArrayList <Integer> thresholdCrossings = new ArrayList<Integer>(); + + // special case, first sample is above threshold: + if (samples[0] >= absoluteThreshold) { // SSP/FADC firmware discrepancy. + thresholdCrossings.add(0); + } + + // search for threshold crossings: + for (int ii = 1; ii < samples.length; ++ii) { + if ( samples[ii] >= absoluteThreshold && + samples[ii-1] < absoluteThreshold) // SSP/FADC firmware discrepancy. + { + // found one: + thresholdCrossings.add(ii); + + // search for next threshold crossing begins at end of this pulse: + ii += NSA/nsPerSample-1; + + // firmware limit on # of peaks: + if (thresholdCrossings.size() >= nPeak) break; + } + } + + // make hits + ArrayList <CalorimeterHit> newHits=new ArrayList<CalorimeterHit>(); + for (int thresholdCrossing : thresholdCrossings) { + + // do pulse integral: + final double[] data = convertWaveformToPulse(hit,thresholdCrossing,mode7); + double time = data[0]; + double sum = data[1]; + final double min = data[2]; // TODO: stick min and max in a GenericObject with an + final double max = data[3]; // LCRelation to finish mode-7 emulation + + // do pedestal subtraction: + sum -= getPulsePedestal(event,cellID,samples.length,thresholdCrossing); + + // do gain scaling: + double energy = adcToEnergy(sum, cellID); + + // do time-walk correction, mode-3 only: + if (!mode7 && useTimeWalkCorrection) { + time = EcalTimeWalk.correctTimeWalk(time,energy); + } + + newHits.add(CalorimeterHitUtilities.create(energy,time,cellID)); + } + + return newHits; + } + + /* + * This HitDtoA is for Mode-3 data. A time-walk correction can be applied. + */ + public CalorimeterHit HitDtoA(EventHeader event,RawCalorimeterHit hit, double timeOffset) { if (hit.getTimeStamp() % 64 != 0) { System.out.println("unexpected timestamp " + hit.getTimeStamp()); } double time = hit.getTimeStamp() / 16.0; long id = hit.getCellID(); - EcalChannelConstants channelData = findChannel(id); - int window = (NSA+NSB)/nsPerSample; - double adcSum = hit.getAmplitude() - window * channelData.getCalibration().getPedestal(); + double pedestal = getPulsePedestal(event,id,windowSamples,(int)time/nsPerSample); + double adcSum = hit.getAmplitude() - pedestal; double rawEnergy = adcToEnergy(adcSum, id); if (useTimeWalkCorrection) { time = EcalTimeWalk.correctTimeWalk(time,rawEnergy); @@ -240,15 +401,12 @@ /* * This HitDtoA is exclusively for Mode-7 data, hence the GenericObject parameter. - * The decision to call this method is made in EcalRawConverterDriver based on the - * format of the input EVIO data. EventHeader is also passed in order to allow access - * to running pedestals, which is only applicable to Mode-7 data. (NAB, 2015/02/11) */ public CalorimeterHit HitDtoA(EventHeader event,RawCalorimeterHit hit, GenericObject mode7Data, double timeOffset) { double time = hit.getTimeStamp() / 16.0; //timestamps use the full 62.5 ps resolution long id = hit.getCellID(); - int window = (NSA+NSB)/nsPerSample; - double adcSum = hit.getAmplitude() - window * getMode7Pedestal(event,hit); + double pedestal = getPulsePedestal(event,id,windowSamples,(int)time/nsPerSample); + double adcSum = hit.getAmplitude() - pedestal; double rawEnergy = adcToEnergy(adcSum, id); return CalorimeterHitUtilities.create(rawEnergy, time + timeOffset, id); } @@ -263,11 +421,11 @@ // Get the channel data. EcalChannelConstants channelData = findChannel(id); int amplitude; - int window = (NSA+NSB)/nsPerSample; + double pedestal = getPulsePedestal(null,id,windowSamples,(int)hit.getTime()/nsPerSample); if (constantGain) { - amplitude = (int) Math.round((hit.getRawEnergy() / ECalUtils.MeV) / gain + window * channelData.getCalibration().getPedestal()); + amplitude = (int) Math.round((hit.getRawEnergy() / ECalUtils.MeV) / gain + pedestal); } else { - amplitude = (int) Math.round((hit.getRawEnergy() / ECalUtils.MeV) / channelData.getGain().getGain() + window * channelData.getCalibration().getPedestal()); + amplitude = (int) Math.round((hit.getRawEnergy() / ECalUtils.MeV) / channelData.getGain().getGain() + pedestal); } RawCalorimeterHit h = new BaseRawCalorimeterHit(id, amplitude, time); return h; @@ -314,5 +472,6 @@ */ public EcalChannelConstants findChannel(long cellID) { return ecalConditions.getChannelConstants(ecalConditions.getChannelCollection().findGeometric(cellID)); - } + } + } Modified: java/branches/prod/ecal-recon/src/main/java/org/hps/recon/ecal/EcalRawConverterDriver.java ============================================================================= --- java/branches/prod/ecal-recon/src/main/java/org/hps/recon/ecal/EcalRawConverterDriver.java (original) +++ java/branches/prod/ecal-recon/src/main/java/org/hps/recon/ecal/EcalRawConverterDriver.java Sat Mar 7 16:10:48 2015 @@ -20,15 +20,18 @@ * * @version $Id: HPSEcalRawConverterDriver.java,v 1.2 2012/05/03 00:17:54 * phansson Exp $ - * - * baltzell: Feb 26, 2015: - * added firmware emulation for converting from Mode-1 readout (RawTrackerHit) + * baltzell + * + * + * baltzell New in 2015: (default behavior is unchanged) + * Added firmware emulation for converting from Mode-1 readout (RawTrackerHit) * to Mode-3 pulse (CalorimeterHit). Turn it on with "emulateFirmware", else - * defaults to previous behavior. Removed integralWindow in favor of NSA and - * NSB in EcalRawConverter, so that all conversions can use the same window. - * March 3, 2015: Removed integralWindow in favor of NSA/NSB in order to treat - * all modes uniformly. + * defaults to previous behavior. + * + * Removed integralWindow in favor of NSA/NSB to allow treating all Modes uniformly. + * (New) NSA+NSB == (Old) integralWindow*4(ns) * + * Implemented finding multiple peaks for Mode-1. */ public class EcalRawConverterDriver extends Driver { @@ -41,7 +44,6 @@ private String ecalCollectionName = "EcalCalHits"; private static final String extraDataRelationsName = "EcalReadoutExtraDataRelations"; -// private static final String extraDataCollectionName = "EcalReadoutExtraData"; private boolean debug = false; private double threshold = Double.NEGATIVE_INFINITY; @@ -80,17 +82,26 @@ this.threshold = threshold; } + public void setEmulateMode7(boolean mode7) { + converter.setMode7(mode7); + } public void setEmulateFirmware(boolean emulateFirmware) { this.emulateFirmware = emulateFirmware; } public void setLeadingEdgeThreshold(double threshold) { converter.setLeadingEdgeThreshold(threshold); } + public void setWindowSamples(int windowSamples) { + converter.setWindowSamples(windowSamples); + } public void setNsa(int nsa) { converter.setNSA(nsa); } public void setNsb(int nsb) { converter.setNSB(nsb); + } + public void setNPeak(int nPeak) { + converter.setNPeak(nPeak); } public void setGain(double gain) { @@ -196,37 +207,48 @@ if (!runBackwards) { ArrayList<CalorimeterHit> newHits = new ArrayList<CalorimeterHit>(); - // Get the list of ECal hits. + /* + * This is for FADC Mode-1 data: + */ if (event.hasCollection(RawTrackerHit.class, rawCollectionName)) { List<RawTrackerHit> hits = event.get(RawTrackerHit.class, rawCollectionName); for (RawTrackerHit hit : hits) { - - CalorimeterHit newHit = null; + + ArrayList<CalorimeterHit> newHits2 = new ArrayList<CalorimeterHit>(); if (emulateFirmware) { - newHit = converter.firmwareHitDtoA(hit); - if (newHit==null) continue; + newHits2.addAll(converter.HitDtoA(event,hit)); } else { - newHit = converter.HitDtoA(hit); - } - - - // Get the channel data. - EcalChannelConstants channelData = findChannel(newHit.getCellID()); - - if (applyBadCrystalMap && channelData.isBadChannel()) { - continue; - } - if (dropBadFADC && isBadFADC(newHit)) { - continue; - } - if (newHit.getRawEnergy() > threshold) { - newHits.add(newHit); + newHits2.add(converter.HitDtoA(hit)); + } + + for (CalorimeterHit newHit : newHits2) { + + // Get the channel data. + EcalChannelConstants channelData = findChannel(newHit.getCellID()); + + if (applyBadCrystalMap && channelData.isBadChannel()) { + continue; + } + if (dropBadFADC && isBadFADC(newHit)) { + continue; + } + if (newHit.getRawEnergy() > threshold) { + newHits.add(newHit); + } } } event.put(ecalCollectionName, newHits, CalorimeterHit.class, flags, ecalReadoutName); } - if (event.hasCollection(RawCalorimeterHit.class, rawCollectionName)) { //A.C. this is the case of the RAW pulse hits + + /* + * This is for FADC pulse mode data (Mode-3 or Mode-7): + */ + if (event.hasCollection(RawCalorimeterHit.class, rawCollectionName)) { + + /* + * This is for FADC Mode-7 data: + */ if (event.hasCollection(LCRelation.class, extraDataRelationsName)) { // extra information available from mode 7 readout List<LCRelation> extraDataRelations = event.get(LCRelation.class, extraDataRelationsName); for (LCRelation rel : extraDataRelations) { @@ -252,13 +274,16 @@ } } else { + /* + * This is for FADC Mode-3 data: + */ List<RawCalorimeterHit> hits = event.get(RawCalorimeterHit.class, rawCollectionName); for (RawCalorimeterHit hit : hits) { if (debug) { System.out.format("old hit energy %d\n", hit.getAmplitude()); } CalorimeterHit newHit; - newHit = converter.HitDtoA(hit, timeOffset); + newHit = converter.HitDtoA(event, hit, timeOffset); if (newHit.getRawEnergy() > threshold) { if (applyBadCrystalMap && isBadCrystal(newHit)) { continue; @@ -295,6 +320,7 @@ event.put(rawCollectionName, newHits, RawCalorimeterHit.class, flags, ecalReadoutName); } } + } /** Modified: java/branches/prod/ecal-recon/src/test/java/org/hps/recon/ecal/cluster/ClustererTest.java ============================================================================= --- java/branches/prod/ecal-recon/src/test/java/org/hps/recon/ecal/cluster/ClustererTest.java (original) +++ java/branches/prod/ecal-recon/src/test/java/org/hps/recon/ecal/cluster/ClustererTest.java Sat Mar 7 16:10:48 2015 @@ -494,6 +494,7 @@ public void tearDown() { try { AIDA.defaultInstance().saveAs(testOutputDir.getPath() + File.separator + this.getClass().getSimpleName() + ".aida"); + //AIDA.defaultInstance().saveAs(testOutputDir.getPath() + File.separator + this.getClass().getSimpleName() + ".root"); } catch (IOException e) { throw new RuntimeException(e); } Modified: java/branches/prod/monitoring-app/src/main/java/org/hps/monitoring/application/DataSourceComboBox.java ============================================================================= --- java/branches/prod/monitoring-app/src/main/java/org/hps/monitoring/application/DataSourceComboBox.java (original) +++ java/branches/prod/monitoring-app/src/main/java/org/hps/monitoring/application/DataSourceComboBox.java Sat Mar 7 16:10:48 2015 @@ -11,7 +11,6 @@ import javax.swing.JComboBox; import org.hps.monitoring.application.DataSourceComboBox.DataSourceItem; -import org.hps.monitoring.application.model.ConfigurationListener; import org.hps.monitoring.application.model.ConfigurationModel; import org.hps.monitoring.application.model.ConnectionStatus; import org.hps.monitoring.application.model.ConnectionStatusModel; @@ -28,7 +27,7 @@ * * @author Jeremy McCormick <[log in to unmask]> */ -class DataSourceComboBox extends JComboBox<DataSourceItem> implements PropertyChangeListener, ActionListener, ConfigurationListener { +class DataSourceComboBox extends JComboBox<DataSourceItem> implements PropertyChangeListener, ActionListener{ ConnectionStatusModel connectionModel; ConfigurationModel configurationModel; @@ -65,16 +64,9 @@ setEditable(false); this.configurationModel = configurationModel; connectionModel.addPropertyChangeListener(this); - configurationModel.addConfigurationListener(this); + configurationModel.addPropertyChangeListener(this); } - void setSelectedItem() { - DataSourceItem item = findItem(configurationModel.getDataSourcePath(), getDataSourceType(configurationModel.getDataSourcePath())); - if (item != null) { - setSelectedItem(item); - } - } - boolean contains(DataSourceItem item) { return ((DefaultComboBoxModel<DataSourceItem>) getModel()).getIndexOf(item) != -1; } @@ -91,12 +83,35 @@ setEnabled(false); } } else if (evt.getPropertyName().equals(ConfigurationModel.DATA_SOURCE_PATH_PROPERTY)) { - String path = configurationModel.getDataSourcePath(); - DataSourceType type = getDataSourceType(path); - addDataSourceItem(path, type); - setSelectedItem(); + if (configurationModel.hasValidProperty(ConfigurationModel.DATA_SOURCE_TYPE_PROPERTY)) { + String path = configurationModel.getDataSourcePath(); + DataSourceType type = getDataSourceType(path); + if (type.isFile()) { + DataSourceItem item = findItem(path, type); + if (item == null) { + item = addDataSourceItem(path, type); + } + if (configurationModel.getDataSourceType().isFile()) { + setSelectedItem(item); + } + } + } } else if (evt.getPropertyName().equals(ConfigurationModel.DATA_SOURCE_TYPE_PROPERTY)) { - setSelectedItem(); + if (configurationModel.getDataSourceType() == DataSourceType.ET_SERVER) { + DataSourceItem item = findEtItem(); + if (item == null) { + item = new DataSourceItem(configurationModel.getEtPath(), DataSourceType.ET_SERVER); + } + setSelectedItem(item); + } else { + if (configurationModel.hasValidProperty(ConfigurationModel.DATA_SOURCE_PATH_PROPERTY)) { + DataSourceItem item = findItem(configurationModel.getDataSourcePath(), configurationModel.getDataSourceType()); + if (item == null) { + item = addDataSourceItem(configurationModel.getDataSourcePath(), configurationModel.getDataSourceType()); + } + setSelectedItem(item); + } + } } else if (evt.getPropertyName().equals(ConfigurationModel.HOST_PROPERTY)) { updateEtItem(); } else if (evt.getPropertyName().equals(ConfigurationModel.ET_NAME_PROPERTY)) { @@ -125,46 +140,18 @@ // Update the model with data source settings. configurationModel.removePropertyChangeListener(this); DataSourceItem item = (DataSourceItem) getSelectedItem(); - configurationModel.setDataSourceType(item.type); - if (item.type != DataSourceType.ET_SERVER) { - configurationModel.setDataSourcePath(item.name); + if (item != null) { + configurationModel.setDataSourceType(item.type); + if (item.type != DataSourceType.ET_SERVER) { + configurationModel.setDataSourcePath(item.name); + } } } finally { configurationModel.addPropertyChangeListener(this); } } } - - public void configurationChanged(ConfigurationModel configurationModel) { - - // Clear the data source list. - removeAllItems(); - - // Add the default ET item. - this.removeActionListener(this); - try { - addItem(new DataSourceItem(configurationModel.getEtPath(), DataSourceType.ET_SERVER)); - - // Add a file source if one has been provided. - if (configurationModel.getDataSourcePath() != null) { - // Add an item for this data source. - DataSourceItem newItem = new DataSourceItem(configurationModel.getDataSourcePath(), configurationModel.getDataSourceType()); - //System.out.println("adding new item " + newItem.name + " " + newItem.type); - addItem(newItem); - if (configurationModel.getDataSourceType().isFile()) { - //System.out.println("setting selected"); - setSelectedItem(newItem); - } - } - } finally { - this.addActionListener(this); - } - - // Don't add as property change listener until after configuration has been initialized. - configurationModel.removePropertyChangeListener(this); - configurationModel.addPropertyChangeListener(this); - } - + public void addItem(DataSourceItem item) { // Do not add invalid looking items. if (item.name == null || item.name.length() == 0) { @@ -196,15 +183,19 @@ return null; } - void addDataSourceItem(String path, DataSourceType type) { + DataSourceItem addDataSourceItem(String path, DataSourceType type) { DataSourceItem newItem = new DataSourceItem(path, type); - if (!contains(newItem)) { - addItem(newItem); - } + addItem(newItem); + return newItem; } void updateEtItem() { DataSourceItem item = findEtItem(); - item.name = configurationModel.getEtPath(); + if (item == null) { + item = new DataSourceItem(configurationModel.getEtPath(), DataSourceType.ET_SERVER); + addItem(item); + } else { + item.name = configurationModel.getEtPath(); + } } } Modified: java/branches/prod/monitoring-app/src/main/java/org/hps/monitoring/application/MonitoringApplication.java ============================================================================= --- java/branches/prod/monitoring-app/src/main/java/org/hps/monitoring/application/MonitoringApplication.java (original) +++ java/branches/prod/monitoring-app/src/main/java/org/hps/monitoring/application/MonitoringApplication.java Sat Mar 7 16:10:48 2015 @@ -280,6 +280,10 @@ * @param configuration The new configuration. */ void loadConfiguration(Configuration configuration) { + + // HACK: Clear data source combo box for new config. + frame.dataSourceComboBox.removeAllItems(); + // Set the Configuration on the ConfigurationModel which will trigger all the PropertyChangelListeners. configurationModel.setConfiguration(configuration); if (configuration.getFile() != null) Modified: java/branches/prod/monitoring-app/src/main/java/org/hps/monitoring/application/MonitoringApplicationFrame.java ============================================================================= --- java/branches/prod/monitoring-app/src/main/java/org/hps/monitoring/application/MonitoringApplicationFrame.java (original) +++ java/branches/prod/monitoring-app/src/main/java/org/hps/monitoring/application/MonitoringApplicationFrame.java Sat Mar 7 16:10:48 2015 @@ -120,6 +120,7 @@ // Vertical split pane in left panel. leftSplitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, runPanel, tableTabbedPane); + leftSplitPane.setResizeWeight(0.5); leftPanel.add(leftSplitPane, BorderLayout.CENTER); // Create the right panel. Modified: java/branches/prod/monitoring-app/src/main/java/org/hps/monitoring/application/model/Configuration.java ============================================================================= --- java/branches/prod/monitoring-app/src/main/java/org/hps/monitoring/application/model/Configuration.java (original) +++ java/branches/prod/monitoring-app/src/main/java/org/hps/monitoring/application/model/Configuration.java Sat Mar 7 16:10:48 2015 @@ -75,7 +75,11 @@ * @return True if configuration has value for the key. */ boolean hasKey(String key) { - return properties.getProperty(key) != null; + try { + return properties.containsKey(key); + } catch (java.lang.NullPointerException e) { + return false; + } } /** @@ -164,7 +168,7 @@ * @param key The properties key. * @return True if properties key is valid. */ - private boolean checkKey(String key) { + boolean checkKey(String key) { return hasKey(key) && properties.getProperty(key) != null; } Modified: java/branches/prod/monitoring-app/src/main/java/org/hps/monitoring/application/model/ConfigurationModel.java ============================================================================= --- java/branches/prod/monitoring-app/src/main/java/org/hps/monitoring/application/model/ConfigurationModel.java (original) +++ java/branches/prod/monitoring-app/src/main/java/org/hps/monitoring/application/model/ConfigurationModel.java Sat Mar 7 16:10:48 2015 @@ -1,8 +1,6 @@ package org.hps.monitoring.application.model; import java.io.File; -import java.util.ArrayList; -import java.util.List; import java.util.logging.Level; import org.hps.record.enums.DataSourceType; @@ -16,8 +14,6 @@ public final class ConfigurationModel extends AbstractModel { Configuration configuration; - - List<ConfigurationListener> listeners = new ArrayList<ConfigurationListener>(); // Job setting properties. public static final String DETECTOR_NAME_PROPERTY = "DetectorName"; @@ -69,22 +65,11 @@ fireModelChanged(); } - public void addConfigurationListener(ConfigurationListener listener) { - listeners.add(listener); - } - public void setConfiguration(Configuration configuration) { this.configuration = configuration; fireModelChanged(); - fireConfigurationChanged(); - } - - void fireConfigurationChanged() { - for (ConfigurationListener listener : listeners) { - listener.configurationChanged(this); - } - } - + } + public Configuration getConfiguration() { return this.configuration; } @@ -423,7 +408,7 @@ } public boolean hasValidProperty(String key) { - return configuration.hasKey(key) && configuration.get(key) != null; + return configuration.checkKey(key); } @Override Modified: java/branches/prod/steering-files/src/main/resources/org/hps/steering/analysis/StarterAnalysis.lcsim ============================================================================= --- java/branches/prod/steering-files/src/main/resources/org/hps/steering/analysis/StarterAnalysis.lcsim (original) +++ java/branches/prod/steering-files/src/main/resources/org/hps/steering/analysis/StarterAnalysis.lcsim Sat Mar 7 16:10:48 2015 @@ -6,7 +6,6 @@ xs:noNamespaceSchemaLocation="http://www.lcsim.org/schemas/lcsim/1.0/lcsim.xsd"> <execute> <driver name="EventMarkerDriver"/> - <driver name="SvtSensorSetup" /> <driver name="StarterAnalysisDriver"/> <driver name="AidaSaveDriver"/> </execute> @@ -14,7 +13,6 @@ <driver name="EventMarkerDriver" type="org.lcsim.job.EventMarkerDriver"> <eventInterval>1000</eventInterval> </driver> - <driver name="SvtSensorSetup" type="org.hps.recon.tracking.SvtSensorSetup" /> <driver name="StarterAnalysisDriver" type="org.hps.analysis.examples.StarterAnalysisDriver"> </driver> <driver name="AidaSaveDriver" type="org.lcsim.job.AidaSaveDriver"> Modified: java/branches/prod/steering-files/src/main/resources/org/hps/steering/monitoring/ECalLedCommissioning.lcsim ============================================================================= --- java/branches/prod/steering-files/src/main/resources/org/hps/steering/monitoring/ECalLedCommissioning.lcsim (original) +++ java/branches/prod/steering-files/src/main/resources/org/hps/steering/monitoring/ECalLedCommissioning.lcsim Sat Mar 7 16:10:48 2015 @@ -14,7 +14,7 @@ <driver name="EcalRawConverter" type="org.hps.recon.ecal.EcalRawConverterDriver"> <applyBadCrystalMap>false</applyBadCrystalMap> </driver> - <driver name="EcalEventDisplay" type="org.hps.monitoring.ecal.plots.EcalEventDisplay"> + <driver name="EcalEventDisplay" type="org.hps.monitoring.ecal.plots.EcalEventDisplayWithRawWaveform"> <inputCollection>EcalCalHits</inputCollection> <inputCollectionRaw>EcalReadoutHits</inputCollectionRaw> <inputClusterCollection>EcalClusters</inputClusterCollection> Modified: java/branches/prod/steering-files/src/main/resources/org/hps/steering/monitoring/TriggerDiagnosticsMonitoring.lcsim ============================================================================= --- java/branches/prod/steering-files/src/main/resources/org/hps/steering/monitoring/TriggerDiagnosticsMonitoring.lcsim (original) +++ java/branches/prod/steering-files/src/main/resources/org/hps/steering/monitoring/TriggerDiagnosticsMonitoring.lcsim Sat Mar 7 16:10:48 2015 @@ -32,8 +32,8 @@ <useTimeWalkCorrection>false</useTimeWalkCorrection> <emulateFirmware>true</emulateFirmware> <leadingEdgeThreshold>12</leadingEdgeThreshold> - <nsa>20</nsa> - <nsb>100</nsb> + <nsa>100</nsa> + <nsb>20</nsb> </driver> <driver name="GTPTestDriver" type="org.hps.recon.ecal.cluster.GTPOnlineClusterDriver"> <inputHitCollectionName>EcalCalHits</inputHitCollectionName> Modified: java/branches/prod/steering-files/src/main/resources/org/hps/steering/readout/HPS2014ReadoutNoPileup.lcsim ============================================================================= --- java/branches/prod/steering-files/src/main/resources/org/hps/steering/readout/HPS2014ReadoutNoPileup.lcsim (original) +++ java/branches/prod/steering-files/src/main/resources/org/hps/steering/readout/HPS2014ReadoutNoPileup.lcsim Sat Mar 7 16:10:48 2015 @@ -10,7 +10,6 @@ </control> <execute> <driver name="EventMarkerDriver"/> - <driver name="SvtSensorSetup" /> <driver name="EcalEdepToTriggerConverterDriver"/> <driver name="EcalReadoutConverterDriver"/> <driver name="EcalTriggerClusterer"/> @@ -23,7 +22,6 @@ <driver name="EventMarkerDriver" type="org.lcsim.job.EventMarkerDriver"> <eventInterval>1000</eventInterval> </driver> - <driver name="SvtSensorSetup" type="org.hps.recon.tracking.SvtSensorSetup" /> <driver name="EcalEdepToTriggerConverterDriver" type="org.hps.recon.ecal.EcalEdepToTriggerConverterDriver"> <readoutCollection>EcalReadoutAnalogHits</readoutCollection> <applyBadCrystalMap>false</applyBadCrystalMap> Modified: java/branches/prod/steering-files/src/main/resources/org/hps/steering/readout/HPS2014ReadoutToEvio.lcsim ============================================================================= --- java/branches/prod/steering-files/src/main/resources/org/hps/steering/readout/HPS2014ReadoutToEvio.lcsim (original) +++ java/branches/prod/steering-files/src/main/resources/org/hps/steering/readout/HPS2014ReadoutToEvio.lcsim Sat Mar 7 16:10:48 2015 @@ -10,7 +10,6 @@ </control> <execute> <driver name="EventMarkerDriver"/> - <driver name="SvtSensorSetup" /> <driver name="EcalReadout"/> <driver name="EcalConverter"/> <driver name="EcalClusterer"/> @@ -24,7 +23,6 @@ <driver name="EventMarkerDriver" type="org.lcsim.job.EventMarkerDriver"> <eventInterval>1000</eventInterval> </driver> - <driver name="SvtSensorSetup" type="org.hps.recon.tracking.SvtSensorSetup" /> <driver name="TestRunReconToEvio" type="org.hps.evio.TestRunTriggeredReconToEvio"> <evioOutputFile>${outputFile}.evio</evioOutputFile> </driver> Modified: java/branches/prod/steering-files/src/main/resources/org/hps/steering/readout/HPS2014ReadoutToLcio.lcsim ============================================================================= --- java/branches/prod/steering-files/src/main/resources/org/hps/steering/readout/HPS2014ReadoutToLcio.lcsim (original) +++ java/branches/prod/steering-files/src/main/resources/org/hps/steering/readout/HPS2014ReadoutToLcio.lcsim Sat Mar 7 16:10:48 2015 @@ -9,7 +9,6 @@ </control> <execute> <driver name="EventMarkerDriver" /> - <driver name="SvtSensorSetup" /> <driver name="EcalReadout" /> <driver name="EcalConverter" /> <driver name="EcalClusterer" /> @@ -24,7 +23,6 @@ <driver name="EventMarkerDriver" type="org.lcsim.job.EventMarkerDriver"> <eventInterval>1000</eventInterval> </driver> - <driver name="SvtSensorSetup" type="org.hps.recon.tracking.SvtSensorSetup" /> <driver name="TestRunReconToLcio" type="org.hps.evio.TestRunTriggeredReconToLcio"> <outputFile>${outputFile}.slcio</outputFile> </driver> @@ -64,4 +62,4 @@ <collectionNames>TrackerHits</collectionNames> </driver> </drivers> -</lcsim> +</lcsim> Modified: java/branches/prod/steering-files/src/main/resources/org/hps/steering/readout/HPS2014TruthReadoutToLcio.lcsim ============================================================================= --- java/branches/prod/steering-files/src/main/resources/org/hps/steering/readout/HPS2014TruthReadoutToLcio.lcsim (original) +++ java/branches/prod/steering-files/src/main/resources/org/hps/steering/readout/HPS2014TruthReadoutToLcio.lcsim Sat Mar 7 16:10:48 2015 @@ -11,7 +11,6 @@ </control> <execute> <driver name="EventMarkerDriver"/> - <driver name="SvtSensorSetup" /> <driver name="EcalReadout"/> <driver name="EcalConverter"/> <driver name="EcalClusterer"/> @@ -26,7 +25,6 @@ <driver name="EventMarkerDriver" type="org.lcsim.job.EventMarkerDriver"> <eventInterval>1000</eventInterval> </driver> - <driver name="SvtSensorSetup" type="org.hps.recon.tracking.SvtSensorSetup" /> <driver name="TestRunReconToLcio" type="org.hps.evio.TestRunTriggeredReconToLcio"> <outputFile>${outputFile}.slcio</outputFile> <rejectBackground>true</rejectBackground> Modified: java/branches/prod/steering-files/src/main/resources/org/hps/steering/readout/HPSTrackingDefaults.lcsim ============================================================================= --- java/branches/prod/steering-files/src/main/resources/org/hps/steering/readout/HPSTrackingDefaults.lcsim (original) +++ java/branches/prod/steering-files/src/main/resources/org/hps/steering/readout/HPSTrackingDefaults.lcsim Sat Mar 7 16:10:48 2015 @@ -7,7 +7,6 @@ </control> <execute> <driver name="EventMarkerDriver"/> - <driver name="SvtSensorSetup" /> <driver name="TrackerDigiDriver"/> <driver name="HelicalTrackHitDriver"/> <driver name="TrackerReconDriver"/> @@ -17,7 +16,6 @@ <driver name="EventMarkerDriver" type="org.lcsim.job.EventMarkerDriver"> <eventInterval>1000</eventInterval> </driver> - <driver name="SvtSensorSetup" type="org.hps.recon.tracking.SvtSensorSetup" /> <driver name="TrackerDigiDriver" type="org.hps.recon.tracking.SimpleTrackerDigiDriver"> <!-- <dropBadChannels>true</dropBadChannels>--> <debug>false</debug> Modified: java/branches/prod/steering-files/src/main/resources/org/hps/steering/readout/LcioToEvio.lcsim ============================================================================= --- java/branches/prod/steering-files/src/main/resources/org/hps/steering/readout/LcioToEvio.lcsim (original) +++ java/branches/prod/steering-files/src/main/resources/org/hps/steering/readout/LcioToEvio.lcsim Sat Mar 7 16:10:48 2015 @@ -5,7 +5,6 @@ xs:noNamespaceSchemaLocation="http://www.lcsim.org/schemas/lcsim/1.0/lcsim.xsd"> <execute> <driver name="RawTrackerHitSensorSetup"/> - <driver name="SvtSensorSetup" /> <driver name="DummyTrigger"/> <driver name="TestRunReconToEvio"/> <driver name="ClockDriver"/> @@ -13,7 +12,6 @@ <drivers> <driver name="RawTrackerHitSensorSetup" type="org.lcsim.recon.tracking.digitization.sisim.config.RawTrackerHitSensorSetup"/> - <driver name="SvtSensorSetup" type="org.hps.recon.tracking.SvtSensorSetup" /> <driver name="DummyTrigger" type="org.hps.readout.ecal.DummyTriggerDriver"> <period>1</period> <deadTime>0</deadTime> Modified: java/branches/prod/steering-files/src/main/resources/org/hps/steering/readout/TestRunNoPileup.lcsim ============================================================================= --- java/branches/prod/steering-files/src/main/resources/org/hps/steering/readout/TestRunNoPileup.lcsim (original) +++ java/branches/prod/steering-files/src/main/resources/org/hps/steering/readout/TestRunNoPileup.lcsim Sat Mar 7 16:10:48 2015 @@ -6,7 +6,6 @@ </control> <execute> <driver name="EventMarkerDriver"/> - <driver name="SvtSensorSetup" /> <driver name="EcalRawConverter"/> <driver name="EcalRawConverterDriver"/> <driver name="EcalTriggerFilter"/> @@ -20,7 +19,6 @@ <driver name="EventMarkerDriver" type="org.lcsim.job.EventMarkerDriver"> <eventInterval>1000</eventInterval> </driver> - <driver name="SvtSensorSetup" type="org.hps.recon.tracking.SvtSensorSetup" /> <driver name="EcalRawConverter" type="org.hps.recon.ecal.EcalEdepToTriggerConverterDriver"> <readoutCollection>EcalReadoutAnalogHits</readoutCollection> </driver> Modified: java/branches/prod/steering-files/src/main/resources/org/hps/steering/readout/TestRunReadoutToEvio.lcsim ============================================================================= --- java/branches/prod/steering-files/src/main/resources/org/hps/steering/readout/TestRunReadoutToEvio.lcsim (original) +++ java/branches/prod/steering-files/src/main/resources/org/hps/steering/readout/TestRunReadoutToEvio.lcsim Sat Mar 7 16:10:48 2015 @@ -5,7 +5,6 @@ xs:noNamespaceSchemaLocation="http://www.lcsim.org/schemas/lcsim/1.0/lcsim.xsd"> <execute> <driver name="EventMarkerDriver"/> - <driver name="SvtSensorSetup" /> <driver name="BadChannelFilter" /> <driver name="EcalReadout"/> <driver name="EcalConverter"/> @@ -21,7 +20,6 @@ <driver name="EventMarkerDriver" type="org.lcsim.job.EventMarkerDriver"> <eventInterval>1000</eventInterval> </driver> - <driver name="SvtSensorSetup" type="org.hps.recon.tracking.SvtSensorSetup" /> <driver name="BadChannelFilter" type="org.hps.recon.tracking.SVTBadChannelFilterDriver" /> <driver name="EcalReadout" type="org.hps.readout.ecal.FADCEcalReadoutDriver"> <coincidenceWindow>8</coincidenceWindow> Modified: java/branches/prod/steering-files/src/main/resources/org/hps/steering/readout/TestRunReadoutToLcio.lcsim ============================================================================= --- java/branches/prod/steering-files/src/main/resources/org/hps/steering/readout/TestRunReadoutToLcio.lcsim (original) +++ java/branches/prod/steering-files/src/main/resources/org/hps/steering/readout/TestRunReadoutToLcio.lcsim Sat Mar 7 16:10:48 2015 @@ -4,7 +4,6 @@ <lcsim xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xs:noNamespaceSchemaLocation="http://www.lcsim.org/schemas/lcsim/1.0/lcsim.xsd"> <execute> <driver name="EventMarkerDriver" /> - <driver name="SvtSensorSetup" /> <driver name="BadChannelFilter" /> <driver name="EcalReadout" /> <driver name="EcalConverter" /> @@ -20,7 +19,6 @@ <driver name="EventMarkerDriver" type="org.lcsim.job.EventMarkerDriver"> <eventInterval>1000</eventInterval> </driver> - <driver name="SvtSensorSetup" type="org.hps.recon.tracking.SvtSensorSetup" /> <driver name="BadChannelFilter" type="org.hps.recon.tracking.SVTBadChannelFilterDriver" /> <driver name="EcalReadout" type="org.hps.readout.ecal.FADCEcalReadoutDriver"> <coincidenceWindow>8</coincidenceWindow> @@ -67,4 +65,4 @@ <collectionNames>TrackerHits</collectionNames> </driver> </drivers> -</lcsim> +</lcsim> Modified: java/branches/prod/steering-files/src/main/resources/org/hps/steering/readout/TestRunReadoutToLcio2014.lcsim ============================================================================= --- java/branches/prod/steering-files/src/main/resources/org/hps/steering/readout/TestRunReadoutToLcio2014.lcsim (original) +++ java/branches/prod/steering-files/src/main/resources/org/hps/steering/readout/TestRunReadoutToLcio2014.lcsim Sat Mar 7 16:10:48 2015 @@ -7,7 +7,6 @@ <driver name="ConditionsDriver"/> --> <driver name="EventMarkerDriver" /> - <driver name="SvtSensorSetup" /> <driver name="BadChannelFilter" /> <driver name="EcalReadout" /> <driver name="EcalConverter" /> @@ -30,7 +29,6 @@ <driver name="EventMarkerDriver" type="org.lcsim.job.EventMarkerDriver"> <eventInterval>1000</eventInterval> </driver> - <driver name="SvtSensorSetup" type="org.hps.recon.tracking.SvtSensorSetup" /> <driver name="BadChannelFilter" type="org.hps.recon.tracking.SVTBadChannelFilterDriver" /> <driver name="EcalReadout" type="org.hps.readout.ecal.FADCEcalReadoutDriver"> <coincidenceWindow>8</coincidenceWindow> @@ -77,4 +75,4 @@ <collectionNames>TrackerHits</collectionNames> </driver> </drivers> -</lcsim> +</lcsim> Modified: java/branches/prod/steering-files/src/main/resources/org/hps/steering/recon/GBLReco.lcsim ============================================================================= --- java/branches/prod/steering-files/src/main/resources/org/hps/steering/recon/GBLReco.lcsim (original) +++ java/branches/prod/steering-files/src/main/resources/org/hps/steering/recon/GBLReco.lcsim Sat Mar 7 16:10:48 2015 @@ -6,7 +6,6 @@ </control> <execute> <driver name="EventMarkerDriver" /> - <driver name="SvtSensorSetup" /> <driver name="RawTrackerHitSensorSetup" /> <driver name="BadChannelFilter" /> <driver name="RawTrackerHitFitterDriver" /> @@ -28,7 +27,6 @@ <gblFileName>gblinput.txt</gblFileName> </driver> <driver name="ConditionsDriver" type="org.hps.conditions.ConditionsDriver" /> - <driver name="SvtSensorSetup" type="org.hps.recon.tracking.SvtSensorSetup" /> <!-- Reconstruction drivers below --> <driver name="RawTrackerHitSensorSetup" type="org.lcsim.recon.tracking.digitization.sisim.config.RawTrackerHitSensorSetup" /> @@ -62,4 +60,4 @@ </driver> <driver name="CleanupDriver" type="org.lcsim.recon.tracking.digitization.sisim.config.ReadoutCleanupDriver" /> </drivers> -</lcsim> +</lcsim> Modified: java/branches/prod/steering-files/src/main/resources/org/hps/steering/recon/HPS2014OfflineNoPileupRecon.lcsim ============================================================================= --- java/branches/prod/steering-files/src/main/resources/org/hps/steering/recon/HPS2014OfflineNoPileupRecon.lcsim (original) +++ java/branches/prod/steering-files/src/main/resources/org/hps/steering/recon/HPS2014OfflineNoPileupRecon.lcsim Sat Mar 7 16:10:48 2015 @@ -7,7 +7,6 @@ xs:noNamespaceSchemaLocation="http://www.lcsim.org/schemas/lcsim/1.0/lcsim.xsd"> <execute> <driver name="EventMarkerDriver"/> - <driver name="SvtSensorSetup" /> <driver name="RawTrackerHitSensorSetup"/> <driver name="RawTrackerHitFitterDriver" /> <driver name="TrackerHitDriver"/> @@ -25,7 +24,6 @@ <driver name="EventMarkerDriver" type="org.lcsim.job.EventMarkerDriver"> <eventInterval>1000</eventInterval> </driver> - <driver name="SvtSensorSetup" type="org.hps.recon.tracking.SvtSensorSetup" /> <driver name="RawTrackerHitSensorSetup" type="org.lcsim.recon.tracking.digitization.sisim.config.RawTrackerHitSensorSetup"/> <driver name="RawTrackerHitFitterDriver" type="org.hps.recon.tracking.RawTrackerHitFitterDriver"> <fitAlgorithm>Analytic</fitAlgorithm> Modified: java/branches/prod/steering-files/src/main/resources/org/hps/steering/recon/HPS2014OfflineRecon.lcsim ============================================================================= --- java/branches/prod/steering-files/src/main/resources/org/hps/steering/recon/HPS2014OfflineRecon.lcsim (original) +++ java/branches/prod/steering-files/src/main/resources/org/hps/steering/recon/HPS2014OfflineRecon.lcsim Sat Mar 7 16:10:48 2015 @@ -6,7 +6,6 @@ xs:noNamespaceSchemaLocation="http://www.lcsim.org/schemas/lcsim/1.0/lcsim.xsd"> <execute> <driver name="EventMarkerDriver"/> - <driver name="SvtSensorSetup" /> <driver name="RawTrackerHitSensorSetup"/> <driver name="RawTrackerHitFitterDriver" /> <driver name="TrackerHitDriver"/> @@ -21,7 +20,6 @@ <driver name="CleanupDriver"/> </execute> <drivers> - <driver name="SvtSensorSetup" type="org.hps.recon.tracking.SvtSensorSetup" /> <driver name="EventMarkerDriver" type="org.lcsim.job.EventMarkerDriver"> <eventInterval>1000</eventInterval> </driver> Modified: java/branches/prod/steering-files/src/main/resources/org/hps/steering/recon/HPS2014OfflineTruthRecon.lcsim ============================================================================= --- java/branches/prod/steering-files/src/main/resources/org/hps/steering/recon/HPS2014OfflineTruthRecon.lcsim (original) +++ java/branches/prod/steering-files/src/main/resources/org/hps/steering/recon/HPS2014OfflineTruthRecon.lcsim Sat Mar 7 16:10:48 2015 @@ -7,7 +7,6 @@ xs:noNamespaceSchemaLocation="http://www.lcsim.org/schemas/lcsim/1.0/lcsim.xsd"> <execute> <driver name="EventMarkerDriver"/> - <driver name="SvtSensorSetup" /> <driver name="RawTrackerHitSensorSetup"/> <driver name="RawTrackerHitFitterDriver" /> <driver name="TrackerHitDriver"/> @@ -22,7 +21,6 @@ <driver name="CleanupDriver"/> </execute> <drivers> - <driver name="SvtSensorSetup" type="org.hps.recon.tracking.SvtSensorSetup" /> <driver name="EventMarkerDriver" type="org.lcsim.job.EventMarkerDriver"> <eventInterval>1000</eventInterval> </driver> Modified: java/branches/prod/steering-files/src/main/resources/org/hps/steering/recon/HPSTrackingDefaultsRecon.lcsim ============================================================================= --- java/branches/prod/steering-files/src/main/resources/org/hps/steering/recon/HPSTrackingDefaultsRecon.lcsim (original) +++ java/branches/prod/steering-files/src/main/resources/org/hps/steering/recon/HPSTrackingDefaultsRecon.lcsim Sat Mar 7 16:10:48 2015 @@ -6,7 +6,6 @@ </control> <execute> <driver name="EventMarkerDriver"/> - <driver name="SvtSensorSetup" /> <driver name="RawTrackerHitSensorSetup"/> <driver name="SVTBadChannelFilterDriver"/> <driver name="RawTrackerHitFitterDriver" /> @@ -20,7 +19,6 @@ <driver name="EventMarkerDriver" type="org.lcsim.job.EventMarkerDriver"> <eventInterval>1000</eventInterval> </driver> - <driver name="SvtSensorSetup" type="org.hps.recon.tracking.SvtSensorSetup" /> <driver name="SVTBadChannelFilterDriver" type="org.hps.recon.tracking.SVTBadChannelFilterDriver"/> <driver name="RawTrackerHitSensorSetup" type="org.lcsim.recon.tracking.digitization.sisim.config.RawTrackerHitSensorSetup"/> <driver name="RawTrackerHitFitterDriver" type="org.hps.recon.tracking.RawTrackerHitFitterDriver"> Modified: java/branches/prod/steering-files/src/main/resources/org/hps/steering/recon/SimpleMCRecon.lcsim ============================================================================= --- java/branches/prod/steering-files/src/main/resources/org/hps/steering/recon/SimpleMCRecon.lcsim (original) +++ java/branches/prod/steering-files/src/main/resources/org/hps/steering/recon/SimpleMCRecon.lcsim Sat Mar 7 16:10:48 2015 @@ -15,8 +15,6 @@ <execute> <!-- Print out event numbers. --> <driver name="EventMarkerDriver"/> - <!-- Setup the SVT sensors. --> - <driver name="SvtSensorSetup" /> <!-- Simple tracker hit digi. --> <driver name="TrackerDigiDriver"/> <!-- Create tracker hits. --> @@ -36,7 +34,6 @@ <driver name="EventMarkerDriver" type="org.lcsim.job.EventMarkerDriver"> <eventInterval>10</eventInterval> </driver> - <driver name="SvtSensorSetup" type="org.hps.recon.tracking.SvtSensorSetup" /> <driver name="TrackerDigiDriver" type="org.hps.recon.tracking.SimpleTrackerDigiDriver"> <debug>false</debug> </driver> @@ -59,4 +56,4 @@ </driver> <driver name="CleanupDriver" type="org.lcsim.recon.tracking.digitization.sisim.config.ReadoutCleanupDriver"/> </drivers> -</lcsim> +</lcsim> Modified: java/branches/prod/steering-files/src/main/resources/org/hps/steering/recon/TestRunOfflineRecon.lcsim ============================================================================= --- java/branches/prod/steering-files/src/main/resources/org/hps/steering/recon/TestRunOfflineRecon.lcsim (original) +++ java/branches/prod/steering-files/src/main/resources/org/hps/steering/recon/TestRunOfflineRecon.lcsim Sat Mar 7 16:10:48 2015 @@ -5,7 +5,6 @@ <lcsim xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xs:noNamespaceSchemaLocation="http://www.lcsim.org/schemas/lcsim/1.0/lcsim.xsd"> <execute> <driver name="EventMarkerDriver" /> - <driver name="SvtSensorSetup" /> <driver name="RawTrackerHitSensorSetup" /> <driver name="BadChannelFilter" /> <driver name="RawTrackerHitFitterDriver" /> @@ -20,7 +19,6 @@ <driver name="CleanupDriver" /> </execute> <drivers> - <driver name="SvtSensorSetup" type="org.hps.recon.tracking.SvtSensorSetup" /> <driver name="EventMarkerDriver" type="org.lcsim.job.EventMarkerDriver"> <eventInterval>100</eventInterval> </driver> @@ -53,4 +51,4 @@ </driver> <driver name="CleanupDriver" type="org.lcsim.recon.tracking.digitization.sisim.config.ReadoutCleanupDriver" /> </drivers> -</lcsim> +</lcsim> Modified: java/branches/prod/steering-files/src/main/resources/org/hps/steering/recon/TestRunOfflineReconTwoTrkFilter.lcsim ============================================================================= --- java/branches/prod/steering-files/src/main/resources/org/hps/steering/recon/TestRunOfflineReconTwoTrkFilter.lcsim (original) +++ java/branches/prod/steering-files/src/main/resources/org/hps/steering/recon/TestRunOfflineReconTwoTrkFilter.lcsim Sat Mar 7 16:10:48 2015 @@ -1,7 +1,6 @@ <lcsim xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xs:noNamespaceSchemaLocation="http://www.lcsim.org/schemas/lcsim/1.0/lcsim.xsd"> <execute> <driver name="EventMarkerDriver" /> - <driver name="SvtSensorSetup" /> <driver name="RawTrackerHitSensorSetup" /> <driver name="RawTrackerHitFitterDriver" /> <driver name="TrackerHitDriver" /> @@ -13,7 +12,6 @@ <driver name="CleanupDriver" /> </execute> <drivers> - <driver name="SvtSensorSetup" type="org.hps.recon.tracking.SvtSensorSetup" /> <driver name="EventMarkerDriver" type="org.lcsim.job.EventMarkerDriver"> <eventInterval>1000</eventInterval> </driver> @@ -43,4 +41,4 @@ </driver> <driver name="CleanupDriver" type="org.lcsim.recon.tracking.digitization.sisim.config.ReadoutCleanupDriver" /> </drivers> -</lcsim> +</lcsim> Modified: java/branches/prod/steering-files/src/main/resources/org/hps/steering/users/mgraham/AlignmentMonitorTest.lcsim ============================================================================= --- java/branches/prod/steering-files/src/main/resources/org/hps/steering/users/mgraham/AlignmentMonitorTest.lcsim (original) +++ java/branches/prod/steering-files/src/main/resources/org/hps/steering/users/mgraham/AlignmentMonitorTest.lcsim Sat Mar 7 16:10:48 2015 @@ -5,7 +5,6 @@ <lcsim xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xs:noNamespaceSchemaLocation="http://www.lcsim.org/schemas/lcsim/1.0/lcsim.xsd"> <execute> <driver name="EventMarkerDriver" /> - <driver name="SvtSensorSetup" /> <driver name="TrackerDigiDriver"/> <!-- the 3 drivers below are for reading out 6-sample ADC data --> <!-- <driver name="RawTrackerHitSensorSetup" /> @@ -31,7 +30,6 @@ <driver name="CleanupDriver" /> </execute> <drivers> - <driver name="SvtSensorSetup" type="org.hps.recon.tracking.SvtSensorSetup" /> <driver name="ConditionsDriver" type="org.hps.conditions.ConditionsDriver" /> <driver name="EventMarkerDriver" type="org.lcsim.job.EventMarkerDriver"> <eventInterval>10</eventInterval> @@ -126,4 +124,4 @@ </driver> <driver name="CleanupDriver" type="org.lcsim.recon.tracking.digitization.sisim.config.ReadoutCleanupDriver" /> </drivers> -</lcsim> +</lcsim> Modified: java/branches/prod/steering-files/src/main/resources/org/hps/steering/users/mgraham/MattsScrewAround.lcsim ============================================================================= --- java/branches/prod/steering-files/src/main/resources/org/hps/steering/users/mgraham/MattsScrewAround.lcsim (original) +++ java/branches/prod/steering-files/src/main/resources/org/hps/steering/users/mgraham/MattsScrewAround.lcsim Sat Mar 7 16:10:48 2015 @@ -5,7 +5,6 @@ <lcsim xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xs:noNamespaceSchemaLocation="http://www.lcsim.org/schemas/lcsim/1.0/lcsim.xsd"> <execute> <driver name="EventMarkerDriver" /> - <driver name="SvtSensorSetup" /> <driver name="RawTrackerHitSensorSetup" /> <driver name="RawTrackerHitFitterDriver" /> <driver name="TrackerHitDriver" /> @@ -26,7 +25,6 @@ <driver name="CleanupDriver" /> </execute> <drivers> - <driver name="SvtSensorSetup" type="org.hps.recon.tracking.SvtSensorSetup" /> <driver name="ConditionsDriver" type="org.hps.conditions.ConditionsDriver" /> <driver name="EventMarkerDriver" type="org.lcsim.job.EventMarkerDriver"> <eventInterval>10</eventInterval> @@ -105,4 +103,4 @@ </driver> <driver name="CleanupDriver" type="org.lcsim.recon.tracking.digitization.sisim.config.ReadoutCleanupDriver" /> </drivers> -</lcsim> +</lcsim> Modified: java/branches/prod/steering-files/src/main/resources/org/hps/steering/users/mgraham/NoTimeNoTriggerRecon.lcsim ============================================================================= --- java/branches/prod/steering-files/src/main/resources/org/hps/steering/users/mgraham/NoTimeNoTriggerRecon.lcsim (original) +++ java/branches/prod/steering-files/src/main/resources/org/hps/steering/users/mgraham/NoTimeNoTriggerRecon.lcsim Sat Mar 7 16:10:48 2015 @@ -6,7 +6,6 @@ </control> <execute> <driver name="EventMarkerDriver"/> - <driver name="SvtSensorSetup"/> <driver name="TrackerDigiDriver"/> <driver name="EcalEdepToTriggerConverterDriver"/> <driver name="EcalReadoutConverterDriver"/> @@ -55,7 +54,6 @@ <writeRejectedHitCollection>false</writeRejectedHitCollection> </driver> - <driver name="SvtSensorSetup" type="org.hps.recon.tracking.SvtSensorSetup" /> <driver name="TrackerDigiDriver" type="org.hps.recon.tracking.SimpleTrackerDigiDriver"> <!-- <dropBadChannels>true</dropBadChannels> --> <rawTrackerHitOutputCollectionName>SVTRawTrackerHits</rawTrackerHitOutputCollectionName> @@ -129,4 +127,4 @@ <driver name="CleanupDriver" type="org.lcsim.recon.tracking.digitization.sisim.config.ReadoutCleanupDriver"/> </drivers> -</lcsim> +</lcsim> Modified: java/branches/prod/users/src/main/java/org/hps/users/celentan/LedAnalysis.java ============================================================================= --- java/branches/prod/users/src/main/java/org/hps/users/celentan/LedAnalysis.java (original) +++ java/branches/prod/users/src/main/java/org/hps/users/celentan/LedAnalysis.java Sat Mar 7 16:10:48 2015 @@ -3,6 +3,7 @@ import hep.aida.ICloud1D; import hep.aida.IHistogram1D; +import hep.aida.IHistogram2D; import hep.aida.IProfile1D; import hep.aida.ITuple; import hep.aida.IFunction; @@ -10,11 +11,14 @@ import hep.aida.IFitter; import hep.aida.IFitResult; import hep.aida.IFunctionFactory; - - - - - +import hep.aida.IPlotterStyle; + + + + +import javax.swing.JOptionPane; + +import java.io.Console; import java.sql.SQLException; import java.util.ArrayList; import java.util.HashMap; @@ -48,443 +52,488 @@ * @author Andrea Celentano <[log in to unmask]> */ public class LedAnalysis extends Driver{ - - private static final int NUM_CHANNELS = 11 * 47; - - String inputCollectionRaw = "EcalReadoutHits"; - String inputCollection = "EcalCalHits"; - AIDA aida; - - DatabaseConditionsManager conditionsManager; - - private EcalChannelCollection ChannelCollection; + + private static final int NUM_CHANNELS = 11 * 47; + + String inputCollectionRaw = "EcalReadoutHits"; + String inputCollection = "EcalCalHits"; + AIDA aida; + + DatabaseConditionsManager conditionsManager; + + private EcalChannelCollection ChannelCollection; private EcalLedCollection LedCollection; private EcalConditions ecalConditions; - + Map < Integer,Integer > LedTopMap; Map < Integer,Integer > LedBotMap; - + private boolean useRawEnergy=false; - + private static final String dbTag = "led"; private static final String dbTableName = "ecal_led_calibrations"; private static final int runNumberMax = 9999; - private static final int nDrivers = 8; - private static final int nSteps = 56; - - private int runNumber = 0; - private int eventN = 0; + private static final int nDrivers = 8; + private static final int nSteps = 56; + + private int runNumber = 0; + private int eventN = 0; private int id,row,column,chid,ledid,driverid; - private int[][] LEDStep = new int[][]{ - //first 4 are the flasher1 sequence, TOP controller - {2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,434,44,45,46,47,48,49,50,51,52,53,54,55,56,-1}, - {57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,-1}, - {112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,136,137,138,130,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168}, //missing 135 is ok - {169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,-1}, - //second 4 are the flasher2 sequence, BOTTOM controller - {2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,434,44,45,46,47,48,49,50,51,52,53,54,55,56,-1}, - {57,58,59,60,61,62,63,64,65,66,67,68,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113}, //missing 69 is OK - {114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,130,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,-1}, - {169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,-1}, - }; - - private int[] iStep = new int[nDrivers]; - private int[] nEvents = new int[NUM_CHANNELS]; - - private double energy,rawEnergy; - private long cellID; - //Histograms-functions-ntuples - private ArrayList<ITuple> iTuple; - private ArrayList<IProfile1D> cProfile; - private ArrayList<IFunction> fFunction; - private ArrayList<IFunction> fFunction1; - private ArrayList<IHistogram1D> hCharge; + private int[][] LEDStep = new int[][]{ + //first 4 are the flasher1 sequence, TOP controller + {2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,-1,-1}, + {56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111}, + {112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,-1}, //missing 135 is ok + {168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223}, + //second 4 are the flasher2 sequence, BOTTOM controller + {2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,-1,-1}, + {56,57,58,59,60,61,62,63,64,65,66,67,68,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,-1}, //missing 69 is OK + {112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167}, + {168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223}, + }; + + private int[] iStep = new int[nDrivers]; + private int[] nEvents = new int[NUM_CHANNELS]; + + private double energy,fillEnergy,fillTime; + private long cellID; + //Histograms-functions-ntuples + private ArrayList<ITuple> iTuple; + private ArrayList<IProfile1D> cProfile; + private ArrayList<IFunction> fFunction; + private ArrayList<IFunction> fFunction1; + private ArrayList<IHistogram1D> hCharge; + private ArrayList<IHistogram2D> hChargeVsTime; + private ArrayList<IHistogram1D> hChargeALL; + private ArrayList<IHistogram2D> hChargeVsTimeALL; + IHistogram2D hMeanCharge2D; public void setUseRawEnergy(boolean useRawEnergy) { this.useRawEnergy=useRawEnergy; } - + private double skipInitial=0.1; - - @Override - protected void detectorChanged(Detector detector) { - System.out.println("LedAnalysis::Detector changed was called"); - - for (int ii=0;ii<nDrivers;ii++){ - iStep[ii]=-1; - } - - // Setup conditions - - conditionsManager = DatabaseConditionsManager.getInstance(); - - LedTopMap = new HashMap< Integer , Integer >(); //key: ecal channel ID. Value: - LedBotMap = new HashMap< Integer , Integer >(); - + + @Override + protected void detectorChanged(Detector detector) { + System.out.println("LedAnalysis::Detector changed was called"); + + for (int ii=0;ii<nDrivers;ii++){ + iStep[ii]=-1; + } + + // Setup conditions + + conditionsManager = DatabaseConditionsManager.getInstance(); + + LedTopMap = new HashMap< Integer , Integer >(); //key: ecal channel ID. Value: + LedBotMap = new HashMap< Integer , Integer >(); + ChannelCollection = conditionsManager.getCachedConditions(EcalChannelCollection.class, "ecal_channels").getCachedData(); - LedCollection = conditionsManager.getCachedConditions(EcalLedCollection.class, "ecal_leds").getCachedData(); - ecalConditions = conditionsManager.getEcalConditions(); - - for (EcalChannel channel : ChannelCollection){ - chid = channel.getChannelId(); - for (EcalLed Led : LedCollection) { - if (Led.getEcalChannelId()==chid){ - if (channel.getY()>0){ - LedTopMap.put( chid , Led.getLedNumber() ); - } - else if (channel.getY()<0){ - LedBotMap.put( chid , Led.getLedNumber() ); - } - } - } - } - - - // Setup plots - aida = AIDA.defaultInstance(); - aida.tree().cd("/"); - - // IPlotterFactory factory= aida.analysisFactory().createPlotterFactory("ECAL DAQ Plots"); - iTuple = new ArrayList<ITuple>(NUM_CHANNELS); - cProfile= new ArrayList<IProfile1D>(NUM_CHANNELS); - fFunction= new ArrayList<IFunction>(NUM_CHANNELS); - fFunction1= new ArrayList<IFunction>(NUM_CHANNELS); - hCharge = new ArrayList<IHistogram1D>(NUM_CHANNELS); - - - - - for (int ii=0;ii<NUM_CHANNELS;ii++){ - int row = EcalMonitoringUtilities.getRowFromHistoID(ii); - int column = EcalMonitoringUtilities.getColumnFromHistoID(ii); - iTuple.add(aida.analysisFactory().createTupleFactory(aida.tree()).create("nTuple"+ii,"nTuple"+ii,"int fEvn=0 , double fCharge=0.","")); - - } - - } - - @Override - public void process(EventHeader event) { - runNumber = event.getRunNumber(); - eventN++; - if (event.hasCollection(CalorimeterHit.class, inputCollection)) { - //List<BassRawCalorimeterHit> hits = event.get(BaseRawCalorimeterHit.class, inputCollectionRaw); - List<CalorimeterHit> hits = event.get(CalorimeterHit.class, inputCollection); - for (CalorimeterHit hit : hits) { - - column = hit.getIdentifierFieldValue("ix"); - row = hit.getIdentifierFieldValue("iy"); - id = EcalMonitoringUtilities.getHistoIDFromRowColumn(row, column); - cellID=hit.getCellID(); - energy = hit.getCorrectedEnergy(); - - if (useRawEnergy){ - rawEnergy = getRawADCSum(energy,cellID); - } - else { - rawEnergy = energy; - } - - - //find the LED - chid = ChannelCollection.findGeometric(cellID).getChannelId(); - if (row>0){ - ledid=LedTopMap.get(chid); - } - else if (row<0){ - ledid=LedBotMap.get(chid); - } - driverid=getDriver(ledid); - if (row<0) driverid+=4; - - /*First, check if this led is the one in the NEXT step. Therefore, increment by 1 the step*/ - if (iStep[driverid]<(nSteps-1)){ - if (ledid==LEDStep[driverid][iStep[driverid]+1]){ - iStep[driverid]++; - System.out.println("LedAnalysis:: increment step for driver "+driverid+" "+ledid+" "+column+" "+row+" "+id); - } - } - - - if (iStep[driverid]==-1) continue; - - /*Case 1: this led is the one in the corresponding step*/; - if (ledid==LEDStep[driverid][iStep[driverid]]){ - //hRaw.get(id).fill(rawEnergy); - //cStrip.get(id).fill(nEvents[id],rawEnergy); - - iTuple.get(id).fill(0,nEvents[id]); - iTuple.get(id).fill(1,rawEnergy); - iTuple.get(id).addRow(); - - - nEvents[id]++; - } - else{ /*Case 2: this led is not one in the corresponding step (but maybe is the neighborhood??Ctalk??)*/; - - } - - /*Add a debug print */ - if (eventN % 10000==0){ - System.out.println("Debug. LED ID: "+ledid+" DRIVER ID: "+driverid+" ECAL ID: "+id+" ROW: "+row+" COLUMN: "+column); - } - } - } - } - - /* - * The endOfData() method analises each ntuple to find the LED response. - * We cannot simply fit a gaussian to the energy distribution, since there is a high-energy tail due to the LED being turned on: - * When the LED turns on, it is "cold", and emits more light. Immediately, it starts to heat, and due to temperature effects the - * emitted light is less. This is clearly visible if one plots the charge VS the event number: the trend is decreasing, toward a - * plateau, that corresponds to the value at thermal equilibrium. - * - * For (few) channels, the first charge values are close to 0, then charge grows rapidly, then it returns back to the plateau. - * To handle these, I always cut the first 10% events - * To properly handle this: - * - * 1) First create a profile histogram, charge VS event number. - * 2) Fit it with something like "A*exp(-event_number/N0)+C. The function does not need to be extra-accurate at this stage - * 3) Cut the events with event_number < 5*N0. - * 4) Fit the remaining events with a gaussian. - */ - @Override - public void endOfData() { - System.out.println("LedAnalysis::end of data"); - - - double e,eMin,eMax; - int n,nBins,nFits,nSkip; - - double[] fPars; - double[] fParErrs; - String[] fParNames; - IFunctionFactory fFactory=aida.analysisFactory().createFunctionFactory(aida.tree()); - IPlotter pPlotter= aida.analysisFactory().createPlotterFactory().create(); - IFitResult fResult; - IFitter fFitter; - - for (int id = 0; id < 11 * 47; id++) { - - eMin=9999; - eMax=-9999; - row = EcalMonitoringUtilities.getRowFromHistoID(id); - column = EcalMonitoringUtilities.getColumnFromHistoID(id); - - /*Create the profile. Create it for all the channels, to keep sync.*/ - nBins=nEvents[id]/100; - if (nBins<=0) nBins=1; - cProfile.add(aida.profile1D("strip_"+id,nBins,-0.5,nEvents[id]*(1-skipInitial)+0.5)); - - /*Create the function for the profile fit and the gaus fit*/ - /* Create it for all the channels, to keep sync.*/ - fFunction.add(fFactory.createFunctionFromScript("fun0_"+id,1,"A*exp(-x[0]/tau)+B","A,tau,B","",null)); - fFunction1.add(fFactory.createFunctionByName("fun1_"+id,"G")); - - if (EcalMonitoringUtilities.isInHole(row,column)==true){ - hCharge.add(aida.histogram1D("charge_"+id,200,0.,1.)); //create here the histogram to keep sync - continue; - } - if (nEvents[id]==0) { - hCharge.add(aida.histogram1D("charge_"+id,200,0.,1.)); //create here the histogram to keep sync - //System.out.println("LedAnalysis: channel x= "+column+" y= "+row+" not found"); - continue; - } - - /*Fill the profile*/ - nSkip=(int)(nEvents[id]*skipInitial); - iTuple.get(id).start(); - iTuple.get(id).skip(nSkip); /*This is the work-around for those channels with charge starting from 0 and rapidly growing*/ - n=0; - iTuple.get(id).next(); e=iTuple.get(id).getDouble(1); eMax=e; n++; /*eMax is the first sample*/ - while ( iTuple.get(id).next() ){ - e=iTuple.get(id).getDouble(1); - eMin=e; /*eMin is the last sample*/ - cProfile.get(id).fill(1.*n,e); - n++; - } - - - /*Init function parameters*/ - double[] initialPars={eMax-eMin,nEvents[id]/10.,eMin}; - fFunction.get(id).setParameters(initialPars); - - /*Do the fit*/ - fFitter=aida.analysisFactory().createFitFactory().createFitter("chi2","","v"); - System.out.println("LedAnalysis:: do profile fit "+id+" "+fFitter.engineName()+" "+fFitter.fitMethodName()); - System.out.println("LedAnalysis:: initial parameters "+initialPars[0]+" "+initialPars[1]+" "+initialPars[2]); - fResult=fFitter.fit(cProfile.get(id),fFunction.get(id)); - fPars = fResult.fittedParameters(); - fParErrs = fResult.errors(); - fParNames = fResult.fittedParameterNames(); - System.out.println("LedAnalysis:: Status= "+fResult.fitStatus()+" "+fResult.isValid()+" Chi2 = "+fResult.quality()+" NDF: "+fResult.ndf()); - for(int i=0; i< fResult.fittedFunction().numberOfParameters(); i++ ){ - System.out.println(fParNames[i]+" : "+fPars[i]+" +- "+fParErrs[i]); - } - fFunction.get(id).setParameters(fPars); - - - /*Do again the fit: it is a terrible work-around*/ - nFits=0; - while (Double.isNaN(fParErrs[1])){ - System.out.println("LedAnalysis:: redo fit"); - fFunction.get(id).setParameters(fPars); - fResult=fFitter.fit(cProfile.get(id),fFunction.get(id)); - fPars = fResult.fittedParameters(); - fParErrs = fResult.errors(); - System.out.println("LedAnalysis:: Status= "+fResult.fitStatus()+" "+fResult.isValid()+" Chi2 = "+fResult.quality()+" NDF: "+fResult.ndf()); - for(int i=0; i< fResult.fittedFunction().numberOfParameters(); i++ ){ - System.out.println(fParNames[i]+" : "+fPars[i]+" +- "+fParErrs[i]); - } - fFunction.get(id).setParameters(fPars); - nFits++; - if (nFits>=10){ - System.out.println("LedAnalysis:: Error, too many fits without convergence"); - break; - } - } - - System.out.println("LedAnalysis:: fit "+id+" done"); - /*plot*/ - pPlotter.region(0).clear(); - pPlotter.region(0).plot(cProfile.get(id)); - pPlotter.region(0).plot(fFunction.get(id)); - // plotter.show(); - - /*Now we have the tau parameter. Take ONLY the events that are with N>5*tau/ + LedCollection = conditionsManager.getCachedConditions(EcalLedCollection.class, "ecal_leds").getCachedData(); + ecalConditions = conditionsManager.getEcalConditions(); + + for (EcalChannel channel : ChannelCollection){ + chid = channel.getChannelId(); + for (EcalLed Led : LedCollection) { + if (Led.getEcalChannelId()==chid){ + if (channel.getY()>0){ + LedTopMap.put( chid , Led.getLedNumber() ); + } + else if (channel.getY()<0){ + LedBotMap.put( chid , Led.getLedNumber() ); + } + } + } + } + + + // Setup plots + aida = AIDA.defaultInstance(); + aida.tree().cd("/"); + + // IPlotterFactory factory= aida.analysisFactory().createPlotterFactory("ECAL DAQ Plots"); + iTuple = new ArrayList<ITuple>(NUM_CHANNELS); + cProfile= new ArrayList<IProfile1D>(NUM_CHANNELS); + fFunction= new ArrayList<IFunction>(NUM_CHANNELS); + fFunction1= new ArrayList<IFunction>(NUM_CHANNELS); + hCharge = new ArrayList<IHistogram1D>(NUM_CHANNELS); + // hChargeVsTime = new ArrayList<IHistogram2D>(NUM_CHANNELS); + hChargeALL = new ArrayList<IHistogram1D>(NUM_CHANNELS); + hChargeVsTimeALL = new ArrayList<IHistogram2D>(NUM_CHANNELS); + hMeanCharge2D = aida.histogram2D("Average LED response", 47, -23.5, 23.5, 11, -5.5, 5.5); + + for (int ii=0;ii<NUM_CHANNELS;ii++){ + int row = EcalMonitoringUtilities.getRowFromHistoID(ii); + int column = EcalMonitoringUtilities.getColumnFromHistoID(ii); + iTuple.add(aida.analysisFactory().createTupleFactory(aida.tree()).create("nTuple"+ii,"nTuple"+ii,"int fEvn=0 , double fCharge=0.,double fTime=0.","")); + + hChargeALL.add(aida.histogram1D("ChargeAllEvents_"+ii,400,0.,100.)); + hChargeVsTimeALL.add(aida.histogram2D("ChargeVsTimeAllEvents_"+ii,100,0.,400.,100,0.,100.)); + } + + } + + @Override + public void process(EventHeader event) { + runNumber = event.getRunNumber(); + eventN++; + if (event.hasCollection(CalorimeterHit.class, inputCollection)) { + //List<BassRawCalorimeterHit> hits = event.get(BaseRawCalorimeterHit.class, inputCollectionRaw); + List<CalorimeterHit> hits = event.get(CalorimeterHit.class, inputCollection); + for (CalorimeterHit hit : hits) { + + column = hit.getIdentifierFieldValue("ix"); + row = hit.getIdentifierFieldValue("iy"); + id = EcalMonitoringUtilities.getHistoIDFromRowColumn(row, column); + cellID=hit.getCellID(); + energy = hit.getCorrectedEnergy(); + + if (useRawEnergy){ + fillEnergy = getRawADCSum(energy,cellID); + } + else { + fillEnergy = energy; + } + fillTime = hit.getTime(); + + //fill "all" histograms + hChargeALL.get(id).fill(fillEnergy); + hChargeVsTimeALL.get(id).fill(fillTime,fillEnergy); + + //find the LED + chid = ChannelCollection.findGeometric(cellID).getChannelId(); + if (row>0){ + ledid=LedTopMap.get(chid); + } + else if (row<0){ + ledid=LedBotMap.get(chid); + } + driverid=getDriver(ledid); + if (row<0) driverid+=4; + + /*First, check if this led is the one in the NEXT step. Therefore, increment by 1 the step*/ + if (iStep[driverid]<(nSteps-1)){ + if (ledid==LEDStep[driverid][iStep[driverid]+1]){ + iStep[driverid]++; + System.out.println("LedAnalysis:: increment step ("+iStep[driverid]+") for driver "+driverid+" . Led ID: "+ledid+" Column: "+column+" Row: "+row); + } + } + + + if (iStep[driverid]==-1) continue; + + /*Case 1: this led is the one in the corresponding step*/; + if (ledid==LEDStep[driverid][iStep[driverid]]){ + //hRaw.get(id).fill(rawEnergy); + //cStrip.get(id).fill(nEvents[id],rawEnergy); + + iTuple.get(id).fill(0,nEvents[id]); + iTuple.get(id).fill(1,fillEnergy); + iTuple.get(id).fill(2,fillTime); + iTuple.get(id).addRow(); + + + nEvents[id]++; + } + else{ /*Case 2: this led is not one in the corresponding step (but maybe is the neighborhood??Ctalk??)*/; + + } + + /*Add a debug print */ + if (eventN % 10000==0){ + System.out.println("Debug. LED ID: "+ledid+" DRIVER ID: "+driverid+" ECAL ID: "+id+" ROW: "+row+" COLUMN: "+column); + } + } + if (eventN % 10000==0){ + System.out.println("\n"); + } + } + } + + /* + * The endOfData() method analises each ntuple to find the LED response. + * We cannot simply fit a gaussian to the energy distribution, since there is a high-energy tail due to the LED being turned on: + * When the LED turns on, it is "cold", and emits more light. Immediately, it starts to heat, and due to temperature effects the + * emitted light is less. This is clearly visible if one plots the charge VS the event number: the trend is decreasing, toward a + * plateau, that corresponds to the value at thermal equilibrium. + * + * For (few) channels, the first charge values are close to 0, then charge grows rapidly, then it returns back to the plateau. + * To handle these, I always cut the first 10% events + * To properly handle this: + * + * 1) First create a profile histogram, charge VS event number. + * 2) Fit it with something like "A*exp(-event_number/N0)+C. The function does not need to be extra-accurate at this stage + * 3) Cut the events with event_number < 5*N0. + * 4) Fit the remaining events with a gaussian. + */ + @Override + public void endOfData() { + System.out.println("LedAnalysis::end of data"); + + + double e,eMin,eMax; + double t; + int n,nBins,nFits,nSkip; + + double[] fPars; + double[] fParErrs; + String[] fParNames; + IFunctionFactory fFactory=aida.analysisFactory().createFunctionFactory(aida.tree()); + IPlotter pPlotter= aida.analysisFactory().createPlotterFactory().create(); + IFitResult fResult; + IFitter fFitter; + + for (int id = 0; id < 11 * 47; id++) { + + eMin=9999; + eMax=-9999; + row = EcalMonitoringUtilities.getRowFromHistoID(id); + column = EcalMonitoringUtilities.getColumnFromHistoID(id); + + /*Create the profile. Create it for all the channels, to keep sync.*/ + nBins=nEvents[id]/100; + if (nBins<=0) nBins=1; + cProfile.add(aida.profile1D("strip_"+id,nBins,-0.5,nEvents[id]*(1-skipInitial)+0.5)); + + /*Create the function for the profile fit and the gaus fit*/ + /* Create it for all the channels, to keep sync.*/ + fFunction.add(fFactory.createFunctionFromScript("fun0_"+id,1,"A*exp(-x[0]/tau)+B","A,tau,B","",null)); + fFunction1.add(fFactory.createFunctionByName("fun1_"+id,"G")); + + if (EcalMonitoringUtilities.isInHole(row,column)==true){ + hCharge.add(aida.histogram1D("charge_"+id,200,0.,1.)); //create here the histogram to keep sync + // hChargeVsTime.add(aida.histogram2D("chargeVsTime_"+id,200,0.,400.,200,0.,1.)); + continue; + } + if (nEvents[id]==0) { + hCharge.add(aida.histogram1D("charge_"+id,200,0.,1.)); //create here the histogram to keep sync + // hChargeVsTime.add(aida.histogram2D("chargeVsTime_"+id,200,0.,400.,200,0.,1.)); + //System.out.println("LedAnalysis: channel x= "+column+" y= "+row+" not found"); + continue; + } + + /*Fill the profile*/ + nSkip=(int)(nEvents[id]*skipInitial); + iTuple.get(id).start(); + iTuple.get(id).skip(nSkip); /*This is the work-around for those channels with charge starting from 0 and rapidly growing*/ + n=0; + iTuple.get(id).next(); e=iTuple.get(id).getDouble(1); eMax=e; n++; /*eMax is the first sample*/ + while ( iTuple.get(id).next() ){ + e=iTuple.get(id).getDouble(1); + eMin=e; /*eMin is the last sample*/ + cProfile.get(id).fill(1.*n,e); + n++; + } + + + /*Init function parameters*/ + double[] initialPars={eMax-eMin,nEvents[id]/10.,eMin}; + fFunction.get(id).setParameters(initialPars); + + /*Do the fit*/ + fFitter=aida.analysisFactory().createFitFactory().createFitter("chi2","","v"); + System.out.println("LedAnalysis:: do profile fit "+id+" "+fFitter.engineName()+" "+fFitter.fitMethodName()); + System.out.println("LedAnalysis:: initial parameters "+initialPars[0]+" "+initialPars[1]+" "+initialPars[2]); + fResult=fFitter.fit(cProfile.get(id),fFunction.get(id)); + fPars = fResult.fittedParameters(); + fParErrs = fResult.errors(); + fParNames = fResult.fittedParameterNames(); + System.out.println("LedAnalysis:: Status= "+fResult.fitStatus()+" "+fResult.isValid()+" Chi2 = "+fResult.quality()+" NDF: "+fResult.ndf()); + for(int i=0; i< fResult.fittedFunction().numberOfParameters(); i++ ){ + System.out.println(fParNames[i]+" : "+fPars[i]+" +- "+fParErrs[i]); + } + fFunction.get(id).setParameters(fPars); + + + /*Do again the fit: it is a terrible work-around*/ + nFits=0; + while (Double.isNaN(fParErrs[1])){ + System.out.println("LedAnalysis:: redo fit"); + fFunction.get(id).setParameters(fPars); + fResult=fFitter.fit(cProfile.get(id),fFunction.get(id)); + fPars = fResult.fittedParameters(); + fParErrs = fResult.errors(); + System.out.println("LedAnalysis:: Status= "+fResult.fitStatus()+" "+fResult.isValid()+" Chi2 = "+fResult.quality()+" NDF: "+fResult.ndf()); + for(int i=0; i< fResult.fittedFunction().numberOfParameters(); i++ ){ + System.out.println(fParNames[i]+" : "+fPars[i]+" +- "+fParErrs[i]); + } + fFunction.get(id).setParameters(fPars); + nFits++; + if (nFits>=10){ + System.out.println("LedAnalysis:: Error, too many fits without convergence"); + break; + } + } + + System.out.println("LedAnalysis:: fit "+id+" done"); + + /*Now we have the tau parameter. Take ONLY the events that are with N>5*tau/ As a cross-check, also verify that tau > Nevents/10, otherwise skip the first Nevents/2 and emit warning - */ - hCharge.add(aida.histogram1D("charge_"+id,200,eMin*0.9,eMax*1.1)); - nSkip=(int)( fPars[1]*5); - if (nSkip < (nEvents[id]/2)){ - System.out.println("LedAnalysis:: Skip number too low: "+nSkip+" Increment it to "+nEvents[id]/2); - nSkip=nEvents[id]/2; - } - if (nSkip > nEvents[id]){ - System.out.println("LedAnalysis:: Skip number too high, reduce it"); - nSkip=nEvents[id]/2; - } - iTuple.get(id).start(); - iTuple.get(id).skip(nSkip); /*This is the work-around for those channels with charge starting from 0 and rapidly growing*/ - n=0; - while ( iTuple.get(id).next() ){ - e=iTuple.get(id).getDouble(1); - hCharge.get(id).fill(e); - n++; - } - - /*Finally do the fit with the gaussian*/ - double[] initialPars1={hCharge.get(id).maxBinHeight(),hCharge.get(id).mean(),hCharge.get(id).rms()}; - - System.out.println("LedAnalysis:: Gaus fit"); - System.out.println("LedAnalysis:: initial parameters "+initialPars1[0]+" "+initialPars1[1]+" "+initialPars1[2]); - - fFunction1.get(id).setParameters(initialPars1); - fResult=fFitter.fit(hCharge.get(id),fFunction1.get(id)); - fPars = fResult.fittedParameters(); - fParErrs = fResult.errors(); - fParNames = fResult.fittedParameterNames(); - System.out.println("Status= "+fResult.fitStatus()+" "+fResult.isValid()+" Chi2 = "+fResult.quality()+" NDF: "+fResult.ndf()); - for(int i=0; i< fResult.fittedFunction().numberOfParameters(); i++ ){ - System.out.println(fParNames[i]+" : "+fPars[i]+" +- "+fParErrs[i]); - } - fFunction1.get(id).setParameters(fPars); - - - System.out.println("\n"); - }/*End loop on channels*/ - - - - - - - - - - - }/*End endOfData*/ - - - /** - * This function returns the driver number (from 0 to 3) given the LED id. - * @param led - * @return - */ - public int getDriver(int led){ - int ret=-1; - if ((led>=2)&&(led<56)) ret=0; - else if ((led>=56)&&(led<112)) ret=1; - else if ((led>=112)&&(led<168)) ret=2; - else if ((led>=168)&&(led<224)) ret=3; - return ret; - } - -/** - * Very simple method to retreive the pedestal-subtracted raw Energy. - * If the gain changes (because we do a re-calibration), I do not want to include this in the LED analysis - * @param energy - * @param cellID - * @return - */ - public double getRawADCSum(double energy,long cellID){ - EcalChannelConstants channelData = ecalConditions.getChannelConstants(ecalConditions.getChannelCollection().findGeometric(cellID)); - double RawSum=energy / ECalUtils.GeV; - double gain=channelData.getGain().getGain(); - double ret=RawSum/gain; - // System.out.println("A:C "+RawSum+" "+ret); - - return ret; - - } - - private void uploadToDB() { - int x,y,id; - double mean,rms; - System.out.println(String.format("Uploading new led data to the database, runMin=%d, runMax=%d, tag=%s ....", - runNumber,runNumberMax,dbTag)); - - EcalLedCalibrationCollection led_calibrations = new EcalLedCalibrationCollection(); - - TableMetaData tableMetaData = conditionsManager.findTableMetaData(dbTableName); - led_calibrations.setTableMetaData(tableMetaData); - - for (int cid = 1; cid <= 442; cid++) {/*This is a loop over the channel ID, as in the conditions system*/ - EcalChannel cc = findChannel(cid); - x = cc.getX(); //This is the column - y = cc.getY(); //This is the row - id=EcalMonitoringUtilities.getHistoIDFromRowColumn(y,x); - mean=fFunction1.get(id).parameters()[1]; - rms=fFunction1.get(id).parameters()[2]; - led_calibrations.add(new EcalLedCalibration(cid,mean,rms)); - } - - int collectionId = conditionsManager.getNextCollectionID(dbTableName); - try { - led_calibrations.setCollectionId(collectionId); - System.err.println("CollectionID: "+collectionId); - led_calibrations.insert(); - ConditionsRecord conditionsRecord = new ConditionsRecord( - led_calibrations.getCollectionId(), runNumber, runNumberMax, dbTableName, dbTableName, - "Generated by LedAnalysis from Run #"+runNumber, dbTag); - conditionsRecord.insert(); + */ + hCharge.add(aida.histogram1D("charge_"+id,200,eMin*0.9,eMax*1.1)); + // hChargeVsTime.add(aida.histogram2D("chargeVsTime_"+id,200,0.,400.,200,eMin*0.9,eMax*1.1)); + nSkip=(int)( fPars[1]*5); + if (nSkip < (nEvents[id]/2)){ + System.out.println("LedAnalysis:: Skip number too low: "+nSkip+" Increment it to "+nEvents[id]/2); + nSkip=nEvents[id]/2; + } + if (nSkip > nEvents[id]){ + System.out.println("LedAnalysis:: Skip number too high, reduce it"); + nSkip=nEvents[id]/2; + } + iTuple.get(id).start(); + iTuple.get(id).skip(nSkip); /*This is the work-around for those channels with charge starting from 0 and rapidly growing*/ + n=0; + while ( iTuple.get(id).next() ){ + e=iTuple.get(id).getDouble(1); + t=iTuple.get(id).getDouble(2); + hCharge.get(id).fill(e); + // hChargeVsTime.get(id).fill(t,e); + n++; + } + + /*Finally do the fit with the gaussian*/ + double[] initialPars1={hCharge.get(id).maxBinHeight(),hCharge.get(id).mean(),hCharge.get(id).rms()}; + + System.out.println("LedAnalysis:: Gaus fit"); + System.out.println("LedAnalysis:: initial parameters "+initialPars1[0]+" "+initialPars1[1]+" "+initialPars1[2]); + + fFunction1.get(id).setParameters(initialPars1); + fResult=fFitter.fit(hCharge.get(id),fFunction1.get(id)); + fPars = fResult.fittedParameters(); + fParErrs = fResult.errors(); + fParNames = fResult.fittedParameterNames(); + System.out.println("Status= "+fResult.fitStatus()+" "+fResult.isValid()+" Chi2 = "+fResult.quality()+" NDF: "+fResult.ndf()); + for(int i=0; i< fResult.fittedFunction().numberOfParameters(); i++ ){ + System.out.println(fParNames[i]+" : "+fPars[i]+" +- "+fParErrs[i]); + } + fFunction1.get(id).setParameters(fPars); + + hMeanCharge2D.fill(column,row,fPars[1]); + System.out.println("\n"); + }/*End loop on channels*/ + - } catch (ConditionsObjectException | SQLException e) { - throw new RuntimeException(e); - } - - - } - - - - public EcalChannel findChannel(int channel_id) { - return ecalConditions.getChannelCollection().findChannel(channel_id); - } - - - - + pPlotter.createRegions(1,1); + IPlotterStyle style = pPlotter.region(0).style(); + style.setParameter("hist2DStyle", "colorMap"); + style.dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow"); + style.dataStyle().fillStyle().setParameter("showZeroHeightBins", Boolean.FALSE.toString()); + + pPlotter.region(0).plot(hMeanCharge2D); + pPlotter.show(); + + int ret=JOptionPane.showConfirmDialog(null, "Do you want to load these conditions to the database\n"+ + "for Runs: "+runNumber+" "+runNumberMax+" ? ", "Message", + JOptionPane.YES_NO_OPTION); + if (ret == JOptionPane.YES_OPTION){ + ret=JOptionPane.showConfirmDialog(null, "Confirm?", "Message", + JOptionPane.YES_NO_OPTION); + if (ret == JOptionPane.YES_OPTION){ + System.out.println("You confirmed \n"); + System.out.println("Load DB condtions \n"); + // uploadToDB(); + } + } + /* System.err.println("\n\n\n***************************************************************\n"); + String userInput=""; + String outputFilePrefix=""; + userInput=cc.readLine("Enter filename prefix, or just press RETURN ..."); + if (userInput==null || userInput.length()==0 || userInput=="") { + String home=System.getenv().get("HOME"); + outputFilePrefix = home+"/LedAnalysis_"+runNumber+"_"; + } else { + outputFilePrefix = userInput; + }*/ + + + + + + + }/*End endOfData*/ + + + /** + * This function returns the driver number (from 0 to 3) given the LED id. + * @param led + * @return + */ + public int getDriver(int led){ + int ret=-1; + if ((led>=2)&&(led<56)) ret=0; + else if ((led>=56)&&(led<112)) ret=1; + else if ((led>=112)&&(led<168)) ret=2; + else if ((led>=168)&&(led<224)) ret=3; + return ret; + } + + /** + * Very simple method to retreive the pedestal-subtracted raw Energy. + * If the gain changes (because we do a re-calibration), I do not want to include this in the LED analysis + * @param energy + * @param cellID + * @return + */ + public double getRawADCSum(double energy,long cellID){ + EcalChannelConstants channelData = ecalConditions.getChannelConstants(ecalConditions.getChannelCollection().findGeometric(cellID)); + double RawSum=energy / ECalUtils.GeV; + double gain=channelData.getGain().getGain(); + double ret=RawSum/gain; + // System.out.println("A:C "+RawSum+" "+ret); + + return ret; + + } + + private void uploadToDB() { + int x,y,id; + double mean,rms; + System.out.println(String.format("Uploading new led data to the database, runMin=%d, runMax=%d, tag=%s ....", + runNumber,runNumberMax,dbTag)); + + EcalLedCalibrationCollection led_calibrations = new EcalLedCalibrationCollection(); + + TableMetaData tableMetaData = conditionsManager.findTableMetaData(dbTableName); + led_calibrations.setTableMetaData(tableMetaData); + + for (int cid = 1; cid <= 442; cid++) {/*This is a loop over the channel ID, as in the conditions system*/ + EcalChannel cc = findChannel(cid); + x = cc.getX(); //This is the column + y = cc.getY(); //This is the row + id=EcalMonitoringUtilities.getHistoIDFromRowColumn(y,x); + mean=fFunction1.get(id).parameters()[1]; + rms=fFunction1.get(id).parameters()[2]; + led_calibrations.add(new EcalLedCalibration(cid,mean,rms)); + } + + int collectionId = conditionsManager.getNextCollectionID(dbTableName); + try { + led_calibrations.setCollectionId(collectionId); + System.err.println("CollectionID: "+collectionId); + led_calibrations.insert(); + ConditionsRecord conditionsRecord = new ConditionsRecord( + led_calibrations.getCollectionId(), runNumber, runNumberMax, dbTableName, dbTableName, + "Generated by LedAnalysis from Run #"+runNumber, dbTag); + conditionsRecord.insert(); + + } catch (ConditionsObjectException | SQLException e) { + throw new RuntimeException(e); + } + + + } + + + + public EcalChannel findChannel(int channel_id) { + return ecalConditions.getChannelCollection().findChannel(channel_id); + } + + + + }