Author: [log in to unmask] Date: Thu Mar 10 12:51:10 2016 New Revision: 4283 Log: Few changes Added: java/trunk/users/src/main/java/org/hps/users/celentan/LedOnlineDataDumpDriver.java Modified: java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/ecal/plots/EcalLedSequenceMonitor.java java/trunk/steering-files/src/main/resources/org/hps/steering/monitoring/EcalLedSequenceStandalone.lcsim Modified: java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/ecal/plots/EcalLedSequenceMonitor.java ============================================================================= --- java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/ecal/plots/EcalLedSequenceMonitor.java (original) +++ java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/ecal/plots/EcalLedSequenceMonitor.java Thu Mar 10 12:51:10 2016 @@ -1,4 +1,5 @@ package org.hps.monitoring.ecal.plots; + import hep.aida.IEvaluator; import hep.aida.IFitResult; @@ -52,6 +53,8 @@ import org.lcsim.util.Driver; import org.lcsim.util.aida.AIDA; + + /* This is the driver used to determine the response of each calorimeter channel after a LED run * @author Andrea Celentano <[log in to unmask]> */ @@ -67,7 +70,7 @@ String inputCollectionRaw = "EcalReadoutHits"; - String inputCollection = "EcalCalHits"; + String inputCollection = "EcalCalHits"; AIDA aida; DatabaseConditionsManager conditionsManager; @@ -87,7 +90,7 @@ String outFileName; - private int runNumber = 0; + private int runNumber = 0; private int eventN = 0; private int id,row,column,chid,ledId,driverId; private int[][] expectedSequence = new int[][]{ /*A.C. it is a terrible thing to have this hard-coded here!*/ @@ -97,9 +100,9 @@ {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}, + {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}, + {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[][] actualSequence=new int[nDrivers][nSteps]; @@ -126,6 +129,7 @@ private IFunction fFunction,fFunction1; private IProfile1D cProfile; private IHistogram2D hMeanCharge2D; + private IHistogram2D hMeanCharge2DReferenceRatio; private ArrayList<IHistogram1D> hCharge; private ArrayList<IHistogram2D> hChargeVsEvn; private IPlotterFactory factory; @@ -148,6 +152,11 @@ private double fEvnMaxDraw=80000.; private double fChargeMinDraw=0.; private double fChargeMaxDraw=100.; + + /*The reference run numbers*/ + private int fRedReferenceID; + private int fBlueReferenceID; + /*Components for user interaction*/ private JDialog dialog; @@ -160,6 +169,14 @@ private LedColor m_ret=LedColor.UNKNOWN; //use UNKNONW as CANCEL button static Object modalMonitor = new Object(); + public void setRedReferenceID(int redReference){ + this.fRedReferenceID=redReference; + } + + public void setBlueReferenceID(int blueReference){ + this.fBlueReferenceID=blueReference; + } + public void setUseRawEnergy(boolean useRawEnergy) { this.useRawEnergy=useRawEnergy; } @@ -217,7 +234,7 @@ conditionsManager = DatabaseConditionsManager.getInstance(); LedTopMap = new HashMap< Integer , Integer >(); //key: ecal channel ID. Value: led id - LedBotMap = new HashMap< Integer , Integer >(); + LedBotMap = new HashMap< Integer , Integer >(); LedTopMapInverted = new HashMap< Integer , Integer >(); //key: led id. Value: ecal channel id LedBotMapInverted = new HashMap< Integer , Integer >(); @@ -225,21 +242,21 @@ ChannelCollection = conditionsManager.getCachedConditions(EcalChannelCollection.class, "ecal_channels").getCachedData(); LedCollection = conditionsManager.getCachedConditions(EcalLedCollection.class, "ecal_leds").getCachedData(); - ecalConditions = conditionsManager.getEcalConditions(); + 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() ); - LedTopMapInverted.put( Led.getLedNumber(), chid ); - } - else if (channel.getY()<0){ - LedBotMap.put( chid , Led.getLedNumber() ); - LedBotMapInverted.put( Led.getLedNumber(), chid ); - } - } + for (EcalLed Led : LedCollection) { + if (Led.getEcalChannelId()==chid){ + if (channel.getY()>0){ + LedTopMap.put( chid , Led.getLedNumber() ); + LedTopMapInverted.put( Led.getLedNumber(), chid ); + } + else if (channel.getY()<0){ + LedBotMap.put( chid , Led.getLedNumber() ); + LedBotMapInverted.put( Led.getLedNumber(), chid ); + } + } } } @@ -249,14 +266,16 @@ aida = AIDA.defaultInstance(); aida.tree().cd("/"); hMeanCharge2D = aida.histogram2D("Average LED response", 47, -23.5, 23.5, 11, -5.5, 5.5); - + hMeanCharge2DReferenceRatio = aida.histogram2D("Ratio this run VS reference run", 47, -23.5, 23.5, 11, -5.5, 5.5); + factory= aida.analysisFactory().createPlotterFactory("Ecal Led Sequence"); pPlotter= factory.create("Drivers"); pPlotter.createRegions(4,2); if (isMonitoringApp){ pPlotter2=factory.create("Sequence Map"); - pPlotter2.createRegions(1,1); + pPlotter2.createRegions(1,2); pPlotter2.region(0).plot(hMeanCharge2D); + pPlotter2.region(1).plot(hMeanCharge2DReferenceRatio); } iTuple = new ArrayList<ITuple>(NUM_CHANNELS); hCharge = new ArrayList<IHistogram1D>(NUM_CHANNELS); @@ -268,7 +287,7 @@ for (int ii=0;ii<NUM_CHANNELS;ii++){ int row = EcalMonitoringUtilities.getRowFromHistoID(ii); - int column = EcalMonitoringUtilities.getColumnFromHistoID(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.","")); } @@ -280,7 +299,7 @@ pPlotter.show(); if (isMonitoringApp) pPlotter2.show(); - } + } @Override public void process(EventHeader event) { @@ -291,83 +310,83 @@ 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(); - chid = ChannelCollection.findGeometric(cellID).getChannelId(); - - energy = hit.getCorrectedEnergy(); - - if (useRawEnergy){ - fillEnergy = getRawADCSum(energy,cellID); - } - else { - fillEnergy = energy; - } - fillTime = hit.getTime(); - - - //find the LED - if (row>0){ - ledId=LedTopMap.get(chid); - } - else if (row<0){ - ledId=LedBotMap.get(chid); - } - driverId=getDriver(ledId); - if (row<0) driverId+=4; - - - - /*Skip the events under thr*/ - if (energy<energyCut) continue; - - /*First, check if this led is the one in the NEXT step. Therefore, increment by 1 the step*/ - /* - * if (iStep[driverId]==0){ - + column = hit.getIdentifierFieldValue("ix"); + row = hit.getIdentifierFieldValue("iy"); + id = EcalMonitoringUtilities.getHistoIDFromRowColumn(row, column); + cellID=hit.getCellID(); + chid = ChannelCollection.findGeometric(cellID).getChannelId(); + + energy = hit.getCorrectedEnergy(); + + if (useRawEnergy){ + fillEnergy = getRawADCSum(energy,cellID); + } + else { + fillEnergy = energy; + } + fillTime = hit.getTime(); + + + //find the LED + if (row>0){ + ledId=LedTopMap.get(chid); + } + else if (row<0){ + ledId=LedBotMap.get(chid); + } + driverId=getDriver(ledId); + if (row<0) driverId+=4; + + + + /*Skip the events under thr*/ + if (energy<energyCut) continue; + + /*First, check if this led is the one in the NEXT step. Therefore, increment by 1 the step*/ + /* + * if (iStep[driverId]==0){ + actualSequence[driverId][iStep[driverId]]=ledId; - iStep[driverId]=1; + iStep[driverId]=1; } else if ((iStep[driverId]==1)&&(ledId!=actualSequence[driverId][0])){ - System.out.println("LedAnalysis:: increment step ("+iStep[driverId]+") for driver "+driverId+" . Led ID: "+ledId+" Column: "+column+" Row: "+row); + System.out.println("LedAnalysis:: increment step ("+iStep[driverId]+") for driver "+driverId+" . Led ID: "+ledId+" Column: "+column+" Row: "+row); if (iStep[driverId]>0) drawProfiles(actualSequence[driverId][iStep[driverId]-1],driverId); actualSequence[driverId][iStep[driverId]]=ledId; iStep[driverId]++; } else if ((iStep[driverId]>1)&&(ledId!=actualSequence[driverId][iStep[driverId]-1])&&(ledId!=actualSequence[driverId][iStep[driverId]-2])){ - System.out.println("LedAnalysis:: increment step ("+iStep[driverId]+") for driver "+driverId+" . Led ID: "+ledId+" Column: "+column+" Row: "+row); + System.out.println("LedAnalysis:: increment step ("+iStep[driverId]+") for driver "+driverId+" . Led ID: "+ledId+" Column: "+column+" Row: "+row); if (iStep[driverId]>0) drawProfiles(actualSequence[driverId][iStep[driverId]-1],driverId); actualSequence[driverId][iStep[driverId]]=ledId; iStep[driverId]++; } - // if (iStep[driverId]==-1) continue; - - */ - - if (iStep[driverId]==-1) continue; /*Not yet data*/ - - /*Put this code here, since we want to always fill the ntuple*/ - 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]++; - - - - /*Add a debug print */ - if (eventN % 10000==0){ - System.out.println("Debug. Event "+eventN+" LED ID: "+ledId+" DRIVER ID: "+driverId+" ECAL ID: "+id+" ROW: "+row+" COLUMN: "+column+ "HISTO ID: "+id); - } + // if (iStep[driverId]==-1) continue; + + */ + + if (iStep[driverId]==-1) continue; /*Not yet data*/ + + /*Put this code here, since we want to always fill the ntuple*/ + 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]++; + + + + /*Add a debug print */ + if (eventN % 10000==0){ + System.out.println("Debug. Event "+eventN+" LED ID: "+ledId+" DRIVER ID: "+driverId+" ECAL ID: "+id+" ROW: "+row+" COLUMN: "+column+ "HISTO ID: "+id); + } } if (eventN % 10000==0){ - System.out.println("\n"); - } - } + System.out.println("\n"); + } + } } /* @@ -401,7 +420,7 @@ IFunctionFactory fFactory=aida.analysisFactory().createFunctionFactory(aida.tree()); IFitResult fResult; - IFitter fFitter; + IFitter fFitter; for (int id = 0; id < 11 * 47; id++) { @@ -420,9 +439,9 @@ /*Clear previous*/ if (id>0){ - aida.tree().rm("strip"); - aida.tree().rm("fun0"); - aida.tree().rm("fun1"); + aida.tree().rm("strip"); + aida.tree().rm("fun0"); + aida.tree().rm("fun1"); } /*Create the profile.*/ cProfile=aida.profile1D("strip",nBins,-0.5,nEvents[id]*(1-skipInitial)+0.5); @@ -432,79 +451,79 @@ fFunction1=fFactory.createFunctionByName("fun1","G"); if (EcalMonitoringUtilities.isInHole(row,column)==true){ - System.out.println("Channel X= "+column+" Y= "+row+" is in hole. Skip"); - hCharge.add(aida.histogram1D("charge_"+id,200,0.,1.)); //create here the histogram to keep sync - System.out.println("In hole, skip"); - continue; + System.out.println("Channel X= "+column+" Y= "+row+" is in hole. Skip"); + hCharge.add(aida.histogram1D("charge_"+id,200,0.,1.)); //create here the histogram to keep sync + System.out.println("In hole, skip"); + continue; } else if (nEvents[id]<nEventsMin) { - hCharge.add(aida.histogram1D("charge_"+id,200,0.,1.)); //create here the histogram to keep sync - System.err.println("LedAnalysis:: the channel X= "+column+" Y= "+row+" has not enough events "+nEvents[id]+" "+nEventsMin); - - continue; - } + hCharge.add(aida.histogram1D("charge_"+id,200,0.,1.)); //create here the histogram to keep sync + System.err.println("LedAnalysis:: the channel X= "+column+" Y= "+row+" has not enough events "+nEvents[id]+" "+nEventsMin); + + continue; + } //Fill the profile*/ nSkip=(int)(nEvents[id]*skipInitial); if (nSkip>iTuple.get(id).rows()){ - System.out.println("Can't skip initial events?"); - nSkip=0; + System.out.println("Can't skip initial events?"); + nSkip=0; } 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(); while ( iTuple.get(id).next() ){ - e=iTuple.get(id).getDouble(1); - if (e<eMin) eMin=e; - if (e>eMax) eMax=e; - cProfile.fill(1.*n,e); - n++; - } + e=iTuple.get(id).getDouble(1); + if (e<eMin) eMin=e; + if (e>eMax) eMax=e; + cProfile.fill(1.*n,e); + n++; + } fFitter=aida.analysisFactory().createFitFactory().createFitter("chi2","","v"); if (doFullAnalysis){ - //Init function parameters - double[] initialPars={eMax-eMin,nEvents[id]/10.,eMin}; - if (initialPars[0]<0) initialPars[0]=0; - fFunction.setParameters(initialPars); - - //Do the fit - 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,fFunction); - 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.setParameters(fPars); - - - //if fit failed, revert to simpler case - if ((fResult.isValid()==false)||Double.isNaN(fParErrs[0])||Double.isNaN(fParErrs[1])||Double.isNaN(fParErrs[2])){ - System.out.println("LedAnalysis:: fit failed. Reverting to simpler case"); - nSkip=(int)(nEvents[id]*(skipMin+skipInitial)); - } - else{ - //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 - nSkip=(int)( fPars[1]*5); - if (nSkip < (nEvents[id]*skipMin)){ - System.out.println("LedAnalysis:: Skip number too low: "+nSkip+" Increment it to "+nEvents[id]/2); - nSkip=(int)(nEvents[id]*(skipMin+skipInitial)); - } - if (nSkip > nEvents[id]){ - System.out.println("LedAnalysis:: Skip number too high, reduce it"); - nSkip=(int)(nEvents[id]*(skipMin+skipInitial)); - } - } + //Init function parameters + double[] initialPars={eMax-eMin,nEvents[id]/10.,eMin}; + if (initialPars[0]<0) initialPars[0]=0; + fFunction.setParameters(initialPars); + + //Do the fit + 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,fFunction); + 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.setParameters(fPars); + + + //if fit failed, revert to simpler case + if ((fResult.isValid()==false)||Double.isNaN(fParErrs[0])||Double.isNaN(fParErrs[1])||Double.isNaN(fParErrs[2])){ + System.out.println("LedAnalysis:: fit failed. Reverting to simpler case"); + nSkip=(int)(nEvents[id]*(skipMin+skipInitial)); + } + else{ + //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 + nSkip=(int)( fPars[1]*5); + if (nSkip < (nEvents[id]*skipMin)){ + System.out.println("LedAnalysis:: Skip number too low: "+nSkip+" Increment it to "+nEvents[id]/2); + nSkip=(int)(nEvents[id]*(skipMin+skipInitial)); + } + if (nSkip > nEvents[id]){ + System.out.println("LedAnalysis:: Skip number too high, reduce it"); + nSkip=(int)(nEvents[id]*(skipMin+skipInitial)); + } + } } else{ - nSkip=(int)(nEvents[id]*(skipMin+skipInitial)); + nSkip=(int)(nEvents[id]*(skipMin+skipInitial)); } System.out.println("LedAnalysis:: gaus fit :: Going to skip "+nSkip+" out of "+nEvents[id]); @@ -516,11 +535,11 @@ iTuple.get(id).skip(nSkip); n=0; while (iTuple.get(id).next()){ - e=iTuple.get(id).getDouble(1); - t=iTuple.get(id).getDouble(2); - hCharge.get(id).fill(e); - n++; - } + e=iTuple.get(id).getDouble(1); + t=iTuple.get(id).getDouble(2); + 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()}; @@ -532,10 +551,10 @@ fResult=fFitter.fit(hCharge.get(id),fFunction1); fPars = fResult.fittedParameters(); fParErrs = fResult.errors(); - fParNames = fResult.fittedParameterNames(); + 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]); + System.out.println(fParNames[i]+" : "+fPars[i]+" +- "+fParErrs[i]); } fFunction1.setParameters(fPars); mMean[id]=fPars[1]; @@ -554,6 +573,15 @@ style.dataStyle().fillStyle().setParameter("showZeroHeightBins", Boolean.FALSE.toString()); pPlotter2.region(0).plot(hMeanCharge2D); pPlotter2.region(0).refresh(); + + + style = pPlotter2.region(1).style(); + style.setParameter("hist2DStyle", "colorMap"); + style.dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow"); + style.dataStyle().fillStyle().setParameter("showZeroHeightBins", Boolean.FALSE.toString()); + pPlotter2.region(1).plot(hMeanCharge2DReferenceRatio); + pPlotter2.region(1).refresh(); + } else{ IPlotterStyle pstyle = aida.analysisFactory().createPlotterFactory().createPlotterStyle(); @@ -563,60 +591,72 @@ pstyle.dataStyle().fillStyle().setParameter("showZeroHeightBins", Boolean.FALSE.toString()); pstyle.setParameter("hist2DStyle", "colorMap"); if (pPlotter2!=null){ - pPlotter2.createRegion().plot(hMeanCharge2D,pstyle); - pPlotter2.show(); + pPlotter2.createRegion().plot(hMeanCharge2D,pstyle); + pPlotter2.show(); } } if (isMonitoringApp){ askUploadToDBDialog(); synchronized (modalMonitor) { - try{ - modalMonitor.wait(60000); //wait 1 minute for user interaction. - } - catch(InterruptedException excp){ - System.out.println("Got exception: "+excp); - } + try{ + modalMonitor.wait(60000); //wait 1 minute for user interaction. + } + catch(InterruptedException excp){ + System.out.println("Got exception: "+excp); + } } if ((m_ret!=LedColor.UNKNOWN)){ - if (m_ret==LedColor.BLUE) System.out.println("OK, upload to DB BLUE"); - else System.out.println("OK, upload to DB RED"); - try { - uploadToDB(m_ret); - } catch (SQLException | DatabaseObjectException | ConditionsObjectException error) { - throw new RuntimeException("Error uploading to the database ", error); - } - - System.out.println("Save an Elog too"); - uploadToElog(); + if (m_ret==LedColor.BLUE) System.out.println("OK, upload to DB BLUE"); + else System.out.println("OK, upload to DB RED"); + try { + uploadToDB(m_ret); + } catch (SQLException | DatabaseObjectException | ConditionsObjectException error) { + throw new RuntimeException("Error uploading to the database ", error); + } + + System.out.println("Get reference data, produce reference ratio map"); + compareWithReference(m_ret); + + style = pPlotter2.region(1).style(); + style.setParameter("hist2DStyle", "colorMap"); + style.dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow"); + style.dataStyle().fillStyle().setParameter("showZeroHeightBins", Boolean.FALSE.toString()); + pPlotter2.region(1).plot(hMeanCharge2DReferenceRatio); + pPlotter2.region(1).refresh(); + + System.out.println("Save an Elog too"); + uploadToElog(); } else{ - System.out.println("Cancel pressed. Nothing to do"); - } - } + System.out.println("Cancel pressed. Nothing to do"); + } + } + + /*Write a file with the LED values*/ try { if (useRawEnergy){ - outFileName=runNumber+".raw.txt"; + outFileName=runNumber+".raw.txt"; } else{ - outFileName=runNumber+".energy.txt"; + outFileName=runNumber+".energy.txt"; } PrintWriter writer = new PrintWriter(outFileName, "UTF-8"); for (int cid = 1; cid <= 442; cid++) {/*This is a loop over the channel ID, as in the conditions system*/ - EcalChannel cc = findChannel(cid); - column = cc.getX(); //This is the column - row = cc.getY(); //This is the row - id=EcalMonitoringUtilities.getHistoIDFromRowColumn(row,column); - row = EcalMonitoringUtilities.getRowFromHistoID(id); - column = EcalMonitoringUtilities.getColumnFromHistoID(id); - if (EcalMonitoringUtilities.isInHole(row, column)) continue; - if ((row == 0) || (column == 0)) continue; - - writer.print(cid+" "+column+" "+row+" "+" "+ mMean[id]+" "+mRMS[id]+"\r\n"); - + EcalChannel cc = findChannel(cid); + column = cc.getX(); //This is the column + row = cc.getY(); //This is the row + id=EcalMonitoringUtilities.getHistoIDFromRowColumn(row,column); + row = EcalMonitoringUtilities.getRowFromHistoID(id); + column = EcalMonitoringUtilities.getColumnFromHistoID(id); + if (EcalMonitoringUtilities.isInHole(row, column)) continue; + if ((row == 0) || (column == 0)) continue; + + writer.print(cid+" "+column+" "+row+" "+" "+ mMean[id]+" "+mRMS[id]+"\r\n"); + } writer.close(); @@ -632,28 +672,30 @@ System.out.println(ioe.getMessage()); } - - + + + + System.out.println("EcalLedSequenceMonitor endOfData clear histograms"); - for(int ii = 0; ii < NUM_CHANNELS; ii++) { + for(int ii = 0; ii < NUM_CHANNELS; ii++) { row=EcalMonitoringUtilities.getRowFromHistoID(ii); column = EcalMonitoringUtilities.getColumnFromHistoID(ii); - hName="charge_"+ii; + hName="charge_"+ii; try{ - aida.tree().rm(hName); + aida.tree().rm(hName); } catch(IllegalArgumentException ee){ - System.out.println("Got exception "+ee); + System.out.println("Got exception "+ee); } if (!saveTuple||(isMonitoringApp)){ - hName="nTuple"+ii; - try{ - aida.tree().rm(hName); - } - catch(IllegalArgumentException ee){ - System.out.println("Got exception "+ee); - } + hName="nTuple"+ii; + try{ + aida.tree().rm(hName); + } + catch(IllegalArgumentException ee){ + System.out.println("Got exception "+ee); + } } } System.out.println("EcalLedSequenceMonitor endOfData clear histograms done"); @@ -668,7 +710,7 @@ * @return */ public int getDriver(int led){ - int ret=-1; + 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; @@ -696,7 +738,7 @@ 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)); + runNumber,runNumberMax,dbTag)); conditionsManager = DatabaseConditionsManager.getInstance(); EcalLedCalibrationCollection led_calibrations = new EcalLedCalibrationCollection(); @@ -726,8 +768,8 @@ 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); + led_calibrations.getCollectionId(), runNumber, runNumberMax, dbTableName, dbTableName, + "Generated by LedAnalysis from Run #"+runNumber, dbTag); conditionsRecord.setConnection(conditionsManager.getConnection()); tableMetaData = conditionsManager.findTableMetaData("conditions"); conditionsRecord.setTableMetaData(tableMetaData); @@ -772,6 +814,79 @@ } } + private void compareWithReference(LedColor color){ + int ID=0; + int x,y,chid; + double mean,rms,fillData=1; + if (color==LedColor.UNKNOWN){ + System.out.println("LedMonitoringSequence::compare with reference, doing nothing"); + return; + } + else if (color==LedColor.RED) ID=fRedReferenceID; + else if (color==LedColor.BLUE) ID=fBlueReferenceID; + + conditionsManager = DatabaseConditionsManager.getInstance(); + + + EcalLedCalibrationCollection referenceDataCollection = new EcalLedCalibrationCollection(); + referenceDataCollection.setConnection(conditionsManager.getConnection()); + + TableMetaData tableMetaData = conditionsManager.findTableMetaData(dbTableName); + referenceDataCollection.setTableMetaData(tableMetaData); + System.out.println("Try to get reference data from DB. Collection ID is "+ID); + try { + referenceDataCollection.select(ID); + } catch (SQLException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (DatabaseObjectException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + /*Now data from the reference should be there*/ + for (EcalLedCalibration referenceData : referenceDataCollection){ + + chid=referenceData.getFieldValue("ecal_channel_id"); + mean=referenceData.getFieldValue("led_response"); + rms=referenceData.getFieldValue("rms"); + + EcalChannel cc = findChannel(chid); + column = cc.getX(); //This is the column + row = cc.getY(); //This is the row + chid=EcalMonitoringUtilities.getHistoIDFromRowColumn(row,column); + row = EcalMonitoringUtilities.getRowFromHistoID(id); + column = EcalMonitoringUtilities.getColumnFromHistoID(id); + + + if (mean!=0) fillData=mMean[id]/mean; + else fillData=1; + System.out.println("row= "+row+" column= "+column+" data= "+mMean[id]+" ref= "+mean+" ratio= "+fillData); + hMeanCharge2DReferenceRatio.fill(column,row,fillData); + + + + } + + + + style = pPlotter2.region(0).style(); + style.setParameter("hist2DStyle", "colorMap"); + style.dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow"); + style.dataStyle().fillStyle().setParameter("showZeroHeightBins", Boolean.FALSE.toString()); + pPlotter2.region(0).plot(hMeanCharge2D); + pPlotter2.region(0).refresh(); + + + style = pPlotter2.region(1).style(); + style.setParameter("hist2DStyle", "colorMap"); + style.dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow"); + style.dataStyle().fillStyle().setParameter("showZeroHeightBins", Boolean.FALSE.toString()); + pPlotter2.region(1).plot(hMeanCharge2DReferenceRatio); + pPlotter2.region(1).refresh(); + + + } private void drawProfiles(int ledID,int driverID){ @@ -819,9 +934,9 @@ okButtonBlue = new JButton("Yes, blue"); cancelButton = new JButton("Cancel"); labelString = "<html> Update conditions to DB <br> for run: <br> "+runNumber+" - "+runNumberMax+" <br> ???? <br> " - + "Use the monitoring app to look at the map<br>" - + "(Tab LED sequence)<br>" - +"Reply in 60 seconds<br>"+"</html>"; + + "Use the monitoring app to look at the map<br>" + + "(Tab LED sequence)<br>" + +"Reply in 60 seconds<br>"+"</html>"; label = new JLabel( labelString); frame = new JFrame("Upload to DB?"); @@ -848,43 +963,43 @@ okButtonBlue.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent event) { - m_ret=LedColor.BLUE; - frame.dispose(); - synchronized(modalMonitor) - { - System.out.println("Blue pressed"); - modalMonitor.notify(); - } - } - } - ); + m_ret=LedColor.BLUE; + frame.dispose(); + synchronized(modalMonitor) + { + System.out.println("Blue pressed"); + modalMonitor.notify(); + } + } + } + ); okButtonRed.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent event) { - m_ret=LedColor.RED; - frame.dispose(); - synchronized(modalMonitor) - { - System.out.println("Red pressed"); - modalMonitor.notify(); - } - } - } - ); + m_ret=LedColor.RED; + frame.dispose(); + synchronized(modalMonitor) + { + System.out.println("Red pressed"); + modalMonitor.notify(); + } + } + } + ); cancelButton.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent event) { - m_ret=LedColor.UNKNOWN; - frame.dispose(); - synchronized(modalMonitor) - { - System.out.println("Cancel pressed"); - modalMonitor.notify(); - } - } - } - ); + m_ret=LedColor.UNKNOWN; + frame.dispose(); + synchronized(modalMonitor) + { + System.out.println("Cancel pressed"); + modalMonitor.notify(); + } + } + } + ); System.out.println("askUploadDB done"); } Modified: java/trunk/steering-files/src/main/resources/org/hps/steering/monitoring/EcalLedSequenceStandalone.lcsim ============================================================================= --- java/trunk/steering-files/src/main/resources/org/hps/steering/monitoring/EcalLedSequenceStandalone.lcsim (original) +++ java/trunk/steering-files/src/main/resources/org/hps/steering/monitoring/EcalLedSequenceStandalone.lcsim Thu Mar 10 12:51:10 2016 @@ -1,43 +1,53 @@ - <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="EcalRunningPedestal"/> - <driver name="EcalRawConverter" /> - <driver name="LedAnalysisDriver"/> - <driver name="AidaSaveDriver"/> - </execute> - <drivers> - <driver name="EventMarkerDriver" type="org.lcsim.job.EventMarkerDriver"> - <eventInterval>100000</eventInterval> - </driver> - <driver name="EcalRunningPedestal" type="org.hps.recon.ecal.EcalRunningPedestalDriver"> - <minLookbackEvents>10</minLookbackEvents> - <maxLookbackEvents>50</maxLookbackEvents> - </driver> - <driver name="EcalRawConverter" type="org.hps.recon.ecal.EcalRawConverterDriver"> - <ecalCollectionName>EcalCalHits</ecalCollectionName> - <useTimestamps>false</useTimestamps> - <useTruthTime>false</useTruthTime> - <useRunningPedestal>true</useRunningPedestal> - <useTimeWalkCorrection>true</useTimeWalkCorrection> - <nsa>60</nsa> <!-- these are critical since the defaults in software are 100 - 20, as in prod. runs --> - <nsb>16</nsb> - </driver> - <driver name="LedAnalysisDriver" type="org.hps.monitoring.ecal.plots.EcalLedSequenceMonitor"> - <isMonitoringApp>false</isMonitoringApp> - <doFullAnalysis>false</doFullAnalysis> - <skipMin>0.2</skipMin> - <skipInitial>0.05</skipInitial> - <useRawEnergy>true</useRawEnergy> - <energyCut>2.0</energyCut> - <nEventsMin>300</nEventsMin> - <evnMinDraw>0.</evnMinDraw> - <evnMaxDraw>80000.</evnMaxDraw> - <saveTuple>false</saveTuple> - </driver> - <driver name="AidaSaveDriver" type="org.lcsim.job.AidaSaveDriver"> - <outputFileName>${outputFile}.LedAnalysis.aida</outputFileName> - </driver> - </drivers> - </lcsim> + <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="EcalRunningPedestal"/> + <driver name="EcalRawConverter" /> + <driver name="LedAnalysisDriver"/> + <driver name="AidaSaveDriver"/> + </execute> + <drivers> + <driver name="EventMarkerDriver" type="org.lcsim.job.EventMarkerDriver"> + <eventInterval>100000</eventInterval> + </driver> + <driver name="EcalRunningPedestal" type="org.hps.recon.ecal.EcalRunningPedestalDriver"> + <minLookbackEvents>10</minLookbackEvents> + <maxLookbackEvents>50</maxLookbackEvents> + </driver> + <driver name="EcalRawConverter" type="org.hps.recon.ecal.EcalRawConverterDriver"> + <ecalCollectionName>EcalCalHits</ecalCollectionName> + <useTimestamps>false</useTimestamps> + <useTruthTime>false</useTruthTime> + <useRunningPedestal>true</useRunningPedestal> + <useTimeWalkCorrection>true</useTimeWalkCorrection> + <nsa>60</nsa> <!-- these are critical since the defaults in software are 100 - 20, as in prod. runs --> + <nsb>16</nsb> + </driver> + <!-- <driver name="EcalEventDisplay" type="org.hps.monitoring.ecal.plots.EcalEventDisplay"> + <inputCollection>EcalCalHits</inputCollection> + <inputCollectionRaw>EcalReadoutHits</inputCollectionRaw> + <inputClusterCollection>EcalClusters</inputClusterCollection> + <pedSamples>20</pedSamples> + <maxEch>15.0</maxEch> + <minEch>0.005</minEch> + <eventRefreshRate>2</eventRefreshRate> + </driver> + --> + <driver name="LedAnalysisDriver" type="org.hps.monitoring.ecal.plots.EcalLedSequenceMonitor"> + <isMonitoringApp>false</isMonitoringApp> + <doFullAnalysis>false</doFullAnalysis> + <skipMin>0.2</skipMin> + <skipInitial>0.05</skipInitial> + <useRawEnergy>true</useRawEnergy> + <energyCut>2.0</energyCut> + <nEventsMin>300</nEventsMin> + <evnMinDraw>0.</evnMinDraw> + <evnMaxDraw>80000.</evnMaxDraw> + <saveTuple>false</saveTuple> + </driver> + <driver name="AidaSaveDriver" type="org.lcsim.job.AidaSaveDriver"> + <outputFileName>${outputFile}.LedAnalysis.aida</outputFileName> + </driver> + </drivers> + </lcsim> Added: java/trunk/users/src/main/java/org/hps/users/celentan/LedOnlineDataDumpDriver.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/celentan/LedOnlineDataDumpDriver.java (added) +++ java/trunk/users/src/main/java/org/hps/users/celentan/LedOnlineDataDumpDriver.java Thu Mar 10 12:51:10 2016 @@ -0,0 +1,169 @@ +package org.hps.users.celentan; + +import java.util.HashMap; +import java.util.Map; + +import org.lcsim.event.EventHeader; +import org.lcsim.geometry.Detector; +import org.lcsim.util.Driver; +import org.lcsim.util.aida.AIDA; + +import hep.aida.IHistogram1D; +import hep.aida.IHistogram2D; +import hep.aida.IPlotter; +import hep.aida.IPlotterFactory; +import hep.aida.IPlotterStyle; +import hep.aida.IProfile1D; + + + + + + + +import org.hps.conditions.api.ConditionsObjectException; +import org.hps.conditions.api.ConditionsRecord; +import org.hps.conditions.api.DatabaseObjectException; +import org.hps.conditions.api.TableMetaData; +import org.hps.conditions.database.DatabaseConditionsManager; +import org.hps.conditions.ecal.EcalChannel; +import org.hps.conditions.ecal.EcalChannel.EcalChannelCollection; +import org.hps.conditions.ecal.EcalChannelConstants; +import org.hps.conditions.ecal.EcalConditions; +import org.hps.conditions.ecal.EcalLed; +import org.hps.conditions.ecal.EcalLed.EcalLedCollection; +import org.hps.conditions.ecal.EcalLedCalibration; +import org.hps.conditions.ecal.EcalLedCalibration.EcalLedCalibrationCollection; +import org.hps.conditions.ecal.EcalLedCalibration.LedColor; + +import java.io.*; +import java.util.Scanner; + +/** + * This is a skeleton that can be used to create a user analysis Driver in LCSim. + * @author Jeremy McCormick <[log in to unmask]> + */ +public class LedOnlineDataDumpDriver extends Driver { + + + int runNumber; + + + DatabaseConditionsManager conditionsManager; + + private EcalChannelCollection ChannelCollection; + private EcalLedCollection LEDCollection; + private EcalConditions ecalConditions; + private EcalLedCalibrationCollection LEDCalibrations; + + + + + Map < Integer,Double > onlineResponse; + Map < Integer,Double > offlineResponse; + Map < Integer,Double > onlineRMS; + Map < Integer,Double > offlineRMS; + + + private static final int NUM_CHANNELS = 442; + /** + * Your Driver should have a public constructor. + */ + public LedOnlineDataDumpDriver(){ + getLogger().info("Hello LedOnlineDataDumpDriver!"); + } + + + /** + * Process a single event. + * Your analysis code should go in here. + * @param event The LCSim event to process. + */ + public void process(EventHeader event) { + + } + + /** + * Initialization code should go here that doesn't need the conditions system or Detector. + */ + public void startOfData() { + getLogger().info("start of data"); + } + + /** + * Driver setup should go here that needs information from the conditions system or Detector. + * @param detector The LCSim Detector object. + */ + public void detectorChanged(Detector detector) { + getLogger().info("detector changed"); + + onlineResponse = new HashMap< Integer , Double >(); + offlineResponse= new HashMap< Integer , Double >(); + onlineRMS= new HashMap< Integer , Double >(); + offlineRMS= new HashMap< Integer , Double >(); + + conditionsManager = DatabaseConditionsManager.getInstance(); + ChannelCollection = conditionsManager.getCachedConditions(EcalChannelCollection.class, "ecal_channels").getCachedData(); + ecalConditions = conditionsManager.getEcalConditions(); + LEDCollection = conditionsManager.getCachedConditions(EcalLedCollection.class, "ecal_leds").getCachedData(); + LEDCalibrations = conditionsManager.getCachedConditions(EcalLedCalibrationCollection.class,"ecal_led_calibrations").getCachedData(); + + + // Setup plots + + } + + + public void endOfData(){ + + int channel_id; + int row,column; + double led_response_online,led_rms_online; + double led_response_offline,led_rms_offline; + double diff,ratio; + + + getLogger().info("end of data"); + runNumber= conditionsManager.getRun(); + System.out.println("runNumber is:"+runNumber); + for (EcalLedCalibration LEDcalibration : LEDCalibrations){ + + channel_id=LEDcalibration.getFieldValue("ecal_channel_id"); + led_response_online=LEDcalibration.getFieldValue("led_response"); + led_rms_online=LEDcalibration.getFieldValue("rms"); + + + + } + String fileName = runNumber+".raw.txt"; + try { + //Create object of FileWriter + FileWriter outputFile = new FileWriter(fileName); + + //Instantiate the BufferedWriter Class + BufferedWriter bufferWriter = new BufferedWriter(outputFile); + + //Variable to hold the one line data + String line; + for (EcalLedCalibration LEDcalibration : LEDCalibrations){ + + channel_id=LEDcalibration.getFieldValue("ecal_channel_id"); + led_response_online=LEDcalibration.getFieldValue("led_response"); + led_rms_online=LEDcalibration.getFieldValue("rms"); + EcalChannel ch=ChannelCollection.findChannel(channel_id); + row=ch.getY(); + column=ch.getX(); + + line=channel_id+" "+column+" "+row+" "+led_response_online+" "+led_rms_online+"\n"; + bufferWriter.write(line); + + + + } + //Close the buffer reader + bufferWriter.close(); + } catch (IOException e) { + System.err.println(e); + } + } +}