Author: [log in to unmask] Date: Thu Sep 1 04:13:53 2016 New Revision: 4473 Log: added more debug to pulse fitting 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/EcalPulseFitter.java java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/EcalRawConverter.java java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/EcalRawConverterDriver.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 Thu Sep 1 04:13:53 2016 @@ -23,6 +23,7 @@ import org.lcsim.event.GenericObject; import org.lcsim.event.LCRelation; import org.lcsim.event.RawCalorimeterHit; +import org.lcsim.event.RawTrackerHit; import org.lcsim.geometry.Detector; import org.lcsim.util.Driver; import org.lcsim.util.aida.AIDA; @@ -52,7 +53,7 @@ private static final int minimumStats = 1000; private static final DecimalFormat dbNumberFormat=new DecimalFormat("#.####"); - + private static final String[] filenamesDAQ = { "fadc37.ped", "fadc39.ped" }; private static final String filenameDB = "hpsDB.txt"; @@ -61,9 +62,12 @@ private int runNumber = 0; private static final int runNumberMax = 9999; - + private boolean writeFileForDB = true; private boolean writeFileForDAQ = true; + + private boolean batch = false; + private DatabaseConditionsManager conditionsManager = null; private EcalConditions ecalConditions = null; @@ -72,6 +76,9 @@ private int nDetectorChanges = 0; + public void setBatch(boolean batch){ + this.batch = batch; + } public EcalPedestalCalculator() { } @@ -79,13 +86,16 @@ protected void startOfData() { } + @Override public void endOfData() { + if(batch) + return; Console cc = System.console(); if (cc == null) { throw new IllegalStateException("Could not access system console."); } - + System.err.println("\n\n\n***************************************************************\n"); String userInput=""; String outputFilePrefix=""; @@ -96,13 +106,13 @@ } else { outputFilePrefix = userInput; } - + String date = new SimpleDateFormat("yyyy-MM-dd-hh-mm").format(new Date()); outputFilePrefix += date+"_"; if (writeFileForDAQ) writeFileForDAQ(outputFilePrefix); if (writeFileForDB) writeFileForDB(outputFilePrefix); - + System.out.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+"********"); @@ -130,7 +140,7 @@ if (nDetectorChanges++ > 1) { throw new RuntimeException("No Detector Change Allowed."); } - + conditionsManager = DatabaseConditionsManager.getInstance(); ecalConditions = conditionsManager.getEcalConditions(); @@ -148,11 +158,11 @@ private void uploadToDB() throws DatabaseObjectException, ConditionsObjectException, SQLException { 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)); @@ -172,17 +182,17 @@ throw new RuntimeException(e); } 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(); - - } - + ConditionsRecord conditionsRecord = new ConditionsRecord( + calibrations.getCollectionId(), runNumber, runNumberMax, dbTableName, dbTableName, + "Generated by EcalPedestalCalculator from Run #"+runNumber, dbTag); + conditionsRecord.insert(); + + } + private void writeFileForDB(String outputFilePrefix) { System.out.println("\nWriting pedestal file for HPS Conditions Database:\n" + outputFilePrefix + filenameDB); @@ -257,11 +267,38 @@ } } } - } - + else{ + for(RawTrackerHit hit : event.get(RawTrackerHit.class,rawCollectionName)){ + fillHisto(event, hit); + } + } + + } + + private void fillHisto(EventHeader event, RawTrackerHit hit) { + + double ped = 0; + int N = 4; + for(int i = 0; i< N; i++){ + ped += hit.getADCValues()[i]/N; + } + + EcalChannel cc = findChannel(hit); + if (cc == null) { + System.err.println("Hit doesn't correspond to ecalchannel."); + return; + } + aida.histogram1D(getHistoName(cc)).fill(ped); + } + private void fillHisto(EventHeader event, RawCalorimeterHit hit, GenericObject mode7data) { - final int min = ((HitExtraData.Mode7Data) mode7data).getAmplLow(); - final int max = ((HitExtraData.Mode7Data) mode7data).getAmplHigh(); + + int min = 0, max = 0; + if(mode7data instanceof HitExtraData.Mode7Data){ + min = ((HitExtraData.Mode7Data) mode7data).getAmplLow(); + max = ((HitExtraData.Mode7Data) mode7data).getAmplHigh(); + } + // ignore if pulse at beginning of window: if (max <= 0) return; @@ -281,6 +318,10 @@ return ecalConditions.getChannelCollection().findGeometric(hit.getCellID()); } + public EcalChannel findChannel(RawTrackerHit hit) { + return ecalConditions.getChannelCollection().findGeometric(hit.getCellID()); + } + public EcalChannel findChannel(int crate, int slot, int chan) { for (EcalChannel cc : ecalConditions.getChannelCollection()) { if (crate == cc.getCrate() && slot == cc.getSlot() && chan == cc.getChannel()) { Modified: java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/EcalPulseFitter.java ============================================================================= --- java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/EcalPulseFitter.java (original) +++ java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/EcalPulseFitter.java Thu Sep 1 04:13:53 2016 @@ -7,6 +7,8 @@ import hep.aida.IFitter; import hep.aida.IFunction; import hep.aida.IFunctionFactory; +import hep.aida.IHistogram1D; +import hep.aida.IPlotter; //import java.io.FileWriter; //import java.io.IOException; @@ -33,7 +35,7 @@ public class EcalPulseFitter { private EcalConditions ecalConditions = null; - + /** * If this is false, the width will be a free parameter in the fit: */ @@ -43,17 +45,17 @@ * don't bother fitting pulses with threshold crossing outside this sample range: */ public int threshRange[]={7,20}; // (28 ns <--> 80 ns) - + /** * restrict fit's time0 parameter to this range: (units=samples) */ public int t0limits[]={1,30}; - + /** * fit sample range relative to threshold crossing */ private final static int fitRange[]={-10,15}; - + /** * sample range relative to threshold crossing used to initialize pedestal fit parameter: */ @@ -68,32 +70,32 @@ * 442 channels' widths, measured from 2015 data (units = samples) */ private final static double threePoleWidths[]={ - 2.44057,2.40057,2.53389,2.32095,2.44267,2.43631,2.40292,2.46911,2.36032,2.42132,2.41473,2.43864,2.37710,2.43278,2.49126,2.41739,2.40560, - 2.42042,2.51278,2.46731,2.42647,2.35636,2.55308,2.47517,2.38748,2.48324,2.53726,2.54780,2.50771,2.45188,2.35011,2.35110,2.37575,2.37649, - 2.41037,2.38817,2.52422,2.47389,2.40672,2.59415,2.35626,2.44359,2.54118,2.42893,2.43100,2.32748,2.34831,2.30641,2.40003,2.38997,2.41643, - 2.45717,2.44830,2.48149,2.44339,2.33572,2.42276,2.43731,2.44205,2.37290,2.54975,2.44517,2.39132,2.48821,2.45687,2.39768,2.61674,2.52142, - 2.46620,2.46802,2.54764,2.45238,2.48421,2.44521,2.47204,2.50415,2.47346,2.51053,2.44811,2.54895,2.44839,2.51419,2.45706,2.38596,2.46743, - 2.49971,2.37904,2.46478,2.43015,2.52088,2.55846,2.50522,2.30973,2.41450,2.40907,2.31343,2.48668,2.46800,2.43559,2.42113,2.47494,2.36971, - 2.44022,2.44193,2.42661,2.41918,2.41102,2.51565,2.34875,2.36750,2.37355,2.48763,2.36659,2.42424,2.44321,2.46651,2.52053,2.46172,2.41316, - 2.41670,2.41661,2.53472,2.49345,2.46496,2.40006,2.41084,2.44442,2.49113,2.42821,2.56839,2.45630,2.46344,2.42585,2.43730,2.44339,2.44315, - 2.48069,2.39892,2.36987,2.40482,2.40103,2.36307,2.46118,2.47136,2.39327,2.46267,2.30668,2.45917,2.46903,2.51727,2.27056,2.46365,2.35228, - 2.52188,2.44052,2.41457,2.25591,2.51210,2.43585,2.57410,2.46877,2.37902,2.46975,2.45628,2.44264,2.36588,2.48233,2.46351,2.37512,2.44228, - 2.52664,2.51927,2.37348,2.52284,2.52505,2.55755,2.51522,2.44848,2.51430,2.41387,2.42311,2.42880,2.46546,2.40000,2.45992,2.46841,2.43101, - 2.22369,2.43262,2.41324,2.45465,2.40752,2.50491,2.45191,2.40109,2.49099,2.37011,2.70111,2.46843,2.44336,2.44675,2.42308,2.51800,2.45660, - 2.43406,2.43297,2.37133,2.50718,2.43035,2.42818,2.47709,2.40578,2.39228,2.47350,2.51876,2.39584,2.44114,2.49120,2.48185,2.59246,2.41612, - 2.42914,2.51496,2.38785,2.53339,2.30056,2.25807,2.40500,2.53300,2.37439,2.48418,2.33764,2.47934,2.33080,2.48834,2.48318,2.42860,2.28253, - 2.44013,2.38272,2.23632,2.37630,2.34564,2.34538,2.44281,2.33952,2.33574,2.40939,2.44992,2.43986,2.45022,2.39336,2.43253,2.38136,2.41941, - 2.56685,2.54684,2.43060,2.33258,2.43024,2.48895,2.51698,2.38837,2.45276,2.38518,2.35826,2.38321,2.31616,2.46480,2.53753,2.28027,2.50727, - 2.35369,2.29179,2.06776,2.49429,2.35639,2.42628,2.55657,2.51859,2.49579,2.45617,2.41293,2.47083,2.51653,2.47478,2.46354,2.48828,2.34846, - 2.34419,2.43172,2.46589,2.45462,2.52146,2.35946,2.38810,2.46027,2.53848,2.48102,2.42701,2.51750,2.57911,2.45136,2.48329,2.39329,2.48209, - 2.35948,2.49431,2.36117,2.26121,2.40899,2.51383,2.41642,2.52102,2.39702,2.43949,2.40867,2.38560,2.46874,2.22937,2.40741,2.36007,2.38784, - 2.41052,2.42673,2.39476,2.40239,2.46902,2.55278,2.44661,2.54734,2.41863,2.42451,2.40056,2.44307,2.35066,2.46254,2.43270,2.50439,2.49733, - 2.55563,2.48589,2.45219,2.44774,2.41116,2.49081,2.43893,2.43731,2.55774,2.42404,2.37911,2.45140,2.47196,2.50533,2.38292,2.47868,2.48262, - 2.39845,2.42290,2.54415,2.43109,2.54306,2.49385,2.35113,2.43233,2.50552,2.49532,2.42667,2.53772,2.41398,2.41968,2.59536,2.52077,2.42026, - 2.51269,2.42584,2.54930,2.63547,2.42869,2.43348,2.42402,2.38768,2.41903,2.50153,2.45315,2.45472,2.41113,2.44795,2.50849,2.41817,2.44166, - 2.61143,2.38567,2.40737,2.39843,2.43711,2.35324,2.48315,2.38388,2.45665,2.30220,2.41293,2.36640,2.38185,2.40913,2.49233,2.46818,2.51527, - 2.54177,2.37051,2.37318,2.38405,2.53258,2.58176,2.53786,2.52385,2.40308,2.45279,2.39370,2.50056,2.41076,2.40789,2.47444,2.52857,2.40741, - 2.38524,2.39403,2.42442,2.56829,2.56063,2.58340,2.42897,2.58796,2.56262,2.53480,2.43707,2.38258,2.46584,2.40596,2.42590,2.48281,2.47800 + 2.44057,2.40057,2.53389,2.32095,2.44267,2.43631,2.40292,2.46911,2.36032,2.42132,2.41473,2.43864,2.37710,2.43278,2.49126,2.41739,2.40560, + 2.42042,2.51278,2.46731,2.42647,2.35636,2.55308,2.47517,2.38748,2.48324,2.53726,2.54780,2.50771,2.45188,2.35011,2.35110,2.37575,2.37649, + 2.41037,2.38817,2.52422,2.47389,2.40672,2.59415,2.35626,2.44359,2.54118,2.42893,2.43100,2.32748,2.34831,2.30641,2.40003,2.38997,2.41643, + 2.45717,2.44830,2.48149,2.44339,2.33572,2.42276,2.43731,2.44205,2.37290,2.54975,2.44517,2.39132,2.48821,2.45687,2.39768,2.61674,2.52142, + 2.46620,2.46802,2.54764,2.45238,2.48421,2.44521,2.47204,2.50415,2.47346,2.51053,2.44811,2.54895,2.44839,2.51419,2.45706,2.38596,2.46743, + 2.49971,2.37904,2.46478,2.43015,2.52088,2.55846,2.50522,2.30973,2.41450,2.40907,2.31343,2.48668,2.46800,2.43559,2.42113,2.47494,2.36971, + 2.44022,2.44193,2.42661,2.41918,2.41102,2.51565,2.34875,2.36750,2.37355,2.48763,2.36659,2.42424,2.44321,2.46651,2.52053,2.46172,2.41316, + 2.41670,2.41661,2.53472,2.49345,2.46496,2.40006,2.41084,2.44442,2.49113,2.42821,2.56839,2.45630,2.46344,2.42585,2.43730,2.44339,2.44315, + 2.48069,2.39892,2.36987,2.40482,2.40103,2.36307,2.46118,2.47136,2.39327,2.46267,2.30668,2.45917,2.46903,2.51727,2.27056,2.46365,2.35228, + 2.52188,2.44052,2.41457,2.25591,2.51210,2.43585,2.57410,2.46877,2.37902,2.46975,2.45628,2.44264,2.36588,2.48233,2.46351,2.37512,2.44228, + 2.52664,2.51927,2.37348,2.52284,2.52505,2.55755,2.51522,2.44848,2.51430,2.41387,2.42311,2.42880,2.46546,2.40000,2.45992,2.46841,2.43101, + 2.22369,2.43262,2.41324,2.45465,2.40752,2.50491,2.45191,2.40109,2.49099,2.37011,2.70111,2.46843,2.44336,2.44675,2.42308,2.51800,2.45660, + 2.43406,2.43297,2.37133,2.50718,2.43035,2.42818,2.47709,2.40578,2.39228,2.47350,2.51876,2.39584,2.44114,2.49120,2.48185,2.59246,2.41612, + 2.42914,2.51496,2.38785,2.53339,2.30056,2.25807,2.40500,2.53300,2.37439,2.48418,2.33764,2.47934,2.33080,2.48834,2.48318,2.42860,2.28253, + 2.44013,2.38272,2.23632,2.37630,2.34564,2.34538,2.44281,2.33952,2.33574,2.40939,2.44992,2.43986,2.45022,2.39336,2.43253,2.38136,2.41941, + 2.56685,2.54684,2.43060,2.33258,2.43024,2.48895,2.51698,2.38837,2.45276,2.38518,2.35826,2.38321,2.31616,2.46480,2.53753,2.28027,2.50727, + 2.35369,2.29179,2.06776,2.49429,2.35639,2.42628,2.55657,2.51859,2.49579,2.45617,2.41293,2.47083,2.51653,2.47478,2.46354,2.48828,2.34846, + 2.34419,2.43172,2.46589,2.45462,2.52146,2.35946,2.38810,2.46027,2.53848,2.48102,2.42701,2.51750,2.57911,2.45136,2.48329,2.39329,2.48209, + 2.35948,2.49431,2.36117,2.26121,2.40899,2.51383,2.41642,2.52102,2.39702,2.43949,2.40867,2.38560,2.46874,2.22937,2.40741,2.36007,2.38784, + 2.41052,2.42673,2.39476,2.40239,2.46902,2.55278,2.44661,2.54734,2.41863,2.42451,2.40056,2.44307,2.35066,2.46254,2.43270,2.50439,2.49733, + 2.55563,2.48589,2.45219,2.44774,2.41116,2.49081,2.43893,2.43731,2.55774,2.42404,2.37911,2.45140,2.47196,2.50533,2.38292,2.47868,2.48262, + 2.39845,2.42290,2.54415,2.43109,2.54306,2.49385,2.35113,2.43233,2.50552,2.49532,2.42667,2.53772,2.41398,2.41968,2.59536,2.52077,2.42026, + 2.51269,2.42584,2.54930,2.63547,2.42869,2.43348,2.42402,2.38768,2.41903,2.50153,2.45315,2.45472,2.41113,2.44795,2.50849,2.41817,2.44166, + 2.61143,2.38567,2.40737,2.39843,2.43711,2.35324,2.48315,2.38388,2.45665,2.30220,2.41293,2.36640,2.38185,2.40913,2.49233,2.46818,2.51527, + 2.54177,2.37051,2.37318,2.38405,2.53258,2.58176,2.53786,2.52385,2.40308,2.45279,2.39370,2.50056,2.41076,2.40789,2.47444,2.52857,2.40741, + 2.38524,2.39403,2.42442,2.56829,2.56063,2.58340,2.42897,2.58796,2.56262,2.53480,2.43707,2.38258,2.46584,2.40596,2.42590,2.48281,2.47800 }; // Stuff for debugging: @@ -109,7 +111,47 @@ IFunction fitFcn3Pole=new Ecal3PoleFunction(); IDataPointSet fitData=aida.analysisFactory().createDataPointSetFactory(null).create("ADC DataPointSet", 2); - + + private boolean debug; + private IPlotter plotter1; + private IPlotter plotter2; + private IHistogram1D chi2Hist; + private IHistogram1D widthOffsetHist; + private IHistogram1D widthOffsets[]; + private int skipHits = 100000; + private int displayHits = 100; + private int hitCount = 0; + public void setDebug(boolean debug){ + this.debug = debug; + if(debug){ + this.plotter1 = aida.analysisFactory().createPlotterFactory().create(); + plotter1.show(); + this.plotter2 = aida.analysisFactory().createPlotterFactory().create(); + plotter2.createRegions(2,2); + chi2Hist = aida.histogram1D("chi2", 100, 0, 100); + widthOffsetHist = aida.histogram1D("width offset", 200, -1, 1); + widthOffsets = new IHistogram1D[442]; + for(int i = 0; i< 442; i++){ + widthOffsets[i] = aida.histogram1D("width offset " + (i+1), 200, -1, 1); + } + plotter2.region(0).plot(chi2Hist); + plotter2.region(1).plot(widthOffsetHist); + plotter2.show(); + } + else{ + if(this.plotter1 != null){ + this.plotter1.destroyRegions(); + this.plotter1.hide(); + this.plotter1 = null; + } + if(this.plotter2 != null){ + this.plotter2.destroyRegions(); + this.plotter2.hide(); + this.plotter2 = null; + } + } + } + /** * Perform and return "3-pole" fit of ECAL raw waveform. * @@ -120,16 +162,16 @@ * @return fit result, which can be null if fit fails or certain conditions are not met. */ public IFitResult fitPulse(RawTrackerHit hit,int threshCross,double maxADC) { - + //if (debug>0) System.err.println("FITTING....................................................."); - + final short samples[] = hit.getADCValues(); final double noise = findChannel(hit.getCellID()).getCalibration().getNoise(); final int cid = ecalConditions.getChannelCollection().findGeometric(hit.getCellID()).getChannelId(); // don't bother with pulses far from trigger: if (threshCross < threshRange[0] || threshCross > threshRange[1]) return null; - + // calculate pedestal for initializing fit parameters: int nped=0; double ped=0; @@ -140,74 +182,79 @@ ped += samples[ii]; nped++; } - + // don't bother trying to fit: - if (nped==0) return null; - ped /= nped; - - // choose points to fit and get starting value for pulse integral: - fitData.clear(); - int nFitPoints=0; - int iPeakADC=-1; - int sumADC=0; -// int maxADC=0; - for (int ii=threshCross+fitRange[0]; ii<threshCross+fitRange[1]; ii++) - { - if (ii<0) continue; - if (ii>=samples.length) break; - //if (debug>0) System.err.print(ii+":"+samples[ii]+" "); -// if (samples[ii] > maxADC) maxADC=samples[ii]; - if (iPeakADC<0 && ii<samples.length-1 && samples[ii+1] < samples[ii]) { - iPeakADC=ii; - } - sumADC += samples[ii]; - fitData.addPoint(); - fitData.point(nFitPoints).coordinate(0).setValue(ii); - fitData.point(nFitPoints).coordinate(1).setValue(samples[ii]); - fitData.point(nFitPoints).coordinate(1).setErrorMinus(noise); - fitData.point(nFitPoints).coordinate(1).setErrorPlus(noise); - nFitPoints++; - } - //if (debug>0) System.err.print("\n"); - - // don't bother trying to fit: - if (nFitPoints < 10) return null; - if (maxADC < ped) return null; - - //if (debug>0) System.err.println("------- "+ped+" "+threshCross+" "+maxADC); - - final double pulseIntegral = sumADC-ped*nFitPoints; - - // initialize parameters: - fitFcn3Pole.setParameter("pedestal",ped); - fitFcn3Pole.setParameter("time0",(double)threshCross-2); - fitFcn3Pole.setParameter("integral",pulseIntegral>0 ? pulseIntegral : 2); - if (globalThreePoleWidth>0) fitFcn3Pole.setParameter("width",globalThreePoleWidth); - else fitFcn3Pole.setParameter("width",threePoleWidths[cid-1]); - - // constrain parameters: -// fitter.fitParameterSettings("time0").setBounds(1,30); - fitter.fitParameterSettings("time0").setBounds(t0limits[0],t0limits[1]); - fitter.fitParameterSettings("width").setBounds(0.1,5); - fitter.fitParameterSettings("integral").setBounds(0,999999); - if (fixShapeParameter) fitter.fitParameterSettings("width").setFixed(true); - - /* + if (nped==0) return null; + ped /= nped; + + // choose points to fit and get starting value for pulse integral: + fitData.clear(); + int nFitPoints=0; + int iPeakADC=-1; + int sumADC=0; + // int maxADC=0; + for (int ii=threshCross+fitRange[0]; ii<threshCross+fitRange[1]; ii++) + { + if (ii<0) continue; + if (ii>=samples.length) break; + //if (debug>0) System.err.print(ii+":"+samples[ii]+" "); + // if (samples[ii] > maxADC) maxADC=samples[ii]; + if (iPeakADC<0 && ii<samples.length-1 && samples[ii+1] < samples[ii]) { + iPeakADC=ii; + } + sumADC += samples[ii]; + fitData.addPoint(); + fitData.point(nFitPoints).coordinate(0).setValue(ii); + fitData.point(nFitPoints).coordinate(1).setValue(samples[ii]); + fitData.point(nFitPoints).coordinate(1).setErrorMinus(noise); + fitData.point(nFitPoints).coordinate(1).setErrorPlus(noise); + nFitPoints++; + } + //if (debug>0) System.err.print("\n"); + + // don't bother trying to fit: + if (nFitPoints < 10) return null; + if (maxADC < ped) return null; + + //if (debug>0) System.err.println("------- "+ped+" "+threshCross+" "+maxADC); + + final double pulseIntegral = sumADC-ped*nFitPoints; + + // initialize parameters: + fitFcn3Pole.setParameter("pedestal",ped); + fitFcn3Pole.setParameter("time0",(double)threshCross-2); + fitFcn3Pole.setParameter("integral",pulseIntegral>0 ? pulseIntegral : 2); + if (globalThreePoleWidth>0) fitFcn3Pole.setParameter("width",globalThreePoleWidth); + else fitFcn3Pole.setParameter("width",threePoleWidths[cid-1]); + + // constrain parameters: + // fitter.fitParameterSettings("time0").setBounds(1,30); + fitter.fitParameterSettings("time0").setBounds(t0limits[0],t0limits[1]); + fitter.fitParameterSettings("width").setBounds(0.1,5); + fitter.fitParameterSettings("integral").setBounds(0,999999); + if (fixShapeParameter) fitter.fitParameterSettings("width").setFixed(true); + + /* if (debug>0) { System.err.println(String.format("A= %8.2f",fitFcn3Pole.parameter("integral"))); System.err.println(String.format("T= %8.2f",fitFcn3Pole.parameter("time0")*4)); System.err.println(String.format("P= %8.2f",fitFcn3Pole.parameter("pedestal"))); System.err.println(String.format("S= %8.2f",fitFcn3Pole.parameter("width"))); } else - */ - - // did this because something else was turning it back on every event - // once that thing stops doing that, this can be removed. - Logger.getLogger("org.freehep.math.minuit").setLevel(Level.OFF); - - IFitResult fitResult = fitter.fit(fitData,fitFcn3Pole); - -/* + */ + + // did this because something else was turning it back on every event + // once that thing stops doing that, this can be removed. + Logger.getLogger("org.freehep.math.minuit").setLevel(Level.OFF); + if(debug && hitCount >skipHits){ + System.out.println("pre fit"); + for(int i = 0; i< fitFcn3Pole.parameters().length; i++){ + System.out.println(fitFcn3Pole.parameterNames()[i] + "\t" +fitFcn3Pole.parameters()[i]); + } + } + IFitResult fitResult = fitter.fit(fitData,fitFcn3Pole); + + /* if (debug>0) { writeFit(samples,fitResult,cid); final double P = fitResult.fittedParameter("pedestal"); @@ -224,9 +271,9 @@ System.err.println(String.format("M = %8.2f",maxADC-P)); System.err.println(String.format("Q = %8.2f",Q)); } -*/ - -/* + */ + + /* // now fit just leading edge: IFitResult timeResult = null; if (doTimeFit) { @@ -237,23 +284,89 @@ fitter.fit(fitData,fitFcn3Pole); } IFitResult fitResults[] = {fitResult,timeResult}; -*/ - - return fitResult; + */ + if(debug && hitCount++ >skipHits){ + double max = 0; + double min = 99999; + for(int i = 0; i < fitData.size(); i ++){ + double v = fitData.point(i).coordinate(1).value(); + if(v > max) + max = v; + if(v < min) + min = v; + } + if(max-min < 100) + return fitResult; //skip this hit. too small. + if(hitCount % displayHits == 0){ + plotter1.region(0).clear(); + plotter1.region(0).plot(fitData); + plotter1.region(0).plot(fitResult.fittedFunction()); + + + System.out.println(hit.getCellID()); + System.out.println("after fit"); + for(int i = 0; i< fitFcn3Pole.parameters().length; i++){ + + System.out.printf("%s\t%.3f\t(+-%.3f)\n", + fitResult.fittedFunction().parameterNames()[i], + fitResult.fittedFunction().parameters()[i], + Math.sqrt(fitResult.covMatrixElement(i, i))); + } + } + double chi2 = getChi2(fitResult, fitData); + int dof = fitResult.ndf(); + if(hitCount % displayHits == 0){ + System.out.println("chi2\t" + chi2); + System.out.println("dof\t" + dof); + System.out.println("chi2 per dof\t" + chi2/dof); + } + + chi2Hist.fill(chi2); + widthOffsetHist.fill(fitResult.fittedParameter("width")-threePoleWidths[cid-1]); + widthOffsets[cid-1].fill(fitResult.fittedParameter("width")-threePoleWidths[cid-1]); + + + if(hitCount % displayHits == 0){ + System.out.println("Press enter to continue"); + try{ + System.in.read(); + } catch(Exception e){ + + } + plotter1.region(0).clear(); + } + } + return fitResult; + } + /** + * calculate chi2 for debug + * @param fitResult + * @param fitData2 + * @return + */ + private double getChi2(IFitResult fitResult, IDataPointSet fitData) { + double chi2 = 0; + for(int i = 0; i< fitData.size(); i++){ + double yp = fitResult.fittedFunction().value(new double[]{fitData.point(i).coordinate(0).value()}); + double y = fitData.point(i).coordinate(1).value(); + double ey = fitData.point(i).coordinate(1).errorMinus(); + chi2 += Math.pow((y-yp)/ey,2); + } + return chi2; } public void setDetector(Detector detector) { // ECAL combined conditions object. ecalConditions = DatabaseConditionsManager.getInstance().getEcalConditions(); } - + public EcalChannelConstants findChannel(long cellID) { return ecalConditions.getChannelConstants(ecalConditions.getChannelCollection().findGeometric(cellID)); } - - -/* + + + /* public void writeFit(short samples[],IFitResult fit,final int cid) { if (fitFileName == null) return; if (fitFileWriter == null) { @@ -285,17 +398,17 @@ } return ped; } -*/ - - - -/* + */ + + + + /* public IFitResult fitLeadingEdge(RawTrackerHit hit,int threshCross) { - + IFunction fitFcnLinear=functionFactory.createFunctionFromScript("fitFcnLinear",1,"p0+x[0]*p1","p0,p1","",null); final short samples[] = hit.getADCValues(); final double noise = findChannel(hit.getCellID()).getCalibration().getNoise(); - + int imaxADC=0; for (int ii=threshCross; ii<samples.length-1; ii++) { @@ -316,12 +429,12 @@ fitData.point(nFitPoints).coordinate(1).setErrorPlus(noise); nFitPoints++; } - + if (nFitPoints<2) return null; return fitter.fit(fitData,fitFcnLinear); } -*/ - - + */ + + } Modified: java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/EcalRawConverter.java ============================================================================= --- java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/EcalRawConverter.java (original) +++ java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/EcalRawConverter.java Thu Sep 1 04:13:53 2016 @@ -93,6 +93,13 @@ * The pulse fitter class. */ private EcalPulseFitter pulseFitter = new EcalPulseFitter(); + /** + * activates a display of all the fits in AIDA. + * @param display + */ + public void setDisplay(boolean display){ + pulseFitter.setDebug(display); + } /** * The time for one FADC sample (units = ns). @@ -711,5 +718,10 @@ public EcalChannelConstants findChannel(long cellID) { return ecalConditions.getChannelConstants(ecalConditions.getChannelCollection().findGeometric(cellID)); } + + + public void setFixedWidth(boolean fixedWidth) { + this.pulseFitter.fixShapeParameter = fixedWidth; + } } Modified: java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/EcalRawConverterDriver.java ============================================================================= --- java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/EcalRawConverterDriver.java (original) +++ java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/EcalRawConverterDriver.java Thu Sep 1 04:13:53 2016 @@ -180,6 +180,10 @@ public void setUseRunningPedestal(boolean useRunningPedestal) { converter.setUseRunningPedestal(useRunningPedestal); } + + public void setFixedWidth(boolean fixedWidth){ + this.converter.setFixedWidth(fixedWidth); + } /** * Set to <code>true</code> to generate a {@link org.lcsim.event.CalorimeterHit} @@ -344,6 +348,13 @@ public void setDebug(boolean debug) { this.debug = debug; } + + public void setDisplay(boolean display){ + this.display = display; + converter.setDisplay(display); + } + private boolean display; + /** * Set to <code>true</code> to use timestamp information from the ECal or trigger.