Print

Print


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;
             }
         }