Author: [log in to unmask] Date: Wed Mar 4 08:06:44 2015 New Revision: 2240 Log: Allow updating ecal pedetsals in conditions database. Modified: java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/EcalPedestalCalculator.java Modified: java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/EcalPedestalCalculator.java ============================================================================= --- java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/EcalPedestalCalculator.java (original) +++ java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/EcalPedestalCalculator.java Wed Mar 4 08:06:44 2015 @@ -2,10 +2,18 @@ import hep.aida.IHistogram1D; +import java.io.Console; import java.io.FileWriter; import java.io.IOException; - +import java.sql.SQLException; +import java.text.DecimalFormat; + +import org.hps.conditions.api.ConditionsObjectException; +import org.hps.conditions.api.ConditionsRecord; import org.hps.conditions.database.DatabaseConditionsManager; +import org.hps.conditions.database.TableMetaData; +import org.hps.conditions.ecal.EcalCalibration; +import org.hps.conditions.ecal.EcalCalibration.EcalCalibrationCollection; import org.hps.conditions.ecal.EcalChannel; import org.hps.conditions.ecal.EcalConditions; import org.lcsim.event.EventHeader; @@ -19,35 +27,42 @@ /** * Calculate pedestals from Mode-7 Data. * - * To be used online with org.hps.monitoring.ecal.plots.EcalPedestalViewer - * and ET-ring to create config files for DAQ and/or conditions DB. + * To be used online with org.hps.monitoring.ecal.plots.EcalPedestalViewer and + * ET-ring to create config files for DAQ and/or conditions DB. * * When user clicks "Disconnect" in monitoring app (after confirming sufficient - * statistics), endOfData is called and config files will be written. Copying - * files to proper location for DAQ must be done manually. - *gg - * TODO: Merge with EcalCalibrationDriver (which works on Mode-1). + * statistics), endOfData is called and config files will be written. Copying + * files to proper location for DAQ must be done manually. gg TODO: Merge with + * EcalCalibrationDriver (which works on Mode-1). * * @version $Id: EcalPedestalCalculator.java,v 0.1 2015/02/20 00:00:00 * @author <[log in to unmask]> */ public class EcalPedestalCalculator extends Driver { + private static final String dbTag = "online"; + private static final String dbTableName = "ecal_calibrations"; private static final String rawCollectionName = "EcalReadoutHits"; private static final String extraDataRelationsName = "EcalReadoutExtraDataRelations"; private String histoNameFormat = "Ecal/Pedestals/Mode7/ped%3d"; + + private static final int minimumStats = 1000; + private static final DecimalFormat dbNumberFormat=new DecimalFormat("#.####"); - private String outputFilePrefix = ""; private static final String[] filenamesDAQ = { "fadc37.ped", "fadc39.ped" }; - private static final String filenameDB = "EcalPedsForDB.txt"; - + private static final String filenameDB = "hpsDB.txt"; + // The number of samples used by FADCs to report an event's pedestal. private int nSamples = 4; + + private int runNumber = 0; + private static final int runNumberMax = 9999; - private boolean writeFileForDB=true; - private boolean writeFileForDAQ=true; - + private boolean writeFileForDB = true; + private boolean writeFileForDAQ = true; + + private DatabaseConditionsManager conditionsManager = null; private EcalConditions ecalConditions = null; AIDA aida = AIDA.defaultInstance(); @@ -57,18 +72,41 @@ public EcalPedestalCalculator() { } - public void setOutputFilePrefix(String prefix) { - outputFilePrefix = "_"+prefix; - } - @Override protected void startOfData() { } @Override public void endOfData() { - if (writeFileForDAQ) writeFileForDAQ(); - if (writeFileForDB) writeFileForDB(); + Console cc = System.console(); + if (cc == null) { + System.err.println("No console."); + System.exit(1); + } + + 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+"/EcalPedestalCalculator_"+runNumber+"_"; + } else { + outputFilePrefix = userInput; + } + + if (writeFileForDAQ) writeFileForDAQ(outputFilePrefix); + if (writeFileForDB) writeFileForDB(outputFilePrefix); + + System.err.println("\n\n***************************************************************\n"); + userInput=cc.readLine(String.format("Enter 'YES' to write conditions database for run range [%s,%s] ...",runNumber,runNumberMax)); + System.out.println("***********"+userInput+"********"); + if (userInput!=null && userInput.equals("YES")) { + userInput=cc.readLine("Really?"); + if (userInput!=null && userInput.equals("YES")) { + uploadToDB(); + } + } } @Override @@ -77,7 +115,9 @@ if (nDetectorChanges++ > 1) { throw new RuntimeException("No Detector Change Allowed."); } - ecalConditions = DatabaseConditionsManager.getInstance().getEcalConditions(); + + conditionsManager = DatabaseConditionsManager.getInstance(); + ecalConditions = conditionsManager.getEcalConditions(); aida.tree().cd("/"); for (EcalChannel cc : ecalConditions.getChannelCollection()) { @@ -90,15 +130,56 @@ return String.format(histoNameFormat,cc.getChannelId()); } - private void writeFileForDB() { + private void uploadToDB() { + System.out.println(String.format("Uploading new pedestals to the database, runMin=%d, runMax=%d, tag=%s ....", + runNumber,runNumberMax,dbTag)); + + EcalCalibrationCollection calibrations = new EcalCalibrationCollection(); + TableMetaData tableMetaData = conditionsManager.findTableMetaData(dbTableName); + calibrations.setTableMetaData(tableMetaData); + + for (int cid = 1; cid <= 442; cid++) { + EcalChannel cc = findChannel(cid); + IHistogram1D hh = aida.histogram1D(getHistoName(cc)); + if (hh.entries() < minimumStats) { + System.err.println("Insufficient Statistics, Not writing to database. (channel_id="+cid+")."); + return; + } + calibrations.add(new EcalCalibration(cid, + Double.valueOf(dbNumberFormat.format(hh.mean())), + Double.valueOf(dbNumberFormat.format(hh.rms())))); + } + + int collectionId = conditionsManager.getNextCollectionID(dbTableName); + try { + calibrations.setCollectionId(collectionId); + + System.err.println("CollectionID: "+collectionId); + + calibrations.insert(); + ConditionsRecord conditionsRecord = new ConditionsRecord( + calibrations.getCollectionId(), runNumber, runNumberMax, dbTableName, dbTableName, + "Generated by EcalPedestalCalculator from Run #"+runNumber, dbTag); + conditionsRecord.insert(); + + } catch (ConditionsObjectException | SQLException e) { + throw new RuntimeException(e); + } + + } + + private void writeFileForDB(String outputFilePrefix) { + System.out.println("\nWriting pedestal file for HPS Conditions Database:\n" + + outputFilePrefix + filenameDB); FileWriter wout = null; try { wout = new FileWriter(outputFilePrefix + filenameDB); - for (int cid=1; cid<=442; cid++) { - EcalChannel cc= findChannel(cid); + wout.write("ecal_channel_id pedestal noise\n"); + for (int cid = 1; cid <= 442; cid++) { + EcalChannel cc = findChannel(cid); IHistogram1D hh = aida.histogram1D(getHistoName(cc)); - wout.write(String.format("%3d %7.3f %7.3f\n",cid, - hh.mean(),hh.rms()*Math.sqrt(nSamples))); + wout.write(String.format("%3d %7.3f %7.3f\n",cid,hh.mean(), + hh.rms() * Math.sqrt(nSamples))); } } catch (IOException ee) { throw new RuntimeException("Error writing file.",ee); @@ -112,7 +193,10 @@ } } } - private void writeFileForDAQ() { + + private void writeFileForDAQ(String outputFilePrefix) { + System.out.println("\nWriting pedestal files for Hall-B DAQ:\n" + outputFilePrefix + + filenamesDAQ[0] + "\n" + outputFilePrefix + filenamesDAQ[1]); FileWriter[] wout = { null, null }; try { for (int crate = 1; crate <= 2; crate++) { @@ -126,7 +210,7 @@ EcalChannel cc = findChannel(crate,slot,chan); IHistogram1D hh = aida.histogram1D(getHistoName(cc)); wout[crate - 1].write(String.format("%2d %2d %7.3f %7.3f\n",slot,chan, - hh.mean(),hh.rms()*Math.sqrt(nSamples))); + hh.mean(),hh.rms() * Math.sqrt(nSamples))); } } } @@ -148,6 +232,7 @@ @Override protected void process(EventHeader event) { + runNumber = event.getRunNumber(); if (event.hasCollection(RawCalorimeterHit.class,rawCollectionName)) { if (event.hasCollection(LCRelation.class,extraDataRelationsName)) { for (LCRelation rel : event.get(LCRelation.class,extraDataRelationsName)) { @@ -163,7 +248,8 @@ final int min = ((HitExtraData.Mode7Data) mode7data).getAmplLow(); final int max = ((HitExtraData.Mode7Data) mode7data).getAmplHigh(); // ignore if pulse at beginning of window: - if (max <= 0) return; + if (max <= 0) + return; EcalChannel cc = findChannel(hit); if (cc == null) { System.err.println("Hit doesn't correspond to ecalchannel."); @@ -182,9 +268,7 @@ public EcalChannel findChannel(int crate, int slot, int chan) { for (EcalChannel cc : ecalConditions.getChannelCollection()) { - if (crate == cc.getCrate() && - slot == cc.getSlot() && - chan == cc.getChannel()) { + if (crate == cc.getCrate() && slot == cc.getSlot() && chan == cc.getChannel()) { return cc; } }