From 7e72ed4a0fa05cc097f004517b2f646aacd645de Mon Sep 17 00:00:00 2001 From: parshadkp <111451184+parshadkp@users.noreply.github.com> Date: Mon, 20 Oct 2025 15:44:31 -0500 Subject: [PATCH 01/10] Getting up to date with em-dee from main branch --- .DS_Store | Bin 0 -> 8196 bytes Config/Nuclearizer_singleDet_DEE.cfg | 133 + Config/Revan_singleDet_DEE.cfg | 117 + Makefile | 112 +- apps/AspectOptimizerStep1.cxx | 460 -- apps/ChargeLossCorrection.cxx | 659 -- apps/ChargeLossOffsets.cxx | 536 -- apps/EnergyResolutionCalibration.cxx | 23 +- apps/Makefile | 2 +- apps/ThresholdCalculation.cxx | 822 --- apps/ThresholdDeterminator.cxx | 2 +- apps/depth_calibration.cxx | 667 -- apps/depth_calibration2.cxx | 599 -- apps/depth_calibration_cosi2016.cxx | 624 -- apps/depth_calibration_cosi2016_v2.cxx | 756 -- apps/depth_calibration_cosi2016_v3.cxx | 730 -- apps/depth_scan_calibrator.cxx | 504 -- apps/pnGraphs.cxx | 466 -- apps/xyscanner.cxx | 355 - include/GCUHousekeepingParser.h | 246 - include/GCUSettingsParser.h | 112 - include/LivetimeParser.h | 32 - include/MAssembly.h | 39 +- include/MBinaryFlightDataParser.h | 276 - include/MDEEStripHit.h | 134 + include/MDepthCalibrator.h | 20 +- include/MDetectorEffectsEngineSMEX.h | 440 +- include/MDetectorEffectsEngineSingleDet.h | 495 ++ include/MGUIExpoTACcut.h | 124 + include/MGUIOptionsDEESMEX.h | 111 + include/MGUIOptionsDepthCalibration2024.h | 3 - include/MGUIOptionsEventSaver.h | 21 + include/MGUIOptionsLoaderMeasurements.h | 4 +- ...y.h => MGUIOptionsLoaderMeasurementsHDF.h} | 30 +- include/MGUIOptionsLoaderSimulations.h | 6 + ...h => MGUIOptionsLoaderSimulationsCosima.h} | 28 +- ...sReceiverBalloon.h => MGUIOptionsTACcut.h} | 54 +- include/MModuleChargeSharingCorrection.h | 105 - include/MModuleDEESMEX.h | 144 + include/MModuleDepthCalibration2024.h | 20 +- include/MModuleEventSaver.h | 73 +- include/MModuleLoaderMeasurements.h | 3 - include/MModuleLoaderMeasurementsBinary.h | 132 - include/MModuleLoaderMeasurementsHDF.h | 239 + include/MModuleLoaderMeasurementsROA.h | 3 + include/MModuleLoaderSimulationsCosima.h | 132 + include/MModuleLoaderSimulationsSingleDet.h | 116 + ...kCorrection.h => MModuleNearestNeighbor.h} | 43 +- include/MModuleReceiverBalloon.h | 173 - include/MModuleTACcut.h | 134 + include/MReadOutAssembly.h | 77 +- include/MReadOutElementVoxel3D.h | 123 + include/MShieldCrystalHit.h | 146 + include/MStripHit.h | 85 +- include/MStripMap.h | 105 + include/MSubModuleChargeTransport.h | 98 + include/MSubModuleDEEIntake.h | 97 + include/MSubModuleDEEOutput.h | 97 + include/MSubModuleDepthReadout.h | 97 + include/MSubModuleRandomCoincidence.h | 97 + include/MSubModuleShieldEnergyCorrection.h | 97 + include/MSubModuleShieldReadout.h | 97 + include/MSubModuleShieldTrigger.h | 113 + include/MSubModuleStripReadout.h | 97 + include/MSubModuleStripReadoutNoise.h | 97 + include/MSubModuleStripTrigger.h | 113 + include/MSubModuleTemplate.h | 97 + resource/.DS_Store | Bin 0 -> 6148 bytes resource/calibration/.DS_Store | Bin 0 -> 8196 bytes .../20240819_Am241_Cs137_Co57_LV.ecal | 777 ++ .../COSI_SingleDet/ACS_correction_file.txt | 6247 +++++++++++++++++ .../ChargeLossCoeffs_190311.log | 288 + .../ChargeSharingFactors_190311.txt | 24 + .../CrossTalkCorrection_Results_190726.txt | 74 + .../COSI_SingleDet/DeadStripList.txt | 7 + .../GuardRingThresholds_190726.dat | 26 + .../calibration/COSI_SingleDet/README.txt | 14 + .../ctd_depth_122.0keV.reformat.csv | 305 + .../ctd_depth_122.0keV_AnodeCathode.csv | 305 + .../COSI_SingleDet/deadtimeParameters.txt | 2 + ...lderPos_1166700Flux_10s_0050_Fluore.source | 46 + .../COSI_SingleDet/stretch_offset.csv | 3988 +++++++++++ .../tac_cut_params_fldelay_coinc400.csv | 131 + .../taccal_240225_channelsmapped.csv | 129 + .../COSI_SingleDet/thresholds_fake.dat | 128 + src/GCUHousekeepingParser.cxx | 553 -- src/GCUSettingsParser.cxx | 247 - src/LivetimeParser.cxx | 89 - src/MAspectReconstruction.cxx | 2 +- src/MAssembly.cxx | 25 +- src/MBinaryFlightDataParser.cxx | 2078 ------ src/MDEEStripHit.cxx | 74 + src/MDepthCalibrator.cxx | 136 +- src/MDetectorEffectsEngineBalloon.cxx | 15 +- src/MDetectorEffectsEngineSMEX.cxx | 451 +- src/MDetectorEffectsEngineSingleDet.cxx | 2727 +++++++ src/MGUIExpoTACcut.cxx | 282 + ...kCorrection.cxx => MGUIOptionsDEESMEX.cxx} | 41 +- src/MGUIOptionsDepthCalibration2024.cxx | 7 - src/MGUIOptionsEnergyCalibrationUniversal.cxx | 13 +- src/MGUIOptionsEventSaver.cxx | 69 +- src/MGUIOptionsLoaderMeasurements.cxx | 14 +- src/MGUIOptionsLoaderMeasurementsBinary.cxx | 178 - src/MGUIOptionsLoaderMeasurementsHDF.cxx | 141 + src/MGUIOptionsLoaderSimulations.cxx | 78 +- src/MGUIOptionsLoaderSimulationsCosima.cxx | 151 + src/MGUIOptionsReceiverBalloon.cxx | 196 - src/MGUIOptionsTACcut.cxx | 137 + src/MModuleChargeSharingCorrection.cxx | 471 -- src/MModuleCrosstalkCorrection.cxx | 618 -- src/MModuleDEESMEX.cxx | 294 + src/MModuleDepthCalibration2024.cxx | 602 +- src/MModuleDepthCalibrationB.cxx | 2 +- src/MModuleEnergyCalibrationUniversal.cxx | 15 +- src/MModuleEventFilter.cxx | 72 +- src/MModuleEventSaver.cxx | 109 +- src/MModuleLoaderMeasurements.cxx | 13 - src/MModuleLoaderMeasurementsBinary.cxx | 529 -- src/MModuleLoaderMeasurementsHDF.cxx | 568 ++ src/MModuleLoaderMeasurementsROA.cxx | 19 +- src/MModuleLoaderSimulationsCosima.cxx | 213 + src/MModuleLoaderSimulationsSingleDet.cxx | 284 + src/MModuleNearestNeighbor.cxx | 189 + src/MModuleReceiverBalloon.cxx | 629 -- src/MModuleStripPairingChiSquare.cxx | 1 + src/MModuleStripPairingGreedy.cxx | 1 + src/MModuleTACcut.cxx | 459 ++ src/MModuleTemplate.cxx | 90 +- src/MReadOutAssembly.cxx | 78 +- src/MReadOutElementVoxel3D.cxx | 301 + src/MShieldCrystalHit.cxx | 211 + src/MStripHit.cxx | 159 +- src/MStripMap.cxx | 162 + src/MSubModuleChargeTransport.cxx | 198 + src/MSubModuleDEEIntake.cxx | 246 + src/MSubModuleDEEOutput.cxx | 153 + src/MSubModuleDepthReadout.cxx | 159 + src/MSubModuleRandomCoincidence.cxx | 143 + src/MSubModuleShieldEnergyCorrection.cxx | 143 + src/MSubModuleShieldReadout.cxx | 143 + src/MSubModuleShieldTrigger.cxx | 143 + src/MSubModuleStripReadout.cxx | 155 + src/MSubModuleStripReadoutNoise.cxx | 155 + src/MSubModuleStripTrigger.cxx | 143 + src/MSubModuleTemplate.cxx | 143 + 145 files changed, 26132 insertions(+), 14868 deletions(-) create mode 100644 .DS_Store create mode 100644 Config/Nuclearizer_singleDet_DEE.cfg create mode 100644 Config/Revan_singleDet_DEE.cfg delete mode 100644 apps/AspectOptimizerStep1.cxx delete mode 100644 apps/ChargeLossCorrection.cxx delete mode 100644 apps/ChargeLossOffsets.cxx delete mode 100644 apps/ThresholdCalculation.cxx delete mode 100644 apps/depth_calibration.cxx delete mode 100644 apps/depth_calibration2.cxx delete mode 100644 apps/depth_calibration_cosi2016.cxx delete mode 100644 apps/depth_calibration_cosi2016_v2.cxx delete mode 100644 apps/depth_calibration_cosi2016_v3.cxx delete mode 100644 apps/depth_scan_calibrator.cxx delete mode 100644 apps/pnGraphs.cxx delete mode 100644 apps/xyscanner.cxx delete mode 100644 include/GCUHousekeepingParser.h delete mode 100644 include/GCUSettingsParser.h delete mode 100644 include/LivetimeParser.h delete mode 100644 include/MBinaryFlightDataParser.h create mode 100644 include/MDEEStripHit.h create mode 100644 include/MDetectorEffectsEngineSingleDet.h create mode 100644 include/MGUIExpoTACcut.h create mode 100644 include/MGUIOptionsDEESMEX.h rename include/{MGUIOptionsLoaderMeasurementsBinary.h => MGUIOptionsLoaderMeasurementsHDF.h} (65%) rename include/{MGUIOptionsCrosstalkCorrection.h => MGUIOptionsLoaderSimulationsCosima.h} (65%) rename include/{MGUIOptionsReceiverBalloon.h => MGUIOptionsTACcut.h} (59%) delete mode 100644 include/MModuleChargeSharingCorrection.h create mode 100644 include/MModuleDEESMEX.h delete mode 100644 include/MModuleLoaderMeasurementsBinary.h create mode 100644 include/MModuleLoaderMeasurementsHDF.h create mode 100644 include/MModuleLoaderSimulationsCosima.h create mode 100644 include/MModuleLoaderSimulationsSingleDet.h rename include/{MModuleCrosstalkCorrection.h => MModuleNearestNeighbor.h} (55%) delete mode 100644 include/MModuleReceiverBalloon.h create mode 100644 include/MModuleTACcut.h create mode 100644 include/MReadOutElementVoxel3D.h create mode 100644 include/MShieldCrystalHit.h create mode 100644 include/MStripMap.h create mode 100644 include/MSubModuleChargeTransport.h create mode 100644 include/MSubModuleDEEIntake.h create mode 100644 include/MSubModuleDEEOutput.h create mode 100644 include/MSubModuleDepthReadout.h create mode 100644 include/MSubModuleRandomCoincidence.h create mode 100644 include/MSubModuleShieldEnergyCorrection.h create mode 100644 include/MSubModuleShieldReadout.h create mode 100644 include/MSubModuleShieldTrigger.h create mode 100644 include/MSubModuleStripReadout.h create mode 100644 include/MSubModuleStripReadoutNoise.h create mode 100644 include/MSubModuleStripTrigger.h create mode 100644 include/MSubModuleTemplate.h create mode 100644 resource/.DS_Store create mode 100644 resource/calibration/.DS_Store create mode 100644 resource/calibration/COSI_SingleDet/20240819_Am241_Cs137_Co57_LV.ecal create mode 100644 resource/calibration/COSI_SingleDet/ACS_correction_file.txt create mode 100644 resource/calibration/COSI_SingleDet/ChargeLossCoeffs_190311.log create mode 100644 resource/calibration/COSI_SingleDet/ChargeSharingFactors_190311.txt create mode 100644 resource/calibration/COSI_SingleDet/CrossTalkCorrection_Results_190726.txt create mode 100644 resource/calibration/COSI_SingleDet/DeadStripList.txt create mode 100644 resource/calibration/COSI_SingleDet/GuardRingThresholds_190726.dat create mode 100644 resource/calibration/COSI_SingleDet/README.txt create mode 100644 resource/calibration/COSI_SingleDet/ctd_depth_122.0keV.reformat.csv create mode 100644 resource/calibration/COSI_SingleDet/ctd_depth_122.0keV_AnodeCathode.csv create mode 100644 resource/calibration/COSI_SingleDet/deadtimeParameters.txt create mode 100644 resource/calibration/COSI_SingleDet/source_ex/Cs137_singleDetBGO_sourceHolderPos_1166700Flux_10s_0050_Fluore.source create mode 100644 resource/calibration/COSI_SingleDet/stretch_offset.csv create mode 100644 resource/calibration/COSI_SingleDet/tac_cut_params_fldelay_coinc400.csv create mode 100644 resource/calibration/COSI_SingleDet/taccal_240225_channelsmapped.csv create mode 100644 resource/calibration/COSI_SingleDet/thresholds_fake.dat delete mode 100644 src/GCUHousekeepingParser.cxx delete mode 100644 src/GCUSettingsParser.cxx delete mode 100644 src/LivetimeParser.cxx delete mode 100644 src/MBinaryFlightDataParser.cxx create mode 100644 src/MDEEStripHit.cxx create mode 100644 src/MDetectorEffectsEngineSingleDet.cxx create mode 100644 src/MGUIExpoTACcut.cxx rename src/{MGUIOptionsCrosstalkCorrection.cxx => MGUIOptionsDEESMEX.cxx} (58%) delete mode 100644 src/MGUIOptionsLoaderMeasurementsBinary.cxx create mode 100644 src/MGUIOptionsLoaderMeasurementsHDF.cxx create mode 100644 src/MGUIOptionsLoaderSimulationsCosima.cxx delete mode 100644 src/MGUIOptionsReceiverBalloon.cxx create mode 100644 src/MGUIOptionsTACcut.cxx delete mode 100644 src/MModuleChargeSharingCorrection.cxx delete mode 100644 src/MModuleCrosstalkCorrection.cxx create mode 100644 src/MModuleDEESMEX.cxx delete mode 100644 src/MModuleLoaderMeasurementsBinary.cxx create mode 100644 src/MModuleLoaderMeasurementsHDF.cxx create mode 100644 src/MModuleLoaderSimulationsCosima.cxx create mode 100644 src/MModuleLoaderSimulationsSingleDet.cxx create mode 100644 src/MModuleNearestNeighbor.cxx delete mode 100644 src/MModuleReceiverBalloon.cxx create mode 100644 src/MModuleTACcut.cxx create mode 100644 src/MReadOutElementVoxel3D.cxx create mode 100644 src/MShieldCrystalHit.cxx create mode 100644 src/MStripMap.cxx create mode 100644 src/MSubModuleChargeTransport.cxx create mode 100644 src/MSubModuleDEEIntake.cxx create mode 100644 src/MSubModuleDEEOutput.cxx create mode 100644 src/MSubModuleDepthReadout.cxx create mode 100644 src/MSubModuleRandomCoincidence.cxx create mode 100644 src/MSubModuleShieldEnergyCorrection.cxx create mode 100644 src/MSubModuleShieldReadout.cxx create mode 100644 src/MSubModuleShieldTrigger.cxx create mode 100644 src/MSubModuleStripReadout.cxx create mode 100644 src/MSubModuleStripReadoutNoise.cxx create mode 100644 src/MSubModuleStripTrigger.cxx create mode 100644 src/MSubModuleTemplate.cxx diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..2705689e8a65a924aa1fd3d9f5af49d49ac497fd GIT binary patch literal 8196 zcmeHM&2JM&6n_)Dc$bv22@VZak*xZHL^0H0VV;!!YrgSip2p*)QdcnMzm!dB|(2!in#AZ+{0&Q2yG080mFb{z%XDKFbsSM z4B(k9lJ$ynU)7q@Fkl$?C>ap@Lj|*tbuIf!%B=$nc?CdOM6*n&%b)%zE5d-Xu4P|I zv|u926{T_|`iepH&4DO)tgmZ)UrFT-MD~pB=$?tbp%8uXAQcG*QdiQHh5^ICFazT5 zUIZ69_?P7F@0YOd%zrXT#{zf|0?VQP$f3$G4;%u4gtpWf>;T256m1-30%u?wg8l7~ zleu;dY2QusYUi-Oz7Fg4l8*ig@yP2$VUkWyKP4lD;wOhnCA&0Qy4AePd(G5MyGg^1 zZ-}Qg&LeN2yWX{s_F7JPp0m^q8I7ew7*K@VydJWE_Zqy*f<*c@RfTO^cFURE-L1{d zPE}@Vb9+;j-EV8tQ0??Hm72GiDKI zZL|xY0`kkj&$03k)@0|aB}(-g%u(b_&QOqTV+rwc0nhLgr@Pk`q0e(BIMPoje(=_rDxR zuXxKoJo@R8&yG4{? z>nZ&?6-vt)&*4^SaQmfc?Oq2l<(CH8)^{_$5dgXPW5gr@5meWT?ZP5hWg(F#w( zG~{gKW`dj0QcAa%*e1swcW?t*?ue@78jTZ_Lq6-bBG;qQGHdWO<=Y!>9J{Pd8}|fK zw1xv&iK%Ew_TB8be#qL@i_bAAFjea-1Lc%b9H=TqRHlDQ-6{`ES`vGWaYpTG{ff3& za2l8NWoW`(=)nVc2*1N4cnr_rZ}^uK$#L=(IZbBC1#*#mPp*RR@dL<^>O{vp7e|B`oe{wo?j*7AQd C%t{sj literal 0 HcmV?d00001 diff --git a/Config/Nuclearizer_singleDet_DEE.cfg b/Config/Nuclearizer_singleDet_DEE.cfg new file mode 100644 index 00000000..ec8cbfe6 --- /dev/null +++ b/Config/Nuclearizer_singleDet_DEE.cfg @@ -0,0 +1,133 @@ + + 1 + + XmlTagLoaderSimulationsSingleDet + XmlTagTACcut + EnergyCalibrationUniversal + XmlTagStripPairingChiSquare + DepthCalibration2024 + XmlTagEventSaver + + $(NUCLEARIZER)/../STTC_geo/COSI_STTC.geo.setup + + + + + + + + + + + + + true + false + 10000000 + + + /Users/parshadkp/Library/CloudStorage/OneDrive-ClemsonUniversity/COSI/nuclearizer_files/nuclearizer_outputs/STTC/Cs137_STTC_sourceHolderPos_1166700Flux_10s_0050_Fluore.inc1.id1.sim.gz + $(NUCLEARIZER)/resource/calibration/COSI_SingleDet/deadtimeParameters.txt + $(NUCLEARIZER)/resource/calibration/COSI_SingleDet/20240819_Am241_Cs137_Co57_LV.ecal + $(NUCLEARIZER)/resource/calibration/COSI_SingleDet/DeadStripList.txt + $(NUCLEARIZER)/resource/calibration/COSI_SingleDet/thresholds_fake.dat + $(NUCLEARIZER)/resource/calibration/COSI_SingleDet/GuardRingThresholds_190726.dat + $(NUCLEARIZER)/resource/calibration/COSI_SingleDet/ChargeSharingFactors_190311.txt + $(NUCLEARIZER)/resource/calibration/COSI_SingleDet/CrossTalkCorrection_Results_190726.txt + $(NUCLEARIZER)/resource/calibration/COSI_SingleDet/ChargeLossCoeffs_190311.log + $(NUCLEARIZER)/resource/calibration/COSI_SingleDet/stretch_offset.csv + $(NUCLEARIZER)/resource/calibration/COSI_SingleDet/taccal_240225_channelsmapped.csv + $(NUCLEARIZER)/resource/calibration/COSI_SingleDet/ctd_depth_122.0keV_AnodeCathode.csv + $(NUCLEARIZER)/resource/calibration/COSI_SingleDet/ACS_correction_file.txt + true + false + 10000000 + + + $(NUCLEARIZER)/../Data/roas/asic_gse_240412194613.hdf.roa + + + + false + + + + 128.32.13.133 + 215261 + OP + 128.32.13.133 + 21530 + 2 + 0 + + + + + 2 + 0 + 1 + + + 0 + 10000 + + + $(NUCLEARIZER)/resource/calibration/COSI_SingleDet/20240819_Am241_Cs137_Co57_LV.ecal + + 0 + + + 0 + + + + + + + + + + + + $(NUCLEARIZER)/resource/calibration/COSI_SingleDet/stretch_offset.csv + $(NUCLEARIZER)/resource/calibration/COSI_SingleDet/ctd_depth_122.0keV.reformat.csv + 0 + + + $(NUCLEARIZER)/resource/calibration/COSI_SingleDet/CrossTalkCorrection_Results_190726.txt + + + /Users/parshadkp/Library/CloudStorage/OneDrive-ClemsonUniversity/COSI/nuclearizer_files/nuclearizer_outputs/STTC/STTC_DEE_Cs137.evta + 2 + false + true + false + false + 600 + true + true + false + false + false + false + true + + + localhost + 12354 + + + 0 + Response + + + + + $(NUCLEARIZER)/resource/calibration/COSI_SingleDet/taccal_240225_channelsmapped.csv + $(NUCLEARIZER)/resource/calibration/COSI_SingleDet/tac_cut_params_fldelay_coinc400.csv + + + + + + diff --git a/Config/Revan_singleDet_DEE.cfg b/Config/Revan_singleDet_DEE.cfg new file mode 100644 index 00000000..30f43a79 --- /dev/null +++ b/Config/Revan_singleDet_DEE.cfg @@ -0,0 +1,117 @@ + + 2 + 49000 + /Users/parshad/Software/massmodel-cosi-em/COSISMEX.analysis_BGOreading.geo.setup + /Users/parshad/Software/Nuclearizer_outputs/Single_Det/SingleDetBGO_DEE_Cs137_0050_wCal_Floure.evta + + /Users/parshad/Software/Nuclearizer_outputs/Single_Det/SingleDetBGO_DEE_Cs137_0050_wCal_Floure.evta + /Users/parshad/Software/Nuclearizer_outputs/Single_Det/SingleDetBGO_DEE_Cs137_10xPos_wCal_Floure.evta + /Users/parshad/Software/Nuclearizer_outputs/Single_Det/Cosima_sources/Cs137_singleDetBGO_sourceHolderPos_1166700Flux_100s_DC_Fluore.inc1.id1.sim.gz + /Users/parshad/Software/AGN_Coronae/Cosima_sims/NGC_4151_ec200_3Month_fileSpec_v12MassM_wDC2Ori.inc1.id1.sim.gz + /Users/parshad/Software/AGN_Coronae/Cosima_sims/NGC_4151_ec200_1day_fileSpec_v12MassM_wDC2Ori.inc1.id1.sim.gz + /Users/parshad/Software/AGN_Coronae/Cosima_sims/NGC_4151_ec200_1day_fileSpec_v12MassM.inc1.id1.sim.gz + + + /Users/parshad/Software/massmodel-cosi-em/COSISMEX.analysis_BGOreading.geo.setup + /Users/parshad/Software/massmodel-cosi-em/COSISMEX.analysis.geo.setup + /Users/parshad/Software/massmodel-cosi-smex-v12/COSISMEX.O64.geo.setup + /Users/parshad/Software/massmodel-cosi-smex-detailed-testing-DC3_unEdited/COSISMEX.analysis.geo.setup + /Users/parshad/Software/massmodel-cosi-balloon/COSIBalloon.12Detector.geo.setup + + 1 + 0 + 0 + 2 + 0 + 1 + 0 + 1e-06 + 1000 + BDTD + + 0.2 + 1.1 + 0.3 + 0 + 0.2 + 0.3 + 0.3 + 0.3 + 0 + 1.5 + 1 + + true + true + true + true + 2 + 1 + false + 6 + + false + 3 + false + true + false + false + + 0 + 1000 + + 7 + + 0 + 0 + 10000 + + + 0 + 0 + 0 + + + + + + + BDTD + + 0 + 1000000 + + + 0 + 1000 + + + -1 + -1 + + true + + 3 + 20 + $(MEGALIB)/resource/libraries/IsotopeLibrary_HomelandSecurity_Short.isotopes + 1 + + 100 + false + 0 + 1000 + Export.dat + true + true + true + false + false + false + true + true + false + 10000 + true + 1 + 1000 + diff --git a/Makefile b/Makefile index d9924ad1..20406156 100755 --- a/Makefile +++ b/Makefile @@ -38,90 +38,42 @@ MAKEFLAGS += --no-builtin-rules #.NOTPARALLEL: megalib .SILENT: + +#---------------------------------------------------------------- +# External libraries +# + +H5CXXFLAGS = +H5LIBS = +ifeq ("$(shell pkg-config --exists hdf5 1>&2 2> /dev/null; echo $$?)", "0") + H5CXXFLAGS += $(shell pkg-config --cflags hdf5) + H5LIBS += $(shell pkg-config --libs hdf5) + H5LIBS += -lhdf5_cpp +else + $(error "Unable to find HDF5 headers and libraries") +endif + + #---------------------------------------------------------------- # Definitions based on architecture and user options # CMD="" -CXXFLAGS += -I$(IN) -I$(MEGALIB)/include -I/opt/local/include +CXXFLAGS += -I$(IN) -I$(MEGALIB)/include -I/opt/local/include $(H5CXXFLAGS) # Comment this line out if you want to accept warnings #CXXFLAGS += -Werror -Wno-unused-variable -# Names of the program -NUCLEARIZER_PRG = $(BN)/nuclearizer -NUCLEARIZER_CXX_MAIN = src/MNuclearizerMain.cxx - -# The nuclearizer library -NUCLEARIZER_LIBS = \ -$(LB)/magfld.o \ -$(LB)/MAssembly.o \ -$(LB)/MReadOutAssembly.o \ -$(LB)/MAspect.o \ -$(LB)/MAspectPacket.o \ -$(LB)/MAspectReconstruction.o \ -$(LB)/MHit.o \ -$(LB)/MTimeAndCoordinate.o \ -$(LB)/MStripHit.o \ -$(LB)/MGuardringHit.o \ -$(LB)/MDetectorEffectsEngineBalloon.o \ -$(LB)/MModuleLoaderSimulationsBalloon.o \ -$(LB)/MDetectorEffectsEngineSMEX.o \ -$(LB)/MModuleLoaderSimulationsSMEX.o \ -$(LB)/MGUIOptionsLoaderSimulations.o \ -$(LB)/MModuleLoaderMeasurements.o \ -$(LB)/MModuleLoaderMeasurementsROA.o \ -$(LB)/MGUIOptionsLoaderMeasurements.o \ -$(LB)/MBinaryFlightDataParser.o \ -$(LB)/MModuleReceiverBalloon.o \ -$(LB)/MGUIOptionsReceiverBalloon.o \ -$(LB)/MGUIExpoReceiver.o \ -$(LB)/MModuleLoaderMeasurementsBinary.o \ -$(LB)/MGUIOptionsLoaderMeasurementsBinary.o \ -$(LB)/MGUIExpoAspectViewer.o \ -$(LB)/MGUIExpoEnergyCalibration.o \ -$(LB)/MModuleEnergyCalibration.o \ -$(LB)/MModuleEnergyCalibrationUniversal.o \ -$(LB)/MGUIOptionsEnergyCalibrationUniversal.o \ -$(LB)/MInverseCrosstalkCorrection.o \ -$(LB)/MModuleCrosstalkCorrection.o \ -$(LB)/MGUIOptionsCrosstalkCorrection.o \ -$(LB)/MModuleChargeSharingCorrection.o \ -$(LB)/MGUIExpoDepthCalibration.o \ -$(LB)/MGUIExpoDepthCalibration2024.o \ -$(LB)/MModuleDepthCalibration.o \ -$(LB)/MGUIOptionsDepthCalibration.o \ -$(LB)/MModuleDepthCalibration2024.o \ -$(LB)/MGUIOptionsDepthCalibration2024.o \ -$(LB)/MGUIExpoStripPairing.o \ -$(LB)/MModuleStripPairingGreedy.o \ -$(LB)/MGUIOptionsStripPairing.o \ -$(LB)/MModuleStripPairingChiSquare.o \ -$(LB)/MGUIOptionsEventSaver.o \ -$(LB)/MModuleEventSaver.o \ -$(LB)/MGUIOptionsEventFilter.o \ -$(LB)/MModuleEventFilter.o \ -$(LB)/MCalibratorEnergy.o \ -$(LB)/MCalibratorEnergyPointwiseLinear.o \ -$(LB)/MDepthCalibrator.o \ -$(LB)/GCUSettingsParser.o \ -$(LB)/MTIRecord.o \ -$(LB)/GCUHousekeepingParser.o \ -$(LB)/LivetimeParser.o \ -$(LB)/MDepthCalibratorB.o \ -$(LB)/MModuleDepthCalibrationB.o \ -$(LB)/MGUIOptionsDepthCalibrationB.o \ -$(LB)/MGUIOptionsResponseGenerator.o \ -$(LB)/MModuleResponseGenerator.o \ -$(LB)/MModuleDiagnostics.o \ -$(LB)/MModuleDiagnosticsEnergyPerStrip.o \ -$(LB)/MGUIExpoDiagnosticsEnergyPerStrip.o \ -$(LB)/MGUIExpoDiagnostics.o \ - - - -NUCLEARIZER_DEP_FILES := $(NUCLEARIZER_LIBS:.o=.d) -NUCLEARIZER_H_FILES := $(addprefix $(NUCLEARIZER)/include/,$(notdir $(NUCLEARIZER_LIBS:.o=.h))) +LIBS += $(H5LIBS) +# Definitions +NUCLEARIZER_DIR := $(NUCLEARIZER) +NUCLEARIZER_PRG := $(BN)/nuclearizer +NUCLEARIZER_CXX_MAIN := $(NUCLEARIZER_DIR)/src/MNuclearizerMain.cxx +NUCLEARIZER_CXX_FILES := $(wildcard $(NUCLEARIZER_DIR)/src/*.cxx) +NUCLEARIZER_CXX_FILES := $(filter-out $(NUCLEARIZER_CXX_MAIN) $(NUCLEARIZER_DIR)/src/MModuleTemplate.cxx,$(NUCLEARIZER_CXX_FILES)) +NUCLEARIZER_LIBS := $(addprefix $(LB)/,$(notdir $(NUCLEARIZER_CXX_FILES:.cxx=.o))) +NUCLEARIZER_DEP_FILES := $(NUCLEARIZER_LIBS:.o=.d) +NUCLEARIZER_H_FILES := $(addprefix $(NUCLEARIZER)/include/,$(notdir $(NUCLEARIZER_LIBS:.o=.h))) FRETALON_DIR := $(MEGALIB)/src/fretalon/framework FRETALON_CXX_MAIN := $(FRETALON_DIR)/src/MAssembly.cxx $(FRETALON_DIR)/src/MReadOutAssembly.cxx @@ -141,9 +93,6 @@ NUCLEARIZER_CXX_MAIN := $(NUCLEARIZER)/src/MNuclearizerMain.cxx # External libraries # MEGAlib ALLLIBS = -L$(LB) -lResponseCreator -lFretalonBase -lSivan -lRevanGui -lRevan -lMimrec -lGeomega -lSpectralyzeGui -lSpectralyze -lCommonMisc -lCommonGui -L$(MEGALIB)/lib -L$(LB) -# ROOT -ALLLIBS += -lMathCore - NUCLEARIZER_DICT_NAME=Nuclearizer_Dictionary @@ -197,20 +146,20 @@ $(NUCLEARIZER_DEP_FILES): $(LB)/%.d: src/%.cxx $(NUCLEARIZER_LIBS): $(LB)/%.o: src/%.cxx include/%.h $(LB)/%.d @echo "Compiling $(subst src/,,$<) ..." - @$(CXX) $(CXXFLAGS) -c $< -o $@ + @$(CXX) $(CXXFLAGS) -Wno-vla-cxx-extension -c $< -o $@ $(NUCLEARIZER_DICT): $(FRETALON_H_FILES) $(NUCLEARIZER_H_FILES) @echo "Generating LinkDef ..." @$(BN)/generatelinkdef -o $(NUCLEARIZER_LINKDEF) -i $(NUCLEARIZER_H_FILES) $(FRETALON_H_FILES) @echo "Generating dictionary ..." - @rootcling -f $@ -I$(IN) -I$(MEGALIB)/include -D___CLING___ -rmf $(NUCLEARIZER_ROOTMAP) -s libNuclearizer -c $(NUCLEARIZER_H_FILES) $(FRETALON_H_FILES) $(NUCLEARIZER_LINKDEF) + @rootcling -f $@ -I$(IN) -I$(MEGALIB)/include $(H5CXXFLAGS) -D___CLING___ -rmf $(NUCLEARIZER_ROOTMAP) -s libNuclearizer -c $(NUCLEARIZER_H_FILES) $(FRETALON_H_FILES) $(NUCLEARIZER_LINKDEF) @mv $(NUCLEARIZER_ROOTPCM) $(LB) $(NUCLEARIZER_DICT_LIB): $(NUCLEARIZER_DICT) @echo "Compiling dictionary ..." @$(CXX) $(CXXFLAGS) -c $< -o $@ -$(NUCLEARIZER_SHARED_LIB): $(FRETALON_LIBS) $(NUCLEARIZER_LIBS) $(NUCLEARIZER_DICT_LIB) +$(NUCLEARIZER_SHARED_LIB): $(NUCLEARIZER_DICT_LIB) $(FRETALON_LIBS) $(NUCLEARIZER_LIBS) @echo "Linking $(subst $(LB)/,,$@) ..." @$(LD) $(LDFLAGS) $(SOFLAGS) $(NUCLEARIZER_DICT_LIB) $(NUCLEARIZER_LIBS) $(FRETALON_LIBS) $(GLIBS) $(LIBS) -o $(NUCLEARIZER_SHARED_LIB) @@ -218,6 +167,7 @@ $(NUCLEARIZER_PRG): $(NUCLEARIZER_SHARED_LIB) $(NUCLEARIZER_CXX_MAIN) @echo "Linking and compiling $(subst $(BN)/,,$(NUCLEARIZER_PRG)) ... Please stand by ... " @$(CXX) $(CXXFLAGS) $(LDFLAGS) $(NUCLEARIZER_CXX_MAIN) $(NUCLEARIZER_SHARED_LIB) $(ALLLIBS) $(GLIBS) $(LIBS) -o $(NUCLEARIZER_PRG) + ifneq ($(MAKECMDGOALS),clean) -include $(NUCLEARIZER_DEP_FILES) -include $(FRETALON_DEP_FILES) diff --git a/apps/AspectOptimizerStep1.cxx b/apps/AspectOptimizerStep1.cxx deleted file mode 100644 index d09e8e45..00000000 --- a/apps/AspectOptimizerStep1.cxx +++ /dev/null @@ -1,460 +0,0 @@ -/* - For now, use MTimeAndCoordinate, but should also consider using python/pyephem as a cross check on the ephemeris - */ -#include "MGlobal.h" -#include "MFile.h" -#include "MString.h" -#include "MTimeAndCoordinate.h" -#include -#include -#include "MTime.h" -using namespace std; - -double sine(double sine_input){ - double sine_output = sin((sine_input * 3.14159265359)/180); - return sine_output; -} -double arcsine(double arcsine_input){ - double arcsine_output = ((asin(arcsine_input))*180)/3.14159265359; - return arcsine_output; -} -double cosine(double cosine_input){ - double cosine_output = cos((cosine_input * 3.14159265359)/180); - return cosine_output; -} -double arccosine(double arccosine_input){ - double arccosine_output = ((acos(arccosine_input))*180)/3.14159265359; - return arccosine_output; -} -double tangent(double tangent_input){ - double tangent_output = tan((tangent_input * 3.14159265359)/180); - return tangent_output; -} -double arctangent(double arctangent_input){ - double angle_in_degrees = ((atan(arctangent_input))*180)/3.14159265359; - return angle_in_degrees; -} -double arctangent2(double y, double x){ - double angle_in_degrees = ((atan2(y,x))*180)/3.14159265359; - return angle_in_degrees; -} - -class Event -{ - public: - vector Lines; - MTime Time; - MTime AspectTime; - double Heading; - double Pitch; - double Roll; - double Lat; - double Lon; - vector HX; - vector HZ; - vector GX; - vector GZ; - Event(): HX(2),HZ(2),GX(2),GZ(2) - { - Heading = 0; - Pitch = 0; - Roll = 0; - Lat = 0; - Lon = 0; - } -}; - -bool ComputeRotation(Event* E, double dh, double dp, double dr){ - - double heading = E->Heading; - double pitch = E->Pitch; - double roll = E->Roll; - double Z[3][3], Y[3][3], X[3][3], YX[3][3], ZYX[3][3]; - double Z_[3][3], Y_[3][3], X_[3][3], YX_[3][3], ZYX_[3][3]; - MTimeAndCoordinate TC; - - ////ZYX is the rotation applied once the croystat is aligned with the GPS - ///////////////////////////////////////////////////////////////////////// - Z[0][0] = cosine(heading); - Z[0][1] = 0.0 - sine(heading); - Z[0][2] = 0.0; - - Z[1][0] = sine(heading); - Z[1][1] = cosine(heading); - Z[1][2] = 0.0; - - Z[2][0] = 0.0; - Z[2][1] = 0.0; - Z[2][2] = 1.0; - - Y[0][0] = cosine(roll); - Y[0][1] = 0.0; - Y[0][2] = sine(roll); - - Y[1][0] = 0.0; - Y[1][1] = 1.0; - Y[1][2] = 0.0; - - Y[2][0] = 0.0 - sine(roll); - Y[2][1] = 0.0; - Y[2][2] = cosine(roll); - - X[0][0] = 1.0; - X[0][1] = 0.0; - X[0][2] = 0.0; - - X[1][0] = 0.0; - X[1][1] = cosine(pitch); - X[1][2] = 0.0 - sine(pitch); - - X[2][0] = 0.0; - X[2][1] = sine(pitch); - X[2][2] = cosine(pitch); - - for(int i=0;i<3;i++){ - for(int j=0;j<3;j++){ - YX[i][j]=0; - for(int k=0;k<3;k++){ - //ares' X and Y are backwards, changing this from YX to XY - //so the full rotation is ZXY - //YX[i][j]=YX[i][j]+Y[i][k]*X[k][j]; - YX[i][j]=YX[i][j]+X[i][k]*Y[k][j]; - } - } - } - - for(int i=0;i<3;i++){ - for(int j=0;j<3;j++){ - ZYX[i][j]=0; - for(int k=0;k<3;k++){ - ZYX[i][j]=ZYX[i][j]+Z[i][k]*YX[k][j]; - } - } - } - ///////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////////////////////////// - - - - ////underscored matrices are for finding the cryostat vectors in the GPS frame - ///////////////////////////////////////////////////////////////// - Z_[0][0] = cosine(-90 + dh); - Z_[0][1] = 0.0 - sine(-90 + dh); - Z_[0][2] = 0.0; - - Z_[1][0] = sine(-90 + dh); - Z_[1][1] = cosine(-90 + dh); - Z_[1][2] = 0.0; - - Z_[2][0] = 0.0; - Z_[2][1] = 0.0; - Z_[2][2] = 1.0; - - Y_[0][0] = cosine(dr); - Y_[0][1] = 0.0; - Y_[0][2] = sine(dr); - - Y_[1][0] = 0.0; - Y_[1][1] = 1.0; - Y_[1][2] = 0.0; - - Y_[2][0] = 0.0 - sine(dr); - Y_[2][1] = 0.0; - Y_[2][2] = cosine(dr); - - X_[0][0] = 1.0; - X_[0][1] = 0.0; - X_[0][2] = 0.0; - - X_[1][0] = 0.0; - X_[1][1] = cosine(dp); - X_[1][2] = 0.0 - sine(dp); - - X_[2][0] = 0.0; - X_[2][1] = sine(dp); - X_[2][2] = cosine(dp); - - for(int i=0;i<3;i++){ - for(int j=0;j<3;j++){ - YX_[i][j]=0; - for(int k=0;k<3;k++){ - //ares' X and Y are backwards, changing this from YX to XY - //so the full rotation is ZXY - //YX[i][j]=YX[i][j]+Y[i][k]*X[k][j]; - YX_[i][j]=YX_[i][j]+X_[i][k]*Y_[k][j]; - } - } - } - - for(int i=0;i<3;i++){ - for(int j=0;j<3;j++){ - ZYX_[i][j]=0; - for(int k=0;k<3;k++){ - ZYX_[i][j]=ZYX_[i][j]+Z_[i][k]*YX_[k][j]; - } - } - } - ///////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////////////////// - - - double Zhat[3]; - double Xhat[3]; - double Yhat[3]; - double temp[3]; - - Zhat[0] = 0.0; - Zhat[1] = 0.0; - Zhat[2] = 1.0; - - Xhat[0] = 1.0; - Xhat[1] = 0.0; - Xhat[2] = 0.0; - - Yhat[0] = 0.0; - Yhat[1] = 1.0; - Yhat[2] = 0.0; - - //apply underscore rotation to align cryostat - ///////////////////////////////////////////// - //transform Yhat - - for(int i=0;i<3;i++){ - double Q = 0; - for(int k=0;k<3;k++){ - Q += ZYX_[i][k] * Yhat[k]; - } - temp[i] = Q; - } - Yhat[0] = temp[0]; Yhat[1] = temp[1]; Yhat[2] = temp[2]; - - //transform Xhat - for(int i=0;i<3;i++){ - double Q = 0; - for(int k=0;k<3;k++){ - Q += ZYX_[i][k] * Xhat[k]; - } - temp[i] = Q; - } - Xhat[0] = temp[0]; Xhat[1] = temp[1]; Xhat[2] = temp[2]; - - //transform Zhat - for(int i=0;i<3;i++){ - double Q = 0; - for(int k=0;k<3;k++){ - Q += ZYX_[i][k] * Zhat[k]; - } - temp[i] = Q; - } - Zhat[0] = temp[0]; Zhat[1] = temp[1]; Zhat[2] = temp[2]; - - /* - for(int i=0;i<3;i++){ - double Q = 0; - for(int k=0;k<3;k++){ - Q += Z_[i][k] * Yhat[k]; - } - temp[i] = Q; - } - Yhat[0] = temp[0]; Yhat[1] = temp[1]; Yhat[2] = temp[2]; - - //transform Xhat - for(int i=0;i<3;i++){ - double Q = 0; - for(int k=0;k<3;k++){ - Q += Z_[i][k] * Xhat[k]; - } - temp[i] = Q; - } - Xhat[0] = temp[0]; Xhat[1] = temp[1]; Xhat[2] = temp[2]; - */ - - ///////////////////////////////////////////// - ///////////////////////////////////////////// - - - //now apply full heading/pitch/roll rotation - //////////////////////////////////////////// - for(int i=0;i<3;i++){ - double Q = 0; - for(int k=0;k<3;k++){ - Q += ZYX[i][k] * Yhat[k]; - } - temp[i] = Q; - } - Yhat[0] = temp[0]; Yhat[1] = temp[1]; Yhat[2] = temp[2]; - - //transform Xhat - for(int i=0;i<3;i++){ - double Q = 0; - for(int k=0;k<3;k++){ - Q += ZYX[i][k] * Xhat[k]; - } - temp[i] = Q; - } - Xhat[0] = temp[0]; Xhat[1] = temp[1]; Xhat[2] = temp[2]; - - //transform Zhat - for(int i=0;i<3;i++){ - double Q = 0; - for(int k=0;k<3;k++){ - Q += ZYX[i][k] * Zhat[k]; - } - temp[i] = Q; - } - Zhat[0] = temp[0]; Zhat[1] = temp[1]; Zhat[2] = temp[2]; - //////////////////////////////////////////// - //////////////////////////////////////////// - - //dot Zhat/Xhat into (0,0,1) and take the arcos to get the zenith angle. then convert this to elevation angle - double Z_Elevation = 90.0 - arccosine( Zhat[2] ); - double X_Elevation = 90.0 - arccosine( Xhat[2] ); - double Y_Elevation = 90.0 - arccosine( Yhat[2] ); - - //get azimuth of Zhat/Xhat by projecting into X-Y plane, re-normalizing, and dotting into (0,1,0) - double Z_proj[3]; Z_proj[0] = Zhat[0]; Z_proj[1] = Zhat[1]; Z_proj[2] = 0.0; - double X_proj[3]; X_proj[0] = Xhat[0]; X_proj[1] = Xhat[1]; X_proj[2] = 0.0; - double Y_proj[3]; Y_proj[0] = Yhat[0]; Y_proj[1] = Yhat[1]; Y_proj[2] = 0.0; - - double Znorm = sqrt( pow(Z_proj[0],2.0) + pow(Z_proj[1],2.0) ); - double Xnorm = sqrt( pow(X_proj[0],2.0) + pow(X_proj[1],2.0) ); - double Ynorm = sqrt( pow(Y_proj[0],2.0) + pow(Y_proj[1],2.0) ); - - double Z_Azimuth = 0; - if( Znorm > 1.0E-9 ){ - Z_Azimuth = arccosine( Z_proj[1]/Znorm ); if( Z_proj[0] < 0.0 ) Z_Azimuth = 360.0 - Z_Azimuth; - } else { - Z_Azimuth = 0.0; - } - - double X_Azimuth = 0; - if( Xnorm > 1.0E-9 ){ - X_Azimuth = arccosine( X_proj[1]/Xnorm ); if( X_proj[0] < 0.0 ) X_Azimuth = 360.0 - X_Azimuth; - } else { - X_Azimuth = 0.0; - } - - double Y_Azimuth = 0; - if( Ynorm > 1.0E-9 ){ - Y_Azimuth = arccosine( Y_proj[1]/Ynorm ); if( Y_proj[0] < 0.0 ) Y_Azimuth = 360.0 - Y_Azimuth; - } else { - Y_Azimuth = 0.0; - } - - E->HX[0] = X_Azimuth; - E->HX[1] = X_Elevation; - E->HZ[0] = Z_Azimuth; - E->HZ[1] = Z_Elevation; - - TC.SetLocation(E->Lat, E->Lon); - TC.SetUnixTime(E->AspectTime.GetAsSystemSeconds()); - - vector ZGalactic; - vector ZEquatorial; - ZEquatorial = TC.Horizon2Equatorial(Z_Azimuth, Z_Elevation); - ZGalactic = TC.Equatorial2Galactic(ZEquatorial); - double Zgalat = ZGalactic[1]; - double Zgalon = ZGalactic[0]; - - vector XGalactic; - vector XEquatorial; - XEquatorial= TC.Horizon2Equatorial(X_Azimuth, X_Elevation); - XGalactic = TC.Equatorial2Galactic(XEquatorial); - double Xgalat = XGalactic[1]; - double Xgalon = XGalactic[0]; - - vector YGalactic; - vector YEquatorial; - YEquatorial= TC.Horizon2Equatorial(Y_Azimuth, Y_Elevation); - YGalactic = TC.Equatorial2Galactic(YEquatorial); - double Ygalat = YGalactic[1]; - double Ygalon = YGalactic[0]; - - E->GX[0] = Xgalon; - E->GX[1] = Xgalat; - E->GZ[0] = Zgalon; - E->GZ[1] = Zgalat; - - return true; -} - - - -int main(int argc, char ** argv){ - if(argc != 5){ - cout << "need four arguments: fname, heading, pitch, roll" << endl; - return -1; - } - - double heading = MString(argv[2]).ToDouble(); - double pitch = MString(argv[3]).ToDouble(); - double roll = MString(argv[4]).ToDouble(); - - MFile fin; - fin.Open(MString(argv[1])); - - MFile fout; - fout.Open(MString(argv[1]) + ".out",MFile::c_Write); - - MString line; - Event* E = new Event(); - while(fin.ReadLine(line)){ - if(line.BeginsWith("SE")){ - //do rotations - ComputeRotation(E, heading, pitch, roll); - //write lines - for(auto m: E->Lines){ - char line_[128]; - if(m.BeginsWith("GX")){ - snprintf(line_,sizeof(line_),"GX %6.3f %6.3f\n",E->GX[0],E->GX[1]); - fout.Write(line_); - } else if(m.BeginsWith("GZ")){ - snprintf(line_,sizeof(line_),"GZ %6.3f %6.3f\n",E->GZ[0],E->GZ[1]); - fout.Write(line_); - } else if(m.BeginsWith("HX")){ - snprintf(line_,sizeof(line_),"HX %6.3f %6.3f\n",E->HX[0],E->HX[1]); - fout.Write(line_); - } else if(m.BeginsWith("HZ")){ - snprintf(line_,sizeof(line_),"HZ %6.3f %6.3f\n",E->HZ[0],E->HZ[1]); - fout.Write(line_); - } else { - fout.Write(m + "\n"); - } - } - delete E; - E = new Event(); - E->Lines.push_back(line); - } else if(line.BeginsWith("CC AS")){ - vector Tokens = line.Tokenize(" "); - if(Tokens.size() == 8){ - E->Lat = Tokens[2].ToDouble(); - E->Lon = Tokens[3].ToDouble(); - E->Heading = Tokens[4].ToDouble(); - E->Pitch = Tokens[5].ToDouble(); - E->Roll = Tokens[6].ToDouble(); - MTime t; t.Set(Tokens[7]); - E->AspectTime = t; - - } - E->Lines.push_back(line); - } else if(line.BeginsWith("TI")){ - MTime t; - t.Set(line); - E->Time = t; - E->Lines.push_back(line); - } else { - E->Lines.push_back(line); - } - - } - fout.Close(); - fin.Close(); - - return 0; - -} - - - - - diff --git a/apps/ChargeLossCorrection.cxx b/apps/ChargeLossCorrection.cxx deleted file mode 100644 index 7f9c54d6..00000000 --- a/apps/ChargeLossCorrection.cxx +++ /dev/null @@ -1,659 +0,0 @@ -/* - * ChargeLossCorrection.cxx - * - * - * Copyright (C) by Andreas Zoglauer. - * All rights reserved. - * - * - * This code implementation is the intellectual property of - * Andreas Zoglauer. - * - * By copying, distributing or modifying the Program (or any work - * based on the Program) you indicate your acceptance of this statement, - * and all its terms. - * - */ - -// Standard -#include -#include -#include -#include -#include -#include -#include -using namespace std; - -// ROOT -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -// MEGAlib -#include "MGlobal.h" -#include "MFile.h" -#include "MReadOutElementDoubleStrip.h" -#include "MFileReadOuts.h" -#include "MReadOutAssembly.h" -#include "MStripHit.h" -#include "MReadOutSequence.h" -#include "MSupervisor.h" -#include "MModuleLoaderMeasurementsROA.h" -#include "MBinaryFlightDataParser.h" -#include "MModuleLoaderMeasurementsBinary.h" -#include "MModuleEnergyCalibrationUniversal.h" -#include "MModuleStripPairingGreedy.h" -#include "MModuleCrosstalkCorrection.h" -#include "MModuleChargeSharingCorrection.h" -#include "MAssembly.h" - - -//////////////////////////////////////////////////////////////////////////////// - - -//! A standalone program based on MEGAlib and ROOT -class ChargeLossCorrection -{ -public: - //! Default constructor - ChargeLossCorrection(); - //! Default destructor - ~ChargeLossCorrection(); - - //! Parse the command line - bool ParseCommandLine(int argc, char** argv); - //! Analyze what eveer needs to be analyzed... - bool Analyze(); - //!load cross talk correction - vector > > LoadCrossTalk(); - //! Interrupt the analysis - void Interrupt() { m_Interrupt = true; } - - void dummy_func() { return; } - -private: - //! True, if the analysis needs to be interrupted - bool m_Interrupt; - //! The input file name - MString m_FileName; - //! output file names - MString m_OutFile; - //! energy E0 - float m_E0; - //! option to correct charge loss or not - bool m_CorrectCL; - -}; - - -//////////////////////////////////////////////////////////////////////////////// - - -//! Default constructor -ChargeLossCorrection::ChargeLossCorrection() : m_Interrupt(false) -{ - gStyle->SetPalette(1, 0); -} - - -//////////////////////////////////////////////////////////////////////////////// - - -//! Default destructor -ChargeLossCorrection::~ChargeLossCorrection() -{ - // Intentionally left blank -} - - -//////////////////////////////////////////////////////////////////////////////// - - -//! Parse the command line -bool ChargeLossCorrection::ParseCommandLine(int argc, char** argv) -{ - ostringstream Usage; - Usage<"< i+1) && - (argv[i+1][0] != '-' || isalpha(argv[i+1][1]) == 0))){ - cout<<"Error: Option "< i+2) && - (argv[i+1][0] != '-' || isalpha(argv[i+1][1]) == 0) && - (argv[i+2][0] != '-' || isalpha(argv[i+2][1]) == 0))){ - cout<<"Error: Option "<SetBinContent(i,j,c); - } - } - TCanvas *ctemp = new TCanvas(); - h2->Draw("colz"); - ctemp->Print("frac_map.pdf"); -*/ - //time code just to see - TStopwatch watch; - watch.Start(); - - if (m_Interrupt == true) return false; - - MSupervisor* S = MSupervisor::GetSupervisor(); - - MModuleLoaderMeasurementsBinary* Loader = new MModuleLoaderMeasurementsBinary(); -// MModuleLoaderMeasurementsROA* Loader = new MModuleLoaderMeasurementsROA(); - Loader->SetFileName(m_FileName); - Loader->SetDataSelectionMode(MBinaryFlightDataParserDataModes::c_Raw); - Loader->SetAspectMode(MBinaryFlightDataParserAspectModes::c_Neither); - Loader->EnableCoincidenceMerging(true); - S->SetModule(Loader, 0); - - MModuleEnergyCalibrationUniversal* Calibrator = new MModuleEnergyCalibrationUniversal(); - Calibrator->SetFileName("$(NUCLEARIZER)/resource/calibration/COSI16/Wanaka/EnergyCalibration_053018.ecal"); - Calibrator->EnablePreampTempCorrection(false); - S->SetModule(Calibrator, 1); - - MModuleStripPairingGreedy* Pairing = new MModuleStripPairingGreedy(); - S->SetModule(Pairing, 2); - - MModuleCrosstalkCorrection* CrossTalk = new MModuleCrosstalkCorrection(); - CrossTalk->SetFileName("/home/clio/Software/Nuclearizer/resource/calibration/COSI16/Wanaka/CrossTalkCorrection_Results_060518.txt"); - S->SetModule(CrossTalk,3); - - MModuleChargeSharingCorrection* ChargeLoss = new MModuleChargeSharingCorrection(); - S->SetModule(ChargeLoss,4); - - - if (Loader->Initialize() == false) return false; - if (Calibrator->Initialize() == false) return false; - if (Pairing->Initialize() == false) return false; - if (CrossTalk->Initialize() == false) return false; - if (m_CorrectCL){ - if (ChargeLoss->Initialize() == false) return false; - } - - - map Histograms; - vector > > crossTalkCoeffs; - crossTalkCoeffs = LoadCrossTalk(); - - bool IsFinished = false; - MReadOutAssembly* Event = new MReadOutAssembly(); - while (IsFinished == false && m_Interrupt == false) { - Event->Clear(); - if (Loader->IsReady() ){ - Loader->AnalyzeEvent(Event); - Calibrator->AnalyzeEvent(Event); - Pairing->AnalyzeEvent(Event); - CrossTalk->AnalyzeEvent(Event); - if (m_CorrectCL) {ChargeLoss->AnalyzeEvent(Event);} - - if (Event->HasAnalysisProgress(MAssembly::c_CrosstalkCorrection) == true) { - vector xStripIDs, yStripIDs; - vector xEnergy, yEnergy; - for (unsigned int h = 0; h < Event->GetNHits(); ++h) { - //variables to add to histograms - float sum = 0.0; - float diff = 0.0; - float scaled_sum = 0.0; - float frac = 0.0; - float xE, yE = 0.0; - int detectorID = 0; - int histID = -1; - - if (Event->GetHit(h)->GetNStripHits()==3){ - for (unsigned int s = 0; s < Event->GetHit(h)->GetNStripHits(); s++){ - detectorID = Event->GetHit(h)->GetStripHit(s)->GetDetectorID(); - if (Event->GetHit(h)->GetStripHit(s)->IsLowVoltageStrip()){ - xStripIDs.push_back(Event->GetHit(h)->GetStripHit(s)->GetStripID()); - xE = Event->GetHit(h)->GetStripHit(s)->GetEnergy(); - xEnergy.push_back(xE); - } - else { - yStripIDs.push_back(Event->GetHit(h)->GetStripHit(s)->GetStripID()); - yE = Event->GetHit(h)->GetStripHit(s)->GetEnergy(); - yEnergy.push_back(yE); - } - } - if (xStripIDs.size() == 2){ - if (fabs(xStripIDs.at(0)-xStripIDs.at(1)) == 1){ - sum = xEnergy.at(0) + xEnergy.at(1); - if (m_CorrectCL){ sum = Event->GetHit(h)->GetEnergy(); } - diff = fabs(xEnergy.at(0) - xEnergy.at(1)); - scaled_sum = sum/m_E0; - frac = diff/sum; - histID = 10*detectorID; - } - } - else if (yStripIDs.size() == 2){ - if (fabs(yStripIDs.at(0)-yStripIDs.at(1)) == 1){ - sum = yEnergy.at(0) + yEnergy.at(1); - if (m_CorrectCL){ sum = Event->GetHit(h)->GetEnergy(); } - diff = fabs(yEnergy.at(0) - yEnergy.at(1)); - scaled_sum = sum/m_E0; - frac = diff/sum; - histID = 10*detectorID + 1; - } - else { - // cout << "not accepted: " << endl; - // cout << yStripIDs.at(0) << '\t' << yStripIDs.at(1) << endl; - // cout << yEnergy.at(0) << '\t' << yEnergy.at(1) << endl; - } - } - if (histID != -1) { - int nxbins = m_E0*2; - int nybins = 35; - int xlowlim = -m_E0; - int xhighlim = m_E0; - float ylowlim = (m_E0-30); //30.0/m_E0; - float yhighlim = (m_E0+5); //5.0/m_E0; - - if (m_CorrectCL){ yhighlim = (m_E0+30)/m_E0; nybins = 60; } - - if (Histograms[histID] == 0) { - TH2D* Hist = new TH2D("", "", nxbins,xlowlim,xhighlim,nybins,ylowlim,yhighlim); - if (histID%10 == 0){ - Hist->SetTitle(MString("Detector ")+detectorID+MString(" p Side")); - Hist->SetName(MString("Det")+detectorID+MString("Pside")); - } - else if (histID%10 == 1){ - Hist->SetTitle(MString("Detector ")+detectorID+MString(" n Side")); - Hist->SetName(MString("Det")+detectorID+MString("Nside")); - } - Hist->SetXTitle("Difference"); - Hist->SetYTitle("Sum [keV]"); - Histograms[histID] = Hist; - } -// cout << "frac: " << frac << " scaled_sum: " << scaled_sum << endl; - //used to fill these with frac, scaled_sum: switched 190115 - Histograms[histID]->Fill(diff,sum); - Histograms[histID]->Fill(-diff,sum); - } - } - // cout << "----------" << endl; - xEnergy.clear(); - yEnergy.clear(); - xStripIDs.clear(); - yStripIDs.clear(); - } - } - - } - IsFinished = Loader->IsFinished(); - } - - //fit and plot histograms - //make fit functions - - float DMax = m_E0*((m_E0-511./2)/(m_E0+511./2)); - - TF1* highE_fitFunc = new TF1("highE","[1]-[0]*([1]-x)",DMax+0.15*m_E0,m_E0); -// TF1* highE_fitFunc = new TF1("highE","([1]-[0]*([1]-x))/[1]",(DMax+0.15*m_E0)/m_E0,m_E0); - highE_fitFunc->FixParameter(1,m_E0); - TF1* lowE_fitFunc = new TF1("lowE","[1]-([0]/(2*[1]))*([1]*[1]-x*x)",0,m_E0); -// TF1* lowE_fitFunc = new TF1("lowE","1-([0]/(2*[1]*[1]))*([1]*[1]-x*x)",0,1); - lowE_fitFunc->FixParameter(1,m_E0); - - //setup output file - ofstream logFitStats; - logFitStats.open("ChargeLossCorrection_"+MString(m_E0)+"keV.log"); - logFitStats << "Det" << '\t' << "side" << '\t' << "B" << endl << endl; - - - //make map of TProfiles, save histograms - map Profiles; - - map Projections; - - for (auto H: Histograms){ -// if (H.first == 0){ - TCanvas* C = new TCanvas(); -// C->SetLogz(); - C->cd(); - H.second->Draw("colz"); - - int det = H.first/10; - int side=0; - if (H.first%10 != 0){ side=1; } - TFile f(m_OutFile+MString("_Det")+det+MString("_Side")+side+MString("_Hist.root"),"new"); - H.second->Write(); - f.Close(); - - TH2D* tempHist = (TH2D*)H.second->Clone(); - double max_val = tempHist->GetMaximum(); - cout << H.second->GetEntries() << '\t' << max_val << endl; - for (int x=0; xGetNbinsX(); x++){ - for (int y=0; yGetNbinsY(); y++){ - if (tempHist->GetBinContent(x,y) < max_val/2.){ - tempHist->SetBinContent(x,y,0); - tempHist->SetBinError(x,y,0); - } - } - } -/* - int nBins = H.second->GetNbinsX(); - for (int b=m_E0+0.05*nBins/2.+1; bGetXaxis()->GetBinCenter(b); - cout << b << '\t' << f << endl; -// if (H.first == 0){ - TH1D* Proj = H.second->ProjectionY(MString("f")+f,b-0.05*nBins,b,""); - Proj->SetTitle(MString("Frac=")+f); - Projections[b] = Proj; - } - for (auto P: Projections){ - TCanvas* C2 = new TCanvas(); - C2->cd(); - P.second->Draw(); - } - - } -*/ -// } - - TProfile* P = tempHist->ProfileX(); -// TProfile* P = H.second->ProfileX(); - Profiles[H.first] = P; - } - - //fit Profiles and log fit statistics - for (auto P: Profiles){ - TCanvas* C = new TCanvas(); - C->cd(); - - double param = 0.0; - if (m_E0 > 300){ - P.second->Fit("highE","R"); - param = highE_fitFunc->GetParameter(0); - } - else { - P.second->Fit("lowE","R"); - param = lowE_fitFunc->GetParameter(0); - } - -// P.second->Draw(); - - int det = P.first/10; - int side=0; - if (P.first%10 != 0){ side=1; } - - logFitStats << det << '\t' << side << '\t' << param << endl; - - TFile f(m_OutFile+MString("_Det")+det+MString("_Side")+side+MString("_Profile.root"),"new"); - P.second->Write(); - f.Close(); - -// C->Print(m_OutFile+MString("_Det")+det+MString("_Side")+side+MString(".pdf")); - } - - watch.Stop(); - cout << "total time (s): " << watch.CpuTime() << endl; - - return true; -} - - -///////////////////////////////////////////////////////////////////////////////// - -vector > > ChargeLossCorrection::LoadCrossTalk(){ - - float crossTalkCoeffsArr[12][2][2]; - - //detector 0, n side, a0 and a1 - crossTalkCoeffsArr[0][0][0] = 0.0367227; - crossTalkCoeffsArr[0][0][1] = 0.014819; - //detector 0, p side, a0 and a1 - crossTalkCoeffsArr[0][1][0] = 0.145619; - crossTalkCoeffsArr[0][1][1] = 0.015549; - - //detector 1, n side, a0 and a1 - crossTalkCoeffsArr[1][0][0] = 0.484833; - crossTalkCoeffsArr[1][0][1] = 0.014315; - //detector 1, p side, a0 and a1 - crossTalkCoeffsArr[1][1][0] = 0.739853; - crossTalkCoeffsArr[1][1][1] = 0.0164997; - - //detector 2, side 0, a0 and a1 - crossTalkCoeffsArr[2][0][0] = 0.145073; - crossTalkCoeffsArr[2][0][1] = 0.014666; - //detector 2, side 1, a0 and a1 - crossTalkCoeffsArr[2][1][0] = 0.856062; - crossTalkCoeffsArr[2][1][1] = 0.0156687; - - //detector 3, side 0, a0 and a1 - crossTalkCoeffsArr[3][0][0] = -2.82417; - crossTalkCoeffsArr[3][0][1] = 0.0192134; - //detector 3, side 1, a0 and a1 - crossTalkCoeffsArr[3][1][0] = 0.351416; - crossTalkCoeffsArr[3][1][1] = 0.0151572; - - //detector 4, side 0, a0 and a1 - crossTalkCoeffsArr[4][0][0] = 0.227316; - crossTalkCoeffsArr[4][0][1] = 0.0145653; - //detector 4, side 1, a0 and a1 - crossTalkCoeffsArr[4][1][0] = 0.0348345; - crossTalkCoeffsArr[4][1][1] = 0.0159006; - - //detector 5, side 0, a0 and a1 - crossTalkCoeffsArr[5][0][0] = 0.151713; - crossTalkCoeffsArr[5][0][1] = 0.0144765; - //detector 5, side 1, a0 and a1 - crossTalkCoeffsArr[5][1][0] = 0.438013; - crossTalkCoeffsArr[5][1][1] = 0.0162422; - - //detector 6, side 0, a0 and a1 - crossTalkCoeffsArr[6][0][0] = 0.184349; - crossTalkCoeffsArr[6][0][1] = 0.0141778; - //detector 6, side 1, a0 and a1 - crossTalkCoeffsArr[6][1][0] = 0.190339; - crossTalkCoeffsArr[6][1][1] = 0.0158667; - - //detector 7, side 0, a0 and a1 - crossTalkCoeffsArr[7][0][0] = 0.10767; - crossTalkCoeffsArr[7][0][1] = 0.0144137; - //detector 7, side 1, a0 and a1 - crossTalkCoeffsArr[7][1][0] = 0.938774; - crossTalkCoeffsArr[7][1][1] = 0.0151262; - - //detector 8, side 0, a0 and a1 - crossTalkCoeffsArr[8][0][0] = -0.0966355; - crossTalkCoeffsArr[8][0][1] = 0.0145684; - //detector 8, side 1, a0 and a1 - crossTalkCoeffsArr[8][1][0] = 0.0115163; - crossTalkCoeffsArr[8][1][1] = 0.0158602; - - //detector 9, side 0, a0 and a1 - crossTalkCoeffsArr[1][0][0] = 0.248337; - crossTalkCoeffsArr[1][0][1] = 0.0144792; - //detector 9, side 1, a0 and a1 - crossTalkCoeffsArr[1][1][0] = -0.133137; - crossTalkCoeffsArr[1][1][1] = 0.016439; - - //detector 10, side 0, a0 and a1 - crossTalkCoeffsArr[10][0][0] = 0.068672; - crossTalkCoeffsArr[10][0][1] = 0.0137224; - //detector 10, side 1, a0 and a1 - crossTalkCoeffsArr[10][1][0] = 0.384968; - crossTalkCoeffsArr[10][1][1] = 0.0151702; - - //detector 11, side 0, a0 and a1 - crossTalkCoeffsArr[11][0][0] = 0.195844; - crossTalkCoeffsArr[11][0][1] = 0.0135414; - //detector 11, side 1, a0 and a1 - crossTalkCoeffsArr[11][1][0] = 0.375227; - crossTalkCoeffsArr[11][1][1] = 0.0156169; - - vector > > crossTalkCoeffs; - vector > tempOne; - vector tempTwo; - for (int i=0; i<12; i++){ - for (int j=0; j<2; j++){ - for (int k=0; k<2; k++){ - tempTwo.push_back(0); - } - tempOne.push_back(tempTwo); - tempTwo.clear(); - } - crossTalkCoeffs.push_back(tempOne); - tempOne.clear(); - } - - for (int i=0; i<12; i++){ - for (int j=0; j<2; j++){ - for (int k=0; k<2; k++){ - crossTalkCoeffs[i][j][k] = crossTalkCoeffsArr[i][j][k]; - } - } - } - - return crossTalkCoeffs; - -}; - - -//////////////////////////////////////////////////////////////////////////////// - - -ChargeLossCorrection* g_Prg = 0; -int g_NInterruptCatches = 1; - - -//////////////////////////////////////////////////////////////////////////////// - - -//! Called when an interrupt signal is flagged -//! All catched signals lead to a well defined exit of the program -void CatchSignal(int a) -{ - if (g_Prg != 0 && g_NInterruptCatches-- > 0) { - cout<<"Catched signal Ctrl-C (ID="<Interrupt(); - } else { - abort(); - } -} - - -//////////////////////////////////////////////////////////////////////////////// - - -//! Main program -int main(int argc, char** argv) -{ - // Catch a user interupt for graceful shutdown - signal(SIGINT, CatchSignal); - - // Initialize global MEGALIB variables, especially mgui, etc. - MGlobal::Initialize("Standalone", "a standalone example program"); - - TApplication ChargeLossCorrectionApp("ChargeLossCorrectionApp", 0, 0); - - g_Prg = new ChargeLossCorrection(); - - if (g_Prg->ParseCommandLine(argc, argv) == false) { - cerr<<"Error during parsing of command line!"<Analyze() == false) { - cerr<<"Error during analysis!"< Histograms -//Need to implement the option of only selecting one detector or one side for analysis - -//////////////////////////////////////////////////////////////////////////////// -/* - * ChargeLossOffsets.cxx - * - * - * Copyright (C) by Andreas Zoglauer. - * All rights reserved. - * - * - * This code implementation is the intellectual property of - * Andreas Zoglauer. - * - * By copying, distributing or modifying the Program (or any work - * based on the Program) you indicate your acceptance of this statement, - * and all its terms. - * - */ - -// Standard -#include -#include -#include -#include -#include -#include -#include -using namespace std; - -// ROOT -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -// MEGAlib -#include "MGlobal.h" -#include "MFile.h" -#include "MReadOutElementDoubleStrip.h" -#include "MFileReadOuts.h" -#include "MReadOutAssembly.h" -#include "MStripHit.h" -#include "MReadOutSequence.h" -//#include "MReadOutDataADCValueWithTiming.h" -#include "MSupervisor.h" -#include "MModuleLoaderMeasurementsROA.h" -#include "MBinaryFlightDataParser.h" -#include "MModuleLoaderMeasurementsBinary.h" -#include "MModuleEnergyCalibrationUniversal.h" -#include "MModuleStripPairingGreedy.h" -#include "MModuleCrosstalkCorrection.h" -#include "MModuleChargeSharingCorrection.h" -#include "MAssembly.h" - - -//////////////////////////////////////////////////////////////////////////////// - - -//! A standalone program based on MEGAlib and ROOT which plots the cross-talk histograms for each side of the 12 COSI'14 detectors and will probably eventually fit the histograms to find the cross talk corrections for each. -class ChargeLossOffsets -{ -public: - //! Default constructor - ChargeLossOffsets(); - //! Default destructor - ~ChargeLossOffsets(); - - //! Parse the command line - bool ParseCommandLine(int argc, char** argv); - //! Analyze what eveer needs to be analyzed... - bool Analyze(); - //! Interrupt the analysis - void Interrupt() { m_Interrupt = true; } - - -private: - //! True, if the analysis needs to be interrupted - bool m_Interrupt; - //! The input file name - MString m_FileName; - //! side: 1 for p, 0 for n to just do one at a time -// bool m_Side; - //! detector ID if you want to just do one at a time -// int m_DetID; - //! Energy of line to fit - double lineEnergy; - //! output file names - MString m_Outfile; - //!bool about whether to include the charge loss - bool correctCL; - - -}; - - - -//////////////////////////////////////////////////////////////////////////////// - - -//! Default constructor -ChargeLossOffsets::ChargeLossOffsets() : m_Interrupt(false) -{ - gStyle->SetPalette(1, 0); -} - - -//////////////////////////////////////////////////////////////////////////////// - - -//! Default destructor -ChargeLossOffsets::~ChargeLossOffsets() -{ - // Intentionally left blank -} - - -//////////////////////////////////////////////////////////////////////////////// - - -//! Parse the command line -bool ChargeLossOffsets::ParseCommandLine(int argc, char** argv) -{ - ostringstream Usage; - Usage<"< i+1) && (argv[i+1][0] != '-' || isalpha(argv[i+1][1]) == 0))){ - cout<<"Error: Option "<= 0){ - m_DetID = atoi(argv[i+1]); - } - else { - cout << "Error: detector # must be between 0 and 11" << endl; - cout << Usage.str() << endl; - return false; - } - } */ - - if (Option == "-e"){ - lineEnergy = atof(argv[i+1]); - //} else { - //cout << "Error: You need to give the line energy!" <SetFileName(m_FileName); -// Loader->SetDataSelectionMode(MBinaryFlightDataParserDataModes::c_Raw); -// Loader->SetAspectMode(MBinaryFlightDataParserAspectModes::c_Magnetometer); -// Loader->EnableCoincidenceMerging(true); - S->SetModule(Loader, 0); - - MModuleEnergyCalibrationUniversal* Calibrator = new MModuleEnergyCalibrationUniversal(); -// Calibrator->SetFileName("$(NUCLEARIZER)/resource/calibration/COSI14/EnergyCalibration.ecal"); - Calibrator->SetFileName("$(NUCLEARIZER)/resource/calibration/COSI16/EnergyCalibration.ecal"); - S->SetModule(Calibrator, 1); - - MModuleStripPairingGreedy* Pairing = new MModuleStripPairingGreedy(); - //Pairing->SetMode(0); - S->SetModule(Pairing, 2); - - MModuleCrosstalkCorrection* CrossTalk = new MModuleCrosstalkCorrection(); - CrossTalk->SetFileName("/home/clio/Software/Nuclearizer/resource/calibration/COSI16/Wanaka/CrossTalkCorrection_Results_060716.txt"); - S->SetModule(CrossTalk,3); - - MModuleChargeSharingCorrection* ChargeLoss = new MModuleChargeSharingCorrection(); - S->SetModule(ChargeLoss,4); - - if (Loader->Initialize() == false) return false; - if (Calibrator->Initialize() == false) return false; - if (Pairing->Initialize() == false) return false; - if (CrossTalk->Initialize() == false) return false; - if (ChargeLoss->Initialize() == false) return false; - - map Histograms; - - bool IsFinished = false; - MReadOutAssembly* Event = new MReadOutAssembly(); - - while (IsFinished == false && m_Interrupt == false) { - Event->Clear(); - if (Loader->IsReady() ){ - Loader->AnalyzeEvent(Event); - Calibrator->AnalyzeEvent(Event); - Pairing->AnalyzeEvent(Event); -// CrossTalk->AnalyzeEvent(Event); - - if (correctCL==1){ChargeLoss->AnalyzeEvent(Event);} - -// CrossTalk->AnalyzeEvent(Event); - -// if (Event->HasAnalysisProgress(MAssembly::c_CrosstalkCorrection) == true) { - if (Event->HasAnalysisProgress(MAssembly::c_StripPairing) == true) { - int nHits = Event->GetNHits(); - for (int h=0; hGetHit(h); - //exclude anything w multiple hits per strip - if (Hit->GetStripHitMultipleTimesX() == false && Hit->GetStripHitMultipleTimesY() == false){ - int nStripHits = Hit->GetNStripHits(); - int nXStripHits = 0, nYStripHits = 0; - - int detector = 0; - int histID = -1; - - double hitEnergy = 0.0; - double xEnergy = 0.0; - double yEnergy = 0.0; - - vector xStripIDs; - vector yStripIDs; - - for (int sh=0; shGetStripHit(sh); - detector = StripHit->GetDetectorID(); - - if (StripHit->IsLowVoltageStrip() == true){ - nXStripHits++; - xEnergy += StripHit->GetEnergy(); - xStripIDs.push_back(StripHit->GetStripID()); - } - else { - nYStripHits++; - yEnergy += StripHit->GetEnergy(); - yStripIDs.push_back(StripHit->GetStripID()); - } - } - //get all hits with 2 adj strips on p side - if (nXStripHits==2 && nYStripHits==1){ -// cout << xEnergy << '\t' << Hit->GetEnergy() << endl; - if (fabs(xStripIDs[0]-xStripIDs[1])==1){ - histID = 10*detector; - hitEnergy = xEnergy; - } - } - //get all hits with 2 adj strips on n side - else if (nXStripHits==1 && nYStripHits==2){ - if (fabs(yStripIDs[0]-yStripIDs[1])==1){ - histID = 10*detector+1; - hitEnergy = yEnergy; - } - } - - if (histID != -1){ - if (Histograms[histID] == 0){ - // TH1D* Hist = new TH1D("","",100,lineEnergy-30,lineEnergy+30); - TH1D* Hist = new TH1D("","",500,lineEnergy-30,lineEnergy+30); - Hist->SetXTitle("Energy (keV)"); - Hist->SetYTitle("Counts"); - - Histograms[histID] = Hist; - } - hitEnergy = Hit->GetEnergy(); - Histograms[histID]->Fill(hitEnergy); - } - } - } - } - } - IsFinished = Loader->IsFinished(); - } - - //create file to save all of the offset numbers in... -/* ofstream crosstalk_offsets; - crosstalk_offsets.open(m_OutFile); - crosstalk_offsets <SetParName(0,"eta"); - f_gausstail->SetParName(1,"N"); - f_gausstail->SetParName(2,"lambda"); - f_gausstail->SetParName(3,"mu"); - f_gausstail->SetParName(4,"sigma"); - f_gausstail->SetParName(5,"y-offset"); - f_gausstail->SetParameter(0,0.5); - f_gausstail->SetParLimits(0,0.15,0.8); - f_gausstail->SetParameter(1,1000); - f_gausstail->SetParLimits(1,100,100000); - f_gausstail->SetParameter(2,10); - f_gausstail->SetParLimits(2,2,30); - f_gausstail->SetParameter(3,(lineEnergy+1)); - f_gausstail->SetParLimits(3,(lineEnergy-2),(lineEnergy+25)); - f_gausstail->SetParameter(4,1.5); - f_gausstail->SetParLimits(4,0.5,6); - //f_gausstail->SetParameter(5,30); - - //TF1 *f1 = new TF1("f1","gaus", 650,680); - - - for (int det=0; det<12; det++){ -// for (auto H: Histograms){ - - TCanvas* C = new TCanvas(); - C->SetWindowSize(800,500); - C->Divide(2); - for (int side=0; side<2; side++){ - int histID = det*10 + side; - C->cd(side+1); - - if (side == 0){ - Histograms[histID]->SetTitle(MString("Detector ")+det+MString(" p side")); - Histograms[histID]->SetName(MString("Det")+det+MString("Pside")); - } - else { - Histograms[histID]->SetTitle(MString("Detector ")+det+MString(" n side")); - Histograms[histID]->SetName(MString("Det")+det+MString("Nside")); - } - - Histograms[histID]->Draw(); -// Histograms[histID]->Fit("f_gausstail","R"); - - TFile f(m_Outfile+MString("_Det")+det+MString("_Side")+side+MString("_Spectrum.root"),"new"); - Histograms[histID]->Write(); - f.Close(); - - double mean = f_gausstail->GetParameter(3); - double meanErr = f_gausstail->GetParError(3); - double fwhm = f_gausstail->GetParameter(4); - double fwhmErr = f_gausstail->GetParError(4); - double tailfrac = f_gausstail->GetParameter(0); - double tailfracErr = f_gausstail->GetParError(0); - double tailconst = f_gausstail->GetParameter(2); - double tailconstErr = f_gausstail->GetParError(2); - double chisq = f_gausstail->GetChisquare(); - int ndof = f_gausstail->GetNDF(); - - double meanDiff = mean-lineEnergy; - - //mean and FWHM - stringstream s_ptText1; - s_ptText1 << "#mu - E0 = " << setprecision(3) << meanDiff << " +/- " << setprecision(3) << meanErr; - string ptText1 = s_ptText1.str(); - stringstream s_ptText2; - s_ptText2 << "FWHM = " << setprecision(3) << fwhm << " +/- " << setprecision(3) << fwhmErr; - string ptText2 = s_ptText2.str(); - //tailfrac and tailconst - stringstream s_ptText3; - s_ptText3 << "tailfrac = " << setprecision(3) << tailfrac << "+/-" << setprecision(3) << tailfracErr; - string ptText3 = s_ptText3.str(); - stringstream s_ptText4; - s_ptText4 << "tailconst = " << setprecision(3) << tailconst << "+/-" << setprecision(3) << tailconstErr; - string ptText4 = s_ptText4.str(); - //chisq / dof - stringstream s_ptText5; - s_ptText5 << "#chi^2 / ndof = " << setprecision(3) << chisq << " / " << ndof; - string ptText5 = s_ptText5.str(); - - TPaveText *pt = new TPaveText(0.16,0.82,0.35,0.72,"NDC"); - pt->SetFillColor(kWhite); - pt->SetBorderSize(0); - pt->AddText(ptText1.c_str()); - pt->AddText(ptText2.c_str()); - pt->AddText(ptText3.c_str()); - pt->AddText(ptText4.c_str()); - pt->AddText(ptText5.c_str()); - - pt->SetTextFont(132); - pt->Draw(); - - C->Update(); - } - - C->Print(m_Outfile+MString("_")+round(lineEnergy)+MString("keV_det")+det+MString(".pdf")); - //fit the histogram and save the output - } - -// crosstalk_offsets.close(); - watch.Stop(); - cout << "total time (s): " << watch.CpuTime() << endl; - - return true; -} - - - -//////////////////////////////////////////////////////////////////////////////// - - -ChargeLossOffsets* g_Prg = 0; -int g_NInterruptCatches = 1; - - -//////////////////////////////////////////////////////////////////////////////// - - -//! Called when an interrupt signal is flagged -//! All catched signals lead to a well defined exit of the program -void CatchSignal(int a) -{ - if (g_Prg != 0 && g_NInterruptCatches-- > 0) { - cout<<"Catched signal Ctrl-C (ID="<Interrupt(); - } else { - abort(); - } -} - - -//////////////////////////////////////////////////////////////////////////////// - - -//! Main program -int main(int argc, char** argv) -{ - // Catch a user interupt for graceful shutdown - signal(SIGINT, CatchSignal); - - // Initialize global MEGALIB variables, especially mgui, etc. - MGlobal::Initialize("Standalone", "a standalone example program"); - - TApplication ChargeLossOffsetsApp("ChargeLossOffsetsApp", 0, 0); - - g_Prg = new ChargeLossOffsets(); - - if (g_Prg->ParseCommandLine(argc, argv) == false) { - cerr<<"Error during parsing of command line!"<Analyze() == false) { - cerr<<"Error during analysis!"<SetTitle(t); + mg->SetTitle(title.str().c_str()); DetGraphs[GraphID] = mg; TMultiGraph *mgr = new TMultiGraph(); mgr->SetTitle("Residuals"); @@ -115,15 +114,15 @@ int main(int argc, char* argv[]) } } - TMultiGraph * Det3avgres = new TMultiGraph(); + //TMultiGraph * Det3avgres = new TMultiGraph(); TGraphErrors *Det3avgres_n = new TGraphErrors(); - TGraphErrors *Det3avgres_p = new TGraphErrors(); - double averageres_Det3n[10][40] = {0}; - double energy_Det3n[14] = {0}; - int numstrips_Det3n[10] = {0}; - double averageres_Det3p[10][40] = {0}; - double energy_Det3p[14] = {0}; - int numstrips_Det3p[10] = {0}; + //TGraphErrors *Det3avgres_p = new TGraphErrors(); + double averageres_Det3n[10][40]{}; + double energy_Det3n[14]{}; + int numstrips_Det3n[10]{}; + double averageres_Det3p[10][40]{}; + //double energy_Det3p[14]{}; + int numstrips_Det3p[10]{}; MParser Parser; @@ -136,7 +135,7 @@ int main(int argc, char* argv[]) //if (Parser.Open("/home/jacqueline/MEGAlib/nuclearizer/resource/calibration/COSI19/Berkeley/EnergyCalibration.ecal") == false) { cout<<"Unable to open calibration file "< CP_ROEToLine; @@ -155,7 +154,7 @@ int main(int argc, char* argv[]) } } - int numamstrips = 0; + //int numamstrips = 0; for (auto CP: CP_ROEToLine) { diff --git a/apps/Makefile b/apps/Makefile index 2aa6f180..2120dfa1 100644 --- a/apps/Makefile +++ b/apps/Makefile @@ -31,7 +31,7 @@ clean: $(PRGS): $(BN)/%: %.cxx @echo "Linking and compiling $(subst $(BN)/,,$@) ... Please stand by ... " - @$(CXX) $(CXXFLAGS) $(LDFLAGS) $(subst $(BN)/,,$@).cxx $(NUCLEARIZER_SHARED_LIB) $(ALLLIBS) $(GLIBS) $(LIBS) $(PYTHONLIBS) -o $(@) + @$(CXX) $(CXXFLAGS) -Wno-vla-cxx-extension $(LDFLAGS) $(subst $(BN)/,,$@).cxx $(NUCLEARIZER_SHARED_LIB) $(ALLLIBS) $(GLIBS) $(LIBS) $(PYTHONLIBS) -o $(@) # diff --git a/apps/ThresholdCalculation.cxx b/apps/ThresholdCalculation.cxx deleted file mode 100644 index 96cc8087..00000000 --- a/apps/ThresholdCalculation.cxx +++ /dev/null @@ -1,822 +0,0 @@ -/* - * ThresholdCalculation.cxx - * - * - * Copyright (C) by Andreas Zoglauer. - * All rights reserved. - * - * - * This code implementation is the intellectual property of - * Andreas Zoglauer. - * - * By copying, distributing or modifying the Program (or any work - * based on the Program) you indicate your acceptance of this statement, - * and all its terms. - * - */ - -// Standard -#include -#include -#include -#include -#include -#include -#include -using namespace std; - -// ROOT -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -// MEGAlib -#include "MGlobal.h" -#include "MFile.h" -#include "MReadOutElementDoubleStrip.h" -#include "MFileReadOuts.h" -#include "MReadOutAssembly.h" -#include "MStripHit.h" -#include "MReadOutSequence.h" -#include "MSupervisor.h" -#include "MModuleLoaderMeasurementsROA.h" -#include "MBinaryFlightDataParser.h" -#include "MModuleLoaderMeasurementsBinary.h" -#include "MModuleLoaderSimulationsBalloon.h" -#include "MModuleEnergyCalibrationUniversal.h" -#include "MModuleStripPairingGreedy.h" -#include "MModuleCrosstalkCorrection.h" -#include "MModuleChargeSharingCorrection.h" -#include "MAssembly.h" - - -//////////////////////////////////////////////////////////////////////////////// - - -//! A standalone program based on MEGAlib and ROOT -class ThresholdCalculation -{ -public: - //! Default constructor - ThresholdCalculation(); - //! Default destructor - ~ThresholdCalculation(); - - //! Parse the command line - bool ParseCommandLine(int argc, char** argv); - //! Analyze what eveer needs to be analyzed... - bool Analyze(); - //! Interrupt the analysis - void Interrupt() { m_Interrupt = true; } - //! Calculate LLD Thresholds - void LLDThresholds(map LLDSpec, map &lld_thresholds, map &spectrum_kink); - //! Calculate fast thresholds - void FSTThresholdsLine(map FSTSpec, map &lld_thresholds, map &spectrum_kink,MModuleEnergyCalibrationUniversal* Calibrator); - //! Calculate fast thresholds - void FSTThresholdsErf(map FSTSpec, map &lld_thresholds, map &spectrum_kink, MModuleEnergyCalibrationUniversal* Calibrator); - //! Calculate fast thresholds - void FSTThresholdsErfFixedMean(map FSTSpec, map LLDSpec, map &lld_thresholds, map &spectrum_kink, MModuleEnergyCalibrationUniversal* Calibrator); - //! Calculate fast thresholds - void FSTThresholdsFastOverTotal(map FSTSpec, map LLDSpec, map &lld_thresholds, map &spectrum_kink, MModuleEnergyCalibrationUniversal* Calibrator); - - - -private: - //! True, if the analysis needs to be interrupted - bool m_Interrupt; - //! The input file name - MString m_FileName; - //! output file names - MString m_OutFile; - -}; - - -//////////////////////////////////////////////////////////////////////////////// - - -//! Default constructor -ThresholdCalculation::ThresholdCalculation() : m_Interrupt(false) -{ - gStyle->SetPalette(1, 0); -} - - -//////////////////////////////////////////////////////////////////////////////// - - -//! Default destructor -ThresholdCalculation::~ThresholdCalculation() -{ - // Intentionally left blank -} - - -//////////////////////////////////////////////////////////////////////////////// - - -//! Parse the command line -bool ThresholdCalculation::ParseCommandLine(int argc, char** argv) -{ - ostringstream Usage; - Usage<"< i+1) && - (argv[i+1][0] != '-' || isalpha(argv[i+1][1]) == 0))){ - cout<<"Error: Option "< i+2) && - (argv[i+1][0] != '-' || isalpha(argv[i+1][1]) == 0) && - (argv[i+2][0] != '-' || isalpha(argv[i+2][1]) == 0))){ - cout<<"Error: Option "<SetFileName(m_FileName); - Loader->SetDataSelectionMode(MBinaryFlightDataParserDataModes::c_Raw); - Loader->SetAspectMode(MBinaryFlightDataParserAspectModes::c_Neither); - Loader->EnableCoincidenceMerging(true); - S->SetModule(Loader, 0); - -/* - MModuleLoaderSimulationsBalloon* Loader = new MModuleLoaderSimulationsBalloon(); - Loader->SetSimulationFileName(m_FileName); - MDGeometryQuest* G = new MDGeometryQuest(); - if (G->ScanSetupFile("~/Software/MassModel/COSI.DetectorHead.geo.setup") == true){ - G->ActivateNoising(false); - G->SetGlobalFailureRate(0.0); - Loader->SetGeometry(G); - } - Loader->SetEnergyCalibrationFileName("/home/clio/Software/Nuclearizer/resource/calibration/COSI16/Wanaka/EnergyCalibration_053018.ecal"); - Loader->SetThresholdFileName("/volumes/cronus/users/clio/DetectorEffectsEngineTests/Thresholds/thresholds_erf_Run194_FstOverTotal.txt"); -// Loader->SetThresholdFileName("/volumes/cronus/users/clio/DetectorEffectsEngineTests/Thresholds/thresholds_erf_Run194_ADC_AboveZero.txt"); - Loader->SetDeadStripFileName("/home/clio/Software/Nuclearizer/resource/calibration/COSI16/Wanaka/DeadStripList.txt"); - Loader->SetDepthCalibrationCoeffsFileName("/home/clio/Software/Nuclearizer/resource/calibration/COSI16/Berkeley/depth_calibration_coeffs_v2.txt"); - Loader->SetDepthCalibrationSplinesFileName("/home/clio/Software/Nuclearizer/resource/calibration/COSI16/Berkeley/depth_calibration_curves.ctd"); - S->SetModule(Loader,0); -*/ - - MModuleEnergyCalibrationUniversal* Calibrator = new MModuleEnergyCalibrationUniversal(); - Calibrator->SetFileName("/home/clio/Software/Nuclearizer/resource/calibration/COSI16/Wanaka/EnergyCalibration_053018.ecal"); - Calibrator->EnablePreampTempCorrection(false); - S->SetModule(Calibrator, 1); - - if (Loader->Initialize() == false) return false; - if (Calibrator->Initialize() == false) return false; - - map LLDSpec; - map FSTSpec; - map LLDSpec2; - - bool IsFinished = false; - MReadOutAssembly* Event = new MReadOutAssembly(); - while (IsFinished == false && m_Interrupt == false) { - Event->Clear(); - if (Loader->IsReady() ){ - Loader->AnalyzeEvent(Event); - Calibrator->AnalyzeEvent(Event); - - if (Event->HasAnalysisProgress(MAssembly::c_EnergyCalibration) == true) { - for (unsigned int sh=0; shGetNStripHits(); sh++){ - - int det = Event->GetStripHit(sh)->GetDetectorID(); - int strip = Event->GetStripHit(sh)->GetStripID(); - bool isPos = Event->GetStripHit(sh)->IsLowVoltageStrip(); - - double energy = Event->GetStripHit(sh)->GetEnergy(); - double adc = Event->GetStripHit(sh)->GetADCUnits(); - double timing = Event->GetStripHit(sh)->GetTiming(); - - int identifier = det*1000+strip*10; - if (isPos){ identifier++; } - - //LLD only - if (timing == 0){ - if (LLDSpec[identifier] == 0){ - //make histogram if it doesn't exist yet - TH1D* Hist = new TH1D("LLD"+MString(identifier),"LLD "+MString(identifier),8192,0,8192); - TH1D* Hist2 = new TH1D("LLD2_"+MString(identifier),"LLD "+MString(identifier),8192,0,8192); - LLDSpec[identifier] = Hist; - LLDSpec2[identifier] = Hist2; - } - LLDSpec[identifier]->Fill(adc); - LLDSpec2[identifier]->Fill(adc); - } - //fast - else{ - if (FSTSpec[identifier] == 0){ - //make histogram if it doesn't exist yet - TH1D* Hist = new TH1D("FST"+MString(identifier),"FST "+MString(identifier),8192,0,8192); - FSTSpec[identifier] = Hist; - } - FSTSpec[identifier]->Fill(adc); - } - } - } - } - IsFinished = Loader->IsFinished(); - } - - - //save spectra -/* for (auto H: LLDSpec){ -// for (auto H: FSTSpec){ - char name[16]; - sprintf(name,"lld_%05d.root",H.first); - TFile f(name,"new"); - H.second->SetLineColor(kGreen); - H.second->GetXaxis()->SetRangeUser(0,500); - H.second->Write(); - if (FSTSpec[H.first] != 0){ - FSTSpec[H.first]->GetXaxis()->SetRangeUser(0,500); - FSTSpec[H.first]->Write(); - } - f.Close(); - } -*/ - -/* - for (auto H: FSTSpec){ - char name [17]; - sprintf(name,"fast_%05d.root",H.first); - TFile f(name,"new"); - H.second->Write(); - f.Close(); - } -*/ - - - map lld_thresholds; - map spectrum_kink; - LLDThresholds(LLDSpec,lld_thresholds,spectrum_kink); -// FSTThresholdsLine(FSTSpec,lld_thresholds,spectrum_kink,Calibrator); -// FSTThresholdsErf(FSTSpec,lld_thresholds,spectrum_kink,Calibrator); -// FSTThresholdsErfFixedMean(FSTSpec,LLDSpec2,lld_thresholds,spectrum_kink,Calibrator); - FSTThresholdsFastOverTotal(FSTSpec,LLDSpec2,lld_thresholds,spectrum_kink,Calibrator); - - - cout << "all spectra analyzed and saved" << endl; - - return true; -} - - -////////////////////////////////////////////////////////////////////////////////// - -void ThresholdCalculation::LLDThresholds(map LLDSpec, map &lld_thresholds, map &spectrum_kink){ - - //first find threshold - float thresh = 0; -// map lld_thresholds; - - for (auto H: LLDSpec){ - for (int b=0; bGetNbinsX(); b++){ - if (H.second->GetBinContent(b) != 0){ - thresh = H.second->GetBinLowEdge(b); - break; - } - } - lld_thresholds[H.first] = thresh; - } - - //then find point where LLD spectrum dies off - - for (auto H: LLDSpec){ - //limit the fit range like this to just fit the slope of the LLD spectrum and not overcount - // LLD counts after the kink - TF1* line = new TF1("line","[0]*x+[1]",lld_thresholds[H.first]+50,lld_thresholds[H.first]+200); - line->SetParLimits(0,-100000,0); - H.second->Fit("line","RQ"); - - //calculate x intercept - float slope = line->GetParameter(0); - float yInt = line->GetParameter(1); - float xInt = -(yInt/slope); - - spectrum_kink[H.first] = xInt; - - delete line; - } - -} - - - -void ThresholdCalculation::FSTThresholdsLine(map FSTSpec, map &lld_thresholds, map &spectrum_kink, MModuleEnergyCalibrationUniversal* Calibrator){ - - map slope; - map yInt; - - - for (auto H: FSTSpec){ - - TF1* line = new TF1("line","[0]*x+[1]",lld_thresholds[H.first],spectrum_kink[H.first]); - H.second->Fit("line","R"); - slope[H.first] = line->GetParameter(0)/H.second->GetBinContent(H.second->FindBin(spectrum_kink[H.first])); - yInt[H.first] = line->GetParameter(1)/H.second->GetBinContent(H.second->FindBin(spectrum_kink[H.first])); - - //add TF1 to spectrum file - char name[16]; - sprintf(name,"fst_%05d.root",H.first); - TFile f(name,"new"); - H.second->Write(); - line->Write(); - f.Close(); - - delete line; - } - - //save results in file - FILE * fp; - fp = fopen("thresholds_line.txt","w+"); - for (auto H: FSTSpec){ - MReadOutElementDoubleStrip R; - R.SetDetectorID(H.first / 1000); - R.SetStripID((H.first % 1000) / 10); - R.IsLowVoltageStrip(H.first % 10); - - //put everything back in energy - double lld_thresh = Calibrator->GetEnergy(R,lld_thresholds[H.first]); - double rollover = Calibrator->GetEnergy(R,spectrum_kink[H.first]); - double slopeEn = Calibrator->GetEnergy(R,slope[H.first]); - double yIntEn = Calibrator->GetEnergy(R,yInt[H.first]); - - fprintf(fp,"%05d\t%f\t%f\t%f\t%f\n",H.first,lld_thresh,rollover,slopeEn,yIntEn); - } - - fclose(fp); - -} - -void ThresholdCalculation::FSTThresholdsErf(map FSTSpec, map &lld_thresholds, map &spectrum_kink, MModuleEnergyCalibrationUniversal* Calibrator){ - - map mean; - map sigma; - map constant; - - for (auto H: FSTSpec){ - //set this up for energy / ADC conversions - MReadOutElementDoubleStrip R; - R.SetDetectorID(H.first / 1000); - R.SetStripID((H.first % 1000) / 10); - R.IsLowVoltageStrip(H.first % 10); - - TF1* erf = new TF1("erf","[0]*TMath::Erf(([1]-x)/(sqrt(2)*[2]))+[3]",lld_thresholds[H.first],spectrum_kink[H.first]+180); - erf->SetParameters(-40,200,90,10); - erf->SetParLimits(1,0,spectrum_kink[H.first]); - -// erf->FixParameter(2,Calibrator->GetADC(R,20)); - H.second->Fit("erf","R"); - mean[H.first] = erf->GetParameter(1); - sigma[H.first] = erf->GetParameter(2); - - //add TF1 to spectrum file - char name[16]; - sprintf(name,"fst_%05d.root",H.first); - TFile f(name,"new"); - H.second->Write(); - H.second->GetXaxis()->SetRangeUser(0,Calibrator->GetADC(R,100)); - erf->Write(); - f.Close(); - - delete erf; - } - - //save results in file - FILE * fp; - fp = fopen("thresholds_erf.txt","w+"); - for (auto H: FSTSpec){ - MReadOutElementDoubleStrip R; - R.SetDetectorID(H.first / 1000); - R.SetStripID((H.first % 1000) / 10); - R.IsLowVoltageStrip(H.first % 10); - - //put everything back in energy -/* double lld_thresh = Calibrator->GetEnergy(R,lld_thresholds[H.first]); -// double rollover = Calibrator->GetEnergy(R,spectrum_kink[H.first]); - double meanEn = Calibrator->GetEnergy(R,mean[H.first]); - double sigEn = Calibrator->GetEnergy(R,sigma[H.first]); -*/ - - //or leave everything in ADC for the DEE - double lld_thresh = lld_thresholds[H.first]; - double meanEn = mean[H.first]; - double sigEn = sigma[H.first]; - - fprintf(fp,"%05d\t%f\t%f\t%f\n",H.first,lld_thresh,meanEn,sigEn); -// fprintf(fp,"%05d\t%f\t%f\t%f\t%f\n",H.first,lld_thresholds[H.first],spectrum_kink[H.first],mean[H.first],sigma[H.first]); - } - - fclose(fp); - -} - - -void ThresholdCalculation::FSTThresholdsErfFixedMean(map FSTSpec, map LLDSpec, map &lld_thresholds, map &spectrum_kink, MModuleEnergyCalibrationUniversal* Calibrator){ - - map mean; - map sigma; - map offset; - map amplitude; - - FILE * fp2; - fp2 = fopen("overlap_start_stop.txt","w+"); - - for (auto H: FSTSpec){ - if (LLDSpec[H.first] == 0){ - mean[H.first] = -1; - continue; - } - int start_bin, stop_bin; - //go between lld threshold and spectrum kink to find first bin where LLD <= FST - for (int bin=LLDSpec[H.first]->FindBin(lld_thresholds[H.first]); binFindBin(spectrum_kink[H.first]); bin++){ - if (H.second->GetBinContent(bin) >= LLDSpec[H.first]->GetBinContent(bin)){ - start_bin = bin; - break; - } - } - //go the other way to find first bin where LLD >= FST - for (int bin=LLDSpec[H.first]->FindBin(spectrum_kink[H.first]); bin>LLDSpec[H.first]->FindBin(lld_thresholds[H.first]); bin--){ - if (H.second->GetBinContent(bin) <= LLDSpec[H.first]->GetBinContent(bin)){ - stop_bin = bin; - break; - } - } - - fprintf(fp2,"%05d\t%d\t%d\n",H.first,start_bin,stop_bin); - - if (start_bin == stop_bin){ - mean[H.first] = start_bin; - } - else if (start_bin < stop_bin){ - mean[H.first] = start_bin + (stop_bin-start_bin)/2.; - } - else { - cout << "start bin > stop bin: " << H.first << endl; - mean[H.first] = start_bin; - } - - } - - fclose(fp2); - - FILE* fp3; - fp3 = fopen("erf_at_0.txt","w"); - - gROOT->SetBatch(kTRUE); - for (auto H: FSTSpec){ - //set this up for energy / ADC conversions - MReadOutElementDoubleStrip R; - R.SetDetectorID(H.first / 1000); - R.SetStripID((H.first % 1000) / 10); - R.IsLowVoltageStrip(H.first % 10); - - TF1* erf = new TF1("erf","[0]*(-1*TMath::Erf(([1]-x)/(sqrt(2)*[2]))+1)+[3]",lld_thresholds[H.first],spectrum_kink[H.first]+180); - erf->SetParameters(40,200,90,10); - erf->SetParLimits(0,0,1000000); - erf->SetParLimits(1,lld_thresholds[H.first],spectrum_kink[H.first]); - erf->SetParLimits(2,0,1000000); - erf->SetParLimits(3,0,1000000); -/* if (mean[H.first] != -1){ - erf->FixParameter(1,mean[H.first]); - erf->FixParameter(2,(spectrum_kink[H.first]-mean[H.first])/sqrt(2)); - } - else { - erf->SetParLimits(1,0,spectrum_kink[H.first]); - } -*/ -// erf->FixParameter(2,Calibrator->GetADC(R,20)); - H.second->Fit("erf","R"); - mean[H.first] = erf->GetParameter(1); - sigma[H.first] = erf->GetParameter(2); - offset[H.first] = erf->GetParameter(3); - amplitude[H.first] = erf->GetParameter(0); - - fprintf(fp3,"%f\n",erf->Eval(0)); - - //add TF1 to spectrum file - char name[20]; - sprintf(name,"lld_fst_%05d.root",H.first); - TCanvas *c1 = new TCanvas("c1"+MString(H.first)); - - H.second->GetXaxis()->SetTitle("ADC"); - H.second->GetYaxis()->SetTitle("Counts"); - H.second->GetXaxis()->SetRangeUser(0,500); - H.second->Draw(); - - if (LLDSpec[H.first] != 0){ - LLDSpec[H.first]->SetLineColor(kGreen); - LLDSpec[H.first]->GetXaxis()->SetRangeUser(0,500); - LLDSpec[H.first]->Draw("same"); - } - -// erf->Write(); -// TFile f(name,"new"); - c1->Print(name); -// f.Close(); - - delete erf; - } - fclose(fp3); - - //save results in file - FILE * fp; - fp = fopen("thresholds_erf.txt","w+"); - for (auto H: FSTSpec){ - MReadOutElementDoubleStrip R; - R.SetDetectorID(H.first / 1000); - R.SetStripID((H.first % 1000) / 10); - R.IsLowVoltageStrip(H.first % 10); - - //or leave everything in ADC for the DEE - double lld_thresh = lld_thresholds[H.first]; - double meanEn = mean[H.first]; - double sigEn = sigma[H.first]; - - fprintf(fp,"%05d\t%f\t%f\t%f\t%f\t%f\t%f\n",H.first,lld_thresh,meanEn,sigEn,offset[H.first],amplitude[H.first],spectrum_kink[H.first]+180); -// fprintf(fp,"%05d\t%f\t%f\t%f\t%f\n",H.first,lld_thresholds[H.first],spectrum_kink[H.first],mean[H.first],sigma[H.first]); - } - - fclose(fp); - - //make file in keV just to compare data to simulations - FILE * fpkeV; - fpkeV = fopen("thresholds_erf_keV.txt","w+"); - for (auto H: FSTSpec){ - MReadOutElementDoubleStrip R; - R.SetDetectorID(H.first / 1000); - R.SetStripID((H.first % 1000) / 10); - R.IsLowVoltageStrip(H.first % 10); - - //put everything back in energy - double lld_thresh = Calibrator->GetEnergy(R,lld_thresholds[H.first]); -// double rollover = Calibrator->GetEnergy(R,spectrum_kink[H.first]); - double meanEn = Calibrator->GetEnergy(R,mean[H.first]); - double sigEn = Calibrator->GetEnergy(R,sigma[H.first]); - - fprintf(fpkeV,"%05d\t%f\t%f\t%f\n",H.first,lld_thresh,meanEn,sigEn); -// fprintf(fp,"%05d\t%f\t%f\t%f\t%f\n",H.first,lld_thresholds[H.first],spectrum_kink[H.first],mean[H.first],sigma[H.first]); - } - - fclose(fpkeV); - -} - -void ThresholdCalculation::FSTThresholdsFastOverTotal(map FSTSpec, map LLDSpec, map &lld_thresholds, map &spectrum_kink, MModuleEnergyCalibrationUniversal* Calibrator){ - - map mean; - map sigma; - map offset; - map amplitude; - - map FastOverTotal; - - gROOT->SetBatch(kTRUE); - for (auto H: FSTSpec){ - if (LLDSpec[H.first] != 0){ - TH1D* Hist = new TH1D("FOT_"+MString(H.first),"fast over total "+MString(H.first),8192,0,8192); - FastOverTotal[H.first] = Hist; - for (int b=1; bGetNbinsX()+1; b++){ - double denom = H.second->GetBinContent(b)+LLDSpec[H.first]->GetBinContent(b); - double binContent = 0; - if (denom != 0){ - binContent = H.second->GetBinContent(b)/denom; - } - FastOverTotal[H.first]->SetBinContent(b,binContent); - } - } - - //set this up for energy / ADC conversions - MReadOutElementDoubleStrip R; - R.SetDetectorID(H.first / 1000); - R.SetStripID((H.first % 1000) / 10); - R.IsLowVoltageStrip(H.first % 10); - - TF1* erf = new TF1("erf","[0]*(-1*TMath::Erf(([1]-x)/(sqrt(2)*[2]))+1)+[3]",lld_thresholds[H.first],spectrum_kink[H.first]+180); - erf->SetParameters(1,200,90,0); - erf->SetParLimits(0,0,1000000); -// erf->SetParLimits(1,lld_thresholds[H.first],spectrum_kink[H.first]); - erf->SetParLimits(1,0,1000000); - erf->SetParLimits(2,0,1000000); - erf->SetParLimits(3,0,1000000); -/* if (mean[H.first] != -1){ - erf->FixParameter(1,mean[H.first]); - erf->FixParameter(2,(spectrum_kink[H.first]-mean[H.first])/sqrt(2)); - } - else { - erf->SetParLimits(1,0,spectrum_kink[H.first]); - } -*/ -// erf->FixParameter(2,Calibrator->GetADC(R,20)); - - if (FastOverTotal[H.first] != 0){ - FastOverTotal[H.first]->Fit("erf","R"); - - mean[H.first] = erf->GetParameter(1); - sigma[H.first] = erf->GetParameter(2); - offset[H.first] = erf->GetParameter(3); - amplitude[H.first] = erf->GetParameter(0); - } - - //add TF1 to spectrum file - char name[20]; - sprintf(name,"lld_fst_%05d.root",H.first); - TCanvas *c1 = new TCanvas("c1"+MString(H.first)); - - H.second->GetXaxis()->SetTitle("ADC"); - H.second->GetYaxis()->SetTitle("Counts"); - H.second->GetXaxis()->SetRangeUser(0,500); - H.second->Draw(); - - if (LLDSpec[H.first] != 0){ - LLDSpec[H.first]->SetLineColor(kGreen); - LLDSpec[H.first]->GetXaxis()->SetRangeUser(0,500); - LLDSpec[H.first]->Draw("same"); - } - -// erf->Write(); -// TFile f(name,"new"); - c1->Print(name); -// f.Close(); - - if (FastOverTotal[H.first] != 0){ - TCanvas *c2 = new TCanvas("c2"+MString(H.first)); - - FastOverTotal[H.first]->GetXaxis()->SetRangeUser(0,500); - FastOverTotal[H.first]->GetXaxis()->SetTitle("ADC"); - FastOverTotal[H.first]->GetYaxis()->SetTitle("Counts"); - FastOverTotal[H.first]->Draw(); - - char name2[25]; - sprintf(name2,"fastOverTotal_%05d.root",H.first); - c2->Print(name2); - } - - delete erf; - } - - //save results in file - FILE * fp; - fp = fopen("thresholds_erf.txt","w+"); - for (auto H: FSTSpec){ - MReadOutElementDoubleStrip R; - R.SetDetectorID(H.first / 1000); - R.SetStripID((H.first % 1000) / 10); - R.IsLowVoltageStrip(H.first % 10); - - //or leave everything in ADC for the DEE - double lld_thresh = lld_thresholds[H.first]; - double meanEn = mean[H.first]; - double sigEn = sigma[H.first]; - - fprintf(fp,"%05d\t%f\t%f\t%f\t%f\t%f\t%f\n",H.first,lld_thresh,meanEn,sigEn,offset[H.first],amplitude[H.first],spectrum_kink[H.first]+180); -// fprintf(fp,"%05d\t%f\t%f\t%f\t%f\n",H.first,lld_thresholds[H.first],spectrum_kink[H.first],mean[H.first],sigma[H.first]); - } - - fclose(fp); - - //make file in keV just to compare data to simulations - FILE * fpkeV; - fpkeV = fopen("thresholds_erf_keV.txt","w+"); - for (auto H: FSTSpec){ - MReadOutElementDoubleStrip R; - R.SetDetectorID(H.first / 1000); - R.SetStripID((H.first % 1000) / 10); - R.IsLowVoltageStrip(H.first % 10); - - //put everything back in energy - double lld_thresh = Calibrator->GetEnergy(R,lld_thresholds[H.first]); -// double rollover = Calibrator->GetEnergy(R,spectrum_kink[H.first]); - double meanEn = Calibrator->GetEnergy(R,mean[H.first]); - double sigEn = Calibrator->GetEnergy(R,sigma[H.first]); - - fprintf(fpkeV,"%05d\t%f\t%f\t%f\n",H.first,lld_thresh,meanEn,sigEn); -// fprintf(fp,"%05d\t%f\t%f\t%f\t%f\n",H.first,lld_thresholds[H.first],spectrum_kink[H.first],mean[H.first],sigma[H.first]); - } - - fclose(fpkeV); - -} - - -//////////////////////////////////////////////////////////////////////////////// - - - -ThresholdCalculation* g_Prg = 0; -int g_NInterruptCatches = 1; - - -//////////////////////////////////////////////////////////////////////////////// - - -//! Called when an interrupt signal is flagged -//! All catched signals lead to a well defined exit of the program -void CatchSignal(int a) -{ - if (g_Prg != 0 && g_NInterruptCatches-- > 0) { - cout<<"Catched signal Ctrl-C (ID="<Interrupt(); - } else { - abort(); - } -} - - -//////////////////////////////////////////////////////////////////////////////// - - -//! Main program -int main(int argc, char** argv) -{ - // Catch a user interupt for graceful shutdown - signal(SIGINT, CatchSignal); - - // Initialize global MEGALIB variables, especially mgui, etc. - MGlobal::Initialize("Standalone", "a standalone example program"); - - TApplication ThresholdCalculationApp("ThresholdCalculationApp", 0, 0); - - g_Prg = new ThresholdCalculation(); - - if (g_Prg->ParseCommandLine(argc, argv) == false) { - cerr<<"Error during parsing of command line!"<Analyze() == false) { - cerr<<"Error during analysis!"<SetDetectorID(Strip->GetDetectorID()); - SH->IsLowVoltageStrip(Strip->IsLowVoltageStrip()); + SH->IsXStrip(Strip->IsLowVoltageStrip()); SH->SetStripID(Strip->GetStripID()); SH->SetTiming(Timing->GetTiming()); diff --git a/apps/depth_calibration.cxx b/apps/depth_calibration.cxx deleted file mode 100644 index 531cd1f6..00000000 --- a/apps/depth_calibration.cxx +++ /dev/null @@ -1,667 +0,0 @@ -//TODO -/* --redefine measured CTD histos so that bins are centered on 10' of nanoseconds --define photopeak criteria... use energy resolutions for the strips, and say +/- 2.35 sigma - - */ - - -// Standard -#include -#include -#include -#include -#include -#include -#include -using namespace std; - -// ROOT -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -// MEGAlib -#include "MGlobal.h" -#include "MFile.h" -#include "MReadOutElementDoubleStrip.h" -#include "MFileReadOuts.h" -#include "MReadOutAssembly.h" -#include "MStripHit.h" -#include "MReadOutSequence.h" -#include "MSupervisor.h" -#include "MModuleLoaderMeasurementsROA.h" -#include "MModuleEnergyCalibrationUniversal.h" -#include "MModuleStripPairingGreedy.h" -#include "MAssembly.h" -#include "MFileEventsSim.h" -#include "MDGeometryQuest.h" - -class MDEEStripHit -{ - public: - //! The read-out element - MReadOutElementDoubleStrip m_ROE; - //! The ADC value - double m_ADC; - //! The timing value; - double m_Timing; - - //! The simulated position - MVector m_Position; - //! The simulated energy deposit - double m_Energy; - - //! True if this is a guard ring - bool m_IsGuardRing; - - //! A list of original strip hits making up this strip hit - vector m_SubStripHits; -}; - -class MStripHit_s : public MStripHit -{ - //use this derived class instead of MStripHit so that we can keep track of the depth - //from the simulation data - - public: - void SetDepth(double Depth){ m_Depth = Depth; } - double GetDepth(void){ return m_Depth; } - protected: - double m_Depth; -}; - - -bool GetDepthSplines(MString fname, std::map& SplineMap, bool invert = false); -void AddSpline(vector& xvec, vector& yvec, map& SplineMap, int DetID); -const double DetectorThicknesses[12] = {1.49, 1.45, 1.50, 1.51, 1.50, 1.47, 1.48, 1.47, 1.49, 1.47, 1.42, 1.45}; -bool EnergyFilter(double Energy); -MReadOutAssembly* RealizeSimEvent(MSimEvent* simEvent, MModuleEnergyCalibrationUniversal* Calibrator); -double ctd_template_fit_function(double* v, double* par); -void FindEdgeBins(TH1D* H, int* L, int* R); - -TH1D* Gctd; //used by root fit function - -int main(int argc, char** argv) -{ - - int Level = 7; - if( argc < 5 ){ - cout << "need four arguments, first is raw data filename, second is sim filename, third is geometry file, fourth is Depth->CTD curves" << endl; - return -1; - } else if( argc == 6 ){ - sscanf(argv[5],"%d",&Level); - if( Level & 0x1 ) cout << "Level -> read in real data" << endl; - if( Level & 0x2 ) cout << "Level -> read in sim data" << endl; - if( Level & 0x4 ) cout << "Level -> perform fits" << endl; - } else if( argc == 5 ){ - if( Level & 0x1 ) cout << "Level -> read in real data" << endl; - if( Level & 0x2 ) cout << "Level -> read in sim data" << endl; - if( Level & 0x4 ) cout << "Level -> perform fits" << endl; - } else { - cout << "too many args, exiting..." << endl; - return -1; - } - - MGlobal::Initialize("Standalone",""); - TApplication dcal("dcal",0,0); - MString RawFile( argv[1] ); - MString SimFile( argv[2] ); - MString GeoFile( argv[3] ); - MString DepthToCTDFile( argv[4] ); - std::map DepthToCTD; - if( !GetDepthSplines( DepthToCTDFile, DepthToCTD, false ) ){ - cout << "failed to load splines, exiting..." << endl; - return -1; - } else { - TFile* rootF = new TFile("splines.root","recreate"); - TMultiGraph* mg = new TMultiGraph(); - for(auto const &it: DepthToCTD){ - int det = it.first; - TSpline3* sp = it.second; - double thickness = DetectorThicknesses[det]; - unsigned int N = 1000; - double dx = thickness/((double) (N-1)); - vector X; vector Y; - for(unsigned int i = 0; i < N; ++i){ - X.push_back(i*dx); - Y.push_back(sp->Eval(i*dx)); - } - TGraph* gr = new TGraph(N,(double *) &X[0],(double *) &Y[0]); - rootF->WriteTObject(gr); - rootF->WriteTObject(sp); - mg->Add(gr); - } - rootF->WriteTObject(mg); - rootF->Close(); - } - TRandom3 RNG(0); - - // Load geometry: - MDGeometryQuest* Geometry = new MDGeometryQuest(); - if (Geometry->ScanSetupFile(GeoFile) == true) { - Geometry->ActivateNoising(false); - Geometry->SetGlobalFailureRate(0.0); - cout<<"Geometry "<GetName()<<" loaded!"<GetName()<<" - Aborting!"<SetFileName(RawFile); - - MModuleEnergyCalibrationUniversal* Calibrator = new MModuleEnergyCalibrationUniversal(); - Calibrator->SetFileName("$(NUCLEARIZER)/resource/calibration/COSI14/Antarctica/EnergyCalibration.ecal"); - - MModuleStripPairingGreedy* Pairing = new MModuleStripPairingGreedy(); - - if (Loader->Initialize() == false) return false; - if (Calibrator->Initialize() == false) return false; - if (Pairing->Initialize() == false) return false; - - std::map Histograms; //map to store CTD histograms - unsigned int counter = 0; - - if( Level & 0x1 ){ //read in real data - - bool IsFinished = false; - MReadOutAssembly* Event = new MReadOutAssembly(); - while (IsFinished == false) { - Event->Clear(); - Loader->AnalyzeEvent(Event); - Calibrator->AnalyzeEvent(Event); - Pairing->AnalyzeEvent(Event); - - unsigned int NHits = Event->GetNHits(); - for(unsigned int i = 0; i < NHits; i++){ - MHit* H = Event->GetHit(i); - unsigned int NStripHits = H->GetNStripHits(); - if( NStripHits == 2 ){ //using 2-strip events only - bool EnergyGood = EnergyFilter(H->GetEnergy()); - if( EnergyGood ){ - - int pixel_code; - double timing; - MStripHit *SHx, *SHy; - - if( H->GetStripHit(0)->IsLowVoltageStrip() && !H->GetStripHit(1)->IsLowVoltageStrip() ){ - SHx = H->GetStripHit(0); SHy = H->GetStripHit(1); - } else if( H->GetStripHit(1)->IsLowVoltageStrip() && !H->GetStripHit(0)->IsLowVoltageStrip() ){ - SHx = H->GetStripHit(1); SHy = H->GetStripHit(0); - } else { - //we didn't have 1 x and 1 y strip, log this and continue... - continue; - } - - int DetID = SHx->GetDetectorID(); - - pixel_code = 10000*DetID + 100*SHx->GetStripID() + SHy->GetStripID(); - if( (SHx->GetTiming() < 1E-6) || (SHy->GetTiming() < 1E-6) ){ - // cout << "bad timing" << endl; - continue; - } -// timing = (SHx->GetTiming() - SHy->GetTiming())*10.0 + 5.0; //add five for bin centering - timing = (SHx->GetTiming() - SHy->GetTiming()); //add five for bin centering - - //check if we have a TH1D for this pixel yet - if( Histograms[pixel_code] == NULL ){ - char name[64]; sprintf(name,"%d",pixel_code); - TH1D* new_hist = new TH1D(name, name, 60, -300.0, +300.0); - Histograms[pixel_code] = new_hist; - } - - Histograms[pixel_code]->Fill(timing); - - } - } - } - - IsFinished = Loader->IsFinished(); - ++counter; - if( (counter & 0xffff) == 0 ) cout << "num raw events: " << counter << endl; - } - - //when done, overwrite the histograms in the root file - //check if subdir exists, if not, then create it - //mkdir will return 0 if it already exists - TFile* rootF = new TFile("data_ctd.root","recreate"); - for(auto const &it: Histograms){ - TH1D* hist = it.second; - rootF->WriteTObject(hist); - //clear the TH1D from memory... leave it for now for debugging but later - //we might end up using lots of memeory - } - rootF->Close(); - - } - - std::map simHistograms; - - if( Level & 0x2 ){ //read in simulation data - - MFileEventsSim* Reader = new MFileEventsSim(Geometry); - if (Reader->Open(SimFile) == false) { - cout<<"Unable to open sim file "< DepthHistograms; - for(int i = 0; i < 12; ++i){ - char name[16]; sprintf(name,"depth_%d",i); - TH1D* H = new TH1D(name,name,100,0,1.6); - DepthHistograms.push_back(H); - } - while ((simEvent = Reader->GetNextEvent()) != 0) { - - //Reader->GetNextEvent() will print out some info about hits not being in sensitive volumes... this method will automatically exclude the weird HTs so that the code that follows - //doesn't have to deal with it. these HTs come from hits that are at the sensitive Ge / Ge corner boundary. - - //need to make an MReadoutAssembly out of the simEvent - //the simEvent has simHTs which contain - - MReadOutAssembly* Event = RealizeSimEvent(simEvent, Calibrator); - //cout << "@@@@ : " << simEvent->GetNHTs() << " : " << Event->GetNStripHits() << endl; - //we DO have strip hits at this point - Pairing->AnalyzeEvent(Event); - - for( unsigned int i = 0; i < Event->GetNHits(); ++i ){ - MHit* H = Event->GetHit(i); - if( (H->GetNStripHits() != 2) || (EnergyFilter(H->GetEnergy()) == false) ) continue; else { - - MStripHit_s *SHx, *SHy; - - if( H->GetStripHit(0)->IsLowVoltageStrip() && !H->GetStripHit(1)->IsLowVoltageStrip() ){ - SHx = dynamic_cast(H->GetStripHit(0)); SHy = dynamic_cast(H->GetStripHit(1)); - } else if( H->GetStripHit(1)->IsLowVoltageStrip() && !H->GetStripHit(0)->IsLowVoltageStrip() ){ - SHx = dynamic_cast(H->GetStripHit(1)); SHy = dynamic_cast(H->GetStripHit(0)); - } else { - //we didn't have 1 x and 1 y strip, log this and continue... - continue; - } - - //check that the depths agree - double Depth; - if( fabs(SHx->GetDepth() - SHy->GetDepth()) > 1.0E-6 ){ - cout << "depths don't agree!" << endl; - continue; - } else { - Depth = SHx->GetDepth(); - } - - int DetID = SHx->GetDetectorID(); - //int pixel_code = 10000*DetID + 100*SHx->GetStripID() + SHy->GetStripID(); - DepthHistograms[DetID]->Fill(Depth); - - double Timing = DepthToCTD[DetID]->Eval(Depth); - double Noise = RNG.Gaus(0,12.5/2.3548); - TH1D* hist = simHistograms[DetID]; - if( hist == NULL ){ - char name[64]; sprintf(name,"%d",DetID); - hist = new TH1D(name, name, 8*60, -300.0, +300.0); - simHistograms[DetID] = hist; - } - hist->Fill(Timing+Noise); - } - } - - ++counter; - if( (counter & 0xffff) == 0 ) cout << "num sim events: " << counter << endl; - delete simEvent; - delete Event; - - } - - //write simulated CTD templates to root file - TFile* rootF = new TFile("sim_ctd.root","recreate"); - for(auto const &it: simHistograms){ - TH1D* hist = it.second; - rootF->WriteTObject(hist); - } - for(int i = 0; i < 12; ++i){ - rootF->WriteTObject(DepthHistograms[i]); - } - rootF->Close(); - - } - - if( Level & 0x4 ){ - //perform the fits - - //loop over pixel codes in order and try to read the pixel data from the root file - //first check if the root file exists - - TFile* rootF_mctd = new TFile("data_ctd.root","READ"); - TFile* rootF_sctd = new TFile("sim_ctd.root","READ"); - - if( rootF_mctd == NULL ){ - cout << "couldn't open measured CTD root file, exiting..." << endl; - return -1; - } - - if( rootF_sctd == NULL ){ - cout << "couldn't open sim CTD root file, exiting..." << endl; - return -1; - } - - FILE* fout = fopen("coeffs.txt","w"); - fprintf(fout,"#format is 1) pixel code (10000*det + 100*Xchannel + Ychannel) 2) stretch 3) offset 4) scale 5) chi2 reduced\n"); - TFile* rootF_fits = new TFile("fits.root","recreate"); - - for( unsigned int D = 0; D < 12; ++D ){ - char det_name[8]; sprintf(det_name,"%d",D); - TH1D* ctd_template = (TH1D*)rootF_sctd->Get(det_name); - if(ctd_template == NULL){ - cout << "could not read CTD template for detector " << D << ", skipping this detector..." << endl; - continue; - } else { - Gctd = ctd_template; //set this globally so that the root fit function can see it - } - TF1* fitfunc = new TF1("ctd_fitfunc",ctd_template_fit_function,-300.0,+300.0,3); - fitfunc->SetParameters(1.0, 0.0, 1.0); // first param is stretch, second is offset, third is scale - fitfunc->SetParNames("stretch","offset","scale"); - - //find maxima of CTD edges - /* - ctd_template->SetAxisRange(-300.0,0.0); - double max1 = ctd_template->GetMaximum(); - double max1_bin = ctd_template->GetMaximumBin(); - double max1_x = ctd_template->GetBinCenter(max1_bin); - - ctd_template->SetAxisRange(0.0,300.0); - double max2 = ctd_template->GetMaximum(); - double max2_bin = ctd_template->GetMaximumBin(); - double max2_x = ctd_template->GetBinCenter(max2_bin); - - ctd_template->SetAxisRange(-300.0,300.0); - */ - - int Ledge_bin, Redge_bin; FindEdgeBins(ctd_template, &Ledge_bin, &Redge_bin); - double max1_x = ctd_template->GetBinCenter(Ledge_bin); double max1 = ctd_template->GetBinContent(Ledge_bin); - double max2_x = ctd_template->GetBinCenter(Redge_bin); //double max2 = ctd_template->GetBinContent(Redge_bin); - - for( unsigned int Xch = 1; Xch <= 37; ++Xch ){ - for( unsigned int Ych = 1; Ych <= 37; ++Ych ){ - int pixel_code = 10000*D + 100*Xch + Ych; - char pixel_code_s[32]; sprintf(pixel_code_s,"%d",pixel_code); - TH1D* H = (TH1D*)rootF_mctd->Get(pixel_code_s); - if( H == NULL ) continue; else { - cout << "found pixel:" << pixel_code << ", starting fit..." << endl; - //idea, use best fit from last pixel as starting values here since these parameters vary spacially (especially stretch factor), assuming chi2 is good enough - //MIGHT NEED TO CALL SET PARAMETERS AGAIN HERE -// if( !UseLast ) fitfunc->SetParameters(1.0, 0.0, 1.0); - - FindEdgeBins(H, &Ledge_bin, &Redge_bin); - double cmax1_x = H->GetBinCenter(Ledge_bin); double cmax1 = H->GetBinContent(Ledge_bin); - double cmax2_x = H->GetBinCenter(Redge_bin); //double cmax2 = H->GetBinContent(Redge_bin); - - - double stretch_guess = fabs(cmax1_x - cmax2_x)/fabs(max1_x - max2_x); - cout << "stretch guess: "<SetParameters(stretch_guess, offset_guess, scale_guess); - -// fitfunc->SetParameters(1.1,0.0,1.0); - H->Fit(fitfunc); - double* P; P = fitfunc->GetParameters(); - double chi = fitfunc->GetChisquare()/57.0;//57 is number of bins minus number of fit parameters - fprintf(fout,"%d %f %f %f %f\n",pixel_code,P[0],P[1],P[2],chi); - rootF_fits->WriteTObject(H); - } - delete H; - } - } - } - fclose(fout); - rootF_fits->Close(); - - } - - cout << "DONE" << endl; - return 1; -} - -void FindEdgeBins(TH1D* H, int* L, int* R){ - - int i; - - H->SetAxisRange(-300.0,0.0); - double maxL = H->GetMaximum(); - for(i = 1; i <= H->GetNbinsX(); ++i){ - if( H->GetBinContent(i) >= (maxL/3.0) ) break; - } - *L = i; - - H->SetAxisRange(0.0,+300.0); - double maxR = H->GetMaximum(); - for(i = H->GetNbinsX(); i > 0; --i){ - if( H->GetBinContent(i) >= (maxR/3.0) ) break; - } - *R = i; - - H->SetAxisRange(-300.0,+300.0); - - return; - -} - -double ctd_template_fit_function(double* v, double* par){ - - double stretch = par[0]; - double offset = par[1]; - double scale = par[2]; - double x = v[0]; - TH1D* H = Gctd; //Gctd is current global ctd template - - //apply inverse stretch/offset to find the x value with respect to the original histogram bins - double x_0 = (x - offset)/stretch; - - //now find the two bin centers that bracket x - int bin1 = H->FindBin(x_0); - double x1 = H->GetBinCenter(bin1); - double y1 = H->GetBinContent(bin1); - int bin2; - if( x_0 <= x1 ) bin2 = bin1 - 1; else bin2 = bin1 + 1; - double x2 = H->GetBinCenter(bin2); - double y2 = H->GetBinContent(bin2); - - //transform x1 and x2 - x1 = x1*stretch + offset; x2 = x2*stretch + offset; - //transform y1 and y2 - y1 = y1*scale; y2 = y2*scale; - - //find slope and intercept of line connecting (x1,y1) and (x2,y2) - double m = (y2-y1)/(x2-x1); - double b = y1 - m*x1; - - return m*x + b; - -} - -std::map* MakeDepthSplines(MString fname, bool invert){ - //when invert flag is set to true, the splines returned are CTD->Depth - std::map* SplineMap = new std::map(); - MFile F; F.Open(fname); - vector xvec, yvec; - MString line; - int DetID, NewDetID; - while( F.IsGood() ){ - F.ReadLine(line); - if( line.Length() != 0 ){ - if( line.BeginsWith("#") ){ - vector tokens = line.Tokenize(" "); - NewDetID = tokens[1].ToInt(); - if( xvec.size() > 1 ){ - double *x, *y; - if( invert ){ - //CTD->Depth - x = &xvec[0]; y = &yvec[0]; - } else { - //Depth->CTD - x = &yvec[0]; y = &xvec[0]; - } - (*SplineMap)[DetID] = new TSpline3("",x,y,xvec.size()); - xvec.clear(); yvec.clear(); - } - DetID = NewDetID; - } else { - vector tokens = line.Tokenize(" "); - xvec.push_back(tokens[0].ToDouble()); yvec.push_back(tokens[1].ToDouble()); - } - } - } - return SplineMap; -} - - -bool GetDepthSplines(MString fname, std::map& SplineMap, bool invert){ - //when invert flag is set to true, the splines returned are CTD->Depth - MFile F; F.Open(fname); - vector xvec, yvec; - MString line; - int DetID, NewDetID; - while( F.ReadLine(line) ){ - if( line.Length() != 0 ){ - if( line.BeginsWith("#") ){ - vector tokens = line.Tokenize(" "); - NewDetID = tokens[1].ToInt(); - if( xvec.size() > 0 ) AddSpline(xvec, yvec, SplineMap, DetID); - DetID = NewDetID; - } else { - vector tokens = line.Tokenize(" "); - xvec.push_back(tokens[0].ToDouble()); yvec.push_back(tokens[1].ToDouble()); - } - } - } - //make last spline - if( xvec.size() > 0 ) AddSpline(xvec, yvec, SplineMap, DetID); - return true; -} - -void AddSpline(vector& xvec, vector& yvec, map& SplineMap, int DetID){ - //add one more point to the start and end, corresponding to the detector edges so that the spline covers the - //entire detector. just use a linear interpolation to get the edge values. - - //first extrapolate the lower side - double dx, dy, m, b, newx, newy; - dx = xvec[1] - xvec[0]; - dy = yvec[1] - yvec[0]; - m = dy / dx; - b = yvec[0] - m*xvec[0]; - newx = xvec[0] - (dx/2.0); - newy = m*newx + b; - // xvec.push_front(newx); yvec.push_front(newy); - xvec.insert(xvec.begin(), newx); yvec.insert(yvec.begin(), newy); - - //next extrapolate the upper side - size_t N = xvec.size(); - dx = xvec[N-1] - xvec[N-2]; - dy = yvec[N-1] - yvec[N-2]; - m = dy / dx; - b = yvec[N-1] - m*xvec[N-1]; - newx = xvec[N-1] + (dx/2.0); - newy = m*newx + b; - xvec.push_back(newx); yvec.push_back(newy); - - double* x = &xvec[0]; double* y = &yvec[0]; - SplineMap[DetID] = new TSpline3("",x,y,xvec.size()); - xvec.clear(); yvec.clear(); - return; -} - -bool EnergyFilter(double Energy){ - - double continuum_low = 200.0; - double continuum_high = 477.0; - double photopeak_low = 650.0; - double photopeak_high = 670.0; - - if( (Energy >= continuum_low) && (Energy <= continuum_high) ){ - return true; - } else if( (Energy >= photopeak_low) && (Energy <= photopeak_high) ){ - return true; - } else { - return false; - - } -} - - - -MReadOutAssembly* RealizeSimEvent(MSimEvent* simEvent, MModuleEnergyCalibrationUniversal* Calibrator){ - - MReadOutAssembly* Event = new MReadOutAssembly(); - - for( unsigned int i = 0; i < simEvent->GetNHTs(); ++i ){ - - MSimHT* HT = simEvent->GetHTAt(i); - MDVolumeSequence* VS = HT->GetVolumeSequence(); - MDDetector* Detector = VS->GetDetector(); - MString DetectorName = Detector->GetName(); - DetectorName.RemoveAllInPlace("Detector"); - int DetectorID = DetectorName.ToInt(); - - MDEEStripHit pSide; - MDEEStripHit nSide; - - pSide.m_ROE.IsLowVoltageStrip(true); - nSide.m_ROE.IsLowVoltageStrip(false); - - // Convert detector name in detector ID - pSide.m_ROE.SetDetectorID(DetectorID); - nSide.m_ROE.SetDetectorID(DetectorID); - - // Convert position into - MVector PositionInDetector = VS->GetPositionInSensitiveVolume(); - MDGridPoint GP = Detector->GetGridPoint(PositionInDetector); - double Depth = PositionInDetector.GetZ(); - //carolyn says -0.75 is the high voltage side - //i need to map this so that +1.5 is the high voltage side, WRT to charge transport stuff - Depth = -(Depth - DetectorThicknesses[DetectorID]/2.0); - - // Not sure about if p or n-side is up, but we can debug this later - pSide.m_ROE.SetStripID(GP.GetXGrid()+1); - nSide.m_ROE.SetStripID(GP.GetYGrid()+1); - int xID = pSide.m_ROE.GetStripID(); - int yID = nSide.m_ROE.GetStripID(); - - pSide.m_Energy = HT->GetEnergy(); - nSide.m_Energy = HT->GetEnergy(); - double HTEnergy = HT->GetEnergy(); - - // pSide.m_Position = PositionInDetector; - // nSide.m_Position = PositionInDetector; - - //at this point we have enough info to generate the strip hits - MStripHit_s* XStrip = new MStripHit_s(); - MStripHit_s* YStrip = new MStripHit_s(); - XStrip->SetDetectorID(DetectorID); YStrip->SetDetectorID(DetectorID); - XStrip->SetTiming(0.0); YStrip->SetTiming(0.0); - XStrip->IsLowVoltageStrip(true); YStrip->IsLowVoltageStrip(false); - XStrip->SetStripID(xID); YStrip->SetStripID(yID); - XStrip->SetEnergy(HTEnergy); YStrip->SetEnergy(HTEnergy); - double XEnRes = Calibrator->LookupEnergyResolution( XStrip, HTEnergy ); XStrip->SetEnergyResolution(XEnRes); - double YEnRes = Calibrator->LookupEnergyResolution( YStrip, HTEnergy ); YStrip->SetEnergyResolution(YEnRes); - XStrip->SetDepth( Depth ); YStrip->SetDepth( Depth ); - Event->AddStripHit( (MStripHit*)XStrip ); Event->AddStripHit( (MStripHit*)YStrip ); - - } - - return Event; - -} - diff --git a/apps/depth_calibration2.cxx b/apps/depth_calibration2.cxx deleted file mode 100644 index 500e0b01..00000000 --- a/apps/depth_calibration2.cxx +++ /dev/null @@ -1,599 +0,0 @@ -//TODO -/* --redefine measured CTD histos so that bins are centered on 10' of nanoseconds --define photopeak criteria... use energy resolutions for the strips, and say +/- 2.35 sigma - - */ - - -// Standard -#include -#include -#include -#include -#include -#include -#include -using namespace std; - -// ROOT -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -// MEGAlib -#include "MGlobal.h" -#include "MFile.h" -#include "MReadOutElementDoubleStrip.h" -#include "MFileReadOuts.h" -#include "MReadOutAssembly.h" -#include "MStripHit.h" -#include "MReadOutSequence.h" -#include "MSupervisor.h" -#include "MModuleLoaderMeasurementsROA.h" -#include "MModuleEnergyCalibrationUniversal.h" -#include "MModuleStripPairingGreedy.h" -#include "MAssembly.h" -#include "MFileEventsSim.h" -#include "MDGeometryQuest.h" -#include "MDepthCalibrator.h" -#include "MModuleLoaderMeasurementsBinary.h" -#include "MBinaryFlightDataParser.h" - -class MDEEStripHit -{ - public: - //! The read-out element - MReadOutElementDoubleStrip m_ROE; - //! The ADC value - double m_ADC; - //! The timing value; - double m_Timing; - - //! The simulated position - MVector m_Position; - //! The simulated energy deposit - double m_Energy; - - //! True if this is a guard ring - bool m_IsGuardRing; - - //! A list of original strip hits making up this strip hit - vector m_SubStripHits; -}; - -class MStripHit_s : public MStripHit -{ - //use this derived class instead of MStripHit so that we can keep track of the depth - //from the simulation data - - public: - void SetDepth(double Depth){ m_Depth = Depth; } - double GetDepth(void){ return m_Depth; } - protected: - double m_Depth; -}; - - -bool GetDepthSplines(MString fname, std::map& SplineMap, bool invert = false); -void AddSpline(vector& xvec, vector& yvec, map& SplineMap, int DetID); -const double DetectorThicknesses[12] = {1.49, 1.45, 1.50, 1.51, 1.50, 1.47, 1.48, 1.47, 1.49, 1.47, 1.42, 1.45}; -bool EnergyFilter(double Energy); -MReadOutAssembly* RealizeSimEvent(MSimEvent* simEvent, MModuleEnergyCalibrationUniversal* Calibrator); -double ctd_template_fit_function(double* v, double* par); -void FindEdgeBins(TH1D* H, int* L, int* R); - -TH1D* Gctd; //used by root fit function - -int main(int argc, char** argv) -{ - - int Level = 7; - if( argc < 5 ){ - cout << "need four arguments, first is raw data filename, second is sim filename, third is geometry file, fourth is Depth->CTD curves" << endl; - return -1; - } else if( argc == 6 ){ - sscanf(argv[5],"%d",&Level); - if( Level & 0x1 ) cout << "Level -> read in real data" << endl; - if( Level & 0x2 ) cout << "Level -> read in sim data" << endl; - if( Level & 0x4 ) cout << "Level -> perform fits" << endl; - } else if( argc == 5 ){ - if( Level & 0x1 ) cout << "Level -> read in real data" << endl; - if( Level & 0x2 ) cout << "Level -> read in sim data" << endl; - if( Level & 0x4 ) cout << "Level -> perform fits" << endl; - } else { - cout << "too many args, exiting..." << endl; - return -1; - } - - MGlobal::Initialize("Standalone",""); - TApplication dcal("dcal",0,0); - MString RawFile( argv[1] ); - MString SimFile( argv[2] ); - MString GeoFile( argv[3] ); - //MString DepthToCTDFile( argv[4] ); - //std::map DepthToCTD; - /* - if( !GetDepthSplines( DepthToCTDFile, DepthToCTD, false ) ){ - cout << "failed to load splines, exiting..." << endl; - return -1; - } else { - TFile* rootF = new TFile("splines.root","recreate"); - TMultiGraph* mg = new TMultiGraph(); - for(auto const &it: DepthToCTD){ - int det = it.first; - TSpline3* sp = it.second; - double thickness = DetectorThicknesses[det]; - unsigned int N = 1000; - double dx = thickness/((double) (N-1)); - vector X; vector Y; - for(unsigned int i = 0; i < N; ++i){ - X.push_back(i*dx); - Y.push_back(sp->Eval(i*dx)); - } - TGraph* gr = new TGraph(N,(double *) &X[0],(double *) &Y[0]); - rootF->WriteTObject(gr); - rootF->WriteTObject(sp); - mg->Add(gr); - } - rootF->WriteTObject(mg); - rootF->Close(); - } - */ - TRandom3 RNG(0); - - // Load geometry: - MDGeometryQuest* Geometry = new MDGeometryQuest(); - if (Geometry->ScanSetupFile(GeoFile) == true) { - Geometry->ActivateNoising(false); - Geometry->SetGlobalFailureRate(0.0); - cout<<"Geometry "<GetName()<<" loaded!"<GetName()<<" - Aborting!"<LoadSplinesFile(MString(argv[4])) == false){ - cout << "failed to load splines file, exiting..." << endl; - return false; - } - - //MModuleLoaderMeasurementsROA* Loader = new MModuleLoaderMeasurementsROA(); - //Loader->SetFileName(RawFile); - - MModuleLoaderMeasurementsBinary* Loader = new MModuleLoaderMeasurementsBinary(); - Loader->SetFileName(RawFile); - Loader->SetDataSelectionMode(MBinaryFlightDataParserDataModes::c_Raw); - Loader->SetAspectMode(MBinaryFlightDataParserAspectModes::c_Neither); - Loader->EnableCoincidenceMerging(false); - - MModuleEnergyCalibrationUniversal* Calibrator = new MModuleEnergyCalibrationUniversal(); - Calibrator->SetFileName("$(NUCLEARIZER)/resource/calibration/COSI16/Berkeley/EnergyCalibration.ecal"); - - MModuleStripPairingGreedy* Pairing = new MModuleStripPairingGreedy(); - - if (Loader->Initialize() == false) return false; - if (Calibrator->Initialize() == false) return false; - if (Pairing->Initialize() == false) return false; - - std::map Histograms; //map to store CTD histograms - unsigned int counter = 0; - - if( Level & 0x1 ){ //read in real data - - bool IsFinished = false; - MReadOutAssembly* Event = new MReadOutAssembly(); - while (IsFinished == false) { - Event->Clear(); - if( Loader->IsReady() ){ - // - Loader->AnalyzeEvent(Event); - Calibrator->AnalyzeEvent(Event); - Pairing->AnalyzeEvent(Event); - - unsigned int NHits = Event->GetNHits(); - for(unsigned int i = 0; i < NHits; i++){ - MHit* H = Event->GetHit(i); - unsigned int NStripHits = H->GetNStripHits(); - if( NStripHits == 2 ){ //using 2-strip events only - bool EnergyGood = EnergyFilter(H->GetEnergy()); - if( EnergyGood ){ - - int pixel_code; - double timing; - MStripHit *SHx, *SHy; - - if( H->GetStripHit(0)->IsLowVoltageStrip() && !H->GetStripHit(1)->IsLowVoltageStrip() ){ - SHx = H->GetStripHit(0); SHy = H->GetStripHit(1); - } else if( H->GetStripHit(1)->IsLowVoltageStrip() && !H->GetStripHit(0)->IsLowVoltageStrip() ){ - SHx = H->GetStripHit(1); SHy = H->GetStripHit(0); - } else { - //we didn't have 1 x and 1 y strip, log this and continue... - continue; - } - - int DetID = SHx->GetDetectorID(); - - pixel_code = 10000*DetID + 100*SHx->GetStripID() + SHy->GetStripID(); - if( (SHx->GetTiming() < 1E-6) || (SHy->GetTiming() < 1E-6) ){ - // cout << "bad timing" << endl; - continue; - } - // timing = (SHx->GetTiming() - SHy->GetTiming())*10.0 + 5.0; //add five for bin centering - timing = ((SHx->GetTiming() - SHy->GetTiming())); //add five for bin centering - - //check if we have a TH1D for this pixel yet - if( Histograms[pixel_code] == NULL ){ - char name[64]; sprintf(name,"%d",pixel_code); - //TH1D* new_hist = new TH1D(name, name, 60, -300.0, +300.0); - TH1D* new_hist = new TH1D(name,name,120,(-300.0)-2.5,(+300.0)-2.5); - Histograms[pixel_code] = new_hist; - } - - Histograms[pixel_code]->Fill(timing); - - } - } - } - - ++counter; - if( (counter & 0xffff) == 0 ) cout << "num raw events: " << counter << endl; - } - IsFinished = Loader->IsFinished(); - } - - //when done, overwrite the histograms in the root file - //check if subdir exists, if not, then create it - //mkdir will return 0 if it already exists - TFile* rootF = new TFile("data_ctd.root","recreate"); - for(auto const &it: Histograms){ - TH1D* hist = it.second; - rootF->WriteTObject(hist); - //clear the TH1D from memory... leave it for now for debugging but later - //we might end up using lots of memeory - } - rootF->Close(); - - } - - std::map simHistograms; - - if( Level & 0x2 ){ //read in simulation data - - MFileEventsSim* Reader = new MFileEventsSim(Geometry); - if (Reader->Open(SimFile) == false) { - cout<<"Unable to open sim file "< DepthHistograms; - for(int i = 0; i < 12; ++i){ - char name[16]; sprintf(name,"depth_%d",i); - TH1D* H = new TH1D(name,name,100,0,1.6); - DepthHistograms.push_back(H); - } - while ((simEvent = Reader->GetNextEvent()) != 0) { - - //Reader->GetNextEvent() will print out some info about hits not being in sensitive volumes... this method will automatically exclude the weird HTs so that the code that follows - //doesn't have to deal with it. these HTs come from hits that are at the sensitive Ge / Ge corner boundary. - - //need to make an MReadoutAssembly out of the simEvent - //the simEvent has simHTs which contain - - MReadOutAssembly* Event = RealizeSimEvent(simEvent, Calibrator); - //cout << "@@@@ : " << simEvent->GetNHTs() << " : " << Event->GetNStripHits() << endl; - //we DO have strip hits at this point - Pairing->AnalyzeEvent(Event); - - for( unsigned int i = 0; i < Event->GetNHits(); ++i ){ - MHit* H = Event->GetHit(i); - if( (H->GetNStripHits() != 2) || (EnergyFilter(H->GetEnergy()) == false) ) continue; else { - - MStripHit_s *SHx, *SHy; - - if( H->GetStripHit(0)->IsLowVoltageStrip() && !H->GetStripHit(1)->IsLowVoltageStrip() ){ - SHx = dynamic_cast(H->GetStripHit(0)); SHy = dynamic_cast(H->GetStripHit(1)); - } else if( H->GetStripHit(1)->IsLowVoltageStrip() && !H->GetStripHit(0)->IsLowVoltageStrip() ){ - SHx = dynamic_cast(H->GetStripHit(1)); SHy = dynamic_cast(H->GetStripHit(0)); - } else { - //we didn't have 1 x and 1 y strip, log this and continue... - continue; - } - - //check that the depths agree - double Depth; - if( fabs(SHx->GetDepth() - SHy->GetDepth()) > 1.0E-6 ){ - cout << "depths don't agree!" << endl; - continue; - } else { - Depth = SHx->GetDepth(); - } - - int DetID = SHx->GetDetectorID(); - //int pixel_code = 10000*DetID + 100*SHx->GetStripID() + SHy->GetStripID(); - DepthHistograms[DetID]->Fill(Depth); - - //double Timing = DepthToCTD[DetID]->Eval(Depth); - double Timing = m_DepthCalibrator->GetSpline(DetID,true)->Eval(Depth); - double Noise = RNG.Gaus(0,12.5/2.3548); - TH1D* hist = simHistograms[DetID]; - if( hist == NULL ){ - char name[64]; sprintf(name,"%d",DetID); - hist = new TH1D(name, name, 8*60, -300.0, +300.0); - simHistograms[DetID] = hist; - } - hist->Fill(Timing+Noise); - } - } - - ++counter; - if( (counter & 0xffff) == 0 ) cout << "num sim events: " << counter << endl; - delete simEvent; - delete Event; - - } - - //write simulated CTD templates to root file - TFile* rootF = new TFile("sim_ctd.root","recreate"); - for(auto const &it: simHistograms){ - TH1D* hist = it.second; - rootF->WriteTObject(hist); - } - for(int i = 0; i < 12; ++i){ - rootF->WriteTObject(DepthHistograms[i]); - } - rootF->Close(); - - } - - if( Level & 0x4 ){ - //perform the fits - - //loop over pixel codes in order and try to read the pixel data from the root file - //first check if the root file exists - - TFile* rootF_mctd = new TFile("data_ctd.root","READ"); - TFile* rootF_sctd = new TFile("sim_ctd.root","READ"); - - if( rootF_mctd == NULL ){ - cout << "couldn't open measured CTD root file, exiting..." << endl; - return -1; - } - - if( rootF_sctd == NULL ){ - cout << "couldn't open sim CTD root file, exiting..." << endl; - return -1; - } - - FILE* fout = fopen("coeffs.txt","w"); - fprintf(fout,"#format is 1) pixel code (10000*det + 100*Xchannel + Ychannel) 2) stretch 3) offset 4) scale 5) chi2 reduced\n"); - TFile* rootF_fits = new TFile("fits.root","recreate"); - - for( unsigned int D = 0; D < 12; ++D ){ - char det_name[8]; sprintf(det_name,"%d",D); - TH1D* ctd_template = (TH1D*)rootF_sctd->Get(det_name); - if(ctd_template == NULL){ - cout << "could not read CTD template for detector " << D << ", skipping this detector..." << endl; - continue; - } else { - Gctd = ctd_template; //set this globally so that the root fit function can see it - } - TF1* fitfunc = new TF1("ctd_fitfunc",ctd_template_fit_function,-300.0,+300.0,3); - fitfunc->SetParameters(1.0, 0.0, 1.0); // first param is stretch, second is offset, third is scale - fitfunc->SetParNames("stretch","offset","scale"); - - //find maxima of CTD edges - /* - ctd_template->SetAxisRange(-300.0,0.0); - double max1 = ctd_template->GetMaximum(); - double max1_bin = ctd_template->GetMaximumBin(); - double max1_x = ctd_template->GetBinCenter(max1_bin); - - ctd_template->SetAxisRange(0.0,300.0); - double max2 = ctd_template->GetMaximum(); - double max2_bin = ctd_template->GetMaximumBin(); - double max2_x = ctd_template->GetBinCenter(max2_bin); - - ctd_template->SetAxisRange(-300.0,300.0); - */ - - int Ledge_bin, Redge_bin; FindEdgeBins(ctd_template, &Ledge_bin, &Redge_bin); - double max1_x = ctd_template->GetBinCenter(Ledge_bin); double max1 = ctd_template->GetBinContent(Ledge_bin); - double max2_x = ctd_template->GetBinCenter(Redge_bin); //double max2 = ctd_template->GetBinContent(Redge_bin); - - for( unsigned int Xch = 1; Xch <= 37; ++Xch ){ - for( unsigned int Ych = 1; Ych <= 37; ++Ych ){ - int pixel_code = 10000*D + 100*Xch + Ych; - char pixel_code_s[32]; sprintf(pixel_code_s,"%d",pixel_code); - TH1D* H = (TH1D*)rootF_mctd->Get(pixel_code_s); - if( H == NULL ) continue; else { - if( H->GetEntries() < 200 ) continue; //histogram has too few counts - cout << "found pixel:" << pixel_code << ", starting fit..." << endl; - //idea, use best fit from last pixel as starting values here since these parameters vary spacially (especially stretch factor), assuming chi2 is good enough - //MIGHT NEED TO CALL SET PARAMETERS AGAIN HERE -// if( !UseLast ) fitfunc->SetParameters(1.0, 0.0, 1.0); - - FindEdgeBins(H, &Ledge_bin, &Redge_bin); - double cmax1_x = H->GetBinCenter(Ledge_bin); double cmax1 = H->GetBinContent(Ledge_bin); - double cmax2_x = H->GetBinCenter(Redge_bin); //double cmax2 = H->GetBinContent(Redge_bin); - - - double stretch_guess = fabs(cmax1_x - cmax2_x)/fabs(max1_x - max2_x); - cout << "stretch guess: "<SetParameters(stretch_guess, offset_guess, scale_guess); - -// fitfunc->SetParameters(1.1,0.0,1.0); - H->Fit(fitfunc); - double* P; P = fitfunc->GetParameters(); -// double chi = fitfunc->GetChisquare()/57.0;//57 is number of bins minus number of fit parameters - double chi = fitfunc->GetChisquare()/(H->GetNbinsX()-3.0); - fprintf(fout,"%d %f %f %f %f\n",pixel_code,P[0],P[1],P[2],chi); - rootF_fits->WriteTObject(H); - } - delete H; - } - } - } - fclose(fout); - rootF_fits->Close(); - - } - - cout << "DONE" << endl; - return 1; -} - -void FindEdgeBins(TH1D* H, int* L, int* R){ - - int i; - - H->SetAxisRange(-300.0,0.0); - double maxL = H->GetMaximum(); - for(i = 1; i <= H->GetNbinsX(); ++i){ - if( H->GetBinContent(i) >= (maxL/3.0) ) break; - } - *L = i; - - H->SetAxisRange(0.0,+300.0); - double maxR = H->GetMaximum(); - for(i = H->GetNbinsX(); i > 0; --i){ - if( H->GetBinContent(i) >= (maxR/3.0) ) break; - } - *R = i; - - H->SetAxisRange(-300.0,+300.0); - - return; - -} - -double ctd_template_fit_function(double* v, double* par){ - - double stretch = par[0]; - double offset = par[1]; - double scale = par[2]; - double x = v[0]; - TH1D* H = Gctd; //Gctd is current global ctd template - - //apply inverse stretch/offset to find the x value with respect to the original histogram bins - double x_0 = (x - offset)/stretch; - - //now find the two bin centers that bracket x - int bin1 = H->FindBin(x_0); - double x1 = H->GetBinCenter(bin1); - double y1 = H->GetBinContent(bin1); - int bin2; - if( x_0 <= x1 ) bin2 = bin1 - 1; else bin2 = bin1 + 1; - double x2 = H->GetBinCenter(bin2); - double y2 = H->GetBinContent(bin2); - - //transform x1 and x2 - x1 = x1*stretch + offset; x2 = x2*stretch + offset; - //transform y1 and y2 - y1 = y1*scale; y2 = y2*scale; - - //find slope and intercept of line connecting (x1,y1) and (x2,y2) - double m = (y2-y1)/(x2-x1); - double b = y1 - m*x1; - - return m*x + b; - -} - -bool EnergyFilter(double Energy){ - - double continuum_low = 200.0; - double continuum_high = 477.0; - double photopeak_low = 650.0; - double photopeak_high = 670.0; - - if( (Energy >= continuum_low) && (Energy <= continuum_high) ){ - return true; - } else if( (Energy >= photopeak_low) && (Energy <= photopeak_high) ){ - return true; - } else { - return false; - - } -} - -MReadOutAssembly* RealizeSimEvent(MSimEvent* simEvent, MModuleEnergyCalibrationUniversal* Calibrator){ - - MReadOutAssembly* Event = new MReadOutAssembly(); - - for( unsigned int i = 0; i < simEvent->GetNHTs(); ++i ){ - - MSimHT* HT = simEvent->GetHTAt(i); - MDVolumeSequence* VS = HT->GetVolumeSequence(); - MDDetector* Detector = VS->GetDetector(); - MString DetectorName = Detector->GetName(); - DetectorName.RemoveAllInPlace("Detector"); - int DetectorID = DetectorName.ToInt(); - - MDEEStripHit pSide; - MDEEStripHit nSide; - - pSide.m_ROE.IsLowVoltageStrip(true); - nSide.m_ROE.IsLowVoltageStrip(false); - - // Convert detector name in detector ID - pSide.m_ROE.SetDetectorID(DetectorID); - nSide.m_ROE.SetDetectorID(DetectorID); - - // Convert position into - MVector PositionInDetector = VS->GetPositionInSensitiveVolume(); - MDGridPoint GP = Detector->GetGridPoint(PositionInDetector); - double Depth = PositionInDetector.GetZ(); - //carolyn says -0.75 is the high voltage side - //i need to map this so that +1.5 is the high voltage side, WRT to charge transport stuff - Depth = -(Depth - DetectorThicknesses[DetectorID]/2.0); - - // Not sure about if p or n-side is up, but we can debug this later - pSide.m_ROE.SetStripID(GP.GetXGrid()+1); - nSide.m_ROE.SetStripID(GP.GetYGrid()+1); - int xID = pSide.m_ROE.GetStripID(); - int yID = nSide.m_ROE.GetStripID(); - - pSide.m_Energy = HT->GetEnergy(); - nSide.m_Energy = HT->GetEnergy(); - double HTEnergy = HT->GetEnergy(); - - // pSide.m_Position = PositionInDetector; - // nSide.m_Position = PositionInDetector; - - //at this point we have enough info to generate the strip hits - MStripHit_s* XStrip = new MStripHit_s(); - MStripHit_s* YStrip = new MStripHit_s(); - XStrip->SetDetectorID(DetectorID); YStrip->SetDetectorID(DetectorID); - XStrip->SetTiming(0.0); YStrip->SetTiming(0.0); - XStrip->IsLowVoltageStrip(true); YStrip->IsLowVoltageStrip(false); - XStrip->SetStripID(xID); YStrip->SetStripID(yID); - XStrip->SetEnergy(HTEnergy); YStrip->SetEnergy(HTEnergy); - double XEnRes = Calibrator->LookupEnergyResolution( XStrip, HTEnergy ); XStrip->SetEnergyResolution(XEnRes); - double YEnRes = Calibrator->LookupEnergyResolution( YStrip, HTEnergy ); YStrip->SetEnergyResolution(YEnRes); - XStrip->SetDepth( Depth ); YStrip->SetDepth( Depth ); - Event->AddStripHit( (MStripHit*)XStrip ); Event->AddStripHit( (MStripHit*)YStrip ); - - } - - return Event; - -} - diff --git a/apps/depth_calibration_cosi2016.cxx b/apps/depth_calibration_cosi2016.cxx deleted file mode 100644 index 4291da26..00000000 --- a/apps/depth_calibration_cosi2016.cxx +++ /dev/null @@ -1,624 +0,0 @@ -//TODO -/* --redefine measured CTD histos so that bins are centered on 10' of nanoseconds --define photopeak criteria... use energy resolutions for the strips, and say +/- 2.35 sigma - - */ - - -// Standard -#include -#include -#include -#include -#include -#include -#include -using namespace std; - -// ROOT -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -// MEGAlib -#include "MGlobal.h" -#include "MFile.h" -#include "MReadOutElementDoubleStrip.h" -#include "MFileReadOuts.h" -#include "MReadOutAssembly.h" -#include "MStripHit.h" -#include "MReadOutSequence.h" -#include "MSupervisor.h" -#include "MModuleLoaderMeasurementsROA.h" -#include "MModuleEnergyCalibrationUniversal.h" -#include "MModuleStripPairingGreedy.h" -#include "MAssembly.h" -#include "MFileEventsSim.h" -#include "MDGeometryQuest.h" -#include "MDepthCalibrator.h" -#include "MModuleLoaderMeasurementsBinary.h" -#include "MBinaryFlightDataParser.h" - -class MDEEStripHit -{ - public: - //! The read-out element - MReadOutElementDoubleStrip m_ROE; - //! The ADC value - double m_ADC; - //! The timing value; - double m_Timing; - - //! The simulated position - MVector m_Position; - //! The simulated energy deposit - double m_Energy; - - //! True if this is a guard ring - bool m_IsGuardRing; - - //! A list of original strip hits making up this strip hit - vector m_SubStripHits; -}; - -class MStripHit_s : public MStripHit -{ - //use this derived class instead of MStripHit so that we can keep track of the depth - //from the simulation data - - public: - void SetDepth(double Depth){ m_Depth = Depth; } - double GetDepth(void){ return m_Depth; } - protected: - double m_Depth; -}; - - -bool GetDepthSplines(MString fname, std::map& SplineMap, bool invert = false); -void AddSpline(vector& xvec, vector& yvec, map& SplineMap, int DetID); -double DetectorThicknesses[12]; -bool EnergyFilter(double Energy); -MReadOutAssembly* RealizeSimEvent(MSimEvent* simEvent, MModuleEnergyCalibrationUniversal* Calibrator); -double ctd_template_fit_function(double* v, double* par); -void FindEdgeBins(TH1D* H, int* L, int* R); - -TH1D* Gctd; //used by root fit function - -int main(int argc, char** argv) -{ - - int Level = 7; - if( argc < 5 ){ - cout << "need four arguments, first is raw data filename, second is sim filename, third is geometry file, fourth is Depth->CTD curves" << endl; - return -1; - } else if( argc == 6 ){ - sscanf(argv[5],"%d",&Level); - if( Level & 0x1 ) cout << "Level -> read in real data" << endl; - if( Level & 0x2 ) cout << "Level -> read in sim data" << endl; - if( Level & 0x4 ) cout << "Level -> perform fits" << endl; - } else if( argc == 5 ){ - if( Level & 0x1 ) cout << "Level -> read in real data" << endl; - if( Level & 0x2 ) cout << "Level -> read in sim data" << endl; - if( Level & 0x4 ) cout << "Level -> perform fits" << endl; - } else { - cout << "too many args, exiting..." << endl; - return -1; - } - - MGlobal::Initialize("Standalone",""); - TApplication dcal("dcal",0,0); - MString RawFile( argv[1] ); - MString SimFile( argv[2] ); - MString GeoFile( argv[3] ); - //MString DepthToCTDFile( argv[4] ); - //std::map DepthToCTD; - /* - if( !GetDepthSplines( DepthToCTDFile, DepthToCTD, false ) ){ - cout << "failed to load splines, exiting..." << endl; - return -1; - } else { - TFile* rootF = new TFile("splines.root","recreate"); - TMultiGraph* mg = new TMultiGraph(); - for(auto const &it: DepthToCTD){ - int det = it.first; - TSpline3* sp = it.second; - double thickness = DetectorThicknesses[det]; - unsigned int N = 1000; - double dx = thickness/((double) (N-1)); - vector X; vector Y; - for(unsigned int i = 0; i < N; ++i){ - X.push_back(i*dx); - Y.push_back(sp->Eval(i*dx)); - } - TGraph* gr = new TGraph(N,(double *) &X[0],(double *) &Y[0]); - rootF->WriteTObject(gr); - rootF->WriteTObject(sp); - mg->Add(gr); - } - rootF->WriteTObject(mg); - rootF->Close(); - } - */ - TRandom3 RNG(0); - - // Load geometry: - MDGeometryQuest* Geometry = new MDGeometryQuest(); - if (Geometry->ScanSetupFile(GeoFile) == true) { - Geometry->ActivateNoising(false); - Geometry->SetGlobalFailureRate(0.0); - for(int i = 0; i < 12; ++i){ - char name[32]; snprintf(name,sizeof name,"GeWafer_%d",i); - MDVolume* V = Geometry->MDGeometry::GetVolume(MString(name)); - if(V != 0){ - MString s = V->GetShape()->GetGeomega(); - vector Tokens = s.Tokenize(" "); - if((Tokens.size() == 4) && (s.BeginsWith("BRIK"))){ - DetectorThicknesses[i] = 2.0 * Tokens[3].ToDouble(); - cout << "Set detector " << i << " thickness to " << DetectorThicknesses[i] << " cm using geometry specification" << endl; - } else { - cout << "ERROR determining thickness for volume GeWafer_" << i << ", using default of 1.5 cm" << endl; - DetectorThicknesses[i] = 1.5; - } - } else { - cout << "ERROR could not find volume GeWafer_" << i << ", in gemoetry tree. Using default thickness of 1.5 cm" << endl; - DetectorThicknesses[i] = 1.5; - } - } - cout<<"Geometry "<GetName()<<" loaded!"<GetName()<<" - Aborting!"<LoadSplinesFile(MString(argv[4])) == false){ - cout << "failed to load splines file, exiting..." << endl; - return false; - } - - //MModuleLoaderMeasurementsROA* Loader = new MModuleLoaderMeasurementsROA(); - //Loader->SetFileName(RawFile); - - MModuleLoaderMeasurementsBinary* Loader = new MModuleLoaderMeasurementsBinary(); - Loader->SetFileName(RawFile); - Loader->SetDataSelectionMode(MBinaryFlightDataParserDataModes::c_Raw); - Loader->SetAspectMode(MBinaryFlightDataParserAspectModes::c_Neither); - Loader->EnableCoincidenceMerging(false); - - MModuleEnergyCalibrationUniversal* Calibrator = new MModuleEnergyCalibrationUniversal(); - Calibrator->SetFileName("$(NUCLEARIZER)/resource/calibration/COSI16/Berkeley/EnergyCalibration.ecal"); - - MModuleStripPairingGreedy* Pairing = new MModuleStripPairingGreedy(); - - if (Loader->Initialize() == false) return false; - if (Calibrator->Initialize() == false) return false; - if (Pairing->Initialize() == false) return false; - - std::map Histograms; //map to store CTD histograms - unsigned int counter = 0; - - if( Level & 0x1 ){ //read in real data - - bool IsFinished = false; - MReadOutAssembly* Event = new MReadOutAssembly(); - while (IsFinished == false) { - Event->Clear(); - if( Loader->IsReady() ){ - // - Loader->AnalyzeEvent(Event); - Calibrator->AnalyzeEvent(Event); - Pairing->AnalyzeEvent(Event); - - unsigned int NHits = Event->GetNHits(); - for(unsigned int i = 0; i < NHits; i++){ - MHit* H = Event->GetHit(i); - unsigned int NStripHits = H->GetNStripHits(); - if( NStripHits == 2 ){ //using 2-strip events only - bool EnergyGood = EnergyFilter(H->GetEnergy()); - if( EnergyGood ){ - - int pixel_code; - double timing; - MStripHit *SHx, *SHy; - - if( H->GetStripHit(0)->IsLowVoltageStrip() && !H->GetStripHit(1)->IsLowVoltageStrip() ){ - SHx = H->GetStripHit(0); SHy = H->GetStripHit(1); - } else if( H->GetStripHit(1)->IsLowVoltageStrip() && !H->GetStripHit(0)->IsLowVoltageStrip() ){ - SHx = H->GetStripHit(1); SHy = H->GetStripHit(0); - } else { - //we didn't have 1 x and 1 y strip, log this and continue... - continue; - } - - int DetID = SHx->GetDetectorID(); - - pixel_code = 10000*DetID + 100*SHx->GetStripID() + SHy->GetStripID(); - if( (SHx->GetTiming() < 1E-6) || (SHy->GetTiming() < 1E-6) ){ - // cout << "bad timing" << endl; - continue; - } - // timing = (SHx->GetTiming() - SHy->GetTiming())*10.0 + 5.0; //add five for bin centering - timing = ((SHx->GetTiming() - SHy->GetTiming())); //add five for bin centering - - //check if we have a TH1D for this pixel yet - if( Histograms[pixel_code] == NULL ){ - char name[64]; sprintf(name,"%d",pixel_code); - //TH1D* new_hist = new TH1D(name, name, 60, -300.0, +300.0); - TH1D* new_hist = new TH1D(name,name,120,-300.0,+300.0); - Histograms[pixel_code] = new_hist; - } - - Histograms[pixel_code]->Fill(timing); - - } - } - } - - ++counter; - if( (counter & 0xffff) == 0 ) cout << "num raw events: " << counter << endl; - } - IsFinished = Loader->IsFinished(); - } - - //when done, overwrite the histograms in the root file - //check if subdir exists, if not, then create it - //mkdir will return 0 if it already exists - TFile* rootF = new TFile("data_ctd.root","recreate"); - for(auto const &it: Histograms){ - TH1D* hist = it.second; - rootF->WriteTObject(hist); - //clear the TH1D from memory... leave it for now for debugging but later - //we might end up using lots of memeory - } - rootF->Close(); - - } - - std::map simHistograms; - - if( Level & 0x2 ){ //read in simulation data - - MFileEventsSim* Reader = new MFileEventsSim(Geometry); - if (Reader->Open(SimFile) == false) { - cout<<"Unable to open sim file "< DepthHistograms; - for(int i = 0; i < 12; ++i){ - char name[16]; sprintf(name,"depth_%d",i); - TH1D* H = new TH1D(name,name,1000,0.0,DetectorThicknesses[i]); - DepthHistograms.push_back(H); - } - while ((simEvent = Reader->GetNextEvent()) != 0) { - - //Reader->GetNextEvent() will print out some info about hits not being in sensitive volumes... this method will automatically exclude the weird HTs so that the code that follows - //doesn't have to deal with it. these HTs come from hits that are at the sensitive Ge / Ge corner boundary. - - //need to make an MReadoutAssembly out of the simEvent - //the simEvent has simHTs which contain - - MReadOutAssembly* Event = RealizeSimEvent(simEvent, Calibrator); - if( Event == NULL ){ - continue; - } - //cout << "@@@@ : " << simEvent->GetNHTs() << " : " << Event->GetNStripHits() << endl; - //we DO have strip hits at this point - Pairing->AnalyzeEvent(Event); - - for( unsigned int i = 0; i < Event->GetNHits(); ++i ){ - MHit* H = Event->GetHit(i); - if( (H->GetNStripHits() != 2) || (EnergyFilter(H->GetEnergy()) == false) ) continue; else { - - MStripHit_s *SHx, *SHy; - - if( H->GetStripHit(0)->IsLowVoltageStrip() && !H->GetStripHit(1)->IsLowVoltageStrip() ){ - SHx = dynamic_cast(H->GetStripHit(0)); SHy = dynamic_cast(H->GetStripHit(1)); - } else if( H->GetStripHit(1)->IsLowVoltageStrip() && !H->GetStripHit(0)->IsLowVoltageStrip() ){ - SHx = dynamic_cast(H->GetStripHit(1)); SHy = dynamic_cast(H->GetStripHit(0)); - } else { - //we didn't have 1 x and 1 y strip, log this and continue... - continue; - } - - //check that the depths agree - double Depth; - if( fabs(SHx->GetDepth() - SHy->GetDepth()) > 1.0E-6 ){ - cout << "depths don't agree!" << endl; - continue; - } else { - Depth = SHx->GetDepth(); - } - - int DetID = SHx->GetDetectorID(); - //int pixel_code = 10000*DetID + 100*SHx->GetStripID() + SHy->GetStripID(); - DepthHistograms[DetID]->Fill(Depth); - - //double Timing = DepthToCTD[DetID]->Eval(Depth); - double Timing = m_DepthCalibrator->GetSpline(DetID,true)->Eval(Depth); - double Noise = RNG.Gaus(0,12.5/2.3548); - TH1D* hist = simHistograms[DetID]; - if( hist == NULL ){ - char name[64]; sprintf(name,"%d",DetID); - hist = new TH1D(name, name, 8*60, -300.0, +300.0); - simHistograms[DetID] = hist; - } - hist->Fill(Timing+Noise); - } - } - - ++counter; - if( (counter & 0xffff) == 0 ) cout << "num sim events: " << counter << endl; - delete simEvent; - delete Event; - - } - - //write simulated CTD templates to root file - TFile* rootF = new TFile("sim_ctd.root","recreate"); - for(auto const &it: simHistograms){ - TH1D* hist = it.second; - rootF->WriteTObject(hist); - } - for(int i = 0; i < 12; ++i){ - rootF->WriteTObject(DepthHistograms[i]); - } - rootF->Close(); - - } - - if( Level & 0x4 ){ - //perform the fits - - //loop over pixel codes in order and try to read the pixel data from the root file - //first check if the root file exists - - TFile* rootF_mctd = new TFile("data_ctd.root","READ"); - TFile* rootF_sctd = new TFile("sim_ctd.root","READ"); - - if( rootF_mctd == NULL ){ - cout << "couldn't open measured CTD root file, exiting..." << endl; - return -1; - } - - if( rootF_sctd == NULL ){ - cout << "couldn't open sim CTD root file, exiting..." << endl; - return -1; - } - - FILE* fout = fopen("coeffs.txt","w"); - fprintf(fout,"#format is 1) pixel code (10000*det + 100*Xchannel + Ychannel) 2) stretch 3) offset 4) scale 5) chi2 reduced\n"); - TFile* rootF_fits = new TFile("fits.root","recreate"); - - for( unsigned int D = 0; D < 12; ++D ){ - char det_name[8]; sprintf(det_name,"%d",D); - TH1D* ctd_template = (TH1D*)rootF_sctd->Get(det_name); - if(ctd_template == NULL){ - cout << "could not read CTD template for detector " << D << ", skipping this detector..." << endl; - continue; - } else { - Gctd = ctd_template; //set this globally so that the root fit function can see it - } - TF1* fitfunc = new TF1("ctd_fitfunc",ctd_template_fit_function,-300.0,+300.0,3); - fitfunc->SetParameters(1.0, 0.0, 1.0); // first param is stretch, second is offset, third is scale - fitfunc->SetParNames("stretch","offset","scale"); - - //find maxima of CTD edges - /* - ctd_template->SetAxisRange(-300.0,0.0); - double max1 = ctd_template->GetMaximum(); - double max1_bin = ctd_template->GetMaximumBin(); - double max1_x = ctd_template->GetBinCenter(max1_bin); - - ctd_template->SetAxisRange(0.0,300.0); - double max2 = ctd_template->GetMaximum(); - double max2_bin = ctd_template->GetMaximumBin(); - double max2_x = ctd_template->GetBinCenter(max2_bin); - - ctd_template->SetAxisRange(-300.0,300.0); - */ - - int Ledge_bin, Redge_bin; FindEdgeBins(ctd_template, &Ledge_bin, &Redge_bin); - double max1_x = ctd_template->GetBinCenter(Ledge_bin); double max1 = ctd_template->GetBinContent(Ledge_bin); - double max2_x = ctd_template->GetBinCenter(Redge_bin); //double max2 = ctd_template->GetBinContent(Redge_bin); - - for( unsigned int Xch = 1; Xch <= 37; ++Xch ){ - for( unsigned int Ych = 1; Ych <= 37; ++Ych ){ - int pixel_code = 10000*D + 100*Xch + Ych; - char pixel_code_s[32]; sprintf(pixel_code_s,"%d",pixel_code); - TH1D* H = (TH1D*)rootF_mctd->Get(pixel_code_s); - if( H == NULL ) continue; else { - if( H->GetEntries() < 200 ) continue; //histogram has too few counts - cout << "found pixel:" << pixel_code << ", starting fit..." << endl; - //idea, use best fit from last pixel as starting values here since these parameters vary spacially (especially stretch factor), assuming chi2 is good enough - //MIGHT NEED TO CALL SET PARAMETERS AGAIN HERE -// if( !UseLast ) fitfunc->SetParameters(1.0, 0.0, 1.0); - - FindEdgeBins(H, &Ledge_bin, &Redge_bin); - double cmax1_x = H->GetBinCenter(Ledge_bin); double cmax1 = H->GetBinContent(Ledge_bin); - double cmax2_x = H->GetBinCenter(Redge_bin); //double cmax2 = H->GetBinContent(Redge_bin); - - - double stretch_guess = fabs(cmax1_x - cmax2_x)/fabs(max1_x - max2_x); - cout << "stretch guess: "<SetParameters(stretch_guess, offset_guess, scale_guess); - -// fitfunc->SetParameters(1.1,0.0,1.0); - H->Fit(fitfunc); - double* P; P = fitfunc->GetParameters(); -// double chi = fitfunc->GetChisquare()/57.0;//57 is number of bins minus number of fit parameters - double chi = fitfunc->GetChisquare()/(H->GetNbinsX()-3.0); - fprintf(fout,"%d %f %f %f %f\n",pixel_code,P[0],P[1],P[2],chi); - rootF_fits->WriteTObject(H); - } - delete H; - } - } - } - fclose(fout); - rootF_fits->Close(); - - } - - cout << "DONE" << endl; - return 1; -} - -void FindEdgeBins(TH1D* H, int* L, int* R){ - - int i; - - H->SetAxisRange(-300.0,0.0); - double maxL = H->GetMaximum(); - for(i = 1; i <= H->GetNbinsX(); ++i){ - if( H->GetBinContent(i) >= (maxL/3.0) ) break; - } - *L = i; - - H->SetAxisRange(0.0,+300.0); - double maxR = H->GetMaximum(); - for(i = H->GetNbinsX(); i > 0; --i){ - if( H->GetBinContent(i) >= (maxR/3.0) ) break; - } - *R = i; - - H->SetAxisRange(-300.0,+300.0); - - return; - -} - -double ctd_template_fit_function(double* v, double* par){ - - double stretch = par[0]; - double offset = par[1]; - double scale = par[2]; - double x = v[0]; - TH1D* H = Gctd; //Gctd is current global ctd template - - //apply inverse stretch/offset to find the x value with respect to the original histogram bins - double x_0 = (x - offset)/stretch; - - //now find the two bin centers that bracket x - int bin1 = H->FindBin(x_0); - double x1 = H->GetBinCenter(bin1); - double y1 = H->GetBinContent(bin1); - int bin2; - if( x_0 <= x1 ) bin2 = bin1 - 1; else bin2 = bin1 + 1; - double x2 = H->GetBinCenter(bin2); - double y2 = H->GetBinContent(bin2); - - //transform x1 and x2 - x1 = x1*stretch + offset; x2 = x2*stretch + offset; - //transform y1 and y2 - y1 = y1*scale; y2 = y2*scale; - - //find slope and intercept of line connecting (x1,y1) and (x2,y2) - double m = (y2-y1)/(x2-x1); - double b = y1 - m*x1; - - return m*x + b; - -} - -bool EnergyFilter(double Energy){ - - double continuum_low = 200.0; - double continuum_high = 477.0; - double photopeak_low = 650.0; - double photopeak_high = 670.0; - - if( (Energy >= continuum_low) && (Energy <= continuum_high) ){ - return true; - } else if( (Energy >= photopeak_low) && (Energy <= photopeak_high) ){ - return true; - } else { - return false; - - } -} - -MReadOutAssembly* RealizeSimEvent(MSimEvent* simEvent, MModuleEnergyCalibrationUniversal* Calibrator){ - - MReadOutAssembly* Event = new MReadOutAssembly(); - - for( unsigned int i = 0; i < simEvent->GetNHTs(); ++i ){ - - MSimHT* HT = simEvent->GetHTAt(i); - MDVolumeSequence* VS = HT->GetVolumeSequence(); - MDDetector* Detector = VS->GetDetector(); - MString DetectorName = Detector->GetName(); - if(!DetectorName.BeginsWith("Detector")){ - delete Event; - return NULL; - } - DetectorName.RemoveAllInPlace("Detector"); - int DetectorID = DetectorName.ToInt(); - - MDEEStripHit pSide; - MDEEStripHit nSide; - - pSide.m_ROE.IsLowVoltageStrip(true); - nSide.m_ROE.IsLowVoltageStrip(false); - - // Convert detector name in detector ID - pSide.m_ROE.SetDetectorID(DetectorID); - nSide.m_ROE.SetDetectorID(DetectorID); - - // Convert position into - MVector PositionInDetector = VS->GetPositionInSensitiveVolume(); - MDGridPoint GP = Detector->GetGridPoint(PositionInDetector); - double Depth = PositionInDetector.GetZ(); - //carolyn says -0.75 is the high voltage side - //i need to map this so that +1.5 is the high voltage side, WRT to charge transport stuff - Depth = -(Depth - DetectorThicknesses[DetectorID]/2.0); - - // Not sure about if p or n-side is up, but we can debug this later - pSide.m_ROE.SetStripID(GP.GetXGrid()+1); - nSide.m_ROE.SetStripID(GP.GetYGrid()+1); - int xID = pSide.m_ROE.GetStripID(); - int yID = nSide.m_ROE.GetStripID(); - - pSide.m_Energy = HT->GetEnergy(); - nSide.m_Energy = HT->GetEnergy(); - double HTEnergy = HT->GetEnergy(); - - // pSide.m_Position = PositionInDetector; - // nSide.m_Position = PositionInDetector; - - //at this point we have enough info to generate the strip hits - MStripHit_s* XStrip = new MStripHit_s(); - MStripHit_s* YStrip = new MStripHit_s(); - XStrip->SetDetectorID(DetectorID); YStrip->SetDetectorID(DetectorID); - XStrip->SetTiming(0.0); YStrip->SetTiming(0.0); - XStrip->IsLowVoltageStrip(true); YStrip->IsLowVoltageStrip(false); - XStrip->SetStripID(xID); YStrip->SetStripID(yID); - XStrip->SetEnergy(HTEnergy); YStrip->SetEnergy(HTEnergy); - double XEnRes = Calibrator->LookupEnergyResolution( XStrip, HTEnergy ); XStrip->SetEnergyResolution(XEnRes); - double YEnRes = Calibrator->LookupEnergyResolution( YStrip, HTEnergy ); YStrip->SetEnergyResolution(YEnRes); - XStrip->SetDepth( Depth ); YStrip->SetDepth( Depth ); - Event->AddStripHit( (MStripHit*)XStrip ); Event->AddStripHit( (MStripHit*)YStrip ); - - } - - return Event; - -} - diff --git a/apps/depth_calibration_cosi2016_v2.cxx b/apps/depth_calibration_cosi2016_v2.cxx deleted file mode 100644 index 61be62ed..00000000 --- a/apps/depth_calibration_cosi2016_v2.cxx +++ /dev/null @@ -1,756 +0,0 @@ -// Standard -#include -#include -#include -#include -#include -#include -#include -#include -#include -using namespace std; - -// ROOT -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -// MEGAlib -#include "MGlobal.h" -#include "MFile.h" -#include "MReadOutElementDoubleStrip.h" -#include "MFileReadOuts.h" -#include "MReadOutAssembly.h" -#include "MStripHit.h" -#include "MReadOutSequence.h" -#include "MSupervisor.h" -#include "MModuleLoaderMeasurementsROA.h" -#include "MModuleEnergyCalibrationUniversal.h" -#include "MModuleStripPairingGreedy.h" -#include "MAssembly.h" -#include "MFileEventsSim.h" -#include "MDGeometryQuest.h" -#include "MDepthCalibrator.h" -#include "MModuleLoaderMeasurementsBinary.h" -#include "MBinaryFlightDataParser.h" - -class MDEEStripHit -{ - public: - //! The read-out element - MReadOutElementDoubleStrip m_ROE; - //! The ADC value - double m_ADC; - //! The timing value; - double m_Timing; - - //! The simulated position - MVector m_Position; - //! The simulated energy deposit - double m_Energy; - - //! True if this is a guard ring - bool m_IsGuardRing; - - //! A list of original strip hits making up this strip hit - vector m_SubStripHits; -}; - -class MStripHit_s : public MStripHit -{ - //use this derived class instead of MStripHit so that we can keep track of the depth - //from the simulation data - - public: - void SetDepth(double Depth){ m_Depth = Depth; } - double GetDepth(void){ return m_Depth; } - protected: - double m_Depth; -}; - -class Options -{ - public: - vector> EnergyWindows; - MString RawDataFilename; - MString RawDataOutputFilename; - MString SimulationFilename; - MString SimulationOutputFilename; - MString SplineFilename; - MString GeometryFilename; - MString EnergyCalibrationFilename; - MString FitDataFile; - MString FitSimFile; - bool ProcessRealData; - bool ProcessSimData; - bool PerformFits; - bool Use5nsBinning; - int Divisions; - int FitRebinSimCTD; - int FitRebinDataCTD; - Options(void){ - EnergyCalibrationFilename = "$(NUCLEARIZER)/resource/calibration/COSI16/Berkeley/EnergyCalibration.ecal"; - RawDataOutputFilename = "data_ctd.root"; - SimulationOutputFilename = "sim_data.root"; - FitDataFile = "data_ctd.root"; - FitSimFile = "sim_data.root"; - ProcessRealData = true; - ProcessSimData = true; - PerformFits = true; - Use5nsBinning = true; - FitRebinSimCTD = 0; - FitRebinDataCTD = 0; - Divisions = 1; - return; - } - bool ParseOptionsFile(MString fname){ - MFile F; - if(!F.Open(fname)){ - return false; - } else { - MString line; - while(F.ReadLine(line)){ - vector Tokens = line.Tokenize(" "); - if(line.BeginsWith("RawDataFilename")){ - if(Tokens.size() == 2) RawDataFilename = Tokens[1]; - } else if(line.BeginsWith("SimulationFilename")){ - if(Tokens.size() == 2) SimulationFilename = Tokens[1]; - } else if(line.BeginsWith("SplineFilename")){ - if(Tokens.size() == 2) SplineFilename = Tokens[1]; - } else if(line.BeginsWith("GeometryFilename")){ - if(Tokens.size() == 2) GeometryFilename = Tokens[1]; - } else if(line.BeginsWith("ProcessRealData")){ - if(Tokens.size() == 2) ProcessRealData = Tokens[1].ToLower() == "true" ? true : false; - } else if(line.BeginsWith("ProcessSimData")){ - if(Tokens.size() == 2) ProcessSimData = Tokens[1].ToLower() == "true" ? true : false; - } else if(line.BeginsWith("PerformFits")){ - if(Tokens.size() == 2) PerformFits = Tokens[1].ToLower() == "true" ? true : false; - } else if(line.BeginsWith("Use5nsBinning")){ - if(Tokens.size() == 2) Use5nsBinning = Tokens[1].ToLower() == "true" ? true : false; - } else if(line.BeginsWith("EnergyWindow")){ - if(Tokens.size() == 3){ - vector E; - E.push_back(Tokens[1].ToDouble()); - E.push_back(Tokens[2].ToDouble()); - EnergyWindows.push_back(E); - } - } else if(line.BeginsWith("Divisions")){ - if(Tokens.size() == 2) Divisions = Tokens[1].ToInt(); - } else if(line.BeginsWith("EnergyCalibrationFilename")){ - if(Tokens.size() == 2) EnergyCalibrationFilename = Tokens[1]; - } else if(line.BeginsWith("SimulationOutputFilename")){ - if(Tokens.size() == 2) SimulationOutputFilename = Tokens[1]; - } else if(line.BeginsWith("RawDataOutputFilename")){ - if(Tokens.size() == 2) RawDataOutputFilename = Tokens[1]; - } else if(line.BeginsWith("FitDataFile")){ - if(Tokens.size() == 2) FitDataFile = Tokens[1]; - } else if(line.BeginsWith("FitSimFile")){ - if(Tokens.size() == 2) FitSimFile = Tokens[1]; - } else if(line.BeginsWith("FitRebinSimCTD")){ - if(Tokens.size() == 2) FitRebinSimCTD = Tokens[1].ToInt(); - } else if(line.BeginsWith("FitRebinDataCTD")){ - if(Tokens.size() == 2) FitRebinDataCTD = Tokens[1].ToInt(); - } - } - F.Close(); - return true; - } - } -}; -Options* options = NULL; - -class DivisionTemplate -{ - public: - TH1D* H; - double max1_x; - double max2_x; - double max1; - DivisionTemplate(void){ - H = NULL; - max1_x = 0; - max2_x = 0; - max1 = 0; - } -}; -DivisionTemplate* Gctd = NULL; - -double DetectorThicknesses[12]; -bool EnergyFilter(double Energy, const vector>& EnergyWindows); -MReadOutAssembly* RealizeSimEvent(MSimEvent* simEvent, MModuleEnergyCalibrationUniversal* Calibrator); -double ctd_template_fit_function(double* v, double* par); -void FindEdgeBins(TH1D* H, int* L, int* R); -int PixelCodeToDivision(int PixelCode, int Divisions); - -//TH1D* Gctd; //used by root fit function - -bool SignalExit = false; -void Handler(int signo){ - SignalExit = true; -} - -int main(int argc, char** argv) -{ - signal(SIGINT, Handler); - MGlobal::Initialize("Standalone",""); - TApplication dcal("dcal",0,0); - TRandom3 RNG(0); - - //parse input options file - if(argc != 2){ - cout << "please pass an options file as the only argument. exiting..." << endl; - return -1; - } else { - options = new Options(); - if(!options->ParseOptionsFile(MString(argv[1]))){ - cout << "error parsing options file, exiting..." << endl; - return -1; - } else { - if(options->EnergyWindows.size() == 0){ - cout << "No energy windows were specified, using all energies! (this is probably not what you want)" << endl; - vector E; - E.push_back(0.0); E.push_back(1.0E7); - options->EnergyWindows.push_back(E); - } - } - } - - // Load geometry: - MDGeometryQuest* Geometry = new MDGeometryQuest(); - if (Geometry->ScanSetupFile(options->GeometryFilename) == true) { - Geometry->ActivateNoising(false); - Geometry->SetGlobalFailureRate(0.0); - for(int i = 0; i < 12; ++i){ - char name[32]; snprintf(name,sizeof name,"GeWafer_%d",i); - MDVolume* V = Geometry->MDGeometry::GetVolume(MString(name)); - if(V != 0){ - MString s = V->GetShape()->GetGeomega(); - vector Tokens = s.Tokenize(" "); - if((Tokens.size() == 4) && (s.BeginsWith("BRIK"))){ - DetectorThicknesses[i] = 2.0 * Tokens[3].ToDouble(); - cout << "Set detector " << i << " thickness to " << DetectorThicknesses[i] << " cm using geometry specification" << endl; - } else { - cout << "ERROR determining thickness for volume GeWafer_" << i << ", using default of 1.5 cm" << endl; - DetectorThicknesses[i] = 1.5; - } - } else { - cout << "ERROR could not find volume GeWafer_" << i << ", in gemoetry tree. Using default thickness of 1.5 cm" << endl; - DetectorThicknesses[i] = 1.5; - } - } - cout<<"Geometry "<GetName()<<" loaded!"<GetName()<<" - Aborting!"<LoadSplinesFile(options->SplineFilename) == false){ - cout << "failed to load splines file, exiting..." << endl; - return false; - } - - //setup nuclearizer modules - MModuleEnergyCalibrationUniversal* Calibrator = new MModuleEnergyCalibrationUniversal(); - Calibrator->SetFileName(options->EnergyCalibrationFilename); - MModuleStripPairingGreedy* Pairing = new MModuleStripPairingGreedy(); - if (Calibrator->Initialize() == false){ - cout << "failed to initialize energy calibrator module, exiting..." << endl; - return false; - } - if (Pairing->Initialize() == false){ - cout << "failed to initialize strip pairing module, exiting..." << endl; - return false; - } - - //setup variables for processing of real data - std::map Histograms; //map to store CTD histograms - unsigned int counter = 0; - - if( options->ProcessRealData ){ //process real data - - MModuleLoaderMeasurementsBinary* Loader = new MModuleLoaderMeasurementsBinary(); - Loader->SetFileName(options->RawDataFilename); - Loader->SetDataSelectionMode(MBinaryFlightDataParserDataModes::c_Raw); - Loader->SetAspectMode(MBinaryFlightDataParserAspectModes::c_Neither); - Loader->EnableCoincidenceMerging(false); - if (Loader->Initialize() == false) { - cout << "failed to initialize Loader module, exiting..." << endl; - return false; - } - - bool IsFinished = false; - MReadOutAssembly* Event = new MReadOutAssembly(); - while (IsFinished == false) { - if(SignalExit){ - SignalExit = false; - cout << "exiting real data analysis" << endl; - break; - } - Event->Clear(); - if( Loader->IsReady() ){ - Loader->AnalyzeEvent(Event); - Calibrator->AnalyzeEvent(Event); - Pairing->AnalyzeEvent(Event); - unsigned int NHits = Event->GetNHits(); - for(unsigned int i = 0; i < NHits; i++){ - MHit* H = Event->GetHit(i); - unsigned int NStripHits = H->GetNStripHits(); - if( NStripHits == 2 ){ //using 2-strip events only - bool EnergyGood = EnergyFilter(H->GetEnergy(), options->EnergyWindows); - if( EnergyGood ){ - int pixel_code; - double timing; - MStripHit *SHx, *SHy; - if( H->GetStripHit(0)->IsLowVoltageStrip() && !H->GetStripHit(1)->IsLowVoltageStrip() ){ - SHx = H->GetStripHit(0); SHy = H->GetStripHit(1); - } else if( H->GetStripHit(1)->IsLowVoltageStrip() && !H->GetStripHit(0)->IsLowVoltageStrip() ){ - SHx = H->GetStripHit(1); SHy = H->GetStripHit(0); - } else { - //we didn't have 1 x and 1 y strip, log this and continue... - continue; - } - int DetID = SHx->GetDetectorID(); - pixel_code = 10000*DetID + 100*SHx->GetStripID() + SHy->GetStripID(); - if( (SHx->GetTiming() < 1E-6) || (SHy->GetTiming() < 1E-6) ){ //missing timing info - continue; - } - timing = ((SHx->GetTiming() - SHy->GetTiming())); - if( Histograms[pixel_code] == NULL ){ - char name[64]; sprintf(name,"%d",pixel_code); - //TH1D* new_hist = new TH1D(name, name, 60, -300.0, +300.0); - TH1D* new_hist; - if(options->Use5nsBinning){ - new_hist = new TH1D(name,name,120,-300.0,+300.0); - } else { - new_hist = new TH1D(name,name,60,-300.0,+300.0); - } - - Histograms[pixel_code] = new_hist; - } - //if(timing >= -0.001) timing += 0.01; else timing -= 0.01; //to avoid roundoff problems near bin edges - timing += 0.01; - Histograms[pixel_code]->Fill(timing); - } - } - } - ++counter; - if( (counter & 0xffff) == 0 ) cout << "num raw events: " << counter << endl; - } - IsFinished = Loader->IsFinished(); - } - - //when done, overwrite the histograms in the root file - //check if subdir exists, if not, then create it - //mkdir will return 0 if it already exists - TFile* rootF = new TFile(options->RawDataOutputFilename,"recreate"); - for(auto const &it: Histograms){ - TH1D* hist = it.second; - rootF->WriteTObject(hist); - //clear the TH1D from memory... leave it for now for debugging but later - //we might end up using lots of memeory - } - rootF->Close(); - - } - - //set up variables for simulation data processing - //map DivisionCTDs; - unordered_map DivisionCTDs; - unordered_map DivisionHistograms; - - if( options->ProcessSimData ){ //read in simulation data - - MFileEventsSim* Reader = new MFileEventsSim(Geometry); - if (Reader->Open(options->SimulationFilename) == false) { - cout << "Unable to open sim file " << options->SimulationFilename << " - Aborting!" << endl; - return false; - } - MSimEvent* simEvent = 0; - counter = 0; - vector DepthHistograms; - for(int i = 0; i < 12; ++i){ - char name[16]; sprintf(name,"depth_%d",i); - TH1D* H = new TH1D(name,name,100,0.0,DetectorThicknesses[i]); - DepthHistograms.push_back(H); - } - while ((simEvent = Reader->GetNextEvent()) != 0) { - //Reader->GetNextEvent() will print out some info about hits not being in sensitive volumes... this method will automatically exclude the weird HTs so that the code that follows - //doesn't have to deal with it. these HTs come from hits that are at the sensitive Ge / Ge corner boundary. - if(SignalExit){ - SignalExit = false; - cout << "exiting simulation data analysis" << endl; - break; - } - MReadOutAssembly* Event = RealizeSimEvent(simEvent, Calibrator); - if( Event == NULL ){ - delete simEvent; - continue; - } - Pairing->AnalyzeEvent(Event); - for( unsigned int i = 0; i < Event->GetNHits(); ++i ){ - MHit* H = Event->GetHit(i); - if((H->GetNStripHits() != 2) || (EnergyFilter(H->GetEnergy(),options->EnergyWindows) == false)){ - break; - } else { - MStripHit_s *SHx, *SHy; - if( H->GetStripHit(0)->IsLowVoltageStrip() && !H->GetStripHit(1)->IsLowVoltageStrip() ){ - SHx = dynamic_cast(H->GetStripHit(0)); SHy = dynamic_cast(H->GetStripHit(1)); - } else if( H->GetStripHit(1)->IsLowVoltageStrip() && !H->GetStripHit(0)->IsLowVoltageStrip() ){ - SHx = dynamic_cast(H->GetStripHit(1)); SHy = dynamic_cast(H->GetStripHit(0)); - } else { - //we didn't have 1 x and 1 y strip, log this and continue... - break; - } - //check that the depths agree - double Depth; - if( fabs(SHx->GetDepth() - SHy->GetDepth()) > 1.0E-6 ){ - cout << "depths don't agree!" << endl; - break; - } else { - Depth = SHx->GetDepth(); - } - - int DetID = SHx->GetDetectorID(); - int pixel_code = (10000*DetID) + (100*SHx->GetStripID()) + SHy->GetStripID(); - int division_code = PixelCodeToDivision(pixel_code, options->Divisions); - - //fill the depth division histogram - if(DivisionHistograms.count(division_code) == 1){ - DivisionHistograms[division_code]->Fill(Depth); - } else { - char name[32]; snprintf(name, sizeof name, "divdepth_%d", division_code); - TH1D* H = new TH1D(name,name,100,0.0,DetectorThicknesses[DetID]); - H->Fill(Depth); - DivisionHistograms[division_code] = H; - } - - //fill the depth (for the whole detector) histogram, and then fill the division CTD histogram - DepthHistograms[DetID]->Fill(Depth); - double Timing = m_DepthCalibrator->GetSpline(DetID,true)->Eval(Depth); - double Noise = RNG.Gaus(0,12.5/2.3548); - if(DivisionCTDs.count(division_code) == 1){ - DivisionCTDs[division_code]->Fill(Timing+Noise); - } else { - char name[32]; snprintf(name,sizeof name, "divctd_%d", division_code); - TH1D* H = new TH1D(name, name, 240, -300.0, +300.0); - DivisionCTDs[division_code] = H; - H->Fill(Timing+Noise); - } - - } - } - ++counter; - if( (counter & 0xffff) == 0 ) cout << "num sim events: " << counter << endl; - delete simEvent; - delete Event; - } - //write simulated CTD templates to root file - /* - TFile* rootF = new TFile(options->SimulationOutputFilename,"recreate"); - for(auto const &it: DivisionCTDs){ - TH1D* H = it.second; - rootF->WriteTObject(H); - } - for(int i = 0; i < 12; ++i){ - rootF->WriteTObject(DepthHistograms[i]); - } - for(auto const &it: DivisionHistograms){ - TH1D* H = it.second; - rootF->WriteTObject(H); - } - rootF->Close(); - */ - TFile* rootF = new TFile(options->SimulationOutputFilename,"recreate"); - for(int i = 0; i < 12; ++i){ - DepthHistograms[i]->SetStats(); - rootF->WriteTObject(DepthHistograms[i]); - } - vector DivisionCTDKeys; - for(auto const &it: DivisionCTDs) DivisionCTDKeys.push_back(it.first); - sort(DivisionCTDKeys.begin(),DivisionCTDKeys.end()); - for(size_t i = 0; i < DivisionCTDKeys.size(); ++i){ - TH1D* H = DivisionCTDs[DivisionCTDKeys[i]]; - H->SetStats(); - rootF->WriteTObject(H); - } - vector DivisionHistogramsKeys; - for(auto const &it: DivisionHistograms) DivisionHistogramsKeys.push_back(it.first); - sort(DivisionHistogramsKeys.begin(),DivisionHistogramsKeys.end()); - for(size_t i = 0; i < DivisionHistogramsKeys.size(); ++i){ - TH1D* H = DivisionHistograms[DivisionHistogramsKeys[i]]; - H->SetStats(); - rootF->WriteTObject(H); - } - rootF->Close(); - - - - - - } - - if( options->PerformFits ){ - /* - TFile* rootF_mctd = new TFile("data_ctd.root","READ"); - TFile* rootF_sctd = new TFile("sim_ctd.root","READ"); - */ - unordered_map TemplateMap; - TFile* rootF_mctd = new TFile(options->FitDataFile); - TFile* rootF_sctd = new TFile(options->FitSimFile); - if( rootF_mctd == NULL ){ - cout << "couldn't open measured CTD root file, exiting..." << endl; - return -1; - } - if( rootF_sctd == NULL ){ - cout << "couldn't open sim CTD root file, exiting..." << endl; - return -1; - } - FILE* fout = fopen("coeffs.txt","w"); - fprintf(fout,"#format is 1) pixel code (10000*det + 100*Xchannel + Ychannel) 2) stretch 3) offset 4) scale 5) chi2 reduced\n"); - TFile* rootF_fits = new TFile("fits.root","recreate"); - TF1* fitfunc = new TF1("ctd_fitfunc",ctd_template_fit_function,-300.0,+300.0,3); - fitfunc->SetParNames("stretch","offset","scale"); - for( unsigned int D = 0; D < 12; ++D ){ - /* - char det_name[8]; sprintf(det_name,"%d",D); - TH1D* ctd_template = (TH1D*)rootF_sctd->Get(det_name); - if(ctd_template == NULL){ - cout << "could not read CTD template for detector " << D << ", skipping this detector..." << endl; - continue; - } else { - Gctd = ctd_template; //set this globally so that the root fit function can see it - } - TF1* fitfunc = new TF1("ctd_fitfunc",ctd_template_fit_function,-300.0,+300.0,3); - fitfunc->SetParameters(1.0, 0.0, 1.0); // first param is stretch, second is offset, third is scale - fitfunc->SetParNames("stretch","offset","scale"); - int Ledge_bin, Redge_bin; FindEdgeBins(ctd_template, &Ledge_bin, &Redge_bin); - double max1_x = ctd_template->GetBinCenter(Ledge_bin); double max1 = ctd_template->GetBinContent(Ledge_bin); - double max2_x = ctd_template->GetBinCenter(Redge_bin); //double max2 = ctd_template->GetBinContent(Redge_bin); - */ - for( unsigned int Xch = 1; Xch <= 37; ++Xch ){ - for( unsigned int Ych = 1; Ych <= 37; ++Ych ){ - - //try to read the ctd - int pixel_code = 10000*D + 100*Xch + Ych; - char pixel_code_s[32]; sprintf(pixel_code_s,"%d",pixel_code); - TH1D* H = (TH1D*)rootF_mctd->Get(pixel_code_s); - - if( H == NULL ) continue; else { - - //set up the template - int division_code = PixelCodeToDivision(pixel_code, options->Divisions); - if(TemplateMap.count(division_code)){ - Gctd = TemplateMap[division_code]; - } else { - char division_name[32]; snprintf(division_name, sizeof division_name, "divctd_%d", division_code); - TH1D* ctd_template = (TH1D*)rootF_sctd->Get(division_name); - if(ctd_template == NULL){ - cout << "could not read CTD template for division " << division_code << ", skipping pixel" << pixel_code << endl; - continue; - } else { - if(options->FitRebinSimCTD >= 2) ctd_template->Rebin(options->FitRebinSimCTD); - DivisionTemplate* dt = new DivisionTemplate(); - dt->H = ctd_template; - int Ledge_bin, Redge_bin; FindEdgeBins(ctd_template, &Ledge_bin, &Redge_bin); - dt->max1_x = ctd_template->GetBinCenter(Ledge_bin); - dt->max2_x = ctd_template->GetBinCenter(Redge_bin); - dt->max1 = ctd_template->GetBinContent(Ledge_bin); - TemplateMap[division_code] = dt; - Gctd = dt; //set this globally so that the root fit function can see it - } - } - - if( H->GetEntries() < 200 ) continue; //histogram has too few counts - if(options->FitRebinDataCTD >= 2) H->Rebin(options->FitRebinDataCTD); - cout << "found pixel:" << pixel_code << ", starting fit..." << endl; - int Ledge_bin,Redge_bin; FindEdgeBins(H, &Ledge_bin, &Redge_bin); - double cmax1_x = H->GetBinCenter(Ledge_bin); double cmax1 = H->GetBinContent(Ledge_bin); - double cmax2_x = H->GetBinCenter(Redge_bin); //double cmax2 = H->GetBinContent(Redge_bin); - double stretch_guess = fabs(cmax1_x - cmax2_x)/fabs(Gctd->max1_x - Gctd->max2_x); - cout << "stretch guess: "<max1_x); - cout << "offset_guess: " << offset_guess << endl; - double scale_guess = cmax1/Gctd->max1; - cout << "scale_guess: " << scale_guess << endl; - fitfunc->SetParameters(stretch_guess, offset_guess, scale_guess); - H->Fit(fitfunc); - double* P; P = fitfunc->GetParameters(); - double chi = fitfunc->GetChisquare()/(H->GetNbinsX()-3.0); - fprintf(fout,"%d %f %f %f %f\n",pixel_code,P[0],P[1],P[2],chi); - char title[32]; snprintf(title, sizeof title, "%d-%d", pixel_code, division_code); - H->SetTitle(title); - H->SetStats(); - rootF_fits->WriteTObject(H); - } - delete H; - } - } - } - fclose(fout); - rootF_fits->Close(); - } - - cout << "DONE" << endl; - return 1; -} - -void FindEdgeBins(TH1D* H, int* L, int* R){ - - int i; - - H->SetAxisRange(-300.0,0.0); - double maxL = H->GetMaximum(); - for(i = 1; i <= H->GetNbinsX(); ++i){ - if( H->GetBinContent(i) >= (maxL/3.0) ) break; - } - *L = i; - - H->SetAxisRange(0.0,+300.0); - double maxR = H->GetMaximum(); - for(i = H->GetNbinsX(); i > 0; --i){ - if( H->GetBinContent(i) >= (maxR/3.0) ) break; - } - *R = i; - - H->SetAxisRange(-300.0,+300.0); - - return; - -} - -double ctd_template_fit_function(double* v, double* par){ - - double stretch = par[0]; - double offset = par[1]; - double scale = par[2]; - double x = v[0]; - TH1D* H = Gctd->H; //Gctd is current global ctd template - - //apply inverse stretch/offset to find the x value with respect to the original histogram bins - double x_0 = (x - offset)/stretch; - - //now find the two bin centers that bracket x - int bin1 = H->FindBin(x_0); - double x1 = H->GetBinCenter(bin1); - double y1 = H->GetBinContent(bin1); - int bin2; - if( x_0 <= x1 ) bin2 = bin1 - 1; else bin2 = bin1 + 1; - double x2 = H->GetBinCenter(bin2); - double y2 = H->GetBinContent(bin2); - - //transform x1 and x2 - x1 = x1*stretch + offset; x2 = x2*stretch + offset; - //transform y1 and y2 - y1 = y1*scale; y2 = y2*scale; - - //find slope and intercept of line connecting (x1,y1) and (x2,y2) - double m = (y2-y1)/(x2-x1); - double b = y1 - m*x1; - - return m*x + b; - -} - -bool EnergyFilter(double Energy, const vector>& EnergyWindows){ - - for(const auto it: EnergyWindows){ - if((Energy >= it[0]) && (Energy <= it[1])){ - return true; - } - } - - return false; -} - -MReadOutAssembly* RealizeSimEvent(MSimEvent* simEvent, MModuleEnergyCalibrationUniversal* Calibrator){ - - MReadOutAssembly* Event = new MReadOutAssembly(); - - for( unsigned int i = 0; i < simEvent->GetNHTs(); ++i ){ - - MSimHT* HT = simEvent->GetHTAt(i); - MDVolumeSequence* VS = HT->GetVolumeSequence(); - MDDetector* Detector = VS->GetDetector(); - MString DetectorName = Detector->GetName(); - if(!DetectorName.BeginsWith("Detector")){ //shield hit - //delete Event; - //return NULL; - continue; - } - DetectorName.RemoveAllInPlace("Detector"); - int DetectorID = DetectorName.ToInt(); - - MDEEStripHit pSide; - MDEEStripHit nSide; - - pSide.m_ROE.IsLowVoltageStrip(true); - nSide.m_ROE.IsLowVoltageStrip(false); - - // Convert detector name in detector ID - pSide.m_ROE.SetDetectorID(DetectorID); - nSide.m_ROE.SetDetectorID(DetectorID); - - // Convert position into - MVector PositionInDetector = VS->GetPositionInSensitiveVolume(); - MDGridPoint GP = Detector->GetGridPoint(PositionInDetector); - double Depth = PositionInDetector.GetZ(); - //carolyn says -0.75 is the high voltage side - //i need to map this so that +1.5 is the high voltage side, WRT to charge transport stuff - Depth = -(Depth - DetectorThicknesses[DetectorID]/2.0); - - // Not sure about if p or n-side is up, but we can debug this later - pSide.m_ROE.SetStripID(GP.GetXGrid()+1); - nSide.m_ROE.SetStripID(GP.GetYGrid()+1); - int xID = pSide.m_ROE.GetStripID(); - int yID = nSide.m_ROE.GetStripID(); - - pSide.m_Energy = HT->GetEnergy(); - nSide.m_Energy = HT->GetEnergy(); - double HTEnergy = HT->GetEnergy(); - - // pSide.m_Position = PositionInDetector; - // nSide.m_Position = PositionInDetector; - - //at this point we have enough info to generate the strip hits - MStripHit_s* XStrip = new MStripHit_s(); - MStripHit_s* YStrip = new MStripHit_s(); - XStrip->SetDetectorID(DetectorID); YStrip->SetDetectorID(DetectorID); - XStrip->SetTiming(0.0); YStrip->SetTiming(0.0); - XStrip->IsLowVoltageStrip(true); YStrip->IsLowVoltageStrip(false); - XStrip->SetStripID(xID); YStrip->SetStripID(yID); - XStrip->SetEnergy(HTEnergy); YStrip->SetEnergy(HTEnergy); - double XEnRes = Calibrator->LookupEnergyResolution( XStrip, HTEnergy ); XStrip->SetEnergyResolution(XEnRes); - double YEnRes = Calibrator->LookupEnergyResolution( YStrip, HTEnergy ); YStrip->SetEnergyResolution(YEnRes); - XStrip->SetDepth( Depth ); YStrip->SetDepth( Depth ); - Event->AddStripHit( (MStripHit*)XStrip ); Event->AddStripHit( (MStripHit*)YStrip ); - - } - - return Event; - -} - -int PixelCodeToDivision(int PixelCode, int Divisions){ - int d = PixelCode/10000; - int y = PixelCode % 100; - int x = ((PixelCode % 10000) - y)/100; - y--; //map strips into range 0 - 36 - x--; - int xd = x/(36/Divisions); - if(xd == Divisions) xd--; - int yd = y/(36/Divisions); - if(yd == Divisions) yd--; - //return (d*1000) + (xd + 1)*(yd + 1); - return (d*1000) + (xd * Divisions) + yd; -} diff --git a/apps/depth_calibration_cosi2016_v3.cxx b/apps/depth_calibration_cosi2016_v3.cxx deleted file mode 100644 index d2c5feaf..00000000 --- a/apps/depth_calibration_cosi2016_v3.cxx +++ /dev/null @@ -1,730 +0,0 @@ -// Standard -#include -#include -#include -#include -#include -#include -#include -#include -#include -using namespace std; - -// ROOT -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -// MEGAlib -#include "MGlobal.h" -#include "MFile.h" -#include "MReadOutElementDoubleStrip.h" -#include "MFileReadOuts.h" -#include "MReadOutAssembly.h" -#include "MStripHit.h" -#include "MReadOutSequence.h" -#include "MSupervisor.h" -#include "MModuleLoaderMeasurementsROA.h" -#include "MModuleEnergyCalibrationUniversal.h" -#include "MModuleStripPairingGreedy.h" -#include "MAssembly.h" -#include "MFileEventsSim.h" -#include "MDGeometryQuest.h" -#include "MDepthCalibrator.h" -#include "MModuleLoaderMeasurementsBinary.h" -#include "MBinaryFlightDataParser.h" - -class MDEEStripHit -{ - public: - //! The read-out element - MReadOutElementDoubleStrip m_ROE; - //! The ADC value - double m_ADC; - //! The timing value; - double m_Timing; - - //! The simulated position - MVector m_Position; - //! The simulated energy deposit - double m_Energy; - - //! True if this is a guard ring - bool m_IsGuardRing; - - //! A list of original strip hits making up this strip hit - vector m_SubStripHits; -}; - -class MStripHit_s : public MStripHit -{ - //use this derived class instead of MStripHit so that we can keep track of the depth - //from the simulation data - - public: - void SetDepth(double Depth){ m_Depth = Depth; } - double GetDepth(void){ return m_Depth; } - protected: - double m_Depth; -}; - -class Options -{ - public: - vector> EnergyWindows; - MString RawDataFilename; - MString RawDataOutputFilename; - MString SimulationFilename; - MString SimulationOutputFilename; - MString SplineFilename; - MString GeometryFilename; - MString EnergyCalibrationFilename; - MString FitDataFile; - MString FitSimFile; - bool ProcessRealData; - bool ProcessSimData; - bool PerformFits; - bool Use5nsBinning; - int Divisions; - int FitRebinSimCTD; - int FitRebinDataCTD; - Options(void){ - EnergyCalibrationFilename = "$(NUCLEARIZER)/resource/calibration/COSI16/Berkeley/EnergyCalibration.ecal"; - RawDataOutputFilename = "data_ctd.root"; - SimulationOutputFilename = "sim_data.root"; - FitDataFile = "data_ctd.root"; - FitSimFile = "sim_data.root"; - ProcessRealData = true; - ProcessSimData = true; - PerformFits = true; - Use5nsBinning = true; - FitRebinSimCTD = 0; - FitRebinDataCTD = 0; - Divisions = 1; - return; - } - bool ParseOptionsFile(MString fname){ - MFile F; - if(!F.Open(fname)){ - return false; - } else { - MString line; - while(F.ReadLine(line)){ - vector Tokens = line.Tokenize(" "); - if(line.BeginsWith("RawDataFilename")){ - if(Tokens.size() == 2) RawDataFilename = Tokens[1]; - } else if(line.BeginsWith("SimulationFilename")){ - if(Tokens.size() == 2) SimulationFilename = Tokens[1]; - } else if(line.BeginsWith("SplineFilename")){ - if(Tokens.size() == 2) SplineFilename = Tokens[1]; - } else if(line.BeginsWith("GeometryFilename")){ - if(Tokens.size() == 2) GeometryFilename = Tokens[1]; - } else if(line.BeginsWith("ProcessRealData")){ - if(Tokens.size() == 2) ProcessRealData = Tokens[1].ToLower() == "true" ? true : false; - } else if(line.BeginsWith("ProcessSimData")){ - if(Tokens.size() == 2) ProcessSimData = Tokens[1].ToLower() == "true" ? true : false; - } else if(line.BeginsWith("PerformFits")){ - if(Tokens.size() == 2) PerformFits = Tokens[1].ToLower() == "true" ? true : false; - } else if(line.BeginsWith("Use5nsBinning")){ - if(Tokens.size() == 2) Use5nsBinning = Tokens[1].ToLower() == "true" ? true : false; - } else if(line.BeginsWith("EnergyWindow")){ - if(Tokens.size() == 3){ - vector E; - E.push_back(Tokens[1].ToDouble()); - E.push_back(Tokens[2].ToDouble()); - EnergyWindows.push_back(E); - } - } else if(line.BeginsWith("Divisions")){ - if(Tokens.size() == 2) Divisions = Tokens[1].ToInt(); - } else if(line.BeginsWith("EnergyCalibrationFilename")){ - if(Tokens.size() == 2) EnergyCalibrationFilename = Tokens[1]; - } else if(line.BeginsWith("SimulationOutputFilename")){ - if(Tokens.size() == 2) SimulationOutputFilename = Tokens[1]; - } else if(line.BeginsWith("RawDataOutputFilename")){ - if(Tokens.size() == 2) RawDataOutputFilename = Tokens[1]; - } else if(line.BeginsWith("FitDataFile")){ - if(Tokens.size() == 2) FitDataFile = Tokens[1]; - } else if(line.BeginsWith("FitSimFile")){ - if(Tokens.size() == 2) FitSimFile = Tokens[1]; - } else if(line.BeginsWith("FitRebinSimCTD")){ - if(Tokens.size() == 2) FitRebinSimCTD = Tokens[1].ToInt(); - } else if(line.BeginsWith("FitRebinDataCTD")){ - if(Tokens.size() == 2) FitRebinDataCTD = Tokens[1].ToInt(); - } - } - F.Close(); - return true; - } - } -}; -Options* options = NULL; - -class DivisionTemplate -{ - public: - TH1D* H; - double max1_x; - double max2_x; - double max1; - DivisionTemplate(void){ - H = NULL; - max1_x = 0; - max2_x = 0; - max1 = 0; - } -}; -DivisionTemplate* Gctd = NULL; - -double DetectorThicknesses[12]; -bool EnergyFilter(double Energy, const vector>& EnergyWindows); -MReadOutAssembly* RealizeSimEvent(MSimEvent* simEvent, MModuleEnergyCalibrationUniversal* Calibrator); -double ctd_template_fit_function(double* v, double* par); -void FindEdgeBins(TH1D* H, int* L, int* R); -int PixelCodeToDivision(int PixelCode, int Divisions); - -//TH1D* Gctd; //used by root fit function - -bool SignalExit = false; -void Handler(int signo){ - SignalExit = true; -} - -int main(int argc, char** argv) -{ - signal(SIGINT, Handler); - MGlobal::Initialize("Standalone",""); - TApplication dcal("dcal",0,0); - TRandom3 RNG(0); - - //parse input options file - if(argc != 2){ - cout << "please pass an options file as the only argument. exiting..." << endl; - return -1; - } else { - options = new Options(); - if(!options->ParseOptionsFile(MString(argv[1]))){ - cout << "error parsing options file, exiting..." << endl; - return -1; - } else { - if(options->EnergyWindows.size() == 0){ - cout << "No energy windows were specified, using all energies! (this is probably not what you want)" << endl; - vector E; - E.push_back(0.0); E.push_back(1.0E7); - options->EnergyWindows.push_back(E); - } - } - } - - // Load geometry: - MDGeometryQuest* Geometry = new MDGeometryQuest(); - if (Geometry->ScanSetupFile(options->GeometryFilename) == true) { - Geometry->ActivateNoising(false); - Geometry->SetGlobalFailureRate(0.0); - for(int i = 0; i < 12; ++i){ - char name[32]; snprintf(name,sizeof name,"GeWafer_%d",i); - MDVolume* V = Geometry->MDGeometry::GetVolume(MString(name)); - if(V != 0){ - MString s = V->GetShape()->GetGeomega(); - vector Tokens = s.Tokenize(" "); - if((Tokens.size() == 4) && (s.BeginsWith("BRIK"))){ - DetectorThicknesses[i] = 2.0 * Tokens[3].ToDouble(); - cout << "Set detector " << i << " thickness to " << DetectorThicknesses[i] << " cm using geometry specification" << endl; - } else { - cout << "ERROR determining thickness for volume GeWafer_" << i << ", using default of 1.5 cm" << endl; - DetectorThicknesses[i] = 1.5; - } - } else { - cout << "ERROR could not find volume GeWafer_" << i << ", in gemoetry tree. Using default thickness of 1.5 cm" << endl; - DetectorThicknesses[i] = 1.5; - } - } - cout<<"Geometry "<GetName()<<" loaded!"<GetName()<<" - Aborting!"<LoadSplinesFile(options->SplineFilename) == false){ - cout << "failed to load splines file, exiting..." << endl; - return false; - } - - //setup nuclearizer modules - MModuleEnergyCalibrationUniversal* Calibrator = new MModuleEnergyCalibrationUniversal(); - Calibrator->SetFileName(options->EnergyCalibrationFilename); - MModuleStripPairingGreedy* Pairing = new MModuleStripPairingGreedy(); - if (Calibrator->Initialize() == false){ - cout << "failed to initialize energy calibrator module, exiting..." << endl; - return false; - } - if (Pairing->Initialize() == false){ - cout << "failed to initialize strip pairing module, exiting..." << endl; - return false; - } - - //setup variables for processing of real data - std::map Histograms; //map to store CTD histograms - unsigned int counter = 0; - - if( options->ProcessRealData ){ //process real data - - MModuleLoaderMeasurementsBinary* Loader = new MModuleLoaderMeasurementsBinary(); - Loader->SetFileName(options->RawDataFilename); - Loader->SetDataSelectionMode(MBinaryFlightDataParserDataModes::c_Raw); - Loader->SetAspectMode(MBinaryFlightDataParserAspectModes::c_Neither); - Loader->EnableCoincidenceMerging(false); - if (Loader->Initialize() == false) { - cout << "failed to initialize Loader module, exiting..." << endl; - return false; - } - - bool IsFinished = false; - MReadOutAssembly* Event = new MReadOutAssembly(); - while (IsFinished == false) { - if(SignalExit){ - SignalExit = false; - cout << "exiting real data analysis" << endl; - break; - } - Event->Clear(); - if( Loader->IsReady() ){ - Loader->AnalyzeEvent(Event); - Calibrator->AnalyzeEvent(Event); - Pairing->AnalyzeEvent(Event); - unsigned int NHits = Event->GetNHits(); - for(unsigned int i = 0; i < NHits; i++){ - MHit* H = Event->GetHit(i); - unsigned int NStripHits = H->GetNStripHits(); - if( NStripHits == 2 ){ //using 2-strip events only - bool EnergyGood = EnergyFilter(H->GetEnergy(), options->EnergyWindows); - if( EnergyGood ){ - int pixel_code; - double timing; - MStripHit *SHx, *SHy; - if( H->GetStripHit(0)->IsLowVoltageStrip() && !H->GetStripHit(1)->IsLowVoltageStrip() ){ - SHx = H->GetStripHit(0); SHy = H->GetStripHit(1); - } else if( H->GetStripHit(1)->IsLowVoltageStrip() && !H->GetStripHit(0)->IsLowVoltageStrip() ){ - SHx = H->GetStripHit(1); SHy = H->GetStripHit(0); - } else { - //we didn't have 1 x and 1 y strip, log this and continue... - continue; - } - int DetID = SHx->GetDetectorID(); - pixel_code = 10000*DetID + 100*SHx->GetStripID() + SHy->GetStripID(); - if( (SHx->GetTiming() < 1E-6) || (SHy->GetTiming() < 1E-6) ){ //missing timing info - continue; - } - timing = ((SHx->GetTiming() - SHy->GetTiming())); - if( Histograms[pixel_code] == NULL ){ - char name[64]; sprintf(name,"%d",pixel_code); - //TH1D* new_hist = new TH1D(name, name, 60, -300.0, +300.0); - TH1D* new_hist; - if(options->Use5nsBinning){ - new_hist = new TH1D(name,name,120,-300.0,+300.0); - } else { - new_hist = new TH1D(name,name,60,-300.0,+300.0); - } - - Histograms[pixel_code] = new_hist; - } - //if(timing >= -0.001) timing += 0.01; else timing -= 0.01; //to avoid roundoff problems near bin edges - timing += 0.01; - Histograms[pixel_code]->Fill(timing); - } - } - } - ++counter; - if( (counter & 0xffff) == 0 ) cout << "num raw events: " << counter << endl; - } - IsFinished = Loader->IsFinished(); - } - - //when done, overwrite the histograms in the root file - //check if subdir exists, if not, then create it - //mkdir will return 0 if it already exists - TFile* rootF = new TFile(options->RawDataOutputFilename,"recreate"); - for(auto const &it: Histograms){ - TH1D* hist = it.second; - rootF->WriteTObject(hist); - //clear the TH1D from memory... leave it for now for debugging but later - //we might end up using lots of memeory - } - rootF->Close(); - - } - - //set up variables for simulation data processing - //map DivisionCTDs; - unordered_map DivisionCTDs; - unordered_map DivisionHistograms; - - if( options->ProcessSimData ){ //read in simulation data - - MFileEventsSim* Reader = new MFileEventsSim(Geometry); - if (Reader->Open(options->SimulationFilename) == false) { - cout << "Unable to open sim file " << options->SimulationFilename << " - Aborting!" << endl; - return false; - } - MSimEvent* simEvent = 0; - counter = 0; - vector DepthHistograms; - for(int i = 0; i < 12; ++i){ - char name[16]; sprintf(name,"depth_%d",i); - TH1D* H = new TH1D(name,name,100,0.0,DetectorThicknesses[i]); - DepthHistograms.push_back(H); - } - while ((simEvent = Reader->GetNextEvent()) != 0) { - //Reader->GetNextEvent() will print out some info about hits not being in sensitive volumes... this method will automatically exclude the weird HTs so that the code that follows - //doesn't have to deal with it. these HTs come from hits that are at the sensitive Ge / Ge corner boundary. - if(SignalExit){ - SignalExit = false; - cout << "exiting simulation data analysis" << endl; - break; - } - for(size_t i = 0; i < simEvent->GetNHTs(); ++i){ - MSimHT* HT = simEvent->GetHTAt(i); - if(EnergyFilter(HT->GetEnergy(), options->EnergyWindows)){ - MDVolumeSequence* VS = HT->GetVolumeSequence(); - MDDetector* Detector = VS->GetDetector(); - MString DetectorName = Detector->GetName(); - if(DetectorName.BeginsWith("Detector")){ - DetectorName.RemoveAllInPlace("Detector"); - int DetectorID = DetectorName.ToInt(); - MVector Vec = VS->GetPositionInSensitiveVolume(); - double Depth = Vec.GetZ(); - Depth = -(Depth - (DetectorThicknesses[DetectorID]/2.0)); - DepthHistograms[DetectorID]->Fill(Depth); - - MDGridPoint GP = Detector->GetGridPoint(Vec); - // int XStrip = GP.GetXGrid() + 1; - // int YStrip = GP.GetYGrid() + 1; - // int XStrip = 38 - (GP.GetXGrid() + 1); - // int YStrip = 38 - (GP.GetYGrid() + 1); - int XStrip = 38 - (GP.GetYGrid() + 1); - int YStrip = 38 - (GP.GetXGrid() + 1); - int PixelCode = (10000*DetectorID) + (100*XStrip) + YStrip; - int DivisionCode = PixelCodeToDivision(PixelCode, options->Divisions); - - //fill the division histograms - if(DivisionHistograms.count(DivisionCode) == 1){ - DivisionHistograms[DivisionCode]->Fill(Depth); - } else { - char name[32]; snprintf(name, sizeof name, "divdepth_%d", DivisionCode); - TH1D* H = new TH1D(name,name,100,0.0,DetectorThicknesses[DetectorID]); - H->Fill(Depth); - DivisionHistograms[DivisionCode] = H; - } - - //fill the division CTD templates - double Timing = m_DepthCalibrator->GetSpline(DetectorID,true)->Eval(Depth); - double Noise = RNG.Gaus(0,12.5/2.3548); - if(DivisionCTDs.count(DivisionCode) == 1){ - DivisionCTDs[DivisionCode]->Fill(Timing+Noise); - } else { - char name[32]; snprintf(name,sizeof name, "divctd_%d", DivisionCode); - TH1D* H = new TH1D(name, name, 240, -300.0, +300.0); - DivisionCTDs[DivisionCode] = H; - H->Fill(Timing+Noise); - } - } - } - } - ++counter; - if( (counter & 0xffff) == 0 ) cout << "num sim events: " << counter << endl; - delete simEvent; - } - - TFile* rootF = new TFile(options->SimulationOutputFilename,"recreate"); - for(int i = 0; i < 12; ++i){ - DepthHistograms[i]->SetStats(); - rootF->WriteTObject(DepthHistograms[i]); - } - vector DivisionCTDKeys; - for(auto const &it: DivisionCTDs) DivisionCTDKeys.push_back(it.first); - sort(DivisionCTDKeys.begin(),DivisionCTDKeys.end()); - for(size_t i = 0; i < DivisionCTDKeys.size(); ++i){ - TH1D* H = DivisionCTDs[DivisionCTDKeys[i]]; - H->SetStats(); - rootF->WriteTObject(H); - } - vector DivisionHistogramsKeys; - for(auto const &it: DivisionHistograms) DivisionHistogramsKeys.push_back(it.first); - sort(DivisionHistogramsKeys.begin(),DivisionHistogramsKeys.end()); - for(size_t i = 0; i < DivisionHistogramsKeys.size(); ++i){ - TH1D* H = DivisionHistograms[DivisionHistogramsKeys[i]]; - H->SetStats(); - rootF->WriteTObject(H); - } - rootF->Close(); - - - - - - } - - if( options->PerformFits ){ - /* - TFile* rootF_mctd = new TFile("data_ctd.root","READ"); - TFile* rootF_sctd = new TFile("sim_ctd.root","READ"); - */ - unordered_map TemplateMap; - TFile* rootF_mctd = new TFile(options->FitDataFile); - TFile* rootF_sctd = new TFile(options->FitSimFile); - if( rootF_mctd == NULL ){ - cout << "couldn't open measured CTD root file, exiting..." << endl; - return -1; - } - if( rootF_sctd == NULL ){ - cout << "couldn't open sim CTD root file, exiting..." << endl; - return -1; - } - FILE* fout = fopen("coeffs.txt","w"); - fprintf(fout,"#format is 1) pixel code (10000*det + 100*Xchannel + Ychannel) 2) stretch 3) offset 4) scale 5) chi2 reduced\n"); - TFile* rootF_fits = new TFile("fits.root","recreate"); - TF1* fitfunc = new TF1("ctd_fitfunc",ctd_template_fit_function,-300.0,+300.0,3); - fitfunc->SetParNames("stretch","offset","scale"); - for( unsigned int D = 0; D < 12; ++D ){ - /* - char det_name[8]; sprintf(det_name,"%d",D); - TH1D* ctd_template = (TH1D*)rootF_sctd->Get(det_name); - if(ctd_template == NULL){ - cout << "could not read CTD template for detector " << D << ", skipping this detector..." << endl; - continue; - } else { - Gctd = ctd_template; //set this globally so that the root fit function can see it - } - TF1* fitfunc = new TF1("ctd_fitfunc",ctd_template_fit_function,-300.0,+300.0,3); - fitfunc->SetParameters(1.0, 0.0, 1.0); // first param is stretch, second is offset, third is scale - fitfunc->SetParNames("stretch","offset","scale"); - int Ledge_bin, Redge_bin; FindEdgeBins(ctd_template, &Ledge_bin, &Redge_bin); - double max1_x = ctd_template->GetBinCenter(Ledge_bin); double max1 = ctd_template->GetBinContent(Ledge_bin); - double max2_x = ctd_template->GetBinCenter(Redge_bin); //double max2 = ctd_template->GetBinContent(Redge_bin); - */ - for( unsigned int Xch = 1; Xch <= 37; ++Xch ){ - for( unsigned int Ych = 1; Ych <= 37; ++Ych ){ - - //try to read the ctd - int pixel_code = 10000*D + 100*Xch + Ych; - char pixel_code_s[32]; sprintf(pixel_code_s,"%d",pixel_code); - TH1D* H = (TH1D*)rootF_mctd->Get(pixel_code_s); - - if( H == NULL ) continue; else { - - //set up the template - int division_code = PixelCodeToDivision(pixel_code, options->Divisions); - if(TemplateMap.count(division_code)){ - Gctd = TemplateMap[division_code]; - } else { - char division_name[32]; snprintf(division_name, sizeof division_name, "divctd_%d", division_code); - TH1D* ctd_template = (TH1D*)rootF_sctd->Get(division_name); - if(ctd_template == NULL){ - cout << "could not read CTD template for division " << division_code << ", skipping pixel" << pixel_code << endl; - continue; - } else { - if(options->FitRebinSimCTD >= 2) ctd_template->Rebin(options->FitRebinSimCTD); - DivisionTemplate* dt = new DivisionTemplate(); - dt->H = ctd_template; - int Ledge_bin, Redge_bin; FindEdgeBins(ctd_template, &Ledge_bin, &Redge_bin); - dt->max1_x = ctd_template->GetBinCenter(Ledge_bin); - dt->max2_x = ctd_template->GetBinCenter(Redge_bin); - dt->max1 = ctd_template->GetBinContent(Ledge_bin); - TemplateMap[division_code] = dt; - Gctd = dt; //set this globally so that the root fit function can see it - } - } - - if( H->GetEntries() < 200 ) continue; //histogram has too few counts - if(options->FitRebinDataCTD >= 2) H->Rebin(options->FitRebinDataCTD); - cout << "found pixel:" << pixel_code << ", starting fit..." << endl; - int Ledge_bin,Redge_bin; FindEdgeBins(H, &Ledge_bin, &Redge_bin); - double cmax1_x = H->GetBinCenter(Ledge_bin); double cmax1 = H->GetBinContent(Ledge_bin); - double cmax2_x = H->GetBinCenter(Redge_bin); //double cmax2 = H->GetBinContent(Redge_bin); - double stretch_guess = fabs(cmax1_x - cmax2_x)/fabs(Gctd->max1_x - Gctd->max2_x); - cout << "stretch guess: "<max1_x); - cout << "offset_guess: " << offset_guess << endl; - double scale_guess = cmax1/Gctd->max1; - cout << "scale_guess: " << scale_guess << endl; - fitfunc->SetParameters(stretch_guess, offset_guess, scale_guess); - H->Fit(fitfunc); - double* P; P = fitfunc->GetParameters(); - double chi = fitfunc->GetChisquare()/(H->GetNbinsX()-3.0); - fprintf(fout,"%d %f %f %f %f\n",pixel_code,P[0],P[1],P[2],chi); - char title[32]; snprintf(title, sizeof title, "%d-%d", pixel_code, division_code); - H->SetTitle(title); - H->SetStats(); - rootF_fits->WriteTObject(H); - } - delete H; - } - } - } - fclose(fout); - rootF_fits->Close(); - } - - cout << "DONE" << endl; - return 1; -} - -void FindEdgeBins(TH1D* H, int* L, int* R){ - - int i; - - H->SetAxisRange(-300.0,0.0); - double maxL = H->GetMaximum(); - for(i = 1; i <= H->GetNbinsX(); ++i){ - if( H->GetBinContent(i) >= (maxL/3.0) ) break; - } - *L = i; - - H->SetAxisRange(0.0,+300.0); - double maxR = H->GetMaximum(); - for(i = H->GetNbinsX(); i > 0; --i){ - if( H->GetBinContent(i) >= (maxR/3.0) ) break; - } - *R = i; - - H->SetAxisRange(-300.0,+300.0); - - return; - -} - -double ctd_template_fit_function(double* v, double* par){ - - double stretch = par[0]; - double offset = par[1]; - double scale = par[2]; - double x = v[0]; - TH1D* H = Gctd->H; //Gctd is current global ctd template - - //apply inverse stretch/offset to find the x value with respect to the original histogram bins - double x_0 = (x - offset)/stretch; - - //now find the two bin centers that bracket x - int bin1 = H->FindBin(x_0); - double x1 = H->GetBinCenter(bin1); - double y1 = H->GetBinContent(bin1); - int bin2; - if( x_0 <= x1 ) bin2 = bin1 - 1; else bin2 = bin1 + 1; - double x2 = H->GetBinCenter(bin2); - double y2 = H->GetBinContent(bin2); - - //transform x1 and x2 - x1 = x1*stretch + offset; x2 = x2*stretch + offset; - //transform y1 and y2 - y1 = y1*scale; y2 = y2*scale; - - //find slope and intercept of line connecting (x1,y1) and (x2,y2) - double m = (y2-y1)/(x2-x1); - double b = y1 - m*x1; - - return m*x + b; - -} - -bool EnergyFilter(double Energy, const vector>& EnergyWindows){ - - for(const auto it: EnergyWindows){ - if((Energy >= it[0]) && (Energy <= it[1])){ - return true; - } - } - - return false; -} - -MReadOutAssembly* RealizeSimEvent(MSimEvent* simEvent, MModuleEnergyCalibrationUniversal* Calibrator){ - - MReadOutAssembly* Event = new MReadOutAssembly(); - - for( unsigned int i = 0; i < simEvent->GetNHTs(); ++i ){ - - MSimHT* HT = simEvent->GetHTAt(i); - MDVolumeSequence* VS = HT->GetVolumeSequence(); - MDDetector* Detector = VS->GetDetector(); - MString DetectorName = Detector->GetName(); - if(!DetectorName.BeginsWith("Detector")){ //shield hit - //delete Event; - //return NULL; - continue; - } - DetectorName.RemoveAllInPlace("Detector"); - int DetectorID = DetectorName.ToInt(); - - MDEEStripHit pSide; - MDEEStripHit nSide; - - pSide.m_ROE.IsLowVoltageStrip(true); - nSide.m_ROE.IsLowVoltageStrip(false); - - // Convert detector name in detector ID - pSide.m_ROE.SetDetectorID(DetectorID); - nSide.m_ROE.SetDetectorID(DetectorID); - - // Convert position into - MVector PositionInDetector = VS->GetPositionInSensitiveVolume(); - MDGridPoint GP = Detector->GetGridPoint(PositionInDetector); - double Depth = PositionInDetector.GetZ(); - //carolyn says -0.75 is the high voltage side - //i need to map this so that +1.5 is the high voltage side, WRT to charge transport stuff - Depth = -(Depth - DetectorThicknesses[DetectorID]/2.0); - - // Not sure about if p or n-side is up, but we can debug this later - pSide.m_ROE.SetStripID(GP.GetXGrid()+1); - nSide.m_ROE.SetStripID(GP.GetYGrid()+1); - int xID = pSide.m_ROE.GetStripID(); - int yID = nSide.m_ROE.GetStripID(); - - pSide.m_Energy = HT->GetEnergy(); - nSide.m_Energy = HT->GetEnergy(); - double HTEnergy = HT->GetEnergy(); - - // pSide.m_Position = PositionInDetector; - // nSide.m_Position = PositionInDetector; - - //at this point we have enough info to generate the strip hits - MStripHit_s* XStrip = new MStripHit_s(); - MStripHit_s* YStrip = new MStripHit_s(); - XStrip->SetDetectorID(DetectorID); YStrip->SetDetectorID(DetectorID); - XStrip->SetTiming(0.0); YStrip->SetTiming(0.0); - XStrip->IsLowVoltageStrip(true); YStrip->IsLowVoltageStrip(false); - XStrip->SetStripID(xID); YStrip->SetStripID(yID); - XStrip->SetEnergy(HTEnergy); YStrip->SetEnergy(HTEnergy); - double XEnRes = Calibrator->LookupEnergyResolution( XStrip, HTEnergy ); XStrip->SetEnergyResolution(XEnRes); - double YEnRes = Calibrator->LookupEnergyResolution( YStrip, HTEnergy ); YStrip->SetEnergyResolution(YEnRes); - XStrip->SetDepth( Depth ); YStrip->SetDepth( Depth ); - Event->AddStripHit( (MStripHit*)XStrip ); Event->AddStripHit( (MStripHit*)YStrip ); - - } - - return Event; - -} - -int PixelCodeToDivision(int PixelCode, int Divisions){ - int d = PixelCode/10000; - int y = PixelCode % 100; - int x = ((PixelCode % 10000) - y)/100; - y--; //map strips into range 0 - 36 - x--; - int xd = x/(36/Divisions); - if(xd >= Divisions) xd = Divisions - 1; - int yd = y/(36/Divisions); - if(yd >= Divisions) yd = Divisions - 1; - //return (d*1000) + (xd + 1)*(yd + 1); - return (d*1000) + (xd * Divisions) + yd; -} diff --git a/apps/depth_scan_calibrator.cxx b/apps/depth_scan_calibrator.cxx deleted file mode 100644 index 1e788bd9..00000000 --- a/apps/depth_scan_calibrator.cxx +++ /dev/null @@ -1,504 +0,0 @@ -//plan: -//-input file contains filenames for scans -//-for each input file, get the position and integration time from filename -//-open file, loop through readout assemblys -//-don't need strip pairing -//-DO probably want cross-talk correction -//-check for number of strip hits on each side, for use 1x1 and also maybe 1x2 and 2x1 if the sharing isn't strong - -// Standard -#include -#include -#include -#include -#include -#include -#include -#include -using namespace std; - -// ROOT -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -// MEGAlib -#include "MGlobal.h" -#include "MFile.h" -#include "MReadOutElementDoubleStrip.h" -#include "MFileReadOuts.h" -#include "MReadOutAssembly.h" -#include "MStripHit.h" -#include "MReadOutSequence.h" -#include "MSupervisor.h" -#include "MModuleLoaderMeasurementsROA.h" -#include "MModuleEnergyCalibrationUniversal.h" -#include "MModuleStripPairingGreedy.h" -#include "MAssembly.h" -#include "MFileEventsSim.h" -#include "MDGeometryQuest.h" -#include "MModuleLoaderMeasurementsBinary.h" -#include "MBinaryFlightDataParser.h" -#include "MFitFunctions.h" - -class options{ - public: - vector*> EnergyWindows; - vector GraphPixel; - bool Use2StripEvents; - bool Use3StripEvents; - bool Use4StripEvents; - bool Use5nsBinning; - unordered_map UseDetectors; -}; - - -//prototypes: -bool EnergyOK(double XE, double YE, options* Op); -bool ParseOptions(MString OptionsFileName, options* Op); - -int main(int argc, char * argv[]){ - - - //arg1 is file containing filenames - //if arg2 is there, it is options file - - MGlobal::Initialize("Standalone",""); - TApplication dcalscan("dcalscan",0,0); - options* Options = new options(); - gStyle->SetOptFit(1); - gROOT->SetBatch(kTRUE); - - bool UseDefaults = false; - if(argc == 2){ - UseDefaults = true; - } else if(argc == 3){ - bool ParseSuccess = ParseOptions(MString(argv[2]), Options); - if(ParseSuccess == false){ - UseDefaults = true; - delete Options; - Options = new options(); - } - } else { - cout << "first parameter is scan file names, second optional parameter is option file, aborting..." <* v = new vector(); - v->push_back(350.0); v->push_back(477.0); - Options->EnergyWindows.push_back(v); - v = new vector(); - v->push_back(656.0); v->push_back(668.0); - Options->EnergyWindows.push_back(v); - - Options->Use2StripEvents = true; - Options->Use3StripEvents = true; - Options->Use4StripEvents = true; - Options->Use5nsBinning = false; - for(int i = 0; i < 12; ++i){ - Options->UseDetectors[i] = true; - } - } - - cout << boolalpha << endl; - cout << ">>>>>>>>>>>>>>>>>>Options>>>>>>>>>>>>>>>>>>>>>>>>" << endl; - cout << "Use2StripEvents " << Options->Use2StripEvents << endl; - cout << "Use3StripEvents " << Options->Use3StripEvents << endl; - cout << "Use4StripEvents " << Options->Use4StripEvents << endl; - cout << "Use5nsBinning " << Options->Use5nsBinning << endl; - for(const auto v: Options->EnergyWindows){ - cout << "Energy window: " << v->at(0) << " to " << v->at(1) << " keV" << endl; - } - for(const auto d: Options->UseDetectors){ - cout << "Use Detector: " << d.first << endl; - } - for(const auto i: Options->GraphPixel){ - cout << "Make graph for pixel: " << i << endl; - } - cout << "<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<" << endl; - - - - MFile Filenames; Filenames.Open(MString(argv[1])); - MString FName; - MModuleLoaderMeasurementsBinary* Loader = new MModuleLoaderMeasurementsBinary(); - MModuleEnergyCalibrationUniversal* EnergyCalibrator = new MModuleEnergyCalibrationUniversal(); - EnergyCalibrator->SetFileName("$(NUCLEARIZER)/resource/calibration/COSI16/Berkeley/EnergyCalibration.ecal"); - - //define gaussian fit function and set parameter limits - TF1* GausFit = new TF1("mygaus", "[0]*TMath::Gaus(x,[1],[2],0)", -300.0, +300.0); - TF1* LorentzFit = new TF1("lorentz", "[0]*TMath::CauchyDist(x,[1],[2])", -300.0, +300.0); - GausFit->SetParName(0,"amplitude"); - GausFit->SetParName(1,"mean"); - GausFit->SetParName(2,"sigma"); - GausFit->SetParLimits(0, 0.0, 10000.0); - GausFit->SetParLimits(1, -300.0, +300.0); - GausFit->SetParLimits(2, 0.0, 100.0); - LorentzFit->SetParName(0,"amplitude"); - LorentzFit->SetParName(1,"mean"); - LorentzFit->SetParName(2,"sigma"); - LorentzFit->SetParLimits(1,-300.0,+300.0); - LorentzFit->SetParLimits(2,-300.0,+300.0); - - TF1* AsymmetricalGauss = new TF1("asymgaus",AsymGaus,-300,+300,5); - AsymmetricalGauss->SetParName(0,"offset"); - AsymmetricalGauss->SetParName(1,"height"); - AsymmetricalGauss->SetParName(2,"mean"); - AsymmetricalGauss->SetParName(3,"left-sigma"); - AsymmetricalGauss->SetParName(4,"right-sigma"); - - vector*>*> ParMaps; - - //crosstalk... - while( Filenames.ReadLine(FName) ){ - //set up the nuclearizer modules we need - Loader->SetFileName(FName); - Loader->SetDataSelectionMode(MBinaryFlightDataParserDataModes::c_Raw); - Loader->SetAspectMode(MBinaryFlightDataParserAspectModes::c_Neither); - Loader->EnableCoincidenceMerging(false); - - cout << "initializing modules for FName = " << FName.GetString() << "... "; - if( Loader->Initialize() == false){ - cout << "error initializing data loader... continuing" << endl; - continue; - } - if( EnergyCalibrator->Initialize() == false){ - cout << "error initializing energy calibrator... continuing" << endl; - continue; - } - cout << "done" << endl; - - MReadOutAssembly* Event = new MReadOutAssembly(); - bool IsFinished = false; - map CTDHistograms; - map*>* FitParams = new map*>(); - - unsigned int E2 = 0; unsigned int E3 = 0; unsigned int E4 = 0; unsigned int EMisc = 0; - - while( IsFinished == false ){ - Event->Clear(); - if( Loader->IsReady() ){ - Loader->AnalyzeEvent(Event); - EnergyCalibrator->AnalyzeEvent(Event); - //crosstalk - - vector XSH; vector YSH; - for(size_t i = 0; i < Event->GetNStripHits(); ++i){ - MStripHit* SH = Event->GetStripHit(i); - if(SH->IsLowVoltageStrip()) XSH.push_back(SH); else YSH.push_back(SH); - } - - int event_type = 0; - double CTD = 0.0; - int pixel_code = 0xffffffff; - - if( (XSH.size() == 1) && (YSH.size() == 1) ){ - if( Options->Use2StripEvents ){ - MStripHit* X = XSH.at(0); - MStripHit* Y = YSH.at(0); - if( EnergyOK(X->GetEnergy(), Y->GetEnergy(), Options) ){ - event_type |= 1; - CTD = X->GetTiming() - Y->GetTiming(); - pixel_code = 10000*X->GetDetectorID() + 100*X->GetStripID() + Y->GetStripID(); - ++E2; - } - } - } else if( ((XSH.size() == 2) && (YSH.size() == 1)) || ((XSH.size() == 1) && (YSH.size() == 2)) ){ - if( Options->Use3StripEvents ){ - vector *TwoStripSide, *OneStripSide; - bool EnergyIsOk = false; - - if(XSH.size() == 2){ - TwoStripSide = &XSH; - OneStripSide = &YSH; - EnergyIsOk = EnergyOK(XSH.at(0)->GetEnergy() + XSH.at(1)->GetEnergy(), YSH.at(0)->GetEnergy(), Options); - } else { - TwoStripSide = &YSH; - OneStripSide = &XSH; - EnergyIsOk = EnergyOK(XSH.at(0)->GetEnergy(), YSH.at(0)->GetEnergy() + YSH.at(1)->GetEnergy(), Options); - } - - if( EnergyIsOk && (abs(TwoStripSide->at(0)->GetStripID() - TwoStripSide->at(1)->GetStripID()) == 1) ){ - MStripHit* DominantStrip; - if(TwoStripSide->at(0)->GetEnergy() >= TwoStripSide->at(1)->GetEnergy()) DominantStrip = TwoStripSide->at(0); else DominantStrip = TwoStripSide->at(1); - event_type |= 2; - if(TwoStripSide == &XSH){ - pixel_code = 10000*DominantStrip->GetDetectorID() + 100*DominantStrip->GetStripID() + OneStripSide->at(0)->GetStripID(); - CTD = DominantStrip->GetTiming() - OneStripSide->at(0)->GetTiming(); - } else { - pixel_code = 10000*DominantStrip->GetDetectorID() + 100*OneStripSide->at(0)->GetStripID() + DominantStrip->GetStripID(); - CTD = OneStripSide->at(0)->GetTiming() - DominantStrip->GetTiming(); - } - ++E3; - } - } - } else if( (XSH.size() == 2) && (YSH.size() == 2) ){ - if( Options->Use4StripEvents ){ - bool XNeighbors = abs(XSH.at(0)->GetStripID() - XSH.at(1)->GetStripID()) == 1; - bool YNeighbors = abs(YSH.at(0)->GetStripID() - YSH.at(1)->GetStripID()) == 1; - bool EnergyIsOk = EnergyOK(XSH.at(0)->GetEnergy() + XSH.at(1)->GetEnergy(), YSH.at(0)->GetEnergy() + YSH.at(1)->GetEnergy(), Options); - if( XNeighbors && YNeighbors && EnergyIsOk ){ - MStripHit *X, *Y; - if(XSH.at(0)->GetEnergy() >= XSH.at(1)->GetEnergy()) X = XSH.at(0); else X = XSH.at(1); - if(YSH.at(0)->GetEnergy() >= YSH.at(1)->GetEnergy()) Y = YSH.at(0); else Y = YSH.at(1); - event_type |= 4; - CTD = X->GetTiming() - Y->GetTiming(); - pixel_code = 10000*X->GetDetectorID() + 100*X->GetStripID() + Y->GetStripID(); - ++E4; - } - } - } else { - ++EMisc; - } - - - if(event_type > 0){ - if( Options->UseDetectors.count(pixel_code/10000) ){ - if( CTDHistograms.count(pixel_code) == 0 ){ - char name[64]; sprintf(name,"%d",pixel_code); - TH1D* new_hist; - if( Options->Use5nsBinning == true ){ - new_hist = new TH1D(name, name, 120,(-300.0)-2.5, (+300.0)-2.5); - } else { - //new_hist = new TH1D(name, name, 60, (-300.0)-5.0, (+300.0)-5.0); - new_hist = new TH1D(name, name, 37, (-230.0)-5.0, (+140.0)-5.0); - } - - CTDHistograms[pixel_code] = new_hist; - } - CTDHistograms[pixel_code]->Fill(CTD); - } - } - } - - IsFinished = Loader->IsFinished(); - - } - - MString RootFileName = FName.Append(".ctd.root"); - TFile* rootF = new TFile(RootFileName.Data(),"recreate"); - for(auto const &it: CTDHistograms) { - //vector* V = new vector(6); - vector* V = new vector(6); - TH1D* H = it.second; - double Maximum = H->GetMaximum(); - double Mean = H->GetMean(); - double Sigma = H->GetMeanError(); - GausFit->SetParameter(0,Maximum); - GausFit->SetParameter(1,Mean); - GausFit->SetParameter(2,Sigma); - LorentzFit->SetParameter(0,Maximum); - LorentzFit->SetParameter(1,Mean); - LorentzFit->SetParameter(2,Sigma); - AsymmetricalGauss->SetParLimits(0,0.0, Maximum); - AsymmetricalGauss->SetParLimits(1,0.0, 1.2*Maximum); - AsymmetricalGauss->SetParLimits(2,-300.0,+300.0); - AsymmetricalGauss->SetParLimits(3,1, 100); - AsymmetricalGauss->SetParLimits(4,1,100); - AsymmetricalGauss->SetParameter(0,0.0); - AsymmetricalGauss->SetParameter(1,Maximum); - AsymmetricalGauss->SetParameter(2,Mean); - AsymmetricalGauss->SetParameter(3,Sigma); - AsymmetricalGauss->SetParameter(4,Sigma); - //H->Fit(GausFit,"Lq"); - //H->Fit(LorentzFit,"Lq"); - H->Fit(AsymmetricalGauss,"Lq"); - H->UseCurrentStyle(); - (*V)[0] = LorentzFit->GetParameter(1); (*V)[1] = LorentzFit->GetParError(1); - //(*V)[2] = GausFit->GetParameter(1); (*V)[3] = GausFit->GetParError(1); - (*V)[4] = Mean; (*V)[5] = Sigma; - (*V)[2] = AsymmetricalGauss->GetParameter(2); (*V)[3] = AsymmetricalGauss->GetParError(2); - (*FitParams)[it.first] = V; - rootF->WriteTObject(it.second); - delete H; - } - rootF->Close(); - cout << "2-strip events: " << E2 << endl; - cout << "3-strip events: " << E3 << endl; - cout << "4-strip events: " << E4 << endl; - cout << "misc. events: " << EMisc << endl; - ParMaps.push_back(FitParams); - - - } - - TFile* rootF = new TFile("pixel_plots.root","recreate"); - for(int det = 0; det < 12; ++det){ - for(int xch = 1; xch < 38; ++xch){ - for(int ych = 1; ych < 38; ++ych){ - int pixel = 10000*det + 100*xch + ych; - bool HaveData = false; - for(auto const parmap: ParMaps){ - if((*parmap).count(pixel)){ - HaveData = true; - break; - } - } - if(HaveData){ - //make the graph - vector X; - vector Y_lorentz, Y_gauss, Y_standard; - vector EX; - vector EY_lorentz, EY_gauss, EY_standard; - int x_ind = 0; - for(auto const parmap: ParMaps){ - if((*parmap).count(pixel)){ - vector* values = (*parmap)[pixel]; - X.push_back((double)x_ind); ++x_ind; - EX.push_back(0.0); - Y_lorentz.push_back((*values)[0]); - EY_lorentz.push_back((*values)[1]); - Y_gauss.push_back((*values)[2]); - EY_gauss.push_back((*values)[3]); - Y_standard.push_back((*values)[4]); - EY_standard.push_back((*values)[5]); - } - } - char name[64]; sprintf(name, "%d", pixel); - TCanvas* tc = new TCanvas(name,name,400,400); - //tc->Divide(1,3); - TMultiGraph* mg = new TMultiGraph(); - - /* - sprintf(name,"%d-lorentz",pixel); - TGraphErrors* tg_lorentz = new TGraphErrors(X.size(), (double *) &X[0], (double *) &Y_lorentz[0], (double *) &EX[0], (double *) &EY_lorentz[0]); - tg_lorentz->SetLineColor(kRed); - tg_lorentz->SetMarkerStyle(21); - tg_lorentz->SetTitle(name); - //tg_lorentz->Draw("ALP"); - mg->Add(tg_lorentz); - */ - - sprintf(name,"%d-gauss",pixel); - TGraphErrors* tg_gauss = new TGraphErrors(X.size(), (double *) &X[0], (double *) &Y_gauss[0], (double *) &EX[0], (double *) &EY_gauss[0]); - tg_gauss->SetLineColor(kBlue); - tg_gauss->SetMarkerStyle(21); - tg_gauss->SetTitle(name); - //tg_gauss->Draw("ALP"); - mg->Add(tg_gauss); - - /* - sprintf(name,"%d-standard",pixel); - TGraphErrors* tg_standard = new TGraphErrors(X.size(), (double *) &X[0], (double *) &Y_standard[0], (double *) &EX[0], (double *) &EY_standard[0]); - tg_standard->SetMarkerStyle(21); - tg_standard->SetTitle(name); - //tg_standard->Draw("ALP"); - mg->Add(tg_standard); - */ - - mg->Draw("ALP"); - tc->BuildLegend(0.2,0.67,0.45,0.88); - tc->Update(); - rootF->WriteTObject(tc); - } else { - continue; - } - } - } - } - rootF->Close(); - - return 0; - -} - -bool EnergyOK(double XE, double YE, options* Op){ - if( fabs(XE - YE) > 30.0 ){ - return false; - } - - double AvgEnergy = (XE + YE)/2.0; - - for(auto EW: Op->EnergyWindows){ - if( (AvgEnergy >= EW->at(0)) && (AvgEnergy <= EW->at(1)) ){ - return true; - } - } - - return false; - -} - -bool ParseOptions(MString OptionsFileName, options* Options){ - - MFile OptionsFile; - bool IsOpen = OptionsFile.Open(OptionsFileName); - - if(IsOpen == false){ - return false; - } - - MString Line; - while( OptionsFile.ReadLine(Line) ){ - if( Line.BeginsWith("Use2StripEvents") ){ - if( Line.Contains("true") ){ - Options->Use2StripEvents = true; - } else { - Options->Use2StripEvents = false; - } - } else if( Line.BeginsWith("Use3StripEvents") ){ - if( Line.Contains("true") ){ - Options->Use3StripEvents = true; - } else { - Options->Use3StripEvents = false; - } - } else if( Line.BeginsWith("Use4StripEvents") ){ - if( Line.Contains("true") ){ - Options->Use4StripEvents = true; - } else { - Options->Use4StripEvents = false; - } - } else if( Line.BeginsWith("Use5nsBinning") ){ - if( Line.Contains("true") ){ - Options->Use5nsBinning = true; - } else { - Options->Use5nsBinning = false; - } - } else if( Line.BeginsWith("EnergyWindow") ){ - //add an energy window - vector Tokens = Line.Tokenize(" "); - if( Tokens.size() == 3){ - vector* v = new vector(); - v->push_back(Tokens[1].ToDouble()); - v->push_back(Tokens[2].ToDouble()); - Options->EnergyWindows.push_back(v); - } else { - cout << "ParseOptions(): error parsing energy window, ignoring..." << endl; - } - } else if( Line.BeginsWith("UseDetector") ){ - vector Tokens = Line.Tokenize(" "); - if(Tokens.size() == 2){ - int DetectorID = Tokens[1].ToInt(); - if( (DetectorID >= 0) && (DetectorID < 12) ){ - Options->UseDetectors[DetectorID] = true; - } else { - cout << "ParseOptions(): invalid detector ID: " << DetectorID << " ignoring..." << endl; - } - } else { - cout << "ParseOptions(): parsing error for option UseDetector, ignoring..." << endl; - } - } else if( Line.BeginsWith("GraphPixel")){ - vector Tokens = Line.Tokenize(" "); - if(Tokens.size() == 2){ - int Pixel = Tokens[1].ToInt(); - Options->GraphPixel.push_back(Pixel); - } - } - } - - return true; -} - diff --git a/apps/pnGraphs.cxx b/apps/pnGraphs.cxx deleted file mode 100644 index e0b358a6..00000000 --- a/apps/pnGraphs.cxx +++ /dev/null @@ -1,466 +0,0 @@ -/* - * pnGraphs.cxx - * - * - * Copyright (C) by Andreas Zoglauer. - * All rights reserved. - * - * - * This code implementation is the intellectual property of - * Andreas Zoglauer. - * - * By copying, distributing or modifying the Program (or any work - * based on the Program) you indicate your acceptance of this statement, - * and all its terms. - * - */ - -// Standard -#include -#include -#include -#include -#include -#include -using namespace std; - -// ROOT -#include -#include -#include -#include -#include -#include -#include -#include -#include - -// MEGAlib -#include "MGlobal.h" -#include "MFile.h" -#include "MReadOutElementDoubleStrip.h" -#include "MFileReadOuts.h" -#include "MReadOutAssembly.h" -#include "MStripHit.h" -#include "MReadOutSequence.h" -#include "MSupervisor.h" -#include "MModuleLoaderMeasurementsROA.h" -#include "MModuleEnergyCalibrationUniversal.h" -#include "MModuleStripPairingGreedy.h" -#include "MAssembly.h" -#include "MModuleLoaderMeasurementsBinary.h" - -//////////////////////////////////////////////////////////////////////////////// - - -//! A standalone program based on MEGAlib and ROOT -class pnGraphs -{ -public: - //! Default constructor - pnGraphs(); - //! Default destructor - ~pnGraphs(); - - //! Parse the command line - bool ParseCommandLine(int argc, char** argv); - //! Analyze what eveer needs to be analyzed... - bool Analyze(); - //! Interrupt the analysis - void Interrupt() { m_Interrupt = true; } - - -private: - //! True, if the analysis needs to be interrupted - bool m_Interrupt; - //! The input file name - MString m_FileName; - //! side: 1 for p, 0 for n - bool m_Side; - //! 1 for detectors, 0 for strips - bool m_DetOp; - //! detector ID - unsigned int m_DetID; - //! output file names - MString m_OutFile; - -}; - - -//////////////////////////////////////////////////////////////////////////////// - - -//! Default constructor -pnGraphs::pnGraphs() : m_Interrupt(false) -{ - gStyle->SetPalette(1, 0); -} - - -//////////////////////////////////////////////////////////////////////////////// - - -//! Default destructor -pnGraphs::~pnGraphs() -{ - // Intentionally left blank -} - - -//////////////////////////////////////////////////////////////////////////////// - - -//! Parse the command line -bool pnGraphs::ParseCommandLine(int argc, char** argv) -{ - ostringstream Usage; - Usage<"< i+1) && - (argv[i+1][0] != '-' || isalpha(argv[i+1][1]) == 0))){ - cout<<"Error: Option "< i+2) && - (argv[i+1][0] != '-' || isalpha(argv[i+1][1]) == 0) && - (argv[i+2][0] != '-' || isalpha(argv[i+2][1]) == 0))){ - cout<<"Error: Option "<= 0){ - m_DetID = atoi(argv[i+1]); - } - else { - cout << "Error: detector must be between 0 and 12" << endl; - cout << Usage.str() << endl; - return false; - } - //get side - if (string(argv[i+2]) == "n"){ - m_Side = 0; - } - else if (string(argv[i+2]) == "p"){ - m_Side = 1; - } - else { - cout << "Error: side must be n or p" << endl; - cout << Usage.str() << endl; - return false; - } - } - - if (Option == "-d"){ - m_DetOp = 1; - } - - if (Option == "-o"){ - m_OutFile = string(argv[i+1]); - } - - - } - - return true; -} - - -//////////////////////////////////////////////////////////////////////////////// - - -//! Do whatever analysis is necessary -bool pnGraphs::Analyze() -{ - //time code just to see - TStopwatch watch; - watch.Start(); - - if (m_Interrupt == true) return false; - - MSupervisor* S = MSupervisor::GetSupervisor(); - - MModuleLoaderMeasurementsROA* Loader = new MModuleLoaderMeasurementsROA(); - Loader->SetFileName(m_FileName); - S->SetModule(Loader, 0); - - MModuleEnergyCalibrationUniversal* Calibrator = new MModuleEnergyCalibrationUniversal(); - Calibrator->SetFileName("$(NUCLEARIZER)/resource/calibration/COSI14/EnergyCalibration.ecal"); - S->SetModule(Calibrator, 1); - - MModuleStripPairingGreedy* Pairing = new MModuleStripPairingGreedy(); - S->SetModule(Pairing, 2); - - MModuleLoaderMeasurementsBinary* MLB = new MModuleLoaderMeasurementsBinary(); - MLB->Initialize(); - - if (Loader->Initialize() == false) return false; - if (Calibrator->Initialize() == false) return false; - if (Pairing->Initialize() == false) return false; - - map Histograms; - - - bool IsFinished = false; - MReadOutAssembly* Event = new MReadOutAssembly(); - while (IsFinished == false && m_Interrupt == false) { - Event->Clear(); - Loader->AnalyzeEvent(Event); - Calibrator->AnalyzeEvent(Event); - Pairing->AnalyzeEvent(Event); - - if (Event->HasAnalysisProgress(MAssembly::c_StripPairing) == true) { - if (m_DetOp) { - for (unsigned int h = 0; h < Event->GetNHits(); ++h) { - int pNStrips = 0; - double pEnergy = 0.0; - int nNStrips = 0; - double nEnergy = 0.0; - - int DetectorID = 0; - for (unsigned int s = 0; s < Event->GetHit(h)->GetNStripHits(); ++s) { - DetectorID = Event->GetHit(h)->GetStripHit(s)->GetDetectorID(); - if (Event->GetHit(h)->GetStripHit(s)->IsLowVoltageStrip() == true) { - ++pNStrips; - pEnergy += Event->GetHit(h)->GetStripHit(s)->GetEnergy(); - } else { - ++nNStrips; - nEnergy += Event->GetHit(h)->GetStripHit(s)->GetEnergy(); - } - } - if (pNStrips > 0 && nNStrips > 0) { - if (Histograms[DetectorID] == 0) { - TH2D* Hist = new TH2D("", MString("Detector ") + DetectorID, 1400, 0, 1400, 1400, 0, 1400); - Hist->SetXTitle("p-Side Energy [keV]"); - Hist->SetYTitle("n-Side Energy [keV]"); - Histograms[DetectorID] = Hist; - } - Histograms[DetectorID]->Fill(pEnergy, nEnergy); - } - } - } - - - else { - unsigned int nStrips = 37; - unsigned int detectorID = 0; - unsigned int stripID = 0; - //currently just making plots for 1 detector, x strips - for (unsigned int strip=1; strip<=nStrips; strip++){ - int pNStrips = 0; - double pEnergy = 0.0; - int nNStrips = 0; - double nEnergy = 0.0; - - bool addHitToHist = false; - - for (unsigned int h=0; hGetNHits(); h++){ - for (unsigned int s=0; sGetHit(h)->GetNStripHits(); s++){ - detectorID = Event->GetHit(h)->GetStripHit(s)->GetDetectorID(); - if (Event->GetHit(h)->GetStripHit(s)->IsLowVoltageStrip()){ - if (m_Side == 1){ - stripID = Event->GetHit(h)->GetStripHit(s)->GetStripID(); - if (stripID == strip && m_DetID == detectorID){ - addHitToHist = true; - } - } - ++pNStrips; - pEnergy += Event->GetHit(h)->GetStripHit(s)->GetEnergy(); - } - else { - if (m_Side == 0){ - stripID = Event->GetHit(h)->GetStripHit(s)->GetStripID(); - if (stripID == strip && m_DetID == detectorID){ - addHitToHist = true; - } - } - ++nNStrips; - nEnergy += Event->GetHit(h)->GetStripHit(s)->GetEnergy(); - } - } - if (pNStrips>0 && nNStrips>0 && addHitToHist == true){ - //histogram stuff - if (Histograms[strip] == 0) { - MString histTitle; - if (m_Side == 1){ - histTitle = MString("Detector ")+detectorID+MString(", p Strip ")+strip; - } - else { - histTitle = MString("Detector ")+detectorID+MString(", n Strip ")+strip; - } - TH2D* Hist = new TH2D("", histTitle, 1400, 0, 1400, 1400, 0, 1400); - Hist->SetXTitle("p-Side Energy [keV]"); - Hist->SetYTitle("n-Side Energy [keV]"); - Histograms[strip] = Hist; - } - Histograms[strip]->Fill(pEnergy, nEnergy); - } - addHitToHist = false; - } - } - } - } - - IsFinished = Loader->IsFinished(); - } - - - //line where graph should be - double x_arr[700], y_arr[700]; - for (int i=0; i<700; i++){ - x_arr[i] = i*2; - y_arr[i] = i*2; - } - - TGraph *graph = new TGraph(700,x_arr,y_arr); - - if (m_DetOp){ - int i=0; - for (auto H: Histograms){ - TCanvas* C = new TCanvas(); - C->SetWindowSize(1000,1000); - C->SetLogz(); - C->cd(); - H.second->Draw("colz"); - graph->Draw("same"); - C->Update(); - C->Print(m_OutFile+MString("_")+i+MString(".pdf")); - i++; - } - } - else { - int numStrips = 37; - for (int H=1; H<=numStrips; H+=4){ - TCanvas* C = new TCanvas(); - C->Divide(2,2); - C->SetWindowSize(1000, 1000); -// C->SetLogz(); - int endStrip = H; - for (int i=0; i<4; i++){ - if (H+i <= numStrips){ - C->cd(i+1); - gPad->SetLogz(); - if (Histograms.find(H+i) != Histograms.end()){ - Histograms[H+i]->Draw("colz"); - endStrip = H+i; - } - C->Update(); - } - } - if (m_Side == true){ - C->Print(m_OutFile+MString("_Det")+m_DetID+MString("_pStrips_")+H+MString("-")+endStrip+MString(".pdf")); - } - else { - C->Print(m_OutFile+MString("_Det")+m_DetID+MString("_nStrips_")+H+MString("-")+endStrip+MString(".pdf")); - } - } - } - - watch.Stop(); - cout << "total time (s): " << watch.CpuTime() << endl; - - return true; -} - - -//////////////////////////////////////////////////////////////////////////////// - - -pnGraphs* g_Prg = 0; -int g_NInterruptCatches = 1; - - -//////////////////////////////////////////////////////////////////////////////// - - -//! Called when an interrupt signal is flagged -//! All catched signals lead to a well defined exit of the program -void CatchSignal(int a) -{ - if (g_Prg != 0 && g_NInterruptCatches-- > 0) { - cout<<"Catched signal Ctrl-C (ID="<Interrupt(); - } else { - abort(); - } -} - - -//////////////////////////////////////////////////////////////////////////////// - - -//! Main program -int main(int argc, char** argv) -{ - // Catch a user interupt for graceful shutdown - signal(SIGINT, CatchSignal); - - // Initialize global MEGALIB variables, especially mgui, etc. - MGlobal::Initialize("Standalone", "a standalone example program"); - - TApplication pnGraphsApp("pnGraphsApp", 0, 0); - - g_Prg = new pnGraphs(); - - if (g_Prg->ParseCommandLine(argc, argv) == false) { - cerr<<"Error during parsing of command line!"<Analyze() == false) { - cerr<<"Error during analysis!"< -#include -#include -#include -#include -#include -#include -#include -#include -using namespace std; - -// ROOT -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -// MEGAlib -#include "MGlobal.h" -#include "MFile.h" -#include "MReadOutElementDoubleStrip.h" -#include "MFileReadOuts.h" -#include "MReadOutAssembly.h" -#include "MStripHit.h" -#include "MReadOutSequence.h" -#include "MSupervisor.h" -#include "MModuleLoaderMeasurementsROA.h" -#include "MModuleEnergyCalibrationUniversal.h" -#include "MModuleStripPairingGreedy.h" -#include "MAssembly.h" -#include "MFileEventsSim.h" -#include "MDGeometryQuest.h" -#include "MDepthCalibrator.h" -#include "MModuleLoaderMeasurementsBinary.h" -#include "MBinaryFlightDataParser.h" - - -class Options -{ - public: - MString EnergyCalibrationFilename; - vector> EnergyWindows; - MString RawDataFilename; - bool TextOutput; - int PatternMapStripID; - Options(void){ - EnergyCalibrationFilename = "$NUCLEARIZER/resource/calibration/COSI16/Wanaka/EnergyCalibration_051016.ecal"; - RawDataFilename = ""; - TextOutput = false; - return; - PatternMapStripID = 26; - } - bool ParseOptionsFile(MString fname){ - MFile F; - if(!F.Open(fname)){ - return false; - } else { - MString line; - while(F.ReadLine(line)){ - vector Tokens = line.Tokenize(" "); - //cout << "line = " << line << endl; - if(line.BeginsWith("EnergyCalibrationFilename")){ - if(Tokens.size() == 2) EnergyCalibrationFilename = Tokens[1]; - } else if(line.BeginsWith("EnergyWindow")){ - if(Tokens.size() == 3){ - vector E; - E.push_back(Tokens[1].ToDouble()); - E.push_back(Tokens[2].ToDouble()); - EnergyWindows.push_back(E); - } - } else if(line.BeginsWith("RawDataFilename")){ - if(Tokens.size() == 2) RawDataFilename = Tokens[1]; - } else if(line.BeginsWith("TextOutput")){ - if(Tokens.size() == 2) Tokens[1].ToLower() == "true" ? TextOutput = true : TextOutput = false; - } else if(line.BeginsWith("PatternMapStripID")){ - if(Tokens.size() == 2) PatternMapStripID = Tokens[1].ToInt(); - cout << "Setting PatternMapStripID = " << PatternMapStripID << endl; - } else { - //cout << "BAD INPUT IN OPTIONS FILE: " << line << endl; - } - - } - F.Close(); - return true; - } - } -}; -Options* options = NULL; - - -bool SignalExit = false; -void Handler(int signo){ - SignalExit = true; -} -bool EnergyFilter(double Energy, const vector>& EnergyWindows); - -int main(int argc, char** argv) -{ - - signal(SIGINT, Handler); - MGlobal::Initialize("Standalone",""); - TApplication xyscan("xyscan",0,0); - MString InputRawFile; - - //parse input options file - if(argc < 2){ - cout << "please pass an options file as the only argument. exiting..." << endl; - return -1; - } else { - if(argc == 3){ - options = new Options(); - if(!options->ParseOptionsFile(MString(argv[2]))){ - cout << "error parsing options file, exiting..." << endl; - return -1; - } - } - InputRawFile = argv[1]; - - } - - //setup nuclearizer modules - MModuleEnergyCalibrationUniversal* Calibrator = new MModuleEnergyCalibrationUniversal(); - Calibrator->SetFileName(options->EnergyCalibrationFilename); - if (Calibrator->Initialize() == false){ - cout << "failed to initialize energy calibrator module, exiting..." << endl; - return false; - } - - unsigned int counter = 0; - MModuleLoaderMeasurementsBinary* Loader = new MModuleLoaderMeasurementsBinary(); - Loader->SetFileName(InputRawFile); - Loader->SetDataSelectionMode(MBinaryFlightDataParserDataModes::c_Raw); - Loader->SetAspectMode(MBinaryFlightDataParserAspectModes::c_Neither); - Loader->EnableCoincidenceMerging(false); - if (Loader->Initialize() == false) { - cout << "failed to initialize Loader module, exiting..." << endl; - return false; - } - - //open ROOT file and setup histograms - TFile* rootF = new TFile((MString(InputRawFile) + ".root").Data(),"recreate"); - - //set up histograms - TH1D* HTotal = new TH1D("HTotal","HTotal",37,(1 - 0.5),(37 + 0.5)); - unordered_map HdT; //time differences between energy collecting strip and all TOnly neighbors - unordered_map HdT_symm; //time difference between TOnly neighbors - unordered_map H; //just the raw timing values - for(int i = 1; i <= 37; ++i){ - char name[32]; snprintf(name,sizeof name,"dt_%d",i); - TH2D* h = new TH2D(name,name,7,(-3.0 - 0.5),(3.0 + 0.5),61,(0.0 - 2.5),(300.0 + 2.5)); - h->SetOption("colz"); - HdT[i] = h; - snprintf(name,sizeof name,"dtsym_%d",i); - h = new TH2D(name,name,7,(-3.0 - 0.5),(3.0 + 0.5),61,(-150.0 - 2.5),(+150.0 + 2.5)); - h->SetOption("colz"); - HdT_symm[i] = h; - snprintf(name,sizeof name,"t_%d",i); - h = new TH2D(name,name,7,(-3.0 - 0.5),(3.0 + 0.5),61,(0.0 - 2.5),(300.0 + 2.5)); - h->SetOption("colz"); - H[i] = h; - } - - //setup counters - unsigned int NEvents = 0; - unsigned int NEvents1Neighbor = 0; - unsigned int NEvents2Neighbor = 0; - unsigned int NEvents3Neighbor = 0; - unsigned int NEvents4Neighbor = 0; - unsigned int NEvents4PlusNeighbor = 0; - - //setup pattern record - map,unsigned int> PatternMap; - - - bool IsFinished = false; - MReadOutAssembly* Event = new MReadOutAssembly(); - FILE* fout = NULL; - if(options->TextOutput) fout = fopen("out.out","w"); - while (IsFinished == false) { - if(SignalExit){ - SignalExit = false; - cout << "exiting real data analysis" << endl; - break; - } - Event->Clear(); - if( Loader->IsReady() ){ - Loader->AnalyzeEvent(Event); - Calibrator->AnalyzeEvent(Event); - unsigned int NSH = Event->GetNStripHits(); - MStripHit *XSH, *YSH; - if(NSH == 2){ - if(Event->GetStripHit(0)->IsLowVoltageStrip()){ - if(!Event->GetStripHit(1)->IsLowVoltageStrip()){ - XSH = Event->GetStripHit(0); - YSH = Event->GetStripHit(1); - } else { - continue; - } - } else { - if(Event->GetStripHit(1)->IsLowVoltageStrip()){ - XSH = Event->GetStripHit(1); - YSH = Event->GetStripHit(0); - } else { - continue; - } - } - bool XEnergyGood = EnergyFilter(XSH->GetEnergy(), options->EnergyWindows); - bool YEnergyGood = EnergyFilter(YSH->GetEnergy(), options->EnergyWindows); - if(XEnergyGood && YEnergyGood){ - if(options->TextOutput){ - fprintf(fout,"ID %d\n",Event->GetID()); - size_t NTonly = Event->GetNStripHitsTOnly(); - fprintf(fout,"X %d:%d ---> ",XSH->GetStripID(),(int)XSH->GetTiming()); - for(int i = 0; i < NTonly; ++i){ - MStripHit* SH = Event->GetStripHitTOnly(i); - if(SH->IsLowVoltageStrip()) fprintf(fout,"%d:%d ",SH->GetStripID(),(int)SH->GetTiming()); - } - fprintf(fout,"\nY %d:%d ---> ", YSH->GetStripID(),(int)YSH->GetTiming()); - for(int i = 0; i < NTonly; ++i){ - MStripHit* SH = Event->GetStripHitTOnly(i); - if(!SH->IsLowVoltageStrip()) fprintf(fout,"%d:%d ",SH->GetStripID(),(int)SH->GetTiming()); - } - fprintf(fout,"\n"); - } - - //make map of TOnly strip hits on the X side - map TOnlyNeighbors; - for(int i = 0; i < Event->GetNStripHitsTOnly(); ++i){ - auto SH = Event->GetStripHitTOnly(i); - if(SH->IsLowVoltageStrip()){ - if(abs(SH->GetStripID() - XSH->GetStripID()) <= 3){ //keep in mind that sometimes we have more than one TOnly trigger on each side (like 4 neighboring strips) - TOnlyNeighbors[SH->GetStripID()] = SH; - } - } - } - - int XSH_id = XSH->GetStripID(); - - //store pattern - if(XSH_id == options->PatternMapStripID){ - vector Pattern; - for(const auto i: TOnlyNeighbors) Pattern.push_back(i.first - XSH_id); - if(PatternMap.count(Pattern)){ - ++PatternMap[Pattern]; - } else { - PatternMap[Pattern] = 1; - } - } - - - HTotal->Fill(XSH_id); - ++NEvents; - switch(TOnlyNeighbors.size()){ - case 0: - break; - case 1: - ++NEvents1Neighbor; - break; - case 2: - ++NEvents2Neighbor; - break; - case 3: - ++NEvents3Neighbor; - break; - case 4: - ++NEvents4Neighbor; - break; - default: - ++NEvents4PlusNeighbor; - } - - //loop over all TOnly, compute time difference with energy collecting strip, and add to HdT histogram. also fill in raw timing histogram - for(const auto p: TOnlyNeighbors){ - MStripHit* SH = p.second; - double dID = (double)(SH->GetStripID() - XSH_id); - double dt = XSH->GetTiming() - SH->GetTiming(); - HdT[XSH_id]->Fill(dID,dt); - H[XSH_id]->Fill(dID,SH->GetTiming()); - } - H[XSH_id]->Fill(0.0,XSH->GetTiming()); - - //loop over pairs of TOnly neighbors - for(int i = 1; i <= 3; ++i){ - if(TOnlyNeighbors.count(XSH_id + i)){ - if(TOnlyNeighbors.count(XSH_id - i)){ - auto RSH = TOnlyNeighbors[XSH_id + i]; - auto LSH = TOnlyNeighbors[XSH_id - i]; - HdT_symm[XSH_id]->Fill(i,RSH->GetTiming() - LSH->GetTiming()); - } - } - } - } - } - } - - ++counter; - if( (counter & 0xffff) == 0 ) cout << "num raw events: " << counter << endl; - IsFinished = Loader->IsFinished(); - } - - for(int i = 1; i <= 37; ++i){ - rootF->WriteTObject(HdT[i]); - rootF->WriteTObject(HdT_symm[i]); - rootF->WriteTObject(H[i]); - } - rootF->WriteTObject(HTotal); - rootF->Close(); - - if(options->TextOutput) fclose(fout); - unsigned int NEventsWithNeighbors = NEvents1Neighbor + NEvents2Neighbor + NEvents3Neighbor + NEvents4Neighbor + NEvents4PlusNeighbor; - cout << "Counters summary" << endl; - cout << "NEvents = " << NEvents << endl; - cout << "NEventsWithNeighbors = " << NEventsWithNeighbors << endl; - cout << "Percentage of total events that had at least one TOnly neighbor = " << ((double)NEventsWithNeighbors/(double)NEvents)*100.0 << " %" << endl; - cout << "NEvents1Neighbor = " << NEvents1Neighbor << " (" << ((double)NEvents1Neighbor/(double)NEventsWithNeighbors)*100.0 << " %)" << endl; - cout << "NEvents2Neighbor = " << NEvents2Neighbor << " (" << ((double)NEvents2Neighbor/(double)NEventsWithNeighbors)*100.0 << " %)" << endl; - cout << "NEvents3Neighbor = " << NEvents3Neighbor << " (" << ((double)NEvents3Neighbor/(double)NEventsWithNeighbors)*100.0 << " %)" << endl; - cout << "NEvents4Neighbor = " << NEvents4Neighbor << " (" << ((double)NEvents4Neighbor/(double)NEventsWithNeighbors)*100.0 << " %)" << endl; - cout << "NEvents4PlusNeighbor = " << NEvents4PlusNeighbor << " (" << ((double)NEvents4PlusNeighbor/(double)NEventsWithNeighbors)*100.0 << " %)" << endl; - - map> PatternMapInv; - for(const auto i: PatternMap) PatternMapInv[i.second] = i.first; - for(const auto i: PatternMapInv){ - cout << "PN " << i.first << " ("; - for(const auto j:i.second){ - cout << j << ","; - } - cout << ")" << endl; - } - - - - return 1; -} - -bool EnergyFilter(double Energy, const vector>& EnergyWindows){ - - for(const auto it: EnergyWindows){ - if((Energy >= it[0]) && (Energy <= it[1])){ - return true; - } - } - - return false; -} - diff --git a/include/GCUHousekeepingParser.h b/include/GCUHousekeepingParser.h deleted file mode 100644 index 9d1dbf96..00000000 --- a/include/GCUHousekeepingParser.h +++ /dev/null @@ -1,246 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////////////////// -// _____ ____ _ _ ____ _______ ______ _____ _____ _______ _ // -// | __ \ / __ \ | \ | |/ __ \__ __| | ____| __ \_ _|__ __| | // -// | | | | | | | | \| | | | | | | | |__ | | | || | | | | | // -// | | | | | | | | . ` | | | | | | | __| | | | || | | | | | // -// | |__| | |__| | | |\ | |__| | | | | |____| |__| || |_ | | |_| // -// |_____/ \____/ |_| \_|\____/ |_| |______|_____/_____| |_| (_) // -// // -// WARNING! This is an automatically generated file. DO NOT EDIT // -//////////////////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////////////////// - -#ifndef GCUHOUSEKEEPINGPACKET_H -#define GCUHOUSEKEEPINGPACKET_H - -#include - -struct GCUHousekeepingPacket { - uint16_t Sync; - uint8_t PacketID; - uint32_t UnixTime; - uint16_t PacketCounter; - uint16_t PacketSize; - uint16_t* Temp; - uint16_t* ADC; - uint16_t CryoTipTemp; - uint16_t CryoPower; - uint64_t ClkVal; - uint8_t* LastCommandIDs; - uint16_t* LastCommandPayloads; - uint16_t NumGoodCommands; - uint16_t NumBadCommands; - uint8_t OPADataRate; - uint8_t OPBDataRate; - uint8_t NumAutoResyncs; - uint8_t HeaterBoxReadBack7; - uint8_t HeaterBoxReadBack6; - uint8_t HeaterBoxReadBack5; - uint8_t HeaterBoxReadBack4; - uint8_t HeaterBoxReadBack3; - uint8_t HeaterBoxReadBack2; - uint8_t HeaterBoxReadBack1; - uint8_t HeaterBoxReadBack0; - uint16_t NumGCURestarts; - uint32_t NumBytesInRelayQueue; - uint8_t HeaterBoxSetting7; - uint8_t HeaterBoxSetting6; - uint8_t HeaterBoxSetting5; - uint8_t HeaterBoxSetting4; - uint8_t HeaterBoxSetting3; - uint8_t HeaterBoxSetting2; - uint8_t HeaterBoxSetting1; - uint8_t HeaterBoxSetting0; - uint8_t TStat7Enabled; - uint8_t TStat6Enabled; - uint8_t TStat5Enabled; - uint8_t TStat4Enabled; - uint8_t TStat3Enabled; - uint8_t TStat2Enabled; - uint8_t TStat1Enabled; - uint8_t TStat0Enabled; - uint8_t MagredEnabled; - uint8_t MagredPID; - uint8_t ClkbrdGPIO2; - uint8_t ClkbrdGPIO1; - uint8_t ClkbrdGPIO0; - uint8_t MagredCounter; - uint32_t RelayNumPacketsDropped; - uint64_t RelayNumBytesDropped; - uint8_t RelayRawDataEnabled; - uint8_t RelayComptonEnabled; - uint8_t RelayQueueAccepting; - uint32_t LOSNumBytesInQueue; - uint64_t LOSBytesWritten; - uint32_t LOSNumPacketsDropped; - uint64_t LOSNumBytesDropped; - uint8_t LOSAutoClear; - uint8_t LOSIsOpen; - uint8_t LOSComptonEnabled; - uint8_t LOSQueueAccepting; - uint8_t LOSEnabled; - uint32_t DiskNumBytesInQueue; - uint64_t DiskANumBytesWritten; - uint64_t DiskBNumBytesWritten; - uint64_t DiskCNumBytesWritten; - uint8_t DiskCIsMounted; - uint8_t DiskBIsMounted; - uint8_t DiskAIsMounted; - uint8_t DiskCNotNull; - uint8_t DiskBNotNull; - uint8_t DiskANotNull; - uint8_t DiskComptonEnabled; - uint32_t GRBNumBytesInQueue; - uint32_t GRBTdiff; - uint32_t GRBNumTriggers; - uint8_t ShieldAlgoTrigEnabled2; - uint8_t ShieldAlgoTrigEnabled1; - uint8_t ShieldAlgoTrigEnabled0; - uint8_t GRBAutoTriggerEnabled; - uint8_t GRBTriggerActive; - uint8_t GRBQueueAccepting; - uint32_t RTANumBytesInQueue; - uint8_t RTAAcceptingSingleDetectorEvents; - uint8_t RTAAutoRebootEnabled; - uint8_t RTAComptonAnalysisEnabled; - uint8_t RTAComptonQueueAutoClearEnabled; - uint8_t RTAQueueAccepting; - uint8_t RTAEnabled; - uint64_t OpenPortANumBytesWritten; - uint8_t UnixTimeMSB; - uint8_t OpenPortAUDPSocket; - uint8_t OpenPortAEnabled; - uint64_t OpenPortBNumBytesWritten; - uint8_t OpenPortBUDPSocket; - uint8_t OpenPortBEnabled; - uint8_t* NumRestartsCC; - uint8_t SerialDialupOpen; - uint8_t SerialCryoOpen; - uint8_t SerialMagOpen; - uint8_t SerialGPSOpen; - uint8_t SerialSIP2Open; - uint8_t SerialSIP1Open; - uint8_t DiskAUsage; - uint8_t DiskBUsage; - uint8_t DiskCUsage; - uint8_t HVStatusCC11; - uint8_t HVStatusCC10; - uint8_t HVStatusCC9; - uint8_t HVStatusCC8; - uint8_t HVStatusCC7; - uint8_t HVStatusCC6; - uint8_t HVStatusCC5; - uint8_t HVStatusCC4; - uint8_t HVStatusCC3; - uint8_t HVStatusCC2; - uint8_t HVStatusCC1; - uint8_t HVStatusCC0; - uint8_t HVStatusShield5; - uint8_t HVStatusShield4; - uint8_t HVStatusShield3; - uint8_t HVStatusShield2; - uint8_t HVStatusShield1; - uint8_t HVStatusShield0; - uint8_t* ShieldThreshold; - uint8_t DiskCEnabled; - uint8_t DiskBEnabled; - uint8_t DiskAEnabled; - uint8_t GlobalClockSupervisorResyncEnabled; - uint8_t GPSMagEnabled; - uint8_t GPSEnabled; - uint8_t EthernetReallocateEnabled; - uint8_t GlobalPROMLoadSuccessful; - uint8_t RTAContinuityOK7; - uint8_t RTAContinuityOK6; - uint8_t RTAContinuityOK5; - uint8_t RTAContinuityOK4; - uint8_t RTAContinuityOK3; - uint8_t RTAContinuityOK2; - uint8_t RTAContinuityOK1; - uint8_t RTAContinuityOK0; - uint8_t GlobalSyncStatusCC3; - uint8_t GlobalSyncStatusCC2; - uint8_t GlobalSyncStatusCC1; - uint8_t GlobalSyncStatusCC0; - uint8_t RTAContinuityOK11; - uint8_t RTAContinuityOK10; - uint8_t RTAContinuityOK9; - uint8_t RTAContinuityOK8; - uint8_t GlobalSyncStatusCC11; - uint8_t GlobalSyncStatusCC10; - uint8_t GlobalSyncStatusCC9; - uint8_t GlobalSyncStatusCC8; - uint8_t GlobalSyncStatusCC7; - uint8_t GlobalSyncStatusCC6; - uint8_t GlobalSyncStatusCC5; - uint8_t GlobalSyncStatusCC4; - uint8_t RTANumEventsActive7; - uint8_t RTANumEventsActive6; - uint8_t RTANumEventsActive5; - uint8_t RTANumEventsActive4; - uint8_t RTANumEventsActive3; - uint8_t RTANumEventsActive2; - uint8_t RTANumEventsActive1; - uint8_t RTANumEventsActive0; - uint8_t RTAAnalysisEnabled3; - uint8_t RTAAnalysisEnabled2; - uint8_t RTAAnalysisEnabled1; - uint8_t RTAAnalysisEnabled0; - uint8_t RTANumEventsActive11; - uint8_t RTANumEventsActive10; - uint8_t RTANumEventsActive9; - uint8_t RTANumEventsActive8; - uint8_t RTAAnalysisEnabled11; - uint8_t RTAAnalysisEnabled10; - uint8_t RTAAnalysisEnabled9; - uint8_t RTAAnalysisEnabled8; - uint8_t RTAAnalysisEnabled7; - uint8_t RTAAnalysisEnabled6; - uint8_t RTAAnalysisEnabled5; - uint8_t RTAAnalysisEnabled4; - uint32_t GRBLastTrigTime; - uint8_t ShieldNumAlgoTriggers0; - uint8_t ShieldNumAlgoTriggers1; - uint8_t ShieldNumAlgoTriggers2; - uint8_t WhichSIP; - uint8_t TelemUDPMode; - uint16_t SIPLon; - uint16_t SIPLat; - uint16_t SIPAlt; - uint32_t SIPTime; - uint16_t SIPWeek; - uint16_t SIPPressure; - uint16_t SIPHealth; - uint8_t FlightCodeCPUUsage; - uint8_t FlightCodeMemUsage; - uint8_t MagredCPUUsage; - uint8_t MagredMemUsage; - uint32_t EthernetTotalNumRawDataframes; - uint32_t EthernetTotalNumComptonDataframes; - uint8_t DoublePumpOverrideEnabled; - uint8_t PumpEPromCodeGood; - uint8_t PumpTachAValid; - uint8_t PumpTachBValid; - uint8_t PumpDACASetting; - uint8_t PumpDACBSetting; - uint16_t PumpTachALast; - uint16_t PumpTachAHigh; - uint16_t PumpTachALow; - uint16_t PumpTachBLast; - uint16_t PumpTachBHigh; - uint16_t PumpTachBLow; - uint16_t PumpLevelSensor; - uint8_t ShieldNumSamples; - uint32_t* NumCounts; - uint32_t* TimeInterval; - uint8_t* LiveTimeFraction; -}; - -struct GCUHousekeepingPacket* MakeNewGCUHousekeepingPacket(void); -struct GCUHousekeepingPacket* ParseGCUHousekeepingPacket(uint8_t* RawData); -void ParseAllocatedGCUHousekeepingPacket(uint8_t* RawData, struct GCUHousekeepingPacket* packet); -void ParseGCUHousekeepingPacketWrapper(uint8_t* RawData, void* packet_bytes); -void printGCUHousekeepingPacket(struct GCUHousekeepingPacket* packet); - -#endif diff --git a/include/GCUSettingsParser.h b/include/GCUSettingsParser.h deleted file mode 100644 index 9b2a60ae..00000000 --- a/include/GCUSettingsParser.h +++ /dev/null @@ -1,112 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////////////////// -// _____ ____ _ _ ____ _______ ______ _____ _____ _______ _ // -// | __ \ / __ \ | \ | |/ __ \__ __| | ____| __ \_ _|__ __| | // -// | | | | | | | | \| | | | | | | | |__ | | | || | | | | | // -// | | | | | | | | . ` | | | | | | | __| | | | || | | | | | // -// | |__| | |__| | | |\ | |__| | | | | |____| |__| || |_ | | |_| // -// |_____/ \____/ |_| \_|\____/ |_| |______|_____/_____| |_| (_) // -// // -// WARNING! This is an automatically generated file. DO NOT EDIT // -//////////////////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////////////////// - -#ifndef GCUSETTINGSPACKET_H -#define GCUSETTINGSPACKET_H - -#include - -struct GCUSettingsPacket { - uint16_t Sync; - uint8_t PacketID; - uint32_t UnixTime; - uint16_t PacketCounter; - uint16_t PacketSize; - uint16_t OPAHeartBeatTimeout; - uint16_t OPBHeartBeatTimeout; - uint32_t LOSMaxQueueSize; - uint32_t DroppedMaxQueueSize; - uint32_t RelayMaxQueueSize; - uint32_t DiskMaxQueueSize; - uint32_t DiskMaxFileSize; - uint32_t RTAMaxQueueSize; - uint32_t RTAMaxComptonQueueSize; - uint16_t RTAMaxNumTriggers; - uint8_t RTAComptonWindow; - uint32_t GRBMaxQueueSize; - uint32_t GRBQueueTDiff; - uint16_t ShieldSampleRate100ms; - uint16_t HkpShieldInterval; - uint16_t* ShieldAlgoInterval; - uint16_t* ShieldTriggerSigma; - uint16_t* GRBAlgoMinSamples; - uint16_t* GRBAlgoMaxSamples; - uint16_t GPSSampleRate100ms; - uint16_t GPSDiagInterval; - uint16_t HkpPeriod100ms; - uint8_t CryoPID; - uint16_t CryoTTarget; - uint16_t CryoPWOut; - uint16_t CryoMax; - uint16_t OPAUDPByteLimit; - uint16_t OPBUDPByteLimit; - uint16_t RpiTemp_Brd0_Ch0; - uint16_t RpiTemp_Brd0_Ch1; - uint16_t RpiTemp_Brd0_Ch2; - uint16_t RpiTemp_Brd0_Ch3; - uint16_t RpiTemp_Brd0_Ch4; - uint16_t RpiTemp_Brd0_Ch5; - uint16_t RpiTemp_Brd0_Ch6; - uint16_t RpiTemp_Brd0_Ch7; - uint16_t RpiTemp_Brd1_Ch0; - uint16_t RpiTemp_Brd1_Ch1; - uint16_t RpiTemp_Brd1_Ch2; - uint16_t RpiTemp_Brd1_Ch3; - uint16_t RpiTemp_Brd1_Ch4; - uint16_t RpiTemp_Brd1_Ch5; - uint16_t RpiTemp_Brd1_Ch6; - uint16_t RpiTemp_Brd1_Ch7; - uint16_t RpiTemp_Brd2_Ch0; - uint16_t RpiTemp_Brd2_Ch1; - uint16_t RpiTemp_Brd2_Ch2; - uint16_t RpiTemp_Brd2_Ch3; - uint16_t RpiTemp_Brd2_Ch4; - uint16_t RpiTemp_Brd2_Ch5; - uint16_t RpiTemp_Brd2_Ch6; - uint16_t RpiTemp_Brd2_Ch7; - uint16_t RpiTemp_Brd3_Ch0; - uint16_t RpiTemp_Brd3_Ch1; - uint16_t RpiTemp_Brd3_Ch2; - uint16_t RpiTemp_Brd3_Ch3; - uint16_t RpiTemp_Brd3_Ch4; - uint16_t RpiTemp_Brd3_Ch5; - uint16_t RpiTemp_Brd3_Ch6; - uint16_t RpiTemp_Brd3_Ch7; - uint16_t MagPiX; - uint16_t MagPiY; - uint16_t MagPiZ; - uint16_t TStat0LowerTemp; - uint16_t TStat0UpperTemp; - uint16_t TStat1LowerTemp; - uint16_t TStat1UpperTemp; - uint16_t TStat2LowerTemp; - uint16_t TStat2UpperTemp; - uint16_t TStat3LowerTemp; - uint16_t TStat3UpperTemp; - uint16_t TStat4LowerTemp; - uint16_t TStat4UpperTemp; - uint16_t TStat5LowerTemp; - uint16_t TStat5UpperTemp; - uint16_t TStat6LowerTemp; - uint16_t TStat6UpperTemp; - uint16_t TStat7LowerTemp; - uint16_t TStat7UpperTemp; -}; - -struct GCUSettingsPacket* MakeNewGCUSettingsPacket(void); -struct GCUSettingsPacket* ParseGCUSettingsPacket(uint8_t* RawData); -void ParseAllocatedGCUSettingsPacket(uint8_t* RawData, struct GCUSettingsPacket* packet); -void ParseGCUSettingsPacketWrapper(uint8_t* RawData, void* packet_bytes); -void printGCUSettingsPacket(struct GCUSettingsPacket* packet); - -#endif diff --git a/include/LivetimeParser.h b/include/LivetimeParser.h deleted file mode 100644 index 1d37a69c..00000000 --- a/include/LivetimeParser.h +++ /dev/null @@ -1,32 +0,0 @@ -/* - 2 Livetime Packet Parser - 3 - 4 Written by Clio Sleator - 5 */ - -#include -#include -#include -#include - - //****************** Declaring Structs to hold parsed data ******************// - -struct LivetimePacket{ - - //Livetime - uint64_t ClkVal; - uint16_t PacketCounter; - uint32_t UnixTime; - uint16_t PacketSize; - uint16_t Sync; - uint8_t PacketID; - - uint8_t CCHasLivetime[12]; - uint16_t TotalLivetime[12]; - uint16_t ShieldLivetime[12]; - -}; - -//declare functions -void ParseLivetime(struct LivetimePacket* packet, uint8_t* RawData); - diff --git a/include/MAssembly.h b/include/MAssembly.h index 044edc85..396f5b13 100644 --- a/include/MAssembly.h +++ b/include/MAssembly.h @@ -53,24 +53,27 @@ class MAssembly static const uint64_t c_EventLoaderMeasurement = (1 << 2); // = 4 static const uint64_t c_EventOrdering = (1 << 3); // = 8 static const uint64_t c_Coincidence = (1 << 4); // = 16 - static const uint64_t c_DetectorEffectsEngine = (1 << 5); // = 32 - static const uint64_t c_EventFilter = (1 << 6); // = 64 - static const uint64_t c_EnergyCalibration = (1 << 7); // = 128 - static const uint64_t c_ChargeSharingCorrection = (1 << 8); // = 256 - static const uint64_t c_DepthCorrection = (1 << 9); // = 512 - static const uint64_t c_StripPairing = (1 << 10); // = 1024 - static const uint64_t c_Aspect = (1 << 11); // = 2048 - static const uint64_t c_CrosstalkCorrection = (1 << 12); // = 4096 - static const uint64_t c_EventReconstruction = (1 << 13); // = 8196 - static const uint64_t c_Else = (1 << 14); - static const uint64_t c_NoRestriction = (1 << 15); - static const uint64_t c_EventSaver = (1 << 16); - static const uint64_t c_EventTransmitter = (1 << 17); - static const uint64_t c_PositionDetermiation = (1 << 18); - static const uint64_t c_Statistics = (1 << 19); - static const uint64_t c_FlagHits = (1 << 20); - static const uint64_t c_Diagnostics = (1 << 21); - static const uint64_t c_ResponseGeneration = (1 << 22); + static const uint64_t c_TACcut = (1 << 5); // = 32 + static const uint64_t c_NearestNeighbor = (1 << 6); // = 32 + static const uint64_t c_DetectorEffectsEngine = (1 << 7); + static const uint64_t c_EventFilter = (1 << 8); + static const uint64_t c_EnergyCalibration = (1 << 9); + static const uint64_t c_ChargeSharingCorrection = (1 << 10); + static const uint64_t c_DepthCorrection = (1 << 11); + static const uint64_t c_StripPairing = (1 << 12); + static const uint64_t c_Aspect = (1 << 13); + static const uint64_t c_CrosstalkCorrection = (1 << 14); + static const uint64_t c_EventReconstruction = (1 << 15); + static const uint64_t c_Else = (1 << 16); + static const uint64_t c_NoRestriction = (1 << 17); + static const uint64_t c_EventSaver = (1 << 18); + static const uint64_t c_EventTransmitter = (1 << 19); + static const uint64_t c_PositionDetermiation = (1 << 20); + static const uint64_t c_Statistics = (1 << 21); + static const uint64_t c_FlagHits = (1 << 22); + static const uint64_t c_Diagnostics = (1 << 23); + static const uint64_t c_ResponseGeneration = (1 << 24); + // IMPORTANT: // If you add one analysis level, make sure you also handle it in: diff --git a/include/MBinaryFlightDataParser.h b/include/MBinaryFlightDataParser.h deleted file mode 100644 index de5e99c8..00000000 --- a/include/MBinaryFlightDataParser.h +++ /dev/null @@ -1,276 +0,0 @@ -/* - * MBinaryFlightDataParser.h - * - * Copyright (C) by Alex Lowell & Andreas Zoglauer. - * All rights reserved. - * - * Please see the source-file for the copyright-notice. - * - */ - - -#ifndef __MBinaryFlightDataParser__ -#define __MBinaryFlightDataParser__ - - -//////////////////////////////////////////////////////////////////////////////// - - -// Standard libs: -#include -#include -#include -using namespace std; - -// ROOT libs: - -// MEGAlib libs: -#include "MGlobal.h" -#include "MTransceiverTcpIpBinary.h" -#include "MFile.h" - -// Nuclearizer libs -#include "MAspectReconstruction.h" -#include "MReadOutAssembly.h" -#include "MModuleEventSaver.h" -#include "MTimeAndCoordinate.h" - -// Forward declarations: - - -//////////////////////////////////////////////////////////////////////////////// - - -//! The data modes: analyze raw events, Compton events, or all events -enum class MBinaryFlightDataParserDataModes : unsigned int { c_Raw = 0, c_Compton = 1, c_All = 2 }; - -//! Aspect modes... use the GPS, the magnetometer, or neither -enum class MBinaryFlightDataParserAspectModes : unsigned int {c_GPS = 0, c_Magnetometer, c_Interpolate, c_Neither}; - - -//////////////////////////////////////////////////////////////////////////////// - - -class MBinaryFlightDataParser -{ - // public interface: - public: - //! Default constructor - MBinaryFlightDataParser(); - //! Default destructor - virtual ~MBinaryFlightDataParser(); - - //! Get the data selection mode - MBinaryFlightDataParserDataModes GetDataSelectionMode() const { return m_DataSelectionMode; } - //! Set the data selection mode - void SetDataSelectionMode(MBinaryFlightDataParserDataModes Mode) { m_DataSelectionMode = Mode; } - - //! Get the aspect mode - MBinaryFlightDataParserAspectModes GetAspectMode() const { return m_AspectMode; } - //! Set the aspect mode - void SetAspectMode(MBinaryFlightDataParserAspectModes Mode) { m_AspectMode = Mode; } - - //! Enable/Disable Coincidence merging - void EnableCoincidenceMerging(bool X) {m_CoincidenceEnabled = X;} - //! Get coincidence merging true/false - bool GetCoincidenceMerging() const { return m_CoincidenceEnabled; } - - //! Parse some data, return true if the module is ready to analyze events - virtual bool ParseData(vector Received) ; - - //! Initialize the module - virtual bool Initialize(); - - //! Finalize the module - virtual void Finalize(); - - //! Set the Is done flag... this also sets the IsDone flag for the aspect reconstruction stuff - void SetIsDone(bool IsDone); - - //! Get the IsDone flag - bool GetIsDone() {return m_IsDone;} - - //! Get access to m_AspectReconstructor - MAspectReconstruction* GetAspectReconstructor() const { return m_AspectReconstructor; } - - // protected methods: - protected: - - - // private methods: - private: - void LoadStripMap(void); - void LoadCCMap(void); - - - - // protected members: - protected: - //! The data selection mode (raw, Compton, all) - MBinaryFlightDataParserDataModes m_DataSelectionMode; - //! The aspect mode (c_GPS, c_Magnetometer, c_Interpolate, c_Neither) - MBinaryFlightDataParserAspectModes m_AspectMode; - //! Controls whether or not coincident events are merged - bool m_CoincidenceEnabled; - MModuleEventSaver* m_EventSaver; - - //! internal event list - sorted but unmerged events - deque m_EventsBuf;//sorted, unmerged events - //! The internal event list - final merged events - deque m_Events; - //! If true ignore aspect information if not ready - bool m_IgnoreAspect; - //! Notify parser than we are done getting new data... this will result in some flushing - bool m_IsDone; - uint32_t m_NumRawDataframes; - uint32_t m_NumComptonDataframes; - uint32_t m_NumAspectPackets; - uint32_t m_NumSettingsPackets; - uint32_t m_NumGCUHkpPackets; - uint32_t m_NumLivetimePackets; - uint32_t m_NumOtherPackets; - - //! The housekeeping file name - MString m_HousekeepingFileName; - - // private members: - private: - - //! - - //! The aspect reconstructor - MAspectReconstruction* m_AspectReconstructor; - MTIRecord TIRecord; - MTimeAndCoordinate m_TCCalculator; - - //added by AWL - bool m_UseComptonDataframes; - bool m_UseRawDataframes; - unsigned int MAX_TRIGS; - unsigned long long m_EventTimeWindow; - vector LastTimestamps; - uint64_t m_ComptonWindow; - vector m_SBuf;//search buffer for the incoming TCP data stream - unsigned int dx; //index into search buffer - unsigned int m_EventIDCounter; - string m_LastDateTimeString; - uint64_t m_LastCorrectedClk; - bool m_UseGPSDSO; - bool m_UseMagnetometer; - double m_LastLatitude; - double m_LastLongitude; - double m_LastAltitude; - int m_LastGPSWeek; - time_t m_LastDSOUnixTime; - uint16_t m_LastAspectID; - MAspectPacket m_LastDSOPacket; - uint32_t m_NumDSOReceived; - uint64_t LastComptonTimestamp; - uint32_t m_NumComptonBytes; - uint32_t m_NumRawDataBytes; - uint32_t m_NumBytesReceived; - uint32_t m_LostBytes; - map m_PacketRecord; - vector m_PreampTemps; - - //! The house-keeping file stream - ofstream m_Housekeeping; - - int m_StripMap[8][10]; - int m_CCMap[12]; - -public: - class trigger{ - - public: - uint8_t Board; - int8_t Channel; - bool HasTiming; - bool HasADC; - uint16_t ADCBytes; - uint8_t TimingByte; - int CCId; - - }; - - class event{ - - public: - uint64_t EventTime; - uint8_t ErrorBoardList; - uint8_t ErrorInfo; - uint8_t EventID; - uint8_t TrigAndVetoInfo; - uint8_t FTPattern; - uint8_t LTPattern; - bool ParseError; - uint8_t CCId; - uint8_t InternalCompton; - uint8_t Touchable; - - uint32_t NumTriggers; - vector Triggers; - - - //below is stuff that only applies to compton events - uint8_t NumCCsInvolved; - uint8_t TDiff; - - }; - - class dataframe { - - public: - uint16_t PacketCounter; - uint32_t UnixTime; - int Length; - uint8_t PacketType; - uint8_t CCId; - string RawOrCompton; //0 if this struct came from a raw data frame, or 1 if from compton - uint32_t ReportedNumEvents; - uint64_t SysTime; - uint32_t LifetimeBits; - uint8_t NumNormal; - uint8_t NumLLD; - uint8_t NumTOnly; - uint8_t NumNoData; - bool HasSysErr; - - uint32_t NumEvents; //the number of events which is <= 41 - vector Events; - - bool ParseError; - - }; - - - public: - int RawDataframe2Struct( vector Buf, dataframe * DataOut); - bool ComptonDataframe2Struct( vector& Buf, dataframe * DataOut); - bool ConvertToMReadOutAssemblys( dataframe * DataIn, vector * CEvents); - bool SortEventsBuf(void); - bool FlushEventsBuf(void); - bool CheckEventsBuf(void); - MReadOutAssembly * MergeEvents( deque * EventList ); - bool FindNextPacket( vector & NextPacket, unsigned int * idx = NULL ); - bool ResyncSBuf(void); - bool ProcessAspect( vector & NextPacket ); - bool ProcessAspect_works( vector & NextPacket ); - bool DecodeDSO( vector & DSOString, MAspectPacket & DSO_Packet); - bool DecodeMag( vector & MagString, MAspectPacket & Mag_Packet); - - - - -#ifdef ___CLING___ - public: - ClassDef(MBinaryFlightDataParser, 0) // no description -#endif - -}; - -#endif - - - -//////////////////////////////////////////////////////////////////////////////// diff --git a/include/MDEEStripHit.h b/include/MDEEStripHit.h new file mode 100644 index 00000000..79547754 --- /dev/null +++ b/include/MDEEStripHit.h @@ -0,0 +1,134 @@ +/* + * MDEEStripHit.h + * + * Copyright (C) by YOUR NAME HERE. + * All rights reserved. + * + * Please see the source-file for the copyright-notice. + * + */ + + +#ifndef __MDEEStripHit__ +#define __MDEEStripHit__ + + +//////////////////////////////////////////////////////////////////////////////// + + +// Standard libs: +#include +#include +using namespace std; + +// ROOT libs: + +// MEGAlib libs: +#include "MGlobal.h" +#include "MStripHit.h" +#include "MReadOutElementDoubleStrip.h" + +// Forward declarations: + + +//////////////////////////////////////////////////////////////////////////////// + + +//! A shared data structure of all DEE classes holding the strip data on it's way +//! to the final version +struct MDEEStripHit +{ + // public interface: + public: + //! Default constructor + MDEEStripHit(); + //! Default destructor + virtual ~MDEEStripHit() {}; + + //! Create new real strip hit + MStripHit* Convert(); + + // Simulation data + + //! The simulated event ID + unsigned long m_SimulatedEventID; // original: long m_ID; + //! The position from simulations (global coordinates) + MVector m_SimulatedPosition; // original: Position + //! The simulated position in the detector + MVector m_SimulatedPositionInDetector; + //! The simulated depth relative to the top of the detector in [0..1] + double m_SimulatedRelativeDepth; + //! The energy from simulations + double m_SimulatedEnergy; // original: m_EnergyOrig + //! The list of origin IDs form the simulation + list m_SimulatedOrigins; // original: m_Origins + //! True if this is a guard ring + bool m_SimulatedIsGuardRing; // original: m_IsGuardRing + //! SimHT index that the strip hit came from to check if hit was completely absorbed + unsigned int m_SimulatedHitIndex; // original: m_HitIndex; + + // The strip data - which can be in process of being created + + //! The read-out element + MReadOutElementDoubleStrip m_ROE; + + //! A unique lookup ID of the strup hit + unsigned int m_ID; + //! The ID of the strip on the opposite side + unsigned int m_OppositeSideID; + //! Is this a guard ring + bool m_IsGuardRing; + //! The measured energy + double m_Energy; + //! The measured ADC value + unsigned int m_ADC; + //! Is this a guard ring + bool m_HasTriggered; + //! The measured TAC value; + unsigned int m_TAC; + //! The measured temperature value + double m_Temperature; + + //! A list of original strip hits making up this strip hit + vector m_SubStripHits; + + //! lists indices of other substriphits that have same IA origin + vector m_SharedOrigin; // <--- Check if needed + + //! ?? + // vector m_OppositeStripID; // <--- Check if needed + + //! The + // int m_OppositeStrip; // <--- Check if needed + + + + // protected methods: + protected: + + + // private methods: + private: + + + + // protected members: + protected: + + + // private members: + private: + + + +#ifdef ___CLING___ + public: + ClassDef(MDEEStripHit, 0) // no description +#endif + +}; + +#endif + + +//////////////////////////////////////////////////////////////////////////////// diff --git a/include/MDepthCalibrator.h b/include/MDepthCalibrator.h index 25754e8e..b0004512 100644 --- a/include/MDepthCalibrator.h +++ b/include/MDepthCalibrator.h @@ -26,6 +26,7 @@ // MEGAlib libs: #include "MGlobal.h" +#include "MModule.h" #include "MString.h" #include "MFile.h" @@ -44,8 +45,14 @@ class MDepthCalibrator virtual ~MDepthCalibrator() {}; //! Load the coefficients file (i.e. fit parameters for each pixel) bool LoadCoeffsFile(MString FName); + //! Load the TAC Calibration file + bool LoadTACCalFile(MString FName); //! Return the coefficients for a pixel std::vector* GetPixelCoeffs(int pixel_code); + //! Return the TAC calibration coefficients for a LV strip + std::vector* GetLVTACCal(int DetID, int StripID); + //! Return the TAC calibration coefficients for a HV strip + std::vector* GetHVTACCal(int DetID, int StripID); //! Load the splines file bool LoadSplinesFile(MString FName); //! Return a pointer to a spline @@ -61,17 +68,28 @@ class MDepthCalibrator private: //! Generate the spline from the data and add it to the internal spline map void AddSpline(vector xvec, vector yvec, int DetID, std::unordered_map& SplineMap, bool invert); + //! Adds a Depth-to-CTD relation + bool AddDepthCTD(vector depthvec, vector> ctdarr, int DetID, unordered_map>& DepthGrid, unordered_map>>& CTDMap); + private: - std::unordered_map*> m_Coeffs; + unordered_map> m_Coeffs; + double m_Coeffs_Energy; std::unordered_map m_SplineMap_Depth2CTD; std::unordered_map m_SplineMap_CTD2Depth; std::unordered_map m_SplineMap_Depth2AnoTiming; std::unordered_map m_SplineMap_Depth2CatTiming; bool m_SplinesFileIsLoaded; bool m_CoeffsFileIsLoaded; + bool m_TACCalFileIsLoaded; + vector m_Detectors; + unordered_map>> m_HVTACCal; + unordered_map>> m_LVTACCal; std::vector m_Thicknesses; + // The CTD Map maps each detector (int) to a 2D array of CTD values. + unordered_map>> m_CTDMap; + unordered_map> m_DepthGrid; diff --git a/include/MDetectorEffectsEngineSMEX.h b/include/MDetectorEffectsEngineSMEX.h index 33a8f051..f461ab7e 100644 --- a/include/MDetectorEffectsEngineSMEX.h +++ b/include/MDetectorEffectsEngineSMEX.h @@ -1,5 +1,5 @@ /* - * MMDetectorEffectsEngineSMEX.h + * MDetectorEffectsEngineSMEX.h * * Copyright (C) by Andreas Zoglauer. * All rights reserved. @@ -122,6 +122,10 @@ class MDetectorEffectsEngineSMEX //! Initialize the module bool Initialize(); + //! Get Deadtime for Shields + double dTimeShields(int detectors_activated = 0); + //! Get Deadtime for GeDs + double dTimeGeDs(vector channels); //! Analyze whatever needs to be analyzed... bool GetNextEvent(MReadOutAssembly* Event); //! Finalize the module @@ -255,10 +259,14 @@ class MDetectorEffectsEngineSMEX static const int nDets = 12; //! number of sides static const int nSides = 2; + //! number of ASICs to readout the strips + static const int nASICs = nDets * nSides; //! number of strips static const int nStrips = 37; //! slots in DSP dead time buffer static const int nDTBuffSlots = 16; + //! number of shield detectors + static const int nShieldDets = 6; //! The DEE internal random number generator TRandom m_Random; @@ -293,8 +301,13 @@ class MDetectorEffectsEngineSMEX //! Dead time buffer with 16 slots vector > m_DeadTimeBuffer = vector >(nDets, vector (nDTBuffSlots)); - //! Stores dead time for each detector vector m_CCDeadTime = vector(nDets); + //! Stores dead time for each detector + vector m_ASICDeadTime = vector(nDets); + //! Boolean to increase deadtime or not + vector increaseShieldDeadTimeGeD; + // //! Channels that were activated within delay time window, need 1 for each ASIC? Make a dictionary? + // vector m_channelsGeDASIC = vector(1); //! Stores last hit time for any detector double m_LastHitTime; //! Stores last time detector was hit to check if detector still dead @@ -311,11 +324,27 @@ class MDetectorEffectsEngineSMEX int m_MaxBufferFullIndex; int m_MaxBufferDetector; - //! dead time on the shields - double m_ShieldDeadTime; + + //! delay time on GeDs + double m_StripDelay; + //! dead time on GeDs + double m_StripDeadTime; + //! dead time on the shield group 1 + double m_ShieldDeadTime1; + //! dead time on the shield group 2 + double m_ShieldDeadTime2; + //! dead time on the shield group 3 + double m_ShieldDeadTime3; + //! total dead time on shield group 1 + double m_TotalShieldDeadTime1; + //! total dead time on shield group 2 + double m_TotalShieldDeadTime2; + //! total dead time on shield group 3 + double m_TotalShieldDeadTime3; + //! whether or not the event is vetoed by the shields bool m_ShieldVeto; - //! shield threshold + //! shield thresholdx double m_ShieldThreshold; //! List of dead strips @@ -339,12 +368,24 @@ class MDetectorEffectsEngineSMEX unsigned long m_ChargeLossCounter; double m_ShieldPulseDuration; + double m_ShieldDelayBefore; + double m_ShieldDelayAfter; + double m_ASICDeadTimePerChannel; double m_CCDelay; + double m_ShieldDeadTimeAdd; + double m_ASICDeadTimeAdd; double m_ShieldTime; + double m_LastGoodHitShieldTime; double m_ShieldDelay; double m_ShieldVetoWindowSize; + int m_lastGoodEventNumber; bool m_IsShieldDead; - + int activated1; + int activated2; + int activated3; + double GeD_deadtime; + + long m_NumShieldCounts; //! drift constant: used for charge sharing due to diffusion; one for each detector @@ -375,3 +416,390 @@ class MDetectorEffectsEngineSMEX //////////////////////////////////////////////////////////////////////////////// + + +// /* +// * MMDetectorEffectsEngineSMEX.h +// * +// * Copyright (C) by Andreas Zoglauer. +// * All rights reserved. +// * +// * Please see the source-file for the copyright-notice. +// * +// */ + + +// #ifndef __MMDetectorEffectsEngineSMEX__ +// #define __MMDetectorEffectsEngineSMEX__ + + +// //////////////////////////////////////////////////////////////////////////////// + + +// // Standard libs: +// #include +// #include +// #include +// using namespace std; + +// // ROOT libs: +// #include "TH2D.h" +// #include "TRandom.h" + +// // MEGAlib libs: +// #include "MGlobal.h" +// #include "MReadOutElementDoubleStrip.h" +// #include "MFileEventsSim.h" + +// // Nuclearizer libs: +// #include "MDepthCalibrator.h" +// #include "MReadOutAssembly.h" + +// // Forward declarations: + + +// //////////////////////////////////////////////////////////////////////////////// + + +// class MDetectorEffectsEngineSMEX +// { +// public: +// //! Default constructor +// MDetectorEffectsEngineSMEX(); +// //! Default destructor +// virtual ~MDetectorEffectsEngineSMEX(); + +// //! Set the simulation file name +// void SetSimulationFileName(const MString& FileName) { m_SimulationFileName = FileName; } +// //! Get the simulation file name +// MString GetSimulationFileName() const { return m_SimulationFileName; } + +// //! Show the progress of simulation file reading +// void ShowProgressBar(bool Flag) { m_ShowProgressBar = Flag; } + +// //! Set the roa file name +// void SetRoaFileName(const MString& FileName) { m_RoaFileName = FileName; m_SaveToFile = true; } +// //! Get the simulation file name +// MString GetRoaFileName() const { return m_RoaFileName; } + +// //! Set geometry file name +// void SetGeometryFileName(const MString& FileName) { m_GeometryFileName = FileName; } +// //! Set geometry file name +// MString GetGeometryFileName() { return m_GeometryFileName; } + +// //! Set geometry +// void SetGeometry(MDGeometryQuest* Geometry) { m_Geometry = Geometry; } + +// //! Set energy calibration file name +// void SetEnergyCalibrationFileName(const MString& FileName) { m_EnergyCalibrationFileName = FileName; } +// //! Set energy calibration file name +// MString GetEnergyCalibrationFileName() const { return m_EnergyCalibrationFileName; } + +// //! Set threshold file name +// void SetThresholdFileName(const MString& FileName) { m_ThresholdFileName = FileName; } +// //! Set threshold file name +// MString GetThresholdFileName() const { return m_ThresholdFileName; } + +// //! Set guard ring threshold file name +// void SetGuardRingThresholdFileName(const MString& FileName) { m_GuardRingThresholdFileName = FileName; } +// //! Get guard ring threshold file name +// MString GetGuardRingThresholdFileName() const { return m_GuardRingThresholdFileName; } + +// //! Set the dead strips file name +// void SetDeadStripFileName(const MString& FileName) { m_DeadStripFileName = FileName; } +// //! Set the dead strips file name +// MString GetDeadStripFileName() const { return m_DeadStripFileName; } + +// //! Set the charge sharing factors file name +// void SetChargeSharingFileName(const MString& FileName){ m_ChargeSharingFileName = FileName; } +// //! Get the charge sharing factors file name +// MString GetChargeSharingFileName() const { return m_ChargeSharingFileName; } + +// //! Set the crosstalk coefficients file name +// void SetCrosstalkFileName(const MString& FileName) { m_CrosstalkFileName = FileName; } +// //! Get the crosstalk coefficients file name +// MString GetCrosstalkFileName() const { return m_CrosstalkFileName; } + +// //! Set the charge loss coefficients file name +// void SetChargeLossFileName(const MString& FileName) { m_ChargeLossFileName = FileName; } +// //! Get the charge loss coefficients file name +// MString GetChargeLossFileName() const { return m_ChargeLossFileName; } + +// //! Set the depth calibration coefficients file name +// void SetDepthCalibrationCoeffsFileName(const MString& FileName) { m_DepthCalibrationCoeffsFileName = FileName; } +// //! Set the depth calibration coefficients file name +// MString GetDepthCalibrationCoeffsFileName() const { return m_DepthCalibrationCoeffsFileName; } + +// //! Set the depth calibration splines file name +// void SetDepthCalibrationSplinesFileName(const MString& FileName) { m_DepthCalibrationSplinesFileName = FileName; } +// //! Set the depth calibration splines file name +// MString GetDepthCalibrationSplinesFileName() const { return m_DepthCalibrationSplinesFileName; } + +// //! Get include fudge factor +// bool GetApplyFudgeFactor() const { return m_ApplyFudgeFactor; } +// //! Set whether to include the fudge factor +// void SetApplyFudgeFactor(bool ApplyFudgeFactor){ m_ApplyFudgeFactor = ApplyFudgeFactor; } + +// //! Initialize the module +// bool Initialize(); +// //! Analyze whatever needs to be analyzed... +// bool GetNextEvent(MReadOutAssembly* Event); +// //! Finalize the module +// bool Finalize(); + +// //! empty function used to make breakpoints for debugger +// void dummy_func(); + + +// protected: +// //! Read in and parse energy calibration file +// bool ParseEnergyCalibrationFile(); +// //! Read in and parse thresholds file +// bool ParseThresholdFile(); +// //! Read in and parse the guard ring thresholds file +// bool ParseGuardRingThresholdFile(); +// //! Read in and parse dead strip file +// bool ParseDeadStripFile(); +// //! noise shield energy +// double NoiseShieldEnergy(double energy, MString ShieldName); +// //! Read charge sharing factor file +// bool ParseChargeSharingFile(); +// //! Read and initialize charge loss coefficients +// bool InitializeChargeLoss(); +// //! Parse crosstalk coefficients file +// bool ParseCrosstalkFile(); +// //! Apply charge loss correction +// vector ApplyChargeLoss(double energy1, double energy2, int detID, int side, double depth1, double depth2); + + +// public: +// //! Tiny helper class for MDetectorEffectsEngineSMEX describing a special strip hit +// class MDEEStripHit +// { +// public: +// //! Default constructor +// MDEEStripHit() : m_ADC(0), m_Timing(0), m_PreampTemp(0), m_Energy(0), m_EnergyOrig(0), m_HitIndex(0), m_IsGuardRing(false), m_ID(0), m_OppositeStrip(0), m_Depth(-10) {} + +// //! The read-out element +// MReadOutElementDoubleStrip m_ROE; +// //! The ADC value +// double m_ADC; +// //! The timing value; +// double m_Timing; +// //! The pre-amp temperature value; +// double m_PreampTemp; + +// //! The simulated position +// MVector m_Position; +// //! The simulated energy deposit +// double m_Energy; +// //! The simulated energy deposit -- not changed by crosstalk and charge loss +// double m_EnergyOrig; + +// //! SimHT index that the strip hit came from to check if hit was completely absorbed +// unsigned int m_HitIndex; + +// //! True if this is a guard ring +// bool m_IsGuardRing; + +// vector m_OppositeStrips; + +// //! ID of the event +// long m_ID; + +// //! list of origins of strip hits from cosima output +// list m_Origins; + +// //! A list of original strip hits making up this strip hit +// vector m_SubStripHits; + +// //! lists indices of other substriphits that have same IA origin +// vector m_SharedOrigin; + +// //! for charge loss +// int m_OppositeStrip; +// //! save depth information for charge loss, and maybe other things +// double m_Depth; +// }; + +// protected: +// //! Convert Energy to ADC value +// int EnergyToADC(MDEEStripHit& Hit, double energy); + + +// protected: + +// //! Simulation file name +// MString m_SimulationFileName; +// //! The file reader +// MFileEventsSim* m_Reader; + +// //! True if we should save data to file +// bool m_SaveToFile; +// //! Roa file name +// MString m_RoaFileName; +// //! Geometry file name +// MString m_GeometryFileName; +// //! Energy calibration file name +// MString m_EnergyCalibrationFileName; +// //! Dead strip file name +// MString m_DeadStripFileName; +// //! Thresholds file name +// MString m_ThresholdFileName; +// //! Guard ring threshold file name +// MString m_GuardRingThresholdFileName; +// //! Charge sharing file name +// MString m_ChargeSharingFileName; +// //! Crosstalk file name +// MString m_CrosstalkFileName; +// //! Charge loss file name +// MString m_ChargeLossFileName; +// //! Depth calibration coefficients file name +// MString m_DepthCalibrationCoeffsFileName; +// //! Depth calibration splines file name +// MString m_DepthCalibrationSplinesFileName; +// //! whether fudge factor is applied +// bool m_ApplyFudgeFactor; + +// //! The far field start area +// double m_StartAreaFarField; + +// //! The number of simulated events +// unsigned long m_NumberOfSimulatedEvents; + + +// private: + +// //COSI constants +// //! number of detectors +// static const int nDets = 12; +// //! number of sides +// static const int nSides = 2; +// //! number of strips +// static const int nStrips = 37; +// //! slots in DSP dead time buffer +// static const int nDTBuffSlots = 16; + +// //! The DEE internal random number generator +// TRandom m_Random; + + +// //! The geometry +// MDGeometryQuest* m_Geometry; +// //! True if this class owns the geometry +// bool m_OwnGeometry; +// //! Show the reading of the progress bar +// bool m_ShowProgressBar; + +// //! The roa output file +// ofstream m_Roa; + +// //! Calibration map between read-out element and LLD thresholds +// map m_LLDThresholds; +// //! Calibration map between read-out element and FST threshold functions +// map m_FSTThresholds; +// //! Calibration map between read-out element and fast thresholds +// // map m_FSTThresholds; +// //! Calibration map between read-out element and fast threshold noise +// // map m_FSTNoise; + +// //! Calibration map between read-out element and guard ring thresholds +// map m_GuardRingThresholds; + +// //! Calibration map between read-out element and fitted function for energy calibration +// map m_EnergyCalibration; +// //! Calibration map between read-out element and fitted function for energy resolution calibration +// map m_ResolutionCalibration; + +// //! Dead time buffer with 16 slots +// vector > m_DeadTimeBuffer = vector >(nDets, vector (nDTBuffSlots)); +// //! Stores dead time for each detector +// vector m_CCDeadTime = vector(nDets); +// //! Stores last hit time for any detector +// double m_LastHitTime; +// //! Stores last time detector was hit to check if detector still dead +// vector m_LastHitTimeByDet = vector(nDets); +// //! Stores total dead time by detector +// vector m_TotalDeadTime = vector(nDets); +// //! Stores trigger rates (number of events) for each detector +// vector m_TriggerRates = vector(nDets); +// //! Stores time of first event; used to get number of events per second +// double m_FirstTime; +// //! Stores time of last event; used to get number of events per second +// double m_LastTime; + +// int m_MaxBufferFullIndex; +// int m_MaxBufferDetector; + + +// //! delay time on GeDs +// double m_StripDelay; +// //! dead time on GeDs +// double m_StripDeadTime; +// //! dead time on the shields +// double m_ShieldDeadTime; +// //! whether or not the event is vetoed by the shields +// bool m_ShieldVeto; +// //! shield threshold +// double m_ShieldThreshold; + +// //! List of dead strips +// vector > > m_DeadStrips = vector > >(nDets, vector >(nSides, vector(nStrips))); + +// //! Depth calibrator class +// MDepthCalibrator* m_DepthCalibrator; + +// //! charge sharing factors +// vector > m_ChargeSharingFactors = vector >(nDets, vector(nSides)); + +// //! Charge loss fit coefficients +// double m_ChargeLossCoefficients[nDets][nSides][3][2]; +// //for some reason when I turn this into a vector I get a seg fault, too lazy to debug now + +// //! Crosstalk coefficients +// vector > > > m_CrosstalkCoefficients = vector > > >(12, vector > > (2, vector > (2, vector (2)))); + +// unsigned long m_MultipleHitsCounter; +// unsigned long m_TotalHitsCounter; +// unsigned long m_ChargeLossCounter; + +// double m_ShieldPulseDuration; +// double m_ShieldDelayBefore; +// double m_ShieldDelayAfter; +// // double m_ASICDeadTimePerChannel; +// double m_CCDelay; +// double m_ShieldTime; +// double m_ShieldDelay; +// double m_ShieldVetoWindowSize; +// bool m_IsShieldDead; + +// long m_NumShieldCounts; + +// //! drift constant: used for charge sharing due to diffusion; one for each detector +// vector m_DriftConstant; + +// TH2D* m_ChargeLossHist; + + +// // Some housekeeping + +// //! Counter for events with strips in overflow +// unsigned long m_NumberOfEventsWithADCOverflows; +// //! Counter for events with no strips in overflow +// unsigned long m_NumberOfEventsWithNoADCOverflows; + +// //! Counter for the number of times the IA was not in the detector for the charge sharing determination +// unsigned long m_NumberOfFailedIASearches; +// //! Counter for the number of times the IA was in the detector for the charge sharing determination +// unsigned long m_NumberOfSuccessfulIASearches; + +// #ifdef ___CLING___ +// public: +// ClassDef(MDetectorEffectsEngineSMEX, 0) // no description +// #endif +// }; + +// #endif + + +// //////////////////////////////////////////////////////////////////////////////// \ No newline at end of file diff --git a/include/MDetectorEffectsEngineSingleDet.h b/include/MDetectorEffectsEngineSingleDet.h new file mode 100644 index 00000000..cd13e8bf --- /dev/null +++ b/include/MDetectorEffectsEngineSingleDet.h @@ -0,0 +1,495 @@ +/* + * MMDetectorEffectsEngineSingleDet.h + * + * Copyright (C) by Parshad Patel, Andreas Zoglauer. + * All rights reserved. + * + * Please see the source-file for the copyright-notice. + * + */ + + + #ifndef __MMDetectorEffectsEngineSingleDet__ + #define __MMDetectorEffectsEngineSingleDet__ + + + //////////////////////////////////////////////////////////////////////////////// + + + // Standard libs: + #include + #include + #include + using namespace std; + + // ROOT libs: + #include "TH2D.h" + #include "TRandom.h" + + // MEGAlib libs: + #include "MGlobal.h" + #include "MReadOutElementDoubleStrip.h" + #include "MFileEventsSim.h" + + // based on MEGAlib library but created for Nuclearizer + #include "MReadOutElementVoxel3D.h" + + // Nuclearizer libs: + #include "MDepthCalibrator.h" + #include "MReadOutAssembly.h" + + // Forward declarations: + + + //////////////////////////////////////////////////////////////////////////////// + + + class MDetectorEffectsEngineSingleDet + { + public: + //! Default constructor + MDetectorEffectsEngineSingleDet(); + //! Default destructor + virtual ~MDetectorEffectsEngineSingleDet(); + + //! Set the simulation file name + void SetSimulationFileName(const MString& FileName) { m_SimulationFileName = FileName; } + //! Set the deadtime constants file name + void SetDeadtimeFileName(const MString& FileName) { m_DeadtimeFileName = FileName; } + //! Set the TAC calibration file name + void SetDepthCalibrationTACCalFileName(const MString& FileName) { m_DepthCalibrationTACCalFileName = FileName; } + //! Get the simulation file name + MString GetSimulationFileName() const { return m_SimulationFileName; } + //! Get the deadtime parameters file name + MString GetDeadtimeFileName() const { return m_DeadtimeFileName; } + //! Get the TAC calibration parameters file name + MString GetDepthCalibrationTACCalFileName() const { return m_DepthCalibrationTACCalFileName; } + + //! Show the progress of simulation file reading + void ShowProgressBar(bool Flag) { m_ShowProgressBar = Flag; } + + //! Set the roa file name + void SetRoaFileName(const MString& FileName) { m_RoaFileName = FileName; m_SaveToFile = true; } + //! Get the simulation file name + MString GetRoaFileName() const { return m_RoaFileName; } + + //! Set geometry file name + void SetGeometryFileName(const MString& FileName) { m_GeometryFileName = FileName; } + //! Set geometry file name + MString GetGeometryFileName() { return m_GeometryFileName; } + + //! Set geometry + void SetGeometry(MDGeometryQuest* Geometry) { m_Geometry = Geometry; } + + //! Set energy calibration file name + void SetEnergyCalibrationFileName(const MString& FileName) { m_EnergyCalibrationFileName = FileName; } + //! Set energy calibration file name + MString GetEnergyCalibrationFileName() const { return m_EnergyCalibrationFileName; } + + //! Set threshold file name + void SetThresholdFileName(const MString& FileName) { m_ThresholdFileName = FileName; } + //! Set threshold file name + MString GetThresholdFileName() const { return m_ThresholdFileName; } + + //! Set guard ring threshold file name + void SetGuardRingThresholdFileName(const MString& FileName) { m_GuardRingThresholdFileName = FileName; } + //! Get guard ring threshold file name + MString GetGuardRingThresholdFileName() const { return m_GuardRingThresholdFileName; } + + //! Set the dead strips file name + void SetDeadStripFileName(const MString& FileName) { m_DeadStripFileName = FileName; } + //! Set the dead strips file name + MString GetDeadStripFileName() const { return m_DeadStripFileName; } + + //! Set the charge sharing factors file name + void SetChargeSharingFileName(const MString& FileName){ m_ChargeSharingFileName = FileName; } + //! Get the charge sharing factors file name + MString GetChargeSharingFileName() const { return m_ChargeSharingFileName; } + + //! Set the crosstalk coefficients file name + void SetCrosstalkFileName(const MString& FileName) { m_CrosstalkFileName = FileName; } + //! Get the crosstalk coefficients file name + MString GetCrosstalkFileName() const { return m_CrosstalkFileName; } + + //! Set the charge loss coefficients file name + void SetChargeLossFileName(const MString& FileName) { m_ChargeLossFileName = FileName; } + //! Get the charge loss coefficients file name + MString GetChargeLossFileName() const { return m_ChargeLossFileName; } + + //! Set the depth calibration coefficients file name + void SetDepthCalibrationCoeffsFileName(const MString& FileName) { m_DepthCalibrationCoeffsFileName = FileName; } + //! Set the depth calibration coefficients file name + MString GetDepthCalibrationCoeffsFileName() const { return m_DepthCalibrationCoeffsFileName; } + + //! Set the depth calibration splines file name + void SetDepthCalibrationSplinesFileName(const MString& FileName) { m_DepthCalibrationSplinesFileName = FileName; } + //! Set the depth calibration splines file name + MString GetDepthCalibrationSplinesFileName() const { return m_DepthCalibrationSplinesFileName; } + + //! Get include fudge factor + bool GetApplyFudgeFactor() const { return m_ApplyFudgeFactor; } + //! Set whether to include the fudge factor + void SetApplyFudgeFactor(bool ApplyFudgeFactor){ m_ApplyFudgeFactor = ApplyFudgeFactor; } + + //! Initialize the module + bool Initialize(); + //! Get deadtime from list of channels in one ASIC + double dTimeASICs(vector ASICChannels, bool IsShield = false); + //! Helper function for getting count rate since nearest neighbor isn't implemented + bool CountRate(vector ASICChannels, vector CountTime, bool IsShield = false); + //! Analyze whatever needs to be analyzed... + bool GetNextEvent(MReadOutAssembly* Event); + //! Finalize the module + bool Finalize(); + + //! empty function used to make breakpoints for debugger + void dummy_func(); + + /// ACS DEE + //! Set ACS energy correction file name + void SetACSEnergyCorrectionFileName(const MString& FileName) { m_ACSEnergyCorrectionFileName = FileName; } + //! Set threshold file name + MString GetACSEnergyCorrectionFileName() const { return m_ACSEnergyCorrectionFileName; } + protected: + //! Read in deadtime constants + bool ParseDeadtimeFile(); + //! Read in and parse energy calibration file + bool ParseEnergyCalibrationFile(); + //! Read in and parse thresholds file + bool ParseThresholdFile(); + //! Read in and parse the guard ring thresholds file + bool ParseGuardRingThresholdFile(); + //! Read in and parse dead strip file + bool ParseDeadStripFile(); + //! Read charge sharing factor file + bool ParseChargeSharingFile(); + //! Read and initialize charge loss coefficients + bool InitializeChargeLoss(); + //! Parse crosstalk coefficients file + bool ParseCrosstalkFile(); + //! Apply charge loss correction + vector ApplyChargeLoss(double energy1, double energy2, int detID, int side, double depth1, double depth2); + + /// ACS DEE + //! Read in and parse the ACS energy correction file (fwhm and centroid) + bool ParseACSEnergyCorrectionFile(); + + //! noise shield energy + double NoiseShieldEnergyCentroid(double energy, MString detname, int voxelx_id, int voxely_id, int voxelz_id); + double NoiseShieldEnergyFWHM(double energy, MString detname, int voxelx_id, int voxely_id, int voxelz_id); + + public: + //! Tiny helper class for MDetectorEffectsEngineSingleDet describing a special strip hit + class MDEEStripHit + { + public: + //! Default constructor + MDEEStripHit() : m_ADC(0), m_Timing(0), m_TAC(0), m_PreampTemp(0), m_Energy(0), m_EnergyOrig(0), m_HitIndex(0), m_IsGuardRing(false), m_ID(0), m_OppositeStrip(0), m_Depth(-10) {} + + //! The read-out element for the GeD + MReadOutElementDoubleStrip m_ROE; + //! The ADC value + double m_ADC; + //! The timing value; + double m_Timing; + //! The TAC value; + double m_TAC; + //! The pre-amp temperature value; + double m_PreampTemp; + + //! The simulated position + MVector m_Position; + //! The simulated energy deposit + double m_Energy; + //! The simulated energy deposit -- not changed by crosstalk and charge loss + double m_EnergyOrig; + + //! SimHT index that the strip hit came from to check if hit was completely absorbed + unsigned int m_HitIndex; + + //! True if this is a guard ring + bool m_IsGuardRing; + + vector m_OppositeStrips; + + //! ID of the event + long m_ID; + + //! list of origins of strip hits from cosima output + list m_Origins; + + //! A list of original strip hits making up this strip hit + vector m_SubStripHits; + + //! lists indices of other substriphits that have same IA origin + vector m_SharedOrigin; + + //! for charge loss + int m_OppositeStrip; + //! save depth information for charge loss, and maybe other things + double m_Depth; + + /// ACS DEE + //! The read-out element for the ACS + MReadOutElementVoxel3D m_VOX_ACS; + + }; + + protected: + //! Convert Energy to ADC value + int EnergyToADC(MDEEStripHit& Hit, double energy); + + + protected: + + //! Simulation file name + MString m_SimulationFileName; + //! Deadtime constants + MString m_DeadtimeFileName; + //! TAC calibration constants + MString m_DepthCalibrationTACCalFileName; + //! The file reader + MFileEventsSim* m_Reader; + + //! True if we should save data to file + bool m_SaveToFile; + //! Roa file name + MString m_RoaFileName; + //! Geometry file name + MString m_GeometryFileName; + //! Energy calibration file name + MString m_EnergyCalibrationFileName; + //! Dead strip file name + MString m_DeadStripFileName; + //! Thresholds file name + MString m_ThresholdFileName; + //! Guard ring threshold file name + MString m_GuardRingThresholdFileName; + //! Charge sharing file name + MString m_ChargeSharingFileName; + //! Crosstalk file name + MString m_CrosstalkFileName; + //! Charge loss file name + MString m_ChargeLossFileName; + //! Depth calibration coefficients file name + MString m_DepthCalibrationCoeffsFileName; + //! Depth calibration splines file name + MString m_DepthCalibrationSplinesFileName; + //! whether fudge factor is applied + bool m_ApplyFudgeFactor; + + //! The far field start area + double m_StartAreaFarField; + + //! The number of simulated events + unsigned long m_NumberOfSimulatedEvents; + + /// ACS DEE + //! ACS energy correction file name + MString m_ACSEnergyCorrectionFileName; + + private: + + //COSI constants + //! number of detectors + static const int nDets = 1; + //! number of sides + static const int nSides = 2; + //! number of strips + static const int nStrips = 64; + //! number of ASICs for 1 det (change for multiple) + static const int nASICs = 4; + //! number of BGO Detectors + static const int nShieldDets = 22; + // static const int nShieldDets = 1; + //! number of BGO Panels + static const int nShieldPanels = 6; + // static const int nShieldPanels = 1; + //! slots in DSP dead time buffer + static const int nDTBuffSlots = 16; + + // MString DetectorName; + + //! The DEE internal random number generator + TRandom m_Random; + + + //! The geometry + MDGeometryQuest* m_Geometry; + //! True if this class owns the geometry + bool m_OwnGeometry; + //! Show the reading of the progress bar + bool m_ShowProgressBar; + + //! The roa output file + ofstream m_Roa; + + //! Calibration map between read-out element and LLD thresholds + map m_LLDThresholds; + //! Calibration map between read-out element and FST threshold functions + map m_FSTThresholds; + //! Calibration map between read-out element and fast thresholds + // map m_FSTThresholds; + //! Calibration map between read-out element and fast threshold noise + // map m_FSTNoise; + + //! Calibration map between read-out element and guard ring thresholds + map m_GuardRingThresholds; + //! Number of GR Hits + int m_countGR; + + //! Calibration map between read-out element and fitted function for energy calibration + map m_EnergyCalibration; + //! Calibration map between read-out element and fitted function for energy resolution calibration + map m_ResolutionCalibration; + + //! Dead time buffer with 16 slots + vector > m_DeadTimeBuffer = vector >(nDets, vector (nDTBuffSlots)); + + // Helper variables for printing out data + //! Stores all events' times + vector m_EventTimes; + //! Stores all strip IDs + vector m_EventStripIDs; + //! Stores all strip energies + vector m_EventStripEnergy; + //! Stores all strip ADC values + vector m_EventStripADC; + + //! Stores current dead time of the instrument + double m_StripsCurrentDeadtime; + //! Stores dead time for each ASIC + vector > m_ASICDeadTime = vector >(nDets, vector(nASICs, 0)); + //! Stores last good event time + double m_ASICLastHitTime; + //! Strip ID for particular hit in ASIC + vector > > m_ASICHitStripID = vector > >(nDets, vector>(nASICs)); + //! Helper Strip ID vector to count for hits without deadtime + vector>> m_ASICHitStripID_noDT = vector > >(nDets, vector>(nASICs)); + //! Strip ID for particular hit in ASIC + vector > > m_TempEvtTimes = vector > >(nDets, vector>(nASICs)); + //! Stores total dead time of the instrument + double m_StripsTotalDeadtime; + //! Bool to store if ASIC is dead or not + bool IsGeDDead; + + //! Stores trigger rates (number of events) for each detector + vector m_TriggerRates = vector(nDets); + //! Stores time of first event; used to get number of events per second + double m_FirstTime; + //! Stores time of last event; used to get number of events per second + double m_LastTime; + + int m_MaxBufferFullIndex; + int m_MaxBufferDetector; + + + //! List of dead strips + vector > > m_DeadStrips = vector > >(nDets, vector >(nSides, vector(nStrips))); + + //! Depth calibrator class + MDepthCalibrator* m_DepthCalibrator; + + //! charge sharing factors + vector > m_ChargeSharingFactors = vector >(nDets, vector(nSides)); + + double m_StripCoincidenceWindowFromFile; + double m_ASICDeadTimePerChannelFromFile; + double m_StripDelayAfter1FromFile; + double m_StripDelayAfter2FromFile; + + + //! Charge loss fit coefficients + double m_ChargeLossCoefficients[nDets][nSides][3][2]; + //for some reason when I turn this into a vector I get a seg fault, too lazy to debug now + + //! Crosstalk coefficients + vector > > > m_CrosstalkCoefficients = vector > > >(12, vector > > (2, vector > (2, vector (2)))); + + unsigned long m_MultipleHitsCounter; + unsigned long m_TotalStripHitsCounter; + unsigned long m_ChargeLossCounter; + unsigned long m_NumShieldHitCounts; + unsigned long m_ShieldVetoCounter; + unsigned long m_RawStripCounts; + unsigned long TestCounter; + + + //! Strip Delay for ENABLE to fall + double m_StripCoincidenceWindow; + //! ASIC Deadtime per channel that is read out + double m_ASICDeadTimePerChannel; + //! Strip Delay after the channels are read out - acquisition reset etc... + double m_StripDelayAfter1; + double m_StripDelayAfter2; + double m_StripDelayAfter; + int m_StripHitsErased; + int m_NumBGOHitsErased; + double m_ShieldPulseDuration; + vector m_ShieldLastHitTime = vector(nShieldPanels); + double m_ShieldVetoTime; + double m_ShieldDelayBefore; + double m_ShieldDelayAfter; + double m_ShieldVetoWindowSize; + bool m_IsShieldDead; + //! dead time on the shields + vector m_ShieldDeadtime = vector(nShieldPanels); + vector m_TotalShieldDeadtime = vector(nShieldPanels); + + //! whether or not the event is vetoed by the shields + bool m_ShieldVeto; + //! shield threshold + double m_ShieldThreshold; + //! Shield ID for particular hit in ASIC + vector >m_ShieldHitID = vector >(nShieldPanels); + //! Group of shield numers per panel + vector > m_ShieldPanelGroups = { + {0, 1, 2, 3}, + {4, 5, 6, 7}, + {8, 9, 10, 11}, + {12, 13, 14, 15}, + {16, 17, 18}, + {19, 20, 21} + }; + // vector > m_ShieldPanelGroups = { + // {0} + // }; + + + //! drift constant: used for charge sharing due to diffusion; one for each detector + vector m_DriftConstant; + // double m_DriftConstant; + + TH2D* m_ChargeLossHist; + + + // Some housekeeping + + //! Counter for events with strips in overflow + unsigned long m_NumberOfEventsWithADCOverflows; + //! Counter for events with no strips in overflow + unsigned long m_NumberOfEventsWithNoADCOverflows; + + //! Counter for the number of times the IA was not in the detector for the charge sharing determination + unsigned long m_NumberOfFailedIASearches; + //! Counter for the number of times the IA was in the detector for the charge sharing determination + unsigned long m_NumberOfSuccessfulIASearches; + + + /// ACS DEE + //! Calibration map between Voxel3D read-out element and the energy resolution parameters + map m_Centroid; + map m_FWHM; + + + #ifdef ___CLING___ + public: + ClassDef(MDetectorEffectsEngineSingleDet, 0) // no description + #endif + }; + + #endif + + + //////////////////////////////////////////////////////////////////////////////// + diff --git a/include/MGUIExpoTACcut.h b/include/MGUIExpoTACcut.h new file mode 100644 index 00000000..056efa56 --- /dev/null +++ b/include/MGUIExpoTACcut.h @@ -0,0 +1,124 @@ +/* + * MGUIExpoTACcut.h + * + * Copyright (C) by Andreas Zoglauer. + * All rights reserved. + * + * Please see the source-file for the copyright-notice. + * + */ + + +#ifndef __MGUIExpoTACcut__ +#define __MGUIExpoTACcut__ + + +//////////////////////////////////////////////////////////////////////////////// + + +// ROOT libs: +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// MEGAlib libs: +#include "MGlobal.h" +#include "MGUIERBList.h" + +// NuSTAR libs +#include "MGUIExpo.h" + +// Forward declarations: + + +//////////////////////////////////////////////////////////////////////////////// + + +class MGUIExpoTACcut : public MGUIExpo +{ + // public Session: + public: + //! Default constructor + MGUIExpoTACcut(MModule* Module); + //! Default destructor + virtual ~MGUIExpoTACcut(); + + //! The creation part which gets overwritten + virtual void Create(); + + //! Update the frame + virtual void Update(); + + //! Reset the data in the UI + virtual void Reset(); + + //! Export the data in the UI + virtual void Export(const MString& FileName); + + //! Set the arrangment of the TAC histogram + //! 0 1 2 3 + //! 4 5 6 7 + //! 8 9 10 11 + void SetTACHistogramArrangement(const vector DetIDs); + + //! Set the energy histogram parameters + void SetTACHistogramParameters(unsigned int DetID, unsigned int NBins, double TACMin, double TACMax); + + //! Set the energy histogram parameters + void SetTACHistogramName(unsigned int DetID, MString Name); + + //! Add data to the TAC histogram + //! 0 1 2 3 + //! 4 5 6 7 + //! 8 9 10 11 + void AddTAC(unsigned int DetID, double TAC); + + // protected methods: + protected: + + + // protected members: + protected: + + // private members: + private: + //! TAC canvas + unordered_map m_TACCanvases; + //! TAC vs detector ID histogram + unordered_map m_TACHistograms; + + //! Detectors in x direction + unsigned int m_NColumns; + //! Detectors in y direction + unsigned int m_NRows; + + // Map the detector ID to the x,y position of histograms. + vector> m_DetectorMap; + + //! The number of bins of the histogram + unordered_map m_NBins; + //! The minimum TAC + unordered_map m_Min; + //! The maximum TAC + unordered_map m_Max; + + +#ifdef ___CLING___ + public: + ClassDef(MGUIExpoTACcut, 1) // basic class for dialog windows +#endif + +}; + +#endif + + +//////////////////////////////////////////////////////////////////////////////// diff --git a/include/MGUIOptionsDEESMEX.h b/include/MGUIOptionsDEESMEX.h new file mode 100644 index 00000000..01d6d05a --- /dev/null +++ b/include/MGUIOptionsDEESMEX.h @@ -0,0 +1,111 @@ +/* + * MGUIOptionsDEESMEX.h + * + * Copyright (C) by Andreas Zoglauer. + * All rights reserved. + * + * Please see the source-file for the copyright-notice. + * + */ + + +#ifndef __MGUIOptionsDEESMEX__ +#define __MGUIOptionsDEESMEX__ + + +//////////////////////////////////////////////////////////////////////////////// + + +// ROOT libs: +#include +#include +#include +#include +#include +#include +#include +#include + +// MEGAlib libs: +#include "MGlobal.h" +#include "MGUIEFileSelector.h" +#include "MGUIEEntry.h" +#include "MGUIOptions.h" + +// Nuclearizer libs: +#include "MModule.h" + + +// Forward declarations: + + +//////////////////////////////////////////////////////////////////////////////// + + +class MGUIOptionsDEESMEX : public MGUIOptions +{ + // public Session: + public: + //! Default constructor + MGUIOptionsDEESMEX(MModule* Module); + //! Default destructor + virtual ~MGUIOptionsDEESMEX(); + + //! Process all button, etc. messages + virtual bool ProcessMessage(long Message, long Parameter1, long Parameter2); + + //! The creation part which gets overwritten + virtual void Create(); + + // protected methods: + protected: + + //! Actions after the Apply or OK button has been pressed + virtual bool OnApply(); + + + // protected members: + protected: + + // private members: + private: + //! Select which file to load + MGUIEFileSelector* m_SimulationFileSelector; + //! Energy calibration file name + MGUIEFileSelector* m_EnergyCalibrationFileSelector; + //! Dead strip file name + MGUIEFileSelector* m_DeadStripFileSelector; + //! Thresholds file name + MGUIEFileSelector* m_ThresholdFileSelector; + //! Guard ring thresholds fil ename + MGUIEFileSelector* m_GuardRingThresholdFileSelector; + //! Charge sharing file name + MGUIEFileSelector* m_ChargeSharingFileSelector; + //! Crosstalk file name + MGUIEFileSelector* m_CrosstalkFileSelector; + //! Charge loss file name + MGUIEFileSelector* m_ChargeLossFileSelector; + //! Depth calibration coefficients file name + MGUIEFileSelector* m_DepthCalibrationCoeffsFileSelector; + //! Depth calibration splines file name + MGUIEFileSelector* m_DepthCalibrationSplinesFileSelector; + //! Apply fudge factor + TGCheckButton* m_ApplyFudgeFactorSelector; + //! Use stop after a maximum number of events + TGCheckButton* m_StopAfter; + //! Entry field for the maximum number of accepted events + MGUIEEntry* m_MaximumAcceptedEvents; + + + +#ifdef ___CLING___ + public: + ClassDef(MGUIOptionsDEESMEX, 1) // basic class for dialog windows +#endif + +}; + +#endif + + +//////////////////////////////////////////////////////////////////////////////// diff --git a/include/MGUIOptionsDepthCalibration2024.h b/include/MGUIOptionsDepthCalibration2024.h index a9853d86..15c72ed6 100644 --- a/include/MGUIOptionsDepthCalibration2024.h +++ b/include/MGUIOptionsDepthCalibration2024.h @@ -74,9 +74,6 @@ class MGUIOptionsDepthCalibration2024 : public MGUIOptions //! Select spline file to load, splines will convert CTD->Depth MGUIEFileSelector* m_SplinesFileSelector; - //! Select TAC Calibration file to load, converts readout timing to nanoseconds - MGUIEFileSelector* m_TACCalFileSelector; - //! Check button if working with the Card Cage at UCSD TGCheckButton* m_UCSDOverride; diff --git a/include/MGUIOptionsEventSaver.h b/include/MGUIOptionsEventSaver.h index 9d2d405c..47eff234 100644 --- a/include/MGUIOptionsEventSaver.h +++ b/include/MGUIOptionsEventSaver.h @@ -43,6 +43,7 @@ //////////////////////////////////////////////////////////////////////////////// +//! UI for the event saver class MGUIOptionsEventSaver : public MGUIOptions { // public Session: @@ -78,6 +79,9 @@ class MGUIOptionsEventSaver : public MGUIOptions //! Checkbutton to save or reject bad events TGCheckButton* m_SaveBadEvents; + //! Checkbutton to save veto events + TGCheckButton* m_SaveVetoEvents; + //! Checkbutton to add a time tag TGCheckButton* m_AddTimeTag; @@ -85,6 +89,23 @@ class MGUIOptionsEventSaver : public MGUIOptions TGCheckButton* m_SplitFile; //! Entry field for the time after which to split the file MGUIEEntry* m_SplitFileTime; + + //! Checkbutton to include or exclude ADCs in the roa file + TGCheckButton* m_RoaWithADCs; + //! Checkbutton to include or exclude TACs in the roa file + TGCheckButton* m_RoaWithTACs; + //! Checkbutton to include or exclude energies in the roa file + TGCheckButton* m_RoaWithEnergies; + //! Checkbutton to include or exclude timings in the roa file + TGCheckButton* m_RoaWithTimings; + //! Checkbutton to include or exclude temperatures in the roa file + TGCheckButton* m_RoaWithTemperatures; + //! Checkbutton to include or exclude flags in the roa file + TGCheckButton* m_RoaWithFlags; + //! Checkbutton to include or exclude origins in the roa file + TGCheckButton* m_RoaWithOrigins; + //! Checkbutton to include or exclude nearest neighbor hits in the roa file + TGCheckButton* m_RoaWithNearestNeighbors; #ifdef ___CLING___ public: diff --git a/include/MGUIOptionsLoaderMeasurements.h b/include/MGUIOptionsLoaderMeasurements.h index 2e9082b4..bbcbd5e8 100644 --- a/include/MGUIOptionsLoaderMeasurements.h +++ b/include/MGUIOptionsLoaderMeasurements.h @@ -46,7 +46,7 @@ class MGUIOptionsLoaderMeasurements : public MGUIOptions // public Session: public: //! Default constructor - MGUIOptionsLoaderMeasurements(MModule* Module); + MGUIOptionsLoaderMeasurements(MModule* Module, MString FileType); //! Default destructor virtual ~MGUIOptionsLoaderMeasurements(); @@ -71,6 +71,8 @@ class MGUIOptionsLoaderMeasurements : public MGUIOptions //! Select which file to load MGUIEFileSelector* m_FileSelector; + //! The file type to load + MString m_FileType; #ifdef ___CLING___ public: diff --git a/include/MGUIOptionsLoaderMeasurementsBinary.h b/include/MGUIOptionsLoaderMeasurementsHDF.h similarity index 65% rename from include/MGUIOptionsLoaderMeasurementsBinary.h rename to include/MGUIOptionsLoaderMeasurementsHDF.h index 6b9631b2..b453cb2a 100644 --- a/include/MGUIOptionsLoaderMeasurementsBinary.h +++ b/include/MGUIOptionsLoaderMeasurementsHDF.h @@ -1,5 +1,5 @@ /* - * MGUIOptionsLoaderMeasurementsBinary.h + * MGUIOptionsLoaderMeasurementsHDF.h * * Copyright (C) by Andreas Zoglauer. * All rights reserved. @@ -9,8 +9,8 @@ */ -#ifndef __MGUIOptionsLoaderMeasurementsBinary__ -#define __MGUIOptionsLoaderMeasurementsBinary__ +#ifndef __MGUIOptionsLoaderMeasurementsHDF__ +#define __MGUIOptionsLoaderMeasurementsHDF__ //////////////////////////////////////////////////////////////////////////////// @@ -30,7 +30,6 @@ #include "MGlobal.h" #include "MGUIEFileSelector.h" #include "MGUIOptions.h" -#include "MGUIERBList.h" // Nuclearizer libs: #include "MModule.h" @@ -42,14 +41,15 @@ //////////////////////////////////////////////////////////////////////////////// -class MGUIOptionsLoaderMeasurementsBinary : public MGUIOptions +//! UI settings for the HDF measurements loader +class MGUIOptionsLoaderMeasurementsHDF : public MGUIOptions { // public Session: public: //! Default constructor - MGUIOptionsLoaderMeasurementsBinary(MModule* Module); + MGUIOptionsLoaderMeasurementsHDF(MModule* Module); //! Default destructor - virtual ~MGUIOptionsLoaderMeasurementsBinary(); + virtual ~MGUIOptionsLoaderMeasurementsHDF(); //! Process all button, etc. messages virtual bool ProcessMessage(long Message, long Parameter1, long Parameter2); @@ -61,7 +61,7 @@ class MGUIOptionsLoaderMeasurementsBinary : public MGUIOptions protected: //! Actions after the Apply or OK button has been pressed - virtual bool OnApply(); + virtual bool OnApply(); // protected members: @@ -70,15 +70,19 @@ class MGUIOptionsLoaderMeasurementsBinary : public MGUIOptions // private members: private: //! Select which file to load - MGUIEFileSelector* m_FileSelector; - MGUIERBList* m_DataMode; - MGUIERBList* m_AspectMode; - MGUIERBList* m_CoincidenceMode; + MGUIEFileSelector* m_FileSelectorHDF; + + //! Check button for switch between loading continuation files or not + TGCheckButton* m_LoadContinuationFiles; + + //! Select which file to load + MGUIEFileSelector* m_FileSelectorStripMap; + #ifdef ___CLING___ public: - ClassDef(MGUIOptionsLoaderMeasurementsBinary, 1) // basic class for dialog windows + ClassDef(MGUIOptionsLoaderMeasurementsHDF, 1) // basic class for dialog windows #endif }; diff --git a/include/MGUIOptionsLoaderSimulations.h b/include/MGUIOptionsLoaderSimulations.h index e890dd90..90dad7a8 100644 --- a/include/MGUIOptionsLoaderSimulations.h +++ b/include/MGUIOptionsLoaderSimulations.h @@ -71,6 +71,8 @@ class MGUIOptionsLoaderSimulations : public MGUIOptions private: //! Select which file to load MGUIEFileSelector* m_SimulationFileSelector; + //! Select deadtime constants file + MGUIEFileSelector* m_DeadtimeFileSelector; //! Energy calibration file name MGUIEFileSelector* m_EnergyCalibrationFileSelector; //! Dead strip file name @@ -87,8 +89,12 @@ class MGUIOptionsLoaderSimulations : public MGUIOptions MGUIEFileSelector* m_ChargeLossFileSelector; //! Depth calibration coefficients file name MGUIEFileSelector* m_DepthCalibrationCoeffsFileSelector; + //! TAC calibration file name + MGUIEFileSelector* m_DepthCalibrationTACCalFileSelector; //! Depth calibration splines file name MGUIEFileSelector* m_DepthCalibrationSplinesFileSelector; + //! ACS DEE energy correction file + MGUIEFileSelector* m_ACSEnergyCorrectionFileSelector; //! Apply fudge factor TGCheckButton* m_ApplyFudgeFactorSelector; //! Use stop after a maximum number of events diff --git a/include/MGUIOptionsCrosstalkCorrection.h b/include/MGUIOptionsLoaderSimulationsCosima.h similarity index 65% rename from include/MGUIOptionsCrosstalkCorrection.h rename to include/MGUIOptionsLoaderSimulationsCosima.h index 4ea8b90f..5c595f50 100644 --- a/include/MGUIOptionsCrosstalkCorrection.h +++ b/include/MGUIOptionsLoaderSimulationsCosima.h @@ -1,5 +1,5 @@ /* - * MGUIOptionsCrosstalkCorrection.h + * MGUIOptionsLoaderSimulationsCosima.h * * Copyright (C) by Andreas Zoglauer. * All rights reserved. @@ -9,8 +9,8 @@ */ -#ifndef __MGUIOptionsCrosstalkCorrection__ -#define __MGUIOptionsCrosstalkCorrection__ +#ifndef __MGUIOptionsLoaderSimulationsCosima__ +#define __MGUIOptionsLoaderSimulationsCosima__ //////////////////////////////////////////////////////////////////////////////// @@ -29,6 +29,7 @@ // MEGAlib libs: #include "MGlobal.h" #include "MGUIEFileSelector.h" +#include "MGUIEEntry.h" #include "MGUIOptions.h" // Nuclearizer libs: @@ -41,14 +42,14 @@ //////////////////////////////////////////////////////////////////////////////// -class MGUIOptionsCrosstalkCorrection : public MGUIOptions +class MGUIOptionsLoaderSimulationsCosima : public MGUIOptions { // public Session: public: //! Default constructor - MGUIOptionsCrosstalkCorrection(MModule* Module); + MGUIOptionsLoaderSimulationsCosima(MModule* Module); //! Default destructor - virtual ~MGUIOptionsCrosstalkCorrection(); + virtual ~MGUIOptionsLoaderSimulationsCosima(); //! Process all button, etc. messages virtual bool ProcessMessage(long Message, long Parameter1, long Parameter2); @@ -60,7 +61,7 @@ class MGUIOptionsCrosstalkCorrection : public MGUIOptions protected: //! Actions after the Apply or OK button has been pressed - virtual bool OnApply(); + virtual bool OnApply(); // protected members: @@ -69,12 +70,17 @@ class MGUIOptionsCrosstalkCorrection : public MGUIOptions // private members: private: //! Select which file to load - MGUIEFileSelector* m_FileSelector; - - + MGUIEFileSelector* m_SimulationFileSelector; + //! Use stop after a maximum number of events + TGCheckButton* m_StopAfter; + //! Entry field for the maximum number of accepted events + MGUIEEntry* m_MaximumAcceptedEvents; + + + #ifdef ___CLING___ public: - ClassDef(MGUIOptionsCrosstalkCorrection, 1) // basic class for dialog windows + ClassDef(MGUIOptionsLoaderSimulationsCosima, 1) // basic class for dialog windows #endif }; diff --git a/include/MGUIOptionsReceiverBalloon.h b/include/MGUIOptionsTACcut.h similarity index 59% rename from include/MGUIOptionsReceiverBalloon.h rename to include/MGUIOptionsTACcut.h index f172a26e..d83df4cd 100644 --- a/include/MGUIOptionsReceiverBalloon.h +++ b/include/MGUIOptionsTACcut.h @@ -1,7 +1,7 @@ /* - * MGUIOptionsReceiverBalloon.h + * MGUIOptionsTACcut.h * - * Copyright (C) by Andreas Zoglauer. + * Copyright (C) 2008-2010 by Jau-Shian Liang. * All rights reserved. * * Please see the source-file for the copyright-notice. @@ -9,8 +9,8 @@ */ -#ifndef __MGUIOptionsReceiverBalloon__ -#define __MGUIOptionsReceiverBalloon__ +#ifndef __MGUIOptionsTACcut__ +#define __MGUIOptionsTACcut__ //////////////////////////////////////////////////////////////////////////////// @@ -23,38 +23,38 @@ #include #include #include +#include #include #include +#include +#include // MEGAlib libs: #include "MGlobal.h" -#include "MGUIEFileSelector.h" -#include "MGUIOptions.h" -#include "MGUIEEntry.h" #include "MGUIERBList.h" - -// Nuclearizer libs: #include "MModule.h" - +#include "MGUIOptions.h" // Forward declarations: - +class MGUIEFileSelector; +class MGUIEMinMaxEntry; +class MGUIEEntry; //////////////////////////////////////////////////////////////////////////////// -class MGUIOptionsReceiverBalloon : public MGUIOptions +class MGUIOptionsTACcut : public MGUIOptions { // public Session: public: //! Default constructor - MGUIOptionsReceiverBalloon(MModule* Module); + MGUIOptionsTACcut(MModule* Module); //! Default destructor - virtual ~MGUIOptionsReceiverBalloon(); + virtual ~MGUIOptionsTACcut(); //! Process all button, etc. messages virtual bool ProcessMessage(long Message, long Parameter1, long Parameter2); - + //! The creation part which gets overwritten virtual void Create(); @@ -67,25 +67,23 @@ class MGUIOptionsReceiverBalloon : public MGUIOptions // protected members: protected: + //! The detector IDs as a string + TGTextEntry* m_Detectors; + + //! Select TAC Calibration file to load, converts readout timing to nanoseconds + MGUIEFileSelector* m_TACCalFileSelector; + //! Select TAC Cut file to load, which specifies the parameters for removing strip hits + MGUIEFileSelector* m_TACCutFileSelector; + + // private members: private: - MGUIEEntry* m_DistributorName; - MGUIEEntry* m_DistributorPort; - MGUIEEntry* m_DistributorStreamID; - - //MGUIEEntry* m_SendToName; - //MGUIEEntry* m_SendToPort; - MGUIERBList* m_DataMode; - MGUIERBList* m_AspectMode; - //! Select if we save the file to roa - MGUIEFileSelector* m_FileSelector; - - #ifdef ___CLING___ +#ifdef ___CLING___ public: - ClassDef(MGUIOptionsReceiverBalloon, 1) // basic class for dialog windows + ClassDef(MGUIOptionsTACcut, 1) // basic class for dialog windows #endif }; diff --git a/include/MModuleChargeSharingCorrection.h b/include/MModuleChargeSharingCorrection.h deleted file mode 100644 index f4191321..00000000 --- a/include/MModuleChargeSharingCorrection.h +++ /dev/null @@ -1,105 +0,0 @@ -/* - * MModuleChargeSharingCorrection.h - * - * Copyright (C) 2009-2009 by Mark Bandstra. - * All rights reserved. - * - * Please see the source-file for the copyright-notice. - * - */ - - -#ifndef __MModuleChargeSharingCorrection__ -#define __MModuleChargeSharingCorrection__ - - -//////////////////////////////////////////////////////////////////////////////// - - -// Standard libs: - -// ROOT libs: - -// MEGAlib libs: -#include "MGlobal.h" -#include "MModule.h" - -// Forward declarations: - - -//////////////////////////////////////////////////////////////////////////////// - - -class MModuleChargeSharingCorrection : public MModule -{ - // public interface: - public: - //! Default constructor - MModuleChargeSharingCorrection(); - //! Default destructor - virtual ~MModuleChargeSharingCorrection(); - - //! Create a new object of this class - virtual MModuleChargeSharingCorrection* Clone() { return new MModuleChargeSharingCorrection(); } - - //! Initialize the module - virtual bool Initialize(); - - //! Main data analysis routine, which updates the event to a new level - virtual bool AnalyzeEvent(MReadOutAssembly* Event); - - //! Show the options GUI - virtual void ShowOptionsGUI(); - - vector > ParseOneSource(string); - void LoadCorrectionInfo(); - void LoadCorrectionInfoUpdated(); - double Interpolate(double,int,int); - double EstimateE0(double,double,double,int,int); - void dummy_func(); //for debugging - - // protected methods: - protected: - - // private methods: - private: - - - - // protected members: - protected: - //holds the fit parameter information - //B[source][detector][side] - vector > > m_B; - - //holds B for fractional fits - //B[detector][side] - vector > m_Bfrac; - - //holds linear interpolation coefficients - //m_linInterpCoeffs[detector][side][0 or 1] - double m_linInterpCoeffs[12][2][2]; - - //number of sources used for correction - int m_nSources; - - - // private members: - private: - //bool m_IsCalibrationLoaded[10]; - //bool m_IsCalibrationLoadedPixel[10][37][37]; - //unsigned long ShareHitNumber0,ShareHitNumber1; - //unsigned long SingleHitNumber,OtherHitNumber; - //unsigned long ShareEventNumber0,ShareEventNumber1, SingleEventNumber,OtherEventNumber; - -#ifdef ___CLING___ - public: - ClassDef(MModuleChargeSharingCorrection, 0) // no description -#endif - -}; - -#endif - - -//////////////////////////////////////////////////////////////////////////////// diff --git a/include/MModuleDEESMEX.h b/include/MModuleDEESMEX.h new file mode 100644 index 00000000..b27c37f2 --- /dev/null +++ b/include/MModuleDEESMEX.h @@ -0,0 +1,144 @@ +/* + * MModuleDEESMEX.h + * + * Copyright (C) by Andreas Zoglauer. + * All rights reserved. + * + * Please see the source-file for the copyright-notice. + * + */ + + +#ifndef __MModuleDEESMEX__ +#define __MModuleDEESMEX__ + + +//////////////////////////////////////////////////////////////////////////////// + + +// Standard libs: + +// ROOT libs: + +// MEGAlib libs: +#include "MGlobal.h" + +// Nuclearizer libs +#include "MModule.h" +#include "MSubModuleDEEIntake.h" +#include "MSubModuleRandomCoincidence.h" +#include "MSubModuleShieldEnergyCorrection.h" +#include "MSubModuleShieldReadout.h" +#include "MSubModuleShieldTrigger.h" +#include "MSubModuleChargeTransport.h" +#include "MSubModuleStripReadout.h" +#include "MSubModuleStripReadoutNoise.h" +#include "MSubModuleStripTrigger.h" +#include "MSubModuleDepthReadout.h" +#include "MSubModuleDEEOutput.h" + +// Forward declarations: + + +//////////////////////////////////////////////////////////////////////////////// + + +class MModuleDEESMEX : public MModule +{ + // public interface: + public: + //! Default constructor + MModuleDEESMEX(); + //! Default destructor + virtual ~MModuleDEESMEX(); + + //! Create a new object of this class + virtual MModuleDEESMEX* Clone() { return new MModuleDEESMEX(); } + + //! Set the geometry + virtual void SetGeometry(MDGeometryQuest* Geometry) { MModule::SetGeometry(Geometry); } + + //! Set geometry file name + void SetGeometryFileName(const MString& FileName) { cout<<"Use SetGeometry instead"< ADCs and thresholds + MSubModuleStripReadout m_StripReadout; + + //! The sub module handling the strip readout noise on non-triggered strips + MSubModuleStripReadout m_StripReadoutNoise; + + //! The sub module handling triggers and guard ring vetoes + MSubModuleStripTrigger m_StripTrigger; + + //! The sub module handling depth and timing noise + MSubModuleDepthReadout m_DepthReadout; + + //! The sub module handling the output of the DEE in to the standard nuclearizer classes + MSubModuleDEEOutput m_Output; + + +#ifdef ___CLING___ + public: + ClassDef(MModuleDEESMEX, 0) // no description +#endif + +}; + +#endif + + +//////////////////////////////////////////////////////////////////////////////// diff --git a/include/MModuleDepthCalibration2024.h b/include/MModuleDepthCalibration2024.h index 5e03bb0a..21f48291 100644 --- a/include/MModuleDepthCalibration2024.h +++ b/include/MModuleDepthCalibration2024.h @@ -72,11 +72,6 @@ class MModuleDepthCalibration2024 : public MModule //! Get filename for CTD->Depth splines MString GetSplinesFileName() const {return m_SplinesFile;} - //! Set filename for TAC Calibration - void SetTACCalFileName( const MString& FileName) {m_TACCalFile = FileName;} - //! Get filename for TAC Calibration - MString GetTACCalFileName() const {return m_TACCalFile;} - //! Set whether the data came from the card cage at UCSD void SetUCSDOverride( bool Override ) {m_UCSDOverride = Override;} //! Get whether the data came from the card cage at UCSD @@ -109,13 +104,11 @@ class MModuleDepthCalibration2024 : public MModule //! Load in the specified coefficients file bool LoadCoeffsFile(MString FName); //! Return the coefficients for a pixel - vector* GetPixelCoeffs(int pixel_code); + vector* GetPixelCoeffs(int PixelCode); //! Load the splines file bool LoadSplinesFile(MString FName); - //! Load the TAC Calibration file - bool LoadTACCalFile(MString FName); //! Get the timing FWHM noise for the specified pixel and Energy - double GetTimingNoiseFWHM(int pixel_code, double Energy); + double GetTimingNoiseFWHM(int PixelCode, double Energy); // private methods @@ -127,12 +120,8 @@ class MModuleDepthCalibration2024 : public MModule unordered_map> m_Coeffs; double m_Coeffs_Energy; - unordered_map>> m_HVTACCal; - unordered_map>> m_LVTACCal; MString m_CoeffsFile; MString m_SplinesFile; - MString m_TACCalFile; - unordered_map m_DetectorNames; unordered_map m_Thicknesses; unordered_map m_NXStrips; unordered_map m_NYStrips; @@ -146,7 +135,9 @@ class MModuleDepthCalibration2024 : public MModule uint64_t m_Error5; uint64_t m_Error6; uint64_t m_ErrorSH; - vector m_Detectors; + uint64_t m_ErrorNullSH; + uint64_t m_ErrorNoE; + unordered_map m_Detectors; vector m_DetectorIDs; MModuleEnergyCalibrationUniversal* m_EnergyCalibration; MGUIExpoDepthCalibration2024* m_ExpoDepthCalibration; @@ -156,7 +147,6 @@ class MModuleDepthCalibration2024 : public MModule unordered_map> m_DepthGrid; bool m_SplinesFileIsLoaded; bool m_CoeffsFileIsLoaded; - bool m_TACCalFileIsLoaded; // boolean for use with the card cage at UCSD since it tags all events as detector 11 bool m_UCSDOverride; diff --git a/include/MModuleEventSaver.h b/include/MModuleEventSaver.h index 28f1e5ad..7211f27d 100644 --- a/include/MModuleEventSaver.h +++ b/include/MModuleEventSaver.h @@ -58,10 +58,15 @@ class MModuleEventSaver : public MModule //! Set the file name void SetFileName(const MString& Name) { m_FileName = Name; } - //! Get the file name + //! Return true if the Bad events should be saved bool GetSaveBadEvents() const { return m_SaveBadEvents; } - //! Set the file name + //! Set whether the Bad events should be saved void SetSaveBadEvents(bool SaveBadEvents) { m_SaveBadEvents = SaveBadEvents; } + + //! Return true if the Veto events should be saved + bool GetSaveVetoEvents() const { return m_SaveVetoEvents; } + //! Set whether the Veto events should be saved + void SetSaveVetoEvents(bool SaveVetoEvents) {m_SaveVetoEvents = SaveVetoEvents; } //! Get the add time tag flag bool GetAddTimeTag() const { return m_AddTimeTag; } @@ -77,7 +82,47 @@ class MModuleEventSaver : public MModule MTime GetSplitFileTime() const { return m_SplitFileTime; } //! Set the time after which the file should be split void SetSplitFileTime(MTime SplitFileTime) { m_SplitFileTime = SplitFileTime; } - + + //! Return whether ADCs should be included in the roa file + bool GetRoaWithADCs() const { return m_RoaWithADCs; } + //! Set whether ADCs should be included in the roa file + void SetRoaWithADCs(bool Flag) { m_RoaWithADCs = Flag; } + + //! Return whether TACs should be included in the roa file + bool GetRoaWithTACs() const { return m_RoaWithTACs; } + //! Set whether TACs should be included in the roa file + void SetRoaWithTACs(bool Flag) { m_RoaWithTACs = Flag; } + + //! Return whether energies should be included in the roa file + bool GetRoaWithEnergies() const { return m_RoaWithEnergies; } + //! Set whether energies should be included in the roa file + void SetRoaWithEnergies(bool Flag) { m_RoaWithEnergies = Flag; } + + //! Return whether timings should be included in the roa file + bool GetRoaWithTimings() const { return m_RoaWithTimings; } + //! Set whether timings should be included in the roa file + void SetRoaWithTimings(bool Flag) { m_RoaWithTimings = Flag; } + + //! Return whether temperatures should be included in the roa file + bool GetRoaWithTemperatures() const { return m_RoaWithTemperatures; } + //! Set whether temperatures should be included in the roa file + void SetRoaWithTemperatures(bool Flag) { m_RoaWithTemperatures = Flag; } + + //! Return whether flags should be included in the roa file + bool GetRoaWithFlags() const { return m_RoaWithFlags; } + //! Set whether flags should be included in the roa file + void SetRoaWithFlags(bool Flag) { m_RoaWithFlags = Flag; } + + //! Return whether origins should be included in the roa file + bool GetRoaWithOrigins() const { return m_RoaWithOrigins; } + //! Set whether origins should be included in the roa file + void SetRoaWithOrigins(bool Flag) { m_RoaWithOrigins = Flag; } + + //! Return whether nearest neighbors should be included in the roa file + bool GetRoaWithNearestNeighbors() const { return m_RoaWithNearestNeighbors; } + //! Set whether nearest neighbors should be included in the roa file + void SetRoaWithNearestNeighbors(bool Flag) { m_RoaWithNearestNeighbors = Flag; } + //! Set the start area of the far field simulation if there was any void SetStartAreaFarField(double Area) { m_StartAreaFarField = Area; } //! Set the number if simulated events @@ -148,6 +193,9 @@ class MModuleEventSaver : public MModule //! Save bad events bool m_SaveBadEvents; + //! Save Veto events + bool m_SaveVetoEvents; + //! Add a time tag to the file bool m_AddTimeTag; @@ -158,6 +206,25 @@ class MModuleEventSaver : public MModule bool m_SplitFile; //! If we split the file, this is the time in seconds after which we split MTime m_SplitFileTime; + + // Roa options + + //! If true write ADC values to the roa file + bool m_RoaWithADCs; + //! If true write TAC values to the roa file + bool m_RoaWithTACs; + //! If true write energy values to the roa file + bool m_RoaWithEnergies; + //! If true write timing values to the roa file + bool m_RoaWithTimings; + //! If true write temperature values to the roa file + bool m_RoaWithTemperatures; + //! If true write flags to the roa file + bool m_RoaWithFlags; + //! If true write origins to the roa file + bool m_RoaWithOrigins; + //! True if we should include next neighbors in the data stream + bool m_RoaWithNearestNeighbors; //! Main output stream for file MFile m_Out; diff --git a/include/MModuleLoaderMeasurements.h b/include/MModuleLoaderMeasurements.h index a1c31e39..bf9b59e0 100644 --- a/include/MModuleLoaderMeasurements.h +++ b/include/MModuleLoaderMeasurements.h @@ -51,9 +51,6 @@ class MModuleLoaderMeasurements : public MModule, public MFileEvents //! Main data analysis routine, which updates the event to a new level virtual bool AnalyzeEvent(MReadOutAssembly* Event); - //! Show the options GUI - virtual void ShowOptionsGUI(); - //! Read the configuration data from an XML node virtual bool ReadXmlConfiguration(MXmlNode* Node) = 0; //! Create an XML node tree from the configuration diff --git a/include/MModuleLoaderMeasurementsBinary.h b/include/MModuleLoaderMeasurementsBinary.h deleted file mode 100644 index 313fbb5c..00000000 --- a/include/MModuleLoaderMeasurementsBinary.h +++ /dev/null @@ -1,132 +0,0 @@ -/* - * MModuleLoaderMeasurementsBinary.h - * - * Copyright (C) by Andreas Zoglauer. - * All rights reserved. - * - * Please see the source-file for the copyright-notice. - * - */ - - -#ifndef __MModuleLoaderMeasurementsBinary__ -#define __MModuleLoaderMeasurementsBinary__ - - -//////////////////////////////////////////////////////////////////////////////// - - -// Standard libs: -#include -#include -using namespace std; - -// ROOT libs: -#include "zlib.h" - -// MEGAlib libs: -#include "MGlobal.h" - -// Nuclearizer libs -#include "MModule.h" -#include "MBinaryFlightDataParser.h" -#include "MGUIExpoAspectViewer.h" - -// Forward declarations: - - -//////////////////////////////////////////////////////////////////////////////// - - -class MModuleLoaderMeasurementsBinary : public MModule, public MBinaryFlightDataParser -{ - // public interface: - public: - - //! Default constructor - MModuleLoaderMeasurementsBinary(); - //! Default destructor - virtual ~MModuleLoaderMeasurementsBinary(); - - //! Create a new object of this class - virtual MModuleLoaderMeasurementsBinary* Clone() { return new MModuleLoaderMeasurementsBinary(); } - - //! Get the file name - MString GetFileName() const { return m_FileName; } - //! Set the file name - void SetFileName(const MString& Name) { m_FileName = Name; } - - //! Return if the module is ready to analyze events - virtual bool IsReady(); - - //! Create the expos - virtual void CreateExpos(); - - //! Initialize the module - virtual bool Initialize(); - - //! Finalize the module --- can be overwritten - virtual void Finalize(); - - //! Main data analysis routine, which updates the event to a new level - virtual bool AnalyzeEvent(MReadOutAssembly* Event); - - //! Show the options GUI - virtual void ShowOptionsGUI(); - - //! Read the configuration data from an XML node - virtual bool ReadXmlConfiguration(MXmlNode* Node); - //! Create an XML node tree from the configuration - virtual MXmlNode* CreateXmlConfiguration(); - - - - // protected methods: - protected: - //! Perform Handshake - bool DoHandshake(); - - //! Open next file, return false on error - bool OpenNextFile(); - - // private methods: - private: - - - // protected members: - protected: - - - // private members: - private: - //! A GUI to display the aspect data - MGUIExpoAspectViewer* m_ExpoAspectViewer; - - //! The file name - MString m_FileName; - //! True if the current fiule is gzip'ed - bool m_IsZipped; - //! The current binary data stream uncompressed - ifstream m_In; - //! The basic file stream for zlib - gzFile m_ZipFile; - //! A list of all binary data files - vector m_BinaryFileNames; - //! The currently open binary file name (-1 none is open) - int m_OpenFileID; - //! Flag indicating that file read is over - bool m_FileIsDone; - - -#ifdef ___CLING___ - public: - ClassDef(MModuleLoaderMeasurementsBinary, 0) // no description -#endif - -}; - -#endif - - - -//////////////////////////////////////////////////////////////////////////////// diff --git a/include/MModuleLoaderMeasurementsHDF.h b/include/MModuleLoaderMeasurementsHDF.h new file mode 100644 index 00000000..a926e449 --- /dev/null +++ b/include/MModuleLoaderMeasurementsHDF.h @@ -0,0 +1,239 @@ +/* + * MModuleLoaderMeasurementsHDF.h + * + * Copyright (C) by Andreas Zoglauer. + * All rights reserved. + * + * Please see the source-file for the copyright-notice. + * + */ + + +#ifndef __MModuleLoaderMeasurementsHDF__ +#define __MModuleLoaderMeasurementsHDF__ + + +//////////////////////////////////////////////////////////////////////////////// + + +// Standard libs: + +// ROOT libs: + +// MEGAlib libs: +#include "MGlobal.h" +#include "MFileReadOuts.h" + +// Nuclearizer libs: +#include "MStripMap.h" +#include "MModuleLoaderMeasurements.h" + +// H5 libs +#include "H5Cpp.h" +using namespace H5; + +// Forward declarations: + + +//////////////////////////////////////////////////////////////////////////////// + + +//! The versions of the strip hits stored in the HDF file +enum class MHDFStripHitVersion { V1_0, V1_2 }; + +//! And a streamer for it +inline ostream& operator<<(ostream& os, MHDFStripHitVersion Version) { + switch (Version) { + case MHDFStripHitVersion::V1_0: return os<<"1.0"; + case MHDFStripHitVersion::V1_2: return os<<"1.2"; + default: return os<<"Unknown"; + } +} + +//! Version 1.0 & 1.1 of the HDF5 hit info +struct MHDFStripHit_V1_0 { + uint16_t m_EventID; + uint32_t m_TimeCode; + uint8_t m_HitType; + uint8_t m_TimingType; + uint16_t m_StripID; + uint8_t m_CrystalID; + uint8_t m_Gain; + uint8_t m_Overflow; + uint16_t m_CurrentMaximum; + uint16_t m_HighCurrentSamples; + uint16_t m_EnergyData; + uint16_t m_EnergyDataLowGain; + uint16_t m_EnergyDataHighGain; + uint16_t m_TimingData; + uint8_t m_Pad; + uint8_t m_Hits; + uint8_t m_EventType; + uint8_t m_CRC; +}; + +//! Version 1.2 of the HDF5 hit info +struct MHDFStripHit_V1_2 { + uint16_t m_EventID; + uint64_t m_TimeCode; + double m_GSETimeCode; + uint8_t m_HitType; + uint8_t m_TimingType; + uint16_t m_StripID; + uint8_t m_CrystalID; + uint8_t m_Gain; + uint8_t m_Overflow; + uint16_t m_CurrentMaximum; + uint16_t m_HighCurrentSamples; + uint16_t m_EnergyData; + uint16_t m_EnergyDataLowGain; + uint16_t m_EnergyDataHighGain; + uint16_t m_TimingData; + uint8_t m_Pad; + uint8_t m_Hits; + uint16_t m_Bytes; + uint8_t m_EventType; + uint8_t m_CRC; +}; + +//! The version string +struct MHDFStripHitVersionString { + char string_col[256]; +}; + +//////////////////////////////////////////////////////////////////////////////// + + +//! A module to load HDF5 data files +class MModuleLoaderMeasurementsHDF : public MModuleLoaderMeasurements +{ + // public interface: + public: + //! Default constructor + MModuleLoaderMeasurementsHDF(); + //! Default destructor + virtual ~MModuleLoaderMeasurementsHDF(); + + //! Create a new object of this class + virtual MModuleLoaderMeasurementsHDF* Clone() { return new MModuleLoaderMeasurementsHDF(); } + + //! Get the file name of the strip map + MString GetFileNameStripMap() const { return m_FileNameStripMap; } + //! Set the file name of the strip map + void SetFileNameStripMap(const MString& Name) { m_FileNameStripMap = Name; } + + + //! Enable/Disable loading continuation files + bool GetLoadContinuationFiles() const { return m_LoadContinuationFiles; } + //! Set loading continuation files + void SetLoadContinuationFiles(bool LoadContinuationFiles) { m_LoadContinuationFiles = LoadContinuationFiles; } + + //! Initialize the module + virtual bool Initialize(); + + //! Initialize the module + virtual void Finalize(); + + //! Main data analysis routine, which updates the event to a new level + virtual bool AnalyzeEvent(MReadOutAssembly* Event); + + //! Show the options GUI + virtual void ShowOptionsGUI(); + + //! Read the configuration data from an XML node + virtual bool ReadXmlConfiguration(MXmlNode* Node); + //! Create an XML node tree from the configuration + virtual MXmlNode* CreateXmlConfiguration(); + + + // protected methods: + protected: + //! Convert more data from raw to intermediate format - return false if no more data can be converted + bool OpenHDF5File(MString FileName); + //! Read a batch of hits using a hyperslab + bool ReadBatchHits(); + + // private methods: + private: + + + + // protected members: + protected: + + + // private members: + private: + /* + //! Start of the observation time + MTime m_StartObservationTime; + //! Clock time belonging to the start of the observation time + unsigned long m_StartClock; + //! End of the observation time + MTime m_EndObservationTime; + //! Clock time belonging to the end of the observation time + unsigned long m_EndClock; + */ + + //! The HDF5 file + H5File m_HDFFile; + + //! True, if we want to load continuation files + bool m_LoadContinuationFiles; + + //! The ID of the currently loaded continuation file + unsigned int m_ContinuationFileID; + + //! The HDF5 data set + DataSet m_HDFDataSet; + + //! The HDF5 compond data type + CompType m_HDFCompoundDataType; + + //! The version of the strip hit structure + MHDFStripHitVersion m_HDFStripHitVersion; + + //! The default batch size + static constexpr unsigned int m_DefaultBatchSize = 10000; + + //! The current batch size + unsigned int m_CurrentBatchSize; + + //! The current index in the batch + unsigned int m_CurrentBatchIndex; + + // The various batches: + //! The MHDFStripHit_V1_0 batch: + vector m_Buffer_1_0; + //! The MHDFStripHit_V1_2 batch: + vector m_Buffer_1_2; + + //! Total number of hits in a file + hsize_t m_TotalHits; + + //! Current hit number in the file + hsize_t m_CurrentHit; + + //! Number of event ID roll-overs: + unsigned int m_NumberOfEventIDRollOvers; + + //! The last handled event ID + unsigned int m_LastEventID; + + //! The file name of the strip map + MString m_FileNameStripMap; + + //! The strip map + MStripMap m_StripMap; + +#ifdef ___CLING___ + public: + ClassDef(MModuleLoaderMeasurementsHDF, 0) // no description +#endif + +}; + +#endif + + +//////////////////////////////////////////////////////////////////////////////// diff --git a/include/MModuleLoaderMeasurementsROA.h b/include/MModuleLoaderMeasurementsROA.h index 9db50119..3b302782 100644 --- a/include/MModuleLoaderMeasurementsROA.h +++ b/include/MModuleLoaderMeasurementsROA.h @@ -57,6 +57,9 @@ class MModuleLoaderMeasurementsROA : public MModuleLoaderMeasurements //! Main data analysis routine, which updates the event to a new level virtual bool AnalyzeEvent(MReadOutAssembly* Event); + //! Show the options GUI + virtual void ShowOptionsGUI(); + //! Read the configuration data from an XML node virtual bool ReadXmlConfiguration(MXmlNode* Node); //! Create an XML node tree from the configuration diff --git a/include/MModuleLoaderSimulationsCosima.h b/include/MModuleLoaderSimulationsCosima.h new file mode 100644 index 00000000..c8e846b6 --- /dev/null +++ b/include/MModuleLoaderSimulationsCosima.h @@ -0,0 +1,132 @@ +/* + * MModuleLoaderSimulationsCosima.h + * + * Copyright (C) by Andreas Zoglauer. + * All rights reserved. + * + * Please see the source-file for the copyright-notice. + * + */ + + +#ifndef __MModuleLoaderSimulationsCosima__ +#define __MModuleLoaderSimulationsCosima__ + + +//////////////////////////////////////////////////////////////////////////////// + + +// Standard libs: + +// ROOT libs: + +// MEGAlib libs: +#include "MGlobal.h" + +// Nuclearizer libs +#include "MModule.h" +#include "MFileEventsSim.h" + +// Forward declarations: + + +//////////////////////////////////////////////////////////////////////////////// + + +class MModuleLoaderSimulationsCosima : public MModule +{ + // public interface: + public: + //! Default constructor + MModuleLoaderSimulationsCosima(); + //! Default destructor + virtual ~MModuleLoaderSimulationsCosima(); + + //! Create a new object of this class + virtual MModuleLoaderSimulationsCosima* Clone() { return new MModuleLoaderSimulationsCosima(); } + + //! Set the geometry + virtual void SetGeometry(MDGeometryQuest* Geometry) { MModule::SetGeometry(Geometry); } + + //! Set the simulation file name + void SetSimulationFileName(const MString& FileName) { m_SimulationFileName = FileName; } + //! Get the simulation file name + MString GetSimulationFileName() const { return m_SimulationFileName; } + + //! Set if the stop after X accepted events flag is used + void SetUseStopAfter(bool Flag) { m_UseStopAfter = Flag; } + //! Return if the stop after X accepted events option is used + bool UseStopAfter() const { return m_UseStopAfter; } + + //! Set the maximum number of accepted events + void SetMaximumAcceptedEvents(unsigned long MaximumAcceptedEvents) { m_MaximumAcceptedEvents = MaximumAcceptedEvents; } + //! Return the maximum number of accepted events + unsigned long GetMaximumAcceptedEvents() const { return m_MaximumAcceptedEvents; } + + + //! Initialize the module + virtual bool Initialize(); + + //! Main data analysis routine, which updates the event to a new level + virtual bool AnalyzeEvent(MReadOutAssembly* Event); + + //! Finalize the module + virtual void Finalize(); + + + //! Show the options GUI + virtual void ShowOptionsGUI(); + + //! Read the configuration data from an XML node + virtual bool ReadXmlConfiguration(MXmlNode* Node); + //! Create an XML node tree from the configuration + virtual MXmlNode* CreateXmlConfiguration(); + + + // protected methods: + protected: + + // private methods: + private: + + + + // protected members: + protected: + + + // private members: + private: + + //! Stop after a certain amount of accpetd events + bool m_UseStopAfter; + //! The currently accepted events + unsigned long m_AcceptedEvents; + //! Stop after this amount of accepted events + unsigned long m_MaximumAcceptedEvents; + + //! Simulation file name + MString m_SimulationFileName; + + //! The event reader + MFileEventsSim* m_Reader; + + //! The far field start area + double m_StartAreaFarField; + + //! The number of simulated events + unsigned long m_NumberOfSimulatedEvents; + + + +#ifdef ___CLING___ + public: + ClassDef(MModuleLoaderSimulationsCosima, 0) // no description +#endif + +}; + +#endif + + +//////////////////////////////////////////////////////////////////////////////// diff --git a/include/MModuleLoaderSimulationsSingleDet.h b/include/MModuleLoaderSimulationsSingleDet.h new file mode 100644 index 00000000..f8a67ad0 --- /dev/null +++ b/include/MModuleLoaderSimulationsSingleDet.h @@ -0,0 +1,116 @@ +/* + * MModuleLoaderSimulationsSingleDet.h + * + * Copyright (C) by Andreas Zoglauer. + * All rights reserved. + * + * Please see the source-file for the copyright-notice. + * + */ + + +#ifndef __MModuleLoaderSimulationsSingleDet__ +#define __MModuleLoaderSimulationsSingleDet__ + + +//////////////////////////////////////////////////////////////////////////////// + + +// Standard libs: + +// ROOT libs: + +// MEGAlib libs: +#include "MGlobal.h" + +// Nuclearizer libs +#include "MModule.h" +#include "MDetectorEffectsEngineSingleDet.h" + +// Forward declarations: + + +//////////////////////////////////////////////////////////////////////////////// + + +class MModuleLoaderSimulationsSingleDet : public MModule, public MDetectorEffectsEngineSingleDet +{ + // public interface: + public: + //! Default constructor + MModuleLoaderSimulationsSingleDet(); + //! Default destructor + virtual ~MModuleLoaderSimulationsSingleDet(); + + //! Create a new object of this class + virtual MModuleLoaderSimulationsSingleDet* Clone() { return new MModuleLoaderSimulationsSingleDet(); } + + //! Set the geometry + virtual void SetGeometry(MDGeometryQuest* Geometry) { MModule::SetGeometry(Geometry); } + + //! Set geometry file name + void SetGeometryFileName(const MString& FileName) { cout<<"Use SetGeometry instead"< StripHits, int det, unsigned int side); + // protected members: @@ -84,13 +73,13 @@ class MModuleCrosstalkCorrection : public MModule // private members: private: - bool m_IsCalibrationLoadedDet[12]; - bool m_IsCalibrationLoaded[12][2][3]; - double m_CrosstalkCoeffs[12][2][3][2]; + + + #ifdef ___CLING___ public: - ClassDef(MModuleCrosstalkCorrection, 0) // no description + ClassDef(MModuleNearestNeighbor, 0) // no description #endif }; diff --git a/include/MModuleReceiverBalloon.h b/include/MModuleReceiverBalloon.h deleted file mode 100644 index 586501dd..00000000 --- a/include/MModuleReceiverBalloon.h +++ /dev/null @@ -1,173 +0,0 @@ -/* - * MModuleReceiverBalloon.h - * - * Copyright (C) by Alex Lowell & Andreas Zoglauer. - * All rights reserved. - * - * Please see the source-file for the copyright-notice. - * - */ - - -#ifndef __MModuleReceiverBalloon__ -#define __MModuleReceiverBalloon__ - - -//////////////////////////////////////////////////////////////////////////////// - - -// Standard libs: -#include -#include -using namespace std; - -// ROOT libs: - -// MEGAlib libs: -#include "MGlobal.h" -#include "MTransceiverTcpIpBinary.h" - -// Nuclearizer libs -#include "MModule.h" -#include "MBinaryFlightDataParser.h" -#include "MGUIExpoAspectViewer.h" -#include "MGUIExpoReceiver.h" - -// Forward declarations: - - -//////////////////////////////////////////////////////////////////////////////// - - -class MModuleReceiverBalloon : public MModule, public MBinaryFlightDataParser -{ - // public interface: - public: - - //! Default constructor - MModuleReceiverBalloon(); - //! Default destructor - virtual ~MModuleReceiverBalloon(); - - //! Create a new object of this class - virtual MModuleReceiverBalloon* Clone() { return new MModuleReceiverBalloon(); } - - //! Return the name of the transmitting computer - MString GetDistributorName() const { return m_DistributorName; } - //! Set the name of the transmitting computer - void SetDistributorName(MString DistributorName) { m_DistributorName = DistributorName; } - - //! Return the port of the transmitting computer - int GetDistributorPort() const { return m_DistributorPort; } - //! Set the port of the transmitting computer - void SetDistributorPort(int DistributorPort) { m_DistributorPort = DistributorPort; } - - //! Return the stream ID to be transmitted - MString GetDistributorStreamID() const { return m_DistributorStreamID; } - //! Set the ID of the stream which should be transmitted - void SetDistributorStreamID(MString DistributorStreamID) { m_DistributorStreamID = DistributorStreamID; } - - //! Return the local receiving host name - MString GetLocalReceivingHostName() const { return m_LocalReceivingHostName; } - //! Set the name of the local receiveing host - void SetLocalReceivingHostName(MString LocalReceivingHostName) { m_LocalReceivingHostName = LocalReceivingHostName; } - - //! Return the port of the local receiving host computer - int GetLocalReceivingPort() const { return m_LocalReceivingPort; } - //! Set the port of the local receiving host computer - void SetLocalReceivingPort(int LocalReceivingPort) { m_LocalReceivingPort = LocalReceivingPort; } - - //! Get the file name - MString GetRoaFileName() const { return m_RoaFileName; } - //! Set the file name - void SetRoaFileName(const MString& Name) { m_RoaFileName = Name; } - - //! Return if the module is ready to analyze events - virtual bool IsReady(); - - //! Create the expos - virtual void CreateExpos(); - - //! Initialize the module - virtual bool Initialize(); - - //! Finalize the module --- can be overwritten - virtual void Finalize(); - - //! Main data analysis routine, which updates the event to a new level - virtual bool AnalyzeEvent(MReadOutAssembly* Event); - - //! Show the options GUI - virtual void ShowOptionsGUI(); - - //! Read the configuration data from an XML node - virtual bool ReadXmlConfiguration(MXmlNode* Node); - //! Create an XML node tree from the configuration - virtual MXmlNode* CreateXmlConfiguration(); - - - - // protected methods: - protected: - //! Request connection - bool RequestConnection(); - //! End connection - bool EndConnection(); - - // private methods: - private: - - - // protected members: - protected: - - - // private members: - private: - - //! A GUI to display the aspect data - MGUIExpoAspectViewer* m_ExpoAspectViewer; - //! A GUI to display the received data statistics - MGUIExpoReceiver* m_ExpoReceiver; - - - //! The name of the computer from which we receive the data - MString m_DistributorName; - //! The port on the computer from which we receive the data - int m_DistributorPort; - //! The stream ID which we want to receive - MString m_DistributorStreamID; - - //! Request an host and port from the distributor - bool m_RequestConnection; - //! Where to send the data to - MString m_LocalReceivingHostName; - //! Port to send the data to - int m_LocalReceivingPort; - - //! ROA save file name - MString m_RoaFileName; - - //! The transceiver - MTransceiverTcpIpBinary* m_Receiver; - - //! The total received data - long m_ReceivedData; - //! Timer whne the last update summary was shown - - //! Output stream for roa file - ofstream m_Out; - - -#ifdef ___CLING___ - public: - ClassDef(MModuleReceiverBalloon, 0) // no description -#endif - -}; - -#endif - - - -//////////////////////////////////////////////////////////////////////////////// diff --git a/include/MModuleTACcut.h b/include/MModuleTACcut.h new file mode 100644 index 00000000..7bf3836a --- /dev/null +++ b/include/MModuleTACcut.h @@ -0,0 +1,134 @@ +/* + * MModuleTACcut.h + * + * Copyright (C) by Andreas Zoglauer. + * All rights reserved. + * + * Please see the source-file for the copyright-notice. + * + */ + + +#ifndef __MModuleTACcut__ +#define __MModuleTACcut__ + + +//////////////////////////////////////////////////////////////////////////////// + + +// Standard libs: +#include + +// ROOT libs: +#include "TGClient.h" +#include "TH1.h" + +// MEGAlib libs: +#include "MGlobal.h" +#include "MModule.h" +#include "MGUIExpoTACcut.h" + + +// Forward declarations: + + +//////////////////////////////////////////////////////////////////////////////// + + +class MModuleTACcut : public MModule +{ + // public interface: + public: + //! Default constructor + MModuleTACcut(); + //! Default destructor + virtual ~MModuleTACcut(); + + //! Create a new object of this class + virtual MModuleTACcut* Clone() { return new MModuleTACcut(); } + + //! Initialize the module + virtual bool Initialize(); + + //! Create expos + virtual void CreateExpos(); + + //! Finalize the module + virtual void Finalize(); + + //! Main data analysis routine, which updates the event to a new level + virtual bool AnalyzeEvent(MReadOutAssembly* Event); + + //! Show the options GUI + virtual void ShowOptionsGUI(); + + + //! Read the configuration data from an XML node + virtual bool ReadXmlConfiguration(MXmlNode* Node); + //! Create an XML node tree from the configuration + virtual MXmlNode* CreateXmlConfiguration(); + + ///////////// Creating functions that will update and get the min/max TAC values ////////////////////////// + + //! Set filename for TAC Calibration + void SetTACCalFileName( const MString& FileName) {m_TACCalFile = FileName;} + //! Get filename for TAC Calibration + MString GetTACCalFileName() const {return m_TACCalFile;} + + //! Set filename for TAC Cut + void SetTACCutFileName( const MString& FileName) {m_TACCutFile = FileName;} + //! Get filename for TAC Cut + MString GetTACCutFileName() const {return m_TACCutFile;} + + //! Load the TAC calibration file + bool LoadTACCalFile(MString FName); + + //! Load the TAC cut file + bool LoadTACCutFile(MString FName); + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + + + // protected methods: + protected: + + + // private methods: + private: + + + + // protected members: + protected: + + // private members: + private: + +//! TAC cut and TAC calibration parameter files +MString m_TACCalFile; +MString m_TACCutFile; + +//! Map DetID -> Side (LV=0, HV=1) -> Strip ID -> TAC calibration/cut parameters +unordered_map>>> m_TACCal; +unordered_map>>> m_TACCut; + +//! Map characters representing sides of the detectors indices to avoid mistakes +unordered_map m_SideToIndex; + +vector m_DetectorIDs; + +MGUIExpoTACcut* m_ExpoTACcut; + + +#ifdef ___CLING___ + public: + ClassDef(MModuleTACcut, 0) // no description +#endif + +}; + +#endif + + +//////////////////////////////////////////////////////////////////////////////// diff --git a/include/MReadOutAssembly.h b/include/MReadOutAssembly.h index 8f5e0fa3..7457c206 100644 --- a/include/MReadOutAssembly.h +++ b/include/MReadOutAssembly.h @@ -26,9 +26,11 @@ #include "MReadOutSequence.h" #include "MAspect.h" #include "MStripHit.h" +#include "MDEEStripHit.h" #include "MGuardringHit.h" #include "MHit.h" #include "MPhysicalEvent.h" +#include "MSimEvent.h" #include "MSimIA.h" // Forward declarations: @@ -109,25 +111,15 @@ class MReadOutAssembly : public MReadOutSequence //! Find out if the event contains strip hits in a given detector bool InDetector(int DetectorID); - //! Set the vetoed flag - void SetVeto(bool Veto = true) { m_Veto = Veto; } - //! Return the veto flag - bool GetVeto() const { return m_Veto; } - - //! Set the guard ring 0 veto flag - void SetGR0Veto(bool Veto = true) { m_VetoGR0 = Veto; } - //! Get the guard ring 0 veto flag - bool GetGR0Veto() const { return m_VetoGR0; } - - //! Set the guard ring 1 veto flag - void SetGR1Veto(bool Veto = true) { m_VetoGR1 = Veto; } - //! Get the guard ring 1 veto flag - bool GetGR1Veto() const { return m_VetoGR1; } + //! Set the guard ring veto flag + void SetGuardRingVeto(bool Veto = true) { m_GuardRingVeto = Veto; } + //! Get the guard ring veto flag + bool GetGuardRingVeto() const { return m_GuardRingVeto; } //! Set the shield veto flag - void SetShieldVeto(bool Veto = true) { m_VetoShield = Veto; } + void SetShieldVeto(bool Veto = true) { m_ShieldVeto = Veto; } //! Get the shield veto flag - bool GetShieldVeto() const { return m_VetoShield; } + bool GetShieldVeto() const { return m_ShieldVeto; } //! Set the triggered flag void SetTrigger(bool Trigger = true) { m_Trigger = Trigger; } @@ -175,10 +167,13 @@ class MReadOutAssembly : public MReadOutSequence void RemoveHit(unsigned int i); //! Return the number of simulation hits + // TODO: Remove - part of m_SimEvent unsigned int GetNHitsSim() const { return m_HitsSim.size(); } //! Return simulation hit i + // TODO: Remove - part of m_SimEvent MHit* GetHitSim(unsigned int i); //! Move hits to simulation hits list + // TODO: Why ?? void MoveHitsToSim() {m_HitsSim = m_Hits; m_Hits.clear();} /* @@ -187,12 +182,32 @@ class MReadOutAssembly : public MReadOutSequence //! Return simulation hit i MSimIA* GetSimIA(unsigned int i); */ - + //! Set the physical event from event reconstruction void SetPhysicalEvent(MPhysicalEvent* Event); - //! Return the physical event + //! Return the physical event MPhysicalEvent* GetPhysicalEvent() { return m_PhysicalEvent; } + //! Set the physical event from event reconstruction + void SetSimulatedEvent(MSimEvent* Event) { m_SimEvent = Event; } + //! Return the simulated event + MSimEvent* GetSimulatedEvent() { return m_SimEvent; } + + //! Return the number of low-voltage DEE strip hits + unsigned int GetNDEEStripHitsLV() const { return m_DEEStripHitsLV.size(); } + //! Return low-voltage DEE Strip hit at position i + void AddDEEStripHitLV(MDEEStripHit& DEEStripHit) { return m_DEEStripHitsLV.push_back(DEEStripHit); } + //! Get a reference to the list of strip hits for direct manipulation + list& GetDEEStripHitLVListReference() { return m_DEEStripHitsLV; } + + //! Return the number of high-voltage DEE strip hits + unsigned int GetNDEEStripHitsHV() const { return m_DEEStripHitsHV.size(); } + //! Add a high-voltage DEE Strip hit + void AddDEEStripHitHV(MDEEStripHit DEEStripHit) { return m_DEEStripHitsHV.push_back(DEEStripHit); } + //! Get a reference to the list of strip hits for direct manipulation + list& GetDEEStripHitHVListReference() { return m_DEEStripHitsHV; } + + //! Return the number of read outs //unsigned int GetNReadOuts() const { return m_ReadOuts.size(); } //! Return read out i - throws an exception of the index is not found @@ -254,6 +269,9 @@ class MReadOutAssembly : public MReadOutSequence //! Get the filgtered-out flag bool IsFilteredOut() const { return m_FilteredOut; } + //! Returns true if any of the "veto" flags have been set + bool IsVeto() const; + //! Returns true if none of the "bad" or "incomplete" flags has been set and the event has not been filtered out or rejected bool IsGood() const; //! Returns true if any of the "bad" or "incomplete" flags has been set @@ -276,7 +294,7 @@ class MReadOutAssembly : public MReadOutSequence //! Stream the content in MEGAlib's evta format void StreamEvta(ostream& S); //! Stream the content in MEGAlib's roa format - void StreamRoa(ostream& S, bool WithDescriptor = true); + void StreamRoa(ostream& S, bool WithADCs = true, bool WithTACs = true, bool WithEnergies = false, bool WithTimings = false, bool WithTemperatures = false, bool WithFlags = false, bool WithOrigins = false, bool WithNearestNeighbors = false); //! Build the next MReadoutAssemply from a .dat file bool GetNextFromDatFile(MFile &F); //! Use the info in m_Aspect to turn m_CL into an absolute UTC time @@ -335,17 +353,11 @@ class MReadOutAssembly : public MReadOutSequence //! Quality of this event double m_EventQuality; - //! Veto flag of this event - bool m_Veto; - - //! Guard ring 0 veto flag - bool m_VetoGR0; - - //! Guard ring 1 veto flag - bool m_VetoGR1; + //! Guard ring veto flag + bool m_GuardRingVeto; //! Shield veto flag - bool m_VetoShield; + bool m_ShieldVeto; //! Trigger flag of this event bool m_Trigger; @@ -368,9 +380,18 @@ class MReadOutAssembly : public MReadOutSequence //! List of real hits vector m_Hits; + //! The simulated event (nullptr if there is none) + MSimEvent* m_SimEvent; + //! List of simulation hits + //! TODO: Remove: Part of m_SimEvent vector m_HitsSim; + //! A list of low voltage DEE strips hit - i.e. normal strip hits in the making from the simulated hits sorted by side + list m_DEEStripHitsLV; + //! A list of high voltage DEE strips hit - i.e. normal strip hits in the making from the simulated hits sorted by side + list m_DEEStripHitsHV; + //! The physical event from event reconstruction MPhysicalEvent* m_PhysicalEvent; diff --git a/include/MReadOutElementVoxel3D.h b/include/MReadOutElementVoxel3D.h new file mode 100644 index 00000000..b2c2d860 --- /dev/null +++ b/include/MReadOutElementVoxel3D.h @@ -0,0 +1,123 @@ +/* + * MReadOutElementVoxel3D.h + * + * Created by Valentina Fioretti (INAF OAS Bologna) + * + * Copyright (C) by Andreas Zoglauer. + * All rights reserved. + * + * Please see the source-file for the copyright-notice. + * + */ + + +#ifndef __MReadOutElementVoxel3D__ +#define __MReadOutElementVoxel3D__ + + +//////////////////////////////////////////////////////////////////////////////// + + +// Standard libs: + +// ROOT libs: + +// MEGAlib libs: +#include "MGlobal.h" +#include "MReadOutElement.h" + +// Forward declarations: + +//////////////////////////////////////////////////////////////////////////////// + + +//! The read-out element of a BGO voxel. It reads the detector name and the voxel x, y, z, ID +class MReadOutElementVoxel3D : public MReadOutElement +{ + // public interface: + public: + //! default constructor - Read out element of a voxel 3D + MReadOutElementVoxel3D(); + + //! full constructor - Read out element of a voxel 3D + MReadOutElementVoxel3D(const MString& m_DetectorName, unsigned int m_VoxelXID, unsigned int m_VoxelYID, unsigned int m_VoxelZID); + + //! Simple default destructor + virtual ~MReadOutElementVoxel3D(); + + //! Clone this read-out element - the returned element must be deleted! + virtual MReadOutElementVoxel3D* Clone() const; + + //! Clear the content of this read-out element + virtual void Clear(); + + //! Compare two read-out elements + virtual bool operator==(const MReadOutElement& R) const; + //! Smaller than operator + virtual bool operator<(const MReadOutElement& R) const; + + //! Return true if this read-out element is of the given type + virtual bool IsOfType(const MString& String) const; + //! Return the type of this read-out element + virtual MString GetType() const; + + //! Setters and getters + void SetDetectorName(const MString& Name) { m_DetectorName = Name; } + MString GetDetectorName() const { return m_DetectorName; } + + void SetVoxelXID(unsigned int VoxelXID) { m_VoxelXID = VoxelXID; } + unsigned int GetVoxelXID() const { return m_VoxelXID; } + + void SetVoxelYID(unsigned int VoxelYID) { m_VoxelYID = VoxelYID; } + unsigned int GetVoxelYID() const { return m_VoxelYID; } + + void SetVoxelZID(unsigned int VoxelZID) { m_VoxelZID = VoxelZID; } + unsigned int GetVoxelZID() const { return m_VoxelZID; } + + //! Return the number of parsable elements + virtual unsigned int GetNumberOfParsableElements() const; + //! Parse the data from the tokenizer + virtual bool Parse(const MTokenizer& T, unsigned int StartElement); + //! Return the data as parsable string + virtual MString ToParsableString(bool WithDescriptor = false) const; + + //! Dump a string + virtual MString ToString() const; + + + // protected methods: + protected: + + // private methods: + private: + + + + // protected members: + protected: + + MString m_DetectorName; //!< Detector name + + unsigned int m_VoxelXID; //!< Voxel index X + unsigned int m_VoxelYID; //!< Voxel index Y + unsigned int m_VoxelZID; //!< Voxel index Z + + // private members: + private: + + + +#ifdef ___CLING___ + public: + ClassDef(MReadOutElementVoxel3D, 0) // no description +#endif + +}; + +//! Streamify the read-out element +ostream& operator<<(ostream& os, const MReadOutElementVoxel3D& R); + +#endif + + +//////////////////////////////////////////////////////////////////////////////// diff --git a/include/MShieldCrystalHit.h b/include/MShieldCrystalHit.h new file mode 100644 index 00000000..6b294d45 --- /dev/null +++ b/include/MShieldCrystalHit.h @@ -0,0 +1,146 @@ +/* + * MShieldCrystalHit.h + * + * Copyright (C) by Andreas Zoglauer. + * All rights reserved. + * + * Please see the source-file for the copyright-notice. + * + */ + + +#ifndef __MShieldCrystalHit__ +#define __MShieldCrystalHit__ + + +//////////////////////////////////////////////////////////////////////////////// + + +// Standard libs: + +// ROOT libs: + +// MEGAlib libs: +#include "MGlobal.h" + +// Nuclearizer libs +#include "MReadOutElement.h" +#include "MShieldCrystalHit.h" + +// Forward declarations: + + +//////////////////////////////////////////////////////////////////////////////// + + +class MShieldCrystalHit +{ + // public interface: + public: + //! Default constructor + MShieldCrystalHit(); + //! Default destructor + virtual ~MShieldCrystalHit(); + + //! Reset all data + void Clear(); + + //! Get the read-out element + MReadOutElement* GetReadOutElement() const { return m_ReadOutElement; } + + //! Set the Crystal ID + void SetCrystalID(int StripID) { m_ReadOutElement->SetDetectorID(StripID); } + //! Return the Crystal ID + int GetCrystalID() const { return m_ReadOutElement->GetDetectorID(); } + + //! Set the Detector ID - this derived from the crystal ID + void SetDetectorID(int DetectorID) { m_ReadOutElement->SetDetectorID(DetectorID); } + //! Return the Detector ID- this derived from the crystal ID + int GetDetectorID() const { return m_ReadOutElement->GetDetectorID(); } + + //! Set whether the crystal has triggered + void HasTriggered(bool HasTriggered) { m_HasTriggered = HasTriggered; } + //! Return whether the crystal has triggered + bool HasTriggered() const { return m_HasTriggered; } + + //! Set whether the crystal has triggered + void HasVetoed(bool HasVetoed) { m_HasVetoed = HasVetoed; } + //! Return whether the crystal has triggered + bool HasVetoed() const { return m_HasVetoed; } + + //! Set the ADCUnits of the crystal + void SetADCUnits(double ADCUnits) { m_ADCUnits = ADCUnits; } + //! Return the ADCUnits of the crystal + double GetADCUnits() const { return m_ADCUnits; } + + //! Set the calibrated energy + void SetEnergy(double Energy) { m_Energy = Energy; } + //! Return the calibrated energy + double GetEnergy() const { return m_Energy; } + + //! Set the energy resolution (sigma) + void SetEnergyResolution(double EnergyResolution) { m_EnergyResolution = EnergyResolution; } + //! Return the calibrated energy + double GetEnergyResolution() const { return m_EnergyResolution; } + + //! Set the origins from the simulations (take care of duplicates) + void AddOrigins(vector Origins); + //! Get the origins from the simulation + vector GetOrigins() const { return m_Origins; } + + //! Produce an unsigned int with bitwise values representing flags + unsigned int MakeFlags(); + //! Read in unsigned int with bitwise values representing flags and update boolean flags + void ParseFlags(unsigned int Flags); + + //! Parse some content from a line + bool Parse(MString& Line, int Version = 1); + //! Dump the content into a file stream + bool StreamDat(ostream& S, int Version = 1); + //! Stream the content in MEGAlib's roa format + void StreamRoa(ostream& S, bool WithADC = true, bool WithEnergy = false, bool WithFlags = false, bool WithOrigins = false); + + + // protected methods: + protected: + + // private methods: + private: + + + + // protected members: + protected: + + + // private members: + private: + //! The read-out element with a single ID (representing the crystal ID) + MReadOutElement* m_ReadOutElement; + //! Crystal has triggered + bool m_HasTriggered; + //! Crystal has vetoed + bool m_HasVetoed; + //! ADCUnits before all corrections + double m_UncorrectedADCUnits; + //! ADCUnits after any correction + double m_ADCUnits; + //! The calibrated energy + double m_Energy; + //! The energy resolution + double m_EnergyResolution; + + //! Origin IAs from simulations + vector m_Origins; + +#ifdef ___CLING___ + public: + ClassDef(MShieldCrystalHit, 0) // no description +#endif + +}; + +#endif + + +//////////////////////////////////////////////////////////////////////////////// diff --git a/include/MStripHit.h b/include/MStripHit.h index d9aa131a..5b707c15 100644 --- a/include/MStripHit.h +++ b/include/MStripHit.h @@ -59,21 +59,14 @@ class MStripHit //! Return the Strip ID int GetStripID() const { return m_ReadOutElement->GetStripID(); } - //! Set the strip type (x/y). Note that x strips run parallel to the x-axis!! - //void IsLowVoltageStrip(bool PositiveStrip) { m_ReadOutElement->IsLowVoltageStrip(PositiveStrip); } - //! Return the strip type (x/y). Note that x strips run parallel to the x-axis!! - //bool IsLowVoltageStrip() const { return m_ReadOutElement->IsLowVoltageStrip(); } + //! Set the strip type (x/y) + void IsXStrip(bool PositiveStrip) { m_ReadOutElement->IsLowVoltageStrip(PositiveStrip); } + //! Return the strip type (x/y) + bool IsXStrip() const { return m_ReadOutElement->IsLowVoltageStrip(); } //! Set the strip type (positive or negative) - //void IsLowVoltageStrip(bool PositiveStrip) { m_ReadOutElement->IsLowVoltageStrip(PositiveStrip); } + void IsLowVoltageStrip(bool PositiveStrip) { m_ReadOutElement->IsLowVoltageStrip(PositiveStrip); } //! Return the strip type (positive or negative) - //bool IsLowVoltageStrip() const { return m_ReadOutElement->IsLowVoltageStrip(); } - - //! Set the strip type (LV or HV) - //! Remark: HV = negative = Y strip in old nomenclature) - //! Remark: LV = positive = X strip in old nomenclature) - void IsLowVoltageStrip(bool LowVoltageStrip) { m_ReadOutElement->IsLowVoltageStrip(LowVoltageStrip); } - //! Return the strip type (LV or HV) bool IsLowVoltageStrip() const { return m_ReadOutElement->IsLowVoltageStrip(); } //! Set whether the strip has triggered @@ -101,11 +94,26 @@ class MStripHit //! Return the calibrated energy double GetEnergyResolution() const { return m_EnergyResolution; } - //! Set the Timing of the top side + //! Set the TAC + void SetTAC(double TAC) { m_TAC = TAC; } + //! Return the TAC + double GetTAC() const { return m_TAC; } + + //! Set the TAC resolution + void SetTACResolution(double TACResolution) { m_TACResolution = TACResolution; } + //! Return the TAC resolution + double GetTACResolution() const { return m_TACResolution; } + + //! Set the Timing in nanoseconds void SetTiming(double Timing) { m_Timing = Timing; } - //! Return the Timing of the top side + //! Return the Timing in nanoseconds double GetTiming() const { return m_Timing; } + //! Set the Timing resolution + void SetTimingResolution(double TimingResolution) { m_TimingResolution = TimingResolution; } + //! Return the Timing resolution + double GetTimingResolution() const { return m_TimingResolution; } + //! Set the Temperature of the relavent preamp (in degrees C) void SetPreampTemp(double PreampTemp) { m_PreampTemp = PreampTemp; } //! Return the Temperature of the relavent preamp (in degrees C) @@ -115,15 +123,37 @@ class MStripHit void AddOrigins(vector Origins); //! Get the origins from the simulation vector GetOrigins() const { return m_Origins; } - - - + + //! Set the Guard Ring flag + void IsGuardRing(bool GuardRing) { m_IsGuardRing = GuardRing; } + //! Return a boolean indicating whether the strip is a Guard Ring + bool IsGuardRing() const { return m_IsGuardRing; } + //! Set the Nearest Neighbor flag + void IsNearestNeighbor(bool NearestNeighbor) { m_IsNearestNeighbor = NearestNeighbor; } + //! Return a boolean indicating whether the strip is a Nearest Neighbor + bool IsNearestNeighbor() const { return m_IsNearestNeighbor; } + + //! Set the Fast Timing flag + void HasFastTiming(bool FastTiming) { m_HasFastTiming = FastTiming; } + //! Return a boolean indicating whether the strip timing is fast; + bool HasFastTiming() const { return m_HasFastTiming; } + + //! Set the Calibrated Timing flag + void HasCalibratedTiming(bool CalibratedTiming) { m_HasCalibratedTiming = CalibratedTiming; } + //! Return a boolean indicating whether the strip timing has been calibrated; + bool HasCalibratedTiming() const { return m_HasCalibratedTiming; } + + //! Produce an unsigned int with bitwise values representing flags + unsigned int MakeFlags(); + //! Read in unsigned int with bitwise values representing flags and update boolean flags + void ParseFlags(unsigned int Flags); + //! Parse some content from a line bool Parse(MString& Line, int Version = 1); //! Dump the content into a file stream bool StreamDat(ostream& S, int Version = 1); //! Stream the content in MEGAlib's roa format - void StreamRoa(ostream& S); + void StreamRoa(ostream& S, bool WithADC = true, bool WithTAC = true, bool WithEnergy = false, bool WithTiming = false, bool WithTemperature = false, bool WithFlags = false, bool WithOrigins = false); // protected methods: @@ -152,11 +182,26 @@ class MStripHit double m_Energy; //! The energy resolution double m_EnergyResolution; - //! Timing of the top side + //! TAC timing + double m_TAC; + //! TAC timing resolution + double m_TACResolution; + //! Timing in ns double m_Timing; + //! Timing resolution in ns + double m_TimingResolution; //! Temperature of Preamp double m_PreampTemp; - + + //! Flags denoting the type of strip hit + bool m_IsGuardRing; + bool m_IsNearestNeighbor; + + //! Flag indicating whether the hit has fast timing + bool m_HasFastTiming; + //! Flag indicating whether the hit has calibrated timing + bool m_HasCalibratedTiming; + //! Origin IAs from simulations vector m_Origins; diff --git a/include/MStripMap.h b/include/MStripMap.h new file mode 100644 index 00000000..cce86254 --- /dev/null +++ b/include/MStripMap.h @@ -0,0 +1,105 @@ +/* + * MStripMap.h + * + * Copyright (C) by Andreas Zoglauer + * All rights reserved. + * + * Please see the source-file for the copyright-notice. + * + */ + + +#ifndef __MStripMap__ +#define __MStripMap__ + + +//////////////////////////////////////////////////////////////////////////////// + + +// Standard libs: +#include +#include +using namespace std; + +// ROOT libs: + +// MEGAlib libs: +#include "MGlobal.h" + +// Forward declarations: + + +//////////////////////////////////////////////////////////////////////////////// + + +//! This class represents the mapping from asic channels to detector, side, and strip ID +class MStripMap +{ + // public interface: + public: + //! Default constructor + MStripMap(); + //! Default destructor + virtual ~MStripMap(); + + //! Load a strip map - return false on error + bool Open(MString FileName); + + //! Check if we have a certain read-out ID + bool HasReadOutID(unsigned int ROI) const; + + //! Get detector by read out ID - check with HasReadOutID(ROI) first + unsigned int GetDetectorID(unsigned int ROI) const; + + //! Get detector side by read out ID - check with HasReadOutID(ROI) first + bool IsLowVoltage(unsigned int ROI) const; + + //! Get strip ID by read out ID - check with HasReadOutID(ROI) first + unsigned int GetStripNumber(unsigned int ROI) const; + + + // protected methods: + protected: + //! Return the index of the read-out ID or throw an exception + unsigned int GetReadOutIDIndex(unsigned int ROI) const; + + + // private methods: + private: + + + + // protected members: + protected: + + + // private members: + private: + //! The internal struct for the map + struct MSingleStripMapping { + unsigned int m_ReadOutID; + unsigned int m_RTB; + unsigned int m_DRM; + bool m_IsPrimary; + unsigned int m_ASICID; + unsigned int m_ChannelID; + unsigned int m_DetectorID; + bool m_IsLowVoltage; + unsigned int m_StripNumber; + }; + + //! The strip mapping data + vector m_StripMappings; + + +#ifdef ___CLING___ + public: + ClassDef(MStripMap, 0) // no description +#endif + +}; + +#endif + + +//////////////////////////////////////////////////////////////////////////////// diff --git a/include/MSubModuleChargeTransport.h b/include/MSubModuleChargeTransport.h new file mode 100644 index 00000000..96e84790 --- /dev/null +++ b/include/MSubModuleChargeTransport.h @@ -0,0 +1,98 @@ +/* + * __MSubModuleChargeTransport__.h + * + * Copyright (C) by Andreas Zoglauer. + * All rights reserved. + * + * Please see the source-file for the copyright-notice. + * + */ + + +#ifndef __MSubModuleChargeTransport__ +#define __MSubModuleChargeTransport__ + + +//////////////////////////////////////////////////////////////////////////////// + + +// Standard libs: + +// ROOT libs: + +// MEGAlib libs: +#include "MGlobal.h" +#include "MSubModule.h" + +// Forward declarations: + + +//////////////////////////////////////////////////////////////////////////////// + +//! Class handling the charge transport in the GeD detectors +//! End point is the energy in the individual strips and the guard ring +class MSubModuleChargeTransport : public MSubModule +{ + // public interface: + public: + //! Default constructor + MSubModuleChargeTransport(); + + //! No copy constructor + MSubModuleChargeTransport(const MSubModuleChargeTransport&) = delete; + //! No copy assignment + MSubModuleChargeTransport& operator=(const MSubModuleChargeTransport&) = delete; + //! No move constructors + MSubModuleChargeTransport(MSubModuleChargeTransport&&) = delete; + //! No move operators + MSubModuleChargeTransport& operator=(MSubModuleChargeTransport&&) = delete; + + //! Default destructor + virtual ~MSubModuleChargeTransport(); + + //! Initialize the module + virtual bool Initialize(); + + //! Clear event data from the module + virtual void Clear(); + + //! Main data analysis routine, which updates the event to a new level + virtual bool AnalyzeEvent(MReadOutAssembly* Event); + + //! Finalize the module + virtual void Finalize(); + + //! Read the configuration data from an XML node + virtual bool ReadXmlConfiguration(MXmlNode* Node); + //! Create an XML node tree from the configuration + virtual MXmlNode* CreateXmlConfiguration(MXmlNode* Node); + + // protected methods: + protected: + + // private methods: + private: + + + + // protected members: + protected: + + + // private members: + private: + + + + +#ifdef ___CLING___ + public: + ClassDef(MSubModuleChargeTransport, 0) // no description +#endif + +}; + +#endif + + +//////////////////////////////////////////////////////////////////////////////// diff --git a/include/MSubModuleDEEIntake.h b/include/MSubModuleDEEIntake.h new file mode 100644 index 00000000..0b5e1a10 --- /dev/null +++ b/include/MSubModuleDEEIntake.h @@ -0,0 +1,97 @@ +/* + * MSubModuleDEEIntake.h + * + * Copyright (C) by Andreas Zoglauer. + * All rights reserved. + * + * Please see the source-file for the copyright-notice. + * + */ + + +#ifndef __MSubModuleDEEIntake__ +#define __MSubModuleDEEIntake__ + + +//////////////////////////////////////////////////////////////////////////////// + + +// Standard libs: + +// ROOT libs: + +// MEGAlib libs: +#include "MGlobal.h" +#include "MSubModule.h" + +// Forward declarations: + + +//////////////////////////////////////////////////////////////////////////////// + + +class MSubModuleDEEIntake : public MSubModule +{ + // public interface: + public: + //! Default constructor + MSubModuleDEEIntake(); + + //! No copy constructor + MSubModuleDEEIntake(const MSubModuleDEEIntake&) = delete; + //! No copy assignment + MSubModuleDEEIntake& operator=(const MSubModuleDEEIntake&) = delete; + //! No move constructors + MSubModuleDEEIntake(MSubModuleDEEIntake&&) = delete; + //! No move operators + MSubModuleDEEIntake& operator=(MSubModuleDEEIntake&&) = delete; + + //! Default destructor + virtual ~MSubModuleDEEIntake(); + + //! Initialize the module + virtual bool Initialize(); + + //! Clear event data from the module + virtual void Clear(); + + //! Main data analysis routine, which updates the event to a new level + virtual bool AnalyzeEvent(MReadOutAssembly* Event); + + //! Finalize the module + virtual void Finalize(); + + //! Read the configuration data from an XML node + virtual bool ReadXmlConfiguration(MXmlNode* Node); + //! Create an XML node tree from the configuration + virtual MXmlNode* CreateXmlConfiguration(MXmlNode* Node); + + // protected methods: + protected: + + // private methods: + private: + + + + // protected members: + protected: + + + // private members: + private: + + + + +#ifdef ___CLING___ + public: + ClassDef(MSubModuleDEEIntake, 0) // no description +#endif + +}; + +#endif + + +//////////////////////////////////////////////////////////////////////////////// diff --git a/include/MSubModuleDEEOutput.h b/include/MSubModuleDEEOutput.h new file mode 100644 index 00000000..6c6a1683 --- /dev/null +++ b/include/MSubModuleDEEOutput.h @@ -0,0 +1,97 @@ +/* + * MSubModuleDEEOutput.h + * + * Copyright (C) by Andreas Zoglauer. + * All rights reserved. + * + * Please see the source-file for the copyright-notice. + * + */ + + +#ifndef __MSubModuleDEEOutput__ +#define __MSubModuleDEEOutput__ + + +//////////////////////////////////////////////////////////////////////////////// + + +// Standard libs: + +// ROOT libs: + +// MEGAlib libs: +#include "MGlobal.h" +#include "MSubModule.h" + +// Forward declarations: + + +//////////////////////////////////////////////////////////////////////////////// + + +class MSubModuleDEEOutput : public MSubModule +{ + // public interface: + public: + //! Default constructor + MSubModuleDEEOutput(); + + //! No copy constructor + MSubModuleDEEOutput(const MSubModuleDEEOutput&) = delete; + //! No copy assignment + MSubModuleDEEOutput& operator=(const MSubModuleDEEOutput&) = delete; + //! No move constructors + MSubModuleDEEOutput(MSubModuleDEEOutput&&) = delete; + //! No move operators + MSubModuleDEEOutput& operator=(MSubModuleDEEOutput&&) = delete; + + //! Default destructor + virtual ~MSubModuleDEEOutput(); + + //! Initialize the module + virtual bool Initialize(); + + //! Clear event data from the module + virtual void Clear(); + + //! Main data analysis routine, which updates the event to a new level + virtual bool AnalyzeEvent(MReadOutAssembly* Event); + + //! Finalize the module + virtual void Finalize(); + + //! Read the configuration data from an XML node + virtual bool ReadXmlConfiguration(MXmlNode* Node); + //! Create an XML node tree from the configuration + virtual MXmlNode* CreateXmlConfiguration(MXmlNode* Node); + + // protected methods: + protected: + + // private methods: + private: + + + + // protected members: + protected: + + + // private members: + private: + + + + +#ifdef ___CLING___ + public: + ClassDef(MSubModuleDEEOutput, 0) // no description +#endif + +}; + +#endif + + +//////////////////////////////////////////////////////////////////////////////// diff --git a/include/MSubModuleDepthReadout.h b/include/MSubModuleDepthReadout.h new file mode 100644 index 00000000..560eb5a3 --- /dev/null +++ b/include/MSubModuleDepthReadout.h @@ -0,0 +1,97 @@ +/* + * MSubModuleDepthReadout.h + * + * Copyright (C) by Andreas Zoglauer. + * All rights reserved. + * + * Please see the source-file for the copyright-notice. + * + */ + + +#ifndef __MSubModuleDepthReadout__ +#define __MSubModuleDepthReadout__ + + +//////////////////////////////////////////////////////////////////////////////// + + +// Standard libs: + +// ROOT libs: + +// MEGAlib libs: +#include "MGlobal.h" +#include "MSubModule.h" + +// Forward declarations: + + +//////////////////////////////////////////////////////////////////////////////// + + +class MSubModuleDepthReadout : public MSubModule +{ + // public interface: + public: + //! Default constructor + MSubModuleDepthReadout(); + + //! No copy constructor + MSubModuleDepthReadout(const MSubModuleDepthReadout&) = delete; + //! No copy assignment + MSubModuleDepthReadout& operator=(const MSubModuleDepthReadout&) = delete; + //! No move constructors + MSubModuleDepthReadout(MSubModuleDepthReadout&&) = delete; + //! No move operators + MSubModuleDepthReadout& operator=(MSubModuleDepthReadout&&) = delete; + + //! Default destructor + virtual ~MSubModuleDepthReadout(); + + //! Initialize the module + virtual bool Initialize(); + + //! Clear event data from the module + virtual void Clear(); + + //! Main data analysis routine, which updates the event to a new level + virtual bool AnalyzeEvent(MReadOutAssembly* Event); + + //! Finalize the module + virtual void Finalize(); + + //! Read the configuration data from an XML node + virtual bool ReadXmlConfiguration(MXmlNode* Node); + //! Create an XML node tree from the configuration + virtual MXmlNode* CreateXmlConfiguration(MXmlNode* Node); + + // protected methods: + protected: + + // private methods: + private: + + + + // protected members: + protected: + + + // private members: + private: + + + + +#ifdef ___CLING___ + public: + ClassDef(MSubModuleDepthReadout, 0) // no description +#endif + +}; + +#endif + + +//////////////////////////////////////////////////////////////////////////////// diff --git a/include/MSubModuleRandomCoincidence.h b/include/MSubModuleRandomCoincidence.h new file mode 100644 index 00000000..fdffd6c3 --- /dev/null +++ b/include/MSubModuleRandomCoincidence.h @@ -0,0 +1,97 @@ +/* + * MSubModuleRandomCoincidence.h + * + * Copyright (C) by Andreas Zoglauer. + * All rights reserved. + * + * Please see the source-file for the copyright-notice. + * + */ + + +#ifndef __MSubModuleRandomCoincidence__ +#define __MSubModuleRandomCoincidence__ + + +//////////////////////////////////////////////////////////////////////////////// + + +// Standard libs: + +// ROOT libs: + +// MEGAlib libs: +#include "MGlobal.h" +#include "MSubModule.h" + +// Forward declarations: + + +//////////////////////////////////////////////////////////////////////////////// + + +class MSubModuleRandomCoincidence : public MSubModule +{ + // public interface: + public: + //! Default constructor + MSubModuleRandomCoincidence(); + + //! No copy constructor + MSubModuleRandomCoincidence(const MSubModuleRandomCoincidence&) = delete; + //! No copy assignment + MSubModuleRandomCoincidence& operator=(const MSubModuleRandomCoincidence&) = delete; + //! No move constructors + MSubModuleRandomCoincidence(MSubModuleRandomCoincidence&&) = delete; + //! No move operators + MSubModuleRandomCoincidence& operator=(MSubModuleRandomCoincidence&&) = delete; + + //! Default destructor + virtual ~MSubModuleRandomCoincidence(); + + //! Initialize the module + virtual bool Initialize(); + + //! Clear event data from the module + virtual void Clear(); + + //! Main data analysis routine, which updates the event to a new level + virtual bool AnalyzeEvent(MReadOutAssembly* Event); + + //! Finalize the module + virtual void Finalize(); + + //! Read the configuration data from an XML node + virtual bool ReadXmlConfiguration(MXmlNode* Node); + //! Create an XML node tree from the configuration + virtual MXmlNode* CreateXmlConfiguration(MXmlNode* Node); + + // protected methods: + protected: + + // private methods: + private: + + + + // protected members: + protected: + + + // private members: + private: + + + + +#ifdef ___CLING___ + public: + ClassDef(MSubModuleRandomCoincidence, 0) // no description +#endif + +}; + +#endif + + +//////////////////////////////////////////////////////////////////////////////// diff --git a/include/MSubModuleShieldEnergyCorrection.h b/include/MSubModuleShieldEnergyCorrection.h new file mode 100644 index 00000000..1946da24 --- /dev/null +++ b/include/MSubModuleShieldEnergyCorrection.h @@ -0,0 +1,97 @@ +/* + * MSubModuleShieldEnergyCorrection.h + * + * Copyright (C) by Andreas Zoglauer. + * All rights reserved. + * + * Please see the source-file for the copyright-notice. + * + */ + + +#ifndef __MSubModuleShieldEnergyCorrection__ +#define __MSubModuleShieldEnergyCorrection__ + + +//////////////////////////////////////////////////////////////////////////////// + + +// Standard libs: + +// ROOT libs: + +// MEGAlib libs: +#include "MGlobal.h" +#include "MSubModule.h" + +// Forward declarations: + + +//////////////////////////////////////////////////////////////////////////////// + + +class MSubModuleShieldEnergyCorrection : public MSubModule +{ + // public interface: + public: + //! Default constructor + MSubModuleShieldEnergyCorrection(); + + //! No copy constructor + MSubModuleShieldEnergyCorrection(const MSubModuleShieldEnergyCorrection&) = delete; + //! No copy assignment + MSubModuleShieldEnergyCorrection& operator=(const MSubModuleShieldEnergyCorrection&) = delete; + //! No move constructors + MSubModuleShieldEnergyCorrection(MSubModuleShieldEnergyCorrection&&) = delete; + //! No move operators + MSubModuleShieldEnergyCorrection& operator=(MSubModuleShieldEnergyCorrection&&) = delete; + + //! Default destructor + virtual ~MSubModuleShieldEnergyCorrection(); + + //! Initialize the module + virtual bool Initialize(); + + //! Clear event data from the module + virtual void Clear(); + + //! Main data analysis routine, which updates the event to a new level + virtual bool AnalyzeEvent(MReadOutAssembly* Event); + + //! Finalize the module + virtual void Finalize(); + + //! Read the configuration data from an XML node + virtual bool ReadXmlConfiguration(MXmlNode* Node); + //! Create an XML node tree from the configuration + virtual MXmlNode* CreateXmlConfiguration(MXmlNode* Node); + + // protected methods: + protected: + + // private methods: + private: + + + + // protected members: + protected: + + + // private members: + private: + + + + +#ifdef ___CLING___ + public: + ClassDef(MSubModuleShieldEnergyCorrection, 0) // no description +#endif + +}; + +#endif + + +//////////////////////////////////////////////////////////////////////////////// diff --git a/include/MSubModuleShieldReadout.h b/include/MSubModuleShieldReadout.h new file mode 100644 index 00000000..a0a31711 --- /dev/null +++ b/include/MSubModuleShieldReadout.h @@ -0,0 +1,97 @@ +/* + * MSubModuleShieldReadout.h + * + * Copyright (C) by Andreas Zoglauer. + * All rights reserved. + * + * Please see the source-file for the copyright-notice. + * + */ + + +#ifndef __MSubModuleShieldReadout__ +#define __MSubModuleShieldReadout__ + + +//////////////////////////////////////////////////////////////////////////////// + + +// Standard libs: + +// ROOT libs: + +// MEGAlib libs: +#include "MGlobal.h" +#include "MSubModule.h" + +// Forward declarations: + + +//////////////////////////////////////////////////////////////////////////////// + + +class MSubModuleShieldReadout : public MSubModule +{ + // public interface: + public: + //! Default constructor + MSubModuleShieldReadout(); + + //! No copy constructor + MSubModuleShieldReadout(const MSubModuleShieldReadout&) = delete; + //! No copy assignment + MSubModuleShieldReadout& operator=(const MSubModuleShieldReadout&) = delete; + //! No move constructors + MSubModuleShieldReadout(MSubModuleShieldReadout&&) = delete; + //! No move operators + MSubModuleShieldReadout& operator=(MSubModuleShieldReadout&&) = delete; + + //! Default destructor + virtual ~MSubModuleShieldReadout(); + + //! Initialize the module + virtual bool Initialize(); + + //! Clear event data from the module + virtual void Clear(); + + //! Main data analysis routine, which updates the event to a new level + virtual bool AnalyzeEvent(MReadOutAssembly* Event); + + //! Finalize the module + virtual void Finalize(); + + //! Read the configuration data from an XML node + virtual bool ReadXmlConfiguration(MXmlNode* Node); + //! Create an XML node tree from the configuration + virtual MXmlNode* CreateXmlConfiguration(MXmlNode* Node); + + // protected methods: + protected: + + // private methods: + private: + + + + // protected members: + protected: + + + // private members: + private: + + + + +#ifdef ___CLING___ + public: + ClassDef(MSubModuleShieldReadout, 0) // no description +#endif + +}; + +#endif + + +//////////////////////////////////////////////////////////////////////////////// diff --git a/include/MSubModuleShieldTrigger.h b/include/MSubModuleShieldTrigger.h new file mode 100644 index 00000000..56873bd9 --- /dev/null +++ b/include/MSubModuleShieldTrigger.h @@ -0,0 +1,113 @@ +/* + * MSubModuleShieldTrigger.h + * + * Copyright (C) by Andreas Zoglauer. + * All rights reserved. + * + * Please see the source-file for the copyright-notice. + * + */ + + +#ifndef __MSubModuleShieldTrigger__ +#define __MSubModuleShieldTrigger__ + + +//////////////////////////////////////////////////////////////////////////////// + + +// Standard libs: + +// ROOT libs: + +// MEGAlib libs: +#include "MGlobal.h" +#include "MSubModule.h" + +// Forward declarations: + + +//////////////////////////////////////////////////////////////////////////////// + + +class MSubModuleShieldTrigger : public MSubModule +{ + // public interface: + public: + //! Default constructor + MSubModuleShieldTrigger(); + + //! No copy constructor + MSubModuleShieldTrigger(const MSubModuleShieldTrigger&) = delete; + //! No copy assignment + MSubModuleShieldTrigger& operator=(const MSubModuleShieldTrigger&) = delete; + //! No move constructors + MSubModuleShieldTrigger(MSubModuleShieldTrigger&&) = delete; + //! No move operators + MSubModuleShieldTrigger& operator=(MSubModuleShieldTrigger&&) = delete; + + //! Default destructor + virtual ~MSubModuleShieldTrigger(); + + //! Initialize the module + virtual bool Initialize(); + + //! Clear event data from the module + virtual void Clear(); + + //! Main data analysis routine, which updates the event to a new level + virtual bool AnalyzeEvent(MReadOutAssembly* Event); + + //! Return true if we have a trigger - filled after AnalyzeEvent + bool HasTrigger() const { return m_HasTrigger; } + + //! Return true if we have a veto - filled after AnalyzeEvent + bool HasVeto() const { return m_HasVeto; } + + //! Return the time when the dead time ends - filled after AnalyzeEvent + MTime GetDeadTimeEnd() const { return m_DeadTimeEnd; } + + //! Finalize the module + virtual void Finalize(); + + //! Read the configuration data from an XML node + virtual bool ReadXmlConfiguration(MXmlNode* Node); + //! Create an XML node tree from the configuration + virtual MXmlNode* CreateXmlConfiguration(MXmlNode* Node); + + // protected methods: + protected: + + // private methods: + private: + + + + // protected members: + protected: + + + // private members: + private: + //! Flag indicating that a trigger has been raised + bool m_HasTrigger; + + //! Flag indicating that a veto has been raised + bool m_HasVeto; + + //! Time when the shield dead time ends + MTime m_DeadTimeEnd; + + + +#ifdef ___CLING___ + public: + ClassDef(MSubModuleShieldTrigger, 0) // no description +#endif + +}; + +#endif + + +//////////////////////////////////////////////////////////////////////////////// diff --git a/include/MSubModuleStripReadout.h b/include/MSubModuleStripReadout.h new file mode 100644 index 00000000..2652ae2f --- /dev/null +++ b/include/MSubModuleStripReadout.h @@ -0,0 +1,97 @@ +/* + * MSubModuleStripReadout.h + * + * Copyright (C) by Andreas Zoglauer. + * All rights reserved. + * + * Please see the source-file for the copyright-notice. + * + */ + + +#ifndef __MSubModuleStripReadout__ +#define __MSubModuleStripReadout__ + + +//////////////////////////////////////////////////////////////////////////////// + + +// Standard libs: + +// ROOT libs: + +// MEGAlib libs: +#include "MGlobal.h" +#include "MSubModule.h" + +// Forward declarations: + + +//////////////////////////////////////////////////////////////////////////////// + + +class MSubModuleStripReadout : public MSubModule +{ + // public interface: + public: + //! Default constructor + MSubModuleStripReadout(); + + //! No copy constructor + MSubModuleStripReadout(const MSubModuleStripReadout&) = delete; + //! No copy assignment + MSubModuleStripReadout& operator=(const MSubModuleStripReadout&) = delete; + //! No move constructors + MSubModuleStripReadout(MSubModuleStripReadout&&) = delete; + //! No move operators + MSubModuleStripReadout& operator=(MSubModuleStripReadout&&) = delete; + + //! Default destructor + virtual ~MSubModuleStripReadout(); + + //! Initialize the module + virtual bool Initialize(); + + //! Clear event data from the module + virtual void Clear(); + + //! Main data analysis routine, which updates the event to a new level + virtual bool AnalyzeEvent(MReadOutAssembly* Event); + + //! Finalize the module + virtual void Finalize(); + + //! Read the configuration data from an XML node + virtual bool ReadXmlConfiguration(MXmlNode* Node); + //! Create an XML node tree from the configuration + virtual MXmlNode* CreateXmlConfiguration(MXmlNode* Node); + + // protected methods: + protected: + + // private methods: + private: + + + + // protected members: + protected: + + + // private members: + private: + + + + +#ifdef ___CLING___ + public: + ClassDef(MSubModuleStripReadout, 0) // no description +#endif + +}; + +#endif + + +//////////////////////////////////////////////////////////////////////////////// diff --git a/include/MSubModuleStripReadoutNoise.h b/include/MSubModuleStripReadoutNoise.h new file mode 100644 index 00000000..2b066bf1 --- /dev/null +++ b/include/MSubModuleStripReadoutNoise.h @@ -0,0 +1,97 @@ +/* + * MSubModuleStripReadoutNoise.h + * + * Copyright (C) by Andreas Zoglauer. + * All rights reserved. + * + * Please see the source-file for the copyright-notice. + * + */ + + +#ifndef __MSubModuleStripReadoutNoise__ +#define __MSubModuleStripReadoutNoise__ + + +//////////////////////////////////////////////////////////////////////////////// + + +// Standard libs: + +// ROOT libs: + +// MEGAlib libs: +#include "MGlobal.h" +#include "MSubModule.h" + +// Forward declarations: + + +//////////////////////////////////////////////////////////////////////////////// + + +class MSubModuleStripReadoutNoise : public MSubModule +{ + // public interface: + public: + //! Default constructor + MSubModuleStripReadoutNoise(); + + //! No copy constructor + MSubModuleStripReadoutNoise(const MSubModuleStripReadoutNoise&) = delete; + //! No copy assignment + MSubModuleStripReadoutNoise& operator=(const MSubModuleStripReadoutNoise&) = delete; + //! No move constructors + MSubModuleStripReadoutNoise(MSubModuleStripReadoutNoise&&) = delete; + //! No move operators + MSubModuleStripReadoutNoise& operator=(MSubModuleStripReadoutNoise&&) = delete; + + //! Default destructor + virtual ~MSubModuleStripReadoutNoise(); + + //! Initialize the module + virtual bool Initialize(); + + //! Clear event data from the module + virtual void Clear(); + + //! Main data analysis routine, which updates the event to a new level + virtual bool AnalyzeEvent(MReadOutAssembly* Event); + + //! Finalize the module + virtual void Finalize(); + + //! Read the configuration data from an XML node + virtual bool ReadXmlConfiguration(MXmlNode* Node); + //! Create an XML node tree from the configuration + virtual MXmlNode* CreateXmlConfiguration(MXmlNode* Node); + + // protected methods: + protected: + + // private methods: + private: + + + + // protected members: + protected: + + + // private members: + private: + + + + +#ifdef ___CLING___ + public: + ClassDef(MSubModuleStripReadoutNoise, 0) // no description +#endif + +}; + +#endif + + +//////////////////////////////////////////////////////////////////////////////// diff --git a/include/MSubModuleStripTrigger.h b/include/MSubModuleStripTrigger.h new file mode 100644 index 00000000..b3cf1267 --- /dev/null +++ b/include/MSubModuleStripTrigger.h @@ -0,0 +1,113 @@ +/* + * MSubModuleStripTrigger.h + * + * Copyright (C) by Andreas Zoglauer. + * All rights reserved. + * + * Please see the source-file for the copyright-notice. + * + */ + + +#ifndef __MSubModuleStripTrigger__ +#define __MSubModuleStripTrigger__ + + +//////////////////////////////////////////////////////////////////////////////// + + +// Standard libs: + +// ROOT libs: + +// MEGAlib libs: +#include "MGlobal.h" +#include "MSubModule.h" + +// Forward declarations: + + +//////////////////////////////////////////////////////////////////////////////// + + +class MSubModuleStripTrigger : public MSubModule +{ + // public interface: + public: + //! Default constructor + MSubModuleStripTrigger(); + + //! No copy constructor + MSubModuleStripTrigger(const MSubModuleStripTrigger&) = delete; + //! No copy assignment + MSubModuleStripTrigger& operator=(const MSubModuleStripTrigger&) = delete; + //! No move constructors + MSubModuleStripTrigger(MSubModuleStripTrigger&&) = delete; + //! No move operators + MSubModuleStripTrigger& operator=(MSubModuleStripTrigger&&) = delete; + + //! Default destructor + virtual ~MSubModuleStripTrigger(); + + //! Initialize the module + virtual bool Initialize(); + + //! Clear event data from the module + virtual void Clear(); + + //! Main data analysis routine, which updates the event to a new level + virtual bool AnalyzeEvent(MReadOutAssembly* Event); + + //! Return true if we have a trigger - filled after AnalyzeEvent + bool HasTrigger() const { return m_HasTrigger; } + + //! Return true if we have a veto - filled after AnalyzeEvent + bool HasVeto() const { return m_HasVeto; } + + //! Return the time when the dead time ends - filled after AnalyzeEvent + MTime GetDeadTimeEnd() const { return m_DeadTimeEnd; } + + //! Finalize the module + virtual void Finalize(); + + //! Read the configuration data from an XML node + virtual bool ReadXmlConfiguration(MXmlNode* Node); + //! Create an XML node tree from the configuration + virtual MXmlNode* CreateXmlConfiguration(MXmlNode* Node); + + // protected methods: + protected: + + // private methods: + private: + + + + // protected members: + protected: + + + // private members: + private: + //! Flag indicating that a trigger has been raised + bool m_HasTrigger; + + //! Flag indicating that a veto has been raised + bool m_HasVeto; + + //! Time when the shield dead time ends + MTime m_DeadTimeEnd; + + + +#ifdef ___CLING___ + public: + ClassDef(MSubModuleStripTrigger, 0) // no description +#endif + +}; + +#endif + + +//////////////////////////////////////////////////////////////////////////////// diff --git a/include/MSubModuleTemplate.h b/include/MSubModuleTemplate.h new file mode 100644 index 00000000..d0f614eb --- /dev/null +++ b/include/MSubModuleTemplate.h @@ -0,0 +1,97 @@ +/* + * MSubModuleTemplate.h + * + * Copyright (C) by Andreas Zoglauer. + * All rights reserved. + * + * Please see the source-file for the copyright-notice. + * + */ + + +#ifndef __MSubModuleTemplate__ +#define __MSubModuleTemplate__ + + +//////////////////////////////////////////////////////////////////////////////// + + +// Standard libs: + +// ROOT libs: + +// MEGAlib libs: +#include "MGlobal.h" +#include "MSubModule.h" + +// Forward declarations: + + +//////////////////////////////////////////////////////////////////////////////// + + +class MSubModuleTemplate : public MSubModule +{ + // public interface: + public: + //! Default constructor + MSubModuleTemplate(); + + //! No copy constructor + MSubModuleTemplate(const MSubModuleTemplate&) = delete; + //! No copy assignment + MSubModuleTemplate& operator=(const MSubModuleTemplate&) = delete; + //! No move constructors + MSubModuleTemplate(MSubModuleTemplate&&) = delete; + //! No move operators + MSubModuleTemplate& operator=(MSubModuleTemplate&&) = delete; + + //! Default destructor + virtual ~MSubModuleTemplate(); + + //! Initialize the module + virtual bool Initialize(); + + //! Clear event data from the module + virtual void Clear(); + + //! Main data analysis routine, which updates the event to a new level + virtual bool AnalyzeEvent(MReadOutAssembly* Event); + + //! Finalize the module + virtual void Finalize(); + + //! Read the configuration data from an XML node + virtual bool ReadXmlConfiguration(MXmlNode* Node); + //! Create an XML node tree from the configuration + virtual MXmlNode* CreateXmlConfiguration(MXmlNode* Node); + + // protected methods: + protected: + + // private methods: + private: + + + + // protected members: + protected: + + + // private members: + private: + + + + +#ifdef ___CLING___ + public: + ClassDef(MSubModuleTemplate, 0) // no description +#endif + +}; + +#endif + + +//////////////////////////////////////////////////////////////////////////////// diff --git a/resource/.DS_Store b/resource/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..2ccb623d3dfb50c511f1f2c925bd5bf4b32a8e05 GIT binary patch literal 6148 zcmeHK&x_MQ6n@iow~0k4qOcbs;C0cut_$KN*7e}kh#pjG(i9D*nUbVdD21H$kMZhX z;{W1FzxQSq`ojeeB2wnToA1rc`=*(1nwbm{so^}mOVlSK56;-Rg5o#E{p>r|vMt=H zWQ;M@Pjfv^a-HmCy9TF#Q{aD7fZyFiim9R*O=$D|_E>9Gu)g zTO9|>2PcS6@13nyzIWr+orljxAM$CTKg+C1VSf|5YViWTAh<-6k5O6Vx_E~SX16JY z!jny<)J^oP>w8VIYO@wlw#2%`qVyDP++I?(H3mP!`WPOvK7lm_H%Gjk|6?ov0Bbnr zRou>O@w2awjH-xV*UVN zPGB*#*ce0)Oc^TBP?f!6C__hkVDmzYjX^^vWiKDf{<5++6eYio@dHUG6&iG=zNGN*|T+La(vbX@V9U_&T9+`1%*A1CE%m@ c2rh=cfCFG?u`!4inEMbA8C>BM_@@f|0*2C{wEzGB literal 0 HcmV?d00001 diff --git a/resource/calibration/.DS_Store b/resource/calibration/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..f84d309b3386511d3aac8e7e2d5ed7cf93121d18 GIT binary patch literal 8196 zcmeHMO-~a+7=EXGbwyzL6pSVtdoh7%K_nq+SPMqcM353J0j%40C@afMv%94tA?aBY ze}F&0t5^PjN3R~d_y;_A)r-EfGv%WQ(TkBdZ!+_|JM+A=Gtchq_T2&iNtFx30Q~?E z$0E>d#p)L(`b9ZnG1X!q5{w5JhS6z{=W`y<9bxMRt$JVl0KW!m7k56vvd=15u$w zr5HqpW4|Tnh_=G2L>Uf5h67P&CMrWA(b+N1is(RWiMrMbXa$ZcAaeI+n1mTf!*pH# zF1FG;ELVO+76l*VjvdJLkxMR~z#XsSzB-mW0?9h=w>ob7-h8t-YZn+4!2=3YSi-}x zaQjbUbCsZ^zFq9*N}d~p$>c{8YiMk0ZfP-ET3c4qYrK*Uov<9F9Dhk1&2#SMYQB?O zaA_rL_DpgXIxeGr6yO#pQkEaPtiUTNUS@?LicQN7!-yMMvwwSgG?^T-My`+T3|ZUb zBj}G_8{642;=PHhH|DbI-Uj0@aXn~6JqDpo9`Dsc*Aw+|^P6goDV-!06nt_C#B9Pk&jW=D|sx#!LDzzto_7MBAQ zembNZ(`=RF88=b%nUd%V7N{Q}9*N1UcutObGc3i!kZ&wHzVEOiO>GIL7!4OP>r*jO zbnbM?$-AtWnD{ECP1v(F=dyH6NJs}DVc(Q)yrpE zO#95^tcW}@MiV^5Z8Q%_sN0$`!PwjKmZIAVs}iGGV5Q&xsE0PKz-d&VK~B0~ -#include -#include -#include -#include "GCUHousekeepingParser.h" - -struct GCUHousekeepingPacket* ParseGCUHousekeepingPacket(uint8_t* RawData) { - uint16_t byteIndex = 0; - uint8_t bitIndex = 7; - struct GCUHousekeepingPacket* packet; - - packet = MakeNewGCUHousekeepingPacket(); - ParseAllocatedGCUHousekeepingPacket(RawData, packet); - return packet; -} - -void ParseGCUHousekeepingPacketWrapper(uint8_t* RawData, void* packet_bytes) { - ParseAllocatedGCUHousekeepingPacket(RawData, (struct GCUHousekeepingPacket*)packet_bytes); -} - -void ParseAllocatedGCUHousekeepingPacket(uint8_t* RawData, struct GCUHousekeepingPacket* packet) { - uint16_t i; - uint16_t j; - packet->Sync = (((uint16_t)RawData[0]) << 8) | ((uint16_t)RawData[1]); - packet->PacketID = ((uint8_t)RawData[2]); - packet->UnixTime = (((uint32_t)RawData[3]) << 16) | (((uint32_t)RawData[4]) << 8) | ((uint32_t)RawData[5]); - packet->PacketCounter = (((uint16_t)RawData[6]) << 8) | ((uint16_t)RawData[7]); - packet->PacketSize = (((uint16_t)RawData[8]) << 8) | ((uint16_t)RawData[9]); - packet->Temp = (uint16_t*)malloc(32*sizeof(uint16_t)); - tempIter : for (i = 0; i < 32; i += 1) { - packet->Temp[i] = (((uint16_t)RawData[10 + 2*i + 0]) << 8) | ((uint16_t)RawData[10 + 2*i + 1]); - } - packet->ADC = (uint16_t*)malloc(32*sizeof(uint16_t)); - for (j = 0; j <= 31; j += 1) { - packet->ADC[j] = (((uint16_t)RawData[74 + 2*j + 0]) << 8) | ((uint16_t)RawData[74 + 2*j + 1]); - } - packet->CryoTipTemp = (((uint16_t)RawData[138]) << 8) | ((uint16_t)RawData[139]); - packet->CryoPower = (((uint16_t)RawData[140]) << 8) | ((uint16_t)RawData[141]); - packet->ClkVal = (((uint64_t)RawData[142]) << 40) | (((uint64_t)RawData[143]) << 32) | (((uint64_t)RawData[144]) << 24) | (((uint64_t)RawData[145]) << 16) | (((uint64_t)RawData[146]) << 8) | ((uint64_t)RawData[147]); - packet->LastCommandIDs = (uint8_t*)malloc(3*sizeof(uint8_t)); - packet->LastCommandPayloads = (uint16_t*)malloc(3*sizeof(uint16_t)); - lastCommandsIter : for (i = 0; i < 3; i += 1) { - packet->LastCommandIDs[i] = ((uint8_t)RawData[148 + 4*i + 1]); - packet->LastCommandPayloads[i] = (((uint16_t)RawData[148 + 4*i + 2]) << 8) | ((uint16_t)RawData[148 + 4*i + 3]); - } - packet->NumGoodCommands = (((uint16_t)RawData[160]) << 8) | ((uint16_t)RawData[161]); - packet->NumBadCommands = (((uint16_t)RawData[162]) << 8) | ((uint16_t)RawData[163]); - packet->OPADataRate = ((uint8_t)RawData[164]); - packet->OPBDataRate = ((uint8_t)RawData[165]); - packet->NumAutoResyncs = ((uint8_t)RawData[166]); - packet->HeaterBoxReadBack7 = ((uint8_t)((RawData[167] >> 7) & 0x01)); - packet->HeaterBoxReadBack6 = ((uint8_t)((RawData[167] >> 6) & 0x01)); - packet->HeaterBoxReadBack5 = ((uint8_t)((RawData[167] >> 5) & 0x01)); - packet->HeaterBoxReadBack4 = ((uint8_t)((RawData[167] >> 4) & 0x01)); - packet->HeaterBoxReadBack3 = ((uint8_t)((RawData[167] >> 3) & 0x01)); - packet->HeaterBoxReadBack2 = ((uint8_t)((RawData[167] >> 2) & 0x01)); - packet->HeaterBoxReadBack1 = ((uint8_t)((RawData[167] >> 1) & 0x01)); - packet->HeaterBoxReadBack0 = ((uint8_t)(RawData[167] & 0x01)); - packet->NumGCURestarts = (((uint16_t)RawData[168]) << 8) | ((uint16_t)RawData[169]); - packet->NumBytesInRelayQueue = (((uint32_t)RawData[170]) << 24) | (((uint32_t)RawData[171]) << 16) | (((uint32_t)RawData[172]) << 8) | ((uint32_t)RawData[173]); - packet->HeaterBoxSetting7 = ((uint8_t)((RawData[174] >> 7) & 0x01)); - packet->HeaterBoxSetting6 = ((uint8_t)((RawData[174] >> 6) & 0x01)); - packet->HeaterBoxSetting5 = ((uint8_t)((RawData[174] >> 5) & 0x01)); - packet->HeaterBoxSetting4 = ((uint8_t)((RawData[174] >> 4) & 0x01)); - packet->HeaterBoxSetting3 = ((uint8_t)((RawData[174] >> 3) & 0x01)); - packet->HeaterBoxSetting2 = ((uint8_t)((RawData[174] >> 2) & 0x01)); - packet->HeaterBoxSetting1 = ((uint8_t)((RawData[174] >> 1) & 0x01)); - packet->HeaterBoxSetting0 = ((uint8_t)(RawData[174] & 0x01)); - packet->TStat7Enabled = ((uint8_t)((RawData[175] >> 7) & 0x01)); - packet->TStat6Enabled = ((uint8_t)((RawData[175] >> 6) & 0x01)); - packet->TStat5Enabled = ((uint8_t)((RawData[175] >> 5) & 0x01)); - packet->TStat4Enabled = ((uint8_t)((RawData[175] >> 4) & 0x01)); - packet->TStat3Enabled = ((uint8_t)((RawData[175] >> 3) & 0x01)); - packet->TStat2Enabled = ((uint8_t)((RawData[175] >> 2) & 0x01)); - packet->TStat1Enabled = ((uint8_t)((RawData[175] >> 1) & 0x01)); - packet->TStat0Enabled = ((uint8_t)(RawData[175] & 0x01)); - packet->MagredEnabled = ((uint8_t)((RawData[176] >> 4) & 0x01)); - packet->MagredPID = ((uint8_t)((RawData[176] >> 3) & 0x01)); - packet->ClkbrdGPIO2 = ((uint8_t)((RawData[176] >> 2) & 0x01)); - packet->ClkbrdGPIO1 = ((uint8_t)((RawData[176] >> 1) & 0x01)); - packet->ClkbrdGPIO0 = ((uint8_t)(RawData[176] & 0x01)); - packet->MagredCounter = ((uint8_t)RawData[177]); - packet->RelayNumPacketsDropped = (((uint32_t)RawData[178]) << 24) | (((uint32_t)RawData[179]) << 16) | (((uint32_t)RawData[180]) << 8) | ((uint32_t)RawData[181]); - packet->RelayNumBytesDropped = (((uint64_t)RawData[182]) << 32) | (((uint64_t)RawData[183]) << 24) | (((uint64_t)RawData[184]) << 16) | (((uint64_t)RawData[185]) << 8); - packet->RelayRawDataEnabled = ((uint8_t)((RawData[186] >> 2) & 0x01)); - packet->RelayComptonEnabled = ((uint8_t)((RawData[186] >> 1) & 0x01)); - packet->RelayQueueAccepting = ((uint8_t)(RawData[186] & 0x01)); - packet->LOSNumBytesInQueue = (((uint32_t)RawData[187]) << 24) | (((uint32_t)RawData[188]) << 16) | (((uint32_t)RawData[189]) << 8) | ((uint32_t)RawData[190]); - packet->LOSBytesWritten = (((uint64_t)RawData[191]) << 32) | (((uint64_t)RawData[192]) << 24) | (((uint64_t)RawData[193]) << 16) | (((uint64_t)RawData[194]) << 8); - packet->LOSNumPacketsDropped = (((uint32_t)RawData[195]) << 24) | (((uint32_t)RawData[196]) << 16) | (((uint32_t)RawData[197]) << 8) | ((uint32_t)RawData[198]); - packet->LOSNumBytesDropped = (((uint64_t)RawData[199]) << 32) | (((uint64_t)RawData[200]) << 24) | (((uint64_t)RawData[201]) << 16) | (((uint64_t)RawData[202]) << 8); - packet->LOSAutoClear = ((uint8_t)((RawData[203] >> 4) & 0x01)); - packet->LOSIsOpen = ((uint8_t)((RawData[203] >> 3) & 0x01)); - packet->LOSComptonEnabled = ((uint8_t)((RawData[203] >> 2) & 0x01)); - packet->LOSQueueAccepting = ((uint8_t)((RawData[203] >> 1) & 0x01)); - packet->LOSEnabled = ((uint8_t)(RawData[203] & 0x01)); - packet->DiskNumBytesInQueue = (((uint32_t)RawData[204]) << 24) | (((uint32_t)RawData[205]) << 16) | (((uint32_t)RawData[206]) << 8) | ((uint32_t)RawData[207]); - packet->DiskANumBytesWritten = (((uint64_t)RawData[208]) << 32) | (((uint64_t)RawData[209]) << 24) | (((uint64_t)RawData[210]) << 16) | (((uint64_t)RawData[211]) << 8); - packet->DiskBNumBytesWritten = (((uint64_t)RawData[212]) << 32) | (((uint64_t)RawData[213]) << 24) | (((uint64_t)RawData[214]) << 16) | (((uint64_t)RawData[215]) << 8); - packet->DiskCNumBytesWritten = (((uint64_t)RawData[216]) << 32) | (((uint64_t)RawData[217]) << 24) | (((uint64_t)RawData[218]) << 16) | (((uint64_t)RawData[219]) << 8); - packet->DiskCIsMounted = ((uint8_t)((RawData[220] >> 6) & 0x01)); - packet->DiskBIsMounted = ((uint8_t)((RawData[220] >> 5) & 0x01)); - packet->DiskAIsMounted = ((uint8_t)((RawData[220] >> 4) & 0x01)); - packet->DiskCNotNull = ((uint8_t)((RawData[220] >> 3) & 0x01)); - packet->DiskBNotNull = ((uint8_t)((RawData[220] >> 2) & 0x01)); - packet->DiskANotNull = ((uint8_t)((RawData[220] >> 1) & 0x01)); - packet->DiskComptonEnabled = ((uint8_t)(RawData[220] & 0x01)); - packet->GRBNumBytesInQueue = (((uint32_t)RawData[221]) << 24) | (((uint32_t)RawData[222]) << 16) | (((uint32_t)RawData[223]) << 8) | ((uint32_t)RawData[224]); - packet->GRBTdiff = (((uint32_t)RawData[225]) << 24) | (((uint32_t)RawData[226]) << 16) | (((uint32_t)RawData[227]) << 8) | ((uint32_t)RawData[228]); - packet->GRBNumTriggers = (((uint32_t)RawData[229]) << 24) | (((uint32_t)RawData[230]) << 16) | (((uint32_t)RawData[231]) << 8) | ((uint32_t)RawData[232]); - packet->ShieldAlgoTrigEnabled2 = ((uint8_t)((RawData[233] >> 6) & 0x01)); - packet->ShieldAlgoTrigEnabled1 = ((uint8_t)((RawData[233] >> 5) & 0x01)); - packet->ShieldAlgoTrigEnabled0 = ((uint8_t)((RawData[233] >> 4) & 0x01)); - packet->GRBAutoTriggerEnabled = ((uint8_t)((RawData[233] >> 3) & 0x01)); - packet->GRBTriggerActive = ((uint8_t)((RawData[233] >> 2) & 0x01)); - packet->GRBQueueAccepting = ((uint8_t)((RawData[233] >> 1) & 0x01)); - packet->RTANumBytesInQueue = (((uint32_t)RawData[234]) << 24) | (((uint32_t)RawData[235]) << 16) | (((uint32_t)RawData[236]) << 8) | ((uint32_t)RawData[237]); - packet->RTAAcceptingSingleDetectorEvents = ((uint8_t)((RawData[238] >> 5) & 0x01)); - packet->RTAAutoRebootEnabled = ((uint8_t)((RawData[238] >> 4) & 0x01)); - packet->RTAComptonAnalysisEnabled = ((uint8_t)((RawData[238] >> 3) & 0x01)); - packet->RTAComptonQueueAutoClearEnabled = ((uint8_t)((RawData[238] >> 2) & 0x01)); - packet->RTAQueueAccepting = ((uint8_t)((RawData[238] >> 1) & 0x01)); - packet->RTAEnabled = ((uint8_t)(RawData[238] & 0x01)); - packet->OpenPortANumBytesWritten = (((uint64_t)RawData[239]) << 32) | (((uint64_t)RawData[240]) << 24) | (((uint64_t)RawData[241]) << 16) | (((uint64_t)RawData[242]) << 8); - packet->UnixTimeMSB = ((uint8_t)RawData[243]); - packet->OpenPortAUDPSocket = ((uint8_t)((RawData[245] >> 4) & 0x01)); - packet->OpenPortAEnabled = ((uint8_t)(RawData[245] & 0x01)); - packet->OpenPortBNumBytesWritten = (((uint64_t)RawData[246]) << 32) | (((uint64_t)RawData[247]) << 24) | (((uint64_t)RawData[248]) << 16) | (((uint64_t)RawData[249]) << 8); - packet->OpenPortBUDPSocket = ((uint8_t)((RawData[252] >> 4) & 0x01)); - packet->OpenPortBEnabled = ((uint8_t)(RawData[252] & 0x01)); - packet->NumRestartsCC = (uint8_t*)malloc(12*sizeof(uint8_t)); - for (i = 0; i < 12; i += 1) { - packet->NumRestartsCC[i] = ((uint8_t)RawData[253 + 1*i + 0]); - } - packet->SerialDialupOpen = ((uint8_t)((RawData[265] >> 5) & 0x01)); - packet->SerialCryoOpen = ((uint8_t)((RawData[265] >> 4) & 0x01)); - packet->SerialMagOpen = ((uint8_t)((RawData[265] >> 3) & 0x01)); - packet->SerialGPSOpen = ((uint8_t)((RawData[265] >> 2) & 0x01)); - packet->SerialSIP2Open = ((uint8_t)((RawData[265] >> 1) & 0x01)); - packet->SerialSIP1Open = ((uint8_t)(RawData[265] & 0x01)); - packet->DiskAUsage = ((uint8_t)RawData[266]); - packet->DiskBUsage = ((uint8_t)RawData[267]); - packet->DiskCUsage = ((uint8_t)RawData[268]); - packet->HVStatusCC11 = ((uint8_t)((RawData[269] >> 3) & 0x01)); - packet->HVStatusCC10 = ((uint8_t)((RawData[269] >> 2) & 0x01)); - packet->HVStatusCC9 = ((uint8_t)((RawData[269] >> 1) & 0x01)); - packet->HVStatusCC8 = ((uint8_t)(RawData[269] & 0x01)); - packet->HVStatusCC7 = ((uint8_t)((RawData[270] >> 7) & 0x01)); - packet->HVStatusCC6 = ((uint8_t)((RawData[270] >> 6) & 0x01)); - packet->HVStatusCC5 = ((uint8_t)((RawData[270] >> 5) & 0x01)); - packet->HVStatusCC4 = ((uint8_t)((RawData[270] >> 4) & 0x01)); - packet->HVStatusCC3 = ((uint8_t)((RawData[270] >> 3) & 0x01)); - packet->HVStatusCC2 = ((uint8_t)((RawData[270] >> 2) & 0x01)); - packet->HVStatusCC1 = ((uint8_t)((RawData[270] >> 1) & 0x01)); - packet->HVStatusCC0 = ((uint8_t)(RawData[270] & 0x01)); - packet->HVStatusShield5 = ((uint8_t)((RawData[271] >> 5) & 0x01)); - packet->HVStatusShield4 = ((uint8_t)((RawData[271] >> 4) & 0x01)); - packet->HVStatusShield3 = ((uint8_t)((RawData[271] >> 3) & 0x01)); - packet->HVStatusShield2 = ((uint8_t)((RawData[271] >> 2) & 0x01)); - packet->HVStatusShield1 = ((uint8_t)((RawData[271] >> 1) & 0x01)); - packet->HVStatusShield0 = ((uint8_t)(RawData[271] & 0x01)); - packet->ShieldThreshold = (uint8_t*)malloc(6*sizeof(uint8_t)); - for (i = 0; i < 6; i += 1) { - packet->ShieldThreshold[i] = ((uint8_t)RawData[272 + 1*i + 0]); - } - packet->DiskCEnabled = ((uint8_t)((RawData[278] >> 7) & 0x01)); - packet->DiskBEnabled = ((uint8_t)((RawData[278] >> 6) & 0x01)); - packet->DiskAEnabled = ((uint8_t)((RawData[278] >> 5) & 0x01)); - packet->GlobalClockSupervisorResyncEnabled = ((uint8_t)((RawData[278] >> 4) & 0x01)); - packet->GPSMagEnabled = ((uint8_t)((RawData[278] >> 3) & 0x01)); - packet->GPSEnabled = ((uint8_t)((RawData[278] >> 2) & 0x01)); - packet->EthernetReallocateEnabled = ((uint8_t)((RawData[278] >> 1) & 0x01)); - packet->GlobalPROMLoadSuccessful = ((uint8_t)(RawData[278] & 0x01)); - packet->RTAContinuityOK7 = ((uint8_t)((RawData[279] >> 7) & 0x01)); - packet->RTAContinuityOK6 = ((uint8_t)((RawData[279] >> 6) & 0x01)); - packet->RTAContinuityOK5 = ((uint8_t)((RawData[279] >> 5) & 0x01)); - packet->RTAContinuityOK4 = ((uint8_t)((RawData[279] >> 4) & 0x01)); - packet->RTAContinuityOK3 = ((uint8_t)((RawData[279] >> 3) & 0x01)); - packet->RTAContinuityOK2 = ((uint8_t)((RawData[279] >> 2) & 0x01)); - packet->RTAContinuityOK1 = ((uint8_t)((RawData[279] >> 1) & 0x01)); - packet->RTAContinuityOK0 = ((uint8_t)(RawData[279] & 0x01)); - packet->GlobalSyncStatusCC3 = ((uint8_t)((RawData[280] >> 7) & 0x01)); - packet->GlobalSyncStatusCC2 = ((uint8_t)((RawData[280] >> 6) & 0x01)); - packet->GlobalSyncStatusCC1 = ((uint8_t)((RawData[280] >> 5) & 0x01)); - packet->GlobalSyncStatusCC0 = ((uint8_t)((RawData[280] >> 4) & 0x01)); - packet->RTAContinuityOK11 = ((uint8_t)((RawData[280] >> 3) & 0x01)); - packet->RTAContinuityOK10 = ((uint8_t)((RawData[280] >> 2) & 0x01)); - packet->RTAContinuityOK9 = ((uint8_t)((RawData[280] >> 1) & 0x01)); - packet->RTAContinuityOK8 = ((uint8_t)(RawData[280] & 0x01)); - packet->GlobalSyncStatusCC11 = ((uint8_t)((RawData[281] >> 7) & 0x01)); - packet->GlobalSyncStatusCC10 = ((uint8_t)((RawData[281] >> 6) & 0x01)); - packet->GlobalSyncStatusCC9 = ((uint8_t)((RawData[281] >> 5) & 0x01)); - packet->GlobalSyncStatusCC8 = ((uint8_t)((RawData[281] >> 4) & 0x01)); - packet->GlobalSyncStatusCC7 = ((uint8_t)((RawData[281] >> 3) & 0x01)); - packet->GlobalSyncStatusCC6 = ((uint8_t)((RawData[281] >> 2) & 0x01)); - packet->GlobalSyncStatusCC5 = ((uint8_t)((RawData[281] >> 1) & 0x01)); - packet->GlobalSyncStatusCC4 = ((uint8_t)(RawData[281] & 0x01)); - packet->RTANumEventsActive7 = ((uint8_t)((RawData[282] >> 7) & 0x01)); - packet->RTANumEventsActive6 = ((uint8_t)((RawData[282] >> 6) & 0x01)); - packet->RTANumEventsActive5 = ((uint8_t)((RawData[282] >> 5) & 0x01)); - packet->RTANumEventsActive4 = ((uint8_t)((RawData[282] >> 4) & 0x01)); - packet->RTANumEventsActive3 = ((uint8_t)((RawData[282] >> 3) & 0x01)); - packet->RTANumEventsActive2 = ((uint8_t)((RawData[282] >> 2) & 0x01)); - packet->RTANumEventsActive1 = ((uint8_t)((RawData[282] >> 1) & 0x01)); - packet->RTANumEventsActive0 = ((uint8_t)(RawData[282] & 0x01)); - packet->RTAAnalysisEnabled3 = ((uint8_t)((RawData[283] >> 7) & 0x01)); - packet->RTAAnalysisEnabled2 = ((uint8_t)((RawData[283] >> 6) & 0x01)); - packet->RTAAnalysisEnabled1 = ((uint8_t)((RawData[283] >> 5) & 0x01)); - packet->RTAAnalysisEnabled0 = ((uint8_t)((RawData[283] >> 4) & 0x01)); - packet->RTANumEventsActive11 = ((uint8_t)((RawData[283] >> 3) & 0x01)); - packet->RTANumEventsActive10 = ((uint8_t)((RawData[283] >> 2) & 0x01)); - packet->RTANumEventsActive9 = ((uint8_t)((RawData[283] >> 1) & 0x01)); - packet->RTANumEventsActive8 = ((uint8_t)(RawData[283] & 0x01)); - packet->RTAAnalysisEnabled11 = ((uint8_t)((RawData[284] >> 7) & 0x01)); - packet->RTAAnalysisEnabled10 = ((uint8_t)((RawData[284] >> 6) & 0x01)); - packet->RTAAnalysisEnabled9 = ((uint8_t)((RawData[284] >> 5) & 0x01)); - packet->RTAAnalysisEnabled8 = ((uint8_t)((RawData[284] >> 4) & 0x01)); - packet->RTAAnalysisEnabled7 = ((uint8_t)((RawData[284] >> 3) & 0x01)); - packet->RTAAnalysisEnabled6 = ((uint8_t)((RawData[284] >> 2) & 0x01)); - packet->RTAAnalysisEnabled5 = ((uint8_t)((RawData[284] >> 1) & 0x01)); - packet->RTAAnalysisEnabled4 = ((uint8_t)(RawData[284] & 0x01)); - packet->GRBLastTrigTime = (((uint32_t)RawData[285]) << 24) | (((uint32_t)RawData[286]) << 16) | (((uint32_t)RawData[287]) << 8) | ((uint32_t)RawData[288]); - packet->ShieldNumAlgoTriggers0 = ((uint8_t)RawData[289]); - packet->ShieldNumAlgoTriggers1 = ((uint8_t)RawData[290]); - packet->ShieldNumAlgoTriggers2 = ((uint8_t)RawData[291]); - packet->WhichSIP = ((uint8_t)((RawData[292] >> 2) & 0x01)); - packet->TelemUDPMode = ((uint8_t)(RawData[292] & 0x01)); - packet->SIPLon = (((uint16_t)RawData[293]) << 8) | ((uint16_t)RawData[294]); - packet->SIPLat = (((uint16_t)RawData[295]) << 8) | ((uint16_t)RawData[296]); - packet->SIPAlt = (((uint16_t)RawData[297]) << 8) | ((uint16_t)RawData[298]); - packet->SIPTime = (((uint32_t)RawData[299]) << 24) | (((uint32_t)RawData[300]) << 16) | (((uint32_t)RawData[301]) << 8) | ((uint32_t)RawData[302]); - packet->SIPWeek = (((uint16_t)RawData[303]) << 8) | ((uint16_t)RawData[304]); - packet->SIPPressure = (((uint16_t)RawData[305]) << 8) | ((uint16_t)RawData[306]); - packet->SIPHealth = (((uint16_t)RawData[307]) << 8) | ((uint16_t)RawData[308]); - packet->FlightCodeCPUUsage = ((uint8_t)RawData[309]); - packet->FlightCodeMemUsage = ((uint8_t)RawData[310]); - packet->MagredCPUUsage = ((uint8_t)RawData[311]); - packet->MagredMemUsage = ((uint8_t)RawData[312]); - packet->EthernetTotalNumRawDataframes = (((uint32_t)RawData[317]) << 24) | (((uint32_t)RawData[318]) << 16) | (((uint32_t)RawData[319]) << 8) | ((uint32_t)RawData[320]); - packet->EthernetTotalNumComptonDataframes = (((uint32_t)RawData[321]) << 24) | (((uint32_t)RawData[322]) << 16) | (((uint32_t)RawData[323]) << 8) | ((uint32_t)RawData[324]); - packet->DoublePumpOverrideEnabled = ((uint8_t)((RawData[325] >> 7) & 0x01)); - packet->PumpEPromCodeGood = ((uint8_t)((RawData[325] >> 6) & 0x01)); - packet->PumpTachAValid = ((uint8_t)((RawData[325] >> 5) & 0x01)); - packet->PumpTachBValid = ((uint8_t)((RawData[325] >> 4) & 0x01)); - packet->PumpDACASetting = ((uint8_t)RawData[326]); - packet->PumpDACBSetting = ((uint8_t)RawData[327]); - packet->PumpTachALast = (((uint16_t)RawData[328]) << 8) | ((uint16_t)RawData[329]); - packet->PumpTachAHigh = (((uint16_t)RawData[330]) << 8) | ((uint16_t)RawData[331]); - packet->PumpTachALow = (((uint16_t)RawData[332]) << 8) | ((uint16_t)RawData[333]); - packet->PumpTachBLast = (((uint16_t)RawData[334]) << 8) | ((uint16_t)RawData[335]); - packet->PumpTachBHigh = (((uint16_t)RawData[336]) << 8) | ((uint16_t)RawData[337]); - packet->PumpTachBLow = (((uint16_t)RawData[338]) << 8) | ((uint16_t)RawData[339]); - packet->PumpLevelSensor = (((uint16_t)RawData[340]) << 8) | ((uint16_t)RawData[341]); - packet->ShieldNumSamples = ((uint8_t)RawData[342]); - packet->NumCounts = (uint32_t*)malloc(packet->ShieldNumSamples*sizeof(uint32_t)); - packet->TimeInterval = (uint32_t*)malloc(packet->ShieldNumSamples*sizeof(uint32_t)); - packet->LiveTimeFraction = (uint8_t*)malloc(packet->ShieldNumSamples*sizeof(uint8_t)); - shieldSample : for (i = 0; i < packet->ShieldNumSamples; i += 1) { - packet->NumCounts[i] = (((uint32_t)RawData[343 + 9*i + 0]) << 24) | (((uint32_t)RawData[343 + 9*i + 1]) << 16) | (((uint32_t)RawData[343 + 9*i + 2]) << 8) | ((uint32_t)RawData[343 + 9*i + 3]); - packet->TimeInterval[i] = (((uint32_t)RawData[343 + 9*i + 4]) << 24) | (((uint32_t)RawData[343 + 9*i + 5]) << 16) | (((uint32_t)RawData[343 + 9*i + 6]) << 8) | ((uint32_t)RawData[343 + 9*i + 7]); - packet->LiveTimeFraction[i] = ((uint8_t)RawData[343 + 9*i + 8]); - } -} - -struct GCUHousekeepingPacket* MakeNewGCUHousekeepingPacket(void) { - uint8_t i = 0; - struct GCUHousekeepingPacket* packet = (struct GCUHousekeepingPacket*) malloc (sizeof(struct GCUHousekeepingPacket)); - memset(packet, 0, sizeof(struct GCUHousekeepingPacket)); - return packet; -} - -void FreeAllocatedGCUHousekeepingPacket(struct GCUHousekeepingPacket* packet) { - uint16_t i; - uint16_t j; - - - free(packet->Temp); - free(packet->ADC); - free(packet->LastCommandIDs); - free(packet->LastCommandPayloads); - free(packet->NumRestartsCC); - free(packet->ShieldThreshold); - free(packet->NumCounts); - free(packet->TimeInterval); - free(packet->LiveTimeFraction); -} - - -void printGCUHousekeepingPacket(struct GCUHousekeepingPacket* packet) { - uint16_t i; - uint16_t j; - - printf("packet->Sync = 0x%04x\n", packet->Sync); - printf("packet->PacketID = 0x%02x\n", packet->PacketID); - printf("packet->UnixTime = 0x%06x\n", packet->UnixTime); - printf("packet->PacketCounter = 0x%04x\n", packet->PacketCounter); - printf("packet->PacketSize = 0x%04x\n", packet->PacketSize); - tempIter : for (i = 0; i < 32; i += 1) { - printf("packet->Temp[%0d] = 0x%04x\n", i, packet->Temp[i]); - } - for (j = 0; j <= 31; j += 1) { - printf("packet->ADC[%0d] = 0x%04x\n", j, packet->ADC[j]); - } - printf("packet->CryoTipTemp = 0x%04x\n", packet->CryoTipTemp); - printf("packet->CryoPower = 0x%04x\n", packet->CryoPower); - printf("packet->ClkVal = 0x%012lx\n", (uint64_t)(packet->ClkVal)); - lastCommandsIter : for (i = 0; i < 3; i += 1) { - printf("packet->LastCommandIDs[%0d] = 0x%02x\n", i, packet->LastCommandIDs[i]); - printf("packet->LastCommandPayloads[%0d] = 0x%04x\n", i, packet->LastCommandPayloads[i]); - } - printf("packet->NumGoodCommands = 0x%04x\n", packet->NumGoodCommands); - printf("packet->NumBadCommands = 0x%04x\n", packet->NumBadCommands); - printf("packet->OPADataRate = 0x%02x\n", packet->OPADataRate); - printf("packet->OPBDataRate = 0x%02x\n", packet->OPBDataRate); - printf("packet->NumAutoResyncs = 0x%02x\n", packet->NumAutoResyncs); - printf("packet->HeaterBoxReadBack7 = 0x%01x\n", packet->HeaterBoxReadBack7); - printf("packet->HeaterBoxReadBack6 = 0x%01x\n", packet->HeaterBoxReadBack6); - printf("packet->HeaterBoxReadBack5 = 0x%01x\n", packet->HeaterBoxReadBack5); - printf("packet->HeaterBoxReadBack4 = 0x%01x\n", packet->HeaterBoxReadBack4); - printf("packet->HeaterBoxReadBack3 = 0x%01x\n", packet->HeaterBoxReadBack3); - printf("packet->HeaterBoxReadBack2 = 0x%01x\n", packet->HeaterBoxReadBack2); - printf("packet->HeaterBoxReadBack1 = 0x%01x\n", packet->HeaterBoxReadBack1); - printf("packet->HeaterBoxReadBack0 = 0x%01x\n", packet->HeaterBoxReadBack0); - printf("packet->NumGCURestarts = 0x%04x\n", packet->NumGCURestarts); - printf("packet->NumBytesInRelayQueue = 0x%08x\n", packet->NumBytesInRelayQueue); - printf("packet->HeaterBoxSetting7 = 0x%01x\n", packet->HeaterBoxSetting7); - printf("packet->HeaterBoxSetting6 = 0x%01x\n", packet->HeaterBoxSetting6); - printf("packet->HeaterBoxSetting5 = 0x%01x\n", packet->HeaterBoxSetting5); - printf("packet->HeaterBoxSetting4 = 0x%01x\n", packet->HeaterBoxSetting4); - printf("packet->HeaterBoxSetting3 = 0x%01x\n", packet->HeaterBoxSetting3); - printf("packet->HeaterBoxSetting2 = 0x%01x\n", packet->HeaterBoxSetting2); - printf("packet->HeaterBoxSetting1 = 0x%01x\n", packet->HeaterBoxSetting1); - printf("packet->HeaterBoxSetting0 = 0x%01x\n", packet->HeaterBoxSetting0); - printf("packet->TStat7Enabled = 0x%01x\n", packet->TStat7Enabled); - printf("packet->TStat6Enabled = 0x%01x\n", packet->TStat6Enabled); - printf("packet->TStat5Enabled = 0x%01x\n", packet->TStat5Enabled); - printf("packet->TStat4Enabled = 0x%01x\n", packet->TStat4Enabled); - printf("packet->TStat3Enabled = 0x%01x\n", packet->TStat3Enabled); - printf("packet->TStat2Enabled = 0x%01x\n", packet->TStat2Enabled); - printf("packet->TStat1Enabled = 0x%01x\n", packet->TStat1Enabled); - printf("packet->TStat0Enabled = 0x%01x\n", packet->TStat0Enabled); - printf("packet->MagredEnabled = 0x%01x\n", packet->MagredEnabled); - printf("packet->MagredPID = 0x%01x\n", packet->MagredPID); - printf("packet->ClkbrdGPIO2 = 0x%01x\n", packet->ClkbrdGPIO2); - printf("packet->ClkbrdGPIO1 = 0x%01x\n", packet->ClkbrdGPIO1); - printf("packet->ClkbrdGPIO0 = 0x%01x\n", packet->ClkbrdGPIO0); - printf("packet->MagredCounter = 0x%02x\n", packet->MagredCounter); - printf("packet->RelayNumPacketsDropped = 0x%08x\n", packet->RelayNumPacketsDropped); - printf("packet->RelayNumBytesDropped = 0x%08lx\n", (uint64_t)(packet->RelayNumBytesDropped)); - printf("packet->RelayRawDataEnabled = 0x%01x\n", packet->RelayRawDataEnabled); - printf("packet->RelayComptonEnabled = 0x%01x\n", packet->RelayComptonEnabled); - printf("packet->RelayQueueAccepting = 0x%01x\n", packet->RelayQueueAccepting); - printf("packet->LOSNumBytesInQueue = 0x%08x\n", packet->LOSNumBytesInQueue); - printf("packet->LOSBytesWritten = 0x%08lx\n", (uint64_t)(packet->LOSBytesWritten)); - printf("packet->LOSNumPacketsDropped = 0x%08x\n", packet->LOSNumPacketsDropped); - printf("packet->LOSNumBytesDropped = 0x%08lx\n", (uint64_t)(packet->LOSNumBytesDropped)); - printf("packet->LOSAutoClear = 0x%01x\n", packet->LOSAutoClear); - printf("packet->LOSIsOpen = 0x%01x\n", packet->LOSIsOpen); - printf("packet->LOSComptonEnabled = 0x%01x\n", packet->LOSComptonEnabled); - printf("packet->LOSQueueAccepting = 0x%01x\n", packet->LOSQueueAccepting); - printf("packet->LOSEnabled = 0x%01x\n", packet->LOSEnabled); - printf("packet->DiskNumBytesInQueue = 0x%08x\n", packet->DiskNumBytesInQueue); - printf("packet->DiskANumBytesWritten = 0x%08lx\n", (uint64_t)(packet->DiskANumBytesWritten)); - printf("packet->DiskBNumBytesWritten = 0x%08lx\n", (uint64_t)(packet->DiskBNumBytesWritten)); - printf("packet->DiskCNumBytesWritten = 0x%08lx\n", (uint64_t)(packet->DiskCNumBytesWritten)); - printf("packet->DiskCIsMounted = 0x%01x\n", packet->DiskCIsMounted); - printf("packet->DiskBIsMounted = 0x%01x\n", packet->DiskBIsMounted); - printf("packet->DiskAIsMounted = 0x%01x\n", packet->DiskAIsMounted); - printf("packet->DiskCNotNull = 0x%01x\n", packet->DiskCNotNull); - printf("packet->DiskBNotNull = 0x%01x\n", packet->DiskBNotNull); - printf("packet->DiskANotNull = 0x%01x\n", packet->DiskANotNull); - printf("packet->DiskComptonEnabled = 0x%01x\n", packet->DiskComptonEnabled); - printf("packet->GRBNumBytesInQueue = 0x%08x\n", packet->GRBNumBytesInQueue); - printf("packet->GRBTdiff = 0x%08x\n", packet->GRBTdiff); - printf("packet->GRBNumTriggers = 0x%08x\n", packet->GRBNumTriggers); - printf("packet->ShieldAlgoTrigEnabled2 = 0x%01x\n", packet->ShieldAlgoTrigEnabled2); - printf("packet->ShieldAlgoTrigEnabled1 = 0x%01x\n", packet->ShieldAlgoTrigEnabled1); - printf("packet->ShieldAlgoTrigEnabled0 = 0x%01x\n", packet->ShieldAlgoTrigEnabled0); - printf("packet->GRBAutoTriggerEnabled = 0x%01x\n", packet->GRBAutoTriggerEnabled); - printf("packet->GRBTriggerActive = 0x%01x\n", packet->GRBTriggerActive); - printf("packet->GRBQueueAccepting = 0x%01x\n", packet->GRBQueueAccepting); - printf("packet->RTANumBytesInQueue = 0x%08x\n", packet->RTANumBytesInQueue); - printf("packet->RTAAcceptingSingleDetectorEvents = 0x%01x\n", packet->RTAAcceptingSingleDetectorEvents); - printf("packet->RTAAutoRebootEnabled = 0x%01x\n", packet->RTAAutoRebootEnabled); - printf("packet->RTAComptonAnalysisEnabled = 0x%01x\n", packet->RTAComptonAnalysisEnabled); - printf("packet->RTAComptonQueueAutoClearEnabled = 0x%01x\n", packet->RTAComptonQueueAutoClearEnabled); - printf("packet->RTAQueueAccepting = 0x%01x\n", packet->RTAQueueAccepting); - printf("packet->RTAEnabled = 0x%01x\n", packet->RTAEnabled); - printf("packet->OpenPortANumBytesWritten = 0x%08lx\n", (uint64_t)(packet->OpenPortANumBytesWritten)); - printf("packet->UnixTimeMSB = 0x%02x\n", packet->UnixTimeMSB); - printf("packet->OpenPortAUDPSocket = 0x%01x\n", packet->OpenPortAUDPSocket); - printf("packet->OpenPortAEnabled = 0x%01x\n", packet->OpenPortAEnabled); - printf("packet->OpenPortBNumBytesWritten = 0x%08lx\n", (uint64_t)(packet->OpenPortBNumBytesWritten)); - printf("packet->OpenPortBUDPSocket = 0x%01x\n", packet->OpenPortBUDPSocket); - printf("packet->OpenPortBEnabled = 0x%01x\n", packet->OpenPortBEnabled); - for (i = 0; i < 12; i += 1) { - printf("packet->NumRestartsCC[%0d] = 0x%02x\n", i, packet->NumRestartsCC[i]); - } - printf("packet->SerialDialupOpen = 0x%01x\n", packet->SerialDialupOpen); - printf("packet->SerialCryoOpen = 0x%01x\n", packet->SerialCryoOpen); - printf("packet->SerialMagOpen = 0x%01x\n", packet->SerialMagOpen); - printf("packet->SerialGPSOpen = 0x%01x\n", packet->SerialGPSOpen); - printf("packet->SerialSIP2Open = 0x%01x\n", packet->SerialSIP2Open); - printf("packet->SerialSIP1Open = 0x%01x\n", packet->SerialSIP1Open); - printf("packet->DiskAUsage = 0x%02x\n", packet->DiskAUsage); - printf("packet->DiskBUsage = 0x%02x\n", packet->DiskBUsage); - printf("packet->DiskCUsage = 0x%02x\n", packet->DiskCUsage); - printf("packet->HVStatusCC11 = 0x%01x\n", packet->HVStatusCC11); - printf("packet->HVStatusCC10 = 0x%01x\n", packet->HVStatusCC10); - printf("packet->HVStatusCC9 = 0x%01x\n", packet->HVStatusCC9); - printf("packet->HVStatusCC8 = 0x%01x\n", packet->HVStatusCC8); - printf("packet->HVStatusCC7 = 0x%01x\n", packet->HVStatusCC7); - printf("packet->HVStatusCC6 = 0x%01x\n", packet->HVStatusCC6); - printf("packet->HVStatusCC5 = 0x%01x\n", packet->HVStatusCC5); - printf("packet->HVStatusCC4 = 0x%01x\n", packet->HVStatusCC4); - printf("packet->HVStatusCC3 = 0x%01x\n", packet->HVStatusCC3); - printf("packet->HVStatusCC2 = 0x%01x\n", packet->HVStatusCC2); - printf("packet->HVStatusCC1 = 0x%01x\n", packet->HVStatusCC1); - printf("packet->HVStatusCC0 = 0x%01x\n", packet->HVStatusCC0); - printf("packet->HVStatusShield5 = 0x%01x\n", packet->HVStatusShield5); - printf("packet->HVStatusShield4 = 0x%01x\n", packet->HVStatusShield4); - printf("packet->HVStatusShield3 = 0x%01x\n", packet->HVStatusShield3); - printf("packet->HVStatusShield2 = 0x%01x\n", packet->HVStatusShield2); - printf("packet->HVStatusShield1 = 0x%01x\n", packet->HVStatusShield1); - printf("packet->HVStatusShield0 = 0x%01x\n", packet->HVStatusShield0); - for (i = 0; i < 6; i += 1) { - printf("packet->ShieldThreshold[%0d] = 0x%02x\n", i, packet->ShieldThreshold[i]); - } - printf("packet->DiskCEnabled = 0x%01x\n", packet->DiskCEnabled); - printf("packet->DiskBEnabled = 0x%01x\n", packet->DiskBEnabled); - printf("packet->DiskAEnabled = 0x%01x\n", packet->DiskAEnabled); - printf("packet->GlobalClockSupervisorResyncEnabled = 0x%01x\n", packet->GlobalClockSupervisorResyncEnabled); - printf("packet->GPSMagEnabled = 0x%01x\n", packet->GPSMagEnabled); - printf("packet->GPSEnabled = 0x%01x\n", packet->GPSEnabled); - printf("packet->EthernetReallocateEnabled = 0x%01x\n", packet->EthernetReallocateEnabled); - printf("packet->GlobalPROMLoadSuccessful = 0x%01x\n", packet->GlobalPROMLoadSuccessful); - printf("packet->RTAContinuityOK7 = 0x%01x\n", packet->RTAContinuityOK7); - printf("packet->RTAContinuityOK6 = 0x%01x\n", packet->RTAContinuityOK6); - printf("packet->RTAContinuityOK5 = 0x%01x\n", packet->RTAContinuityOK5); - printf("packet->RTAContinuityOK4 = 0x%01x\n", packet->RTAContinuityOK4); - printf("packet->RTAContinuityOK3 = 0x%01x\n", packet->RTAContinuityOK3); - printf("packet->RTAContinuityOK2 = 0x%01x\n", packet->RTAContinuityOK2); - printf("packet->RTAContinuityOK1 = 0x%01x\n", packet->RTAContinuityOK1); - printf("packet->RTAContinuityOK0 = 0x%01x\n", packet->RTAContinuityOK0); - printf("packet->GlobalSyncStatusCC3 = 0x%01x\n", packet->GlobalSyncStatusCC3); - printf("packet->GlobalSyncStatusCC2 = 0x%01x\n", packet->GlobalSyncStatusCC2); - printf("packet->GlobalSyncStatusCC1 = 0x%01x\n", packet->GlobalSyncStatusCC1); - printf("packet->GlobalSyncStatusCC0 = 0x%01x\n", packet->GlobalSyncStatusCC0); - printf("packet->RTAContinuityOK11 = 0x%01x\n", packet->RTAContinuityOK11); - printf("packet->RTAContinuityOK10 = 0x%01x\n", packet->RTAContinuityOK10); - printf("packet->RTAContinuityOK9 = 0x%01x\n", packet->RTAContinuityOK9); - printf("packet->RTAContinuityOK8 = 0x%01x\n", packet->RTAContinuityOK8); - printf("packet->GlobalSyncStatusCC11 = 0x%01x\n", packet->GlobalSyncStatusCC11); - printf("packet->GlobalSyncStatusCC10 = 0x%01x\n", packet->GlobalSyncStatusCC10); - printf("packet->GlobalSyncStatusCC9 = 0x%01x\n", packet->GlobalSyncStatusCC9); - printf("packet->GlobalSyncStatusCC8 = 0x%01x\n", packet->GlobalSyncStatusCC8); - printf("packet->GlobalSyncStatusCC7 = 0x%01x\n", packet->GlobalSyncStatusCC7); - printf("packet->GlobalSyncStatusCC6 = 0x%01x\n", packet->GlobalSyncStatusCC6); - printf("packet->GlobalSyncStatusCC5 = 0x%01x\n", packet->GlobalSyncStatusCC5); - printf("packet->GlobalSyncStatusCC4 = 0x%01x\n", packet->GlobalSyncStatusCC4); - printf("packet->RTANumEventsActive7 = 0x%01x\n", packet->RTANumEventsActive7); - printf("packet->RTANumEventsActive6 = 0x%01x\n", packet->RTANumEventsActive6); - printf("packet->RTANumEventsActive5 = 0x%01x\n", packet->RTANumEventsActive5); - printf("packet->RTANumEventsActive4 = 0x%01x\n", packet->RTANumEventsActive4); - printf("packet->RTANumEventsActive3 = 0x%01x\n", packet->RTANumEventsActive3); - printf("packet->RTANumEventsActive2 = 0x%01x\n", packet->RTANumEventsActive2); - printf("packet->RTANumEventsActive1 = 0x%01x\n", packet->RTANumEventsActive1); - printf("packet->RTANumEventsActive0 = 0x%01x\n", packet->RTANumEventsActive0); - printf("packet->RTAAnalysisEnabled3 = 0x%01x\n", packet->RTAAnalysisEnabled3); - printf("packet->RTAAnalysisEnabled2 = 0x%01x\n", packet->RTAAnalysisEnabled2); - printf("packet->RTAAnalysisEnabled1 = 0x%01x\n", packet->RTAAnalysisEnabled1); - printf("packet->RTAAnalysisEnabled0 = 0x%01x\n", packet->RTAAnalysisEnabled0); - printf("packet->RTANumEventsActive11 = 0x%01x\n", packet->RTANumEventsActive11); - printf("packet->RTANumEventsActive10 = 0x%01x\n", packet->RTANumEventsActive10); - printf("packet->RTANumEventsActive9 = 0x%01x\n", packet->RTANumEventsActive9); - printf("packet->RTANumEventsActive8 = 0x%01x\n", packet->RTANumEventsActive8); - printf("packet->RTAAnalysisEnabled11 = 0x%01x\n", packet->RTAAnalysisEnabled11); - printf("packet->RTAAnalysisEnabled10 = 0x%01x\n", packet->RTAAnalysisEnabled10); - printf("packet->RTAAnalysisEnabled9 = 0x%01x\n", packet->RTAAnalysisEnabled9); - printf("packet->RTAAnalysisEnabled8 = 0x%01x\n", packet->RTAAnalysisEnabled8); - printf("packet->RTAAnalysisEnabled7 = 0x%01x\n", packet->RTAAnalysisEnabled7); - printf("packet->RTAAnalysisEnabled6 = 0x%01x\n", packet->RTAAnalysisEnabled6); - printf("packet->RTAAnalysisEnabled5 = 0x%01x\n", packet->RTAAnalysisEnabled5); - printf("packet->RTAAnalysisEnabled4 = 0x%01x\n", packet->RTAAnalysisEnabled4); - printf("packet->GRBLastTrigTime = 0x%08x\n", packet->GRBLastTrigTime); - printf("packet->ShieldNumAlgoTriggers0 = 0x%02x\n", packet->ShieldNumAlgoTriggers0); - printf("packet->ShieldNumAlgoTriggers1 = 0x%02x\n", packet->ShieldNumAlgoTriggers1); - printf("packet->ShieldNumAlgoTriggers2 = 0x%02x\n", packet->ShieldNumAlgoTriggers2); - printf("packet->WhichSIP = 0x%01x\n", packet->WhichSIP); - printf("packet->TelemUDPMode = 0x%01x\n", packet->TelemUDPMode); - printf("packet->SIPLon = 0x%04x\n", packet->SIPLon); - printf("packet->SIPLat = 0x%04x\n", packet->SIPLat); - printf("packet->SIPAlt = 0x%04x\n", packet->SIPAlt); - printf("packet->SIPTime = 0x%08x\n", packet->SIPTime); - printf("packet->SIPWeek = 0x%04x\n", packet->SIPWeek); - printf("packet->SIPPressure = 0x%04x\n", packet->SIPPressure); - printf("packet->SIPHealth = 0x%04x\n", packet->SIPHealth); - printf("packet->FlightCodeCPUUsage = 0x%02x\n", packet->FlightCodeCPUUsage); - printf("packet->FlightCodeMemUsage = 0x%02x\n", packet->FlightCodeMemUsage); - printf("packet->MagredCPUUsage = 0x%02x\n", packet->MagredCPUUsage); - printf("packet->MagredMemUsage = 0x%02x\n", packet->MagredMemUsage); - printf("packet->EthernetTotalNumRawDataframes = 0x%08x\n", packet->EthernetTotalNumRawDataframes); - printf("packet->EthernetTotalNumComptonDataframes = 0x%08x\n", packet->EthernetTotalNumComptonDataframes); - printf("packet->DoublePumpOverrideEnabled = 0x%01x\n", packet->DoublePumpOverrideEnabled); - printf("packet->PumpEPromCodeGood = 0x%01x\n", packet->PumpEPromCodeGood); - printf("packet->PumpTachAValid = 0x%01x\n", packet->PumpTachAValid); - printf("packet->PumpTachBValid = 0x%01x\n", packet->PumpTachBValid); - printf("packet->PumpDACASetting = 0x%02x\n", packet->PumpDACASetting); - printf("packet->PumpDACBSetting = 0x%02x\n", packet->PumpDACBSetting); - printf("packet->PumpTachALast = 0x%04x\n", packet->PumpTachALast); - printf("packet->PumpTachAHigh = 0x%04x\n", packet->PumpTachAHigh); - printf("packet->PumpTachALow = 0x%04x\n", packet->PumpTachALow); - printf("packet->PumpTachBLast = 0x%04x\n", packet->PumpTachBLast); - printf("packet->PumpTachBHigh = 0x%04x\n", packet->PumpTachBHigh); - printf("packet->PumpTachBLow = 0x%04x\n", packet->PumpTachBLow); - printf("packet->PumpLevelSensor = 0x%04x\n", packet->PumpLevelSensor); - printf("packet->ShieldNumSamples = 0x%02x\n", packet->ShieldNumSamples); - shieldSample : for (i = 0; i < packet->ShieldNumSamples; i += 1) { - printf("packet->NumCounts[%0d] = 0x%08x\n", i, packet->NumCounts[i]); - printf("packet->TimeInterval[%0d] = 0x%08x\n", i, packet->TimeInterval[i]); - printf("packet->LiveTimeFraction[%0d] = 0x%02x\n", i, packet->LiveTimeFraction[i]); - } -} - -void getGCUHousekeepingPacketAllocatedSizes(struct GCUHousekeepingPacket* packet, uint16_t** sizesPtr) { - uint16_t* sizes; - - sizes = (uint16_t*)malloc(9*sizeof(uint16_t)); - sizes[0] = (uint16_t)32; - sizes[1] = (uint16_t)32; - sizes[2] = (uint16_t)3; - sizes[3] = (uint16_t)3; - sizes[4] = (uint16_t)12; - sizes[5] = (uint16_t)6; - sizes[6] = (uint16_t)packet->ShieldNumSamples; - sizes[7] = (uint16_t)packet->ShieldNumSamples; - sizes[8] = (uint16_t)packet->ShieldNumSamples; - - *sizesPtr = sizes; -} diff --git a/src/GCUSettingsParser.cxx b/src/GCUSettingsParser.cxx deleted file mode 100644 index d94cd2c5..00000000 --- a/src/GCUSettingsParser.cxx +++ /dev/null @@ -1,247 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////////////////// -// _____ ____ _ _ ____ _______ ______ _____ _____ _______ _ // -// | __ \ / __ \ | \ | |/ __ \__ __| | ____| __ \_ _|__ __| | // -// | | | | | | | | \| | | | | | | | |__ | | | || | | | | | // -// | | | | | | | | . ` | | | | | | | __| | | | || | | | | | // -// | |__| | |__| | | |\ | |__| | | | | |____| |__| || |_ | | |_| // -// |_____/ \____/ |_| \_|\____/ |_| |______|_____/_____| |_| (_) // -// // -// WARNING! This is an automatically generated file. DO NOT EDIT // -//////////////////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////////////////// - -#include -#include -#include -#include -#include "GCUSettingsParser.h" - -struct GCUSettingsPacket* ParseGCUSettingsPacket(uint8_t* RawData) { - uint16_t byteIndex = 0; - uint8_t bitIndex = 7; - struct GCUSettingsPacket* packet; - - packet = MakeNewGCUSettingsPacket(); - ParseAllocatedGCUSettingsPacket(RawData, packet); - return packet; -} - -void ParseGCUSettingsPacketWrapper(uint8_t* RawData, void* packet_bytes) { - ParseAllocatedGCUSettingsPacket(RawData, (struct GCUSettingsPacket*)packet_bytes); -} - -void ParseAllocatedGCUSettingsPacket(uint8_t* RawData, struct GCUSettingsPacket* packet) { - uint16_t i; - packet->Sync = (((uint16_t)RawData[0]) << 8) | ((uint16_t)RawData[1]); - packet->PacketID = ((uint8_t)RawData[2]); - packet->UnixTime = (((uint32_t)RawData[3]) << 16) | (((uint32_t)RawData[4]) << 8) | ((uint32_t)RawData[5]); - packet->PacketCounter = (((uint16_t)RawData[6]) << 8) | ((uint16_t)RawData[7]); - packet->PacketSize = (((uint16_t)RawData[8]) << 8) | ((uint16_t)RawData[9]); - packet->OPAHeartBeatTimeout = (((uint16_t)RawData[10]) << 8) | ((uint16_t)RawData[11]); - packet->OPBHeartBeatTimeout = (((uint16_t)RawData[12]) << 8) | ((uint16_t)RawData[13]); - packet->LOSMaxQueueSize = (((uint32_t)RawData[14]) << 24) | (((uint32_t)RawData[15]) << 16) | (((uint32_t)RawData[16]) << 8) | ((uint32_t)RawData[17]); - packet->DroppedMaxQueueSize = (((uint32_t)RawData[18]) << 24) | (((uint32_t)RawData[19]) << 16) | (((uint32_t)RawData[20]) << 8) | ((uint32_t)RawData[21]); - packet->RelayMaxQueueSize = (((uint32_t)RawData[22]) << 24) | (((uint32_t)RawData[23]) << 16) | (((uint32_t)RawData[24]) << 8) | ((uint32_t)RawData[25]); - packet->DiskMaxQueueSize = (((uint32_t)RawData[26]) << 24) | (((uint32_t)RawData[27]) << 16) | (((uint32_t)RawData[28]) << 8) | ((uint32_t)RawData[29]); - packet->DiskMaxFileSize = (((uint32_t)RawData[30]) << 24) | (((uint32_t)RawData[31]) << 16) | (((uint32_t)RawData[32]) << 8) | ((uint32_t)RawData[33]); - packet->RTAMaxQueueSize = (((uint32_t)RawData[34]) << 24) | (((uint32_t)RawData[35]) << 16) | (((uint32_t)RawData[36]) << 8) | ((uint32_t)RawData[37]); - packet->RTAMaxComptonQueueSize = (((uint32_t)RawData[38]) << 24) | (((uint32_t)RawData[39]) << 16) | (((uint32_t)RawData[40]) << 8) | ((uint32_t)RawData[41]); - packet->RTAMaxNumTriggers = (((uint16_t)RawData[42]) << 8) | ((uint16_t)RawData[43]); - packet->RTAComptonWindow = ((uint8_t)RawData[44]); - packet->GRBMaxQueueSize = (((uint32_t)RawData[45]) << 24) | (((uint32_t)RawData[46]) << 16) | (((uint32_t)RawData[47]) << 8) | ((uint32_t)RawData[48]); - packet->GRBQueueTDiff = (((uint32_t)RawData[49]) << 24) | (((uint32_t)RawData[50]) << 16) | (((uint32_t)RawData[51]) << 8) | ((uint32_t)RawData[52]); - packet->ShieldSampleRate100ms = (((uint16_t)RawData[53]) << 8) | ((uint16_t)RawData[54]); - packet->HkpShieldInterval = (((uint16_t)RawData[55]) << 8) | ((uint16_t)RawData[56]); - packet->ShieldAlgoInterval = (uint16_t*)malloc(3*sizeof(uint16_t)); - packet->ShieldTriggerSigma = (uint16_t*)malloc(3*sizeof(uint16_t)); - packet->GRBAlgoMinSamples = (uint16_t*)malloc(3*sizeof(uint16_t)); - packet->GRBAlgoMaxSamples = (uint16_t*)malloc(3*sizeof(uint16_t)); - algo : for (i = 0; i < 3; i += 1) { - packet->ShieldAlgoInterval[i] = (((uint16_t)RawData[57 + 8*i + 0]) << 8) | ((uint16_t)RawData[57 + 8*i + 1]); - packet->ShieldTriggerSigma[i] = (((uint16_t)RawData[57 + 8*i + 2]) << 8) | ((uint16_t)RawData[57 + 8*i + 3]); - packet->GRBAlgoMinSamples[i] = (((uint16_t)RawData[57 + 8*i + 4]) << 8) | ((uint16_t)RawData[57 + 8*i + 5]); - packet->GRBAlgoMaxSamples[i] = (((uint16_t)RawData[57 + 8*i + 6]) << 8) | ((uint16_t)RawData[57 + 8*i + 7]); - } - packet->GPSSampleRate100ms = (((uint16_t)RawData[81]) << 8) | ((uint16_t)RawData[82]); - packet->GPSDiagInterval = (((uint16_t)RawData[83]) << 8) | ((uint16_t)RawData[84]); - packet->HkpPeriod100ms = (((uint16_t)RawData[85]) << 8) | ((uint16_t)RawData[86]); - packet->CryoPID = ((uint8_t)RawData[87]); - packet->CryoTTarget = (((uint16_t)RawData[88]) << 8) | ((uint16_t)RawData[89]); - packet->CryoPWOut = (((uint16_t)RawData[90]) << 8) | ((uint16_t)RawData[91]); - packet->CryoMax = (((uint16_t)RawData[92]) << 8) | ((uint16_t)RawData[93]); - packet->OPAUDPByteLimit = (((uint16_t)RawData[94]) << 8) | ((uint16_t)RawData[95]); - packet->OPBUDPByteLimit = (((uint16_t)RawData[96]) << 8) | ((uint16_t)RawData[97]); - packet->RpiTemp_Brd0_Ch0 = (((uint16_t)RawData[98]) << 8) | ((uint16_t)RawData[99]); - packet->RpiTemp_Brd0_Ch1 = (((uint16_t)RawData[100]) << 8) | ((uint16_t)RawData[101]); - packet->RpiTemp_Brd0_Ch2 = (((uint16_t)RawData[102]) << 8) | ((uint16_t)RawData[103]); - packet->RpiTemp_Brd0_Ch3 = (((uint16_t)RawData[104]) << 8) | ((uint16_t)RawData[105]); - packet->RpiTemp_Brd0_Ch4 = (((uint16_t)RawData[106]) << 8) | ((uint16_t)RawData[107]); - packet->RpiTemp_Brd0_Ch5 = (((uint16_t)RawData[108]) << 8) | ((uint16_t)RawData[109]); - packet->RpiTemp_Brd0_Ch6 = (((uint16_t)RawData[110]) << 8) | ((uint16_t)RawData[111]); - packet->RpiTemp_Brd0_Ch7 = (((uint16_t)RawData[112]) << 8) | ((uint16_t)RawData[113]); - packet->RpiTemp_Brd1_Ch0 = (((uint16_t)RawData[114]) << 8) | ((uint16_t)RawData[115]); - packet->RpiTemp_Brd1_Ch1 = (((uint16_t)RawData[116]) << 8) | ((uint16_t)RawData[117]); - packet->RpiTemp_Brd1_Ch2 = (((uint16_t)RawData[118]) << 8) | ((uint16_t)RawData[119]); - packet->RpiTemp_Brd1_Ch3 = (((uint16_t)RawData[120]) << 8) | ((uint16_t)RawData[121]); - packet->RpiTemp_Brd1_Ch4 = (((uint16_t)RawData[122]) << 8) | ((uint16_t)RawData[123]); - packet->RpiTemp_Brd1_Ch5 = (((uint16_t)RawData[124]) << 8) | ((uint16_t)RawData[125]); - packet->RpiTemp_Brd1_Ch6 = (((uint16_t)RawData[126]) << 8) | ((uint16_t)RawData[127]); - packet->RpiTemp_Brd1_Ch7 = (((uint16_t)RawData[128]) << 8) | ((uint16_t)RawData[129]); - packet->RpiTemp_Brd2_Ch0 = (((uint16_t)RawData[130]) << 8) | ((uint16_t)RawData[131]); - packet->RpiTemp_Brd2_Ch1 = (((uint16_t)RawData[132]) << 8) | ((uint16_t)RawData[133]); - packet->RpiTemp_Brd2_Ch2 = (((uint16_t)RawData[134]) << 8) | ((uint16_t)RawData[135]); - packet->RpiTemp_Brd2_Ch3 = (((uint16_t)RawData[136]) << 8) | ((uint16_t)RawData[137]); - packet->RpiTemp_Brd2_Ch4 = (((uint16_t)RawData[138]) << 8) | ((uint16_t)RawData[139]); - packet->RpiTemp_Brd2_Ch5 = (((uint16_t)RawData[140]) << 8) | ((uint16_t)RawData[141]); - packet->RpiTemp_Brd2_Ch6 = (((uint16_t)RawData[142]) << 8) | ((uint16_t)RawData[143]); - packet->RpiTemp_Brd2_Ch7 = (((uint16_t)RawData[144]) << 8) | ((uint16_t)RawData[145]); - packet->RpiTemp_Brd3_Ch0 = (((uint16_t)RawData[146]) << 8) | ((uint16_t)RawData[147]); - packet->RpiTemp_Brd3_Ch1 = (((uint16_t)RawData[148]) << 8) | ((uint16_t)RawData[149]); - packet->RpiTemp_Brd3_Ch2 = (((uint16_t)RawData[150]) << 8) | ((uint16_t)RawData[151]); - packet->RpiTemp_Brd3_Ch3 = (((uint16_t)RawData[152]) << 8) | ((uint16_t)RawData[153]); - packet->RpiTemp_Brd3_Ch4 = (((uint16_t)RawData[154]) << 8) | ((uint16_t)RawData[155]); - packet->RpiTemp_Brd3_Ch5 = (((uint16_t)RawData[156]) << 8) | ((uint16_t)RawData[157]); - packet->RpiTemp_Brd3_Ch6 = (((uint16_t)RawData[158]) << 8) | ((uint16_t)RawData[159]); - packet->RpiTemp_Brd3_Ch7 = (((uint16_t)RawData[160]) << 8) | ((uint16_t)RawData[161]); - packet->MagPiX = (((uint16_t)RawData[162]) << 8) | ((uint16_t)RawData[163]); - packet->MagPiY = (((uint16_t)RawData[164]) << 8) | ((uint16_t)RawData[165]); - packet->MagPiZ = (((uint16_t)RawData[166]) << 8) | ((uint16_t)RawData[167]); - packet->TStat0LowerTemp = (((uint16_t)RawData[168]) << 8) | ((uint16_t)RawData[169]); - packet->TStat0UpperTemp = (((uint16_t)RawData[170]) << 8) | ((uint16_t)RawData[171]); - packet->TStat1LowerTemp = (((uint16_t)RawData[172]) << 8) | ((uint16_t)RawData[173]); - packet->TStat1UpperTemp = (((uint16_t)RawData[174]) << 8) | ((uint16_t)RawData[175]); - packet->TStat2LowerTemp = (((uint16_t)RawData[176]) << 8) | ((uint16_t)RawData[177]); - packet->TStat2UpperTemp = (((uint16_t)RawData[178]) << 8) | ((uint16_t)RawData[179]); - packet->TStat3LowerTemp = (((uint16_t)RawData[180]) << 8) | ((uint16_t)RawData[181]); - packet->TStat3UpperTemp = (((uint16_t)RawData[182]) << 8) | ((uint16_t)RawData[183]); - packet->TStat4LowerTemp = (((uint16_t)RawData[184]) << 8) | ((uint16_t)RawData[185]); - packet->TStat4UpperTemp = (((uint16_t)RawData[186]) << 8) | ((uint16_t)RawData[187]); - packet->TStat5LowerTemp = (((uint16_t)RawData[188]) << 8) | ((uint16_t)RawData[189]); - packet->TStat5UpperTemp = (((uint16_t)RawData[190]) << 8) | ((uint16_t)RawData[191]); - packet->TStat6LowerTemp = (((uint16_t)RawData[192]) << 8) | ((uint16_t)RawData[193]); - packet->TStat6UpperTemp = (((uint16_t)RawData[194]) << 8) | ((uint16_t)RawData[195]); - packet->TStat7LowerTemp = (((uint16_t)RawData[196]) << 8) | ((uint16_t)RawData[197]); - packet->TStat7UpperTemp = (((uint16_t)RawData[198]) << 8) | ((uint16_t)RawData[199]); -} - -struct GCUSettingsPacket* MakeNewGCUSettingsPacket(void) { - uint8_t i = 0; - struct GCUSettingsPacket* packet = (struct GCUSettingsPacket*) malloc (sizeof(struct GCUSettingsPacket)); - memset(packet, 0, sizeof(struct GCUSettingsPacket)); - return packet; -} - -void FreeAllocatedGCUSettingsPacket(struct GCUSettingsPacket* packet) { - uint16_t i; - - - free(packet->ShieldAlgoInterval); - free(packet->ShieldTriggerSigma); - free(packet->GRBAlgoMinSamples); - free(packet->GRBAlgoMaxSamples); -} - - -void printGCUSettingsPacket(struct GCUSettingsPacket* packet) { - uint16_t i; - - printf("packet->Sync = 0x%04x\n", packet->Sync); - printf("packet->PacketID = 0x%02x\n", packet->PacketID); - printf("packet->UnixTime = 0x%06x\n", packet->UnixTime); - printf("packet->PacketCounter = 0x%04x\n", packet->PacketCounter); - printf("packet->PacketSize = 0x%04x\n", packet->PacketSize); - printf("packet->OPAHeartBeatTimeout = 0x%04x\n", packet->OPAHeartBeatTimeout); - printf("packet->OPBHeartBeatTimeout = 0x%04x\n", packet->OPBHeartBeatTimeout); - printf("packet->LOSMaxQueueSize = 0x%08x\n", packet->LOSMaxQueueSize); - printf("packet->DroppedMaxQueueSize = 0x%08x\n", packet->DroppedMaxQueueSize); - printf("packet->RelayMaxQueueSize = 0x%08x\n", packet->RelayMaxQueueSize); - printf("packet->DiskMaxQueueSize = 0x%08x\n", packet->DiskMaxQueueSize); - printf("packet->DiskMaxFileSize = 0x%08x\n", packet->DiskMaxFileSize); - printf("packet->RTAMaxQueueSize = 0x%08x\n", packet->RTAMaxQueueSize); - printf("packet->RTAMaxComptonQueueSize = 0x%08x\n", packet->RTAMaxComptonQueueSize); - printf("packet->RTAMaxNumTriggers = 0x%04x\n", packet->RTAMaxNumTriggers); - printf("packet->RTAComptonWindow = 0x%02x\n", packet->RTAComptonWindow); - printf("packet->GRBMaxQueueSize = 0x%08x\n", packet->GRBMaxQueueSize); - printf("packet->GRBQueueTDiff = 0x%08x\n", packet->GRBQueueTDiff); - printf("packet->ShieldSampleRate100ms = 0x%04x\n", packet->ShieldSampleRate100ms); - printf("packet->HkpShieldInterval = 0x%04x\n", packet->HkpShieldInterval); - algo : for (i = 0; i < 3; i += 1) { - printf("packet->ShieldAlgoInterval[%0d] = 0x%04x\n", i, packet->ShieldAlgoInterval[i]); - printf("packet->ShieldTriggerSigma[%0d] = 0x%04x\n", i, packet->ShieldTriggerSigma[i]); - printf("packet->GRBAlgoMinSamples[%0d] = 0x%04x\n", i, packet->GRBAlgoMinSamples[i]); - printf("packet->GRBAlgoMaxSamples[%0d] = 0x%04x\n", i, packet->GRBAlgoMaxSamples[i]); - } - printf("packet->GPSSampleRate100ms = 0x%04x\n", packet->GPSSampleRate100ms); - printf("packet->GPSDiagInterval = 0x%04x\n", packet->GPSDiagInterval); - printf("packet->HkpPeriod100ms = 0x%04x\n", packet->HkpPeriod100ms); - printf("packet->CryoPID = 0x%02x\n", packet->CryoPID); - printf("packet->CryoTTarget = 0x%04x\n", packet->CryoTTarget); - printf("packet->CryoPWOut = 0x%04x\n", packet->CryoPWOut); - printf("packet->CryoMax = 0x%04x\n", packet->CryoMax); - printf("packet->OPAUDPByteLimit = 0x%04x\n", packet->OPAUDPByteLimit); - printf("packet->OPBUDPByteLimit = 0x%04x\n", packet->OPBUDPByteLimit); - printf("packet->RpiTemp_Brd0_Ch0 = 0x%04x\n", packet->RpiTemp_Brd0_Ch0); - printf("packet->RpiTemp_Brd0_Ch1 = 0x%04x\n", packet->RpiTemp_Brd0_Ch1); - printf("packet->RpiTemp_Brd0_Ch2 = 0x%04x\n", packet->RpiTemp_Brd0_Ch2); - printf("packet->RpiTemp_Brd0_Ch3 = 0x%04x\n", packet->RpiTemp_Brd0_Ch3); - printf("packet->RpiTemp_Brd0_Ch4 = 0x%04x\n", packet->RpiTemp_Brd0_Ch4); - printf("packet->RpiTemp_Brd0_Ch5 = 0x%04x\n", packet->RpiTemp_Brd0_Ch5); - printf("packet->RpiTemp_Brd0_Ch6 = 0x%04x\n", packet->RpiTemp_Brd0_Ch6); - printf("packet->RpiTemp_Brd0_Ch7 = 0x%04x\n", packet->RpiTemp_Brd0_Ch7); - printf("packet->RpiTemp_Brd1_Ch0 = 0x%04x\n", packet->RpiTemp_Brd1_Ch0); - printf("packet->RpiTemp_Brd1_Ch1 = 0x%04x\n", packet->RpiTemp_Brd1_Ch1); - printf("packet->RpiTemp_Brd1_Ch2 = 0x%04x\n", packet->RpiTemp_Brd1_Ch2); - printf("packet->RpiTemp_Brd1_Ch3 = 0x%04x\n", packet->RpiTemp_Brd1_Ch3); - printf("packet->RpiTemp_Brd1_Ch4 = 0x%04x\n", packet->RpiTemp_Brd1_Ch4); - printf("packet->RpiTemp_Brd1_Ch5 = 0x%04x\n", packet->RpiTemp_Brd1_Ch5); - printf("packet->RpiTemp_Brd1_Ch6 = 0x%04x\n", packet->RpiTemp_Brd1_Ch6); - printf("packet->RpiTemp_Brd1_Ch7 = 0x%04x\n", packet->RpiTemp_Brd1_Ch7); - printf("packet->RpiTemp_Brd2_Ch0 = 0x%04x\n", packet->RpiTemp_Brd2_Ch0); - printf("packet->RpiTemp_Brd2_Ch1 = 0x%04x\n", packet->RpiTemp_Brd2_Ch1); - printf("packet->RpiTemp_Brd2_Ch2 = 0x%04x\n", packet->RpiTemp_Brd2_Ch2); - printf("packet->RpiTemp_Brd2_Ch3 = 0x%04x\n", packet->RpiTemp_Brd2_Ch3); - printf("packet->RpiTemp_Brd2_Ch4 = 0x%04x\n", packet->RpiTemp_Brd2_Ch4); - printf("packet->RpiTemp_Brd2_Ch5 = 0x%04x\n", packet->RpiTemp_Brd2_Ch5); - printf("packet->RpiTemp_Brd2_Ch6 = 0x%04x\n", packet->RpiTemp_Brd2_Ch6); - printf("packet->RpiTemp_Brd2_Ch7 = 0x%04x\n", packet->RpiTemp_Brd2_Ch7); - printf("packet->RpiTemp_Brd3_Ch0 = 0x%04x\n", packet->RpiTemp_Brd3_Ch0); - printf("packet->RpiTemp_Brd3_Ch1 = 0x%04x\n", packet->RpiTemp_Brd3_Ch1); - printf("packet->RpiTemp_Brd3_Ch2 = 0x%04x\n", packet->RpiTemp_Brd3_Ch2); - printf("packet->RpiTemp_Brd3_Ch3 = 0x%04x\n", packet->RpiTemp_Brd3_Ch3); - printf("packet->RpiTemp_Brd3_Ch4 = 0x%04x\n", packet->RpiTemp_Brd3_Ch4); - printf("packet->RpiTemp_Brd3_Ch5 = 0x%04x\n", packet->RpiTemp_Brd3_Ch5); - printf("packet->RpiTemp_Brd3_Ch6 = 0x%04x\n", packet->RpiTemp_Brd3_Ch6); - printf("packet->RpiTemp_Brd3_Ch7 = 0x%04x\n", packet->RpiTemp_Brd3_Ch7); - printf("packet->MagPiX = 0x%04x\n", packet->MagPiX); - printf("packet->MagPiY = 0x%04x\n", packet->MagPiY); - printf("packet->MagPiZ = 0x%04x\n", packet->MagPiZ); - printf("packet->TStat0LowerTemp = 0x%04x\n", packet->TStat0LowerTemp); - printf("packet->TStat0UpperTemp = 0x%04x\n", packet->TStat0UpperTemp); - printf("packet->TStat1LowerTemp = 0x%04x\n", packet->TStat1LowerTemp); - printf("packet->TStat1UpperTemp = 0x%04x\n", packet->TStat1UpperTemp); - printf("packet->TStat2LowerTemp = 0x%04x\n", packet->TStat2LowerTemp); - printf("packet->TStat2UpperTemp = 0x%04x\n", packet->TStat2UpperTemp); - printf("packet->TStat3LowerTemp = 0x%04x\n", packet->TStat3LowerTemp); - printf("packet->TStat3UpperTemp = 0x%04x\n", packet->TStat3UpperTemp); - printf("packet->TStat4LowerTemp = 0x%04x\n", packet->TStat4LowerTemp); - printf("packet->TStat4UpperTemp = 0x%04x\n", packet->TStat4UpperTemp); - printf("packet->TStat5LowerTemp = 0x%04x\n", packet->TStat5LowerTemp); - printf("packet->TStat5UpperTemp = 0x%04x\n", packet->TStat5UpperTemp); - printf("packet->TStat6LowerTemp = 0x%04x\n", packet->TStat6LowerTemp); - printf("packet->TStat6UpperTemp = 0x%04x\n", packet->TStat6UpperTemp); - printf("packet->TStat7LowerTemp = 0x%04x\n", packet->TStat7LowerTemp); - printf("packet->TStat7UpperTemp = 0x%04x\n", packet->TStat7UpperTemp); -} - -void getGCUSettingsPacketAllocatedSizes(struct GCUSettingsPacket* packet, uint16_t** sizesPtr) { - uint16_t* sizes; - - sizes = (uint16_t*)malloc(4*sizeof(uint16_t)); - sizes[0] = (uint16_t)3; - sizes[1] = (uint16_t)3; - sizes[2] = (uint16_t)3; - sizes[3] = (uint16_t)3; - - *sizesPtr = sizes; -} diff --git a/src/LivetimeParser.cxx b/src/LivetimeParser.cxx deleted file mode 100644 index 91c11cf6..00000000 --- a/src/LivetimeParser.cxx +++ /dev/null @@ -1,89 +0,0 @@ -/* -Livetime Packet Parser - -Written by Clio Sleator -*/ - -#include -#include -#include -#include -#include "LivetimeParser.h" - - -////////////////////////////////////////////////////////////////////////////////// - -void ParseLivetime(struct LivetimePacket* packet, uint8_t* RawData){ - - int dx = 10; - - packet->PacketCounter = (((uint16_t)RawData[6]) << 8) | ((uint16_t)RawData[7]); - packet->UnixTime = (((uint32_t)RawData[3]) << 16) | (((uint32_t)RawData[4]) << 8) | ((uint32_t)RawData[5]); - packet->PacketSize = (((uint16_t)RawData[8]) << 8) | ((uint16_t)RawData[9]); - packet->Sync = (((uint16_t)RawData[0]) << 8) | ((uint16_t)RawData[1]); - packet->PacketID = ((uint8_t)RawData[2]); - - packet->ClkVal = (((uint64_t)RawData[dx]) << 40) | (((uint64_t)RawData[dx+1]) << 32) | (((uint64_t)RawData[dx+2]) << 24) | (((uint64_t)RawData[dx+3]) << 16) | (((uint64_t)RawData[dx+4]) << 16) | ((uint64_t)RawData[dx+5]); - - - - packet->CCHasLivetime[11] = ((uint8_t)RawData[dx+6] >> 3) & 0x01; - packet->CCHasLivetime[10] = ((uint8_t)RawData[dx+6] >> 2) & 0x01; - packet->CCHasLivetime[9] = ((uint8_t)RawData[dx+6] >> 1) & 0x01; - packet->CCHasLivetime[8] = ((uint8_t)RawData[dx+6]) & 0x01; - - packet->CCHasLivetime[7] = ((uint8_t)RawData[dx+7] >> 7) & 0x01; - packet->CCHasLivetime[6] = ((uint8_t)RawData[dx+7] >> 6) & 0x01; - packet->CCHasLivetime[5] = ((uint8_t)RawData[dx+7] >> 5) & 0x01; - packet->CCHasLivetime[4] = ((uint8_t)RawData[dx+7] >> 4) & 0x01; - packet->CCHasLivetime[3] = ((uint8_t)RawData[dx+7] >> 3) & 0x01; - packet->CCHasLivetime[2] = ((uint8_t)RawData[dx+7] >> 2) & 0x01; - packet->CCHasLivetime[1] = ((uint8_t)RawData[dx+7] >> 1) & 0x01; - packet->CCHasLivetime[0] = ((uint8_t)RawData[dx+7]) & 0x01; - - - //find first high bit - //order is CC8-CC11; CC0-CC7 - int order[12] = {8,9,10,11,0,1,2,3,4,5,6,7}; - int i; - int index = dx+8; - for (i=0; i<12; i++){ - if (packet->CCHasLivetime[order[i]] == 1){ - packet->TotalLivetime[order[i]] = (((uint16_t)RawData[index]) << 8) | ((uint16_t)RawData[index+1]); - packet->ShieldLivetime[order[i]] = (((uint16_t)RawData[index+2]) << 8) | ((uint16_t)RawData[index+3]); - index += 4; - } - //else, put -1 (Want to but in NoneType, but this is C. Just feel weird having it be uninitialized) - else { - packet->TotalLivetime[order[i]] = -1; - packet->ShieldLivetime[order[i]] = -1; - } - } - -}; - -int main(){ - - FILE *fp; - uint8_t buffer[8000648]; - size_t Len; - int buffer_index; - int packet_counter = 0; - - fp = fopen("COSIa122914_084931.dat","r"); - - Len = fread(buffer,1,8000648,fp); - for (buffer_index=0; buffer_index < sizeof(buffer); buffer_index++){ - if (buffer[buffer_index] == 0xeb && buffer[buffer_index+1] == 0x90 && buffer[buffer_index+2] == 0x06){ - packet_counter += 1; - struct LivetimePacket myPacket; - ParseLivetime(&myPacket,&buffer[buffer_index]); - } - } - - printf("%d packets\n",packet_counter); - printf("done!\n"); - - return 0; -} - diff --git a/src/MAspectReconstruction.cxx b/src/MAspectReconstruction.cxx index c3cfa705..70c5cc85 100644 --- a/src/MAspectReconstruction.cxx +++ b/src/MAspectReconstruction.cxx @@ -508,7 +508,7 @@ MAspect * MAspectReconstruction::InterpolateAspect(MTime ReqTime, MAspect * Befo //Define new Elevation angles double Z_Elevation = asin(interRot.GetZZ())*c_Deg; - double Y_Elevation = asin(interRot.GetYZ())*c_Deg; + //double Y_Elevation = asin(interRot.GetYZ())*c_Deg; double X_Elevation = asin(interRot.GetXZ())*c_Deg; //Define new Azimuth angles diff --git a/src/MAssembly.cxx b/src/MAssembly.cxx index 14f6e193..27123aed 100644 --- a/src/MAssembly.cxx +++ b/src/MAssembly.cxx @@ -56,16 +56,14 @@ using namespace std; #include "MModule.h" #include "MGUIExpoCombinedViewer.h" #include "MModuleTransmitterRealta.h" - #include "MModuleLoaderSimulationsBalloon.h" #include "MModuleLoaderSimulationsSMEX.h" +#include "MModuleLoaderSimulationsSingleDet.h" +#include "MModuleLoaderSimulationsCosima.h" #include "MModuleLoaderMeasurementsROA.h" -#include "MModuleReceiverBalloon.h" -#include "MModuleLoaderMeasurementsBinary.h" +#include "MModuleLoaderMeasurementsHDF.h" #include "MModuleEnergyCalibration.h" #include "MModuleEnergyCalibrationUniversal.h" -#include "MModuleCrosstalkCorrection.h" -#include "MModuleChargeSharingCorrection.h" #include "MModuleDepthCalibration.h" #include "MModuleDepthCalibrationB.h" #include "MModuleDepthCalibration2024.h" @@ -74,8 +72,11 @@ using namespace std; #include "MModuleEventFilter.h" #include "MModuleEventSaver.h" #include "MModuleResponseGenerator.h" +#include "MModuleTACcut.h" +#include "MModuleNearestNeighbor.h" #include "MModuleDiagnostics.h" #include "MModuleDiagnosticsEnergyPerStrip.h" +#include "MModuleDEESMEX.h" //////////////////////////////////////////////////////////////////////////////// @@ -109,27 +110,29 @@ MAssembly::MAssembly() m_Supervisor->UseMultiThreading(true); - m_Supervisor->AddAvailableModule(new MModuleLoaderSimulationsBalloon()); + // m_Supervisor->AddAvailableModule(new MModuleLoaderSimulationsBalloon()); m_Supervisor->AddAvailableModule(new MModuleLoaderSimulationsSMEX()); + m_Supervisor->AddAvailableModule(new MModuleLoaderSimulationsSingleDet()); + m_Supervisor->AddAvailableModule(new MModuleLoaderSimulationsCosima()); m_Supervisor->AddAvailableModule(new MModuleLoaderMeasurementsROA()); - m_Supervisor->AddAvailableModule(new MModuleReceiverBalloon()); - m_Supervisor->AddAvailableModule(new MModuleLoaderMeasurementsBinary()); + m_Supervisor->AddAvailableModule(new MModuleLoaderMeasurementsHDF()); + m_Supervisor->AddAvailableModule(new MModuleDEESMEX()); + m_Supervisor->AddAvailableModule(new MModuleEventFilter()); m_Supervisor->AddAvailableModule(new MModuleEnergyCalibrationUniversal()); m_Supervisor->AddAvailableModule(new MModuleStripPairingGreedy()); m_Supervisor->AddAvailableModule(new MModuleStripPairingChiSquare()); - m_Supervisor->AddAvailableModule(new MModuleChargeSharingCorrection()); m_Supervisor->AddAvailableModule(new MModuleDepthCalibration()); m_Supervisor->AddAvailableModule(new MModuleDepthCalibrationB()); m_Supervisor->AddAvailableModule(new MModuleDepthCalibration2024()); - - m_Supervisor->AddAvailableModule(new MModuleCrosstalkCorrection()); m_Supervisor->AddAvailableModule(new MModuleEventSaver()); m_Supervisor->AddAvailableModule(new MModuleTransmitterRealta()); m_Supervisor->AddAvailableModule(new MModuleResponseGenerator()); + m_Supervisor->AddAvailableModule(new MModuleTACcut()); + m_Supervisor->AddAvailableModule(new MModuleNearestNeighbor()); m_Supervisor->AddAvailableModule(new MModuleDiagnostics()); m_Supervisor->AddAvailableModule(new MModuleDiagnosticsEnergyPerStrip()); diff --git a/src/MBinaryFlightDataParser.cxx b/src/MBinaryFlightDataParser.cxx deleted file mode 100644 index 4be64951..00000000 --- a/src/MBinaryFlightDataParser.cxx +++ /dev/null @@ -1,2078 +0,0 @@ -/* - * MBinaryFlightDataParser.cxx - * - * - * Copyright (C) by Alex Lowell & Andreas Zoglauer. - * All rights reserved. - * - * - * This code implementation is the intellectual property of - * Andreas Zoglauer. - * - * By copying, distributing or modifying the Program (or any work - * based on the Program) you indicate your acceptance of this statement, - * and all its terms. - * - */ - - - - -//////////////////////////////////////////////////////////////////////////////// -// -// MBinaryFlightDataParser -// -//////////////////////////////////////////////////////////////////////////////// - - -// Include the header: -#include "MBinaryFlightDataParser.h" - -// Standard libs: -#include -#include -#include -using namespace std; - -// ROOT libs: -#include "TGClient.h" - -// MEGAlib libs: -#include "MStripHit.h" -#include "MFile.h" -#include "MModuleEventSaver.h" -#include "MQuaternion.h" - -//Pipeline Tools: -#include "GCUSettingsParser.h" -#include "GCUHousekeepingParser.h" -#include "LivetimeParser.h" - -//////////////////////////////////////////////////////////////////////////////// - - -#ifdef ___CLING___ -ClassImp(MBinaryFlightDataParser) -#endif - - - - - -//////////////////////////////////////////////////////////////////////////////// - - -bool MReadOutAssemblyTimeCompare(MReadOutAssembly* E1, MReadOutAssembly* E2); - - -//////////////////////////////////////////////////////////////////////////////// - - -MBinaryFlightDataParser::MBinaryFlightDataParser() : TIRecord(1000) -{ - // Construct an instance of MBinaryFlightDataParser - - m_DataSelectionMode = MBinaryFlightDataParserDataModes::c_All; - m_UseComptonDataframes = false; - m_UseRawDataframes = true; - m_NumRawDataframes = 0; - m_NumComptonDataframes = 0; - m_NumAspectPackets = 0; - m_NumSettingsPackets = 0; - m_NumGCUHkpPackets = 0; - m_NumLivetimePackets = 0; - m_NumOtherPackets = 0; - MAX_TRIGS = 80; - LastTimestamps.clear(); - LastTimestamps.resize(12, 0); - dx = 0; - m_EventTimeWindow = 60 * 10000000; - m_ComptonWindow = 2; - LoadStripMap(); - LoadCCMap(); - m_EventIDCounter = 0; - m_LastCorrectedClk = 0xffffffffffffffff; - m_UseGPSDSO = true; //simply sets whether or not we add these frames to the Aspect deque - m_UseMagnetometer = true; //^^^^ - m_NumDSOReceived = 0; - m_NumComptonBytes = 0; - m_NumBytesReceived = 0; - m_LostBytes = 0; - m_IgnoreAspect = false; - m_LastDSOUnixTime = 0xffffffff; - m_LastAspectID = 0xffff; - m_AspectReconstructor = nullptr; - m_CoincidenceEnabled = true; - m_HousekeepingFileName = "Housekeeping.hkp"; -} - - -//////////////////////////////////////////////////////////////////////////////// - - -MBinaryFlightDataParser::~MBinaryFlightDataParser() -{ - // Delete this instance of MBinaryFlightDataParser - - for (auto E: m_Events) { - delete E; - } - m_Events.clear(); -} - - -//////////////////////////////////////////////////////////////////////////////// - - -bool MBinaryFlightDataParser::Initialize() -{ - // Initialize the module - - m_NumRawDataframes = 0; - m_NumComptonDataframes = 0; - m_NumAspectPackets = 0; - m_NumSettingsPackets = 0; - m_NumGCUHkpPackets = 0; - m_NumLivetimePackets = 0; - m_NumOtherPackets = 0; - - - //LastTimestamps.clear(); - //LastTimestamps.resize(12); - dx = 0; - - m_EventIDCounter = 0; - m_LastCorrectedClk = 0xffffffffffffffff; - - m_NumDSOReceived = 0; - m_NumComptonBytes = 0; - m_NumBytesReceived = 0; - m_LostBytes = 0; - - m_LastDSOUnixTime = 0xffffffff; - m_LastAspectID = 0xffff; - - for (auto E: m_Events) { - delete E; - } - m_Events.clear(); - for (auto E: m_EventsBuf) { - delete E; - } - m_EventsBuf.clear(); - - m_SBuf.clear(); - - m_LastDateTimeString = ""; - m_LastCorrectedClk = 0; - m_LastLatitude = 0; - m_LastLongitude = 0; - m_LastAltitude = 0; - m_LastGPSWeek = 0; - m_LastAspectID = 0; - LastComptonTimestamp = 0; - m_NumComptonBytes = 0; - m_NumRawDataBytes = 0; - m_NumBytesReceived = 0; - - m_PreampTemps.reserve(24); - - // Load aspect reconstruction module - delete m_AspectReconstructor; - m_AspectReconstructor = new MAspectReconstruction(); - - if(m_DataSelectionMode == MBinaryFlightDataParserDataModes::c_Compton){ - m_EventTimeWindow = 0; - cout << "Receiver is using Compton mode -> Events might come in out of order over Openport! Enable coincidence search in Realta..." << endl; - } else { - m_EventTimeWindow = 60 * 10000000; - } - - - - //AWL: this block of code prevents using the nuclearizer library outside of the nuclearizer gui when the event saver module isn't instantiated. - //AWL: changing this so that if it fails, we continue with the analysis and -//Turns out the EventSaver modeule is always open, even if it's not selected in Nuclearizer, so this will make a .hkp file with the prefix with the name of the last saved file in Nuclearizer... for now. - /* - MSupervisor* S = MSupervisor::GetSupervisor(); - m_EventSaver = (MModuleEventSaver*) S->GetAvailableModuleByXmlTag("XmlTagEventSaver"); - if (m_EventSaver == nullptr) { - cout<<"MBinaryFlightDataParser: Could not find file name for Housekeeping file"<GetFileName(); - m_HkpOutFile.RemoveInPlace(m_HkpOutFile.Last('.')); - m_HkpOutFile += ".hkp"; - MFile::ExpandFileName(m_HkpOutFile); - if (Housekeeping.is_open() == true) Housekeeping.close(); - Housekeeping.clear(); - Housekeeping.open(m_HkpOutFile, std::ofstream::out); - if (Housekeeping.is_open() == false) { - cout<<"MBinaryFlightDataParser: Unable to open housekeeping data file \""<GetCL() < E2->GetCL() ) return true; else return false; - -} - -//////////////////////////////////////////////////////////////////////////////// - - -bool MBinaryFlightDataParser::ParseData(vector Received) -{ - uint8_t Type; - vector NewEvents; - vector SyncWord; - dataframe * Dataframe; - int ParseErr; - //unsigned int CCId = 0; - - struct GCUSettingsPacket* SettingsPacket; - struct GCUHousekeepingPacket* GCUHkpPacket; - struct LivetimePacket CCLivetimePacket; - uint8_t GCUUnixTimeMSB; - double ShieldNumCounts; - double ShieldTimeInterval; - double ShieldCountRate; - MAspect* LatestAspect; - - SyncWord.push_back(0xEB); - SyncWord.push_back(0x90); - m_NumBytesReceived += Received.size(); - if (g_Verbosity >= c_Info) cout<<"BinaryFlightDataParser: NumBytesReceived "< NextPacket; - while (FindNextPacket( NextPacket )) { - Type = NextPacket[2] & 0x0f; - - uint64_t PacketKey = ((uint64_t)NextPacket[3] << 40) | - ((uint64_t)NextPacket[4] << 32) | - ((uint64_t)NextPacket[5] << 24) | - ((uint64_t)NextPacket[6] << 16) | - ((uint64_t)NextPacket[7] << 8) | - Type; - - if(m_PacketRecord.count(PacketKey) == 1){ - //cout << "duplicate compton packet, ID:" << Dataframe->PacketCounter << " UNIXT:" << Dataframe->UnixTime << endl; - continue; - } else { - m_PacketRecord[PacketKey] = (NextPacket[2] & 0x80) >> 7; //mapped value of zero -> normal data, or openport A. mapped value of one -> openport B - } - - //trim the packet record - while(m_PacketRecord.size() > 10000){ - m_PacketRecord.erase(m_PacketRecord.begin()); - } - - if (g_Verbosity >= c_Info) { - //printf("FNP: %u - %lu, dx = %d, bufsize = %lu\n",Type, NextPacket.size(), dx, m_SBuf.size()); - cout<<"FNP: "<= c_Error) cout<<"BinaryFlightDataParser: Parsing error"<Events.size(); - - /* - printf("!@# ID:%u UNIXT:%u (%u,%f) <---> (%u,%f)\n",Dataframe->PacketCounter, - Dataframe->UnixTime, - Dataframe->Events[0].EventID, - ((double)NewEvents[0]->GetCL())*1E-7, - Dataframe->Events[NEvents-1].EventID, - ((double)NewEvents[NEvents-1]->GetCL())*1E-7); - */ - - delete Dataframe; - m_NumComptonDataframes++; - m_NumComptonBytes += NextPacket.size(); - - } - break; - case 0x05: - //aspect packet - if (g_Verbosity >= c_Info) cout<<"got aspect packet!"<GetLastAspectInDeque() != 0) { - LatestAspect = m_AspectReconstructor->GetLastAspectInDeque(); - if (((m_AspectMode == MBinaryFlightDataParserAspectModes::c_GPS || m_AspectMode == MBinaryFlightDataParserAspectModes::c_Interpolate) && (LatestAspect->GetGPS_or_magnetometer() == 0)) || ((m_AspectMode == MBinaryFlightDataParserAspectModes::c_Magnetometer) && (LatestAspect->GetGPS_or_magnetometer() == 1))) { - m_Housekeeping<<"ASP\nTI "<GetUTCTime()<<"\nMD "<GetGPS_or_magnetometer()<<"\nGX "<GetGalacticPointingXAxisLongitude()<<" "<GetGalacticPointingXAxisLatitude()<<"\nGZ "<GetGalacticPointingZAxisLongitude()<<" "<GetGalacticPointingZAxisLatitude()<<"\nCO "<GetLatitude()<<" "<GetLongitude()<<" "<GetAltitude()<<"\nGPS "<GetHeading()<<" "<GetPitch()<<" "<GetRoll()<<"\n\n"; - } - } - } - //cout<<"GZ: "<GetGalacticPointingZAxisLongitude()<<" "<GetGalacticPointingZAxisLatitude()<= c_Info) cout<<"got livetime packet!"< 0) { - ParseLivetime(&CCLivetimePacket,&NextPacket[0]); - //Print CC livetime info into housekeeping file - if (m_Housekeeping.is_open() == true) { - m_Housekeeping<<"LT\nTI "<<((GCUUnixTimeMSB << 24) | CCLivetimePacket.UnixTime)<<"\nID "<= c_Info) cout<<"got GCU housekeeping packet!"<UnixTimeMSB; - - //Calculate shield rate - ShieldNumCounts = static_cast (GCUHkpPacket->NumCounts[0]); - ShieldTimeInterval = (static_cast (GCUHkpPacket->TimeInterval[0]))*1e-7; - ShieldCountRate = ShieldNumCounts/ShieldTimeInterval; - - //Print info into housekeeping file - if (m_Housekeeping.is_open() == true) { - m_Housekeeping<<"HKP\nTI "<<((GCUUnixTimeMSB << 24) | GCUHkpPacket->UnixTime)<<"\nID "<PacketCounter<<"\nDU 5"<<"\nSR "<= c_Info) cout<<"got settings packet!"<RpiTemp_Brd2_Ch0; - m_PreampTemps[1] = SettingsPacket->RpiTemp_Brd2_Ch3; - m_PreampTemps[2] = SettingsPacket->RpiTemp_Brd0_Ch6; - m_PreampTemps[3] = SettingsPacket->RpiTemp_Brd2_Ch2; - m_PreampTemps[4] = SettingsPacket->RpiTemp_Brd0_Ch7; - m_PreampTemps[5] = SettingsPacket->RpiTemp_Brd2_Ch1; - m_PreampTemps[6] = SettingsPacket->RpiTemp_Brd1_Ch6; - m_PreampTemps[7] = SettingsPacket->RpiTemp_Brd2_Ch4; - m_PreampTemps[8] = SettingsPacket->RpiTemp_Brd1_Ch7; - m_PreampTemps[9] = SettingsPacket->RpiTemp_Brd2_Ch5; - m_PreampTemps[10] = SettingsPacket->RpiTemp_Brd2_Ch7; - m_PreampTemps[11] = SettingsPacket->RpiTemp_Brd2_Ch6; - m_PreampTemps[12] = SettingsPacket->RpiTemp_Brd1_Ch5; - m_PreampTemps[13] = SettingsPacket->RpiTemp_Brd1_Ch2; - m_PreampTemps[14] = SettingsPacket->RpiTemp_Brd1_Ch4; - m_PreampTemps[15] = SettingsPacket->RpiTemp_Brd1_Ch1; - m_PreampTemps[16] = SettingsPacket->RpiTemp_Brd1_Ch3; - m_PreampTemps[17] = SettingsPacket->RpiTemp_Brd1_Ch0; - m_PreampTemps[18] = SettingsPacket->RpiTemp_Brd0_Ch3; - m_PreampTemps[19] = SettingsPacket->RpiTemp_Brd0_Ch0; - m_PreampTemps[20] = SettingsPacket->RpiTemp_Brd0_Ch4; - m_PreampTemps[21] = SettingsPacket->RpiTemp_Brd0_Ch1; - m_PreampTemps[22] = SettingsPacket->RpiTemp_Brd0_Ch5; - m_PreampTemps[23] = SettingsPacket->RpiTemp_Brd0_Ch2; - m_NumSettingsPackets++; - break; - default: - //don't care - m_NumOtherPackets++; - } - if( NewEvents.size() > 0 ){ - for( auto E: NewEvents ){ - /* - int CCId = E->GetStripHit(0)>GetDetectorID(); //this line might be an issue since events from compton packets can have SHs from more than one detector - uint64_t Lower; - if(m_EventTimeWindow > LastTimestamps[CCId]){ - Lower = LastTimestamps[CCId] >> 1; - } else { - Lower = LastTimestamps[CCId] - m_EventTimeWindow; - } - bool DeleteEvent = false; - if(E->GetCL() < Lower){ //timestamp went back in time too far - cout << CCId << " past: current CL = " << E->GetCL() <<", LastCL = " << LastTimestamps[CCId]; - if(m_EventsBuf.size() > 0) cout << ", frontCL = " << m_EventsBuf.front()->GetCL() << ", backCL = " << m_EventsBuf.back()->GetCL() << endl; else cout << endl; - while(m_EventsBuf.size() > 0){ - MReadOutAssembly* E = m_EventsBuf[0]; m_EventsBuf.pop_front(); - delete E; - } - deque::iterator I = lower_bound(m_EventsBuf.begin(), m_EventsBuf.end(), E, MReadOutAssemblyReverseSort); - m_EventsBuf.insert(I, E); - } else if(E->GetCL() > (LastTimestamps[CCId] + (m_EventTimeWindow << 1))){ //timestamp is too far in the future - cout << CCId << " future: current CL = " << E->GetCL() <<", LastCL = " << LastTimestamps[CCId]; - if(m_EventsBuf.size() > 0) cout << ", frontCL = " << m_EventsBuf.front()->GetCL() << ", backCL = " << m_EventsBuf.back()->GetCL() << endl; else cout << endl; - DeleteEvent = true; - } else {//timestamp is OK, insert the event into m_EventsBuf - deque::iterator I = lower_bound(m_EventsBuf.begin(), m_EventsBuf.end(), E, MReadOutAssemblyReverseSort); - m_EventsBuf.insert(I, E); - } - LastTimestamps[CCId] = E->GetCL(); - if(DeleteEvent){ - delete E; - }*/ - - /* - if(m_EventsBuf.size() > 0){ - if(m_EventsBuf.front()->GetCL() >= m_EventTimeWindow){ - if(E->GetCL() < (m_EventsBuf.front()->GetCL() - m_EventTimeWindow)){ //event time jumped back too far - cout << "event time back-skip: this CL = " << E->GetCL() << ", front CL = " << m_EventsBuf.front()->GetCL() << ", back CL = " << m_EventsBuf.back()->GetCL() << endl; - while(m_EventsBuf.size() > 0){ - MReadOutAssembly* Ev = m_EventsBuf.front(); m_EventsBuf.pop_front(); - delete Ev; - } - deque::iterator I = lower_bound(m_EventsBuf.begin(), m_EventsBuf.end(), E, MReadOutAssemblyReverseSort); - m_EventsBuf.insert(I, E); - } else if(E->GetCL() > (m_EventsBuf.back()->GetCL() + (4*m_EventTimeWindow))){ //event time jumped forward too far - cout << "event time forward-skip: this CL = " << E->GetCL() << ", front CL = " << m_EventsBuf.front()->GetCL() << ", back CL = " << m_EventsBuf.back()->GetCL() << endl; - delete E; - } else { - deque::iterator I = lower_bound(m_EventsBuf.begin(), m_EventsBuf.end(), E, MReadOutAssemblyReverseSort); - m_EventsBuf.insert(I, E); - } - } else { - deque::iterator I = lower_bound(m_EventsBuf.begin(), m_EventsBuf.end(), E, MReadOutAssemblyReverseSort); - m_EventsBuf.insert(I, E); - } - } else { - m_EventsBuf.push_back(E); - } - */ - if(m_EventsBuf.size() > 0){ - if(E->GetCL() < (m_EventsBuf.front()->GetCL() >> 1)){ //event time jumped back too far - cout << "event time back-skip: this CL = " << E->GetCL() << ", front CL = " << m_EventsBuf.front()->GetCL() << ", back CL = " << m_EventsBuf.back()->GetCL() << endl; - while(m_EventsBuf.size() > 0){ - MReadOutAssembly* Ev = m_EventsBuf.front(); m_EventsBuf.pop_front(); - delete Ev; - } - m_EventsBuf.push_back(E); - } else { - deque::iterator I = lower_bound(m_EventsBuf.begin(), m_EventsBuf.end(), E, MReadOutAssemblyReverseSort); - m_EventsBuf.insert(I, E); - } - } else { - m_EventsBuf.push_back(E); - } - - } - NewEvents.clear(); - if( m_UseRawDataframes ){ - if (g_Verbosity >= c_Info) cout<<"BinaryFlightDataParser: T ::: ";; - for( auto E: LastTimestamps ){ - if (g_Verbosity >= c_Info) cout<= c_Info) cout<= c_Info) cout<<"BinaryFlightDataParser: T_compton ::: "<GetAspect() == 0 ){ - int gps_or_mag; - if( m_AspectMode == MBinaryFlightDataParserAspectModes::c_GPS ){ - gps_or_mag = 0; - } else if ( m_AspectMode == MBinaryFlightDataParserAspectModes::c_Magnetometer) { - gps_or_mag = 1; - } else { //Interpolation - gps_or_mag = 2; - } - MAspect* A = m_AspectReconstructor->GetAspect(E->GetTime(), gps_or_mag); - if( A != 0 ){ - E->SetAspect(new MAspect(*A)); - } - } - } - } - - - - //Preamp Temp Allocation - int striphits; - int det; - int side; - double temp; - for( auto E: m_Events ){ - striphits = E->GetNStripHits(); - for(int s = 0; s < striphits; s++) { - det = E->GetStripHit(s)->GetDetectorID(); - side = E->GetStripHit(s)->IsLowVoltageStrip() == true; - temp = (m_PreampTemps[det*2 + side]*0.0005/0.5)*2.471*100 - 273.0; - E->GetStripHit(s)->SetPreampTemp(temp); - } - } - - if (m_Events.size() > 0) { - //if (m_IgnoreAspect == true) { - if (m_AspectMode == MBinaryFlightDataParserAspectModes::c_Neither) { - return true; - } else { - if (m_Events[0]->GetAspect() != 0) { - return true; - } else { - return false; - } - } - } else { - return false; - } - -} - -//////////////////////////////////////////////////////////////////////////////// - - -bool MBinaryFlightDataParser::FindNextPacket(vector& NextPacket , unsigned int * idx){ - - //return true if a complete packet was found, return packet in NextPacket - //return false if a complete packet was not found. also copy the leftover bytes - //back to the beginning - - //idx is the value of dx that points to the beginning of the packet in m_SBuf - - //assert: search buf is either synced or empty - - uint16_t Len; - //bool FoundPacket; - //FoundPacket = false; - NextPacket.clear(); - - if( (dx + 2) > m_SBuf.size() ){ - //not enough bytes to check for sync - return false; - } - - while( !(m_SBuf[dx] == 0xeb && m_SBuf[dx+1] == 0x90) ){ - ResyncSBuf(); - if( m_SBuf.size() == 0 ){ - return false; - } - } - - //we are synced and the buffer is not empty - if( (dx + 10) > m_SBuf.size() ){ - //not enough bytes to compute len - return false; - } - - Len = ((uint16_t)m_SBuf[dx+8]<<8) | ((uint16_t)m_SBuf[dx+9]); - if( Len > 1360 ){ - //got a weird value, could be a spurious eb90, Resync() and exit - ResyncSBuf(); - return false; - } - // AZ: Found a case with Len == 0 which screwed up everything... - // Skip ahead beyond syncword and resync - if (Len == 0) { - dx += 2; - ResyncSBuf(); - return false; - } - - if( (dx + Len) > m_SBuf.size() ){ - //we don't have the complete packet - //this should happen often since TCP will give us a bunch of bytes w/o boundaries - //move the data up so as to clear out the packets we have already processed - m_SBuf.assign( m_SBuf.begin() + dx, m_SBuf.end() ); - dx = 0; - return false; - } - - //FoundPacket = true; - - //we have a complete packet, extract it - NextPacket.assign( m_SBuf.begin() + dx, m_SBuf.begin() + dx + Len); - //store the location of beginning of this packet - if( idx != NULL ){ - *idx = dx; - } - //increment the index...we should be pointing at the next 0xeb - dx += Len; - - if( dx == m_SBuf.size() ){ - //no leftover bytes, just clear the buffer - dx = 0; - m_SBuf.clear(); - } - - if( m_SBuf.size() > 10000000 ){ - //clear out buffer - cout<<"lost !!! dx = "< 0){ - MReadOutAssembly * FirstEvent = m_EventsBuf.front(); m_EventsBuf.pop_front(); - deque EventList; - EventList.push_back(FirstEvent); - //now check if the next events are within the compton window - while( m_EventsBuf.size() > 0 ){ - if( (m_EventsBuf[0]->GetCL() - FirstEvent->GetCL()) <= m_ComptonWindow ){ - EventList.push_back( m_EventsBuf.front() ); m_EventsBuf.pop_front(); - } else { - break; - } - } - //at this point, EventList contains all of the events to be merged, merge them - MReadOutAssembly * NewMergedEvent = MergeEvents( &EventList ); - //now push this merged event onto the internal events deque - //set the ID of the event and increment the ID counter - NewMergedEvent->SetID( ++m_EventIDCounter ); - m_Events.push_back( NewMergedEvent ); - } - - if( m_EventsBuf.size() == 0 ) return true; else return false; -} - - -//////////////////////////////////////////////////////////////////////////////// - - -bool MBinaryFlightDataParser::CheckEventsBuf(void){ - - int MergedEventCounter = 0; - unsigned long long Window; - - //in file mode we need a way to clear out the queue, do this by setting the search buffer time to zero - if( m_IsDone ){ - Window = 0; - } else { - Window = m_EventTimeWindow; - } - - if( m_EventsBuf.size() > 0 ){ - if (m_EventsBuf.back()->GetCL() - m_EventsBuf.front()->GetCL() < 100000 && - m_EventsBuf.size() > 500) { - cout<<"Something is strange: I have more than 500 events and all are within the time window of 10 milli-seconds"< 0){ - if(m_EventsBuf.back()->GetCL() - m_EventsBuf.front()->GetCL() >= Window ){ - MReadOutAssembly * FirstEvent = m_EventsBuf.front(); m_EventsBuf.pop_front(); - deque EventList; - EventList.push_back(FirstEvent); - - if( m_CoincidenceEnabled ){ - //now check if the next events are within the compton window - while( m_EventsBuf.size() > 0 ){ - if( (m_EventsBuf[0]->GetCL() - FirstEvent->GetCL()) <= m_ComptonWindow ){ - EventList.push_back( m_EventsBuf.front() ); m_EventsBuf.pop_front(); - } else { - break; - } - } - } - //at this point, EventList contains all of the events to be merged, merge them - MReadOutAssembly * NewMergedEvent = MergeEvents( &EventList ); - //now push this merged event onto the internal events deque - NewMergedEvent->SetID( ++m_EventIDCounter ); - m_Events.push_back(NewMergedEvent); - //if( m_EventsBuf.size() == 0 ) break; - } else { - break; - } - } - - if( MergedEventCounter > 0 ) return true; else return false; -} - - -//////////////////////////////////////////////////////////////////////////////// - - -MReadOutAssembly * MBinaryFlightDataParser::MergeEvents( deque * EventList ){ - - //assert: there is at least one event in event list - MReadOutAssembly * BaseEvent; - - //take the first event, and then merge hits from all other coincident - //events into this base event - BaseEvent = EventList->front(); EventList->pop_front(); - for( auto E: *EventList ){ - while( E->GetNStripHits() > 0){ - BaseEvent->AddStripHit( E->GetStripHit(0) ); - E->RemoveStripHit(0); - } - while( E->GetNStripHitsTOnly() > 0){ - BaseEvent->AddStripHitTOnly( E->GetStripHitTOnly(0) ); - E->RemoveStripHitTOnly(0); - } - //now we should free the memory for the MReadOutAssembly that we just copied the - //strip hit from - delete E; - } - - return BaseEvent; - -} - - -//////////////////////////////////////////////////////////////////////////////// - - -void MBinaryFlightDataParser::Finalize() -{ - // Close the tranceiver - - while (m_EventsBuf.begin() != m_EventsBuf.end()) { - delete m_EventsBuf.front(); - m_EventsBuf.pop_front(); - } - while (m_Events.begin() != m_Events.end()) { - delete m_Events.front(); - m_Events.pop_front(); - } - - m_Housekeeping.close(); - cout<<"HOUSEKEEPING FILE CLOSED"< Buf, dataframe * DataOut) -{ - //return a dataframe struct - //a subsequent funtion should dtake the returned dataframe and return a vector of MReadOutAssemblys - - size_t x; //index for looping through Buf - trigger TrigBuf[MAX_TRIGS]; - unsigned int tx; - int EventCounter; - int NumPayLoadBytes; - unsigned int Tx, Ax; - int NumADCTrigs, NumTimingTrigs; - int NumTimingBytes[8]; - unsigned int j; - event Event; - uint8_t mask_or[10]; - uint8_t Masks[8] = {1,2,4,8,16,32,64,128}; - int NumEvents; - unsigned int Length; - trigger NewTrig; - - - if( DataOut == NULL ){ - cout<<"DataOut is NULL, returning -1..."<PacketType = Buf[2]; - DataOut->UnixTime = ((uint32_t)Buf[3]<<16) | ((uint32_t)Buf[4]<<8) | ((uint32_t)Buf[5]); - DataOut->PacketCounter = ((uint16_t)Buf[6]<<8) | ((uint16_t)Buf[7]); - DataOut->CCId = Buf[10] & 0x0f; - DataOut->ReportedNumEvents = Buf[11]; - DataOut->SysTime = ((uint64_t)Buf[17] << 40) | ((uint64_t)Buf[16] << 32) | ((uint64_t)Buf[15] << 24) | ((uint64_t)Buf[14] << 16) | ((uint64_t)Buf[13] << 8) | Buf[12]; - DataOut->SysTime = DataOut->SysTime & 0xffffffffffff; - DataOut->LifetimeBits = (((((uint32_t)Buf[21] << 24) | ((uint32_t)Buf[20] << 16)) | ((uint32_t)Buf[19] << 8)) | ((uint32_t)Buf[18])); - DataOut->RawOrCompton = "raw"; - DataOut->HasSysErr = false; - - //x = 12; //jump to index of first 0xAE - x = 22; //now the input is a full 1360 packet - NumEvents = Buf[11]; - Tx = 0; Ax = 0; - EventCounter = 0; - - for(int z = 0; z < NumEvents; ++z){ - - if( !((Buf[x] == 0xAE) && (Buf[x+1] == 0xE0)) ){ //check that we have 0xAE in the right place, if not, find it - - unsigned int k; - k = x; - while( k < (Length-1)){ - if( Buf[k] == 0xAE ){ - if( Buf[k + 1] == 0xE0 ){ - x = k; - break; - } - } - ++k; - } - - if( k >= (Length - 1) ){ - return -100; - } - - } - - NumPayLoadBytes = 0; - tx = 0; - NumADCTrigs = 0; - NumTimingTrigs = 0; - - //need to check here if there are enough bytes in the package to loop over the bitmasks - if( (x + 32) >= Length ){ - //overran the end of the packet, return - return -1; - - } - - - //pre-compute the bitmask or's - for(int i = 0; i < 10; ++i ){ - - mask_or[i] = Buf[x+22+i] | Buf[x+12+i]; - - } - - for( int j = 0; j < 8; ++j ){ //loop over boards - - NumTimingBytes[j] = 0; - - for( int i = 0; i < 10; ++i ){ //loop over channels - - if( mask_or[i] & Masks[j] ){ - - //got something on this brd/chan - - TrigBuf[tx].Board = j; - TrigBuf[tx].Channel = i; - - - if( Buf[x+22+i] & Masks[j] ){ - //we have ADC on this brd/chan - ++NumADCTrigs; - TrigBuf[tx].HasADC = true; - NumPayLoadBytes += 2; - } else{ - TrigBuf[tx].HasADC = false; - } - - if( Buf[x+12+i] & Masks[j] ){ - //we have timing on this brd/chan - ++NumTimingTrigs; - TrigBuf[tx].HasTiming = true; - NumTimingBytes[j] += 1; - NumPayLoadBytes += 1; - - } else { - TrigBuf[tx].HasTiming = false; - } - - ++tx; - if( tx > MAX_TRIGS ){ - //might want to copy below code regarding NumPayloadBytes since it will get skipped on the goto - goto loop_exit; //legitimate usage of goto... to break out of nested for loops - } - - - } - - } - - if( NumPayLoadBytes & 1 ){ - //Num payload bytes is odd -> there are an odd number of timing bytes on this board -> add 1 - - ++NumPayLoadBytes; - } - - } - -loop_exit: - - if( (tx <= MAX_TRIGS) && ( tx > 0) ){ - - Tx = x + 32; //jump to first timing byte - - if( Tx + NumPayLoadBytes >= Length ){ - //something went wrong, we overran the packet - return -5; - } - - j = TrigBuf[0].Board; //setup first board - - //setup Tx (timing byte index) and Ax (ADC byte index) for the first trigger - if( NumTimingBytes[j] & 1 ){ //check if num timing bytes is odd is on this board - Ax = Tx + NumTimingBytes[j] + 1; - } else { - Ax = Tx + NumTimingBytes[j]; - } - - - for(unsigned int i = 0; i < tx; ++i ){ //loop over triggers - - if( TrigBuf[i].Board != j ){ - j = TrigBuf[i].Board; - Tx = Ax; - - if( NumTimingBytes[j] & 1 ){ - Ax = Tx + NumTimingBytes[j] + 1; - } else { - Ax = Tx + NumTimingBytes[j]; - } - - } - - if( TrigBuf[i].HasTiming ){ - TrigBuf[i].TimingByte = Buf[Tx]; - ++Tx; - } - - if( TrigBuf[i].HasADC ){ - TrigBuf[i].ADCBytes = (Buf[Ax+1] << 8) | Buf[Ax]; - //TrigBuf[i].ADCBytes &= 0x1fff; - Ax += 2; - } - } - - - if( NumADCTrigs > 0 ){ //allocate mem for a new event if there are ADC trigs - - //fill in the event header info - Event.EventTime = (Buf[x+5]<<24)|(Buf[x+4]<<16)|(Buf[x+3]<<8)|(Buf[x+2]); - Event.EventTime = Event.EventTime & 0x00000000ffffffff;//make sure we clear out the upper 4 bytes - Event.ErrorBoardList = Buf[x+6]; - Event.ErrorInfo = Buf[x+7]; - Event.EventID = Buf[x+8]; - Event.TrigAndVetoInfo = Buf[x+9]; - Event.FTPattern = Buf[x+10]; - Event.LTPattern = Buf[x+11]; - Event.CCId = DataOut->CCId; - - if( Event.ErrorBoardList != 0){ - //we have a system error, set the flag in dataframe struct - DataOut->HasSysErr = true; - } - - //clear out triggers - Event.Triggers.clear(); - - int N; - N = 0; - //copy over triggers - for(unsigned int i = 0; i < tx; ++i ){ //loop over all triggers... - //at some point it would be cool to look into timing only triggers for better positioning - //in that case, don't throw out the timing only triggers here - //then below, in ConvertToMReadOutAssemblys, put the timing only strip hits in a separate buffer so that they don't interfere - //with all of the mainstream analysis. - NewTrig = TrigBuf[i]; - NewTrig.CCId = DataOut->CCId; - Event.Triggers.push_back(NewTrig); - ++N; - - /* - if( TrigBuf[i].HasADC == true ){ //... but only copy over triggers that have ADC - NewTrig = TrigBuf[i]; - NewTrig.CCId = DataOut->CCId; - Event.Triggers.push_back(NewTrig); - ++N; - } - */ - } - - Event.NumTriggers = N; - DataOut->Events.push_back(Event); - ++EventCounter; - ++DataOut->NumEvents; - - } - //done reading in the event. - - x = Ax; - } else { - //too many trigs, or a no data event. - if( (x + 32) < Length ){ - x = x + 32; - } else { - //reached the end of the packet, return normally - return -100; - } - } - //now check if we find the 0xAE in the right spot. - } - - return 0; - -} - - - -/////////////////////////////////////////////////////////////////////// - - -bool MBinaryFlightDataParser::ConvertToMReadOutAssemblys( dataframe * DataIn, vector * CEvents) -{ - bool PosSide; - MReadOutAssembly * NewEvent; - MStripHit * StripHit; - bool RolloverOccurred; - //bool EndRollover // az: not used, thus commented out - bool MiddleRollover; - uint64_t Clk; - static MTime LastTime = 0; - - CEvents->clear(); // - - //make sure we have some events - if( DataIn->Events.size() == 0 ){ - return false; - } - - //since the MReadOutAssemblys are going to be pushed into a deque for the coincedence search, we want to call - //new and delete so that the pointers to these MReadOutAssemblys will be valid until the MReadOutAssembly is popped - //out of the deque. - - //check for rollovers in this dataframe. need this info in order to properly shift bits 48..33 of the - //systime into the individual events times (which are only 32 bits) - RolloverOccurred = false; - if( (DataIn->SysTime & 0xffffffff) < DataIn->Events[0].EventTime ){ - //there was a rollover - RolloverOccurred = true; - //EndRollover = false; - MiddleRollover = false; - if( DataIn->Events.back().EventTime < DataIn->Events.front().EventTime ){ - MiddleRollover = true; - } else { - // EndRollover = true; // az: not used, thus commented out - } - } - - //negative side -> DC -> boards 4-7 -> X - //positive side -> AC -> boards 0-3 -> Y - - for( auto E: DataIn->Events ){ - NewEvent = new MReadOutAssembly(); - for( auto T: E.Triggers ){ - StripHit = new MStripHit(); - StripHit->SetDetectorID(m_CCMap[T.CCId]); - //go from board channel, to side strip - if( T.Board >= 4 && T.Board < 8 ) PosSide = false; else if( T.Board >= 0 && T.Board < 4 ) PosSide = true; else {cout<<"bad trigger board = "<IsLowVoltageStrip(PosSide); - if( T.Channel >= 0 && T.Channel < 10 ) StripHit->SetStripID(m_StripMap[T.Board][T.Channel]+1); else {cout<<"bad trigger channel = "<SetADCUnits((double)((uint16_t)T.ADCBytes & 0x1fff)); else StripHit->SetADCUnits(0.0); - if( T.HasTiming ) { - unsigned int Val = 0; - //bit 7 is 1 if first edge is a falling edge - if( T.TimingByte & 0x80 ){ - //IS falling edge - Val = ((T.TimingByte & 0x3f) << 1) + ((T.TimingByte & 0x1) ^ ((T.TimingByte >> 6) & 0x1)); - } else { - //IS rising edge - Val = ((T.TimingByte & 0x3f) << 1) - ((T.TimingByte & 0x1) ^ ((T.TimingByte >> 6) & 0x1)); - } - StripHit->SetTiming(Val * 5.0); //timing is set in ns with 5 ns resolution - } else { - StripHit->SetTiming(0.0); - } - if( T.HasADC ){ - NewEvent->AddStripHit( StripHit ); - } else { - NewEvent->AddStripHitTOnly( StripHit ); - } - } - //now need to set parameters for the MReadOutAssembly - NewEvent->SetID(E.EventID); - NewEvent->SetFC(DataIn->PacketCounter); - NewEvent->SetTI(DataIn->UnixTime); - Clk = 0; - if( RolloverOccurred ){ - if( MiddleRollover ){ - //cout << "middle rollover for CC " << DataIn->CCId << endl; - if( E.EventTime >= DataIn->Events.front().EventTime ){ - Clk = E.EventTime | ((DataIn->SysTime - 0x0000000100000000) & 0x0000ffff00000000); - } else { - Clk = E.EventTime | (DataIn->SysTime & 0x0000ffff00000000); - } - } else { - //cout << "end rollover for CC " << DataIn->CCId << endl; - //the rollover happened between the last event timestamp and the DataIn systime - //NOTE the systime in the dataframe header is always latched AFTER the last event timestamp - Clk = E.EventTime | ((DataIn->SysTime - 0x0000000100000000) & 0x0000ffff00000000); - } - } else { - //no rollover, just shift in the upper two bytes of DataIn->SysTime - Clk = E.EventTime | (DataIn->SysTime & 0x0000ffff00000000); - } - NewEvent->SetCL( Clk ); - uint64_t ClkModulo = Clk % 10000000; - uint64_t int_ClkSeconds = Clk - ClkModulo; - double ClkSeconds = (double) int_ClkSeconds/10000000.; - double ClkNanoseconds = (double) ClkModulo*100.0; - MTime NewTime = MTime(); - NewTime.Set( ClkSeconds, ClkNanoseconds ); - NewEvent->SetTime( NewTime ); - - if( E.TrigAndVetoInfo & 0x70 ){ - NewEvent->SetVeto(); - } - - if( E.TrigAndVetoInfo & 0x10 ){ - //had a guard ring 0 veto - NewEvent->SetGR0Veto(true); - } - - if( E.TrigAndVetoInfo & 0x20 ){ - NewEvent->SetGR1Veto(true); - } - - if( E.TrigAndVetoInfo & 0x40 ){ - NewEvent->SetShieldVeto(true); - } - - CEvents->push_back(NewEvent); - - //set the MJD only when there is aspect info - - } - - return true; - -} - -////////////////////////////////////////////////////////////////// - -void MBinaryFlightDataParser::LoadCCMap(void){ - - //takes you from CC Id to det ID - m_CCMap[0] = 0; - m_CCMap[1] = 1; - m_CCMap[2] = 2; - m_CCMap[3] = 3; - m_CCMap[4] = 4; - m_CCMap[5] = 5; - m_CCMap[6] = 6; - m_CCMap[7] = 7; - m_CCMap[8] = 8; - m_CCMap[9] = 9; - m_CCMap[10] = 10; - m_CCMap[11] = 11; - /* - m_CCMap[0] = 3; - m_CCMap[1] = 0; - m_CCMap[2] = 1; - m_CCMap[3] = 2; - m_CCMap[4] = 5; - m_CCMap[5] = 6; - m_CCMap[6] = 4; - m_CCMap[7] = 7; - m_CCMap[8] = 10; - m_CCMap[9] = 11; - m_CCMap[10] = 8; - m_CCMap[11] = 9; - */ -} - -////////////////////////////////////////////////////////////////////// - -void MBinaryFlightDataParser::LoadStripMap(void){ - - //takes you from board/chan to strip ID - - m_StripMap[0][0]=m_StripMap[4][0]=16; - m_StripMap[0][1]=m_StripMap[4][1]=12; - m_StripMap[0][2]=m_StripMap[4][2]= 8; - m_StripMap[0][3]=m_StripMap[4][3]=37; - m_StripMap[0][4]=m_StripMap[4][4]= 4; - m_StripMap[0][5]=m_StripMap[4][5]=10; - m_StripMap[0][6]=m_StripMap[4][6]= 6; - m_StripMap[0][7]=m_StripMap[4][7]= 2; - m_StripMap[0][8]=m_StripMap[4][8]=14; - m_StripMap[0][9]=m_StripMap[4][9]=17; - m_StripMap[1][0]=m_StripMap[5][0]=26; - m_StripMap[1][1]=m_StripMap[5][1]= 0; - m_StripMap[1][2]=m_StripMap[5][2]=34; - m_StripMap[1][3]=m_StripMap[5][3]=36; - m_StripMap[1][4]=m_StripMap[5][4]=32; - m_StripMap[1][5]=m_StripMap[5][5]=30; - m_StripMap[1][6]=m_StripMap[5][6]=28; - m_StripMap[1][7]=m_StripMap[5][7]=24; - m_StripMap[1][8]=m_StripMap[5][8]=18; - m_StripMap[1][9]=m_StripMap[5][9]=22; - m_StripMap[2][0]=m_StripMap[6][0]=19; - m_StripMap[2][1]=m_StripMap[6][1]=13; - m_StripMap[2][2]=m_StripMap[6][2]= 9; - m_StripMap[2][3]=m_StripMap[6][3]= 7; - m_StripMap[2][4]=m_StripMap[6][4]= 5; - m_StripMap[2][5]=m_StripMap[6][5]= 1; - m_StripMap[2][6]=m_StripMap[6][6]= 3; - m_StripMap[2][7]=m_StripMap[6][7]=38; - m_StripMap[2][8]=m_StripMap[6][8]=11; - m_StripMap[2][9]=m_StripMap[6][9]=15; - m_StripMap[3][0]=m_StripMap[7][0]=23; - m_StripMap[3][1]=m_StripMap[7][1]=35; - m_StripMap[3][2]=m_StripMap[7][2]=31; - m_StripMap[3][3]=m_StripMap[7][3]=39; - m_StripMap[3][4]=m_StripMap[7][4]=33; - m_StripMap[3][5]=m_StripMap[7][5]=27; - m_StripMap[3][6]=m_StripMap[7][6]=29; - m_StripMap[3][7]=m_StripMap[7][7]=25; - m_StripMap[3][8]=m_StripMap[7][8]=21; - m_StripMap[3][9]=m_StripMap[7][9]=20; - - return; -} - -/////////////////////////////////////////////////////////////////// - -bool MBinaryFlightDataParser::SortEventsBuf(void){ - - std::sort(m_EventsBuf.begin(), m_EventsBuf.end(), MReadOutAssemblyTimeCompare); - return true; - -} - -/////////////////////////////////////////////////////////////////// - -bool MReadOutAssemblyTimeCompare(MReadOutAssembly * E1, MReadOutAssembly * E2){ - - //sort based on 48 bit clock value - if( E1->GetCL() < E2->GetCL() ) return true; else return false; - -} - -/////////////////////////////////////////////////////////////////// - -bool MBinaryFlightDataParser::ProcessAspect( vector & NextPacket ){ - - //look for '$' - - int Len = NextPacket.size(); - int wx = 0; // skip to first byte - bool NotEnoughBytes = false; - int i; - //uint32_t LastClkSample; - uint64_t UpperClkBytes; - - int DSOLen = 84; //length of the DSO message including the last 5 bytes for the clock - int MagLen = 24; //length of the magnetometer message including my "$M" header - - uint16_t AspectID = 0; - AspectID |= ((uint16_t) NextPacket[6]) << 8; - AspectID |= ((uint16_t) NextPacket[7]); - - int UnixBytes = 0; - UnixBytes |= ((int) NextPacket[3] << 16); - UnixBytes |= ((int) NextPacket[4] << 8); - UnixBytes |= ((int) NextPacket[5]); - - /* this was for COSI 14 - - if( UnixBytes > 0x0094C5B1 ){ - UnixBytes |= 0x54000000; - } else { - UnixBytes |= 0x55000000; - } - - */ - - //COSI 16... need to replace this with GPS time eventually - if( UnixBytes > 0x00f7494c ){ - UnixBytes |= 0x56000000; - } else { - UnixBytes |= 0x57000000; - } - - time_t UnixTime = (time_t) UnixBytes; - UpperClkBytes = 0; UpperClkBytes = ((uint64_t) NextPacket[10] << 40) | ((uint64_t) NextPacket[11] << 32); - wx = 12; - while( wx < Len ){ - - if( NextPacket[wx] == '$' ){ - //check that we have enough bytes to determine the message type - if( (wx + 10) <= Len ){ - //determine the type: - string Header ; - for( i = 0; i < 10; ++i ) Header += (char) NextPacket[wx + i]; - ////////////////////// DSO Msg ////////////////////////////////// - if( Header.find("$PASHR,DSO") == 0 ){ - //check that we have enough bytes in the buffer for this - if( (wx + DSOLen) <= Len ){ - vector DSOMsg; - DSOMsg.assign( NextPacket.begin() + wx, NextPacket.begin() + wx + DSOLen ); - MAspectPacket DSOPacket; - DecodeDSO( DSOMsg, DSOPacket );//transfer info from DSO msg into an MAspectPacket - DSOPacket.PPSClk |= UpperClkBytes; - long int SecondsSinceGPSEpoch = (UnixTime - 315964800) + 17; //17 seconds is number of leapseconds introduced since 1980 GPS epoch - long int GPSWeek = SecondsSinceGPSEpoch/(60*60*24*7); - int64_t GPSms = ((uint64_t)GPSWeek*(7*24*60*60*1000)) + DSOPacket.GPSMilliseconds; //absolute GPS time down to the millisecond - MTime GPSTime((long int)(GPSms/1000),(long int)((GPSms % 1000)*10000)); - MTime UTCTime((unsigned int)(GPSTime.GetAsSystemSeconds() -17 + 315964800), GPSTime.GetNanoSeconds()); - long int UTCSec = UTCTime.GetAsSystemSeconds(); - int64_t PPS = DSOPacket.PPSClk; - bool FoundPPS = TIRecord.AddCorrect(UTCSec,PPS); - if(FoundPPS){ - DSOPacket.PPSClk = PPS; - DSOPacket.UnixTime = UTCSec; - DSOPacket.GPSms = GPSms; - m_LastDSOPacket = DSOPacket; - m_LastDSOUnixTime = UTCSec; - m_LastAspectID = AspectID; - if( m_UseGPSDSO ){ - m_AspectReconstructor->AddAspectFrame( DSOPacket ); - m_NumDSOReceived++; - } - } - if(m_NumDSOReceived < 20){ - cout << "GPSms = " << GPSms << endl; - } - - wx += DSOLen; - } else { - NotEnoughBytes = true; - } - - ////////////////////// Mag Msg ////////////////////////////////// - } else if( Header.find("$M") == 0){ - if( (wx + MagLen) <= Len ){ - if( m_NumDSOReceived > 0 ){ //only use magnetometer if we have at least one dso msg - if( (UnixTime >= m_LastDSOUnixTime) ){ //don't need a packet counter check because aspect packets are slower than once a second - //the above check on unix time and aspect ID are so that if we get misordered packets, - //and the first subpacket is a magnetometer packet, we won't use the DSO info - //from the last DSO message processed, since this will have happened in the future. - vector MagMsg; - MAspectPacket MagPacket; - MagMsg.assign( NextPacket.begin() + wx, NextPacket.begin() + wx + MagLen ); - DecodeMag( MagMsg, MagPacket ); - - //copy over all necessary parameters to MagPacket from m_LastDSOPacket - MagPacket.geographic_longitude = m_LastDSOPacket.geographic_longitude; - MagPacket.geographic_latitude = m_LastDSOPacket.geographic_latitude; - MagPacket.elevation = m_LastDSOPacket.elevation; - MagPacket.date_and_time = m_LastDSOPacket.date_and_time; - MagPacket.CorrectedClk = m_LastDSOPacket.CorrectedClk; - MagPacket.UnixTime = UnixTime; - MagPacket.GPSms = m_LastDSOPacket.GPSms; - MagPacket.PPSClk = m_LastDSOPacket.PPSClk; - - if( m_UseMagnetometer ){ - m_AspectReconstructor->AddAspectFrame( MagPacket ); - } - } - } - - wx += MagLen; - } else { - NotEnoughBytes = true; - } - } else { - wx += 1; - } - } else { - NotEnoughBytes = true; - } - } else { - wx += 1; - } - - if( NotEnoughBytes ){ - break; - } - } - - return true; - -} - - -///////////////////////////////////////////////////////////////////////////////// - -/* -bool MBinaryFlightDataParser::ProcessAspect_works( vector & NextPacket ){ - - //look for '$' - - int Len = NextPacket.size(); - int wx = 0; // skip to first byte - bool NotEnoughBytes = false; - int i; - time_t UnixTime; - struct tm * timeinfo; - char DateString[32]; - string cpp_DateString; - //uint32_t LastClkSample; - uint64_t UpperClkBytes; - - - int DSOLen = 84; //length of the DSO message including the last 5 bytes for the clock - int MagLen = 24; //length of the magnetometer message including my "$M" header - - - int UnixBytes = 0; - UnixBytes |= ((int) NextPacket[3] << 16); - UnixBytes |= ((int) NextPacket[4] << 8); - UnixBytes |= ((int) NextPacket[5]); - - //checked the GCU unix time before launch on 12/20/14-00:32:00 UTC - //and got 0x5494C5B1, which will rollover the lower three bytes in ~81 days - //so if we have a flight longer than ~81 days, use 0x55 for the upper byte - //if the lower three bytes is less than 0x0094C5B1 - if( UnixBytes > 0x0094C5B1 ){ - UnixBytes |= 0x54000000; - } else { - UnixBytes |= 0x55000000; - } - - UnixTime = (time_t) UnixBytes; - - timeinfo = gmtime(&UnixTime); - //date format has to be year/month/day for Ares' thing to work - strftime( DateString, sizeof(DateString), "%Y/%m/%d", timeinfo); - //should figure out what day it is, but then use the GPS millisecond to figure out exactly what time it is - //then use the GPS ms time to figure out exactly what time it is - - //now use strftime to get a date string using this time - //according to Ares the GPS week starts at 23:59:44 on saturday night DOUBLE CHECK THIS - cpp_DateString = string( DateString ); - - //get the upper two 10 MHz clock byte from the beginning of the packet - UpperClkBytes = 0; UpperClkBytes = ((uint64_t) NextPacket[10] << 40) | ((uint64_t) NextPacket[11] << 32); - - - while( wx < Len ){ - - if( NextPacket[wx] == '$' ){ - //check that we have enough bytes to determine the message type - if( (wx + 10) < Len ){ - //determine the type: - string Header ; - for( i = 0; i < 10; ++i ) Header += (char) NextPacket[wx + i]; - - ////////////////////// DSO Msg ////////////////////////////////// - if( Header.find("$PASHR,DSO") == 0 ){ - //check that we have enough bytes in the buffer for this - if( (wx + DSOLen) < Len ){ - - //from unix time, get the GPS week, and include GPSWeek in the MAspectPAcket - - - m_NumDSOReceived++; - vector DSOMsg; - DSOMsg.assign( NextPacket.begin() + wx, NextPacket.begin() + wx + DSOLen ); - MAspectPacket DSOPacket; - DecodeDSO( DSOMsg, DSOPacket );//transfer info from DSO msg into an MAspectPacket - string TempString = cpp_DateString + DSOPacket.date_and_time; //prepend the date, date computed above using unix time - DSOPacket.date_and_time = TempString; - DSOPacket.PPSClk |= UpperClkBytes; - DSOPacket.CorrectedClk = DSOPacket.PPSClk + ((DSOPacket.GPSMilliseconds % 1000)*10000);//estimate the clock board value at the time of the DSO message - - //get the GPS week - int SecondsSinceGPSEpoch = (UnixTime - 315964800) + 16; //16 seconds is number of leapseconds introduced since 1980 GPS epoch - int GPSWeek = SecondsSinceGPSEpoch/(60*60*24*7); - - DSOPacket.GPSWeek = GPSWeek; - m_LastGPSWeek = GPSWeek; //keep this around for the magnetometer - m_LastCorrectedClk = DSOPacket.CorrectedClk; // keep this around for the magnetometer - m_LastDateTimeString = DSOPacket.date_and_time; //keep this around for the magnetometer - m_LastLatitude = DSOPacket.geographic_latitude; - m_LastLongitude = DSOPacket.geographic_longitude; - m_LastAltitude = DSOPacket.elevation; - //DSOPacket.CorrectedClk is converted to MTime in AddAspectFrame. - if( m_UseGPSDSO ){ - m_AspectReconstructor->AddAspectFrame( DSOPacket ); - } - wx += DSOLen; - } else { - NotEnoughBytes = true; - } - - ////////////////////// Mag Msg ////////////////////////////////// - } else if( Header.find("$M") == 0){ - if( (wx + MagLen) < Len ){ - if( m_NumDSOReceived > 0 ){ //only use magnetometer if we have at least one dso msg - vector MagMsg; - MAspectPacket MagPacket; - MagMsg.assign( NextPacket.begin() + wx, NextPacket.begin() + wx + MagLen ); - DecodeMag( MagMsg, MagPacket ); - //check if the LastDateTimeString is valid! if not - if( m_LastDateTimeString.size() > 0 ){ - MagPacket.date_and_time = m_LastDateTimeString; - } else { - //we don't have have a GPS time string for this event, and we need one for Ares to compute the - //aspect stuff in pyephem - //make a date/time string using the unix second - //need to use Ares' format. - //for now, skip - wx += MagLen; continue; - } - - if( m_LastCorrectedClk == 0xffffffffffffffff ){ - //we havent received a clock sample yet, so there is no way for us to look up - //a timestamp and we can't use this for the aspect reconstruction. this could happen if: - //you just started nuclearizer, and the first aspect packet you received started with a - //magnetometer sample. - - } else { - MagPacket.CorrectedClk = m_LastCorrectedClk; - } - //MagPacket.CorrectedClk is converted to MTime in AddAspectFrame - if( m_UseMagnetometer ){ - m_AspectReconstructor->AddAspectFrame( MagPacket ); - } - } - - wx += MagLen; - } else { - NotEnoughBytes = true; - } - } else { - wx += 1; - } - } else { - NotEnoughBytes = true; - } - } else { - wx += 1; - } - - if( NotEnoughBytes ){ - break; - } - } - - return true; - -} - -*/ - -//////////////////////////////////////////////////////////////////////////////// - -bool MBinaryFlightDataParser::DecodeDSO(vector & DSOString, MAspectPacket& GPS_Packet){ - - uint32_t MySeconds; - MySeconds = 0; - MySeconds = (((uint32_t)DSOString[11] & 0xFF) << 24) | (((uint32_t)DSOString[12] & 0xFF) << 16) | (((uint32_t)DSOString[13] & 0xFF) << 8) | ((uint32_t)DSOString[14] & 0xFF); - //printf("%02x %02x %02x %02x - ", (DSOString[11] & 0xFF),(DSOString[12] & 0xFF),(DSOString[13] & 0xFF),(DSOString[14] & 0xFF)); - if (g_Verbosity >= c_Info) printf("DSO Packet: Milliseconds = %u, ",MySeconds); //Again these are Carolyn's packets, not MAspectPacket objects - long intermediate_seconds = MySeconds; - GPS_Packet.GPSMilliseconds = MySeconds; - - - uint64_t MyHeading_int = 0; - double MyHeading = 0.0; - MyHeading_int = (((uint64_t)DSOString[15] & 0xFF) << 56) | (((uint64_t)DSOString[16] & 0xFF) << 48) | (((uint64_t)DSOString[17] & 0xFF) << 40) | (((uint64_t)DSOString[18] & 0xFF) << 32) | (((uint64_t)DSOString[19] & 0xFF) << 24) | (((uint64_t)DSOString[20] & 0xFF) << 20) | (((uint64_t)DSOString[21] & 0xFF) << 8) | ((uint64_t)DSOString[22] & 0xFF); - MyHeading = *(double *) &MyHeading_int; - if (g_Verbosity >= c_Info) printf("Heading = %4.2f, ", MyHeading); - GPS_Packet.heading = MyHeading; - - - uint64_t MyPitch_int = 0; - double MyPitch = 0.0; - MyPitch_int = (((uint64_t)DSOString[23] & 0xFF) << 56) | (((uint64_t)DSOString[24] & 0xFF) << 48) | (((uint64_t)DSOString[25] & 0xFF) << 40) | (((uint64_t)DSOString[26] & 0xFF) << 32) | (((uint64_t)DSOString[27] & 0xFF) << 24) | (((uint64_t)DSOString[28] & 0xFF) << 16) | (((uint64_t)DSOString[29] & 0xFF) << 8) | ((uint64_t)DSOString[30] & 0xFF); - MyPitch = *(double *) &MyPitch_int; - if (g_Verbosity >= c_Info) printf("Pitch = %4.2f, ", MyPitch); - GPS_Packet.pitch = MyPitch; - - - uint64_t MyRoll_int = 0; - double MyRoll = 0.0; - MyRoll_int = (((uint64_t)DSOString[31] & 0xFF) << 56) | (((uint64_t)DSOString[32] & 0xFF) << 48) | (((uint64_t)DSOString[33] & 0xFF) << 40) | (((uint64_t)DSOString[34] & 0xFF) << 32) | (((uint64_t)DSOString[35] & 0xFF) << 24) | (((uint64_t)DSOString[36] & 0xFF) << 16) | (((uint64_t)DSOString[37] & 0xFF) << 8) | ((uint64_t)DSOString[38] & 0xFF); - MyRoll = *(double *) &MyRoll_int; - if (g_Verbosity >= c_Info) printf("Roll = %4.2f, ", MyRoll); - GPS_Packet.roll = MyRoll; - - - uint64_t MyBRMS_int = 0; - double MyBRMS = 0.0; - MyBRMS_int = (((uint64_t)DSOString[39] & 0xFF) << 56) | (((uint64_t)DSOString[40] & 0xFF) << 48) | (((uint64_t)DSOString[41] & 0xFF) << 40) | (((uint64_t)DSOString[42] & 0xFF) << 32) | (((uint64_t)DSOString[43] & 0xFF) << 24) | (((uint64_t)DSOString[44] & 0xFF) << 16) | (((uint64_t)DSOString[45] & 0xFF) << 8) | ((uint64_t)DSOString[46] & 0xFF); - MyBRMS = *(double *) &MyBRMS_int; - if (g_Verbosity >= c_Info) printf("BRMS = %f, ", MyBRMS); - GPS_Packet.BRMS = MyBRMS; - - - uint8_t MyAtt_flag_1; - MyAtt_flag_1 = (uint8_t)DSOString[47] & 0xFF; - if (g_Verbosity >= c_Info) printf("Attitude Flag #1 = %u, ", MyAtt_flag_1); - - uint8_t MyAtt_flag_2; - MyAtt_flag_2 = (uint8_t)DSOString[48] & 0xFF; - if (g_Verbosity >= c_Info) printf("Attitude Flag #2 = %u, ", MyAtt_flag_2); - - GPS_Packet.AttFlag = ((uint16_t) MyAtt_flag_1 << 8) | ((uint16_t) MyAtt_flag_2); - - - uint64_t MyLat_int = 0; - double MyLat; - MyLat_int = (((uint64_t)DSOString[49] & 0xFF) << 56) | (((uint64_t)DSOString[50] & 0xFF) << 48) | (((uint64_t)DSOString[51] & 0xFF) << 40) | (((uint64_t)DSOString[52] & 0xFF) << 32) | (((uint64_t)DSOString[53] & 0xFF) << 24) | (((uint64_t)DSOString[54] & 0xFF) << 16) | (((uint64_t)DSOString[55] & 0xFF) << 8) | ((uint64_t)DSOString[56] & 0xFF); - MyLat = *(double *) &MyLat_int; - if (g_Verbosity >= c_Info) printf("Latitude = %4.2f, ", MyLat); - GPS_Packet.geographic_latitude = MyLat; - - - uint64_t MyLong_int = 0; - double MyLong = 0.0; - MyLong_int = (((uint64_t)DSOString[57] & 0xFF) << 56) | (((uint64_t)DSOString[58] & 0xFF) << 48) | (((uint64_t)DSOString[59] & 0xFF) << 40) | (((uint64_t)DSOString[60] & 0xFF) << 32) | (((uint64_t)DSOString[61] & 0xFF) << 24) | (((uint64_t)DSOString[62] & 0xFF) << 16) | (((uint64_t)DSOString[63] & 0xFF) << 8) | ((uint64_t)DSOString[64] & 0xFF); - MyLong = *(double *) &MyLong_int; - if (g_Verbosity >= c_Info) printf("Longitude = %4.2f, ", MyLong); - GPS_Packet.geographic_longitude = MyLong; - - - uint64_t MyAlt_int = 0; - double MyAlt = 0.0; - MyAlt_int = (((uint64_t)DSOString[65] & 0xFF) << 56) | (((uint64_t)DSOString[66] & 0xFF) << 48) | (((uint64_t)DSOString[67] & 0xFF) << 40) | (((uint64_t)DSOString[68] & 0xFF) << 32) | (((uint64_t)DSOString[69] & 0xFF) << 24) | (((uint64_t)DSOString[70] & 0xFF) << 16) | (((uint64_t)DSOString[71] & 0xFF) << 8) | ((uint64_t)DSOString[72] & 0xFF); - MyAlt = *(double *) &MyAlt_int; - if (g_Verbosity >= c_Info) printf("Altitude = %4.2f, ", MyAlt); - GPS_Packet.elevation = MyAlt; - - - //NEEDS WORK! - uint16_t MyChecksum; - MyChecksum = (((uint16_t)DSOString[73] & 0xFF) << 8) | ((uint16_t)DSOString[74] & 0xFF); - //printf("Hex Checksum = %c %c %c %c %c- ", (char)(DSOString [72] & 0xFF), (char)(DSOString[73] & 0xFF), (char)(DSOString[74] & 0xFF), (char)(DSOString[75] & 0xFF), (char)(DSOString[76] & 0xFF)); - if (g_Verbosity >= c_Info) printf("MyChecksum? = %u, ", MyChecksum); - - uint32_t MyClock = 0; //counting 10 MHz clock signal. - MyClock = (((uint32_t)DSOString[80] & 0xFF) << 24) | (((uint32_t)DSOString[81] & 0xFF) << 16) | (((uint32_t)DSOString[82] & 0xFF) << 8) | ((uint32_t)DSOString[83] & 0xFF); - if (g_Verbosity >= c_Info) printf("Clock = %u. \n",MyClock); - GPS_Packet.PPSClk = MyClock; - - GPS_Packet.GPS_or_magnetometer = 0; - - if (g_Verbosity >= c_Info) { - printf("\n"); - printf("Now, here is what's from GPS_Packet: \n"); - printf("Heading: \n"); - printf("%f\n",GPS_Packet.heading); - printf("Pitch: \n"); - printf("%f\n",GPS_Packet.pitch); - printf("Roll: \n"); - printf("%f\n",GPS_Packet.roll); - printf("Geographic Latitude: \n"); - printf("%f\n",GPS_Packet.geographic_latitude); - printf("Geographic Longitude: \n"); - printf("%f\n",GPS_Packet.geographic_longitude); - printf("Elevation: \n"); - printf("%f\n",GPS_Packet.elevation); - } - - string slash = "/"; - string colon = ":"; - string twenty = "20"; - string space = " "; - string zero = "0"; - - - long milliseconds = intermediate_seconds - 16000; //this will only work for one day (date collected must be same date file with data was made because this program will trust that that date is correct) - - - int hours = 0; - int minutes = 0; - int seconds = 0; - unsigned int nanoseconds = 0; - - - - while(milliseconds > 86400000){ - milliseconds = milliseconds - 86400000; - } - while(milliseconds > 3600000){ - hours = hours +1; - milliseconds = milliseconds - 3600000; - } - while(milliseconds > 60000){ - minutes = minutes +1; - milliseconds = milliseconds - 60000; - } - while(milliseconds > 1000){ - seconds = seconds +1; - milliseconds = milliseconds - 1000; - } - - - - string Hours = to_string(hours); - string Minutes = to_string(minutes); - string Seconds = to_string(seconds); - - - - if(hours < 10){ - Hours = zero + Hours; - } - if(minutes < 10){ - Minutes = zero + Minutes; - } - if(seconds < 10){ - Seconds = zero + Seconds; - } - - - - //string date_and_time = date + space + Hours + colon + Minutes + colon + Seconds; - string date_and_time = space + Hours + colon + Minutes + colon + Seconds; - GPS_Packet.date_and_time = date_and_time; - - - nanoseconds = milliseconds * 1000000; - GPS_Packet.nanoseconds = nanoseconds; - - - if (g_Verbosity >= c_Info) { - printf("Date_and_Time: \n"); - - cout << GPS_Packet.date_and_time << endl; - - printf("Nanoseconds: \n"); - printf("%u\n",GPS_Packet.nanoseconds); - - printf("\n"); - } - - return true; - -} - -///////////////////////////////////////////////////////////////////// - - -bool MBinaryFlightDataParser::DecodeMag(vector& MagString, MAspectPacket& M_Packet){ - - // printf(" %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x \n", MagString[0] & 0xFF, MagString[1] & 0xFF, MagString[2] & 0xFF, MagString[3] & 0xFF, MagString[4] & 0xFF, MagString[5] & 0xFF, MagString[6] & 0xFF, MagString[7] & 0xFF, MagString[8] & 0xFF, MagString[9] & 0xFF, MagString[10] & 0xFF, MagString[11] & 0xFF, MagString[12] & 0xFF, MagString[13] & 0xFF, MagString[14] & 0xFF, MagString[15] & 0xFF, MagString[16] & 0xFF, MagString[17] & 0xFF, MagString[18] & 0xFF, MagString[19] & 0xFF, MagString[20] & 0xFF, MagString[21] & 0xFF, MagString[22] & 0xFF, MagString[23] & 0xFF); - - int16_t MyRoll_int; - float MyRoll = 0.0; - MyRoll_int = (((int16_t)MagString[4] & 0xFF) << 8) | ((int16_t)MagString[5] & 0xFF); - MyRoll = MyRoll_int/10.0; - if (g_Verbosity >= c_Info) printf("Magnetometer Packet: Roll = %4.2f, ",MyRoll); //Once again, let me be clear, these are Carolyn's packets, not MAspectPacket objects - M_Packet.roll = MyRoll; - - - int16_t MyMagRoll_int; - float MyMagRoll = 0.0; - MyMagRoll_int = (((int16_t)MagString[6] & 0xFF) << 8) | ((int16_t)MagString[7] & 0xFF); - MyMagRoll = MyMagRoll_int/10.0; - if (g_Verbosity >= c_Info) printf("Mag Roll = %4.2f, ",MyMagRoll); - - - int16_t MyInclination_int; - float MyInclination = 0.0; - MyInclination_int = (((int16_t)MagString[8] & 0xFF) << 8) | ((int16_t)MagString[9] & 0xFF); - MyInclination = MyInclination_int/10.0; - if (g_Verbosity >= c_Info) printf("Inclination = %4.2f, ",MyInclination); - M_Packet.pitch = MyInclination; - - - int16_t MyMagTot_int; - float MyMagTot = 0.0; - MyMagTot_int = (((int16_t)MagString[10] & 0xFF) << 8) | ((int16_t)MagString[11] & 0xFF); - MyMagTot = MyMagTot_int/10000.0; - if (g_Verbosity >= c_Info) printf("Mag Total = %4.2f, ",MyMagTot); - - - int16_t MyAzi_int; - float MyAzi = 0.0; - MyAzi_int = (((int16_t)MagString[12] & 0xFF) << 8) | ((int16_t)MagString[13] & 0xFF); - MyAzi = MyAzi_int/10.0; - if (g_Verbosity >= c_Info) printf("Azimuth = %4.2f, ",MyAzi); - M_Packet.heading = MyAzi; - - - int16_t MyAccel_int; - float MyAccel = 0.0; - MyAccel_int = (((int16_t)MagString[14] & 0xFF) << 8) | ((int16_t)MagString[15] & 0xFF); - MyAccel = MyAccel_int/10000.0; - if (g_Verbosity >= c_Info) printf("Acceleration = %4.2f, ",MyAccel); - - - int16_t MyTemp_int; - float MyTemp = 0.0; - MyTemp_int = (((int16_t)MagString[16] & 0xFF) << 8) | ((int16_t)MagString[17] & 0xFF); - MyTemp = MyTemp_int/100.0; - if (g_Verbosity >= c_Info) printf("Temperature = %4.2f, ",MyTemp); - - - int16_t MyVolt_int; - float MyVolt = 0.0; - MyVolt_int = (((int16_t)MagString[18] & 0xFF) << 8) | ((int16_t)MagString[19] & 0xFF); - MyVolt = MyVolt_int/100.0; - if (g_Verbosity >= c_Info) printf("Voltage = %4.2f, ",MyVolt); - - - //CHECKSUM! - - - //the following commented block assumes that the timestamp is always right before the mag data - //don't assume this! just use the last read PPSClk in the calling thread - /* - - uint32_t MyClock = 0; //counting 10 MHz clock signal. - MyClock = (((uint32_t)MagString[-4] & 0xFF) << 24) | (((uint32_t)MagString[-3] & 0xFF) << 16) | (((uint32_t)MagString[-2] & 0xFF) << 8) | ((uint32_t)MagString[-1] & 0xFF); - printf("Clock = %u. \n",MyClock); - MyClock = MyMag->Clock; - */ - - - M_Packet.GPS_or_magnetometer = 1; - - if (g_Verbosity >= c_Info) { - printf("\n"); - printf("Now, here is what's from M_Packet: \n"); - printf("Heading: \n"); - printf("%f\n",M_Packet.heading); - printf("Pitch: \n"); - printf("%f\n",M_Packet.pitch); - printf("Roll: \n"); - printf("%f\n",M_Packet.roll); - - // M_Packet.geographic_latitude = GPS_Packet.geographic_latitude; - // M_Packet.geographic_longitude = GPS_Packet.geographic_longitude; - // M_Packet.elevation = GPS_Packet.elevation; - - printf("This is GPS stuff we put in the M_Packet: \n"); - printf("Geographic Latitude: \n"); - printf("%f\n",M_Packet.geographic_latitude); - printf("Geographic Longitude: \n"); - printf("%f\n",M_Packet.geographic_longitude); - printf("Elevation: \n"); - printf("%f\n",M_Packet.elevation); - - // M_Packet.date_and_time = GPS_Packet.date_and_time; - // M_Packet.nanoseconds = GPS_Packet.nanoseconds; - - printf("Date_and_Time: \n"); - cout << M_Packet.date_and_time << endl; - printf("Nanoseconds: \n"); - printf("%u\n",M_Packet.nanoseconds); - printf("\n"); - } - - //AR->AddAspectFrame(M_Packet); - - return true; -} - -/////////////////////////////////////////////////////////////////////////////////////////// - - -bool MBinaryFlightDataParser::ComptonDataframe2Struct( vector& Buf, dataframe * DataOut ){ - - size_t wx = 0; - size_t BufSize = Buf.size(); - int EvCnt = 0; - - if( DataOut == NULL ){ - return false; - } - - if( BufSize < 16 ){ - return false; - } - - int CalculatedLen = ((int) Buf[8] << 8) | ((int) Buf[9]); - - int UnixInt = ((int) Buf[3] << 16) | ((int) Buf[4] << 8) | ((int) Buf[5]); - DataOut->UnixTime = (time_t) UnixInt; - DataOut->PacketCounter = ((int) Buf[6] << 8) | ((int) Buf[7]); - DataOut->Length = CalculatedLen; - DataOut->SysTime = 0; - DataOut->SysTime = ((uint64_t) Buf[10] << 40) | ((uint64_t) Buf[11] << 32) | ((uint64_t) Buf[12] << 24) | ((uint64_t) Buf[13] << 16) | ((uint64_t) Buf[14] << 8) | ((uint64_t) Buf[15]); - wx = 16; - - while( wx < BufSize ){ - if( Buf[wx] == 0xae ){ - //we are at the beginning of an event, read it in - - wx += 7; if( wx > BufSize ) { DataOut->ParseError = true; return false; } - event NewEvent; - EvCnt++; - NewEvent.EventID = Buf[wx - 6]; - NewEvent.NumCCsInvolved = Buf[wx - 5] & 0x0f; - int N = NewEvent.NumCCsInvolved; if( N > 12 ){ DataOut->ParseError = true; return false; } - NewEvent.EventTime = 0; - NewEvent.EventTime = ((uint64_t) Buf[wx-4] << 24) | ((uint64_t) Buf[wx-3] << 16) | ((uint64_t) Buf[wx-2] << 8) | ((uint64_t) Buf[wx-1]); - - //loop over triggered card cages - //loop over triggers - - for( int i = 0; i < N; ++i ){ - wx += 2; if( wx > BufSize ) { DataOut->ParseError = true; return false; } - int CurrentCC = (int) Buf[wx - 2]; - int NumTriggers = (int) Buf[wx - 1]; - for( int j = 0; j < NumTriggers; ++j ){ - - //at this point, wx points at the trigger byte - - wx += 3; if( wx > BufSize ) { DataOut->ParseError = true; return false; } - trigger NewTrig; - NewTrig.HasADC = true; - NewTrig.Channel = Buf[wx-3] & 0x0f; - NewTrig.Board = (Buf[wx-3] & 0x70) >> 4; - if( Buf[wx-3] & 0x80 ){ - NewTrig.HasTiming = true; - } else { - NewTrig.HasTiming = false; - } - - NewTrig.ADCBytes = ((uint16_t) Buf[wx - 2] << 8) | ((uint16_t) Buf[wx - 1]); - if( NewTrig.HasTiming ){ - wx += 1; if( wx > BufSize ) { DataOut->ParseError = true; return false; } - NewTrig.TimingByte = Buf[wx - 1]; - } - - NewTrig.CCId = CurrentCC; - NewEvent.Triggers.push_back(NewTrig); - - } - } - - DataOut->Events.push_back(NewEvent); - - } else { DataOut->ParseError = true; return false; } - } - - // cout<<"compton ::: pktcnt="<PacketCounter<<" evcnt "<SetIsDone(IsDone); -} - -// MBinaryFlightDataParser.cxx: the end... -//////////////////////////////////////////////////////////////////////////////// diff --git a/src/MDEEStripHit.cxx b/src/MDEEStripHit.cxx new file mode 100644 index 00000000..6ef7a8fb --- /dev/null +++ b/src/MDEEStripHit.cxx @@ -0,0 +1,74 @@ +/* + * MDEEStripHit.cxx + * + * + * Copyright (C) by YOUR NAME HERE. + * All rights reserved. + * + * + * This code implementation is the intellectual property of + * Andreas Zoglauer. + * + * By copying, distributing or modifying the Program (or any work + * based on the Program) you indicate your acceptance of this statement, + * and all its terms. + * + */ + + +//////////////////////////////////////////////////////////////////////////////// +// +// MDEEStripHit +// +//////////////////////////////////////////////////////////////////////////////// + + +// Include the header: +#include "MDEEStripHit.h" + +// Standard libs: + +// ROOT libs: + +// MEGAlib libs: + + +//////////////////////////////////////////////////////////////////////////////// + + +#ifdef ___CLING___ +ClassImp(MDEEStripHit) +#endif + + +//////////////////////////////////////////////////////////////////////////////// + + +MDEEStripHit::MDEEStripHit() : m_SimulatedEventID(0), m_SimulatedPosition(0,0,0), m_SimulatedPositionInDetector(0,0,0), m_SimulatedRelativeDepth(0), m_SimulatedEnergy(0), m_SimulatedIsGuardRing(false), m_SimulatedHitIndex(0), m_IsGuardRing(false), m_Energy(0), m_ADC(0), m_HasTriggered(false), m_TAC(0), m_Temperature(0) +{ + // Construct an instance of MDEEStripHit +} + + +//////////////////////////////////////////////////////////////////////////////// + + + //! Create new real strip hit +MStripHit* MDEEStripHit::Convert() +{ + MStripHit* SH = new MStripHit(); + + SH->SetDetectorID(m_ROE.GetDetectorID()); + SH->SetStripID(m_ROE.GetStripID()); + SH->IsLowVoltageStrip(m_ROE.IsLowVoltageStrip()); + SH->HasTriggered(m_HasTriggered); + SH->SetADCUnits(m_ADC); + SH->SetTAC(m_TAC); + //SH->AddOrigins(); + SH->IsGuardRing(m_IsGuardRing); + + return SH; +} + +// MDEEStripHit.cxx: the end... +//////////////////////////////////////////////////////////////////////////////// diff --git a/src/MDepthCalibrator.cxx b/src/MDepthCalibrator.cxx index b2eeabc5..9a541d2d 100644 --- a/src/MDepthCalibrator.cxx +++ b/src/MDepthCalibrator.cxx @@ -1,5 +1,7 @@ #include "MDepthCalibrator.h" +#include "MModule.h" + //TFile* RootF; MDepthCalibrator::MDepthCalibrator() @@ -88,17 +90,22 @@ bool MDepthCalibrator::LoadCoeffsFile(MString FName) } else { MString Line; while( F.ReadLine( Line ) ){ - if( !Line.BeginsWith("#") ){ + if ( Line.BeginsWith('#') ){ std::vector Tokens = Line.Tokenize(" "); + m_Coeffs_Energy = Tokens[5].ToDouble(); + cout << "The stretch and offset were calculated for " << m_Coeffs_Energy << " keV." << endl; + } + else { + std::vector Tokens = Line.Tokenize(","); if( Tokens.size() == 5 ){ int pixel_code = Tokens[0].ToInt(); double Stretch = Tokens[1].ToDouble(); double Offset = Tokens[2].ToDouble(); - double Scale = Tokens[3].ToDouble(); + double CTD_FWHM = Tokens[3].ToDouble() * 2.355; double Chi2 = Tokens[4].ToDouble(); - //last two tokens are amplitude and chi2, not really needed here - std::vector* coeffs = new std::vector(); - coeffs->push_back(Stretch); coeffs->push_back(Offset); coeffs->push_back(Scale); coeffs->push_back(Chi2); + // Previous iteration of depth calibration read in "Scale" instead of ctd resolution. + vector coeffs; + coeffs.push_back(Stretch); coeffs.push_back(Offset); coeffs.push_back(CTD_FWHM); coeffs.push_back(Chi2); m_Coeffs[pixel_code] = coeffs; } } @@ -116,7 +123,7 @@ std::vector* MDepthCalibrator::GetPixelCoeffs(int pixel_code) { if( m_CoeffsFileIsLoaded ){ if( m_Coeffs.count(pixel_code) > 0 ){ - return m_Coeffs[pixel_code]; + return &m_Coeffs[pixel_code]; } else { return NULL; } @@ -127,10 +134,81 @@ std::vector* MDepthCalibrator::GetPixelCoeffs(int pixel_code) } +bool MDepthCalibrator::LoadTACCalFile(MString FName) +{ + // Read in the TAC Calibration file, which should contain for each strip: + // DetID, h or l for high or low voltage, TAC cal, TAC cal error, TAC cal offset, TAC offset error + MFile F; + if (!F.Open(FName)) { + cout << "MDepthCalibrator: failed to open TAC Calibration file." << endl; + m_TACCalFileIsLoaded = false; + return false; + } + + MString Line; + while (F.ReadLine(Line)) { + if (!Line.BeginsWith("#")) { + vector Tokens = Line.Tokenize(","); + if (Tokens.size() == 7) { + int DetID = Tokens[0].ToInt(); + int StripID = Tokens[2].ToInt(); + double taccal = Tokens[3].ToDouble(); + double taccal_err = Tokens[4].ToDouble(); + double offset = Tokens[5].ToDouble(); + double offset_err = Tokens[6].ToDouble(); + + // Create a vector with calibration values + vector cal_vals = {taccal, offset, taccal_err, offset_err}; + + // Ensure the unordered_map exists for this DetID (automatically creates if missing) + if (Tokens[1] == "l") { + m_LVTACCal[DetID][StripID] = cal_vals; + } else if (Tokens[1] == "h") { + m_HVTACCal[DetID][StripID] = cal_vals; + } + } + } + } + + F.Close(); + m_TACCalFileIsLoaded = true; + return true; +} + +std::vector* MDepthCalibrator::GetLVTACCal(int DetID, int StripID) +{ + if( m_TACCalFileIsLoaded ){ + if( m_LVTACCal.count(DetID) && m_LVTACCal[DetID].count(StripID) > 0 ){ + return &m_LVTACCal[DetID][StripID]; + } else { + return NULL; + } + } else { + cout << "MDepthCalibrator::GetLVTACCal: cannot get coeffs, coeff file has not yet been loaded" << endl; + return NULL; + } + +} + +std::vector* MDepthCalibrator::GetHVTACCal(int DetID, int StripID) +{ + if( m_TACCalFileIsLoaded ){ + if( m_HVTACCal.count(DetID) && m_HVTACCal[DetID].count(StripID) > 0 ){ + return &m_HVTACCal[DetID][StripID]; + } else { + return NULL; + } + } else { + cout << "MDepthCalibrator::GetHVTACCal: cannot get coeffs, coeff file has not yet been loaded" << endl; + return NULL; + } + +} bool MDepthCalibrator::LoadSplinesFile(MString FName) { - //when invert flag is set to true, the splines returned are CTD->Depth + + //when invert flag is set to true, the splines returned are CTD->Depth MFile F; if( F.Open(FName) == false ){ return false; @@ -149,12 +227,11 @@ bool MDepthCalibrator::LoadSplinesFile(MString FName) AddSpline(depthvec, anovec, DetID, m_SplineMap_Depth2AnoTiming, false); AddSpline(depthvec, catvec, DetID, m_SplineMap_Depth2CatTiming, false); } - m_Thicknesses[NewDetID] = tokens[3].ToDouble(); - cout << "MDepthCalibrator: from splines file, detector " << NewDetID << " has thicknesss " << m_Thicknesses[NewDetID] << endl; + depthvec.clear(); ctdvec.clear(); anovec.clear(); catvec.clear(); DetID = NewDetID; } else { - vector tokens = line.Tokenize(" "); + vector tokens = line.Tokenize(","); depthvec.push_back(tokens[0].ToDouble()); ctdvec.push_back(tokens[1].ToDouble()); anovec.push_back(tokens[2].ToDouble()); catvec.push_back(tokens[3].ToDouble()); } @@ -171,8 +248,47 @@ bool MDepthCalibrator::LoadSplinesFile(MString FName) m_SplinesFileIsLoaded = true; return true; + } +// bool MDepthCalibrator::AddDepthCTD(vector depthvec, vector> ctdarr, int DetID, unordered_map>& DepthGrid, unordered_map>>& CTDMap){ + +// // Saves a CTD array, basically allowing for multiple CTDs as a function of depth +// // depthvec: list of simulated depth values +// // ctdarr: vector of vectors of simulated CTD values. Each vector of CTDs must be the same length as depthvec +// // DetID: An integer which specifies which detector. +// // CTDMap: unordered map into which the array of CTDs should be placed + +// // TODO: Possible energy dependence of CTD? +// // TODO: Depth values need to be evenly spaced. Check this when reading the files in. + +// // Check to make sure things look right. +// // First check that the CTDs all have the right length. +// for( unsigned int i = 0; i < ctdarr.size(); ++i ){ +// if( (ctdarr[i].size() != depthvec.size()) && (ctdarr[i].size() > 0) ){ +// cout << "MDepthCalibrator::AddDepthCTD: The number of values in the CTD list is not equal to the number of depth values." << endl; +// return false; +// } +// } + +// double maxdepth = * std::max_element(depthvec.begin(), depthvec.end()); +// double mindepth = * std::min_element(depthvec.begin(), depthvec.end()); +// m_Thicknesses[DetID] = maxdepth-mindepth; +// cout << "MDepthCalibrator::AddDepthCTD: The thickness of detector " << DetID << " is " << m_Thicknesses[DetID] << endl; + +// //Now make sure the values for the depth start with 0.0. +// if( mindepth != 0.0){ +// cout << "MDepthCalibrator::AddDepthCTD: The minimum depth is not zero. Editing the depth vector." << endl; +// for( unsigned int i = 0; i < depthvec.size(); ++i ){ +// depthvec[i] -= mindepth; +// } +// } + +// CTDMap[DetID] = ctdarr; +// DepthGrid[DetID] = depthvec; +// return true; +// } + void MDepthCalibrator::AddSpline(vector xvec, vector yvec, int DetID, std::unordered_map& SplineMap, bool invert){ //add one more point to the start and end, corresponding to the detector edges so that the spline covers the //entire detector. just use a linear interpolation to get the edge values. diff --git a/src/MDetectorEffectsEngineBalloon.cxx b/src/MDetectorEffectsEngineBalloon.cxx index 155bcd75..ee0a1267 100644 --- a/src/MDetectorEffectsEngineBalloon.cxx +++ b/src/MDetectorEffectsEngineBalloon.cxx @@ -434,6 +434,14 @@ bool MDetectorEffectsEngineBalloon::GetNextEvent(MReadOutAssembly* Event) // Confirmed by Clio on 11/14/18: this is right pSide.m_ROE.SetStripID(38-(GP.GetYGrid()+1)); nSide.m_ROE.SetStripID(38-(GP.GetXGrid()+1)); + + // cout << "___________" << endl; + // cout << "Strip ID (pos): " << pSide.m_ROE.GetStripID() << endl; + // cout << "Opposite Strip ID (pos): " << pSide.m_OppositeStrip << endl; + + // // // cout << "___________" << endl; + // cout << "Strip ID (neg): " << nSide.m_ROE.GetStripID() << endl; + // // cout << "Opposite Strip ID (neg): " << nSide.m_OppositeStrip << endl; //SetStripID needs to be called before we can look up the depth calibration coefficients @@ -908,9 +916,10 @@ bool MDetectorEffectsEngineBalloon::GetNextEvent(MReadOutAssembly* Event) //cout << Hit.m_SubStripHits.at(0).m_Energy << endl; m_MultipleHitsCounter += nIndep; } + } - + cout << "---------" << endl; // Merge origins for (MDEEStripHit& Hit: MergedStripHits) { Hit.m_Origins.clear(); @@ -919,8 +928,10 @@ bool MDetectorEffectsEngineBalloon::GetNextEvent(MReadOutAssembly* Event) Hit.m_Origins.push_back(Origin); } } + cout << "Is Low voltage: " << Hit.m_ROE.IsLowVoltageStrip() << " Strip ID: " << Hit.m_ROE.GetStripID() << endl; Hit.m_Origins.sort(); Hit.m_Origins.unique(); + // cout << Hit.m_ROE.GetStripID() << endl; } @@ -1554,7 +1565,7 @@ bool MDetectorEffectsEngineBalloon::GetNextEvent(MReadOutAssembly* Event) MStripHit* SH = new MStripHit(); SH->SetDetectorID(Hit.m_ROE.GetDetectorID()); SH->SetStripID(Hit.m_ROE.GetStripID()); - SH->IsLowVoltageStrip(Hit.m_ROE.IsLowVoltageStrip()); + SH->IsXStrip(Hit.m_ROE.IsLowVoltageStrip()); SH->SetADCUnits(Hit.m_ADC); SH->SetTiming(Hit.m_Timing); SH->SetPreampTemp(20); diff --git a/src/MDetectorEffectsEngineSMEX.cxx b/src/MDetectorEffectsEngineSMEX.cxx index 757d6dac..6bb3cb53 100644 --- a/src/MDetectorEffectsEngineSMEX.cxx +++ b/src/MDetectorEffectsEngineSMEX.cxx @@ -1,8 +1,8 @@ /* - * MDetectorEffectEngineSMEX.cxx + * MDetectorEffectsEngineSMEX.cxx * * - * Copyright (C) by Clio Sleator, Carolyn Kierans, Andreas Zoglauer. + * Copyright (C) by Clio Sleator, Carolyn Kierans, Andreas Zoglauer, Parshad Patel. * All rights reserved. * * @@ -84,6 +84,7 @@ MDetectorEffectsEngineSMEX::MDetectorEffectsEngineSMEX() m_ShowProgressBar = false; m_SaveToFile = false; m_ApplyFudgeFactor = true; + m_ChargeLossHist = nullptr; } @@ -96,6 +97,14 @@ MDetectorEffectsEngineSMEX::~MDetectorEffectsEngineSMEX() // Intentionally left blank if (m_OwnGeometry == true) delete m_Geometry; + + for (auto& C: m_EnergyCalibration) { + delete C.second; + } + + for (auto& C: m_ResolutionCalibration) { + delete C.second; + } } @@ -143,9 +152,17 @@ bool MDetectorEffectsEngineSMEX::Initialize() //load crosstalk coefficients if (ParseCrosstalkFile() == false) return false; + // //initialize dead time and trigger rates + // for (int i=0; i shields_deadtime) { + shields_deadtime += (shield_decayTime - shields_deadtime); + } + shields_deadtime += delayTimeBefore + delayTimeAfter; + return shields_deadtime; +} + //////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// + +//! Function to define asic deadtime +// ** Needs more work ** +// Check if there are neighboring channels. Count the channels only once. The channel map needs to be sorted. +// Channels needs to be checked to be within delay time window. +double MDetectorEffectsEngineSMEX::dTimeGeDs(vector channels) { + // Enable line is shared for 4 asics per detector, two per side. + // Only called if one channel is activated. + + double GeD_deadtime = 0; + int temp = 0; + int channelNext = 0; + int highestCountNear = 0; + double waitTime = 400e-9; + double asic_deadtime = 1e-6; + int channels_activated_count = 1; + vector::iterator channels_activated; + // int count_near = 1; + // int channels_activated = channels.size(); + sort(channels.begin(), channels.end()); + channels_activated = unique(channels.begin(), channels.end()); + channels.resize(distance(channels.begin(), channels_activated)); + channels_activated_count = channels.size(); + + if (channels_activated_count < 32) { + GeD_deadtime = waitTime + (channels_activated_count*asic_deadtime); + } + else { + GeD_deadtime = waitTime + (channels_activated_count*asic_deadtime)+(asic_deadtime*2); + } + + return GeD_deadtime; +} + +/////////////////////////////////////////////////////////////////////////////// + //! Analyze whatever needs to be analyzed... -bool MDetectorEffectsEngineSMEX::GetNextEvent(MReadOutAssembly* Event) -{ +bool MDetectorEffectsEngineSMEX::GetNextEvent(MReadOutAssembly* Event) { + MSimEvent* SimEvent = nullptr; //int RunningID = 0; @@ -267,7 +353,7 @@ bool MDetectorEffectsEngineSMEX::GetNextEvent(MReadOutAssembly* Event) //cout<GetID()<GetSimulationEventID(); @@ -294,53 +380,231 @@ bool MDetectorEffectsEngineSMEX::GetNextEvent(MReadOutAssembly* Event) double evt_time = SimEvent->GetTime().GetAsSeconds(); bool hasDetHits = false; bool hasShieldHits = false; - bool increaseShieldDeadTime = false; + bool increaseShieldDeadTime1 = false; + bool increaseShieldDeadTime2 = false; + bool increaseShieldDeadTime3 = false; + m_IsShieldDead = false; - // first check if there's another shield hit above the threshold - // if so, veto event + // // first check if there's another shield hit above the threshold + // // if so, veto event + // for (unsigned int h=0; hGetNHTs(); h++){ + // MSimHT* HT = SimEvent->GetHTAt(h); + // if (HT->GetDetectorType() == 4) { + // MDVolumeSequence* VS = HT->GetVolumeSequence(); + // MDDetector* Detector = VS->GetDetector(); + // MString DetName = Detector->GetName(); + + // //ONLY veto CsI shields, NOT NaI for polarization calibration + // if (DetName.GetSubString(0,6) == "Shield"){ + + // double energy = HT->GetEnergy(); + // energy = NoiseShieldEnergy(energy,DetName); + // HT->SetEnergy(energy); + + // if (energy > m_ShieldThreshold) { + // if (m_ShieldTime + m_ShieldVetoWindowSize < evt_time){ hasShieldHits = true; } + // increaseShieldDeadTime = true; + // //this is handling paralyzable dead time + // m_ShieldTime = evt_time; + // } + // } + // else if (HT->GetDetectorType() == 3){ hasDetHits = true; } + // } + // } + + // Need to update deadtime for the current detector if there is an another shield that read out an event. + // Shields are paired so that Det 1, 2 are read using 1 ASIC and so forth. This is actually 4 BGOs per ASIC. + // This will change in the future when more detectors are added. Need to change the ShieldVetoWindowSize add to something more realistic. for (unsigned int h=0; hGetNHTs(); h++){ + increaseShieldDeadTime1 = false; + increaseShieldDeadTime2 = false; + increaseShieldDeadTime3 = false; MSimHT* HT = SimEvent->GetHTAt(h); if (HT->GetDetectorType() == 4) { MDVolumeSequence* VS = HT->GetVolumeSequence(); MDDetector* Detector = VS->GetDetector(); MString DetName = Detector->GetName(); - - //ONLY veto CsI shields, NOT NaI for polarization calibration if (DetName.GetSubString(0,6) == "Shield"){ - + int DetNum = atoi(DetName.GetSubString(6,7)); double energy = HT->GetEnergy(); energy = NoiseShieldEnergy(energy,DetName); HT->SetEnergy(energy); - - if (energy > m_ShieldThreshold) { - if (m_ShieldTime + m_ShieldPulseDuration < evt_time){ hasShieldHits = true; } - increaseShieldDeadTime = true; - //this is handling paralyzable dead time - m_ShieldTime = evt_time; + switch(DetNum){ + case 1 : + if ((energy > m_ShieldThreshold) && (m_LastGoodHitShieldTime + m_ShieldDelayBefore > evt_time)){ + activated1 += 1; + increaseShieldDeadTime1 = true; + m_ShieldTime = evt_time; + hasShieldHits = true; + m_IsShieldDead = false; + } + else if((energy > m_ShieldThreshold) && (m_LastGoodHitShieldTime + m_ShieldDeadTime1 > evt_time)){ + m_IsShieldDead = true; + // activated1 = 1; + } + else if((energy > m_ShieldThreshold) && (m_LastGoodHitShieldTime + m_ShieldDeadTime1 < evt_time)){ + m_ShieldDeadTime1 = 1.5e-6; + hasShieldHits = true; + m_LastGoodHitShieldTime = evt_time; + m_ShieldTime = evt_time; + activated1 = 1; + m_IsShieldDead = false; + } + break; + case 2 : + if ((energy > m_ShieldThreshold) && (m_LastGoodHitShieldTime + m_ShieldDelayBefore > evt_time)){ + activated1 += 1; + increaseShieldDeadTime1 = true; + m_ShieldTime = evt_time; + hasShieldHits = true; + m_IsShieldDead = false; + } + else if((energy > m_ShieldThreshold) && (m_LastGoodHitShieldTime + m_ShieldDeadTime1 > evt_time)){ + m_IsShieldDead = true; + // activated1 = 1; + } + else if((energy > m_ShieldThreshold) && (m_LastGoodHitShieldTime + m_ShieldDeadTime1 < evt_time)){ + m_ShieldDeadTime1 = 1.5e-6; + hasShieldHits = true; + m_LastGoodHitShieldTime = evt_time; + m_ShieldTime = evt_time; + activated1 = 1; + m_IsShieldDead = false; + } + break; + case 3 : + if ((energy > m_ShieldThreshold) && (m_LastGoodHitShieldTime + m_ShieldDelayBefore > evt_time)){ + activated2 += 1; + increaseShieldDeadTime2 = true; + m_ShieldTime = evt_time; + hasShieldHits = true; + m_IsShieldDead = false; + } + else if((energy > m_ShieldThreshold) && (m_LastGoodHitShieldTime + m_ShieldDeadTime2 > evt_time)){ + m_IsShieldDead = true; + // activated1 = 1; + } + else if((energy > m_ShieldThreshold) && (m_LastGoodHitShieldTime + m_ShieldDeadTime2 < evt_time)){ + m_ShieldDeadTime2 = 1.5e-6; + hasShieldHits = true; + m_LastGoodHitShieldTime = evt_time; + m_ShieldTime = evt_time; + activated2 = 1; + m_IsShieldDead = false; + } + break; + case 4 : + if ((energy > m_ShieldThreshold) && (m_LastGoodHitShieldTime + m_ShieldDelayBefore > evt_time)){ + activated2 += 1; + increaseShieldDeadTime2 = true; + m_ShieldTime = evt_time; + hasShieldHits = true; + m_IsShieldDead = false; + + } + else if((energy > m_ShieldThreshold) && (m_LastGoodHitShieldTime + m_ShieldDeadTime2 > evt_time)){ + m_IsShieldDead = true; + // activated1 = 1; + } + else if((energy > m_ShieldThreshold) && (m_LastGoodHitShieldTime + m_ShieldDeadTime2 < evt_time)){ + m_ShieldDeadTime2 = 1.5e-6; + hasShieldHits = true; + m_LastGoodHitShieldTime = evt_time; + m_ShieldTime = evt_time; + activated2 = 1; + m_IsShieldDead = false; + } + break; + case 5 : + if ((energy > m_ShieldThreshold) && (m_LastGoodHitShieldTime + m_ShieldDelayBefore > evt_time)){ + activated3 += 1; + increaseShieldDeadTime3 = true; + m_ShieldTime = evt_time; + hasShieldHits = true; + m_IsShieldDead = false; + + } + else if((energy > m_ShieldThreshold) && (m_LastGoodHitShieldTime + m_ShieldDeadTime3 > evt_time)){ + m_IsShieldDead = true; + // activated1 = 1; + } + else if((energy > m_ShieldThreshold) && (m_LastGoodHitShieldTime + m_ShieldDeadTime3 < evt_time)){ + m_ShieldDeadTime3 = 1.5e-6; + hasShieldHits = true; + m_LastGoodHitShieldTime = evt_time; + m_ShieldTime = evt_time; + activated3 = 1; + m_IsShieldDead = false; + } + break; + case 6 : + if ((energy > m_ShieldThreshold) && (m_LastGoodHitShieldTime + m_ShieldDelayBefore > evt_time)){ + activated3 += 1; + increaseShieldDeadTime3 = true; + m_ShieldTime = evt_time; + hasShieldHits = true; + m_IsShieldDead = false; + } + else if((energy > m_ShieldThreshold) && (m_LastGoodHitShieldTime + m_ShieldDeadTime3 > evt_time)){ + m_IsShieldDead = true; + // activated1 = 1; + } + else if((energy > m_ShieldThreshold) && (m_LastGoodHitShieldTime + m_ShieldDeadTime3 < evt_time)){ + m_ShieldDeadTime3 = 1.5e-6; + hasShieldHits = true; + m_LastGoodHitShieldTime = evt_time; + m_ShieldTime = evt_time; + activated3 = 1; + m_IsShieldDead = false; + } + break; + } } } else if (HT->GetDetectorType() == 3){ hasDetHits = true; } } - } + if (hasShieldHits == true){ m_NumShieldCounts++; } - if (increaseShieldDeadTime == true){ m_ShieldDeadTime += m_ShieldPulseDuration; } + if (increaseShieldDeadTime1 == true){ + m_ShieldDeadTime1 = dTimeShields(activated1); + m_TotalShieldDeadTime1 += m_ShieldDeadTime1; + } + if (increaseShieldDeadTime2 == true){ + m_ShieldDeadTime2 = dTimeShields(activated2); + m_TotalShieldDeadTime2 += m_ShieldDeadTime2; + } + if (increaseShieldDeadTime3 == true){ + m_ShieldDeadTime3 = dTimeShields(activated3); + m_TotalShieldDeadTime3 += m_ShieldDeadTime3; + } //3 cases to veto events: //(1) shield active starts in veto window //(2) shield active ends in veto window //(3) shield active during the entire veto window //this if statement could perhaps be condensed but I'm less confused this way - if ((m_ShieldTime + m_ShieldDelay > evt_time + m_CCDelay && m_ShieldTime + m_ShieldDelay < evt_time + m_CCDelay + m_ShieldVetoWindowSize) || - (m_ShieldTime + m_ShieldDelay + m_ShieldPulseDuration > evt_time + m_CCDelay && m_ShieldTime + m_ShieldDelay + m_ShieldPulseDuration > evt_time + m_CCDelay + m_ShieldVetoWindowSize) || - (m_ShieldTime + m_ShieldDelay < evt_time + m_CCDelay && m_ShieldTime + m_ShieldDelay + m_ShieldPulseDuration > evt_time + m_CCDelay + m_ShieldVetoWindowSize)){ - // delete SimEvent; - // continue; - //don't delete the event yet: need to apply dead time to the card cage first! + // if ((m_ShieldTime + m_ShieldDelay > evt_time + m_StripDelay && m_ShieldTime + m_ShieldDelay < evt_time + m_StripDelay + m_ShieldVetoWindowSize) || + // (m_ShieldTime + m_ShieldDelay + m_ShieldPulseDuration > evt_time + m_StripDelay && m_ShieldTime + m_ShieldDelay + m_ShieldPulseDuration > evt_time + m_StripDelay + m_ShieldVetoWindowSize) || + // (m_ShieldTime + m_ShieldDelay < evt_time + m_StripDelay && m_ShieldTime + m_ShieldDelay + m_ShieldPulseDuration > evt_time + m_StripDelay + m_ShieldVetoWindowSize)){ + // // delete SimEvent; + // // continue; + // //don't delete the event yet: need to apply dead time to the card cage first! + // m_ShieldVeto = true; + // } + // else { m_ShieldVeto = false; } + if (m_IsShieldDead) { m_ShieldVeto = true; - } - else { m_ShieldVeto = false; } - + } + else {m_ShieldVeto = false;} + + // for (unsigned int h=0; hGetNHTs(); h++){ + // MSimHT* HT = SimEvent->GetHTAt(h); + // if (HT->GetDetectorType() == 3) { + + // } + // } + //get interactions to look for ionization in hits vector IAs; for (unsigned int i=0; iGetNIAs(); i++){ @@ -430,6 +694,8 @@ bool MDetectorEffectsEngineSMEX::GetNextEvent(MReadOutAssembly* Event) pSide.m_Energy = HT->GetEnergy(); nSide.m_Energy = HT->GetEnergy(); + //cout<<"Set energy: "<GetEnergy()<GetEnergy(); @@ -464,7 +730,7 @@ bool MDetectorEffectsEngineSMEX::GetNextEvent(MReadOutAssembly* Event) double energyDeposited = 0.; double totalEnergyFromIAs = 0.; - for (unsigned int o=0; o 63 || pStripIDinterim < 0 || pStripIDinterim > 63) { - nStripID = 65; + if (nStripIDinterim < 0 || nStripIDinterim > 36 || pStripIDinterim < 0 || pStripIDinterim > 36) { + nStripID = 38; } else { - nStripID = 64 - nStripIDinterim; + nStripID = 37 - nStripIDinterim; } @@ -611,10 +877,10 @@ bool MDetectorEffectsEngineSMEX::GetNextEvent(MReadOutAssembly* Event) nStripIDinterim = (int) floor((DriftX + xInDet)*xInvDetectorPitch); pStripIDinterim = (int) floor((DriftY + yInDet)*yInvDetectorPitch); - if (nStripIDinterim < 0 || nStripIDinterim > 63 || pStripIDinterim < 0 || pStripIDinterim > 63) { - pStripID = 65; + if (nStripIDinterim < 0 || nStripIDinterim > 36 || pStripIDinterim < 0 || pStripIDinterim > 36) { + pStripID = 38; } else { - pStripID = 64 - pStripIDinterim; + pStripID = 37 - pStripIDinterim; } @@ -690,6 +956,7 @@ bool MDetectorEffectsEngineSMEX::GetNextEvent(MReadOutAssembly* Event) for (auto P: pStripsEnergies) { //change the energy of original strip if (pSide.m_ROE.GetStripID() == P.first){ + //cout<<"pSide: "<GetNHTs(); h++){ + // MSimHT* HT = SimEvent->GetHTAt(h); + // if (HT->GetDetectorType() == 3) { + // if (evt_time > m_ShieldTime) {} + // } + // } + + + //delete event and update deadtime if the event was vetoed by the shields + //can't do this earlier because need to know which detectors got hit + // if (m_ShieldVeto){ + // for (int i=0; i m_LastHitTimeByDet[det] + m_ASICDeadTime[i]){ + // m_ASICDeadTime[i] = 1e-6; + // m_LastHitTimeByDet[det] = evt_time; + // m_TotalDeadTime[det] += m_ASICDeadTime[i]; + // } + // } + // } + // } + // delete SimEvent; + // continue; + // } + //delete event and update deadtime if the event was vetoed by the shields //can't do this earlier because need to know which detectors got hit if (m_ShieldVeto){ for (int det=0; det m_LastHitTimeByDet[det] + m_CCDeadTime[det]){ - m_CCDeadTime[det] = 1e-5; + if (evt_time > m_LastHitTimeByDet[det] + m_ASICDeadTime[det]){ + m_ASICDeadTime[det] = 1e-6; m_LastHitTimeByDet[det] = evt_time; - m_TotalDeadTime[det] += m_CCDeadTime[det]; + m_TotalDeadTime[det] += m_ASICDeadTime[det]; } } } @@ -925,6 +1224,7 @@ bool MDetectorEffectsEngineSMEX::GetNextEvent(MReadOutAssembly* Event) EnergyOrig += SubHit.m_EnergyOrig; } + //cout<<"Merged energy: "< newEnergies = ApplyChargeLoss(energy1,energy2,detID1,0,depth1,depth2); (*sh1).m_Energy = newEnergies.at(0); (*sh2).m_Energy = newEnergies.at(1); @@ -998,6 +1300,8 @@ bool MDetectorEffectsEngineSMEX::GetNextEvent(MReadOutAssembly* Event) sim_arr[i2][3] = sstrip; sim_arr[i2][4] = senergy; + //cout<<"Energy: "<::iterator gr = GuardRingHits.begin(); @@ -1150,10 +1456,10 @@ bool MDetectorEffectsEngineSMEX::GetNextEvent(MReadOutAssembly* Event) for (int det=0; det m_LastHitTimeByDet[det] + m_CCDeadTime[det]){ - m_CCDeadTime[det] = 1e-5; + if (evt_time > m_LastHitTimeByDet[det] + m_ASICDeadTime[det]){ + m_ASICDeadTime[det] = 1e-6; m_LastHitTimeByDet[det] = evt_time; - m_TotalDeadTime[det] += m_CCDeadTime[det]; + m_TotalDeadTime[det] += m_ASICDeadTime[det]; } } } @@ -1190,10 +1496,10 @@ bool MDetectorEffectsEngineSMEX::GetNextEvent(MReadOutAssembly* Event) for (int det=0; det m_LastHitTimeByDet[det] + m_CCDeadTime[det]){ - m_CCDeadTime[det] = 1e-5; + if (evt_time > m_LastHitTimeByDet[det] + m_ASICDeadTime[det]){ + m_ASICDeadTime[det] = 1e-6; m_LastHitTimeByDet[det] = evt_time; - m_TotalDeadTime[det] += m_CCDeadTime[det]; + m_TotalDeadTime[det] += m_ASICDeadTime[det]; } } } @@ -1222,16 +1528,20 @@ bool MDetectorEffectsEngineSMEX::GetNextEvent(MReadOutAssembly* Event) T = SimEvent->GetTime().GetAsSeconds(); } */ + +// if (MergedStripHits.size() == 0){ +// cout<<"Nothing left before 6.5"< updateLastHitTime = vector(nDets,0); vector detIsDead = vector(nDets,0); for (int d=0; d evt_time && m_LastHitTimeByDet[d] evt_time && m_LastHitTimeByDet[d]SetDetectorID(Hit.m_ROE.GetDetectorID()); SH->SetStripID(Hit.m_ROE.GetStripID()); - SH->IsLowVoltageStrip(Hit.m_ROE.IsLowVoltageStrip()); + SH->IsXStrip(Hit.m_ROE.IsLowVoltageStrip()); SH->SetADCUnits(Hit.m_ADC); SH->SetTiming(Hit.m_Timing); SH->SetPreampTemp(20); @@ -1584,7 +1897,10 @@ bool MDetectorEffectsEngineSMEX::Finalize() for (int i=0; iFill(energy); @@ -1687,11 +2003,18 @@ double MDetectorEffectsEngineSMEX::NoiseShieldEnergy(double energy, MString shie //////////////////////////////////////////////////////////////////////////////// //! Calculate new summed energy of two strips affected by charge loss -vector MDetectorEffectsEngineSMEX::ApplyChargeLoss(double energy1, double energy2, int detID, int side, double depth1, double depth2){ - +vector MDetectorEffectsEngineSMEX::ApplyChargeLoss(double energy1, double energy2, int detID, int side, double depth1, double depth2) +{ + vector retEnergy; + if (energy1 == 0 && energy2 == 0) { + retEnergy.push_back(0); + retEnergy.push_back(0); + return retEnergy; + } + double trueSum = energy1+energy2; double diff = abs(energy1-energy2); - + //deal with depth //use average depth? or don't do charge loss if hits dont have the same depth? // double Depth = (depth1+depth2)/2.; @@ -1724,8 +2047,7 @@ vector MDetectorEffectsEngineSMEX::ApplyChargeLoss(double energy1, doubl newE2 = energy2 - sumDiff/2.; m_ChargeLossHist->Fill(trueSum,sumDiff); - - vector retEnergy; + // vector retEnergy; retEnergy.push_back(newE1); retEnergy.push_back(newE2); @@ -2158,3 +2480,4 @@ void MDetectorEffectsEngineSMEX::dummy_func(){ // MDummy.cxx: the end... //////////////////////////////////////////////////////////////////////////////// + diff --git a/src/MDetectorEffectsEngineSingleDet.cxx b/src/MDetectorEffectsEngineSingleDet.cxx new file mode 100644 index 00000000..c15b0a84 --- /dev/null +++ b/src/MDetectorEffectsEngineSingleDet.cxx @@ -0,0 +1,2727 @@ +/* + * MDetectorEffectEngineSingleDet.cxx + * + * + * Copyright (C) by Parshad Patel, Clio Sleator, Carolyn Kierans, Andreas Zoglauer. + * All rights reserved. + * + * + * This code implementation is the intellectual property of + * Andreas Zoglauer. + * + * By copying, distributing or modifying the Program (or any work + * based on the Program) you indicate your acceptance of this statement, + * and all its terms. + * + */ + + +//////////////////////////////////////////////////////////////////////////////// +// +// MDetectorEffectEngine +// +//////////////////////////////////////////////////////////////////////////////// + + +// Include the header: +#include "MDetectorEffectsEngineSingleDet.h" + +// Standard +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +using namespace std; + +// ROOT +#include +#include +#include +#include +#include + +// MEGAlib +#include "MGlobal.h" +#include "MStreams.h" +#include "MDGeometryQuest.h" +#include "MDDetector.h" +#include "MDStrip2D.h" +#include "MDVoxel3D.h" +#include "MFileEventsSim.h" +#include "MDVolumeSequence.h" +#include "MSimEvent.h" +#include "MSimHT.h" +#include "MReadOutElementDoubleStrip.h" + + +// based on MEGAlib library but created for Nuclearizer +#include "MReadOutElementVoxel3D.h" + +// Nuclearizer +#include "MDetectorEffectsEngineSingleDet.h" +#include "MDepthCalibrator.h" + + +//////////////////////////////////////////////////////////////////////////////// + + +#ifdef ___CLING___ +ClassImp(MDetectorEffectsEngineSingleDet) +#endif + + +//////////////////////////////////////////////////////////////////////////////// + + +//! Default constructor +MDetectorEffectsEngineSingleDet::MDetectorEffectsEngineSingleDet() +{ + m_Geometry = nullptr; + m_OwnGeometry = false; + m_ShowProgressBar = false; + m_SaveToFile = false; + m_ApplyFudgeFactor = true; +} + + +//////////////////////////////////////////////////////////////////////////////// + + +//! Default destructor +MDetectorEffectsEngineSingleDet::~MDetectorEffectsEngineSingleDet() +{ + // Intentionally left blank + + if (m_OwnGeometry == true) delete m_Geometry; +} + + +//////////////////////////////////////////////////////////////////////////////// + + + +//! Initialize the module +bool MDetectorEffectsEngineSingleDet::Initialize() +{ + m_Random.SetSeed(12345); + + // Load geometry: + if (m_Geometry == nullptr) { + if (m_GeometryFileName == "") { + cout<<"Error: Need a geometry file name!"<ScanSetupFile(m_GeometryFileName) == true) { + m_Geometry->ActivateNoising(false); + m_Geometry->SetGlobalFailureRate(0.0); + cout<<"m_Geometry "<GetName()<<" loaded!"<GetName()<<" - Aborting!"<::max(); + m_LastTime = 0; + + m_MaxBufferFullIndex = 0; + + m_DepthCalibrator = new MDepthCalibrator(); + if( m_DepthCalibrator->LoadCoeffsFile(m_DepthCalibrationCoeffsFileName) == false ){ + cout << "Unable to load depth calibration coefficients file - Aborting!" << endl; + return false; + } + + if( m_DepthCalibrator->LoadTACCalFile(m_DepthCalibrationTACCalFileName) == false){ + cout << "Unable to load TAC calibration file - Aborting!" << endl; + return false; + } + + if( m_DepthCalibrator->LoadSplinesFile(m_DepthCalibrationSplinesFileName) == false ){ + cout << "Unable to load depth calibration splines file - Aborting!" << endl; + return false; + } + + m_Reader = new MFileEventsSim(m_Geometry); + if (m_Reader->Open(m_SimulationFileName) == false) { + cout<<"Unable to open sim file "<ShowProgress(); + } + m_StartAreaFarField = m_Reader->GetSimulationStartAreaFarField(); + + m_NumberOfSimulatedEvents = 0; + + if (m_SaveToFile == true) { + cout << "Output File: " << m_RoaFileName << endl; + + m_Roa.open(m_RoaFileName); + m_Roa< ASICChannels, bool IsShield) { + // Return 0 if there are no channels + double deadtime = 0; + int countUnique = 0; + + if (ASICChannels.empty()) { + return 0.0; + } + + if (IsShield) { + unordered_set BGOChannelsSet; // Use a set to store unique channels automatically + // Loop through each channel ID in the sorted list + for (int ID : ASICChannels) { + BGOChannelsSet.insert(ID); + } + + // Count the number of unique channels read out (2 for each hit in the BGO) + countUnique = BGOChannelsSet.size()*2; + deadtime = m_ShieldDelayBefore + (m_ASICDeadTimePerChannel * countUnique) + m_ShieldDelayAfter; // adds in the deadtime per channel + if (deadtime < m_ShieldPulseDuration) { + deadtime = m_ShieldPulseDuration; + } + } + + else { + unordered_set ASICChannelsSet; // Use a set to store unique channels automatically + + // Sort ASICChannels to process channels in ascending order + sort(ASICChannels.begin(), ASICChannels.end()); + + // Loop through each channel ID in the sorted list + for (int ID : ASICChannels) { + + if (ID == 64) { + cout << "Strip ID is 64; should not happen" << endl; + continue; + } + else if (ID == 0 || ID == 32) { + // Edge case: If ID is 1 or 33, add the channel and the next channel (ID + 1) + ASICChannelsSet.insert(ID); + ASICChannelsSet.insert(ID + 1); + } + else if (ID == 31 || ID == 63) { + // Edge case: If ID is 32 or 64, add the previous channel (ID - 1) and the channel itself + ASICChannelsSet.insert(ID - 1); + ASICChannelsSet.insert(ID); + } + else { + // General case: Add the previous channel (ID - 1), the channel itself (ID), and the next channel (ID + 1) + ASICChannelsSet.insert(ID - 1); + ASICChannelsSet.insert(ID); + ASICChannelsSet.insert(ID + 1); + } + } + + // Count the number of unique channels read out + countUnique = ASICChannelsSet.size(); + + // Calculate the total deadtime based on unique channels + deadtime = m_StripCoincidenceWindow + (m_ASICDeadTimePerChannel * countUnique) + m_StripDelayAfter; // adds in the deadtime per channel + } + + return deadtime; +} +//////////////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////////////// +//! Helper function for getting count rate since nearest neighbor isn't implemented +bool MDetectorEffectsEngineSingleDet::CountRate(vector ASICChannels, vector CountTime, bool IsShield) { + // Return 0 if there are no channels + if (ASICChannels.empty()) { + return false; + } + + if (IsShield) { + unordered_set BGOChannelsSet; // Use a set to store unique channels automatically + // Loop through each channel ID in the sorted list + for (int ID : ASICChannels) { + BGOChannelsSet.insert(ID); + } + + } + + else { + unordered_set ASICChannelsSet; // Use a set to store unique channels automatically + vector CountTimeVec; + + + // Sort ASICChannels to process channels in ascending order + sort(ASICChannels.begin(), ASICChannels.end()); + + // Loop through each channel ID in the sorted list + // for (int ID : ASICChannels) { + for(size_t i=0; iGetNextEvent(false)) != nullptr) { + + // Always update the number of simulated events, since for that nu,ber it doesn't matter if the event passes or not + m_NumberOfSimulatedEvents = SimEvent->GetSimulationEventID(); + + if (SimEvent->GetNHTs() == 0) { + // cout<GetID()<<": No hits"<GetGalacticPointingXAxis() << endl; + // // cout << SimEvent->GetGalacticPointingZAxis() << endl; + + bool HasOverflow = false; + + double eventInitialEnergy = 0.; + for (unsigned int h=0; hGetNHTs(); h++){ + MSimHT* HT = SimEvent->GetHTAt(h); + eventInitialEnergy += HT->GetEnergy(); + } + + + // Step (0): Check whether events should be vetoed + double evt_time = SimEvent->GetTime().GetAsSeconds(); + + int ShieldDetNum = 0; + double energy = 0; + int ShieldDetGroup; + m_ShieldVeto = false; + + m_IsShieldDead = false; + + + // // This is where shield veto code will go ... + for (unsigned int h=0; hGetNHTs(); h++){ + MSimHT* HT = SimEvent->GetHTAt(h); + + MDVolumeSequence* VS = HT->GetVolumeSequence(); // VF: to remove? + MDDetector* Detector = VS->GetDetector(); // VF: to remove? + MString DetName = Detector->GetName(); // VF: to remove? + // cout << DetName << ": " << HT->GetDetectorType() << endl; + + if (HT->GetDetectorType() == 8) { + // cout << "Shield hit why?" << endl; + m_NumShieldHitCounts += 1; + MVector pos = HT->GetPosition(); + + MDVolumeSequence* VS = HT->GetVolumeSequence(); + MDDetector* Detector = VS->GetDetector(); + MString FullDetName = Detector->GetName(); + + MVector pos_in_detector = VS->GetPositionInDetector(); + + MDGridPoint P = VS->GetGridPoint(); + int voxelx_id = P.GetXGrid(); + int voxely_id = P.GetYGrid(); + int voxelz_id = P.GetZGrid(); + + MString DetName = Detector->GetName(); + DetName.RemoveAllInPlace("BGO_X0_"); // DetName is a string with the number of the detector + + ShieldDetNum = DetName.ToInt(); + //cout << "DetName: " << DetName << endl; + //cout << "ShieldDetNum: " << ShieldDetNum << endl; + ShieldDetNum = ShieldDetNum - 1; + energy = HT->GetOriginalEnergy(); // Original Energy: returns the original energy deposit before noising + + ShieldDetGroup = 0; // Detector panel with the hit + + double shield_corrected_centroid = NoiseShieldEnergyCentroid(energy, FullDetName, voxelx_id, voxely_id, voxelz_id); + double shield_FWHM_value = NoiseShieldEnergyFWHM(energy, FullDetName, voxelx_id, voxely_id, voxelz_id); + + double shield_sigma = shield_FWHM_value / 2.35; + double corrected_energy = m_Random.Gaus(shield_corrected_centroid, shield_sigma); + HT->SetEnergy(corrected_energy); + + // ENERGY REDISTRIBUTION + + if ((corrected_energy > m_ShieldThreshold)){ //"Shield" needs to change; In Carolyn's mass model this is BGO_Coinc_sideX_neg. Need to find a better naming scheme. + + bool found = false; + + // Traverse the 2D vector + for (size_t i = 0; i < m_ShieldPanelGroups.size(); ++i) { + for (size_t j = 0; j < m_ShieldPanelGroups[i].size(); ++j) { + if (m_ShieldPanelGroups[i][j] == ShieldDetNum) { + ShieldDetGroup = i; + found = true; + break; + } + } + if (found) break; // Exit loop once found + } + + if (m_ShieldLastHitTime[ShieldDetGroup] + m_ShieldDeadtime[ShieldDetGroup] < evt_time) { + // // Event occured after deadtime + + + for (int group=0; group evt_time) { + // Event occured within coincidence window so append all strip IDs + m_ShieldVetoTime = evt_time; + m_ShieldHitID[ShieldDetGroup].push_back(ShieldDetNum); + m_ShieldVeto = true; + } + + else if (m_ShieldLastHitTime[ShieldDetGroup] + m_ShieldDeadtime[ShieldDetGroup] > evt_time) { + // Event occured within deadtime + m_IsShieldDead = true; + m_NumBGOHitsErased += 1; + } + } + } + } + + + // for (int group=0; group IAs; + for (unsigned int i=0; iGetNIAs(); i++){ + MSimIA* ia = SimEvent->GetIAAt(i); + IAs.push_back(ia); + } + + // Step (0.5): Get aspect information + if (SimEvent->HasGalacticPointing()){ + Event->SetSimAspectInfo(true); + + double phi = SimEvent->GetGalacticPointingXAxis().Phi()*c_Deg; + if (phi < 0.0){ phi += 360; } + Event->SetGalacticPointingXAxisPhi(phi); + Event->SetGalacticPointingXAxisTheta(SimEvent->GetGalacticPointingXAxis().Theta()*c_Deg-90); + + phi = SimEvent->GetGalacticPointingZAxis().Phi()*c_Deg; + if (phi < 0.0){ phi += 360; } + Event->SetGalacticPointingZAxisPhi(phi); + Event->SetGalacticPointingZAxisTheta(SimEvent->GetGalacticPointingZAxis().Theta()*c_Deg-90); + } + + // Step (1): Convert positions into strip hits + list StripHits; + vector GuardRingHitsFromChargeSharing; + vector detectorsHitForShieldVeto(nDets,0); + + // (1a) The real strips + for (unsigned int h = 0; h < SimEvent->GetNHTs(); ++h) { + MSimHT* HT = SimEvent->GetHTAt(h); + + MDVolumeSequence* VS = HT->GetVolumeSequence(); + MDDetector* Detector = VS->GetDetector(); + MString DetectorName = Detector->GetName(); + + // This was used prior for the STTC mass model. I don't know how else to get the detector ID. + // if(!DetectorName.BeginsWith("D")){ + // continue; //probably a shield hit. this can happen if the veto flag is off for the shields + // } + + // Sets the detector ID for different hits. May need to change if there is a change in naming convention + // Hack for STTC and EM mass model (Only works with 1 GeD). + int DetectorID = 0; + if (HT->GetDetectorType() != 3){ + continue; //probably a shield hit. this can happen if the veto flag is off for the shields + } + if(DetectorName.BeginsWith("D")){ + DetectorName.RemoveAllInPlace("D"); + DetectorID = DetectorName.ToInt() - 1; + } + else if(DetectorName.BeginsWith("Q0D")){ + DetectorName.RemoveAllInPlace("Q0D"); + DetectorID = DetectorName.ToInt(); + } + else { + cout << "Massmodel not compatible with DEE or hit with wrong detector type" << endl; // This can be a GR hit for STTC + continue; + } + + + MDEEStripHit pSide; // Low voltage + MDEEStripHit nSide; // High voltage + + //should be unique identifiers + pSide.m_ID = h*10; + nSide.m_ID = h*10+5; + + pSide.m_OppositeStrip = nSide.m_ID; + nSide.m_OppositeStrip = pSide.m_ID; + + pSide.m_ROE.IsLowVoltageStrip(true); // Is this right?? Need to check + nSide.m_ROE.IsLowVoltageStrip(false); + + // Convert detector name in detector ID + pSide.m_ROE.SetDetectorID(DetectorID); + nSide.m_ROE.SetDetectorID(DetectorID); + detectorsHitForShieldVeto[DetectorID] = 1; + + // Convert position into + MVector PositionInDetector = VS->GetPositionInSensitiveVolume(); + MDGridPoint GP = Detector->GetGridPoint(PositionInDetector); + // double Depth_ = PositionInDetector.GetZ(); + // double Depth = -(PositionInDetector.GetZ() - (1.5/2.0)); // THIS NEEDS TO BE SET TO DEPTH CALIBRATER ONCE READY + // double Depth = -(Depth_ - (m_DepthCalibrator->GetThickness(DetectorID)/2.0)); // change the depth coordinates so that one side is 0.0 cm and the other side is ~1.5cm + double Depth = PositionInDetector.GetZ(); // Keeps the depth from -0.75cm to 0.75cm instead of going from 0cm to 1.5cm as we did for the balloon. + pSide.m_Depth = Depth; + nSide.m_Depth = Depth; + + // Not sure about if p or n-side is up, but we can debug this later + // Confirmed by Clio on 11/14/18: this is right + pSide.m_ROE.SetStripID(63-(GP.GetYGrid())); // Is this right? Or should it be 64? + nSide.m_ROE.SetStripID(63-(GP.GetXGrid())); // Is this right? Or should it be 64? + + // if (pSide.m_ROE.GetStripID()*100 + nSide.m_ROE.GetStripID() > 6400) { + // cout << pSide.m_ROE.GetStripID()*100 + nSide.m_ROE.GetStripID() << endl; + // } + +// This needs to be implemented once the depth calibration is implemented + //SetStripID needs to be called before we can look up the depth calibration coefficients + int PixelCode = DetectorID*10000 + pSide.m_ROE.GetStripID()*100 + nSide.m_ROE.GetStripID(); + vector* Coeffs = m_DepthCalibrator->GetPixelCoeffs(PixelCode); + if( Coeffs == NULL ){ + //pixel is not calibrated! discard this event.... + // cout << "pixel " << PixelCode << " has no depth calibration... discarding event" << endl; + //delete SimEvent; + continue; + } + + pSide.m_Timing = (Coeffs->at(0) * m_DepthCalibrator->GetCathodeSpline(DetectorID)->Eval(Depth)) + (Coeffs->at(1)/2.0); // The anode and cathode timing were not important for the balloon but they may be for SMEX due to TAC cuts. Making these arbitrary for now but can adjust later. + nSide.m_Timing = (Coeffs->at(0) * m_DepthCalibrator->GetAnodeSpline(DetectorID)->Eval(Depth)) - (Coeffs->at(1)/2.0); // Does this need to be negative or positive? + + // cout << "Anode: " << (Coeffs->at(0) * m_DepthCalibrator->GetAnodeSpline(DetectorID)->Eval(-0.759995024414062)) + (Coeffs->at(1)/2.0) << "; " << "Cathode: " << (Coeffs->at(0) * m_DepthCalibrator->GetCathodeSpline(DetectorID)->Eval(-0.759995024414062)) + (Coeffs->at(1)/2.0) << endl; + + pSide.m_Energy = HT->GetEnergy(); + nSide.m_Energy = HT->GetEnergy(); + +// //m_EnergyOrig will be unchanged: to see if event is incompletely absorbed or not + //(m_Energy is changed due to crosstalk and charge loss, etc) + pSide.m_EnergyOrig = HT->GetEnergy(); + nSide.m_EnergyOrig = HT->GetEnergy(); + + //hit index to keep track of which SimHT this strip hit came from + pSide.m_HitIndex = h; + nSide.m_HitIndex = h; + + MVector PosFromGP = GP.GetPosition(); + + pSide.m_Position = PositionInDetector; + nSide.m_Position = PositionInDetector; + + + // (1aa): charge sharing due to diffusion + + // Get the origins: these are the IA indices + // We have to do a bit of a convoluted assignment since different version of MEGAlib have different types (int vs. unsigned int) + auto HTOrigins = HT->GetOrigins(); + vector Origins(HTOrigins.begin(), HTOrigins.end()); + + pSide.m_Origins = list(Origins.begin(), Origins.end()); + nSide.m_Origins = list(Origins.begin(), Origins.end()); + + //group origins for this HT by position + // and figure out each energy is deposited at each position + MVector PrevPos(0,0,0); + vector > OriginsGroupedByPosition; + vector IAPositions; + vector EnergyDepositedByPosition; + vector temp_vec; + double energyDeposited = 0.; + double totalEnergyFromIAs = 0.; + + for (unsigned int o=0; oGetIAById(iaID); + MVector iaPosition = ia->GetPosition(); + if (PrevPos == iaPosition){ + temp_vec.push_back(Origins[o]); + energyDeposited += ia->GetSecondaryEnergy(); + } + else { + if (temp_vec.size() != 0){ + OriginsGroupedByPosition.push_back(temp_vec); + EnergyDepositedByPosition.push_back(energyDeposited); + totalEnergyFromIAs += energyDeposited; + } + temp_vec.clear(); + temp_vec.push_back(Origins[o]); + IAPositions.push_back(iaPosition); + energyDeposited = ia->GetSecondaryEnergy(); + } + PrevPos = iaPosition; + } + if (temp_vec.size() != 0){ + OriginsGroupedByPosition.push_back(temp_vec); + EnergyDepositedByPosition.push_back(energyDeposited); + totalEnergyFromIAs += energyDeposited; + } + + //scale energy deposited so that the sum of the energy deposits equals the HT energy + if (totalEnergyFromIAs != 0){ + for (unsigned int pos=0; posGetEnergy()/totalEnergyFromIAs); + } + } + + //initialize these variables before the for loop + map pStripsEnergies; + map nStripsEnergies; + + double totalEnergyDeposited = 0.; + + //then apply charge sharing for each POSITION + //the position could have one or more IAs + for (unsigned int pos=0; posGetVolumeSequence(IAPosition, false, false); + MVector IAPositionInDetector = IAVolSeq.GetPositionInSensitiveVolume(); + if (IAVolSeq.GetDetector() == 0 || IAVolSeq.GetSensitiveVolume() == 0){ + //if IA not in the detector, just use the HT position + IAPositionInDetector = PositionInDetector; + m_NumberOfFailedIASearches += 1; + } else { + m_NumberOfSuccessfulIASearches += 1; + } + + //now we have the energy deposited at this position + //that is enough information to do the diffusion + //do half-keV steps to avoid iterating over hundreds of thousands of charge carriers + // so this isn't really the number of charge carriers, but the number of steps + double EnergyPerChargeCarrier = 0.5; + int NChargeCarriers = (int)(energyDeposited/EnergyPerChargeCarrier); + //unless the deposited energy is perfectly divisible by 0.5, there will be some extra energy + // need to account for it or else there is extra charge loss + double ExtraEnergy = energyDeposited - NChargeCarriers*EnergyPerChargeCarrier; + + //figured out by printing out IAPositionInDetector.Z() for Am241 source: + // IAPositionInDetector.Z() < 0: closer to n side for *all* detector stacks + double DriftLengthN = IAPositionInDetector.Z() + Detector->GetStructuralSize().Z(); + double DriftLengthP = Detector->GetStructuralSize().Z()*2 - DriftLengthN; + if (DriftLengthN < 0){ DriftLengthN = 0; } + if (DriftLengthP < 0){ DriftLengthP = 0; } + + double factorN = m_ChargeSharingFactors[DetectorID][0]->Eval(energyDeposited); + double factorP = m_ChargeSharingFactors[DetectorID][1]->Eval(energyDeposited); + + double DriftRadiusSigmaN = m_DriftConstant[DetectorID]*sqrt(DriftLengthN)*factorN; // NEEDED FOR MULTIPLE DETS + double DriftRadiusSigmaP = m_DriftConstant[DetectorID]*sqrt(DriftLengthP)*factorP; // NEEDED FOR MULTIPLE DETS + + double DriftX = 0; + double DriftY = 0; + + double xDetectorHalfWidth = 0.5*dynamic_cast(Detector)->GetWidthX(); + double xDetectorOffset = dynamic_cast(Detector)->GetOffsetX(); + double xInvDetectorPitch = 1.0/dynamic_cast(Detector)->GetPitchX(); + + double yDetectorHalfWidth = 0.5*dynamic_cast(Detector)->GetWidthY(); + double yDetectorOffset = dynamic_cast(Detector)->GetOffsetY(); + double yInvDetectorPitch = 1.0/dynamic_cast(Detector)->GetPitchY(); + + double xInDet = IAPositionInDetector.X() + xDetectorHalfWidth - xDetectorOffset; + double yInDet = IAPositionInDetector.Y() + yDetectorHalfWidth - yDetectorOffset; + + int nStripID = 0; + int pStripID = 0; + + // ---> Time critical + for (int i = 0; i < NChargeCarriers + 1; ++i) { + //last iteration is for extra energy -- change EnergyPerChargeCarrier just for last iteration + if (i == NChargeCarriers) { + EnergyPerChargeCarrier = ExtraEnergy; + } + + + // First n side + // Draw random x and y from 2D gaussian with mean = 0, sigma = 1 + double y = m_Random.Rndm(); + double z = m_Random.Rndm(); + double x = z * 6.28318530717958623; + double r = sqrt(-2*log(y)); + DriftX = r * sin(x) * DriftRadiusSigmaN; + DriftY = r * cos(x) * DriftRadiusSigmaN; + + // We need both to know when we are in the guard ring + int nStripIDinterim = (int) floor((DriftX + xInDet)*xInvDetectorPitch); + int pStripIDinterim = (int) floor((DriftY + yInDet)*yInvDetectorPitch); + if (nStripIDinterim < 0 || nStripIDinterim > 62 || pStripIDinterim < 0 || pStripIDinterim > 62) { + nStripID = 64; + } else { + nStripID = 63 - nStripIDinterim; + } + + + + // Then p side + + y = m_Random.Rndm(); + z = m_Random.Rndm(); + x = z * 6.28318530717958623; + r = sqrt(-2*log(y)); + DriftX = r * sin(x) * DriftRadiusSigmaP; + DriftY = r * cos(x) * DriftRadiusSigmaP; + + nStripIDinterim = (int) floor((DriftX + xInDet)*xInvDetectorPitch); + pStripIDinterim = (int) floor((DriftY + yInDet)*yInvDetectorPitch); + if (nStripIDinterim < 0 || nStripIDinterim > 62 || pStripIDinterim < 0 || pStripIDinterim > 62) { + pStripID = 64; + } else { + pStripID = 63 - pStripIDinterim; + } + + + + // Save which strips have been hit + if (pStripsEnergies.count(pStripID) == 0){ + pStripsEnergies[pStripID] = 0.; + } + pStripsEnergies[pStripID] += EnergyPerChargeCarrier; + // cout << "P strip eng: " << pStripsEnergies[pStripID] << endl; + + if (nStripsEnergies.count(nStripID) == 0){ + // cout << "nStrip Energy set to 0" << endl; + nStripsEnergies[nStripID] = 0.; + } + nStripsEnergies[nStripID] += EnergyPerChargeCarrier; + // cout << "N strip eng: " << nStripsEnergies[nStripID] << endl; + } + // <--- Time critical + +// // // /* +// // // // Clio's original +// // // for (int i=0; iGetGridPoint(DriftPositionN); +// // // int nStripID; +// // // //if position isn't in detector (0) or is guard ring (7) assign as guard ring +// // // if (GPDriftN.GetType() == MDGridPoint::c_GuardRing || GPDriftN.GetType() == MDGridPoint::c_Unknown){ +// // // nStripID = 38; +// // // } +// // // else { nStripID = 38-(GPDriftN.GetXGrid()+1); } + +// // // //then p side +// // // m_Random.Rannor(DriftX,DriftY); +// // // DriftX *= DriftRadiusSigmaP; +// // // DriftY *= DriftRadiusSigmaP; + +// // // MVector DriftPositionP = IAPositionInDetector + MVector(DriftX, DriftY, 0); + +// // // MDGridPoint GPDriftP = Detector->GetGridPoint(DriftPositionP); +// // // int pStripID; +// // // if (GPDriftP.GetType() == MDGridPoint::c_GuardRing || GPDriftP.GetType() == MDGridPoint::c_Unknown){ +// // // pStripID = 38; +// // // } +// // // else { pStripID = 38-(GPDriftP.GetYGrid()+1); } + +// // // //save which strips have been hit +// // // if (pStripsEnergies.count(pStripID) == 0){ +// // // pStripsEnergies[pStripID] = 0.; +// // // } +// // // pStripsEnergies[pStripID] += EnergyPerChargeCarrier; + +// // // if (nStripsEnergies.count(nStripID) == 0){ +// // // nStripsEnergies[nStripID] = 0.; +// // // } +// // // nStripsEnergies[nStripID] += EnergyPerChargeCarrier; +// // // } +// // // */ + } + + //lists of strips that charge cloud hit: at least one must be original strip + //what if no charge is on the original strip? this happens occasionally + bool pOrigHit = false; + bool nOrigHit = false; + + for (auto P: pStripsEnergies) { + //change the energy of original strip + if (pSide.m_ROE.GetStripID() == P.first){ + pSide.m_Energy = P.second; + pSide.m_EnergyOrig = P.second; + + pOrigHit = true; + } + //make new strip hit if needed + //guard ring hit + else if (P.first == 64){ + MDEEStripHit chargeShareGRHit; + chargeShareGRHit.m_ROE.IsLowVoltageStrip(true); + chargeShareGRHit.m_ROE.SetDetectorID(pSide.m_ROE.GetDetectorID()); + chargeShareGRHit.m_ROE.SetStripID(64); + chargeShareGRHit.m_Energy = P.second; + chargeShareGRHit.m_Position = MVector(0,0,0); // apparently not important + GuardRingHitsFromChargeSharing.push_back(chargeShareGRHit); + } + //normal strip hit + else { + MDEEStripHit chargeShareStrip; + chargeShareStrip.m_ROE.IsLowVoltageStrip(true); + chargeShareStrip.m_ROE.SetStripID(P.first); + chargeShareStrip.m_ROE.SetDetectorID(pSide.m_ROE.GetDetectorID()); + chargeShareStrip.m_Timing = pSide.m_Timing; + chargeShareStrip.m_Energy = P.second; + chargeShareStrip.m_EnergyOrig = P.second; + chargeShareStrip.m_Depth = pSide.m_Depth; + chargeShareStrip.m_Position = pSide.m_Position; + chargeShareStrip.m_Origins = pSide.m_Origins; + chargeShareStrip.m_HitIndex = pSide.m_HitIndex; + StripHits.push_back(chargeShareStrip); + } + } + + for (auto N: nStripsEnergies){ + if (nSide.m_ROE.GetStripID() == N.first){ + nSide.m_Energy = N.second; + nSide.m_EnergyOrig = N.second; + nOrigHit = true; + } + else if (N.first == 64){ + MDEEStripHit chargeShareGRHit; + chargeShareGRHit.m_ROE.IsLowVoltageStrip(false); + chargeShareGRHit.m_ROE.SetDetectorID(nSide.m_ROE.GetDetectorID()); + chargeShareGRHit.m_ROE.SetStripID(64); + chargeShareGRHit.m_Energy = N.second; + chargeShareGRHit.m_Position = MVector(0,0,0); + GuardRingHitsFromChargeSharing.push_back(chargeShareGRHit); + } + else { + MDEEStripHit chargeShareStrip; + chargeShareStrip.m_ROE.IsLowVoltageStrip(false); + chargeShareStrip.m_ROE.SetStripID(N.first); + chargeShareStrip.m_ROE.SetDetectorID(nSide.m_ROE.GetDetectorID()); + chargeShareStrip.m_Timing = nSide.m_Timing; + chargeShareStrip.m_Energy = N.second; + chargeShareStrip.m_EnergyOrig = N.second; + chargeShareStrip.m_Depth = nSide.m_Depth; + chargeShareStrip.m_Position = nSide.m_Position; + chargeShareStrip.m_Origins = nSide.m_Origins; + chargeShareStrip.m_HitIndex = nSide.m_HitIndex; + StripHits.push_back(chargeShareStrip); + } + } + + if (pOrigHit){ StripHits.push_back(pSide); } + if (nOrigHit){ StripHits.push_back(nSide); } + + m_RawStripCounts++; + + } + + //delete event and update deadtime if the event was vetoed by the shields + //can't do this earlier because need to know which detectors got hit + // if (m_ShieldVeto){ + if (((m_ShieldVetoTime + m_ShieldVetoWindowSize) >= evt_time) && (evt_time >= m_ShieldVetoTime)) { + // cout << "In shields why?" << endl; + for (int det=0; detGetNHTs(); + delete SimEvent; + continue; + } + // } + // if (StripHits.size() != 0) { + // cout << "Number of strip hits: " << StripHits.size() << endl; + // } + list GuardRingHits; + // (1b) The guard ring hits + vector GRIndices; + // for (unsigned int h = 0; h < SimEvent->GetNGRs(); ++h) { + for (unsigned int h = 0; h < SimEvent->GetNHTs(); ++h) { + MSimHT* HT = SimEvent->GetHTAt(h); + if (HT->GetDetectorType() == 4) { + m_countGR += 1; + MSimHT* GR = SimEvent->GetHTAt(h); + // MSimGR* GR = SimEvent->GetGRAt(h); + MDVolumeSequence* VS = GR->GetVolumeSequence(); + MDDetector* Detector = VS->GetDetector(); + MString DetectorName = Detector->GetName(); + // Sets the detector ID for different hits. May need to change if there is a change in naming convention + // cout << DetectorName << endl; + // DetectorName.RemoveAllInPlace("D"); + // int DetectorID = DetectorName.ToInt()-1; + int DetectorID = 0; + + + MDEEStripHit GuardRingHitP; + GuardRingHitP.m_ROE.IsLowVoltageStrip(true); + GuardRingHitP.m_ROE.SetDetectorID(DetectorID); + GuardRingHitP.m_ROE.SetStripID(64); // ? + GuardRingHitP.m_Energy = GR->GetEnergy(); + GuardRingHitP.m_Position = MVector(0, 0, 0); // <-- not important + + MDEEStripHit GuardRingHitN; + GuardRingHitN.m_ROE.IsLowVoltageStrip(false); + GuardRingHitN.m_ROE.SetDetectorID(DetectorID); + GuardRingHitN.m_ROE.SetStripID(64); // ? + GuardRingHitN.m_Energy = GR->GetEnergy(); + GuardRingHitN.m_Position = MVector(0, 0, 0); // <-- not important + + //add extra energy from charge sharing to guard ring hits already present + for (unsigned int gr=0; gr MergedStripHits; + while (StripHits.size() > 0) { + MDEEStripHit Start; + Start.m_SubStripHits.push_back(StripHits.front()); + StripHits.pop_front(); + Start.m_ROE = Start.m_SubStripHits.front().m_ROE; + + // cout << "------" << endl; + // cout << Start.m_SubStripHits[0].m_Energy << '\t'; + // cout << Start.m_SubStripHits[0].m_OppositeStrip->m_Energy << endl; + + list::iterator i = StripHits.begin(); + while (i != StripHits.end()) { + if ((*i).m_ROE == Start.m_ROE) { + Start.m_SubStripHits.push_back(*i); + // cout << (*i).m_Energy << '\t'; + // cout << (*i).m_OppositeStrip->m_Energy << endl; + i = StripHits.erase(i); + } else { + ++i; + } + } + // cout << "-----------" << endl; + MergedStripHits.push_back(Start); + // cout << Start.m_ROE.GetStripID() << endl; + + // cout << "First Merged Strip: " << MergedStripHits.front().m_ROE.GetStripID() << endl; + + + } + + + // bool fromSameInteraction = true; + for (MDEEStripHit& Hit: MergedStripHits){ + int nIndep = 0; + int nSubHits = Hit.m_SubStripHits.size(); + if (nSubHits > 1){ + for (int i=0; iGetID() << '\t' << Hit.m_ROE.GetDetectorID() << '\t'<< nIndep << '\t' << nSubHits << '\t'; + //cout << Hit.m_SubStripHits.at(0).m_Energy << endl; + m_MultipleHitsCounter += nIndep; + } + } + + // cout << "-------------" << endl; + // Merge origins + for (MDEEStripHit& Hit: MergedStripHits) { + Hit.m_Origins.clear(); + for (MDEEStripHit& SubHit: Hit.m_SubStripHits) { + for (int& Origin: SubHit.m_Origins) { + Hit.m_Origins.push_back(Origin); + } + } + // cout << "Is Low voltage: " << Hit.m_ROE.IsLowVoltageStrip() << " Strip ID: " << Hit.m_ROE.GetStripID() << endl; + Hit.m_Origins.sort(); + Hit.m_Origins.unique(); + // if (Hit.m_ROE.GetStripID() == 64) { + // cout << "GR Hit in merged: " << Hit.m_ROE.GetStripID() << endl; + // } + } + + // cout << "Merged Srtips size: " << MergedStripHits.size() << endl; + + + + // Step (2): Calculate and noise timing. Need to update this to noise TAC values instead. + const double TimingNoise = 3.76; //ns//I have been assuming 12.5 ns FWHM on the CTD... so the 1 sigma error on the timing value should be (12.5/2.35)/sqrt(2) + for (MDEEStripHit& Hit: MergedStripHits) { + + //find lowest timing value + double LowestNoisedTiming = Hit.m_SubStripHits.front().m_Timing + m_Random.Gaus(0,TimingNoise); + for(size_t i = 1; i < Hit.m_SubStripHits.size(); ++i){ + double Timing = Hit.m_SubStripHits.at(i).m_Timing + m_Random.Gaus(0,TimingNoise); + //SubHit.m_Timing += m_Random.Gaus(0,TimingNoise); + if( Timing < LowestNoisedTiming ) LowestNoisedTiming = Timing; + } + LowestNoisedTiming -= fmod(LowestNoisedTiming,5.0); //round down to nearest multiple of 5 + Hit.m_Timing = LowestNoisedTiming; + + // Nanoseconds to TAC conversion coeffs. Should check if the p to LV correlation is correct. + if (Hit.m_ROE.IsLowVoltageStrip()) { + vector* LVTACCalCoeffs = m_DepthCalibrator->GetLVTACCal(Hit.m_ROE.GetDetectorID(), Hit.m_ROE.GetStripID()); + Hit.m_TAC = (Hit.m_Timing - LVTACCalCoeffs->at(1))/LVTACCalCoeffs->at(0); + } + else if (!Hit.m_ROE.IsLowVoltageStrip()) { + vector* HVTACCalCoeffs = m_DepthCalibrator->GetHVTACCal(Hit.m_ROE.GetDetectorID(), Hit.m_ROE.GetStripID()); + Hit.m_TAC = (Hit.m_Timing - HVTACCalCoeffs->at(1))/HVTACCalCoeffs->at(0); + } + // cout << "TAC value of hit: " << Hit.m_TAC << endl; + } + + // Step (3): Calculate and noise ADC values including cross talk, charge loss, charge sharing, ADC overflow! + + // (3a) Add energy of all subhits to get energy of each striphit + for (MDEEStripHit& Hit: MergedStripHits) { + double Energy = 0; + double EnergyOrig = 0; + for (MDEEStripHit SubHit: Hit.m_SubStripHits) { + Energy += SubHit.m_Energy; + EnergyOrig += SubHit.m_EnergyOrig; + } + + Hit.m_Energy = Energy; + Hit.m_EnergyOrig = EnergyOrig; + } + + +// // // (3b) Charge loss +// // list::iterator sh1, sh2; +// // for (sh1 = MergedStripHits.begin(); sh1 != MergedStripHits.end(); ++sh1){ +// // for (sh2 = sh1; sh2 != MergedStripHits.end(); ++sh2){ +// // if (sh1 == sh2){ continue; } + +// // //check if strip hits are adjacent +// // bool adjacent = false; +// // int stripID1 = (*sh1).m_ROE.GetStripID(); +// // int stripID2 = (*sh2).m_ROE.GetStripID(); +// // int detID1 = (*sh1).m_ROE.GetDetectorID(); +// // int detID2 = (*sh2).m_ROE.GetDetectorID(); +// // bool side1 = (*sh1).m_ROE.IsLowVoltageStrip(); +// // bool side2 = (*sh2).m_ROE.IsLowVoltageStrip(); +// // if (abs(stripID1-stripID2) == 1 && side1 == side2 && detID1 == detID2){ +// // adjacent = true; +// // } + +// // //if adjacent, check if strip hits share origins +// // bool sharedOrigin = false; +// // if (adjacent){ +// // for (int o1: (*sh1).m_Origins){ +// // for (int o2: (*sh2).m_Origins){ +// // if (o1 == o2){ +// // sharedOrigin = true; +// // break; +// // } +// // } +// // } +// // } + +// // //if shared origin and adjacent, apply charge loss effect -- only on p side +// // if (adjacent && sharedOrigin){ +// // double energy1 = (*sh1).m_Energy; +// // double energy2 = (*sh2).m_Energy; +// // double depth1 = (*sh1).m_Depth; +// // double depth2 = (*sh2).m_Depth; +// // if (side1 && depth1 == depth2){ +// // vector newEnergies = ApplyChargeLoss(energy1,energy2,detID1,0,depth1,depth2); +// // (*sh1).m_Energy = newEnergies.at(0); +// // (*sh2).m_Energy = newEnergies.at(1); +// // } +// // } + +// // } +// // } + + +// // // (3c) Cross talk + +// // //Identify hits that need crosstalk +// // double sim_arr[MergedStripHits.size()][5]; +// // list::iterator i = MergedStripHits.begin(); +// // int i2 = 0; +// // while (i != MergedStripHits.end()) { +// // int sdet = (*i).m_ROE.GetDetectorID(); +// // bool bside = (*i).m_ROE.IsLowVoltageStrip(); +// // int sside = 0; +// // if (bside == true) {sside = 1;} +// // int sstrip = (*i).m_ROE.GetStripID(); +// // double senergy = (*i).m_Energy; + +// // sim_arr[i2][0] = i2; +// // sim_arr[i2][1] = sdet; +// // sim_arr[i2][2] = sside; +// // sim_arr[i2][3] = sstrip; +// // sim_arr[i2][4] = senergy; + +// // ++i; +// // ++i2; +// // } + +// // //Add cross talk energy to chosen strips +// // //E_sim = M^-1(E_real+C) <- cross talk correction +// // //E_real = (E_sim*M)-C <- adding cross talk +// // //CCS 190408: changing sim_energies, matrix, and constant from arrays to vectors +// // // old way didn't compile on mac os +// // vector sim_energies = vector(MergedStripHits.size()); +// // vector > matrix = vector >(MergedStripHits.size(), vector (MergedStripHits.size())); +// // vector constant = vector(MergedStripHits.size()); + +// // for (unsigned int i=0; i real_energies = vector(MergedStripHits.size()); +// // for (unsigned int i=0; i::iterator l = MergedStripHits.begin(); +// // int l2 = 0; +// // while (l != MergedStripHits.end()) { +// // (*l).m_Energy = real_energies[l2]; + +// // ++l; +// // ++l2; +// // } + + + // (3d) Give each striphit an noised ADC value; handle ADC overflow + list::iterator A = MergedStripHits.begin(); + while (A != MergedStripHits.end()) { + double Energy = (*A).m_Energy; + (*A).m_ADC = EnergyToADC((*A),Energy); + if ((*A).m_ADC > 8029){ // number for McBride, I don't know what this number is + A = MergedStripHits.erase(A); + HasOverflow = true; + } + else { + ++A; + } + } + + + // Step (4): Apply thresholds and triggers including guard ring hits + // * use the trigger threshold calibration and invert it here + // * take care of guard ring hits with their special thresholds + // * take care of hits in dead strips + // * throw out hits which did not trigger + +// // (4a) Take care of dead strips: +// list::iterator j = MergedStripHits.begin(); +// while (j != MergedStripHits.end()) { +// int det = (*j).m_ROE.GetDetectorID(); +// int stripID = (*j).m_ROE.GetStripID(); +// bool side_b = (*j).m_ROE.IsLowVoltageStrip(); +// int side = 0; +// if (side_b) {side = 1;} + +// //if strip has been flagged as dead, erase strip hit +// if (m_DeadStrips[det][side][stripID-1] == 1){ +// j = MergedStripHits.erase(j); +// } +// else { +// ++j; +// } +// } + + + // (4b) Handle trigger thresholds make sure we throw out timing too! + list::iterator k = MergedStripHits.begin(); + while (k != MergedStripHits.end()) { + //so that we can use default value if necessary + MReadOutElementDoubleStrip ROE_map_key = (*k).m_ROE; + if (m_LLDThresholds.count((*k).m_ROE) == 0){ + ROE_map_key.SetDetectorID(12); + ROE_map_key.SetStripID(0); + ROE_map_key.IsLowVoltageStrip(0); + } + + if ((*k).m_ADC < m_LLDThresholds[ROE_map_key]) { + k = MergedStripHits.erase(k); + } else { + double prob = m_Random.Rndm(); + if (prob > m_FSTThresholds[ROE_map_key]->Eval((*k).m_ADC)){ + // cout << "timing is thrown out" << endl; + (*k).m_Timing = 0.0; + } + ++k; + } + } + + + + // (4c) Take care of guard ring vetoes + list::iterator gr = GuardRingHits.begin(); + vector grHit = vector(nDets,0); + while (gr != GuardRingHits.end()) { + if ((*gr).m_Energy > m_GuardRingThresholds[(*gr).m_ROE]){ // Need an updated file + int detID = (*gr).m_ROE.GetDetectorID(); + grHit[detID] = 1; + } + ++gr; + } + list::iterator grVeto = MergedStripHits.begin(); + while (grVeto != MergedStripHits.end()){ + int detID = (*grVeto).m_ROE.GetDetectorID(); + if (grHit[detID] == 1){ + grVeto = MergedStripHits.erase(grVeto); + } + else{ ++grVeto; } + } + //update dead time stuff if the hit is vetoed by the guard ring + for (int det=0; det evt_time && m_ASICLastHitTime::iterator i = MergedStripHits.begin(); + int ASICofDet = 5; + + while (i != MergedStripHits.end()) { + // go through each merged strip hit list and add strip ids to a list of strips that are read out in parallel. + m_TotalStripHitsCounter++; + det = (*i).m_ROE.GetDetectorID(); + ASICofDet = 5; + + if ((*i).m_ROE.GetStripID() == 64) { + cout << "Strip is 64; should not happen." << endl; + continue; + } + else if ((*i).m_ROE.IsLowVoltageStrip() && (*i).m_ROE.GetStripID() <= 31 && (*i).m_ROE.GetStripID() >= 0) { + ASICofDet = 0; + } + else if ((*i).m_ROE.IsLowVoltageStrip() && (*i).m_ROE.GetStripID() <= 63 && (*i).m_ROE.GetStripID() >= 32) { + ASICofDet = 1; + } + else if ((!(*i).m_ROE.IsLowVoltageStrip()) && (*i).m_ROE.GetStripID() <= 31 && (*i).m_ROE.GetStripID() >= 0) { + ASICofDet = 2; + } + else if ((!(*i).m_ROE.IsLowVoltageStrip()) && (*i).m_ROE.GetStripID() <= 63 && (*i).m_ROE.GetStripID() >= 32) { + ASICofDet = 3; + } + else { + cout << "Strip not associated, something went wrong in assigning strip ID" << endl; + continue; + } + + if (m_ASICLastHitTime + m_StripsCurrentDeadtime < evt_time) { + // Event occured after deadtime + + // clear the original lists + for (int det=0; det evt_time) { + // Event occured within coincidence window so append all strip IDs + m_ASICHitStripID[det][ASICofDet].push_back((*i).m_ROE.GetStripID()); + m_ASICHitStripID_noDT[det][ASICofDet].push_back((*i).m_ROE.GetStripID()); + m_TempEvtTimes[det][ASICofDet].push_back(evt_time); + } + + else if (m_ASICLastHitTime + m_StripsCurrentDeadtime > evt_time) { + // Event occured within deadtime + m_ASICHitStripID_noDT[det][ASICofDet].push_back((*i).m_ROE.GetStripID()); // remove for deadtime hits + m_TempEvtTimes[det][ASICofDet].push_back(evt_time); // remove for deadtime hits + IsGeDDead = true; + m_StripHitsErased += 1; + i = MergedStripHits.erase(i); + } + + ++i; + } + + if (ASICFirstHitAfterDead) { + m_StripsTotalDeadtime += m_StripsCurrentDeadtime; // add ASIC deadtime number to total detector deadtime + m_StripsCurrentDeadtime = 0.0; + } + + for (int det=0; det m_StripsCurrentDeadtime) { + m_StripsCurrentDeadtime = m_ASICDeadTime[det][ASIC]; + } + } + } + } + // End Deadtime implementation + + + // Step (5.5): Make sure there is at least one strip left on each side of each detector + // If not, remove remaining strip(s) from detector because they won't trigger detector + // Don't add to deadtime since its already accounted for + vector xExists = vector(nDets,0); + vector yExists = vector(nDets,0); + + //look for (at least) one strip on each side + list::iterator tr = MergedStripHits.begin(); + while (tr != MergedStripHits.end()) { + int DetID = (*tr).m_ROE.GetDetectorID(); + // if ((*tr).m_Timing != 0){ + if ((*tr).m_ROE.IsLowVoltageStrip()){ xExists[DetID] = 1; } + else if (!(*tr).m_ROE.IsLowVoltageStrip()){ yExists[DetID] = 1; } + // } + ++tr; + } + + //remove hits that won't trigger detector + tr = MergedStripHits.begin(); + while (tr != MergedStripHits.end()) { + int DetID = (*tr).m_ROE.GetDetectorID(); + if ( xExists[DetID] == 0 || yExists[DetID] == 0){ + tr = MergedStripHits.erase(tr); + } + else{ ++tr;} + } + + // // Step (5.75): + // //figure out if dead time buffers are full, and update them accordingly + // double empty_buffer_val = -1; + // double time_buffer_empty = .000625; + + // //increase buffer times if necessary + // for (int d=0; d= time_buffer_empty){ + // m_DeadTimeBuffer[d][s] = empty_buffer_val; + // } + // //otherwise, find index of largest buffer slot and increase ONLY that slot + // else { + // if (m_DeadTimeBuffer[d][s] > maxTime){ + // maxTime = m_DeadTimeBuffer[d][s]; + // indexOfLargest = s; + // } + // } + // } + // } + // if (indexOfLargest != -1){ m_DeadTimeBuffer[d][indexOfLargest] += evt_time-m_LastHitTime; } + // } + + + // //figure out which detectors were hit + // vector bufferFull = vector(nDets,0); + + // //check if buffer is full for each detector + // for (int d=0; d m_MaxBufferFullIndex){ m_MaxBufferFullIndex = bufferFull[i]; m_MaxBufferDetector = i; } + // } + + +// // /* if (bufferFull[0] == 16){ +// // * cout << "************" << endl; +// // * cout << "evt_time: " << evt_time << '\t' << "last time: " << m_LastHitTime << endl; +// // * cout << "Buffer values: " << endl; +// // * for (int i=0; i<16; i++){ +// // * cout << m_DeadTimeBuffer[0][i] << '\t'; +// // } +// // cout << endl; + +// // cout << "next empty slot: " << bufferFull[0] << endl; +// // } +// // */ +// // //erase strip hits in detectors when buffer is full +// // list::iterator DH = MergedStripHits.begin(); +// // while (DH != MergedStripHits.end()) { +// // int DetID = (*DH).m_ROE.GetDetectorID(); +// // if (bufferFull[DetID] == 16){ +// // DH = MergedStripHits.erase(DH); +// // } +// // else { +// // m_DeadTimeBuffer[DetID][bufferFull[DetID]] = 0; +// // ++DH; +// // } +// // } + +// // //update LastHitTime +// // m_LastHitTime = evt_time; + + + + // Step (6): + + //update trigger rates + // Currently only adds once per MergedStripHit ... + set detectorsHit; + list::iterator TR = MergedStripHits.begin(); + while (TR != MergedStripHits.end()) { + int DetID = (*TR).m_ROE.GetDetectorID(); + detectorsHit.insert(DetID); + ++TR; + } + + for (set::iterator s=detectorsHit.begin(); s!=detectorsHit.end(); ++s){ + // TestCounter += 1; + int detID = *s; + m_TriggerRates[detID] += 1; + } + + //update last time (and first time for first event) + if (SimEvent->GetTime().GetAsSeconds() < m_FirstTime){ + m_FirstTime = SimEvent->GetTime().GetAsSeconds(); + } + m_LastTime = SimEvent->GetTime().GetAsSeconds(); + + // Step (7): Apply fudge factor to completely absorbed events (photopeak) + //to deal with successor stuff, need to do this for each SimHT + //but same origin can make multiple SimHTs, so have to add them back together + if (m_ApplyFudgeFactor){ + /* +// // // Clio's version +// // map initialEnergyByIA; +// // map finalEnergyByIA; +// // map > HitIndexByIA; + +// // for (unsigned int h=0; hGetNHTs(); h++){ +// // MSimHT* Hit = SimEvent->GetHTAt(h); +// // int initIA = Hit->GetSmallestOrigin(); +// // //again I have this problem if the IAs aren't in the sim +// // if (initIA == 0){ initIA++; } +// // MString IAprocess = SimEvent->GetIAById(initIA)->GetProcess(); +// // while (IAprocess != "INIT"){ +// // initIA = SimEvent->GetIAById(initIA)->GetOriginID(); +// // IAprocess = SimEvent->GetIAById(initIA)->GetProcess(); +// // } + +// // double initialEnergy = SimEvent->GetIAById(initIA)->GetSecondaryEnergy(); +// // double finalEnergy = 0.0; +// // for (list::iterator p=MergedStripHits.begin(); p!=MergedStripHits.end(); ++p){ +// // if ((*p).m_ROE.IsLowVoltageStrip() == false && (*p).m_HitIndex == h){ +// // finalEnergy += (*p).m_EnergyOrig; +// // } +// // } + +// // initialEnergyByIA[initIA] = initialEnergy; +// // finalEnergyByIA[initIA] += finalEnergy; +// // HitIndexByIA[initIA].push_back(h); +// // } + +// // //now that we have initial and final energy for each INIT IA, +// // // figure out if IA was completely absorbed or not +// // map eraseHit; +// // for (auto i: initialEnergyByIA){ +// // double initialEnergy = i.second; +// // double finalEnergy = finalEnergyByIA[i.first]; + +// // double sigma = 8.35e-4*initialEnergy+1.69; +// // double windowSize = 1.5*sigma; +// // double threshold = 7.04e-5*initialEnergy+0.79; + +// // if (finalEnergy > initialEnergy-windowSize && finalEnergy < initialEnergy+windowSize){ +// // double prob = m_Random.Rndm(); +// // if (prob > threshold){ +// // eraseHit[i.first] = true; +// // } +// // else { eraseHit[i.first] = false; } +// // } +// // } +// // //erase strip hits from IAs where probability was above the threshold +// // for (auto i: eraseHit){ +// // if (i.second == true){ +// // list::iterator p = MergedStripHits.begin(); +// // while (p != MergedStripHits.end()){ +// // bool eraseP = false; +// // for (unsigned int j=0; j::iterator p = MergedStripHits.begin(); p != MergedStripHits.end(); ++p){ + if ((*p).m_ROE.IsLowVoltageStrip() == false) { + TotalMeasuredEnergy += (*p).m_EnergyOrig; + } + } + + // Now check every INIT if the energy is withing the window: + for (unsigned int ia = 0; ia < SimEvent->GetNIAs(); ++ia) { + + double initialEnergy = SimEvent->GetIAAt(0)->GetSecondaryEnergy(); + + // Clio's + double sigma = 8.35e-4*initialEnergy+1.69; + double windowSize = 1.5*sigma; + double threshold = 7.04e-5*initialEnergy+0.79; + + //cout<<"Measued: "< initialEnergy-windowSize && TotalMeasuredEnergy < initialEnergy+windowSize) { + //cout<<" In photo peak "< threshold){ + MergedStripHits.clear(); + } + + break; + //} else { + //cout<<"Not in photo peak"< eventInitialEnergy+100){ + cout << eventInitialEnergy << '\t' << finalEventEnergy << endl; + cout << "SIM HITS: " << endl; + for (unsigned int h=0; hGetNHTs(); h++){ + cout << SimEvent->GetHTAt(h)->GetEnergy() << endl; + } + cout << "DEE STRIP HITS: " << endl; + for (MDEEStripHit Hit: MergedStripHits){ + if (!Hit.m_ROE.IsLowVoltageStrip()){ + cout << Hit.m_Energy << endl; + } + } + cout << endl << endl; + } + + + // (1) Move the information to the read-out-assembly + Event->SetID(SimEvent->GetID()); + Event->SetTimeUTC(SimEvent->GetTime()); + + for (unsigned int i = 0; i < IAs.size(); ++i) { + Event->AddSimIA(*IAs[i]); + } + for (MDEEStripHit Hit: MergedStripHits){ + MStripHit* SH = new MStripHit(); + SH->SetDetectorID(Hit.m_ROE.GetDetectorID()); + SH->SetStripID(Hit.m_ROE.GetStripID()); + SH->IsXStrip(Hit.m_ROE.IsLowVoltageStrip()); + // cout << "setting ADC units: " << Hit.m_ADC << endl; + SH->SetADCUnits(Hit.m_ADC); + // SH->SetTiming(Hit.m_Timing); + SH->SetTAC(Hit.m_TAC); + // cout << Hit.m_Timing << endl; + SH->SetPreampTemp(20); + vector O; + for (int i: Hit.m_Origins) O.push_back(i); + SH->AddOrigins(O); + Event->AddStripHit(SH); + } + + // (2) Dump event to file in ROA format + if (m_SaveToFile == true) { + m_Roa<<"SE"<GetID()<GetTime() << endl; + for (unsigned int i = 0; i < IAs.size(); ++i) { + m_Roa<ToSimString()<Draw(); + // specCanvas.Print("spectrum_adc.pdf"); + + return false; +} + +//////////////////////////////////////////////////////////////////////////////// + + +//! Finalize the module +bool MDetectorEffectsEngineSingleDet::Finalize() +{ + cout << "###################" << endl << "DEE STATISTICS" << endl << "###################" << endl; + + cout << "###################" << endl << "Shields" << endl << "###################" << endl; + cout << "Time of simulation: " << m_LastTime-m_FirstTime << endl; + cout << "Total BGO hits before BGO deadtime: " << m_NumShieldHitCounts << endl; + for(int i=0; i 0 ? double(m_NumberOfEventsWithADCOverflows) / (m_NumberOfEventsWithADCOverflows + m_NumberOfEventsWithNoADCOverflows): 0)< 0 ? double(m_NumberOfFailedIASearches) / (m_NumberOfFailedIASearches + m_NumberOfSuccessfulIASearches): 0)<Fill(dT); + // } + // } + + // hist->SetTitle("Time between events (s) vs Counts"); + // hist->GetXaxis()->SetTitle("Time between events (s)"); + // hist->GetYaxis()->SetTitle("Counts"); + + // hist->Draw(); + // canvas2->Draw(); + // // // canvas->SaveAs("/Users/parshad/Software/canvas.png"); + // // // End Plot + + // // Plots a ADC vs Energy of all hits + // TCanvas *canvas = new TCanvas("c1", "My Canvas", 800, 600); + // TGraph *EngADC = new TGraph(m_EventStripADC.size(), m_EventStripEnergy.data(), m_EventStripADC.data()); + + // EngADC->SetTitle("Energy vs ADC;Energy;ADC"); + // EngADC->SetMarkerStyle(3); // Example of setting marker style + // EngADC->Draw("AL"); // Draw with line and points + // canvas->Draw(); + // // End Plot + + // // Saves to csv ... Disable if not needed + // ofstream file("/Users/parshad/Software/Nuclearizer_outputs/UnitL_Deadtime/Extracted/Am241_STTC_L0+35Y_10s_97p9_noGRVeto_ActiveNN.csv"); + // file << "Index, Strip ID, Times\n"; + // for (int i = 0; iGetTokenAtAsDouble(0); + m_ASICDeadTimePerChannelFromFile = Parser.GetTokenizerAt(1)->GetTokenAtAsDouble(1); + m_StripDelayAfter1FromFile = Parser.GetTokenizerAt(1)->GetTokenAtAsDouble(2); + m_StripDelayAfter2FromFile = Parser.GetTokenizerAt(1)->GetTokenAtAsDouble(3); + + return true; + +} + +// +//////////////////////////////////////////////////////////////////////////////// + + +//! Convert energy to ADC value by reversing energy calibration done in +//! MModuleEnergyCalibrationUniversal.cxx +int MDetectorEffectsEngineSingleDet::EnergyToADC(MDEEStripHit& Hit, double mean_energy) +{ + //first, need to simulate energy spread + //static TRandom3 r(0); + TF1* FitRes = m_ResolutionCalibration[Hit.m_ROE]; + //resolution is a function of energy + double EnergyResolutionFWHM = 3; //default to 3keV...does this make sense? + if (FitRes != 0){ + EnergyResolutionFWHM = FitRes->Eval(mean_energy); + //cout<<"Energy Res: "<Fill(energy); + + // if (fabs(mean_energy-662.) < 5){ + // cout << mean_energy << '\t' << EnergyResolution << '\t' << energy << endl; + // } + + //then, convert energy to ADC + double ADC_double = 0; + + //get the fit function + TF1* Fit = m_EnergyCalibration[Hit.m_ROE]; + // if (Fit == 0) { + // cout << "Is low voltage: " << Hit.m_ROE.IsLowVoltageStrip() << " Energy: " << energy << "; Strip ID: " <= MaxEnergy || energy > Fit->GetMaximum(0, 8191)) { + //cout<<"Info: Setting AD units to max (8191): E="<GetMinimum(0, 8191)<GetX(energy, 0., MaxEnergy); + //cout<<"energy:"<second; + + FWHM_value = gauss_fwhm->Eval(energy); // E_true in keV + // cout << "FWHM at E_true = " << energy << " keV → FWHM = " << FWHM_value << " keV" << endl; + } else { + cout << "WARNING: FWHM correction not found for voxel " << detname << " (" << voxelx_id << "," << voxely_id << "," << voxelz_id << ")" << endl; + } + + + return FWHM_value; + +} +//////////////////////////////////////////////////////////////////////////////// + +// //! Calculate new summed energy of two strips affected by charge loss +// vector MDetectorEffectsEngineSingleDet::ApplyChargeLoss(double energy1, double energy2, int detID, int side, double depth1, double depth2){ + + // double trueSum = energy1+energy2; + // double diff = abs(energy1-energy2); + + // //deal with depth + // //use average depth? or don't do charge loss if hits dont have the same depth? + // // double Depth = (depth1+depth2)/2.; + // TH1D DepthBins("DB","",3,0,1.5); + // int depthBin = DepthBins.GetXaxis()->FindBin(depth1)-1; + + // //B = A0 + A1*E + // double A0 = m_ChargeLossCoefficients[detID][side][depthBin][0]; + // double A1 = m_ChargeLossCoefficients[detID][side][depthBin][1]; + // double B = A0 + A1*trueSum; + + // //try the Dmax thing + // // double Dmax = trueSum*(trueSum-511./2)/(trueSum+511./2); + // // if (diff < Dmax){ B = 0; } + // if (B < 0){ B = 0; } + + // //get new sum + // double newSum; + // if (trueSum >= 300){ + // newSum = trueSum - B*(trueSum - diff); + // } + // else { + // newSum = trueSum - (B/(2*trueSum))*(pow(trueSum,2) - pow(diff,2)); + // } + + // //get new strip hit energies: subtract same amount from energy1 and energy2 + // double sumDiff = trueSum - newSum; + // double newE1, newE2; + // newE1 = energy1 - sumDiff/2.; + // newE2 = energy2 - sumDiff/2.; + + // m_ChargeLossHist->Fill(trueSum,sumDiff); + + // vector retEnergy; + + // retEnergy.push_back(newE1); + // retEnergy.push_back(newE2); + + // return retEnergy; + +// } + +//////////////////////////////////////////////////////////////////////////////// + +// //! Calculate new summed energy of two strips affected by charge loss +// bool MDetectorEffectsEngineSingleDet::InitializeChargeLoss() +// { + + // //coefficients[energy][detector][side][depth] + // vector > > > coefficients(4, vector > > (nDets, vector > (nSides, vector (3)))); + + // MFile File; + // if (File.Open(m_ChargeLossFileName) == false){ + // cout << "Unable to open file: " << m_ChargeLossFileName << endl; + // return false; + // } + + // MTokenizer Tokenizer; + // MString Line; + + // vector energies{122,356,662,1333}; + + // while (File.ReadLine(Line) == true){ + // Tokenizer.Analyze(Line); + // //sometimes somehow I read an empty string + // if (Line.AreIdentical("")){ continue; } + + // double energy = Tokenizer.GetTokenAtAsDouble(0); + // int det = Tokenizer.GetTokenAtAsInt(1); + // int side = Tokenizer.GetTokenAtAsInt(2); + // int depthBin = Tokenizer.GetTokenAtAsInt(3)-1; + // double B = Tokenizer.GetTokenAtAsDouble(5); + + // int energyIndex = 0; + // for (unsigned int i=0; iFit("f","RQ"); + + // A0 = f->GetParameter(0); + // A1 = f->GetParameter(1); + + // m_ChargeLossCoefficients[det][side][depthBin][0] = A0; + // m_ChargeLossCoefficients[det][side][depthBin][1] = A1; + + // delete g; + // delete f; + // } + // } + // } + +// return true; +// } + + +///////////////////////////////////////////////////////////////////////////////// +//! Read in charge sharing factors +bool MDetectorEffectsEngineSingleDet::ParseChargeSharingFile() +{ + + MParser Parser; + if (Parser.Open(m_ChargeSharingFileName) == false){ + cout << "Unable to open charge sharing file" << endl; + return false; + } + + for (unsigned int i=0; iGetTokenAtAsInt(0); + int side = Parser.GetTokenizerAt(i)->GetTokenAtAsInt(1); + double slope = Parser.GetTokenizerAt(i)->GetTokenAtAsDouble(2); + double yInt = Parser.GetTokenizerAt(i)->GetTokenAtAsDouble(3); + + TF1 *f = new TF1(MString(det)+"_"+MString(side),"[0]*x+[1]",0,2000); + f->SetParameter(0,slope); + f->SetParameter(1,yInt); + + m_ChargeSharingFactors[det][side] = f; + + } + + return true; + +} + +/////////////////////////////////////////////////////////////////////////////// + +// //! Read in crosstalk coefficients +// bool MDetectorEffectsEngineSingleDet::ParseCrosstalkFile() +// { + + // MParser Parser; + // if (Parser.Open(m_CrosstalkFileName, MFile::c_Read) == false) { + // cout << "Unable to open crosstalk file " << m_CrosstalkFileName << endl; + // return false; + // } + + // for (unsigned int i=2; i<50; i++){ + // int cdet = Parser.GetTokenizerAt(i)->GetTokenAtAsDouble(0); + // int cside = Parser.GetTokenizerAt(i)->GetTokenAtAsDouble(1); + // int cskip = Parser.GetTokenizerAt(i)->GetTokenAtAsDouble(2); + // double ca = Parser.GetTokenizerAt(i)->GetTokenAtAsDouble(3); + // double cb = Parser.GetTokenizerAt(i)->GetTokenAtAsDouble(4); + // m_CrosstalkCoefficients[cdet][cside][cskip][0] = ca; + // m_CrosstalkCoefficients[cdet][cside][cskip][1] = cb; + // } + +// return true; + +// } + +//////////////////////////////////////////////////////////////////////////////// + +//! Read in guard ring thresholds +bool MDetectorEffectsEngineSingleDet::ParseGuardRingThresholdFile() +{ + + MParser Parser; + if (Parser.Open(m_GuardRingThresholdFileName, MFile::c_Read) == false) { + cout << "Unable to open guard ring threshold file " << m_GuardRingThresholdFileName << endl; + return false; + } + + for (unsigned int i=2; i<26; i++){ + int detector = Parser.GetTokenizerAt(i)->GetTokenAtAsInt(0); + int side = Parser.GetTokenizerAt(i)->GetTokenAtAsInt(1); + double threshold = Parser.GetTokenizerAt(i)->GetTokenAtAsDouble(2); + + MReadOutElementDoubleStrip R; + R.SetDetectorID(detector); + R.SetStripID(64); + R.IsLowVoltageStrip(side); + + m_GuardRingThresholds[R] = threshold; + } + + return true; + +} + +//////////////////////////////////////////////////////////////////////////////// + +//! Read in thresholds +bool MDetectorEffectsEngineSingleDet::ParseThresholdFile() +{ + MParser Parser; + if (Parser.Open(m_ThresholdFileName, MFile::c_Read) == false) { + cout << "Unable to open threshold file " << m_ThresholdFileName << endl; + return false; + } + + //vectors for averaging, for strips where there isn't threshold info for some reason + vector lldVals; + vector functionMaxVals; + vector par0Vals; + vector par1Vals; + vector par2Vals; + vector par3Vals; + + for (unsigned int i=0; iGetNTokens(); + if (NTokens != 7){ continue; } //this shouldn't happen but just in case + + //decode identifier + int identifier = Parser.GetTokenizerAt(i)->GetTokenAtAsInt(0); + int det = identifier / 1000; + int strip = (identifier % 1000) / 10; + bool isPos = identifier % 10; + + MReadOutElementDoubleStrip R; + R.SetDetectorID(det); + R.SetStripID(strip); + R.IsLowVoltageStrip(isPos); + + double lldThresh = Parser.GetTokenizerAt(i)->GetTokenAtAsDouble(1); + double functionMax = Parser.GetTokenizerAt(i)->GetTokenAtAsDouble(6); + + m_LLDThresholds[R] = lldThresh; + + TF1* erf = new TF1("erf"+MString(identifier),"[0]*(-1*TMath::Erf(([1]-x)/(sqrt(2)*[2]))+1)+[3]",lldThresh,functionMax); + erf->SetParameter(1,Parser.GetTokenizerAt(i)->GetTokenAtAsDouble(2)); + erf->SetParameter(2,Parser.GetTokenizerAt(i)->GetTokenAtAsDouble(3)); + erf->SetParameter(3,Parser.GetTokenizerAt(i)->GetTokenAtAsDouble(4)); + erf->SetParameter(0,Parser.GetTokenizerAt(i)->GetTokenAtAsDouble(5)); + + m_FSTThresholds[R] = erf; + + lldVals.push_back(lldThresh); + functionMaxVals.push_back(functionMax); + par0Vals.push_back(Parser.GetTokenizerAt(i)->GetTokenAtAsDouble(5)); + par1Vals.push_back(Parser.GetTokenizerAt(i)->GetTokenAtAsDouble(2)); + par2Vals.push_back(Parser.GetTokenizerAt(i)->GetTokenAtAsDouble(3)); + par3Vals.push_back(Parser.GetTokenizerAt(i)->GetTokenAtAsDouble(4)); + + } + + //add average value as a default + double lldAvg = accumulate(lldVals.begin(),lldVals.end(),0.0)/lldVals.size(); + double funcMaxAvg = accumulate(functionMaxVals.begin(),functionMaxVals.end(),0.0)/functionMaxVals.size(); + double par0Avg = accumulate(par0Vals.begin(),par0Vals.end(),0.0)/par0Vals.size(); + double par1Avg = accumulate(par1Vals.begin(),par1Vals.end(),0.0)/par1Vals.size(); + double par2Avg = accumulate(par2Vals.begin(),par2Vals.end(),0.0)/par2Vals.size(); + double par3Avg = accumulate(par3Vals.begin(),par3Vals.end(),0.0)/par3Vals.size(); + + MReadOutElementDoubleStrip R; + R.SetDetectorID(12); + R.SetStripID(0); + R.IsLowVoltageStrip(0); + + m_LLDThresholds[R] = lldAvg; + + TF1* erf = new TF1("erf12000","[0]*(-1*TMath::Erf(([1]-x)/(sqrt(2)*[2]))+1)+[3]",lldAvg,funcMaxAvg); + erf->SetParameter(0,par0Avg); + erf->SetParameter(1,par1Avg); + erf->SetParameter(2,par2Avg); + erf->SetParameter(3,par3Avg); + + m_FSTThresholds[R] = erf; + + return true; +} + + +//////////////////////////////////////////////////////////////////////////////// + + +//! Parse ecal file: should be done once at the beginning to save all the poly3 coefficients +bool MDetectorEffectsEngineSingleDet::ParseEnergyCalibrationFile() +{ + MParser Parser; + if (Parser.Open(m_EnergyCalibrationFileName, MFile::c_Read) == false){ + cout << "Unable to open calibration file " << m_EnergyCalibrationFileName << endl; + return false; + } + + map CM_ROEToLine; //Energy Calibration Model + map CR_ROEToLine; //Energy Resolution Calibration Model + //used to make sure there are enough data points: + map CP_ROEToLine; //peak fits + + for (unsigned int i=0; iGetNTokens(); + if (NTokens < 2) continue; + if (Parser.GetTokenizerAt(i)->IsTokenAt(0,"CM") == true || + Parser.GetTokenizerAt(i)->IsTokenAt(0,"CP") == true || + Parser.GetTokenizerAt(i)->IsTokenAt(0,"CR") == true) { + + if (Parser.GetTokenizerAt(i)->IsTokenAt(1,"dss") == true) { + MReadOutElementDoubleStrip R; + R.SetDetectorID(Parser.GetTokenizerAt(i)->GetTokenAtAsUnsignedInt(2)); + R.SetStripID(Parser.GetTokenizerAt(i)->GetTokenAtAsUnsignedInt(3)); + R.IsLowVoltageStrip(Parser.GetTokenizerAt(i)->GetTokenAtAsString(4) == "l"); + + if (Parser.GetTokenizerAt(i)->IsTokenAt(0,"CM") == true) { + CM_ROEToLine[R] = i; + } + else if (Parser.GetTokenizerAt(i)->IsTokenAt(0,"CP") == true) { + CP_ROEToLine[R] = i; + } + else { + CR_ROEToLine[R] = i; + } + } + } + } + + for (auto CM: CM_ROEToLine){ + + //only use calibration if we have 3 data points + if (CP_ROEToLine.find(CM.first) != CP_ROEToLine.end()){ + unsigned int i = CP_ROEToLine[CM.first]; + if (Parser.GetTokenizerAt(i)->IsTokenAt(5,"pakw") == true){ + if (Parser.GetTokenizerAt(i)->GetTokenAtAsInt(6) < 3){ + continue; + } + } + } + + + //get the fit function from the file + unsigned int Pos = 5; + MString CalibratorType = Parser.GetTokenizerAt(CM.second)->GetTokenAtAsString(Pos); + CalibratorType.ToLower(); + + //for now Carolyn just does poly3 and poly4, so I am only doing those one + if (CalibratorType == "poly3"){ + double a0 = Parser.GetTokenizerAt(CM.second)->GetTokenAtAsDouble(++Pos); + double a1 = Parser.GetTokenizerAt(CM.second)->GetTokenAtAsDouble(++Pos); + double a2 = Parser.GetTokenizerAt(CM.second)->GetTokenAtAsDouble(++Pos); + double a3 = Parser.GetTokenizerAt(CM.second)->GetTokenAtAsDouble(++Pos); + + //from fit parameters, define function + TF1* melinatorfit = new TF1("poly3","[0]+[1]*x+[2]*x^2+[3]*x^3",0.,8162.); + melinatorfit->FixParameter(0,a0); + melinatorfit->FixParameter(1,a1); + melinatorfit->FixParameter(2,a2); + melinatorfit->FixParameter(3,a3); + + //Define the map by saving the fit function I just created as a map to the current ReadOutElement + m_EnergyCalibration[CM.first] = melinatorfit; + + } else if (CalibratorType == "poly4"){ + double a0 = Parser.GetTokenizerAt(CM.second)->GetTokenAtAsDouble(++Pos); + double a1 = Parser.GetTokenizerAt(CM.second)->GetTokenAtAsDouble(++Pos); + double a2 = Parser.GetTokenizerAt(CM.second)->GetTokenAtAsDouble(++Pos); + double a3 = Parser.GetTokenizerAt(CM.second)->GetTokenAtAsDouble(++Pos); + double a4 = Parser.GetTokenizerAt(CM.second)->GetTokenAtAsDouble(++Pos); + + //from fit parameters, define function + TF1* melinatorfit = new TF1("poly4","[0]+[1]*x+[2]*x^2+[3]*x^3+[4]*x^4",0.,8162.); + melinatorfit->FixParameter(0,a0); + melinatorfit->FixParameter(1,a1); + melinatorfit->FixParameter(2,a2); + melinatorfit->FixParameter(3,a3); + melinatorfit->FixParameter(4,a4); + + //Define the map by saving the fit function I just created as a map to the current ReadOutElement + m_EnergyCalibration[CM.first] = melinatorfit; + } + } + + for (auto CR: CR_ROEToLine){ + + unsigned int Pos = 5; + MString CalibratorType = Parser.GetTokenizerAt(CR.second)->GetTokenAtAsString(Pos); + CalibratorType.ToLower(); + if (CalibratorType == "p1"){ + double f0 = Parser.GetTokenizerAt(CR.second)->GetTokenAtAsDouble(++Pos); + double f1 = Parser.GetTokenizerAt(CR.second)->GetTokenAtAsDouble(++Pos); + TF1* resolutionfit = new TF1("P1","[0]+[1]*x",0.,2000.); + resolutionfit->SetParameter(0,f0); + resolutionfit->SetParameter(1,f1); + + m_ResolutionCalibration[CR.first] = resolutionfit; + } + } + + return true; +} + + +//////////////////////////////////////////////////////////////////////////////// + + +// //! Parse the dead strip file +// bool MDetectorEffectsEngineSingleDet::ParseDeadStripFile() +// { + // //initialize m_DeadStrips: set all values to 0 + // for (int i=0; i lineVec; + // while (deadStripFile.good() && !deadStripFile.eof()) { + // getline(deadStripFile,line); + // stringstream sLine(line); + // string sub; + // int sub_int; + + // while (sLine >> sub){ + // sub_int = atoi(sub.c_str()); + // lineVec.push_back(sub_int); + // } + + // if (lineVec.size() != 3) { + // continue; + // } + + // int det = lineVec.at(0); + // int side = lineVec.at(1); + // int strip = lineVec.at(2)-1; //in file, strips go from 1-65; in m_DeadStrips they go from 0-63 + // lineVec.clear(); + + // //any dead strips have their value in m_DeadStrips set to 1 + // m_DeadStrips[det][side][strip] = 1; + // } + +// return true; +// } + + +void MDetectorEffectsEngineSingleDet::dummy_func(){ + //empty function to make break points for debugger +} + +/*////////////////////////////////////////////////////////// + * ACS DEE * + ////////////////////////////////////////////////////////// +*/ + +bool MDetectorEffectsEngineSingleDet::ParseACSEnergyCorrectionFile() +{ + MParser Parser; + if (Parser.Open(m_ACSEnergyCorrectionFileName, MFile::c_Read) == false) { + cout << "Unable to open threshold file " << m_ACSEnergyCorrectionFileName << endl; + return false; + } + + //vectors for averaging, for strips where there isn't threshold info for some reason + //vector lldVals; + + // vector ShieldDetNames{"BGO_X0_0", "BGO_X0_1", "BGO_X0_2", "BGO_X1_0", "BGO_X1_1", "BGO_X1_2", "BGO_Y0_0", "BGO_Y0_1", "BGO_Y0_2", "BGO_Y1_0", "BGO_Y1_1", "BGO_Y1_2", "BGO_Z0_0", "BGO_Z0_1", "BGO_Z0_2", "BGO_Z0_3", "BGO_Z0_4", "BGO_Z1_0", "BGO_Z1_1", "BGO_Z1_2", "BGO_Z1_3", "BGO_Z1_4"}; + + + + for (unsigned int i=0; iGetNTokens(); + if (NTokens == 0) continue; // skip empty lines + + // Skip comment lines + if (Parser.GetTokenizerAt(i)->GetTokenAtAsString(0).BeginsWith("#")) continue; + + if (NTokens != 11){ continue; } //this shouldn't happen but just in case + + // For each voxel of the BGO crystal, the deposited energy is corrected generating a random energy correction following a gaussian distribution. The energy centroid and the fwhm can be computed from the parameters below (Ciabattoni et al. 2025) + // Detector Name + MString det_name = Parser.GetTokenizerAt(i)->GetTokenAtAsString(0); + // MEGAlib voxel X, Y, Z ID + int voxel_X = Parser.GetTokenizerAt(i)->GetTokenAtAsInt(1); + int voxel_Y = Parser.GetTokenizerAt(i)->GetTokenAtAsInt(2); + int voxel_Z = Parser.GetTokenizerAt(i)->GetTokenAtAsInt(3); + // X, Y position [mm] + // center in the BGO crystal center + //double pos_X = Parser.GetTokenizerAt(i)->GetTokenAtAsDouble(4); + //double pos_Y = Parser.GetTokenizerAt(i)->GetTokenAtAsDouble(5); + // model parameters + // centroid: E_measured = m*E_true + q + double m_par = Parser.GetTokenizerAt(i)->GetTokenAtAsDouble(6); + double q_par = Parser.GetTokenizerAt(i)->GetTokenAtAsDouble(7); + // FWHM = sqrt(a^2 + b^2*E_true + c^2*E_true^2) + double a_par = Parser.GetTokenizerAt(i)->GetTokenAtAsDouble(8); + double b_par = Parser.GetTokenizerAt(i)->GetTokenAtAsDouble(9); + double c_par = Parser.GetTokenizerAt(i)->GetTokenAtAsDouble(10); + + MReadOutElementVoxel3D V; + + V.SetDetectorName(det_name); + V.SetVoxelXID(voxel_X); + V.SetVoxelYID(voxel_Y); + V.SetVoxelZID(voxel_Z); + + TF1* gauss_centroid = new TF1("centroid_"+det_name+"_"+MString(voxel_X)+MString(voxel_Y)+MString(voxel_Z),"[0]*x + [1]"); + gauss_centroid->SetParameter(0, m_par); + gauss_centroid->SetParameter(1, q_par); + + TF1* gauss_fwhm = new TF1("fwhm_"+det_name+"_"+MString(voxel_X)+MString(voxel_Y)+MString(voxel_Z),"sqrt([0]**2 + ([1]**2)*x + ([2]**2)*(x**2))"); + gauss_fwhm->SetParameter(0, a_par); + gauss_fwhm->SetParameter(1, b_par); + gauss_fwhm->SetParameter(2, c_par); + + m_Centroid[V] = gauss_centroid; + m_FWHM[V] = gauss_fwhm; + + } + + + /* + double lldThresh = Parser.GetTokenizerAt(i)->GetTokenAtAsDouble(1); + double functionMax = Parser.GetTokenizerAt(i)->GetTokenAtAsDouble(6); + + m_LLDThresholds[R] = lldThresh; + + TF1* erf = new TF1("erf"+MString(identifier),"[0]*(-1*TMath::Erf(([1]-x)/(sqrt(2)*[2]))+1)+[3]",lldThresh,functionMax); + erf->SetParameter(1,Parser.GetTokenizerAt(i)->GetTokenAtAsDouble(2)); + erf->SetParameter(2,Parser.GetTokenizerAt(i)->GetTokenAtAsDouble(3)); + erf->SetParameter(3,Parser.GetTokenizerAt(i)->GetTokenAtAsDouble(4)); + erf->SetParameter(0,Parser.GetTokenizerAt(i)->GetTokenAtAsDouble(5)); + + m_FSTThresholds[R] = erf; + + lldVals.push_back(lldThresh); + functionMaxVals.push_back(functionMax); + par0Vals.push_back(Parser.GetTokenizerAt(i)->GetTokenAtAsDouble(5)); + par1Vals.push_back(Parser.GetTokenizerAt(i)->GetTokenAtAsDouble(2)); + par2Vals.push_back(Parser.GetTokenizerAt(i)->GetTokenAtAsDouble(3)); + par3Vals.push_back(Parser.GetTokenizerAt(i)->GetTokenAtAsDouble(4)); + + } + + //add average value as a default + double lldAvg = accumulate(lldVals.begin(),lldVals.end(),0.0)/lldVals.size(); + double funcMaxAvg = accumulate(functionMaxVals.begin(),functionMaxVals.end(),0.0)/functionMaxVals.size(); + double par0Avg = accumulate(par0Vals.begin(),par0Vals.end(),0.0)/par0Vals.size(); + double par1Avg = accumulate(par1Vals.begin(),par1Vals.end(),0.0)/par1Vals.size(); + double par2Avg = accumulate(par2Vals.begin(),par2Vals.end(),0.0)/par2Vals.size(); + double par3Avg = accumulate(par3Vals.begin(),par3Vals.end(),0.0)/par3Vals.size(); + + MReadOutElementDoubleStrip R; + R.SetDetectorID(12); + R.SetStripID(0); + R.IsLowVoltageStrip(0); + + m_LLDThresholds[R] = lldAvg; + + TF1* erf = new TF1("erf12000","[0]*(-1*TMath::Erf(([1]-x)/(sqrt(2)*[2]))+1)+[3]",lldAvg,funcMaxAvg); + erf->SetParameter(0,par0Avg); + erf->SetParameter(1,par1Avg); + erf->SetParameter(2,par2Avg); + erf->SetParameter(3,par3Avg); + + m_FSTThresholds[R] = erf; + */ + return true; +} + + + +// MDummy.cxx: the end... +//////////////////////////////////////////////////////////////////////////////// diff --git a/src/MGUIExpoTACcut.cxx b/src/MGUIExpoTACcut.cxx new file mode 100644 index 00000000..aa7ed9f4 --- /dev/null +++ b/src/MGUIExpoTACcut.cxx @@ -0,0 +1,282 @@ +/* + * MGUIExpoTACcut.cxx + * + * + * Copyright (C) by Andreas Zoglauer. + * All rights reserved. + * + * + * This code implementation is the intellectual property of + * Andreas Zoglauer. + * + * By copying, distributing or modifying the Program (or any work + * based on the Program) you indicate your acceptance of this statement, + * and all its terms. + * + */ + + +// Include the header: +#include "MGUIExpoTACcut.h" + +// Standard libs: + +// ROOT libs: +#include +#include +#include +#include +#include + +// MEGAlib libs: +#include "MStreams.h" + + + +//////////////////////////////////////////////////////////////////////////////// + + +#ifdef ___CLING___ +ClassImp(MGUIExpoTACcut) +#endif + + +//////////////////////////////////////////////////////////////////////////////// + + +MGUIExpoTACcut::MGUIExpoTACcut(MModule* Module) : MGUIExpo(Module) +{ + // standard constructor + + // Set the new title of the tab here: + m_TabTitle = "TAC Calibration"; + + // Set the histogram arrangment + // SetTACHistogramArrangement(1, 1); + + // use hierarchical cleaning + SetCleanup(kDeepCleanup); +} + + +//////////////////////////////////////////////////////////////////////////////// + + +MGUIExpoTACcut::~MGUIExpoTACcut() +{ + // kDeepCleanup is activated +} + + +//////////////////////////////////////////////////////////////////////////////// + + +void MGUIExpoTACcut::Reset() +{ + //! Reset the data in the UI + + m_Mutex.Lock(); + for (auto H: m_TACHistograms) { + (H.second)->Reset(); + } + m_Mutex.UnLock(); +} + + +//////////////////////////////////////////////////////////////////////////////// + + +void MGUIExpoTACcut::SetTACHistogramArrangement(const vector DetIDs) +{ + // Take in the list of detector IDs and determine the number in X and number in Y + // Update the variable m_DetectorMap. + m_Mutex.Lock(); + + unsigned int column = 0; + unsigned int row = 0; + + unsigned int max_columns = 4; + + unsigned int NDetectors = DetIDs.size(); + cout<<"MGUIExpoTACcut::SetTACHistogramArrangement: Number of detectors:"<< NDetectors< new_row; + m_DetectorMap.push_back(new_row); + column = 1; + } + + unsigned int DetID = DetIDs.at(i); + m_DetectorMap[row-1].push_back(DetID); + + TH1D* TAC = new TH1D("", "TAC", m_NBins[DetID], m_Min[DetID], m_Max[DetID]); + TAC->SetXTitle("Calibrated TAC (ns)"); + TAC->SetYTitle("counts"); + TAC->SetFillColor(kAzure+7); + + m_TACHistograms[DetID] = TAC; + // m_TACCanvases[DetID] = 0; + + ++column; + } + + if (NDetectors < max_columns) { + m_NColumns = NDetectors; + } else { + m_NColumns=max_columns; + } + + m_NRows = (NDetectors/max_columns) + 1; + m_Mutex.UnLock(); +} + + +//////////////////////////////////////////////////////////////////////////////// + + +void MGUIExpoTACcut::SetTACHistogramParameters(unsigned int DetID, unsigned int NBins, double MinimumTAC, double MaximumTAC) +{ + // Set the energy histogram parameters + + m_Mutex.Lock(); + + m_NBins[DetID] = NBins; + m_Min[DetID] = MinimumTAC; + m_Max[DetID] = MaximumTAC; + TH1D* H = m_TACHistograms[DetID]; + H->SetBins(NBins, MinimumTAC, MaximumTAC); + + m_Mutex.UnLock(); +} + + +//////////////////////////////////////////////////////////////////////////////// + + +void MGUIExpoTACcut::SetTACHistogramName(unsigned int DetID, MString Name) +{ + // Set the title of the histogram + + m_Mutex.Lock(); + + if (m_TACHistograms.find(DetID) != m_TACHistograms.end()) { + m_TACHistograms[DetID]->SetTitle(Name); + } + + m_Mutex.UnLock(); +} + + +//////////////////////////////////////////////////////////////////////////////// + + +void MGUIExpoTACcut::AddTAC(unsigned int DetID, double TAC) +{ + // Add data to the energy histogram + + m_Mutex.Lock(); + + if (m_TACHistograms.find(DetID) != m_TACHistograms.end()) { + m_TACHistograms[DetID]->Fill(TAC); + } + + m_Mutex.UnLock(); +} + + +//////////////////////////////////////////////////////////////////////////////// + + +void MGUIExpoTACcut::Create() +{ + // Add the GUI options here + + // Do not create it twice! + if (m_IsCreated == true) return; + + m_Mutex.Lock(); + + TGLayoutHints* CanvasLayout = new TGLayoutHints(kLHintsTop | kLHintsLeft | kLHintsExpandX | kLHintsExpandY, 2, 2, 2, 2); + + for (unsigned int y = 0; y < m_DetectorMap.size(); ++y) { + TGHorizontalFrame* HFrame = new TGHorizontalFrame(this); + AddFrame(HFrame, CanvasLayout); + + for (unsigned int x = 0; x < m_DetectorMap[y].size(); ++x) { + unsigned int DetID = m_DetectorMap[y][x]; + TRootEmbeddedCanvas* TACCanvas = new TRootEmbeddedCanvas("TAC", HFrame, 100, 100); + HFrame->AddFrame(TACCanvas, CanvasLayout); + m_TACCanvases[DetID] = TACCanvas; + + TACCanvas->GetCanvas()->cd(); + m_TACHistograms[DetID]->Draw("colz"); + TACCanvas->GetCanvas()->Update(); + } + } + + m_IsCreated = true; + + m_Mutex.UnLock(); +} + +//////////////////////////////////////////////////////////////////////////////// + + +void MGUIExpoTACcut::Update() +{ + //! Update the frame + + m_Mutex.Lock(); + + double Max = 0; + // for (auto H : m_TACHistograms) { + for (const auto dethistpair : m_TACHistograms) { + TH1D* H = dethistpair.second; + for (int bx = 2; bx < H->GetNbinsX(); ++bx) { // Skip first and last + if (Max < H->GetBinContent(bx)) { + Max = H->GetBinContent(bx); + } + } + } + Max *= 1.1; + for (const auto dethistpair : m_TACHistograms) { + TH1D* H = dethistpair.second; + H->SetMaximum(Max); + } + + for (auto C : m_TACCanvases) { + + (C.second)->GetCanvas()->Modified(); + (C.second)->GetCanvas()->Update(); + } + + m_Mutex.UnLock(); +} + + +//////////////////////////////////////////////////////////////////////////////// + + +void MGUIExpoTACcut::Export(const MString& FileName) +{ + // Add data to the energy histogram + + m_Mutex.Lock(); + + TCanvas* P = new TCanvas(); + P->Divide(m_NColumns, m_NRows); + for (unsigned int y = 0; y < m_DetectorMap.size(); ++y) { + for (unsigned int x = 0; x < m_DetectorMap[y].size(); ++x) { + unsigned int DetID = m_DetectorMap[y][x]; + P->cd((x+1) + m_NColumns*y); + m_TACHistograms[DetID]->DrawCopy("colz"); + } + } + P->SaveAs(FileName); + delete P; + + m_Mutex.UnLock(); +} diff --git a/src/MGUIOptionsCrosstalkCorrection.cxx b/src/MGUIOptionsDEESMEX.cxx similarity index 58% rename from src/MGUIOptionsCrosstalkCorrection.cxx rename to src/MGUIOptionsDEESMEX.cxx index 1f24d113..3e1c639e 100644 --- a/src/MGUIOptionsCrosstalkCorrection.cxx +++ b/src/MGUIOptionsDEESMEX.cxx @@ -1,5 +1,5 @@ /* - * MGUIOptionsCrossTalkCorrection.cxx + * MGUIOptionsDEESMEX.cxx * * * Copyright (C) by Andreas Zoglauer. @@ -17,7 +17,7 @@ // Include the header: -#include "MGUIOptionsCrosstalkCorrection.h" +#include "MGUIOptionsDEESMEX.h" // Standard libs: @@ -29,21 +29,21 @@ // MEGAlib libs: #include "MStreams.h" -#include "MModuleCrosstalkCorrection.h" +#include "MModuleDEESMEX.h" //////////////////////////////////////////////////////////////////////////////// #ifdef ___CLING___ -ClassImp(MGUIOptionsCrosstalkCorrection) +ClassImp(MGUIOptionsDEESMEX) #endif //////////////////////////////////////////////////////////////////////////////// -MGUIOptionsCrosstalkCorrection::MGUIOptionsCrosstalkCorrection(MModule* Module) +MGUIOptionsDEESMEX::MGUIOptionsDEESMEX(MModule* Module) : MGUIOptions(Module) { // standard constructor @@ -53,7 +53,7 @@ MGUIOptionsCrosstalkCorrection::MGUIOptionsCrosstalkCorrection(MModule* Module) //////////////////////////////////////////////////////////////////////////////// -MGUIOptionsCrosstalkCorrection::~MGUIOptionsCrosstalkCorrection() +MGUIOptionsDEESMEX::~MGUIOptionsDEESMEX() { // kDeepCleanup is activated } @@ -62,17 +62,10 @@ MGUIOptionsCrosstalkCorrection::~MGUIOptionsCrosstalkCorrection() //////////////////////////////////////////////////////////////////////////////// -void MGUIOptionsCrosstalkCorrection::Create() +void MGUIOptionsDEESMEX::Create() { PreCreate(); - m_FileSelector = new MGUIEFileSelector(m_OptionsFrame, "Please select a cross talk calibration file:", - dynamic_cast(m_Module)->GetFileName()); - m_FileSelector->SetFileType("Crosstalk calibration file", "*.txt"); - TGLayoutHints* LabelLayout = new TGLayoutHints(kLHintsTop | kLHintsCenterX | kLHintsExpandX, 10, 10, 10, 10); - m_OptionsFrame->AddFrame(m_FileSelector, LabelLayout); - - PostCreate(); } @@ -80,17 +73,19 @@ void MGUIOptionsCrosstalkCorrection::Create() //////////////////////////////////////////////////////////////////////////////// -bool MGUIOptionsCrosstalkCorrection::ProcessMessage(long Message, long Parameter1, long Parameter2) +bool MGUIOptionsDEESMEX::ProcessMessage(long Message, long Parameter1, long Parameter2) { // Modify here if you have more buttons - bool Status = true; - + bool Status = true; + switch (GET_MSG(Message)) { case kC_COMMAND: switch (GET_SUBMSG(Message)) { case kCM_BUTTON: break; + case kCM_CHECKBUTTON: + break; default: break; } @@ -111,15 +106,13 @@ bool MGUIOptionsCrosstalkCorrection::ProcessMessage(long Message, long Parameter //////////////////////////////////////////////////////////////////////////////// -bool MGUIOptionsCrosstalkCorrection::OnApply() +bool MGUIOptionsDEESMEX::OnApply() { - // Modify this to store the data in the module! - - dynamic_cast(m_Module)->SetFileName(m_FileSelector->GetFileName()); - - return true; + // Modify this to store the data in the module! + + return true; } -// MGUIOptionsCrosstalkCorrection: the end... +// MGUIOptionsDEESMEX: the end... //////////////////////////////////////////////////////////////////////////////// diff --git a/src/MGUIOptionsDepthCalibration2024.cxx b/src/MGUIOptionsDepthCalibration2024.cxx index 53688321..cd6c07ec 100644 --- a/src/MGUIOptionsDepthCalibration2024.cxx +++ b/src/MGUIOptionsDepthCalibration2024.cxx @@ -78,12 +78,6 @@ void MGUIOptionsDepthCalibration2024::Create() TGLayoutHints* Label2Layout = new TGLayoutHints(kLHintsTop | kLHintsCenterX | kLHintsExpandX, 10, 10, 10, 10); m_OptionsFrame->AddFrame(m_SplinesFileSelector, Label2Layout); - m_TACCalFileSelector = new MGUIEFileSelector(m_OptionsFrame, "Select a TAC Calibration file:", - dynamic_cast(m_Module)->GetTACCalFileName()); - m_TACCalFileSelector->SetFileType("TAC", "*.csv"); - TGLayoutHints* Label3Layout = new TGLayoutHints(kLHintsTop | kLHintsCenterX | kLHintsExpandX, 10, 10, 10, 10); - m_OptionsFrame->AddFrame(m_TACCalFileSelector, Label3Layout); - m_UCSDOverride = new TGCheckButton(m_OptionsFrame, "Check this box if you're using the card cage at UCSD", 1); m_UCSDOverride->SetOn(dynamic_cast(m_Module)->GetUCSDOverride()); TGLayoutHints* Label4Layout = new TGLayoutHints(kLHintsTop | kLHintsCenterX | kLHintsExpandX, 10, 10, 10, 10); @@ -133,7 +127,6 @@ bool MGUIOptionsDepthCalibration2024::OnApply() dynamic_cast(m_Module)->SetCoeffsFileName(m_CoeffsFileSelector->GetFileName()); dynamic_cast(m_Module)->SetSplinesFileName(m_SplinesFileSelector->GetFileName()); - dynamic_cast(m_Module)->SetTACCalFileName(m_TACCalFileSelector->GetFileName()); dynamic_cast(m_Module)->SetUCSDOverride(m_UCSDOverride->IsOn()); return true; diff --git a/src/MGUIOptionsEnergyCalibrationUniversal.cxx b/src/MGUIOptionsEnergyCalibrationUniversal.cxx index 6aafead3..d2ad6d72 100644 --- a/src/MGUIOptionsEnergyCalibrationUniversal.cxx +++ b/src/MGUIOptionsEnergyCalibrationUniversal.cxx @@ -105,8 +105,8 @@ bool MGUIOptionsEnergyCalibrationUniversal::ProcessMessage(long Message, long Pa { // Modify here if you have more buttons - bool Status = true; - + bool Status = true; + switch (GET_MSG(Message)) { case kC_COMMAND: switch (GET_SUBMSG(Message)) { @@ -123,7 +123,7 @@ bool MGUIOptionsEnergyCalibrationUniversal::ProcessMessage(long Message, long Pa m_TempFile->SetEnabled(false); } break; - } + } default: break; } @@ -146,17 +146,14 @@ bool MGUIOptionsEnergyCalibrationUniversal::ProcessMessage(long Message, long Pa bool MGUIOptionsEnergyCalibrationUniversal::OnApply() { - // Modify this to store the data in the module! + // Modify this to store the data in the module! dynamic_cast(m_Module)->SetFileName(m_FileSelector->GetFileName()); dynamic_cast(m_Module)->SetTempFileName(m_TempFile->GetFileName()); - if (dynamic_cast(m_Module)->GetPreampTempCorrection() != m_UseTempCal) dynamic_cast(m_Module)->EnablePreampTempCorrection(m_UseTempCal); - - - return true; + return true; } diff --git a/src/MGUIOptionsEventSaver.cxx b/src/MGUIOptionsEventSaver.cxx index 76020f67..dd821c0c 100644 --- a/src/MGUIOptionsEventSaver.cxx +++ b/src/MGUIOptionsEventSaver.cxx @@ -66,8 +66,9 @@ void MGUIOptionsEventSaver::Create() { PreCreate(); - TGLayoutHints* LabelLayout = new TGLayoutHints(kLHintsTop | kLHintsCenterX | kLHintsExpandX, 10, 10, 10, 10); - + TGLayoutHints* LabelLayout = new TGLayoutHints(kLHintsTop | kLHintsLeft, 10, 10, 10, 10); + TGLayoutHints* RoaCheckButtonLayout = new TGLayoutHints(kLHintsTop | kLHintsLeft, 10, 10, 2, 2); + m_Mode = new MGUIERBList(m_OptionsFrame, "Please select an output mode:"); m_Mode->Add("*.roa file to use with melinator"); m_Mode->Add("*.dat file containing all information"); @@ -88,6 +89,10 @@ void MGUIOptionsEventSaver::Create() m_SaveBadEvents->SetOn(dynamic_cast(m_Module)->GetSaveBadEvents()); m_OptionsFrame->AddFrame(m_SaveBadEvents, LabelLayout); + m_SaveVetoEvents = new TGCheckButton(m_OptionsFrame, "Save guard ring and shield veto events (Veto)", 1); + m_SaveVetoEvents->SetOn(dynamic_cast(m_Module)->GetSaveVetoEvents()); + m_OptionsFrame->AddFrame(m_SaveVetoEvents, LabelLayout); + m_AddTimeTag = new TGCheckButton(m_OptionsFrame, "Add a unique time tag", 3); m_AddTimeTag->SetOn(dynamic_cast(m_Module)->GetAddTimeTag()); m_OptionsFrame->AddFrame(m_AddTimeTag, LabelLayout); @@ -103,8 +108,50 @@ void MGUIOptionsEventSaver::Create() dynamic_cast(m_Module)->GetSplitFileTime().GetAsSystemSeconds(), true, 0l); if (m_SplitFile->IsOn() == false) m_SplitFileTime->SetEnabled(false); m_OptionsFrame->AddFrame(m_SplitFileTime, SplitFileTimeLayout); - - + + TGLabel* ROAOptionsLabel = new TGLabel(m_OptionsFrame, "Special options for roa files:"); + m_OptionsFrame->AddFrame(ROAOptionsLabel, LabelLayout); + + m_RoaWithADCs = new TGCheckButton(m_OptionsFrame, "Include ADCs", 3); + m_RoaWithADCs->Associate(this); + m_RoaWithADCs->SetOn(dynamic_cast(m_Module)->GetRoaWithADCs()); + m_OptionsFrame->AddFrame(m_RoaWithADCs, RoaCheckButtonLayout); + + m_RoaWithTACs = new TGCheckButton(m_OptionsFrame, "Include TACs", 3); + m_RoaWithTACs->Associate(this); + m_RoaWithTACs->SetOn(dynamic_cast(m_Module)->GetRoaWithTACs()); + m_OptionsFrame->AddFrame(m_RoaWithTACs, RoaCheckButtonLayout); + + m_RoaWithEnergies = new TGCheckButton(m_OptionsFrame, "Include energies", 3); + m_RoaWithEnergies->Associate(this); + m_RoaWithEnergies->SetOn(dynamic_cast(m_Module)->GetRoaWithEnergies()); + m_OptionsFrame->AddFrame(m_RoaWithEnergies, RoaCheckButtonLayout); + + m_RoaWithTimings = new TGCheckButton(m_OptionsFrame, "Include timings", 3); + m_RoaWithTimings->Associate(this); + m_RoaWithTimings->SetOn(dynamic_cast(m_Module)->GetRoaWithTimings()); + m_OptionsFrame->AddFrame(m_RoaWithTimings, RoaCheckButtonLayout); + + m_RoaWithTemperatures = new TGCheckButton(m_OptionsFrame, "Include temperatures", 3); + m_RoaWithTemperatures->Associate(this); + m_RoaWithTemperatures->SetOn(dynamic_cast(m_Module)->GetRoaWithTemperatures()); + m_OptionsFrame->AddFrame(m_RoaWithTemperatures, RoaCheckButtonLayout); + + m_RoaWithFlags = new TGCheckButton(m_OptionsFrame, "Include flags", 3); + m_RoaWithFlags->Associate(this); + m_RoaWithFlags->SetOn(dynamic_cast(m_Module)->GetRoaWithFlags()); + m_OptionsFrame->AddFrame(m_RoaWithFlags, RoaCheckButtonLayout); + + m_RoaWithOrigins = new TGCheckButton(m_OptionsFrame, "Include origins", 3); + m_RoaWithOrigins->Associate(this); + m_RoaWithOrigins->SetOn(dynamic_cast(m_Module)->GetRoaWithOrigins()); + m_OptionsFrame->AddFrame(m_RoaWithOrigins, RoaCheckButtonLayout); + + m_RoaWithNearestNeighbors = new TGCheckButton(m_OptionsFrame, "Include nearest neighbor Hits", 3); + m_RoaWithNearestNeighbors->Associate(this); + m_RoaWithNearestNeighbors->SetOn(dynamic_cast(m_Module)->GetRoaWithNearestNeighbors()); + m_OptionsFrame->AddFrame(m_RoaWithNearestNeighbors, RoaCheckButtonLayout); + PostCreate(); } @@ -153,12 +200,24 @@ bool MGUIOptionsEventSaver::OnApply() // Modify this to store the data in the module! dynamic_cast(m_Module)->SetMode(m_Mode->GetSelected()); + dynamic_cast(m_Module)->SetFileName(m_FileSelector->GetFileName()); + dynamic_cast(m_Module)->SetSaveBadEvents(m_SaveBadEvents->IsOn()); + dynamic_cast(m_Module)->SetSaveVetoEvents(m_SaveVetoEvents->IsOn()); dynamic_cast(m_Module)->SetAddTimeTag(m_AddTimeTag->IsOn()); dynamic_cast(m_Module)->SetSplitFile(m_SplitFile->IsOn()); dynamic_cast(m_Module)->SetSplitFileTime(MTime(m_SplitFileTime->GetAsInt())); - + + dynamic_cast(m_Module)->SetRoaWithADCs(m_RoaWithADCs->IsOn()); + dynamic_cast(m_Module)->SetRoaWithTACs(m_RoaWithTACs->IsOn()); + dynamic_cast(m_Module)->SetRoaWithEnergies(m_RoaWithEnergies->IsOn()); + dynamic_cast(m_Module)->SetRoaWithTimings(m_RoaWithTimings->IsOn()); + dynamic_cast(m_Module)->SetRoaWithTemperatures(m_RoaWithTemperatures->IsOn()); + dynamic_cast(m_Module)->SetRoaWithFlags(m_RoaWithFlags->IsOn()); + dynamic_cast(m_Module)->SetRoaWithOrigins(m_RoaWithOrigins->IsOn()); + dynamic_cast(m_Module)->SetRoaWithNearestNeighbors(m_RoaWithNearestNeighbors->IsOn()); + return true; } diff --git a/src/MGUIOptionsLoaderMeasurements.cxx b/src/MGUIOptionsLoaderMeasurements.cxx index c9dfe019..79f38dde 100644 --- a/src/MGUIOptionsLoaderMeasurements.cxx +++ b/src/MGUIOptionsLoaderMeasurements.cxx @@ -43,8 +43,8 @@ ClassImp(MGUIOptionsLoaderMeasurements) //////////////////////////////////////////////////////////////////////////////// -MGUIOptionsLoaderMeasurements::MGUIOptionsLoaderMeasurements(MModule* Module) - : MGUIOptions(Module) +MGUIOptionsLoaderMeasurements::MGUIOptionsLoaderMeasurements(MModule* Module, MString FileType) + : MGUIOptions(Module), m_FileType(FileType) { // standard constructor } @@ -66,12 +66,12 @@ void MGUIOptionsLoaderMeasurements::Create() { PreCreate(); - m_FileSelector = new MGUIEFileSelector(m_OptionsFrame, "Please select a data file:", + m_FileSelector = new MGUIEFileSelector(m_OptionsFrame, MString("Please select a ") + m_FileType + " file:", dynamic_cast(m_Module)->GetFileName()); - m_FileSelector->SetFileType("Roa file", "*.roa"); - m_FileSelector->SetFileType("Roa file", "*.roa.gz"); - m_FileSelector->SetFileType("Data file", "*.dat"); - m_FileSelector->SetFileType("Data file", "*.dat.gz"); + m_FileSelector->SetFileType(m_FileType + " file", MString("*.") + m_FileType); + if (m_FileType == "roa") { + m_FileSelector->SetFileType(m_FileType + " file", MString("*.") + m_FileType + ".gz"); + } TGLayoutHints* LabelLayout = new TGLayoutHints(kLHintsTop | kLHintsCenterX | kLHintsExpandX, 10, 10, 10, 10); m_OptionsFrame->AddFrame(m_FileSelector, LabelLayout); diff --git a/src/MGUIOptionsLoaderMeasurementsBinary.cxx b/src/MGUIOptionsLoaderMeasurementsBinary.cxx deleted file mode 100644 index f2db17bb..00000000 --- a/src/MGUIOptionsLoaderMeasurementsBinary.cxx +++ /dev/null @@ -1,178 +0,0 @@ -/* - * MGUIOptionsLoaderMeasurementsBinary.cxx - * - * - * Copyright (C) by Andreas Zoglauer. - * All rights reserved. - * - * - * This code implementation is the intellectual property of - * Andreas Zoglauer. - * - * By copying, distributing or modifying the Program (or any work - * based on the Program) you indicate your acceptance of this statement, - * and all its terms. - * - */ - - -// Include the header: -#include "MGUIOptionsLoaderMeasurementsBinary.h" - -// Standard libs: - -// ROOT libs: -#include -#include -#include -#include - -// MEGAlib libs: -#include "MStreams.h" -#include "MModule.h" -#include "MModuleLoaderMeasurementsBinary.h" - - -//////////////////////////////////////////////////////////////////////////////// - - -#ifdef ___CLING___ -ClassImp(MGUIOptionsLoaderMeasurementsBinary) -#endif - - -//////////////////////////////////////////////////////////////////////////////// - - -MGUIOptionsLoaderMeasurementsBinary::MGUIOptionsLoaderMeasurementsBinary(MModule* Module) - : MGUIOptions(Module) -{ - // standard constructor -} - - -//////////////////////////////////////////////////////////////////////////////// - - -MGUIOptionsLoaderMeasurementsBinary::~MGUIOptionsLoaderMeasurementsBinary() -{ - // kDeepCleanup is activated -} - - -//////////////////////////////////////////////////////////////////////////////// - - -void MGUIOptionsLoaderMeasurementsBinary::Create() -{ - PreCreate(); - - m_FileSelector = new MGUIEFileSelector(m_OptionsFrame, "Please select a data file:", - dynamic_cast(m_Module)->GetFileName()); - m_FileSelector->SetFileType("Bin file", "*.dat"); - m_FileSelector->SetFileType("Bin file", "*.bin"); - TGLayoutHints* LabelLayout = new TGLayoutHints(kLHintsTop | kLHintsCenterX | kLHintsExpandX, 10, 10, 10, 10); - m_OptionsFrame->AddFrame(m_FileSelector, LabelLayout); - - m_DataMode = new MGUIERBList(m_OptionsFrame, "Choose the data to look at: "); - m_DataMode->Add("Raw mode"); - m_DataMode->Add("Compton mode"); - m_DataMode->SetSelected((int) dynamic_cast(m_Module)->GetDataSelectionMode()); - m_DataMode->Create(); - m_OptionsFrame->AddFrame(m_DataMode, LabelLayout); - - m_AspectMode = new MGUIERBList(m_OptionsFrame, "Choose the aspect mode"); - m_AspectMode->Add("GPS"); - m_AspectMode->Add("Magnetometer"); - m_AspectMode->Add("Interpolated GPS"); - m_AspectMode->Add("None"); - m_AspectMode->SetSelected((int) dynamic_cast(m_Module)->GetAspectMode()); - m_AspectMode->Create(); - m_OptionsFrame->AddFrame(m_AspectMode, LabelLayout); - - m_CoincidenceMode = new MGUIERBList(m_OptionsFrame, "Enable/Disable merging of coincident events"); - m_CoincidenceMode->Add("Disable"); - m_CoincidenceMode->Add("Enable"); - m_CoincidenceMode->SetSelected((int) dynamic_cast(m_Module)->GetCoincidenceMerging()); - m_CoincidenceMode->Create(); - m_OptionsFrame->AddFrame(m_CoincidenceMode, LabelLayout); - - - - PostCreate(); -} - - -//////////////////////////////////////////////////////////////////////////////// - - -bool MGUIOptionsLoaderMeasurementsBinary::ProcessMessage(long Message, long Parameter1, long Parameter2) -{ - // Modify here if you have more buttons - - bool Status = true; - - switch (GET_MSG(Message)) { - case kC_COMMAND: - switch (GET_SUBMSG(Message)) { - case kCM_BUTTON: - break; - default: - break; - } - break; - default: - break; - } - - if (Status == false) { - return false; - } - - // Call also base class - return MGUIOptions::ProcessMessage(Message, Parameter1, Parameter2); -} - - -//////////////////////////////////////////////////////////////////////////////// - - -bool MGUIOptionsLoaderMeasurementsBinary::OnApply() -{ - // Modify this to store the data in the module! - - dynamic_cast(m_Module)->SetFileName(m_FileSelector->GetFileName()); - - if (m_DataMode->GetSelected() == 0) { - dynamic_cast(m_Module)->SetDataSelectionMode(MBinaryFlightDataParserDataModes::c_Raw); - } else if (m_DataMode->GetSelected() == 1) { - dynamic_cast(m_Module)->SetDataSelectionMode(MBinaryFlightDataParserDataModes::c_Compton); - } else if (m_DataMode->GetSelected() == 2) { - dynamic_cast(m_Module)->SetDataSelectionMode(MBinaryFlightDataParserDataModes::c_All); - } - - if (m_AspectMode->GetSelected() == 0) { - dynamic_cast(m_Module)->SetAspectMode(MBinaryFlightDataParserAspectModes::c_GPS); - } else if (m_AspectMode->GetSelected() == 1) { - dynamic_cast(m_Module)->SetAspectMode(MBinaryFlightDataParserAspectModes::c_Magnetometer); - } else if (m_AspectMode->GetSelected() == 2) { - dynamic_cast(m_Module)->SetAspectMode(MBinaryFlightDataParserAspectModes::c_Interpolate); - } else if (m_AspectMode->GetSelected() == 3) { - dynamic_cast(m_Module)->SetAspectMode(MBinaryFlightDataParserAspectModes::c_Neither); - } - - if( m_CoincidenceMode->GetSelected() == 0 ){ - //false -> 0 - dynamic_cast(m_Module)->EnableCoincidenceMerging(false); - } else if( m_CoincidenceMode->GetSelected() == 1 ){ - //true -> 1 - dynamic_cast(m_Module)->EnableCoincidenceMerging(true); - } - - - return true; -} - - -// MGUIOptionsLoaderMeasurementsBinary: the end... -//////////////////////////////////////////////////////////////////////////////// diff --git a/src/MGUIOptionsLoaderMeasurementsHDF.cxx b/src/MGUIOptionsLoaderMeasurementsHDF.cxx new file mode 100644 index 00000000..5126b5b8 --- /dev/null +++ b/src/MGUIOptionsLoaderMeasurementsHDF.cxx @@ -0,0 +1,141 @@ +/* + * MGUIOptionsLoaderMeasurementsHDF.cxx + * + * + * Copyright (C) by Andreas Zoglauer. + * All rights reserved. + * + * + * This code implementation is the intellectual property of + * Andreas Zoglauer. + * + * By copying, distributing or modifying the Program (or any work + * based on the Program) you indicate your acceptance of this statement, + * and all its terms. + * + */ + + +// Include the header: +#include "MGUIOptionsLoaderMeasurementsHDF.h" + +// Standard libs: + +// ROOT libs: +#include +#include +#include +#include + +// MEGAlib libs: +#include "MStreams.h" +#include "MModuleLoaderMeasurementsHDF.h" + + +//////////////////////////////////////////////////////////////////////////////// + + +#ifdef ___CLING___ +ClassImp(MGUIOptionsLoaderMeasurementsHDF) +#endif + + +//////////////////////////////////////////////////////////////////////////////// + + +MGUIOptionsLoaderMeasurementsHDF::MGUIOptionsLoaderMeasurementsHDF(MModule* Module) + : MGUIOptions(Module) +{ + // standard constructor +} + + +//////////////////////////////////////////////////////////////////////////////// + + +MGUIOptionsLoaderMeasurementsHDF::~MGUIOptionsLoaderMeasurementsHDF() +{ + // kDeepCleanup is activated +} + + +//////////////////////////////////////////////////////////////////////////////// + + +void MGUIOptionsLoaderMeasurementsHDF::Create() +{ + PreCreate(); + + TGLayoutHints* LabelLayout = new TGLayoutHints(kLHintsTop | kLHintsCenterX | kLHintsExpandX, 10, 10, 10, 10); + + m_FileSelectorHDF = new MGUIEFileSelector(m_OptionsFrame, "Please select a HDF5 file:", + dynamic_cast(m_Module)->GetFileName()); + m_FileSelectorHDF->SetFileType("HDF5 file", "*.hdf5"); + m_FileSelectorHDF->SetFileType("HDF5 file", "*.hdf"); + m_OptionsFrame->AddFrame(m_FileSelectorHDF, LabelLayout); + + + m_LoadContinuationFiles = new TGCheckButton(m_OptionsFrame, "Enable loading continuation HDF5 files", 1); + m_LoadContinuationFiles->SetOn(dynamic_cast(m_Module)->GetLoadContinuationFiles()); + m_LoadContinuationFiles->Associate(this); + m_OptionsFrame->AddFrame(m_LoadContinuationFiles, LabelLayout); + + + m_FileSelectorStripMap = new MGUIEFileSelector(m_OptionsFrame, "Please select a strip map file:", + dynamic_cast(m_Module)->GetFileNameStripMap()); + m_FileSelectorStripMap->SetFileType("Strip map file", "*.map"); + m_OptionsFrame->AddFrame(m_FileSelectorStripMap, LabelLayout); + + + PostCreate(); +} + + +//////////////////////////////////////////////////////////////////////////////// + + +bool MGUIOptionsLoaderMeasurementsHDF::ProcessMessage(long Message, long Parameter1, long Parameter2) +{ + // Modify here if you have more buttons + + bool Status = true; + + switch (GET_MSG(Message)) { + case kC_COMMAND: + switch (GET_SUBMSG(Message)) { + case kCM_BUTTON: + break; + default: + break; + } + break; + default: + break; + } + + if (Status == false) { + return false; + } + + // Call also base class + return MGUIOptions::ProcessMessage(Message, Parameter1, Parameter2); +} + + +//////////////////////////////////////////////////////////////////////////////// + + +bool MGUIOptionsLoaderMeasurementsHDF::OnApply() +{ + // Modify this to store the data in the module! + + dynamic_cast(m_Module)->SetFileName(m_FileSelectorHDF->GetFileName()); + dynamic_cast(m_Module)->SetLoadContinuationFiles(m_LoadContinuationFiles->IsOn()); + dynamic_cast(m_Module)->SetFileNameStripMap(m_FileSelectorStripMap->GetFileName()); + + return true; +} + + +// MGUIOptionsLoaderMeasurementsHDF: the end... +//////////////////////////////////////////////////////////////////////////////// diff --git a/src/MGUIOptionsLoaderSimulations.cxx b/src/MGUIOptionsLoaderSimulations.cxx index f64d6b67..8f1ac155 100644 --- a/src/MGUIOptionsLoaderSimulations.cxx +++ b/src/MGUIOptionsLoaderSimulations.cxx @@ -29,7 +29,7 @@ // MEGAlib libs: #include "MStreams.h" -#include "MModuleLoaderSimulationsBalloon.h" +#include "MModuleLoaderSimulationsSingleDet.h" //////////////////////////////////////////////////////////////////////////////// @@ -69,58 +69,75 @@ void MGUIOptionsLoaderSimulations::Create() TGLayoutHints* LabelLayout = new TGLayoutHints(kLHintsTop | kLHintsCenterX | kLHintsExpandX, 10, 10, 10, 10); m_SimulationFileSelector = new MGUIEFileSelector(m_OptionsFrame, "Please select a simulations file:", - dynamic_cast(m_Module)->GetSimulationFileName()); + dynamic_cast(m_Module)->GetSimulationFileName()); m_SimulationFileSelector->SetFileType("Sim file", "*.sim"); m_SimulationFileSelector->SetFileType("Sim file (gzip'ed)", "*.sim.gz"); m_OptionsFrame->AddFrame(m_SimulationFileSelector, LabelLayout); + m_DeadtimeFileSelector = new MGUIEFileSelector(m_OptionsFrame, "Please select a deadtime parameters file:", + dynamic_cast(m_Module)->GetDeadtimeFileName()); + m_DeadtimeFileSelector->SetFileType("Deadtime file", "*.txt"); + m_OptionsFrame->AddFrame(m_DeadtimeFileSelector, LabelLayout); + m_EnergyCalibrationFileSelector = new MGUIEFileSelector(m_OptionsFrame, "Please select an energy calibration file:", - dynamic_cast(m_Module)->GetEnergyCalibrationFileName()); + dynamic_cast(m_Module)->GetEnergyCalibrationFileName()); m_EnergyCalibrationFileSelector->SetFileType("Ecal file", "*.ecal"); m_OptionsFrame->AddFrame(m_EnergyCalibrationFileSelector, LabelLayout); m_DeadStripFileSelector = new MGUIEFileSelector(m_OptionsFrame, "Please select a dead strip file:", - dynamic_cast(m_Module)->GetDeadStripFileName()); + dynamic_cast(m_Module)->GetDeadStripFileName()); m_DeadStripFileSelector->SetFileType("Dead strips file", "*.txt"); m_OptionsFrame->AddFrame(m_DeadStripFileSelector, LabelLayout); m_ThresholdFileSelector = new MGUIEFileSelector(m_OptionsFrame, "Please select a thresholds file:", - dynamic_cast(m_Module)->GetThresholdFileName()); + dynamic_cast(m_Module)->GetThresholdFileName()); m_ThresholdFileSelector->SetFileType("Thresholds file", "*.dat"); m_OptionsFrame->AddFrame(m_ThresholdFileSelector, LabelLayout); m_GuardRingThresholdFileSelector = new MGUIEFileSelector(m_OptionsFrame, "Please select a guard ring thresholds file:", - dynamic_cast(m_Module)->GetGuardRingThresholdFileName()); + dynamic_cast(m_Module)->GetGuardRingThresholdFileName()); m_GuardRingThresholdFileSelector->SetFileType("Thresholds file", "*.dat"); m_OptionsFrame->AddFrame(m_GuardRingThresholdFileSelector, LabelLayout); m_ChargeSharingFileSelector = new MGUIEFileSelector(m_OptionsFrame, "Please select a charge sharing factor file:", - dynamic_cast(m_Module)->GetChargeSharingFileName()); + dynamic_cast(m_Module)->GetChargeSharingFileName()); m_ChargeSharingFileSelector->SetFileType("Charge sharing file", "*.txt"); m_OptionsFrame->AddFrame(m_ChargeSharingFileSelector, LabelLayout); m_CrosstalkFileSelector = new MGUIEFileSelector(m_OptionsFrame, "Please select a crosstalk coefficients file:", - dynamic_cast(m_Module)->GetCrosstalkFileName()); + dynamic_cast(m_Module)->GetCrosstalkFileName()); m_CrosstalkFileSelector->SetFileType("Crosstalk file", "*.txt"); m_OptionsFrame->AddFrame(m_CrosstalkFileSelector, LabelLayout); m_ChargeLossFileSelector = new MGUIEFileSelector(m_OptionsFrame, "Please select a charge loss coefficients file:", - dynamic_cast(m_Module)->GetChargeLossFileName()); + dynamic_cast(m_Module)->GetChargeLossFileName()); m_ChargeLossFileSelector->SetFileType("Charge loss file", "*.log"); m_OptionsFrame->AddFrame(m_ChargeLossFileSelector, LabelLayout); m_DepthCalibrationCoeffsFileSelector = new MGUIEFileSelector(m_OptionsFrame, "Please select a depth calibration coefficients file:", - dynamic_cast(m_Module)->GetDepthCalibrationCoeffsFileName()); + dynamic_cast(m_Module)->GetDepthCalibrationCoeffsFileName()); m_DepthCalibrationCoeffsFileSelector->SetFileType("Coefficients file", "*.txt"); m_OptionsFrame->AddFrame(m_DepthCalibrationCoeffsFileSelector, LabelLayout); + m_DepthCalibrationTACCalFileSelector = new MGUIEFileSelector(m_OptionsFrame, "Please select a TAC calibration parameters file:", + dynamic_cast(m_Module)->GetDepthCalibrationTACCalFileName()); + m_DepthCalibrationTACCalFileSelector->SetFileType("TAC calibration file", "*.csv"); + m_OptionsFrame->AddFrame(m_DepthCalibrationTACCalFileSelector, LabelLayout); + m_DepthCalibrationSplinesFileSelector = new MGUIEFileSelector(m_OptionsFrame, "Please select a depth calibration splines file:", - dynamic_cast(m_Module)->GetDepthCalibrationSplinesFileName()); + dynamic_cast(m_Module)->GetDepthCalibrationSplinesFileName()); m_DepthCalibrationSplinesFileSelector->SetFileType("Splines file", "*.ctd"); m_OptionsFrame->AddFrame(m_DepthCalibrationSplinesFileSelector, LabelLayout); - + + // ACS DEE energy correction file + m_ACSEnergyCorrectionFileSelector = new MGUIEFileSelector(m_OptionsFrame, "Please select an energy correction file for the ACS DEE:", + dynamic_cast(m_Module)->GetACSEnergyCorrectionFileName()); + m_ACSEnergyCorrectionFileSelector->SetFileType("ACS DEE energy correction file", "*.txt"); + m_OptionsFrame->AddFrame(m_ACSEnergyCorrectionFileSelector, LabelLayout); + + m_ApplyFudgeFactorSelector = new TGCheckButton(m_OptionsFrame, "Apply fudge factor to better match fluxes", 1); - m_ApplyFudgeFactorSelector->SetOn(dynamic_cast(m_Module)->GetApplyFudgeFactor()); + m_ApplyFudgeFactorSelector->SetOn(dynamic_cast(m_Module)->GetApplyFudgeFactor()); m_OptionsFrame->AddFrame(m_ApplyFudgeFactorSelector, LabelLayout); TGHorizontalFrame* PassedFrame = new TGHorizontalFrame(m_OptionsFrame); @@ -129,12 +146,12 @@ void MGUIOptionsLoaderSimulations::Create() m_StopAfter = new TGCheckButton(PassedFrame, "Stop after this number of PASSED events: ", 1); m_StopAfter->Associate(this); - m_StopAfter->SetOn(dynamic_cast(m_Module)->UseStopAfter()); + m_StopAfter->SetOn(dynamic_cast(m_Module)->UseStopAfter()); TGLayoutHints* StopAfterLayout = new TGLayoutHints(kLHintsTop | kLHintsLeft, 10, 10, 10, 10); PassedFrame->AddFrame(m_StopAfter, StopAfterLayout); m_MaximumAcceptedEvents = new MGUIEEntry(PassedFrame, " ", false, - dynamic_cast(m_Module)->GetMaximumAcceptedEvents(), true, 0l); + dynamic_cast(m_Module)->GetMaximumAcceptedEvents(), true, 0l); if (m_StopAfter->IsOn() == false) m_MaximumAcceptedEvents->SetEnabled(false); PassedFrame->AddFrame(m_MaximumAcceptedEvents, StopAfterLayout); @@ -185,20 +202,23 @@ bool MGUIOptionsLoaderSimulations::ProcessMessage(long Message, long Parameter1, bool MGUIOptionsLoaderSimulations::OnApply() { // Modify this to store the data in the module! - - dynamic_cast(m_Module)->SetSimulationFileName(m_SimulationFileSelector->GetFileName()); - dynamic_cast(m_Module)->SetEnergyCalibrationFileName(m_EnergyCalibrationFileSelector->GetFileName()); - dynamic_cast(m_Module)->SetThresholdFileName(m_ThresholdFileSelector->GetFileName()); - dynamic_cast(m_Module)->SetGuardRingThresholdFileName(m_GuardRingThresholdFileSelector->GetFileName()); - dynamic_cast(m_Module)->SetChargeSharingFileName(m_ChargeSharingFileSelector->GetFileName()); - dynamic_cast(m_Module)->SetCrosstalkFileName(m_CrosstalkFileSelector->GetFileName()); - dynamic_cast(m_Module)->SetChargeLossFileName(m_ChargeLossFileSelector->GetFileName()); - dynamic_cast(m_Module)->SetDeadStripFileName(m_DeadStripFileSelector->GetFileName()); - dynamic_cast(m_Module)->SetDepthCalibrationCoeffsFileName(m_DepthCalibrationCoeffsFileSelector->GetFileName()); - dynamic_cast(m_Module)->SetDepthCalibrationSplinesFileName(m_DepthCalibrationSplinesFileSelector->GetFileName()); - dynamic_cast(m_Module)->SetApplyFudgeFactor(m_ApplyFudgeFactorSelector->IsOn()); - dynamic_cast(m_Module)->SetUseStopAfter(m_StopAfter->IsOn()); - dynamic_cast(m_Module)->SetMaximumAcceptedEvents(m_MaximumAcceptedEvents->GetAsInt()); + dynamic_cast(m_Module)->SetSimulationFileName(m_SimulationFileSelector->GetFileName()); + dynamic_cast(m_Module)->SetDeadtimeFileName(m_DeadtimeFileSelector->GetFileName()); + dynamic_cast(m_Module)->SetEnergyCalibrationFileName(m_EnergyCalibrationFileSelector->GetFileName()); + dynamic_cast(m_Module)->SetThresholdFileName(m_ThresholdFileSelector->GetFileName()); + dynamic_cast(m_Module)->SetGuardRingThresholdFileName(m_GuardRingThresholdFileSelector->GetFileName()); + dynamic_cast(m_Module)->SetChargeSharingFileName(m_ChargeSharingFileSelector->GetFileName()); + dynamic_cast(m_Module)->SetCrosstalkFileName(m_CrosstalkFileSelector->GetFileName()); + dynamic_cast(m_Module)->SetChargeLossFileName(m_ChargeLossFileSelector->GetFileName()); + dynamic_cast(m_Module)->SetDeadStripFileName(m_DeadStripFileSelector->GetFileName()); + dynamic_cast(m_Module)->SetDepthCalibrationCoeffsFileName(m_DepthCalibrationCoeffsFileSelector->GetFileName()); + dynamic_cast(m_Module)->SetDepthCalibrationTACCalFileName(m_DepthCalibrationTACCalFileSelector->GetFileName()); + dynamic_cast(m_Module)->SetDepthCalibrationSplinesFileName(m_DepthCalibrationSplinesFileSelector->GetFileName()); + // ACS DEE energy correction + dynamic_cast(m_Module)->SetACSEnergyCorrectionFileName(m_ACSEnergyCorrectionFileSelector->GetFileName()); + dynamic_cast(m_Module)->SetApplyFudgeFactor(m_ApplyFudgeFactorSelector->IsOn()); + dynamic_cast(m_Module)->SetUseStopAfter(m_StopAfter->IsOn()); + dynamic_cast(m_Module)->SetMaximumAcceptedEvents(m_MaximumAcceptedEvents->GetAsInt()); return true; } diff --git a/src/MGUIOptionsLoaderSimulationsCosima.cxx b/src/MGUIOptionsLoaderSimulationsCosima.cxx new file mode 100644 index 00000000..ac2369c3 --- /dev/null +++ b/src/MGUIOptionsLoaderSimulationsCosima.cxx @@ -0,0 +1,151 @@ +/* + * MGUIOptionsLoaderSimulationsCosima.cxx + * + * + * Copyright (C) by Andreas Zoglauer. + * All rights reserved. + * + * + * This code implementation is the intellectual property of + * Andreas Zoglauer. + * + * By copying, distributing or modifying the Program (or any work + * based on the Program) you indicate your acceptance of this statement, + * and all its terms. + * + */ + + +// Include the header: +#include "MGUIOptionsLoaderSimulationsCosima.h" + +// Standard libs: + +// ROOT libs: +#include +#include +#include +#include + +// MEGAlib libs: +#include "MStreams.h" +#include "MModuleLoaderSimulationsCosima.h" + + +//////////////////////////////////////////////////////////////////////////////// + + +#ifdef ___CLING___ +ClassImp(MGUIOptionsLoaderSimulationsCosima) +#endif + + +//////////////////////////////////////////////////////////////////////////////// + + +MGUIOptionsLoaderSimulationsCosima::MGUIOptionsLoaderSimulationsCosima(MModule* Module) + : MGUIOptions(Module) +{ + // standard constructor +} + + +//////////////////////////////////////////////////////////////////////////////// + + +MGUIOptionsLoaderSimulationsCosima::~MGUIOptionsLoaderSimulationsCosima() +{ + // kDeepCleanup is activated +} + + +//////////////////////////////////////////////////////////////////////////////// + + +void MGUIOptionsLoaderSimulationsCosima::Create() +{ + PreCreate(); + + TGLayoutHints* LabelLayout = new TGLayoutHints(kLHintsTop | kLHintsCenterX | kLHintsExpandX, 10, 10, 10, 10); + + m_SimulationFileSelector = new MGUIEFileSelector(m_OptionsFrame, "Please select a simulations file:", + dynamic_cast(m_Module)->GetSimulationFileName()); + m_SimulationFileSelector->SetFileType("Sim file", "*.sim"); + m_SimulationFileSelector->SetFileType("Sim file (gzip'ed)", "*.sim.gz"); + m_OptionsFrame->AddFrame(m_SimulationFileSelector, LabelLayout); + + TGHorizontalFrame* PassedFrame = new TGHorizontalFrame(m_OptionsFrame); + TGLayoutHints* PassedFrameLayout = new TGLayoutHints(kLHintsTop | kLHintsLeft, 0, 0, 0, 0); + m_OptionsFrame->AddFrame(PassedFrame, PassedFrameLayout); + + m_StopAfter = new TGCheckButton(PassedFrame, "Stop after this number of PASSED events: ", 1); + m_StopAfter->Associate(this); + m_StopAfter->SetOn(dynamic_cast(m_Module)->UseStopAfter()); + TGLayoutHints* StopAfterLayout = new TGLayoutHints(kLHintsTop | kLHintsLeft, 10, 10, 10, 10); + PassedFrame->AddFrame(m_StopAfter, StopAfterLayout); + + m_MaximumAcceptedEvents = new MGUIEEntry(PassedFrame, " ", false, + dynamic_cast(m_Module)->GetMaximumAcceptedEvents(), true, 0l); + if (m_StopAfter->IsOn() == false) m_MaximumAcceptedEvents->SetEnabled(false); + PassedFrame->AddFrame(m_MaximumAcceptedEvents, StopAfterLayout); + + + PostCreate(); +} + + +//////////////////////////////////////////////////////////////////////////////// + + +bool MGUIOptionsLoaderSimulationsCosima::ProcessMessage(long Message, long Parameter1, long Parameter2) +{ + // Modify here if you have more buttons + + bool Status = true; + + switch (GET_MSG(Message)) { + case kC_COMMAND: + switch (GET_SUBMSG(Message)) { + case kCM_BUTTON: + break; + case kCM_CHECKBUTTON: + if (Parameter1 == 1) { + m_MaximumAcceptedEvents->SetEnabled(m_StopAfter->IsOn()); + } + break; + default: + break; + } + break; + default: + break; + } + + if (Status == false) { + return false; + } + + // Call also base class + return MGUIOptions::ProcessMessage(Message, Parameter1, Parameter2); +} + + +//////////////////////////////////////////////////////////////////////////////// + + +bool MGUIOptionsLoaderSimulationsCosima::OnApply() +{ + // Modify this to store the data in the module! + + cout<<"Settint: "<GetFileName()<(m_Module)->SetSimulationFileName(m_SimulationFileSelector->GetFileName()); + dynamic_cast(m_Module)->SetUseStopAfter(m_StopAfter->IsOn()); + dynamic_cast(m_Module)->SetMaximumAcceptedEvents(m_MaximumAcceptedEvents->GetAsInt()); + + return true; +} + + +// MGUIOptionsLoaderSimulationsCosima: the end... +//////////////////////////////////////////////////////////////////////////////// diff --git a/src/MGUIOptionsReceiverBalloon.cxx b/src/MGUIOptionsReceiverBalloon.cxx deleted file mode 100644 index 11d6a0bd..00000000 --- a/src/MGUIOptionsReceiverBalloon.cxx +++ /dev/null @@ -1,196 +0,0 @@ -/* - * MGUIOptionsReceiverBalloon.cxx - * - * - * Copyright (C) by Andreas Zoglauer. - * All rights reserved. - * - * - * This code implementation is the intellectual property of - * Andreas Zoglauer. - * - * By copying, distributing or modifying the Program (or any work - * based on the Program) you indicate your acceptance of this statement, - * and all its terms. - * - */ - - -// Include the header: -#include "MGUIOptionsReceiverBalloon.h" - -// Standard libs: - -// ROOT libs: -#include -#include -#include -#include - -// MEGAlib libs: -#include "MStreams.h" -#include "MModule.h" -#include "MModuleReceiverBalloon.h" - - -//////////////////////////////////////////////////////////////////////////////// - - -#ifdef ___CLING___ -ClassImp(MGUIOptionsReceiverBalloon) -#endif - - -//////////////////////////////////////////////////////////////////////////////// - - -MGUIOptionsReceiverBalloon::MGUIOptionsReceiverBalloon(MModule* Module) - : MGUIOptions(Module) -{ - // standard constructor -} - - -//////////////////////////////////////////////////////////////////////////////// - - -MGUIOptionsReceiverBalloon::~MGUIOptionsReceiverBalloon() -{ - // kDeepCleanup is activated -} - - -//////////////////////////////////////////////////////////////////////////////// - - -void MGUIOptionsReceiverBalloon::Create() -{ - PreCreate(); - - TGLayoutHints* LabelLayout = new TGLayoutHints(kLHintsTop | kLHintsLeft, 0, 0, m_FontScaler*20, m_FontScaler*2); - TGLayoutHints* ContentLayout = new TGLayoutHints(kLHintsTop | kLHintsLeft | kLHintsExpandX, 0, 0, m_FontScaler*2, m_FontScaler*2); - - TGLabel* HandshakerLabel = new TGLabel(m_OptionsFrame, "Connection to the distributor:"); - m_OptionsFrame->AddFrame(HandshakerLabel, LabelLayout); - - m_DistributorName = new MGUIEEntry(m_OptionsFrame, "Distributor IP (e.g. 128.32.13.133): ", false, - dynamic_cast(m_Module)->GetDistributorName()); - m_OptionsFrame->AddFrame(m_DistributorName, ContentLayout); - - m_DistributorPort = new MGUIEEntry(m_OptionsFrame, "Distributor listening port (e.g. 21526): ", false, - dynamic_cast(m_Module)->GetDistributorPort()); - m_OptionsFrame->AddFrame(m_DistributorPort, ContentLayout); - - m_DistributorStreamID = new MGUIEEntry(m_OptionsFrame, "Stream ID (e.g. ALL): ", false, - dynamic_cast(m_Module)->GetDistributorStreamID()); - m_OptionsFrame->AddFrame(m_DistributorStreamID, ContentLayout); - - /* - TGLabel* SendToLabel = new TGLabel(m_OptionsFrame, "Connection where the data should be sent to:"); - m_OptionsFrame->AddFrame(SendToLabel, LabelLayout); - - m_SendToName = new MGUIEEntry(m_OptionsFrame, "Name/IP of the machine where we send the data to: ", false, - dynamic_cast(m_Module)->GetLocalReceivingHostName()); - m_OptionsFrame->AddFrame(m_SendToName, ContentLayout); - - m_SendToPort = new MGUIEEntry(m_OptionsFrame, "Port on the machine where we send the data to: ", false, - dynamic_cast(m_Module)->GetLocalReceivingPort()); - m_OptionsFrame->AddFrame(m_SendToPort, ContentLayout); - */ - - m_DataMode = new MGUIERBList(m_OptionsFrame, "Choose the data to look at: "); - m_DataMode->Add("Raw mode"); - m_DataMode->Add("Compton mode"); - m_DataMode->Add("Both"); - m_DataMode->SetSelected((int) dynamic_cast(m_Module)->GetDataSelectionMode()); - m_DataMode->Create(); - m_OptionsFrame->AddFrame(m_DataMode, LabelLayout); - - m_AspectMode = new MGUIERBList(m_OptionsFrame, "Choose the aspect mode"); - m_AspectMode->Add("GPS"); - m_AspectMode->Add("Magnetometer"); - m_AspectMode->Add("None"); - m_AspectMode->SetSelected((int) dynamic_cast(m_Module)->GetAspectMode()); - m_AspectMode->Create(); - m_OptionsFrame->AddFrame(m_AspectMode, LabelLayout); - - m_FileSelector = new MGUIEFileSelector(m_OptionsFrame, "If a file is selected, then the input stream is saved as roa :", - dynamic_cast(m_Module)->GetRoaFileName()); - m_FileSelector->SetFileType("Read-out file", "*.roa"); - m_OptionsFrame->AddFrame(m_FileSelector, ContentLayout); - - - - PostCreate(); -} - - -//////////////////////////////////////////////////////////////////////////////// - - -bool MGUIOptionsReceiverBalloon::ProcessMessage(long Message, long Parameter1, long Parameter2) -{ - // Modify here if you have more buttons - - bool Status = true; - - switch (GET_MSG(Message)) { - case kC_COMMAND: - switch (GET_SUBMSG(Message)) { - case kCM_BUTTON: - break; - default: - break; - } - break; - default: - break; - } - - if (Status == false) { - return false; - } - - // Call also base class - return MGUIOptions::ProcessMessage(Message, Parameter1, Parameter2); -} - - -//////////////////////////////////////////////////////////////////////////////// - - -bool MGUIOptionsReceiverBalloon::OnApply() -{ - // Modify this to store the data in the module! - - dynamic_cast(m_Module)->SetDistributorName(m_DistributorName->GetAsString()); - dynamic_cast(m_Module)->SetDistributorPort(m_DistributorPort->GetAsInt()); - dynamic_cast(m_Module)->SetDistributorStreamID(m_DistributorStreamID->GetAsString()); - - //dynamic_cast(m_Module)->SetLocalReceivingHostName(m_SendToName->GetAsString()); - //dynamic_cast(m_Module)->SetLocalReceivingPort(m_SendToPort->GetAsInt()); - - if (m_DataMode->GetSelected() == 0) { - dynamic_cast(m_Module)->SetDataSelectionMode(MBinaryFlightDataParserDataModes::c_Raw); - } else if (m_DataMode->GetSelected() == 1) { - dynamic_cast(m_Module)->SetDataSelectionMode(MBinaryFlightDataParserDataModes::c_Compton); - } else if (m_DataMode->GetSelected() == 2) { - dynamic_cast(m_Module)->SetDataSelectionMode(MBinaryFlightDataParserDataModes::c_All); - } - - if (m_AspectMode->GetSelected() == 0) { - dynamic_cast(m_Module)->SetAspectMode(MBinaryFlightDataParserAspectModes::c_GPS); - } else if (m_AspectMode->GetSelected() == 1) { - dynamic_cast(m_Module)->SetAspectMode(MBinaryFlightDataParserAspectModes::c_Magnetometer); - } else if (m_AspectMode->GetSelected() == 2) { - dynamic_cast(m_Module)->SetAspectMode(MBinaryFlightDataParserAspectModes::c_Neither); - } - - dynamic_cast(m_Module)->SetRoaFileName(m_FileSelector->GetFileName()); - - return true; -} - - -// MGUIOptionsReceiverBalloon: the end... -//////////////////////////////////////////////////////////////////////////////// diff --git a/src/MGUIOptionsTACcut.cxx b/src/MGUIOptionsTACcut.cxx new file mode 100644 index 00000000..e410d65b --- /dev/null +++ b/src/MGUIOptionsTACcut.cxx @@ -0,0 +1,137 @@ +/* + * MGUIOptionsTACcut +.cxx + * + * + * Copyright (C) by Andreas Zoglauer + * All rights reserved. + * + * + * This code implementation is the intellectual property of + * Jau-Shian Liang. + * + * By copying, distributing or modifying the Program (or any work + * based on the Program) you indicate your acceptance of this statement, + * and all its terms. + * + */ + + +// Include the header: +#include "MGUIOptionsTACcut.h" + +// Standard libs: + +// ROOT libs: +#include +#include +#include +#include +#include + +// MEGAlib libs: +#include "MStreams.h" +#include "MString.h" +#include "MGUIEFileSelector.h" +#include "MGUIEMinMaxEntry.h" +#include "MGUIEEntry.h" + +// Nuclearizer libs: +#include "MModuleTACcut.h" + + +//////////////////////////////////////////////////////////////////////////////// + + +#ifdef ___CLING___ +ClassImp(MGUIOptionsTACcut +) +#endif + + +//////////////////////////////////////////////////////////////////////////////// + + +MGUIOptionsTACcut::MGUIOptionsTACcut(MModule* Module) + : MGUIOptions(Module) +{ + // standard constructor +} + + +//////////////////////////////////////////////////////////////////////////////// + + +MGUIOptionsTACcut::~MGUIOptionsTACcut() +{ + // kDeepCleanup is activated +} + + +//////////////////////////////////////////////////////////////////////////////// + + +void MGUIOptionsTACcut::Create() +{ + PreCreate(); + + m_TACCalFileSelector = new MGUIEFileSelector(m_OptionsFrame, "Select a TAC Calibration file:", dynamic_cast(m_Module)->GetTACCalFileName()); + m_TACCalFileSelector->SetFileType("TAC", "*.csv"); + TGLayoutHints* TACCalLayout = new TGLayoutHints(kLHintsTop | kLHintsCenterX | kLHintsExpandX, 10, 10, 10, 10); + m_OptionsFrame->AddFrame(m_TACCalFileSelector, TACCalLayout); + + m_TACCutFileSelector = new MGUIEFileSelector(m_OptionsFrame, "Select a TAC Cut file:", dynamic_cast(m_Module)->GetTACCutFileName()); + m_TACCutFileSelector->SetFileType("TAC", "*.csv"); + TGLayoutHints* TACCutLayout = new TGLayoutHints(kLHintsTop | kLHintsCenterX | kLHintsExpandX, 10, 10, 10, 10); + m_OptionsFrame->AddFrame(m_TACCutFileSelector, TACCutLayout); + + PostCreate(); +} + + +//////////////////////////////////////////////////////////////////////////////// + + +bool MGUIOptionsTACcut::ProcessMessage(long Message, long Parameter1, long Parameter2) +{ + // Modify here if you have more buttons + + bool Status = true; + + switch (GET_MSG(Message)) { + case kC_COMMAND: + switch (GET_SUBMSG(Message)) { + case kCM_BUTTON: + break; + default: + break; + } + break; + default: + break; + } + + if (Status == false) { + return false; + } + + // Call also base class + return MGUIOptions::ProcessMessage(Message, Parameter1, Parameter2); +} + + +//////////////////////////////////////////////////////////////////////////////// + + +bool MGUIOptionsTACcut::OnApply() +{ + // Store the data in the module + dynamic_cast(m_Module)->SetTACCalFileName(m_TACCalFileSelector->GetFileName()); + dynamic_cast(m_Module)->SetTACCutFileName(m_TACCutFileSelector->GetFileName()); + + return true; +} + + +// MGUIOptionsTACcut: the end... +//////////////////////////////////////////////////////////////////////////////// diff --git a/src/MModuleChargeSharingCorrection.cxx b/src/MModuleChargeSharingCorrection.cxx deleted file mode 100644 index 525580e4..00000000 --- a/src/MModuleChargeSharingCorrection.cxx +++ /dev/null @@ -1,471 +0,0 @@ -/* -* MModuleChargeSharingCorrection.cxx -* -* -* Copyright (C) 2009-2009 by Mark Bandstra. -* All rights reserved. -* -* -* This code implementation is the intellectual property of -* Mark Bandstra. -* -* By copying, distributing or modifying the Program (or any work -* based on the Program) you indicate your acceptance of this statement, -* and all its terms. -* -*/ - - -//////////////////////////////////////////////////////////////////////////////// -// -// MModuleChargeSharingCorrection -// -//////////////////////////////////////////////////////////////////////////////// - - -// Include the header: -#include "MModuleChargeSharingCorrection.h" - -// Standard libs: -#include -#include -#include -#include -#include - -// ROOT libs: -#include "TGClient.h" -#include "TFile.h" - -// MEGAlib libs: -#include "MStreams.h" -#include "MVector.h" -#include "MString.h" - - -//////////////////////////////////////////////////////////////////////////////// - - -#ifdef ___CLING___ -ClassImp(MModuleChargeSharingCorrection) -#endif - - -//////////////////////////////////////////////////////////////////////////////// - - -MModuleChargeSharingCorrection::MModuleChargeSharingCorrection() : MModule() -{ - // Construct an instance of MModuleChargeSharingCorrection - - // Set all module relevant information - - // Set the module name --- has to be unique - m_Name = "Charge sharing correction"; - - // Set the XML tag --- has to be unique --- no spaces allowed - m_XmlTag = "ChargeSharingCorrection"; - - // Set all modules, which have to be done before this module - AddPreceedingModuleType(MAssembly::c_EnergyCalibration); - AddPreceedingModuleType(MAssembly::c_StripPairing); - - // Set all types this modules handles - AddModuleType(MAssembly::c_ChargeSharingCorrection); - - // Set all modules, which can follow this module - AddSucceedingModuleType(MAssembly::c_NoRestriction); - - // Set if this module has an options GUI - // If true, overwrite ShowOptionsGUI() with the call to the GUI! - m_HasOptionsGUI = false; - // If true, you have to derive a class from MGUIOptions (use MGUIOptionsTemplate) - // and implement all your GUI options - -// m_nSources = 4; - m_nSources = 3; -} - - -//////////////////////////////////////////////////////////////////////////////// - - -MModuleChargeSharingCorrection::~MModuleChargeSharingCorrection() -{ - // Delete this instance of MModuleChargeSharingCorrection -} - - -//////////////////////////////////////////////////////////////////////////////// - - -bool MModuleChargeSharingCorrection::Initialize() -{ - // Initialize the module - - //load correction files - LoadCorrectionInfo(); -// LoadCorrectionInfoUpdated(); - - return true; -} - - -//////////////////////////////////////////////////////////////////////////////// - - -bool MModuleChargeSharingCorrection::AnalyzeEvent(MReadOutAssembly* Event) -{ - - - // Main data analysis routine, which updates the event to a new level - - unsigned int NHits = Event->GetNHits(); - - if (Event->IsStripPairingIncomplete() == false){ - - for (unsigned int i_hit=0; i_hitGetHit(i_hit); - unsigned int NStripHits = H->GetNStripHits(); - unsigned int NXStripHits = 0, NYStripHits = 0; - //int DetectorNumber; - for (unsigned int i_sh=0; i_shGetStripHit(i_sh); - //DetectorNumber = SH->GetDetectorID(); - if (SH->IsLowVoltageStrip() == true) { NXStripHits++; } else { NYStripHits++; } - } - - //Check for 1 pixel event and sharing event.. - MStripHit *SHX, *SHY; - if ( (NStripHits==2) && (NXStripHits==1) && (NYStripHits==1) ) - { - SHX = H->GetStripHit(0); - SHY = H->GetStripHit(1); - if ( !SHX->IsLowVoltageStrip() ) - { - SHX = H->GetStripHit(1); - SHY = H->GetStripHit(0); - } - // assign negative side energy to this hit - H->SetEnergy(SHY->GetEnergy()); - H->SetEnergyResolution(SHY->GetEnergyResolution()); - } - else if (( (NStripHits==3) && (((NXStripHits==1)&&(NYStripHits==2)) || - ((NXStripHits==2)&&(NYStripHits==1))) ) || - ( (NStripHits==4) && (NXStripHits==2) && (NYStripHits==2))) - { - - int i_sxhit=0; - int i_syhit=0; - int XStripID[NXStripHits]; - int YStripID[NYStripHits]; - double XTotalEnergy=0.0,XEnergyVar=0.0; - double YTotalEnergy=0.0,YEnergyVar=0.0; - double XEnergy[NXStripHits]; - double YEnergy[NYStripHits]; - int detector = 0; - // Get the X and Y strip numbers, and calculate the total energy for each side - for (unsigned int i_s_hit=0; i_s_hit < NStripHits; i_s_hit++) - { - if (H->GetStripHit(i_s_hit)->IsLowVoltageStrip() == true) - { - XStripID[i_sxhit] = H->GetStripHit(i_s_hit)->GetStripID(); - XEnergy[i_sxhit] = H->GetStripHit(i_s_hit)->GetEnergy(); - - XTotalEnergy += H->GetStripHit(i_s_hit)->GetEnergy(); - XEnergyVar += (H->GetStripHit(i_s_hit)->GetEnergyResolution()) - *(H->GetStripHit(i_s_hit)->GetEnergyResolution()); - i_sxhit++; - - detector = H->GetStripHit(i_s_hit)->GetDetectorID(); - } - else - { - YStripID[i_syhit] = H->GetStripHit(i_s_hit)->GetStripID(); - YEnergy[i_syhit] = H->GetStripHit(i_s_hit)->GetEnergy(); - - YTotalEnergy += H->GetStripHit(i_s_hit)->GetEnergy(); - YEnergyVar += (H->GetStripHit(i_s_hit)->GetEnergyResolution()) - *(H->GetStripHit(i_s_hit)->GetEnergyResolution()); - i_syhit++; - } - } - if (NXStripHits==2 && NYStripHits==1) - { - if (((XStripID[0]-XStripID[1])==1) || ((XStripID[0]-XStripID[1])==-1)) - { - double correctedE0 = EstimateE0(XEnergy[0],XEnergy[1],YTotalEnergy,detector,0); - //for now, choose the higher energy - if (correctedE0 < YTotalEnergy){ - H->SetEnergy(YTotalEnergy); - H->SetEnergyResolution(sqrt(YEnergyVar)); - } - else { -// if (correctedE0 < YTotalEnergy){ - H->SetEnergy(correctedE0); - H->SetEnergyResolution(sqrt(XEnergyVar)); - // } - } - } - } - else if (NYStripHits==2 && NXStripHits==1) - { - if (((YStripID[0]-YStripID[1])==1) || ((YStripID[0]-YStripID[1])==-1)) - { - //looks like we don't need to do correction on Y side?! -// double correctedE0 = EstimateE0(YEnergy[0],YEnergy[1],detector,1); - //for now, choose the higher energy -// if (correctedE0 < XTotalEnergy){ - - //print original hit energy -/* cout << "-----------------" << endl; - cout << "n side" << endl; - cout << "x total energy: " << XTotalEnergy << endl; - cout << "y total energy: " << YTotalEnergy << endl; - cout << "........" << endl; - cout << "original hit energy: " << H->GetEnergy() << endl; -*/ - if (YTotalEnergy < XTotalEnergy){ - H->SetEnergy(XTotalEnergy); - H->SetEnergyResolution(sqrt(XEnergyVar)); - } - else { -// H->SetEnergy(correctedE0); - H->SetEnergy(YTotalEnergy); - H->SetEnergyResolution(sqrt(YEnergyVar)); - } - - //print final hit energy -// cout << "final hit energy: " << H->GetEnergy() << endl; -// dummy_func(); - } - } - else if (NYStripHits==2 && NXStripHits==2) - { - if ( (((YStripID[0]-YStripID[1])==1) || ((YStripID[0]-YStripID[1])==-1)) && - (((XStripID[0]-XStripID[1])==1) || ((XStripID[0]-XStripID[1])==-1))) - { - double correctedXE0 = EstimateE0(XEnergy[0],XEnergy[1],YTotalEnergy,detector,0); -// double correctedYE0 = EstimateE0(YEnergy[0],YEnergy[1],detector,1); - //for now, choose the higher energy -// if (correctedXE0 > correctedYE0){ - if (correctedXE0 > YTotalEnergy){ - H->SetEnergy(correctedXE0); - H->SetEnergyResolution(sqrt(XEnergyVar)); - } - else { -// H->SetEnergy(correctedYE0); - H->SetEnergy(YTotalEnergy); - H->SetEnergyResolution(sqrt(YEnergyVar)); - } - } - } - else - { - // can't do anything to help this hit - } - } - else - { - // can't do anything to help this hit - } - } - } - return true; - - -}; - -vector > MModuleChargeSharingCorrection::ParseOneSource(string filename){ - - ifstream clFile; - clFile.open(filename); - - vector bOneDet; - vector > bOneSource; - - string line; - int c=0; - double B; - - if (clFile.is_open()){ - while (!clFile.eof()){ - c++; - getline(clFile,line); - - if (c <= 24){ - B = stod(line); - if (c%2 != 0){ - bOneDet.push_back(B); - } - else { - bOneDet.push_back(B); - bOneSource.push_back(bOneDet); - bOneDet.clear(); - } - } - } - } - - clFile.close(); - -// cout << "291" << endl; - return bOneSource; - -}; - -void MModuleChargeSharingCorrection::LoadCorrectionInfoUpdated(){ - - string filename = "./ChargeLossCorrectionScaled_Ba133.log"; - - m_Bfrac = ParseOneSource(filename); - -}; - - -void MModuleChargeSharingCorrection::LoadCorrectionInfo(){ - - vector filenames; - filenames.push_back("./ChargeLossCorrectionScaled_Co57.log"); - filenames.push_back("./ChargeLossCorrectionScaled_Ba133.log"); - filenames.push_back("./ChargeLossCorrectionScaled_Cs137_2.log"); -// filenames.push_back("./ChargeLossCoeffs_Co60.log"); - - for (unsigned int i=0; i > oneSource = ParseOneSource(filenames.at(i)); - m_B.push_back(oneSource); - oneSource.clear(); - } - - //find coefficients for linear interpolation -// double energies[4] = {122,356,662,1333}; - double energies[3] = {122,356,662}; - double points[m_nSources]; - double A0; - double A1; - - for (int det=0; det<12; det++){ - for (int side=0; side<2; side++){ -// points[0] = m_B.at(0).at(det).at(side); -// points[1] = m_B.at(1).at(det).at(side); -// points[2] = m_B.at(2).at(det).at(side); -// points[3] = m_B.at(3).at(det).at(side); - - points[0] = m_B.at(0).at(det).at(side); - points[1] = m_B.at(1).at(det).at(side); - points[2] = m_B.at(2).at(det).at(side); - - TGraph *g = new TGraph(m_nSources,energies,points); - TF1 *f = new TF1("f","[0]+[1]*x",energies[0],energies[m_nSources-1]); - g->Fit("f","RQ"); - - A0 = f->GetParameter(0); - A1 = f->GetParameter(1); - - m_linInterpCoeffs[det][side][0] = A0; - m_linInterpCoeffs[det][side][1] = A1; - - delete g; - delete f; - - } - } - - cout << "Charge loss correction loaded" << endl; - -}; - - -double MModuleChargeSharingCorrection::Interpolate(double E0, int det, int side){ - - double A0 = m_linInterpCoeffs[det][side][0]; - double A1 = m_linInterpCoeffs[det][side][1]; - - double val = A0+A1*E0; - -// cout << m_B.at(1).at(det).at(side) << '\t' << val << endl; - - return val; - -}; - - - -double MModuleChargeSharingCorrection::EstimateE0(double enOne, double enTwo, double eOtherSide, int det, int side){ - - double sum = enOne+enTwo; - double diff = fabs(enOne-enTwo); - double frac = diff/sum; - double scaled_sum = sum/eOtherSide; - - //NOT SURE ABOUT THIS -// if (scaled_sum > 1){ return eOtherSide; }//enOne+enTwo; } - -// double b = Interpolate(enOne,det,side); -// double b = Interpolate(sum,det,side); - double b = Interpolate(eOtherSide,det,side); -// double b = 0.01; -// double b = m_Bfrac[det][side]; - -// double DMax = sum*((sum-511./2)/(sum+511./2)); - double E0 = 356; - double DMax = E0*((E0-511./2)/(E0+511./2)); - - double correctedE0 = sum; -// if (diff >= DMax+0.15*sum){ -// if (diff >= DMax+0.15*E0){ -// if (frac >= 0.5){ -// if (scaled_sum < 0.75){ -// if (sum < 300){ -// correctedE0 = sum/(1/(2-b)*(scaled_sum+sqrt(scaled_sum*scaled_sum - b*(2-b)*frac*frac))); -// if (sum eOtherSide) { cout << correctedE0 << '\t' << eOtherSide << endl; correctedE0 = eOtherSide; } - -// if (correctedE0/662. > 1){ correctedE0 = sum; } - - return correctedE0; - -}; - - -//////////////////////////////////////////////////////////////////////////////// - - -void MModuleChargeSharingCorrection::ShowOptionsGUI() -{ - // Show the options GUI - or do nothing -} - -//////////////////////////////////////////////////////////////////////////////// - -void MModuleChargeSharingCorrection::dummy_func(){ - - return; - -}; - - -// MModuleChargeSharingCorrection.cxx: the end... -//////////////////////////////////////////////////////////////////////////////// diff --git a/src/MModuleCrosstalkCorrection.cxx b/src/MModuleCrosstalkCorrection.cxx deleted file mode 100644 index 52e43611..00000000 --- a/src/MModuleCrosstalkCorrection.cxx +++ /dev/null @@ -1,618 +0,0 @@ -/* - * MModuleCrosstalkCorrection.cxx - * - * - * Copyright (C) 2009-2009 by Mark Bandstra. - * All rights reserved. - * - * - * This code implementation is the intellectual property of - * Mark Bandstra. - * - * By copying, distributing or modifying the Program (or any work - * based on the Program) you indicate your acceptance of this statement, - * and all its terms. - * - */ - - -//////////////////////////////////////////////////////////////////////////////// -// -// MModuleCrosstalkCorrection -// -//////////////////////////////////////////////////////////////////////////////// - - -// Include the header: -#include "MModuleCrosstalkCorrection.h" -#include "MGUIOptionsCrosstalkCorrection.h" - -// Standard libs: -#include -#include -#include -#include -#include -#include - -// ROOT libs: -#include "TGClient.h" -#include "TFile.h" -#include "TMatrixD.h" - -// MEGAlib libs: -#include "MStreams.h" -#include "MVector.h" -#include "MString.h" - - -//////////////////////////////////////////////////////////////////////////////// - - -#ifdef ___CLING___ -ClassImp(MModuleCrosstalkCorrection) -#endif - - -//////////////////////////////////////////////////////////////////////////////// - - -MModuleCrosstalkCorrection::MModuleCrosstalkCorrection() : MModule() -{ - // Construct an instance of MModuleCrosstalkCorrection - - // Set all module relevant information - - // Set the module name --- has to be unique - m_Name = "Cross-talk energy correction"; - - // Set the XML tag --- has to be unique --- no spaces allowed - m_XmlTag = "CrosstalkCorrection"; - - // Set all modules, which have to be done before this module - AddPreceedingModuleType(MAssembly::c_EventLoader); - AddPreceedingModuleType(MAssembly::c_EnergyCalibration); - - // Set all types this modules handles - AddModuleType(MAssembly::c_CrosstalkCorrection); - - // Set all modules, which can follow this module - AddSucceedingModuleType(MAssembly::c_NoRestriction); - - // Set if this module has an options GUI - // If true, overwrite ShowOptionsGUI() with the call to the GUI! - m_HasOptionsGUI = true; -// If true, you have to derive a class from MGUIOptions (use MGUIOptionsTemplate) - // and implement all your GUI options - - // Allow the use of multiple threads and instances - m_AllowMultiThreading = true; - m_AllowMultipleInstances = true; -} - - -//////////////////////////////////////////////////////////////////////////////// - - -MModuleCrosstalkCorrection::~MModuleCrosstalkCorrection() -{ - // Delete this instance of MModuleCrosstalkCorrection -} - - -//////////////////////////////////////////////////////////////////////////////// - - -bool MModuleCrosstalkCorrection::Initialize() -{ - // Initialize the module - - - - - //for (int DetectorNumber=0; DetectorNumber<10; DetectorNumber++) { - // mout << "Attempting to load energy crosstalk data for D" << DetectorNumber << endl; - - // Construct the filename of the detector-specific calibration file - // string DetectorNumberString; - // stringstream temp; - // temp << setfill('0') << setw(1) << DetectorNumber; - // DetectorNumberString = temp.str(); - // MString FileName = (MString)std::getenv ("NUCLEARIZER_CAL") - // +"/crosstalk_D"+ DetectorNumberString + ".csv"; - - // Set calibration to default - for (int detnum=0; detnum < 12; detnum++) { - for (int side = 0; side <= 1; side++) { - for (unsigned int skip = 0; skip <= 2; skip++) { - m_CrosstalkCoeffs[detnum][side][skip][0] = 0.; - m_CrosstalkCoeffs[detnum][side][skip][1] = 0.; - } - } - } - - - // Reset flags telling if calibration has been loaded - for (int detnum=0; detnum < 12; detnum++) { - for (unsigned int skip=0; skip <= 2; skip++) { - m_IsCalibrationLoaded[detnum][0][skip] = false; - m_IsCalibrationLoaded[detnum][1][skip] = false; - } - } - - - // Read in the file from the Nuclearizer GUI - MFile::ExpandFileName(m_FileName); - fstream File; - File.open(m_FileName, ios_base::in); - // Read the calibration coefficients line-by-line - if (File.is_open() == false) { - mout<<"***Warning: Unable to open file for crosstalk calibration"<GetDetectorID(); - int det2 = SH2->GetDetectorID(); - int side1 = 0, side2 = 0; - int strip1 = SH1->GetStripID(); - int strip2 = SH2->GetStripID(); - if (not SH1->IsLowVoltageStrip()) side1 = 1; - if (not SH2->IsLowVoltageStrip()) side2 = 1; - if (det1 != det2) return (det1GetNHits(); sh++) { - unsigned int NStripHits = Event->GetNStripHits(); - vector StripHits; - bool debug=false; - - if (debug) - { - mout << endl; - mout << "#######################################" << endl; - mout << "Event " << Event->GetID() << endl; - } - // Loop over all detectors - for (int i_det=0; i_det<12; i_det++) - { - // Loop over detector sides - for (unsigned int i_side=0; i_side<=1; i_side++) - { - StripHits.clear(); - // Extract strip hits from the given side of the given detector - for (unsigned int i_sh=0; i_shGetStripHit(i_sh); - if ((SH->GetDetectorID()==i_det) - && (((SH->IsLowVoltageStrip()==true) && (i_side==0)) - || ((SH->IsLowVoltageStrip()==false) && (i_side==1)))) - { - StripHits.push_back(SH); - } - } - if (StripHits.size()>=2) - { - // Perform the cross-talk correction! - CorrectCrosstalk(StripHits, i_det, i_side); - } - } - } - - - // Remove any strips that have negative energy after the correction FROM the Hits -- we still keep them around - // in the strip hits -/* const double RemovalEneryLimit = 5.0; - for (unsigned int h = 0; h < Event->GetNHits(); ++h) { - unsigned int i = 0; - while (i < Event->GetHit(h)->GetNStripHits()) { - if (Event->GetHit(h)->GetStripHit(i)->GetEnergy() <= RemovalEneryLimit) { - if (g_Verbosity >= c_Info) { - mout << "Removing strip hit " << i << " for having low or negative energy: " - << Event->GetHit(h)->GetStripHit(i)->GetEnergy() << " keV" << endl; - } - Event->GetHit(h)->RemoveStripHit(i); - } else { - ++i; - } - } - } - // Now remove hits with no strip hits - unsigned int hit = 0; - while (hit < Event->GetNHits()) { - if (Event->GetHit(hit)->GetNStripHits() == 0) { - Event->RemoveHit(hit); - } else { - ++hit; - } - } - */ - /* - // Recalculate the total hit energy now the the individual strips have been corrected. - for (unsigned int sh = 0; sh < Event->GetNHits(); sh++) { - double energy = 0; - // if y strip was hit multiple times, need to use the x energy - if (Event->GetHit(sh)->GetStripHitMultipleTimesX()){ - for (unsigned int sh_i = 0; sh_i < Event->GetHit(sh)->GetNStripHits(); sh_i++){ - if (Event->GetHit(sh)->GetStripHit(sh_i)->IsLowVoltageStrip() == false){ - energy = energy + Event->GetHit(sh)->GetStripHit(sh_i)->GetEnergy(); - } - } - } - else{ - for (unsigned int sh_i = 0; sh_i < Event->GetHit(sh)->GetNStripHits(); sh_i++) { - // for now, just define the hit energy as the sum of the y strip hits. This could later be modifided to take an average of the two sides. - if (Event->GetHit(sh)->GetStripHit(sh_i)->IsLowVoltageStrip() == true) { - energy = energy + Event->GetHit(sh)->GetStripHit(sh_i)->GetEnergy(); - } - } - } - - Event->GetHit(sh)->SetEnergy(energy); - } - */ - - /* - // Recalculate the total hit energy now the the individual strips have been corrected. - for (unsigned int sh = 0; sh < Event->GetNHits(); sh++) { - double energy = 0; - // if y strip was hit multiple times, need to use the x energy - if (Event->GetHit(sh)->GetStripHitMultipleTimesY()){ - for (unsigned int sh_i = 0; sh_i < Event->GetHit(sh)->GetNStripHits(); sh_i++){ - if (Event->GetHit(sh)->GetStripHit(sh_i)->IsLowVoltageStrip() == true){ - energy = energy + Event->GetHit(sh)->GetStripHit(sh_i)->GetEnergy(); - } - } - } - else{ - for (unsigned int sh_i = 0; sh_i < Event->GetHit(sh)->GetNStripHits(); sh_i++) { - // for now, just define the hit energy as the sum of the y strip hits. This could later be modifided to take an average of the two sides. - if (Event->GetHit(sh)->GetStripHit(sh_i)->IsLowVoltageStrip() == false) { - energy = energy + Event->GetHit(sh)->GetStripHit(sh_i)->GetEnergy(); - } - } - } - - Event->GetHit(sh)->SetEnergy(energy); - } - */ - - - // Recalculate the total hit energy now that the individual strips have been corrected. -/* for (unsigned int sh = 0; sh < Event->GetNHits(); sh++) { - double Energy = 0; - double Resolution = 0.0; - - // Handle what happens if strips have been hit multiple times: - - // If both have been hit multiple times, we don't do anything - we keep the result from the strip pairing - if (Event->GetHit(sh)->GetStripHitMultipleTimesX() == true && - Event->GetHit(sh)->GetStripHitMultipleTimesY() == true) { - continue; - } - // If y strip was hit multiple times, need to use the x energy - else if (Event->GetHit(sh)->GetStripHitMultipleTimesY() == true) { - for (unsigned int sh_i = 0; sh_i < Event->GetHit(sh)->GetNStripHits(); sh_i++){ - if (Event->GetHit(sh)->GetStripHit(sh_i)->IsLowVoltageStrip() == true){ - Energy += Event->GetHit(sh)->GetStripHit(sh_i)->GetEnergy(); - Resolution += pow(Event->GetHit(sh)->GetStripHit(sh_i)->GetEnergyResolution(), 2); - } - } - Resolution = sqrt(Resolution); - //cout<<"Using X (my): "<GetHit(sh)->GetStripHitMultipleTimesX() == true) { - for (unsigned int sh_i = 0; sh_i < Event->GetHit(sh)->GetNStripHits(); sh_i++){ - if (Event->GetHit(sh)->GetStripHit(sh_i)->IsLowVoltageStrip() == false){ - Energy += Event->GetHit(sh)->GetStripHit(sh_i)->GetEnergy(); - Resolution += pow(Event->GetHit(sh)->GetStripHit(sh_i)->GetEnergyResolution(), 2); - } - } - Resolution = sqrt(Resolution); - //cout<<"Using Y (mx): "<GetHit(sh)->GetNStripHits(); sh_i++) { - //for now, just define the hit energy as the sum of the y strip hits. This could later be modifided to take an average of the two sides. - - if (Event->GetHit(sh)->GetStripHit(sh_i)->IsLowVoltageStrip() == false) { - EnergyY += Event->GetHit(sh)->GetStripHit(sh_i)->GetEnergy(); - SigmaYSquared += pow(Event->GetHit(sh)->GetStripHit(sh_i)->GetEnergyResolution(), 2); - } else { - EnergyX += Event->GetHit(sh)->GetStripHit(sh_i)->GetEnergy(); - SigmaXSquared += pow(Event->GetHit(sh)->GetStripHit(sh_i)->GetEnergyResolution(), 2); - } - } - - if (SigmaXSquared > 0 && SigmaYSquared > 0) { - // - double EnergyDiff = fabs(EnergyX - EnergyY); - double MinSigmaSquared = min(SigmaXSquared, SigmaYSquared); - - const double DecisionUsingHigherMeasurement = 4.0; - - if (EnergyDiff > DecisionUsingHigherMeasurement*sqrt(MinSigmaSquared)) { - if (EnergyX > EnergyY) { - Energy = EnergyX; - Resolution = sqrt(SigmaXSquared); - //cout<<"Using X (Y too small): "< 0) { - Energy = EnergyX; - Resolution = sqrt(SigmaXSquared); - //cout<<"Using X: "< 0) { - Energy = EnergyY; - Resolution = sqrt(SigmaYSquared); - //cout<<"Using Y: "<GetHit(sh)->SetEnergy(Energy); - Event->GetHit(sh)->SetEnergyResolution(Resolution); - } -*/ - - Event->SetAnalysisProgress(MAssembly::c_CrosstalkCorrection); - - return true; -} - - -//////////////////////////////////////////////////////////////////////////////// - - -// Method to make the cross-talk correction on a vector of strip hits -// StripHits is a vector of StripHits from one side of one detector -void MModuleCrosstalkCorrection::CorrectCrosstalk(vector StripHits, - int det, unsigned int side) -{ - bool debug=false; - bool debug_matrices=false; - unsigned int N = StripHits.size(); - // Sort the strip hits - sort(StripHits.begin(), StripHits.end(), compare_striphits); - // Cross-talk coefficients - double a0 = m_CrosstalkCoeffs[det][side][0][0]; - double b0 = m_CrosstalkCoeffs[det][side][0][1]; - double a1 = m_CrosstalkCoeffs[det][side][1][0]; - double b1 = m_CrosstalkCoeffs[det][side][1][1]; - double a2 = m_CrosstalkCoeffs[det][side][2][0]; - double b2 = m_CrosstalkCoeffs[det][side][2][1]; - - // Print out the strips, check their order - if (debug && StripHits.size()>0) - { - mout << "++++++++++++++++++++++" << endl; - for (unsigned int j=0; jGetDetectorID() << " " - << !StripHits[j]->IsLowVoltageStrip() << " " - << StripHits[j]->GetStripID() << " " - << StripHits[j]->GetEnergy() << endl; - } - } - - // Make a matrix vector of energies from each strip - TMatrixD Energies(N,1); - double Energy_Total = 0.; - for (unsigned int j=0; jGetEnergy(); - Energy_Total += StripHits[j]->GetEnergy(); - } - if (debug_matrices && N>=2) Energies.Print(); - - // Make a big matrix for the cross-talk corrections - TMatrixD Matrix(N,N); - TMatrixD Constant(N,1); - for (unsigned int i=0; iGetStripID()==(StripHits[i]->GetStripID()+1)) - { - Matrix[i][j] += b0; - Matrix[j][i] += b0; - Constant[i] += a0/2.; - Constant[j] += a0/2.; - } - // Skip-1 neighbor contributions - if (StripHits[j]->GetStripID()==(StripHits[i]->GetStripID()+2)) - { - Matrix[i][j] += b1; - Matrix[j][i] += b1; - Constant[i] += a1/2.; - Constant[j] += a1/2.; - } - // Skip-2 neighbor contributions - // if (StripHits[j]->GetStripID()==(StripHits[i]->GetStripID()+3)) - // { - // Matrix[i][j] += b2; - // Matrix[j][i] += b2; - // Constant[i] += a2/2.; - // Constant[j] += a2/2.; - // } - } - } - if (debug_matrices && N>=2) Constant.Print(); - if (debug_matrices && N>=2) Matrix.Print(); - TMatrixD Inv = Matrix.Invert(); - if (debug_matrices && N>=2) Inv.Print(); - // Calculate final corrected energies - TMatrixD FinalEnergies = TMatrixD(Inv,TMatrixD::kMult,Energies+Constant); //ck changed this to Energies + Constant - if (debug_matrices && N>=2) FinalEnergies.Print(); - for (unsigned int j=0; jSetEnergy(FinalEnergies[j][0]); - } - - // Print out the strips again, check their order and energies - if (debug && StripHits.size()>0) - { - mout << "----------------------" << endl; - for (unsigned int j=0; jGetDetectorID() << " " - << !StripHits[j]->IsLowVoltageStrip() << " " - << StripHits[j]->GetStripID() << " " - << StripHits[j]->GetEnergy() << endl; - } - mout << "++++++++++++++++++++++" << endl; - } - - //CCS: I'm getting a strip hit with negative energy in the depth calibration, - // so just check that energies are still positive here - for (auto SH: StripHits){ - if (SH->GetEnergy() < 0){ - SH->SetEnergy(0); - } - } - -} - - -//////////////////////////////////////////////////////////////////////////////// - - -void MModuleCrosstalkCorrection::ShowOptionsGUI() -{ - // Show the options GUI - - MGUIOptionsCrosstalkCorrection* Options = new MGUIOptionsCrosstalkCorrection(this); - Options->Create(); - gClient->WaitForUnmap(Options); -} - - -//////////////////////////////////////////////////////////////////////////////// - - -bool MModuleCrosstalkCorrection::ReadXmlConfiguration(MXmlNode* Node) -{ - //! Read the configuration data from an XML node - - MXmlNode* FileNameNode = Node->GetNode("FileName"); - if (FileNameNode != 0) { - m_FileName = FileNameNode->GetValue(); - } - return true; -} - - -/////////////////////////////////////////////////////////////////////////////// - - -MXmlNode* MModuleCrosstalkCorrection::CreateXmlConfiguration() -{ - //! Create an XML node tree from the configuration - - MXmlNode* Node = new MXmlNode(0, m_XmlTag); - new MXmlNode(Node, "FileName", m_FileName); - - return Node; - -} - - -// MModuleCrosstalkCorrection.cxx: the end... -//////////////////////////////////////////////////////////////////////////////// diff --git a/src/MModuleDEESMEX.cxx b/src/MModuleDEESMEX.cxx new file mode 100644 index 00000000..071a8de4 --- /dev/null +++ b/src/MModuleDEESMEX.cxx @@ -0,0 +1,294 @@ +/* + * MModuleDEESMEX.cxx + * + * + * Copyright (C) by Andreas Zoglauer. + * All rights reserved. + * + * + * This code implementation is the intellectual property of + * Andreas Zoglauer. + * + * By copying, distributing or modifying the Program (or any work + * based on the Program) you indicate your acceptance of this statement, + * and all its terms. + * + */ + + +//////////////////////////////////////////////////////////////////////////////// +// +// MModuleDEESMEX +// +//////////////////////////////////////////////////////////////////////////////// + + +// Include the header: +#include "MModuleDEESMEX.h" + +// Standard libs: + +// ROOT libs: +#include "TGClient.h" + +// MEGAlib libs: +#include "MGUIOptionsDEESMEX.h" + + +//////////////////////////////////////////////////////////////////////////////// + + +#ifdef ___CLING___ +ClassImp(MModuleDEESMEX) +#endif + + +//////////////////////////////////////////////////////////////////////////////// + + +MModuleDEESMEX::MModuleDEESMEX() : MModule() +{ + // Construct an instance of MModuleDEESMEX + + // Set the module name --- has to be unique + m_Name = "Detector effects engine for COSI SMEX"; + + // Set the XML tag --- has to be unique --- no spaces allowed + m_XmlTag = "XmlTagDEESMEX"; + + // This is a special start module which can generate its own events + m_IsStartModule = false; + + // Allow the use of multiple threads and instances + m_AllowMultiThreading = false; + m_AllowMultipleInstances = false; + + // Set all modules, which have to be done before this module + AddPreceedingModuleType(MAssembly::c_EventLoaderSimulation); + + // Set all types this modules handles + AddModuleType(MAssembly::c_DetectorEffectsEngine); + + // Set all modules, which can follow this module + AddSucceedingModuleType(MAssembly::c_NoRestriction); + + m_HasOptionsGUI = true; +} + + +//////////////////////////////////////////////////////////////////////////////// + + +MModuleDEESMEX::~MModuleDEESMEX() +{ + // Delete this instance of MModuleDEESMEX +} + + +//////////////////////////////////////////////////////////////////////////////// + + +bool MModuleDEESMEX::Initialize() +{ + // Initialize the module + + // Each Initialize() should handle its own error messaging + if (m_Intake.Initialize() == false) return false; + if (m_RandomCoincidence.Initialize() == false) return false; + if (m_ShieldEnergyCorrection.Initialize() == false) return false; + if (m_ShieldReadout.Initialize() == false) return false; + if (m_ShieldTrigger.Initialize() == false) return false; + if (m_ChargeTransport.Initialize() == false) return false; + if (m_StripReadout.Initialize() == false) return false; + if (m_StripTrigger.Initialize() == false) return false; + if (m_DepthReadout.Initialize() == false) return false; + if (m_Output.Initialize() == false) return false; + + return MModule::Initialize(); +} + + +//////////////////////////////////////////////////////////////////////////////// + + +bool MModuleDEESMEX::AnalyzeEvent(MReadOutAssembly* Event) +{ + // The main DEE loop + + // Step (1): + // Handle dead times - needs to happen in main DEE class + + if (Event->GetTime() < m_DeadTimeEnd) { + // Flag event for deletion + return true; + } + + // Step (2): Fill the MDEEStripHits of the event + m_Intake.Clear(); + m_Intake.AnalyzeEvent(Event); + + // Step (3): Merge coincident events + + // Don't know how to handle random coincidences yet + // We do have an input queue thus I might just look if we have enough events in there + // If not flag the Supervisor to push more in + + m_RandomCoincidence.Clear(); + // m_RandomCoincidence.AddEventToMerge(); + m_RandomCoincidence.AnalyzeEvent(Event); + + // Need to check if we are still in random coincidence time + + // Step (4): Handle the effect of the light transport to the SiPMs as an energy correction + m_ShieldEnergyCorrection.Clear(); + m_ShieldEnergyCorrection.AnalyzeEvent(Event); + + + // Step (5): Handle the shield readout: Energy to ADCs and thresholds + m_ShieldReadout.Clear(); + m_ShieldReadout.AnalyzeEvent(Event); + + + // Step (6): the shield veto / trigger, handle pre-scalers, calculate dead-time, calculate random coincidence time + m_ShieldTrigger.Clear(); + m_ShieldTrigger.AnalyzeEvent(Event); + if (m_ShieldTrigger.HasVeto() == true) { + if (m_ShieldTrigger.GetDeadTimeEnd() > m_DeadTimeEnd) { + m_DeadTimeEnd = m_ShieldTrigger.GetDeadTimeEnd(); + } + + // Clean up + + Event->SetAnalysisProgress(MAssembly::c_DetectorEffectsEngine); + return true; + } else if (m_ShieldTrigger.HasTrigger() == true) { // = energy read out + if (m_ShieldTrigger.GetDeadTimeEnd() > m_DeadTimeEnd) { + m_DeadTimeEnd = m_ShieldTrigger.GetDeadTimeEnd(); + } + } + + // Charge trapping as input to the charge transport or as "correction afterwards"? + + // Step (7): Handle GeD charge transport to grid and voxelation into strips + m_ChargeTransport.Clear(); + m_ChargeTransport.AnalyzeEvent(Event); + + // Step (8): Handle the strip readout: energy -> ADCs + m_StripReadout.Clear(); + m_StripReadout.AnalyzeEvent(Event); + + + // Step (9)): Simulate micro-phonics random noise for triggered strips & next neighbors + m_StripReadoutNoise.Clear(); + m_StripReadoutNoise.AnalyzeEvent(Event); + + // Step (10): Handles triggers and guard ring vetoes, pre-scalers, calculate dead-time, add nearest neighbor noise, calculate random coincidence time + m_StripTrigger.Clear(); + m_StripTrigger.AnalyzeEvent(Event); + if (m_StripTrigger.HasVeto() == true) { + if (m_StripTrigger.GetDeadTimeEnd() > m_DeadTimeEnd) { + m_DeadTimeEnd = m_StripTrigger.GetDeadTimeEnd(); + } + // Clean up + + Event->SetAnalysisProgress(MAssembly::c_DetectorEffectsEngine); + return true; + } + if (m_StripTrigger.HasTrigger() == true) { + if (m_StripTrigger.GetDeadTimeEnd() > m_DeadTimeEnd) { + m_DeadTimeEnd = m_StripTrigger.GetDeadTimeEnd(); + } + } + + // Step (11): Handle depth and timing noise + m_DepthReadout.Clear(); + m_DepthReadout.AnalyzeEvent(Event); + cout<<"(11): # LV strips: "<GetNDEEStripHitsLV()<SetAnalysisProgress(MAssembly::c_DetectorEffectsEngine); + return true; +} + + +//////////////////////////////////////////////////////////////////////////////// + + +void MModuleDEESMEX::Finalize() +{ + // Initialize the module + + m_Intake.Finalize(); + m_RandomCoincidence.Finalize(); + m_ShieldEnergyCorrection.Finalize(); + m_ShieldReadout.Finalize(); + m_ShieldTrigger.Finalize(); + m_ChargeTransport.Finalize(); + m_StripReadout.Finalize(); + m_StripTrigger.Finalize(); + m_DepthReadout.Finalize(); + m_Output.Finalize(); + + MModule::Finalize(); +} + + +/////////////////////////////////////////////////////////////////////////////// + + +void MModuleDEESMEX::ShowOptionsGUI() +{ + //! Show the options GUI + + MGUIOptionsDEESMEX* Options = new MGUIOptionsDEESMEX(this); + Options->Create(); + gClient->WaitForUnmap(Options); +} + + +//////////////////////////////////////////////////////////////////////////////// + + +bool MModuleDEESMEX::ReadXmlConfiguration(MXmlNode* Node) +{ + //! Read the configuration data from an XML node + + m_Intake.ReadXmlConfiguration(Node); + m_RandomCoincidence.ReadXmlConfiguration(Node); + m_ShieldEnergyCorrection.ReadXmlConfiguration(Node); + m_ShieldReadout.ReadXmlConfiguration(Node); + m_ShieldTrigger.ReadXmlConfiguration(Node); + m_ChargeTransport.ReadXmlConfiguration(Node); + m_StripReadout.ReadXmlConfiguration(Node); + m_StripTrigger.ReadXmlConfiguration(Node); + m_DepthReadout.ReadXmlConfiguration(Node); + m_Output.ReadXmlConfiguration(Node); + + return true; +} + + +//////////////////////////////////////////////////////////////////////////////// + + +MXmlNode* MModuleDEESMEX::CreateXmlConfiguration() +{ + //! Create an XML node tree from the configuration + + MXmlNode* Node = new MXmlNode(0, m_XmlTag); + + return Node; +} + + +// MModuleDEESMEX.cxx: the end... +//////////////////////////////////////////////////////////////////////////////// diff --git a/src/MModuleDepthCalibration2024.cxx b/src/MModuleDepthCalibration2024.cxx index 3dd095ee..135db6dc 100644 --- a/src/MModuleDepthCalibration2024.cxx +++ b/src/MModuleDepthCalibration2024.cxx @@ -63,6 +63,7 @@ MModuleDepthCalibration2024::MModuleDepthCalibration2024() : MModule() AddPreceedingModuleType(MAssembly::c_EventLoader, true); AddPreceedingModuleType(MAssembly::c_EnergyCalibration, true); AddPreceedingModuleType(MAssembly::c_StripPairing, true); + AddPreceedingModuleType(MAssembly::c_TACcut, true); // AddPreceedingModuleType(MAssembly::c_CrosstalkCorrection, false); // Soft requirement // Set all types this modules handles @@ -82,6 +83,8 @@ MModuleDepthCalibration2024::MModuleDepthCalibration2024() : MModule() m_AllowMultiThreading = true; m_AllowMultipleInstances = false; + m_Coeffs_Energy = 0; + m_NoError = 0; m_Error1 = 0; m_Error2 = 0; @@ -90,6 +93,8 @@ MModuleDepthCalibration2024::MModuleDepthCalibration2024() : MModule() m_Error5 = 0; m_Error6 = 0; m_ErrorSH = 0; + m_ErrorNullSH=0; + m_ErrorNoE=0; } @@ -108,58 +113,64 @@ MModuleDepthCalibration2024::~MModuleDepthCalibration2024() bool MModuleDepthCalibration2024::Initialize() { - if( LoadCoeffsFile(m_CoeffsFile) == false ){ - return false; - } - if( LoadSplinesFile(m_SplinesFile) == false ){ - return false; - } - // The detectors need to be in the same order as DetIDs. // ie DetID=0 should be the 0th detector in m_Detectors, DetID=1 should the 1st, etc. - m_Detectors = m_Geometry->GetDetectorList(); - - if( LoadTACCalFile(m_TACCalFile) == false ){ - cout << "No TAC Calibration file loaded. Proceeding without TAC Calibration." << endl; - } + vector DetList = m_Geometry->GetDetectorList(); // Look through the Geometry and get the names and thicknesses of all the detectors. - for(unsigned int i = 0; i < m_Detectors.size(); ++i){ + for(unsigned int i = 0; i < DetList.size(); ++i){ // For now, DetID is in order of detectors, which puts contraints on how the geometry file should be written. // If using the card cage at UCSD, default to DetID=11. unsigned int DetID = i; if ( m_UCSDOverride ){ DetID = 11; } - MDDetector* det = m_Detectors[i]; - // MString det_name = (det->GetDetectorVolume())->GetNamedDetectorName(0); - if (det->GetNNamedDetectors() > 0){ - // TODO: determine thickness of each detector using the geometry file - // cout << "Trying to get thickness from the geometry file..." << endl; - // cout << "step 1" << endl; - // MDVolume* vol = det->GetSensitiveVolume(0); - // cout << "step 2" << endl; - // MDShapeBRIK* shape = dynamic_cast(vol->GetShape()); - // cout << "step 3" << endl; - // double thickness = (shape->GetSize()).GetZ(); - // cout << "Success, the thickness is " << thickness << " cm" << endl; - // m_Thicknesses[DetID] = thickness; - MString det_name = det->GetNamedDetectorName(0); - m_DetectorNames[DetID] = det_name; - MDStrip3D* strip = dynamic_cast(det); - m_XPitches[DetID] = strip->GetPitchX(); - m_YPitches[DetID] = strip->GetPitchY(); - m_NXStrips[DetID] = strip->GetNStripsX(); - m_NYStrips[DetID] = strip->GetNStripsY(); - cout << "Found detector " << det_name << " corresponding to DetID=" << DetID << "." << endl; - cout << "Number of X strips: " << m_NXStrips[DetID] << endl; - cout << "Number of Y strips: " << m_NYStrips[DetID] << endl; - cout << "X strip pitch: " << m_XPitches[DetID] << endl; - cout << "Y strip pitch: " << m_YPitches[DetID] << endl; - m_DetectorIDs.push_back(DetID); + + MDDetector* det = DetList[i]; + vector DetectorNames; + if (det->GetTypeName() == "Strip3D") { + if (det->GetNSensitiveVolumes() == 1) { + MDVolume* vol = det->GetSensitiveVolume(0); + string det_name = vol->GetName().GetString(); + if (find(DetectorNames.begin(), DetectorNames.end(), det_name) == DetectorNames.end()) { + DetectorNames.push_back(det_name); + m_Thicknesses[DetID] = 2*(det->GetStructuralSize().GetZ()); + MDStrip3D* strip = dynamic_cast(det); + m_XPitches[DetID] = strip->GetPitchX(); + m_YPitches[DetID] = strip->GetPitchY(); + m_NXStrips[DetID] = strip->GetNStripsX(); + m_NYStrips[DetID] = strip->GetNStripsY(); + cout << "Found detector " << det_name << " corresponding to DetID=" << DetID << "." << endl; + cout << "Detector thickness: " << m_Thicknesses[DetID] << endl; + cout << "Number of X strips: " << m_NXStrips[DetID] << endl; + cout << "Number of Y strips: " << m_NYStrips[DetID] << endl; + cout << "X strip pitch: " << m_XPitches[DetID] << endl; + cout << "Y strip pitch: " << m_YPitches[DetID] << endl; + m_DetectorIDs.push_back(DetID); + m_Detectors[DetID] = det; + } else { + cout<<"ERROR in MModuleDepthCalibration2024::Initialize: Found a duplicate detector: "<GetNSensitiveVolumes()<<" Sensitive Volumes."<GetAvailableModuleByXmlTag("EnergyCalibrationUniversal"); if (m_EnergyCalibration == nullptr) { @@ -194,237 +205,183 @@ void MModuleDepthCalibration2024::CreateExpos() bool MModuleDepthCalibration2024::AnalyzeEvent(MReadOutAssembly* Event) { - for( unsigned int i = 0; i < Event->GetNHits(); ++i ){ - // Each event represents one photon. It contains Hits, representing interaction sites. - // H is a pointer to an instance of the MHit class. Each Hit has activated strips, represented by - // instances of the MStripHit class. - MHit* H = Event->GetHit(i); - - int Grade = GetHitGrade(H); - - // cout << "got a hit with grade " << Grade << endl; - - // Handle different grades differently - // GRADE=-1 is an error. Break from the loop and continue. - if ( Grade == -1 ){ - H->SetNoDepth(); - Event->SetDepthCalibrationIncomplete(); - ++m_ErrorSH; - } - - // GRADE=5 is some complicated geometry with multiple hits on a single strip. - // GRADE=4 means there are more than 2 strip hits on one or both sides. - else if( Grade > 3 ){ - H->SetNoDepth(); - Event->SetDepthCalibrationIncomplete(); - if(Grade==4){ - ++m_Error4; - } - else if(Grade==5){ - ++m_Error5; - } - else if(Grade==6){ - ++m_Error6; - } - } + if (Event->GetGuardRingVeto()==true) { + + Event->SetDepthCalibrationIncomplete(); + return false; + + } else { + + for( unsigned int i = 0; i < Event->GetNHits(); ++i ){ + // Each event represents one photon. It contains Hits, representing interaction sites. + // H is a pointer to an instance of the MHit class. Each Hit has activated strips, represented by + // instances of the MStripHit class. + MHit* H = Event->GetHit(i); - // If the Grade is 0-3, we can handle it. - else { + int Grade = GetHitGrade(H); - MVector LocalPosition, PositionResolution, GlobalPosition, GlobalResolution, LocalOrigin; - - // Calculate the position. If error is thrown, record and no depth. - // Take a Hit and separate its activated X- and Y-strips into separate vectors. - std::vector XStrips; - std::vector YStrips; - // cout << "looping over strip hits..." << endl; - for( unsigned int j = 0; j < H->GetNStripHits(); ++j){ - // cout << "strip hit " << j << endl; - MStripHit* SH = H->GetStripHit(j); - if( SH->IsLowVoltageStrip() ) XStrips.push_back(SH); else YStrips.push_back(SH); - } - - // cout << "finished looping over strip hits" << endl; - double XEnergyFraction; - double YEnergyFraction; - MStripHit* XSH = GetDominantStrip(XStrips, XEnergyFraction); - MStripHit* YSH = GetDominantStrip(YStrips, YEnergyFraction); - - // cout << "found the dominant strips" << endl; - - double CTD_s = 0.0; - - //now try and get z position - int DetID = XSH->GetDetectorID(); - int XStripID = XSH->GetStripID(); - int YStripID = YSH->GetStripID(); - int pixel_code = 10000*DetID + 100*XStripID + YStripID; - - // TODO: Calculate X and Y positions more rigorously using charge sharing. - // Somewhat confusing notation: XStrips run parallel to X-axis, so we calculate X position with YStrips. - double Xpos = m_YPitches[DetID]*((m_NYStrips[DetID]/2.0) - ((double)YStripID)); - double Ypos = m_XPitches[DetID]*((m_NXStrips[DetID]/2.0) - ((double)XStripID)); - // cout << "X position " << Xpos << endl; - // cout << "Y position " << Ypos << endl; - double Zpos = 0.0; - - double Xsigma = m_YPitches[DetID]/sqrt(12.0); - double Ysigma = m_XPitches[DetID]/sqrt(12.0); - double Zsigma = m_Thicknesses[DetID]/sqrt(12.0); - - // cout << "looking up the coefficients" << endl; - vector* Coeffs = GetPixelCoeffs(pixel_code); - - // TODO: For Card Cage, may need to add noise - double XTiming = XSH->GetTiming(); - double YTiming = YSH->GetTiming(); - if ( !m_UCSDOverride ) { - if ( m_TACCalFileIsLoaded ) { - if ( XSH->IsLowVoltageStrip() ){ - XTiming = XTiming*m_LVTACCal[DetID][XStripID][0] + m_LVTACCal[DetID][XStripID][1]; - YTiming = YTiming*m_HVTACCal[DetID][YStripID][0] + m_HVTACCal[DetID][YStripID][1]; - } - else { - XTiming = XTiming*m_HVTACCal[DetID][XStripID][0] + m_HVTACCal[DetID][XStripID][1]; - YTiming = YTiming*m_LVTACCal[DetID][YStripID][0] + m_LVTACCal[DetID][YStripID][1]; - } - } - else { - if ( XSH->IsLowVoltageStrip() ){ - XTiming = XTiming*0.405 - 525.; - YTiming = YTiming*0.43 - 500.; - } - else { - XTiming = XTiming*0.43 - 500.; - YTiming = YTiming*0.405 -525.; - } + // Handle different grades differently + // GRADE=-1 is an error. Break from the loop and continue. + if ( Grade < 0 ){ + H->SetNoDepth(); + Event->SetDepthCalibrationIncomplete(); + if (Grade == -1) { + ++m_ErrorSH; + } else if (Grade == -2) { + ++m_ErrorNullSH; + } else if (Grade == -3) { + ++m_ErrorNoE; } - } - - // cout << "Got the coefficients: " << Coeffs << endl; - - // If there aren't coefficients loaded, then calibration is incomplete. - if( Coeffs == nullptr ){ - //set the bad flag for depth + } else if (Grade > 4) { // GRADE=5 is some complicated geometry with multiple hits on a single strip. GRADE=6 means not all strips are adjacent. H->SetNoDepth(); Event->SetDepthCalibrationIncomplete(); - ++m_Error1; - } - // If there isn't timing information, set no depth. - // Alex's old comments suggest assigning the event to the middle of the detector and the position resolution to be large. - else if( (XTiming < 1.0E-6) || (YTiming < 1.0E-6) ){ - // cout << "no timing info" << endl; - ++m_Error3; - H->SetNoDepth(); - Event->SetDepthCalibrationIncomplete(); - } - - // If there are coefficients and timing information is loaded, try calculating the CTD and depth - else { - - vector ctdvec = GetCTD(DetID, Grade); - vector depthvec = GetDepth(DetID); + if (Grade==5) { + ++m_Error5; + } else if (Grade==6) { + ++m_Error6; + } + } else { // If the Grade is 0-4, we can handle it. - if ( ctdvec.size() == 0){ - cout << "Empty CTD vector" << endl; - H->SetNoDepth(); - Event->SetDepthCalibrationIncomplete(); - } + MVector LocalPosition, PositionResolution, GlobalPosition, GlobalResolution, LocalOrigin; - double CTD; - if ( XSH->IsLowVoltageStrip() ){ - CTD = (YTiming - XTiming); - } - else { - CTD = (XTiming - YTiming); + // Calculate the position. If error is thrown, record and no depth. + // Take a Hit and separate its activated X- and Y-strips into separate vectors. + std::vector LVStrips; + std::vector HVStrips; + for( unsigned int j = 0; j < H->GetNStripHits(); ++j){ + MStripHit* SH = H->GetStripHit(j); + if( SH->IsLowVoltageStrip() ) LVStrips.push_back(SH); else HVStrips.push_back(SH); } - // cout << "Got the CTD: " << CTD << endl; + double LVEnergyFraction; + double HVEnergyFraction; + MStripHit* LVSH = GetDominantStrip(LVStrips, LVEnergyFraction); + MStripHit* HVSH = GetDominantStrip(HVStrips, HVEnergyFraction); - // Confirmed that this matches SP's python code. - CTD_s = (CTD - Coeffs->at(1))/(Coeffs->at(0)); //apply inverse stretch and offset + double CTD_s = 0.0; - // cout << "Transformed CTD: " << CTD_s << endl; + //now try and get z position + int DetID = LVSH->GetDetectorID(); + int LVStripID = LVSH->GetStripID(); + int HVStripID = HVSH->GetStripID(); + int PixelCode = 10000*DetID + 100*LVStripID + HVStripID; - double Xmin = * std::min_element(ctdvec.begin(), ctdvec.end()); - double Xmax = * std::max_element(ctdvec.begin(), ctdvec.end()); + // TODO: Calculate X and Y positions more rigorously using charge sharing. + // Somewhat confusing notation: HVStrips run parallel to X-axis, so we calculate X position with LVStrips. + double Xpos = m_YPitches[DetID]*((m_NYStrips[DetID]/2.0) - ((double)LVStripID)); + double Ypos = m_XPitches[DetID]*((m_NXStrips[DetID]/2.0) - ((double)HVStripID)); + double Zpos = 0.0; - // cout << "Got the min and max ctd values: " << Xmin << "; " << Xmax << endl; + double Xsigma = m_YPitches[DetID]/sqrt(12.0); + double Ysigma = m_XPitches[DetID]/sqrt(12.0); + double Zsigma = m_Thicknesses[DetID]/sqrt(12.0); - double noise = GetTimingNoiseFWHM(pixel_code, H->GetEnergy()); + vector* Coeffs = GetPixelCoeffs(PixelCode); - // cout << "Got the timing noise: " << noise << endl; + // TODO: For Card Cage, may need to add noise + double LVTiming = LVSH->GetTiming(); + double HVTiming = HVSH->GetTiming(); - //if the CTD is out of range, check if we should reject the event. - if( (CTD_s < (Xmin - 2.0*noise)) || (CTD_s > (Xmax + 2.0*noise)) ){ + // If there aren't coefficients loaded, then calibration is incomplete. + if( Coeffs == nullptr ){ + //set the bad flag for depth H->SetNoDepth(); Event->SetDepthCalibrationIncomplete(); - ++m_Error2; + ++m_Error1; + } + // If there isn't timing information, set no depth. + // Alex's old comments suggest assigning the event to the middle of the detector and the position resolution to be large. + else if( (LVTiming < 1.0E-6) || (HVTiming < 1.0E-6) ){ + ++m_Error3; + H->SetNoDepth(); + Event->SetDepthCalibrationIncomplete(); } - // If the CTD is in range, calculate the depth + // If there are coefficients and timing information is loaded, try calculating the CTD and depth else { - // cout << "Calculating depth" << endl; - // Calculate the probability given timing noise of CTD_s corresponding to the values of depth in depthvec - // Utlize symmetry of the normal distribution. - vector prob_dist = norm_pdf(ctdvec, CTD_s, noise/2.355); - - // Weight the depth by probability - double prob_sum = 0.0; - for( unsigned int k=0; k < prob_dist.size(); ++k ){ - prob_sum += prob_dist[k]; - } - //double prob_sum = std::accumulate(prob_dist.begin(), prob_dist.end(), 0); - //cout << "summed probability: " << prob_sum << endl; - double weighted_depth = 0.0; - for( unsigned int k = 0; k < depthvec.size(); ++k ){ - weighted_depth += prob_dist[k]*depthvec[k]; - } - // Calculate the expectation value of the depth - double mean_depth = weighted_depth/prob_sum; - // Calculate the standard deviation of the depth - double depth_var = 0.0; - for( unsigned int k=0; k ctdvec = GetCTD(DetID, Grade); + vector depthvec = GetDepth(DetID); - Zsigma = sqrt(depth_var/prob_sum); - Zpos = mean_depth - (m_Thicknesses[DetID]/2.0); - // Zpos = mean_depth; - // cout << "calculated depth: " << Zpos << endl; + if ( ctdvec.size() == 0){ + cout << "Empty CTD vector" << endl; + H->SetNoDepth(); + Event->SetDepthCalibrationIncomplete(); + } - // Add the depth to the GUI histogram. - m_ExpoDepthCalibration->AddDepth(DetID, Zpos); + double CTD = (HVTiming - LVTiming); - m_NoError+=1; - } - } + // Confirmed that this matches SP's python code. + CTD_s = (CTD - Coeffs->at(1))/(Coeffs->at(0)); //apply inverse stretch and offset - LocalPosition.SetXYZ(Xpos, Ypos, Zpos); - LocalOrigin.SetXYZ(0.0,0.0,0.0); - // cout << m_DetectorNames[DetID] << endl; - GlobalPosition = m_Geometry->GetGlobalPosition(LocalPosition, m_DetectorNames[DetID]); - // cout << "Found the GlobalPosition" << endl; + double Xmin = * std::min_element(ctdvec.begin(), ctdvec.end()); + double Xmax = * std::max_element(ctdvec.begin(), ctdvec.end()); - // Make sure XYZ resolution are correctly mapped to the global coord system. - PositionResolution.SetXYZ(Xsigma, Ysigma, Zsigma); - GlobalResolution = (m_Geometry->GetGlobalPosition(PositionResolution, m_DetectorNames[DetID]) - m_Geometry->GetGlobalPosition(LocalOrigin, m_DetectorNames[DetID])).Abs(); - - // cout << "Set the PositionResolution vector" << endl; + double noise = GetTimingNoiseFWHM(PixelCode, H->GetEnergy()); - H->SetPosition(GlobalPosition); + //if the CTD is out of range, check if we should reject the event. + if( (CTD_s < (Xmin - 2.0*noise)) || (CTD_s > (Xmax + 2.0*noise)) ){ + H->SetNoDepth(); + Event->SetDepthCalibrationIncomplete(); + ++m_Error2; + } - // cout << "Set the global position for the strip hit" << endl; + // If the CTD is in range, calculate the depth + else { + // Calculate the probability given timing noise of CTD_s corresponding to the values of depth in depthvec + // Utlize symmetry of the normal distribution. + vector prob_dist = norm_pdf(ctdvec, CTD_s, noise/2.355); + + // Weight the depth by probability + double prob_sum = 0.0; + for( unsigned int k=0; k < prob_dist.size(); ++k ){ + prob_sum += prob_dist[k]; + } + //double prob_sum = std::accumulate(prob_dist.begin(), prob_dist.end(), 0); + double weighted_depth = 0.0; + for( unsigned int k = 0; k < depthvec.size(); ++k ){ + weighted_depth += prob_dist[k]*depthvec[k]; + } + // Calculate the expectation value of the depth + double mean_depth = weighted_depth/prob_sum; + + // Calculate the standard deviation of the depth + double depth_var = 0.0; + for( unsigned int k=0; kIsStripPairingIncomplete()==false) { + if (HasExpos() == true) { + m_ExpoDepthCalibration->AddDepth(DetID, Zpos); + } + } + m_NoError+=1; + } + } + + LocalPosition.SetXYZ(Xpos, Ypos, Zpos); + LocalOrigin.SetXYZ(0.0,0.0,0.0); + GlobalPosition = m_Detectors[DetID]->GetSensitiveVolume(0)->GetPositionInWorldVolume(LocalPosition); - H->SetPositionResolution(GlobalResolution); + // Make sure XYZ resolution are correctly mapped to the global coord system. + PositionResolution.SetXYZ(Xsigma, Ysigma, Zsigma); + GlobalResolution = ((m_Detectors[DetID]->GetSensitiveVolume(0)->GetPositionInWorldVolume(PositionResolution)) - (m_Detectors[DetID]->GetSensitiveVolume(0)->GetPositionInWorldVolume(LocalOrigin))).Abs(); + + H->SetPosition(GlobalPosition); - // cout << "Set the position resolution for the strip hit" << endl; + H->SetPositionResolution(GlobalResolution); + + } } } - + Event->SetAnalysisProgress(MAssembly::c_DepthCorrection | MAssembly::c_PositionDetermiation); return true; @@ -453,14 +410,14 @@ MStripHit* MModuleDepthCalibration2024::GetDominantStrip(vector& Str return MaxStrip; } -double MModuleDepthCalibration2024::GetTimingNoiseFWHM(int pixel_code, double Energy) +double MModuleDepthCalibration2024::GetTimingNoiseFWHM(int PixelCode, double Energy) { // Placeholder for determining the timing noise with energy, and possibly even on a pixel-by-pixel basis. // Should follow 1/E relation // TODO: Determine real energy dependence and implement it here. double noiseFWHM = 0.0; - if ( m_Coeffs_Energy != NULL ){ - noiseFWHM = m_Coeffs[pixel_code][2] * m_Coeffs_Energy/Energy; + if ( m_Coeffs_Energy != 0 ){ + noiseFWHM = m_Coeffs[PixelCode][2] * m_Coeffs_Energy/Energy; if ( noiseFWHM < 3.0*2.355 ){ noiseFWHM = 3.0*2.355; } @@ -476,10 +433,10 @@ bool MModuleDepthCalibration2024::LoadCoeffsFile(MString FName) // Read in the stretch and offset file, which should have a header line with information on the measurements: // ### 800 V 80 K 59.5 keV // And which should contain for each pixel: - // Pixel code (10000*det + 100*Xchannel + Ychannel), Stretch, Offset, Timing/CTD noise, Chi2 for the CTD fit (for diagnostics mainly) + // Pixel code (10000*det + 100*LVStrip + HVStrip), Stretch, Offset, Timing/CTD noise, Chi2 for the CTD fit (for diagnostics mainly) MFile F; if( F.Open(FName) == false ){ - cout << "MModuleDepthCalibration2024: failed to open coefficients file..." << endl; + cout << "ERROR in MModuleDepthCalibration2024::LoadCoeffsFile: failed to open coefficients file." << endl; return false; } else { MString Line; @@ -492,7 +449,7 @@ bool MModuleDepthCalibration2024::LoadCoeffsFile(MString FName) else { std::vector Tokens = Line.Tokenize(","); if( Tokens.size() == 5 ){ - int pixel_code = Tokens[0].ToInt(); + int PixelCode = Tokens[0].ToInt(); double Stretch = Tokens[1].ToDouble(); double Offset = Tokens[2].ToDouble(); double CTD_FWHM = Tokens[3].ToDouble() * 2.355; @@ -500,75 +457,25 @@ bool MModuleDepthCalibration2024::LoadCoeffsFile(MString FName) // Previous iteration of depth calibration read in "Scale" instead of ctd resolution. vector coeffs; coeffs.push_back(Stretch); coeffs.push_back(Offset); coeffs.push_back(CTD_FWHM); coeffs.push_back(Chi2); - m_Coeffs[pixel_code] = coeffs; + m_Coeffs[PixelCode] = coeffs; } } } F.Close(); } - m_CoeffsFileIsLoaded = true; - return true; } -bool MModuleDepthCalibration2024::LoadTACCalFile(MString FName) -{ - // Read in the TAC Calibration file, which should contain for each strip: - // DetID, h or l for high or low voltage, TAC cal, TAC cal error, TAC cal offset, TAC offset error - MFile F; - if( F.Open(FName) == false ){ - cout << "MModuleDepthCalibration2024: failed to open TAC Calibration file." << endl; - m_TACCalFileIsLoaded = false; - return false; - } else { - for(unsigned int i = 0; i < m_Detectors.size(); ++i){ - unordered_map> temp_map_HV; - m_HVTACCal[i] = temp_map_HV; - unordered_map> temp_map_LV; - m_LVTACCal[i] = temp_map_LV; - } - MString Line; - while( F.ReadLine( Line ) ){ - if( !Line.BeginsWith("#") ){ - std::vector Tokens = Line.Tokenize(","); - if( Tokens.size() == 7 ){ - int DetID = Tokens[0].ToInt(); - int StripID = Tokens[2].ToInt(); - double taccal = Tokens[3].ToDouble(); - double taccal_err = Tokens[4].ToDouble(); - double offset = Tokens[5].ToDouble(); - double offset_err = Tokens[6].ToDouble(); - vector cal_vals; - cal_vals.push_back(taccal); cal_vals.push_back(offset); cal_vals.push_back(taccal_err); cal_vals.push_back(offset_err); - if ( Tokens[1] == "l" ){ - m_LVTACCal[DetID][StripID] = cal_vals; - } - else if ( Tokens[1] == "h" ){ - m_HVTACCal[DetID][StripID] = cal_vals; - } - } - } - } - F.Close(); - } - - m_TACCalFileIsLoaded = true; - - return true; - -} - - -std::vector* MModuleDepthCalibration2024::GetPixelCoeffs(int pixel_code) +std::vector* MModuleDepthCalibration2024::GetPixelCoeffs(int PixelCode) { // Check to see if the stretch and offset have been loaded. If so, try to get the coefficients for the specified pixel. if( m_CoeffsFileIsLoaded ){ - if( m_Coeffs.count(pixel_code) > 0 ){ - return &m_Coeffs[pixel_code]; + if( m_Coeffs.count(PixelCode) > 0 ){ + return &m_Coeffs[PixelCode]; } else { - cout << "MModuleDepthCalibration2024::GetPixelCoeffs: cannot get stretch and offset; pixel code " << pixel_code << " not found." << endl; + cout << "MModuleDepthCalibration2024::GetPixelCoeffs: cannot get stretch and offset; pixel code " << PixelCode << " not found." << endl; return nullptr; } } else { @@ -599,6 +506,7 @@ bool MModuleDepthCalibration2024::LoadSplinesFile(MString FName) // '' '' '' MFile F; if( F.Open(FName) == false ){ + cout << "ERROR in MModuleDepthCalibration2024::LoadSplinesFile: failed to open splines file." << endl; return false; } // vector depthvec, ctdvec, anovec, catvec; @@ -608,45 +516,44 @@ bool MModuleDepthCalibration2024::LoadSplinesFile(MString FName) vector temp_vec; ctdarr.push_back(temp_vec); } + bool Result = true; MString line; - int DetID, NewDetID; - while( F.ReadLine(line) ){ - if( line.Length() != 0 ){ - if( line.BeginsWith("#") ){ + int DetID = 0; + while (F.ReadLine(line)) { + if (line.Length() != 0) { + if (line.BeginsWith("#")) { // If we've reached a new ctd spline then record the previous one in the m_SplineMaps and start a new one. vector tokens = line.Tokenize(" "); - NewDetID = tokens[1].ToInt(); - if( depthvec.size() > 0 ) { - AddDepthCTD(depthvec, ctdarr, DetID, m_DepthGrid, m_CTDMap); + if (depthvec.size() > 0) { + Result &= AddDepthCTD(depthvec, ctdarr, DetID, m_DepthGrid, m_CTDMap); } depthvec.clear(); ctdarr.clear(); - for( unsigned int i=0; i < 5; ++i ){ + for (unsigned int i=0; i < 5; ++i) { vector temp_vec; ctdarr.push_back(temp_vec); } - DetID = NewDetID; + DetID = tokens[1].ToInt(); } else { vector tokens = line.Tokenize(","); depthvec.push_back(tokens[0].ToDouble()); // Multiple CTDs allowed. - for( unsigned int i = 0; i < (tokens.size() - 1); ++i ){ + for (unsigned int i = 0; i < (tokens.size() - 1); ++i) { ctdarr[i].push_back(tokens[1+i].ToDouble()); } // Fill in the higher grades with the GRADE=0 CTD if there are none listed in the file. - for(unsigned int i=tokens.size()-1; i<5; ++i){ + for (unsigned int i=tokens.size()-1; i<5; ++i) { ctdarr[i].push_back(tokens[1].ToDouble()); } } } } //make last spline - if( depthvec.size() > 0 ){ - AddDepthCTD(depthvec, ctdarr, DetID, m_DepthGrid, m_CTDMap); + if (depthvec.size() > 0) { + Result &= AddDepthCTD(depthvec, ctdarr, DetID, m_DepthGrid, m_CTDMap); } - m_SplinesFileIsLoaded = true; - return true; + return Result; } @@ -666,21 +573,21 @@ int MModuleDepthCalibration2024::GetHitGrade(MHit* H){ } // Take a Hit and separate its activated p and n strips into separate vectors. - std::vector PStrips; - std::vector NStrips; - vector PStripIDs; - vector NStripIDs; + std::vector LVStrips; + std::vector HVStrips; + vector LVStripIDs; + vector HVStripIDs; for( unsigned int j = 0; j < H->GetNStripHits(); ++j){ MStripHit* SH = H->GetStripHit(j); if( SH == NULL ) { cout << "ERROR in MModuleDepthCalibration2024: Depth Calibration: got NULL strip hit :( " << endl; return -1;} if( SH->GetEnergy() == 0 ) { cout << "ERROR in MModuleDepthCalibration2024: Depth Calibration: got strip without energy :( " << endl; return -1;} if( SH->IsLowVoltageStrip() ){ - PStrips.push_back(SH); - PStripIDs.push_back(SH->GetStripID()); + LVStrips.push_back(SH); + LVStripIDs.push_back(SH->GetStripID()); } else { - NStrips.push_back(SH); - NStripIDs.push_back(SH->GetStripID()); + HVStrips.push_back(SH); + HVStripIDs.push_back(SH->GetStripID()); } } @@ -691,15 +598,15 @@ int MModuleDepthCalibration2024::GetHitGrade(MHit* H){ return 5; } - if( PStrips.size()>0 && NStrips.size()>0 ){ - int Nmin = * std::min_element(NStripIDs.begin(), NStripIDs.end()); - int Nmax = * std::max_element(NStripIDs.begin(), NStripIDs.end()); + if( LVStrips.size()>0 && HVStrips.size()>0 ){ + int HVmin = * std::min_element(HVStripIDs.begin(), HVStripIDs.end()); + int HVmax = * std::max_element(HVStripIDs.begin(), HVStripIDs.end()); - int Pmin = * std::min_element(PStripIDs.begin(), PStripIDs.end()); - int Pmax = * std::max_element(PStripIDs.begin(), PStripIDs.end()); + int LVmin = * std::min_element(LVStripIDs.begin(), LVStripIDs.end()); + int LVmax = * std::max_element(LVStripIDs.begin(), LVStripIDs.end()); // If the strip hits are not all adjacent, it's a bad grade. - if ( ((Nmax - Nmin) >= (NStrips.size())) || ((Pmax - Pmin) >= (PStrips.size())) ){ + if ( ((HVmax - HVmin) >= (HVStrips.size())) || ((LVmax - LVmin) >= (LVStrips.size())) ){ return 6; } } @@ -711,48 +618,48 @@ int MModuleDepthCalibration2024::GetHitGrade(MHit* H){ int return_value; // If 1 strip on each side, GRADE=0 // This represents the center of the pixel - if( (PStrips.size() == 1) && (NStrips.size() == 1) ){ + if( ((LVStrips.size() == 1) && (HVStrips.size() == 1)) || ((LVStrips.size() == 3) && (HVStrips.size() == 3)) ){ return_value = 0; } // If 2 hits on N side and 1 on P, GRADE=1 // This represents the middle of the edges of the pixel - else if( (PStrips.size() == 1) && (NStrips.size() == 2) ){ + else if( (LVStrips.size() == 1) && (HVStrips.size() == 2) ){ return_value = 1; } // If 2 hits on P and 1 on N, GRADE=2 // This represents the middle of the edges of the pixel - else if( (PStrips.size() == 2) && (NStrips.size() == 1) ){ + else if( (LVStrips.size() == 2) && (HVStrips.size() == 1) ){ return_value = 2; } // If 2 strip hits on both sides, GRADE=3 // This represents the corners the pixel - else if( (PStrips.size() == 2) && (NStrips.size() == 2) ){ + else if( (LVStrips.size() == 2) && (HVStrips.size() == 2) ){ return_value = 3; } // If 3 hits on N side and 1 on P, GRADE=0 // This represents the middle of the pixel, near the p (LV) side of the detector. - else if( (PStrips.size() == 1) && (NStrips.size() == 3) ){ + else if( (LVStrips.size() == 1) && (HVStrips.size() == 3) ){ return_value = 0; } // If 3 hits on P and 1 on N, GRADE=0 // This represents the middle of the pixel, near the n (HV) side of the detector. - else if( (PStrips.size() == 3) && (NStrips.size() == 1) ){ + else if( (LVStrips.size() == 3) && (HVStrips.size() == 1) ){ return_value = 0; } // If 3 hits on N side and 2 on P, GRADE=0 // This represents the middle of the edge of the pixel, near the p (LV) side of the detector. - else if( (PStrips.size() == 2) && (NStrips.size() == 3) ){ + else if( (LVStrips.size() == 2) && (HVStrips.size() == 3) ){ return_value = 2; } // If 3 hits on P and 2 on N, GRADE=0 // This represents the middle of the edge of the pixel, near the n (HV) side of the detector. - else if( (PStrips.size() == 3) && (NStrips.size() == 2) ){ + else if( (LVStrips.size() == 3) && (HVStrips.size() == 2) ){ return_value = 1; } @@ -778,21 +685,24 @@ bool MModuleDepthCalibration2024::AddDepthCTD(vector depthvec, vector 0) ){ - cout << "MModuleDepthCalibration2024::AddDepthCTD: The number of values in the CTD list is not equal to the number of depth values." << endl; + for (unsigned int i = 0; i < ctdarr.size(); ++i) { + if ((ctdarr[i].size() != depthvec.size()) && (ctdarr[i].size() > 0)) { + cout<<"ERROR in MModuleDepthCalibration2024::AddDepthCTD: The number of values in the CTD list is not equal to the number of depth values."< 0.01) { + cout<<"ERROR in MModuleDepthCalibration2024::AddDepthCTD: The thickness of detector "<GetValue(); } - MXmlNode* TACCalFileNameNode = Node->GetNode("TACCalFileName"); - if (TACCalFileNameNode != 0) { - m_TACCalFile = TACCalFileNameNode->GetValue(); + MXmlNode* UCSDOverrideNode = Node->GetNode("UCSDOverride"); + if( UCSDOverrideNode != NULL ){ + m_UCSDOverride = (bool) UCSDOverrideNode->GetValueAsInt(); } return true; @@ -888,8 +798,8 @@ MXmlNode* MModuleDepthCalibration2024::CreateXmlConfiguration() MXmlNode* Node = new MXmlNode(0,m_XmlTag); new MXmlNode(Node, "CoeffsFileName", m_CoeffsFile); new MXmlNode(Node, "SplinesFileName", m_SplinesFile); - new MXmlNode(Node, "TACCalFileName", m_TACCalFile); - + new MXmlNode(Node, "UCSDOverride",(unsigned int) m_UCSDOverride); + return Node; } @@ -908,6 +818,8 @@ void MModuleDepthCalibration2024::Finalize() cout << "Number of hits with non-adjacent strip hits: " << m_Error6 << endl; cout << "Number of hits with too many strip hits: " << m_Error4 << endl; cout << "Number of hits with no strip hits on one or both sides: " << m_ErrorSH << endl; + cout << "Number of hits with null strip hits: " << m_ErrorNullSH << endl; + cout << "Number of hits 0 energy on a strip hit: " << m_ErrorNoE << endl; /* TFile* rootF = new TFile("EHist.root","recreate"); rootF->WriteTObject( EHist ); diff --git a/src/MModuleDepthCalibrationB.cxx b/src/MModuleDepthCalibrationB.cxx index ab4a02d0..3b32494e 100644 --- a/src/MModuleDepthCalibrationB.cxx +++ b/src/MModuleDepthCalibrationB.cxx @@ -344,7 +344,7 @@ int MModuleDepthCalibrationB::CalculateLocalPosition(MStripHit* XSH, MStripHit* double Xpos = ((double)YSH->GetStripID() - 19.0)*(-0.2); double Ypos = ((double)XSH->GetStripID() - 19.0)*(-0.2); double Zpos = 0.0; - double CTD_s = 0.0; + //double CTD_s = 0.0; int CTD = 0; //now try and get z position diff --git a/src/MModuleEnergyCalibrationUniversal.cxx b/src/MModuleEnergyCalibrationUniversal.cxx index 3180cba1..8d705851 100644 --- a/src/MModuleEnergyCalibrationUniversal.cxx +++ b/src/MModuleEnergyCalibrationUniversal.cxx @@ -74,12 +74,13 @@ MModuleEnergyCalibrationUniversal::MModuleEnergyCalibrationUniversal() : MModule // Set all modules, which have to be done before this module AddPreceedingModuleType(MAssembly::c_EventLoader); + // AddPreceedingModuleType(MAssembly::c_TACcut); // Set all types this modules handles AddModuleType(MAssembly::c_EnergyCalibration); // Set all modules, which can follow this module - AddSucceedingModuleType(MAssembly::c_NoRestriction); + AddSucceedingModuleType(MAssembly::c_TACcut); // Set if this module has an options GUI m_HasOptionsGUI = true; @@ -394,18 +395,6 @@ bool MModuleEnergyCalibrationUniversal::AnalyzeEvent(MReadOutAssembly* Event) } } - for (unsigned int i = 0; i < Event->GetNStripHits(); ) { - MStripHit* SH = Event->GetStripHit(i); - if (SH->GetEnergy() < 8 || SH->GetTiming() < 8700 || SH->GetTiming() > 12000) { - // cout<<"HACK: Removing strip hit due to TAC "<GetTiming()<<" cut or energy "<GetEnergy()<RemoveStripHit(i); - delete SH; - } else { - ++i; - } - } - - Event->SetAnalysisProgress(MAssembly::c_EnergyCalibration); return true; diff --git a/src/MModuleEventFilter.cxx b/src/MModuleEventFilter.cxx index d8c7306d..73fae68a 100644 --- a/src/MModuleEventFilter.cxx +++ b/src/MModuleEventFilter.cxx @@ -66,7 +66,6 @@ MModuleEventFilter::MModuleEventFilter() : MModule() // Set all modules, which have to be done before this module AddPreceedingModuleType(MAssembly::c_EventLoader); - AddPreceedingModuleType(MAssembly::c_EnergyCalibration); // Set all types this modules handles AddModuleType(MAssembly::c_EventFilter); @@ -79,21 +78,9 @@ MModuleEventFilter::MModuleEventFilter() : MModule() m_HasOptionsGUI = true; // If true, you have to derive a class from MGUIOptions (use MGUIOptionsTemplate) // and implement all your GUI options - - m_AllowMultiThreading = true; - m_AllowMultipleInstances = true; m_MinimumTotalEnergy = 0; m_MaximumTotalEnergy = 10000; - - m_MinimumHVStrips = 0; - m_MaximumHVStrips = 20; - - m_MinimumLVStrips = 0; - m_MaximumLVStrips = 20; - - m_MinimumHits = 0; - m_MaximumHits = 100; } @@ -158,28 +145,8 @@ bool MModuleEventFilter::AnalyzeEvent(MReadOutAssembly* Event) } } - unsigned int NHVStrips = 0; - unsigned int NLVStrips = 0; - for (unsigned int sh = 0; sh < Event->GetNStripHits(); ++sh) { - if (Event->GetStripHit(sh)->IsLowVoltageStrip() == true) { - ++NLVStrips; - } else { - ++NHVStrips; - } - } - if (NHVStrips < m_MinimumHVStrips || NHVStrips > m_MaximumHVStrips || NLVStrips < m_MinimumLVStrips || NLVStrips > m_MaximumLVStrips) { - FilteredOut = true; - } - - if (Event->GetNHits() < m_MinimumHits || Event->GetNHits() > m_MaximumHits) { - FilteredOut = true; - } - - if (FilteredOut == true) { Event->SetFilteredOut(true); - Event->SetAnalysisProgress(MAssembly::c_EventFilter); - return false; } Event->SetAnalysisProgress(MAssembly::c_EventFilter); @@ -198,6 +165,7 @@ void MModuleEventFilter::ShowOptionsGUI() MGUIOptionsEventFilter* Options = new MGUIOptionsEventFilter(this); Options->Create(); gClient->WaitForUnmap(Options); + } @@ -207,7 +175,7 @@ void MModuleEventFilter::ShowOptionsGUI() bool MModuleEventFilter::ReadXmlConfiguration(MXmlNode* Node) { //! Read the configuration data from an XML node - + MXmlNode* MinimumTotalEnergyNode = Node->GetNode("MinimumTotalEnergy"); if (MinimumTotalEnergyNode != 0) { m_MinimumTotalEnergy = MinimumTotalEnergyNode->GetValueAsDouble(); @@ -217,33 +185,6 @@ bool MModuleEventFilter::ReadXmlConfiguration(MXmlNode* Node) m_MaximumTotalEnergy = MaximumTotalEnergyNode->GetValueAsDouble(); } - MXmlNode* MinimumHVStripsNode = Node->GetNode("MinimumHVStrips"); - if (MinimumHVStripsNode != 0) { - m_MinimumHVStrips = MinimumHVStripsNode->GetValueAsUnsignedInt(); - } - MXmlNode* MaximumHVStripsNode = Node->GetNode("MaximumHVStrips"); - if (MaximumHVStripsNode != 0) { - m_MaximumHVStrips = MaximumHVStripsNode->GetValueAsUnsignedInt(); - } - - MXmlNode* MinimumLVStripsNode = Node->GetNode("MinimumLVStrips"); - if (MinimumLVStripsNode != 0) { - m_MinimumLVStrips = MinimumLVStripsNode->GetValueAsUnsignedInt(); - } - MXmlNode* MaximumLVStripsNode = Node->GetNode("MaximumLVStrips"); - if (MaximumLVStripsNode != 0) { - m_MaximumLVStrips = MaximumLVStripsNode->GetValueAsUnsignedInt(); - } - - MXmlNode* MinimumHitsNode = Node->GetNode("MinimumHits"); - if (MinimumHitsNode != 0) { - m_MinimumHits = MinimumHitsNode->GetValueAsUnsignedInt(); - } - MXmlNode* MaximumHitsNode = Node->GetNode("MaximumHits"); - if (MaximumHitsNode != 0) { - m_MaximumHits = MaximumHitsNode->GetValueAsUnsignedInt(); - } - return true; } @@ -260,15 +201,6 @@ MXmlNode* MModuleEventFilter::CreateXmlConfiguration() new MXmlNode(Node, "MinimumTotalEnergy", m_MinimumTotalEnergy); new MXmlNode(Node, "MaximumTotalEnergy", m_MaximumTotalEnergy); - new MXmlNode(Node, "MinimumHVStrips", m_MinimumHVStrips); - new MXmlNode(Node, "MaximumHVStrips", m_MaximumHVStrips); - - new MXmlNode(Node, "MinimumLVStrips", m_MinimumLVStrips); - new MXmlNode(Node, "MaximumLVStrips", m_MaximumLVStrips); - - new MXmlNode(Node, "MinimumHits", m_MinimumHits); - new MXmlNode(Node, "MaximumHits", m_MaximumHits); - return Node; } diff --git a/src/MModuleEventSaver.cxx b/src/MModuleEventSaver.cxx index 8bace658..b7070b7a 100644 --- a/src/MModuleEventSaver.cxx +++ b/src/MModuleEventSaver.cxx @@ -75,8 +75,18 @@ MModuleEventSaver::MModuleEventSaver() : MModule() m_InternalFileName = ""; m_Zip = false; m_SaveBadEvents = true; + m_SaveVetoEvents = true; m_AddTimeTag = false; - + + m_RoaWithADCs = true; + m_RoaWithTACs = true; + m_RoaWithEnergies = false; + m_RoaWithTimings = false; + m_RoaWithTemperatures = false; + m_RoaWithFlags = false; + m_RoaWithOrigins = false; + m_RoaWithNearestNeighbors = true; + m_SplitFile = true; m_SplitFileTime.Set(60*10); // seconds m_SubFileStart.Set(0); @@ -163,14 +173,49 @@ bool MModuleEventSaver::Initialize() Header<= c_Error) cout<IsBad() == true) return true; } + if (m_SaveVetoEvents == false) { + if (Event->IsVeto() == true) return true; + } + + MFile* Choosen = 0; // Wish C++ would allow unassigned references... if (m_SplitFile == true) { MTime Current = Event->GetTime(); @@ -302,14 +352,14 @@ bool MModuleEventSaver::AnalyzeEvent(MReadOutAssembly* Event) } else { Choosen = &m_Out; } - + ostringstream Out; if (m_Mode == c_EvtaFile) { Event->StreamEvta(Out); } else if (m_Mode == c_DatFile) { Event->StreamDat(Out, 1); } else if (m_Mode == c_RoaFile) { - Event->StreamRoa(Out); + Event->StreamRoa(Out, m_RoaWithADCs, m_RoaWithTACs, m_RoaWithEnergies, m_RoaWithTimings, m_RoaWithTemperatures, m_RoaWithFlags, m_RoaWithOrigins, m_RoaWithNearestNeighbors); } Choosen->Write(Out); @@ -351,6 +401,10 @@ bool MModuleEventSaver::ReadXmlConfiguration(MXmlNode* Node) if (SaveBadEventsNode != 0) { m_SaveBadEvents = SaveBadEventsNode->GetValueAsBoolean(); } + MXmlNode* SaveVetoEventsNode = Node->GetNode("SaveVetoEvents"); + if (SaveVetoEventsNode != 0) { + m_SaveVetoEvents = SaveVetoEventsNode->GetValueAsBoolean(); + } MXmlNode* AddTimeTagNode = Node->GetNode("AddTimeTag"); if (AddTimeTagNode != 0) { m_AddTimeTag = AddTimeTagNode->GetValueAsBoolean(); @@ -364,6 +418,39 @@ bool MModuleEventSaver::ReadXmlConfiguration(MXmlNode* Node) m_SplitFileTime.Set(SplitFileTimeNode->GetValueAsInt()); } + MXmlNode* RoaWithADCsNode = Node->GetNode("RoaWithADCs"); + if (RoaWithADCsNode != nullptr) { + m_RoaWithADCs = RoaWithADCsNode->GetValueAsBoolean(); + } + MXmlNode* RoaWithTACsNode = Node->GetNode("RoaWithTACs"); + if (RoaWithTACsNode != nullptr) { + m_RoaWithTACs = RoaWithTACsNode->GetValueAsBoolean(); + } + MXmlNode* RoaWithEnergiesNode = Node->GetNode("RoaWithEnergies"); + if (RoaWithEnergiesNode != nullptr) { + m_RoaWithEnergies = RoaWithEnergiesNode->GetValueAsBoolean(); + } + MXmlNode* RoaWithTimingsNode = Node->GetNode("RoaWithTimings"); + if (RoaWithTimingsNode != nullptr) { + m_RoaWithTimings = RoaWithTimingsNode->GetValueAsBoolean(); + } + MXmlNode* RoaWithTemperaturesNode = Node->GetNode("RoaWithTemperatures"); + if (RoaWithTemperaturesNode != nullptr) { + m_RoaWithTemperatures = RoaWithTemperaturesNode->GetValueAsBoolean(); + } + MXmlNode* RoaWithFlagsNode = Node->GetNode("RoaWithFlags"); + if (RoaWithFlagsNode != nullptr) { + m_RoaWithFlags = RoaWithFlagsNode->GetValueAsBoolean(); + } + MXmlNode* RoaWithOriginsNode = Node->GetNode("RoaWithOrigins"); + if (RoaWithOriginsNode != nullptr) { + m_RoaWithOrigins = RoaWithOriginsNode->GetValueAsBoolean(); + } + MXmlNode* RoaWithNearestNeighborsNode = Node->GetNode("RoaWithNearestNeighbors"); + if (RoaWithNearestNeighborsNode != nullptr) { + m_RoaWithNearestNeighbors = RoaWithNearestNeighborsNode->GetValueAsBoolean(); + } + return true; } @@ -379,9 +466,17 @@ MXmlNode* MModuleEventSaver::CreateXmlConfiguration() new MXmlNode(Node, "FileName", m_FileName); new MXmlNode(Node, "Mode", m_Mode); new MXmlNode(Node, "SaveBadEvents", m_SaveBadEvents); + new MXmlNode(Node, "SaveVetoEvents", m_SaveVetoEvents); new MXmlNode(Node, "AddTimeTag", m_AddTimeTag); new MXmlNode(Node, "SplitFile", m_SplitFile); new MXmlNode(Node, "SplitFileTime", m_SplitFileTime.GetAsSystemSeconds()); + new MXmlNode(Node, "RoaWithADCs", m_RoaWithADCs); + new MXmlNode(Node, "RoaWithTACs", m_RoaWithTACs); + new MXmlNode(Node, "RoaWithEnergies", m_RoaWithEnergies); + new MXmlNode(Node, "RoaWithTimings", m_RoaWithTimings); + new MXmlNode(Node, "RoaWithFlags", m_RoaWithFlags); + new MXmlNode(Node, "RoaWithOrigins", m_RoaWithOrigins); + new MXmlNode(Node, "RoaWithNearestNeighbors", m_RoaWithNearestNeighbors); return Node; } diff --git a/src/MModuleLoaderMeasurements.cxx b/src/MModuleLoaderMeasurements.cxx index 5c6b890c..acc133bb 100644 --- a/src/MModuleLoaderMeasurements.cxx +++ b/src/MModuleLoaderMeasurements.cxx @@ -95,18 +95,5 @@ bool MModuleLoaderMeasurements::AnalyzeEvent(MReadOutAssembly* Event) } -/////////////////////////////////////////////////////////////////////////////// - - -void MModuleLoaderMeasurements::ShowOptionsGUI() -{ - //! Show the options GUI - - MGUIOptionsLoaderMeasurements* Options = new MGUIOptionsLoaderMeasurements(this); - Options->Create(); - gClient->WaitForUnmap(Options); -} - - // MModuleLoaderMeasurements.cxx: the end... //////////////////////////////////////////////////////////////////////////////// diff --git a/src/MModuleLoaderMeasurementsBinary.cxx b/src/MModuleLoaderMeasurementsBinary.cxx deleted file mode 100644 index af547b39..00000000 --- a/src/MModuleLoaderMeasurementsBinary.cxx +++ /dev/null @@ -1,529 +0,0 @@ -/* - * MModuleLoaderMeasurementsBinary.cxx - * - * - * Copyright (C) by Alex Lowell & Andreas Zoglauer. - * All rights reserved. - * - * - * This code implementation is the intellectual property of - * Andreas Zoglauer. - * - * By copying, distributing or modifying the Program (or any work - * based on the Program) you indicate your acceptance of this statement, - * and all its terms. - * - */ - - - - -//////////////////////////////////////////////////////////////////////////////// -// -// MModuleLoaderMeasurementsBinary -// -//////////////////////////////////////////////////////////////////////////////// - - -// Include the header: -#include "MModuleLoaderMeasurementsBinary.h" - -// Standard libs: -#include -#include -using namespace std; -#include - -// ROOT libs: -#include "TGClient.h" - -// MEGAlib libs: -#include "MGUIOptionsLoaderMeasurementsBinary.h" - - -//////////////////////////////////////////////////////////////////////////////// - - -#ifdef ___CLING___ -ClassImp(MModuleLoaderMeasurementsBinary) -#endif - - -//////////////////////////////////////////////////////////////////////////////// - - -MModuleLoaderMeasurementsBinary::MModuleLoaderMeasurementsBinary() : MModule(), MBinaryFlightDataParser() -{ - // Construct an instance of MModuleLoaderMeasurementsBinary - - // Set all modules, which have to be done before this module - // None - - // Set all types this modules handles - AddModuleType(MAssembly::c_EventLoader); - AddModuleType(MAssembly::c_EventLoaderMeasurement); - AddModuleType(MAssembly::c_EventOrdering); - AddModuleType(MAssembly::c_Aspect); - - // Set all modules, which can follow this module - AddSucceedingModuleType(MAssembly::c_NoRestriction); - - // Set the module name --- has to be unique - m_Name = "Data packet loader, sorter, and aspect reconstructor for COSI 2014/16"; - - // Set the XML tag --- has to be unique --- no spaces allowed - m_XmlTag = "XmlTagMeasurementLoaderBinary"; - - m_HasOptionsGUI = true; - - // Allow the use of multiple threads and instances - m_AllowMultiThreading = true; - m_AllowMultipleInstances = false; - - m_IsStartModule = true; - - m_IgnoreAspect = false; //this was set to true and was causing events to be pushed through the pipeline before aspect info was available for them AWL Sep 20 2016 - m_FileIsDone = false; - - m_IsZipped = false; - m_ZipFile = NULL; - - m_ExpoAspectViewer = nullptr; -} - - -//////////////////////////////////////////////////////////////////////////////// - - -MModuleLoaderMeasurementsBinary::~MModuleLoaderMeasurementsBinary() -{ - // Delete this instance of MModuleLoaderMeasurementsBinary -} - - -//////////////////////////////////////////////////////////////////////////////// - - -void MModuleLoaderMeasurementsBinary::CreateExpos() -{ - // Create all expos - - if (HasExpos() == true) return; - - // Set the histogram display - m_ExpoAspectViewer = new MGUIExpoAspectViewer(this); - m_Expos.push_back(m_ExpoAspectViewer); -} - - -//////////////////////////////////////////////////////////////////////////////// - -FILE * f_TOnly; - -bool MModuleLoaderMeasurementsBinary::OpenNextFile() -{ - //! Open next file, return false on error - - ++m_OpenFileID; - if (m_OpenFileID >= (int) m_BinaryFileNames.size()) return false; - - m_IsZipped = m_BinaryFileNames[m_OpenFileID].EndsWith(".gz"); - - if (m_IsZipped == false) { - if (m_In.is_open()) m_In.close(); - m_In.clear(); - - m_In.open(m_BinaryFileNames[m_OpenFileID], ios::binary); - if (m_In.is_open() == false) { - if (g_Verbosity >= c_Error) cout<= c_Error) cout<= c_Info) cout<= c_Error) cout<= c_Error) cout<= c_Info) cout<= c_Error) cout<= c_Error) cout< 0) { - if (GetAspectMode() == MBinaryFlightDataParserAspectModes::c_Neither) { - return true; - } else { - MAspect* A = m_Events[0]->GetAspect(); - if( A != 0 ){ - return true; - } - } - } - - //unsigned int Size = 1000000; // We have to do a large chunk here or the main thread is going to sleep... - //vector Stream(Size); - // Check if we reached the end of the file, if yes, truncate, and set the OK flag to false - // when the end of the file is reached, we want to - - //AWL restructured this so that we don't allocate/fill a 1MB array when there is nothing to read. - - vector Stream; - unsigned int Size = 1000000; - streamsize Read; - if (m_FileIsDone == true) { - Read = 0; - } else { - Stream.reserve(Size); - if (m_IsZipped == false) { - m_In.read(&Stream[0], Size); - Read = m_In.gcount(); - } else { - Read = 0; - for (unsigned int i = 0; i < Size; ++i) { - int c = gzgetc(m_ZipFile); - if (c == -1) { - break; - } - Stream[i] = (char) c; - Read = i+1; - } - } - } - - // If we do not read anything, try again with the next file - if (Read == 0) { - if (OpenNextFile() == true) { - Stream.reserve(Size); - if (m_IsZipped == false) { - m_In.read(&Stream[0], Size); - Read = m_In.gcount(); - } else { - Read = 0; - for (unsigned int i = 0; i < Size; ++i) { - int c = gzgetc(m_ZipFile); - if (c == -1) { - break; - } - Stream[i] = (char) c; - Read = i+1; - } - } - } - } - - /* - if (Read < Size) { - m_IsOK = false; - } - */ - - /* - if (Read < Size) { - m_FileIsDone = true; - SetIsDone(true); - } - */ - - if (Read == 0) { - m_FileIsDone = true; - SetIsDone(true); - } - - - if (m_FileIsDone == true && m_EventsBuf.size() == 0) { - //m_IsOK = false; - m_IsFinished = true; - } - - vector Received(Read); - for (unsigned int i = 0; i < Read; ++i) { - // cout << "char: " << Received[i] << endl; - // printf("char:%02X\n",(uint8_t)Stream[i]); - Received[i] = (uint8_t) Stream[i]; - } - - //cout<<"Received: "<GetCL() < LastCL){ - cout << LastCL << "--->" << NewEvent->GetCL() << endl; - } - LastCL = NewEvent->GetCL(); - */ - - //print TOnly info for these events - /* - if( NewEvent->GetNStripHitsTOnly() > 0 ){ - fprintf(f_TOnly,">>>\n"); - for(unsigned int i = 0; i < NewEvent->GetNStripHits(); ++i){ - MStripHit* SH = NewEvent->GetStripHit(i); - int id = SH->GetStripID(); - int T = (int) SH->GetTiming(); - if( SH->IsLowVoltageStrip() ){ - fprintf(f_TOnly,"X%d---%d, ",id,T); - } else { - fprintf(f_TOnly,"Y%d---%d; ",id,T); - } - } - fprintf(f_TOnly,"\n###\n"); - for(unsigned int i = 0; i < NewEvent->GetNStripHitsTOnly(); ++i){ - MStripHit* SH = NewEvent->GetStripHitTOnly(i); - int id = SH->GetStripID(); - int T = (int) SH->GetTiming(); - if( SH->IsLowVoltageStrip() ){ - fprintf(f_TOnly,"X%d---%d, ",id,T); - } else { - fprintf(f_TOnly,"Y%d---%d, ",id,T); - } - } - fprintf(f_TOnly,"\n<<<\n"); - } - */ - - - // This checks if the event's aspect data was within the range of the retrieved aspect info - if (NewEvent->GetAspect() != 0 && NewEvent->GetAspect()->GetOutOfRange()) { - delete NewEvent; - return false; - } - - //transfer over strip hits that have ADC - while (NewEvent->GetNStripHits() > 0) { - Event->AddStripHit( NewEvent->GetStripHit(0) ); - NewEvent->RemoveStripHit(0); - } - - //transfer over strip hits that have timing and no ADC - while (NewEvent->GetNStripHitsTOnly() > 0){ - Event->AddStripHitTOnly( NewEvent->GetStripHitTOnly(0)); - NewEvent->RemoveStripHitTOnly(0); - } - - - Event->SetID( NewEvent->GetID() ); - Event->SetFC( NewEvent->GetFC() ); - Event->SetTI( NewEvent->GetTI() ); - Event->SetCL( NewEvent->GetCL() ); - Event->SetTime( NewEvent->GetTime() ); - Event->SetMJD( NewEvent->GetMJD() ); - if (NewEvent->GetAspect() != 0) { - MAspect* A = new MAspect(*(NewEvent->GetAspect())); - Event->SetAspect(A); - Event->ComputeAbsoluteTime(); - //Event->SetAbsoluteTime(NewEvent->GetAbsoluteTime()); - if(Event->GetTime() == Event->GetAbsoluteTime()){ - cout << "times are equal" << endl; - } - //cout<<"Adding: "<GetTime()<<":"<GetHeading()<AddHeading(NewEvent->GetTime(), A->GetHeading(), A->GetGPS_or_magnetometer(), A->GetBRMS(), A->GetAttFlag()); - } - Event->SetAnalysisProgress(MAssembly::c_Aspect); - } else { - if (m_AspectMode != MBinaryFlightDataParserAspectModes::c_Neither) { - Event->SetAspectIncomplete(true); - } - } - Event->SetAnalysisProgress(MAssembly::c_EventLoader | - MAssembly::c_EventLoaderMeasurement | - MAssembly::c_EventOrdering); - - if (Event->GetTime().GetAsSystemSeconds() == 0) { - Event->SetTimeIncomplete(true); - } - - delete NewEvent; - - return true; -} - - -//////////////////////////////////////////////////////////////////////////////// - - -void MModuleLoaderMeasurementsBinary::Finalize() -{ - // Close the tranceiver - - MModule::Finalize(); - MBinaryFlightDataParser::Finalize(); - - m_In.close(); - m_In.clear(); - - return; -} - - -/////////////////////////////////////////////////////////////////////////////// - - -void MModuleLoaderMeasurementsBinary::ShowOptionsGUI() -{ - // Show the options GUI - - MGUIOptionsLoaderMeasurementsBinary* Options = new MGUIOptionsLoaderMeasurementsBinary(this); - Options->Create(); - gClient->WaitForUnmap(Options); -} - - -//////////////////////////////////////////////////////////////////////////////// - - -bool MModuleLoaderMeasurementsBinary::ReadXmlConfiguration(MXmlNode* Node) -{ - //! Read the configuration data from an XML node - - MXmlNode* FileNameNode = Node->GetNode("FileName"); - if (FileNameNode != 0) { - m_FileName = FileNameNode->GetValueAsString(); - } - - MXmlNode* DataSelectionModeNode = Node->GetNode("DataSelectionMode"); - if (DataSelectionModeNode != 0) { - m_DataSelectionMode = (MBinaryFlightDataParserDataModes) DataSelectionModeNode->GetValueAsInt(); - } - - MXmlNode* AspectSelectionModeNode = Node->GetNode("AspectSelectionMode"); - if( AspectSelectionModeNode != 0 ){ - m_AspectMode = (MBinaryFlightDataParserAspectModes) AspectSelectionModeNode->GetValueAsInt(); - } - - MXmlNode* CoincidenceMergingNode = Node->GetNode("CoincidenceMerging"); - if( CoincidenceMergingNode != NULL ){ - m_CoincidenceEnabled = (bool) CoincidenceMergingNode->GetValueAsInt(); - } - - - return true; -} - - -//////////////////////////////////////////////////////////////////////////////// - - -MXmlNode* MModuleLoaderMeasurementsBinary::CreateXmlConfiguration() -{ - //! Create an XML node tree from the configuration - - MXmlNode* Node = new MXmlNode(0, m_XmlTag); - new MXmlNode(Node, "FileName", m_FileName); - new MXmlNode(Node, "DataSelectionMode", (unsigned int) m_DataSelectionMode); - new MXmlNode(Node, "AspectSelectionMode", (unsigned int) m_AspectMode); - new MXmlNode(Node, "CoincidenceMerging",(unsigned int) m_CoincidenceEnabled); - - return Node; -} - - -// MModuleLoaderMeasurementsBinary.cxx: the end... -//////////////////////////////////////////////////////////////////////////////// diff --git a/src/MModuleLoaderMeasurementsHDF.cxx b/src/MModuleLoaderMeasurementsHDF.cxx new file mode 100644 index 00000000..24f1f918 --- /dev/null +++ b/src/MModuleLoaderMeasurementsHDF.cxx @@ -0,0 +1,568 @@ +/* + * MModuleLoaderMeasurementsHDF.cxx + * + * + * Copyright (C) by Andreas Zoglauer. + * All rights reserved. + * + * + * This code implementation is the intellectual property of + * Andreas Zoglauer. + * + * By copying, distributing or modifying the Program (or any work + * based on the Program) you indicate your acceptance of this statement, + * and all its terms. + * + */ + + +//////////////////////////////////////////////////////////////////////////////// +// +// MModuleLoaderMeasurementsHDF +// +//////////////////////////////////////////////////////////////////////////////// + + +// Include the header: +#include "MModuleLoaderMeasurementsHDF.h" + +// Standard libs: +#include +using namespace std; + +// ROOT libs: +#include "TGClient.h" + +// MEGAlib libs: +#include "MGUIOptionsLoaderMeasurementsHDF.h" +#include "MReadOut.h" +#include "MReadOutSequence.h" +#include "MReadOutElementDoubleStrip.h" +#include "MReadOutDataADCValue.h" +#include "MReadOutDataTiming.h" +#include "MReadOutDataOrigins.h" + + +//////////////////////////////////////////////////////////////////////////////// + + +#ifdef ___CLING___ +ClassImp(MModuleLoaderMeasurementsHDF) +#endif + + +//////////////////////////////////////////////////////////////////////////////// + + +MModuleLoaderMeasurementsHDF::MModuleLoaderMeasurementsHDF() : MModuleLoaderMeasurements() +{ + // Construct an instance of MModuleLoaderMeasurementsHDF + + // Set all module relevant information + + // Set the module name --- has to be unique + m_Name = "Measurement loader for HDF files"; + + // Set the XML tag --- has to be unique --- no spaces allowed + m_XmlTag = "XmlTagMeasurementLoaderHDF"; + + // This is a special start module which can generate its own events + m_IsStartModule = true; + + // Allow the use of multiple threads and instances + m_AllowMultiThreading = true; + m_AllowMultipleInstances = false; + + m_LoadContinuationFiles = false; + m_FileNameStripMap = ""; +} + + +//////////////////////////////////////////////////////////////////////////////// + + +MModuleLoaderMeasurementsHDF::~MModuleLoaderMeasurementsHDF() +{ + // Delete this instance of MModuleLoaderMeasurementsHDF +} + + +//////////////////////////////////////////////////////////////////////////////// + + +bool MModuleLoaderMeasurementsHDF::Initialize() +{ + // Initialize the module + + // Clean: + m_FileType = "Unknown"; + m_Detector = "Unknown"; + m_Version = -1; + /* + m_StartObservationTime = MTime(0); + m_EndObservationTime = MTime(0); + m_StartClock = numeric_limits::max(); + m_EndClock = numeric_limits::max(); + */ + + m_TotalHits = 0; + m_CurrentHit = 0; + + m_NumberOfEventIDRollOvers = 0; + m_LastEventID = 0; + + if (MFile::Exists(m_FileName) == false) { + if (g_Verbosity >= c_Error) cout<= c_Error) cout<= c_Error) cout<= c_Error) cout< 0) { + DataSet VersionDataset = m_HDFFile.openDataSet("/HDFVersion"); + + // Create compound type for version + CompType VersionType(sizeof(MHDFStripHitVersionString)); + StrType StringType(PredType::C_S1, 256); + VersionType.insertMember("string_col", HOFFSET(MHDFStripHitVersionString, string_col), StringType); + + MHDFStripHitVersionString VS; + VersionDataset.read(&VS, VersionType); + + if (string(VS.string_col) == "1.2") { + m_HDFStripHitVersion = MHDFStripHitVersion::V1_2; + } else { + if (g_Verbosity >= c_Error) cout<= c_Error) cout<= c_Error) cout<= c_Error) cout<= c_Error) cout<= m_TotalHits) { + if (m_LoadContinuationFiles == true) { + // Check if we have more files to load: + MString FileName = m_FileName; + MString NextSuffix = MString("_") + (m_ContinuationFileID+1) + ".hdf5"; + FileName.ReplaceAllInPlace(".hdf5", NextSuffix); + if (MFile::Exists(FileName) == true) { + if (OpenHDF5File(FileName) == false) { + cout<= m_CurrentBatchSize) { + if (ReadBatchHits() == false) { + return false; + } + } + + // Extract the data we need + uint16_t EventID; + uint64_t TimeCode; + uint16_t StripID; + uint16_t ADCs; + uint16_t TACs; + uint8_t NumberOfHits; + uint8_t HitType; + uint8_t TimingType; + + if (m_HDFStripHitVersion == MHDFStripHitVersion::V1_0) { + MHDFStripHit_V1_0& Hit = m_Buffer_1_0[m_CurrentBatchIndex]; + ++m_CurrentBatchIndex; + ++m_CurrentHit; + + EventID = Hit.m_EventID; + TimeCode = Hit.m_TimeCode; + StripID = Hit.m_StripID; + ADCs = Hit.m_EnergyData; + TACs = Hit.m_TimingData; + NumberOfHits = Hit.m_Hits; + HitType = Hit.m_HitType; + TimingType = Hit.m_TimingType; + + } else if (m_HDFStripHitVersion == MHDFStripHitVersion::V1_2) { + MHDFStripHit_V1_2& Hit = m_Buffer_1_2[m_CurrentBatchIndex]; + ++m_CurrentBatchIndex; + ++m_CurrentHit; + + EventID = Hit.m_EventID; + TimeCode = Hit.m_TimeCode; + StripID = Hit.m_StripID; + ADCs = Hit.m_EnergyData; + TACs = Hit.m_TimingData; + NumberOfHits = Hit.m_Hits; + HitType = Hit.m_HitType; + TimingType = Hit.m_TimingType; + + } else { + if (g_Verbosity >= c_Error) cout<= c_Info) { + cout<= c_Error) cout<GetNStripHits() > 0) { + MStripHit* H = Event->GetStripHit(0); + delete H; + Event->RemoveStripHit(0); + } + } + IsZeroDataBug = false; + } + + if (EventID < m_LastEventID) { + m_NumberOfEventIDRollOvers++; + } + m_LastEventID = EventID; + + unsigned long LongEventID = EventID + m_NumberOfEventIDRollOvers*(numeric_limits::max() + 1); + + Event->SetID(LongEventID); + if (m_HDFStripHitVersion == MHDFStripHitVersion::V1_0) { + Event->SetCL(TimeCode); + } else { + Event->SetTI(TimeCode); + } + + if (m_StripMap.HasReadOutID(StripID) == true) { + MStripHit* H = new MStripHit(); + H->SetDetectorID(m_StripMap.GetDetectorID(StripID)); + H->SetStripID(m_StripMap.GetStripNumber(StripID)); + H->IsLowVoltageStrip(m_StripMap.IsLowVoltage(StripID)); + H->SetADCUnits(ADCs); + H->SetTAC(TACs); + + + // Set boolean flags based on HitType and TimingType + H->IsGuardRing(HitType == 2); + if (H->IsGuardRing() == true) { + Event->SetGuardRingVeto(true); + } + H->IsNearestNeighbor(HitType == 1); + H->HasFastTiming(TimingType == 1); + + Event->AddStripHit(H); + + } else { + if (g_Verbosity >= c_Error) cout<(NumberOfHits); + StripHitIndex++; + } + + Event->SetAnalysisProgress(MAssembly::c_EventLoader | MAssembly::c_EventLoaderMeasurement); + + return true; +} + + +//////////////////////////////////////////////////////////////////////////////// + + +void MModuleLoaderMeasurementsHDF::Finalize() +{ + // Initialize the module + + MModule::Finalize(); + + cout<<"MModuleLoaderMeasurementsHDF: "<GetNode("FileNameHDF5"); + if (FileNameHDF5Node != nullptr) { + m_FileName = FileNameHDF5Node->GetValue(); + } + + MXmlNode* LoadContinuationFilesNode = Node->GetNode("LoadContinuationFiles"); + if (LoadContinuationFilesNode != nullptr) { + m_LoadContinuationFiles = LoadContinuationFilesNode->GetValueAsBoolean(); + } + + MXmlNode* FileNameStripMapNode = Node->GetNode("FileNameStripMap"); + if (FileNameStripMapNode != nullptr) { + m_FileNameStripMap = FileNameStripMapNode->GetValue(); + } + + return true; +} + + +//////////////////////////////////////////////////////////////////////////////// + + +MXmlNode* MModuleLoaderMeasurementsHDF::CreateXmlConfiguration() +{ + //! Create an XML node tree from the configuration + + MXmlNode* Node = new MXmlNode(0, m_XmlTag); + new MXmlNode(Node, "FileNameHDF5", m_FileName); + new MXmlNode(Node, "LoadContinuationFiles", m_LoadContinuationFiles); + new MXmlNode(Node, "FileNameStripMap", m_FileNameStripMap); + + return Node; +} + + +/////////////////////////////////////////////////////////////////////////////// + + +void MModuleLoaderMeasurementsHDF::ShowOptionsGUI() +{ + //! Show the options GUI + + MGUIOptionsLoaderMeasurementsHDF* Options = new MGUIOptionsLoaderMeasurementsHDF(this); + Options->Create(); + gClient->WaitForUnmap(Options); +} + + +// MModuleLoaderMeasurementsHDF.cxx: the end... +//////////////////////////////////////////////////////////////////////////////// diff --git a/src/MModuleLoaderMeasurementsROA.cxx b/src/MModuleLoaderMeasurementsROA.cxx index ba7da260..69bfe76e 100644 --- a/src/MModuleLoaderMeasurementsROA.cxx +++ b/src/MModuleLoaderMeasurementsROA.cxx @@ -33,6 +33,7 @@ // MEGAlib libs: #include "MGUIOptionsTemplate.h" +#include "MGUIOptionsLoaderMeasurements.h" #include "MReadOut.h" #include "MReadOutSequence.h" #include "MReadOutElementDoubleStrip.h" @@ -40,6 +41,7 @@ #include "MReadOutDataTiming.h" #include "MReadOutDataOrigins.h" + //////////////////////////////////////////////////////////////////////////////// @@ -191,11 +193,11 @@ bool MModuleLoaderMeasurementsROA::ReadNextEvent(MReadOutAssembly* Event) MStripHit* SH = new MStripHit(); SH->SetDetectorID(Strip->GetDetectorID()); - SH->IsLowVoltageStrip(Strip->IsLowVoltageStrip()); + SH->IsXStrip(Strip->IsLowVoltageStrip()); SH->SetStripID(Strip->GetStripID()); if (Timing != nullptr) { - SH->SetTiming(Timing->GetTiming()); + SH->SetTAC(Timing->GetTiming()); } else { cout<Create(); + gClient->WaitForUnmap(Options); +} + + // MModuleLoaderMeasurementsROA.cxx: the end... //////////////////////////////////////////////////////////////////////////////// diff --git a/src/MModuleLoaderSimulationsCosima.cxx b/src/MModuleLoaderSimulationsCosima.cxx new file mode 100644 index 00000000..1a84924b --- /dev/null +++ b/src/MModuleLoaderSimulationsCosima.cxx @@ -0,0 +1,213 @@ +/* + * MModuleLoaderSimulationsCosima.cxx + * + * + * Copyright (C) by Andreas Zoglauer. + * All rights reserved. + * + * + * This code implementation is the intellectual property of + * Andreas Zoglauer. + * + * By copying, distributing or modifying the Program (or any work + * based on the Program) you indicate your acceptance of this statement, + * and all its terms. + * + */ + + +//////////////////////////////////////////////////////////////////////////////// +// +// MModuleLoaderSimulationsCosima +// +//////////////////////////////////////////////////////////////////////////////// + + +// Include the header: +#include "MModuleLoaderSimulationsCosima.h" + +// Standard libs: + +// ROOT libs: +#include "TGClient.h" + +// MEGAlib libs: +#include "MGUIOptionsLoaderSimulationsCosima.h" +#include "MModuleEventSaver.h" + + +//////////////////////////////////////////////////////////////////////////////// + + +#ifdef ___CLING___ +ClassImp(MModuleLoaderSimulationsCosima) +#endif + + +//////////////////////////////////////////////////////////////////////////////// + + +MModuleLoaderSimulationsCosima::MModuleLoaderSimulationsCosima() : MModule() +{ + // Construct an instance of MModuleLoaderSimulationsCosima + + // Set the module name --- has to be unique + m_Name = "Cosima simulation loader"; + + // Set the XML tag --- has to be unique --- no spaces allowed + m_XmlTag = "XmlTagLoaderSimulations"; + + // This is a special start module which can generate its own events + m_IsStartModule = true; + + // Allow the use of multiple threads and instances + m_AllowMultiThreading = true; + m_AllowMultipleInstances = false; + + // Set all modules, which have to be done before this module + // None + + // Set all types this modules handles + AddModuleType(MAssembly::c_EventLoader); + AddModuleType(MAssembly::c_EventLoaderSimulation); + + // Set all modules, which can follow this module + AddSucceedingModuleType(MAssembly::c_NoRestriction); + + m_HasOptionsGUI = true; + + m_UseStopAfter = false; + m_MaximumAcceptedEvents = 10000000; +} + + +//////////////////////////////////////////////////////////////////////////////// + + +MModuleLoaderSimulationsCosima::~MModuleLoaderSimulationsCosima() +{ + // Delete this instance of MModuleLoaderSimulationsCosima +} + + +//////////////////////////////////////////////////////////////////////////////// + + +bool MModuleLoaderSimulationsCosima::Initialize() +{ + // Initialize the module + + m_Reader = new MFileEventsSim(m_Geometry); + if (m_Reader->Open(m_SimulationFileName) == false) { + cout<<"Unable to open sim file "<GetSimulationStartAreaFarField(); + + + MSupervisor* S = MSupervisor::GetSupervisor(); + MModuleEventSaver* Saver = dynamic_cast(S->GetAvailableModuleByXmlTag("XmlTagEventSaver")); + if (Saver != nullptr) { + Saver->SetStartAreaFarField(m_StartAreaFarField); + } + + m_AcceptedEvents = 0; + + return MModule::Initialize(); +} + + +//////////////////////////////////////////////////////////////////////////////// + + +bool MModuleLoaderSimulationsCosima::AnalyzeEvent(MReadOutAssembly* Event) +{ + // Main data analysis routine, which updates the event to a new level + + if (m_UseStopAfter == true) { + if (m_AcceptedEvents >= m_MaximumAcceptedEvents) { + m_IsFinished = true; + return false; + } + } + + MSimEvent* SimEvent = m_Reader->GetNextEvent(false); + + if (SimEvent == nullptr) { + m_IsFinished = true; + return false; + } + + Event->SetSimulatedEvent(SimEvent); // event becomes owner + Event->SetAnalysisProgress(MAssembly::c_EventLoader | MAssembly::c_EventLoaderSimulation); + + m_AcceptedEvents++; + + return true; +} + + +//////////////////////////////////////////////////////////////////////////////// + + +void MModuleLoaderSimulationsCosima::Finalize() +{ + // Initialize the module + + MModule::Finalize(); + + MSupervisor* S = MSupervisor::GetSupervisor(); + MModuleEventSaver* Saver = dynamic_cast(S->GetAvailableModuleByXmlTag("XmlTagEventSaver")); + if (Saver != nullptr) { + // Saver->SetSimulatedEvents(m_Reader->GetSimulatedEvents()); + Saver->SetSimulatedEvents(m_NumberOfSimulatedEvents); + } + +} + + +/////////////////////////////////////////////////////////////////////////////// + + +void MModuleLoaderSimulationsCosima::ShowOptionsGUI() +{ + //! Show the options GUI + + MGUIOptionsLoaderSimulationsCosima* Options = new MGUIOptionsLoaderSimulationsCosima(this); + Options->Create(); + gClient->WaitForUnmap(Options); +} + + +//////////////////////////////////////////////////////////////////////////////// + + +bool MModuleLoaderSimulationsCosima::ReadXmlConfiguration(MXmlNode* Node) +{ + //! Read the configuration data from an XML node + + MXmlNode* SimulationFileNameNode = Node->GetNode("SimulationFileName"); + if (SimulationFileNameNode != 0) { + SetSimulationFileName(SimulationFileNameNode->GetValue()); + } + + return true; +} + + +//////////////////////////////////////////////////////////////////////////////// + + +MXmlNode* MModuleLoaderSimulationsCosima::CreateXmlConfiguration() +{ + //! Create an XML node tree from the configuration + + MXmlNode* Node = new MXmlNode(0, m_XmlTag); + new MXmlNode(Node, "SimulationFileName", m_SimulationFileName); + + return Node; +} + + +// MModuleLoaderSimulationsCosima.cxx: the end... +//////////////////////////////////////////////////////////////////////////////// diff --git a/src/MModuleLoaderSimulationsSingleDet.cxx b/src/MModuleLoaderSimulationsSingleDet.cxx new file mode 100644 index 00000000..d4bc4f29 --- /dev/null +++ b/src/MModuleLoaderSimulationsSingleDet.cxx @@ -0,0 +1,284 @@ +/* + * MModuleLoaderSimulationsSingleDet.cxx + * + * + * Copyright (C) by Andreas Zoglauer. + * All rights reserved. + * + * + * This code implementation is the intellectual property of + * Andreas Zoglauer. + * + * By copying, distributing or modifying the Program (or any work + * based on the Program) you indicate your acceptance of this statement, + * and all its terms. + * + */ + + +//////////////////////////////////////////////////////////////////////////////// +// +// MModuleLoaderSimulationsSingleDet +// +//////////////////////////////////////////////////////////////////////////////// + + +// Include the header: +#include "MModuleLoaderSimulationsSingleDet.h" + +// Standard libs: + +// ROOT libs: +#include "TGClient.h" + +// MEGAlib libs: +#include "MGUIOptionsLoaderSimulations.h" +#include "MModuleEventSaver.h" + + +//////////////////////////////////////////////////////////////////////////////// + + +#ifdef ___CLING___ +ClassImp(MModuleLoaderSimulationsSingleDet) +#endif + + +//////////////////////////////////////////////////////////////////////////////// + + +MModuleLoaderSimulationsSingleDet::MModuleLoaderSimulationsSingleDet() : MModule() +{ + // Construct an instance of MModuleLoaderSimulationsSingleDet + + // Set the module name --- has to be unique + m_Name = "Simulation loader and detector effects engine for COSI SingleDet"; + + // Set the XML tag --- has to be unique --- no spaces allowed + m_XmlTag = "XmlTagLoaderSimulationsSingleDet"; + + // This is a special start module which can generate its own events + m_IsStartModule = true; + + // Allow the use of multiple threads and instances + m_AllowMultiThreading = true; + m_AllowMultipleInstances = false; + + // Set all modules, which have to be done before this module + // None + + // Set all types this modules handles + AddModuleType(MAssembly::c_EventLoader); + AddModuleType(MAssembly::c_EventLoaderSimulation); + AddModuleType(MAssembly::c_DetectorEffectsEngine); + + // Set all modules, which can follow this module + AddSucceedingModuleType(MAssembly::c_NoRestriction); + + m_HasOptionsGUI = true; + + m_UseStopAfter = false; + m_MaximumAcceptedEvents = 10000000; +} + + +//////////////////////////////////////////////////////////////////////////////// + + +MModuleLoaderSimulationsSingleDet::~MModuleLoaderSimulationsSingleDet() +{ + // Delete this instance of MModuleLoaderSimulationsSingleDet +} + + +//////////////////////////////////////////////////////////////////////////////// + + +bool MModuleLoaderSimulationsSingleDet::Initialize() +{ + // Initialize the module + + MDetectorEffectsEngineSingleDet::SetGeometry(MModule::m_Geometry); + if (MDetectorEffectsEngineSingleDet::Initialize() == false) { + return false; + } + + MSupervisor* S = MSupervisor::GetSupervisor(); + MModuleEventSaver* Saver = dynamic_cast(S->GetAvailableModuleByXmlTag("XmlTagEventSaver")); + if (Saver != nullptr) { + Saver->SetStartAreaFarField(m_StartAreaFarField); + } + + m_AcceptedEvents = 0; + + return MModule::Initialize(); +} + + +//////////////////////////////////////////////////////////////////////////////// + + +bool MModuleLoaderSimulationsSingleDet::AnalyzeEvent(MReadOutAssembly* Event) +{ + // Main data analysis routine, which updates the event to a new level + + if (m_UseStopAfter == true) { + if (m_AcceptedEvents >= m_MaximumAcceptedEvents) { + m_IsFinished = true; + return false; + } + } + + if (MDetectorEffectsEngineSingleDet::GetNextEvent(Event) == false) { + m_IsFinished = true; + return false; + } + + Event->SetAnalysisProgress(MAssembly::c_EventLoader | MAssembly::c_EventLoaderSimulation | MAssembly::c_DetectorEffectsEngine); + + m_AcceptedEvents++; + + return true; +} + + +//////////////////////////////////////////////////////////////////////////////// + + +void MModuleLoaderSimulationsSingleDet::Finalize() +{ + // Initialize the module + + MSupervisor* S = MSupervisor::GetSupervisor(); + MModuleEventSaver* Saver = dynamic_cast(S->GetAvailableModuleByXmlTag("XmlTagEventSaver")); + if (Saver != nullptr) { + // Saver->SetSimulatedEvents(m_Reader->GetSimulatedEvents()); + Saver->SetSimulatedEvents(m_NumberOfSimulatedEvents); + } + + MDetectorEffectsEngineSingleDet::Finalize(); +} + + +/////////////////////////////////////////////////////////////////////////////// + + +void MModuleLoaderSimulationsSingleDet::ShowOptionsGUI() +{ + //! Show the options GUI + + MGUIOptionsLoaderSimulations* Options = new MGUIOptionsLoaderSimulations(this); + Options->Create(); + gClient->WaitForUnmap(Options); +} + + +//////////////////////////////////////////////////////////////////////////////// + + +bool MModuleLoaderSimulationsSingleDet::ReadXmlConfiguration(MXmlNode* Node) +{ + //! Read the configuration data from an XML node + + MXmlNode* SimulationFileNameNode = Node->GetNode("SimulationFileName"); + if (SimulationFileNameNode != 0) { + SetSimulationFileName(SimulationFileNameNode->GetValue()); + } + MXmlNode* DeadtimeFileNameNode = Node->GetNode("DeadtimeFileName"); + if (DeadtimeFileNameNode != 0) { + SetDeadtimeFileName(DeadtimeFileNameNode->GetValue()); + } + MXmlNode* EnergyCalibrationFileNameNode = Node->GetNode("EnergyCalibrationFileName"); + if (EnergyCalibrationFileNameNode != 0) { + SetEnergyCalibrationFileName(EnergyCalibrationFileNameNode->GetValue()); + } + MXmlNode* DeadStripFileNameNode = Node->GetNode("DeadStripFileName"); + if (DeadStripFileNameNode != 0) { + SetDeadStripFileName(DeadStripFileNameNode->GetValue()); + } + MXmlNode* ThresholdFileNameNode = Node->GetNode("ThresholdFileName"); + if (ThresholdFileNameNode != 0) { + SetThresholdFileName(ThresholdFileNameNode->GetValue()); + } + MXmlNode* GuardRingThresholdFileNameNode = Node->GetNode("GuardRingThresholdFileName"); + if (GuardRingThresholdFileNameNode != 0) { + SetGuardRingThresholdFileName(GuardRingThresholdFileNameNode->GetValue()); + } + MXmlNode* ChargeSharingFileNameNode = Node->GetNode("ChargeSharingFileName"); + if (ChargeSharingFileNameNode != 0) { + SetChargeSharingFileName(ChargeSharingFileNameNode->GetValue()); + } + MXmlNode* CrosstalkFileNameNode = Node->GetNode("CrosstalkFileName"); + if (CrosstalkFileNameNode != 0) { + SetCrosstalkFileName(CrosstalkFileNameNode->GetValue()); + } + MXmlNode* ChargeLossFileNameNode = Node->GetNode("ChargeLossFileName"); + if (ChargeLossFileNameNode != 0) { + SetChargeLossFileName(ChargeLossFileNameNode->GetValue()); + } + MXmlNode* DepthCalibrationCoeffsFileNameNode = Node->GetNode("DepthCalibrationCoeffsFileName"); + if (DepthCalibrationCoeffsFileNameNode != 0) { + SetDepthCalibrationCoeffsFileName(DepthCalibrationCoeffsFileNameNode->GetValue()); + } + MXmlNode* DepthCalibrationTACCalFileNameNode = Node->GetNode("DepthCalibrationTACCalFileName"); + if (DepthCalibrationTACCalFileNameNode != 0) { + SetDepthCalibrationTACCalFileName(DepthCalibrationTACCalFileNameNode->GetValue()); + } + MXmlNode* DepthCalibrationSplinesFileNameNode = Node->GetNode("DepthCalibrationSplinesFileName"); + if (DepthCalibrationSplinesFileNameNode != 0) { + SetDepthCalibrationSplinesFileName(DepthCalibrationSplinesFileNameNode->GetValue()); + } + // ACS DEE file + MXmlNode* ACSEnergyCorrectionFileNameNode = Node->GetNode("ACSEnergyCorrectionFileName"); + if (ACSEnergyCorrectionFileNameNode != 0) { + SetACSEnergyCorrectionFileName(ACSEnergyCorrectionFileNameNode->GetValue()); + } + MXmlNode* ApplyFudgeFactorNode = Node->GetNode("ApplyFudgeFactor"); + if (ApplyFudgeFactorNode != 0) { + m_ApplyFudgeFactor = ApplyFudgeFactorNode->GetValueAsBoolean(); + } + MXmlNode* UseStopAfterNode = Node->GetNode("UseStopAfter"); + if (UseStopAfterNode != 0) { + m_UseStopAfter = UseStopAfterNode->GetValueAsBoolean(); + } + MXmlNode* MaximumAcceptedEventsNode = Node->GetNode("MaximumAcceptedEvents"); + if (MaximumAcceptedEventsNode != 0) { + m_MaximumAcceptedEvents = MaximumAcceptedEventsNode->GetValueAsLong(); + } + + return true; +} + + +//////////////////////////////////////////////////////////////////////////////// + + +MXmlNode* MModuleLoaderSimulationsSingleDet::CreateXmlConfiguration() +{ + //! Create an XML node tree from the configuration + + MXmlNode* Node = new MXmlNode(0, m_XmlTag); + new MXmlNode(Node, "SimulationFileName", m_SimulationFileName); + new MXmlNode(Node, "DeadtimeFileName", m_DeadtimeFileName); + new MXmlNode(Node, "EnergyCalibrationFileName", m_EnergyCalibrationFileName); + new MXmlNode(Node, "DeadStripFileName", m_DeadStripFileName); + new MXmlNode(Node, "ThresholdFileName", m_ThresholdFileName); + new MXmlNode(Node, "GuardRingThresholdFileName", m_GuardRingThresholdFileName); + new MXmlNode(Node, "ChargeSharingFileName", m_ChargeSharingFileName); + new MXmlNode(Node, "CrosstalkFileName", m_CrosstalkFileName); + new MXmlNode(Node, "ChargeLossFileName", m_ChargeLossFileName); + new MXmlNode(Node, "DepthCalibrationCoeffsFileName", m_DepthCalibrationCoeffsFileName); + new MXmlNode(Node, "DepthCalibrationTACCalFileName", m_DepthCalibrationTACCalFileName); + new MXmlNode(Node, "DepthCalibrationSplinesFileName", m_DepthCalibrationSplinesFileName); + // ACS DEE + new MXmlNode(Node, "ACSEnergyCorrectionFileName", m_ACSEnergyCorrectionFileName); + new MXmlNode(Node, "ApplyFudgeFactor", m_ApplyFudgeFactor); + new MXmlNode(Node, "UseStopAfter", m_UseStopAfter); + new MXmlNode(Node, "MaximumAcceptedEvents", m_MaximumAcceptedEvents); + + return Node; +} + + +// MModuleLoaderSimulationsSingleDet.cxx: the end... +//////////////////////////////////////////////////////////////////////////////// diff --git a/src/MModuleNearestNeighbor.cxx b/src/MModuleNearestNeighbor.cxx new file mode 100644 index 00000000..6d79b7ee --- /dev/null +++ b/src/MModuleNearestNeighbor.cxx @@ -0,0 +1,189 @@ +/* + * MModuleNearestNeighbor.cxx + * + * + * Copyright (C) by Andreas Zoglauer. + * All rights reserved. + * + * + * This code implementation is the intellectual property of + * Andreas Zoglauer. + * + * By copying, distributing or modifying the Program (or any work + * based on the Program) you indicate your acceptance of this statement, + * and all its terms. + * + */ + + +//////////////////////////////////////////////////////////////////////////////// +// +// MModuleNearestNeighbor +// +//////////////////////////////////////////////////////////////////////////////// + + +// Include the header: +#include "MModuleNearestNeighbor.h" + +// Standard libs: + +// ROOT libs: +#include "TGClient.h" + +// MEGAlib libs: +#include "MModule.h" + + +//////////////////////////////////////////////////////////////////////////////// + + +#ifdef ___CLING___ +ClassImp(MModuleNearestNeighbor) +#endif + + +//////////////////////////////////////////////////////////////////////////////// + + +MModuleNearestNeighbor::MModuleNearestNeighbor() : MModule() +{ + // Construct an instance of MModuleNearestNeighbor + + // Set all module relevant information + + // Set the module name --- has to be unique + m_Name = "NearestNeighbor"; + + // Set the XML tag --- has to be unique --- no spaces allowed + m_XmlTag = "XmlTagNearestNeighbor"; + + // Set all modules, which have to be done before this module + AddPreceedingModuleType(MAssembly::c_EventLoader); + + // Set all types this modules handles + AddModuleType(MAssembly::c_NearestNeighbor); + + // Set all modules, which can follow this module + AddSucceedingModuleType(MAssembly::c_NoRestriction); + + // Set if this module has an options GUI + // Overwrite ShowOptionsGUI() with the call to the GUI! + m_HasOptionsGUI = false; + // If true, you have to derive a class from MGUIOptions (use MGUIOptionsNearestNeighbor) + // and implement all your GUI options + + // Can the program be run multi-threaded + m_AllowMultiThreading = true; + + // Can we use multiple instances of this class + m_AllowMultipleInstances = true; +} + + +//////////////////////////////////////////////////////////////////////////////// + + +MModuleNearestNeighbor::~MModuleNearestNeighbor() +{ + // Delete this instance of MModuleNearestNeighbor +} + + +//////////////////////////////////////////////////////////////////////////////// + + +bool MModuleNearestNeighbor::Initialize() +{ + // Initialize the module + + return MModule::Initialize(); +} + + +//////////////////////////////////////////////////////////////////////////////// + + +bool MModuleNearestNeighbor::AnalyzeEvent(MReadOutAssembly* Event) +{ + // For the time being remove all next neighbor hits + + for (unsigned int i = 0; i < Event->GetNStripHits();) { + MStripHit* SH = Event->GetStripHit(i); + if (SH->IsNearestNeighbor() == true) { + Event->RemoveStripHit(i); + delete SH; + } else { + ++i; + } + } + + Event->SetAnalysisProgress(MAssembly::c_NearestNeighbor); + + return true; +} + + +//////////////////////////////////////////////////////////////////////////////// + + +void MModuleNearestNeighbor::Finalize() +{ + // Finalize the analysis - do all cleanup, i.e., undo Initialize() + + MModule::Finalize(); +} + + +//////////////////////////////////////////////////////////////////////////////// + + +void MModuleNearestNeighbor::ShowOptionsGUI() +{ + //! Show the options GUI --- has to be overwritten! + + /* + MGUIOptionsNearestNeighbor* Options = new MGUIOptionsNearestNeighbor(this); + Options->Create(); + gClient->WaitForUnmap(Options); + */ +} + + +//////////////////////////////////////////////////////////////////////////////// + + +bool MModuleNearestNeighbor::ReadXmlConfiguration(MXmlNode* Node) +{ + //! Read the configuration data from an XML node + + /* + MXmlNode* SomeTagNode = Node->GetNode("SomeTag"); + if (SomeTagNode != 0) { + m_SomeTagValue = SomeTagNode->GetValue(); + } + */ + + return true; +} + + +//////////////////////////////////////////////////////////////////////////////// + + +MXmlNode* MModuleNearestNeighbor::CreateXmlConfiguration() +{ + //! Create an XML node tree from the configuration + + MXmlNode* Node = new MXmlNode(0, m_XmlTag); + + /* + MXmlNode* SomeTagNode = new MXmlNode(Node, "SomeTag", "SomeValue"); + */ + + return Node; +} + + +// MModuleNearestNeighbor.cxx: the end... +//////////////////////////////////////////////////////////////////////////////// diff --git a/src/MModuleReceiverBalloon.cxx b/src/MModuleReceiverBalloon.cxx deleted file mode 100644 index ff8a2e38..00000000 --- a/src/MModuleReceiverBalloon.cxx +++ /dev/null @@ -1,629 +0,0 @@ -/* - * MModuleReceiverBalloon.cxx - * - * - * Copyright (C) by Alex Lowell & Andreas Zoglauer. - * All rights reserved. - * - * - * This code implementation is the intellectual property of - * Andreas Zoglauer. - * - * By copying, distributing or modifying the Program (or any work - * based on the Program) you indicate your acceptance of this statement, - * and all its terms. - * - */ - - - - -//////////////////////////////////////////////////////////////////////////////// -// -// MModuleReceiverBalloon -// -//////////////////////////////////////////////////////////////////////////////// - - -// Include the header: -#include "MModuleReceiverBalloon.h" - -// Standard libs: -#include -#include -using namespace std; -#include - -// ROOT libs: -#include "TGClient.h" - -// MEGAlib libs: -#include "MGUIOptionsReceiverBalloon.h" -#include "MGUIExpoReceiver.h" - - -//////////////////////////////////////////////////////////////////////////////// - - -#ifdef ___CLING___ -ClassImp(MModuleReceiverBalloon) -#endif - - -//////////////////////////////////////////////////////////////////////////////// - - -MModuleReceiverBalloon::MModuleReceiverBalloon() : MModule(), MBinaryFlightDataParser() -{ - // Construct an instance of MModuleReceiverBalloon - - // Set all modules, which have to be done before this module - // None - - // Set all types this modules handles - AddModuleType(MAssembly::c_EventLoader); - AddModuleType(MAssembly::c_EventLoaderMeasurement); - AddModuleType(MAssembly::c_EventOrdering); - AddModuleType(MAssembly::c_Aspect); - - // Set all modules, which can follow this module - AddSucceedingModuleType(MAssembly::c_NoRestriction); - - // Set the module name --- has to be unique - m_Name = "Data packet receiver, sorter, and aspect reconstructor for COSI 2014/2016"; - - // Set the XML tag --- has to be unique --- no spaces allowed - m_XmlTag = "XmlTagReceiverBalloon"; - - m_HasOptionsGUI = true; - - m_DistributorName = "128.32.13.133"; - m_DistributorPort = 215261; - m_DistributorStreamID = "OP"; - - m_RequestConnection = true; - m_LocalReceivingHostName = "128.32.13.133"; - m_LocalReceivingPort = 21530; - - m_Receiver = 0; - m_ReceivedData = 0; - - // Allow the use of multiple threads and instances - m_AllowMultiThreading = true; - m_AllowMultipleInstances = false; - - // Do not allow pausing of this module - m_AllowPausing = false; - - m_IsStartModule = true; -} - - -//////////////////////////////////////////////////////////////////////////////// - - -MModuleReceiverBalloon::~MModuleReceiverBalloon() -{ - // Delete this instance of MModuleReceiverBalloon -} - - -//////////////////////////////////////////////////////////////////////////////// - - -void MModuleReceiverBalloon::CreateExpos() -{ - // Create all expos - - if (HasExpos() == true) return; - - // Set the histogram display - m_ExpoReceiver = new MGUIExpoReceiver(this); - m_Expos.push_back(m_ExpoReceiver); - m_ExpoAspectViewer = new MGUIExpoAspectViewer(this); - m_Expos.push_back(m_ExpoAspectViewer); -} - - -//////////////////////////////////////////////////////////////////////////////// - - -bool MModuleReceiverBalloon::RequestConnection() -{ - // Perform a handshake with the distributor - - cout<<"Handshake: Trying to start connction"<SetVerbosity(3); - Handshaker->RequestClient(true); - Handshaker->Connect(false); - int Wait = 2000; - while (Handshaker->IsConnected() == false && --Wait > 0 && m_Interrupt == false) { - gSystem->Sleep(10); - gSystem->ProcessEvents(); - continue; - } - if (Handshaker->IsConnected() == false && Wait == 0) { - cout<<"Handshake: Never connected - disconnecting"<Disconnect(true); - delete Handshaker; - Handshaker = 0; - gSystem->ProcessEvents(); - gSystem->Sleep(1000*gRandom->Rndm()); - gSystem->ProcessEvents(); - continue; - } - cout<<"Handshake: Connected!"< ToSend; - for (char c: msg.str()) { - ToSend.push_back(static_cast(c)); - } - unsigned long NResets = Handshaker->GetNResets(); - Handshaker->Send(ToSend); - cout<<"Handshake: Sent connection request: "<IsConnected() == true && Restart == false && m_Interrupt == false) { - ++Wait; - gSystem->ProcessEvents(); - if (Wait < 10) { - gSystem->Sleep(1000); - } else { - gSystem->Sleep(10000); - } - // Need a timeout here - if (Timeout < 16) Timeout *= 1.5; - if (Handshaker->GetNResets() > NResets || Waiting.GetElapsed() > Timeout) { - cout<<"Handshake: Reset or didn't receive anything -- timeout & restarting"<Disconnect(); - delete Handshaker; - Handshaker = 0; - gSystem->ProcessEvents(); - gSystem->Sleep(1000*gRandom->Rndm()); - gSystem->ProcessEvents(); - Restart = true; - break; - } - vector ToReceive; - Handshaker->Receive(ToReceive); - if (ToReceive.size() > 0) { - string ReceivedString(ToReceive.begin(), ToReceive.end()); - MString Received = ReceivedString; - cout<<"Handshake: Received something: "< Tokens = Received.Tokenize(":"); - if (Tokens.size() == 5) { - m_LocalReceivingHostName = Tokens[1]; - m_LocalReceivingPort = atoi(Tokens[2]); - HandshakeSuccessful = true; - cout<<"Handshake: SUCCESS with connection to "<Disconnect(); - delete Handshaker; - Handshaker = 0; - break; - } else { - cout<<"Handshake: FAILED: "<Disconnect(); - delete Handshaker; - Handshaker = 0; - gSystem->ProcessEvents(); - gSystem->Sleep(1000*gRandom->Rndm()); - gSystem->ProcessEvents(); - Restart = true; - break; - } - } else { - cout<<"Handshake: Waiting for a reply since "<Disconnect(); - delete Handshaker; - Handshaker = 0; - gSystem->ProcessEvents(); - gSystem->Sleep(1000*gRandom->Rndm()); - gSystem->ProcessEvents(); - } - } - - if (m_Interrupt == true) return false; - - cout<<"Handshake: Connecting to receiver "<SetVerbosity(3); - m_Receiver->SetMaximumBufferSize(1000000); //AWL made this smaller than the overflow size in ParseData which is 10 MB - m_Receiver->RequestClient(true); - m_Receiver->Connect(true, 10); - - return true; -} - - -//////////////////////////////////////////////////////////////////////////////// - - -bool MModuleReceiverBalloon::EndConnection() -{ - // First kill the receiver - if (m_Receiver != 0) { - m_Receiver->Disconnect(); - delete m_Receiver; - m_Receiver = 0; - } - - - // Disconnect from handshaker -- but only if easily possible... - cout<<"Handshake: Trying to end connction"<SetVerbosity(3); - Handshaker->RequestClient(true); - Handshaker->Connect(false); - - int Wait = 2000; - while (Handshaker->IsConnected() == false && --Wait > 0) { - gSystem->Sleep(10); - gSystem->ProcessEvents(); - continue; - } - - if (Handshaker->IsConnected() == true) { - ostringstream msg; - msg<<"STOP:"< ToSend; - for (char c: msg.str()) { - ToSend.push_back(static_cast(c)); - } - unsigned long NResets = Handshaker->GetNResets(); - Handshaker->Send(ToSend); - cout<<"Handshake: Sent connection END request: "<IsConnected() == true && Restart == false && Handshaker->GetNResets() == NResets) { - cout<<"Handshake: Waiting for a reply since "<ProcessEvents(); - if (Wait < 10) { - gSystem->Sleep(100); - } else { - gSystem->Sleep(1000); - } - // Need a timeout here - if (Waiting.GetElapsed() > Timeout) { - cout<<"Handshake: Connected but didn't receive any answer -- timeout & good buy"< ToReceive; - Handshaker->Receive(ToReceive); - if (ToReceive.size() > 0) { - string ReceivedString(ToReceive.begin(), ToReceive.end()); - MString Received = ReceivedString; - if (Received.EndsWith("ACK") == true) { - cout<<"Handshake: sucessfully ended the connection"<Disconnect(); - delete Handshaker; - - return true; -} - - - -//////////////////////////////////////////////////////////////////////////////// - - -bool MModuleReceiverBalloon::Initialize() -{ - // Initialize the module - - // Do handshake and open transceiver - if (RequestConnection() == false) { - if (m_Interrupt == true) return false; - merr<<"Failed to connect to distributor"<= c_Info) mout<<"Events in receiver: "< 0) { - if (m_IgnoreAspect == true) { - return true; - } else { - MAspect* A = m_Events[0]->GetAspect(); - if( A != 0 ){ - return true; - } - } - } - - if (m_Receiver == 0) { - if (RequestConnection() == false) return false; - } - - double Timeout = 60; // seconds - if (m_Receiver->GetNPacketsToReceive() == 0 && - m_Receiver->GetTimeSinceLastIO().GetElapsed() > Timeout) { - mout<<"No more packets in receiver, last IO was "<GetTimeSinceLastIO().GetElapsed()<<" seconds ago. Assuming broken connection. Redoing handshake..."< Received ; - m_Receiver->Receive(Received); - - if (Received.size() != 0) { - if (g_Verbosity >= c_Info) cout<<"Received: "<SetTimeReceived(MTime()); - m_ExpoReceiver->SetBytesReceived(m_ReceivedData); - m_ExpoReceiver->SetRawFramesParsed(m_NumRawDataframes); - m_ExpoReceiver->SetComptonFramesParsed(m_NumComptonDataframes); - m_ExpoReceiver->SetAspectFramesParsed(m_NumAspectPackets); - m_ExpoReceiver->SetOtherFramesParsed(m_NumOtherPackets); - } - } - - return ParseData(Received); -} - - -//////////////////////////////////////////////////////////////////////////////// - - -bool MModuleReceiverBalloon::AnalyzeEvent(MReadOutAssembly* Event) -{ - // IsReady() ensured that the oldest event in the list has a reconstructed aspect - MReadOutAssembly * NewEvent; - - if (m_Events.size() == 0) { - cout<<"ERROR in MModuleReceiverBalloon::AnalyzeEvent: No events"<GetAspect() != 0 && NewEvent->GetAspect()->GetOutOfRange()) { - cout<<"ERROR in MModuleReceiverBalloon::AnalyzeEvent: Bad aspect (out of range)"<SetAspectIncomplete(true); - } - - while( NewEvent->GetNStripHits() > 0 ){ - Event->AddStripHit( NewEvent->GetStripHit(0) ); - NewEvent->RemoveStripHit(0); - } - - Event->SetID( NewEvent->GetID() ); - Event->SetFC( NewEvent->GetFC() ); - Event->SetTI( NewEvent->GetTI() ); - Event->SetCL( NewEvent->GetCL() ); - Event->SetTime( NewEvent->GetTime() ); - Event->SetMJD( NewEvent->GetMJD() ); - if (NewEvent->GetAspect() != 0) { - //Event->SetAspect(new MAspect(*(NewEvent->GetAspect())) ); - MAspect* A = new MAspect(*(NewEvent->GetAspect())); - Event->SetAspect(A); - Event->ComputeAbsoluteTime(); - //cout<<"Adding: "<GetTime()<<":"<GetHeading()<SetAbsoluteTime(NewEvent->GetAbsoluteTime()); - if (HasExpos() == true) { - m_ExpoAspectViewer->AddHeading(NewEvent->GetTime(), A->GetHeading(), A->GetGPS_or_magnetometer(), A->GetBRMS(), A->GetAttFlag()); - } - Event->SetAnalysisProgress(MAssembly::c_Aspect); - } else { - if (m_AspectMode != MBinaryFlightDataParserAspectModes::c_Neither) { - Event->SetAspectIncomplete(true); - } - } - Event->SetAnalysisProgress(MAssembly::c_EventLoader | - MAssembly::c_EventLoaderMeasurement | - MAssembly::c_EventOrdering); - - if (Event->GetTime().GetAsSystemSeconds() == 0) { - Event->SetTimeIncomplete(true); - } - - if (m_RoaFileName != "") { - Event->StreamRoa(m_Out); - } - - delete NewEvent; - - - // TODO: Just *copy* the data from the OLDEST event in the list to this event - - // TODO: Remove the oldest events from the list - //delete m_Events.front(); - //m_Events.pop_front(); - - return true; -} - - -//////////////////////////////////////////////////////////////////////////////// - - -void MModuleReceiverBalloon::Finalize() -{ - // Close the tranceiver - - MModule::Finalize(); - MBinaryFlightDataParser::Finalize(); - - if (m_RoaFileName != "") { - m_Out.close(); - } - - EndConnection(); - - return; -} - - -/////////////////////////////////////////////////////////////////////////////// - - -void MModuleReceiverBalloon::ShowOptionsGUI() -{ - // Show the options GUI - - MGUIOptionsReceiverBalloon* Options = new MGUIOptionsReceiverBalloon(this); - Options->Create(); - gClient->WaitForUnmap(Options); -} - - -//////////////////////////////////////////////////////////////////////////////// - - -bool MModuleReceiverBalloon::ReadXmlConfiguration(MXmlNode* Node) -{ - //! Read the configuration data from an XML node - - MXmlNode* DistributorNameNode = Node->GetNode("DistributorName"); - if (DistributorNameNode != 0) { - m_DistributorName = DistributorNameNode->GetValue(); - } - MXmlNode* DistributorPortNode = Node->GetNode("DistributorPort"); - if (DistributorPortNode != 0) { - m_DistributorPort = DistributorPortNode->GetValueAsInt(); - } - MXmlNode* DistributorStreamIDNode = Node->GetNode("DistributorStreamID"); - if (DistributorStreamIDNode != 0) { - m_DistributorStreamID = DistributorStreamIDNode->GetValue(); - } - - MXmlNode* LocalReceivingHostNameNode = Node->GetNode("LocalReceivingHostName"); - if (LocalReceivingHostNameNode != 0) { - m_LocalReceivingHostName = LocalReceivingHostNameNode->GetValue(); - } - MXmlNode* LocalReceivingPortNode = Node->GetNode("LocalReceivingPort"); - if (LocalReceivingPortNode != 0) { - m_LocalReceivingPort = LocalReceivingPortNode->GetValueAsInt(); - } - - - MXmlNode* DataSelectionModeNode = Node->GetNode("DataSelectionMode"); - if (DataSelectionModeNode != 0) { - m_DataSelectionMode = (MBinaryFlightDataParserDataModes) DataSelectionModeNode->GetValueAsInt(); - } - - MXmlNode* AspectModeNode = Node->GetNode("AspectMode"); - if( AspectModeNode != 0 ) { - m_AspectMode = (MBinaryFlightDataParserAspectModes) AspectModeNode->GetValueAsInt(); - } - - MXmlNode* RoaFileNameNode = Node->GetNode("RoaFileName"); - if (RoaFileNameNode != 0) { - m_RoaFileName = RoaFileNameNode->GetValueAsString(); - } - - return true; -} - - -//////////////////////////////////////////////////////////////////////////////// - - -MXmlNode* MModuleReceiverBalloon::CreateXmlConfiguration() -{ - //! Create an XML node tree from the configuration - - MXmlNode* Node = new MXmlNode(0, m_XmlTag); - new MXmlNode(Node, "DistributorName", m_DistributorName); - new MXmlNode(Node, "DistributorPort", m_DistributorPort); - new MXmlNode(Node, "DistributorStreamID", m_DistributorStreamID); - - new MXmlNode(Node, "LocalReceivingHostName", m_LocalReceivingHostName); - new MXmlNode(Node, "LocalReceivingPort", m_LocalReceivingPort); - - new MXmlNode(Node, "DataSelectionMode", (unsigned int) m_DataSelectionMode); - - new MXmlNode(Node, "AspectMode", (unsigned int) m_AspectMode); - - new MXmlNode(Node, "RoaFileName", m_RoaFileName); - - return Node; -} - - -// MModuleReceiverBalloon.cxx: the end... -//////////////////////////////////////////////////////////////////////////////// diff --git a/src/MModuleStripPairingChiSquare.cxx b/src/MModuleStripPairingChiSquare.cxx index fe60b8d4..28c846d2 100644 --- a/src/MModuleStripPairingChiSquare.cxx +++ b/src/MModuleStripPairingChiSquare.cxx @@ -62,6 +62,7 @@ MModuleStripPairingChiSquare::MModuleStripPairingChiSquare() : MModule() // Set all modules, which have to be done before this module AddPreceedingModuleType(MAssembly::c_EventLoader); AddPreceedingModuleType(MAssembly::c_EnergyCalibration); + AddPreceedingModuleType(MAssembly::c_TACcut); // Set all types this modules handles AddModuleType(MAssembly::c_StripPairing); diff --git a/src/MModuleStripPairingGreedy.cxx b/src/MModuleStripPairingGreedy.cxx index 124aa061..a697a947 100644 --- a/src/MModuleStripPairingGreedy.cxx +++ b/src/MModuleStripPairingGreedy.cxx @@ -61,6 +61,7 @@ MModuleStripPairingGreedy::MModuleStripPairingGreedy() : MModule() // Set all modules, which have to be done before this module AddPreceedingModuleType(MAssembly::c_EventLoader); AddPreceedingModuleType(MAssembly::c_EnergyCalibration); + AddPreceedingModuleType(MAssembly::c_TACcut); //AddPreceedingModuleType(MAssembly::c_CrosstalkCorrection); // Set all types this modules handles diff --git a/src/MModuleTACcut.cxx b/src/MModuleTACcut.cxx new file mode 100644 index 00000000..07b2de7f --- /dev/null +++ b/src/MModuleTACcut.cxx @@ -0,0 +1,459 @@ +/* + * MModuleTACcut.cxx + * + * + * Copyright (C) by Andreas Zoglauer. + * All rights reserved. + * + * + * This code implementation is the intellectual property of + * Andreas Zoglauer. + * + * By copying, distributing or modifying the Program (or any work + * based on the Program) you indicate your acceptance of this statement, + * and all its terms. + * + */ + + +//////////////////////////////////////////////////////////////////////////////// +// +// MModuleTACcut +// +//////////////////////////////////////////////////////////////////////////////// + + +// Include the header: +#include "MModuleTACcut.h" + +// Standard libs: + +// ROOT libs: +#include "TGClient.h" + +// MEGAlib libs: +#include "MModule.h" +#include "MGUIOptionsTACcut.h" +#include "MGUIExpoTACcut.h" + + +//////////////////////////////////////////////////////////////////////////////// + + +#ifdef ___CLING___ +ClassImp(MModuleTACcut) +#endif + + +//////////////////////////////////////////////////////////////////////////////// + + +MModuleTACcut::MModuleTACcut() : MModule() +{ + // Construct an instance of MModuleTACcut + + // Set all module relevant information + + // Set the module name --- has to be unique + m_Name = "TAC Calibration"; + + // Set the XML tag --- has to be unique --- no spaces allowed + m_XmlTag = "XmlTagTACcut"; + + // Set all modules, which have to be done before this module + AddPreceedingModuleType(MAssembly::c_EventLoader); + //AddPreceedingModuleType(MAssembly::c_EnergyCalibration); + + // Set all types this modules handles + AddModuleType(MAssembly::c_TACcut); + + // Set all modules, which can follow this module + AddSucceedingModuleType(MAssembly::c_StripPairing); + AddSucceedingModuleType(MAssembly::c_DepthCorrection); + + // Set if this module has an options GUI + // Overwrite ShowOptionsGUI() with the call to the GUI! + m_HasOptionsGUI = true; + // If true, you have to derive a class from MGUIOptions (use MGUIOptionsTACcut) + // and implement all your GUI options + + // Can the program be run multi-threaded + m_AllowMultiThreading = true; + + // Can we use multiple instances of this class + m_AllowMultipleInstances = true; + + m_SideToIndex = {{'l', 0}, {'h', 1}, {'0', 0}, {'1', 1}, {'p', 0}, {'n', 1}}; +} + + +//////////////////////////////////////////////////////////////////////////////// + + +MModuleTACcut::~MModuleTACcut() +{ + // Delete this instance of MModuleTACcut +} + + +//////////////////////////////////////////////////////////////////////////////// + + +bool MModuleTACcut::Initialize() +{ + // Initialize the module + + if (LoadTACCalFile(m_TACCalFile) == false) { + cout<SetTACHistogramArrangement(m_DetectorIDs); + for (unsigned int i = 0; i < m_DetectorIDs.size(); ++i) { + unsigned int DetID = m_DetectorIDs[i]; + m_ExpoTACcut->SetTACHistogramParameters(DetID, 200, 0, 6000); + } + m_Expos.push_back(m_ExpoTACcut); +} + +//////////////////////////////////////////////////////////////////////////////// + + +bool MModuleTACcut::AnalyzeEvent(MReadOutAssembly* Event) +{ + // Start with sanity checks: + for (unsigned int i = 0; i < Event->GetNStripHits(); ++i) { + MStripHit* SH = Event->GetStripHit(i); + + int DetID = SH->GetDetectorID(); + int StripID = SH->GetStripID(); + char Side = SH->IsLowVoltageStrip() ? 'l' : 'h'; + + if (DetID >= m_TACCal.size()) { + cout<IsGuardRing() == false) { + cout<= m_TACCal[DetID][m_SideToIndex[Side]].size()) && (SH->IsGuardRing()==false)) { + cout<= m_TACCut.size()) { + cout<IsGuardRing()==false) { + cout<= m_TACCut[DetID][m_SideToIndex[Side]].size()) && (SH->IsGuardRing()==false)) { + cout<::max(); + for (unsigned int i = 0; i < Event->GetNStripHits(); ++i) { + MStripHit* SH = Event->GetStripHit(i); + double TAC_timing = SH->GetTAC(); + double ns_timing = 0; + int DetID = SH->GetDetectorID(); + int StripID = SH->GetStripID(); + char Side = SH->IsLowVoltageStrip() ? 'l' : 'h'; + if ((TAC_timing == 0) || (SH->IsGuardRing() == true)) { + SH->HasCalibratedTiming(false); + } else { + ns_timing = TAC_timing*m_TACCal[DetID][m_SideToIndex[Side]][StripID][0] + m_TACCal[DetID][m_SideToIndex[Side]][StripID][1]; + SH->HasCalibratedTiming(true); + } + SH->SetTiming(ns_timing); + if ((SH->HasCalibratedTiming()==true) && (ns_timing > MaxTAC) && (SH->HasFastTiming()==true) && (SH->IsNearestNeighbor()==false)) { + MaxTAC = ns_timing; + } + } + + for (unsigned int i = 0; i < Event->GetNStripHits();) { + MStripHit* SH = Event->GetStripHit(i); + bool Passed = true; + if ((SH->HasCalibratedTiming() == true) && (SH->IsGuardRing()==false)) { + double SHTiming = SH->GetTiming(); + int DetID = SH->GetDetectorID(); + int StripID = SH->GetStripID(); + char Side = SH->IsLowVoltageStrip() ? 'l' : 'h'; + double FLNoiseCut = m_TACCut[DetID][m_SideToIndex[Side]][StripID][4]; + if ((SHTiming < FLNoiseCut)) { + Passed = false; + } else if (SH->HasFastTiming()==true) { + double ShapingOffset = m_TACCut[DetID][m_SideToIndex[Side]][StripID][0]; + double CoincidenceWindow = m_TACCut[DetID][m_SideToIndex[Side]][StripID][1]; + double DisableTime = m_TACCut[DetID][m_SideToIndex[Side]][StripID][2]; + double FlagToEnDelay = m_TACCut[DetID][m_SideToIndex[Side]][StripID][3]; + double FlagDelay = m_TACCut[DetID][m_SideToIndex[Side]][StripID][5]; + double TotalOffset = ShapingOffset + DisableTime + FlagToEnDelay + FlagDelay; + if ((SHTiming > TotalOffset + CoincidenceWindow) || (SHTiming < TotalOffset) || (SHTiming < MaxTAC - CoincidenceWindow)) { + Passed = false; + } else if (HasExpos()==true) { + m_ExpoTACcut->AddTAC(DetID, SHTiming); + } + } + } + if (Passed == true) { + ++i; + } else { + Event->RemoveStripHit(i); + delete SH; + } + } + + Event->SetAnalysisProgress(MAssembly::c_TACcut); + + return true; +} + + +//////////////////////////////////////////////////////////////////////////////// + + +void MModuleTACcut::Finalize() +{ + MModule::Finalize(); +} + + +//////////////////////////////////////////////////////////////////////////////// + + +void MModuleTACcut::ShowOptionsGUI() +{ + //! Show the options GUI --- has to be overwritten! + + MGUIOptionsTACcut* Options = new MGUIOptionsTACcut(this); + Options->Create(); + gClient->WaitForUnmap(Options); +} + + +//////////////////////////////////////////////////////////////////////////////// + + +bool MModuleTACcut::ReadXmlConfiguration(MXmlNode* Node) +{ + //! Read the configuration data from an XML node + + MXmlNode* TACCalFileNameNode = Node->GetNode("TACCalFileName"); + if (TACCalFileNameNode != nullptr) { + SetTACCalFileName(TACCalFileNameNode->GetValue()); + } + + MXmlNode* TACCutFileNameNode = Node->GetNode("TACCutFileName"); + if (TACCutFileNameNode != nullptr) { + SetTACCutFileName(TACCutFileNameNode->GetValue()); + } + + return true; +} + + +//////////////////////////////////////////////////////////////////////////////// + + +MXmlNode* MModuleTACcut::CreateXmlConfiguration() +{ + //! Create an XML node tree from the configuration + + MXmlNode* Node = new MXmlNode(0, m_XmlTag); + + new MXmlNode(Node, "TACCalFileName", m_TACCalFile); + new MXmlNode(Node, "TACCutFileName", m_TACCutFile); + + return Node; +} + + +//////////////////////////////////////////////////////////////////////////////// + + +bool MModuleTACcut::LoadTACCalFile(MString FName) +{ + // Read in the TAC Calibration file, which should contain for each strip: + // DetID, Side (h or l for high or low voltage), TAC cal, TAC cal error, TAC cal offset, TAC offset error + // OR: + // ReadOutID, Detector, Side, Strip, TAC cal, TAC cal error, TAC offset, TAC offset error + MFile F; + if (F.Open(FName) == false) { + cout< Tokens = Line.Tokenize(","); + if ((Tokens.size() == 7) || (Tokens.size() == 8)) { + int IndexOffset = Tokens.size() % 7; + int DetID = Tokens[0+IndexOffset].ToInt(); + MString SideString = Tokens[1+IndexOffset].Trim(); + char Side; + if (SideString.Length()!=1) { + cout< CalValues; + CalValues.push_back(TACCal); CalValues.push_back(Offset); CalValues.push_back(TACCalError); CalValues.push_back(OffsetError); + + if (m_TACCal.find(DetID) == m_TACCal.end()) { + vector>> TempVector; + unordered_map> TempMapLV; + unordered_map> TempMapHV; + m_TACCal[DetID] = TempVector; + m_TACCal[DetID].push_back(TempMapLV); + m_TACCal[DetID].push_back(TempMapHV); + } + + if (find(m_DetectorIDs.begin(), m_DetectorIDs.end(), DetID) == m_DetectorIDs.end()) { + m_DetectorIDs.push_back(DetID); + } + + if (m_SideToIndex.find(Side) != m_SideToIndex.end()) { + m_TACCal[DetID][m_SideToIndex[Side]][StripID] = CalValues; + } else { + cout< Tokens = Line.Tokenize(","); + if (Tokens.size() >= 5) { + int DetID = Tokens[0].ToInt(); + MString SideString = Tokens[1]; + char Side; + if (SideString.Length()!=1) { + cout< CutParams; + CutParams.push_back(ShapingOffset); CutParams.push_back(CoincidenceWindow); CutParams.push_back(DisableTime); CutParams.push_back(FlagToEnDelay); CutParams.push_back(FLNoiseCut); CutParams.push_back(FlagDelay); + + if (m_TACCut.find(DetID) == m_TACCut.end()) { + vector>> TempVector; + unordered_map> TempMapLV; + unordered_map> TempMapHV; + m_TACCut[DetID] = TempVector; + m_TACCut[DetID].push_back(TempMapLV); + m_TACCut[DetID].push_back(TempMapHV); + } + + if (find(m_DetectorIDs.begin(), m_DetectorIDs.end(), DetID) == m_DetectorIDs.end()) { + m_DetectorIDs.push_back(DetID); + } + + if (m_SideToIndex.find(Side) != m_SideToIndex.end()) { + m_TACCut[DetID][m_SideToIndex[Side]][StripID] = CutParams; + } else { + cout<Create(); - gClient->WaitForUnmap(Options); - */ + MSubModule::Finalize(); } //////////////////////////////////////////////////////////////////////////////// -bool MModuleTemplate::ReadXmlConfiguration(MXmlNode* Node) +bool MSubModuleTemplate::ReadXmlConfiguration(MXmlNode* Node) { //! Read the configuration data from an XML node @@ -169,7 +127,7 @@ bool MModuleTemplate::ReadXmlConfiguration(MXmlNode* Node) //////////////////////////////////////////////////////////////////////////////// -MXmlNode* MModuleTemplate::CreateXmlConfiguration() +MXmlNode* MSubModuleTemplate::CreateXmlConfiguration() { //! Create an XML node tree from the configuration @@ -183,5 +141,5 @@ MXmlNode* MModuleTemplate::CreateXmlConfiguration() } -// MModuleTemplate.cxx: the end... +// MSubModuleTemplate.cxx: the end... //////////////////////////////////////////////////////////////////////////////// diff --git a/src/MReadOutAssembly.cxx b/src/MReadOutAssembly.cxx index c9698418..84617aa9 100644 --- a/src/MReadOutAssembly.cxx +++ b/src/MReadOutAssembly.cxx @@ -50,8 +50,9 @@ MReadOutAssembly::MReadOutAssembly() : MReadOutSequence(), m_EventTimeUTC(0) { // Construct an instance of MReadOutAssembly - m_PhysicalEvent = 0; // Set pointer to zero before delete - m_Aspect = 0; + m_PhysicalEvent = nullptr; + m_SimEvent = nullptr; + m_Aspect = nullptr; m_HasSimAspectInfo = false; Clear(); @@ -94,11 +95,12 @@ MReadOutAssembly::~MReadOutAssembly() } m_GuardringHits.clear(); - // Delete this instance of MReadOutAssembly + m_DEEStripHitsLV.clear(); + m_DEEStripHitsHV.clear(); + + delete m_SimEvent; delete m_PhysicalEvent; - delete m_Aspect; -// mout<<"delete MReadOutAssembly!!\n" ;//debug } @@ -119,7 +121,8 @@ void MReadOutAssembly::Clear() m_EventTimeUTC = 0; m_MJD = 0.0; - m_Veto = false; + m_ShieldVeto = false; + m_GuardRingVeto = false; m_Trigger = true; for (int DetectorID = 0; DetectorID <= 11; DetectorID++) { @@ -174,14 +177,19 @@ void MReadOutAssembly::Clear() m_DepthCalibration_OutofRange = false; m_DepthCalibration_OutofRangeString = ""; - m_FilteredOut = false; delete m_PhysicalEvent; - m_PhysicalEvent = 0; - + m_PhysicalEvent = nullptr; + + m_DEEStripHitsLV.clear(); + m_DEEStripHitsHV.clear(); + + delete m_SimEvent; + m_SimEvent = nullptr; + delete m_Aspect; - m_Aspect = 0; + m_Aspect = nullptr; } @@ -328,7 +336,7 @@ MHit* MReadOutAssembly::GetHit(unsigned int i) merr<<"Index out of bounds!"<StreamEvta(S); } @@ -640,8 +664,16 @@ void MReadOutAssembly::StreamRoa(ostream& S, bool) S<StreamRoa(S); + if (WithNearestNeighbors == false && m_StripHits[h]->IsNearestNeighbor() == true) { + continue; + } + m_StripHits[h]->StreamRoa(S, WithADCs, WithTACs, WithEnergies, WithTimings, WithTemperatures, WithFlags); + ++Counter; + } + if (Counter == 0) { + S<<"BD No strip hits"<(&R); + if (S == 0) return false; + + // Split by underscore: + vector tokens = m_DetectorName.Tokenize("_"); + vector s_tokens = S->m_DetectorName.Tokenize("_"); + + if (tokens.size() != 3 || s_tokens.size() != 3) { + cerr << "ERROR: Unexpected detector name format in operator==: " + << m_DetectorName << " or " << S->m_DetectorName << endl; + return false; + } + + int side = tokens[1].GetSubString(1, tokens[1].Length()).ToInt(); + int crystal = tokens[2].ToInt(); + int s_side = s_tokens[1].GetSubString(1, s_tokens[1].Length()).ToInt(); + int s_crystal = s_tokens[2].ToInt(); + + if (side != s_side) return false; + if (crystal != s_crystal) return false; + + if (m_VoxelXID != S->m_VoxelXID) return false; + if (m_VoxelYID != S->m_VoxelYID) return false; + if (m_VoxelZID != S->m_VoxelZID) return false; + + return true; + +} + + +//////////////////////////////////////////////////////////////////////////////// + + +//! Smaller than operator +bool MReadOutElementVoxel3D::operator<(const MReadOutElement& R) const +{ + const MReadOutElementVoxel3D* S = dynamic_cast(&R); + if (S == 0) return false; + + + vector tokens = m_DetectorName.Tokenize("_"); + vector s_tokens = S->m_DetectorName.Tokenize("_"); + + if (tokens.size() != 3 || s_tokens.size() != 3) { + cerr << "ERROR: Unexpected detector name format in operator==: " + << m_DetectorName << " or " << S->m_DetectorName << endl; + return false; + } + + int side = tokens[1].GetSubString(1, tokens[1].Length()).ToInt(); + int crystal = tokens[2].ToInt(); + int s_side = s_tokens[1].GetSubString(1, s_tokens[1].Length()).ToInt(); + int s_crystal = s_tokens[2].ToInt(); + + if (side < s_side) return true; + + if (side == s_side) { + + if (crystal < s_crystal) return true; + if (crystal == s_crystal) { + if (m_VoxelXID < S->m_VoxelXID) return true; + if (m_VoxelXID == S->m_VoxelXID) { + if (m_VoxelYID < S->m_VoxelYID) return true; + if (m_VoxelYID == S->m_VoxelYID) { + if (m_VoxelZID < S->m_VoxelZID) return true; + if (m_VoxelZID == S->m_VoxelZID) return false; + } + } + } + } + + return false; + /* + + if (m_DetectorName == S->m_DetectorName) { + + if (m_VoxelXID < S->m_VoxelXID) return true; + if (m_VoxelXID == S->m_VoxelXID) return false; + + if (m_VoxelYID < S->m_VoxelYID) return true; + if (m_VoxelYID == S->m_VoxelYID) return false; + + if (m_VoxelZID < S->m_VoxelZID) return true; + if (m_VoxelZID == S->m_VoxelZID) return false; + } else { + return true; + } + */ + +} + + +//////////////////////////////////////////////////////////////////////////////// + + +//! Return the number of parsable elements +unsigned int MReadOutElementVoxel3D::GetNumberOfParsableElements() const +{ + return 4; +} + + +//////////////////////////////////////////////////////////////////////////////// + + +//! Parse the data from the tokenizer +bool MReadOutElementVoxel3D::Parse(const MTokenizer& T, unsigned int StartElement) +{ + if (T.GetNTokens() < StartElement + 4) { + merr << GetType() << ": Not enough elements to parse" << show; + return false; + } + + m_DetectorName = T.GetTokenAtAsString(StartElement); + m_VoxelXID = T.GetTokenAtAsUnsignedIntFast(StartElement + 1); + m_VoxelYID = T.GetTokenAtAsUnsignedIntFast(StartElement + 2); + m_VoxelZID = T.GetTokenAtAsUnsignedIntFast(StartElement + 3); + + return true; +} + +//////////////////////////////////////////////////////////////////////////////// + + +//! Return the data as parsable string +MString MReadOutElementVoxel3D::ToParsableString(bool WithDescriptor) const +{ + MString Return; + if (WithDescriptor == true) { + Return += "voxel3d "; + } + Return += m_DetectorName; + Return += " "; + Return += m_VoxelXID; + Return += " "; + Return += m_VoxelYID; + Return += " "; + Return += m_VoxelZID; + + return Return; +} + +//////////////////////////////////////////////////////////////////////////////// + + +//! Convert content to a string +MString MReadOutElementVoxel3D::ToString() const +{ + ostringstream os; + os << "DetectorName: " << m_DetectorName << ", VoxelID: (" << m_VoxelXID << ", " << m_VoxelYID << ", " << m_VoxelZID << ")"; + return os.str(); +} + +//////////////////////////////////////////////////////////////////////////////// + + +//! Stream the data +ostream& operator<<(ostream& os, const MReadOutElementVoxel3D& R) +{ + os< +#include +using namespace std; + +// ROOT libs: + +// MEGAlib libs: +#include "MStreams.h" + +//////////////////////////////////////////////////////////////////////////////// + + +#ifdef ___CLING___ +ClassImp(MShieldCrystalHit) +#endif + + +//////////////////////////////////////////////////////////////////////////////// + + +MShieldCrystalHit::MShieldCrystalHit() +{ + // Construct an instance of MShieldCrystalHit + + m_ReadOutElement = new MReadOutElement(); + + Clear(); +} + + +//////////////////////////////////////////////////////////////////////////////// + + +MShieldCrystalHit::~MShieldCrystalHit() +{ + // Delete this instance of MShieldCrystalHit + + delete m_ReadOutElement; +} + + +//////////////////////////////////////////////////////////////////////////////// + + +void MShieldCrystalHit::Clear() +{ + // Reset all data + + m_ReadOutElement->Clear(); + m_HasTriggered = false; + m_HasVetoed = false; + m_ADCUnits = 0; + m_Energy = 0; + m_EnergyResolution = 0; + + m_Origins.clear(); +} + + +//////////////////////////////////////////////////////////////////////////////// + + +bool MShieldCrystalHit::Parse(MString& Line, int Version) +{ + /* To write - probably CH - crystal hit + const char* line = Line.Data(); + if (line[0] == 'S' && line[1] == 'H') { + int det_id, strip_id, has_triggered, timing, un_adc, adc; + float energy, energy_res; + char pos_strip; + unsigned int flags; + sscanf(&line[3],"%d %c %d %d %d %d %d %f %f %u", &det_id, &pos_strip, &strip_id, &has_triggered, &timing, &un_adc, &adc, &energy, &energy_res, &flags); + SetDetectorID(det_id); + pos_strip == 'l' ? IsLowVoltageStrip(true) : IsLowVoltageStrip(false); + SetStripID(strip_id); + has_triggered == 0 ? HasTriggered(false) : HasTriggered(true); + SetTiming((double)timing); + SetUncorrectedADCUnits((double)un_adc); + SetADCUnits((double)adc); + SetEnergy(energy); + SetEnergyResolution(energy_res); + ParseFlags(flags); + return true; + } else { + return false; + } + */ + + return false; +} + + +//////////////////////////////////////////////////////////////////////////////// + + +//! Set the origins from the simulations (take care of duplicates) +void MShieldCrystalHit::AddOrigins(vector Origins) +{ + m_Origins.insert(m_Origins.end(), Origins.begin(), Origins.end()); + sort(m_Origins.begin(), m_Origins.end()); + m_Origins.erase(unique(m_Origins.begin(), m_Origins.end()), m_Origins.end()); +} + + +//////////////////////////////////////////////////////////////////////////////// + + +bool MShieldCrystalHit::StreamDat(ostream& S, int Version) +{ + //! Stream the content to an ASCII file + + S<<"CH " + <GetDetectorID()<<" " + <GetDetectorID()<<" "; + if (WithADC == true) { + S< tokens = Line.Tokenize(" "); - if( tokens.size() >= 10 ){ - SetDetectorID(tokens.at(1).ToInt()); - tokens.at(2) == "p" ? IsLowVoltageStrip(true) : IsLowVoltageStrip(false); - SetStripID(tokens.at(3).ToInt()); - tokens.at(4) == "0" ? HasTriggered(false) : HasTriggered(true); - SetTiming( tokens.at(5).ToDouble() ); - SetUncorrectedADCUnits( tokens.at(6).ToDouble() ); - SetADCUnits( tokens.at(7).ToDouble() ); - SetEnergy( tokens.at(8).ToDouble() ); - SetEnergyResolution( tokens.at(9).ToDouble() ); - int det_id, pos_strip, strip_id - return true; + const char* line = Line.Data(); + if (line[0] == 'S' && line[1] == 'H') { + int det_id, strip_id, has_triggered, timing, un_adc, adc; + float energy, energy_res; + char pos_strip; + unsigned int flags; + sscanf(&line[3],"%d %c %d %d %d %d %d %f %f %u", &det_id, &pos_strip, &strip_id, &has_triggered, &timing, &un_adc, &adc, &energy, &energy_res, &flags); + SetDetectorID(det_id); + pos_strip == 'l' ? IsLowVoltageStrip(true) : IsLowVoltageStrip(false); + SetStripID(strip_id); + has_triggered == 0 ? HasTriggered(false) : HasTriggered(true); + SetTiming((double)timing); + SetUncorrectedADCUnits((double)un_adc); + SetADCUnits((double)adc); + SetEnergy(energy); + SetEnergyResolution(energy_res); + ParseFlags(flags); + return true; } else { - return false; + return false; } - */ } @@ -170,7 +154,8 @@ bool MStripHit::StreamDat(ostream& S, int Version) <GetDetectorID()<<" " <GetStripID()<<" " - <<((m_ReadOutElement->IsLowVoltageStrip() == true) ? "l" : "h")<<" " - <IsLowVoltageStrip() == true) ? "l" : "h")<<" "; + if (WithADC == true) { + S<= c_Error) cout<<"MStripMap: Unable to load file: "<GetNTokens() == 0) continue; + if (Parser.GetTokenizerAt(i)->GetTokenAtAsString(0).BeginsWith("#") == true) continue; + if (Parser.GetTokenizerAt(i)->GetNTokens() == 9) { + MSingleStripMapping SM; + SM.m_ReadOutID = Parser.GetTokenizerAt(i)->GetTokenAtAsUnsignedInt(0); + SM.m_RTB = Parser.GetTokenizerAt(i)->GetTokenAtAsUnsignedInt(1); + SM.m_DRM = Parser.GetTokenizerAt(i)->GetTokenAtAsUnsignedInt(2); + SM.m_IsPrimary = Parser.GetTokenizerAt(i)->GetTokenAtAsBoolean(3); + SM.m_ASICID = Parser.GetTokenizerAt(i)->GetTokenAtAsUnsignedInt(4); + SM.m_ChannelID = Parser.GetTokenizerAt(i)->GetTokenAtAsUnsignedInt(5); + SM.m_DetectorID = Parser.GetTokenizerAt(i)->GetTokenAtAsUnsignedInt(6); + SM.m_IsLowVoltage = Parser.GetTokenizerAt(i)->GetTokenAtAsUnsignedInt(7) == 0 ? true : false; + SM.m_StripNumber = Parser.GetTokenizerAt(i)->GetTokenAtAsUnsignedInt(8); + m_StripMappings.push_back(SM); + } + } + + // Sort by m_ReadOutID: + sort(m_StripMappings.begin(), m_StripMappings.end(), [](const MSingleStripMapping& A, const MSingleStripMapping& B) { return A.m_ReadOutID < B.m_ReadOutID; }); + + return true; +} + + +//////////////////////////////////////////////////////////////////////////////// + + +//! Return true if the given read-out ID is on file +bool MStripMap::HasReadOutID(unsigned int ROI) const +{ + auto Iter = lower_bound(m_StripMappings.begin(), m_StripMappings.end(), ROI, [](const MSingleStripMapping& SSM, unsigned int ID) { return SSM.m_ReadOutID < ID; }); + return Iter != m_StripMappings.end() && Iter->m_ReadOutID == ROI; +} + + +//////////////////////////////////////////////////////////////////////////////// + + +//! Return the index of the ROI, throw an exception otherwise +unsigned int MStripMap::GetReadOutIDIndex(unsigned int ROI) const +{ + auto Iter = lower_bound(m_StripMappings.begin(), m_StripMappings.end(), ROI, [](const MSingleStripMapping& SSM, unsigned int ID) { return SSM.m_ReadOutID < ID; }); + + if (Iter != m_StripMappings.end() && Iter->m_ReadOutID == ROI) { + return distance(m_StripMappings.begin(), Iter); + } else { + throw MExceptionValueNotFound(ROI, "vector of read-out IDs"); + } +} + + +//////////////////////////////////////////////////////////////////////////////// + + +//! Get detector by read-out ID +unsigned int MStripMap::GetDetectorID(unsigned int ROI) const +{ + return m_StripMappings[GetReadOutIDIndex(ROI)].m_DetectorID; +} + + +//////////////////////////////////////////////////////////////////////////////// + + +//! Get detector side by read-out ID +bool MStripMap::IsLowVoltage(unsigned int ROI) const +{ + return m_StripMappings[GetReadOutIDIndex(ROI)].m_IsLowVoltage; +} + + +//////////////////////////////////////////////////////////////////////////////// + + +//! Get strip ID by read-out ID +unsigned int MStripMap::GetStripNumber(unsigned int ROI) const +{ + return m_StripMappings[GetReadOutIDIndex(ROI)].m_StripNumber; +} + + +// MStripMap.cxx: the end... +//////////////////////////////////////////////////////////////////////////////// diff --git a/src/MSubModuleChargeTransport.cxx b/src/MSubModuleChargeTransport.cxx new file mode 100644 index 00000000..d5075d9a --- /dev/null +++ b/src/MSubModuleChargeTransport.cxx @@ -0,0 +1,198 @@ +/* + * MSubModuleChargeTransport.cxx + * + * + * Copyright (C) by Andreas Zoglauer. + * All rights reserved. + * + * + * This code implementation is the intellectual property of + * Andreas Zoglauer. + * + * By copying, distributing or modifying the Program (or any work + * based on the Program) you indicate your acceptance of this statement, + * and all its terms. + * + */ + + +//////////////////////////////////////////////////////////////////////////////// +// +// MSubModuleChargeTransport +// +//////////////////////////////////////////////////////////////////////////////// + + +// Include the header: +#include "MSubModuleChargeTransport.h" + +// Standard libs: + +// ROOT libs: + +// MEGAlib libs: +#include "MSubModule.h" + + +//////////////////////////////////////////////////////////////////////////////// + + +#ifdef ___CLING___ +ClassImp(MSubModuleChargeTransport) +#endif + + +//////////////////////////////////////////////////////////////////////////////// + + +MSubModuleChargeTransport::MSubModuleChargeTransport() : MSubModule() +{ + // Construct an instance of MSubModuleChargeTransport + + +} + + +//////////////////////////////////////////////////////////////////////////////// + + +MSubModuleChargeTransport::~MSubModuleChargeTransport() +{ + // Delete this instance of MSubModuleChargeTransport +} + + +//////////////////////////////////////////////////////////////////////////////// + + +bool MSubModuleChargeTransport::Initialize() +{ + // Initialize the module + + return MSubModule::Initialize(); +} + + +//////////////////////////////////////////////////////////////////////////////// + + +void MSubModuleChargeTransport::Clear() +{ + // Clear for the next event + + MSubModule::Clear(); +} + + +//////////////////////////////////////////////////////////////////////////////// + + +bool MSubModuleChargeTransport::AnalyzeEvent(MReadOutAssembly* Event) +{ + // Main data analysis routine, which updates the event to a new level + + // Dummy code: + + // Create strip hits + list& LVHits = Event->GetDEEStripHitLVListReference(); + for (MDEEStripHit& SH: LVHits) { + MVector Pos = SH.m_SimulatedPositionInDetector; + int ID = (Pos.X() + 7.4/2) / (7.4/64); + if (ID > 0 && ID < 64) { + SH.m_ROE.SetStripID(ID); + SH.m_IsGuardRing = false; + } else { + SH.m_ROE.SetStripID(65); + SH.m_IsGuardRing = true; + } + SH.m_Energy = SH.m_SimulatedEnergy; + } + + list& HVHits = Event->GetDEEStripHitHVListReference(); + for (MDEEStripHit& SH: HVHits) { + MVector Pos = SH.m_SimulatedPositionInDetector; + int ID = (Pos.Y() + 7.4/2) / (7.4/64); + if (ID > 0 && ID < 64) { + SH.m_ROE.SetStripID(ID); + SH.m_IsGuardRing = false; + } else { + SH.m_ROE.SetStripID(65); + SH.m_IsGuardRing = true; + } + SH.m_Energy = SH.m_SimulatedEnergy; + } + + // Merge hits: + for (auto IterLV1 = LVHits.begin(); IterLV1 != LVHits.end(); ++IterLV1) { + auto IterLV2 = std::next(IterLV1); + while (IterLV2 != LVHits.end()) { + if (IterLV1->m_ROE == IterLV2->m_ROE) { + IterLV1->m_Energy += IterLV2->m_Energy; + IterLV2 = LVHits.erase(IterLV2); + } else { + ++IterLV2; + } + } + } + for (auto IterHV1 = HVHits.begin(); IterHV1 != HVHits.end(); ++IterHV1) { + auto IterHV2 = std::next(IterHV1); + while (IterHV2 != HVHits.end()) { + if (IterHV1->m_ROE == IterHV2->m_ROE) { + IterHV1->m_Energy += IterHV2->m_Energy; + IterHV2 = HVHits.erase(IterHV2); + } else { + ++IterHV2; + } + } + } + + return true; +} + + +//////////////////////////////////////////////////////////////////////////////// + + +void MSubModuleChargeTransport::Finalize() +{ + // Finalize the analysis - do all cleanup, i.e., undo Initialize() + + MSubModule::Finalize(); +} + + +//////////////////////////////////////////////////////////////////////////////// + + +bool MSubModuleChargeTransport::ReadXmlConfiguration(MXmlNode* Node) +{ + //! Read the configuration data from an XML node + + /* + MXmlNode* SomeTagNode = Node->GetNode("SomeTag"); + if (SomeTagNode != 0) { + m_SomeTagValue = SomeTagNode->GetValue(); + } + */ + + return true; +} + + +//////////////////////////////////////////////////////////////////////////////// + + +MXmlNode* MSubModuleChargeTransport::CreateXmlConfiguration(MXmlNode* Node) +{ + //! Create an XML node tree from the configuration + + /* + MXmlNode* SomeTagNode = new MXmlNode(Node, "SomeTag", "SomeValue"); + */ + + return Node; +} + + +// MSubModuleChargeTransport.cxx: the end... +//////////////////////////////////////////////////////////////////////////////// diff --git a/src/MSubModuleDEEIntake.cxx b/src/MSubModuleDEEIntake.cxx new file mode 100644 index 00000000..bbd4e1c4 --- /dev/null +++ b/src/MSubModuleDEEIntake.cxx @@ -0,0 +1,246 @@ +/* + * MSubModuleDEEIntake.cxx + * + * + * Copyright (C) by Andreas Zoglauer. + * All rights reserved. + * + * + * This code implementation is the intellectual property of + * Andreas Zoglauer. + * + * By copying, distributing or modifying the Program (or any work + * based on the Program) you indicate your acceptance of this statement, + * and all its terms. + * + */ + + +//////////////////////////////////////////////////////////////////////////////// +// +// MSubModuleDEEIntake +// +//////////////////////////////////////////////////////////////////////////////// + + +// Include the header: +#include "MSubModuleDEEIntake.h" + +// Standard libs: + +// ROOT libs: + +// MEGAlib libs: +#include "MSubModule.h" +#include "MDVolume.h" +#include "MDShapeBRIK.h" +#include "MDShapeIntersection.h" + +//////////////////////////////////////////////////////////////////////////////// + + +#ifdef ___CLING___ +ClassImp(MSubModuleDEEIntake) +#endif + + +//////////////////////////////////////////////////////////////////////////////// + + +MSubModuleDEEIntake::MSubModuleDEEIntake() : MSubModule() +{ + // Construct an instance of MSubModuleDEEIntake + + m_Name = "DEE intake module"; +} + + +//////////////////////////////////////////////////////////////////////////////// + + +MSubModuleDEEIntake::~MSubModuleDEEIntake() +{ + // Delete this instance of MSubModuleDEEIntake +} + + +//////////////////////////////////////////////////////////////////////////////// + + +bool MSubModuleDEEIntake::Initialize() +{ + // Initialize the module + + return MSubModule::Initialize(); +} + + +//////////////////////////////////////////////////////////////////////////////// + + +void MSubModuleDEEIntake::Clear() +{ + // Clear for the next event + + MSubModule::Clear(); +} + + +//////////////////////////////////////////////////////////////////////////////// + + +bool MSubModuleDEEIntake::AnalyzeEvent(MReadOutAssembly* Event) +{ + // Main data analysis routine, which updates the event to a new level + + Event->SetID(Event->GetSimulatedEvent()->GetID()); + Event->SetTime(Event->GetSimulatedEvent()->GetTime()); + + for (unsigned int h = 0; h < Event->GetSimulatedEvent()->GetNHTs(); ++h) { + MSimHT* HT = Event->GetSimulatedEvent()->GetHTAt(h); + + MDVolumeSequence* VS = HT->GetVolumeSequence(); + MDDetector* Detector = VS->GetDetector(); + if (Detector == nullptr) { + if (g_Verbosity >= c_Error) cout<GetSensitiveVolume(); + if (SensitiveVolume == nullptr) { + if (g_Verbosity >= c_Error) cout<GetShape()->GetType() == "BRIK") { + Shape = dynamic_cast(SensitiveVolume->GetShape()); + } else if (SensitiveVolume->GetShape()->GetType() == "Intersection") { + if (dynamic_cast(SensitiveVolume->GetShape())->GetShapeA()->GetType() == "BRIK") { + Shape = dynamic_cast(dynamic_cast(SensitiveVolume->GetShape())->GetShapeA()); + } else { + if (g_Verbosity >= c_Error) cout<= c_Error) cout<GetSizeZ(); + + MString DetectorName = Detector->GetName(); + if (DetectorName.BeginsWith("GeD") == true) { + DetectorName.RemoveAllInPlace("GeD_"); // The number after GeD is the COSI detector ID + int DetectorID = DetectorName.ToInt(); + + MDEEStripHit LVHit; + MDEEStripHit HVHit; + + // Fill out what we can - only some can be done now, + + // Sim info + LVHit.m_SimulatedEventID = Event->GetSimulatedEvent()->GetID(); + HVHit.m_SimulatedEventID = Event->GetSimulatedEvent()->GetID(); + + LVHit.m_SimulatedHitIndex = h; + HVHit.m_SimulatedHitIndex = h; + + // Sivan provides a vector and we want a list her (why??) + auto HTOrigins = HT->GetOrigins(); + vector Origins(HTOrigins.begin(), HTOrigins.end()); + LVHit.m_SimulatedOrigins = list(Origins.begin(), Origins.end()); + HVHit.m_SimulatedOrigins = list(Origins.begin(), Origins.end()); + + LVHit.m_SimulatedPosition = HT->GetPosition(); + HVHit.m_SimulatedPosition = HT->GetPosition(); + LVHit.m_SimulatedEnergy = HT->GetEnergy(); + HVHit.m_SimulatedEnergy = HT->GetEnergy(); + + //! The simulated depth in the detector + MVector PositionInDetector = VS->GetPositionInSensitiveVolume(); + LVHit.m_SimulatedPositionInDetector = PositionInDetector; + HVHit.m_SimulatedPositionInDetector = PositionInDetector; + + LVHit.m_SimulatedRelativeDepth = (LVHit.m_SimulatedPositionInDetector.Z() + 0.5*DetectorDepth)/DetectorDepth; + HVHit.m_SimulatedRelativeDepth = (HVHit.m_SimulatedPositionInDetector.Z() + 0.5*DetectorDepth)/DetectorDepth; + + // Assume not a guard ring - we only know after the charge transport + LVHit.m_SimulatedIsGuardRing = false; + HVHit.m_SimulatedIsGuardRing = false; + + // Add a unique identifiers + LVHit.m_ID = 1000+(2*h); + HVHit.m_ID = 1000+(2*h+1); + + LVHit.m_OppositeSideID = HVHit.m_ID; + HVHit.m_OppositeSideID = LVHit.m_ID; + + LVHit.m_ROE.IsLowVoltageStrip(true); + HVHit.m_ROE.IsLowVoltageStrip(false); + + LVHit.m_ROE.SetDetectorID(DetectorID); + HVHit.m_ROE.SetDetectorID(DetectorID); + + // The rest will be filled in later + + // Event will be responsible for deleting the event + cout<<"Adding LV hit"<AddDEEStripHitLV(LVHit); + Event->AddDEEStripHitHV(HVHit); + + } else if (DetectorName.BeginsWith("ACS_Crystal_") == true) { + // later + } else { + if (g_Verbosity >= c_Error) cout<GetNode("SomeTag"); + if (SomeTagNode != 0) { + m_SomeTagValue = SomeTagNode->GetValue(); + } + */ + + return true; +} + + +//////////////////////////////////////////////////////////////////////////////// + + +MXmlNode* MSubModuleDEEIntake::CreateXmlConfiguration(MXmlNode* Node) +{ + //! Create an XML node tree from the configuration + + /* + MXmlNode* SomeTagNode = new MXmlNode(Node, "SomeTag", "SomeValue"); + */ + + return Node; +} + + +// MSubModuleDEEIntake.cxx: the end... +//////////////////////////////////////////////////////////////////////////////// diff --git a/src/MSubModuleDEEOutput.cxx b/src/MSubModuleDEEOutput.cxx new file mode 100644 index 00000000..737d70d5 --- /dev/null +++ b/src/MSubModuleDEEOutput.cxx @@ -0,0 +1,153 @@ +/* + * MSubModuleDEEOutput.cxx + * + * + * Copyright (C) by Andreas Zoglauer. + * All rights reserved. + * + * + * This code implementation is the intellectual property of + * Andreas Zoglauer. + * + * By copying, distributing or modifying the Program (or any work + * based on the Program) you indicate your acceptance of this statement, + * and all its terms. + * + */ + + +//////////////////////////////////////////////////////////////////////////////// +// +// MSubModuleDEEOutput +// +//////////////////////////////////////////////////////////////////////////////// + + +// Include the header: +#include "MSubModuleDEEOutput.h" + +// Standard libs: + +// ROOT libs: + +// MEGAlib libs: +#include "MSubModule.h" + +//////////////////////////////////////////////////////////////////////////////// + + +#ifdef ___CLING___ +ClassImp(MSubModuleDEEOutput) +#endif + + +//////////////////////////////////////////////////////////////////////////////// + + +MSubModuleDEEOutput::MSubModuleDEEOutput() : MSubModule() +{ + // Construct an instance of MSubModuleDEEOutput + + m_Name = "DEE output module"; +} + + +//////////////////////////////////////////////////////////////////////////////// + + +MSubModuleDEEOutput::~MSubModuleDEEOutput() +{ + // Delete this instance of MSubModuleDEEOutput +} + + +//////////////////////////////////////////////////////////////////////////////// + + +bool MSubModuleDEEOutput::Initialize() +{ + // Initialize the module + + return MSubModule::Initialize(); +} + + +//////////////////////////////////////////////////////////////////////////////// + + +void MSubModuleDEEOutput::Clear() +{ + // Clear for the next event + + MSubModule::Clear(); +} + + +//////////////////////////////////////////////////////////////////////////////// + + +bool MSubModuleDEEOutput::AnalyzeEvent(MReadOutAssembly* Event) +{ + // Main data analysis routine, which updates the event to a new level + + // Convert the DEE strip hits to standard strip hits + list& LVHits = Event->GetDEEStripHitLVListReference(); + for (MDEEStripHit& SH: LVHits) { + Event->AddStripHit(SH.Convert()); + } + list& HVHits = Event->GetDEEStripHitHVListReference(); + for (MDEEStripHit& SH: HVHits) { + Event->AddStripHit(SH.Convert()); + } + + + return true; +} + + +//////////////////////////////////////////////////////////////////////////////// + + +void MSubModuleDEEOutput::Finalize() +{ + // Finalize the analysis - do all cleanup, i.e., undo Initialize() + + MSubModule::Finalize(); +} + + +//////////////////////////////////////////////////////////////////////////////// + + +bool MSubModuleDEEOutput::ReadXmlConfiguration(MXmlNode* Node) +{ + //! Read the configuration data from an XML node + + /* + MXmlNode* SomeTagNode = Node->GetNode("SomeTag"); + if (SomeTagNode != 0) { + m_SomeTagValue = SomeTagNode->GetValue(); + } + */ + + return true; +} + + +//////////////////////////////////////////////////////////////////////////////// + + +MXmlNode* MSubModuleDEEOutput::CreateXmlConfiguration(MXmlNode* Node) +{ + //! Create an XML node tree from the configuration + + /* + MXmlNode* SomeTagNode = new MXmlNode(Node, "SomeTag", "SomeValue"); + */ + + return Node; +} + + +// MSubModuleDEEOutput.cxx: the end... +//////////////////////////////////////////////////////////////////////////////// diff --git a/src/MSubModuleDepthReadout.cxx b/src/MSubModuleDepthReadout.cxx new file mode 100644 index 00000000..722756dc --- /dev/null +++ b/src/MSubModuleDepthReadout.cxx @@ -0,0 +1,159 @@ +/* + * MSubModuleDepthReadout.cxx + * + * + * Copyright (C) by Andreas Zoglauer. + * All rights reserved. + * + * + * This code implementation is the intellectual property of + * Andreas Zoglauer. + * + * By copying, distributing or modifying the Program (or any work + * based on the Program) you indicate your acceptance of this statement, + * and all its terms. + * + */ + + +//////////////////////////////////////////////////////////////////////////////// +// +// MSubModuleDepthReadout +// +//////////////////////////////////////////////////////////////////////////////// + + +// Include the header: +#include "MSubModuleDepthReadout.h" + +// Standard libs: + +// ROOT libs: + +// MEGAlib libs: +#include "MSubModule.h" + + +//////////////////////////////////////////////////////////////////////////////// + + +#ifdef ___CLING___ +ClassImp(MSubModuleDepthReadout) +#endif + + +//////////////////////////////////////////////////////////////////////////////// + + +MSubModuleDepthReadout::MSubModuleDepthReadout() : MSubModule() +{ + // Construct an instance of MSubModuleDepthReadout + + m_Name = "DEE depth readout module"; +} + + +//////////////////////////////////////////////////////////////////////////////// + + +MSubModuleDepthReadout::~MSubModuleDepthReadout() +{ + // Delete this instance of MSubModuleDepthReadout +} + + +//////////////////////////////////////////////////////////////////////////////// + + +bool MSubModuleDepthReadout::Initialize() +{ + // Initialize the module + + return MSubModule::Initialize(); +} + + +//////////////////////////////////////////////////////////////////////////////// + + +void MSubModuleDepthReadout::Clear() +{ + // Clear for the next event + + MSubModule::Clear(); +} + + +//////////////////////////////////////////////////////////////////////////////// + + +bool MSubModuleDepthReadout::AnalyzeEvent(MReadOutAssembly* Event) +{ + // Main data analysis routine, which updates the event to a new level + + // Dummy code + list& LVHits = Event->GetDEEStripHitLVListReference(); + for (MDEEStripHit& SH: LVHits) { + if (SH.m_IsGuardRing == false) { + SH.m_TAC = 8000 + 2000*SH.m_SimulatedRelativeDepth; + if (SH.m_TAC > 16383) SH.m_TAC = 16383; + } + } + list& HVHits = Event->GetDEEStripHitHVListReference(); + for (MDEEStripHit& SH: HVHits) { + if (SH.m_IsGuardRing == false) { + SH.m_TAC = 8000 + 2000*(1.0-SH.m_SimulatedRelativeDepth); + if (SH.m_TAC > 16383) SH.m_TAC = 16383; + } + } + + return true; +} + + +//////////////////////////////////////////////////////////////////////////////// + + +void MSubModuleDepthReadout::Finalize() +{ + // Finalize the analysis - do all cleanup, i.e., undo Initialize() + + MSubModule::Finalize(); +} + + +//////////////////////////////////////////////////////////////////////////////// + + +bool MSubModuleDepthReadout::ReadXmlConfiguration(MXmlNode* Node) +{ + //! Read the configuration data from an XML node + + /* + MXmlNode* SomeTagNode = Node->GetNode("SomeTag"); + if (SomeTagNode != 0) { + m_SomeTagValue = SomeTagNode->GetValue(); + } + */ + + return true; +} + + +//////////////////////////////////////////////////////////////////////////////// + + +MXmlNode* MSubModuleDepthReadout::CreateXmlConfiguration(MXmlNode* Node) +{ + //! Create an XML node tree from the configuration + + /* + MXmlNode* SomeTagNode = new MXmlNode(Node, "SomeTag", "SomeValue"); + */ + + return Node; +} + + +// MSubModuleDepthReadout.cxx: the end... +//////////////////////////////////////////////////////////////////////////////// diff --git a/src/MSubModuleRandomCoincidence.cxx b/src/MSubModuleRandomCoincidence.cxx new file mode 100644 index 00000000..55b63519 --- /dev/null +++ b/src/MSubModuleRandomCoincidence.cxx @@ -0,0 +1,143 @@ +/* + * MSubModuleRandomCoincidence.cxx + * + * + * Copyright (C) by Andreas Zoglauer. + * All rights reserved. + * + * + * This code implementation is the intellectual property of + * Andreas Zoglauer. + * + * By copying, distributing or modifying the Program (or any work + * based on the Program) you indicate your acceptance of this statement, + * and all its terms. + * + */ + + +//////////////////////////////////////////////////////////////////////////////// +// +// MSubModuleRandomCoincidence +// +//////////////////////////////////////////////////////////////////////////////// + + +// Include the header: +#include "MSubModuleRandomCoincidence.h" + +// Standard libs: + +// ROOT libs: + +// MEGAlib libs: +#include "MSubModule.h" + + +//////////////////////////////////////////////////////////////////////////////// + + +#ifdef ___CLING___ +ClassImp(MSubModuleRandomCoincidence) +#endif + + +//////////////////////////////////////////////////////////////////////////////// + + +MSubModuleRandomCoincidence::MSubModuleRandomCoincidence() : MSubModule() +{ + // Construct an instance of MSubModuleRandomCoincidence + + m_Name = "DEE random coincidence module"; +} + + +//////////////////////////////////////////////////////////////////////////////// + + +MSubModuleRandomCoincidence::~MSubModuleRandomCoincidence() +{ + // Delete this instance of MSubModuleRandomCoincidence +} + + +//////////////////////////////////////////////////////////////////////////////// + + +bool MSubModuleRandomCoincidence::Initialize() +{ + // Initialize the module + + return MSubModule::Initialize(); +} + + +//////////////////////////////////////////////////////////////////////////////// + + +void MSubModuleRandomCoincidence::Clear() +{ + // Clear for the next event + + MSubModule::Clear(); +} + + +//////////////////////////////////////////////////////////////////////////////// + + +bool MSubModuleRandomCoincidence::AnalyzeEvent(MReadOutAssembly* Event) +{ + // Main data analysis routine, which updates the event to a new level + + return true; +} + + +//////////////////////////////////////////////////////////////////////////////// + + +void MSubModuleRandomCoincidence::Finalize() +{ + // Finalize the analysis - do all cleanup, i.e., undo Initialize() + + MSubModule::Finalize(); +} + + +//////////////////////////////////////////////////////////////////////////////// + + +bool MSubModuleRandomCoincidence::ReadXmlConfiguration(MXmlNode* Node) +{ + //! Read the configuration data from an XML node + + /* + MXmlNode* SomeTagNode = Node->GetNode("SomeTag"); + if (SomeTagNode != 0) { + m_SomeTagValue = SomeTagNode->GetValue(); + } + */ + + return true; +} + + +//////////////////////////////////////////////////////////////////////////////// + + +MXmlNode* MSubModuleRandomCoincidence::CreateXmlConfiguration(MXmlNode* Node) +{ + //! Create an XML node tree from the configuration + + /* + MXmlNode* SomeTagNode = new MXmlNode(Node, "SomeTag", "SomeValue"); + */ + + return Node; +} + + +// MSubModuleRandomCoincidence.cxx: the end... +//////////////////////////////////////////////////////////////////////////////// diff --git a/src/MSubModuleShieldEnergyCorrection.cxx b/src/MSubModuleShieldEnergyCorrection.cxx new file mode 100644 index 00000000..4768f596 --- /dev/null +++ b/src/MSubModuleShieldEnergyCorrection.cxx @@ -0,0 +1,143 @@ +/* + * MSubModuleShieldEnergyCorrection.cxx + * + * + * Copyright (C) by Andreas Zoglauer. + * All rights reserved. + * + * + * This code implementation is the intellectual property of + * Andreas Zoglauer. + * + * By copying, distributing or modifying the Program (or any work + * based on the Program) you indicate your acceptance of this statement, + * and all its terms. + * + */ + + +//////////////////////////////////////////////////////////////////////////////// +// +// MSubModuleShieldEnergyCorrection +// +//////////////////////////////////////////////////////////////////////////////// + + +// Include the header: +#include "MSubModuleShieldEnergyCorrection.h" + +// Standard libs: + +// ROOT libs: + +// MEGAlib libs: +#include "MSubModule.h" + + +//////////////////////////////////////////////////////////////////////////////// + + +#ifdef ___CLING___ +ClassImp(MSubModuleShieldEnergyCorrection) +#endif + + +//////////////////////////////////////////////////////////////////////////////// + + +MSubModuleShieldEnergyCorrection::MSubModuleShieldEnergyCorrection() : MSubModule() +{ + // Construct an instance of MSubModuleShieldEnergyCorrection + + m_Name = "DEE shield energy correction module"; +} + + +//////////////////////////////////////////////////////////////////////////////// + + +MSubModuleShieldEnergyCorrection::~MSubModuleShieldEnergyCorrection() +{ + // Delete this instance of MSubModuleShieldEnergyCorrection +} + + +//////////////////////////////////////////////////////////////////////////////// + + +bool MSubModuleShieldEnergyCorrection::Initialize() +{ + // Initialize the module + + return MSubModule::Initialize(); +} + + +//////////////////////////////////////////////////////////////////////////////// + + +void MSubModuleShieldEnergyCorrection::Clear() +{ + // Clear for the next event + + MSubModule::Clear(); +} + + +//////////////////////////////////////////////////////////////////////////////// + + +bool MSubModuleShieldEnergyCorrection::AnalyzeEvent(MReadOutAssembly* Event) +{ + // Main data analysis routine, which updates the event to a new level + + return true; +} + + +//////////////////////////////////////////////////////////////////////////////// + + +void MSubModuleShieldEnergyCorrection::Finalize() +{ + // Finalize the analysis - do all cleanup, i.e., undo Initialize() + + MSubModule::Finalize(); +} + + +//////////////////////////////////////////////////////////////////////////////// + + +bool MSubModuleShieldEnergyCorrection::ReadXmlConfiguration(MXmlNode* Node) +{ + //! Read the configuration data from an XML node + + /* + MXmlNode* SomeTagNode = Node->GetNode("SomeTag"); + if (SomeTagNode != 0) { + m_SomeTagValue = SomeTagNode->GetValue(); + } + */ + + return true; +} + + +//////////////////////////////////////////////////////////////////////////////// + + +MXmlNode* MSubModuleShieldEnergyCorrection::CreateXmlConfiguration(MXmlNode* Node) +{ + //! Create an XML node tree from the configuration + + /* + MXmlNode* SomeTagNode = new MXmlNode(Node, "SomeTag", "SomeValue"); + */ + + return Node; +} + + +// MSubModuleShieldEnergyCorrection.cxx: the end... +//////////////////////////////////////////////////////////////////////////////// diff --git a/src/MSubModuleShieldReadout.cxx b/src/MSubModuleShieldReadout.cxx new file mode 100644 index 00000000..cadd261e --- /dev/null +++ b/src/MSubModuleShieldReadout.cxx @@ -0,0 +1,143 @@ +/* + * MSubModuleShieldReadout.cxx + * + * + * Copyright (C) by Andreas Zoglauer. + * All rights reserved. + * + * + * This code implementation is the intellectual property of + * Andreas Zoglauer. + * + * By copying, distributing or modifying the Program (or any work + * based on the Program) you indicate your acceptance of this statement, + * and all its terms. + * + */ + + +//////////////////////////////////////////////////////////////////////////////// +// +// MSubModuleShieldReadout +// +//////////////////////////////////////////////////////////////////////////////// + + +// Include the header: +#include "MSubModuleShieldReadout.h" + +// Standard libs: + +// ROOT libs: + +// MEGAlib libs: +#include "MSubModule.h" + + +//////////////////////////////////////////////////////////////////////////////// + + +#ifdef ___CLING___ +ClassImp(MSubModuleShieldReadout) +#endif + + +//////////////////////////////////////////////////////////////////////////////// + + +MSubModuleShieldReadout::MSubModuleShieldReadout() : MSubModule() +{ + // Construct an instance of MSubModuleShieldReadout + + m_Name = "DEE shield readout module"; +} + + +//////////////////////////////////////////////////////////////////////////////// + + +MSubModuleShieldReadout::~MSubModuleShieldReadout() +{ + // Delete this instance of MSubModuleShieldReadout +} + + +//////////////////////////////////////////////////////////////////////////////// + + +bool MSubModuleShieldReadout::Initialize() +{ + // Initialize the module + + return MSubModule::Initialize(); +} + + +//////////////////////////////////////////////////////////////////////////////// + + +void MSubModuleShieldReadout::Clear() +{ + // Clear for the next event + + MSubModule::Clear(); +} + + +//////////////////////////////////////////////////////////////////////////////// + + +bool MSubModuleShieldReadout::AnalyzeEvent(MReadOutAssembly* Event) +{ + // Main data analysis routine, which updates the event to a new level + + return true; +} + + +//////////////////////////////////////////////////////////////////////////////// + + +void MSubModuleShieldReadout::Finalize() +{ + // Finalize the analysis - do all cleanup, i.e., undo Initialize() + + MSubModule::Finalize(); +} + + +//////////////////////////////////////////////////////////////////////////////// + + +bool MSubModuleShieldReadout::ReadXmlConfiguration(MXmlNode* Node) +{ + //! Read the configuration data from an XML node + + /* + MXmlNode* SomeTagNode = Node->GetNode("SomeTag"); + if (SomeTagNode != 0) { + m_SomeTagValue = SomeTagNode->GetValue(); + } + */ + + return true; +} + + +//////////////////////////////////////////////////////////////////////////////// + + +MXmlNode* MSubModuleShieldReadout::CreateXmlConfiguration(MXmlNode* Node) +{ + //! Create an XML node tree from the configuration + + /* + MXmlNode* SomeTagNode = new MXmlNode(Node, "SomeTag", "SomeValue"); + */ + + return Node; +} + + +// MSubModuleShieldReadout.cxx: the end... +//////////////////////////////////////////////////////////////////////////////// diff --git a/src/MSubModuleShieldTrigger.cxx b/src/MSubModuleShieldTrigger.cxx new file mode 100644 index 00000000..c130eb70 --- /dev/null +++ b/src/MSubModuleShieldTrigger.cxx @@ -0,0 +1,143 @@ +/* + * MSubModuleShieldTrigger.cxx + * + * + * Copyright (C) by Andreas Zoglauer. + * All rights reserved. + * + * + * This code implementation is the intellectual property of + * Andreas Zoglauer. + * + * By copying, distributing or modifying the Program (or any work + * based on the Program) you indicate your acceptance of this statement, + * and all its terms. + * + */ + + +//////////////////////////////////////////////////////////////////////////////// +// +// MSubModuleShieldTrigger +// +//////////////////////////////////////////////////////////////////////////////// + + +// Include the header: +#include "MSubModuleShieldTrigger.h" + +// Standard libs: + +// ROOT libs: + +// MEGAlib libs: +#include "MSubModule.h" + + +//////////////////////////////////////////////////////////////////////////////// + + +#ifdef ___CLING___ +ClassImp(MSubModuleShieldTrigger) +#endif + + +//////////////////////////////////////////////////////////////////////////////// + + +MSubModuleShieldTrigger::MSubModuleShieldTrigger() : MSubModule() +{ + // Construct an instance of MSubModuleShieldTrigger + + m_Name = "DEE shield trigger module"; +} + + +//////////////////////////////////////////////////////////////////////////////// + + +MSubModuleShieldTrigger::~MSubModuleShieldTrigger() +{ + // Delete this instance of MSubModuleShieldTrigger +} + + +//////////////////////////////////////////////////////////////////////////////// + + +bool MSubModuleShieldTrigger::Initialize() +{ + // Initialize the module + + return MSubModule::Initialize(); +} + + +//////////////////////////////////////////////////////////////////////////////// + + +void MSubModuleShieldTrigger::Clear() +{ + // Clear for the next event + + MSubModule::Clear(); +} + + +//////////////////////////////////////////////////////////////////////////////// + + +bool MSubModuleShieldTrigger::AnalyzeEvent(MReadOutAssembly* Event) +{ + // Main data analysis routine, which updates the event to a new level + + return true; +} + + +//////////////////////////////////////////////////////////////////////////////// + + +void MSubModuleShieldTrigger::Finalize() +{ + // Finalize the analysis - do all cleanup, i.e., undo Initialize() + + MSubModule::Finalize(); +} + + +//////////////////////////////////////////////////////////////////////////////// + + +bool MSubModuleShieldTrigger::ReadXmlConfiguration(MXmlNode* Node) +{ + //! Read the configuration data from an XML node + + /* + MXmlNode* SomeTagNode = Node->GetNode("SomeTag"); + if (SomeTagNode != 0) { + m_SomeTagValue = SomeTagNode->GetValue(); + } + */ + + return true; +} + + +//////////////////////////////////////////////////////////////////////////////// + + +MXmlNode* MSubModuleShieldTrigger::CreateXmlConfiguration(MXmlNode* Node) +{ + //! Create an XML node tree from the configuration + + /* + MXmlNode* SomeTagNode = new MXmlNode(Node, "SomeTag", "SomeValue"); + */ + + return Node; +} + + +// MSubModuleShieldTrigger.cxx: the end... +//////////////////////////////////////////////////////////////////////////////// diff --git a/src/MSubModuleStripReadout.cxx b/src/MSubModuleStripReadout.cxx new file mode 100644 index 00000000..366d94a3 --- /dev/null +++ b/src/MSubModuleStripReadout.cxx @@ -0,0 +1,155 @@ +/* + * MSubModuleStripReadout.cxx + * + * + * Copyright (C) by Andreas Zoglauer. + * All rights reserved. + * + * + * This code implementation is the intellectual property of + * Andreas Zoglauer. + * + * By copying, distributing or modifying the Program (or any work + * based on the Program) you indicate your acceptance of this statement, + * and all its terms. + * + */ + + +//////////////////////////////////////////////////////////////////////////////// +// +// MSubModuleStripReadout +// +//////////////////////////////////////////////////////////////////////////////// + + +// Include the header: +#include "MSubModuleStripReadout.h" + +// Standard libs: + +// ROOT libs: + +// MEGAlib libs: +#include "MSubModule.h" + + +//////////////////////////////////////////////////////////////////////////////// + + +#ifdef ___CLING___ +ClassImp(MSubModuleStripReadout) +#endif + + +//////////////////////////////////////////////////////////////////////////////// + + +MSubModuleStripReadout::MSubModuleStripReadout() : MSubModule() +{ + // Construct an instance of MSubModuleStripReadout + + m_Name = "DEE strip readout module"; +} + + +//////////////////////////////////////////////////////////////////////////////// + + +MSubModuleStripReadout::~MSubModuleStripReadout() +{ + // Delete this instance of MSubModuleStripReadout +} + + +//////////////////////////////////////////////////////////////////////////////// + + +bool MSubModuleStripReadout::Initialize() +{ + // Initialize the module + + return MSubModule::Initialize(); +} + + +//////////////////////////////////////////////////////////////////////////////// + + +void MSubModuleStripReadout::Clear() +{ + // Clear for the next event + + MSubModule::Clear(); +} + + +//////////////////////////////////////////////////////////////////////////////// + + +bool MSubModuleStripReadout::AnalyzeEvent(MReadOutAssembly* Event) +{ + // Main data analysis routine, which updates the event to a new level + + // Dummy code: + list& LVHits = Event->GetDEEStripHitLVListReference(); + for (MDEEStripHit& SH: LVHits) { + SH.m_ADC = 2000 + 4*SH.m_Energy; + if (SH.m_ADC > 16383) SH.m_ADC = 16383; + } + list& HVHits = Event->GetDEEStripHitHVListReference(); + for (MDEEStripHit& SH: HVHits) { + SH.m_ADC = 2000 + 4*SH.m_Energy; + if (SH.m_ADC > 16383) SH.m_ADC = 16383; + } + + return true; +} + + +//////////////////////////////////////////////////////////////////////////////// + + +void MSubModuleStripReadout::Finalize() +{ + // Finalize the analysis - do all cleanup, i.e., undo Initialize() + + MSubModule::Finalize(); +} + + +//////////////////////////////////////////////////////////////////////////////// + + +bool MSubModuleStripReadout::ReadXmlConfiguration(MXmlNode* Node) +{ + //! Read the configuration data from an XML node + + /* + MXmlNode* SomeTagNode = Node->GetNode("SomeTag"); + if (SomeTagNode != 0) { + m_SomeTagValue = SomeTagNode->GetValue(); + } + */ + + return true; +} + + +//////////////////////////////////////////////////////////////////////////////// + + +MXmlNode* MSubModuleStripReadout::CreateXmlConfiguration(MXmlNode* Node) +{ + //! Create an XML node tree from the configuration + + /* + MXmlNode* SomeTagNode = new MXmlNode(Node, "SomeTag", "SomeValue"); + */ + + return Node; +} + + +// MSubModuleStripReadout.cxx: the end... +//////////////////////////////////////////////////////////////////////////////// diff --git a/src/MSubModuleStripReadoutNoise.cxx b/src/MSubModuleStripReadoutNoise.cxx new file mode 100644 index 00000000..040c1c30 --- /dev/null +++ b/src/MSubModuleStripReadoutNoise.cxx @@ -0,0 +1,155 @@ +/* + * MSubModuleStripReadoutNoise.cxx + * + * + * Copyright (C) by Andreas Zoglauer. + * All rights reserved. + * + * + * This code implementation is the intellectual property of + * Andreas Zoglauer. + * + * By copying, distributing or modifying the Program (or any work + * based on the Program) you indicate your acceptance of this statement, + * and all its terms. + * + */ + + +//////////////////////////////////////////////////////////////////////////////// +// +// MSubModuleStripReadoutNoise +// +//////////////////////////////////////////////////////////////////////////////// + + +// Include the header: +#include "MSubModuleStripReadoutNoise.h" + +// Standard libs: + +// ROOT libs: + +// MEGAlib libs: +#include "MSubModule.h" + + +//////////////////////////////////////////////////////////////////////////////// + + +#ifdef ___CLING___ +ClassImp(MSubModuleStripReadoutNoise) +#endif + + +//////////////////////////////////////////////////////////////////////////////// + + +MSubModuleStripReadoutNoise::MSubModuleStripReadoutNoise() : MSubModule() +{ + // Construct an instance of MSubModuleStripReadoutNoise + + m_Name = "DEE strip readout module"; +} + + +//////////////////////////////////////////////////////////////////////////////// + + +MSubModuleStripReadoutNoise::~MSubModuleStripReadoutNoise() +{ + // Delete this instance of MSubModuleStripReadoutNoise +} + + +//////////////////////////////////////////////////////////////////////////////// + + +bool MSubModuleStripReadoutNoise::Initialize() +{ + // Initialize the module + + return MSubModule::Initialize(); +} + + +//////////////////////////////////////////////////////////////////////////////// + + +void MSubModuleStripReadoutNoise::Clear() +{ + // Clear for the next event + + MSubModule::Clear(); +} + + +//////////////////////////////////////////////////////////////////////////////// + + +bool MSubModuleStripReadoutNoise::AnalyzeEvent(MReadOutAssembly* Event) +{ + // Main data analysis routine, which updates the event to a new level + + // Dummy code: + list& LVHits = Event->GetDEEStripHitLVListReference(); + for (MDEEStripHit& SH: LVHits) { + SH.m_ADC = 2000 + 4*SH.m_Energy; + if (SH.m_ADC > 16383) SH.m_ADC = 16383; + } + list& HVHits = Event->GetDEEStripHitHVListReference(); + for (MDEEStripHit& SH: HVHits) { + SH.m_ADC = 2000 + 4*SH.m_Energy; + if (SH.m_ADC > 16383) SH.m_ADC = 16383; + } + + return true; +} + + +//////////////////////////////////////////////////////////////////////////////// + + +void MSubModuleStripReadoutNoise::Finalize() +{ + // Finalize the analysis - do all cleanup, i.e., undo Initialize() + + MSubModule::Finalize(); +} + + +//////////////////////////////////////////////////////////////////////////////// + + +bool MSubModuleStripReadoutNoise::ReadXmlConfiguration(MXmlNode* Node) +{ + //! Read the configuration data from an XML node + + /* + MXmlNode* SomeTagNode = Node->GetNode("SomeTag"); + if (SomeTagNode != 0) { + m_SomeTagValue = SomeTagNode->GetValue(); + } + */ + + return true; +} + + +//////////////////////////////////////////////////////////////////////////////// + + +MXmlNode* MSubModuleStripReadoutNoise::CreateXmlConfiguration(MXmlNode* Node) +{ + //! Create an XML node tree from the configuration + + /* + MXmlNode* SomeTagNode = new MXmlNode(Node, "SomeTag", "SomeValue"); + */ + + return Node; +} + + +// MSubModuleStripReadoutNoise.cxx: the end... +//////////////////////////////////////////////////////////////////////////////// diff --git a/src/MSubModuleStripTrigger.cxx b/src/MSubModuleStripTrigger.cxx new file mode 100644 index 00000000..ce134882 --- /dev/null +++ b/src/MSubModuleStripTrigger.cxx @@ -0,0 +1,143 @@ +/* + * MSubModuleStripTrigger.cxx + * + * + * Copyright (C) by Andreas Zoglauer. + * All rights reserved. + * + * + * This code implementation is the intellectual property of + * Andreas Zoglauer. + * + * By copying, distributing or modifying the Program (or any work + * based on the Program) you indicate your acceptance of this statement, + * and all its terms. + * + */ + + +//////////////////////////////////////////////////////////////////////////////// +// +// MSubModuleStripTrigger +// +//////////////////////////////////////////////////////////////////////////////// + + +// Include the header: +#include "MSubModuleStripTrigger.h" + +// Standard libs: + +// ROOT libs: + +// MEGAlib libs: +#include "MSubModule.h" + + +//////////////////////////////////////////////////////////////////////////////// + + +#ifdef ___CLING___ +ClassImp(MSubModuleStripTrigger) +#endif + + +//////////////////////////////////////////////////////////////////////////////// + + +MSubModuleStripTrigger::MSubModuleStripTrigger() : MSubModule() +{ + // Construct an instance of MSubModuleStripTrigger + + m_Name = "DEE strip trigger module"; +} + + +//////////////////////////////////////////////////////////////////////////////// + + +MSubModuleStripTrigger::~MSubModuleStripTrigger() +{ + // Delete this instance of MSubModuleStripTrigger +} + + +//////////////////////////////////////////////////////////////////////////////// + + +bool MSubModuleStripTrigger::Initialize() +{ + // Initialize the module + + return MSubModule::Initialize(); +} + + +//////////////////////////////////////////////////////////////////////////////// + + +void MSubModuleStripTrigger::Clear() +{ + // Clear for the next event + + MSubModule::Clear(); +} + + +//////////////////////////////////////////////////////////////////////////////// + + +bool MSubModuleStripTrigger::AnalyzeEvent(MReadOutAssembly* Event) +{ + // Main data analysis routine, which updates the event to a new level + + return true; +} + + +//////////////////////////////////////////////////////////////////////////////// + + +void MSubModuleStripTrigger::Finalize() +{ + // Finalize the analysis - do all cleanup, i.e., undo Initialize() + + MSubModule::Finalize(); +} + + +//////////////////////////////////////////////////////////////////////////////// + + +bool MSubModuleStripTrigger::ReadXmlConfiguration(MXmlNode* Node) +{ + //! Read the configuration data from an XML node + + /* + MXmlNode* SomeTagNode = Node->GetNode("SomeTag"); + if (SomeTagNode != 0) { + m_SomeTagValue = SomeTagNode->GetValue(); + } + */ + + return true; +} + + +//////////////////////////////////////////////////////////////////////////////// + + +MXmlNode* MSubModuleStripTrigger::CreateXmlConfiguration(MXmlNode* Node) +{ + //! Create an XML node tree from the configuration + + /* + MXmlNode* SomeTagNode = new MXmlNode(Node, "SomeTag", "SomeValue"); + */ + + return Node; +} + + +// MSubModuleStripTrigger.cxx: the end... +//////////////////////////////////////////////////////////////////////////////// diff --git a/src/MSubModuleTemplate.cxx b/src/MSubModuleTemplate.cxx new file mode 100644 index 00000000..86a402fb --- /dev/null +++ b/src/MSubModuleTemplate.cxx @@ -0,0 +1,143 @@ +/* + * MSubModuleTemplate.cxx + * + * + * Copyright (C) by Andreas Zoglauer. + * All rights reserved. + * + * + * This code implementation is the intellectual property of + * Andreas Zoglauer. + * + * By copying, distributing or modifying the Program (or any work + * based on the Program) you indicate your acceptance of this statement, + * and all its terms. + * + */ + + +//////////////////////////////////////////////////////////////////////////////// +// +// MSubModuleTemplate +// +//////////////////////////////////////////////////////////////////////////////// + + +// Include the header: +#include "MSubModuleTemplate.h" + +// Standard libs: + +// ROOT libs: + +// MEGAlib libs: +#include "MSubModule.h" + + +//////////////////////////////////////////////////////////////////////////////// + + +#ifdef ___CLING___ +ClassImp(MSubModuleTemplate) +#endif + + +//////////////////////////////////////////////////////////////////////////////// + + +MSubModuleTemplate::MSubModuleTemplate() : MSubModule() +{ + // Construct an instance of MSubModuleTemplate + + m_Name = "Template module"; +} + + +//////////////////////////////////////////////////////////////////////////////// + + +MSubModuleTemplate::~MSubModuleTemplate() +{ + // Delete this instance of MSubModuleTemplate +} + + +//////////////////////////////////////////////////////////////////////////////// + + +bool MSubModuleTemplate::Initialize() +{ + // Initialize the module + + return MSubModule::Initialize(); +} + + +//////////////////////////////////////////////////////////////////////////////// + + +void MSubModuleTemplate::Clear() +{ + // Clear for the next event + + MSubModule::Clear(); +} + + +//////////////////////////////////////////////////////////////////////////////// + + +bool MSubModuleTemplate::AnalyzeEvent(MReadOutAssembly* Event) +{ + // Main data analysis routine, which updates the event to a new level + + return true; +} + + +//////////////////////////////////////////////////////////////////////////////// + + +void MSubModuleTemplate::Finalize() +{ + // Finalize the analysis - do all cleanup, i.e., undo Initialize() + + MSubModule::Finalize(); +} + + +//////////////////////////////////////////////////////////////////////////////// + + +bool MSubModuleTemplate::ReadXmlConfiguration(MXmlNode* Node) +{ + //! Read the configuration data from an XML node + + /* + MXmlNode* SomeTagNode = Node->GetNode("SomeTag"); + if (SomeTagNode != 0) { + m_SomeTagValue = SomeTagNode->GetValue(); + } + */ + + return true; +} + + +//////////////////////////////////////////////////////////////////////////////// + + +MXmlNode* MSubModuleTemplate::CreateXmlConfiguration(MXmlNode* Node) +{ + //! Create an XML node tree from the configuration + + /* + MXmlNode* SomeTagNode = new MXmlNode(Node, "SomeTag", "SomeValue"); + */ + + return Node; +} + + +// MSubModuleTemplate.cxx: the end... +//////////////////////////////////////////////////////////////////////////////// From 2b328c06e1e5ce080a9c6c093a8bb56dea7e79b5 Mon Sep 17 00:00:00 2001 From: parshadkp <111451184+parshadkp@users.noreply.github.com> Date: Tue, 21 Oct 2025 11:14:39 -0500 Subject: [PATCH 02/10] ShieldTrigger testing --- include/MSubModuleShieldTrigger.h | 13 +++++++++++++ src/MDetectorEffectsEngineSingleDet.cxx | 13 ++++++------- src/MSubModuleShieldTrigger.cxx | 24 +++++++++++++++++++++++- src/MSubModuleStripTrigger.cxx | 3 +-- 4 files changed, 43 insertions(+), 10 deletions(-) diff --git a/include/MSubModuleShieldTrigger.h b/include/MSubModuleShieldTrigger.h index 56873bd9..d34c11fd 100644 --- a/include/MSubModuleShieldTrigger.h +++ b/include/MSubModuleShieldTrigger.h @@ -83,12 +83,25 @@ class MSubModuleShieldTrigger : public MSubModule + // protected members: protected: // private members: private: + + static const int nShieldPanels = 6; + vector m_ShieldLastHitTime = vector(nShieldPanels); + double m_ShieldVetoTime; + double m_ShieldDelayBefore; + double m_ShieldDelayAfter; + double m_ShieldVetoWindowSize; + bool m_IsShieldDead; + //! dead time on the shields + vector m_ShieldDeadtime = vector(nShieldPanels); + vector m_TotalShieldDeadtime = vector(nShieldPanels); + //! Flag indicating that a trigger has been raised bool m_HasTrigger; diff --git a/src/MDetectorEffectsEngineSingleDet.cxx b/src/MDetectorEffectsEngineSingleDet.cxx index c15b0a84..38ce9dcc 100644 --- a/src/MDetectorEffectsEngineSingleDet.cxx +++ b/src/MDetectorEffectsEngineSingleDet.cxx @@ -482,7 +482,6 @@ bool MDetectorEffectsEngineSingleDet::GetNextEvent(MReadOutAssembly* Event) // cout << DetName << ": " << HT->GetDetectorType() << endl; if (HT->GetDetectorType() == 8) { - // cout << "Shield hit why?" << endl; m_NumShieldHitCounts += 1; MVector pos = HT->GetPosition(); @@ -564,12 +563,12 @@ bool MDetectorEffectsEngineSingleDet::GetNextEvent(MReadOutAssembly* Event) } - // for (int group=0; groupGetSimulatedEvent(); + MTime evt_time = SimEvent->GetTime(); + + int ShieldDetNum = 0; + double energy = 0; + int ShieldDetGroup; + m_HasVeto = false; + + bool m_IsShieldDead = false; + + for (unsigned int h=0; hGetNHTs(); h++) { + MSimHT* HT = SimEvent->GetHTAt(h); + + MDVolumeSequence* VS = HT->GetVolumeSequence(); // VF: to remove? + MDDetector* Detector = VS->GetDetector(); // VF: to remove? + MString DetName = Detector->GetName(); // VF: to remove? + + if (HT->GetDetectorType() == 8) { + cout << "Shield Hit Detected" << endl; + } + } + return true; } diff --git a/src/MSubModuleStripTrigger.cxx b/src/MSubModuleStripTrigger.cxx index ce134882..41d820f1 100644 --- a/src/MSubModuleStripTrigger.cxx +++ b/src/MSubModuleStripTrigger.cxx @@ -89,8 +89,7 @@ void MSubModuleStripTrigger::Clear() bool MSubModuleStripTrigger::AnalyzeEvent(MReadOutAssembly* Event) { - // Main data analysis routine, which updates the event to a new level - + // Main data analysis routine, which updates the event to a new level return true; } From 30885ae472e220c28d4b18a1f13073474c5e8074 Mon Sep 17 00:00:00 2001 From: parshadkp <111451184+parshadkp@users.noreply.github.com> Date: Tue, 21 Oct 2025 11:27:52 -0500 Subject: [PATCH 03/10] SMEX DEE config file for easy use --- Config/Nuclearizer_SMEX_DEE.cfg | 97 +++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 Config/Nuclearizer_SMEX_DEE.cfg diff --git a/Config/Nuclearizer_SMEX_DEE.cfg b/Config/Nuclearizer_SMEX_DEE.cfg new file mode 100644 index 00000000..b51e373f --- /dev/null +++ b/Config/Nuclearizer_SMEX_DEE.cfg @@ -0,0 +1,97 @@ + + 1 + + XmlTagLoaderSimulations + XmlTagDEESMEX + + $(NUCLEARIZER)/../massmodel-cosi-em/COSISMEX.analysis_BGOreading.geo.setup + + + + + + + + + + + + + true + false + 10000000 + + + + + /Users/parshadkp/Software/Nuclearizer_files/SingleDetBGO/Cosima/Cs137_singleDetBGO_sourceHolderPos_1166700Flux_10s_0050_Fluore.inc1.id1.sim.gz + + + $(NUCLEARIZER)/../Data/roas/asic_gse_240412194613.hdf.roa + + + + false + + + + + 0 + 10000 + + + $(NUCLEARIZER)/resource/calibration/COSI_SingleDet/20240819_Am241_Cs137_Co57_LV.ecal + + 0 + + + 0 + + + + + + + + + + + $(NUCLEARIZER)/resource/calibration/COSI_SingleDet/stretch_offset.csv + $(NUCLEARIZER)/resource/calibration/COSI_SingleDet/ctd_depth_122.0keV.reformat.csv + 0 + + + /Users/parshadkp/Library/CloudStorage/OneDrive-ClemsonUniversity/COSI/nuclearizer_files/nuclearizer_outputs/STTC/STTC_DEE_Cs137.evta + 2 + false + true + false + false + 600 + true + true + false + false + false + false + true + + + localhost + 12354 + + + 0 + Response + + + + + $(NUCLEARIZER)/resource/calibration/COSI_SingleDet/taccal_240225_channelsmapped.csv + $(NUCLEARIZER)/resource/calibration/COSI_SingleDet/tac_cut_params_fldelay_coinc400.csv + + + + + + From 00827cb60eed1b1380858a12b72f2e4bc756ee4e Mon Sep 17 00:00:00 2001 From: parshadkp <111451184+parshadkp@users.noreply.github.com> Date: Sun, 14 Dec 2025 22:38:33 -0500 Subject: [PATCH 04/10] Shield trigger test --- Config/Nuclearizer_EM_DEE.cfg | 97 +++++++++++++++++++++++++++++++++ Config/Nuclearizer_SMEX_DEE.cfg | 4 +- 2 files changed, 99 insertions(+), 2 deletions(-) create mode 100644 Config/Nuclearizer_EM_DEE.cfg diff --git a/Config/Nuclearizer_EM_DEE.cfg b/Config/Nuclearizer_EM_DEE.cfg new file mode 100644 index 00000000..b51e373f --- /dev/null +++ b/Config/Nuclearizer_EM_DEE.cfg @@ -0,0 +1,97 @@ + + 1 + + XmlTagLoaderSimulations + XmlTagDEESMEX + + $(NUCLEARIZER)/../massmodel-cosi-em/COSISMEX.analysis_BGOreading.geo.setup + + + + + + + + + + + + + true + false + 10000000 + + + + + /Users/parshadkp/Software/Nuclearizer_files/SingleDetBGO/Cosima/Cs137_singleDetBGO_sourceHolderPos_1166700Flux_10s_0050_Fluore.inc1.id1.sim.gz + + + $(NUCLEARIZER)/../Data/roas/asic_gse_240412194613.hdf.roa + + + + false + + + + + 0 + 10000 + + + $(NUCLEARIZER)/resource/calibration/COSI_SingleDet/20240819_Am241_Cs137_Co57_LV.ecal + + 0 + + + 0 + + + + + + + + + + + $(NUCLEARIZER)/resource/calibration/COSI_SingleDet/stretch_offset.csv + $(NUCLEARIZER)/resource/calibration/COSI_SingleDet/ctd_depth_122.0keV.reformat.csv + 0 + + + /Users/parshadkp/Library/CloudStorage/OneDrive-ClemsonUniversity/COSI/nuclearizer_files/nuclearizer_outputs/STTC/STTC_DEE_Cs137.evta + 2 + false + true + false + false + 600 + true + true + false + false + false + false + true + + + localhost + 12354 + + + 0 + Response + + + + + $(NUCLEARIZER)/resource/calibration/COSI_SingleDet/taccal_240225_channelsmapped.csv + $(NUCLEARIZER)/resource/calibration/COSI_SingleDet/tac_cut_params_fldelay_coinc400.csv + + + + + + diff --git a/Config/Nuclearizer_SMEX_DEE.cfg b/Config/Nuclearizer_SMEX_DEE.cfg index b51e373f..128dfa29 100644 --- a/Config/Nuclearizer_SMEX_DEE.cfg +++ b/Config/Nuclearizer_SMEX_DEE.cfg @@ -4,7 +4,7 @@ XmlTagLoaderSimulations XmlTagDEESMEX - $(NUCLEARIZER)/../massmodel-cosi-em/COSISMEX.analysis_BGOreading.geo.setup + $(NUCLEARIZER)/../massmodel-cosi-dc3/COSISMEX.analysis_BGOreading.geo.setup @@ -24,7 +24,7 @@ - /Users/parshadkp/Software/Nuclearizer_files/SingleDetBGO/Cosima/Cs137_singleDetBGO_sourceHolderPos_1166700Flux_10s_0050_Fluore.inc1.id1.sim.gz + /Users/parshadkp/Software/Nuclearizer_files/SMEX/Cs137_SMEX_sourceHolder_1166700Flux_10s_Fluore.inc1.id1.sim.gz $(NUCLEARIZER)/../Data/roas/asic_gse_240412194613.hdf.roa From 4ba206388371c051e0f30259d9a5fb185d8920c0 Mon Sep 17 00:00:00 2001 From: parshadkp <111451184+parshadkp@users.noreply.github.com> Date: Fri, 19 Dec 2025 21:54:15 -0500 Subject: [PATCH 05/10] Savepoint for shield trigger updates --- Config/Nuclearizer_EM_DEE.cfg | 39 ++- include/MGUIOptionsDEESMEX.h | 4 +- include/MGUIOptionsEventSaver.h | 17 - include/MModuleDEESMEX.h | 11 + include/MSubModuleShieldTrigger.h | 183 +++++++++-- include/MSubModuleStripTrigger.h | 238 +++++++++++++- src/MDetectorEffectsEngineSingleDet.cxx | 14 +- src/MGUIOptionsDEESMEX.cxx | 6 +- src/MSubModuleShieldTrigger.cxx | 341 +++++++++++++++++++- src/MSubModuleStripTrigger.cxx | 402 +++++++++++++++++++++++- 10 files changed, 1166 insertions(+), 89 deletions(-) diff --git a/Config/Nuclearizer_EM_DEE.cfg b/Config/Nuclearizer_EM_DEE.cfg index b51e373f..f69b1e91 100644 --- a/Config/Nuclearizer_EM_DEE.cfg +++ b/Config/Nuclearizer_EM_DEE.cfg @@ -4,7 +4,7 @@ XmlTagLoaderSimulations XmlTagDEESMEX - $(NUCLEARIZER)/../massmodel-cosi-em/COSISMEX.analysis_BGOreading.geo.setup + $(NUCLEARIZER)/../massmodel-cosi-em-edited/COSISMEX.analysis_BGOreading.geo.setup @@ -22,9 +22,24 @@ 10000000 + /Users/parshadkp/Library/CloudStorage/OneDrive-ClemsonUniversity/COSI/nuclearizer_files/nuclearizer_outputs/STTC/Cs137_STTC_sourceHolderPos_1166700Flux_10s_0050_Fluore.inc1.id1.sim.gz + $(NUCLEARIZER)/resource/calibration/COSI_SingleDet/deadtimeParameters.txt + $(NUCLEARIZER)/resource/calibration/COSI_SingleDet/20240819_Am241_Cs137_Co57_LV.ecal + $(NUCLEARIZER)/resource/calibration/COSI_SingleDet/DeadStripList.txt + $(NUCLEARIZER)/resource/calibration/COSI_SingleDet/thresholds_fake.dat + $(NUCLEARIZER)/resource/calibration/COSI_SingleDet/GuardRingThresholds_190726.dat + $(NUCLEARIZER)/resource/calibration/COSI_SingleDet/ChargeSharingFactors_190311.txt + $(NUCLEARIZER)/resource/calibration/COSI_SingleDet/CrossTalkCorrection_Results_190726.txt + $(NUCLEARIZER)/resource/calibration/COSI_SingleDet/ChargeLossCoeffs_190311.log + $(NUCLEARIZER)/resource/calibration/COSI_SingleDet/stretch_offset.csv + $(NUCLEARIZER)/resource/calibration/COSI_SingleDet/taccal_240225_channelsmapped.csv + $(NUCLEARIZER)/resource/calibration/COSI_SingleDet/ctd_depth_122.0keV_AnodeCathode.csv + true + false + 10000000 - /Users/parshadkp/Software/Nuclearizer_files/SingleDetBGO/Cosima/Cs137_singleDetBGO_sourceHolderPos_1166700Flux_10s_0050_Fluore.inc1.id1.sim.gz + /Users/parshadkp/Software/Nuclearizer_files/SingleDetBGO-GeD/Cosima/Cs137_singleDetBGO-GeD_sourceHolderPos_1166700Flux_10s_0050_Fluore.inc1.id1.sim.gz $(NUCLEARIZER)/../Data/roas/asic_gse_240412194613.hdf.roa @@ -34,19 +49,33 @@ false - + + /Users/parshadkp/Software/nuclearizer_parshad_fork/resource/calibration/COSI_SingleDet/ACS_correction_file.txt + /Users/parshadkp/Software/nuclearizer_parshad_fork/resource/calibration/COSI_SingleDet/20240819_Am241_Cs137_Co57_LV.ecal + 0 10000 + 0 + 20 + 0 + 20 + 0 + 100 + -1 + inf $(NUCLEARIZER)/resource/calibration/COSI_SingleDet/20240819_Am241_Cs137_Co57_LV.ecal - - 0 + false + + false + 0 0 + diff --git a/include/MGUIOptionsDEESMEX.h b/include/MGUIOptionsDEESMEX.h index 251f59d6..99532e12 100644 --- a/include/MGUIOptionsDEESMEX.h +++ b/include/MGUIOptionsDEESMEX.h @@ -93,10 +93,10 @@ class MGUIOptionsDEESMEX : public MGUIOptions TGCheckButton* m_StopAfter; //! Entry field for the maximum number of accepted events MGUIEEntry* m_MaximumAcceptedEvents; - - //! ACS DEE energy correction file MGUIEFileSelector* m_ShieldEnergyCorrectionFileSelector; + //! Select deadtime constants file + MGUIEFileSelector* m_DeadtimeFileSelector; #ifdef ___CLING___ diff --git a/include/MGUIOptionsEventSaver.h b/include/MGUIOptionsEventSaver.h index 81efe1e0..fe466302 100644 --- a/include/MGUIOptionsEventSaver.h +++ b/include/MGUIOptionsEventSaver.h @@ -109,23 +109,6 @@ class MGUIOptionsEventSaver : public MGUIOptions //! Checkbutton to include or exclude nearest neighbor hits in the roa file TGCheckButton* m_RoaWithNearestNeighbors; - //! Checkbutton to include or exclude ADCs in the roa file - TGCheckButton* m_RoaWithADCs; - //! Checkbutton to include or exclude TACs in the roa file - TGCheckButton* m_RoaWithTACs; - //! Checkbutton to include or exclude energies in the roa file - TGCheckButton* m_RoaWithEnergies; - //! Checkbutton to include or exclude timings in the roa file - TGCheckButton* m_RoaWithTimings; - //! Checkbutton to include or exclude temperatures in the roa file - TGCheckButton* m_RoaWithTemperatures; - //! Checkbutton to include or exclude flags in the roa file - TGCheckButton* m_RoaWithFlags; - //! Checkbutton to include or exclude origins in the roa file - TGCheckButton* m_RoaWithOrigins; - //! Checkbutton to include or exclude nearest neighbor hits in the roa file - TGCheckButton* m_RoaWithNearestNeighbors; - #ifdef ___CLING___ public: ClassDef(MGUIOptionsEventSaver, 1) // basic class for dialog windows diff --git a/include/MModuleDEESMEX.h b/include/MModuleDEESMEX.h index c060442a..8ea88a3b 100644 --- a/include/MModuleDEESMEX.h +++ b/include/MModuleDEESMEX.h @@ -113,6 +113,17 @@ class MModuleDEESMEX : public MModule return m_ShieldEnergyCorrection.GetShieldEnergyCorrectionFileName(); } + //! Set shield energy correction file name + void SetDeadtimeFileName(const MString& FileName) + { + m_StripTrigger.SetDeadtimeFileName(FileName); + } + //! Set energy calibration file name + MString GetDeadtimeFileName() const + { + return m_StripTrigger.GetDeadtimeFileName(); + } + // protected methods: protected: // private methods: diff --git a/include/MSubModuleShieldTrigger.h b/include/MSubModuleShieldTrigger.h index 56873bd9..2686ba6c 100644 --- a/include/MSubModuleShieldTrigger.h +++ b/include/MSubModuleShieldTrigger.h @@ -1,3 +1,130 @@ +// /* +// * MSubModuleShieldTrigger.h +// * +// * Copyright (C) by Andreas Zoglauer. +// * All rights reserved. +// * +// * Please see the source-file for the copyright-notice. +// * +// */ + + +// #ifndef __MSubModuleShieldTrigger__ +// #define __MSubModuleShieldTrigger__ + + +// //////////////////////////////////////////////////////////////////////////////// + + +// // Standard libs: + +// // ROOT libs: + +// // MEGAlib libs: +// #include "MGlobal.h" +// #include "MSubModule.h" + +// // Forward declarations: + + +// //////////////////////////////////////////////////////////////////////////////// + + +// class MSubModuleShieldTrigger : public MSubModule +// { +// // public interface: +// public: +// //! Default constructor +// MSubModuleShieldTrigger(); + +// //! No copy constructor +// MSubModuleShieldTrigger(const MSubModuleShieldTrigger&) = delete; +// //! No copy assignment +// MSubModuleShieldTrigger& operator=(const MSubModuleShieldTrigger&) = delete; +// //! No move constructors +// MSubModuleShieldTrigger(MSubModuleShieldTrigger&&) = delete; +// //! No move operators +// MSubModuleShieldTrigger& operator=(MSubModuleShieldTrigger&&) = delete; + +// //! Set shield energy correction file name +// void SetDeadtimeFileName(const MString& FileName) +// { +// m_DeadtimeFileName = FileName; +// } +// //! Get shield energy correction file name +// MString GetDeadtimeFileName() const +// { +// return m_DeadtimeFileName; +// } + +// //! Default destructor +// virtual ~MSubModuleShieldTrigger(); + +// //! Initialize the module +// virtual bool Initialize(); + +// //! Clear event data from the module +// virtual void Clear(); + +// //! Main data analysis routine, which updates the event to a new level +// virtual bool AnalyzeEvent(MReadOutAssembly* Event); + +// //! Return true if we have a trigger - filled after AnalyzeEvent +// bool HasTrigger() const { return m_HasTrigger; } + +// //! Return true if we have a veto - filled after AnalyzeEvent +// bool HasVeto() const { return m_HasVeto; } + +// //! Return the time when the dead time ends - filled after AnalyzeEvent +// MTime GetDeadTimeEnd() const { return m_DeadTimeEnd; } + +// //! Finalize the module +// virtual void Finalize(); + +// //! Read the configuration data from an XML node +// virtual bool ReadXmlConfiguration(MXmlNode* Node); +// //! Create an XML node tree from the configuration +// virtual MXmlNode* CreateXmlConfiguration(MXmlNode* Node); + +// // protected methods: +// protected: + +// // private methods: +// private: + + + +// // protected members: +// protected: +// //! Shield energy correction file name +// MString m_DeadtimeFileName; + +// // private members: +// private: +// //! Flag indicating that a trigger has been raised +// bool m_HasTrigger; + +// //! Flag indicating that a veto has been raised +// bool m_HasVeto; + +// //! Time when the shield dead time ends +// MTime m_DeadTimeEnd; + + + +// #ifdef ___CLING___ +// public: +// ClassDef(MSubModuleShieldTrigger, 0) // no description +// #endif + +// }; + +// #endif + + +// //////////////////////////////////////////////////////////////////////////////// + + /* * MSubModuleShieldTrigger.h * @@ -17,12 +144,18 @@ // Standard libs: +#include +using namespace std; // ROOT libs: // MEGAlib libs: #include "MGlobal.h" #include "MSubModule.h" +#include "MSimEvent.h" +#include "MSimHT.h" +#include "MDVolumeSequence.h" +#include "MDDetector.h" // Forward declarations: @@ -46,6 +179,7 @@ class MSubModuleShieldTrigger : public MSubModule //! No move operators MSubModuleShieldTrigger& operator=(MSubModuleShieldTrigger&&) = delete; + //! Default destructor virtual ~MSubModuleShieldTrigger(); @@ -55,9 +189,12 @@ class MSubModuleShieldTrigger : public MSubModule //! Clear event data from the module virtual void Clear(); - //! Main data analysis routine, which updates the event to a new level + //! Main data analysis routine virtual bool AnalyzeEvent(MReadOutAssembly* Event); + //! Set the Simulation Event (Required for checking BGO hits) + void SetSimEvent(MSimEvent* Event) { m_SimEvent = Event; } + //! Return true if we have a trigger - filled after AnalyzeEvent bool HasTrigger() const { return m_HasTrigger; } @@ -74,31 +211,41 @@ class MSubModuleShieldTrigger : public MSubModule virtual bool ReadXmlConfiguration(MXmlNode* Node); //! Create an XML node tree from the configuration virtual MXmlNode* CreateXmlConfiguration(MXmlNode* Node); - - // protected methods: - protected: - - // private methods: - private: - - - - // protected members: - protected: - - // private members: private: + //! Pointer to the current simulation event being processed + MSimEvent* m_SimEvent; + //! Flag indicating that a trigger has been raised bool m_HasTrigger; - //! Flag indicating that a veto has been raised bool m_HasVeto; - //! Time when the shield dead time ends MTime m_DeadTimeEnd; - + // Shield parameters + double m_ShieldThreshold; + double m_ShieldPulseDuration; + double m_ShieldDelayBefore; + double m_ShieldDelayAfter; + double m_ShieldVetoWindowSize; + + // Shield state tracking + int m_NumShieldHitCounts; + int m_ShieldVetoCounter; + int m_NumBGOHitsErased; + bool m_IsShieldDead; + double m_ShieldVetoTime; + + static const int nShieldPanels = 6; + vector m_ShieldLastHitTime; + vector m_ShieldDeadtime; + vector m_TotalShieldDeadtime; + + //! Group of shield numbers per panel + vector> m_ShieldPanelGroups; + //! Shield ID for particular hit + vector> m_ShieldHitID; #ifdef ___CLING___ public: @@ -110,4 +257,4 @@ class MSubModuleShieldTrigger : public MSubModule #endif -//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// \ No newline at end of file diff --git a/include/MSubModuleStripTrigger.h b/include/MSubModuleStripTrigger.h index b3cf1267..a01e0704 100644 --- a/include/MSubModuleStripTrigger.h +++ b/include/MSubModuleStripTrigger.h @@ -1,3 +1,130 @@ +// /* +// * MSubModuleStripTrigger.h +// * +// * Copyright (C) by Andreas Zoglauer. +// * All rights reserved. +// * +// * Please see the source-file for the copyright-notice. +// * +// */ + + +// #ifndef __MSubModuleStripTrigger__ +// #define __MSubModuleStripTrigger__ + + +// //////////////////////////////////////////////////////////////////////////////// + + +// // Standard libs: + +// // ROOT libs: + +// // MEGAlib libs: +// #include "MGlobal.h" +// #include "MSubModule.h" + +// // Forward declarations: + + +// //////////////////////////////////////////////////////////////////////////////// + + +// class MSubModuleStripTrigger : public MSubModule +// { +// // public interface: +// public: +// //! Default constructor +// MSubModuleStripTrigger(); + +// //! No copy constructor +// MSubModuleStripTrigger(const MSubModuleStripTrigger&) = delete; +// //! No copy assignment +// MSubModuleStripTrigger& operator=(const MSubModuleStripTrigger&) = delete; +// //! No move constructors +// MSubModuleStripTrigger(MSubModuleStripTrigger&&) = delete; +// //! No move operators +// MSubModuleStripTrigger& operator=(MSubModuleStripTrigger&&) = delete; + +// //! Set deadime parameters file name +// void SetDeadtimeFileName(const MString& FileName) +// { +// m_DeadtimeFileName = FileName; +// } +// //! Get deadime parameters file name +// MString GetDeadtimeFileName() const +// { +// return m_DeadtimeFileName; +// } + +// //! Default destructor +// virtual ~MSubModuleStripTrigger(); + +// //! Initialize the module +// virtual bool Initialize(); + +// //! Clear event data from the module +// virtual void Clear(); + +// //! Main data analysis routine, which updates the event to a new level +// virtual bool AnalyzeEvent(MReadOutAssembly* Event); + +// //! Return true if we have a trigger - filled after AnalyzeEvent +// bool HasTrigger() const { return m_HasTrigger; } + +// //! Return true if we have a veto - filled after AnalyzeEvent +// bool HasVeto() const { return m_HasVeto; } + +// //! Return the time when the dead time ends - filled after AnalyzeEvent +// MTime GetDeadTimeEnd() const { return m_DeadTimeEnd; } + +// //! Finalize the module +// virtual void Finalize(); + +// //! Read the configuration data from an XML node +// virtual bool ReadXmlConfiguration(MXmlNode* Node); +// //! Create an XML node tree from the configuration +// virtual MXmlNode* CreateXmlConfiguration(MXmlNode* Node); + +// // protected methods: +// protected: + +// // private methods: +// private: + + + +// // protected members: +// protected: +// //! Deadtime parameters file name +// MString m_DeadtimeFileName; + +// // private members: +// private: +// //! Flag indicating that a trigger has been raised +// bool m_HasTrigger; + +// //! Flag indicating that a veto has been raised +// bool m_HasVeto; + +// //! Time when the shield dead time ends +// MTime m_DeadTimeEnd; + + + +// #ifdef ___CLING___ +// public: +// ClassDef(MSubModuleStripTrigger, 0) // no description +// #endif + +// }; + +// #endif + + +// //////////////////////////////////////////////////////////////////////////////// + + /* * MSubModuleStripTrigger.h * @@ -17,6 +144,9 @@ // Standard libs: +#include +#include +using namespace std; // ROOT libs: @@ -46,6 +176,17 @@ class MSubModuleStripTrigger : public MSubModule //! No move operators MSubModuleStripTrigger& operator=(MSubModuleStripTrigger&&) = delete; + //! Set deadtime parameters file name + void SetDeadtimeFileName(const MString& FileName) + { + m_DeadtimeFileName = FileName; + } + //! Get deadtime parameters file name + MString GetDeadtimeFileName() const + { + return m_DeadtimeFileName; + } + //! Default destructor virtual ~MSubModuleStripTrigger(); @@ -58,6 +199,9 @@ class MSubModuleStripTrigger : public MSubModule //! Main data analysis routine, which updates the event to a new level virtual bool AnalyzeEvent(MReadOutAssembly* Event); + //! Set the event time for deadtime calculations + void SetEventTime(double Time) { m_EventTime = Time; } + //! Return true if we have a trigger - filled after AnalyzeEvent bool HasTrigger() const { return m_HasTrigger; } @@ -67,6 +211,38 @@ class MSubModuleStripTrigger : public MSubModule //! Return the time when the dead time ends - filled after AnalyzeEvent MTime GetDeadTimeEnd() const { return m_DeadTimeEnd; } + //! Check if GeD is currently dead + bool IsGeDDead() const { return m_IsGeDDead; } + + //! Get total strips deadtime + double GetStripsTotalDeadtime() const { return m_StripsTotalDeadtime; } + + //! Get current strips deadtime + double GetStripsCurrentDeadtime() const { return m_StripsCurrentDeadtime; } + + //! Get number of strip hits erased + int GetStripHitsErased() const { return m_StripHitsErased; } + + //! Get trigger rates for detector + int GetTriggerRate(int det) const { + if (det >= 0 && det < nDets) return m_TriggerRates[det]; + return 0; + } + + //! Increment trigger rate for detector + void IncrementTriggerRate(int det) { + if (det >= 0 && det < nDets) m_TriggerRates[det]++; + } + + //! Update deadtime tracking + void UpdateDeadtime(int det, int ASIC, vector stripIDs, bool isFirstHitAfterDead); + + //! Calculate GeD deadtime + double dTimeASICs(vector ASICChannels); + + //! Helper function for getting count rate + bool CountRate(vector ASICChannels, vector CountTime); + //! Finalize the module virtual void Finalize(); @@ -77,28 +253,72 @@ class MSubModuleStripTrigger : public MSubModule // protected methods: protected: - - // private methods: - private: - - + //! Parse deadtime file + bool ParseDeadtimeFile(); // protected members: protected: - + //! Deadtime parameters file name + MString m_DeadtimeFileName; // private members: private: + //! Current event time + double m_EventTime; + //! Flag indicating that a trigger has been raised bool m_HasTrigger; //! Flag indicating that a veto has been raised bool m_HasVeto; - //! Time when the shield dead time ends + //! Time when the strip dead time ends MTime m_DeadTimeEnd; - + //! Bool to store if ASIC is dead or not + bool m_IsGeDDead; + + //! Strip deadtime parameters + double m_StripCoincidenceWindow; + double m_ASICDeadTimePerChannel; + double m_StripDelayAfter1; + double m_StripDelayAfter2; + double m_StripDelayAfter; + + double m_StripCoincidenceWindowFromFile; + double m_ASICDeadTimePerChannelFromFile; + double m_StripDelayAfter1FromFile; + double m_StripDelayAfter2FromFile; + + //! Stores current dead time of the instrument + double m_StripsCurrentDeadtime; + //! Stores last good event time + double m_ASICLastHitTime; + //! Stores total dead time of the instrument + double m_StripsTotalDeadtime; + //! Hits erased due to deadtime + int m_StripHitsErased; + + //! Number of detectors + static const int nDets = 1; + //! Number of ASICs for 1 det + static const int nASICs = 4; + + //! Stores dead time for each ASIC + vector> m_ASICDeadTime; + //! Strip ID for particular hit in ASIC + vector>> m_ASICHitStripID; + //! Helper Strip ID vector to count for hits without deadtime + vector>> m_ASICHitStripID_noDT; + //! Strip ID for particular hit in ASIC + vector>> m_TempEvtTimes; + + //! Stores trigger rates (number of events) for each detector + vector m_TriggerRates; + + //! Event times and strip IDs for counting + vector m_EventTimes; + vector m_EventStripIDs; #ifdef ___CLING___ public: @@ -110,4 +330,4 @@ class MSubModuleStripTrigger : public MSubModule #endif -//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// \ No newline at end of file diff --git a/src/MDetectorEffectsEngineSingleDet.cxx b/src/MDetectorEffectsEngineSingleDet.cxx index 83ef1884..4e9ba49f 100644 --- a/src/MDetectorEffectsEngineSingleDet.cxx +++ b/src/MDetectorEffectsEngineSingleDet.cxx @@ -565,13 +565,13 @@ bool MDetectorEffectsEngineSingleDet::GetNextEvent(MReadOutAssembly* Event) } - // for (int group=0; groupSetFileType("Ecal file", "*.ecal"); m_OptionsFrame->AddFrame(m_EnergyCalibrationFileSelector, LabelLayout); - /* m_DeadtimeFileSelector = new MGUIEFileSelector(m_OptionsFrame, "Please select a deadtime parameters file:", - dynamic_cast(m_Module)->GetDeadtimeFileName()); + dynamic_cast(m_Module)->GetDeadtimeFileName()); m_DeadtimeFileSelector->SetFileType("Deadtime file", "*.txt"); m_OptionsFrame->AddFrame(m_DeadtimeFileSelector, LabelLayout); - */ /* m_DeadStripFileSelector = new MGUIEFileSelector(m_OptionsFrame, "Please select a dead strip file:", @@ -190,7 +188,7 @@ bool MGUIOptionsDEESMEX::OnApply() // GeD options: dynamic_cast(m_Module)->SetEnergyCalibrationFileName(m_EnergyCalibrationFileSelector->GetFileName()); - //dynamic_cast(m_Module)->SetDeadtimeFileName(m_DeadtimeFileSelector->GetFileName()); + dynamic_cast(m_Module)->SetDeadtimeFileName(m_DeadtimeFileSelector->GetFileName()); //dynamic_cast(m_Module)->SetThresholdFileName(m_ThresholdFileSelector->GetFileName()); //dynamic_cast(m_Module)->SetGuardRingThresholdFileName(m_GuardRingThresholdFileSelector->GetFileName()); //dynamic_cast(m_Module)->SetChargeSharingFileName(m_ChargeSharingFileSelector->GetFileName()); diff --git a/src/MSubModuleShieldTrigger.cxx b/src/MSubModuleShieldTrigger.cxx index c19ec5e3..47b248c1 100644 --- a/src/MSubModuleShieldTrigger.cxx +++ b/src/MSubModuleShieldTrigger.cxx @@ -1,3 +1,156 @@ +// /* +// * MSubModuleShieldTrigger.cxx +// * +// * +// * Copyright (C) by Andreas Zoglauer. +// * All rights reserved. +// * +// * +// * This code implementation is the intellectual property of +// * Andreas Zoglauer. +// * +// * By copying, distributing or modifying the Program (or any work +// * based on the Program) you indicate your acceptance of this statement, +// * and all its terms. +// * +// */ + + +// //////////////////////////////////////////////////////////////////////////////// +// // +// // MSubModuleShieldTrigger +// // +// //////////////////////////////////////////////////////////////////////////////// + + +// // Include the header: +// #include "MSubModuleShieldTrigger.h" + +// // Standard libs: + +// // ROOT libs: + +// // MEGAlib libs: +// #include "MSubModule.h" + + +// //////////////////////////////////////////////////////////////////////////////// + + +// #ifdef ___CLING___ +// ClassImp(MSubModuleShieldTrigger) +// #endif + + +// //////////////////////////////////////////////////////////////////////////////// + + +// MSubModuleShieldTrigger::MSubModuleShieldTrigger() : MSubModule() +// { +// // Construct an instance of MSubModuleShieldTrigger + +// m_Name = "DEE shield trigger module"; + +// m_HasTrigger = false; +// m_HasVeto = false; +// } + + +// //////////////////////////////////////////////////////////////////////////////// + + +// MSubModuleShieldTrigger::~MSubModuleShieldTrigger() +// { +// // Delete this instance of MSubModuleShieldTrigger +// } + + +// //////////////////////////////////////////////////////////////////////////////// + + +// bool MSubModuleShieldTrigger::Initialize() +// { +// // Initialize the module + +// return MSubModule::Initialize(); +// } + + +// //////////////////////////////////////////////////////////////////////////////// + + +// void MSubModuleShieldTrigger::Clear() +// { +// // Clear for the next event + +// m_HasTrigger = false; +// m_HasVeto = false; + +// MSubModule::Clear(); +// } + + +// //////////////////////////////////////////////////////////////////////////////// + + +// bool MSubModuleShieldTrigger::AnalyzeEvent(MReadOutAssembly* Event) +// { +// // Main data analysis routine, which updates the event to a new level + +// m_HasTrigger = false; + +// return true; +// } + + +// //////////////////////////////////////////////////////////////////////////////// + + +// void MSubModuleShieldTrigger::Finalize() +// { +// // Finalize the analysis - do all cleanup, i.e., undo Initialize() + +// MSubModule::Finalize(); +// } + + +// //////////////////////////////////////////////////////////////////////////////// + + +// bool MSubModuleShieldTrigger::ReadXmlConfiguration(MXmlNode* Node) +// { +// //! Read the configuration data from an XML node + +// /* +// MXmlNode* SomeTagNode = Node->GetNode("SomeTag"); +// if (SomeTagNode != 0) { +// m_SomeTagValue = SomeTagNode->GetValue(); +// } +// */ + +// return true; +// } + + +// //////////////////////////////////////////////////////////////////////////////// + + +// MXmlNode* MSubModuleShieldTrigger::CreateXmlConfiguration(MXmlNode* Node) +// { +// //! Create an XML node tree from the configuration + +// /* +// MXmlNode* SomeTagNode = new MXmlNode(Node, "SomeTag", "SomeValue"); +// */ + +// return Node; +// } + + +// // MSubModuleShieldTrigger.cxx: the end... +// //////////////////////////////////////////////////////////////////////////////// + + /* * MSubModuleShieldTrigger.cxx * @@ -27,6 +180,7 @@ #include "MSubModuleShieldTrigger.h" // Standard libs: +#include // ROOT libs: @@ -51,8 +205,41 @@ MSubModuleShieldTrigger::MSubModuleShieldTrigger() : MSubModule() m_Name = "DEE shield trigger module"; + m_SimEvent = nullptr; + m_EventTime = 0.0; m_HasTrigger = false; m_HasVeto = false; + m_IsShieldDead = false; + + // Initialize shield parameters with default values + m_ShieldThreshold = 80.0; + m_ShieldPulseDuration = 1.7e-6; + m_ShieldDelayBefore = 0.1e-6; + m_ShieldDelayAfter = 0.4e-6; + m_ShieldVetoWindowSize = 1.5e-6; + m_ASICDeadTimePerChannel = 0.0; + m_ShieldVetoTime = 0.0; + + m_NumShieldHitCounts = 0; + m_ShieldVetoCounter = 0; + m_NumBGOHitsErased = 0; + + // Initialize vectors + m_ShieldLastHitTime = vector(nShieldPanels, -10.0); + m_ShieldDeadtime = vector(nShieldPanels, 0.0); + m_TotalShieldDeadtime = vector(nShieldPanels, 0.0); + m_ShieldHitID = vector>(nShieldPanels); + m_DetectorsHitForShieldVeto = vector(nDets, 0); + + // Initialize shield panel groups + m_ShieldPanelGroups = { + { 0, 1, 2, 3 }, + { 4, 5, 6, 7 }, + { 8, 9, 10, 11 }, + { 12, 13, 14, 15 }, + { 16, 17, 18 }, + { 19, 20, 21 } + }; } @@ -85,6 +272,14 @@ void MSubModuleShieldTrigger::Clear() m_HasTrigger = false; m_HasVeto = false; + m_IsShieldDead = false; + + // Clear per-event data + for (int i = 0; i < nShieldPanels; i++) { + m_ShieldHitID[i].clear(); + } + + m_DetectorsHitForShieldVeto = vector(nDets, 0); MSubModule::Clear(); } @@ -93,11 +288,128 @@ void MSubModuleShieldTrigger::Clear() //////////////////////////////////////////////////////////////////////////////// +double MSubModuleShieldTrigger::dTimeASICs(vector ASICChannels) +{ + // Calculate deadtime for shield ASICs + double deadtime = 0; + int countUnique = 0; + + if (ASICChannels.empty()) { + return 0.0; + } + + unordered_set BGOChannelsSet; + for (int ID : ASICChannels) { + BGOChannelsSet.insert(ID); + } + + // Count the number of unique channels read out (2 for each hit in the BGO) + countUnique = BGOChannelsSet.size() * 2; + deadtime = m_ShieldDelayBefore + (m_ASICDeadTimePerChannel * countUnique) + m_ShieldDelayAfter; + + if (deadtime < m_ShieldPulseDuration) { + deadtime = m_ShieldPulseDuration; + } + + return deadtime; +} + + +//////////////////////////////////////////////////////////////////////////////// + + bool MSubModuleShieldTrigger::AnalyzeEvent(MReadOutAssembly* Event) { - // Main data analysis routine, which updates the event to a new level + // Main data analysis routine for shield trigger and veto m_HasTrigger = false; + m_HasVeto = false; + m_IsShieldDead = false; + + if (m_SimEvent == nullptr) { + return true; + } + + int ShieldDetNum = 0; + double energy = 0; + int ShieldDetGroup; + + // Process shield hits + for (unsigned int h = 0; h < m_SimEvent->GetNHTs(); h++) { + MSimHT* HT = m_SimEvent->GetHTAt(h); + + if (HT->GetDetectorType() == 8) { // Shield hit + m_NumShieldHitCounts += 1; + + MDVolumeSequence* VS = HT->GetVolumeSequence(); + MDDetector* Detector = VS->GetDetector(); + MString FullDetName = Detector->GetName(); + MString DetName = FullDetName; + + // Parse detector number + DetName.RemoveAllInPlace("BGO_X0_"); + ShieldDetNum = DetName.ToInt(); + ShieldDetNum = ShieldDetNum - 1; + + energy = HT->GetOriginalEnergy(); + HT->SetEnergy(energy); + + ShieldDetGroup = 0; + + if (energy > m_ShieldThreshold) { + // Find which panel group this detector belongs to + bool found = false; + for (size_t i = 0; i < m_ShieldPanelGroups.size(); ++i) { + for (size_t j = 0; j < m_ShieldPanelGroups[i].size(); ++j) { + if (m_ShieldPanelGroups[i][j] == ShieldDetNum) { + ShieldDetGroup = i; + found = true; + break; + } + } + if (found) break; + } + + // Check deadtime conditions + if (m_ShieldLastHitTime[ShieldDetGroup] + m_ShieldDeadtime[ShieldDetGroup] < m_EventTime) { + // Event occurred after deadtime + for (int group = 0; group < nShieldPanels; group++) { + m_ShieldHitID[group].clear(); + } + m_ShieldLastHitTime[ShieldDetGroup] = m_EventTime; + m_ShieldVetoTime = m_EventTime; + m_ShieldHitID[ShieldDetGroup].push_back(ShieldDetNum); + m_HasVeto = true; + m_TotalShieldDeadtime[ShieldDetGroup] += m_ShieldDeadtime[ShieldDetGroup]; + } + else if (m_ShieldLastHitTime[ShieldDetGroup] + m_ShieldDelayBefore > m_EventTime) { + // Event occurred within coincidence window + m_ShieldVetoTime = m_EventTime; + m_ShieldHitID[ShieldDetGroup].push_back(ShieldDetNum); + m_HasVeto = true; + } + else if (m_ShieldLastHitTime[ShieldDetGroup] + m_ShieldDeadtime[ShieldDetGroup] > m_EventTime) { + // Event occurred within deadtime + m_IsShieldDead = true; + m_NumBGOHitsErased += 1; + } + } + } + } + + // Calculate deadtime for each panel group + for (int group = 0; group < nShieldPanels; group++) { + if (!m_IsShieldDead) { + m_ShieldDeadtime[group] = dTimeASICs(m_ShieldHitID[group]); + } + } + + // Check if event is within veto window + if (((m_ShieldVetoTime + m_ShieldVetoWindowSize) >= m_EventTime) && + (m_EventTime >= m_ShieldVetoTime)) { + m_HasVeto = true; + m_ShieldVetoCounter += m_SimEvent->GetNHTs(); + } return true; } @@ -108,7 +420,19 @@ bool MSubModuleShieldTrigger::AnalyzeEvent(MReadOutAssembly* Event) void MSubModuleShieldTrigger::Finalize() { - // Finalize the analysis - do all cleanup, i.e., undo Initialize() + // Finalize the analysis - do all cleanup + + cout << "###################" << endl + << "SHIELD TRIGGER MODULE STATISTICS" << endl + << "###################" << endl; + cout << "Total BGO hits before BGO deadtime: " << m_NumShieldHitCounts << endl; + + for (int i = 0; i < nShieldPanels; i++) { + cout << "Shield Panel " << i << " dead time: " << m_TotalShieldDeadtime[i] << endl; + } + + cout << "BGO hits erased due to BGO being dead: " << m_NumBGOHitsErased << endl; + cout << "Shield vetoes: " << m_ShieldVetoCounter << endl; MSubModule::Finalize(); } @@ -121,13 +445,6 @@ bool MSubModuleShieldTrigger::ReadXmlConfiguration(MXmlNode* Node) { //! Read the configuration data from an XML node - /* - MXmlNode* SomeTagNode = Node->GetNode("SomeTag"); - if (SomeTagNode != 0) { - m_SomeTagValue = SomeTagNode->GetValue(); - } - */ - return true; } @@ -138,14 +455,10 @@ bool MSubModuleShieldTrigger::ReadXmlConfiguration(MXmlNode* Node) MXmlNode* MSubModuleShieldTrigger::CreateXmlConfiguration(MXmlNode* Node) { //! Create an XML node tree from the configuration - - /* - MXmlNode* SomeTagNode = new MXmlNode(Node, "SomeTag", "SomeValue"); - */ return Node; } // MSubModuleShieldTrigger.cxx: the end... -//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// \ No newline at end of file diff --git a/src/MSubModuleStripTrigger.cxx b/src/MSubModuleStripTrigger.cxx index 404d25c8..a0f8f2e5 100644 --- a/src/MSubModuleStripTrigger.cxx +++ b/src/MSubModuleStripTrigger.cxx @@ -1,3 +1,156 @@ +// /* +// * MSubModuleStripTrigger.cxx +// * +// * +// * Copyright (C) by Andreas Zoglauer. +// * All rights reserved. +// * +// * +// * This code implementation is the intellectual property of +// * Andreas Zoglauer. +// * +// * By copying, distributing or modifying the Program (or any work +// * based on the Program) you indicate your acceptance of this statement, +// * and all its terms. +// * +// */ + + +// //////////////////////////////////////////////////////////////////////////////// +// // +// // MSubModuleStripTrigger +// // +// //////////////////////////////////////////////////////////////////////////////// + + +// // Include the header: +// #include "MSubModuleStripTrigger.h" + +// // Standard libs: + +// // ROOT libs: + +// // MEGAlib libs: +// #include "MSubModule.h" + + +// //////////////////////////////////////////////////////////////////////////////// + + +// #ifdef ___CLING___ +// ClassImp(MSubModuleStripTrigger) +// #endif + + +// //////////////////////////////////////////////////////////////////////////////// + + +// MSubModuleStripTrigger::MSubModuleStripTrigger() : MSubModule() +// { +// // Construct an instance of MSubModuleStripTrigger + +// m_Name = "DEE strip trigger module"; + +// m_HasTrigger = false; +// m_HasVeto = false; +// } + + +// //////////////////////////////////////////////////////////////////////////////// + + +// MSubModuleStripTrigger::~MSubModuleStripTrigger() +// { +// // Delete this instance of MSubModuleStripTrigger +// } + + +// //////////////////////////////////////////////////////////////////////////////// + + +// bool MSubModuleStripTrigger::Initialize() +// { +// // Initialize the module + +// return MSubModule::Initialize(); +// } + + +// //////////////////////////////////////////////////////////////////////////////// + + +// void MSubModuleStripTrigger::Clear() +// { +// // Clear for the next event + +// m_HasTrigger = false; +// m_HasVeto = false; + +// MSubModule::Clear(); +// } + + +// //////////////////////////////////////////////////////////////////////////////// + + +// bool MSubModuleStripTrigger::AnalyzeEvent(MReadOutAssembly* Event) +// { +// // Main data analysis routine, which updates the event to a new level + +// m_HasTrigger = true; + +// return true; +// } + + +// //////////////////////////////////////////////////////////////////////////////// + + +// void MSubModuleStripTrigger::Finalize() +// { +// // Finalize the analysis - do all cleanup, i.e., undo Initialize() + +// MSubModule::Finalize(); +// } + + +// //////////////////////////////////////////////////////////////////////////////// + + +// bool MSubModuleStripTrigger::ReadXmlConfiguration(MXmlNode* Node) +// { +// //! Read the configuration data from an XML node + +// /* +// MXmlNode* SomeTagNode = Node->GetNode("SomeTag"); +// if (SomeTagNode != 0) { +// m_SomeTagValue = SomeTagNode->GetValue(); +// } +// */ + +// return true; +// } + + +// //////////////////////////////////////////////////////////////////////////////// + + +// MXmlNode* MSubModuleStripTrigger::CreateXmlConfiguration(MXmlNode* Node) +// { +// //! Create an XML node tree from the configuration + +// /* +// MXmlNode* SomeTagNode = new MXmlNode(Node, "SomeTag", "SomeValue"); +// */ + +// return Node; +// } + + +// // MSubModuleStripTrigger.cxx: the end... +// //////////////////////////////////////////////////////////////////////////////// + + /* * MSubModuleStripTrigger.cxx * @@ -27,11 +180,13 @@ #include "MSubModuleStripTrigger.h" // Standard libs: +#include // ROOT libs: // MEGAlib libs: #include "MSubModule.h" +#include "MParser.h" //////////////////////////////////////////////////////////////////////////////// @@ -51,8 +206,29 @@ MSubModuleStripTrigger::MSubModuleStripTrigger() : MSubModule() m_Name = "DEE strip trigger module"; + m_EventTime = 0.0; m_HasTrigger = false; m_HasVeto = false; + m_IsGeDDead = false; + + // Initialize deadtime parameters + m_StripCoincidenceWindow = 0.0; + m_ASICDeadTimePerChannel = 0.0; + m_StripDelayAfter1 = 0.0; + m_StripDelayAfter2 = 0.0; + m_StripDelayAfter = 0.0; + + m_StripsCurrentDeadtime = 0.0; + m_ASICLastHitTime = -10.0; + m_StripsTotalDeadtime = 0.0; + m_StripHitsErased = 0; + + // Initialize vectors + m_ASICDeadTime = vector>(nDets, vector(nASICs, 0.0)); + m_ASICHitStripID = vector>>(nDets, vector>(nASICs)); + m_ASICHitStripID_noDT = vector>>(nDets, vector>(nASICs)); + m_TempEvtTimes = vector>>(nDets, vector>(nASICs)); + m_TriggerRates = vector(nDets, 0); } @@ -72,6 +248,18 @@ bool MSubModuleStripTrigger::Initialize() { // Initialize the module + // Read deadtime parameters from file + if (m_DeadtimeFileName != "" && ParseDeadtimeFile() == false) { + return false; + } + + // Set deadtime parameters + m_StripCoincidenceWindow = m_StripCoincidenceWindowFromFile; + m_ASICDeadTimePerChannel = m_ASICDeadTimePerChannelFromFile; + m_StripDelayAfter1 = m_StripDelayAfter1FromFile; + m_StripDelayAfter2 = m_StripDelayAfter2FromFile; + m_StripDelayAfter = m_StripDelayAfter1 + m_StripDelayAfter2; + return MSubModule::Initialize(); } @@ -93,10 +281,159 @@ void MSubModuleStripTrigger::Clear() //////////////////////////////////////////////////////////////////////////////// -bool MSubModuleStripTrigger::AnalyzeEvent(MReadOutAssembly* Event) +double MSubModuleStripTrigger::dTimeASICs(vector ASICChannels) { - // Main data analysis routine, which updates the event to a new level + // Calculate deadtime for GeD ASICs + double deadtime = 0; + int countUnique = 0; + + if (ASICChannels.empty()) { + return 0.0; + } + unordered_set ASICChannelsSet; + + // Sort ASICChannels to process channels in ascending order + sort(ASICChannels.begin(), ASICChannels.end()); + + // Loop through each channel ID in the sorted list + for (int ID : ASICChannels) { + if (ID == 64) { + cout << "Strip ID is 64; should not happen" << endl; + continue; + } else if (ID == 0 || ID == 32) { + // Edge case: If ID is 0 or 32, add the channel and the next channel + ASICChannelsSet.insert(ID); + ASICChannelsSet.insert(ID + 1); + } else if (ID == 31 || ID == 63) { + // Edge case: If ID is 31 or 63, add the previous channel and the channel itself + ASICChannelsSet.insert(ID - 1); + ASICChannelsSet.insert(ID); + } else { + // General case: Add the previous channel, the channel itself, and the next channel + ASICChannelsSet.insert(ID - 1); + ASICChannelsSet.insert(ID); + ASICChannelsSet.insert(ID + 1); + } + } + + // Count the number of unique channels read out + countUnique = ASICChannelsSet.size(); + + // Calculate the total deadtime based on unique channels + deadtime = m_StripCoincidenceWindow + (m_ASICDeadTimePerChannel * countUnique) + m_StripDelayAfter; + + return deadtime; +} + + +//////////////////////////////////////////////////////////////////////////////// + + +bool MSubModuleStripTrigger::CountRate(vector ASICChannels, vector CountTime) +{ + // Helper function for getting count rate (including nearest neighbor) + + if (ASICChannels.empty()) { + return false; + } + + unordered_set ASICChannelsSet; + vector CountTimeVec; + + // Sort ASICChannels to process channels in ascending order + sort(ASICChannels.begin(), ASICChannels.end()); + + // Loop through each channel ID + for (size_t i = 0; i < ASICChannels.size(); i++) { + int ID = ASICChannels[i]; + int temp_size = ASICChannelsSet.size(); + + if (ID == 64) { + cout << "Strip ID is 64; should not happen" << endl; + continue; + } else if (ID == 0 || ID == 32) { + ASICChannelsSet.insert(ID); + ASICChannelsSet.insert(ID + 1); + } else if (ID == 31 || ID == 63) { + ASICChannelsSet.insert(ID - 1); + ASICChannelsSet.insert(ID); + } else { + ASICChannelsSet.insert(ID - 1); + ASICChannelsSet.insert(ID); + ASICChannelsSet.insert(ID + 1); + } + + int new_size = ASICChannelsSet.size(); + for (size_t j = 0; j < (new_size - temp_size); j++) { + CountTimeVec.push_back(CountTime[i]); + } + } + + int h = 0; + for (int k : ASICChannelsSet) { + m_EventStripIDs.push_back(k); + m_EventTimes.push_back(CountTimeVec[h]); + h++; + } + + return true; +} + + +//////////////////////////////////////////////////////////////////////////////// + + +void MSubModuleStripTrigger::UpdateDeadtime(int det, int ASIC, vector stripIDs, bool isFirstHitAfterDead) +{ + // Update deadtime tracking for a detector/ASIC + + if (det < 0 || det >= nDets || ASIC < 0 || ASIC >= nASICs) { + return; + } + + if (isFirstHitAfterDead) { + // Clear the lists after deadtime period + for (int d = 0; d < nDets; d++) { + for (int a = 0; a < nASICs; a++) { + CountRate(m_ASICHitStripID[d][a], m_TempEvtTimes[d][a]); + m_ASICHitStripID_noDT[d][a].clear(); + m_ASICHitStripID[d][a].clear(); + m_TempEvtTimes[d][a].clear(); + } + } + + m_StripsTotalDeadtime += m_StripsCurrentDeadtime; + m_StripsCurrentDeadtime = 0.0; + m_ASICLastHitTime = m_EventTime; + } + + // Add strip IDs to tracking vectors + for (int stripID : stripIDs) { + m_ASICHitStripID[det][ASIC].push_back(stripID); + m_ASICHitStripID_noDT[det][ASIC].push_back(stripID); + m_TempEvtTimes[det][ASIC].push_back(m_EventTime); + } + + // Calculate new deadtime + if (!m_IsGeDDead) { + double newDeadtime = dTimeASICs(m_ASICHitStripID[det][ASIC]); + if (newDeadtime > m_StripsCurrentDeadtime) { + m_StripsCurrentDeadtime = newDeadtime; + } + } +} + + +//////////////////////////////////////////////////////////////////////////////// + + +bool MSubModuleStripTrigger::AnalyzeEvent(MReadOutAssembly* Event) +{ + // Main data analysis routine for strip trigger + + // For now, we just set the trigger flag to true + // More complex logic will be implemented when integrating with DEE m_HasTrigger = true; return true; @@ -108,7 +445,23 @@ bool MSubModuleStripTrigger::AnalyzeEvent(MReadOutAssembly* Event) void MSubModuleStripTrigger::Finalize() { - // Finalize the analysis - do all cleanup, i.e., undo Initialize() + // Finalize the analysis + + cout << "###################" << endl + << "STRIP TRIGGER MODULE STATISTICS" << endl + << "###################" << endl; + + cout << "Total dead time of the instrument: " << m_StripsTotalDeadtime << endl; + cout << "Hits erased due to detector being dead: " << m_StripHitsErased << endl; + + if (m_StripsTotalDeadtime > 0) { + cout << "Avg deadtime per strip hit: " << m_StripsTotalDeadtime << endl; + } + + cout << "Trigger rates (events per detector):" << endl; + for (int i = 0; i < nDets; i++) { + cout << " Detector " << i << ": " << m_TriggerRates[i] << endl; + } MSubModule::Finalize(); } @@ -117,16 +470,41 @@ void MSubModuleStripTrigger::Finalize() //////////////////////////////////////////////////////////////////////////////// +bool MSubModuleStripTrigger::ParseDeadtimeFile() +{ + // Read in deadtime parameters file + + MParser Parser; + if (Parser.Open(m_DeadtimeFileName) == false) { + cout << "Unable to open deadtime parameters file: " << m_DeadtimeFileName << endl; + return false; + } + + if (Parser.GetNLines() < 2) { + cout << "Deadtime file does not have enough data" << endl; + return false; + } + + m_StripCoincidenceWindowFromFile = Parser.GetTokenizerAt(1)->GetTokenAtAsDouble(0); + m_ASICDeadTimePerChannelFromFile = Parser.GetTokenizerAt(1)->GetTokenAtAsDouble(1); + m_StripDelayAfter1FromFile = Parser.GetTokenizerAt(1)->GetTokenAtAsDouble(2); + m_StripDelayAfter2FromFile = Parser.GetTokenizerAt(1)->GetTokenAtAsDouble(3); + + return true; +} + + +//////////////////////////////////////////////////////////////////////////////// + + bool MSubModuleStripTrigger::ReadXmlConfiguration(MXmlNode* Node) { //! Read the configuration data from an XML node - /* - MXmlNode* SomeTagNode = Node->GetNode("SomeTag"); - if (SomeTagNode != 0) { - m_SomeTagValue = SomeTagNode->GetValue(); + MXmlNode* DeadtimeFileNode = Node->GetNode("DeadtimeFileName"); + if (DeadtimeFileNode != 0) { + m_DeadtimeFileName = DeadtimeFileNode->GetValue(); } - */ return true; } @@ -139,13 +517,11 @@ MXmlNode* MSubModuleStripTrigger::CreateXmlConfiguration(MXmlNode* Node) { //! Create an XML node tree from the configuration - /* - MXmlNode* SomeTagNode = new MXmlNode(Node, "SomeTag", "SomeValue"); - */ - + MXmlNode* DeadtimeFileNode = new MXmlNode(Node, "DeadtimeFileName", m_DeadtimeFileName); return Node; + } // MSubModuleStripTrigger.cxx: the end... -//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// \ No newline at end of file From 840ef7e3716b7778815e9d05784bcb7426a2b298 Mon Sep 17 00:00:00 2001 From: parshadkp <111451184+parshadkp@users.noreply.github.com> Date: Mon, 22 Dec 2025 20:38:19 -0500 Subject: [PATCH 06/10] Working Code. Need to update m_ShieldPanelGroups for future and test the deadtime. --- Config/Nuclearizer_EM_DEE.cfg | 4 +- include/MSubModuleShieldTrigger.h | 198 +- include/MSubModuleStripTrigger.h | 177 +- .../COSI_SingleDet/ACS_correction_file.txt | 6247 ----------------- .../ShieldEnergyCorrection.csv | 0 src/MModuleDEESMEX.cxx | 8 +- src/MSubModuleShieldTrigger.cxx | 428 +- src/MSubModuleStripTrigger.cxx | 434 +- 8 files changed, 522 insertions(+), 6974 deletions(-) delete mode 100644 resource/calibration/COSI_SingleDet/ACS_correction_file.txt rename resource/{dee => calibration/COSI_SingleDet}/ShieldEnergyCorrection.csv (100%) diff --git a/Config/Nuclearizer_EM_DEE.cfg b/Config/Nuclearizer_EM_DEE.cfg index f69b1e91..eb87220d 100644 --- a/Config/Nuclearizer_EM_DEE.cfg +++ b/Config/Nuclearizer_EM_DEE.cfg @@ -50,8 +50,10 @@ - /Users/parshadkp/Software/nuclearizer_parshad_fork/resource/calibration/COSI_SingleDet/ACS_correction_file.txt + /Users/parshadkp/Software/nuclearizer_parshad_fork/resource/calibration/COSI_SingleDet/ShieldEnergyCorrection.csv + /Users/parshadkp/Software/nuclearizer_parshad_fork/resource/calibration/COSI_SingleDet/deadtimeParameters.txt /Users/parshadkp/Software/nuclearizer_parshad_fork/resource/calibration/COSI_SingleDet/20240819_Am241_Cs137_Co57_LV.ecal + /Users/parshadkp/Software/nuclearizer_parshad_fork/resource/calibration/COSI_SingleDet/deadtimeParameters.txt 0 diff --git a/include/MSubModuleShieldTrigger.h b/include/MSubModuleShieldTrigger.h index 2686ba6c..6f33f5c8 100644 --- a/include/MSubModuleShieldTrigger.h +++ b/include/MSubModuleShieldTrigger.h @@ -1,130 +1,3 @@ -// /* -// * MSubModuleShieldTrigger.h -// * -// * Copyright (C) by Andreas Zoglauer. -// * All rights reserved. -// * -// * Please see the source-file for the copyright-notice. -// * -// */ - - -// #ifndef __MSubModuleShieldTrigger__ -// #define __MSubModuleShieldTrigger__ - - -// //////////////////////////////////////////////////////////////////////////////// - - -// // Standard libs: - -// // ROOT libs: - -// // MEGAlib libs: -// #include "MGlobal.h" -// #include "MSubModule.h" - -// // Forward declarations: - - -// //////////////////////////////////////////////////////////////////////////////// - - -// class MSubModuleShieldTrigger : public MSubModule -// { -// // public interface: -// public: -// //! Default constructor -// MSubModuleShieldTrigger(); - -// //! No copy constructor -// MSubModuleShieldTrigger(const MSubModuleShieldTrigger&) = delete; -// //! No copy assignment -// MSubModuleShieldTrigger& operator=(const MSubModuleShieldTrigger&) = delete; -// //! No move constructors -// MSubModuleShieldTrigger(MSubModuleShieldTrigger&&) = delete; -// //! No move operators -// MSubModuleShieldTrigger& operator=(MSubModuleShieldTrigger&&) = delete; - -// //! Set shield energy correction file name -// void SetDeadtimeFileName(const MString& FileName) -// { -// m_DeadtimeFileName = FileName; -// } -// //! Get shield energy correction file name -// MString GetDeadtimeFileName() const -// { -// return m_DeadtimeFileName; -// } - -// //! Default destructor -// virtual ~MSubModuleShieldTrigger(); - -// //! Initialize the module -// virtual bool Initialize(); - -// //! Clear event data from the module -// virtual void Clear(); - -// //! Main data analysis routine, which updates the event to a new level -// virtual bool AnalyzeEvent(MReadOutAssembly* Event); - -// //! Return true if we have a trigger - filled after AnalyzeEvent -// bool HasTrigger() const { return m_HasTrigger; } - -// //! Return true if we have a veto - filled after AnalyzeEvent -// bool HasVeto() const { return m_HasVeto; } - -// //! Return the time when the dead time ends - filled after AnalyzeEvent -// MTime GetDeadTimeEnd() const { return m_DeadTimeEnd; } - -// //! Finalize the module -// virtual void Finalize(); - -// //! Read the configuration data from an XML node -// virtual bool ReadXmlConfiguration(MXmlNode* Node); -// //! Create an XML node tree from the configuration -// virtual MXmlNode* CreateXmlConfiguration(MXmlNode* Node); - -// // protected methods: -// protected: - -// // private methods: -// private: - - - -// // protected members: -// protected: -// //! Shield energy correction file name -// MString m_DeadtimeFileName; - -// // private members: -// private: -// //! Flag indicating that a trigger has been raised -// bool m_HasTrigger; - -// //! Flag indicating that a veto has been raised -// bool m_HasVeto; - -// //! Time when the shield dead time ends -// MTime m_DeadTimeEnd; - - - -// #ifdef ___CLING___ -// public: -// ClassDef(MSubModuleShieldTrigger, 0) // no description -// #endif - -// }; - -// #endif - - -// //////////////////////////////////////////////////////////////////////////////// - - /* * MSubModuleShieldTrigger.h * @@ -145,6 +18,7 @@ // Standard libs: #include +#include using namespace std; // ROOT libs: @@ -157,6 +31,9 @@ using namespace std; #include "MDVolumeSequence.h" #include "MDDetector.h" +// Nuclearizer libs: +#include "MDEECrystalHit.h" + // Forward declarations: @@ -179,6 +56,16 @@ class MSubModuleShieldTrigger : public MSubModule //! No move operators MSubModuleShieldTrigger& operator=(MSubModuleShieldTrigger&&) = delete; + //! Set deadtime parameters file name + void SetDeadtimeFileName(const MString& FileName) + { + m_DeadtimeFileName = FileName; + } + //! Get deadtime parameters file name + MString GetDeadtimeFileName() const + { + return m_DeadtimeFileName; + } //! Default destructor virtual ~MSubModuleShieldTrigger(); @@ -192,9 +79,6 @@ class MSubModuleShieldTrigger : public MSubModule //! Main data analysis routine virtual bool AnalyzeEvent(MReadOutAssembly* Event); - //! Set the Simulation Event (Required for checking BGO hits) - void SetSimEvent(MSimEvent* Event) { m_SimEvent = Event; } - //! Return true if we have a trigger - filled after AnalyzeEvent bool HasTrigger() const { return m_HasTrigger; } @@ -204,6 +88,24 @@ class MSubModuleShieldTrigger : public MSubModule //! Return the time when the dead time ends - filled after AnalyzeEvent MTime GetDeadTimeEnd() const { return m_DeadTimeEnd; } + //! Get total shield deadtime for a panel + double GetTotalShieldDeadtime(int panel) const { + if (panel >= 0 && panel < nShieldPanels) return m_TotalShieldDeadtime[panel]; + return 0.0; + } + + //! Get shield hit counts + int GetShieldHitCounts() const { return m_NumShieldHitCounts; } + + //! Get shield veto counter + int GetShieldVetoCounter() const { return m_ShieldVetoCounter; } + + //! Get BGO hits erased + int GetBGOHitsErased() const { return m_NumBGOHitsErased; } + + //! Check if shield is currently dead + bool IsShieldDead() const { return m_IsShieldDead; } + //! Finalize the module virtual void Finalize(); @@ -211,10 +113,25 @@ class MSubModuleShieldTrigger : public MSubModule virtual bool ReadXmlConfiguration(MXmlNode* Node); //! Create an XML node tree from the configuration virtual MXmlNode* CreateXmlConfiguration(MXmlNode* Node); + + // protected methods: + protected: + //! Parse deadtime file + bool ParseDeadtimeFile(); + + //! Calculate ASIC deadtime for shield + double CalculateASICDeadtime(vector CrystalIDs); + + //! Process shield hits and determine veto status + bool ProcessShieldHits(MReadOutAssembly* Event); + // private members: private: - //! Pointer to the current simulation event being processed - MSimEvent* m_SimEvent; + //! Deadtime parameters file name + MString m_DeadtimeFileName; + + //! Current event time + double m_EventTime; //! Flag indicating that a trigger has been raised bool m_HasTrigger; @@ -229,6 +146,7 @@ class MSubModuleShieldTrigger : public MSubModule double m_ShieldDelayBefore; double m_ShieldDelayAfter; double m_ShieldVetoWindowSize; + double m_ASICDeadTimePerChannel; // Shield state tracking int m_NumShieldHitCounts; @@ -237,15 +155,27 @@ class MSubModuleShieldTrigger : public MSubModule bool m_IsShieldDead; double m_ShieldVetoTime; + //! First and last event times for statistics + double m_FirstTime; + double m_LastTime; + + //! Number of shield panels static const int nShieldPanels = 6; + vector m_ShieldLastHitTime; vector m_ShieldDeadtime; vector m_TotalShieldDeadtime; //! Group of shield numbers per panel vector> m_ShieldPanelGroups; - //! Shield ID for particular hit - vector> m_ShieldHitID; + //! Shield crystal IDs for particular hits + vector> m_ShieldHitCrystalID; + + //! GeD detectors hit (for deadtime calculation) + vector m_DetectorsHitForShieldVeto; + + //! Number of GeD detectors + static const int nDets = 12; #ifdef ___CLING___ public: diff --git a/include/MSubModuleStripTrigger.h b/include/MSubModuleStripTrigger.h index a01e0704..697d323a 100644 --- a/include/MSubModuleStripTrigger.h +++ b/include/MSubModuleStripTrigger.h @@ -1,130 +1,3 @@ -// /* -// * MSubModuleStripTrigger.h -// * -// * Copyright (C) by Andreas Zoglauer. -// * All rights reserved. -// * -// * Please see the source-file for the copyright-notice. -// * -// */ - - -// #ifndef __MSubModuleStripTrigger__ -// #define __MSubModuleStripTrigger__ - - -// //////////////////////////////////////////////////////////////////////////////// - - -// // Standard libs: - -// // ROOT libs: - -// // MEGAlib libs: -// #include "MGlobal.h" -// #include "MSubModule.h" - -// // Forward declarations: - - -// //////////////////////////////////////////////////////////////////////////////// - - -// class MSubModuleStripTrigger : public MSubModule -// { -// // public interface: -// public: -// //! Default constructor -// MSubModuleStripTrigger(); - -// //! No copy constructor -// MSubModuleStripTrigger(const MSubModuleStripTrigger&) = delete; -// //! No copy assignment -// MSubModuleStripTrigger& operator=(const MSubModuleStripTrigger&) = delete; -// //! No move constructors -// MSubModuleStripTrigger(MSubModuleStripTrigger&&) = delete; -// //! No move operators -// MSubModuleStripTrigger& operator=(MSubModuleStripTrigger&&) = delete; - -// //! Set deadime parameters file name -// void SetDeadtimeFileName(const MString& FileName) -// { -// m_DeadtimeFileName = FileName; -// } -// //! Get deadime parameters file name -// MString GetDeadtimeFileName() const -// { -// return m_DeadtimeFileName; -// } - -// //! Default destructor -// virtual ~MSubModuleStripTrigger(); - -// //! Initialize the module -// virtual bool Initialize(); - -// //! Clear event data from the module -// virtual void Clear(); - -// //! Main data analysis routine, which updates the event to a new level -// virtual bool AnalyzeEvent(MReadOutAssembly* Event); - -// //! Return true if we have a trigger - filled after AnalyzeEvent -// bool HasTrigger() const { return m_HasTrigger; } - -// //! Return true if we have a veto - filled after AnalyzeEvent -// bool HasVeto() const { return m_HasVeto; } - -// //! Return the time when the dead time ends - filled after AnalyzeEvent -// MTime GetDeadTimeEnd() const { return m_DeadTimeEnd; } - -// //! Finalize the module -// virtual void Finalize(); - -// //! Read the configuration data from an XML node -// virtual bool ReadXmlConfiguration(MXmlNode* Node); -// //! Create an XML node tree from the configuration -// virtual MXmlNode* CreateXmlConfiguration(MXmlNode* Node); - -// // protected methods: -// protected: - -// // private methods: -// private: - - - -// // protected members: -// protected: -// //! Deadtime parameters file name -// MString m_DeadtimeFileName; - -// // private members: -// private: -// //! Flag indicating that a trigger has been raised -// bool m_HasTrigger; - -// //! Flag indicating that a veto has been raised -// bool m_HasVeto; - -// //! Time when the shield dead time ends -// MTime m_DeadTimeEnd; - - - -// #ifdef ___CLING___ -// public: -// ClassDef(MSubModuleStripTrigger, 0) // no description -// #endif - -// }; - -// #endif - - -// //////////////////////////////////////////////////////////////////////////////// - - /* * MSubModuleStripTrigger.h * @@ -146,6 +19,7 @@ // Standard libs: #include #include +#include using namespace std; // ROOT libs: @@ -154,6 +28,9 @@ using namespace std; #include "MGlobal.h" #include "MSubModule.h" +// Nuclearizer libs: +#include "MDEEStripHit.h" + // Forward declarations: @@ -199,9 +76,6 @@ class MSubModuleStripTrigger : public MSubModule //! Main data analysis routine, which updates the event to a new level virtual bool AnalyzeEvent(MReadOutAssembly* Event); - //! Set the event time for deadtime calculations - void SetEventTime(double Time) { m_EventTime = Time; } - //! Return true if we have a trigger - filled after AnalyzeEvent bool HasTrigger() const { return m_HasTrigger; } @@ -217,32 +91,15 @@ class MSubModuleStripTrigger : public MSubModule //! Get total strips deadtime double GetStripsTotalDeadtime() const { return m_StripsTotalDeadtime; } - //! Get current strips deadtime - double GetStripsCurrentDeadtime() const { return m_StripsCurrentDeadtime; } - //! Get number of strip hits erased int GetStripHitsErased() const { return m_StripHitsErased; } - //! Get trigger rates for detector + //! Get trigger rate for detector int GetTriggerRate(int det) const { if (det >= 0 && det < nDets) return m_TriggerRates[det]; return 0; } - //! Increment trigger rate for detector - void IncrementTriggerRate(int det) { - if (det >= 0 && det < nDets) m_TriggerRates[det]++; - } - - //! Update deadtime tracking - void UpdateDeadtime(int det, int ASIC, vector stripIDs, bool isFirstHitAfterDead); - - //! Calculate GeD deadtime - double dTimeASICs(vector ASICChannels); - - //! Helper function for getting count rate - bool CountRate(vector ASICChannels, vector CountTime); - //! Finalize the module virtual void Finalize(); @@ -256,6 +113,18 @@ class MSubModuleStripTrigger : public MSubModule //! Parse deadtime file bool ParseDeadtimeFile(); + //! Calculate GeD ASIC deadtime + double CalculateASICDeadtime(vector ASICChannels); + + //! Process strip hits for deadtime and trigger determination + bool ProcessStripHits(MReadOutAssembly* Event); + + //! Helper function for getting count rate (including nearest neighbor) + bool CountRate(vector ASICChannels, vector CountTime); + + //! Check if at least one strip exists on each side of each detector + bool CheckTriggerConditions(MReadOutAssembly* Event); + // protected members: protected: //! Deadtime parameters file name @@ -298,10 +167,16 @@ class MSubModuleStripTrigger : public MSubModule double m_StripsTotalDeadtime; //! Hits erased due to deadtime int m_StripHitsErased; + //! Total strip hits counter + int m_TotalStripHitsCounter; + + //! First and last event times + double m_FirstTime; + double m_LastTime; //! Number of detectors - static const int nDets = 1; - //! Number of ASICs for 1 det + static const int nDets = 12; + //! Number of ASICs per detector static const int nASICs = 4; //! Stores dead time for each ASIC @@ -310,7 +185,7 @@ class MSubModuleStripTrigger : public MSubModule vector>> m_ASICHitStripID; //! Helper Strip ID vector to count for hits without deadtime vector>> m_ASICHitStripID_noDT; - //! Strip ID for particular hit in ASIC + //! Event times for particular hit in ASIC vector>> m_TempEvtTimes; //! Stores trigger rates (number of events) for each detector diff --git a/resource/calibration/COSI_SingleDet/ACS_correction_file.txt b/resource/calibration/COSI_SingleDet/ACS_correction_file.txt deleted file mode 100644 index f69c0ee3..00000000 --- a/resource/calibration/COSI_SingleDet/ACS_correction_file.txt +++ /dev/null @@ -1,6247 +0,0 @@ -# DetectorName voxel_X voxel_Y voxel_Z x[mm] y[mm] m q a b c -BGO_X0_0 0 0 18 -91.89 -54.08 1.00 2.17 27.47 2.19 0.07 -BGO_X0_0 0 0 17 -81.68 -54.08 1.00 2.43 16.38 2.72 0.00 -BGO_X0_0 0 0 16 -71.47 -54.08 0.99 3.87 19.87 2.78 0.00 -BGO_X0_0 0 0 15 -61.26 -54.08 1.06 -5.15 37.47 0.00 0.11 -BGO_X0_0 0 0 14 -51.05 -54.08 1.00 3.13 23.31 2.61 0.00 -BGO_X0_0 0 0 13 -40.84 -54.08 0.99 4.25 21.20 2.78 0.00 -BGO_X0_0 0 0 12 -30.63 -54.08 1.00 1.58 24.37 2.13 0.08 -BGO_X0_0 0 0 11 -20.42 -54.08 1.00 2.07 22.98 2.86 0.00 -BGO_X0_0 0 0 10 -10.21 -54.08 0.97 4.57 18.89 2.88 0.00 -BGO_X0_0 0 0 9 0.00 -54.08 1.00 1.55 27.46 2.48 0.00 -BGO_X0_0 0 0 8 10.21 -54.08 0.98 3.14 22.61 2.63 0.00 -BGO_X0_0 0 0 7 20.42 -54.08 0.95 3.81 16.63 2.72 0.00 -BGO_X0_0 0 0 6 30.63 -54.08 0.95 3.41 24.89 2.66 0.00 -BGO_X0_0 0 0 5 40.84 -54.08 0.94 2.12 24.16 2.35 0.05 -BGO_X0_0 0 0 4 51.05 -54.08 0.95 1.83 25.30 2.42 0.04 -BGO_X0_0 0 0 3 61.26 -54.08 0.95 1.71 23.72 2.65 0.00 -BGO_X0_0 0 0 2 71.47 -54.08 0.95 1.80 19.55 2.81 0.00 -BGO_X0_0 0 0 1 81.68 -54.08 0.93 4.14 24.07 2.46 0.05 -BGO_X0_0 0 0 0 91.89 -54.08 0.95 2.60 16.28 2.91 0.00 -BGO_X0_0 0 1 18 -91.89 -44.25 1.00 3.96 24.36 2.67 0.00 -BGO_X0_0 0 1 17 -81.68 -44.25 1.00 2.32 25.39 2.47 0.00 -BGO_X0_0 0 1 16 -71.47 -44.25 1.01 1.80 19.19 2.95 0.00 -BGO_X0_0 0 1 15 -61.26 -44.25 1.00 2.25 18.34 2.85 0.00 -BGO_X0_0 0 1 14 -51.05 -44.25 0.99 4.80 22.42 2.65 0.00 -BGO_X0_0 0 1 13 -40.84 -44.25 1.02 -0.80 16.27 3.01 0.00 -BGO_X0_0 0 1 12 -30.63 -44.25 1.01 0.79 22.96 2.64 0.00 -BGO_X0_0 0 1 11 -20.42 -44.25 1.00 1.24 22.01 2.73 0.00 -BGO_X0_0 0 1 10 -10.21 -44.25 0.99 3.14 25.39 2.47 0.04 -BGO_X0_0 0 1 9 0.00 -44.25 0.97 5.67 21.98 2.65 0.00 -BGO_X0_0 0 1 8 10.21 -44.25 0.96 5.35 23.22 2.67 0.02 -BGO_X0_0 0 1 7 20.42 -44.25 0.99 -0.82 22.29 2.71 0.00 -BGO_X0_0 0 1 6 30.63 -44.25 0.95 5.61 21.18 2.67 0.00 -BGO_X0_0 0 1 5 40.84 -44.25 0.97 2.23 20.13 2.70 0.00 -BGO_X0_0 0 1 4 51.05 -44.25 0.95 1.44 24.43 2.70 0.00 -BGO_X0_0 0 1 3 61.26 -44.25 0.93 4.34 22.98 2.72 0.00 -BGO_X0_0 0 1 2 71.47 -44.25 0.95 2.44 23.97 2.77 0.00 -BGO_X0_0 0 1 1 81.68 -44.25 0.95 3.32 24.00 2.68 0.00 -BGO_X0_0 0 1 0 91.89 -44.25 0.94 3.13 17.71 2.88 0.00 -BGO_X0_0 0 2 18 -91.89 -34.42 0.98 6.64 35.87 0.32 0.10 -BGO_X0_0 0 2 17 -81.68 -34.42 1.00 3.27 22.93 2.72 0.00 -BGO_X0_0 0 2 16 -71.47 -34.42 0.99 1.43 25.31 2.67 0.00 -BGO_X0_0 0 2 15 -61.26 -34.42 1.00 1.98 21.92 2.72 0.00 -BGO_X0_0 0 2 14 -51.05 -34.42 0.99 2.49 25.38 2.67 0.00 -BGO_X0_0 0 2 13 -40.84 -34.42 1.00 2.67 20.17 2.59 0.04 -BGO_X0_0 0 2 12 -30.63 -34.42 0.99 3.94 20.80 2.69 0.01 -BGO_X0_0 0 2 11 -20.42 -34.42 1.00 1.79 23.08 2.64 0.00 -BGO_X0_0 0 2 10 -10.21 -34.42 0.99 3.54 21.15 2.69 0.00 -BGO_X0_0 0 2 9 0.00 -34.42 1.00 2.97 19.56 2.68 0.00 -BGO_X0_0 0 2 8 10.21 -34.42 0.99 0.82 27.75 2.49 0.02 -BGO_X0_0 0 2 7 20.42 -34.42 0.99 1.90 18.79 2.83 0.00 -BGO_X0_0 0 2 6 30.63 -34.42 1.00 0.78 21.49 2.65 0.00 -BGO_X0_0 0 2 5 40.84 -34.42 0.98 3.88 23.63 2.40 0.04 -BGO_X0_0 0 2 4 51.05 -34.42 0.98 2.10 19.91 2.95 0.00 -BGO_X0_0 0 2 3 61.26 -34.42 0.94 3.20 22.43 2.66 0.00 -BGO_X0_0 0 2 2 71.47 -34.42 0.95 0.86 23.01 2.56 0.00 -BGO_X0_0 0 2 1 81.68 -34.42 0.96 -0.52 27.31 2.40 0.04 -BGO_X0_0 0 2 0 91.89 -34.42 0.95 1.97 23.15 2.75 0.00 -BGO_X0_0 0 3 18 -91.89 -24.58 1.02 -0.68 27.00 2.76 0.00 -BGO_X0_0 0 3 17 -81.68 -24.58 0.99 3.81 21.49 2.75 0.00 -BGO_X0_0 0 3 16 -71.47 -24.58 1.01 1.51 14.78 3.04 0.00 -BGO_X0_0 0 3 15 -61.26 -24.58 1.00 2.77 21.24 2.65 0.00 -BGO_X0_0 0 3 14 -51.05 -24.58 0.98 4.55 26.29 2.26 0.08 -BGO_X0_0 0 3 13 -40.84 -24.58 0.99 3.99 16.66 3.01 0.00 -BGO_X0_0 0 3 12 -30.63 -24.58 1.00 2.71 22.63 2.78 0.00 -BGO_X0_0 0 3 11 -20.42 -24.58 1.01 1.60 22.53 2.65 0.00 -BGO_X0_0 0 3 10 -10.21 -24.58 1.00 2.54 21.92 2.61 0.00 -BGO_X0_0 0 3 9 0.00 -24.58 0.98 4.18 19.75 2.89 0.00 -BGO_X0_0 0 3 8 10.21 -24.58 0.99 5.25 26.22 2.31 0.05 -BGO_X0_0 0 3 7 20.42 -24.58 1.02 1.31 26.61 2.68 0.00 -BGO_X0_0 0 3 6 30.63 -24.58 1.01 4.77 25.72 2.59 0.00 -BGO_X0_0 0 3 5 40.84 -24.58 1.02 2.53 22.06 2.74 0.00 -BGO_X0_0 0 3 4 51.05 -24.58 1.02 1.18 22.70 2.60 0.02 -BGO_X0_0 0 3 3 61.26 -24.58 1.03 -1.14 28.64 2.18 0.07 -BGO_X0_0 0 3 2 71.47 -24.58 0.96 3.86 18.73 2.98 0.00 -BGO_X0_0 0 3 1 81.68 -24.58 0.95 -1.23 25.46 2.70 0.00 -BGO_X0_0 0 3 0 91.89 -24.58 0.92 4.73 18.40 2.71 0.00 -BGO_X0_0 0 4 18 -91.89 -14.75 0.99 3.62 19.21 2.89 0.00 -BGO_X0_0 0 4 17 -81.68 -14.75 1.00 1.70 25.76 2.58 0.03 -BGO_X0_0 0 4 16 -71.47 -14.75 1.01 1.47 29.56 2.07 0.06 -BGO_X0_0 0 4 15 -61.26 -14.75 1.00 2.12 19.68 2.88 0.00 -BGO_X0_0 0 4 14 -51.05 -14.75 1.00 2.88 28.98 2.22 0.04 -BGO_X0_0 0 4 13 -40.84 -14.75 1.02 -0.16 23.89 2.62 0.00 -BGO_X0_0 0 4 12 -30.63 -14.75 1.00 3.10 25.43 2.53 0.00 -BGO_X0_0 0 4 11 -20.42 -14.75 0.98 5.12 23.40 2.79 0.00 -BGO_X0_0 0 4 10 -10.21 -14.75 1.01 2.53 24.41 2.76 0.00 -BGO_X0_0 0 4 9 0.00 -14.75 1.01 2.76 22.34 2.77 0.03 -BGO_X0_0 0 4 8 10.21 -14.75 1.00 4.37 23.43 2.96 0.00 -BGO_X0_0 0 4 7 20.42 -14.75 1.03 1.41 20.35 2.84 0.00 -BGO_X0_0 0 4 6 30.63 -14.75 1.03 2.30 19.85 2.89 0.00 -BGO_X0_0 0 4 5 40.84 -14.75 1.06 0.17 26.75 2.30 0.08 -BGO_X0_0 0 4 4 51.05 -14.75 1.05 3.29 16.88 3.21 0.00 -BGO_X0_0 0 4 3 61.26 -14.75 1.07 0.87 26.14 2.16 0.11 -BGO_X0_0 0 4 2 71.47 -14.75 1.06 2.16 17.18 3.45 0.06 -BGO_X0_0 0 4 1 81.68 -14.75 1.02 2.63 23.16 3.76 0.05 -BGO_X0_0 0 4 0 91.89 -14.75 0.93 3.35 15.87 3.21 0.00 -BGO_X0_0 0 5 18 -91.89 -4.92 0.99 2.76 22.78 2.68 0.00 -BGO_X0_0 0 5 17 -81.68 -4.92 1.00 2.38 24.10 2.49 0.03 -BGO_X0_0 0 5 16 -71.47 -4.92 0.98 3.99 23.95 2.65 0.00 -BGO_X0_0 0 5 15 -61.26 -4.92 0.99 3.74 25.25 2.23 0.05 -BGO_X0_0 0 5 14 -51.05 -4.92 1.01 0.91 20.65 2.78 0.00 -BGO_X0_0 0 5 13 -40.84 -4.92 0.99 3.65 22.16 2.65 0.00 -BGO_X0_0 0 5 12 -30.63 -4.92 1.01 0.08 24.77 2.69 0.00 -BGO_X0_0 0 5 11 -20.42 -4.92 1.01 0.74 18.36 2.85 0.00 -BGO_X0_0 0 5 10 -10.21 -4.92 0.99 5.34 23.36 2.70 0.00 -BGO_X0_0 0 5 9 0.00 -4.92 1.01 2.99 20.83 2.82 0.00 -BGO_X0_0 0 5 8 10.21 -4.92 1.01 4.86 20.78 2.93 0.00 -BGO_X0_0 0 5 7 20.42 -4.92 1.03 4.37 27.58 2.23 0.07 -BGO_X0_0 0 5 6 30.63 -4.92 1.04 3.11 22.64 2.90 0.00 -BGO_X0_0 0 5 5 40.84 -4.92 1.06 2.64 23.39 2.85 0.00 -BGO_X0_0 0 5 4 51.05 -4.92 1.09 2.42 15.99 3.16 0.00 -BGO_X0_0 0 5 3 61.26 -4.92 1.10 2.91 19.07 3.30 0.07 -BGO_X0_0 0 5 2 71.47 -4.92 1.17 -0.86 26.47 2.09 0.15 -BGO_X0_0 0 5 1 81.68 -4.92 1.22 1.14 31.73 1.85 0.19 -BGO_X0_0 0 5 0 91.89 -4.92 1.21 1.22 27.15 3.88 0.42 -BGO_X0_0 0 6 18 -91.89 4.92 0.99 2.76 22.78 2.68 0.00 -BGO_X0_0 0 6 17 -81.68 4.92 1.00 2.38 24.10 2.49 0.03 -BGO_X0_0 0 6 16 -71.47 4.92 0.98 3.99 23.95 2.65 0.00 -BGO_X0_0 0 6 15 -61.26 4.92 0.99 3.74 25.25 2.23 0.05 -BGO_X0_0 0 6 14 -51.05 4.92 1.01 0.91 20.65 2.78 0.00 -BGO_X0_0 0 6 13 -40.84 4.92 0.99 3.65 22.16 2.65 0.00 -BGO_X0_0 0 6 12 -30.63 4.92 1.01 0.08 24.77 2.69 0.00 -BGO_X0_0 0 6 11 -20.42 4.92 1.01 0.74 18.36 2.85 0.00 -BGO_X0_0 0 6 10 -10.21 4.92 0.99 5.34 23.36 2.70 0.00 -BGO_X0_0 0 6 9 0.00 4.92 1.01 2.99 20.83 2.82 0.00 -BGO_X0_0 0 6 8 10.21 4.92 1.01 4.86 20.78 2.93 0.00 -BGO_X0_0 0 6 7 20.42 4.92 1.03 4.37 27.58 2.23 0.07 -BGO_X0_0 0 6 6 30.63 4.92 1.04 3.11 22.64 2.90 0.00 -BGO_X0_0 0 6 5 40.84 4.92 1.06 2.64 23.39 2.85 0.00 -BGO_X0_0 0 6 4 51.05 4.92 1.09 2.42 15.99 3.16 0.00 -BGO_X0_0 0 6 3 61.26 4.92 1.10 2.91 19.07 3.30 0.07 -BGO_X0_0 0 6 2 71.47 4.92 1.17 -0.86 26.47 2.09 0.15 -BGO_X0_0 0 6 1 81.68 4.92 1.22 1.14 31.73 1.85 0.19 -BGO_X0_0 0 6 0 91.89 4.92 1.21 1.22 27.15 3.88 0.42 -BGO_X0_0 0 7 18 -91.89 14.75 0.99 3.62 19.21 2.89 0.00 -BGO_X0_0 0 7 17 -81.68 14.75 1.00 1.70 25.76 2.58 0.03 -BGO_X0_0 0 7 16 -71.47 14.75 1.01 1.47 29.56 2.07 0.06 -BGO_X0_0 0 7 15 -61.26 14.75 1.00 2.12 19.68 2.88 0.00 -BGO_X0_0 0 7 14 -51.05 14.75 1.00 2.88 28.98 2.22 0.04 -BGO_X0_0 0 7 13 -40.84 14.75 1.02 -0.16 23.89 2.62 0.00 -BGO_X0_0 0 7 12 -30.63 14.75 1.00 3.10 25.43 2.53 0.00 -BGO_X0_0 0 7 11 -20.42 14.75 0.98 5.12 23.40 2.79 0.00 -BGO_X0_0 0 7 10 -10.21 14.75 1.01 2.53 24.41 2.76 0.00 -BGO_X0_0 0 7 9 0.00 14.75 1.01 2.76 22.34 2.77 0.03 -BGO_X0_0 0 7 8 10.21 14.75 1.00 4.37 23.43 2.96 0.00 -BGO_X0_0 0 7 7 20.42 14.75 1.03 1.41 20.35 2.84 0.00 -BGO_X0_0 0 7 6 30.63 14.75 1.03 2.30 19.85 2.89 0.00 -BGO_X0_0 0 7 5 40.84 14.75 1.06 0.17 26.75 2.30 0.08 -BGO_X0_0 0 7 4 51.05 14.75 1.05 3.29 16.88 3.21 0.00 -BGO_X0_0 0 7 3 61.26 14.75 1.07 0.87 26.14 2.16 0.11 -BGO_X0_0 0 7 2 71.47 14.75 1.06 2.16 17.18 3.45 0.06 -BGO_X0_0 0 7 1 81.68 14.75 1.02 2.63 23.16 3.76 0.05 -BGO_X0_0 0 7 0 91.89 14.75 0.93 3.35 15.87 3.21 0.00 -BGO_X0_0 0 8 18 -91.89 24.58 1.02 -0.68 27.00 2.76 0.00 -BGO_X0_0 0 8 17 -81.68 24.58 0.99 3.81 21.49 2.75 0.00 -BGO_X0_0 0 8 16 -71.47 24.58 1.01 1.51 14.78 3.04 0.00 -BGO_X0_0 0 8 15 -61.26 24.58 1.00 2.77 21.24 2.65 0.00 -BGO_X0_0 0 8 14 -51.05 24.58 0.98 4.55 26.29 2.26 0.08 -BGO_X0_0 0 8 13 -40.84 24.58 0.99 3.99 16.66 3.01 0.00 -BGO_X0_0 0 8 12 -30.63 24.58 1.00 2.71 22.63 2.78 0.00 -BGO_X0_0 0 8 11 -20.42 24.58 1.01 1.60 22.53 2.65 0.00 -BGO_X0_0 0 8 10 -10.21 24.58 1.00 2.54 21.92 2.61 0.00 -BGO_X0_0 0 8 9 0.00 24.58 0.98 4.18 19.75 2.89 0.00 -BGO_X0_0 0 8 8 10.21 24.58 0.99 5.25 26.22 2.31 0.05 -BGO_X0_0 0 8 7 20.42 24.58 1.02 1.31 26.61 2.68 0.00 -BGO_X0_0 0 8 6 30.63 24.58 1.01 4.77 25.72 2.59 0.00 -BGO_X0_0 0 8 5 40.84 24.58 1.02 2.53 22.06 2.74 0.00 -BGO_X0_0 0 8 4 51.05 24.58 1.02 1.18 22.70 2.60 0.02 -BGO_X0_0 0 8 3 61.26 24.58 1.03 -1.14 28.64 2.18 0.07 -BGO_X0_0 0 8 2 71.47 24.58 0.96 3.86 18.73 2.98 0.00 -BGO_X0_0 0 8 1 81.68 24.58 0.95 -1.23 25.46 2.70 0.00 -BGO_X0_0 0 8 0 91.89 24.58 0.92 4.73 18.40 2.71 0.00 -BGO_X0_0 0 9 18 -91.89 34.42 0.98 6.64 35.87 0.32 0.10 -BGO_X0_0 0 9 17 -81.68 34.42 1.00 3.27 22.93 2.72 0.00 -BGO_X0_0 0 9 16 -71.47 34.42 0.99 1.43 25.31 2.67 0.00 -BGO_X0_0 0 9 15 -61.26 34.42 1.00 1.98 21.92 2.72 0.00 -BGO_X0_0 0 9 14 -51.05 34.42 0.99 2.49 25.38 2.67 0.00 -BGO_X0_0 0 9 13 -40.84 34.42 1.00 2.67 20.17 2.59 0.04 -BGO_X0_0 0 9 12 -30.63 34.42 0.99 3.94 20.80 2.69 0.01 -BGO_X0_0 0 9 11 -20.42 34.42 1.00 1.79 23.08 2.64 0.00 -BGO_X0_0 0 9 10 -10.21 34.42 0.99 3.54 21.15 2.69 0.00 -BGO_X0_0 0 9 9 0.00 34.42 1.00 2.97 19.56 2.68 0.00 -BGO_X0_0 0 9 8 10.21 34.42 0.99 0.82 27.75 2.49 0.02 -BGO_X0_0 0 9 7 20.42 34.42 0.99 1.90 18.79 2.83 0.00 -BGO_X0_0 0 9 6 30.63 34.42 1.00 0.78 21.49 2.65 0.00 -BGO_X0_0 0 9 5 40.84 34.42 0.98 3.88 23.63 2.40 0.04 -BGO_X0_0 0 9 4 51.05 34.42 0.98 2.10 19.91 2.95 0.00 -BGO_X0_0 0 9 3 61.26 34.42 0.94 3.20 22.43 2.66 0.00 -BGO_X0_0 0 9 2 71.47 34.42 0.95 0.86 23.01 2.56 0.00 -BGO_X0_0 0 9 1 81.68 34.42 0.96 -0.52 27.31 2.40 0.04 -BGO_X0_0 0 9 0 91.89 34.42 0.95 1.97 23.15 2.75 0.00 -BGO_X0_0 0 10 18 -91.89 44.25 1.00 3.96 24.36 2.67 0.00 -BGO_X0_0 0 10 17 -81.68 44.25 1.00 2.32 25.39 2.47 0.00 -BGO_X0_0 0 10 16 -71.47 44.25 1.01 1.80 19.19 2.95 0.00 -BGO_X0_0 0 10 15 -61.26 44.25 1.00 2.25 18.34 2.85 0.00 -BGO_X0_0 0 10 14 -51.05 44.25 0.99 4.80 22.42 2.65 0.00 -BGO_X0_0 0 10 13 -40.84 44.25 1.02 -0.80 16.27 3.01 0.00 -BGO_X0_0 0 10 12 -30.63 44.25 1.01 0.79 22.96 2.64 0.00 -BGO_X0_0 0 10 11 -20.42 44.25 1.00 1.24 22.01 2.73 0.00 -BGO_X0_0 0 10 10 -10.21 44.25 0.99 3.14 25.39 2.47 0.04 -BGO_X0_0 0 10 9 0.00 44.25 0.97 5.67 21.98 2.65 0.00 -BGO_X0_0 0 10 8 10.21 44.25 0.96 5.35 23.22 2.67 0.02 -BGO_X0_0 0 10 7 20.42 44.25 0.99 -0.82 22.29 2.71 0.00 -BGO_X0_0 0 10 6 30.63 44.25 0.95 5.61 21.18 2.67 0.00 -BGO_X0_0 0 10 5 40.84 44.25 0.97 2.23 20.13 2.70 0.00 -BGO_X0_0 0 10 4 51.05 44.25 0.95 1.44 24.43 2.70 0.00 -BGO_X0_0 0 10 3 61.26 44.25 0.93 4.34 22.98 2.72 0.00 -BGO_X0_0 0 10 2 71.47 44.25 0.95 2.44 23.97 2.77 0.00 -BGO_X0_0 0 10 1 81.68 44.25 0.95 3.32 24.00 2.68 0.00 -BGO_X0_0 0 10 0 91.89 44.25 0.94 3.13 17.71 2.88 0.00 -BGO_X0_0 0 11 18 -91.89 54.08 1.00 2.17 27.47 2.19 0.07 -BGO_X0_0 0 11 17 -81.68 54.08 1.00 2.43 16.38 2.72 0.00 -BGO_X0_0 0 11 16 -71.47 54.08 0.99 3.87 19.87 2.78 0.00 -BGO_X0_0 0 11 15 -61.26 54.08 1.06 -5.15 37.47 0.00 0.11 -BGO_X0_0 0 11 14 -51.05 54.08 1.00 3.13 23.31 2.61 0.00 -BGO_X0_0 0 11 13 -40.84 54.08 0.99 4.25 21.20 2.78 0.00 -BGO_X0_0 0 11 12 -30.63 54.08 1.00 1.58 24.37 2.13 0.08 -BGO_X0_0 0 11 11 -20.42 54.08 1.00 2.07 22.98 2.86 0.00 -BGO_X0_0 0 11 10 -10.21 54.08 0.97 4.57 18.89 2.88 0.00 -BGO_X0_0 0 11 9 0.00 54.08 1.00 1.55 27.46 2.48 0.00 -BGO_X0_0 0 11 8 10.21 54.08 0.98 3.14 22.61 2.63 0.00 -BGO_X0_0 0 11 7 20.42 54.08 0.95 3.81 16.63 2.72 0.00 -BGO_X0_0 0 11 6 30.63 54.08 0.95 3.41 24.89 2.66 0.00 -BGO_X0_0 0 11 5 40.84 54.08 0.94 2.12 24.16 2.35 0.05 -BGO_X0_0 0 11 4 51.05 54.08 0.95 1.83 25.30 2.42 0.04 -BGO_X0_0 0 11 3 61.26 54.08 0.95 1.71 23.72 2.65 0.00 -BGO_X0_0 0 11 2 71.47 54.08 0.95 1.80 19.55 2.81 0.00 -BGO_X0_0 0 11 1 81.68 54.08 0.93 4.14 24.07 2.46 0.05 -BGO_X0_0 0 11 0 91.89 54.08 0.95 2.60 16.28 2.91 0.00 -BGO_X0_0 1 0 18 -91.89 -54.08 1.00 2.17 27.47 2.19 0.07 -BGO_X0_0 1 0 17 -81.68 -54.08 1.00 2.43 16.38 2.72 0.00 -BGO_X0_0 1 0 16 -71.47 -54.08 0.99 3.87 19.87 2.78 0.00 -BGO_X0_0 1 0 15 -61.26 -54.08 1.06 -5.15 37.47 0.00 0.11 -BGO_X0_0 1 0 14 -51.05 -54.08 1.00 3.13 23.31 2.61 0.00 -BGO_X0_0 1 0 13 -40.84 -54.08 0.99 4.25 21.20 2.78 0.00 -BGO_X0_0 1 0 12 -30.63 -54.08 1.00 1.58 24.37 2.13 0.08 -BGO_X0_0 1 0 11 -20.42 -54.08 1.00 2.07 22.98 2.86 0.00 -BGO_X0_0 1 0 10 -10.21 -54.08 0.97 4.57 18.89 2.88 0.00 -BGO_X0_0 1 0 9 0.00 -54.08 1.00 1.55 27.46 2.48 0.00 -BGO_X0_0 1 0 8 10.21 -54.08 0.98 3.14 22.61 2.63 0.00 -BGO_X0_0 1 0 7 20.42 -54.08 0.95 3.81 16.63 2.72 0.00 -BGO_X0_0 1 0 6 30.63 -54.08 0.95 3.41 24.89 2.66 0.00 -BGO_X0_0 1 0 5 40.84 -54.08 0.94 2.12 24.16 2.35 0.05 -BGO_X0_0 1 0 4 51.05 -54.08 0.95 1.83 25.30 2.42 0.04 -BGO_X0_0 1 0 3 61.26 -54.08 0.95 1.71 23.72 2.65 0.00 -BGO_X0_0 1 0 2 71.47 -54.08 0.95 1.80 19.55 2.81 0.00 -BGO_X0_0 1 0 1 81.68 -54.08 0.93 4.14 24.07 2.46 0.05 -BGO_X0_0 1 0 0 91.89 -54.08 0.95 2.60 16.28 2.91 0.00 -BGO_X0_0 1 1 18 -91.89 -44.25 1.00 3.96 24.36 2.67 0.00 -BGO_X0_0 1 1 17 -81.68 -44.25 1.00 2.32 25.39 2.47 0.00 -BGO_X0_0 1 1 16 -71.47 -44.25 1.01 1.80 19.19 2.95 0.00 -BGO_X0_0 1 1 15 -61.26 -44.25 1.00 2.25 18.34 2.85 0.00 -BGO_X0_0 1 1 14 -51.05 -44.25 0.99 4.80 22.42 2.65 0.00 -BGO_X0_0 1 1 13 -40.84 -44.25 1.02 -0.80 16.27 3.01 0.00 -BGO_X0_0 1 1 12 -30.63 -44.25 1.01 0.79 22.96 2.64 0.00 -BGO_X0_0 1 1 11 -20.42 -44.25 1.00 1.24 22.01 2.73 0.00 -BGO_X0_0 1 1 10 -10.21 -44.25 0.99 3.14 25.39 2.47 0.04 -BGO_X0_0 1 1 9 0.00 -44.25 0.97 5.67 21.98 2.65 0.00 -BGO_X0_0 1 1 8 10.21 -44.25 0.96 5.35 23.22 2.67 0.02 -BGO_X0_0 1 1 7 20.42 -44.25 0.99 -0.82 22.29 2.71 0.00 -BGO_X0_0 1 1 6 30.63 -44.25 0.95 5.61 21.18 2.67 0.00 -BGO_X0_0 1 1 5 40.84 -44.25 0.97 2.23 20.13 2.70 0.00 -BGO_X0_0 1 1 4 51.05 -44.25 0.95 1.44 24.43 2.70 0.00 -BGO_X0_0 1 1 3 61.26 -44.25 0.93 4.34 22.98 2.72 0.00 -BGO_X0_0 1 1 2 71.47 -44.25 0.95 2.44 23.97 2.77 0.00 -BGO_X0_0 1 1 1 81.68 -44.25 0.95 3.32 24.00 2.68 0.00 -BGO_X0_0 1 1 0 91.89 -44.25 0.94 3.13 17.71 2.88 0.00 -BGO_X0_0 1 2 18 -91.89 -34.42 0.98 6.64 35.87 0.32 0.10 -BGO_X0_0 1 2 17 -81.68 -34.42 1.00 3.27 22.93 2.72 0.00 -BGO_X0_0 1 2 16 -71.47 -34.42 0.99 1.43 25.31 2.67 0.00 -BGO_X0_0 1 2 15 -61.26 -34.42 1.00 1.98 21.92 2.72 0.00 -BGO_X0_0 1 2 14 -51.05 -34.42 0.99 2.49 25.38 2.67 0.00 -BGO_X0_0 1 2 13 -40.84 -34.42 1.00 2.67 20.17 2.59 0.04 -BGO_X0_0 1 2 12 -30.63 -34.42 0.99 3.94 20.80 2.69 0.01 -BGO_X0_0 1 2 11 -20.42 -34.42 1.00 1.79 23.08 2.64 0.00 -BGO_X0_0 1 2 10 -10.21 -34.42 0.99 3.54 21.15 2.69 0.00 -BGO_X0_0 1 2 9 0.00 -34.42 1.00 2.97 19.56 2.68 0.00 -BGO_X0_0 1 2 8 10.21 -34.42 0.99 0.82 27.75 2.49 0.02 -BGO_X0_0 1 2 7 20.42 -34.42 0.99 1.90 18.79 2.83 0.00 -BGO_X0_0 1 2 6 30.63 -34.42 1.00 0.78 21.49 2.65 0.00 -BGO_X0_0 1 2 5 40.84 -34.42 0.98 3.88 23.63 2.40 0.04 -BGO_X0_0 1 2 4 51.05 -34.42 0.98 2.10 19.91 2.95 0.00 -BGO_X0_0 1 2 3 61.26 -34.42 0.94 3.20 22.43 2.66 0.00 -BGO_X0_0 1 2 2 71.47 -34.42 0.95 0.86 23.01 2.56 0.00 -BGO_X0_0 1 2 1 81.68 -34.42 0.96 -0.52 27.31 2.40 0.04 -BGO_X0_0 1 2 0 91.89 -34.42 0.95 1.97 23.15 2.75 0.00 -BGO_X0_0 1 3 18 -91.89 -24.58 1.02 -0.68 27.00 2.76 0.00 -BGO_X0_0 1 3 17 -81.68 -24.58 0.99 3.81 21.49 2.75 0.00 -BGO_X0_0 1 3 16 -71.47 -24.58 1.01 1.51 14.78 3.04 0.00 -BGO_X0_0 1 3 15 -61.26 -24.58 1.00 2.77 21.24 2.65 0.00 -BGO_X0_0 1 3 14 -51.05 -24.58 0.98 4.55 26.29 2.26 0.08 -BGO_X0_0 1 3 13 -40.84 -24.58 0.99 3.99 16.66 3.01 0.00 -BGO_X0_0 1 3 12 -30.63 -24.58 1.00 2.71 22.63 2.78 0.00 -BGO_X0_0 1 3 11 -20.42 -24.58 1.01 1.60 22.53 2.65 0.00 -BGO_X0_0 1 3 10 -10.21 -24.58 1.00 2.54 21.92 2.61 0.00 -BGO_X0_0 1 3 9 0.00 -24.58 0.98 4.18 19.75 2.89 0.00 -BGO_X0_0 1 3 8 10.21 -24.58 0.99 5.25 26.22 2.31 0.05 -BGO_X0_0 1 3 7 20.42 -24.58 1.02 1.31 26.61 2.68 0.00 -BGO_X0_0 1 3 6 30.63 -24.58 1.01 4.77 25.72 2.59 0.00 -BGO_X0_0 1 3 5 40.84 -24.58 1.02 2.53 22.06 2.74 0.00 -BGO_X0_0 1 3 4 51.05 -24.58 1.02 1.18 22.70 2.60 0.02 -BGO_X0_0 1 3 3 61.26 -24.58 1.03 -1.14 28.64 2.18 0.07 -BGO_X0_0 1 3 2 71.47 -24.58 0.96 3.86 18.73 2.98 0.00 -BGO_X0_0 1 3 1 81.68 -24.58 0.95 -1.23 25.46 2.70 0.00 -BGO_X0_0 1 3 0 91.89 -24.58 0.92 4.73 18.40 2.71 0.00 -BGO_X0_0 1 4 18 -91.89 -14.75 0.99 3.62 19.21 2.89 0.00 -BGO_X0_0 1 4 17 -81.68 -14.75 1.00 1.70 25.76 2.58 0.03 -BGO_X0_0 1 4 16 -71.47 -14.75 1.01 1.47 29.56 2.07 0.06 -BGO_X0_0 1 4 15 -61.26 -14.75 1.00 2.12 19.68 2.88 0.00 -BGO_X0_0 1 4 14 -51.05 -14.75 1.00 2.88 28.98 2.22 0.04 -BGO_X0_0 1 4 13 -40.84 -14.75 1.02 -0.16 23.89 2.62 0.00 -BGO_X0_0 1 4 12 -30.63 -14.75 1.00 3.10 25.43 2.53 0.00 -BGO_X0_0 1 4 11 -20.42 -14.75 0.98 5.12 23.40 2.79 0.00 -BGO_X0_0 1 4 10 -10.21 -14.75 1.01 2.53 24.41 2.76 0.00 -BGO_X0_0 1 4 9 0.00 -14.75 1.01 2.76 22.34 2.77 0.03 -BGO_X0_0 1 4 8 10.21 -14.75 1.00 4.37 23.43 2.96 0.00 -BGO_X0_0 1 4 7 20.42 -14.75 1.03 1.41 20.35 2.84 0.00 -BGO_X0_0 1 4 6 30.63 -14.75 1.03 2.30 19.85 2.89 0.00 -BGO_X0_0 1 4 5 40.84 -14.75 1.06 0.17 26.75 2.30 0.08 -BGO_X0_0 1 4 4 51.05 -14.75 1.05 3.29 16.88 3.21 0.00 -BGO_X0_0 1 4 3 61.26 -14.75 1.07 0.87 26.14 2.16 0.11 -BGO_X0_0 1 4 2 71.47 -14.75 1.06 2.16 17.18 3.45 0.06 -BGO_X0_0 1 4 1 81.68 -14.75 1.02 2.63 23.16 3.76 0.05 -BGO_X0_0 1 4 0 91.89 -14.75 0.93 3.35 15.87 3.21 0.00 -BGO_X0_0 1 5 18 -91.89 -4.92 0.99 2.76 22.78 2.68 0.00 -BGO_X0_0 1 5 17 -81.68 -4.92 1.00 2.38 24.10 2.49 0.03 -BGO_X0_0 1 5 16 -71.47 -4.92 0.98 3.99 23.95 2.65 0.00 -BGO_X0_0 1 5 15 -61.26 -4.92 0.99 3.74 25.25 2.23 0.05 -BGO_X0_0 1 5 14 -51.05 -4.92 1.01 0.91 20.65 2.78 0.00 -BGO_X0_0 1 5 13 -40.84 -4.92 0.99 3.65 22.16 2.65 0.00 -BGO_X0_0 1 5 12 -30.63 -4.92 1.01 0.08 24.77 2.69 0.00 -BGO_X0_0 1 5 11 -20.42 -4.92 1.01 0.74 18.36 2.85 0.00 -BGO_X0_0 1 5 10 -10.21 -4.92 0.99 5.34 23.36 2.70 0.00 -BGO_X0_0 1 5 9 0.00 -4.92 1.01 2.99 20.83 2.82 0.00 -BGO_X0_0 1 5 8 10.21 -4.92 1.01 4.86 20.78 2.93 0.00 -BGO_X0_0 1 5 7 20.42 -4.92 1.03 4.37 27.58 2.23 0.07 -BGO_X0_0 1 5 6 30.63 -4.92 1.04 3.11 22.64 2.90 0.00 -BGO_X0_0 1 5 5 40.84 -4.92 1.06 2.64 23.39 2.85 0.00 -BGO_X0_0 1 5 4 51.05 -4.92 1.09 2.42 15.99 3.16 0.00 -BGO_X0_0 1 5 3 61.26 -4.92 1.10 2.91 19.07 3.30 0.07 -BGO_X0_0 1 5 2 71.47 -4.92 1.17 -0.86 26.47 2.09 0.15 -BGO_X0_0 1 5 1 81.68 -4.92 1.22 1.14 31.73 1.85 0.19 -BGO_X0_0 1 5 0 91.89 -4.92 1.21 1.22 27.15 3.88 0.42 -BGO_X0_0 1 6 18 -91.89 4.92 0.99 2.76 22.78 2.68 0.00 -BGO_X0_0 1 6 17 -81.68 4.92 1.00 2.38 24.10 2.49 0.03 -BGO_X0_0 1 6 16 -71.47 4.92 0.98 3.99 23.95 2.65 0.00 -BGO_X0_0 1 6 15 -61.26 4.92 0.99 3.74 25.25 2.23 0.05 -BGO_X0_0 1 6 14 -51.05 4.92 1.01 0.91 20.65 2.78 0.00 -BGO_X0_0 1 6 13 -40.84 4.92 0.99 3.65 22.16 2.65 0.00 -BGO_X0_0 1 6 12 -30.63 4.92 1.01 0.08 24.77 2.69 0.00 -BGO_X0_0 1 6 11 -20.42 4.92 1.01 0.74 18.36 2.85 0.00 -BGO_X0_0 1 6 10 -10.21 4.92 0.99 5.34 23.36 2.70 0.00 -BGO_X0_0 1 6 9 0.00 4.92 1.01 2.99 20.83 2.82 0.00 -BGO_X0_0 1 6 8 10.21 4.92 1.01 4.86 20.78 2.93 0.00 -BGO_X0_0 1 6 7 20.42 4.92 1.03 4.37 27.58 2.23 0.07 -BGO_X0_0 1 6 6 30.63 4.92 1.04 3.11 22.64 2.90 0.00 -BGO_X0_0 1 6 5 40.84 4.92 1.06 2.64 23.39 2.85 0.00 -BGO_X0_0 1 6 4 51.05 4.92 1.09 2.42 15.99 3.16 0.00 -BGO_X0_0 1 6 3 61.26 4.92 1.10 2.91 19.07 3.30 0.07 -BGO_X0_0 1 6 2 71.47 4.92 1.17 -0.86 26.47 2.09 0.15 -BGO_X0_0 1 6 1 81.68 4.92 1.22 1.14 31.73 1.85 0.19 -BGO_X0_0 1 6 0 91.89 4.92 1.21 1.22 27.15 3.88 0.42 -BGO_X0_0 1 7 18 -91.89 14.75 0.99 3.62 19.21 2.89 0.00 -BGO_X0_0 1 7 17 -81.68 14.75 1.00 1.70 25.76 2.58 0.03 -BGO_X0_0 1 7 16 -71.47 14.75 1.01 1.47 29.56 2.07 0.06 -BGO_X0_0 1 7 15 -61.26 14.75 1.00 2.12 19.68 2.88 0.00 -BGO_X0_0 1 7 14 -51.05 14.75 1.00 2.88 28.98 2.22 0.04 -BGO_X0_0 1 7 13 -40.84 14.75 1.02 -0.16 23.89 2.62 0.00 -BGO_X0_0 1 7 12 -30.63 14.75 1.00 3.10 25.43 2.53 0.00 -BGO_X0_0 1 7 11 -20.42 14.75 0.98 5.12 23.40 2.79 0.00 -BGO_X0_0 1 7 10 -10.21 14.75 1.01 2.53 24.41 2.76 0.00 -BGO_X0_0 1 7 9 0.00 14.75 1.01 2.76 22.34 2.77 0.03 -BGO_X0_0 1 7 8 10.21 14.75 1.00 4.37 23.43 2.96 0.00 -BGO_X0_0 1 7 7 20.42 14.75 1.03 1.41 20.35 2.84 0.00 -BGO_X0_0 1 7 6 30.63 14.75 1.03 2.30 19.85 2.89 0.00 -BGO_X0_0 1 7 5 40.84 14.75 1.06 0.17 26.75 2.30 0.08 -BGO_X0_0 1 7 4 51.05 14.75 1.05 3.29 16.88 3.21 0.00 -BGO_X0_0 1 7 3 61.26 14.75 1.07 0.87 26.14 2.16 0.11 -BGO_X0_0 1 7 2 71.47 14.75 1.06 2.16 17.18 3.45 0.06 -BGO_X0_0 1 7 1 81.68 14.75 1.02 2.63 23.16 3.76 0.05 -BGO_X0_0 1 7 0 91.89 14.75 0.93 3.35 15.87 3.21 0.00 -BGO_X0_0 1 8 18 -91.89 24.58 1.02 -0.68 27.00 2.76 0.00 -BGO_X0_0 1 8 17 -81.68 24.58 0.99 3.81 21.49 2.75 0.00 -BGO_X0_0 1 8 16 -71.47 24.58 1.01 1.51 14.78 3.04 0.00 -BGO_X0_0 1 8 15 -61.26 24.58 1.00 2.77 21.24 2.65 0.00 -BGO_X0_0 1 8 14 -51.05 24.58 0.98 4.55 26.29 2.26 0.08 -BGO_X0_0 1 8 13 -40.84 24.58 0.99 3.99 16.66 3.01 0.00 -BGO_X0_0 1 8 12 -30.63 24.58 1.00 2.71 22.63 2.78 0.00 -BGO_X0_0 1 8 11 -20.42 24.58 1.01 1.60 22.53 2.65 0.00 -BGO_X0_0 1 8 10 -10.21 24.58 1.00 2.54 21.92 2.61 0.00 -BGO_X0_0 1 8 9 0.00 24.58 0.98 4.18 19.75 2.89 0.00 -BGO_X0_0 1 8 8 10.21 24.58 0.99 5.25 26.22 2.31 0.05 -BGO_X0_0 1 8 7 20.42 24.58 1.02 1.31 26.61 2.68 0.00 -BGO_X0_0 1 8 6 30.63 24.58 1.01 4.77 25.72 2.59 0.00 -BGO_X0_0 1 8 5 40.84 24.58 1.02 2.53 22.06 2.74 0.00 -BGO_X0_0 1 8 4 51.05 24.58 1.02 1.18 22.70 2.60 0.02 -BGO_X0_0 1 8 3 61.26 24.58 1.03 -1.14 28.64 2.18 0.07 -BGO_X0_0 1 8 2 71.47 24.58 0.96 3.86 18.73 2.98 0.00 -BGO_X0_0 1 8 1 81.68 24.58 0.95 -1.23 25.46 2.70 0.00 -BGO_X0_0 1 8 0 91.89 24.58 0.92 4.73 18.40 2.71 0.00 -BGO_X0_0 1 9 18 -91.89 34.42 0.98 6.64 35.87 0.32 0.10 -BGO_X0_0 1 9 17 -81.68 34.42 1.00 3.27 22.93 2.72 0.00 -BGO_X0_0 1 9 16 -71.47 34.42 0.99 1.43 25.31 2.67 0.00 -BGO_X0_0 1 9 15 -61.26 34.42 1.00 1.98 21.92 2.72 0.00 -BGO_X0_0 1 9 14 -51.05 34.42 0.99 2.49 25.38 2.67 0.00 -BGO_X0_0 1 9 13 -40.84 34.42 1.00 2.67 20.17 2.59 0.04 -BGO_X0_0 1 9 12 -30.63 34.42 0.99 3.94 20.80 2.69 0.01 -BGO_X0_0 1 9 11 -20.42 34.42 1.00 1.79 23.08 2.64 0.00 -BGO_X0_0 1 9 10 -10.21 34.42 0.99 3.54 21.15 2.69 0.00 -BGO_X0_0 1 9 9 0.00 34.42 1.00 2.97 19.56 2.68 0.00 -BGO_X0_0 1 9 8 10.21 34.42 0.99 0.82 27.75 2.49 0.02 -BGO_X0_0 1 9 7 20.42 34.42 0.99 1.90 18.79 2.83 0.00 -BGO_X0_0 1 9 6 30.63 34.42 1.00 0.78 21.49 2.65 0.00 -BGO_X0_0 1 9 5 40.84 34.42 0.98 3.88 23.63 2.40 0.04 -BGO_X0_0 1 9 4 51.05 34.42 0.98 2.10 19.91 2.95 0.00 -BGO_X0_0 1 9 3 61.26 34.42 0.94 3.20 22.43 2.66 0.00 -BGO_X0_0 1 9 2 71.47 34.42 0.95 0.86 23.01 2.56 0.00 -BGO_X0_0 1 9 1 81.68 34.42 0.96 -0.52 27.31 2.40 0.04 -BGO_X0_0 1 9 0 91.89 34.42 0.95 1.97 23.15 2.75 0.00 -BGO_X0_0 1 10 18 -91.89 44.25 1.00 3.96 24.36 2.67 0.00 -BGO_X0_0 1 10 17 -81.68 44.25 1.00 2.32 25.39 2.47 0.00 -BGO_X0_0 1 10 16 -71.47 44.25 1.01 1.80 19.19 2.95 0.00 -BGO_X0_0 1 10 15 -61.26 44.25 1.00 2.25 18.34 2.85 0.00 -BGO_X0_0 1 10 14 -51.05 44.25 0.99 4.80 22.42 2.65 0.00 -BGO_X0_0 1 10 13 -40.84 44.25 1.02 -0.80 16.27 3.01 0.00 -BGO_X0_0 1 10 12 -30.63 44.25 1.01 0.79 22.96 2.64 0.00 -BGO_X0_0 1 10 11 -20.42 44.25 1.00 1.24 22.01 2.73 0.00 -BGO_X0_0 1 10 10 -10.21 44.25 0.99 3.14 25.39 2.47 0.04 -BGO_X0_0 1 10 9 0.00 44.25 0.97 5.67 21.98 2.65 0.00 -BGO_X0_0 1 10 8 10.21 44.25 0.96 5.35 23.22 2.67 0.02 -BGO_X0_0 1 10 7 20.42 44.25 0.99 -0.82 22.29 2.71 0.00 -BGO_X0_0 1 10 6 30.63 44.25 0.95 5.61 21.18 2.67 0.00 -BGO_X0_0 1 10 5 40.84 44.25 0.97 2.23 20.13 2.70 0.00 -BGO_X0_0 1 10 4 51.05 44.25 0.95 1.44 24.43 2.70 0.00 -BGO_X0_0 1 10 3 61.26 44.25 0.93 4.34 22.98 2.72 0.00 -BGO_X0_0 1 10 2 71.47 44.25 0.95 2.44 23.97 2.77 0.00 -BGO_X0_0 1 10 1 81.68 44.25 0.95 3.32 24.00 2.68 0.00 -BGO_X0_0 1 10 0 91.89 44.25 0.94 3.13 17.71 2.88 0.00 -BGO_X0_0 1 11 18 -91.89 54.08 1.00 2.17 27.47 2.19 0.07 -BGO_X0_0 1 11 17 -81.68 54.08 1.00 2.43 16.38 2.72 0.00 -BGO_X0_0 1 11 16 -71.47 54.08 0.99 3.87 19.87 2.78 0.00 -BGO_X0_0 1 11 15 -61.26 54.08 1.06 -5.15 37.47 0.00 0.11 -BGO_X0_0 1 11 14 -51.05 54.08 1.00 3.13 23.31 2.61 0.00 -BGO_X0_0 1 11 13 -40.84 54.08 0.99 4.25 21.20 2.78 0.00 -BGO_X0_0 1 11 12 -30.63 54.08 1.00 1.58 24.37 2.13 0.08 -BGO_X0_0 1 11 11 -20.42 54.08 1.00 2.07 22.98 2.86 0.00 -BGO_X0_0 1 11 10 -10.21 54.08 0.97 4.57 18.89 2.88 0.00 -BGO_X0_0 1 11 9 0.00 54.08 1.00 1.55 27.46 2.48 0.00 -BGO_X0_0 1 11 8 10.21 54.08 0.98 3.14 22.61 2.63 0.00 -BGO_X0_0 1 11 7 20.42 54.08 0.95 3.81 16.63 2.72 0.00 -BGO_X0_0 1 11 6 30.63 54.08 0.95 3.41 24.89 2.66 0.00 -BGO_X0_0 1 11 5 40.84 54.08 0.94 2.12 24.16 2.35 0.05 -BGO_X0_0 1 11 4 51.05 54.08 0.95 1.83 25.30 2.42 0.04 -BGO_X0_0 1 11 3 61.26 54.08 0.95 1.71 23.72 2.65 0.00 -BGO_X0_0 1 11 2 71.47 54.08 0.95 1.80 19.55 2.81 0.00 -BGO_X0_0 1 11 1 81.68 54.08 0.93 4.14 24.07 2.46 0.05 -BGO_X0_0 1 11 0 91.89 54.08 0.95 2.60 16.28 2.91 0.00 -BGO_X0_1 0 0 18 -91.89 -54.08 1.00 2.17 27.47 2.19 0.07 -BGO_X0_1 0 0 17 -81.68 -54.08 1.00 2.43 16.38 2.72 0.00 -BGO_X0_1 0 0 16 -71.47 -54.08 0.99 3.87 19.87 2.78 0.00 -BGO_X0_1 0 0 15 -61.26 -54.08 1.06 -5.15 37.47 0.00 0.11 -BGO_X0_1 0 0 14 -51.05 -54.08 1.00 3.13 23.31 2.61 0.00 -BGO_X0_1 0 0 13 -40.84 -54.08 0.99 4.25 21.20 2.78 0.00 -BGO_X0_1 0 0 12 -30.63 -54.08 1.00 1.58 24.37 2.13 0.08 -BGO_X0_1 0 0 11 -20.42 -54.08 1.00 2.07 22.98 2.86 0.00 -BGO_X0_1 0 0 10 -10.21 -54.08 0.97 4.57 18.89 2.88 0.00 -BGO_X0_1 0 0 9 0.00 -54.08 1.00 1.55 27.46 2.48 0.00 -BGO_X0_1 0 0 8 10.21 -54.08 0.98 3.14 22.61 2.63 0.00 -BGO_X0_1 0 0 7 20.42 -54.08 0.95 3.81 16.63 2.72 0.00 -BGO_X0_1 0 0 6 30.63 -54.08 0.95 3.41 24.89 2.66 0.00 -BGO_X0_1 0 0 5 40.84 -54.08 0.94 2.12 24.16 2.35 0.05 -BGO_X0_1 0 0 4 51.05 -54.08 0.95 1.83 25.30 2.42 0.04 -BGO_X0_1 0 0 3 61.26 -54.08 0.95 1.71 23.72 2.65 0.00 -BGO_X0_1 0 0 2 71.47 -54.08 0.95 1.80 19.55 2.81 0.00 -BGO_X0_1 0 0 1 81.68 -54.08 0.93 4.14 24.07 2.46 0.05 -BGO_X0_1 0 0 0 91.89 -54.08 0.95 2.60 16.28 2.91 0.00 -BGO_X0_1 0 1 18 -91.89 -44.25 1.00 3.96 24.36 2.67 0.00 -BGO_X0_1 0 1 17 -81.68 -44.25 1.00 2.32 25.39 2.47 0.00 -BGO_X0_1 0 1 16 -71.47 -44.25 1.01 1.80 19.19 2.95 0.00 -BGO_X0_1 0 1 15 -61.26 -44.25 1.00 2.25 18.34 2.85 0.00 -BGO_X0_1 0 1 14 -51.05 -44.25 0.99 4.80 22.42 2.65 0.00 -BGO_X0_1 0 1 13 -40.84 -44.25 1.02 -0.80 16.27 3.01 0.00 -BGO_X0_1 0 1 12 -30.63 -44.25 1.01 0.79 22.96 2.64 0.00 -BGO_X0_1 0 1 11 -20.42 -44.25 1.00 1.24 22.01 2.73 0.00 -BGO_X0_1 0 1 10 -10.21 -44.25 0.99 3.14 25.39 2.47 0.04 -BGO_X0_1 0 1 9 0.00 -44.25 0.97 5.67 21.98 2.65 0.00 -BGO_X0_1 0 1 8 10.21 -44.25 0.96 5.35 23.22 2.67 0.02 -BGO_X0_1 0 1 7 20.42 -44.25 0.99 -0.82 22.29 2.71 0.00 -BGO_X0_1 0 1 6 30.63 -44.25 0.95 5.61 21.18 2.67 0.00 -BGO_X0_1 0 1 5 40.84 -44.25 0.97 2.23 20.13 2.70 0.00 -BGO_X0_1 0 1 4 51.05 -44.25 0.95 1.44 24.43 2.70 0.00 -BGO_X0_1 0 1 3 61.26 -44.25 0.93 4.34 22.98 2.72 0.00 -BGO_X0_1 0 1 2 71.47 -44.25 0.95 2.44 23.97 2.77 0.00 -BGO_X0_1 0 1 1 81.68 -44.25 0.95 3.32 24.00 2.68 0.00 -BGO_X0_1 0 1 0 91.89 -44.25 0.94 3.13 17.71 2.88 0.00 -BGO_X0_1 0 2 18 -91.89 -34.42 0.98 6.64 35.87 0.32 0.10 -BGO_X0_1 0 2 17 -81.68 -34.42 1.00 3.27 22.93 2.72 0.00 -BGO_X0_1 0 2 16 -71.47 -34.42 0.99 1.43 25.31 2.67 0.00 -BGO_X0_1 0 2 15 -61.26 -34.42 1.00 1.98 21.92 2.72 0.00 -BGO_X0_1 0 2 14 -51.05 -34.42 0.99 2.49 25.38 2.67 0.00 -BGO_X0_1 0 2 13 -40.84 -34.42 1.00 2.67 20.17 2.59 0.04 -BGO_X0_1 0 2 12 -30.63 -34.42 0.99 3.94 20.80 2.69 0.01 -BGO_X0_1 0 2 11 -20.42 -34.42 1.00 1.79 23.08 2.64 0.00 -BGO_X0_1 0 2 10 -10.21 -34.42 0.99 3.54 21.15 2.69 0.00 -BGO_X0_1 0 2 9 0.00 -34.42 1.00 2.97 19.56 2.68 0.00 -BGO_X0_1 0 2 8 10.21 -34.42 0.99 0.82 27.75 2.49 0.02 -BGO_X0_1 0 2 7 20.42 -34.42 0.99 1.90 18.79 2.83 0.00 -BGO_X0_1 0 2 6 30.63 -34.42 1.00 0.78 21.49 2.65 0.00 -BGO_X0_1 0 2 5 40.84 -34.42 0.98 3.88 23.63 2.40 0.04 -BGO_X0_1 0 2 4 51.05 -34.42 0.98 2.10 19.91 2.95 0.00 -BGO_X0_1 0 2 3 61.26 -34.42 0.94 3.20 22.43 2.66 0.00 -BGO_X0_1 0 2 2 71.47 -34.42 0.95 0.86 23.01 2.56 0.00 -BGO_X0_1 0 2 1 81.68 -34.42 0.96 -0.52 27.31 2.40 0.04 -BGO_X0_1 0 2 0 91.89 -34.42 0.95 1.97 23.15 2.75 0.00 -BGO_X0_1 0 3 18 -91.89 -24.58 1.02 -0.68 27.00 2.76 0.00 -BGO_X0_1 0 3 17 -81.68 -24.58 0.99 3.81 21.49 2.75 0.00 -BGO_X0_1 0 3 16 -71.47 -24.58 1.01 1.51 14.78 3.04 0.00 -BGO_X0_1 0 3 15 -61.26 -24.58 1.00 2.77 21.24 2.65 0.00 -BGO_X0_1 0 3 14 -51.05 -24.58 0.98 4.55 26.29 2.26 0.08 -BGO_X0_1 0 3 13 -40.84 -24.58 0.99 3.99 16.66 3.01 0.00 -BGO_X0_1 0 3 12 -30.63 -24.58 1.00 2.71 22.63 2.78 0.00 -BGO_X0_1 0 3 11 -20.42 -24.58 1.01 1.60 22.53 2.65 0.00 -BGO_X0_1 0 3 10 -10.21 -24.58 1.00 2.54 21.92 2.61 0.00 -BGO_X0_1 0 3 9 0.00 -24.58 0.98 4.18 19.75 2.89 0.00 -BGO_X0_1 0 3 8 10.21 -24.58 0.99 5.25 26.22 2.31 0.05 -BGO_X0_1 0 3 7 20.42 -24.58 1.02 1.31 26.61 2.68 0.00 -BGO_X0_1 0 3 6 30.63 -24.58 1.01 4.77 25.72 2.59 0.00 -BGO_X0_1 0 3 5 40.84 -24.58 1.02 2.53 22.06 2.74 0.00 -BGO_X0_1 0 3 4 51.05 -24.58 1.02 1.18 22.70 2.60 0.02 -BGO_X0_1 0 3 3 61.26 -24.58 1.03 -1.14 28.64 2.18 0.07 -BGO_X0_1 0 3 2 71.47 -24.58 0.96 3.86 18.73 2.98 0.00 -BGO_X0_1 0 3 1 81.68 -24.58 0.95 -1.23 25.46 2.70 0.00 -BGO_X0_1 0 3 0 91.89 -24.58 0.92 4.73 18.40 2.71 0.00 -BGO_X0_1 0 4 18 -91.89 -14.75 0.99 3.62 19.21 2.89 0.00 -BGO_X0_1 0 4 17 -81.68 -14.75 1.00 1.70 25.76 2.58 0.03 -BGO_X0_1 0 4 16 -71.47 -14.75 1.01 1.47 29.56 2.07 0.06 -BGO_X0_1 0 4 15 -61.26 -14.75 1.00 2.12 19.68 2.88 0.00 -BGO_X0_1 0 4 14 -51.05 -14.75 1.00 2.88 28.98 2.22 0.04 -BGO_X0_1 0 4 13 -40.84 -14.75 1.02 -0.16 23.89 2.62 0.00 -BGO_X0_1 0 4 12 -30.63 -14.75 1.00 3.10 25.43 2.53 0.00 -BGO_X0_1 0 4 11 -20.42 -14.75 0.98 5.12 23.40 2.79 0.00 -BGO_X0_1 0 4 10 -10.21 -14.75 1.01 2.53 24.41 2.76 0.00 -BGO_X0_1 0 4 9 0.00 -14.75 1.01 2.76 22.34 2.77 0.03 -BGO_X0_1 0 4 8 10.21 -14.75 1.00 4.37 23.43 2.96 0.00 -BGO_X0_1 0 4 7 20.42 -14.75 1.03 1.41 20.35 2.84 0.00 -BGO_X0_1 0 4 6 30.63 -14.75 1.03 2.30 19.85 2.89 0.00 -BGO_X0_1 0 4 5 40.84 -14.75 1.06 0.17 26.75 2.30 0.08 -BGO_X0_1 0 4 4 51.05 -14.75 1.05 3.29 16.88 3.21 0.00 -BGO_X0_1 0 4 3 61.26 -14.75 1.07 0.87 26.14 2.16 0.11 -BGO_X0_1 0 4 2 71.47 -14.75 1.06 2.16 17.18 3.45 0.06 -BGO_X0_1 0 4 1 81.68 -14.75 1.02 2.63 23.16 3.76 0.05 -BGO_X0_1 0 4 0 91.89 -14.75 0.93 3.35 15.87 3.21 0.00 -BGO_X0_1 0 5 18 -91.89 -4.92 0.99 2.76 22.78 2.68 0.00 -BGO_X0_1 0 5 17 -81.68 -4.92 1.00 2.38 24.10 2.49 0.03 -BGO_X0_1 0 5 16 -71.47 -4.92 0.98 3.99 23.95 2.65 0.00 -BGO_X0_1 0 5 15 -61.26 -4.92 0.99 3.74 25.25 2.23 0.05 -BGO_X0_1 0 5 14 -51.05 -4.92 1.01 0.91 20.65 2.78 0.00 -BGO_X0_1 0 5 13 -40.84 -4.92 0.99 3.65 22.16 2.65 0.00 -BGO_X0_1 0 5 12 -30.63 -4.92 1.01 0.08 24.77 2.69 0.00 -BGO_X0_1 0 5 11 -20.42 -4.92 1.01 0.74 18.36 2.85 0.00 -BGO_X0_1 0 5 10 -10.21 -4.92 0.99 5.34 23.36 2.70 0.00 -BGO_X0_1 0 5 9 0.00 -4.92 1.01 2.99 20.83 2.82 0.00 -BGO_X0_1 0 5 8 10.21 -4.92 1.01 4.86 20.78 2.93 0.00 -BGO_X0_1 0 5 7 20.42 -4.92 1.03 4.37 27.58 2.23 0.07 -BGO_X0_1 0 5 6 30.63 -4.92 1.04 3.11 22.64 2.90 0.00 -BGO_X0_1 0 5 5 40.84 -4.92 1.06 2.64 23.39 2.85 0.00 -BGO_X0_1 0 5 4 51.05 -4.92 1.09 2.42 15.99 3.16 0.00 -BGO_X0_1 0 5 3 61.26 -4.92 1.10 2.91 19.07 3.30 0.07 -BGO_X0_1 0 5 2 71.47 -4.92 1.17 -0.86 26.47 2.09 0.15 -BGO_X0_1 0 5 1 81.68 -4.92 1.22 1.14 31.73 1.85 0.19 -BGO_X0_1 0 5 0 91.89 -4.92 1.21 1.22 27.15 3.88 0.42 -BGO_X0_1 0 6 18 -91.89 4.92 0.99 2.76 22.78 2.68 0.00 -BGO_X0_1 0 6 17 -81.68 4.92 1.00 2.38 24.10 2.49 0.03 -BGO_X0_1 0 6 16 -71.47 4.92 0.98 3.99 23.95 2.65 0.00 -BGO_X0_1 0 6 15 -61.26 4.92 0.99 3.74 25.25 2.23 0.05 -BGO_X0_1 0 6 14 -51.05 4.92 1.01 0.91 20.65 2.78 0.00 -BGO_X0_1 0 6 13 -40.84 4.92 0.99 3.65 22.16 2.65 0.00 -BGO_X0_1 0 6 12 -30.63 4.92 1.01 0.08 24.77 2.69 0.00 -BGO_X0_1 0 6 11 -20.42 4.92 1.01 0.74 18.36 2.85 0.00 -BGO_X0_1 0 6 10 -10.21 4.92 0.99 5.34 23.36 2.70 0.00 -BGO_X0_1 0 6 9 0.00 4.92 1.01 2.99 20.83 2.82 0.00 -BGO_X0_1 0 6 8 10.21 4.92 1.01 4.86 20.78 2.93 0.00 -BGO_X0_1 0 6 7 20.42 4.92 1.03 4.37 27.58 2.23 0.07 -BGO_X0_1 0 6 6 30.63 4.92 1.04 3.11 22.64 2.90 0.00 -BGO_X0_1 0 6 5 40.84 4.92 1.06 2.64 23.39 2.85 0.00 -BGO_X0_1 0 6 4 51.05 4.92 1.09 2.42 15.99 3.16 0.00 -BGO_X0_1 0 6 3 61.26 4.92 1.10 2.91 19.07 3.30 0.07 -BGO_X0_1 0 6 2 71.47 4.92 1.17 -0.86 26.47 2.09 0.15 -BGO_X0_1 0 6 1 81.68 4.92 1.22 1.14 31.73 1.85 0.19 -BGO_X0_1 0 6 0 91.89 4.92 1.21 1.22 27.15 3.88 0.42 -BGO_X0_1 0 7 18 -91.89 14.75 0.99 3.62 19.21 2.89 0.00 -BGO_X0_1 0 7 17 -81.68 14.75 1.00 1.70 25.76 2.58 0.03 -BGO_X0_1 0 7 16 -71.47 14.75 1.01 1.47 29.56 2.07 0.06 -BGO_X0_1 0 7 15 -61.26 14.75 1.00 2.12 19.68 2.88 0.00 -BGO_X0_1 0 7 14 -51.05 14.75 1.00 2.88 28.98 2.22 0.04 -BGO_X0_1 0 7 13 -40.84 14.75 1.02 -0.16 23.89 2.62 0.00 -BGO_X0_1 0 7 12 -30.63 14.75 1.00 3.10 25.43 2.53 0.00 -BGO_X0_1 0 7 11 -20.42 14.75 0.98 5.12 23.40 2.79 0.00 -BGO_X0_1 0 7 10 -10.21 14.75 1.01 2.53 24.41 2.76 0.00 -BGO_X0_1 0 7 9 0.00 14.75 1.01 2.76 22.34 2.77 0.03 -BGO_X0_1 0 7 8 10.21 14.75 1.00 4.37 23.43 2.96 0.00 -BGO_X0_1 0 7 7 20.42 14.75 1.03 1.41 20.35 2.84 0.00 -BGO_X0_1 0 7 6 30.63 14.75 1.03 2.30 19.85 2.89 0.00 -BGO_X0_1 0 7 5 40.84 14.75 1.06 0.17 26.75 2.30 0.08 -BGO_X0_1 0 7 4 51.05 14.75 1.05 3.29 16.88 3.21 0.00 -BGO_X0_1 0 7 3 61.26 14.75 1.07 0.87 26.14 2.16 0.11 -BGO_X0_1 0 7 2 71.47 14.75 1.06 2.16 17.18 3.45 0.06 -BGO_X0_1 0 7 1 81.68 14.75 1.02 2.63 23.16 3.76 0.05 -BGO_X0_1 0 7 0 91.89 14.75 0.93 3.35 15.87 3.21 0.00 -BGO_X0_1 0 8 18 -91.89 24.58 1.02 -0.68 27.00 2.76 0.00 -BGO_X0_1 0 8 17 -81.68 24.58 0.99 3.81 21.49 2.75 0.00 -BGO_X0_1 0 8 16 -71.47 24.58 1.01 1.51 14.78 3.04 0.00 -BGO_X0_1 0 8 15 -61.26 24.58 1.00 2.77 21.24 2.65 0.00 -BGO_X0_1 0 8 14 -51.05 24.58 0.98 4.55 26.29 2.26 0.08 -BGO_X0_1 0 8 13 -40.84 24.58 0.99 3.99 16.66 3.01 0.00 -BGO_X0_1 0 8 12 -30.63 24.58 1.00 2.71 22.63 2.78 0.00 -BGO_X0_1 0 8 11 -20.42 24.58 1.01 1.60 22.53 2.65 0.00 -BGO_X0_1 0 8 10 -10.21 24.58 1.00 2.54 21.92 2.61 0.00 -BGO_X0_1 0 8 9 0.00 24.58 0.98 4.18 19.75 2.89 0.00 -BGO_X0_1 0 8 8 10.21 24.58 0.99 5.25 26.22 2.31 0.05 -BGO_X0_1 0 8 7 20.42 24.58 1.02 1.31 26.61 2.68 0.00 -BGO_X0_1 0 8 6 30.63 24.58 1.01 4.77 25.72 2.59 0.00 -BGO_X0_1 0 8 5 40.84 24.58 1.02 2.53 22.06 2.74 0.00 -BGO_X0_1 0 8 4 51.05 24.58 1.02 1.18 22.70 2.60 0.02 -BGO_X0_1 0 8 3 61.26 24.58 1.03 -1.14 28.64 2.18 0.07 -BGO_X0_1 0 8 2 71.47 24.58 0.96 3.86 18.73 2.98 0.00 -BGO_X0_1 0 8 1 81.68 24.58 0.95 -1.23 25.46 2.70 0.00 -BGO_X0_1 0 8 0 91.89 24.58 0.92 4.73 18.40 2.71 0.00 -BGO_X0_1 0 9 18 -91.89 34.42 0.98 6.64 35.87 0.32 0.10 -BGO_X0_1 0 9 17 -81.68 34.42 1.00 3.27 22.93 2.72 0.00 -BGO_X0_1 0 9 16 -71.47 34.42 0.99 1.43 25.31 2.67 0.00 -BGO_X0_1 0 9 15 -61.26 34.42 1.00 1.98 21.92 2.72 0.00 -BGO_X0_1 0 9 14 -51.05 34.42 0.99 2.49 25.38 2.67 0.00 -BGO_X0_1 0 9 13 -40.84 34.42 1.00 2.67 20.17 2.59 0.04 -BGO_X0_1 0 9 12 -30.63 34.42 0.99 3.94 20.80 2.69 0.01 -BGO_X0_1 0 9 11 -20.42 34.42 1.00 1.79 23.08 2.64 0.00 -BGO_X0_1 0 9 10 -10.21 34.42 0.99 3.54 21.15 2.69 0.00 -BGO_X0_1 0 9 9 0.00 34.42 1.00 2.97 19.56 2.68 0.00 -BGO_X0_1 0 9 8 10.21 34.42 0.99 0.82 27.75 2.49 0.02 -BGO_X0_1 0 9 7 20.42 34.42 0.99 1.90 18.79 2.83 0.00 -BGO_X0_1 0 9 6 30.63 34.42 1.00 0.78 21.49 2.65 0.00 -BGO_X0_1 0 9 5 40.84 34.42 0.98 3.88 23.63 2.40 0.04 -BGO_X0_1 0 9 4 51.05 34.42 0.98 2.10 19.91 2.95 0.00 -BGO_X0_1 0 9 3 61.26 34.42 0.94 3.20 22.43 2.66 0.00 -BGO_X0_1 0 9 2 71.47 34.42 0.95 0.86 23.01 2.56 0.00 -BGO_X0_1 0 9 1 81.68 34.42 0.96 -0.52 27.31 2.40 0.04 -BGO_X0_1 0 9 0 91.89 34.42 0.95 1.97 23.15 2.75 0.00 -BGO_X0_1 0 10 18 -91.89 44.25 1.00 3.96 24.36 2.67 0.00 -BGO_X0_1 0 10 17 -81.68 44.25 1.00 2.32 25.39 2.47 0.00 -BGO_X0_1 0 10 16 -71.47 44.25 1.01 1.80 19.19 2.95 0.00 -BGO_X0_1 0 10 15 -61.26 44.25 1.00 2.25 18.34 2.85 0.00 -BGO_X0_1 0 10 14 -51.05 44.25 0.99 4.80 22.42 2.65 0.00 -BGO_X0_1 0 10 13 -40.84 44.25 1.02 -0.80 16.27 3.01 0.00 -BGO_X0_1 0 10 12 -30.63 44.25 1.01 0.79 22.96 2.64 0.00 -BGO_X0_1 0 10 11 -20.42 44.25 1.00 1.24 22.01 2.73 0.00 -BGO_X0_1 0 10 10 -10.21 44.25 0.99 3.14 25.39 2.47 0.04 -BGO_X0_1 0 10 9 0.00 44.25 0.97 5.67 21.98 2.65 0.00 -BGO_X0_1 0 10 8 10.21 44.25 0.96 5.35 23.22 2.67 0.02 -BGO_X0_1 0 10 7 20.42 44.25 0.99 -0.82 22.29 2.71 0.00 -BGO_X0_1 0 10 6 30.63 44.25 0.95 5.61 21.18 2.67 0.00 -BGO_X0_1 0 10 5 40.84 44.25 0.97 2.23 20.13 2.70 0.00 -BGO_X0_1 0 10 4 51.05 44.25 0.95 1.44 24.43 2.70 0.00 -BGO_X0_1 0 10 3 61.26 44.25 0.93 4.34 22.98 2.72 0.00 -BGO_X0_1 0 10 2 71.47 44.25 0.95 2.44 23.97 2.77 0.00 -BGO_X0_1 0 10 1 81.68 44.25 0.95 3.32 24.00 2.68 0.00 -BGO_X0_1 0 10 0 91.89 44.25 0.94 3.13 17.71 2.88 0.00 -BGO_X0_1 0 11 18 -91.89 54.08 1.00 2.17 27.47 2.19 0.07 -BGO_X0_1 0 11 17 -81.68 54.08 1.00 2.43 16.38 2.72 0.00 -BGO_X0_1 0 11 16 -71.47 54.08 0.99 3.87 19.87 2.78 0.00 -BGO_X0_1 0 11 15 -61.26 54.08 1.06 -5.15 37.47 0.00 0.11 -BGO_X0_1 0 11 14 -51.05 54.08 1.00 3.13 23.31 2.61 0.00 -BGO_X0_1 0 11 13 -40.84 54.08 0.99 4.25 21.20 2.78 0.00 -BGO_X0_1 0 11 12 -30.63 54.08 1.00 1.58 24.37 2.13 0.08 -BGO_X0_1 0 11 11 -20.42 54.08 1.00 2.07 22.98 2.86 0.00 -BGO_X0_1 0 11 10 -10.21 54.08 0.97 4.57 18.89 2.88 0.00 -BGO_X0_1 0 11 9 0.00 54.08 1.00 1.55 27.46 2.48 0.00 -BGO_X0_1 0 11 8 10.21 54.08 0.98 3.14 22.61 2.63 0.00 -BGO_X0_1 0 11 7 20.42 54.08 0.95 3.81 16.63 2.72 0.00 -BGO_X0_1 0 11 6 30.63 54.08 0.95 3.41 24.89 2.66 0.00 -BGO_X0_1 0 11 5 40.84 54.08 0.94 2.12 24.16 2.35 0.05 -BGO_X0_1 0 11 4 51.05 54.08 0.95 1.83 25.30 2.42 0.04 -BGO_X0_1 0 11 3 61.26 54.08 0.95 1.71 23.72 2.65 0.00 -BGO_X0_1 0 11 2 71.47 54.08 0.95 1.80 19.55 2.81 0.00 -BGO_X0_1 0 11 1 81.68 54.08 0.93 4.14 24.07 2.46 0.05 -BGO_X0_1 0 11 0 91.89 54.08 0.95 2.60 16.28 2.91 0.00 -BGO_X0_1 1 0 18 -91.89 -54.08 1.00 2.17 27.47 2.19 0.07 -BGO_X0_1 1 0 17 -81.68 -54.08 1.00 2.43 16.38 2.72 0.00 -BGO_X0_1 1 0 16 -71.47 -54.08 0.99 3.87 19.87 2.78 0.00 -BGO_X0_1 1 0 15 -61.26 -54.08 1.06 -5.15 37.47 0.00 0.11 -BGO_X0_1 1 0 14 -51.05 -54.08 1.00 3.13 23.31 2.61 0.00 -BGO_X0_1 1 0 13 -40.84 -54.08 0.99 4.25 21.20 2.78 0.00 -BGO_X0_1 1 0 12 -30.63 -54.08 1.00 1.58 24.37 2.13 0.08 -BGO_X0_1 1 0 11 -20.42 -54.08 1.00 2.07 22.98 2.86 0.00 -BGO_X0_1 1 0 10 -10.21 -54.08 0.97 4.57 18.89 2.88 0.00 -BGO_X0_1 1 0 9 0.00 -54.08 1.00 1.55 27.46 2.48 0.00 -BGO_X0_1 1 0 8 10.21 -54.08 0.98 3.14 22.61 2.63 0.00 -BGO_X0_1 1 0 7 20.42 -54.08 0.95 3.81 16.63 2.72 0.00 -BGO_X0_1 1 0 6 30.63 -54.08 0.95 3.41 24.89 2.66 0.00 -BGO_X0_1 1 0 5 40.84 -54.08 0.94 2.12 24.16 2.35 0.05 -BGO_X0_1 1 0 4 51.05 -54.08 0.95 1.83 25.30 2.42 0.04 -BGO_X0_1 1 0 3 61.26 -54.08 0.95 1.71 23.72 2.65 0.00 -BGO_X0_1 1 0 2 71.47 -54.08 0.95 1.80 19.55 2.81 0.00 -BGO_X0_1 1 0 1 81.68 -54.08 0.93 4.14 24.07 2.46 0.05 -BGO_X0_1 1 0 0 91.89 -54.08 0.95 2.60 16.28 2.91 0.00 -BGO_X0_1 1 1 18 -91.89 -44.25 1.00 3.96 24.36 2.67 0.00 -BGO_X0_1 1 1 17 -81.68 -44.25 1.00 2.32 25.39 2.47 0.00 -BGO_X0_1 1 1 16 -71.47 -44.25 1.01 1.80 19.19 2.95 0.00 -BGO_X0_1 1 1 15 -61.26 -44.25 1.00 2.25 18.34 2.85 0.00 -BGO_X0_1 1 1 14 -51.05 -44.25 0.99 4.80 22.42 2.65 0.00 -BGO_X0_1 1 1 13 -40.84 -44.25 1.02 -0.80 16.27 3.01 0.00 -BGO_X0_1 1 1 12 -30.63 -44.25 1.01 0.79 22.96 2.64 0.00 -BGO_X0_1 1 1 11 -20.42 -44.25 1.00 1.24 22.01 2.73 0.00 -BGO_X0_1 1 1 10 -10.21 -44.25 0.99 3.14 25.39 2.47 0.04 -BGO_X0_1 1 1 9 0.00 -44.25 0.97 5.67 21.98 2.65 0.00 -BGO_X0_1 1 1 8 10.21 -44.25 0.96 5.35 23.22 2.67 0.02 -BGO_X0_1 1 1 7 20.42 -44.25 0.99 -0.82 22.29 2.71 0.00 -BGO_X0_1 1 1 6 30.63 -44.25 0.95 5.61 21.18 2.67 0.00 -BGO_X0_1 1 1 5 40.84 -44.25 0.97 2.23 20.13 2.70 0.00 -BGO_X0_1 1 1 4 51.05 -44.25 0.95 1.44 24.43 2.70 0.00 -BGO_X0_1 1 1 3 61.26 -44.25 0.93 4.34 22.98 2.72 0.00 -BGO_X0_1 1 1 2 71.47 -44.25 0.95 2.44 23.97 2.77 0.00 -BGO_X0_1 1 1 1 81.68 -44.25 0.95 3.32 24.00 2.68 0.00 -BGO_X0_1 1 1 0 91.89 -44.25 0.94 3.13 17.71 2.88 0.00 -BGO_X0_1 1 2 18 -91.89 -34.42 0.98 6.64 35.87 0.32 0.10 -BGO_X0_1 1 2 17 -81.68 -34.42 1.00 3.27 22.93 2.72 0.00 -BGO_X0_1 1 2 16 -71.47 -34.42 0.99 1.43 25.31 2.67 0.00 -BGO_X0_1 1 2 15 -61.26 -34.42 1.00 1.98 21.92 2.72 0.00 -BGO_X0_1 1 2 14 -51.05 -34.42 0.99 2.49 25.38 2.67 0.00 -BGO_X0_1 1 2 13 -40.84 -34.42 1.00 2.67 20.17 2.59 0.04 -BGO_X0_1 1 2 12 -30.63 -34.42 0.99 3.94 20.80 2.69 0.01 -BGO_X0_1 1 2 11 -20.42 -34.42 1.00 1.79 23.08 2.64 0.00 -BGO_X0_1 1 2 10 -10.21 -34.42 0.99 3.54 21.15 2.69 0.00 -BGO_X0_1 1 2 9 0.00 -34.42 1.00 2.97 19.56 2.68 0.00 -BGO_X0_1 1 2 8 10.21 -34.42 0.99 0.82 27.75 2.49 0.02 -BGO_X0_1 1 2 7 20.42 -34.42 0.99 1.90 18.79 2.83 0.00 -BGO_X0_1 1 2 6 30.63 -34.42 1.00 0.78 21.49 2.65 0.00 -BGO_X0_1 1 2 5 40.84 -34.42 0.98 3.88 23.63 2.40 0.04 -BGO_X0_1 1 2 4 51.05 -34.42 0.98 2.10 19.91 2.95 0.00 -BGO_X0_1 1 2 3 61.26 -34.42 0.94 3.20 22.43 2.66 0.00 -BGO_X0_1 1 2 2 71.47 -34.42 0.95 0.86 23.01 2.56 0.00 -BGO_X0_1 1 2 1 81.68 -34.42 0.96 -0.52 27.31 2.40 0.04 -BGO_X0_1 1 2 0 91.89 -34.42 0.95 1.97 23.15 2.75 0.00 -BGO_X0_1 1 3 18 -91.89 -24.58 1.02 -0.68 27.00 2.76 0.00 -BGO_X0_1 1 3 17 -81.68 -24.58 0.99 3.81 21.49 2.75 0.00 -BGO_X0_1 1 3 16 -71.47 -24.58 1.01 1.51 14.78 3.04 0.00 -BGO_X0_1 1 3 15 -61.26 -24.58 1.00 2.77 21.24 2.65 0.00 -BGO_X0_1 1 3 14 -51.05 -24.58 0.98 4.55 26.29 2.26 0.08 -BGO_X0_1 1 3 13 -40.84 -24.58 0.99 3.99 16.66 3.01 0.00 -BGO_X0_1 1 3 12 -30.63 -24.58 1.00 2.71 22.63 2.78 0.00 -BGO_X0_1 1 3 11 -20.42 -24.58 1.01 1.60 22.53 2.65 0.00 -BGO_X0_1 1 3 10 -10.21 -24.58 1.00 2.54 21.92 2.61 0.00 -BGO_X0_1 1 3 9 0.00 -24.58 0.98 4.18 19.75 2.89 0.00 -BGO_X0_1 1 3 8 10.21 -24.58 0.99 5.25 26.22 2.31 0.05 -BGO_X0_1 1 3 7 20.42 -24.58 1.02 1.31 26.61 2.68 0.00 -BGO_X0_1 1 3 6 30.63 -24.58 1.01 4.77 25.72 2.59 0.00 -BGO_X0_1 1 3 5 40.84 -24.58 1.02 2.53 22.06 2.74 0.00 -BGO_X0_1 1 3 4 51.05 -24.58 1.02 1.18 22.70 2.60 0.02 -BGO_X0_1 1 3 3 61.26 -24.58 1.03 -1.14 28.64 2.18 0.07 -BGO_X0_1 1 3 2 71.47 -24.58 0.96 3.86 18.73 2.98 0.00 -BGO_X0_1 1 3 1 81.68 -24.58 0.95 -1.23 25.46 2.70 0.00 -BGO_X0_1 1 3 0 91.89 -24.58 0.92 4.73 18.40 2.71 0.00 -BGO_X0_1 1 4 18 -91.89 -14.75 0.99 3.62 19.21 2.89 0.00 -BGO_X0_1 1 4 17 -81.68 -14.75 1.00 1.70 25.76 2.58 0.03 -BGO_X0_1 1 4 16 -71.47 -14.75 1.01 1.47 29.56 2.07 0.06 -BGO_X0_1 1 4 15 -61.26 -14.75 1.00 2.12 19.68 2.88 0.00 -BGO_X0_1 1 4 14 -51.05 -14.75 1.00 2.88 28.98 2.22 0.04 -BGO_X0_1 1 4 13 -40.84 -14.75 1.02 -0.16 23.89 2.62 0.00 -BGO_X0_1 1 4 12 -30.63 -14.75 1.00 3.10 25.43 2.53 0.00 -BGO_X0_1 1 4 11 -20.42 -14.75 0.98 5.12 23.40 2.79 0.00 -BGO_X0_1 1 4 10 -10.21 -14.75 1.01 2.53 24.41 2.76 0.00 -BGO_X0_1 1 4 9 0.00 -14.75 1.01 2.76 22.34 2.77 0.03 -BGO_X0_1 1 4 8 10.21 -14.75 1.00 4.37 23.43 2.96 0.00 -BGO_X0_1 1 4 7 20.42 -14.75 1.03 1.41 20.35 2.84 0.00 -BGO_X0_1 1 4 6 30.63 -14.75 1.03 2.30 19.85 2.89 0.00 -BGO_X0_1 1 4 5 40.84 -14.75 1.06 0.17 26.75 2.30 0.08 -BGO_X0_1 1 4 4 51.05 -14.75 1.05 3.29 16.88 3.21 0.00 -BGO_X0_1 1 4 3 61.26 -14.75 1.07 0.87 26.14 2.16 0.11 -BGO_X0_1 1 4 2 71.47 -14.75 1.06 2.16 17.18 3.45 0.06 -BGO_X0_1 1 4 1 81.68 -14.75 1.02 2.63 23.16 3.76 0.05 -BGO_X0_1 1 4 0 91.89 -14.75 0.93 3.35 15.87 3.21 0.00 -BGO_X0_1 1 5 18 -91.89 -4.92 0.99 2.76 22.78 2.68 0.00 -BGO_X0_1 1 5 17 -81.68 -4.92 1.00 2.38 24.10 2.49 0.03 -BGO_X0_1 1 5 16 -71.47 -4.92 0.98 3.99 23.95 2.65 0.00 -BGO_X0_1 1 5 15 -61.26 -4.92 0.99 3.74 25.25 2.23 0.05 -BGO_X0_1 1 5 14 -51.05 -4.92 1.01 0.91 20.65 2.78 0.00 -BGO_X0_1 1 5 13 -40.84 -4.92 0.99 3.65 22.16 2.65 0.00 -BGO_X0_1 1 5 12 -30.63 -4.92 1.01 0.08 24.77 2.69 0.00 -BGO_X0_1 1 5 11 -20.42 -4.92 1.01 0.74 18.36 2.85 0.00 -BGO_X0_1 1 5 10 -10.21 -4.92 0.99 5.34 23.36 2.70 0.00 -BGO_X0_1 1 5 9 0.00 -4.92 1.01 2.99 20.83 2.82 0.00 -BGO_X0_1 1 5 8 10.21 -4.92 1.01 4.86 20.78 2.93 0.00 -BGO_X0_1 1 5 7 20.42 -4.92 1.03 4.37 27.58 2.23 0.07 -BGO_X0_1 1 5 6 30.63 -4.92 1.04 3.11 22.64 2.90 0.00 -BGO_X0_1 1 5 5 40.84 -4.92 1.06 2.64 23.39 2.85 0.00 -BGO_X0_1 1 5 4 51.05 -4.92 1.09 2.42 15.99 3.16 0.00 -BGO_X0_1 1 5 3 61.26 -4.92 1.10 2.91 19.07 3.30 0.07 -BGO_X0_1 1 5 2 71.47 -4.92 1.17 -0.86 26.47 2.09 0.15 -BGO_X0_1 1 5 1 81.68 -4.92 1.22 1.14 31.73 1.85 0.19 -BGO_X0_1 1 5 0 91.89 -4.92 1.21 1.22 27.15 3.88 0.42 -BGO_X0_1 1 6 18 -91.89 4.92 0.99 2.76 22.78 2.68 0.00 -BGO_X0_1 1 6 17 -81.68 4.92 1.00 2.38 24.10 2.49 0.03 -BGO_X0_1 1 6 16 -71.47 4.92 0.98 3.99 23.95 2.65 0.00 -BGO_X0_1 1 6 15 -61.26 4.92 0.99 3.74 25.25 2.23 0.05 -BGO_X0_1 1 6 14 -51.05 4.92 1.01 0.91 20.65 2.78 0.00 -BGO_X0_1 1 6 13 -40.84 4.92 0.99 3.65 22.16 2.65 0.00 -BGO_X0_1 1 6 12 -30.63 4.92 1.01 0.08 24.77 2.69 0.00 -BGO_X0_1 1 6 11 -20.42 4.92 1.01 0.74 18.36 2.85 0.00 -BGO_X0_1 1 6 10 -10.21 4.92 0.99 5.34 23.36 2.70 0.00 -BGO_X0_1 1 6 9 0.00 4.92 1.01 2.99 20.83 2.82 0.00 -BGO_X0_1 1 6 8 10.21 4.92 1.01 4.86 20.78 2.93 0.00 -BGO_X0_1 1 6 7 20.42 4.92 1.03 4.37 27.58 2.23 0.07 -BGO_X0_1 1 6 6 30.63 4.92 1.04 3.11 22.64 2.90 0.00 -BGO_X0_1 1 6 5 40.84 4.92 1.06 2.64 23.39 2.85 0.00 -BGO_X0_1 1 6 4 51.05 4.92 1.09 2.42 15.99 3.16 0.00 -BGO_X0_1 1 6 3 61.26 4.92 1.10 2.91 19.07 3.30 0.07 -BGO_X0_1 1 6 2 71.47 4.92 1.17 -0.86 26.47 2.09 0.15 -BGO_X0_1 1 6 1 81.68 4.92 1.22 1.14 31.73 1.85 0.19 -BGO_X0_1 1 6 0 91.89 4.92 1.21 1.22 27.15 3.88 0.42 -BGO_X0_1 1 7 18 -91.89 14.75 0.99 3.62 19.21 2.89 0.00 -BGO_X0_1 1 7 17 -81.68 14.75 1.00 1.70 25.76 2.58 0.03 -BGO_X0_1 1 7 16 -71.47 14.75 1.01 1.47 29.56 2.07 0.06 -BGO_X0_1 1 7 15 -61.26 14.75 1.00 2.12 19.68 2.88 0.00 -BGO_X0_1 1 7 14 -51.05 14.75 1.00 2.88 28.98 2.22 0.04 -BGO_X0_1 1 7 13 -40.84 14.75 1.02 -0.16 23.89 2.62 0.00 -BGO_X0_1 1 7 12 -30.63 14.75 1.00 3.10 25.43 2.53 0.00 -BGO_X0_1 1 7 11 -20.42 14.75 0.98 5.12 23.40 2.79 0.00 -BGO_X0_1 1 7 10 -10.21 14.75 1.01 2.53 24.41 2.76 0.00 -BGO_X0_1 1 7 9 0.00 14.75 1.01 2.76 22.34 2.77 0.03 -BGO_X0_1 1 7 8 10.21 14.75 1.00 4.37 23.43 2.96 0.00 -BGO_X0_1 1 7 7 20.42 14.75 1.03 1.41 20.35 2.84 0.00 -BGO_X0_1 1 7 6 30.63 14.75 1.03 2.30 19.85 2.89 0.00 -BGO_X0_1 1 7 5 40.84 14.75 1.06 0.17 26.75 2.30 0.08 -BGO_X0_1 1 7 4 51.05 14.75 1.05 3.29 16.88 3.21 0.00 -BGO_X0_1 1 7 3 61.26 14.75 1.07 0.87 26.14 2.16 0.11 -BGO_X0_1 1 7 2 71.47 14.75 1.06 2.16 17.18 3.45 0.06 -BGO_X0_1 1 7 1 81.68 14.75 1.02 2.63 23.16 3.76 0.05 -BGO_X0_1 1 7 0 91.89 14.75 0.93 3.35 15.87 3.21 0.00 -BGO_X0_1 1 8 18 -91.89 24.58 1.02 -0.68 27.00 2.76 0.00 -BGO_X0_1 1 8 17 -81.68 24.58 0.99 3.81 21.49 2.75 0.00 -BGO_X0_1 1 8 16 -71.47 24.58 1.01 1.51 14.78 3.04 0.00 -BGO_X0_1 1 8 15 -61.26 24.58 1.00 2.77 21.24 2.65 0.00 -BGO_X0_1 1 8 14 -51.05 24.58 0.98 4.55 26.29 2.26 0.08 -BGO_X0_1 1 8 13 -40.84 24.58 0.99 3.99 16.66 3.01 0.00 -BGO_X0_1 1 8 12 -30.63 24.58 1.00 2.71 22.63 2.78 0.00 -BGO_X0_1 1 8 11 -20.42 24.58 1.01 1.60 22.53 2.65 0.00 -BGO_X0_1 1 8 10 -10.21 24.58 1.00 2.54 21.92 2.61 0.00 -BGO_X0_1 1 8 9 0.00 24.58 0.98 4.18 19.75 2.89 0.00 -BGO_X0_1 1 8 8 10.21 24.58 0.99 5.25 26.22 2.31 0.05 -BGO_X0_1 1 8 7 20.42 24.58 1.02 1.31 26.61 2.68 0.00 -BGO_X0_1 1 8 6 30.63 24.58 1.01 4.77 25.72 2.59 0.00 -BGO_X0_1 1 8 5 40.84 24.58 1.02 2.53 22.06 2.74 0.00 -BGO_X0_1 1 8 4 51.05 24.58 1.02 1.18 22.70 2.60 0.02 -BGO_X0_1 1 8 3 61.26 24.58 1.03 -1.14 28.64 2.18 0.07 -BGO_X0_1 1 8 2 71.47 24.58 0.96 3.86 18.73 2.98 0.00 -BGO_X0_1 1 8 1 81.68 24.58 0.95 -1.23 25.46 2.70 0.00 -BGO_X0_1 1 8 0 91.89 24.58 0.92 4.73 18.40 2.71 0.00 -BGO_X0_1 1 9 18 -91.89 34.42 0.98 6.64 35.87 0.32 0.10 -BGO_X0_1 1 9 17 -81.68 34.42 1.00 3.27 22.93 2.72 0.00 -BGO_X0_1 1 9 16 -71.47 34.42 0.99 1.43 25.31 2.67 0.00 -BGO_X0_1 1 9 15 -61.26 34.42 1.00 1.98 21.92 2.72 0.00 -BGO_X0_1 1 9 14 -51.05 34.42 0.99 2.49 25.38 2.67 0.00 -BGO_X0_1 1 9 13 -40.84 34.42 1.00 2.67 20.17 2.59 0.04 -BGO_X0_1 1 9 12 -30.63 34.42 0.99 3.94 20.80 2.69 0.01 -BGO_X0_1 1 9 11 -20.42 34.42 1.00 1.79 23.08 2.64 0.00 -BGO_X0_1 1 9 10 -10.21 34.42 0.99 3.54 21.15 2.69 0.00 -BGO_X0_1 1 9 9 0.00 34.42 1.00 2.97 19.56 2.68 0.00 -BGO_X0_1 1 9 8 10.21 34.42 0.99 0.82 27.75 2.49 0.02 -BGO_X0_1 1 9 7 20.42 34.42 0.99 1.90 18.79 2.83 0.00 -BGO_X0_1 1 9 6 30.63 34.42 1.00 0.78 21.49 2.65 0.00 -BGO_X0_1 1 9 5 40.84 34.42 0.98 3.88 23.63 2.40 0.04 -BGO_X0_1 1 9 4 51.05 34.42 0.98 2.10 19.91 2.95 0.00 -BGO_X0_1 1 9 3 61.26 34.42 0.94 3.20 22.43 2.66 0.00 -BGO_X0_1 1 9 2 71.47 34.42 0.95 0.86 23.01 2.56 0.00 -BGO_X0_1 1 9 1 81.68 34.42 0.96 -0.52 27.31 2.40 0.04 -BGO_X0_1 1 9 0 91.89 34.42 0.95 1.97 23.15 2.75 0.00 -BGO_X0_1 1 10 18 -91.89 44.25 1.00 3.96 24.36 2.67 0.00 -BGO_X0_1 1 10 17 -81.68 44.25 1.00 2.32 25.39 2.47 0.00 -BGO_X0_1 1 10 16 -71.47 44.25 1.01 1.80 19.19 2.95 0.00 -BGO_X0_1 1 10 15 -61.26 44.25 1.00 2.25 18.34 2.85 0.00 -BGO_X0_1 1 10 14 -51.05 44.25 0.99 4.80 22.42 2.65 0.00 -BGO_X0_1 1 10 13 -40.84 44.25 1.02 -0.80 16.27 3.01 0.00 -BGO_X0_1 1 10 12 -30.63 44.25 1.01 0.79 22.96 2.64 0.00 -BGO_X0_1 1 10 11 -20.42 44.25 1.00 1.24 22.01 2.73 0.00 -BGO_X0_1 1 10 10 -10.21 44.25 0.99 3.14 25.39 2.47 0.04 -BGO_X0_1 1 10 9 0.00 44.25 0.97 5.67 21.98 2.65 0.00 -BGO_X0_1 1 10 8 10.21 44.25 0.96 5.35 23.22 2.67 0.02 -BGO_X0_1 1 10 7 20.42 44.25 0.99 -0.82 22.29 2.71 0.00 -BGO_X0_1 1 10 6 30.63 44.25 0.95 5.61 21.18 2.67 0.00 -BGO_X0_1 1 10 5 40.84 44.25 0.97 2.23 20.13 2.70 0.00 -BGO_X0_1 1 10 4 51.05 44.25 0.95 1.44 24.43 2.70 0.00 -BGO_X0_1 1 10 3 61.26 44.25 0.93 4.34 22.98 2.72 0.00 -BGO_X0_1 1 10 2 71.47 44.25 0.95 2.44 23.97 2.77 0.00 -BGO_X0_1 1 10 1 81.68 44.25 0.95 3.32 24.00 2.68 0.00 -BGO_X0_1 1 10 0 91.89 44.25 0.94 3.13 17.71 2.88 0.00 -BGO_X0_1 1 11 18 -91.89 54.08 1.00 2.17 27.47 2.19 0.07 -BGO_X0_1 1 11 17 -81.68 54.08 1.00 2.43 16.38 2.72 0.00 -BGO_X0_1 1 11 16 -71.47 54.08 0.99 3.87 19.87 2.78 0.00 -BGO_X0_1 1 11 15 -61.26 54.08 1.06 -5.15 37.47 0.00 0.11 -BGO_X0_1 1 11 14 -51.05 54.08 1.00 3.13 23.31 2.61 0.00 -BGO_X0_1 1 11 13 -40.84 54.08 0.99 4.25 21.20 2.78 0.00 -BGO_X0_1 1 11 12 -30.63 54.08 1.00 1.58 24.37 2.13 0.08 -BGO_X0_1 1 11 11 -20.42 54.08 1.00 2.07 22.98 2.86 0.00 -BGO_X0_1 1 11 10 -10.21 54.08 0.97 4.57 18.89 2.88 0.00 -BGO_X0_1 1 11 9 0.00 54.08 1.00 1.55 27.46 2.48 0.00 -BGO_X0_1 1 11 8 10.21 54.08 0.98 3.14 22.61 2.63 0.00 -BGO_X0_1 1 11 7 20.42 54.08 0.95 3.81 16.63 2.72 0.00 -BGO_X0_1 1 11 6 30.63 54.08 0.95 3.41 24.89 2.66 0.00 -BGO_X0_1 1 11 5 40.84 54.08 0.94 2.12 24.16 2.35 0.05 -BGO_X0_1 1 11 4 51.05 54.08 0.95 1.83 25.30 2.42 0.04 -BGO_X0_1 1 11 3 61.26 54.08 0.95 1.71 23.72 2.65 0.00 -BGO_X0_1 1 11 2 71.47 54.08 0.95 1.80 19.55 2.81 0.00 -BGO_X0_1 1 11 1 81.68 54.08 0.93 4.14 24.07 2.46 0.05 -BGO_X0_1 1 11 0 91.89 54.08 0.95 2.60 16.28 2.91 0.00 -BGO_X0_2 0 0 18 -91.89 -54.08 1.00 2.17 27.47 2.19 0.07 -BGO_X0_2 0 0 17 -81.68 -54.08 1.00 2.43 16.38 2.72 0.00 -BGO_X0_2 0 0 16 -71.47 -54.08 0.99 3.87 19.87 2.78 0.00 -BGO_X0_2 0 0 15 -61.26 -54.08 1.06 -5.15 37.47 0.00 0.11 -BGO_X0_2 0 0 14 -51.05 -54.08 1.00 3.13 23.31 2.61 0.00 -BGO_X0_2 0 0 13 -40.84 -54.08 0.99 4.25 21.20 2.78 0.00 -BGO_X0_2 0 0 12 -30.63 -54.08 1.00 1.58 24.37 2.13 0.08 -BGO_X0_2 0 0 11 -20.42 -54.08 1.00 2.07 22.98 2.86 0.00 -BGO_X0_2 0 0 10 -10.21 -54.08 0.97 4.57 18.89 2.88 0.00 -BGO_X0_2 0 0 9 0.00 -54.08 1.00 1.55 27.46 2.48 0.00 -BGO_X0_2 0 0 8 10.21 -54.08 0.98 3.14 22.61 2.63 0.00 -BGO_X0_2 0 0 7 20.42 -54.08 0.95 3.81 16.63 2.72 0.00 -BGO_X0_2 0 0 6 30.63 -54.08 0.95 3.41 24.89 2.66 0.00 -BGO_X0_2 0 0 5 40.84 -54.08 0.94 2.12 24.16 2.35 0.05 -BGO_X0_2 0 0 4 51.05 -54.08 0.95 1.83 25.30 2.42 0.04 -BGO_X0_2 0 0 3 61.26 -54.08 0.95 1.71 23.72 2.65 0.00 -BGO_X0_2 0 0 2 71.47 -54.08 0.95 1.80 19.55 2.81 0.00 -BGO_X0_2 0 0 1 81.68 -54.08 0.93 4.14 24.07 2.46 0.05 -BGO_X0_2 0 0 0 91.89 -54.08 0.95 2.60 16.28 2.91 0.00 -BGO_X0_2 0 1 18 -91.89 -44.25 1.00 3.96 24.36 2.67 0.00 -BGO_X0_2 0 1 17 -81.68 -44.25 1.00 2.32 25.39 2.47 0.00 -BGO_X0_2 0 1 16 -71.47 -44.25 1.01 1.80 19.19 2.95 0.00 -BGO_X0_2 0 1 15 -61.26 -44.25 1.00 2.25 18.34 2.85 0.00 -BGO_X0_2 0 1 14 -51.05 -44.25 0.99 4.80 22.42 2.65 0.00 -BGO_X0_2 0 1 13 -40.84 -44.25 1.02 -0.80 16.27 3.01 0.00 -BGO_X0_2 0 1 12 -30.63 -44.25 1.01 0.79 22.96 2.64 0.00 -BGO_X0_2 0 1 11 -20.42 -44.25 1.00 1.24 22.01 2.73 0.00 -BGO_X0_2 0 1 10 -10.21 -44.25 0.99 3.14 25.39 2.47 0.04 -BGO_X0_2 0 1 9 0.00 -44.25 0.97 5.67 21.98 2.65 0.00 -BGO_X0_2 0 1 8 10.21 -44.25 0.96 5.35 23.22 2.67 0.02 -BGO_X0_2 0 1 7 20.42 -44.25 0.99 -0.82 22.29 2.71 0.00 -BGO_X0_2 0 1 6 30.63 -44.25 0.95 5.61 21.18 2.67 0.00 -BGO_X0_2 0 1 5 40.84 -44.25 0.97 2.23 20.13 2.70 0.00 -BGO_X0_2 0 1 4 51.05 -44.25 0.95 1.44 24.43 2.70 0.00 -BGO_X0_2 0 1 3 61.26 -44.25 0.93 4.34 22.98 2.72 0.00 -BGO_X0_2 0 1 2 71.47 -44.25 0.95 2.44 23.97 2.77 0.00 -BGO_X0_2 0 1 1 81.68 -44.25 0.95 3.32 24.00 2.68 0.00 -BGO_X0_2 0 1 0 91.89 -44.25 0.94 3.13 17.71 2.88 0.00 -BGO_X0_2 0 2 18 -91.89 -34.42 0.98 6.64 35.87 0.32 0.10 -BGO_X0_2 0 2 17 -81.68 -34.42 1.00 3.27 22.93 2.72 0.00 -BGO_X0_2 0 2 16 -71.47 -34.42 0.99 1.43 25.31 2.67 0.00 -BGO_X0_2 0 2 15 -61.26 -34.42 1.00 1.98 21.92 2.72 0.00 -BGO_X0_2 0 2 14 -51.05 -34.42 0.99 2.49 25.38 2.67 0.00 -BGO_X0_2 0 2 13 -40.84 -34.42 1.00 2.67 20.17 2.59 0.04 -BGO_X0_2 0 2 12 -30.63 -34.42 0.99 3.94 20.80 2.69 0.01 -BGO_X0_2 0 2 11 -20.42 -34.42 1.00 1.79 23.08 2.64 0.00 -BGO_X0_2 0 2 10 -10.21 -34.42 0.99 3.54 21.15 2.69 0.00 -BGO_X0_2 0 2 9 0.00 -34.42 1.00 2.97 19.56 2.68 0.00 -BGO_X0_2 0 2 8 10.21 -34.42 0.99 0.82 27.75 2.49 0.02 -BGO_X0_2 0 2 7 20.42 -34.42 0.99 1.90 18.79 2.83 0.00 -BGO_X0_2 0 2 6 30.63 -34.42 1.00 0.78 21.49 2.65 0.00 -BGO_X0_2 0 2 5 40.84 -34.42 0.98 3.88 23.63 2.40 0.04 -BGO_X0_2 0 2 4 51.05 -34.42 0.98 2.10 19.91 2.95 0.00 -BGO_X0_2 0 2 3 61.26 -34.42 0.94 3.20 22.43 2.66 0.00 -BGO_X0_2 0 2 2 71.47 -34.42 0.95 0.86 23.01 2.56 0.00 -BGO_X0_2 0 2 1 81.68 -34.42 0.96 -0.52 27.31 2.40 0.04 -BGO_X0_2 0 2 0 91.89 -34.42 0.95 1.97 23.15 2.75 0.00 -BGO_X0_2 0 3 18 -91.89 -24.58 1.02 -0.68 27.00 2.76 0.00 -BGO_X0_2 0 3 17 -81.68 -24.58 0.99 3.81 21.49 2.75 0.00 -BGO_X0_2 0 3 16 -71.47 -24.58 1.01 1.51 14.78 3.04 0.00 -BGO_X0_2 0 3 15 -61.26 -24.58 1.00 2.77 21.24 2.65 0.00 -BGO_X0_2 0 3 14 -51.05 -24.58 0.98 4.55 26.29 2.26 0.08 -BGO_X0_2 0 3 13 -40.84 -24.58 0.99 3.99 16.66 3.01 0.00 -BGO_X0_2 0 3 12 -30.63 -24.58 1.00 2.71 22.63 2.78 0.00 -BGO_X0_2 0 3 11 -20.42 -24.58 1.01 1.60 22.53 2.65 0.00 -BGO_X0_2 0 3 10 -10.21 -24.58 1.00 2.54 21.92 2.61 0.00 -BGO_X0_2 0 3 9 0.00 -24.58 0.98 4.18 19.75 2.89 0.00 -BGO_X0_2 0 3 8 10.21 -24.58 0.99 5.25 26.22 2.31 0.05 -BGO_X0_2 0 3 7 20.42 -24.58 1.02 1.31 26.61 2.68 0.00 -BGO_X0_2 0 3 6 30.63 -24.58 1.01 4.77 25.72 2.59 0.00 -BGO_X0_2 0 3 5 40.84 -24.58 1.02 2.53 22.06 2.74 0.00 -BGO_X0_2 0 3 4 51.05 -24.58 1.02 1.18 22.70 2.60 0.02 -BGO_X0_2 0 3 3 61.26 -24.58 1.03 -1.14 28.64 2.18 0.07 -BGO_X0_2 0 3 2 71.47 -24.58 0.96 3.86 18.73 2.98 0.00 -BGO_X0_2 0 3 1 81.68 -24.58 0.95 -1.23 25.46 2.70 0.00 -BGO_X0_2 0 3 0 91.89 -24.58 0.92 4.73 18.40 2.71 0.00 -BGO_X0_2 0 4 18 -91.89 -14.75 0.99 3.62 19.21 2.89 0.00 -BGO_X0_2 0 4 17 -81.68 -14.75 1.00 1.70 25.76 2.58 0.03 -BGO_X0_2 0 4 16 -71.47 -14.75 1.01 1.47 29.56 2.07 0.06 -BGO_X0_2 0 4 15 -61.26 -14.75 1.00 2.12 19.68 2.88 0.00 -BGO_X0_2 0 4 14 -51.05 -14.75 1.00 2.88 28.98 2.22 0.04 -BGO_X0_2 0 4 13 -40.84 -14.75 1.02 -0.16 23.89 2.62 0.00 -BGO_X0_2 0 4 12 -30.63 -14.75 1.00 3.10 25.43 2.53 0.00 -BGO_X0_2 0 4 11 -20.42 -14.75 0.98 5.12 23.40 2.79 0.00 -BGO_X0_2 0 4 10 -10.21 -14.75 1.01 2.53 24.41 2.76 0.00 -BGO_X0_2 0 4 9 0.00 -14.75 1.01 2.76 22.34 2.77 0.03 -BGO_X0_2 0 4 8 10.21 -14.75 1.00 4.37 23.43 2.96 0.00 -BGO_X0_2 0 4 7 20.42 -14.75 1.03 1.41 20.35 2.84 0.00 -BGO_X0_2 0 4 6 30.63 -14.75 1.03 2.30 19.85 2.89 0.00 -BGO_X0_2 0 4 5 40.84 -14.75 1.06 0.17 26.75 2.30 0.08 -BGO_X0_2 0 4 4 51.05 -14.75 1.05 3.29 16.88 3.21 0.00 -BGO_X0_2 0 4 3 61.26 -14.75 1.07 0.87 26.14 2.16 0.11 -BGO_X0_2 0 4 2 71.47 -14.75 1.06 2.16 17.18 3.45 0.06 -BGO_X0_2 0 4 1 81.68 -14.75 1.02 2.63 23.16 3.76 0.05 -BGO_X0_2 0 4 0 91.89 -14.75 0.93 3.35 15.87 3.21 0.00 -BGO_X0_2 0 5 18 -91.89 -4.92 0.99 2.76 22.78 2.68 0.00 -BGO_X0_2 0 5 17 -81.68 -4.92 1.00 2.38 24.10 2.49 0.03 -BGO_X0_2 0 5 16 -71.47 -4.92 0.98 3.99 23.95 2.65 0.00 -BGO_X0_2 0 5 15 -61.26 -4.92 0.99 3.74 25.25 2.23 0.05 -BGO_X0_2 0 5 14 -51.05 -4.92 1.01 0.91 20.65 2.78 0.00 -BGO_X0_2 0 5 13 -40.84 -4.92 0.99 3.65 22.16 2.65 0.00 -BGO_X0_2 0 5 12 -30.63 -4.92 1.01 0.08 24.77 2.69 0.00 -BGO_X0_2 0 5 11 -20.42 -4.92 1.01 0.74 18.36 2.85 0.00 -BGO_X0_2 0 5 10 -10.21 -4.92 0.99 5.34 23.36 2.70 0.00 -BGO_X0_2 0 5 9 0.00 -4.92 1.01 2.99 20.83 2.82 0.00 -BGO_X0_2 0 5 8 10.21 -4.92 1.01 4.86 20.78 2.93 0.00 -BGO_X0_2 0 5 7 20.42 -4.92 1.03 4.37 27.58 2.23 0.07 -BGO_X0_2 0 5 6 30.63 -4.92 1.04 3.11 22.64 2.90 0.00 -BGO_X0_2 0 5 5 40.84 -4.92 1.06 2.64 23.39 2.85 0.00 -BGO_X0_2 0 5 4 51.05 -4.92 1.09 2.42 15.99 3.16 0.00 -BGO_X0_2 0 5 3 61.26 -4.92 1.10 2.91 19.07 3.30 0.07 -BGO_X0_2 0 5 2 71.47 -4.92 1.17 -0.86 26.47 2.09 0.15 -BGO_X0_2 0 5 1 81.68 -4.92 1.22 1.14 31.73 1.85 0.19 -BGO_X0_2 0 5 0 91.89 -4.92 1.21 1.22 27.15 3.88 0.42 -BGO_X0_2 0 6 18 -91.89 4.92 0.99 2.76 22.78 2.68 0.00 -BGO_X0_2 0 6 17 -81.68 4.92 1.00 2.38 24.10 2.49 0.03 -BGO_X0_2 0 6 16 -71.47 4.92 0.98 3.99 23.95 2.65 0.00 -BGO_X0_2 0 6 15 -61.26 4.92 0.99 3.74 25.25 2.23 0.05 -BGO_X0_2 0 6 14 -51.05 4.92 1.01 0.91 20.65 2.78 0.00 -BGO_X0_2 0 6 13 -40.84 4.92 0.99 3.65 22.16 2.65 0.00 -BGO_X0_2 0 6 12 -30.63 4.92 1.01 0.08 24.77 2.69 0.00 -BGO_X0_2 0 6 11 -20.42 4.92 1.01 0.74 18.36 2.85 0.00 -BGO_X0_2 0 6 10 -10.21 4.92 0.99 5.34 23.36 2.70 0.00 -BGO_X0_2 0 6 9 0.00 4.92 1.01 2.99 20.83 2.82 0.00 -BGO_X0_2 0 6 8 10.21 4.92 1.01 4.86 20.78 2.93 0.00 -BGO_X0_2 0 6 7 20.42 4.92 1.03 4.37 27.58 2.23 0.07 -BGO_X0_2 0 6 6 30.63 4.92 1.04 3.11 22.64 2.90 0.00 -BGO_X0_2 0 6 5 40.84 4.92 1.06 2.64 23.39 2.85 0.00 -BGO_X0_2 0 6 4 51.05 4.92 1.09 2.42 15.99 3.16 0.00 -BGO_X0_2 0 6 3 61.26 4.92 1.10 2.91 19.07 3.30 0.07 -BGO_X0_2 0 6 2 71.47 4.92 1.17 -0.86 26.47 2.09 0.15 -BGO_X0_2 0 6 1 81.68 4.92 1.22 1.14 31.73 1.85 0.19 -BGO_X0_2 0 6 0 91.89 4.92 1.21 1.22 27.15 3.88 0.42 -BGO_X0_2 0 7 18 -91.89 14.75 0.99 3.62 19.21 2.89 0.00 -BGO_X0_2 0 7 17 -81.68 14.75 1.00 1.70 25.76 2.58 0.03 -BGO_X0_2 0 7 16 -71.47 14.75 1.01 1.47 29.56 2.07 0.06 -BGO_X0_2 0 7 15 -61.26 14.75 1.00 2.12 19.68 2.88 0.00 -BGO_X0_2 0 7 14 -51.05 14.75 1.00 2.88 28.98 2.22 0.04 -BGO_X0_2 0 7 13 -40.84 14.75 1.02 -0.16 23.89 2.62 0.00 -BGO_X0_2 0 7 12 -30.63 14.75 1.00 3.10 25.43 2.53 0.00 -BGO_X0_2 0 7 11 -20.42 14.75 0.98 5.12 23.40 2.79 0.00 -BGO_X0_2 0 7 10 -10.21 14.75 1.01 2.53 24.41 2.76 0.00 -BGO_X0_2 0 7 9 0.00 14.75 1.01 2.76 22.34 2.77 0.03 -BGO_X0_2 0 7 8 10.21 14.75 1.00 4.37 23.43 2.96 0.00 -BGO_X0_2 0 7 7 20.42 14.75 1.03 1.41 20.35 2.84 0.00 -BGO_X0_2 0 7 6 30.63 14.75 1.03 2.30 19.85 2.89 0.00 -BGO_X0_2 0 7 5 40.84 14.75 1.06 0.17 26.75 2.30 0.08 -BGO_X0_2 0 7 4 51.05 14.75 1.05 3.29 16.88 3.21 0.00 -BGO_X0_2 0 7 3 61.26 14.75 1.07 0.87 26.14 2.16 0.11 -BGO_X0_2 0 7 2 71.47 14.75 1.06 2.16 17.18 3.45 0.06 -BGO_X0_2 0 7 1 81.68 14.75 1.02 2.63 23.16 3.76 0.05 -BGO_X0_2 0 7 0 91.89 14.75 0.93 3.35 15.87 3.21 0.00 -BGO_X0_2 0 8 18 -91.89 24.58 1.02 -0.68 27.00 2.76 0.00 -BGO_X0_2 0 8 17 -81.68 24.58 0.99 3.81 21.49 2.75 0.00 -BGO_X0_2 0 8 16 -71.47 24.58 1.01 1.51 14.78 3.04 0.00 -BGO_X0_2 0 8 15 -61.26 24.58 1.00 2.77 21.24 2.65 0.00 -BGO_X0_2 0 8 14 -51.05 24.58 0.98 4.55 26.29 2.26 0.08 -BGO_X0_2 0 8 13 -40.84 24.58 0.99 3.99 16.66 3.01 0.00 -BGO_X0_2 0 8 12 -30.63 24.58 1.00 2.71 22.63 2.78 0.00 -BGO_X0_2 0 8 11 -20.42 24.58 1.01 1.60 22.53 2.65 0.00 -BGO_X0_2 0 8 10 -10.21 24.58 1.00 2.54 21.92 2.61 0.00 -BGO_X0_2 0 8 9 0.00 24.58 0.98 4.18 19.75 2.89 0.00 -BGO_X0_2 0 8 8 10.21 24.58 0.99 5.25 26.22 2.31 0.05 -BGO_X0_2 0 8 7 20.42 24.58 1.02 1.31 26.61 2.68 0.00 -BGO_X0_2 0 8 6 30.63 24.58 1.01 4.77 25.72 2.59 0.00 -BGO_X0_2 0 8 5 40.84 24.58 1.02 2.53 22.06 2.74 0.00 -BGO_X0_2 0 8 4 51.05 24.58 1.02 1.18 22.70 2.60 0.02 -BGO_X0_2 0 8 3 61.26 24.58 1.03 -1.14 28.64 2.18 0.07 -BGO_X0_2 0 8 2 71.47 24.58 0.96 3.86 18.73 2.98 0.00 -BGO_X0_2 0 8 1 81.68 24.58 0.95 -1.23 25.46 2.70 0.00 -BGO_X0_2 0 8 0 91.89 24.58 0.92 4.73 18.40 2.71 0.00 -BGO_X0_2 0 9 18 -91.89 34.42 0.98 6.64 35.87 0.32 0.10 -BGO_X0_2 0 9 17 -81.68 34.42 1.00 3.27 22.93 2.72 0.00 -BGO_X0_2 0 9 16 -71.47 34.42 0.99 1.43 25.31 2.67 0.00 -BGO_X0_2 0 9 15 -61.26 34.42 1.00 1.98 21.92 2.72 0.00 -BGO_X0_2 0 9 14 -51.05 34.42 0.99 2.49 25.38 2.67 0.00 -BGO_X0_2 0 9 13 -40.84 34.42 1.00 2.67 20.17 2.59 0.04 -BGO_X0_2 0 9 12 -30.63 34.42 0.99 3.94 20.80 2.69 0.01 -BGO_X0_2 0 9 11 -20.42 34.42 1.00 1.79 23.08 2.64 0.00 -BGO_X0_2 0 9 10 -10.21 34.42 0.99 3.54 21.15 2.69 0.00 -BGO_X0_2 0 9 9 0.00 34.42 1.00 2.97 19.56 2.68 0.00 -BGO_X0_2 0 9 8 10.21 34.42 0.99 0.82 27.75 2.49 0.02 -BGO_X0_2 0 9 7 20.42 34.42 0.99 1.90 18.79 2.83 0.00 -BGO_X0_2 0 9 6 30.63 34.42 1.00 0.78 21.49 2.65 0.00 -BGO_X0_2 0 9 5 40.84 34.42 0.98 3.88 23.63 2.40 0.04 -BGO_X0_2 0 9 4 51.05 34.42 0.98 2.10 19.91 2.95 0.00 -BGO_X0_2 0 9 3 61.26 34.42 0.94 3.20 22.43 2.66 0.00 -BGO_X0_2 0 9 2 71.47 34.42 0.95 0.86 23.01 2.56 0.00 -BGO_X0_2 0 9 1 81.68 34.42 0.96 -0.52 27.31 2.40 0.04 -BGO_X0_2 0 9 0 91.89 34.42 0.95 1.97 23.15 2.75 0.00 -BGO_X0_2 0 10 18 -91.89 44.25 1.00 3.96 24.36 2.67 0.00 -BGO_X0_2 0 10 17 -81.68 44.25 1.00 2.32 25.39 2.47 0.00 -BGO_X0_2 0 10 16 -71.47 44.25 1.01 1.80 19.19 2.95 0.00 -BGO_X0_2 0 10 15 -61.26 44.25 1.00 2.25 18.34 2.85 0.00 -BGO_X0_2 0 10 14 -51.05 44.25 0.99 4.80 22.42 2.65 0.00 -BGO_X0_2 0 10 13 -40.84 44.25 1.02 -0.80 16.27 3.01 0.00 -BGO_X0_2 0 10 12 -30.63 44.25 1.01 0.79 22.96 2.64 0.00 -BGO_X0_2 0 10 11 -20.42 44.25 1.00 1.24 22.01 2.73 0.00 -BGO_X0_2 0 10 10 -10.21 44.25 0.99 3.14 25.39 2.47 0.04 -BGO_X0_2 0 10 9 0.00 44.25 0.97 5.67 21.98 2.65 0.00 -BGO_X0_2 0 10 8 10.21 44.25 0.96 5.35 23.22 2.67 0.02 -BGO_X0_2 0 10 7 20.42 44.25 0.99 -0.82 22.29 2.71 0.00 -BGO_X0_2 0 10 6 30.63 44.25 0.95 5.61 21.18 2.67 0.00 -BGO_X0_2 0 10 5 40.84 44.25 0.97 2.23 20.13 2.70 0.00 -BGO_X0_2 0 10 4 51.05 44.25 0.95 1.44 24.43 2.70 0.00 -BGO_X0_2 0 10 3 61.26 44.25 0.93 4.34 22.98 2.72 0.00 -BGO_X0_2 0 10 2 71.47 44.25 0.95 2.44 23.97 2.77 0.00 -BGO_X0_2 0 10 1 81.68 44.25 0.95 3.32 24.00 2.68 0.00 -BGO_X0_2 0 10 0 91.89 44.25 0.94 3.13 17.71 2.88 0.00 -BGO_X0_2 0 11 18 -91.89 54.08 1.00 2.17 27.47 2.19 0.07 -BGO_X0_2 0 11 17 -81.68 54.08 1.00 2.43 16.38 2.72 0.00 -BGO_X0_2 0 11 16 -71.47 54.08 0.99 3.87 19.87 2.78 0.00 -BGO_X0_2 0 11 15 -61.26 54.08 1.06 -5.15 37.47 0.00 0.11 -BGO_X0_2 0 11 14 -51.05 54.08 1.00 3.13 23.31 2.61 0.00 -BGO_X0_2 0 11 13 -40.84 54.08 0.99 4.25 21.20 2.78 0.00 -BGO_X0_2 0 11 12 -30.63 54.08 1.00 1.58 24.37 2.13 0.08 -BGO_X0_2 0 11 11 -20.42 54.08 1.00 2.07 22.98 2.86 0.00 -BGO_X0_2 0 11 10 -10.21 54.08 0.97 4.57 18.89 2.88 0.00 -BGO_X0_2 0 11 9 0.00 54.08 1.00 1.55 27.46 2.48 0.00 -BGO_X0_2 0 11 8 10.21 54.08 0.98 3.14 22.61 2.63 0.00 -BGO_X0_2 0 11 7 20.42 54.08 0.95 3.81 16.63 2.72 0.00 -BGO_X0_2 0 11 6 30.63 54.08 0.95 3.41 24.89 2.66 0.00 -BGO_X0_2 0 11 5 40.84 54.08 0.94 2.12 24.16 2.35 0.05 -BGO_X0_2 0 11 4 51.05 54.08 0.95 1.83 25.30 2.42 0.04 -BGO_X0_2 0 11 3 61.26 54.08 0.95 1.71 23.72 2.65 0.00 -BGO_X0_2 0 11 2 71.47 54.08 0.95 1.80 19.55 2.81 0.00 -BGO_X0_2 0 11 1 81.68 54.08 0.93 4.14 24.07 2.46 0.05 -BGO_X0_2 0 11 0 91.89 54.08 0.95 2.60 16.28 2.91 0.00 -BGO_X0_2 1 0 18 -91.89 -54.08 1.00 2.17 27.47 2.19 0.07 -BGO_X0_2 1 0 17 -81.68 -54.08 1.00 2.43 16.38 2.72 0.00 -BGO_X0_2 1 0 16 -71.47 -54.08 0.99 3.87 19.87 2.78 0.00 -BGO_X0_2 1 0 15 -61.26 -54.08 1.06 -5.15 37.47 0.00 0.11 -BGO_X0_2 1 0 14 -51.05 -54.08 1.00 3.13 23.31 2.61 0.00 -BGO_X0_2 1 0 13 -40.84 -54.08 0.99 4.25 21.20 2.78 0.00 -BGO_X0_2 1 0 12 -30.63 -54.08 1.00 1.58 24.37 2.13 0.08 -BGO_X0_2 1 0 11 -20.42 -54.08 1.00 2.07 22.98 2.86 0.00 -BGO_X0_2 1 0 10 -10.21 -54.08 0.97 4.57 18.89 2.88 0.00 -BGO_X0_2 1 0 9 0.00 -54.08 1.00 1.55 27.46 2.48 0.00 -BGO_X0_2 1 0 8 10.21 -54.08 0.98 3.14 22.61 2.63 0.00 -BGO_X0_2 1 0 7 20.42 -54.08 0.95 3.81 16.63 2.72 0.00 -BGO_X0_2 1 0 6 30.63 -54.08 0.95 3.41 24.89 2.66 0.00 -BGO_X0_2 1 0 5 40.84 -54.08 0.94 2.12 24.16 2.35 0.05 -BGO_X0_2 1 0 4 51.05 -54.08 0.95 1.83 25.30 2.42 0.04 -BGO_X0_2 1 0 3 61.26 -54.08 0.95 1.71 23.72 2.65 0.00 -BGO_X0_2 1 0 2 71.47 -54.08 0.95 1.80 19.55 2.81 0.00 -BGO_X0_2 1 0 1 81.68 -54.08 0.93 4.14 24.07 2.46 0.05 -BGO_X0_2 1 0 0 91.89 -54.08 0.95 2.60 16.28 2.91 0.00 -BGO_X0_2 1 1 18 -91.89 -44.25 1.00 3.96 24.36 2.67 0.00 -BGO_X0_2 1 1 17 -81.68 -44.25 1.00 2.32 25.39 2.47 0.00 -BGO_X0_2 1 1 16 -71.47 -44.25 1.01 1.80 19.19 2.95 0.00 -BGO_X0_2 1 1 15 -61.26 -44.25 1.00 2.25 18.34 2.85 0.00 -BGO_X0_2 1 1 14 -51.05 -44.25 0.99 4.80 22.42 2.65 0.00 -BGO_X0_2 1 1 13 -40.84 -44.25 1.02 -0.80 16.27 3.01 0.00 -BGO_X0_2 1 1 12 -30.63 -44.25 1.01 0.79 22.96 2.64 0.00 -BGO_X0_2 1 1 11 -20.42 -44.25 1.00 1.24 22.01 2.73 0.00 -BGO_X0_2 1 1 10 -10.21 -44.25 0.99 3.14 25.39 2.47 0.04 -BGO_X0_2 1 1 9 0.00 -44.25 0.97 5.67 21.98 2.65 0.00 -BGO_X0_2 1 1 8 10.21 -44.25 0.96 5.35 23.22 2.67 0.02 -BGO_X0_2 1 1 7 20.42 -44.25 0.99 -0.82 22.29 2.71 0.00 -BGO_X0_2 1 1 6 30.63 -44.25 0.95 5.61 21.18 2.67 0.00 -BGO_X0_2 1 1 5 40.84 -44.25 0.97 2.23 20.13 2.70 0.00 -BGO_X0_2 1 1 4 51.05 -44.25 0.95 1.44 24.43 2.70 0.00 -BGO_X0_2 1 1 3 61.26 -44.25 0.93 4.34 22.98 2.72 0.00 -BGO_X0_2 1 1 2 71.47 -44.25 0.95 2.44 23.97 2.77 0.00 -BGO_X0_2 1 1 1 81.68 -44.25 0.95 3.32 24.00 2.68 0.00 -BGO_X0_2 1 1 0 91.89 -44.25 0.94 3.13 17.71 2.88 0.00 -BGO_X0_2 1 2 18 -91.89 -34.42 0.98 6.64 35.87 0.32 0.10 -BGO_X0_2 1 2 17 -81.68 -34.42 1.00 3.27 22.93 2.72 0.00 -BGO_X0_2 1 2 16 -71.47 -34.42 0.99 1.43 25.31 2.67 0.00 -BGO_X0_2 1 2 15 -61.26 -34.42 1.00 1.98 21.92 2.72 0.00 -BGO_X0_2 1 2 14 -51.05 -34.42 0.99 2.49 25.38 2.67 0.00 -BGO_X0_2 1 2 13 -40.84 -34.42 1.00 2.67 20.17 2.59 0.04 -BGO_X0_2 1 2 12 -30.63 -34.42 0.99 3.94 20.80 2.69 0.01 -BGO_X0_2 1 2 11 -20.42 -34.42 1.00 1.79 23.08 2.64 0.00 -BGO_X0_2 1 2 10 -10.21 -34.42 0.99 3.54 21.15 2.69 0.00 -BGO_X0_2 1 2 9 0.00 -34.42 1.00 2.97 19.56 2.68 0.00 -BGO_X0_2 1 2 8 10.21 -34.42 0.99 0.82 27.75 2.49 0.02 -BGO_X0_2 1 2 7 20.42 -34.42 0.99 1.90 18.79 2.83 0.00 -BGO_X0_2 1 2 6 30.63 -34.42 1.00 0.78 21.49 2.65 0.00 -BGO_X0_2 1 2 5 40.84 -34.42 0.98 3.88 23.63 2.40 0.04 -BGO_X0_2 1 2 4 51.05 -34.42 0.98 2.10 19.91 2.95 0.00 -BGO_X0_2 1 2 3 61.26 -34.42 0.94 3.20 22.43 2.66 0.00 -BGO_X0_2 1 2 2 71.47 -34.42 0.95 0.86 23.01 2.56 0.00 -BGO_X0_2 1 2 1 81.68 -34.42 0.96 -0.52 27.31 2.40 0.04 -BGO_X0_2 1 2 0 91.89 -34.42 0.95 1.97 23.15 2.75 0.00 -BGO_X0_2 1 3 18 -91.89 -24.58 1.02 -0.68 27.00 2.76 0.00 -BGO_X0_2 1 3 17 -81.68 -24.58 0.99 3.81 21.49 2.75 0.00 -BGO_X0_2 1 3 16 -71.47 -24.58 1.01 1.51 14.78 3.04 0.00 -BGO_X0_2 1 3 15 -61.26 -24.58 1.00 2.77 21.24 2.65 0.00 -BGO_X0_2 1 3 14 -51.05 -24.58 0.98 4.55 26.29 2.26 0.08 -BGO_X0_2 1 3 13 -40.84 -24.58 0.99 3.99 16.66 3.01 0.00 -BGO_X0_2 1 3 12 -30.63 -24.58 1.00 2.71 22.63 2.78 0.00 -BGO_X0_2 1 3 11 -20.42 -24.58 1.01 1.60 22.53 2.65 0.00 -BGO_X0_2 1 3 10 -10.21 -24.58 1.00 2.54 21.92 2.61 0.00 -BGO_X0_2 1 3 9 0.00 -24.58 0.98 4.18 19.75 2.89 0.00 -BGO_X0_2 1 3 8 10.21 -24.58 0.99 5.25 26.22 2.31 0.05 -BGO_X0_2 1 3 7 20.42 -24.58 1.02 1.31 26.61 2.68 0.00 -BGO_X0_2 1 3 6 30.63 -24.58 1.01 4.77 25.72 2.59 0.00 -BGO_X0_2 1 3 5 40.84 -24.58 1.02 2.53 22.06 2.74 0.00 -BGO_X0_2 1 3 4 51.05 -24.58 1.02 1.18 22.70 2.60 0.02 -BGO_X0_2 1 3 3 61.26 -24.58 1.03 -1.14 28.64 2.18 0.07 -BGO_X0_2 1 3 2 71.47 -24.58 0.96 3.86 18.73 2.98 0.00 -BGO_X0_2 1 3 1 81.68 -24.58 0.95 -1.23 25.46 2.70 0.00 -BGO_X0_2 1 3 0 91.89 -24.58 0.92 4.73 18.40 2.71 0.00 -BGO_X0_2 1 4 18 -91.89 -14.75 0.99 3.62 19.21 2.89 0.00 -BGO_X0_2 1 4 17 -81.68 -14.75 1.00 1.70 25.76 2.58 0.03 -BGO_X0_2 1 4 16 -71.47 -14.75 1.01 1.47 29.56 2.07 0.06 -BGO_X0_2 1 4 15 -61.26 -14.75 1.00 2.12 19.68 2.88 0.00 -BGO_X0_2 1 4 14 -51.05 -14.75 1.00 2.88 28.98 2.22 0.04 -BGO_X0_2 1 4 13 -40.84 -14.75 1.02 -0.16 23.89 2.62 0.00 -BGO_X0_2 1 4 12 -30.63 -14.75 1.00 3.10 25.43 2.53 0.00 -BGO_X0_2 1 4 11 -20.42 -14.75 0.98 5.12 23.40 2.79 0.00 -BGO_X0_2 1 4 10 -10.21 -14.75 1.01 2.53 24.41 2.76 0.00 -BGO_X0_2 1 4 9 0.00 -14.75 1.01 2.76 22.34 2.77 0.03 -BGO_X0_2 1 4 8 10.21 -14.75 1.00 4.37 23.43 2.96 0.00 -BGO_X0_2 1 4 7 20.42 -14.75 1.03 1.41 20.35 2.84 0.00 -BGO_X0_2 1 4 6 30.63 -14.75 1.03 2.30 19.85 2.89 0.00 -BGO_X0_2 1 4 5 40.84 -14.75 1.06 0.17 26.75 2.30 0.08 -BGO_X0_2 1 4 4 51.05 -14.75 1.05 3.29 16.88 3.21 0.00 -BGO_X0_2 1 4 3 61.26 -14.75 1.07 0.87 26.14 2.16 0.11 -BGO_X0_2 1 4 2 71.47 -14.75 1.06 2.16 17.18 3.45 0.06 -BGO_X0_2 1 4 1 81.68 -14.75 1.02 2.63 23.16 3.76 0.05 -BGO_X0_2 1 4 0 91.89 -14.75 0.93 3.35 15.87 3.21 0.00 -BGO_X0_2 1 5 18 -91.89 -4.92 0.99 2.76 22.78 2.68 0.00 -BGO_X0_2 1 5 17 -81.68 -4.92 1.00 2.38 24.10 2.49 0.03 -BGO_X0_2 1 5 16 -71.47 -4.92 0.98 3.99 23.95 2.65 0.00 -BGO_X0_2 1 5 15 -61.26 -4.92 0.99 3.74 25.25 2.23 0.05 -BGO_X0_2 1 5 14 -51.05 -4.92 1.01 0.91 20.65 2.78 0.00 -BGO_X0_2 1 5 13 -40.84 -4.92 0.99 3.65 22.16 2.65 0.00 -BGO_X0_2 1 5 12 -30.63 -4.92 1.01 0.08 24.77 2.69 0.00 -BGO_X0_2 1 5 11 -20.42 -4.92 1.01 0.74 18.36 2.85 0.00 -BGO_X0_2 1 5 10 -10.21 -4.92 0.99 5.34 23.36 2.70 0.00 -BGO_X0_2 1 5 9 0.00 -4.92 1.01 2.99 20.83 2.82 0.00 -BGO_X0_2 1 5 8 10.21 -4.92 1.01 4.86 20.78 2.93 0.00 -BGO_X0_2 1 5 7 20.42 -4.92 1.03 4.37 27.58 2.23 0.07 -BGO_X0_2 1 5 6 30.63 -4.92 1.04 3.11 22.64 2.90 0.00 -BGO_X0_2 1 5 5 40.84 -4.92 1.06 2.64 23.39 2.85 0.00 -BGO_X0_2 1 5 4 51.05 -4.92 1.09 2.42 15.99 3.16 0.00 -BGO_X0_2 1 5 3 61.26 -4.92 1.10 2.91 19.07 3.30 0.07 -BGO_X0_2 1 5 2 71.47 -4.92 1.17 -0.86 26.47 2.09 0.15 -BGO_X0_2 1 5 1 81.68 -4.92 1.22 1.14 31.73 1.85 0.19 -BGO_X0_2 1 5 0 91.89 -4.92 1.21 1.22 27.15 3.88 0.42 -BGO_X0_2 1 6 18 -91.89 4.92 0.99 2.76 22.78 2.68 0.00 -BGO_X0_2 1 6 17 -81.68 4.92 1.00 2.38 24.10 2.49 0.03 -BGO_X0_2 1 6 16 -71.47 4.92 0.98 3.99 23.95 2.65 0.00 -BGO_X0_2 1 6 15 -61.26 4.92 0.99 3.74 25.25 2.23 0.05 -BGO_X0_2 1 6 14 -51.05 4.92 1.01 0.91 20.65 2.78 0.00 -BGO_X0_2 1 6 13 -40.84 4.92 0.99 3.65 22.16 2.65 0.00 -BGO_X0_2 1 6 12 -30.63 4.92 1.01 0.08 24.77 2.69 0.00 -BGO_X0_2 1 6 11 -20.42 4.92 1.01 0.74 18.36 2.85 0.00 -BGO_X0_2 1 6 10 -10.21 4.92 0.99 5.34 23.36 2.70 0.00 -BGO_X0_2 1 6 9 0.00 4.92 1.01 2.99 20.83 2.82 0.00 -BGO_X0_2 1 6 8 10.21 4.92 1.01 4.86 20.78 2.93 0.00 -BGO_X0_2 1 6 7 20.42 4.92 1.03 4.37 27.58 2.23 0.07 -BGO_X0_2 1 6 6 30.63 4.92 1.04 3.11 22.64 2.90 0.00 -BGO_X0_2 1 6 5 40.84 4.92 1.06 2.64 23.39 2.85 0.00 -BGO_X0_2 1 6 4 51.05 4.92 1.09 2.42 15.99 3.16 0.00 -BGO_X0_2 1 6 3 61.26 4.92 1.10 2.91 19.07 3.30 0.07 -BGO_X0_2 1 6 2 71.47 4.92 1.17 -0.86 26.47 2.09 0.15 -BGO_X0_2 1 6 1 81.68 4.92 1.22 1.14 31.73 1.85 0.19 -BGO_X0_2 1 6 0 91.89 4.92 1.21 1.22 27.15 3.88 0.42 -BGO_X0_2 1 7 18 -91.89 14.75 0.99 3.62 19.21 2.89 0.00 -BGO_X0_2 1 7 17 -81.68 14.75 1.00 1.70 25.76 2.58 0.03 -BGO_X0_2 1 7 16 -71.47 14.75 1.01 1.47 29.56 2.07 0.06 -BGO_X0_2 1 7 15 -61.26 14.75 1.00 2.12 19.68 2.88 0.00 -BGO_X0_2 1 7 14 -51.05 14.75 1.00 2.88 28.98 2.22 0.04 -BGO_X0_2 1 7 13 -40.84 14.75 1.02 -0.16 23.89 2.62 0.00 -BGO_X0_2 1 7 12 -30.63 14.75 1.00 3.10 25.43 2.53 0.00 -BGO_X0_2 1 7 11 -20.42 14.75 0.98 5.12 23.40 2.79 0.00 -BGO_X0_2 1 7 10 -10.21 14.75 1.01 2.53 24.41 2.76 0.00 -BGO_X0_2 1 7 9 0.00 14.75 1.01 2.76 22.34 2.77 0.03 -BGO_X0_2 1 7 8 10.21 14.75 1.00 4.37 23.43 2.96 0.00 -BGO_X0_2 1 7 7 20.42 14.75 1.03 1.41 20.35 2.84 0.00 -BGO_X0_2 1 7 6 30.63 14.75 1.03 2.30 19.85 2.89 0.00 -BGO_X0_2 1 7 5 40.84 14.75 1.06 0.17 26.75 2.30 0.08 -BGO_X0_2 1 7 4 51.05 14.75 1.05 3.29 16.88 3.21 0.00 -BGO_X0_2 1 7 3 61.26 14.75 1.07 0.87 26.14 2.16 0.11 -BGO_X0_2 1 7 2 71.47 14.75 1.06 2.16 17.18 3.45 0.06 -BGO_X0_2 1 7 1 81.68 14.75 1.02 2.63 23.16 3.76 0.05 -BGO_X0_2 1 7 0 91.89 14.75 0.93 3.35 15.87 3.21 0.00 -BGO_X0_2 1 8 18 -91.89 24.58 1.02 -0.68 27.00 2.76 0.00 -BGO_X0_2 1 8 17 -81.68 24.58 0.99 3.81 21.49 2.75 0.00 -BGO_X0_2 1 8 16 -71.47 24.58 1.01 1.51 14.78 3.04 0.00 -BGO_X0_2 1 8 15 -61.26 24.58 1.00 2.77 21.24 2.65 0.00 -BGO_X0_2 1 8 14 -51.05 24.58 0.98 4.55 26.29 2.26 0.08 -BGO_X0_2 1 8 13 -40.84 24.58 0.99 3.99 16.66 3.01 0.00 -BGO_X0_2 1 8 12 -30.63 24.58 1.00 2.71 22.63 2.78 0.00 -BGO_X0_2 1 8 11 -20.42 24.58 1.01 1.60 22.53 2.65 0.00 -BGO_X0_2 1 8 10 -10.21 24.58 1.00 2.54 21.92 2.61 0.00 -BGO_X0_2 1 8 9 0.00 24.58 0.98 4.18 19.75 2.89 0.00 -BGO_X0_2 1 8 8 10.21 24.58 0.99 5.25 26.22 2.31 0.05 -BGO_X0_2 1 8 7 20.42 24.58 1.02 1.31 26.61 2.68 0.00 -BGO_X0_2 1 8 6 30.63 24.58 1.01 4.77 25.72 2.59 0.00 -BGO_X0_2 1 8 5 40.84 24.58 1.02 2.53 22.06 2.74 0.00 -BGO_X0_2 1 8 4 51.05 24.58 1.02 1.18 22.70 2.60 0.02 -BGO_X0_2 1 8 3 61.26 24.58 1.03 -1.14 28.64 2.18 0.07 -BGO_X0_2 1 8 2 71.47 24.58 0.96 3.86 18.73 2.98 0.00 -BGO_X0_2 1 8 1 81.68 24.58 0.95 -1.23 25.46 2.70 0.00 -BGO_X0_2 1 8 0 91.89 24.58 0.92 4.73 18.40 2.71 0.00 -BGO_X0_2 1 9 18 -91.89 34.42 0.98 6.64 35.87 0.32 0.10 -BGO_X0_2 1 9 17 -81.68 34.42 1.00 3.27 22.93 2.72 0.00 -BGO_X0_2 1 9 16 -71.47 34.42 0.99 1.43 25.31 2.67 0.00 -BGO_X0_2 1 9 15 -61.26 34.42 1.00 1.98 21.92 2.72 0.00 -BGO_X0_2 1 9 14 -51.05 34.42 0.99 2.49 25.38 2.67 0.00 -BGO_X0_2 1 9 13 -40.84 34.42 1.00 2.67 20.17 2.59 0.04 -BGO_X0_2 1 9 12 -30.63 34.42 0.99 3.94 20.80 2.69 0.01 -BGO_X0_2 1 9 11 -20.42 34.42 1.00 1.79 23.08 2.64 0.00 -BGO_X0_2 1 9 10 -10.21 34.42 0.99 3.54 21.15 2.69 0.00 -BGO_X0_2 1 9 9 0.00 34.42 1.00 2.97 19.56 2.68 0.00 -BGO_X0_2 1 9 8 10.21 34.42 0.99 0.82 27.75 2.49 0.02 -BGO_X0_2 1 9 7 20.42 34.42 0.99 1.90 18.79 2.83 0.00 -BGO_X0_2 1 9 6 30.63 34.42 1.00 0.78 21.49 2.65 0.00 -BGO_X0_2 1 9 5 40.84 34.42 0.98 3.88 23.63 2.40 0.04 -BGO_X0_2 1 9 4 51.05 34.42 0.98 2.10 19.91 2.95 0.00 -BGO_X0_2 1 9 3 61.26 34.42 0.94 3.20 22.43 2.66 0.00 -BGO_X0_2 1 9 2 71.47 34.42 0.95 0.86 23.01 2.56 0.00 -BGO_X0_2 1 9 1 81.68 34.42 0.96 -0.52 27.31 2.40 0.04 -BGO_X0_2 1 9 0 91.89 34.42 0.95 1.97 23.15 2.75 0.00 -BGO_X0_2 1 10 18 -91.89 44.25 1.00 3.96 24.36 2.67 0.00 -BGO_X0_2 1 10 17 -81.68 44.25 1.00 2.32 25.39 2.47 0.00 -BGO_X0_2 1 10 16 -71.47 44.25 1.01 1.80 19.19 2.95 0.00 -BGO_X0_2 1 10 15 -61.26 44.25 1.00 2.25 18.34 2.85 0.00 -BGO_X0_2 1 10 14 -51.05 44.25 0.99 4.80 22.42 2.65 0.00 -BGO_X0_2 1 10 13 -40.84 44.25 1.02 -0.80 16.27 3.01 0.00 -BGO_X0_2 1 10 12 -30.63 44.25 1.01 0.79 22.96 2.64 0.00 -BGO_X0_2 1 10 11 -20.42 44.25 1.00 1.24 22.01 2.73 0.00 -BGO_X0_2 1 10 10 -10.21 44.25 0.99 3.14 25.39 2.47 0.04 -BGO_X0_2 1 10 9 0.00 44.25 0.97 5.67 21.98 2.65 0.00 -BGO_X0_2 1 10 8 10.21 44.25 0.96 5.35 23.22 2.67 0.02 -BGO_X0_2 1 10 7 20.42 44.25 0.99 -0.82 22.29 2.71 0.00 -BGO_X0_2 1 10 6 30.63 44.25 0.95 5.61 21.18 2.67 0.00 -BGO_X0_2 1 10 5 40.84 44.25 0.97 2.23 20.13 2.70 0.00 -BGO_X0_2 1 10 4 51.05 44.25 0.95 1.44 24.43 2.70 0.00 -BGO_X0_2 1 10 3 61.26 44.25 0.93 4.34 22.98 2.72 0.00 -BGO_X0_2 1 10 2 71.47 44.25 0.95 2.44 23.97 2.77 0.00 -BGO_X0_2 1 10 1 81.68 44.25 0.95 3.32 24.00 2.68 0.00 -BGO_X0_2 1 10 0 91.89 44.25 0.94 3.13 17.71 2.88 0.00 -BGO_X0_2 1 11 18 -91.89 54.08 1.00 2.17 27.47 2.19 0.07 -BGO_X0_2 1 11 17 -81.68 54.08 1.00 2.43 16.38 2.72 0.00 -BGO_X0_2 1 11 16 -71.47 54.08 0.99 3.87 19.87 2.78 0.00 -BGO_X0_2 1 11 15 -61.26 54.08 1.06 -5.15 37.47 0.00 0.11 -BGO_X0_2 1 11 14 -51.05 54.08 1.00 3.13 23.31 2.61 0.00 -BGO_X0_2 1 11 13 -40.84 54.08 0.99 4.25 21.20 2.78 0.00 -BGO_X0_2 1 11 12 -30.63 54.08 1.00 1.58 24.37 2.13 0.08 -BGO_X0_2 1 11 11 -20.42 54.08 1.00 2.07 22.98 2.86 0.00 -BGO_X0_2 1 11 10 -10.21 54.08 0.97 4.57 18.89 2.88 0.00 -BGO_X0_2 1 11 9 0.00 54.08 1.00 1.55 27.46 2.48 0.00 -BGO_X0_2 1 11 8 10.21 54.08 0.98 3.14 22.61 2.63 0.00 -BGO_X0_2 1 11 7 20.42 54.08 0.95 3.81 16.63 2.72 0.00 -BGO_X0_2 1 11 6 30.63 54.08 0.95 3.41 24.89 2.66 0.00 -BGO_X0_2 1 11 5 40.84 54.08 0.94 2.12 24.16 2.35 0.05 -BGO_X0_2 1 11 4 51.05 54.08 0.95 1.83 25.30 2.42 0.04 -BGO_X0_2 1 11 3 61.26 54.08 0.95 1.71 23.72 2.65 0.00 -BGO_X0_2 1 11 2 71.47 54.08 0.95 1.80 19.55 2.81 0.00 -BGO_X0_2 1 11 1 81.68 54.08 0.93 4.14 24.07 2.46 0.05 -BGO_X0_2 1 11 0 91.89 54.08 0.95 2.60 16.28 2.91 0.00 -BGO_Y0_0 0 0 18 -91.89 -50.45 0.99 3.65 22.26 2.73 0.00 -BGO_Y0_0 0 0 17 -81.68 -50.45 1.02 0.98 20.34 2.83 0.00 -BGO_Y0_0 0 0 16 -71.47 -50.45 1.02 0.46 23.55 2.77 0.00 -BGO_Y0_0 0 0 15 -61.26 -50.45 1.00 4.44 23.98 2.18 0.09 -BGO_Y0_0 0 0 14 -51.05 -50.45 1.01 2.61 18.26 2.96 0.00 -BGO_Y0_0 0 0 13 -40.84 -50.45 0.99 5.24 28.92 2.00 0.07 -BGO_Y0_0 0 0 12 -30.63 -50.45 1.01 1.17 15.49 2.89 0.00 -BGO_Y0_0 0 0 11 -20.42 -50.45 1.01 2.64 25.85 2.38 0.05 -BGO_Y0_0 0 0 10 -10.21 -50.45 1.00 2.56 21.01 2.68 0.00 -BGO_Y0_0 0 0 9 0.00 -50.45 0.99 2.33 20.91 2.76 0.00 -BGO_Y0_0 0 0 8 10.21 -50.45 0.99 1.85 27.44 1.71 0.08 -BGO_Y0_0 0 0 7 20.42 -50.45 0.99 1.68 26.18 2.11 0.06 -BGO_Y0_0 0 0 6 30.63 -50.45 0.96 3.70 19.20 2.76 0.00 -BGO_Y0_0 0 0 5 40.84 -50.45 0.95 2.46 21.18 2.74 0.00 -BGO_Y0_0 0 0 4 51.05 -50.45 0.94 3.44 21.19 2.83 0.00 -BGO_Y0_0 0 0 3 61.26 -50.45 0.93 3.49 23.34 2.59 0.03 -BGO_Y0_0 0 0 2 71.47 -50.45 0.94 3.83 19.84 2.71 0.01 -BGO_Y0_0 0 0 1 81.68 -50.45 0.95 3.08 23.05 2.72 0.00 -BGO_Y0_0 0 0 0 91.89 -50.45 0.93 5.51 21.93 2.71 0.00 -BGO_Y0_0 1 0 18 -91.89 -40.36 0.99 5.41 27.85 2.00 0.08 -BGO_Y0_0 1 0 17 -81.68 -40.36 1.00 2.38 22.41 2.74 0.00 -BGO_Y0_0 1 0 16 -71.47 -40.36 1.01 1.00 21.95 2.66 0.00 -BGO_Y0_0 1 0 15 -61.26 -40.36 0.97 6.88 33.51 0.00 0.12 -BGO_Y0_0 1 0 14 -51.05 -40.36 0.98 5.51 20.94 2.71 0.00 -BGO_Y0_0 1 0 13 -40.84 -40.36 0.99 5.39 21.18 2.40 0.06 -BGO_Y0_0 1 0 12 -30.63 -40.36 1.00 3.77 20.83 2.73 0.00 -BGO_Y0_0 1 0 11 -20.42 -40.36 1.00 3.49 18.44 2.81 0.00 -BGO_Y0_0 1 0 10 -10.21 -40.36 1.00 1.43 27.05 2.60 0.00 -BGO_Y0_0 1 0 9 0.00 -40.36 0.99 2.28 27.94 2.23 0.06 -BGO_Y0_0 1 0 8 10.21 -40.36 0.99 4.03 23.87 2.73 0.00 -BGO_Y0_0 1 0 7 20.42 -40.36 0.97 3.26 23.35 2.76 0.00 -BGO_Y0_0 1 0 6 30.63 -40.36 0.96 4.53 25.93 2.57 0.00 -BGO_Y0_0 1 0 5 40.84 -40.36 0.98 1.27 21.98 2.76 0.00 -BGO_Y0_0 1 0 4 51.05 -40.36 0.96 3.29 18.75 2.85 0.00 -BGO_Y0_0 1 0 3 61.26 -40.36 0.96 0.72 22.58 2.69 0.00 -BGO_Y0_0 1 0 2 71.47 -40.36 0.95 2.52 27.56 2.35 0.04 -BGO_Y0_0 1 0 1 81.68 -40.36 0.95 1.51 26.31 2.17 0.05 -BGO_Y0_0 1 0 0 91.89 -40.36 0.94 3.94 26.12 2.24 0.07 -BGO_Y0_0 2 0 18 -91.89 -30.27 1.00 3.57 22.94 2.65 0.00 -BGO_Y0_0 2 0 17 -81.68 -30.27 1.01 2.47 27.87 2.15 0.07 -BGO_Y0_0 2 0 16 -71.47 -30.27 1.01 0.39 28.55 1.38 0.10 -BGO_Y0_0 2 0 15 -61.26 -30.27 0.99 4.32 19.93 2.75 0.00 -BGO_Y0_0 2 0 14 -51.05 -30.27 0.99 4.40 16.85 2.89 0.00 -BGO_Y0_0 2 0 13 -40.84 -30.27 1.01 1.70 26.41 2.15 0.07 -BGO_Y0_0 2 0 12 -30.63 -30.27 0.99 4.11 24.51 2.57 0.00 -BGO_Y0_0 2 0 11 -20.42 -30.27 0.98 7.13 19.56 2.83 0.00 -BGO_Y0_0 2 0 10 -10.21 -30.27 1.01 0.83 17.65 2.80 0.00 -BGO_Y0_0 2 0 9 0.00 -30.27 1.00 2.63 22.11 2.55 0.00 -BGO_Y0_0 2 0 8 10.21 -30.27 0.99 2.92 25.87 2.57 0.01 -BGO_Y0_0 2 0 7 20.42 -30.27 0.99 3.77 21.29 2.75 0.00 -BGO_Y0_0 2 0 6 30.63 -30.27 1.00 2.82 22.83 2.55 0.05 -BGO_Y0_0 2 0 5 40.84 -30.27 0.99 3.04 22.71 2.64 0.00 -BGO_Y0_0 2 0 4 51.05 -30.27 0.99 1.64 20.32 2.80 0.00 -BGO_Y0_0 2 0 3 61.26 -30.27 0.98 0.39 21.75 2.68 0.00 -BGO_Y0_0 2 0 2 71.47 -30.27 0.93 5.13 24.41 2.52 0.01 -BGO_Y0_0 2 0 1 81.68 -30.27 0.95 2.68 22.48 2.72 0.00 -BGO_Y0_0 2 0 0 91.89 -30.27 0.94 3.66 24.44 2.44 0.03 -BGO_Y0_0 3 0 18 -91.89 -20.18 0.99 4.33 24.41 2.65 0.00 -BGO_Y0_0 3 0 17 -81.68 -20.18 1.00 3.76 22.12 2.71 0.00 -BGO_Y0_0 3 0 16 -71.47 -20.18 0.99 4.70 29.19 2.44 0.00 -BGO_Y0_0 3 0 15 -61.26 -20.18 1.00 2.01 22.86 2.73 0.00 -BGO_Y0_0 3 0 14 -51.05 -20.18 0.98 5.03 22.59 2.69 0.00 -BGO_Y0_0 3 0 13 -40.84 -20.18 1.00 1.97 22.46 2.78 0.00 -BGO_Y0_0 3 0 12 -30.63 -20.18 1.00 2.15 24.79 2.70 0.00 -BGO_Y0_0 3 0 11 -20.42 -20.18 0.99 4.65 31.31 1.87 0.09 -BGO_Y0_0 3 0 10 -10.21 -20.18 1.00 3.88 23.92 2.82 0.00 -BGO_Y0_0 3 0 9 0.00 -20.18 1.00 3.31 18.53 2.91 0.00 -BGO_Y0_0 3 0 8 10.21 -20.18 1.01 3.51 18.40 2.79 0.00 -BGO_Y0_0 3 0 7 20.42 -20.18 1.02 2.90 20.89 2.67 0.03 -BGO_Y0_0 3 0 6 30.63 -20.18 1.03 1.88 23.07 2.81 0.00 -BGO_Y0_0 3 0 5 40.84 -20.18 1.02 3.40 17.98 3.11 0.00 -BGO_Y0_0 3 0 4 51.05 -20.18 1.03 2.79 34.62 0.38 0.11 -BGO_Y0_0 3 0 3 61.26 -20.18 1.00 4.96 23.84 2.34 0.08 -BGO_Y0_0 3 0 2 71.47 -20.18 1.01 2.47 20.72 3.05 0.00 -BGO_Y0_0 3 0 1 81.68 -20.18 0.97 -1.32 32.19 0.99 0.11 -BGO_Y0_0 3 0 0 91.89 -20.18 0.93 1.85 25.14 2.15 0.06 -BGO_Y0_0 4 0 18 -91.89 -10.09 0.99 2.78 21.91 2.68 0.00 -BGO_Y0_0 4 0 17 -81.68 -10.09 0.99 6.11 29.83 1.12 0.11 -BGO_Y0_0 4 0 16 -71.47 -10.09 0.99 4.93 22.84 2.74 0.00 -BGO_Y0_0 4 0 15 -61.26 -10.09 1.00 1.01 21.75 2.66 0.00 -BGO_Y0_0 4 0 14 -51.05 -10.09 1.00 2.72 22.60 2.58 0.02 -BGO_Y0_0 4 0 13 -40.84 -10.09 0.99 3.64 30.28 1.61 0.08 -BGO_Y0_0 4 0 12 -30.63 -10.09 1.00 2.04 23.27 2.48 0.05 -BGO_Y0_0 4 0 11 -20.42 -10.09 0.99 4.58 21.72 2.75 0.00 -BGO_Y0_0 4 0 10 -10.21 -10.09 1.00 2.47 26.71 2.27 0.06 -BGO_Y0_0 4 0 9 0.00 -10.09 1.00 3.17 23.21 2.71 0.00 -BGO_Y0_0 4 0 8 10.21 -10.09 1.01 4.67 18.52 3.04 0.00 -BGO_Y0_0 4 0 7 20.42 -10.09 1.02 3.11 28.39 2.34 0.06 -BGO_Y0_0 4 0 6 30.63 -10.09 1.04 2.89 18.60 3.16 0.00 -BGO_Y0_0 4 0 5 40.84 -10.09 1.04 2.83 17.92 3.21 0.00 -BGO_Y0_0 4 0 4 51.05 -10.09 1.06 1.98 20.50 3.18 0.00 -BGO_Y0_0 4 0 3 61.26 -10.09 1.07 4.15 25.16 2.56 0.10 -BGO_Y0_0 4 0 2 71.47 -10.09 1.10 2.31 20.44 3.51 0.05 -BGO_Y0_0 4 0 1 81.68 -10.09 1.09 3.85 30.96 1.89 0.18 -BGO_Y0_0 4 0 0 91.89 -10.09 1.02 2.62 10.00 4.93 0.20 -BGO_Y0_0 5 0 18 -91.89 0.00 0.99 4.35 21.14 2.77 0.00 -BGO_Y0_0 5 0 17 -81.68 0.00 1.00 1.80 25.30 2.45 0.00 -BGO_Y0_0 5 0 16 -71.47 0.00 1.00 1.84 18.78 2.75 0.00 -BGO_Y0_0 5 0 15 -61.26 0.00 1.00 3.90 26.14 2.47 0.00 -BGO_Y0_0 5 0 14 -51.05 0.00 0.99 4.16 26.01 2.61 0.00 -BGO_Y0_0 5 0 13 -40.84 0.00 1.00 2.74 28.52 2.51 0.00 -BGO_Y0_0 5 0 12 -30.63 0.00 0.99 4.05 26.50 2.03 0.06 -BGO_Y0_0 5 0 11 -20.42 0.00 1.00 2.54 22.44 2.57 0.00 -BGO_Y0_0 5 0 10 -10.21 0.00 1.01 0.71 17.82 2.65 0.00 -BGO_Y0_0 5 0 9 0.00 0.00 1.00 3.25 22.74 2.87 0.00 -BGO_Y0_0 5 0 8 10.21 0.00 1.00 4.80 25.32 2.78 0.00 -BGO_Y0_0 5 0 7 20.42 0.00 1.02 5.08 21.37 2.60 0.05 -BGO_Y0_0 5 0 6 30.63 0.00 1.04 2.06 26.46 2.77 0.00 -BGO_Y0_0 5 0 5 40.84 0.00 1.06 3.28 20.28 3.08 0.00 -BGO_Y0_0 5 0 4 51.05 0.00 1.07 3.07 23.22 2.05 0.13 -BGO_Y0_0 5 0 3 61.26 0.00 1.10 3.52 19.21 3.35 0.07 -BGO_Y0_0 5 0 2 71.47 0.00 1.14 5.64 20.87 3.17 0.13 -BGO_Y0_0 5 0 1 81.68 0.00 1.27 -3.41 39.66 0.00 0.25 -BGO_Y0_0 5 0 0 91.89 0.00 1.24 -1.47 26.25 0.00 0.49 -BGO_Y0_0 6 0 18 -91.89 10.09 0.99 2.78 21.91 2.68 0.00 -BGO_Y0_0 6 0 17 -81.68 10.09 0.99 6.11 29.83 1.12 0.11 -BGO_Y0_0 6 0 16 -71.47 10.09 0.99 4.93 22.84 2.74 0.00 -BGO_Y0_0 6 0 15 -61.26 10.09 1.00 1.01 21.75 2.66 0.00 -BGO_Y0_0 6 0 14 -51.05 10.09 1.00 2.72 22.60 2.58 0.02 -BGO_Y0_0 6 0 13 -40.84 10.09 0.99 3.64 30.28 1.61 0.08 -BGO_Y0_0 6 0 12 -30.63 10.09 1.00 2.04 23.27 2.48 0.05 -BGO_Y0_0 6 0 11 -20.42 10.09 0.99 4.58 21.72 2.75 0.00 -BGO_Y0_0 6 0 10 -10.21 10.09 1.00 2.47 26.71 2.27 0.06 -BGO_Y0_0 6 0 9 0.00 10.09 1.00 3.17 23.21 2.71 0.00 -BGO_Y0_0 6 0 8 10.21 10.09 1.01 4.67 18.52 3.04 0.00 -BGO_Y0_0 6 0 7 20.42 10.09 1.02 3.11 28.39 2.34 0.06 -BGO_Y0_0 6 0 6 30.63 10.09 1.04 2.89 18.60 3.16 0.00 -BGO_Y0_0 6 0 5 40.84 10.09 1.04 2.83 17.92 3.21 0.00 -BGO_Y0_0 6 0 4 51.05 10.09 1.06 1.98 20.50 3.18 0.00 -BGO_Y0_0 6 0 3 61.26 10.09 1.07 4.15 25.16 2.56 0.10 -BGO_Y0_0 6 0 2 71.47 10.09 1.10 2.31 20.44 3.51 0.05 -BGO_Y0_0 6 0 1 81.68 10.09 1.09 3.85 30.96 1.89 0.18 -BGO_Y0_0 6 0 0 91.89 10.09 1.02 2.62 10.00 4.93 0.20 -BGO_Y0_0 7 0 18 -91.89 20.18 0.99 4.33 24.41 2.65 0.00 -BGO_Y0_0 7 0 17 -81.68 20.18 1.00 3.76 22.12 2.71 0.00 -BGO_Y0_0 7 0 16 -71.47 20.18 0.99 4.70 29.19 2.44 0.00 -BGO_Y0_0 7 0 15 -61.26 20.18 1.00 2.01 22.86 2.73 0.00 -BGO_Y0_0 7 0 14 -51.05 20.18 0.98 5.03 22.59 2.69 0.00 -BGO_Y0_0 7 0 13 -40.84 20.18 1.00 1.97 22.46 2.78 0.00 -BGO_Y0_0 7 0 12 -30.63 20.18 1.00 2.15 24.79 2.70 0.00 -BGO_Y0_0 7 0 11 -20.42 20.18 0.99 4.65 31.31 1.87 0.09 -BGO_Y0_0 7 0 10 -10.21 20.18 1.00 3.88 23.92 2.82 0.00 -BGO_Y0_0 7 0 9 0.00 20.18 1.00 3.31 18.53 2.91 0.00 -BGO_Y0_0 7 0 8 10.21 20.18 1.01 3.51 18.40 2.79 0.00 -BGO_Y0_0 7 0 7 20.42 20.18 1.02 2.90 20.89 2.67 0.03 -BGO_Y0_0 7 0 6 30.63 20.18 1.03 1.88 23.07 2.81 0.00 -BGO_Y0_0 7 0 5 40.84 20.18 1.02 3.40 17.98 3.11 0.00 -BGO_Y0_0 7 0 4 51.05 20.18 1.03 2.79 34.62 0.38 0.11 -BGO_Y0_0 7 0 3 61.26 20.18 1.00 4.96 23.84 2.34 0.08 -BGO_Y0_0 7 0 2 71.47 20.18 1.01 2.47 20.72 3.05 0.00 -BGO_Y0_0 7 0 1 81.68 20.18 0.97 -1.32 32.19 0.99 0.11 -BGO_Y0_0 7 0 0 91.89 20.18 0.93 1.85 25.14 2.15 0.06 -BGO_Y0_0 8 0 18 -91.89 30.27 1.00 3.57 22.94 2.65 0.00 -BGO_Y0_0 8 0 17 -81.68 30.27 1.01 2.47 27.87 2.15 0.07 -BGO_Y0_0 8 0 16 -71.47 30.27 1.01 0.39 28.55 1.38 0.10 -BGO_Y0_0 8 0 15 -61.26 30.27 0.99 4.32 19.93 2.75 0.00 -BGO_Y0_0 8 0 14 -51.05 30.27 0.99 4.40 16.85 2.89 0.00 -BGO_Y0_0 8 0 13 -40.84 30.27 1.01 1.70 26.41 2.15 0.07 -BGO_Y0_0 8 0 12 -30.63 30.27 0.99 4.11 24.51 2.57 0.00 -BGO_Y0_0 8 0 11 -20.42 30.27 0.98 7.13 19.56 2.83 0.00 -BGO_Y0_0 8 0 10 -10.21 30.27 1.01 0.83 17.65 2.80 0.00 -BGO_Y0_0 8 0 9 0.00 30.27 1.00 2.63 22.11 2.55 0.00 -BGO_Y0_0 8 0 8 10.21 30.27 0.99 2.92 25.87 2.57 0.01 -BGO_Y0_0 8 0 7 20.42 30.27 0.99 3.77 21.29 2.75 0.00 -BGO_Y0_0 8 0 6 30.63 30.27 1.00 2.82 22.83 2.55 0.05 -BGO_Y0_0 8 0 5 40.84 30.27 0.99 3.04 22.71 2.64 0.00 -BGO_Y0_0 8 0 4 51.05 30.27 0.99 1.64 20.32 2.80 0.00 -BGO_Y0_0 8 0 3 61.26 30.27 0.98 0.39 21.75 2.68 0.00 -BGO_Y0_0 8 0 2 71.47 30.27 0.93 5.13 24.41 2.52 0.01 -BGO_Y0_0 8 0 1 81.68 30.27 0.95 2.68 22.48 2.72 0.00 -BGO_Y0_0 8 0 0 91.89 30.27 0.94 3.66 24.44 2.44 0.03 -BGO_Y0_0 9 0 18 -91.89 40.36 0.99 5.41 27.85 2.00 0.08 -BGO_Y0_0 9 0 17 -81.68 40.36 1.00 2.38 22.41 2.74 0.00 -BGO_Y0_0 9 0 16 -71.47 40.36 1.01 1.00 21.95 2.66 0.00 -BGO_Y0_0 9 0 15 -61.26 40.36 0.97 6.88 33.51 0.00 0.12 -BGO_Y0_0 9 0 14 -51.05 40.36 0.98 5.51 20.94 2.71 0.00 -BGO_Y0_0 9 0 13 -40.84 40.36 0.99 5.39 21.18 2.40 0.06 -BGO_Y0_0 9 0 12 -30.63 40.36 1.00 3.77 20.83 2.73 0.00 -BGO_Y0_0 9 0 11 -20.42 40.36 1.00 3.49 18.44 2.81 0.00 -BGO_Y0_0 9 0 10 -10.21 40.36 1.00 1.43 27.05 2.60 0.00 -BGO_Y0_0 9 0 9 0.00 40.36 0.99 2.28 27.94 2.23 0.06 -BGO_Y0_0 9 0 8 10.21 40.36 0.99 4.03 23.87 2.73 0.00 -BGO_Y0_0 9 0 7 20.42 40.36 0.97 3.26 23.35 2.76 0.00 -BGO_Y0_0 9 0 6 30.63 40.36 0.96 4.53 25.93 2.57 0.00 -BGO_Y0_0 9 0 5 40.84 40.36 0.98 1.27 21.98 2.76 0.00 -BGO_Y0_0 9 0 4 51.05 40.36 0.96 3.29 18.75 2.85 0.00 -BGO_Y0_0 9 0 3 61.26 40.36 0.96 0.72 22.58 2.69 0.00 -BGO_Y0_0 9 0 2 71.47 40.36 0.95 2.52 27.56 2.35 0.04 -BGO_Y0_0 9 0 1 81.68 40.36 0.95 1.51 26.31 2.17 0.05 -BGO_Y0_0 9 0 0 91.89 40.36 0.94 3.94 26.12 2.24 0.07 -BGO_Y0_0 10 0 18 -91.89 50.45 0.99 3.65 22.26 2.73 0.00 -BGO_Y0_0 10 0 17 -81.68 50.45 1.02 0.98 20.34 2.83 0.00 -BGO_Y0_0 10 0 16 -71.47 50.45 1.02 0.46 23.55 2.77 0.00 -BGO_Y0_0 10 0 15 -61.26 50.45 1.00 4.44 23.98 2.18 0.09 -BGO_Y0_0 10 0 14 -51.05 50.45 1.01 2.61 18.26 2.96 0.00 -BGO_Y0_0 10 0 13 -40.84 50.45 0.99 5.24 28.92 2.00 0.07 -BGO_Y0_0 10 0 12 -30.63 50.45 1.01 1.17 15.49 2.89 0.00 -BGO_Y0_0 10 0 11 -20.42 50.45 1.01 2.64 25.85 2.38 0.05 -BGO_Y0_0 10 0 10 -10.21 50.45 1.00 2.56 21.01 2.68 0.00 -BGO_Y0_0 10 0 9 0.00 50.45 0.99 2.33 20.91 2.76 0.00 -BGO_Y0_0 10 0 8 10.21 50.45 0.99 1.85 27.44 1.71 0.08 -BGO_Y0_0 10 0 7 20.42 50.45 0.99 1.68 26.18 2.11 0.06 -BGO_Y0_0 10 0 6 30.63 50.45 0.96 3.70 19.20 2.76 0.00 -BGO_Y0_0 10 0 5 40.84 50.45 0.95 2.46 21.18 2.74 0.00 -BGO_Y0_0 10 0 4 51.05 50.45 0.94 3.44 21.19 2.83 0.00 -BGO_Y0_0 10 0 3 61.26 50.45 0.93 3.49 23.34 2.59 0.03 -BGO_Y0_0 10 0 2 71.47 50.45 0.94 3.83 19.84 2.71 0.01 -BGO_Y0_0 10 0 1 81.68 50.45 0.95 3.08 23.05 2.72 0.00 -BGO_Y0_0 10 0 0 91.89 50.45 0.93 5.51 21.93 2.71 0.00 -BGO_Y0_0 0 1 18 -91.89 -50.45 0.99 3.65 22.26 2.73 0.00 -BGO_Y0_0 0 1 17 -81.68 -50.45 1.02 0.98 20.34 2.83 0.00 -BGO_Y0_0 0 1 16 -71.47 -50.45 1.02 0.46 23.55 2.77 0.00 -BGO_Y0_0 0 1 15 -61.26 -50.45 1.00 4.44 23.98 2.18 0.09 -BGO_Y0_0 0 1 14 -51.05 -50.45 1.01 2.61 18.26 2.96 0.00 -BGO_Y0_0 0 1 13 -40.84 -50.45 0.99 5.24 28.92 2.00 0.07 -BGO_Y0_0 0 1 12 -30.63 -50.45 1.01 1.17 15.49 2.89 0.00 -BGO_Y0_0 0 1 11 -20.42 -50.45 1.01 2.64 25.85 2.38 0.05 -BGO_Y0_0 0 1 10 -10.21 -50.45 1.00 2.56 21.01 2.68 0.00 -BGO_Y0_0 0 1 9 0.00 -50.45 0.99 2.33 20.91 2.76 0.00 -BGO_Y0_0 0 1 8 10.21 -50.45 0.99 1.85 27.44 1.71 0.08 -BGO_Y0_0 0 1 7 20.42 -50.45 0.99 1.68 26.18 2.11 0.06 -BGO_Y0_0 0 1 6 30.63 -50.45 0.96 3.70 19.20 2.76 0.00 -BGO_Y0_0 0 1 5 40.84 -50.45 0.95 2.46 21.18 2.74 0.00 -BGO_Y0_0 0 1 4 51.05 -50.45 0.94 3.44 21.19 2.83 0.00 -BGO_Y0_0 0 1 3 61.26 -50.45 0.93 3.49 23.34 2.59 0.03 -BGO_Y0_0 0 1 2 71.47 -50.45 0.94 3.83 19.84 2.71 0.01 -BGO_Y0_0 0 1 1 81.68 -50.45 0.95 3.08 23.05 2.72 0.00 -BGO_Y0_0 0 1 0 91.89 -50.45 0.93 5.51 21.93 2.71 0.00 -BGO_Y0_0 1 1 18 -91.89 -40.36 0.99 5.41 27.85 2.00 0.08 -BGO_Y0_0 1 1 17 -81.68 -40.36 1.00 2.38 22.41 2.74 0.00 -BGO_Y0_0 1 1 16 -71.47 -40.36 1.01 1.00 21.95 2.66 0.00 -BGO_Y0_0 1 1 15 -61.26 -40.36 0.97 6.88 33.51 0.00 0.12 -BGO_Y0_0 1 1 14 -51.05 -40.36 0.98 5.51 20.94 2.71 0.00 -BGO_Y0_0 1 1 13 -40.84 -40.36 0.99 5.39 21.18 2.40 0.06 -BGO_Y0_0 1 1 12 -30.63 -40.36 1.00 3.77 20.83 2.73 0.00 -BGO_Y0_0 1 1 11 -20.42 -40.36 1.00 3.49 18.44 2.81 0.00 -BGO_Y0_0 1 1 10 -10.21 -40.36 1.00 1.43 27.05 2.60 0.00 -BGO_Y0_0 1 1 9 0.00 -40.36 0.99 2.28 27.94 2.23 0.06 -BGO_Y0_0 1 1 8 10.21 -40.36 0.99 4.03 23.87 2.73 0.00 -BGO_Y0_0 1 1 7 20.42 -40.36 0.97 3.26 23.35 2.76 0.00 -BGO_Y0_0 1 1 6 30.63 -40.36 0.96 4.53 25.93 2.57 0.00 -BGO_Y0_0 1 1 5 40.84 -40.36 0.98 1.27 21.98 2.76 0.00 -BGO_Y0_0 1 1 4 51.05 -40.36 0.96 3.29 18.75 2.85 0.00 -BGO_Y0_0 1 1 3 61.26 -40.36 0.96 0.72 22.58 2.69 0.00 -BGO_Y0_0 1 1 2 71.47 -40.36 0.95 2.52 27.56 2.35 0.04 -BGO_Y0_0 1 1 1 81.68 -40.36 0.95 1.51 26.31 2.17 0.05 -BGO_Y0_0 1 1 0 91.89 -40.36 0.94 3.94 26.12 2.24 0.07 -BGO_Y0_0 2 1 18 -91.89 -30.27 1.00 3.57 22.94 2.65 0.00 -BGO_Y0_0 2 1 17 -81.68 -30.27 1.01 2.47 27.87 2.15 0.07 -BGO_Y0_0 2 1 16 -71.47 -30.27 1.01 0.39 28.55 1.38 0.10 -BGO_Y0_0 2 1 15 -61.26 -30.27 0.99 4.32 19.93 2.75 0.00 -BGO_Y0_0 2 1 14 -51.05 -30.27 0.99 4.40 16.85 2.89 0.00 -BGO_Y0_0 2 1 13 -40.84 -30.27 1.01 1.70 26.41 2.15 0.07 -BGO_Y0_0 2 1 12 -30.63 -30.27 0.99 4.11 24.51 2.57 0.00 -BGO_Y0_0 2 1 11 -20.42 -30.27 0.98 7.13 19.56 2.83 0.00 -BGO_Y0_0 2 1 10 -10.21 -30.27 1.01 0.83 17.65 2.80 0.00 -BGO_Y0_0 2 1 9 0.00 -30.27 1.00 2.63 22.11 2.55 0.00 -BGO_Y0_0 2 1 8 10.21 -30.27 0.99 2.92 25.87 2.57 0.01 -BGO_Y0_0 2 1 7 20.42 -30.27 0.99 3.77 21.29 2.75 0.00 -BGO_Y0_0 2 1 6 30.63 -30.27 1.00 2.82 22.83 2.55 0.05 -BGO_Y0_0 2 1 5 40.84 -30.27 0.99 3.04 22.71 2.64 0.00 -BGO_Y0_0 2 1 4 51.05 -30.27 0.99 1.64 20.32 2.80 0.00 -BGO_Y0_0 2 1 3 61.26 -30.27 0.98 0.39 21.75 2.68 0.00 -BGO_Y0_0 2 1 2 71.47 -30.27 0.93 5.13 24.41 2.52 0.01 -BGO_Y0_0 2 1 1 81.68 -30.27 0.95 2.68 22.48 2.72 0.00 -BGO_Y0_0 2 1 0 91.89 -30.27 0.94 3.66 24.44 2.44 0.03 -BGO_Y0_0 3 1 18 -91.89 -20.18 0.99 4.33 24.41 2.65 0.00 -BGO_Y0_0 3 1 17 -81.68 -20.18 1.00 3.76 22.12 2.71 0.00 -BGO_Y0_0 3 1 16 -71.47 -20.18 0.99 4.70 29.19 2.44 0.00 -BGO_Y0_0 3 1 15 -61.26 -20.18 1.00 2.01 22.86 2.73 0.00 -BGO_Y0_0 3 1 14 -51.05 -20.18 0.98 5.03 22.59 2.69 0.00 -BGO_Y0_0 3 1 13 -40.84 -20.18 1.00 1.97 22.46 2.78 0.00 -BGO_Y0_0 3 1 12 -30.63 -20.18 1.00 2.15 24.79 2.70 0.00 -BGO_Y0_0 3 1 11 -20.42 -20.18 0.99 4.65 31.31 1.87 0.09 -BGO_Y0_0 3 1 10 -10.21 -20.18 1.00 3.88 23.92 2.82 0.00 -BGO_Y0_0 3 1 9 0.00 -20.18 1.00 3.31 18.53 2.91 0.00 -BGO_Y0_0 3 1 8 10.21 -20.18 1.01 3.51 18.40 2.79 0.00 -BGO_Y0_0 3 1 7 20.42 -20.18 1.02 2.90 20.89 2.67 0.03 -BGO_Y0_0 3 1 6 30.63 -20.18 1.03 1.88 23.07 2.81 0.00 -BGO_Y0_0 3 1 5 40.84 -20.18 1.02 3.40 17.98 3.11 0.00 -BGO_Y0_0 3 1 4 51.05 -20.18 1.03 2.79 34.62 0.38 0.11 -BGO_Y0_0 3 1 3 61.26 -20.18 1.00 4.96 23.84 2.34 0.08 -BGO_Y0_0 3 1 2 71.47 -20.18 1.01 2.47 20.72 3.05 0.00 -BGO_Y0_0 3 1 1 81.68 -20.18 0.97 -1.32 32.19 0.99 0.11 -BGO_Y0_0 3 1 0 91.89 -20.18 0.93 1.85 25.14 2.15 0.06 -BGO_Y0_0 4 1 18 -91.89 -10.09 0.99 2.78 21.91 2.68 0.00 -BGO_Y0_0 4 1 17 -81.68 -10.09 0.99 6.11 29.83 1.12 0.11 -BGO_Y0_0 4 1 16 -71.47 -10.09 0.99 4.93 22.84 2.74 0.00 -BGO_Y0_0 4 1 15 -61.26 -10.09 1.00 1.01 21.75 2.66 0.00 -BGO_Y0_0 4 1 14 -51.05 -10.09 1.00 2.72 22.60 2.58 0.02 -BGO_Y0_0 4 1 13 -40.84 -10.09 0.99 3.64 30.28 1.61 0.08 -BGO_Y0_0 4 1 12 -30.63 -10.09 1.00 2.04 23.27 2.48 0.05 -BGO_Y0_0 4 1 11 -20.42 -10.09 0.99 4.58 21.72 2.75 0.00 -BGO_Y0_0 4 1 10 -10.21 -10.09 1.00 2.47 26.71 2.27 0.06 -BGO_Y0_0 4 1 9 0.00 -10.09 1.00 3.17 23.21 2.71 0.00 -BGO_Y0_0 4 1 8 10.21 -10.09 1.01 4.67 18.52 3.04 0.00 -BGO_Y0_0 4 1 7 20.42 -10.09 1.02 3.11 28.39 2.34 0.06 -BGO_Y0_0 4 1 6 30.63 -10.09 1.04 2.89 18.60 3.16 0.00 -BGO_Y0_0 4 1 5 40.84 -10.09 1.04 2.83 17.92 3.21 0.00 -BGO_Y0_0 4 1 4 51.05 -10.09 1.06 1.98 20.50 3.18 0.00 -BGO_Y0_0 4 1 3 61.26 -10.09 1.07 4.15 25.16 2.56 0.10 -BGO_Y0_0 4 1 2 71.47 -10.09 1.10 2.31 20.44 3.51 0.05 -BGO_Y0_0 4 1 1 81.68 -10.09 1.09 3.85 30.96 1.89 0.18 -BGO_Y0_0 4 1 0 91.89 -10.09 1.02 2.62 10.00 4.93 0.20 -BGO_Y0_0 5 1 18 -91.89 0.00 0.99 4.35 21.14 2.77 0.00 -BGO_Y0_0 5 1 17 -81.68 0.00 1.00 1.80 25.30 2.45 0.00 -BGO_Y0_0 5 1 16 -71.47 0.00 1.00 1.84 18.78 2.75 0.00 -BGO_Y0_0 5 1 15 -61.26 0.00 1.00 3.90 26.14 2.47 0.00 -BGO_Y0_0 5 1 14 -51.05 0.00 0.99 4.16 26.01 2.61 0.00 -BGO_Y0_0 5 1 13 -40.84 0.00 1.00 2.74 28.52 2.51 0.00 -BGO_Y0_0 5 1 12 -30.63 0.00 0.99 4.05 26.50 2.03 0.06 -BGO_Y0_0 5 1 11 -20.42 0.00 1.00 2.54 22.44 2.57 0.00 -BGO_Y0_0 5 1 10 -10.21 0.00 1.01 0.71 17.82 2.65 0.00 -BGO_Y0_0 5 1 9 0.00 0.00 1.00 3.25 22.74 2.87 0.00 -BGO_Y0_0 5 1 8 10.21 0.00 1.00 4.80 25.32 2.78 0.00 -BGO_Y0_0 5 1 7 20.42 0.00 1.02 5.08 21.37 2.60 0.05 -BGO_Y0_0 5 1 6 30.63 0.00 1.04 2.06 26.46 2.77 0.00 -BGO_Y0_0 5 1 5 40.84 0.00 1.06 3.28 20.28 3.08 0.00 -BGO_Y0_0 5 1 4 51.05 0.00 1.07 3.07 23.22 2.05 0.13 -BGO_Y0_0 5 1 3 61.26 0.00 1.10 3.52 19.21 3.35 0.07 -BGO_Y0_0 5 1 2 71.47 0.00 1.14 5.64 20.87 3.17 0.13 -BGO_Y0_0 5 1 1 81.68 0.00 1.27 -3.41 39.66 0.00 0.25 -BGO_Y0_0 5 1 0 91.89 0.00 1.24 -1.47 26.25 0.00 0.49 -BGO_Y0_0 6 1 18 -91.89 10.09 0.99 2.78 21.91 2.68 0.00 -BGO_Y0_0 6 1 17 -81.68 10.09 0.99 6.11 29.83 1.12 0.11 -BGO_Y0_0 6 1 16 -71.47 10.09 0.99 4.93 22.84 2.74 0.00 -BGO_Y0_0 6 1 15 -61.26 10.09 1.00 1.01 21.75 2.66 0.00 -BGO_Y0_0 6 1 14 -51.05 10.09 1.00 2.72 22.60 2.58 0.02 -BGO_Y0_0 6 1 13 -40.84 10.09 0.99 3.64 30.28 1.61 0.08 -BGO_Y0_0 6 1 12 -30.63 10.09 1.00 2.04 23.27 2.48 0.05 -BGO_Y0_0 6 1 11 -20.42 10.09 0.99 4.58 21.72 2.75 0.00 -BGO_Y0_0 6 1 10 -10.21 10.09 1.00 2.47 26.71 2.27 0.06 -BGO_Y0_0 6 1 9 0.00 10.09 1.00 3.17 23.21 2.71 0.00 -BGO_Y0_0 6 1 8 10.21 10.09 1.01 4.67 18.52 3.04 0.00 -BGO_Y0_0 6 1 7 20.42 10.09 1.02 3.11 28.39 2.34 0.06 -BGO_Y0_0 6 1 6 30.63 10.09 1.04 2.89 18.60 3.16 0.00 -BGO_Y0_0 6 1 5 40.84 10.09 1.04 2.83 17.92 3.21 0.00 -BGO_Y0_0 6 1 4 51.05 10.09 1.06 1.98 20.50 3.18 0.00 -BGO_Y0_0 6 1 3 61.26 10.09 1.07 4.15 25.16 2.56 0.10 -BGO_Y0_0 6 1 2 71.47 10.09 1.10 2.31 20.44 3.51 0.05 -BGO_Y0_0 6 1 1 81.68 10.09 1.09 3.85 30.96 1.89 0.18 -BGO_Y0_0 6 1 0 91.89 10.09 1.02 2.62 10.00 4.93 0.20 -BGO_Y0_0 7 1 18 -91.89 20.18 0.99 4.33 24.41 2.65 0.00 -BGO_Y0_0 7 1 17 -81.68 20.18 1.00 3.76 22.12 2.71 0.00 -BGO_Y0_0 7 1 16 -71.47 20.18 0.99 4.70 29.19 2.44 0.00 -BGO_Y0_0 7 1 15 -61.26 20.18 1.00 2.01 22.86 2.73 0.00 -BGO_Y0_0 7 1 14 -51.05 20.18 0.98 5.03 22.59 2.69 0.00 -BGO_Y0_0 7 1 13 -40.84 20.18 1.00 1.97 22.46 2.78 0.00 -BGO_Y0_0 7 1 12 -30.63 20.18 1.00 2.15 24.79 2.70 0.00 -BGO_Y0_0 7 1 11 -20.42 20.18 0.99 4.65 31.31 1.87 0.09 -BGO_Y0_0 7 1 10 -10.21 20.18 1.00 3.88 23.92 2.82 0.00 -BGO_Y0_0 7 1 9 0.00 20.18 1.00 3.31 18.53 2.91 0.00 -BGO_Y0_0 7 1 8 10.21 20.18 1.01 3.51 18.40 2.79 0.00 -BGO_Y0_0 7 1 7 20.42 20.18 1.02 2.90 20.89 2.67 0.03 -BGO_Y0_0 7 1 6 30.63 20.18 1.03 1.88 23.07 2.81 0.00 -BGO_Y0_0 7 1 5 40.84 20.18 1.02 3.40 17.98 3.11 0.00 -BGO_Y0_0 7 1 4 51.05 20.18 1.03 2.79 34.62 0.38 0.11 -BGO_Y0_0 7 1 3 61.26 20.18 1.00 4.96 23.84 2.34 0.08 -BGO_Y0_0 7 1 2 71.47 20.18 1.01 2.47 20.72 3.05 0.00 -BGO_Y0_0 7 1 1 81.68 20.18 0.97 -1.32 32.19 0.99 0.11 -BGO_Y0_0 7 1 0 91.89 20.18 0.93 1.85 25.14 2.15 0.06 -BGO_Y0_0 8 1 18 -91.89 30.27 1.00 3.57 22.94 2.65 0.00 -BGO_Y0_0 8 1 17 -81.68 30.27 1.01 2.47 27.87 2.15 0.07 -BGO_Y0_0 8 1 16 -71.47 30.27 1.01 0.39 28.55 1.38 0.10 -BGO_Y0_0 8 1 15 -61.26 30.27 0.99 4.32 19.93 2.75 0.00 -BGO_Y0_0 8 1 14 -51.05 30.27 0.99 4.40 16.85 2.89 0.00 -BGO_Y0_0 8 1 13 -40.84 30.27 1.01 1.70 26.41 2.15 0.07 -BGO_Y0_0 8 1 12 -30.63 30.27 0.99 4.11 24.51 2.57 0.00 -BGO_Y0_0 8 1 11 -20.42 30.27 0.98 7.13 19.56 2.83 0.00 -BGO_Y0_0 8 1 10 -10.21 30.27 1.01 0.83 17.65 2.80 0.00 -BGO_Y0_0 8 1 9 0.00 30.27 1.00 2.63 22.11 2.55 0.00 -BGO_Y0_0 8 1 8 10.21 30.27 0.99 2.92 25.87 2.57 0.01 -BGO_Y0_0 8 1 7 20.42 30.27 0.99 3.77 21.29 2.75 0.00 -BGO_Y0_0 8 1 6 30.63 30.27 1.00 2.82 22.83 2.55 0.05 -BGO_Y0_0 8 1 5 40.84 30.27 0.99 3.04 22.71 2.64 0.00 -BGO_Y0_0 8 1 4 51.05 30.27 0.99 1.64 20.32 2.80 0.00 -BGO_Y0_0 8 1 3 61.26 30.27 0.98 0.39 21.75 2.68 0.00 -BGO_Y0_0 8 1 2 71.47 30.27 0.93 5.13 24.41 2.52 0.01 -BGO_Y0_0 8 1 1 81.68 30.27 0.95 2.68 22.48 2.72 0.00 -BGO_Y0_0 8 1 0 91.89 30.27 0.94 3.66 24.44 2.44 0.03 -BGO_Y0_0 9 1 18 -91.89 40.36 0.99 5.41 27.85 2.00 0.08 -BGO_Y0_0 9 1 17 -81.68 40.36 1.00 2.38 22.41 2.74 0.00 -BGO_Y0_0 9 1 16 -71.47 40.36 1.01 1.00 21.95 2.66 0.00 -BGO_Y0_0 9 1 15 -61.26 40.36 0.97 6.88 33.51 0.00 0.12 -BGO_Y0_0 9 1 14 -51.05 40.36 0.98 5.51 20.94 2.71 0.00 -BGO_Y0_0 9 1 13 -40.84 40.36 0.99 5.39 21.18 2.40 0.06 -BGO_Y0_0 9 1 12 -30.63 40.36 1.00 3.77 20.83 2.73 0.00 -BGO_Y0_0 9 1 11 -20.42 40.36 1.00 3.49 18.44 2.81 0.00 -BGO_Y0_0 9 1 10 -10.21 40.36 1.00 1.43 27.05 2.60 0.00 -BGO_Y0_0 9 1 9 0.00 40.36 0.99 2.28 27.94 2.23 0.06 -BGO_Y0_0 9 1 8 10.21 40.36 0.99 4.03 23.87 2.73 0.00 -BGO_Y0_0 9 1 7 20.42 40.36 0.97 3.26 23.35 2.76 0.00 -BGO_Y0_0 9 1 6 30.63 40.36 0.96 4.53 25.93 2.57 0.00 -BGO_Y0_0 9 1 5 40.84 40.36 0.98 1.27 21.98 2.76 0.00 -BGO_Y0_0 9 1 4 51.05 40.36 0.96 3.29 18.75 2.85 0.00 -BGO_Y0_0 9 1 3 61.26 40.36 0.96 0.72 22.58 2.69 0.00 -BGO_Y0_0 9 1 2 71.47 40.36 0.95 2.52 27.56 2.35 0.04 -BGO_Y0_0 9 1 1 81.68 40.36 0.95 1.51 26.31 2.17 0.05 -BGO_Y0_0 9 1 0 91.89 40.36 0.94 3.94 26.12 2.24 0.07 -BGO_Y0_0 10 1 18 -91.89 50.45 0.99 3.65 22.26 2.73 0.00 -BGO_Y0_0 10 1 17 -81.68 50.45 1.02 0.98 20.34 2.83 0.00 -BGO_Y0_0 10 1 16 -71.47 50.45 1.02 0.46 23.55 2.77 0.00 -BGO_Y0_0 10 1 15 -61.26 50.45 1.00 4.44 23.98 2.18 0.09 -BGO_Y0_0 10 1 14 -51.05 50.45 1.01 2.61 18.26 2.96 0.00 -BGO_Y0_0 10 1 13 -40.84 50.45 0.99 5.24 28.92 2.00 0.07 -BGO_Y0_0 10 1 12 -30.63 50.45 1.01 1.17 15.49 2.89 0.00 -BGO_Y0_0 10 1 11 -20.42 50.45 1.01 2.64 25.85 2.38 0.05 -BGO_Y0_0 10 1 10 -10.21 50.45 1.00 2.56 21.01 2.68 0.00 -BGO_Y0_0 10 1 9 0.00 50.45 0.99 2.33 20.91 2.76 0.00 -BGO_Y0_0 10 1 8 10.21 50.45 0.99 1.85 27.44 1.71 0.08 -BGO_Y0_0 10 1 7 20.42 50.45 0.99 1.68 26.18 2.11 0.06 -BGO_Y0_0 10 1 6 30.63 50.45 0.96 3.70 19.20 2.76 0.00 -BGO_Y0_0 10 1 5 40.84 50.45 0.95 2.46 21.18 2.74 0.00 -BGO_Y0_0 10 1 4 51.05 50.45 0.94 3.44 21.19 2.83 0.00 -BGO_Y0_0 10 1 3 61.26 50.45 0.93 3.49 23.34 2.59 0.03 -BGO_Y0_0 10 1 2 71.47 50.45 0.94 3.83 19.84 2.71 0.01 -BGO_Y0_0 10 1 1 81.68 50.45 0.95 3.08 23.05 2.72 0.00 -BGO_Y0_0 10 1 0 91.89 50.45 0.93 5.51 21.93 2.71 0.00 -BGO_Y0_1 0 0 18 -91.89 -50.45 0.99 3.65 22.26 2.73 0.00 -BGO_Y0_1 0 0 17 -81.68 -50.45 1.02 0.98 20.34 2.83 0.00 -BGO_Y0_1 0 0 16 -71.47 -50.45 1.02 0.46 23.55 2.77 0.00 -BGO_Y0_1 0 0 15 -61.26 -50.45 1.00 4.44 23.98 2.18 0.09 -BGO_Y0_1 0 0 14 -51.05 -50.45 1.01 2.61 18.26 2.96 0.00 -BGO_Y0_1 0 0 13 -40.84 -50.45 0.99 5.24 28.92 2.00 0.07 -BGO_Y0_1 0 0 12 -30.63 -50.45 1.01 1.17 15.49 2.89 0.00 -BGO_Y0_1 0 0 11 -20.42 -50.45 1.01 2.64 25.85 2.38 0.05 -BGO_Y0_1 0 0 10 -10.21 -50.45 1.00 2.56 21.01 2.68 0.00 -BGO_Y0_1 0 0 9 0.00 -50.45 0.99 2.33 20.91 2.76 0.00 -BGO_Y0_1 0 0 8 10.21 -50.45 0.99 1.85 27.44 1.71 0.08 -BGO_Y0_1 0 0 7 20.42 -50.45 0.99 1.68 26.18 2.11 0.06 -BGO_Y0_1 0 0 6 30.63 -50.45 0.96 3.70 19.20 2.76 0.00 -BGO_Y0_1 0 0 5 40.84 -50.45 0.95 2.46 21.18 2.74 0.00 -BGO_Y0_1 0 0 4 51.05 -50.45 0.94 3.44 21.19 2.83 0.00 -BGO_Y0_1 0 0 3 61.26 -50.45 0.93 3.49 23.34 2.59 0.03 -BGO_Y0_1 0 0 2 71.47 -50.45 0.94 3.83 19.84 2.71 0.01 -BGO_Y0_1 0 0 1 81.68 -50.45 0.95 3.08 23.05 2.72 0.00 -BGO_Y0_1 0 0 0 91.89 -50.45 0.93 5.51 21.93 2.71 0.00 -BGO_Y0_1 1 0 18 -91.89 -40.36 0.99 5.41 27.85 2.00 0.08 -BGO_Y0_1 1 0 17 -81.68 -40.36 1.00 2.38 22.41 2.74 0.00 -BGO_Y0_1 1 0 16 -71.47 -40.36 1.01 1.00 21.95 2.66 0.00 -BGO_Y0_1 1 0 15 -61.26 -40.36 0.97 6.88 33.51 0.00 0.12 -BGO_Y0_1 1 0 14 -51.05 -40.36 0.98 5.51 20.94 2.71 0.00 -BGO_Y0_1 1 0 13 -40.84 -40.36 0.99 5.39 21.18 2.40 0.06 -BGO_Y0_1 1 0 12 -30.63 -40.36 1.00 3.77 20.83 2.73 0.00 -BGO_Y0_1 1 0 11 -20.42 -40.36 1.00 3.49 18.44 2.81 0.00 -BGO_Y0_1 1 0 10 -10.21 -40.36 1.00 1.43 27.05 2.60 0.00 -BGO_Y0_1 1 0 9 0.00 -40.36 0.99 2.28 27.94 2.23 0.06 -BGO_Y0_1 1 0 8 10.21 -40.36 0.99 4.03 23.87 2.73 0.00 -BGO_Y0_1 1 0 7 20.42 -40.36 0.97 3.26 23.35 2.76 0.00 -BGO_Y0_1 1 0 6 30.63 -40.36 0.96 4.53 25.93 2.57 0.00 -BGO_Y0_1 1 0 5 40.84 -40.36 0.98 1.27 21.98 2.76 0.00 -BGO_Y0_1 1 0 4 51.05 -40.36 0.96 3.29 18.75 2.85 0.00 -BGO_Y0_1 1 0 3 61.26 -40.36 0.96 0.72 22.58 2.69 0.00 -BGO_Y0_1 1 0 2 71.47 -40.36 0.95 2.52 27.56 2.35 0.04 -BGO_Y0_1 1 0 1 81.68 -40.36 0.95 1.51 26.31 2.17 0.05 -BGO_Y0_1 1 0 0 91.89 -40.36 0.94 3.94 26.12 2.24 0.07 -BGO_Y0_1 2 0 18 -91.89 -30.27 1.00 3.57 22.94 2.65 0.00 -BGO_Y0_1 2 0 17 -81.68 -30.27 1.01 2.47 27.87 2.15 0.07 -BGO_Y0_1 2 0 16 -71.47 -30.27 1.01 0.39 28.55 1.38 0.10 -BGO_Y0_1 2 0 15 -61.26 -30.27 0.99 4.32 19.93 2.75 0.00 -BGO_Y0_1 2 0 14 -51.05 -30.27 0.99 4.40 16.85 2.89 0.00 -BGO_Y0_1 2 0 13 -40.84 -30.27 1.01 1.70 26.41 2.15 0.07 -BGO_Y0_1 2 0 12 -30.63 -30.27 0.99 4.11 24.51 2.57 0.00 -BGO_Y0_1 2 0 11 -20.42 -30.27 0.98 7.13 19.56 2.83 0.00 -BGO_Y0_1 2 0 10 -10.21 -30.27 1.01 0.83 17.65 2.80 0.00 -BGO_Y0_1 2 0 9 0.00 -30.27 1.00 2.63 22.11 2.55 0.00 -BGO_Y0_1 2 0 8 10.21 -30.27 0.99 2.92 25.87 2.57 0.01 -BGO_Y0_1 2 0 7 20.42 -30.27 0.99 3.77 21.29 2.75 0.00 -BGO_Y0_1 2 0 6 30.63 -30.27 1.00 2.82 22.83 2.55 0.05 -BGO_Y0_1 2 0 5 40.84 -30.27 0.99 3.04 22.71 2.64 0.00 -BGO_Y0_1 2 0 4 51.05 -30.27 0.99 1.64 20.32 2.80 0.00 -BGO_Y0_1 2 0 3 61.26 -30.27 0.98 0.39 21.75 2.68 0.00 -BGO_Y0_1 2 0 2 71.47 -30.27 0.93 5.13 24.41 2.52 0.01 -BGO_Y0_1 2 0 1 81.68 -30.27 0.95 2.68 22.48 2.72 0.00 -BGO_Y0_1 2 0 0 91.89 -30.27 0.94 3.66 24.44 2.44 0.03 -BGO_Y0_1 3 0 18 -91.89 -20.18 0.99 4.33 24.41 2.65 0.00 -BGO_Y0_1 3 0 17 -81.68 -20.18 1.00 3.76 22.12 2.71 0.00 -BGO_Y0_1 3 0 16 -71.47 -20.18 0.99 4.70 29.19 2.44 0.00 -BGO_Y0_1 3 0 15 -61.26 -20.18 1.00 2.01 22.86 2.73 0.00 -BGO_Y0_1 3 0 14 -51.05 -20.18 0.98 5.03 22.59 2.69 0.00 -BGO_Y0_1 3 0 13 -40.84 -20.18 1.00 1.97 22.46 2.78 0.00 -BGO_Y0_1 3 0 12 -30.63 -20.18 1.00 2.15 24.79 2.70 0.00 -BGO_Y0_1 3 0 11 -20.42 -20.18 0.99 4.65 31.31 1.87 0.09 -BGO_Y0_1 3 0 10 -10.21 -20.18 1.00 3.88 23.92 2.82 0.00 -BGO_Y0_1 3 0 9 0.00 -20.18 1.00 3.31 18.53 2.91 0.00 -BGO_Y0_1 3 0 8 10.21 -20.18 1.01 3.51 18.40 2.79 0.00 -BGO_Y0_1 3 0 7 20.42 -20.18 1.02 2.90 20.89 2.67 0.03 -BGO_Y0_1 3 0 6 30.63 -20.18 1.03 1.88 23.07 2.81 0.00 -BGO_Y0_1 3 0 5 40.84 -20.18 1.02 3.40 17.98 3.11 0.00 -BGO_Y0_1 3 0 4 51.05 -20.18 1.03 2.79 34.62 0.38 0.11 -BGO_Y0_1 3 0 3 61.26 -20.18 1.00 4.96 23.84 2.34 0.08 -BGO_Y0_1 3 0 2 71.47 -20.18 1.01 2.47 20.72 3.05 0.00 -BGO_Y0_1 3 0 1 81.68 -20.18 0.97 -1.32 32.19 0.99 0.11 -BGO_Y0_1 3 0 0 91.89 -20.18 0.93 1.85 25.14 2.15 0.06 -BGO_Y0_1 4 0 18 -91.89 -10.09 0.99 2.78 21.91 2.68 0.00 -BGO_Y0_1 4 0 17 -81.68 -10.09 0.99 6.11 29.83 1.12 0.11 -BGO_Y0_1 4 0 16 -71.47 -10.09 0.99 4.93 22.84 2.74 0.00 -BGO_Y0_1 4 0 15 -61.26 -10.09 1.00 1.01 21.75 2.66 0.00 -BGO_Y0_1 4 0 14 -51.05 -10.09 1.00 2.72 22.60 2.58 0.02 -BGO_Y0_1 4 0 13 -40.84 -10.09 0.99 3.64 30.28 1.61 0.08 -BGO_Y0_1 4 0 12 -30.63 -10.09 1.00 2.04 23.27 2.48 0.05 -BGO_Y0_1 4 0 11 -20.42 -10.09 0.99 4.58 21.72 2.75 0.00 -BGO_Y0_1 4 0 10 -10.21 -10.09 1.00 2.47 26.71 2.27 0.06 -BGO_Y0_1 4 0 9 0.00 -10.09 1.00 3.17 23.21 2.71 0.00 -BGO_Y0_1 4 0 8 10.21 -10.09 1.01 4.67 18.52 3.04 0.00 -BGO_Y0_1 4 0 7 20.42 -10.09 1.02 3.11 28.39 2.34 0.06 -BGO_Y0_1 4 0 6 30.63 -10.09 1.04 2.89 18.60 3.16 0.00 -BGO_Y0_1 4 0 5 40.84 -10.09 1.04 2.83 17.92 3.21 0.00 -BGO_Y0_1 4 0 4 51.05 -10.09 1.06 1.98 20.50 3.18 0.00 -BGO_Y0_1 4 0 3 61.26 -10.09 1.07 4.15 25.16 2.56 0.10 -BGO_Y0_1 4 0 2 71.47 -10.09 1.10 2.31 20.44 3.51 0.05 -BGO_Y0_1 4 0 1 81.68 -10.09 1.09 3.85 30.96 1.89 0.18 -BGO_Y0_1 4 0 0 91.89 -10.09 1.02 2.62 10.00 4.93 0.20 -BGO_Y0_1 5 0 18 -91.89 0.00 0.99 4.35 21.14 2.77 0.00 -BGO_Y0_1 5 0 17 -81.68 0.00 1.00 1.80 25.30 2.45 0.00 -BGO_Y0_1 5 0 16 -71.47 0.00 1.00 1.84 18.78 2.75 0.00 -BGO_Y0_1 5 0 15 -61.26 0.00 1.00 3.90 26.14 2.47 0.00 -BGO_Y0_1 5 0 14 -51.05 0.00 0.99 4.16 26.01 2.61 0.00 -BGO_Y0_1 5 0 13 -40.84 0.00 1.00 2.74 28.52 2.51 0.00 -BGO_Y0_1 5 0 12 -30.63 0.00 0.99 4.05 26.50 2.03 0.06 -BGO_Y0_1 5 0 11 -20.42 0.00 1.00 2.54 22.44 2.57 0.00 -BGO_Y0_1 5 0 10 -10.21 0.00 1.01 0.71 17.82 2.65 0.00 -BGO_Y0_1 5 0 9 0.00 0.00 1.00 3.25 22.74 2.87 0.00 -BGO_Y0_1 5 0 8 10.21 0.00 1.00 4.80 25.32 2.78 0.00 -BGO_Y0_1 5 0 7 20.42 0.00 1.02 5.08 21.37 2.60 0.05 -BGO_Y0_1 5 0 6 30.63 0.00 1.04 2.06 26.46 2.77 0.00 -BGO_Y0_1 5 0 5 40.84 0.00 1.06 3.28 20.28 3.08 0.00 -BGO_Y0_1 5 0 4 51.05 0.00 1.07 3.07 23.22 2.05 0.13 -BGO_Y0_1 5 0 3 61.26 0.00 1.10 3.52 19.21 3.35 0.07 -BGO_Y0_1 5 0 2 71.47 0.00 1.14 5.64 20.87 3.17 0.13 -BGO_Y0_1 5 0 1 81.68 0.00 1.27 -3.41 39.66 0.00 0.25 -BGO_Y0_1 5 0 0 91.89 0.00 1.24 -1.47 26.25 0.00 0.49 -BGO_Y0_1 6 0 18 -91.89 10.09 0.99 2.78 21.91 2.68 0.00 -BGO_Y0_1 6 0 17 -81.68 10.09 0.99 6.11 29.83 1.12 0.11 -BGO_Y0_1 6 0 16 -71.47 10.09 0.99 4.93 22.84 2.74 0.00 -BGO_Y0_1 6 0 15 -61.26 10.09 1.00 1.01 21.75 2.66 0.00 -BGO_Y0_1 6 0 14 -51.05 10.09 1.00 2.72 22.60 2.58 0.02 -BGO_Y0_1 6 0 13 -40.84 10.09 0.99 3.64 30.28 1.61 0.08 -BGO_Y0_1 6 0 12 -30.63 10.09 1.00 2.04 23.27 2.48 0.05 -BGO_Y0_1 6 0 11 -20.42 10.09 0.99 4.58 21.72 2.75 0.00 -BGO_Y0_1 6 0 10 -10.21 10.09 1.00 2.47 26.71 2.27 0.06 -BGO_Y0_1 6 0 9 0.00 10.09 1.00 3.17 23.21 2.71 0.00 -BGO_Y0_1 6 0 8 10.21 10.09 1.01 4.67 18.52 3.04 0.00 -BGO_Y0_1 6 0 7 20.42 10.09 1.02 3.11 28.39 2.34 0.06 -BGO_Y0_1 6 0 6 30.63 10.09 1.04 2.89 18.60 3.16 0.00 -BGO_Y0_1 6 0 5 40.84 10.09 1.04 2.83 17.92 3.21 0.00 -BGO_Y0_1 6 0 4 51.05 10.09 1.06 1.98 20.50 3.18 0.00 -BGO_Y0_1 6 0 3 61.26 10.09 1.07 4.15 25.16 2.56 0.10 -BGO_Y0_1 6 0 2 71.47 10.09 1.10 2.31 20.44 3.51 0.05 -BGO_Y0_1 6 0 1 81.68 10.09 1.09 3.85 30.96 1.89 0.18 -BGO_Y0_1 6 0 0 91.89 10.09 1.02 2.62 10.00 4.93 0.20 -BGO_Y0_1 7 0 18 -91.89 20.18 0.99 4.33 24.41 2.65 0.00 -BGO_Y0_1 7 0 17 -81.68 20.18 1.00 3.76 22.12 2.71 0.00 -BGO_Y0_1 7 0 16 -71.47 20.18 0.99 4.70 29.19 2.44 0.00 -BGO_Y0_1 7 0 15 -61.26 20.18 1.00 2.01 22.86 2.73 0.00 -BGO_Y0_1 7 0 14 -51.05 20.18 0.98 5.03 22.59 2.69 0.00 -BGO_Y0_1 7 0 13 -40.84 20.18 1.00 1.97 22.46 2.78 0.00 -BGO_Y0_1 7 0 12 -30.63 20.18 1.00 2.15 24.79 2.70 0.00 -BGO_Y0_1 7 0 11 -20.42 20.18 0.99 4.65 31.31 1.87 0.09 -BGO_Y0_1 7 0 10 -10.21 20.18 1.00 3.88 23.92 2.82 0.00 -BGO_Y0_1 7 0 9 0.00 20.18 1.00 3.31 18.53 2.91 0.00 -BGO_Y0_1 7 0 8 10.21 20.18 1.01 3.51 18.40 2.79 0.00 -BGO_Y0_1 7 0 7 20.42 20.18 1.02 2.90 20.89 2.67 0.03 -BGO_Y0_1 7 0 6 30.63 20.18 1.03 1.88 23.07 2.81 0.00 -BGO_Y0_1 7 0 5 40.84 20.18 1.02 3.40 17.98 3.11 0.00 -BGO_Y0_1 7 0 4 51.05 20.18 1.03 2.79 34.62 0.38 0.11 -BGO_Y0_1 7 0 3 61.26 20.18 1.00 4.96 23.84 2.34 0.08 -BGO_Y0_1 7 0 2 71.47 20.18 1.01 2.47 20.72 3.05 0.00 -BGO_Y0_1 7 0 1 81.68 20.18 0.97 -1.32 32.19 0.99 0.11 -BGO_Y0_1 7 0 0 91.89 20.18 0.93 1.85 25.14 2.15 0.06 -BGO_Y0_1 8 0 18 -91.89 30.27 1.00 3.57 22.94 2.65 0.00 -BGO_Y0_1 8 0 17 -81.68 30.27 1.01 2.47 27.87 2.15 0.07 -BGO_Y0_1 8 0 16 -71.47 30.27 1.01 0.39 28.55 1.38 0.10 -BGO_Y0_1 8 0 15 -61.26 30.27 0.99 4.32 19.93 2.75 0.00 -BGO_Y0_1 8 0 14 -51.05 30.27 0.99 4.40 16.85 2.89 0.00 -BGO_Y0_1 8 0 13 -40.84 30.27 1.01 1.70 26.41 2.15 0.07 -BGO_Y0_1 8 0 12 -30.63 30.27 0.99 4.11 24.51 2.57 0.00 -BGO_Y0_1 8 0 11 -20.42 30.27 0.98 7.13 19.56 2.83 0.00 -BGO_Y0_1 8 0 10 -10.21 30.27 1.01 0.83 17.65 2.80 0.00 -BGO_Y0_1 8 0 9 0.00 30.27 1.00 2.63 22.11 2.55 0.00 -BGO_Y0_1 8 0 8 10.21 30.27 0.99 2.92 25.87 2.57 0.01 -BGO_Y0_1 8 0 7 20.42 30.27 0.99 3.77 21.29 2.75 0.00 -BGO_Y0_1 8 0 6 30.63 30.27 1.00 2.82 22.83 2.55 0.05 -BGO_Y0_1 8 0 5 40.84 30.27 0.99 3.04 22.71 2.64 0.00 -BGO_Y0_1 8 0 4 51.05 30.27 0.99 1.64 20.32 2.80 0.00 -BGO_Y0_1 8 0 3 61.26 30.27 0.98 0.39 21.75 2.68 0.00 -BGO_Y0_1 8 0 2 71.47 30.27 0.93 5.13 24.41 2.52 0.01 -BGO_Y0_1 8 0 1 81.68 30.27 0.95 2.68 22.48 2.72 0.00 -BGO_Y0_1 8 0 0 91.89 30.27 0.94 3.66 24.44 2.44 0.03 -BGO_Y0_1 9 0 18 -91.89 40.36 0.99 5.41 27.85 2.00 0.08 -BGO_Y0_1 9 0 17 -81.68 40.36 1.00 2.38 22.41 2.74 0.00 -BGO_Y0_1 9 0 16 -71.47 40.36 1.01 1.00 21.95 2.66 0.00 -BGO_Y0_1 9 0 15 -61.26 40.36 0.97 6.88 33.51 0.00 0.12 -BGO_Y0_1 9 0 14 -51.05 40.36 0.98 5.51 20.94 2.71 0.00 -BGO_Y0_1 9 0 13 -40.84 40.36 0.99 5.39 21.18 2.40 0.06 -BGO_Y0_1 9 0 12 -30.63 40.36 1.00 3.77 20.83 2.73 0.00 -BGO_Y0_1 9 0 11 -20.42 40.36 1.00 3.49 18.44 2.81 0.00 -BGO_Y0_1 9 0 10 -10.21 40.36 1.00 1.43 27.05 2.60 0.00 -BGO_Y0_1 9 0 9 0.00 40.36 0.99 2.28 27.94 2.23 0.06 -BGO_Y0_1 9 0 8 10.21 40.36 0.99 4.03 23.87 2.73 0.00 -BGO_Y0_1 9 0 7 20.42 40.36 0.97 3.26 23.35 2.76 0.00 -BGO_Y0_1 9 0 6 30.63 40.36 0.96 4.53 25.93 2.57 0.00 -BGO_Y0_1 9 0 5 40.84 40.36 0.98 1.27 21.98 2.76 0.00 -BGO_Y0_1 9 0 4 51.05 40.36 0.96 3.29 18.75 2.85 0.00 -BGO_Y0_1 9 0 3 61.26 40.36 0.96 0.72 22.58 2.69 0.00 -BGO_Y0_1 9 0 2 71.47 40.36 0.95 2.52 27.56 2.35 0.04 -BGO_Y0_1 9 0 1 81.68 40.36 0.95 1.51 26.31 2.17 0.05 -BGO_Y0_1 9 0 0 91.89 40.36 0.94 3.94 26.12 2.24 0.07 -BGO_Y0_1 10 0 18 -91.89 50.45 0.99 3.65 22.26 2.73 0.00 -BGO_Y0_1 10 0 17 -81.68 50.45 1.02 0.98 20.34 2.83 0.00 -BGO_Y0_1 10 0 16 -71.47 50.45 1.02 0.46 23.55 2.77 0.00 -BGO_Y0_1 10 0 15 -61.26 50.45 1.00 4.44 23.98 2.18 0.09 -BGO_Y0_1 10 0 14 -51.05 50.45 1.01 2.61 18.26 2.96 0.00 -BGO_Y0_1 10 0 13 -40.84 50.45 0.99 5.24 28.92 2.00 0.07 -BGO_Y0_1 10 0 12 -30.63 50.45 1.01 1.17 15.49 2.89 0.00 -BGO_Y0_1 10 0 11 -20.42 50.45 1.01 2.64 25.85 2.38 0.05 -BGO_Y0_1 10 0 10 -10.21 50.45 1.00 2.56 21.01 2.68 0.00 -BGO_Y0_1 10 0 9 0.00 50.45 0.99 2.33 20.91 2.76 0.00 -BGO_Y0_1 10 0 8 10.21 50.45 0.99 1.85 27.44 1.71 0.08 -BGO_Y0_1 10 0 7 20.42 50.45 0.99 1.68 26.18 2.11 0.06 -BGO_Y0_1 10 0 6 30.63 50.45 0.96 3.70 19.20 2.76 0.00 -BGO_Y0_1 10 0 5 40.84 50.45 0.95 2.46 21.18 2.74 0.00 -BGO_Y0_1 10 0 4 51.05 50.45 0.94 3.44 21.19 2.83 0.00 -BGO_Y0_1 10 0 3 61.26 50.45 0.93 3.49 23.34 2.59 0.03 -BGO_Y0_1 10 0 2 71.47 50.45 0.94 3.83 19.84 2.71 0.01 -BGO_Y0_1 10 0 1 81.68 50.45 0.95 3.08 23.05 2.72 0.00 -BGO_Y0_1 10 0 0 91.89 50.45 0.93 5.51 21.93 2.71 0.00 -BGO_Y0_1 0 1 18 -91.89 -50.45 0.99 3.65 22.26 2.73 0.00 -BGO_Y0_1 0 1 17 -81.68 -50.45 1.02 0.98 20.34 2.83 0.00 -BGO_Y0_1 0 1 16 -71.47 -50.45 1.02 0.46 23.55 2.77 0.00 -BGO_Y0_1 0 1 15 -61.26 -50.45 1.00 4.44 23.98 2.18 0.09 -BGO_Y0_1 0 1 14 -51.05 -50.45 1.01 2.61 18.26 2.96 0.00 -BGO_Y0_1 0 1 13 -40.84 -50.45 0.99 5.24 28.92 2.00 0.07 -BGO_Y0_1 0 1 12 -30.63 -50.45 1.01 1.17 15.49 2.89 0.00 -BGO_Y0_1 0 1 11 -20.42 -50.45 1.01 2.64 25.85 2.38 0.05 -BGO_Y0_1 0 1 10 -10.21 -50.45 1.00 2.56 21.01 2.68 0.00 -BGO_Y0_1 0 1 9 0.00 -50.45 0.99 2.33 20.91 2.76 0.00 -BGO_Y0_1 0 1 8 10.21 -50.45 0.99 1.85 27.44 1.71 0.08 -BGO_Y0_1 0 1 7 20.42 -50.45 0.99 1.68 26.18 2.11 0.06 -BGO_Y0_1 0 1 6 30.63 -50.45 0.96 3.70 19.20 2.76 0.00 -BGO_Y0_1 0 1 5 40.84 -50.45 0.95 2.46 21.18 2.74 0.00 -BGO_Y0_1 0 1 4 51.05 -50.45 0.94 3.44 21.19 2.83 0.00 -BGO_Y0_1 0 1 3 61.26 -50.45 0.93 3.49 23.34 2.59 0.03 -BGO_Y0_1 0 1 2 71.47 -50.45 0.94 3.83 19.84 2.71 0.01 -BGO_Y0_1 0 1 1 81.68 -50.45 0.95 3.08 23.05 2.72 0.00 -BGO_Y0_1 0 1 0 91.89 -50.45 0.93 5.51 21.93 2.71 0.00 -BGO_Y0_1 1 1 18 -91.89 -40.36 0.99 5.41 27.85 2.00 0.08 -BGO_Y0_1 1 1 17 -81.68 -40.36 1.00 2.38 22.41 2.74 0.00 -BGO_Y0_1 1 1 16 -71.47 -40.36 1.01 1.00 21.95 2.66 0.00 -BGO_Y0_1 1 1 15 -61.26 -40.36 0.97 6.88 33.51 0.00 0.12 -BGO_Y0_1 1 1 14 -51.05 -40.36 0.98 5.51 20.94 2.71 0.00 -BGO_Y0_1 1 1 13 -40.84 -40.36 0.99 5.39 21.18 2.40 0.06 -BGO_Y0_1 1 1 12 -30.63 -40.36 1.00 3.77 20.83 2.73 0.00 -BGO_Y0_1 1 1 11 -20.42 -40.36 1.00 3.49 18.44 2.81 0.00 -BGO_Y0_1 1 1 10 -10.21 -40.36 1.00 1.43 27.05 2.60 0.00 -BGO_Y0_1 1 1 9 0.00 -40.36 0.99 2.28 27.94 2.23 0.06 -BGO_Y0_1 1 1 8 10.21 -40.36 0.99 4.03 23.87 2.73 0.00 -BGO_Y0_1 1 1 7 20.42 -40.36 0.97 3.26 23.35 2.76 0.00 -BGO_Y0_1 1 1 6 30.63 -40.36 0.96 4.53 25.93 2.57 0.00 -BGO_Y0_1 1 1 5 40.84 -40.36 0.98 1.27 21.98 2.76 0.00 -BGO_Y0_1 1 1 4 51.05 -40.36 0.96 3.29 18.75 2.85 0.00 -BGO_Y0_1 1 1 3 61.26 -40.36 0.96 0.72 22.58 2.69 0.00 -BGO_Y0_1 1 1 2 71.47 -40.36 0.95 2.52 27.56 2.35 0.04 -BGO_Y0_1 1 1 1 81.68 -40.36 0.95 1.51 26.31 2.17 0.05 -BGO_Y0_1 1 1 0 91.89 -40.36 0.94 3.94 26.12 2.24 0.07 -BGO_Y0_1 2 1 18 -91.89 -30.27 1.00 3.57 22.94 2.65 0.00 -BGO_Y0_1 2 1 17 -81.68 -30.27 1.01 2.47 27.87 2.15 0.07 -BGO_Y0_1 2 1 16 -71.47 -30.27 1.01 0.39 28.55 1.38 0.10 -BGO_Y0_1 2 1 15 -61.26 -30.27 0.99 4.32 19.93 2.75 0.00 -BGO_Y0_1 2 1 14 -51.05 -30.27 0.99 4.40 16.85 2.89 0.00 -BGO_Y0_1 2 1 13 -40.84 -30.27 1.01 1.70 26.41 2.15 0.07 -BGO_Y0_1 2 1 12 -30.63 -30.27 0.99 4.11 24.51 2.57 0.00 -BGO_Y0_1 2 1 11 -20.42 -30.27 0.98 7.13 19.56 2.83 0.00 -BGO_Y0_1 2 1 10 -10.21 -30.27 1.01 0.83 17.65 2.80 0.00 -BGO_Y0_1 2 1 9 0.00 -30.27 1.00 2.63 22.11 2.55 0.00 -BGO_Y0_1 2 1 8 10.21 -30.27 0.99 2.92 25.87 2.57 0.01 -BGO_Y0_1 2 1 7 20.42 -30.27 0.99 3.77 21.29 2.75 0.00 -BGO_Y0_1 2 1 6 30.63 -30.27 1.00 2.82 22.83 2.55 0.05 -BGO_Y0_1 2 1 5 40.84 -30.27 0.99 3.04 22.71 2.64 0.00 -BGO_Y0_1 2 1 4 51.05 -30.27 0.99 1.64 20.32 2.80 0.00 -BGO_Y0_1 2 1 3 61.26 -30.27 0.98 0.39 21.75 2.68 0.00 -BGO_Y0_1 2 1 2 71.47 -30.27 0.93 5.13 24.41 2.52 0.01 -BGO_Y0_1 2 1 1 81.68 -30.27 0.95 2.68 22.48 2.72 0.00 -BGO_Y0_1 2 1 0 91.89 -30.27 0.94 3.66 24.44 2.44 0.03 -BGO_Y0_1 3 1 18 -91.89 -20.18 0.99 4.33 24.41 2.65 0.00 -BGO_Y0_1 3 1 17 -81.68 -20.18 1.00 3.76 22.12 2.71 0.00 -BGO_Y0_1 3 1 16 -71.47 -20.18 0.99 4.70 29.19 2.44 0.00 -BGO_Y0_1 3 1 15 -61.26 -20.18 1.00 2.01 22.86 2.73 0.00 -BGO_Y0_1 3 1 14 -51.05 -20.18 0.98 5.03 22.59 2.69 0.00 -BGO_Y0_1 3 1 13 -40.84 -20.18 1.00 1.97 22.46 2.78 0.00 -BGO_Y0_1 3 1 12 -30.63 -20.18 1.00 2.15 24.79 2.70 0.00 -BGO_Y0_1 3 1 11 -20.42 -20.18 0.99 4.65 31.31 1.87 0.09 -BGO_Y0_1 3 1 10 -10.21 -20.18 1.00 3.88 23.92 2.82 0.00 -BGO_Y0_1 3 1 9 0.00 -20.18 1.00 3.31 18.53 2.91 0.00 -BGO_Y0_1 3 1 8 10.21 -20.18 1.01 3.51 18.40 2.79 0.00 -BGO_Y0_1 3 1 7 20.42 -20.18 1.02 2.90 20.89 2.67 0.03 -BGO_Y0_1 3 1 6 30.63 -20.18 1.03 1.88 23.07 2.81 0.00 -BGO_Y0_1 3 1 5 40.84 -20.18 1.02 3.40 17.98 3.11 0.00 -BGO_Y0_1 3 1 4 51.05 -20.18 1.03 2.79 34.62 0.38 0.11 -BGO_Y0_1 3 1 3 61.26 -20.18 1.00 4.96 23.84 2.34 0.08 -BGO_Y0_1 3 1 2 71.47 -20.18 1.01 2.47 20.72 3.05 0.00 -BGO_Y0_1 3 1 1 81.68 -20.18 0.97 -1.32 32.19 0.99 0.11 -BGO_Y0_1 3 1 0 91.89 -20.18 0.93 1.85 25.14 2.15 0.06 -BGO_Y0_1 4 1 18 -91.89 -10.09 0.99 2.78 21.91 2.68 0.00 -BGO_Y0_1 4 1 17 -81.68 -10.09 0.99 6.11 29.83 1.12 0.11 -BGO_Y0_1 4 1 16 -71.47 -10.09 0.99 4.93 22.84 2.74 0.00 -BGO_Y0_1 4 1 15 -61.26 -10.09 1.00 1.01 21.75 2.66 0.00 -BGO_Y0_1 4 1 14 -51.05 -10.09 1.00 2.72 22.60 2.58 0.02 -BGO_Y0_1 4 1 13 -40.84 -10.09 0.99 3.64 30.28 1.61 0.08 -BGO_Y0_1 4 1 12 -30.63 -10.09 1.00 2.04 23.27 2.48 0.05 -BGO_Y0_1 4 1 11 -20.42 -10.09 0.99 4.58 21.72 2.75 0.00 -BGO_Y0_1 4 1 10 -10.21 -10.09 1.00 2.47 26.71 2.27 0.06 -BGO_Y0_1 4 1 9 0.00 -10.09 1.00 3.17 23.21 2.71 0.00 -BGO_Y0_1 4 1 8 10.21 -10.09 1.01 4.67 18.52 3.04 0.00 -BGO_Y0_1 4 1 7 20.42 -10.09 1.02 3.11 28.39 2.34 0.06 -BGO_Y0_1 4 1 6 30.63 -10.09 1.04 2.89 18.60 3.16 0.00 -BGO_Y0_1 4 1 5 40.84 -10.09 1.04 2.83 17.92 3.21 0.00 -BGO_Y0_1 4 1 4 51.05 -10.09 1.06 1.98 20.50 3.18 0.00 -BGO_Y0_1 4 1 3 61.26 -10.09 1.07 4.15 25.16 2.56 0.10 -BGO_Y0_1 4 1 2 71.47 -10.09 1.10 2.31 20.44 3.51 0.05 -BGO_Y0_1 4 1 1 81.68 -10.09 1.09 3.85 30.96 1.89 0.18 -BGO_Y0_1 4 1 0 91.89 -10.09 1.02 2.62 10.00 4.93 0.20 -BGO_Y0_1 5 1 18 -91.89 0.00 0.99 4.35 21.14 2.77 0.00 -BGO_Y0_1 5 1 17 -81.68 0.00 1.00 1.80 25.30 2.45 0.00 -BGO_Y0_1 5 1 16 -71.47 0.00 1.00 1.84 18.78 2.75 0.00 -BGO_Y0_1 5 1 15 -61.26 0.00 1.00 3.90 26.14 2.47 0.00 -BGO_Y0_1 5 1 14 -51.05 0.00 0.99 4.16 26.01 2.61 0.00 -BGO_Y0_1 5 1 13 -40.84 0.00 1.00 2.74 28.52 2.51 0.00 -BGO_Y0_1 5 1 12 -30.63 0.00 0.99 4.05 26.50 2.03 0.06 -BGO_Y0_1 5 1 11 -20.42 0.00 1.00 2.54 22.44 2.57 0.00 -BGO_Y0_1 5 1 10 -10.21 0.00 1.01 0.71 17.82 2.65 0.00 -BGO_Y0_1 5 1 9 0.00 0.00 1.00 3.25 22.74 2.87 0.00 -BGO_Y0_1 5 1 8 10.21 0.00 1.00 4.80 25.32 2.78 0.00 -BGO_Y0_1 5 1 7 20.42 0.00 1.02 5.08 21.37 2.60 0.05 -BGO_Y0_1 5 1 6 30.63 0.00 1.04 2.06 26.46 2.77 0.00 -BGO_Y0_1 5 1 5 40.84 0.00 1.06 3.28 20.28 3.08 0.00 -BGO_Y0_1 5 1 4 51.05 0.00 1.07 3.07 23.22 2.05 0.13 -BGO_Y0_1 5 1 3 61.26 0.00 1.10 3.52 19.21 3.35 0.07 -BGO_Y0_1 5 1 2 71.47 0.00 1.14 5.64 20.87 3.17 0.13 -BGO_Y0_1 5 1 1 81.68 0.00 1.27 -3.41 39.66 0.00 0.25 -BGO_Y0_1 5 1 0 91.89 0.00 1.24 -1.47 26.25 0.00 0.49 -BGO_Y0_1 6 1 18 -91.89 10.09 0.99 2.78 21.91 2.68 0.00 -BGO_Y0_1 6 1 17 -81.68 10.09 0.99 6.11 29.83 1.12 0.11 -BGO_Y0_1 6 1 16 -71.47 10.09 0.99 4.93 22.84 2.74 0.00 -BGO_Y0_1 6 1 15 -61.26 10.09 1.00 1.01 21.75 2.66 0.00 -BGO_Y0_1 6 1 14 -51.05 10.09 1.00 2.72 22.60 2.58 0.02 -BGO_Y0_1 6 1 13 -40.84 10.09 0.99 3.64 30.28 1.61 0.08 -BGO_Y0_1 6 1 12 -30.63 10.09 1.00 2.04 23.27 2.48 0.05 -BGO_Y0_1 6 1 11 -20.42 10.09 0.99 4.58 21.72 2.75 0.00 -BGO_Y0_1 6 1 10 -10.21 10.09 1.00 2.47 26.71 2.27 0.06 -BGO_Y0_1 6 1 9 0.00 10.09 1.00 3.17 23.21 2.71 0.00 -BGO_Y0_1 6 1 8 10.21 10.09 1.01 4.67 18.52 3.04 0.00 -BGO_Y0_1 6 1 7 20.42 10.09 1.02 3.11 28.39 2.34 0.06 -BGO_Y0_1 6 1 6 30.63 10.09 1.04 2.89 18.60 3.16 0.00 -BGO_Y0_1 6 1 5 40.84 10.09 1.04 2.83 17.92 3.21 0.00 -BGO_Y0_1 6 1 4 51.05 10.09 1.06 1.98 20.50 3.18 0.00 -BGO_Y0_1 6 1 3 61.26 10.09 1.07 4.15 25.16 2.56 0.10 -BGO_Y0_1 6 1 2 71.47 10.09 1.10 2.31 20.44 3.51 0.05 -BGO_Y0_1 6 1 1 81.68 10.09 1.09 3.85 30.96 1.89 0.18 -BGO_Y0_1 6 1 0 91.89 10.09 1.02 2.62 10.00 4.93 0.20 -BGO_Y0_1 7 1 18 -91.89 20.18 0.99 4.33 24.41 2.65 0.00 -BGO_Y0_1 7 1 17 -81.68 20.18 1.00 3.76 22.12 2.71 0.00 -BGO_Y0_1 7 1 16 -71.47 20.18 0.99 4.70 29.19 2.44 0.00 -BGO_Y0_1 7 1 15 -61.26 20.18 1.00 2.01 22.86 2.73 0.00 -BGO_Y0_1 7 1 14 -51.05 20.18 0.98 5.03 22.59 2.69 0.00 -BGO_Y0_1 7 1 13 -40.84 20.18 1.00 1.97 22.46 2.78 0.00 -BGO_Y0_1 7 1 12 -30.63 20.18 1.00 2.15 24.79 2.70 0.00 -BGO_Y0_1 7 1 11 -20.42 20.18 0.99 4.65 31.31 1.87 0.09 -BGO_Y0_1 7 1 10 -10.21 20.18 1.00 3.88 23.92 2.82 0.00 -BGO_Y0_1 7 1 9 0.00 20.18 1.00 3.31 18.53 2.91 0.00 -BGO_Y0_1 7 1 8 10.21 20.18 1.01 3.51 18.40 2.79 0.00 -BGO_Y0_1 7 1 7 20.42 20.18 1.02 2.90 20.89 2.67 0.03 -BGO_Y0_1 7 1 6 30.63 20.18 1.03 1.88 23.07 2.81 0.00 -BGO_Y0_1 7 1 5 40.84 20.18 1.02 3.40 17.98 3.11 0.00 -BGO_Y0_1 7 1 4 51.05 20.18 1.03 2.79 34.62 0.38 0.11 -BGO_Y0_1 7 1 3 61.26 20.18 1.00 4.96 23.84 2.34 0.08 -BGO_Y0_1 7 1 2 71.47 20.18 1.01 2.47 20.72 3.05 0.00 -BGO_Y0_1 7 1 1 81.68 20.18 0.97 -1.32 32.19 0.99 0.11 -BGO_Y0_1 7 1 0 91.89 20.18 0.93 1.85 25.14 2.15 0.06 -BGO_Y0_1 8 1 18 -91.89 30.27 1.00 3.57 22.94 2.65 0.00 -BGO_Y0_1 8 1 17 -81.68 30.27 1.01 2.47 27.87 2.15 0.07 -BGO_Y0_1 8 1 16 -71.47 30.27 1.01 0.39 28.55 1.38 0.10 -BGO_Y0_1 8 1 15 -61.26 30.27 0.99 4.32 19.93 2.75 0.00 -BGO_Y0_1 8 1 14 -51.05 30.27 0.99 4.40 16.85 2.89 0.00 -BGO_Y0_1 8 1 13 -40.84 30.27 1.01 1.70 26.41 2.15 0.07 -BGO_Y0_1 8 1 12 -30.63 30.27 0.99 4.11 24.51 2.57 0.00 -BGO_Y0_1 8 1 11 -20.42 30.27 0.98 7.13 19.56 2.83 0.00 -BGO_Y0_1 8 1 10 -10.21 30.27 1.01 0.83 17.65 2.80 0.00 -BGO_Y0_1 8 1 9 0.00 30.27 1.00 2.63 22.11 2.55 0.00 -BGO_Y0_1 8 1 8 10.21 30.27 0.99 2.92 25.87 2.57 0.01 -BGO_Y0_1 8 1 7 20.42 30.27 0.99 3.77 21.29 2.75 0.00 -BGO_Y0_1 8 1 6 30.63 30.27 1.00 2.82 22.83 2.55 0.05 -BGO_Y0_1 8 1 5 40.84 30.27 0.99 3.04 22.71 2.64 0.00 -BGO_Y0_1 8 1 4 51.05 30.27 0.99 1.64 20.32 2.80 0.00 -BGO_Y0_1 8 1 3 61.26 30.27 0.98 0.39 21.75 2.68 0.00 -BGO_Y0_1 8 1 2 71.47 30.27 0.93 5.13 24.41 2.52 0.01 -BGO_Y0_1 8 1 1 81.68 30.27 0.95 2.68 22.48 2.72 0.00 -BGO_Y0_1 8 1 0 91.89 30.27 0.94 3.66 24.44 2.44 0.03 -BGO_Y0_1 9 1 18 -91.89 40.36 0.99 5.41 27.85 2.00 0.08 -BGO_Y0_1 9 1 17 -81.68 40.36 1.00 2.38 22.41 2.74 0.00 -BGO_Y0_1 9 1 16 -71.47 40.36 1.01 1.00 21.95 2.66 0.00 -BGO_Y0_1 9 1 15 -61.26 40.36 0.97 6.88 33.51 0.00 0.12 -BGO_Y0_1 9 1 14 -51.05 40.36 0.98 5.51 20.94 2.71 0.00 -BGO_Y0_1 9 1 13 -40.84 40.36 0.99 5.39 21.18 2.40 0.06 -BGO_Y0_1 9 1 12 -30.63 40.36 1.00 3.77 20.83 2.73 0.00 -BGO_Y0_1 9 1 11 -20.42 40.36 1.00 3.49 18.44 2.81 0.00 -BGO_Y0_1 9 1 10 -10.21 40.36 1.00 1.43 27.05 2.60 0.00 -BGO_Y0_1 9 1 9 0.00 40.36 0.99 2.28 27.94 2.23 0.06 -BGO_Y0_1 9 1 8 10.21 40.36 0.99 4.03 23.87 2.73 0.00 -BGO_Y0_1 9 1 7 20.42 40.36 0.97 3.26 23.35 2.76 0.00 -BGO_Y0_1 9 1 6 30.63 40.36 0.96 4.53 25.93 2.57 0.00 -BGO_Y0_1 9 1 5 40.84 40.36 0.98 1.27 21.98 2.76 0.00 -BGO_Y0_1 9 1 4 51.05 40.36 0.96 3.29 18.75 2.85 0.00 -BGO_Y0_1 9 1 3 61.26 40.36 0.96 0.72 22.58 2.69 0.00 -BGO_Y0_1 9 1 2 71.47 40.36 0.95 2.52 27.56 2.35 0.04 -BGO_Y0_1 9 1 1 81.68 40.36 0.95 1.51 26.31 2.17 0.05 -BGO_Y0_1 9 1 0 91.89 40.36 0.94 3.94 26.12 2.24 0.07 -BGO_Y0_1 10 1 18 -91.89 50.45 0.99 3.65 22.26 2.73 0.00 -BGO_Y0_1 10 1 17 -81.68 50.45 1.02 0.98 20.34 2.83 0.00 -BGO_Y0_1 10 1 16 -71.47 50.45 1.02 0.46 23.55 2.77 0.00 -BGO_Y0_1 10 1 15 -61.26 50.45 1.00 4.44 23.98 2.18 0.09 -BGO_Y0_1 10 1 14 -51.05 50.45 1.01 2.61 18.26 2.96 0.00 -BGO_Y0_1 10 1 13 -40.84 50.45 0.99 5.24 28.92 2.00 0.07 -BGO_Y0_1 10 1 12 -30.63 50.45 1.01 1.17 15.49 2.89 0.00 -BGO_Y0_1 10 1 11 -20.42 50.45 1.01 2.64 25.85 2.38 0.05 -BGO_Y0_1 10 1 10 -10.21 50.45 1.00 2.56 21.01 2.68 0.00 -BGO_Y0_1 10 1 9 0.00 50.45 0.99 2.33 20.91 2.76 0.00 -BGO_Y0_1 10 1 8 10.21 50.45 0.99 1.85 27.44 1.71 0.08 -BGO_Y0_1 10 1 7 20.42 50.45 0.99 1.68 26.18 2.11 0.06 -BGO_Y0_1 10 1 6 30.63 50.45 0.96 3.70 19.20 2.76 0.00 -BGO_Y0_1 10 1 5 40.84 50.45 0.95 2.46 21.18 2.74 0.00 -BGO_Y0_1 10 1 4 51.05 50.45 0.94 3.44 21.19 2.83 0.00 -BGO_Y0_1 10 1 3 61.26 50.45 0.93 3.49 23.34 2.59 0.03 -BGO_Y0_1 10 1 2 71.47 50.45 0.94 3.83 19.84 2.71 0.01 -BGO_Y0_1 10 1 1 81.68 50.45 0.95 3.08 23.05 2.72 0.00 -BGO_Y0_1 10 1 0 91.89 50.45 0.93 5.51 21.93 2.71 0.00 -BGO_Y0_2 0 0 18 -91.89 -50.45 0.99 3.65 22.26 2.73 0.00 -BGO_Y0_2 0 0 17 -81.68 -50.45 1.02 0.98 20.34 2.83 0.00 -BGO_Y0_2 0 0 16 -71.47 -50.45 1.02 0.46 23.55 2.77 0.00 -BGO_Y0_2 0 0 15 -61.26 -50.45 1.00 4.44 23.98 2.18 0.09 -BGO_Y0_2 0 0 14 -51.05 -50.45 1.01 2.61 18.26 2.96 0.00 -BGO_Y0_2 0 0 13 -40.84 -50.45 0.99 5.24 28.92 2.00 0.07 -BGO_Y0_2 0 0 12 -30.63 -50.45 1.01 1.17 15.49 2.89 0.00 -BGO_Y0_2 0 0 11 -20.42 -50.45 1.01 2.64 25.85 2.38 0.05 -BGO_Y0_2 0 0 10 -10.21 -50.45 1.00 2.56 21.01 2.68 0.00 -BGO_Y0_2 0 0 9 0.00 -50.45 0.99 2.33 20.91 2.76 0.00 -BGO_Y0_2 0 0 8 10.21 -50.45 0.99 1.85 27.44 1.71 0.08 -BGO_Y0_2 0 0 7 20.42 -50.45 0.99 1.68 26.18 2.11 0.06 -BGO_Y0_2 0 0 6 30.63 -50.45 0.96 3.70 19.20 2.76 0.00 -BGO_Y0_2 0 0 5 40.84 -50.45 0.95 2.46 21.18 2.74 0.00 -BGO_Y0_2 0 0 4 51.05 -50.45 0.94 3.44 21.19 2.83 0.00 -BGO_Y0_2 0 0 3 61.26 -50.45 0.93 3.49 23.34 2.59 0.03 -BGO_Y0_2 0 0 2 71.47 -50.45 0.94 3.83 19.84 2.71 0.01 -BGO_Y0_2 0 0 1 81.68 -50.45 0.95 3.08 23.05 2.72 0.00 -BGO_Y0_2 0 0 0 91.89 -50.45 0.93 5.51 21.93 2.71 0.00 -BGO_Y0_2 1 0 18 -91.89 -40.36 0.99 5.41 27.85 2.00 0.08 -BGO_Y0_2 1 0 17 -81.68 -40.36 1.00 2.38 22.41 2.74 0.00 -BGO_Y0_2 1 0 16 -71.47 -40.36 1.01 1.00 21.95 2.66 0.00 -BGO_Y0_2 1 0 15 -61.26 -40.36 0.97 6.88 33.51 0.00 0.12 -BGO_Y0_2 1 0 14 -51.05 -40.36 0.98 5.51 20.94 2.71 0.00 -BGO_Y0_2 1 0 13 -40.84 -40.36 0.99 5.39 21.18 2.40 0.06 -BGO_Y0_2 1 0 12 -30.63 -40.36 1.00 3.77 20.83 2.73 0.00 -BGO_Y0_2 1 0 11 -20.42 -40.36 1.00 3.49 18.44 2.81 0.00 -BGO_Y0_2 1 0 10 -10.21 -40.36 1.00 1.43 27.05 2.60 0.00 -BGO_Y0_2 1 0 9 0.00 -40.36 0.99 2.28 27.94 2.23 0.06 -BGO_Y0_2 1 0 8 10.21 -40.36 0.99 4.03 23.87 2.73 0.00 -BGO_Y0_2 1 0 7 20.42 -40.36 0.97 3.26 23.35 2.76 0.00 -BGO_Y0_2 1 0 6 30.63 -40.36 0.96 4.53 25.93 2.57 0.00 -BGO_Y0_2 1 0 5 40.84 -40.36 0.98 1.27 21.98 2.76 0.00 -BGO_Y0_2 1 0 4 51.05 -40.36 0.96 3.29 18.75 2.85 0.00 -BGO_Y0_2 1 0 3 61.26 -40.36 0.96 0.72 22.58 2.69 0.00 -BGO_Y0_2 1 0 2 71.47 -40.36 0.95 2.52 27.56 2.35 0.04 -BGO_Y0_2 1 0 1 81.68 -40.36 0.95 1.51 26.31 2.17 0.05 -BGO_Y0_2 1 0 0 91.89 -40.36 0.94 3.94 26.12 2.24 0.07 -BGO_Y0_2 2 0 18 -91.89 -30.27 1.00 3.57 22.94 2.65 0.00 -BGO_Y0_2 2 0 17 -81.68 -30.27 1.01 2.47 27.87 2.15 0.07 -BGO_Y0_2 2 0 16 -71.47 -30.27 1.01 0.39 28.55 1.38 0.10 -BGO_Y0_2 2 0 15 -61.26 -30.27 0.99 4.32 19.93 2.75 0.00 -BGO_Y0_2 2 0 14 -51.05 -30.27 0.99 4.40 16.85 2.89 0.00 -BGO_Y0_2 2 0 13 -40.84 -30.27 1.01 1.70 26.41 2.15 0.07 -BGO_Y0_2 2 0 12 -30.63 -30.27 0.99 4.11 24.51 2.57 0.00 -BGO_Y0_2 2 0 11 -20.42 -30.27 0.98 7.13 19.56 2.83 0.00 -BGO_Y0_2 2 0 10 -10.21 -30.27 1.01 0.83 17.65 2.80 0.00 -BGO_Y0_2 2 0 9 0.00 -30.27 1.00 2.63 22.11 2.55 0.00 -BGO_Y0_2 2 0 8 10.21 -30.27 0.99 2.92 25.87 2.57 0.01 -BGO_Y0_2 2 0 7 20.42 -30.27 0.99 3.77 21.29 2.75 0.00 -BGO_Y0_2 2 0 6 30.63 -30.27 1.00 2.82 22.83 2.55 0.05 -BGO_Y0_2 2 0 5 40.84 -30.27 0.99 3.04 22.71 2.64 0.00 -BGO_Y0_2 2 0 4 51.05 -30.27 0.99 1.64 20.32 2.80 0.00 -BGO_Y0_2 2 0 3 61.26 -30.27 0.98 0.39 21.75 2.68 0.00 -BGO_Y0_2 2 0 2 71.47 -30.27 0.93 5.13 24.41 2.52 0.01 -BGO_Y0_2 2 0 1 81.68 -30.27 0.95 2.68 22.48 2.72 0.00 -BGO_Y0_2 2 0 0 91.89 -30.27 0.94 3.66 24.44 2.44 0.03 -BGO_Y0_2 3 0 18 -91.89 -20.18 0.99 4.33 24.41 2.65 0.00 -BGO_Y0_2 3 0 17 -81.68 -20.18 1.00 3.76 22.12 2.71 0.00 -BGO_Y0_2 3 0 16 -71.47 -20.18 0.99 4.70 29.19 2.44 0.00 -BGO_Y0_2 3 0 15 -61.26 -20.18 1.00 2.01 22.86 2.73 0.00 -BGO_Y0_2 3 0 14 -51.05 -20.18 0.98 5.03 22.59 2.69 0.00 -BGO_Y0_2 3 0 13 -40.84 -20.18 1.00 1.97 22.46 2.78 0.00 -BGO_Y0_2 3 0 12 -30.63 -20.18 1.00 2.15 24.79 2.70 0.00 -BGO_Y0_2 3 0 11 -20.42 -20.18 0.99 4.65 31.31 1.87 0.09 -BGO_Y0_2 3 0 10 -10.21 -20.18 1.00 3.88 23.92 2.82 0.00 -BGO_Y0_2 3 0 9 0.00 -20.18 1.00 3.31 18.53 2.91 0.00 -BGO_Y0_2 3 0 8 10.21 -20.18 1.01 3.51 18.40 2.79 0.00 -BGO_Y0_2 3 0 7 20.42 -20.18 1.02 2.90 20.89 2.67 0.03 -BGO_Y0_2 3 0 6 30.63 -20.18 1.03 1.88 23.07 2.81 0.00 -BGO_Y0_2 3 0 5 40.84 -20.18 1.02 3.40 17.98 3.11 0.00 -BGO_Y0_2 3 0 4 51.05 -20.18 1.03 2.79 34.62 0.38 0.11 -BGO_Y0_2 3 0 3 61.26 -20.18 1.00 4.96 23.84 2.34 0.08 -BGO_Y0_2 3 0 2 71.47 -20.18 1.01 2.47 20.72 3.05 0.00 -BGO_Y0_2 3 0 1 81.68 -20.18 0.97 -1.32 32.19 0.99 0.11 -BGO_Y0_2 3 0 0 91.89 -20.18 0.93 1.85 25.14 2.15 0.06 -BGO_Y0_2 4 0 18 -91.89 -10.09 0.99 2.78 21.91 2.68 0.00 -BGO_Y0_2 4 0 17 -81.68 -10.09 0.99 6.11 29.83 1.12 0.11 -BGO_Y0_2 4 0 16 -71.47 -10.09 0.99 4.93 22.84 2.74 0.00 -BGO_Y0_2 4 0 15 -61.26 -10.09 1.00 1.01 21.75 2.66 0.00 -BGO_Y0_2 4 0 14 -51.05 -10.09 1.00 2.72 22.60 2.58 0.02 -BGO_Y0_2 4 0 13 -40.84 -10.09 0.99 3.64 30.28 1.61 0.08 -BGO_Y0_2 4 0 12 -30.63 -10.09 1.00 2.04 23.27 2.48 0.05 -BGO_Y0_2 4 0 11 -20.42 -10.09 0.99 4.58 21.72 2.75 0.00 -BGO_Y0_2 4 0 10 -10.21 -10.09 1.00 2.47 26.71 2.27 0.06 -BGO_Y0_2 4 0 9 0.00 -10.09 1.00 3.17 23.21 2.71 0.00 -BGO_Y0_2 4 0 8 10.21 -10.09 1.01 4.67 18.52 3.04 0.00 -BGO_Y0_2 4 0 7 20.42 -10.09 1.02 3.11 28.39 2.34 0.06 -BGO_Y0_2 4 0 6 30.63 -10.09 1.04 2.89 18.60 3.16 0.00 -BGO_Y0_2 4 0 5 40.84 -10.09 1.04 2.83 17.92 3.21 0.00 -BGO_Y0_2 4 0 4 51.05 -10.09 1.06 1.98 20.50 3.18 0.00 -BGO_Y0_2 4 0 3 61.26 -10.09 1.07 4.15 25.16 2.56 0.10 -BGO_Y0_2 4 0 2 71.47 -10.09 1.10 2.31 20.44 3.51 0.05 -BGO_Y0_2 4 0 1 81.68 -10.09 1.09 3.85 30.96 1.89 0.18 -BGO_Y0_2 4 0 0 91.89 -10.09 1.02 2.62 10.00 4.93 0.20 -BGO_Y0_2 5 0 18 -91.89 0.00 0.99 4.35 21.14 2.77 0.00 -BGO_Y0_2 5 0 17 -81.68 0.00 1.00 1.80 25.30 2.45 0.00 -BGO_Y0_2 5 0 16 -71.47 0.00 1.00 1.84 18.78 2.75 0.00 -BGO_Y0_2 5 0 15 -61.26 0.00 1.00 3.90 26.14 2.47 0.00 -BGO_Y0_2 5 0 14 -51.05 0.00 0.99 4.16 26.01 2.61 0.00 -BGO_Y0_2 5 0 13 -40.84 0.00 1.00 2.74 28.52 2.51 0.00 -BGO_Y0_2 5 0 12 -30.63 0.00 0.99 4.05 26.50 2.03 0.06 -BGO_Y0_2 5 0 11 -20.42 0.00 1.00 2.54 22.44 2.57 0.00 -BGO_Y0_2 5 0 10 -10.21 0.00 1.01 0.71 17.82 2.65 0.00 -BGO_Y0_2 5 0 9 0.00 0.00 1.00 3.25 22.74 2.87 0.00 -BGO_Y0_2 5 0 8 10.21 0.00 1.00 4.80 25.32 2.78 0.00 -BGO_Y0_2 5 0 7 20.42 0.00 1.02 5.08 21.37 2.60 0.05 -BGO_Y0_2 5 0 6 30.63 0.00 1.04 2.06 26.46 2.77 0.00 -BGO_Y0_2 5 0 5 40.84 0.00 1.06 3.28 20.28 3.08 0.00 -BGO_Y0_2 5 0 4 51.05 0.00 1.07 3.07 23.22 2.05 0.13 -BGO_Y0_2 5 0 3 61.26 0.00 1.10 3.52 19.21 3.35 0.07 -BGO_Y0_2 5 0 2 71.47 0.00 1.14 5.64 20.87 3.17 0.13 -BGO_Y0_2 5 0 1 81.68 0.00 1.27 -3.41 39.66 0.00 0.25 -BGO_Y0_2 5 0 0 91.89 0.00 1.24 -1.47 26.25 0.00 0.49 -BGO_Y0_2 6 0 18 -91.89 10.09 0.99 2.78 21.91 2.68 0.00 -BGO_Y0_2 6 0 17 -81.68 10.09 0.99 6.11 29.83 1.12 0.11 -BGO_Y0_2 6 0 16 -71.47 10.09 0.99 4.93 22.84 2.74 0.00 -BGO_Y0_2 6 0 15 -61.26 10.09 1.00 1.01 21.75 2.66 0.00 -BGO_Y0_2 6 0 14 -51.05 10.09 1.00 2.72 22.60 2.58 0.02 -BGO_Y0_2 6 0 13 -40.84 10.09 0.99 3.64 30.28 1.61 0.08 -BGO_Y0_2 6 0 12 -30.63 10.09 1.00 2.04 23.27 2.48 0.05 -BGO_Y0_2 6 0 11 -20.42 10.09 0.99 4.58 21.72 2.75 0.00 -BGO_Y0_2 6 0 10 -10.21 10.09 1.00 2.47 26.71 2.27 0.06 -BGO_Y0_2 6 0 9 0.00 10.09 1.00 3.17 23.21 2.71 0.00 -BGO_Y0_2 6 0 8 10.21 10.09 1.01 4.67 18.52 3.04 0.00 -BGO_Y0_2 6 0 7 20.42 10.09 1.02 3.11 28.39 2.34 0.06 -BGO_Y0_2 6 0 6 30.63 10.09 1.04 2.89 18.60 3.16 0.00 -BGO_Y0_2 6 0 5 40.84 10.09 1.04 2.83 17.92 3.21 0.00 -BGO_Y0_2 6 0 4 51.05 10.09 1.06 1.98 20.50 3.18 0.00 -BGO_Y0_2 6 0 3 61.26 10.09 1.07 4.15 25.16 2.56 0.10 -BGO_Y0_2 6 0 2 71.47 10.09 1.10 2.31 20.44 3.51 0.05 -BGO_Y0_2 6 0 1 81.68 10.09 1.09 3.85 30.96 1.89 0.18 -BGO_Y0_2 6 0 0 91.89 10.09 1.02 2.62 10.00 4.93 0.20 -BGO_Y0_2 7 0 18 -91.89 20.18 0.99 4.33 24.41 2.65 0.00 -BGO_Y0_2 7 0 17 -81.68 20.18 1.00 3.76 22.12 2.71 0.00 -BGO_Y0_2 7 0 16 -71.47 20.18 0.99 4.70 29.19 2.44 0.00 -BGO_Y0_2 7 0 15 -61.26 20.18 1.00 2.01 22.86 2.73 0.00 -BGO_Y0_2 7 0 14 -51.05 20.18 0.98 5.03 22.59 2.69 0.00 -BGO_Y0_2 7 0 13 -40.84 20.18 1.00 1.97 22.46 2.78 0.00 -BGO_Y0_2 7 0 12 -30.63 20.18 1.00 2.15 24.79 2.70 0.00 -BGO_Y0_2 7 0 11 -20.42 20.18 0.99 4.65 31.31 1.87 0.09 -BGO_Y0_2 7 0 10 -10.21 20.18 1.00 3.88 23.92 2.82 0.00 -BGO_Y0_2 7 0 9 0.00 20.18 1.00 3.31 18.53 2.91 0.00 -BGO_Y0_2 7 0 8 10.21 20.18 1.01 3.51 18.40 2.79 0.00 -BGO_Y0_2 7 0 7 20.42 20.18 1.02 2.90 20.89 2.67 0.03 -BGO_Y0_2 7 0 6 30.63 20.18 1.03 1.88 23.07 2.81 0.00 -BGO_Y0_2 7 0 5 40.84 20.18 1.02 3.40 17.98 3.11 0.00 -BGO_Y0_2 7 0 4 51.05 20.18 1.03 2.79 34.62 0.38 0.11 -BGO_Y0_2 7 0 3 61.26 20.18 1.00 4.96 23.84 2.34 0.08 -BGO_Y0_2 7 0 2 71.47 20.18 1.01 2.47 20.72 3.05 0.00 -BGO_Y0_2 7 0 1 81.68 20.18 0.97 -1.32 32.19 0.99 0.11 -BGO_Y0_2 7 0 0 91.89 20.18 0.93 1.85 25.14 2.15 0.06 -BGO_Y0_2 8 0 18 -91.89 30.27 1.00 3.57 22.94 2.65 0.00 -BGO_Y0_2 8 0 17 -81.68 30.27 1.01 2.47 27.87 2.15 0.07 -BGO_Y0_2 8 0 16 -71.47 30.27 1.01 0.39 28.55 1.38 0.10 -BGO_Y0_2 8 0 15 -61.26 30.27 0.99 4.32 19.93 2.75 0.00 -BGO_Y0_2 8 0 14 -51.05 30.27 0.99 4.40 16.85 2.89 0.00 -BGO_Y0_2 8 0 13 -40.84 30.27 1.01 1.70 26.41 2.15 0.07 -BGO_Y0_2 8 0 12 -30.63 30.27 0.99 4.11 24.51 2.57 0.00 -BGO_Y0_2 8 0 11 -20.42 30.27 0.98 7.13 19.56 2.83 0.00 -BGO_Y0_2 8 0 10 -10.21 30.27 1.01 0.83 17.65 2.80 0.00 -BGO_Y0_2 8 0 9 0.00 30.27 1.00 2.63 22.11 2.55 0.00 -BGO_Y0_2 8 0 8 10.21 30.27 0.99 2.92 25.87 2.57 0.01 -BGO_Y0_2 8 0 7 20.42 30.27 0.99 3.77 21.29 2.75 0.00 -BGO_Y0_2 8 0 6 30.63 30.27 1.00 2.82 22.83 2.55 0.05 -BGO_Y0_2 8 0 5 40.84 30.27 0.99 3.04 22.71 2.64 0.00 -BGO_Y0_2 8 0 4 51.05 30.27 0.99 1.64 20.32 2.80 0.00 -BGO_Y0_2 8 0 3 61.26 30.27 0.98 0.39 21.75 2.68 0.00 -BGO_Y0_2 8 0 2 71.47 30.27 0.93 5.13 24.41 2.52 0.01 -BGO_Y0_2 8 0 1 81.68 30.27 0.95 2.68 22.48 2.72 0.00 -BGO_Y0_2 8 0 0 91.89 30.27 0.94 3.66 24.44 2.44 0.03 -BGO_Y0_2 9 0 18 -91.89 40.36 0.99 5.41 27.85 2.00 0.08 -BGO_Y0_2 9 0 17 -81.68 40.36 1.00 2.38 22.41 2.74 0.00 -BGO_Y0_2 9 0 16 -71.47 40.36 1.01 1.00 21.95 2.66 0.00 -BGO_Y0_2 9 0 15 -61.26 40.36 0.97 6.88 33.51 0.00 0.12 -BGO_Y0_2 9 0 14 -51.05 40.36 0.98 5.51 20.94 2.71 0.00 -BGO_Y0_2 9 0 13 -40.84 40.36 0.99 5.39 21.18 2.40 0.06 -BGO_Y0_2 9 0 12 -30.63 40.36 1.00 3.77 20.83 2.73 0.00 -BGO_Y0_2 9 0 11 -20.42 40.36 1.00 3.49 18.44 2.81 0.00 -BGO_Y0_2 9 0 10 -10.21 40.36 1.00 1.43 27.05 2.60 0.00 -BGO_Y0_2 9 0 9 0.00 40.36 0.99 2.28 27.94 2.23 0.06 -BGO_Y0_2 9 0 8 10.21 40.36 0.99 4.03 23.87 2.73 0.00 -BGO_Y0_2 9 0 7 20.42 40.36 0.97 3.26 23.35 2.76 0.00 -BGO_Y0_2 9 0 6 30.63 40.36 0.96 4.53 25.93 2.57 0.00 -BGO_Y0_2 9 0 5 40.84 40.36 0.98 1.27 21.98 2.76 0.00 -BGO_Y0_2 9 0 4 51.05 40.36 0.96 3.29 18.75 2.85 0.00 -BGO_Y0_2 9 0 3 61.26 40.36 0.96 0.72 22.58 2.69 0.00 -BGO_Y0_2 9 0 2 71.47 40.36 0.95 2.52 27.56 2.35 0.04 -BGO_Y0_2 9 0 1 81.68 40.36 0.95 1.51 26.31 2.17 0.05 -BGO_Y0_2 9 0 0 91.89 40.36 0.94 3.94 26.12 2.24 0.07 -BGO_Y0_2 10 0 18 -91.89 50.45 0.99 3.65 22.26 2.73 0.00 -BGO_Y0_2 10 0 17 -81.68 50.45 1.02 0.98 20.34 2.83 0.00 -BGO_Y0_2 10 0 16 -71.47 50.45 1.02 0.46 23.55 2.77 0.00 -BGO_Y0_2 10 0 15 -61.26 50.45 1.00 4.44 23.98 2.18 0.09 -BGO_Y0_2 10 0 14 -51.05 50.45 1.01 2.61 18.26 2.96 0.00 -BGO_Y0_2 10 0 13 -40.84 50.45 0.99 5.24 28.92 2.00 0.07 -BGO_Y0_2 10 0 12 -30.63 50.45 1.01 1.17 15.49 2.89 0.00 -BGO_Y0_2 10 0 11 -20.42 50.45 1.01 2.64 25.85 2.38 0.05 -BGO_Y0_2 10 0 10 -10.21 50.45 1.00 2.56 21.01 2.68 0.00 -BGO_Y0_2 10 0 9 0.00 50.45 0.99 2.33 20.91 2.76 0.00 -BGO_Y0_2 10 0 8 10.21 50.45 0.99 1.85 27.44 1.71 0.08 -BGO_Y0_2 10 0 7 20.42 50.45 0.99 1.68 26.18 2.11 0.06 -BGO_Y0_2 10 0 6 30.63 50.45 0.96 3.70 19.20 2.76 0.00 -BGO_Y0_2 10 0 5 40.84 50.45 0.95 2.46 21.18 2.74 0.00 -BGO_Y0_2 10 0 4 51.05 50.45 0.94 3.44 21.19 2.83 0.00 -BGO_Y0_2 10 0 3 61.26 50.45 0.93 3.49 23.34 2.59 0.03 -BGO_Y0_2 10 0 2 71.47 50.45 0.94 3.83 19.84 2.71 0.01 -BGO_Y0_2 10 0 1 81.68 50.45 0.95 3.08 23.05 2.72 0.00 -BGO_Y0_2 10 0 0 91.89 50.45 0.93 5.51 21.93 2.71 0.00 -BGO_Y0_2 0 1 18 -91.89 -50.45 0.99 3.65 22.26 2.73 0.00 -BGO_Y0_2 0 1 17 -81.68 -50.45 1.02 0.98 20.34 2.83 0.00 -BGO_Y0_2 0 1 16 -71.47 -50.45 1.02 0.46 23.55 2.77 0.00 -BGO_Y0_2 0 1 15 -61.26 -50.45 1.00 4.44 23.98 2.18 0.09 -BGO_Y0_2 0 1 14 -51.05 -50.45 1.01 2.61 18.26 2.96 0.00 -BGO_Y0_2 0 1 13 -40.84 -50.45 0.99 5.24 28.92 2.00 0.07 -BGO_Y0_2 0 1 12 -30.63 -50.45 1.01 1.17 15.49 2.89 0.00 -BGO_Y0_2 0 1 11 -20.42 -50.45 1.01 2.64 25.85 2.38 0.05 -BGO_Y0_2 0 1 10 -10.21 -50.45 1.00 2.56 21.01 2.68 0.00 -BGO_Y0_2 0 1 9 0.00 -50.45 0.99 2.33 20.91 2.76 0.00 -BGO_Y0_2 0 1 8 10.21 -50.45 0.99 1.85 27.44 1.71 0.08 -BGO_Y0_2 0 1 7 20.42 -50.45 0.99 1.68 26.18 2.11 0.06 -BGO_Y0_2 0 1 6 30.63 -50.45 0.96 3.70 19.20 2.76 0.00 -BGO_Y0_2 0 1 5 40.84 -50.45 0.95 2.46 21.18 2.74 0.00 -BGO_Y0_2 0 1 4 51.05 -50.45 0.94 3.44 21.19 2.83 0.00 -BGO_Y0_2 0 1 3 61.26 -50.45 0.93 3.49 23.34 2.59 0.03 -BGO_Y0_2 0 1 2 71.47 -50.45 0.94 3.83 19.84 2.71 0.01 -BGO_Y0_2 0 1 1 81.68 -50.45 0.95 3.08 23.05 2.72 0.00 -BGO_Y0_2 0 1 0 91.89 -50.45 0.93 5.51 21.93 2.71 0.00 -BGO_Y0_2 1 1 18 -91.89 -40.36 0.99 5.41 27.85 2.00 0.08 -BGO_Y0_2 1 1 17 -81.68 -40.36 1.00 2.38 22.41 2.74 0.00 -BGO_Y0_2 1 1 16 -71.47 -40.36 1.01 1.00 21.95 2.66 0.00 -BGO_Y0_2 1 1 15 -61.26 -40.36 0.97 6.88 33.51 0.00 0.12 -BGO_Y0_2 1 1 14 -51.05 -40.36 0.98 5.51 20.94 2.71 0.00 -BGO_Y0_2 1 1 13 -40.84 -40.36 0.99 5.39 21.18 2.40 0.06 -BGO_Y0_2 1 1 12 -30.63 -40.36 1.00 3.77 20.83 2.73 0.00 -BGO_Y0_2 1 1 11 -20.42 -40.36 1.00 3.49 18.44 2.81 0.00 -BGO_Y0_2 1 1 10 -10.21 -40.36 1.00 1.43 27.05 2.60 0.00 -BGO_Y0_2 1 1 9 0.00 -40.36 0.99 2.28 27.94 2.23 0.06 -BGO_Y0_2 1 1 8 10.21 -40.36 0.99 4.03 23.87 2.73 0.00 -BGO_Y0_2 1 1 7 20.42 -40.36 0.97 3.26 23.35 2.76 0.00 -BGO_Y0_2 1 1 6 30.63 -40.36 0.96 4.53 25.93 2.57 0.00 -BGO_Y0_2 1 1 5 40.84 -40.36 0.98 1.27 21.98 2.76 0.00 -BGO_Y0_2 1 1 4 51.05 -40.36 0.96 3.29 18.75 2.85 0.00 -BGO_Y0_2 1 1 3 61.26 -40.36 0.96 0.72 22.58 2.69 0.00 -BGO_Y0_2 1 1 2 71.47 -40.36 0.95 2.52 27.56 2.35 0.04 -BGO_Y0_2 1 1 1 81.68 -40.36 0.95 1.51 26.31 2.17 0.05 -BGO_Y0_2 1 1 0 91.89 -40.36 0.94 3.94 26.12 2.24 0.07 -BGO_Y0_2 2 1 18 -91.89 -30.27 1.00 3.57 22.94 2.65 0.00 -BGO_Y0_2 2 1 17 -81.68 -30.27 1.01 2.47 27.87 2.15 0.07 -BGO_Y0_2 2 1 16 -71.47 -30.27 1.01 0.39 28.55 1.38 0.10 -BGO_Y0_2 2 1 15 -61.26 -30.27 0.99 4.32 19.93 2.75 0.00 -BGO_Y0_2 2 1 14 -51.05 -30.27 0.99 4.40 16.85 2.89 0.00 -BGO_Y0_2 2 1 13 -40.84 -30.27 1.01 1.70 26.41 2.15 0.07 -BGO_Y0_2 2 1 12 -30.63 -30.27 0.99 4.11 24.51 2.57 0.00 -BGO_Y0_2 2 1 11 -20.42 -30.27 0.98 7.13 19.56 2.83 0.00 -BGO_Y0_2 2 1 10 -10.21 -30.27 1.01 0.83 17.65 2.80 0.00 -BGO_Y0_2 2 1 9 0.00 -30.27 1.00 2.63 22.11 2.55 0.00 -BGO_Y0_2 2 1 8 10.21 -30.27 0.99 2.92 25.87 2.57 0.01 -BGO_Y0_2 2 1 7 20.42 -30.27 0.99 3.77 21.29 2.75 0.00 -BGO_Y0_2 2 1 6 30.63 -30.27 1.00 2.82 22.83 2.55 0.05 -BGO_Y0_2 2 1 5 40.84 -30.27 0.99 3.04 22.71 2.64 0.00 -BGO_Y0_2 2 1 4 51.05 -30.27 0.99 1.64 20.32 2.80 0.00 -BGO_Y0_2 2 1 3 61.26 -30.27 0.98 0.39 21.75 2.68 0.00 -BGO_Y0_2 2 1 2 71.47 -30.27 0.93 5.13 24.41 2.52 0.01 -BGO_Y0_2 2 1 1 81.68 -30.27 0.95 2.68 22.48 2.72 0.00 -BGO_Y0_2 2 1 0 91.89 -30.27 0.94 3.66 24.44 2.44 0.03 -BGO_Y0_2 3 1 18 -91.89 -20.18 0.99 4.33 24.41 2.65 0.00 -BGO_Y0_2 3 1 17 -81.68 -20.18 1.00 3.76 22.12 2.71 0.00 -BGO_Y0_2 3 1 16 -71.47 -20.18 0.99 4.70 29.19 2.44 0.00 -BGO_Y0_2 3 1 15 -61.26 -20.18 1.00 2.01 22.86 2.73 0.00 -BGO_Y0_2 3 1 14 -51.05 -20.18 0.98 5.03 22.59 2.69 0.00 -BGO_Y0_2 3 1 13 -40.84 -20.18 1.00 1.97 22.46 2.78 0.00 -BGO_Y0_2 3 1 12 -30.63 -20.18 1.00 2.15 24.79 2.70 0.00 -BGO_Y0_2 3 1 11 -20.42 -20.18 0.99 4.65 31.31 1.87 0.09 -BGO_Y0_2 3 1 10 -10.21 -20.18 1.00 3.88 23.92 2.82 0.00 -BGO_Y0_2 3 1 9 0.00 -20.18 1.00 3.31 18.53 2.91 0.00 -BGO_Y0_2 3 1 8 10.21 -20.18 1.01 3.51 18.40 2.79 0.00 -BGO_Y0_2 3 1 7 20.42 -20.18 1.02 2.90 20.89 2.67 0.03 -BGO_Y0_2 3 1 6 30.63 -20.18 1.03 1.88 23.07 2.81 0.00 -BGO_Y0_2 3 1 5 40.84 -20.18 1.02 3.40 17.98 3.11 0.00 -BGO_Y0_2 3 1 4 51.05 -20.18 1.03 2.79 34.62 0.38 0.11 -BGO_Y0_2 3 1 3 61.26 -20.18 1.00 4.96 23.84 2.34 0.08 -BGO_Y0_2 3 1 2 71.47 -20.18 1.01 2.47 20.72 3.05 0.00 -BGO_Y0_2 3 1 1 81.68 -20.18 0.97 -1.32 32.19 0.99 0.11 -BGO_Y0_2 3 1 0 91.89 -20.18 0.93 1.85 25.14 2.15 0.06 -BGO_Y0_2 4 1 18 -91.89 -10.09 0.99 2.78 21.91 2.68 0.00 -BGO_Y0_2 4 1 17 -81.68 -10.09 0.99 6.11 29.83 1.12 0.11 -BGO_Y0_2 4 1 16 -71.47 -10.09 0.99 4.93 22.84 2.74 0.00 -BGO_Y0_2 4 1 15 -61.26 -10.09 1.00 1.01 21.75 2.66 0.00 -BGO_Y0_2 4 1 14 -51.05 -10.09 1.00 2.72 22.60 2.58 0.02 -BGO_Y0_2 4 1 13 -40.84 -10.09 0.99 3.64 30.28 1.61 0.08 -BGO_Y0_2 4 1 12 -30.63 -10.09 1.00 2.04 23.27 2.48 0.05 -BGO_Y0_2 4 1 11 -20.42 -10.09 0.99 4.58 21.72 2.75 0.00 -BGO_Y0_2 4 1 10 -10.21 -10.09 1.00 2.47 26.71 2.27 0.06 -BGO_Y0_2 4 1 9 0.00 -10.09 1.00 3.17 23.21 2.71 0.00 -BGO_Y0_2 4 1 8 10.21 -10.09 1.01 4.67 18.52 3.04 0.00 -BGO_Y0_2 4 1 7 20.42 -10.09 1.02 3.11 28.39 2.34 0.06 -BGO_Y0_2 4 1 6 30.63 -10.09 1.04 2.89 18.60 3.16 0.00 -BGO_Y0_2 4 1 5 40.84 -10.09 1.04 2.83 17.92 3.21 0.00 -BGO_Y0_2 4 1 4 51.05 -10.09 1.06 1.98 20.50 3.18 0.00 -BGO_Y0_2 4 1 3 61.26 -10.09 1.07 4.15 25.16 2.56 0.10 -BGO_Y0_2 4 1 2 71.47 -10.09 1.10 2.31 20.44 3.51 0.05 -BGO_Y0_2 4 1 1 81.68 -10.09 1.09 3.85 30.96 1.89 0.18 -BGO_Y0_2 4 1 0 91.89 -10.09 1.02 2.62 10.00 4.93 0.20 -BGO_Y0_2 5 1 18 -91.89 0.00 0.99 4.35 21.14 2.77 0.00 -BGO_Y0_2 5 1 17 -81.68 0.00 1.00 1.80 25.30 2.45 0.00 -BGO_Y0_2 5 1 16 -71.47 0.00 1.00 1.84 18.78 2.75 0.00 -BGO_Y0_2 5 1 15 -61.26 0.00 1.00 3.90 26.14 2.47 0.00 -BGO_Y0_2 5 1 14 -51.05 0.00 0.99 4.16 26.01 2.61 0.00 -BGO_Y0_2 5 1 13 -40.84 0.00 1.00 2.74 28.52 2.51 0.00 -BGO_Y0_2 5 1 12 -30.63 0.00 0.99 4.05 26.50 2.03 0.06 -BGO_Y0_2 5 1 11 -20.42 0.00 1.00 2.54 22.44 2.57 0.00 -BGO_Y0_2 5 1 10 -10.21 0.00 1.01 0.71 17.82 2.65 0.00 -BGO_Y0_2 5 1 9 0.00 0.00 1.00 3.25 22.74 2.87 0.00 -BGO_Y0_2 5 1 8 10.21 0.00 1.00 4.80 25.32 2.78 0.00 -BGO_Y0_2 5 1 7 20.42 0.00 1.02 5.08 21.37 2.60 0.05 -BGO_Y0_2 5 1 6 30.63 0.00 1.04 2.06 26.46 2.77 0.00 -BGO_Y0_2 5 1 5 40.84 0.00 1.06 3.28 20.28 3.08 0.00 -BGO_Y0_2 5 1 4 51.05 0.00 1.07 3.07 23.22 2.05 0.13 -BGO_Y0_2 5 1 3 61.26 0.00 1.10 3.52 19.21 3.35 0.07 -BGO_Y0_2 5 1 2 71.47 0.00 1.14 5.64 20.87 3.17 0.13 -BGO_Y0_2 5 1 1 81.68 0.00 1.27 -3.41 39.66 0.00 0.25 -BGO_Y0_2 5 1 0 91.89 0.00 1.24 -1.47 26.25 0.00 0.49 -BGO_Y0_2 6 1 18 -91.89 10.09 0.99 2.78 21.91 2.68 0.00 -BGO_Y0_2 6 1 17 -81.68 10.09 0.99 6.11 29.83 1.12 0.11 -BGO_Y0_2 6 1 16 -71.47 10.09 0.99 4.93 22.84 2.74 0.00 -BGO_Y0_2 6 1 15 -61.26 10.09 1.00 1.01 21.75 2.66 0.00 -BGO_Y0_2 6 1 14 -51.05 10.09 1.00 2.72 22.60 2.58 0.02 -BGO_Y0_2 6 1 13 -40.84 10.09 0.99 3.64 30.28 1.61 0.08 -BGO_Y0_2 6 1 12 -30.63 10.09 1.00 2.04 23.27 2.48 0.05 -BGO_Y0_2 6 1 11 -20.42 10.09 0.99 4.58 21.72 2.75 0.00 -BGO_Y0_2 6 1 10 -10.21 10.09 1.00 2.47 26.71 2.27 0.06 -BGO_Y0_2 6 1 9 0.00 10.09 1.00 3.17 23.21 2.71 0.00 -BGO_Y0_2 6 1 8 10.21 10.09 1.01 4.67 18.52 3.04 0.00 -BGO_Y0_2 6 1 7 20.42 10.09 1.02 3.11 28.39 2.34 0.06 -BGO_Y0_2 6 1 6 30.63 10.09 1.04 2.89 18.60 3.16 0.00 -BGO_Y0_2 6 1 5 40.84 10.09 1.04 2.83 17.92 3.21 0.00 -BGO_Y0_2 6 1 4 51.05 10.09 1.06 1.98 20.50 3.18 0.00 -BGO_Y0_2 6 1 3 61.26 10.09 1.07 4.15 25.16 2.56 0.10 -BGO_Y0_2 6 1 2 71.47 10.09 1.10 2.31 20.44 3.51 0.05 -BGO_Y0_2 6 1 1 81.68 10.09 1.09 3.85 30.96 1.89 0.18 -BGO_Y0_2 6 1 0 91.89 10.09 1.02 2.62 10.00 4.93 0.20 -BGO_Y0_2 7 1 18 -91.89 20.18 0.99 4.33 24.41 2.65 0.00 -BGO_Y0_2 7 1 17 -81.68 20.18 1.00 3.76 22.12 2.71 0.00 -BGO_Y0_2 7 1 16 -71.47 20.18 0.99 4.70 29.19 2.44 0.00 -BGO_Y0_2 7 1 15 -61.26 20.18 1.00 2.01 22.86 2.73 0.00 -BGO_Y0_2 7 1 14 -51.05 20.18 0.98 5.03 22.59 2.69 0.00 -BGO_Y0_2 7 1 13 -40.84 20.18 1.00 1.97 22.46 2.78 0.00 -BGO_Y0_2 7 1 12 -30.63 20.18 1.00 2.15 24.79 2.70 0.00 -BGO_Y0_2 7 1 11 -20.42 20.18 0.99 4.65 31.31 1.87 0.09 -BGO_Y0_2 7 1 10 -10.21 20.18 1.00 3.88 23.92 2.82 0.00 -BGO_Y0_2 7 1 9 0.00 20.18 1.00 3.31 18.53 2.91 0.00 -BGO_Y0_2 7 1 8 10.21 20.18 1.01 3.51 18.40 2.79 0.00 -BGO_Y0_2 7 1 7 20.42 20.18 1.02 2.90 20.89 2.67 0.03 -BGO_Y0_2 7 1 6 30.63 20.18 1.03 1.88 23.07 2.81 0.00 -BGO_Y0_2 7 1 5 40.84 20.18 1.02 3.40 17.98 3.11 0.00 -BGO_Y0_2 7 1 4 51.05 20.18 1.03 2.79 34.62 0.38 0.11 -BGO_Y0_2 7 1 3 61.26 20.18 1.00 4.96 23.84 2.34 0.08 -BGO_Y0_2 7 1 2 71.47 20.18 1.01 2.47 20.72 3.05 0.00 -BGO_Y0_2 7 1 1 81.68 20.18 0.97 -1.32 32.19 0.99 0.11 -BGO_Y0_2 7 1 0 91.89 20.18 0.93 1.85 25.14 2.15 0.06 -BGO_Y0_2 8 1 18 -91.89 30.27 1.00 3.57 22.94 2.65 0.00 -BGO_Y0_2 8 1 17 -81.68 30.27 1.01 2.47 27.87 2.15 0.07 -BGO_Y0_2 8 1 16 -71.47 30.27 1.01 0.39 28.55 1.38 0.10 -BGO_Y0_2 8 1 15 -61.26 30.27 0.99 4.32 19.93 2.75 0.00 -BGO_Y0_2 8 1 14 -51.05 30.27 0.99 4.40 16.85 2.89 0.00 -BGO_Y0_2 8 1 13 -40.84 30.27 1.01 1.70 26.41 2.15 0.07 -BGO_Y0_2 8 1 12 -30.63 30.27 0.99 4.11 24.51 2.57 0.00 -BGO_Y0_2 8 1 11 -20.42 30.27 0.98 7.13 19.56 2.83 0.00 -BGO_Y0_2 8 1 10 -10.21 30.27 1.01 0.83 17.65 2.80 0.00 -BGO_Y0_2 8 1 9 0.00 30.27 1.00 2.63 22.11 2.55 0.00 -BGO_Y0_2 8 1 8 10.21 30.27 0.99 2.92 25.87 2.57 0.01 -BGO_Y0_2 8 1 7 20.42 30.27 0.99 3.77 21.29 2.75 0.00 -BGO_Y0_2 8 1 6 30.63 30.27 1.00 2.82 22.83 2.55 0.05 -BGO_Y0_2 8 1 5 40.84 30.27 0.99 3.04 22.71 2.64 0.00 -BGO_Y0_2 8 1 4 51.05 30.27 0.99 1.64 20.32 2.80 0.00 -BGO_Y0_2 8 1 3 61.26 30.27 0.98 0.39 21.75 2.68 0.00 -BGO_Y0_2 8 1 2 71.47 30.27 0.93 5.13 24.41 2.52 0.01 -BGO_Y0_2 8 1 1 81.68 30.27 0.95 2.68 22.48 2.72 0.00 -BGO_Y0_2 8 1 0 91.89 30.27 0.94 3.66 24.44 2.44 0.03 -BGO_Y0_2 9 1 18 -91.89 40.36 0.99 5.41 27.85 2.00 0.08 -BGO_Y0_2 9 1 17 -81.68 40.36 1.00 2.38 22.41 2.74 0.00 -BGO_Y0_2 9 1 16 -71.47 40.36 1.01 1.00 21.95 2.66 0.00 -BGO_Y0_2 9 1 15 -61.26 40.36 0.97 6.88 33.51 0.00 0.12 -BGO_Y0_2 9 1 14 -51.05 40.36 0.98 5.51 20.94 2.71 0.00 -BGO_Y0_2 9 1 13 -40.84 40.36 0.99 5.39 21.18 2.40 0.06 -BGO_Y0_2 9 1 12 -30.63 40.36 1.00 3.77 20.83 2.73 0.00 -BGO_Y0_2 9 1 11 -20.42 40.36 1.00 3.49 18.44 2.81 0.00 -BGO_Y0_2 9 1 10 -10.21 40.36 1.00 1.43 27.05 2.60 0.00 -BGO_Y0_2 9 1 9 0.00 40.36 0.99 2.28 27.94 2.23 0.06 -BGO_Y0_2 9 1 8 10.21 40.36 0.99 4.03 23.87 2.73 0.00 -BGO_Y0_2 9 1 7 20.42 40.36 0.97 3.26 23.35 2.76 0.00 -BGO_Y0_2 9 1 6 30.63 40.36 0.96 4.53 25.93 2.57 0.00 -BGO_Y0_2 9 1 5 40.84 40.36 0.98 1.27 21.98 2.76 0.00 -BGO_Y0_2 9 1 4 51.05 40.36 0.96 3.29 18.75 2.85 0.00 -BGO_Y0_2 9 1 3 61.26 40.36 0.96 0.72 22.58 2.69 0.00 -BGO_Y0_2 9 1 2 71.47 40.36 0.95 2.52 27.56 2.35 0.04 -BGO_Y0_2 9 1 1 81.68 40.36 0.95 1.51 26.31 2.17 0.05 -BGO_Y0_2 9 1 0 91.89 40.36 0.94 3.94 26.12 2.24 0.07 -BGO_Y0_2 10 1 18 -91.89 50.45 0.99 3.65 22.26 2.73 0.00 -BGO_Y0_2 10 1 17 -81.68 50.45 1.02 0.98 20.34 2.83 0.00 -BGO_Y0_2 10 1 16 -71.47 50.45 1.02 0.46 23.55 2.77 0.00 -BGO_Y0_2 10 1 15 -61.26 50.45 1.00 4.44 23.98 2.18 0.09 -BGO_Y0_2 10 1 14 -51.05 50.45 1.01 2.61 18.26 2.96 0.00 -BGO_Y0_2 10 1 13 -40.84 50.45 0.99 5.24 28.92 2.00 0.07 -BGO_Y0_2 10 1 12 -30.63 50.45 1.01 1.17 15.49 2.89 0.00 -BGO_Y0_2 10 1 11 -20.42 50.45 1.01 2.64 25.85 2.38 0.05 -BGO_Y0_2 10 1 10 -10.21 50.45 1.00 2.56 21.01 2.68 0.00 -BGO_Y0_2 10 1 9 0.00 50.45 0.99 2.33 20.91 2.76 0.00 -BGO_Y0_2 10 1 8 10.21 50.45 0.99 1.85 27.44 1.71 0.08 -BGO_Y0_2 10 1 7 20.42 50.45 0.99 1.68 26.18 2.11 0.06 -BGO_Y0_2 10 1 6 30.63 50.45 0.96 3.70 19.20 2.76 0.00 -BGO_Y0_2 10 1 5 40.84 50.45 0.95 2.46 21.18 2.74 0.00 -BGO_Y0_2 10 1 4 51.05 50.45 0.94 3.44 21.19 2.83 0.00 -BGO_Y0_2 10 1 3 61.26 50.45 0.93 3.49 23.34 2.59 0.03 -BGO_Y0_2 10 1 2 71.47 50.45 0.94 3.83 19.84 2.71 0.01 -BGO_Y0_2 10 1 1 81.68 50.45 0.95 3.08 23.05 2.72 0.00 -BGO_Y0_2 10 1 0 91.89 50.45 0.93 5.51 21.93 2.71 0.00 -BGO_Z0_0 19 0 0 -94.05 -35.28 0.98 4.41 21.62 2.74 0.00 -BGO_Z0_0 18 0 0 -84.15 -35.28 1.01 1.19 16.43 2.77 0.00 -BGO_Z0_0 17 0 0 -74.25 -35.28 0.98 4.43 20.26 2.51 0.00 -BGO_Z0_0 16 0 0 -64.35 -35.28 0.99 3.96 18.17 2.68 0.00 -BGO_Z0_0 15 0 0 -54.45 -35.28 0.99 5.33 19.00 2.60 0.00 -BGO_Z0_0 14 0 0 -44.55 -35.28 1.00 2.76 22.65 2.47 0.00 -BGO_Z0_0 13 0 0 -34.65 -35.28 1.00 3.45 23.31 2.50 0.00 -BGO_Z0_0 12 0 0 -24.75 -35.28 0.98 4.97 16.41 2.78 0.00 -BGO_Z0_0 11 0 0 -14.85 -35.28 0.99 4.62 23.09 2.51 0.00 -BGO_Z0_0 10 0 0 -4.95 -35.28 0.99 5.46 23.32 2.55 0.00 -BGO_Z0_0 9 0 0 4.95 -35.28 1.00 2.32 24.12 2.52 0.00 -BGO_Z0_0 8 0 0 14.85 -35.28 1.01 0.87 24.30 2.56 0.00 -BGO_Z0_0 7 0 0 24.75 -35.28 1.02 -1.81 23.93 2.51 0.00 -BGO_Z0_0 6 0 0 34.65 -35.28 0.96 6.84 16.29 2.64 0.00 -BGO_Z0_0 5 0 0 44.55 -35.28 0.96 5.23 26.06 2.30 0.00 -BGO_Z0_0 4 0 0 54.45 -35.28 0.96 2.82 22.57 2.54 0.00 -BGO_Z0_0 3 0 0 64.35 -35.28 0.94 3.64 21.47 2.52 0.00 -BGO_Z0_0 2 0 0 74.25 -35.28 0.94 1.65 21.95 2.56 0.00 -BGO_Z0_0 1 0 0 84.15 -35.28 0.94 2.06 21.29 2.56 0.00 -BGO_Z0_0 0 0 0 94.05 -35.28 0.95 1.42 23.39 2.49 0.00 -BGO_Z0_0 19 1 0 -94.05 -25.20 0.99 3.61 25.98 2.45 0.00 -BGO_Z0_0 18 1 0 -84.15 -25.20 0.99 4.17 23.11 2.54 0.00 -BGO_Z0_0 17 1 0 -74.25 -25.20 0.99 3.90 27.64 2.11 0.05 -BGO_Z0_0 16 1 0 -64.35 -25.20 1.00 2.57 25.38 2.55 0.00 -BGO_Z0_0 15 1 0 -54.45 -25.20 0.99 3.83 25.22 2.36 0.03 -BGO_Z0_0 14 1 0 -44.55 -25.20 1.00 3.23 20.90 2.52 0.03 -BGO_Z0_0 13 1 0 -34.65 -25.20 1.01 1.01 19.86 2.67 0.00 -BGO_Z0_0 12 1 0 -24.75 -25.20 1.01 1.37 24.58 2.41 0.03 -BGO_Z0_0 11 1 0 -14.85 -25.20 1.00 3.13 19.41 2.65 0.00 -BGO_Z0_0 10 1 0 -4.95 -25.20 1.00 2.54 21.91 2.52 0.00 -BGO_Z0_0 9 1 0 4.95 -25.20 0.99 4.31 25.32 2.19 0.04 -BGO_Z0_0 8 1 0 14.85 -25.20 1.00 3.25 17.78 2.66 0.00 -BGO_Z0_0 7 1 0 24.75 -25.20 1.00 3.07 21.36 2.53 0.00 -BGO_Z0_0 6 1 0 34.65 -25.20 0.98 4.47 23.05 2.52 0.00 -BGO_Z0_0 5 1 0 44.55 -25.20 0.98 5.03 25.12 2.45 0.00 -BGO_Z0_0 4 1 0 54.45 -25.20 0.98 4.66 19.86 2.64 0.00 -BGO_Z0_0 3 1 0 64.35 -25.20 0.98 2.09 20.98 2.69 0.00 -BGO_Z0_0 2 1 0 74.25 -25.20 0.95 3.62 20.30 2.66 0.00 -BGO_Z0_0 1 1 0 84.15 -25.20 0.93 3.32 18.86 2.70 0.00 -BGO_Z0_0 0 1 0 94.05 -25.20 0.94 1.87 22.93 2.53 0.00 -BGO_Z0_0 19 2 0 -94.05 -15.12 1.00 2.80 23.43 2.48 0.00 -BGO_Z0_0 18 2 0 -84.15 -15.12 1.00 3.35 19.86 2.72 0.00 -BGO_Z0_0 17 2 0 -74.25 -15.12 0.99 3.20 23.32 2.45 0.00 -BGO_Z0_0 16 2 0 -64.35 -15.12 1.01 2.20 22.40 2.51 0.00 -BGO_Z0_0 15 2 0 -54.45 -15.12 1.01 1.77 22.55 2.61 0.00 -BGO_Z0_0 14 2 0 -44.55 -15.12 0.98 5.13 19.80 2.69 0.00 -BGO_Z0_0 13 2 0 -34.65 -15.12 1.00 2.44 21.67 2.61 0.00 -BGO_Z0_0 12 2 0 -24.75 -15.12 0.99 3.42 22.03 2.64 0.01 -BGO_Z0_0 11 2 0 -14.85 -15.12 1.00 4.57 21.09 2.62 0.00 -BGO_Z0_0 10 2 0 -4.95 -15.12 1.00 2.51 18.78 2.64 0.00 -BGO_Z0_0 9 2 0 4.95 -15.12 1.01 0.94 21.58 2.57 0.00 -BGO_Z0_0 8 2 0 14.85 -15.12 1.01 1.15 22.33 2.47 0.00 -BGO_Z0_0 7 2 0 24.75 -15.12 1.00 3.00 27.74 1.98 0.05 -BGO_Z0_0 6 2 0 34.65 -15.12 1.00 3.54 23.01 2.51 0.00 -BGO_Z0_0 5 2 0 44.55 -15.12 1.00 4.55 21.57 2.60 0.00 -BGO_Z0_0 4 2 0 54.45 -15.12 1.00 4.16 24.26 2.66 0.00 -BGO_Z0_0 3 2 0 64.35 -15.12 1.02 3.44 18.65 2.87 0.00 -BGO_Z0_0 2 2 0 74.25 -15.12 1.01 3.56 16.91 3.17 0.00 -BGO_Z0_0 1 2 0 84.15 -15.12 0.98 4.03 24.38 2.32 0.08 -BGO_Z0_0 0 2 0 94.05 -15.12 0.93 3.75 19.71 2.90 0.00 -BGO_Z0_0 19 3 0 -94.05 -5.04 1.00 3.32 20.78 2.63 0.00 -BGO_Z0_0 18 3 0 -84.15 -5.04 0.99 3.36 24.76 2.38 0.00 -BGO_Z0_0 17 3 0 -74.25 -5.04 1.00 1.63 21.76 2.64 0.00 -BGO_Z0_0 16 3 0 -64.35 -5.04 0.99 2.43 21.42 2.54 0.00 -BGO_Z0_0 15 3 0 -54.45 -5.04 1.00 2.24 22.55 2.42 0.02 -BGO_Z0_0 14 3 0 -44.55 -5.04 0.99 4.31 19.83 2.47 0.00 -BGO_Z0_0 13 3 0 -34.65 -5.04 1.00 3.25 26.72 2.12 0.04 -BGO_Z0_0 12 3 0 -24.75 -5.04 1.00 3.04 27.29 2.31 0.00 -BGO_Z0_0 11 3 0 -14.85 -5.04 0.99 3.68 25.40 2.26 0.05 -BGO_Z0_0 10 3 0 -4.95 -5.04 1.00 4.08 22.65 2.46 0.00 -BGO_Z0_0 9 3 0 4.95 -5.04 1.00 3.70 20.39 2.66 0.00 -BGO_Z0_0 8 3 0 14.85 -5.04 0.99 5.13 25.39 2.35 0.00 -BGO_Z0_0 7 3 0 24.75 -5.04 1.01 2.23 20.36 2.65 0.00 -BGO_Z0_0 6 3 0 34.65 -5.04 1.00 4.09 20.75 2.65 0.00 -BGO_Z0_0 5 3 0 44.55 -5.04 1.01 4.62 20.82 2.49 0.04 -BGO_Z0_0 4 3 0 54.45 -5.04 1.02 5.36 24.69 2.38 0.06 -BGO_Z0_0 3 3 0 64.35 -5.04 1.05 3.50 20.50 2.86 0.00 -BGO_Z0_0 2 3 0 74.25 -5.04 1.08 3.79 22.46 2.75 0.09 -BGO_Z0_0 1 3 0 84.15 -5.04 1.12 5.01 20.86 3.31 0.09 -BGO_Z0_0 0 3 0 94.05 -5.04 1.13 -0.63 18.91 3.18 0.33 -BGO_Z0_0 19 4 0 -94.05 5.04 1.00 3.32 20.78 2.63 0.00 -BGO_Z0_0 18 4 0 -84.15 5.04 0.99 3.36 24.76 2.38 0.00 -BGO_Z0_0 17 4 0 -74.25 5.04 1.00 1.63 21.76 2.64 0.00 -BGO_Z0_0 16 4 0 -64.35 5.04 0.99 2.43 21.42 2.54 0.00 -BGO_Z0_0 15 4 0 -54.45 5.04 1.00 2.24 22.55 2.42 0.02 -BGO_Z0_0 14 4 0 -44.55 5.04 0.99 4.31 19.83 2.47 0.00 -BGO_Z0_0 13 4 0 -34.65 5.04 1.00 3.25 26.72 2.12 0.04 -BGO_Z0_0 12 4 0 -24.75 5.04 1.00 3.04 27.29 2.31 0.00 -BGO_Z0_0 11 4 0 -14.85 5.04 0.99 3.68 25.40 2.26 0.05 -BGO_Z0_0 10 4 0 -4.95 5.04 1.00 4.08 22.65 2.46 0.00 -BGO_Z0_0 9 4 0 4.95 5.04 1.00 3.70 20.39 2.66 0.00 -BGO_Z0_0 8 4 0 14.85 5.04 0.99 5.13 25.39 2.35 0.00 -BGO_Z0_0 7 4 0 24.75 5.04 1.01 2.23 20.36 2.65 0.00 -BGO_Z0_0 6 4 0 34.65 5.04 1.00 4.09 20.75 2.65 0.00 -BGO_Z0_0 5 4 0 44.55 5.04 1.01 4.62 20.82 2.49 0.04 -BGO_Z0_0 4 4 0 54.45 5.04 1.02 5.36 24.69 2.38 0.06 -BGO_Z0_0 3 4 0 64.35 5.04 1.05 3.50 20.50 2.86 0.00 -BGO_Z0_0 2 4 0 74.25 5.04 1.08 3.79 22.46 2.75 0.09 -BGO_Z0_0 1 4 0 84.15 5.04 1.12 5.01 20.86 3.31 0.09 -BGO_Z0_0 0 4 0 94.05 5.04 1.13 -0.63 18.91 3.18 0.33 -BGO_Z0_0 19 5 0 -94.05 15.12 1.00 2.80 23.43 2.48 0.00 -BGO_Z0_0 18 5 0 -84.15 15.12 1.00 3.35 19.86 2.72 0.00 -BGO_Z0_0 17 5 0 -74.25 15.12 0.99 3.20 23.32 2.45 0.00 -BGO_Z0_0 16 5 0 -64.35 15.12 1.01 2.20 22.40 2.51 0.00 -BGO_Z0_0 15 5 0 -54.45 15.12 1.01 1.77 22.55 2.61 0.00 -BGO_Z0_0 14 5 0 -44.55 15.12 0.98 5.13 19.80 2.69 0.00 -BGO_Z0_0 13 5 0 -34.65 15.12 1.00 2.44 21.67 2.61 0.00 -BGO_Z0_0 12 5 0 -24.75 15.12 0.99 3.42 22.03 2.64 0.01 -BGO_Z0_0 11 5 0 -14.85 15.12 1.00 4.57 21.09 2.62 0.00 -BGO_Z0_0 10 5 0 -4.95 15.12 1.00 2.51 18.78 2.64 0.00 -BGO_Z0_0 9 5 0 4.95 15.12 1.01 0.94 21.58 2.57 0.00 -BGO_Z0_0 8 5 0 14.85 15.12 1.01 1.15 22.33 2.47 0.00 -BGO_Z0_0 7 5 0 24.75 15.12 1.00 3.00 27.74 1.98 0.05 -BGO_Z0_0 6 5 0 34.65 15.12 1.00 3.54 23.01 2.51 0.00 -BGO_Z0_0 5 5 0 44.55 15.12 1.00 4.55 21.57 2.60 0.00 -BGO_Z0_0 4 5 0 54.45 15.12 1.00 4.16 24.26 2.66 0.00 -BGO_Z0_0 3 5 0 64.35 15.12 1.02 3.44 18.65 2.87 0.00 -BGO_Z0_0 2 5 0 74.25 15.12 1.01 3.56 16.91 3.17 0.00 -BGO_Z0_0 1 5 0 84.15 15.12 0.98 4.03 24.38 2.32 0.08 -BGO_Z0_0 0 5 0 94.05 15.12 0.93 3.75 19.71 2.90 0.00 -BGO_Z0_0 19 6 0 -94.05 25.20 0.99 3.61 25.98 2.45 0.00 -BGO_Z0_0 18 6 0 -84.15 25.20 0.99 4.17 23.11 2.54 0.00 -BGO_Z0_0 17 6 0 -74.25 25.20 0.99 3.90 27.64 2.11 0.05 -BGO_Z0_0 16 6 0 -64.35 25.20 1.00 2.57 25.38 2.55 0.00 -BGO_Z0_0 15 6 0 -54.45 25.20 0.99 3.83 25.22 2.36 0.03 -BGO_Z0_0 14 6 0 -44.55 25.20 1.00 3.23 20.90 2.52 0.03 -BGO_Z0_0 13 6 0 -34.65 25.20 1.01 1.01 19.86 2.67 0.00 -BGO_Z0_0 12 6 0 -24.75 25.20 1.01 1.37 24.58 2.41 0.03 -BGO_Z0_0 11 6 0 -14.85 25.20 1.00 3.13 19.41 2.65 0.00 -BGO_Z0_0 10 6 0 -4.95 25.20 1.00 2.54 21.91 2.52 0.00 -BGO_Z0_0 9 6 0 4.95 25.20 0.99 4.31 25.32 2.19 0.04 -BGO_Z0_0 8 6 0 14.85 25.20 1.00 3.25 17.78 2.66 0.00 -BGO_Z0_0 7 6 0 24.75 25.20 1.00 3.07 21.36 2.53 0.00 -BGO_Z0_0 6 6 0 34.65 25.20 0.98 4.47 23.05 2.52 0.00 -BGO_Z0_0 5 6 0 44.55 25.20 0.98 5.03 25.12 2.45 0.00 -BGO_Z0_0 4 6 0 54.45 25.20 0.98 4.66 19.86 2.64 0.00 -BGO_Z0_0 3 6 0 64.35 25.20 0.98 2.09 20.98 2.69 0.00 -BGO_Z0_0 2 6 0 74.25 25.20 0.95 3.62 20.30 2.66 0.00 -BGO_Z0_0 1 6 0 84.15 25.20 0.93 3.32 18.86 2.70 0.00 -BGO_Z0_0 0 6 0 94.05 25.20 0.94 1.87 22.93 2.53 0.00 -BGO_Z0_0 19 7 0 -94.05 35.28 0.98 4.41 21.62 2.74 0.00 -BGO_Z0_0 18 7 0 -84.15 35.28 1.01 1.19 16.43 2.77 0.00 -BGO_Z0_0 17 7 0 -74.25 35.28 0.98 4.43 20.26 2.51 0.00 -BGO_Z0_0 16 7 0 -64.35 35.28 0.99 3.96 18.17 2.68 0.00 -BGO_Z0_0 15 7 0 -54.45 35.28 0.99 5.33 19.00 2.60 0.00 -BGO_Z0_0 14 7 0 -44.55 35.28 1.00 2.76 22.65 2.47 0.00 -BGO_Z0_0 13 7 0 -34.65 35.28 1.00 3.45 23.31 2.50 0.00 -BGO_Z0_0 12 7 0 -24.75 35.28 0.98 4.97 16.41 2.78 0.00 -BGO_Z0_0 11 7 0 -14.85 35.28 0.99 4.62 23.09 2.51 0.00 -BGO_Z0_0 10 7 0 -4.95 35.28 0.99 5.46 23.32 2.55 0.00 -BGO_Z0_0 9 7 0 4.95 35.28 1.00 2.32 24.12 2.52 0.00 -BGO_Z0_0 8 7 0 14.85 35.28 1.01 0.87 24.30 2.56 0.00 -BGO_Z0_0 7 7 0 24.75 35.28 1.02 -1.81 23.93 2.51 0.00 -BGO_Z0_0 6 7 0 34.65 35.28 0.96 6.84 16.29 2.64 0.00 -BGO_Z0_0 5 7 0 44.55 35.28 0.96 5.23 26.06 2.30 0.00 -BGO_Z0_0 4 7 0 54.45 35.28 0.96 2.82 22.57 2.54 0.00 -BGO_Z0_0 3 7 0 64.35 35.28 0.94 3.64 21.47 2.52 0.00 -BGO_Z0_0 2 7 0 74.25 35.28 0.94 1.65 21.95 2.56 0.00 -BGO_Z0_0 1 7 0 84.15 35.28 0.94 2.06 21.29 2.56 0.00 -BGO_Z0_0 0 7 0 94.05 35.28 0.95 1.42 23.39 2.49 0.00 -BGO_Z0_0 19 0 1 -94.05 -35.28 0.98 4.41 21.62 2.74 0.00 -BGO_Z0_0 18 0 1 -84.15 -35.28 1.01 1.19 16.43 2.77 0.00 -BGO_Z0_0 17 0 1 -74.25 -35.28 0.98 4.43 20.26 2.51 0.00 -BGO_Z0_0 16 0 1 -64.35 -35.28 0.99 3.96 18.17 2.68 0.00 -BGO_Z0_0 15 0 1 -54.45 -35.28 0.99 5.33 19.00 2.60 0.00 -BGO_Z0_0 14 0 1 -44.55 -35.28 1.00 2.76 22.65 2.47 0.00 -BGO_Z0_0 13 0 1 -34.65 -35.28 1.00 3.45 23.31 2.50 0.00 -BGO_Z0_0 12 0 1 -24.75 -35.28 0.98 4.97 16.41 2.78 0.00 -BGO_Z0_0 11 0 1 -14.85 -35.28 0.99 4.62 23.09 2.51 0.00 -BGO_Z0_0 10 0 1 -4.95 -35.28 0.99 5.46 23.32 2.55 0.00 -BGO_Z0_0 9 0 1 4.95 -35.28 1.00 2.32 24.12 2.52 0.00 -BGO_Z0_0 8 0 1 14.85 -35.28 1.01 0.87 24.30 2.56 0.00 -BGO_Z0_0 7 0 1 24.75 -35.28 1.02 -1.81 23.93 2.51 0.00 -BGO_Z0_0 6 0 1 34.65 -35.28 0.96 6.84 16.29 2.64 0.00 -BGO_Z0_0 5 0 1 44.55 -35.28 0.96 5.23 26.06 2.30 0.00 -BGO_Z0_0 4 0 1 54.45 -35.28 0.96 2.82 22.57 2.54 0.00 -BGO_Z0_0 3 0 1 64.35 -35.28 0.94 3.64 21.47 2.52 0.00 -BGO_Z0_0 2 0 1 74.25 -35.28 0.94 1.65 21.95 2.56 0.00 -BGO_Z0_0 1 0 1 84.15 -35.28 0.94 2.06 21.29 2.56 0.00 -BGO_Z0_0 0 0 1 94.05 -35.28 0.95 1.42 23.39 2.49 0.00 -BGO_Z0_0 19 1 1 -94.05 -25.20 0.99 3.61 25.98 2.45 0.00 -BGO_Z0_0 18 1 1 -84.15 -25.20 0.99 4.17 23.11 2.54 0.00 -BGO_Z0_0 17 1 1 -74.25 -25.20 0.99 3.90 27.64 2.11 0.05 -BGO_Z0_0 16 1 1 -64.35 -25.20 1.00 2.57 25.38 2.55 0.00 -BGO_Z0_0 15 1 1 -54.45 -25.20 0.99 3.83 25.22 2.36 0.03 -BGO_Z0_0 14 1 1 -44.55 -25.20 1.00 3.23 20.90 2.52 0.03 -BGO_Z0_0 13 1 1 -34.65 -25.20 1.01 1.01 19.86 2.67 0.00 -BGO_Z0_0 12 1 1 -24.75 -25.20 1.01 1.37 24.58 2.41 0.03 -BGO_Z0_0 11 1 1 -14.85 -25.20 1.00 3.13 19.41 2.65 0.00 -BGO_Z0_0 10 1 1 -4.95 -25.20 1.00 2.54 21.91 2.52 0.00 -BGO_Z0_0 9 1 1 4.95 -25.20 0.99 4.31 25.32 2.19 0.04 -BGO_Z0_0 8 1 1 14.85 -25.20 1.00 3.25 17.78 2.66 0.00 -BGO_Z0_0 7 1 1 24.75 -25.20 1.00 3.07 21.36 2.53 0.00 -BGO_Z0_0 6 1 1 34.65 -25.20 0.98 4.47 23.05 2.52 0.00 -BGO_Z0_0 5 1 1 44.55 -25.20 0.98 5.03 25.12 2.45 0.00 -BGO_Z0_0 4 1 1 54.45 -25.20 0.98 4.66 19.86 2.64 0.00 -BGO_Z0_0 3 1 1 64.35 -25.20 0.98 2.09 20.98 2.69 0.00 -BGO_Z0_0 2 1 1 74.25 -25.20 0.95 3.62 20.30 2.66 0.00 -BGO_Z0_0 1 1 1 84.15 -25.20 0.93 3.32 18.86 2.70 0.00 -BGO_Z0_0 0 1 1 94.05 -25.20 0.94 1.87 22.93 2.53 0.00 -BGO_Z0_0 19 2 1 -94.05 -15.12 1.00 2.80 23.43 2.48 0.00 -BGO_Z0_0 18 2 1 -84.15 -15.12 1.00 3.35 19.86 2.72 0.00 -BGO_Z0_0 17 2 1 -74.25 -15.12 0.99 3.20 23.32 2.45 0.00 -BGO_Z0_0 16 2 1 -64.35 -15.12 1.01 2.20 22.40 2.51 0.00 -BGO_Z0_0 15 2 1 -54.45 -15.12 1.01 1.77 22.55 2.61 0.00 -BGO_Z0_0 14 2 1 -44.55 -15.12 0.98 5.13 19.80 2.69 0.00 -BGO_Z0_0 13 2 1 -34.65 -15.12 1.00 2.44 21.67 2.61 0.00 -BGO_Z0_0 12 2 1 -24.75 -15.12 0.99 3.42 22.03 2.64 0.01 -BGO_Z0_0 11 2 1 -14.85 -15.12 1.00 4.57 21.09 2.62 0.00 -BGO_Z0_0 10 2 1 -4.95 -15.12 1.00 2.51 18.78 2.64 0.00 -BGO_Z0_0 9 2 1 4.95 -15.12 1.01 0.94 21.58 2.57 0.00 -BGO_Z0_0 8 2 1 14.85 -15.12 1.01 1.15 22.33 2.47 0.00 -BGO_Z0_0 7 2 1 24.75 -15.12 1.00 3.00 27.74 1.98 0.05 -BGO_Z0_0 6 2 1 34.65 -15.12 1.00 3.54 23.01 2.51 0.00 -BGO_Z0_0 5 2 1 44.55 -15.12 1.00 4.55 21.57 2.60 0.00 -BGO_Z0_0 4 2 1 54.45 -15.12 1.00 4.16 24.26 2.66 0.00 -BGO_Z0_0 3 2 1 64.35 -15.12 1.02 3.44 18.65 2.87 0.00 -BGO_Z0_0 2 2 1 74.25 -15.12 1.01 3.56 16.91 3.17 0.00 -BGO_Z0_0 1 2 1 84.15 -15.12 0.98 4.03 24.38 2.32 0.08 -BGO_Z0_0 0 2 1 94.05 -15.12 0.93 3.75 19.71 2.90 0.00 -BGO_Z0_0 19 3 1 -94.05 -5.04 1.00 3.32 20.78 2.63 0.00 -BGO_Z0_0 18 3 1 -84.15 -5.04 0.99 3.36 24.76 2.38 0.00 -BGO_Z0_0 17 3 1 -74.25 -5.04 1.00 1.63 21.76 2.64 0.00 -BGO_Z0_0 16 3 1 -64.35 -5.04 0.99 2.43 21.42 2.54 0.00 -BGO_Z0_0 15 3 1 -54.45 -5.04 1.00 2.24 22.55 2.42 0.02 -BGO_Z0_0 14 3 1 -44.55 -5.04 0.99 4.31 19.83 2.47 0.00 -BGO_Z0_0 13 3 1 -34.65 -5.04 1.00 3.25 26.72 2.12 0.04 -BGO_Z0_0 12 3 1 -24.75 -5.04 1.00 3.04 27.29 2.31 0.00 -BGO_Z0_0 11 3 1 -14.85 -5.04 0.99 3.68 25.40 2.26 0.05 -BGO_Z0_0 10 3 1 -4.95 -5.04 1.00 4.08 22.65 2.46 0.00 -BGO_Z0_0 9 3 1 4.95 -5.04 1.00 3.70 20.39 2.66 0.00 -BGO_Z0_0 8 3 1 14.85 -5.04 0.99 5.13 25.39 2.35 0.00 -BGO_Z0_0 7 3 1 24.75 -5.04 1.01 2.23 20.36 2.65 0.00 -BGO_Z0_0 6 3 1 34.65 -5.04 1.00 4.09 20.75 2.65 0.00 -BGO_Z0_0 5 3 1 44.55 -5.04 1.01 4.62 20.82 2.49 0.04 -BGO_Z0_0 4 3 1 54.45 -5.04 1.02 5.36 24.69 2.38 0.06 -BGO_Z0_0 3 3 1 64.35 -5.04 1.05 3.50 20.50 2.86 0.00 -BGO_Z0_0 2 3 1 74.25 -5.04 1.08 3.79 22.46 2.75 0.09 -BGO_Z0_0 1 3 1 84.15 -5.04 1.12 5.01 20.86 3.31 0.09 -BGO_Z0_0 0 3 1 94.05 -5.04 1.13 -0.63 18.91 3.18 0.33 -BGO_Z0_0 19 4 1 -94.05 5.04 1.00 3.32 20.78 2.63 0.00 -BGO_Z0_0 18 4 1 -84.15 5.04 0.99 3.36 24.76 2.38 0.00 -BGO_Z0_0 17 4 1 -74.25 5.04 1.00 1.63 21.76 2.64 0.00 -BGO_Z0_0 16 4 1 -64.35 5.04 0.99 2.43 21.42 2.54 0.00 -BGO_Z0_0 15 4 1 -54.45 5.04 1.00 2.24 22.55 2.42 0.02 -BGO_Z0_0 14 4 1 -44.55 5.04 0.99 4.31 19.83 2.47 0.00 -BGO_Z0_0 13 4 1 -34.65 5.04 1.00 3.25 26.72 2.12 0.04 -BGO_Z0_0 12 4 1 -24.75 5.04 1.00 3.04 27.29 2.31 0.00 -BGO_Z0_0 11 4 1 -14.85 5.04 0.99 3.68 25.40 2.26 0.05 -BGO_Z0_0 10 4 1 -4.95 5.04 1.00 4.08 22.65 2.46 0.00 -BGO_Z0_0 9 4 1 4.95 5.04 1.00 3.70 20.39 2.66 0.00 -BGO_Z0_0 8 4 1 14.85 5.04 0.99 5.13 25.39 2.35 0.00 -BGO_Z0_0 7 4 1 24.75 5.04 1.01 2.23 20.36 2.65 0.00 -BGO_Z0_0 6 4 1 34.65 5.04 1.00 4.09 20.75 2.65 0.00 -BGO_Z0_0 5 4 1 44.55 5.04 1.01 4.62 20.82 2.49 0.04 -BGO_Z0_0 4 4 1 54.45 5.04 1.02 5.36 24.69 2.38 0.06 -BGO_Z0_0 3 4 1 64.35 5.04 1.05 3.50 20.50 2.86 0.00 -BGO_Z0_0 2 4 1 74.25 5.04 1.08 3.79 22.46 2.75 0.09 -BGO_Z0_0 1 4 1 84.15 5.04 1.12 5.01 20.86 3.31 0.09 -BGO_Z0_0 0 4 1 94.05 5.04 1.13 -0.63 18.91 3.18 0.33 -BGO_Z0_0 19 5 1 -94.05 15.12 1.00 2.80 23.43 2.48 0.00 -BGO_Z0_0 18 5 1 -84.15 15.12 1.00 3.35 19.86 2.72 0.00 -BGO_Z0_0 17 5 1 -74.25 15.12 0.99 3.20 23.32 2.45 0.00 -BGO_Z0_0 16 5 1 -64.35 15.12 1.01 2.20 22.40 2.51 0.00 -BGO_Z0_0 15 5 1 -54.45 15.12 1.01 1.77 22.55 2.61 0.00 -BGO_Z0_0 14 5 1 -44.55 15.12 0.98 5.13 19.80 2.69 0.00 -BGO_Z0_0 13 5 1 -34.65 15.12 1.00 2.44 21.67 2.61 0.00 -BGO_Z0_0 12 5 1 -24.75 15.12 0.99 3.42 22.03 2.64 0.01 -BGO_Z0_0 11 5 1 -14.85 15.12 1.00 4.57 21.09 2.62 0.00 -BGO_Z0_0 10 5 1 -4.95 15.12 1.00 2.51 18.78 2.64 0.00 -BGO_Z0_0 9 5 1 4.95 15.12 1.01 0.94 21.58 2.57 0.00 -BGO_Z0_0 8 5 1 14.85 15.12 1.01 1.15 22.33 2.47 0.00 -BGO_Z0_0 7 5 1 24.75 15.12 1.00 3.00 27.74 1.98 0.05 -BGO_Z0_0 6 5 1 34.65 15.12 1.00 3.54 23.01 2.51 0.00 -BGO_Z0_0 5 5 1 44.55 15.12 1.00 4.55 21.57 2.60 0.00 -BGO_Z0_0 4 5 1 54.45 15.12 1.00 4.16 24.26 2.66 0.00 -BGO_Z0_0 3 5 1 64.35 15.12 1.02 3.44 18.65 2.87 0.00 -BGO_Z0_0 2 5 1 74.25 15.12 1.01 3.56 16.91 3.17 0.00 -BGO_Z0_0 1 5 1 84.15 15.12 0.98 4.03 24.38 2.32 0.08 -BGO_Z0_0 0 5 1 94.05 15.12 0.93 3.75 19.71 2.90 0.00 -BGO_Z0_0 19 6 1 -94.05 25.20 0.99 3.61 25.98 2.45 0.00 -BGO_Z0_0 18 6 1 -84.15 25.20 0.99 4.17 23.11 2.54 0.00 -BGO_Z0_0 17 6 1 -74.25 25.20 0.99 3.90 27.64 2.11 0.05 -BGO_Z0_0 16 6 1 -64.35 25.20 1.00 2.57 25.38 2.55 0.00 -BGO_Z0_0 15 6 1 -54.45 25.20 0.99 3.83 25.22 2.36 0.03 -BGO_Z0_0 14 6 1 -44.55 25.20 1.00 3.23 20.90 2.52 0.03 -BGO_Z0_0 13 6 1 -34.65 25.20 1.01 1.01 19.86 2.67 0.00 -BGO_Z0_0 12 6 1 -24.75 25.20 1.01 1.37 24.58 2.41 0.03 -BGO_Z0_0 11 6 1 -14.85 25.20 1.00 3.13 19.41 2.65 0.00 -BGO_Z0_0 10 6 1 -4.95 25.20 1.00 2.54 21.91 2.52 0.00 -BGO_Z0_0 9 6 1 4.95 25.20 0.99 4.31 25.32 2.19 0.04 -BGO_Z0_0 8 6 1 14.85 25.20 1.00 3.25 17.78 2.66 0.00 -BGO_Z0_0 7 6 1 24.75 25.20 1.00 3.07 21.36 2.53 0.00 -BGO_Z0_0 6 6 1 34.65 25.20 0.98 4.47 23.05 2.52 0.00 -BGO_Z0_0 5 6 1 44.55 25.20 0.98 5.03 25.12 2.45 0.00 -BGO_Z0_0 4 6 1 54.45 25.20 0.98 4.66 19.86 2.64 0.00 -BGO_Z0_0 3 6 1 64.35 25.20 0.98 2.09 20.98 2.69 0.00 -BGO_Z0_0 2 6 1 74.25 25.20 0.95 3.62 20.30 2.66 0.00 -BGO_Z0_0 1 6 1 84.15 25.20 0.93 3.32 18.86 2.70 0.00 -BGO_Z0_0 0 6 1 94.05 25.20 0.94 1.87 22.93 2.53 0.00 -BGO_Z0_0 19 7 1 -94.05 35.28 0.98 4.41 21.62 2.74 0.00 -BGO_Z0_0 18 7 1 -84.15 35.28 1.01 1.19 16.43 2.77 0.00 -BGO_Z0_0 17 7 1 -74.25 35.28 0.98 4.43 20.26 2.51 0.00 -BGO_Z0_0 16 7 1 -64.35 35.28 0.99 3.96 18.17 2.68 0.00 -BGO_Z0_0 15 7 1 -54.45 35.28 0.99 5.33 19.00 2.60 0.00 -BGO_Z0_0 14 7 1 -44.55 35.28 1.00 2.76 22.65 2.47 0.00 -BGO_Z0_0 13 7 1 -34.65 35.28 1.00 3.45 23.31 2.50 0.00 -BGO_Z0_0 12 7 1 -24.75 35.28 0.98 4.97 16.41 2.78 0.00 -BGO_Z0_0 11 7 1 -14.85 35.28 0.99 4.62 23.09 2.51 0.00 -BGO_Z0_0 10 7 1 -4.95 35.28 0.99 5.46 23.32 2.55 0.00 -BGO_Z0_0 9 7 1 4.95 35.28 1.00 2.32 24.12 2.52 0.00 -BGO_Z0_0 8 7 1 14.85 35.28 1.01 0.87 24.30 2.56 0.00 -BGO_Z0_0 7 7 1 24.75 35.28 1.02 -1.81 23.93 2.51 0.00 -BGO_Z0_0 6 7 1 34.65 35.28 0.96 6.84 16.29 2.64 0.00 -BGO_Z0_0 5 7 1 44.55 35.28 0.96 5.23 26.06 2.30 0.00 -BGO_Z0_0 4 7 1 54.45 35.28 0.96 2.82 22.57 2.54 0.00 -BGO_Z0_0 3 7 1 64.35 35.28 0.94 3.64 21.47 2.52 0.00 -BGO_Z0_0 2 7 1 74.25 35.28 0.94 1.65 21.95 2.56 0.00 -BGO_Z0_0 1 7 1 84.15 35.28 0.94 2.06 21.29 2.56 0.00 -BGO_Z0_0 0 7 1 94.05 35.28 0.95 1.42 23.39 2.49 0.00 -BGO_Z0_0 19 0 2 -94.05 -35.28 0.98 4.41 21.62 2.74 0.00 -BGO_Z0_0 18 0 2 -84.15 -35.28 1.01 1.19 16.43 2.77 0.00 -BGO_Z0_0 17 0 2 -74.25 -35.28 0.98 4.43 20.26 2.51 0.00 -BGO_Z0_0 16 0 2 -64.35 -35.28 0.99 3.96 18.17 2.68 0.00 -BGO_Z0_0 15 0 2 -54.45 -35.28 0.99 5.33 19.00 2.60 0.00 -BGO_Z0_0 14 0 2 -44.55 -35.28 1.00 2.76 22.65 2.47 0.00 -BGO_Z0_0 13 0 2 -34.65 -35.28 1.00 3.45 23.31 2.50 0.00 -BGO_Z0_0 12 0 2 -24.75 -35.28 0.98 4.97 16.41 2.78 0.00 -BGO_Z0_0 11 0 2 -14.85 -35.28 0.99 4.62 23.09 2.51 0.00 -BGO_Z0_0 10 0 2 -4.95 -35.28 0.99 5.46 23.32 2.55 0.00 -BGO_Z0_0 9 0 2 4.95 -35.28 1.00 2.32 24.12 2.52 0.00 -BGO_Z0_0 8 0 2 14.85 -35.28 1.01 0.87 24.30 2.56 0.00 -BGO_Z0_0 7 0 2 24.75 -35.28 1.02 -1.81 23.93 2.51 0.00 -BGO_Z0_0 6 0 2 34.65 -35.28 0.96 6.84 16.29 2.64 0.00 -BGO_Z0_0 5 0 2 44.55 -35.28 0.96 5.23 26.06 2.30 0.00 -BGO_Z0_0 4 0 2 54.45 -35.28 0.96 2.82 22.57 2.54 0.00 -BGO_Z0_0 3 0 2 64.35 -35.28 0.94 3.64 21.47 2.52 0.00 -BGO_Z0_0 2 0 2 74.25 -35.28 0.94 1.65 21.95 2.56 0.00 -BGO_Z0_0 1 0 2 84.15 -35.28 0.94 2.06 21.29 2.56 0.00 -BGO_Z0_0 0 0 2 94.05 -35.28 0.95 1.42 23.39 2.49 0.00 -BGO_Z0_0 19 1 2 -94.05 -25.20 0.99 3.61 25.98 2.45 0.00 -BGO_Z0_0 18 1 2 -84.15 -25.20 0.99 4.17 23.11 2.54 0.00 -BGO_Z0_0 17 1 2 -74.25 -25.20 0.99 3.90 27.64 2.11 0.05 -BGO_Z0_0 16 1 2 -64.35 -25.20 1.00 2.57 25.38 2.55 0.00 -BGO_Z0_0 15 1 2 -54.45 -25.20 0.99 3.83 25.22 2.36 0.03 -BGO_Z0_0 14 1 2 -44.55 -25.20 1.00 3.23 20.90 2.52 0.03 -BGO_Z0_0 13 1 2 -34.65 -25.20 1.01 1.01 19.86 2.67 0.00 -BGO_Z0_0 12 1 2 -24.75 -25.20 1.01 1.37 24.58 2.41 0.03 -BGO_Z0_0 11 1 2 -14.85 -25.20 1.00 3.13 19.41 2.65 0.00 -BGO_Z0_0 10 1 2 -4.95 -25.20 1.00 2.54 21.91 2.52 0.00 -BGO_Z0_0 9 1 2 4.95 -25.20 0.99 4.31 25.32 2.19 0.04 -BGO_Z0_0 8 1 2 14.85 -25.20 1.00 3.25 17.78 2.66 0.00 -BGO_Z0_0 7 1 2 24.75 -25.20 1.00 3.07 21.36 2.53 0.00 -BGO_Z0_0 6 1 2 34.65 -25.20 0.98 4.47 23.05 2.52 0.00 -BGO_Z0_0 5 1 2 44.55 -25.20 0.98 5.03 25.12 2.45 0.00 -BGO_Z0_0 4 1 2 54.45 -25.20 0.98 4.66 19.86 2.64 0.00 -BGO_Z0_0 3 1 2 64.35 -25.20 0.98 2.09 20.98 2.69 0.00 -BGO_Z0_0 2 1 2 74.25 -25.20 0.95 3.62 20.30 2.66 0.00 -BGO_Z0_0 1 1 2 84.15 -25.20 0.93 3.32 18.86 2.70 0.00 -BGO_Z0_0 0 1 2 94.05 -25.20 0.94 1.87 22.93 2.53 0.00 -BGO_Z0_0 19 2 2 -94.05 -15.12 1.00 2.80 23.43 2.48 0.00 -BGO_Z0_0 18 2 2 -84.15 -15.12 1.00 3.35 19.86 2.72 0.00 -BGO_Z0_0 17 2 2 -74.25 -15.12 0.99 3.20 23.32 2.45 0.00 -BGO_Z0_0 16 2 2 -64.35 -15.12 1.01 2.20 22.40 2.51 0.00 -BGO_Z0_0 15 2 2 -54.45 -15.12 1.01 1.77 22.55 2.61 0.00 -BGO_Z0_0 14 2 2 -44.55 -15.12 0.98 5.13 19.80 2.69 0.00 -BGO_Z0_0 13 2 2 -34.65 -15.12 1.00 2.44 21.67 2.61 0.00 -BGO_Z0_0 12 2 2 -24.75 -15.12 0.99 3.42 22.03 2.64 0.01 -BGO_Z0_0 11 2 2 -14.85 -15.12 1.00 4.57 21.09 2.62 0.00 -BGO_Z0_0 10 2 2 -4.95 -15.12 1.00 2.51 18.78 2.64 0.00 -BGO_Z0_0 9 2 2 4.95 -15.12 1.01 0.94 21.58 2.57 0.00 -BGO_Z0_0 8 2 2 14.85 -15.12 1.01 1.15 22.33 2.47 0.00 -BGO_Z0_0 7 2 2 24.75 -15.12 1.00 3.00 27.74 1.98 0.05 -BGO_Z0_0 6 2 2 34.65 -15.12 1.00 3.54 23.01 2.51 0.00 -BGO_Z0_0 5 2 2 44.55 -15.12 1.00 4.55 21.57 2.60 0.00 -BGO_Z0_0 4 2 2 54.45 -15.12 1.00 4.16 24.26 2.66 0.00 -BGO_Z0_0 3 2 2 64.35 -15.12 1.02 3.44 18.65 2.87 0.00 -BGO_Z0_0 2 2 2 74.25 -15.12 1.01 3.56 16.91 3.17 0.00 -BGO_Z0_0 1 2 2 84.15 -15.12 0.98 4.03 24.38 2.32 0.08 -BGO_Z0_0 0 2 2 94.05 -15.12 0.93 3.75 19.71 2.90 0.00 -BGO_Z0_0 19 3 2 -94.05 -5.04 1.00 3.32 20.78 2.63 0.00 -BGO_Z0_0 18 3 2 -84.15 -5.04 0.99 3.36 24.76 2.38 0.00 -BGO_Z0_0 17 3 2 -74.25 -5.04 1.00 1.63 21.76 2.64 0.00 -BGO_Z0_0 16 3 2 -64.35 -5.04 0.99 2.43 21.42 2.54 0.00 -BGO_Z0_0 15 3 2 -54.45 -5.04 1.00 2.24 22.55 2.42 0.02 -BGO_Z0_0 14 3 2 -44.55 -5.04 0.99 4.31 19.83 2.47 0.00 -BGO_Z0_0 13 3 2 -34.65 -5.04 1.00 3.25 26.72 2.12 0.04 -BGO_Z0_0 12 3 2 -24.75 -5.04 1.00 3.04 27.29 2.31 0.00 -BGO_Z0_0 11 3 2 -14.85 -5.04 0.99 3.68 25.40 2.26 0.05 -BGO_Z0_0 10 3 2 -4.95 -5.04 1.00 4.08 22.65 2.46 0.00 -BGO_Z0_0 9 3 2 4.95 -5.04 1.00 3.70 20.39 2.66 0.00 -BGO_Z0_0 8 3 2 14.85 -5.04 0.99 5.13 25.39 2.35 0.00 -BGO_Z0_0 7 3 2 24.75 -5.04 1.01 2.23 20.36 2.65 0.00 -BGO_Z0_0 6 3 2 34.65 -5.04 1.00 4.09 20.75 2.65 0.00 -BGO_Z0_0 5 3 2 44.55 -5.04 1.01 4.62 20.82 2.49 0.04 -BGO_Z0_0 4 3 2 54.45 -5.04 1.02 5.36 24.69 2.38 0.06 -BGO_Z0_0 3 3 2 64.35 -5.04 1.05 3.50 20.50 2.86 0.00 -BGO_Z0_0 2 3 2 74.25 -5.04 1.08 3.79 22.46 2.75 0.09 -BGO_Z0_0 1 3 2 84.15 -5.04 1.12 5.01 20.86 3.31 0.09 -BGO_Z0_0 0 3 2 94.05 -5.04 1.13 -0.63 18.91 3.18 0.33 -BGO_Z0_0 19 4 2 -94.05 5.04 1.00 3.32 20.78 2.63 0.00 -BGO_Z0_0 18 4 2 -84.15 5.04 0.99 3.36 24.76 2.38 0.00 -BGO_Z0_0 17 4 2 -74.25 5.04 1.00 1.63 21.76 2.64 0.00 -BGO_Z0_0 16 4 2 -64.35 5.04 0.99 2.43 21.42 2.54 0.00 -BGO_Z0_0 15 4 2 -54.45 5.04 1.00 2.24 22.55 2.42 0.02 -BGO_Z0_0 14 4 2 -44.55 5.04 0.99 4.31 19.83 2.47 0.00 -BGO_Z0_0 13 4 2 -34.65 5.04 1.00 3.25 26.72 2.12 0.04 -BGO_Z0_0 12 4 2 -24.75 5.04 1.00 3.04 27.29 2.31 0.00 -BGO_Z0_0 11 4 2 -14.85 5.04 0.99 3.68 25.40 2.26 0.05 -BGO_Z0_0 10 4 2 -4.95 5.04 1.00 4.08 22.65 2.46 0.00 -BGO_Z0_0 9 4 2 4.95 5.04 1.00 3.70 20.39 2.66 0.00 -BGO_Z0_0 8 4 2 14.85 5.04 0.99 5.13 25.39 2.35 0.00 -BGO_Z0_0 7 4 2 24.75 5.04 1.01 2.23 20.36 2.65 0.00 -BGO_Z0_0 6 4 2 34.65 5.04 1.00 4.09 20.75 2.65 0.00 -BGO_Z0_0 5 4 2 44.55 5.04 1.01 4.62 20.82 2.49 0.04 -BGO_Z0_0 4 4 2 54.45 5.04 1.02 5.36 24.69 2.38 0.06 -BGO_Z0_0 3 4 2 64.35 5.04 1.05 3.50 20.50 2.86 0.00 -BGO_Z0_0 2 4 2 74.25 5.04 1.08 3.79 22.46 2.75 0.09 -BGO_Z0_0 1 4 2 84.15 5.04 1.12 5.01 20.86 3.31 0.09 -BGO_Z0_0 0 4 2 94.05 5.04 1.13 -0.63 18.91 3.18 0.33 -BGO_Z0_0 19 5 2 -94.05 15.12 1.00 2.80 23.43 2.48 0.00 -BGO_Z0_0 18 5 2 -84.15 15.12 1.00 3.35 19.86 2.72 0.00 -BGO_Z0_0 17 5 2 -74.25 15.12 0.99 3.20 23.32 2.45 0.00 -BGO_Z0_0 16 5 2 -64.35 15.12 1.01 2.20 22.40 2.51 0.00 -BGO_Z0_0 15 5 2 -54.45 15.12 1.01 1.77 22.55 2.61 0.00 -BGO_Z0_0 14 5 2 -44.55 15.12 0.98 5.13 19.80 2.69 0.00 -BGO_Z0_0 13 5 2 -34.65 15.12 1.00 2.44 21.67 2.61 0.00 -BGO_Z0_0 12 5 2 -24.75 15.12 0.99 3.42 22.03 2.64 0.01 -BGO_Z0_0 11 5 2 -14.85 15.12 1.00 4.57 21.09 2.62 0.00 -BGO_Z0_0 10 5 2 -4.95 15.12 1.00 2.51 18.78 2.64 0.00 -BGO_Z0_0 9 5 2 4.95 15.12 1.01 0.94 21.58 2.57 0.00 -BGO_Z0_0 8 5 2 14.85 15.12 1.01 1.15 22.33 2.47 0.00 -BGO_Z0_0 7 5 2 24.75 15.12 1.00 3.00 27.74 1.98 0.05 -BGO_Z0_0 6 5 2 34.65 15.12 1.00 3.54 23.01 2.51 0.00 -BGO_Z0_0 5 5 2 44.55 15.12 1.00 4.55 21.57 2.60 0.00 -BGO_Z0_0 4 5 2 54.45 15.12 1.00 4.16 24.26 2.66 0.00 -BGO_Z0_0 3 5 2 64.35 15.12 1.02 3.44 18.65 2.87 0.00 -BGO_Z0_0 2 5 2 74.25 15.12 1.01 3.56 16.91 3.17 0.00 -BGO_Z0_0 1 5 2 84.15 15.12 0.98 4.03 24.38 2.32 0.08 -BGO_Z0_0 0 5 2 94.05 15.12 0.93 3.75 19.71 2.90 0.00 -BGO_Z0_0 19 6 2 -94.05 25.20 0.99 3.61 25.98 2.45 0.00 -BGO_Z0_0 18 6 2 -84.15 25.20 0.99 4.17 23.11 2.54 0.00 -BGO_Z0_0 17 6 2 -74.25 25.20 0.99 3.90 27.64 2.11 0.05 -BGO_Z0_0 16 6 2 -64.35 25.20 1.00 2.57 25.38 2.55 0.00 -BGO_Z0_0 15 6 2 -54.45 25.20 0.99 3.83 25.22 2.36 0.03 -BGO_Z0_0 14 6 2 -44.55 25.20 1.00 3.23 20.90 2.52 0.03 -BGO_Z0_0 13 6 2 -34.65 25.20 1.01 1.01 19.86 2.67 0.00 -BGO_Z0_0 12 6 2 -24.75 25.20 1.01 1.37 24.58 2.41 0.03 -BGO_Z0_0 11 6 2 -14.85 25.20 1.00 3.13 19.41 2.65 0.00 -BGO_Z0_0 10 6 2 -4.95 25.20 1.00 2.54 21.91 2.52 0.00 -BGO_Z0_0 9 6 2 4.95 25.20 0.99 4.31 25.32 2.19 0.04 -BGO_Z0_0 8 6 2 14.85 25.20 1.00 3.25 17.78 2.66 0.00 -BGO_Z0_0 7 6 2 24.75 25.20 1.00 3.07 21.36 2.53 0.00 -BGO_Z0_0 6 6 2 34.65 25.20 0.98 4.47 23.05 2.52 0.00 -BGO_Z0_0 5 6 2 44.55 25.20 0.98 5.03 25.12 2.45 0.00 -BGO_Z0_0 4 6 2 54.45 25.20 0.98 4.66 19.86 2.64 0.00 -BGO_Z0_0 3 6 2 64.35 25.20 0.98 2.09 20.98 2.69 0.00 -BGO_Z0_0 2 6 2 74.25 25.20 0.95 3.62 20.30 2.66 0.00 -BGO_Z0_0 1 6 2 84.15 25.20 0.93 3.32 18.86 2.70 0.00 -BGO_Z0_0 0 6 2 94.05 25.20 0.94 1.87 22.93 2.53 0.00 -BGO_Z0_0 19 7 2 -94.05 35.28 0.98 4.41 21.62 2.74 0.00 -BGO_Z0_0 18 7 2 -84.15 35.28 1.01 1.19 16.43 2.77 0.00 -BGO_Z0_0 17 7 2 -74.25 35.28 0.98 4.43 20.26 2.51 0.00 -BGO_Z0_0 16 7 2 -64.35 35.28 0.99 3.96 18.17 2.68 0.00 -BGO_Z0_0 15 7 2 -54.45 35.28 0.99 5.33 19.00 2.60 0.00 -BGO_Z0_0 14 7 2 -44.55 35.28 1.00 2.76 22.65 2.47 0.00 -BGO_Z0_0 13 7 2 -34.65 35.28 1.00 3.45 23.31 2.50 0.00 -BGO_Z0_0 12 7 2 -24.75 35.28 0.98 4.97 16.41 2.78 0.00 -BGO_Z0_0 11 7 2 -14.85 35.28 0.99 4.62 23.09 2.51 0.00 -BGO_Z0_0 10 7 2 -4.95 35.28 0.99 5.46 23.32 2.55 0.00 -BGO_Z0_0 9 7 2 4.95 35.28 1.00 2.32 24.12 2.52 0.00 -BGO_Z0_0 8 7 2 14.85 35.28 1.01 0.87 24.30 2.56 0.00 -BGO_Z0_0 7 7 2 24.75 35.28 1.02 -1.81 23.93 2.51 0.00 -BGO_Z0_0 6 7 2 34.65 35.28 0.96 6.84 16.29 2.64 0.00 -BGO_Z0_0 5 7 2 44.55 35.28 0.96 5.23 26.06 2.30 0.00 -BGO_Z0_0 4 7 2 54.45 35.28 0.96 2.82 22.57 2.54 0.00 -BGO_Z0_0 3 7 2 64.35 35.28 0.94 3.64 21.47 2.52 0.00 -BGO_Z0_0 2 7 2 74.25 35.28 0.94 1.65 21.95 2.56 0.00 -BGO_Z0_0 1 7 2 84.15 35.28 0.94 2.06 21.29 2.56 0.00 -BGO_Z0_0 0 7 2 94.05 35.28 0.95 1.42 23.39 2.49 0.00 -BGO_Z0_1 16 0 0 -80.63 -26.92 1.00 2.81 19.80 2.55 0.00 -BGO_Z0_1 15 0 0 -70.55 -26.92 0.99 4.28 23.44 2.27 0.00 -BGO_Z0_1 14 0 0 -60.47 -26.92 0.99 4.77 17.49 2.60 0.00 -BGO_Z0_1 13 0 0 -50.39 -26.92 1.00 3.25 22.87 2.23 0.03 -BGO_Z0_1 12 0 0 -40.32 -26.92 1.00 3.37 21.42 2.57 0.00 -BGO_Z0_1 11 0 0 -30.24 -26.92 1.00 3.15 20.38 2.47 0.00 -BGO_Z0_1 10 0 0 -20.16 -26.92 0.99 3.89 21.52 2.41 0.00 -BGO_Z0_1 9 0 0 -10.08 -26.92 0.99 3.58 23.47 2.37 0.00 -BGO_Z0_1 8 0 0 -0.00 -26.92 1.01 1.91 19.14 2.53 0.00 -BGO_Z0_1 7 0 0 10.08 -26.92 1.00 2.41 22.09 2.44 0.00 -BGO_Z0_1 6 0 0 20.16 -26.92 1.01 2.11 22.56 2.40 0.00 -BGO_Z0_1 5 0 0 30.24 -26.92 1.00 3.31 23.07 2.27 0.05 -BGO_Z0_1 4 0 0 40.32 -26.92 0.99 2.91 21.33 2.33 0.03 -BGO_Z0_1 3 0 0 50.39 -26.92 0.96 3.58 23.58 2.28 0.03 -BGO_Z0_1 2 0 0 60.47 -26.92 0.94 4.41 22.97 2.37 0.00 -BGO_Z0_1 1 0 0 70.55 -26.92 0.94 3.13 21.56 2.38 0.00 -BGO_Z0_1 0 0 0 80.63 -26.92 0.95 2.51 20.02 2.56 0.00 -BGO_Z0_1 16 1 0 -80.63 -16.15 0.99 4.05 22.58 2.46 0.00 -BGO_Z0_1 15 1 0 -70.55 -16.15 0.99 4.45 23.31 2.32 0.01 -BGO_Z0_1 14 1 0 -60.47 -16.15 1.01 2.29 19.19 2.55 0.00 -BGO_Z0_1 13 1 0 -50.39 -16.15 1.01 2.15 20.61 2.59 0.00 -BGO_Z0_1 12 1 0 -40.32 -16.15 1.00 2.69 20.48 2.44 0.00 -BGO_Z0_1 11 1 0 -30.24 -16.15 1.00 2.73 21.14 2.55 0.00 -BGO_Z0_1 10 1 0 -20.16 -16.15 1.00 2.90 21.66 2.39 0.00 -BGO_Z0_1 9 1 0 -10.08 -16.15 1.00 2.92 20.38 2.43 0.00 -BGO_Z0_1 8 1 0 -0.00 -16.15 1.01 2.51 24.08 2.19 0.02 -BGO_Z0_1 7 1 0 10.08 -16.15 1.00 2.14 23.07 2.34 0.03 -BGO_Z0_1 6 1 0 20.16 -16.15 0.99 3.42 21.05 2.47 0.00 -BGO_Z0_1 5 1 0 30.24 -16.15 1.00 3.70 21.86 2.42 0.00 -BGO_Z0_1 4 1 0 40.32 -16.15 1.00 2.80 18.10 2.53 0.00 -BGO_Z0_1 3 1 0 50.39 -16.15 1.02 0.89 21.81 2.48 0.00 -BGO_Z0_1 2 1 0 60.47 -16.15 0.99 4.82 19.37 2.59 0.00 -BGO_Z0_1 1 1 0 70.55 -16.15 0.96 3.00 19.21 2.83 0.00 -BGO_Z0_1 0 1 0 80.63 -16.15 0.94 2.73 22.51 2.53 0.00 -BGO_Z0_1 16 2 0 -80.63 -5.38 1.00 3.53 21.80 2.49 0.01 -BGO_Z0_1 15 2 0 -70.55 -5.38 1.01 1.88 19.48 2.60 0.00 -BGO_Z0_1 14 2 0 -60.47 -5.38 1.00 3.13 24.16 2.32 0.00 -BGO_Z0_1 13 2 0 -50.39 -5.38 1.01 1.20 18.04 2.55 0.00 -BGO_Z0_1 12 2 0 -40.32 -5.38 0.99 2.85 24.30 2.23 0.03 -BGO_Z0_1 11 2 0 -30.24 -5.38 1.00 3.27 21.89 2.42 0.00 -BGO_Z0_1 10 2 0 -20.16 -5.38 0.99 4.00 20.13 2.44 0.00 -BGO_Z0_1 9 2 0 -10.08 -5.38 1.00 2.40 24.62 2.28 0.04 -BGO_Z0_1 8 2 0 -0.00 -5.38 1.00 3.08 20.64 2.46 0.00 -BGO_Z0_1 7 2 0 10.08 -5.38 1.00 3.17 21.43 2.34 0.03 -BGO_Z0_1 6 2 0 20.16 -5.38 1.01 0.97 22.02 2.39 0.00 -BGO_Z0_1 5 2 0 30.24 -5.38 1.00 2.83 23.62 2.33 0.02 -BGO_Z0_1 4 2 0 40.32 -5.38 1.01 3.26 20.81 2.55 0.00 -BGO_Z0_1 3 2 0 50.39 -5.38 1.02 4.24 19.58 2.66 0.00 -BGO_Z0_1 2 2 0 60.47 -5.38 1.06 1.30 24.45 2.39 0.06 -BGO_Z0_1 1 2 0 70.55 -5.38 1.08 4.10 21.17 2.87 0.07 -BGO_Z0_1 0 2 0 80.63 -5.38 1.08 0.99 23.80 2.11 0.26 -BGO_Z0_1 16 3 0 -80.63 5.38 1.00 3.53 21.80 2.49 0.01 -BGO_Z0_1 15 3 0 -70.55 5.38 1.01 1.88 19.48 2.60 0.00 -BGO_Z0_1 14 3 0 -60.47 5.38 1.00 3.13 24.16 2.32 0.00 -BGO_Z0_1 13 3 0 -50.39 5.38 1.01 1.20 18.04 2.55 0.00 -BGO_Z0_1 12 3 0 -40.32 5.38 0.99 2.85 24.30 2.23 0.03 -BGO_Z0_1 11 3 0 -30.24 5.38 1.00 3.27 21.89 2.42 0.00 -BGO_Z0_1 10 3 0 -20.16 5.38 0.99 4.00 20.13 2.44 0.00 -BGO_Z0_1 9 3 0 -10.08 5.38 1.00 2.40 24.62 2.28 0.04 -BGO_Z0_1 8 3 0 -0.00 5.38 1.00 3.08 20.64 2.46 0.00 -BGO_Z0_1 7 3 0 10.08 5.38 1.00 3.17 21.43 2.34 0.03 -BGO_Z0_1 6 3 0 20.16 5.38 1.01 0.97 22.02 2.39 0.00 -BGO_Z0_1 5 3 0 30.24 5.38 1.00 2.83 23.62 2.33 0.02 -BGO_Z0_1 4 3 0 40.32 5.38 1.01 3.26 20.81 2.55 0.00 -BGO_Z0_1 3 3 0 50.39 5.38 1.02 4.24 19.58 2.66 0.00 -BGO_Z0_1 2 3 0 60.47 5.38 1.06 1.30 24.45 2.39 0.06 -BGO_Z0_1 1 3 0 70.55 5.38 1.08 4.10 21.17 2.87 0.07 -BGO_Z0_1 0 3 0 80.63 5.38 1.08 0.99 23.80 2.11 0.26 -BGO_Z0_1 16 4 0 -80.63 16.15 0.99 4.05 22.58 2.46 0.00 -BGO_Z0_1 15 4 0 -70.55 16.15 0.99 4.45 23.31 2.32 0.01 -BGO_Z0_1 14 4 0 -60.47 16.15 1.01 2.29 19.19 2.55 0.00 -BGO_Z0_1 13 4 0 -50.39 16.15 1.01 2.15 20.61 2.59 0.00 -BGO_Z0_1 12 4 0 -40.32 16.15 1.00 2.69 20.48 2.44 0.00 -BGO_Z0_1 11 4 0 -30.24 16.15 1.00 2.73 21.14 2.55 0.00 -BGO_Z0_1 10 4 0 -20.16 16.15 1.00 2.90 21.66 2.39 0.00 -BGO_Z0_1 9 4 0 -10.08 16.15 1.00 2.92 20.38 2.43 0.00 -BGO_Z0_1 8 4 0 -0.00 16.15 1.01 2.51 24.08 2.19 0.02 -BGO_Z0_1 7 4 0 10.08 16.15 1.00 2.14 23.07 2.34 0.03 -BGO_Z0_1 6 4 0 20.16 16.15 0.99 3.42 21.05 2.47 0.00 -BGO_Z0_1 5 4 0 30.24 16.15 1.00 3.70 21.86 2.42 0.00 -BGO_Z0_1 4 4 0 40.32 16.15 1.00 2.80 18.10 2.53 0.00 -BGO_Z0_1 3 4 0 50.39 16.15 1.02 0.89 21.81 2.48 0.00 -BGO_Z0_1 2 4 0 60.47 16.15 0.99 4.82 19.37 2.59 0.00 -BGO_Z0_1 1 4 0 70.55 16.15 0.96 3.00 19.21 2.83 0.00 -BGO_Z0_1 0 4 0 80.63 16.15 0.94 2.73 22.51 2.53 0.00 -BGO_Z0_1 16 5 0 -80.63 26.92 1.00 2.81 19.80 2.55 0.00 -BGO_Z0_1 15 5 0 -70.55 26.92 0.99 4.28 23.44 2.27 0.00 -BGO_Z0_1 14 5 0 -60.47 26.92 0.99 4.77 17.49 2.60 0.00 -BGO_Z0_1 13 5 0 -50.39 26.92 1.00 3.25 22.87 2.23 0.03 -BGO_Z0_1 12 5 0 -40.32 26.92 1.00 3.37 21.42 2.57 0.00 -BGO_Z0_1 11 5 0 -30.24 26.92 1.00 3.15 20.38 2.47 0.00 -BGO_Z0_1 10 5 0 -20.16 26.92 0.99 3.89 21.52 2.41 0.00 -BGO_Z0_1 9 5 0 -10.08 26.92 0.99 3.58 23.47 2.37 0.00 -BGO_Z0_1 8 5 0 -0.00 26.92 1.01 1.91 19.14 2.53 0.00 -BGO_Z0_1 7 5 0 10.08 26.92 1.00 2.41 22.09 2.44 0.00 -BGO_Z0_1 6 5 0 20.16 26.92 1.01 2.11 22.56 2.40 0.00 -BGO_Z0_1 5 5 0 30.24 26.92 1.00 3.31 23.07 2.27 0.05 -BGO_Z0_1 4 5 0 40.32 26.92 0.99 2.91 21.33 2.33 0.03 -BGO_Z0_1 3 5 0 50.39 26.92 0.96 3.58 23.58 2.28 0.03 -BGO_Z0_1 2 5 0 60.47 26.92 0.94 4.41 22.97 2.37 0.00 -BGO_Z0_1 1 5 0 70.55 26.92 0.94 3.13 21.56 2.38 0.00 -BGO_Z0_1 0 5 0 80.63 26.92 0.95 2.51 20.02 2.56 0.00 -BGO_Z0_1 16 0 1 -80.63 -26.92 1.00 2.81 19.80 2.55 0.00 -BGO_Z0_1 15 0 1 -70.55 -26.92 0.99 4.28 23.44 2.27 0.00 -BGO_Z0_1 14 0 1 -60.47 -26.92 0.99 4.77 17.49 2.60 0.00 -BGO_Z0_1 13 0 1 -50.39 -26.92 1.00 3.25 22.87 2.23 0.03 -BGO_Z0_1 12 0 1 -40.32 -26.92 1.00 3.37 21.42 2.57 0.00 -BGO_Z0_1 11 0 1 -30.24 -26.92 1.00 3.15 20.38 2.47 0.00 -BGO_Z0_1 10 0 1 -20.16 -26.92 0.99 3.89 21.52 2.41 0.00 -BGO_Z0_1 9 0 1 -10.08 -26.92 0.99 3.58 23.47 2.37 0.00 -BGO_Z0_1 8 0 1 -0.00 -26.92 1.01 1.91 19.14 2.53 0.00 -BGO_Z0_1 7 0 1 10.08 -26.92 1.00 2.41 22.09 2.44 0.00 -BGO_Z0_1 6 0 1 20.16 -26.92 1.01 2.11 22.56 2.40 0.00 -BGO_Z0_1 5 0 1 30.24 -26.92 1.00 3.31 23.07 2.27 0.05 -BGO_Z0_1 4 0 1 40.32 -26.92 0.99 2.91 21.33 2.33 0.03 -BGO_Z0_1 3 0 1 50.39 -26.92 0.96 3.58 23.58 2.28 0.03 -BGO_Z0_1 2 0 1 60.47 -26.92 0.94 4.41 22.97 2.37 0.00 -BGO_Z0_1 1 0 1 70.55 -26.92 0.94 3.13 21.56 2.38 0.00 -BGO_Z0_1 0 0 1 80.63 -26.92 0.95 2.51 20.02 2.56 0.00 -BGO_Z0_1 16 1 1 -80.63 -16.15 0.99 4.05 22.58 2.46 0.00 -BGO_Z0_1 15 1 1 -70.55 -16.15 0.99 4.45 23.31 2.32 0.01 -BGO_Z0_1 14 1 1 -60.47 -16.15 1.01 2.29 19.19 2.55 0.00 -BGO_Z0_1 13 1 1 -50.39 -16.15 1.01 2.15 20.61 2.59 0.00 -BGO_Z0_1 12 1 1 -40.32 -16.15 1.00 2.69 20.48 2.44 0.00 -BGO_Z0_1 11 1 1 -30.24 -16.15 1.00 2.73 21.14 2.55 0.00 -BGO_Z0_1 10 1 1 -20.16 -16.15 1.00 2.90 21.66 2.39 0.00 -BGO_Z0_1 9 1 1 -10.08 -16.15 1.00 2.92 20.38 2.43 0.00 -BGO_Z0_1 8 1 1 -0.00 -16.15 1.01 2.51 24.08 2.19 0.02 -BGO_Z0_1 7 1 1 10.08 -16.15 1.00 2.14 23.07 2.34 0.03 -BGO_Z0_1 6 1 1 20.16 -16.15 0.99 3.42 21.05 2.47 0.00 -BGO_Z0_1 5 1 1 30.24 -16.15 1.00 3.70 21.86 2.42 0.00 -BGO_Z0_1 4 1 1 40.32 -16.15 1.00 2.80 18.10 2.53 0.00 -BGO_Z0_1 3 1 1 50.39 -16.15 1.02 0.89 21.81 2.48 0.00 -BGO_Z0_1 2 1 1 60.47 -16.15 0.99 4.82 19.37 2.59 0.00 -BGO_Z0_1 1 1 1 70.55 -16.15 0.96 3.00 19.21 2.83 0.00 -BGO_Z0_1 0 1 1 80.63 -16.15 0.94 2.73 22.51 2.53 0.00 -BGO_Z0_1 16 2 1 -80.63 -5.38 1.00 3.53 21.80 2.49 0.01 -BGO_Z0_1 15 2 1 -70.55 -5.38 1.01 1.88 19.48 2.60 0.00 -BGO_Z0_1 14 2 1 -60.47 -5.38 1.00 3.13 24.16 2.32 0.00 -BGO_Z0_1 13 2 1 -50.39 -5.38 1.01 1.20 18.04 2.55 0.00 -BGO_Z0_1 12 2 1 -40.32 -5.38 0.99 2.85 24.30 2.23 0.03 -BGO_Z0_1 11 2 1 -30.24 -5.38 1.00 3.27 21.89 2.42 0.00 -BGO_Z0_1 10 2 1 -20.16 -5.38 0.99 4.00 20.13 2.44 0.00 -BGO_Z0_1 9 2 1 -10.08 -5.38 1.00 2.40 24.62 2.28 0.04 -BGO_Z0_1 8 2 1 -0.00 -5.38 1.00 3.08 20.64 2.46 0.00 -BGO_Z0_1 7 2 1 10.08 -5.38 1.00 3.17 21.43 2.34 0.03 -BGO_Z0_1 6 2 1 20.16 -5.38 1.01 0.97 22.02 2.39 0.00 -BGO_Z0_1 5 2 1 30.24 -5.38 1.00 2.83 23.62 2.33 0.02 -BGO_Z0_1 4 2 1 40.32 -5.38 1.01 3.26 20.81 2.55 0.00 -BGO_Z0_1 3 2 1 50.39 -5.38 1.02 4.24 19.58 2.66 0.00 -BGO_Z0_1 2 2 1 60.47 -5.38 1.06 1.30 24.45 2.39 0.06 -BGO_Z0_1 1 2 1 70.55 -5.38 1.08 4.10 21.17 2.87 0.07 -BGO_Z0_1 0 2 1 80.63 -5.38 1.08 0.99 23.80 2.11 0.26 -BGO_Z0_1 16 3 1 -80.63 5.38 1.00 3.53 21.80 2.49 0.01 -BGO_Z0_1 15 3 1 -70.55 5.38 1.01 1.88 19.48 2.60 0.00 -BGO_Z0_1 14 3 1 -60.47 5.38 1.00 3.13 24.16 2.32 0.00 -BGO_Z0_1 13 3 1 -50.39 5.38 1.01 1.20 18.04 2.55 0.00 -BGO_Z0_1 12 3 1 -40.32 5.38 0.99 2.85 24.30 2.23 0.03 -BGO_Z0_1 11 3 1 -30.24 5.38 1.00 3.27 21.89 2.42 0.00 -BGO_Z0_1 10 3 1 -20.16 5.38 0.99 4.00 20.13 2.44 0.00 -BGO_Z0_1 9 3 1 -10.08 5.38 1.00 2.40 24.62 2.28 0.04 -BGO_Z0_1 8 3 1 -0.00 5.38 1.00 3.08 20.64 2.46 0.00 -BGO_Z0_1 7 3 1 10.08 5.38 1.00 3.17 21.43 2.34 0.03 -BGO_Z0_1 6 3 1 20.16 5.38 1.01 0.97 22.02 2.39 0.00 -BGO_Z0_1 5 3 1 30.24 5.38 1.00 2.83 23.62 2.33 0.02 -BGO_Z0_1 4 3 1 40.32 5.38 1.01 3.26 20.81 2.55 0.00 -BGO_Z0_1 3 3 1 50.39 5.38 1.02 4.24 19.58 2.66 0.00 -BGO_Z0_1 2 3 1 60.47 5.38 1.06 1.30 24.45 2.39 0.06 -BGO_Z0_1 1 3 1 70.55 5.38 1.08 4.10 21.17 2.87 0.07 -BGO_Z0_1 0 3 1 80.63 5.38 1.08 0.99 23.80 2.11 0.26 -BGO_Z0_1 16 4 1 -80.63 16.15 0.99 4.05 22.58 2.46 0.00 -BGO_Z0_1 15 4 1 -70.55 16.15 0.99 4.45 23.31 2.32 0.01 -BGO_Z0_1 14 4 1 -60.47 16.15 1.01 2.29 19.19 2.55 0.00 -BGO_Z0_1 13 4 1 -50.39 16.15 1.01 2.15 20.61 2.59 0.00 -BGO_Z0_1 12 4 1 -40.32 16.15 1.00 2.69 20.48 2.44 0.00 -BGO_Z0_1 11 4 1 -30.24 16.15 1.00 2.73 21.14 2.55 0.00 -BGO_Z0_1 10 4 1 -20.16 16.15 1.00 2.90 21.66 2.39 0.00 -BGO_Z0_1 9 4 1 -10.08 16.15 1.00 2.92 20.38 2.43 0.00 -BGO_Z0_1 8 4 1 -0.00 16.15 1.01 2.51 24.08 2.19 0.02 -BGO_Z0_1 7 4 1 10.08 16.15 1.00 2.14 23.07 2.34 0.03 -BGO_Z0_1 6 4 1 20.16 16.15 0.99 3.42 21.05 2.47 0.00 -BGO_Z0_1 5 4 1 30.24 16.15 1.00 3.70 21.86 2.42 0.00 -BGO_Z0_1 4 4 1 40.32 16.15 1.00 2.80 18.10 2.53 0.00 -BGO_Z0_1 3 4 1 50.39 16.15 1.02 0.89 21.81 2.48 0.00 -BGO_Z0_1 2 4 1 60.47 16.15 0.99 4.82 19.37 2.59 0.00 -BGO_Z0_1 1 4 1 70.55 16.15 0.96 3.00 19.21 2.83 0.00 -BGO_Z0_1 0 4 1 80.63 16.15 0.94 2.73 22.51 2.53 0.00 -BGO_Z0_1 16 5 1 -80.63 26.92 1.00 2.81 19.80 2.55 0.00 -BGO_Z0_1 15 5 1 -70.55 26.92 0.99 4.28 23.44 2.27 0.00 -BGO_Z0_1 14 5 1 -60.47 26.92 0.99 4.77 17.49 2.60 0.00 -BGO_Z0_1 13 5 1 -50.39 26.92 1.00 3.25 22.87 2.23 0.03 -BGO_Z0_1 12 5 1 -40.32 26.92 1.00 3.37 21.42 2.57 0.00 -BGO_Z0_1 11 5 1 -30.24 26.92 1.00 3.15 20.38 2.47 0.00 -BGO_Z0_1 10 5 1 -20.16 26.92 0.99 3.89 21.52 2.41 0.00 -BGO_Z0_1 9 5 1 -10.08 26.92 0.99 3.58 23.47 2.37 0.00 -BGO_Z0_1 8 5 1 -0.00 26.92 1.01 1.91 19.14 2.53 0.00 -BGO_Z0_1 7 5 1 10.08 26.92 1.00 2.41 22.09 2.44 0.00 -BGO_Z0_1 6 5 1 20.16 26.92 1.01 2.11 22.56 2.40 0.00 -BGO_Z0_1 5 5 1 30.24 26.92 1.00 3.31 23.07 2.27 0.05 -BGO_Z0_1 4 5 1 40.32 26.92 0.99 2.91 21.33 2.33 0.03 -BGO_Z0_1 3 5 1 50.39 26.92 0.96 3.58 23.58 2.28 0.03 -BGO_Z0_1 2 5 1 60.47 26.92 0.94 4.41 22.97 2.37 0.00 -BGO_Z0_1 1 5 1 70.55 26.92 0.94 3.13 21.56 2.38 0.00 -BGO_Z0_1 0 5 1 80.63 26.92 0.95 2.51 20.02 2.56 0.00 -BGO_Z0_1 16 0 2 -80.63 -26.92 1.00 2.81 19.80 2.55 0.00 -BGO_Z0_1 15 0 2 -70.55 -26.92 0.99 4.28 23.44 2.27 0.00 -BGO_Z0_1 14 0 2 -60.47 -26.92 0.99 4.77 17.49 2.60 0.00 -BGO_Z0_1 13 0 2 -50.39 -26.92 1.00 3.25 22.87 2.23 0.03 -BGO_Z0_1 12 0 2 -40.32 -26.92 1.00 3.37 21.42 2.57 0.00 -BGO_Z0_1 11 0 2 -30.24 -26.92 1.00 3.15 20.38 2.47 0.00 -BGO_Z0_1 10 0 2 -20.16 -26.92 0.99 3.89 21.52 2.41 0.00 -BGO_Z0_1 9 0 2 -10.08 -26.92 0.99 3.58 23.47 2.37 0.00 -BGO_Z0_1 8 0 2 -0.00 -26.92 1.01 1.91 19.14 2.53 0.00 -BGO_Z0_1 7 0 2 10.08 -26.92 1.00 2.41 22.09 2.44 0.00 -BGO_Z0_1 6 0 2 20.16 -26.92 1.01 2.11 22.56 2.40 0.00 -BGO_Z0_1 5 0 2 30.24 -26.92 1.00 3.31 23.07 2.27 0.05 -BGO_Z0_1 4 0 2 40.32 -26.92 0.99 2.91 21.33 2.33 0.03 -BGO_Z0_1 3 0 2 50.39 -26.92 0.96 3.58 23.58 2.28 0.03 -BGO_Z0_1 2 0 2 60.47 -26.92 0.94 4.41 22.97 2.37 0.00 -BGO_Z0_1 1 0 2 70.55 -26.92 0.94 3.13 21.56 2.38 0.00 -BGO_Z0_1 0 0 2 80.63 -26.92 0.95 2.51 20.02 2.56 0.00 -BGO_Z0_1 16 1 2 -80.63 -16.15 0.99 4.05 22.58 2.46 0.00 -BGO_Z0_1 15 1 2 -70.55 -16.15 0.99 4.45 23.31 2.32 0.01 -BGO_Z0_1 14 1 2 -60.47 -16.15 1.01 2.29 19.19 2.55 0.00 -BGO_Z0_1 13 1 2 -50.39 -16.15 1.01 2.15 20.61 2.59 0.00 -BGO_Z0_1 12 1 2 -40.32 -16.15 1.00 2.69 20.48 2.44 0.00 -BGO_Z0_1 11 1 2 -30.24 -16.15 1.00 2.73 21.14 2.55 0.00 -BGO_Z0_1 10 1 2 -20.16 -16.15 1.00 2.90 21.66 2.39 0.00 -BGO_Z0_1 9 1 2 -10.08 -16.15 1.00 2.92 20.38 2.43 0.00 -BGO_Z0_1 8 1 2 -0.00 -16.15 1.01 2.51 24.08 2.19 0.02 -BGO_Z0_1 7 1 2 10.08 -16.15 1.00 2.14 23.07 2.34 0.03 -BGO_Z0_1 6 1 2 20.16 -16.15 0.99 3.42 21.05 2.47 0.00 -BGO_Z0_1 5 1 2 30.24 -16.15 1.00 3.70 21.86 2.42 0.00 -BGO_Z0_1 4 1 2 40.32 -16.15 1.00 2.80 18.10 2.53 0.00 -BGO_Z0_1 3 1 2 50.39 -16.15 1.02 0.89 21.81 2.48 0.00 -BGO_Z0_1 2 1 2 60.47 -16.15 0.99 4.82 19.37 2.59 0.00 -BGO_Z0_1 1 1 2 70.55 -16.15 0.96 3.00 19.21 2.83 0.00 -BGO_Z0_1 0 1 2 80.63 -16.15 0.94 2.73 22.51 2.53 0.00 -BGO_Z0_1 16 2 2 -80.63 -5.38 1.00 3.53 21.80 2.49 0.01 -BGO_Z0_1 15 2 2 -70.55 -5.38 1.01 1.88 19.48 2.60 0.00 -BGO_Z0_1 14 2 2 -60.47 -5.38 1.00 3.13 24.16 2.32 0.00 -BGO_Z0_1 13 2 2 -50.39 -5.38 1.01 1.20 18.04 2.55 0.00 -BGO_Z0_1 12 2 2 -40.32 -5.38 0.99 2.85 24.30 2.23 0.03 -BGO_Z0_1 11 2 2 -30.24 -5.38 1.00 3.27 21.89 2.42 0.00 -BGO_Z0_1 10 2 2 -20.16 -5.38 0.99 4.00 20.13 2.44 0.00 -BGO_Z0_1 9 2 2 -10.08 -5.38 1.00 2.40 24.62 2.28 0.04 -BGO_Z0_1 8 2 2 -0.00 -5.38 1.00 3.08 20.64 2.46 0.00 -BGO_Z0_1 7 2 2 10.08 -5.38 1.00 3.17 21.43 2.34 0.03 -BGO_Z0_1 6 2 2 20.16 -5.38 1.01 0.97 22.02 2.39 0.00 -BGO_Z0_1 5 2 2 30.24 -5.38 1.00 2.83 23.62 2.33 0.02 -BGO_Z0_1 4 2 2 40.32 -5.38 1.01 3.26 20.81 2.55 0.00 -BGO_Z0_1 3 2 2 50.39 -5.38 1.02 4.24 19.58 2.66 0.00 -BGO_Z0_1 2 2 2 60.47 -5.38 1.06 1.30 24.45 2.39 0.06 -BGO_Z0_1 1 2 2 70.55 -5.38 1.08 4.10 21.17 2.87 0.07 -BGO_Z0_1 0 2 2 80.63 -5.38 1.08 0.99 23.80 2.11 0.26 -BGO_Z0_1 16 3 2 -80.63 5.38 1.00 3.53 21.80 2.49 0.01 -BGO_Z0_1 15 3 2 -70.55 5.38 1.01 1.88 19.48 2.60 0.00 -BGO_Z0_1 14 3 2 -60.47 5.38 1.00 3.13 24.16 2.32 0.00 -BGO_Z0_1 13 3 2 -50.39 5.38 1.01 1.20 18.04 2.55 0.00 -BGO_Z0_1 12 3 2 -40.32 5.38 0.99 2.85 24.30 2.23 0.03 -BGO_Z0_1 11 3 2 -30.24 5.38 1.00 3.27 21.89 2.42 0.00 -BGO_Z0_1 10 3 2 -20.16 5.38 0.99 4.00 20.13 2.44 0.00 -BGO_Z0_1 9 3 2 -10.08 5.38 1.00 2.40 24.62 2.28 0.04 -BGO_Z0_1 8 3 2 -0.00 5.38 1.00 3.08 20.64 2.46 0.00 -BGO_Z0_1 7 3 2 10.08 5.38 1.00 3.17 21.43 2.34 0.03 -BGO_Z0_1 6 3 2 20.16 5.38 1.01 0.97 22.02 2.39 0.00 -BGO_Z0_1 5 3 2 30.24 5.38 1.00 2.83 23.62 2.33 0.02 -BGO_Z0_1 4 3 2 40.32 5.38 1.01 3.26 20.81 2.55 0.00 -BGO_Z0_1 3 3 2 50.39 5.38 1.02 4.24 19.58 2.66 0.00 -BGO_Z0_1 2 3 2 60.47 5.38 1.06 1.30 24.45 2.39 0.06 -BGO_Z0_1 1 3 2 70.55 5.38 1.08 4.10 21.17 2.87 0.07 -BGO_Z0_1 0 3 2 80.63 5.38 1.08 0.99 23.80 2.11 0.26 -BGO_Z0_1 16 4 2 -80.63 16.15 0.99 4.05 22.58 2.46 0.00 -BGO_Z0_1 15 4 2 -70.55 16.15 0.99 4.45 23.31 2.32 0.01 -BGO_Z0_1 14 4 2 -60.47 16.15 1.01 2.29 19.19 2.55 0.00 -BGO_Z0_1 13 4 2 -50.39 16.15 1.01 2.15 20.61 2.59 0.00 -BGO_Z0_1 12 4 2 -40.32 16.15 1.00 2.69 20.48 2.44 0.00 -BGO_Z0_1 11 4 2 -30.24 16.15 1.00 2.73 21.14 2.55 0.00 -BGO_Z0_1 10 4 2 -20.16 16.15 1.00 2.90 21.66 2.39 0.00 -BGO_Z0_1 9 4 2 -10.08 16.15 1.00 2.92 20.38 2.43 0.00 -BGO_Z0_1 8 4 2 -0.00 16.15 1.01 2.51 24.08 2.19 0.02 -BGO_Z0_1 7 4 2 10.08 16.15 1.00 2.14 23.07 2.34 0.03 -BGO_Z0_1 6 4 2 20.16 16.15 0.99 3.42 21.05 2.47 0.00 -BGO_Z0_1 5 4 2 30.24 16.15 1.00 3.70 21.86 2.42 0.00 -BGO_Z0_1 4 4 2 40.32 16.15 1.00 2.80 18.10 2.53 0.00 -BGO_Z0_1 3 4 2 50.39 16.15 1.02 0.89 21.81 2.48 0.00 -BGO_Z0_1 2 4 2 60.47 16.15 0.99 4.82 19.37 2.59 0.00 -BGO_Z0_1 1 4 2 70.55 16.15 0.96 3.00 19.21 2.83 0.00 -BGO_Z0_1 0 4 2 80.63 16.15 0.94 2.73 22.51 2.53 0.00 -BGO_Z0_1 16 5 2 -80.63 26.92 1.00 2.81 19.80 2.55 0.00 -BGO_Z0_1 15 5 2 -70.55 26.92 0.99 4.28 23.44 2.27 0.00 -BGO_Z0_1 14 5 2 -60.47 26.92 0.99 4.77 17.49 2.60 0.00 -BGO_Z0_1 13 5 2 -50.39 26.92 1.00 3.25 22.87 2.23 0.03 -BGO_Z0_1 12 5 2 -40.32 26.92 1.00 3.37 21.42 2.57 0.00 -BGO_Z0_1 11 5 2 -30.24 26.92 1.00 3.15 20.38 2.47 0.00 -BGO_Z0_1 10 5 2 -20.16 26.92 0.99 3.89 21.52 2.41 0.00 -BGO_Z0_1 9 5 2 -10.08 26.92 0.99 3.58 23.47 2.37 0.00 -BGO_Z0_1 8 5 2 -0.00 26.92 1.01 1.91 19.14 2.53 0.00 -BGO_Z0_1 7 5 2 10.08 26.92 1.00 2.41 22.09 2.44 0.00 -BGO_Z0_1 6 5 2 20.16 26.92 1.01 2.11 22.56 2.40 0.00 -BGO_Z0_1 5 5 2 30.24 26.92 1.00 3.31 23.07 2.27 0.05 -BGO_Z0_1 4 5 2 40.32 26.92 0.99 2.91 21.33 2.33 0.03 -BGO_Z0_1 3 5 2 50.39 26.92 0.96 3.58 23.58 2.28 0.03 -BGO_Z0_1 2 5 2 60.47 26.92 0.94 4.41 22.97 2.37 0.00 -BGO_Z0_1 1 5 2 70.55 26.92 0.94 3.13 21.56 2.38 0.00 -BGO_Z0_1 0 5 2 80.63 26.92 0.95 2.51 20.02 2.56 0.00 -BGO_Z0_2 16 0 0 -80.63 -26.92 1.00 2.81 19.80 2.55 0.00 -BGO_Z0_2 15 0 0 -70.55 -26.92 0.99 4.28 23.44 2.27 0.00 -BGO_Z0_2 14 0 0 -60.47 -26.92 0.99 4.77 17.49 2.60 0.00 -BGO_Z0_2 13 0 0 -50.39 -26.92 1.00 3.25 22.87 2.23 0.03 -BGO_Z0_2 12 0 0 -40.32 -26.92 1.00 3.37 21.42 2.57 0.00 -BGO_Z0_2 11 0 0 -30.24 -26.92 1.00 3.15 20.38 2.47 0.00 -BGO_Z0_2 10 0 0 -20.16 -26.92 0.99 3.89 21.52 2.41 0.00 -BGO_Z0_2 9 0 0 -10.08 -26.92 0.99 3.58 23.47 2.37 0.00 -BGO_Z0_2 8 0 0 -0.00 -26.92 1.01 1.91 19.14 2.53 0.00 -BGO_Z0_2 7 0 0 10.08 -26.92 1.00 2.41 22.09 2.44 0.00 -BGO_Z0_2 6 0 0 20.16 -26.92 1.01 2.11 22.56 2.40 0.00 -BGO_Z0_2 5 0 0 30.24 -26.92 1.00 3.31 23.07 2.27 0.05 -BGO_Z0_2 4 0 0 40.32 -26.92 0.99 2.91 21.33 2.33 0.03 -BGO_Z0_2 3 0 0 50.39 -26.92 0.96 3.58 23.58 2.28 0.03 -BGO_Z0_2 2 0 0 60.47 -26.92 0.94 4.41 22.97 2.37 0.00 -BGO_Z0_2 1 0 0 70.55 -26.92 0.94 3.13 21.56 2.38 0.00 -BGO_Z0_2 0 0 0 80.63 -26.92 0.95 2.51 20.02 2.56 0.00 -BGO_Z0_2 16 1 0 -80.63 -16.15 0.99 4.05 22.58 2.46 0.00 -BGO_Z0_2 15 1 0 -70.55 -16.15 0.99 4.45 23.31 2.32 0.01 -BGO_Z0_2 14 1 0 -60.47 -16.15 1.01 2.29 19.19 2.55 0.00 -BGO_Z0_2 13 1 0 -50.39 -16.15 1.01 2.15 20.61 2.59 0.00 -BGO_Z0_2 12 1 0 -40.32 -16.15 1.00 2.69 20.48 2.44 0.00 -BGO_Z0_2 11 1 0 -30.24 -16.15 1.00 2.73 21.14 2.55 0.00 -BGO_Z0_2 10 1 0 -20.16 -16.15 1.00 2.90 21.66 2.39 0.00 -BGO_Z0_2 9 1 0 -10.08 -16.15 1.00 2.92 20.38 2.43 0.00 -BGO_Z0_2 8 1 0 -0.00 -16.15 1.01 2.51 24.08 2.19 0.02 -BGO_Z0_2 7 1 0 10.08 -16.15 1.00 2.14 23.07 2.34 0.03 -BGO_Z0_2 6 1 0 20.16 -16.15 0.99 3.42 21.05 2.47 0.00 -BGO_Z0_2 5 1 0 30.24 -16.15 1.00 3.70 21.86 2.42 0.00 -BGO_Z0_2 4 1 0 40.32 -16.15 1.00 2.80 18.10 2.53 0.00 -BGO_Z0_2 3 1 0 50.39 -16.15 1.02 0.89 21.81 2.48 0.00 -BGO_Z0_2 2 1 0 60.47 -16.15 0.99 4.82 19.37 2.59 0.00 -BGO_Z0_2 1 1 0 70.55 -16.15 0.96 3.00 19.21 2.83 0.00 -BGO_Z0_2 0 1 0 80.63 -16.15 0.94 2.73 22.51 2.53 0.00 -BGO_Z0_2 16 2 0 -80.63 -5.38 1.00 3.53 21.80 2.49 0.01 -BGO_Z0_2 15 2 0 -70.55 -5.38 1.01 1.88 19.48 2.60 0.00 -BGO_Z0_2 14 2 0 -60.47 -5.38 1.00 3.13 24.16 2.32 0.00 -BGO_Z0_2 13 2 0 -50.39 -5.38 1.01 1.20 18.04 2.55 0.00 -BGO_Z0_2 12 2 0 -40.32 -5.38 0.99 2.85 24.30 2.23 0.03 -BGO_Z0_2 11 2 0 -30.24 -5.38 1.00 3.27 21.89 2.42 0.00 -BGO_Z0_2 10 2 0 -20.16 -5.38 0.99 4.00 20.13 2.44 0.00 -BGO_Z0_2 9 2 0 -10.08 -5.38 1.00 2.40 24.62 2.28 0.04 -BGO_Z0_2 8 2 0 -0.00 -5.38 1.00 3.08 20.64 2.46 0.00 -BGO_Z0_2 7 2 0 10.08 -5.38 1.00 3.17 21.43 2.34 0.03 -BGO_Z0_2 6 2 0 20.16 -5.38 1.01 0.97 22.02 2.39 0.00 -BGO_Z0_2 5 2 0 30.24 -5.38 1.00 2.83 23.62 2.33 0.02 -BGO_Z0_2 4 2 0 40.32 -5.38 1.01 3.26 20.81 2.55 0.00 -BGO_Z0_2 3 2 0 50.39 -5.38 1.02 4.24 19.58 2.66 0.00 -BGO_Z0_2 2 2 0 60.47 -5.38 1.06 1.30 24.45 2.39 0.06 -BGO_Z0_2 1 2 0 70.55 -5.38 1.08 4.10 21.17 2.87 0.07 -BGO_Z0_2 0 2 0 80.63 -5.38 1.08 0.99 23.80 2.11 0.26 -BGO_Z0_2 16 3 0 -80.63 5.38 1.00 3.53 21.80 2.49 0.01 -BGO_Z0_2 15 3 0 -70.55 5.38 1.01 1.88 19.48 2.60 0.00 -BGO_Z0_2 14 3 0 -60.47 5.38 1.00 3.13 24.16 2.32 0.00 -BGO_Z0_2 13 3 0 -50.39 5.38 1.01 1.20 18.04 2.55 0.00 -BGO_Z0_2 12 3 0 -40.32 5.38 0.99 2.85 24.30 2.23 0.03 -BGO_Z0_2 11 3 0 -30.24 5.38 1.00 3.27 21.89 2.42 0.00 -BGO_Z0_2 10 3 0 -20.16 5.38 0.99 4.00 20.13 2.44 0.00 -BGO_Z0_2 9 3 0 -10.08 5.38 1.00 2.40 24.62 2.28 0.04 -BGO_Z0_2 8 3 0 -0.00 5.38 1.00 3.08 20.64 2.46 0.00 -BGO_Z0_2 7 3 0 10.08 5.38 1.00 3.17 21.43 2.34 0.03 -BGO_Z0_2 6 3 0 20.16 5.38 1.01 0.97 22.02 2.39 0.00 -BGO_Z0_2 5 3 0 30.24 5.38 1.00 2.83 23.62 2.33 0.02 -BGO_Z0_2 4 3 0 40.32 5.38 1.01 3.26 20.81 2.55 0.00 -BGO_Z0_2 3 3 0 50.39 5.38 1.02 4.24 19.58 2.66 0.00 -BGO_Z0_2 2 3 0 60.47 5.38 1.06 1.30 24.45 2.39 0.06 -BGO_Z0_2 1 3 0 70.55 5.38 1.08 4.10 21.17 2.87 0.07 -BGO_Z0_2 0 3 0 80.63 5.38 1.08 0.99 23.80 2.11 0.26 -BGO_Z0_2 16 4 0 -80.63 16.15 0.99 4.05 22.58 2.46 0.00 -BGO_Z0_2 15 4 0 -70.55 16.15 0.99 4.45 23.31 2.32 0.01 -BGO_Z0_2 14 4 0 -60.47 16.15 1.01 2.29 19.19 2.55 0.00 -BGO_Z0_2 13 4 0 -50.39 16.15 1.01 2.15 20.61 2.59 0.00 -BGO_Z0_2 12 4 0 -40.32 16.15 1.00 2.69 20.48 2.44 0.00 -BGO_Z0_2 11 4 0 -30.24 16.15 1.00 2.73 21.14 2.55 0.00 -BGO_Z0_2 10 4 0 -20.16 16.15 1.00 2.90 21.66 2.39 0.00 -BGO_Z0_2 9 4 0 -10.08 16.15 1.00 2.92 20.38 2.43 0.00 -BGO_Z0_2 8 4 0 -0.00 16.15 1.01 2.51 24.08 2.19 0.02 -BGO_Z0_2 7 4 0 10.08 16.15 1.00 2.14 23.07 2.34 0.03 -BGO_Z0_2 6 4 0 20.16 16.15 0.99 3.42 21.05 2.47 0.00 -BGO_Z0_2 5 4 0 30.24 16.15 1.00 3.70 21.86 2.42 0.00 -BGO_Z0_2 4 4 0 40.32 16.15 1.00 2.80 18.10 2.53 0.00 -BGO_Z0_2 3 4 0 50.39 16.15 1.02 0.89 21.81 2.48 0.00 -BGO_Z0_2 2 4 0 60.47 16.15 0.99 4.82 19.37 2.59 0.00 -BGO_Z0_2 1 4 0 70.55 16.15 0.96 3.00 19.21 2.83 0.00 -BGO_Z0_2 0 4 0 80.63 16.15 0.94 2.73 22.51 2.53 0.00 -BGO_Z0_2 16 5 0 -80.63 26.92 1.00 2.81 19.80 2.55 0.00 -BGO_Z0_2 15 5 0 -70.55 26.92 0.99 4.28 23.44 2.27 0.00 -BGO_Z0_2 14 5 0 -60.47 26.92 0.99 4.77 17.49 2.60 0.00 -BGO_Z0_2 13 5 0 -50.39 26.92 1.00 3.25 22.87 2.23 0.03 -BGO_Z0_2 12 5 0 -40.32 26.92 1.00 3.37 21.42 2.57 0.00 -BGO_Z0_2 11 5 0 -30.24 26.92 1.00 3.15 20.38 2.47 0.00 -BGO_Z0_2 10 5 0 -20.16 26.92 0.99 3.89 21.52 2.41 0.00 -BGO_Z0_2 9 5 0 -10.08 26.92 0.99 3.58 23.47 2.37 0.00 -BGO_Z0_2 8 5 0 -0.00 26.92 1.01 1.91 19.14 2.53 0.00 -BGO_Z0_2 7 5 0 10.08 26.92 1.00 2.41 22.09 2.44 0.00 -BGO_Z0_2 6 5 0 20.16 26.92 1.01 2.11 22.56 2.40 0.00 -BGO_Z0_2 5 5 0 30.24 26.92 1.00 3.31 23.07 2.27 0.05 -BGO_Z0_2 4 5 0 40.32 26.92 0.99 2.91 21.33 2.33 0.03 -BGO_Z0_2 3 5 0 50.39 26.92 0.96 3.58 23.58 2.28 0.03 -BGO_Z0_2 2 5 0 60.47 26.92 0.94 4.41 22.97 2.37 0.00 -BGO_Z0_2 1 5 0 70.55 26.92 0.94 3.13 21.56 2.38 0.00 -BGO_Z0_2 0 5 0 80.63 26.92 0.95 2.51 20.02 2.56 0.00 -BGO_Z0_2 16 0 1 -80.63 -26.92 1.00 2.81 19.80 2.55 0.00 -BGO_Z0_2 15 0 1 -70.55 -26.92 0.99 4.28 23.44 2.27 0.00 -BGO_Z0_2 14 0 1 -60.47 -26.92 0.99 4.77 17.49 2.60 0.00 -BGO_Z0_2 13 0 1 -50.39 -26.92 1.00 3.25 22.87 2.23 0.03 -BGO_Z0_2 12 0 1 -40.32 -26.92 1.00 3.37 21.42 2.57 0.00 -BGO_Z0_2 11 0 1 -30.24 -26.92 1.00 3.15 20.38 2.47 0.00 -BGO_Z0_2 10 0 1 -20.16 -26.92 0.99 3.89 21.52 2.41 0.00 -BGO_Z0_2 9 0 1 -10.08 -26.92 0.99 3.58 23.47 2.37 0.00 -BGO_Z0_2 8 0 1 -0.00 -26.92 1.01 1.91 19.14 2.53 0.00 -BGO_Z0_2 7 0 1 10.08 -26.92 1.00 2.41 22.09 2.44 0.00 -BGO_Z0_2 6 0 1 20.16 -26.92 1.01 2.11 22.56 2.40 0.00 -BGO_Z0_2 5 0 1 30.24 -26.92 1.00 3.31 23.07 2.27 0.05 -BGO_Z0_2 4 0 1 40.32 -26.92 0.99 2.91 21.33 2.33 0.03 -BGO_Z0_2 3 0 1 50.39 -26.92 0.96 3.58 23.58 2.28 0.03 -BGO_Z0_2 2 0 1 60.47 -26.92 0.94 4.41 22.97 2.37 0.00 -BGO_Z0_2 1 0 1 70.55 -26.92 0.94 3.13 21.56 2.38 0.00 -BGO_Z0_2 0 0 1 80.63 -26.92 0.95 2.51 20.02 2.56 0.00 -BGO_Z0_2 16 1 1 -80.63 -16.15 0.99 4.05 22.58 2.46 0.00 -BGO_Z0_2 15 1 1 -70.55 -16.15 0.99 4.45 23.31 2.32 0.01 -BGO_Z0_2 14 1 1 -60.47 -16.15 1.01 2.29 19.19 2.55 0.00 -BGO_Z0_2 13 1 1 -50.39 -16.15 1.01 2.15 20.61 2.59 0.00 -BGO_Z0_2 12 1 1 -40.32 -16.15 1.00 2.69 20.48 2.44 0.00 -BGO_Z0_2 11 1 1 -30.24 -16.15 1.00 2.73 21.14 2.55 0.00 -BGO_Z0_2 10 1 1 -20.16 -16.15 1.00 2.90 21.66 2.39 0.00 -BGO_Z0_2 9 1 1 -10.08 -16.15 1.00 2.92 20.38 2.43 0.00 -BGO_Z0_2 8 1 1 -0.00 -16.15 1.01 2.51 24.08 2.19 0.02 -BGO_Z0_2 7 1 1 10.08 -16.15 1.00 2.14 23.07 2.34 0.03 -BGO_Z0_2 6 1 1 20.16 -16.15 0.99 3.42 21.05 2.47 0.00 -BGO_Z0_2 5 1 1 30.24 -16.15 1.00 3.70 21.86 2.42 0.00 -BGO_Z0_2 4 1 1 40.32 -16.15 1.00 2.80 18.10 2.53 0.00 -BGO_Z0_2 3 1 1 50.39 -16.15 1.02 0.89 21.81 2.48 0.00 -BGO_Z0_2 2 1 1 60.47 -16.15 0.99 4.82 19.37 2.59 0.00 -BGO_Z0_2 1 1 1 70.55 -16.15 0.96 3.00 19.21 2.83 0.00 -BGO_Z0_2 0 1 1 80.63 -16.15 0.94 2.73 22.51 2.53 0.00 -BGO_Z0_2 16 2 1 -80.63 -5.38 1.00 3.53 21.80 2.49 0.01 -BGO_Z0_2 15 2 1 -70.55 -5.38 1.01 1.88 19.48 2.60 0.00 -BGO_Z0_2 14 2 1 -60.47 -5.38 1.00 3.13 24.16 2.32 0.00 -BGO_Z0_2 13 2 1 -50.39 -5.38 1.01 1.20 18.04 2.55 0.00 -BGO_Z0_2 12 2 1 -40.32 -5.38 0.99 2.85 24.30 2.23 0.03 -BGO_Z0_2 11 2 1 -30.24 -5.38 1.00 3.27 21.89 2.42 0.00 -BGO_Z0_2 10 2 1 -20.16 -5.38 0.99 4.00 20.13 2.44 0.00 -BGO_Z0_2 9 2 1 -10.08 -5.38 1.00 2.40 24.62 2.28 0.04 -BGO_Z0_2 8 2 1 -0.00 -5.38 1.00 3.08 20.64 2.46 0.00 -BGO_Z0_2 7 2 1 10.08 -5.38 1.00 3.17 21.43 2.34 0.03 -BGO_Z0_2 6 2 1 20.16 -5.38 1.01 0.97 22.02 2.39 0.00 -BGO_Z0_2 5 2 1 30.24 -5.38 1.00 2.83 23.62 2.33 0.02 -BGO_Z0_2 4 2 1 40.32 -5.38 1.01 3.26 20.81 2.55 0.00 -BGO_Z0_2 3 2 1 50.39 -5.38 1.02 4.24 19.58 2.66 0.00 -BGO_Z0_2 2 2 1 60.47 -5.38 1.06 1.30 24.45 2.39 0.06 -BGO_Z0_2 1 2 1 70.55 -5.38 1.08 4.10 21.17 2.87 0.07 -BGO_Z0_2 0 2 1 80.63 -5.38 1.08 0.99 23.80 2.11 0.26 -BGO_Z0_2 16 3 1 -80.63 5.38 1.00 3.53 21.80 2.49 0.01 -BGO_Z0_2 15 3 1 -70.55 5.38 1.01 1.88 19.48 2.60 0.00 -BGO_Z0_2 14 3 1 -60.47 5.38 1.00 3.13 24.16 2.32 0.00 -BGO_Z0_2 13 3 1 -50.39 5.38 1.01 1.20 18.04 2.55 0.00 -BGO_Z0_2 12 3 1 -40.32 5.38 0.99 2.85 24.30 2.23 0.03 -BGO_Z0_2 11 3 1 -30.24 5.38 1.00 3.27 21.89 2.42 0.00 -BGO_Z0_2 10 3 1 -20.16 5.38 0.99 4.00 20.13 2.44 0.00 -BGO_Z0_2 9 3 1 -10.08 5.38 1.00 2.40 24.62 2.28 0.04 -BGO_Z0_2 8 3 1 -0.00 5.38 1.00 3.08 20.64 2.46 0.00 -BGO_Z0_2 7 3 1 10.08 5.38 1.00 3.17 21.43 2.34 0.03 -BGO_Z0_2 6 3 1 20.16 5.38 1.01 0.97 22.02 2.39 0.00 -BGO_Z0_2 5 3 1 30.24 5.38 1.00 2.83 23.62 2.33 0.02 -BGO_Z0_2 4 3 1 40.32 5.38 1.01 3.26 20.81 2.55 0.00 -BGO_Z0_2 3 3 1 50.39 5.38 1.02 4.24 19.58 2.66 0.00 -BGO_Z0_2 2 3 1 60.47 5.38 1.06 1.30 24.45 2.39 0.06 -BGO_Z0_2 1 3 1 70.55 5.38 1.08 4.10 21.17 2.87 0.07 -BGO_Z0_2 0 3 1 80.63 5.38 1.08 0.99 23.80 2.11 0.26 -BGO_Z0_2 16 4 1 -80.63 16.15 0.99 4.05 22.58 2.46 0.00 -BGO_Z0_2 15 4 1 -70.55 16.15 0.99 4.45 23.31 2.32 0.01 -BGO_Z0_2 14 4 1 -60.47 16.15 1.01 2.29 19.19 2.55 0.00 -BGO_Z0_2 13 4 1 -50.39 16.15 1.01 2.15 20.61 2.59 0.00 -BGO_Z0_2 12 4 1 -40.32 16.15 1.00 2.69 20.48 2.44 0.00 -BGO_Z0_2 11 4 1 -30.24 16.15 1.00 2.73 21.14 2.55 0.00 -BGO_Z0_2 10 4 1 -20.16 16.15 1.00 2.90 21.66 2.39 0.00 -BGO_Z0_2 9 4 1 -10.08 16.15 1.00 2.92 20.38 2.43 0.00 -BGO_Z0_2 8 4 1 -0.00 16.15 1.01 2.51 24.08 2.19 0.02 -BGO_Z0_2 7 4 1 10.08 16.15 1.00 2.14 23.07 2.34 0.03 -BGO_Z0_2 6 4 1 20.16 16.15 0.99 3.42 21.05 2.47 0.00 -BGO_Z0_2 5 4 1 30.24 16.15 1.00 3.70 21.86 2.42 0.00 -BGO_Z0_2 4 4 1 40.32 16.15 1.00 2.80 18.10 2.53 0.00 -BGO_Z0_2 3 4 1 50.39 16.15 1.02 0.89 21.81 2.48 0.00 -BGO_Z0_2 2 4 1 60.47 16.15 0.99 4.82 19.37 2.59 0.00 -BGO_Z0_2 1 4 1 70.55 16.15 0.96 3.00 19.21 2.83 0.00 -BGO_Z0_2 0 4 1 80.63 16.15 0.94 2.73 22.51 2.53 0.00 -BGO_Z0_2 16 5 1 -80.63 26.92 1.00 2.81 19.80 2.55 0.00 -BGO_Z0_2 15 5 1 -70.55 26.92 0.99 4.28 23.44 2.27 0.00 -BGO_Z0_2 14 5 1 -60.47 26.92 0.99 4.77 17.49 2.60 0.00 -BGO_Z0_2 13 5 1 -50.39 26.92 1.00 3.25 22.87 2.23 0.03 -BGO_Z0_2 12 5 1 -40.32 26.92 1.00 3.37 21.42 2.57 0.00 -BGO_Z0_2 11 5 1 -30.24 26.92 1.00 3.15 20.38 2.47 0.00 -BGO_Z0_2 10 5 1 -20.16 26.92 0.99 3.89 21.52 2.41 0.00 -BGO_Z0_2 9 5 1 -10.08 26.92 0.99 3.58 23.47 2.37 0.00 -BGO_Z0_2 8 5 1 -0.00 26.92 1.01 1.91 19.14 2.53 0.00 -BGO_Z0_2 7 5 1 10.08 26.92 1.00 2.41 22.09 2.44 0.00 -BGO_Z0_2 6 5 1 20.16 26.92 1.01 2.11 22.56 2.40 0.00 -BGO_Z0_2 5 5 1 30.24 26.92 1.00 3.31 23.07 2.27 0.05 -BGO_Z0_2 4 5 1 40.32 26.92 0.99 2.91 21.33 2.33 0.03 -BGO_Z0_2 3 5 1 50.39 26.92 0.96 3.58 23.58 2.28 0.03 -BGO_Z0_2 2 5 1 60.47 26.92 0.94 4.41 22.97 2.37 0.00 -BGO_Z0_2 1 5 1 70.55 26.92 0.94 3.13 21.56 2.38 0.00 -BGO_Z0_2 0 5 1 80.63 26.92 0.95 2.51 20.02 2.56 0.00 -BGO_Z0_2 16 0 2 -80.63 -26.92 1.00 2.81 19.80 2.55 0.00 -BGO_Z0_2 15 0 2 -70.55 -26.92 0.99 4.28 23.44 2.27 0.00 -BGO_Z0_2 14 0 2 -60.47 -26.92 0.99 4.77 17.49 2.60 0.00 -BGO_Z0_2 13 0 2 -50.39 -26.92 1.00 3.25 22.87 2.23 0.03 -BGO_Z0_2 12 0 2 -40.32 -26.92 1.00 3.37 21.42 2.57 0.00 -BGO_Z0_2 11 0 2 -30.24 -26.92 1.00 3.15 20.38 2.47 0.00 -BGO_Z0_2 10 0 2 -20.16 -26.92 0.99 3.89 21.52 2.41 0.00 -BGO_Z0_2 9 0 2 -10.08 -26.92 0.99 3.58 23.47 2.37 0.00 -BGO_Z0_2 8 0 2 -0.00 -26.92 1.01 1.91 19.14 2.53 0.00 -BGO_Z0_2 7 0 2 10.08 -26.92 1.00 2.41 22.09 2.44 0.00 -BGO_Z0_2 6 0 2 20.16 -26.92 1.01 2.11 22.56 2.40 0.00 -BGO_Z0_2 5 0 2 30.24 -26.92 1.00 3.31 23.07 2.27 0.05 -BGO_Z0_2 4 0 2 40.32 -26.92 0.99 2.91 21.33 2.33 0.03 -BGO_Z0_2 3 0 2 50.39 -26.92 0.96 3.58 23.58 2.28 0.03 -BGO_Z0_2 2 0 2 60.47 -26.92 0.94 4.41 22.97 2.37 0.00 -BGO_Z0_2 1 0 2 70.55 -26.92 0.94 3.13 21.56 2.38 0.00 -BGO_Z0_2 0 0 2 80.63 -26.92 0.95 2.51 20.02 2.56 0.00 -BGO_Z0_2 16 1 2 -80.63 -16.15 0.99 4.05 22.58 2.46 0.00 -BGO_Z0_2 15 1 2 -70.55 -16.15 0.99 4.45 23.31 2.32 0.01 -BGO_Z0_2 14 1 2 -60.47 -16.15 1.01 2.29 19.19 2.55 0.00 -BGO_Z0_2 13 1 2 -50.39 -16.15 1.01 2.15 20.61 2.59 0.00 -BGO_Z0_2 12 1 2 -40.32 -16.15 1.00 2.69 20.48 2.44 0.00 -BGO_Z0_2 11 1 2 -30.24 -16.15 1.00 2.73 21.14 2.55 0.00 -BGO_Z0_2 10 1 2 -20.16 -16.15 1.00 2.90 21.66 2.39 0.00 -BGO_Z0_2 9 1 2 -10.08 -16.15 1.00 2.92 20.38 2.43 0.00 -BGO_Z0_2 8 1 2 -0.00 -16.15 1.01 2.51 24.08 2.19 0.02 -BGO_Z0_2 7 1 2 10.08 -16.15 1.00 2.14 23.07 2.34 0.03 -BGO_Z0_2 6 1 2 20.16 -16.15 0.99 3.42 21.05 2.47 0.00 -BGO_Z0_2 5 1 2 30.24 -16.15 1.00 3.70 21.86 2.42 0.00 -BGO_Z0_2 4 1 2 40.32 -16.15 1.00 2.80 18.10 2.53 0.00 -BGO_Z0_2 3 1 2 50.39 -16.15 1.02 0.89 21.81 2.48 0.00 -BGO_Z0_2 2 1 2 60.47 -16.15 0.99 4.82 19.37 2.59 0.00 -BGO_Z0_2 1 1 2 70.55 -16.15 0.96 3.00 19.21 2.83 0.00 -BGO_Z0_2 0 1 2 80.63 -16.15 0.94 2.73 22.51 2.53 0.00 -BGO_Z0_2 16 2 2 -80.63 -5.38 1.00 3.53 21.80 2.49 0.01 -BGO_Z0_2 15 2 2 -70.55 -5.38 1.01 1.88 19.48 2.60 0.00 -BGO_Z0_2 14 2 2 -60.47 -5.38 1.00 3.13 24.16 2.32 0.00 -BGO_Z0_2 13 2 2 -50.39 -5.38 1.01 1.20 18.04 2.55 0.00 -BGO_Z0_2 12 2 2 -40.32 -5.38 0.99 2.85 24.30 2.23 0.03 -BGO_Z0_2 11 2 2 -30.24 -5.38 1.00 3.27 21.89 2.42 0.00 -BGO_Z0_2 10 2 2 -20.16 -5.38 0.99 4.00 20.13 2.44 0.00 -BGO_Z0_2 9 2 2 -10.08 -5.38 1.00 2.40 24.62 2.28 0.04 -BGO_Z0_2 8 2 2 -0.00 -5.38 1.00 3.08 20.64 2.46 0.00 -BGO_Z0_2 7 2 2 10.08 -5.38 1.00 3.17 21.43 2.34 0.03 -BGO_Z0_2 6 2 2 20.16 -5.38 1.01 0.97 22.02 2.39 0.00 -BGO_Z0_2 5 2 2 30.24 -5.38 1.00 2.83 23.62 2.33 0.02 -BGO_Z0_2 4 2 2 40.32 -5.38 1.01 3.26 20.81 2.55 0.00 -BGO_Z0_2 3 2 2 50.39 -5.38 1.02 4.24 19.58 2.66 0.00 -BGO_Z0_2 2 2 2 60.47 -5.38 1.06 1.30 24.45 2.39 0.06 -BGO_Z0_2 1 2 2 70.55 -5.38 1.08 4.10 21.17 2.87 0.07 -BGO_Z0_2 0 2 2 80.63 -5.38 1.08 0.99 23.80 2.11 0.26 -BGO_Z0_2 16 3 2 -80.63 5.38 1.00 3.53 21.80 2.49 0.01 -BGO_Z0_2 15 3 2 -70.55 5.38 1.01 1.88 19.48 2.60 0.00 -BGO_Z0_2 14 3 2 -60.47 5.38 1.00 3.13 24.16 2.32 0.00 -BGO_Z0_2 13 3 2 -50.39 5.38 1.01 1.20 18.04 2.55 0.00 -BGO_Z0_2 12 3 2 -40.32 5.38 0.99 2.85 24.30 2.23 0.03 -BGO_Z0_2 11 3 2 -30.24 5.38 1.00 3.27 21.89 2.42 0.00 -BGO_Z0_2 10 3 2 -20.16 5.38 0.99 4.00 20.13 2.44 0.00 -BGO_Z0_2 9 3 2 -10.08 5.38 1.00 2.40 24.62 2.28 0.04 -BGO_Z0_2 8 3 2 -0.00 5.38 1.00 3.08 20.64 2.46 0.00 -BGO_Z0_2 7 3 2 10.08 5.38 1.00 3.17 21.43 2.34 0.03 -BGO_Z0_2 6 3 2 20.16 5.38 1.01 0.97 22.02 2.39 0.00 -BGO_Z0_2 5 3 2 30.24 5.38 1.00 2.83 23.62 2.33 0.02 -BGO_Z0_2 4 3 2 40.32 5.38 1.01 3.26 20.81 2.55 0.00 -BGO_Z0_2 3 3 2 50.39 5.38 1.02 4.24 19.58 2.66 0.00 -BGO_Z0_2 2 3 2 60.47 5.38 1.06 1.30 24.45 2.39 0.06 -BGO_Z0_2 1 3 2 70.55 5.38 1.08 4.10 21.17 2.87 0.07 -BGO_Z0_2 0 3 2 80.63 5.38 1.08 0.99 23.80 2.11 0.26 -BGO_Z0_2 16 4 2 -80.63 16.15 0.99 4.05 22.58 2.46 0.00 -BGO_Z0_2 15 4 2 -70.55 16.15 0.99 4.45 23.31 2.32 0.01 -BGO_Z0_2 14 4 2 -60.47 16.15 1.01 2.29 19.19 2.55 0.00 -BGO_Z0_2 13 4 2 -50.39 16.15 1.01 2.15 20.61 2.59 0.00 -BGO_Z0_2 12 4 2 -40.32 16.15 1.00 2.69 20.48 2.44 0.00 -BGO_Z0_2 11 4 2 -30.24 16.15 1.00 2.73 21.14 2.55 0.00 -BGO_Z0_2 10 4 2 -20.16 16.15 1.00 2.90 21.66 2.39 0.00 -BGO_Z0_2 9 4 2 -10.08 16.15 1.00 2.92 20.38 2.43 0.00 -BGO_Z0_2 8 4 2 -0.00 16.15 1.01 2.51 24.08 2.19 0.02 -BGO_Z0_2 7 4 2 10.08 16.15 1.00 2.14 23.07 2.34 0.03 -BGO_Z0_2 6 4 2 20.16 16.15 0.99 3.42 21.05 2.47 0.00 -BGO_Z0_2 5 4 2 30.24 16.15 1.00 3.70 21.86 2.42 0.00 -BGO_Z0_2 4 4 2 40.32 16.15 1.00 2.80 18.10 2.53 0.00 -BGO_Z0_2 3 4 2 50.39 16.15 1.02 0.89 21.81 2.48 0.00 -BGO_Z0_2 2 4 2 60.47 16.15 0.99 4.82 19.37 2.59 0.00 -BGO_Z0_2 1 4 2 70.55 16.15 0.96 3.00 19.21 2.83 0.00 -BGO_Z0_2 0 4 2 80.63 16.15 0.94 2.73 22.51 2.53 0.00 -BGO_Z0_2 16 5 2 -80.63 26.92 1.00 2.81 19.80 2.55 0.00 -BGO_Z0_2 15 5 2 -70.55 26.92 0.99 4.28 23.44 2.27 0.00 -BGO_Z0_2 14 5 2 -60.47 26.92 0.99 4.77 17.49 2.60 0.00 -BGO_Z0_2 13 5 2 -50.39 26.92 1.00 3.25 22.87 2.23 0.03 -BGO_Z0_2 12 5 2 -40.32 26.92 1.00 3.37 21.42 2.57 0.00 -BGO_Z0_2 11 5 2 -30.24 26.92 1.00 3.15 20.38 2.47 0.00 -BGO_Z0_2 10 5 2 -20.16 26.92 0.99 3.89 21.52 2.41 0.00 -BGO_Z0_2 9 5 2 -10.08 26.92 0.99 3.58 23.47 2.37 0.00 -BGO_Z0_2 8 5 2 -0.00 26.92 1.01 1.91 19.14 2.53 0.00 -BGO_Z0_2 7 5 2 10.08 26.92 1.00 2.41 22.09 2.44 0.00 -BGO_Z0_2 6 5 2 20.16 26.92 1.01 2.11 22.56 2.40 0.00 -BGO_Z0_2 5 5 2 30.24 26.92 1.00 3.31 23.07 2.27 0.05 -BGO_Z0_2 4 5 2 40.32 26.92 0.99 2.91 21.33 2.33 0.03 -BGO_Z0_2 3 5 2 50.39 26.92 0.96 3.58 23.58 2.28 0.03 -BGO_Z0_2 2 5 2 60.47 26.92 0.94 4.41 22.97 2.37 0.00 -BGO_Z0_2 1 5 2 70.55 26.92 0.94 3.13 21.56 2.38 0.00 -BGO_Z0_2 0 5 2 80.63 26.92 0.95 2.51 20.02 2.56 0.00 -BGO_Z0_3 19 0 0 -94.05 -26.07 0.98 5.18 19.51 2.48 0.00 -BGO_Z0_3 18 0 0 -84.15 -26.07 1.01 2.62 22.79 2.42 0.00 -BGO_Z0_3 17 0 0 -74.25 -26.07 1.00 3.30 22.09 2.39 0.00 -BGO_Z0_3 16 0 0 -64.35 -26.07 0.98 6.39 21.87 2.56 0.00 -BGO_Z0_3 15 0 0 -54.45 -26.07 1.00 2.90 21.99 2.47 0.00 -BGO_Z0_3 14 0 0 -44.55 -26.07 1.00 4.83 22.96 2.38 0.00 -BGO_Z0_3 13 0 0 -34.65 -26.07 1.02 1.64 22.43 2.45 0.00 -BGO_Z0_3 12 0 0 -24.75 -26.07 1.00 2.60 21.11 2.49 0.03 -BGO_Z0_3 11 0 0 -14.85 -26.07 1.00 2.99 23.66 2.46 0.00 -BGO_Z0_3 10 0 0 -4.95 -26.07 0.98 5.49 22.69 2.41 0.00 -BGO_Z0_3 9 0 0 4.95 -26.07 1.01 2.74 22.55 2.42 0.02 -BGO_Z0_3 8 0 0 14.85 -26.07 1.00 3.26 23.08 2.13 0.04 -BGO_Z0_3 7 0 0 24.75 -26.07 0.98 5.45 22.69 2.44 0.00 -BGO_Z0_3 6 0 0 34.65 -26.07 1.00 2.84 20.67 2.46 0.00 -BGO_Z0_3 5 0 0 44.55 -26.07 0.99 4.03 23.26 2.40 0.00 -BGO_Z0_3 4 0 0 54.45 -26.07 0.98 4.18 25.77 2.23 0.00 -BGO_Z0_3 3 0 0 64.35 -26.07 0.95 5.66 19.76 2.56 0.00 -BGO_Z0_3 2 0 0 74.25 -26.07 0.95 2.68 21.09 2.46 0.00 -BGO_Z0_3 1 0 0 84.15 -26.07 0.92 5.37 25.12 2.13 0.05 -BGO_Z0_3 0 0 0 94.05 -26.07 0.93 4.54 22.13 2.49 0.00 -BGO_Z0_3 19 1 0 -94.05 -15.64 0.99 4.42 24.52 2.34 0.00 -BGO_Z0_3 18 1 0 -84.15 -15.64 0.99 4.83 22.83 2.45 0.00 -BGO_Z0_3 17 1 0 -74.25 -15.64 0.99 3.94 24.55 2.31 0.00 -BGO_Z0_3 16 1 0 -64.35 -15.64 1.00 3.27 23.09 2.40 0.00 -BGO_Z0_3 15 1 0 -54.45 -15.64 1.00 2.87 25.25 2.19 0.04 -BGO_Z0_3 14 1 0 -44.55 -15.64 1.00 2.81 24.70 2.16 0.03 -BGO_Z0_3 13 1 0 -34.65 -15.64 1.00 3.62 23.87 2.29 0.03 -BGO_Z0_3 12 1 0 -24.75 -15.64 1.00 3.60 21.41 2.51 0.00 -BGO_Z0_3 11 1 0 -14.85 -15.64 1.00 3.18 21.47 2.52 0.00 -BGO_Z0_3 10 1 0 -4.95 -15.64 1.00 3.79 21.51 2.39 0.00 -BGO_Z0_3 9 1 0 4.95 -15.64 1.01 1.73 20.66 2.54 0.00 -BGO_Z0_3 8 1 0 14.85 -15.64 0.99 4.11 23.12 2.44 0.00 -BGO_Z0_3 7 1 0 24.75 -15.64 1.00 3.62 22.89 2.39 0.00 -BGO_Z0_3 6 1 0 34.65 -15.64 0.99 4.61 24.85 2.27 0.00 -BGO_Z0_3 5 1 0 44.55 -15.64 1.01 1.67 24.41 2.36 0.00 -BGO_Z0_3 4 1 0 54.45 -15.64 1.00 3.76 20.49 2.47 0.00 -BGO_Z0_3 3 1 0 64.35 -15.64 1.00 3.38 20.60 2.62 0.00 -BGO_Z0_3 2 1 0 74.25 -15.64 1.01 2.78 19.05 2.64 0.00 -BGO_Z0_3 1 1 0 84.15 -15.64 0.97 4.26 18.30 2.74 0.04 -BGO_Z0_3 0 1 0 94.05 -15.64 0.93 4.30 26.83 2.11 0.07 -BGO_Z0_3 19 2 0 -94.05 -5.21 1.00 3.82 21.07 2.32 0.04 -BGO_Z0_3 18 2 0 -84.15 -5.21 1.01 2.64 19.57 2.62 0.00 -BGO_Z0_3 17 2 0 -74.25 -5.21 1.00 4.13 23.64 2.45 0.00 -BGO_Z0_3 16 2 0 -64.35 -5.21 0.99 4.91 23.08 2.41 0.00 -BGO_Z0_3 15 2 0 -54.45 -5.21 1.00 3.31 23.06 2.44 0.00 -BGO_Z0_3 14 2 0 -44.55 -5.21 1.01 1.45 21.27 2.53 0.00 -BGO_Z0_3 13 2 0 -34.65 -5.21 1.00 2.79 22.38 2.47 0.00 -BGO_Z0_3 12 2 0 -24.75 -5.21 0.99 4.99 22.04 2.44 0.00 -BGO_Z0_3 11 2 0 -14.85 -5.21 0.99 4.34 20.43 2.56 0.00 -BGO_Z0_3 10 2 0 -4.95 -5.21 0.99 4.07 22.58 2.46 0.00 -BGO_Z0_3 9 2 0 4.95 -5.21 0.98 6.53 22.85 2.38 0.00 -BGO_Z0_3 8 2 0 14.85 -5.21 1.00 3.59 21.27 2.53 0.00 -BGO_Z0_3 7 2 0 24.75 -5.21 1.00 2.93 20.72 2.42 0.00 -BGO_Z0_3 6 2 0 34.65 -5.21 0.98 5.76 20.92 2.49 0.00 -BGO_Z0_3 5 2 0 44.55 -5.21 1.00 4.71 22.89 2.38 0.00 -BGO_Z0_3 4 2 0 54.45 -5.21 1.02 2.56 18.83 2.60 0.00 -BGO_Z0_3 3 2 0 64.35 -5.21 1.04 2.31 23.23 2.37 0.04 -BGO_Z0_3 2 2 0 74.25 -5.21 1.04 5.71 21.76 2.69 0.00 -BGO_Z0_3 1 2 0 84.15 -5.21 1.08 4.19 18.85 3.23 0.00 -BGO_Z0_3 0 2 0 94.05 -5.21 1.07 2.68 12.90 3.35 0.26 -BGO_Z0_3 19 3 0 -94.05 5.21 1.00 3.82 21.07 2.32 0.04 -BGO_Z0_3 18 3 0 -84.15 5.21 1.01 2.64 19.57 2.62 0.00 -BGO_Z0_3 17 3 0 -74.25 5.21 1.00 4.13 23.64 2.45 0.00 -BGO_Z0_3 16 3 0 -64.35 5.21 0.99 4.91 23.08 2.41 0.00 -BGO_Z0_3 15 3 0 -54.45 5.21 1.00 3.31 23.06 2.44 0.00 -BGO_Z0_3 14 3 0 -44.55 5.21 1.01 1.45 21.27 2.53 0.00 -BGO_Z0_3 13 3 0 -34.65 5.21 1.00 2.79 22.38 2.47 0.00 -BGO_Z0_3 12 3 0 -24.75 5.21 0.99 4.99 22.04 2.44 0.00 -BGO_Z0_3 11 3 0 -14.85 5.21 0.99 4.34 20.43 2.56 0.00 -BGO_Z0_3 10 3 0 -4.95 5.21 0.99 4.07 22.58 2.46 0.00 -BGO_Z0_3 9 3 0 4.95 5.21 0.98 6.53 22.85 2.38 0.00 -BGO_Z0_3 8 3 0 14.85 5.21 1.00 3.59 21.27 2.53 0.00 -BGO_Z0_3 7 3 0 24.75 5.21 1.00 2.93 20.72 2.42 0.00 -BGO_Z0_3 6 3 0 34.65 5.21 0.98 5.76 20.92 2.49 0.00 -BGO_Z0_3 5 3 0 44.55 5.21 1.00 4.71 22.89 2.38 0.00 -BGO_Z0_3 4 3 0 54.45 5.21 1.02 2.56 18.83 2.60 0.00 -BGO_Z0_3 3 3 0 64.35 5.21 1.04 2.31 23.23 2.37 0.04 -BGO_Z0_3 2 3 0 74.25 5.21 1.04 5.71 21.76 2.69 0.00 -BGO_Z0_3 1 3 0 84.15 5.21 1.08 4.19 18.85 3.23 0.00 -BGO_Z0_3 0 3 0 94.05 5.21 1.07 2.68 12.90 3.35 0.26 -BGO_Z0_3 19 4 0 -94.05 15.64 0.99 4.42 24.52 2.34 0.00 -BGO_Z0_3 18 4 0 -84.15 15.64 0.99 4.83 22.83 2.45 0.00 -BGO_Z0_3 17 4 0 -74.25 15.64 0.99 3.94 24.55 2.31 0.00 -BGO_Z0_3 16 4 0 -64.35 15.64 1.00 3.27 23.09 2.40 0.00 -BGO_Z0_3 15 4 0 -54.45 15.64 1.00 2.87 25.25 2.19 0.04 -BGO_Z0_3 14 4 0 -44.55 15.64 1.00 2.81 24.70 2.16 0.03 -BGO_Z0_3 13 4 0 -34.65 15.64 1.00 3.62 23.87 2.29 0.03 -BGO_Z0_3 12 4 0 -24.75 15.64 1.00 3.60 21.41 2.51 0.00 -BGO_Z0_3 11 4 0 -14.85 15.64 1.00 3.18 21.47 2.52 0.00 -BGO_Z0_3 10 4 0 -4.95 15.64 1.00 3.79 21.51 2.39 0.00 -BGO_Z0_3 9 4 0 4.95 15.64 1.01 1.73 20.66 2.54 0.00 -BGO_Z0_3 8 4 0 14.85 15.64 0.99 4.11 23.12 2.44 0.00 -BGO_Z0_3 7 4 0 24.75 15.64 1.00 3.62 22.89 2.39 0.00 -BGO_Z0_3 6 4 0 34.65 15.64 0.99 4.61 24.85 2.27 0.00 -BGO_Z0_3 5 4 0 44.55 15.64 1.01 1.67 24.41 2.36 0.00 -BGO_Z0_3 4 4 0 54.45 15.64 1.00 3.76 20.49 2.47 0.00 -BGO_Z0_3 3 4 0 64.35 15.64 1.00 3.38 20.60 2.62 0.00 -BGO_Z0_3 2 4 0 74.25 15.64 1.01 2.78 19.05 2.64 0.00 -BGO_Z0_3 1 4 0 84.15 15.64 0.97 4.26 18.30 2.74 0.04 -BGO_Z0_3 0 4 0 94.05 15.64 0.93 4.30 26.83 2.11 0.07 -BGO_Z0_3 19 5 0 -94.05 26.07 0.98 5.18 19.51 2.48 0.00 -BGO_Z0_3 18 5 0 -84.15 26.07 1.01 2.62 22.79 2.42 0.00 -BGO_Z0_3 17 5 0 -74.25 26.07 1.00 3.30 22.09 2.39 0.00 -BGO_Z0_3 16 5 0 -64.35 26.07 0.98 6.39 21.87 2.56 0.00 -BGO_Z0_3 15 5 0 -54.45 26.07 1.00 2.90 21.99 2.47 0.00 -BGO_Z0_3 14 5 0 -44.55 26.07 1.00 4.83 22.96 2.38 0.00 -BGO_Z0_3 13 5 0 -34.65 26.07 1.02 1.64 22.43 2.45 0.00 -BGO_Z0_3 12 5 0 -24.75 26.07 1.00 2.60 21.11 2.49 0.03 -BGO_Z0_3 11 5 0 -14.85 26.07 1.00 2.99 23.66 2.46 0.00 -BGO_Z0_3 10 5 0 -4.95 26.07 0.98 5.49 22.69 2.41 0.00 -BGO_Z0_3 9 5 0 4.95 26.07 1.01 2.74 22.55 2.42 0.02 -BGO_Z0_3 8 5 0 14.85 26.07 1.00 3.26 23.08 2.13 0.04 -BGO_Z0_3 7 5 0 24.75 26.07 0.98 5.45 22.69 2.44 0.00 -BGO_Z0_3 6 5 0 34.65 26.07 1.00 2.84 20.67 2.46 0.00 -BGO_Z0_3 5 5 0 44.55 26.07 0.99 4.03 23.26 2.40 0.00 -BGO_Z0_3 4 5 0 54.45 26.07 0.98 4.18 25.77 2.23 0.00 -BGO_Z0_3 3 5 0 64.35 26.07 0.95 5.66 19.76 2.56 0.00 -BGO_Z0_3 2 5 0 74.25 26.07 0.95 2.68 21.09 2.46 0.00 -BGO_Z0_3 1 5 0 84.15 26.07 0.92 5.37 25.12 2.13 0.05 -BGO_Z0_3 0 5 0 94.05 26.07 0.93 4.54 22.13 2.49 0.00 -BGO_Z0_3 19 0 1 -94.05 -26.07 0.98 5.18 19.51 2.48 0.00 -BGO_Z0_3 18 0 1 -84.15 -26.07 1.01 2.62 22.79 2.42 0.00 -BGO_Z0_3 17 0 1 -74.25 -26.07 1.00 3.30 22.09 2.39 0.00 -BGO_Z0_3 16 0 1 -64.35 -26.07 0.98 6.39 21.87 2.56 0.00 -BGO_Z0_3 15 0 1 -54.45 -26.07 1.00 2.90 21.99 2.47 0.00 -BGO_Z0_3 14 0 1 -44.55 -26.07 1.00 4.83 22.96 2.38 0.00 -BGO_Z0_3 13 0 1 -34.65 -26.07 1.02 1.64 22.43 2.45 0.00 -BGO_Z0_3 12 0 1 -24.75 -26.07 1.00 2.60 21.11 2.49 0.03 -BGO_Z0_3 11 0 1 -14.85 -26.07 1.00 2.99 23.66 2.46 0.00 -BGO_Z0_3 10 0 1 -4.95 -26.07 0.98 5.49 22.69 2.41 0.00 -BGO_Z0_3 9 0 1 4.95 -26.07 1.01 2.74 22.55 2.42 0.02 -BGO_Z0_3 8 0 1 14.85 -26.07 1.00 3.26 23.08 2.13 0.04 -BGO_Z0_3 7 0 1 24.75 -26.07 0.98 5.45 22.69 2.44 0.00 -BGO_Z0_3 6 0 1 34.65 -26.07 1.00 2.84 20.67 2.46 0.00 -BGO_Z0_3 5 0 1 44.55 -26.07 0.99 4.03 23.26 2.40 0.00 -BGO_Z0_3 4 0 1 54.45 -26.07 0.98 4.18 25.77 2.23 0.00 -BGO_Z0_3 3 0 1 64.35 -26.07 0.95 5.66 19.76 2.56 0.00 -BGO_Z0_3 2 0 1 74.25 -26.07 0.95 2.68 21.09 2.46 0.00 -BGO_Z0_3 1 0 1 84.15 -26.07 0.92 5.37 25.12 2.13 0.05 -BGO_Z0_3 0 0 1 94.05 -26.07 0.93 4.54 22.13 2.49 0.00 -BGO_Z0_3 19 1 1 -94.05 -15.64 0.99 4.42 24.52 2.34 0.00 -BGO_Z0_3 18 1 1 -84.15 -15.64 0.99 4.83 22.83 2.45 0.00 -BGO_Z0_3 17 1 1 -74.25 -15.64 0.99 3.94 24.55 2.31 0.00 -BGO_Z0_3 16 1 1 -64.35 -15.64 1.00 3.27 23.09 2.40 0.00 -BGO_Z0_3 15 1 1 -54.45 -15.64 1.00 2.87 25.25 2.19 0.04 -BGO_Z0_3 14 1 1 -44.55 -15.64 1.00 2.81 24.70 2.16 0.03 -BGO_Z0_3 13 1 1 -34.65 -15.64 1.00 3.62 23.87 2.29 0.03 -BGO_Z0_3 12 1 1 -24.75 -15.64 1.00 3.60 21.41 2.51 0.00 -BGO_Z0_3 11 1 1 -14.85 -15.64 1.00 3.18 21.47 2.52 0.00 -BGO_Z0_3 10 1 1 -4.95 -15.64 1.00 3.79 21.51 2.39 0.00 -BGO_Z0_3 9 1 1 4.95 -15.64 1.01 1.73 20.66 2.54 0.00 -BGO_Z0_3 8 1 1 14.85 -15.64 0.99 4.11 23.12 2.44 0.00 -BGO_Z0_3 7 1 1 24.75 -15.64 1.00 3.62 22.89 2.39 0.00 -BGO_Z0_3 6 1 1 34.65 -15.64 0.99 4.61 24.85 2.27 0.00 -BGO_Z0_3 5 1 1 44.55 -15.64 1.01 1.67 24.41 2.36 0.00 -BGO_Z0_3 4 1 1 54.45 -15.64 1.00 3.76 20.49 2.47 0.00 -BGO_Z0_3 3 1 1 64.35 -15.64 1.00 3.38 20.60 2.62 0.00 -BGO_Z0_3 2 1 1 74.25 -15.64 1.01 2.78 19.05 2.64 0.00 -BGO_Z0_3 1 1 1 84.15 -15.64 0.97 4.26 18.30 2.74 0.04 -BGO_Z0_3 0 1 1 94.05 -15.64 0.93 4.30 26.83 2.11 0.07 -BGO_Z0_3 19 2 1 -94.05 -5.21 1.00 3.82 21.07 2.32 0.04 -BGO_Z0_3 18 2 1 -84.15 -5.21 1.01 2.64 19.57 2.62 0.00 -BGO_Z0_3 17 2 1 -74.25 -5.21 1.00 4.13 23.64 2.45 0.00 -BGO_Z0_3 16 2 1 -64.35 -5.21 0.99 4.91 23.08 2.41 0.00 -BGO_Z0_3 15 2 1 -54.45 -5.21 1.00 3.31 23.06 2.44 0.00 -BGO_Z0_3 14 2 1 -44.55 -5.21 1.01 1.45 21.27 2.53 0.00 -BGO_Z0_3 13 2 1 -34.65 -5.21 1.00 2.79 22.38 2.47 0.00 -BGO_Z0_3 12 2 1 -24.75 -5.21 0.99 4.99 22.04 2.44 0.00 -BGO_Z0_3 11 2 1 -14.85 -5.21 0.99 4.34 20.43 2.56 0.00 -BGO_Z0_3 10 2 1 -4.95 -5.21 0.99 4.07 22.58 2.46 0.00 -BGO_Z0_3 9 2 1 4.95 -5.21 0.98 6.53 22.85 2.38 0.00 -BGO_Z0_3 8 2 1 14.85 -5.21 1.00 3.59 21.27 2.53 0.00 -BGO_Z0_3 7 2 1 24.75 -5.21 1.00 2.93 20.72 2.42 0.00 -BGO_Z0_3 6 2 1 34.65 -5.21 0.98 5.76 20.92 2.49 0.00 -BGO_Z0_3 5 2 1 44.55 -5.21 1.00 4.71 22.89 2.38 0.00 -BGO_Z0_3 4 2 1 54.45 -5.21 1.02 2.56 18.83 2.60 0.00 -BGO_Z0_3 3 2 1 64.35 -5.21 1.04 2.31 23.23 2.37 0.04 -BGO_Z0_3 2 2 1 74.25 -5.21 1.04 5.71 21.76 2.69 0.00 -BGO_Z0_3 1 2 1 84.15 -5.21 1.08 4.19 18.85 3.23 0.00 -BGO_Z0_3 0 2 1 94.05 -5.21 1.07 2.68 12.90 3.35 0.26 -BGO_Z0_3 19 3 1 -94.05 5.21 1.00 3.82 21.07 2.32 0.04 -BGO_Z0_3 18 3 1 -84.15 5.21 1.01 2.64 19.57 2.62 0.00 -BGO_Z0_3 17 3 1 -74.25 5.21 1.00 4.13 23.64 2.45 0.00 -BGO_Z0_3 16 3 1 -64.35 5.21 0.99 4.91 23.08 2.41 0.00 -BGO_Z0_3 15 3 1 -54.45 5.21 1.00 3.31 23.06 2.44 0.00 -BGO_Z0_3 14 3 1 -44.55 5.21 1.01 1.45 21.27 2.53 0.00 -BGO_Z0_3 13 3 1 -34.65 5.21 1.00 2.79 22.38 2.47 0.00 -BGO_Z0_3 12 3 1 -24.75 5.21 0.99 4.99 22.04 2.44 0.00 -BGO_Z0_3 11 3 1 -14.85 5.21 0.99 4.34 20.43 2.56 0.00 -BGO_Z0_3 10 3 1 -4.95 5.21 0.99 4.07 22.58 2.46 0.00 -BGO_Z0_3 9 3 1 4.95 5.21 0.98 6.53 22.85 2.38 0.00 -BGO_Z0_3 8 3 1 14.85 5.21 1.00 3.59 21.27 2.53 0.00 -BGO_Z0_3 7 3 1 24.75 5.21 1.00 2.93 20.72 2.42 0.00 -BGO_Z0_3 6 3 1 34.65 5.21 0.98 5.76 20.92 2.49 0.00 -BGO_Z0_3 5 3 1 44.55 5.21 1.00 4.71 22.89 2.38 0.00 -BGO_Z0_3 4 3 1 54.45 5.21 1.02 2.56 18.83 2.60 0.00 -BGO_Z0_3 3 3 1 64.35 5.21 1.04 2.31 23.23 2.37 0.04 -BGO_Z0_3 2 3 1 74.25 5.21 1.04 5.71 21.76 2.69 0.00 -BGO_Z0_3 1 3 1 84.15 5.21 1.08 4.19 18.85 3.23 0.00 -BGO_Z0_3 0 3 1 94.05 5.21 1.07 2.68 12.90 3.35 0.26 -BGO_Z0_3 19 4 1 -94.05 15.64 0.99 4.42 24.52 2.34 0.00 -BGO_Z0_3 18 4 1 -84.15 15.64 0.99 4.83 22.83 2.45 0.00 -BGO_Z0_3 17 4 1 -74.25 15.64 0.99 3.94 24.55 2.31 0.00 -BGO_Z0_3 16 4 1 -64.35 15.64 1.00 3.27 23.09 2.40 0.00 -BGO_Z0_3 15 4 1 -54.45 15.64 1.00 2.87 25.25 2.19 0.04 -BGO_Z0_3 14 4 1 -44.55 15.64 1.00 2.81 24.70 2.16 0.03 -BGO_Z0_3 13 4 1 -34.65 15.64 1.00 3.62 23.87 2.29 0.03 -BGO_Z0_3 12 4 1 -24.75 15.64 1.00 3.60 21.41 2.51 0.00 -BGO_Z0_3 11 4 1 -14.85 15.64 1.00 3.18 21.47 2.52 0.00 -BGO_Z0_3 10 4 1 -4.95 15.64 1.00 3.79 21.51 2.39 0.00 -BGO_Z0_3 9 4 1 4.95 15.64 1.01 1.73 20.66 2.54 0.00 -BGO_Z0_3 8 4 1 14.85 15.64 0.99 4.11 23.12 2.44 0.00 -BGO_Z0_3 7 4 1 24.75 15.64 1.00 3.62 22.89 2.39 0.00 -BGO_Z0_3 6 4 1 34.65 15.64 0.99 4.61 24.85 2.27 0.00 -BGO_Z0_3 5 4 1 44.55 15.64 1.01 1.67 24.41 2.36 0.00 -BGO_Z0_3 4 4 1 54.45 15.64 1.00 3.76 20.49 2.47 0.00 -BGO_Z0_3 3 4 1 64.35 15.64 1.00 3.38 20.60 2.62 0.00 -BGO_Z0_3 2 4 1 74.25 15.64 1.01 2.78 19.05 2.64 0.00 -BGO_Z0_3 1 4 1 84.15 15.64 0.97 4.26 18.30 2.74 0.04 -BGO_Z0_3 0 4 1 94.05 15.64 0.93 4.30 26.83 2.11 0.07 -BGO_Z0_3 19 5 1 -94.05 26.07 0.98 5.18 19.51 2.48 0.00 -BGO_Z0_3 18 5 1 -84.15 26.07 1.01 2.62 22.79 2.42 0.00 -BGO_Z0_3 17 5 1 -74.25 26.07 1.00 3.30 22.09 2.39 0.00 -BGO_Z0_3 16 5 1 -64.35 26.07 0.98 6.39 21.87 2.56 0.00 -BGO_Z0_3 15 5 1 -54.45 26.07 1.00 2.90 21.99 2.47 0.00 -BGO_Z0_3 14 5 1 -44.55 26.07 1.00 4.83 22.96 2.38 0.00 -BGO_Z0_3 13 5 1 -34.65 26.07 1.02 1.64 22.43 2.45 0.00 -BGO_Z0_3 12 5 1 -24.75 26.07 1.00 2.60 21.11 2.49 0.03 -BGO_Z0_3 11 5 1 -14.85 26.07 1.00 2.99 23.66 2.46 0.00 -BGO_Z0_3 10 5 1 -4.95 26.07 0.98 5.49 22.69 2.41 0.00 -BGO_Z0_3 9 5 1 4.95 26.07 1.01 2.74 22.55 2.42 0.02 -BGO_Z0_3 8 5 1 14.85 26.07 1.00 3.26 23.08 2.13 0.04 -BGO_Z0_3 7 5 1 24.75 26.07 0.98 5.45 22.69 2.44 0.00 -BGO_Z0_3 6 5 1 34.65 26.07 1.00 2.84 20.67 2.46 0.00 -BGO_Z0_3 5 5 1 44.55 26.07 0.99 4.03 23.26 2.40 0.00 -BGO_Z0_3 4 5 1 54.45 26.07 0.98 4.18 25.77 2.23 0.00 -BGO_Z0_3 3 5 1 64.35 26.07 0.95 5.66 19.76 2.56 0.00 -BGO_Z0_3 2 5 1 74.25 26.07 0.95 2.68 21.09 2.46 0.00 -BGO_Z0_3 1 5 1 84.15 26.07 0.92 5.37 25.12 2.13 0.05 -BGO_Z0_3 0 5 1 94.05 26.07 0.93 4.54 22.13 2.49 0.00 -BGO_Z0_3 19 0 2 -94.05 -26.07 0.98 5.18 19.51 2.48 0.00 -BGO_Z0_3 18 0 2 -84.15 -26.07 1.01 2.62 22.79 2.42 0.00 -BGO_Z0_3 17 0 2 -74.25 -26.07 1.00 3.30 22.09 2.39 0.00 -BGO_Z0_3 16 0 2 -64.35 -26.07 0.98 6.39 21.87 2.56 0.00 -BGO_Z0_3 15 0 2 -54.45 -26.07 1.00 2.90 21.99 2.47 0.00 -BGO_Z0_3 14 0 2 -44.55 -26.07 1.00 4.83 22.96 2.38 0.00 -BGO_Z0_3 13 0 2 -34.65 -26.07 1.02 1.64 22.43 2.45 0.00 -BGO_Z0_3 12 0 2 -24.75 -26.07 1.00 2.60 21.11 2.49 0.03 -BGO_Z0_3 11 0 2 -14.85 -26.07 1.00 2.99 23.66 2.46 0.00 -BGO_Z0_3 10 0 2 -4.95 -26.07 0.98 5.49 22.69 2.41 0.00 -BGO_Z0_3 9 0 2 4.95 -26.07 1.01 2.74 22.55 2.42 0.02 -BGO_Z0_3 8 0 2 14.85 -26.07 1.00 3.26 23.08 2.13 0.04 -BGO_Z0_3 7 0 2 24.75 -26.07 0.98 5.45 22.69 2.44 0.00 -BGO_Z0_3 6 0 2 34.65 -26.07 1.00 2.84 20.67 2.46 0.00 -BGO_Z0_3 5 0 2 44.55 -26.07 0.99 4.03 23.26 2.40 0.00 -BGO_Z0_3 4 0 2 54.45 -26.07 0.98 4.18 25.77 2.23 0.00 -BGO_Z0_3 3 0 2 64.35 -26.07 0.95 5.66 19.76 2.56 0.00 -BGO_Z0_3 2 0 2 74.25 -26.07 0.95 2.68 21.09 2.46 0.00 -BGO_Z0_3 1 0 2 84.15 -26.07 0.92 5.37 25.12 2.13 0.05 -BGO_Z0_3 0 0 2 94.05 -26.07 0.93 4.54 22.13 2.49 0.00 -BGO_Z0_3 19 1 2 -94.05 -15.64 0.99 4.42 24.52 2.34 0.00 -BGO_Z0_3 18 1 2 -84.15 -15.64 0.99 4.83 22.83 2.45 0.00 -BGO_Z0_3 17 1 2 -74.25 -15.64 0.99 3.94 24.55 2.31 0.00 -BGO_Z0_3 16 1 2 -64.35 -15.64 1.00 3.27 23.09 2.40 0.00 -BGO_Z0_3 15 1 2 -54.45 -15.64 1.00 2.87 25.25 2.19 0.04 -BGO_Z0_3 14 1 2 -44.55 -15.64 1.00 2.81 24.70 2.16 0.03 -BGO_Z0_3 13 1 2 -34.65 -15.64 1.00 3.62 23.87 2.29 0.03 -BGO_Z0_3 12 1 2 -24.75 -15.64 1.00 3.60 21.41 2.51 0.00 -BGO_Z0_3 11 1 2 -14.85 -15.64 1.00 3.18 21.47 2.52 0.00 -BGO_Z0_3 10 1 2 -4.95 -15.64 1.00 3.79 21.51 2.39 0.00 -BGO_Z0_3 9 1 2 4.95 -15.64 1.01 1.73 20.66 2.54 0.00 -BGO_Z0_3 8 1 2 14.85 -15.64 0.99 4.11 23.12 2.44 0.00 -BGO_Z0_3 7 1 2 24.75 -15.64 1.00 3.62 22.89 2.39 0.00 -BGO_Z0_3 6 1 2 34.65 -15.64 0.99 4.61 24.85 2.27 0.00 -BGO_Z0_3 5 1 2 44.55 -15.64 1.01 1.67 24.41 2.36 0.00 -BGO_Z0_3 4 1 2 54.45 -15.64 1.00 3.76 20.49 2.47 0.00 -BGO_Z0_3 3 1 2 64.35 -15.64 1.00 3.38 20.60 2.62 0.00 -BGO_Z0_3 2 1 2 74.25 -15.64 1.01 2.78 19.05 2.64 0.00 -BGO_Z0_3 1 1 2 84.15 -15.64 0.97 4.26 18.30 2.74 0.04 -BGO_Z0_3 0 1 2 94.05 -15.64 0.93 4.30 26.83 2.11 0.07 -BGO_Z0_3 19 2 2 -94.05 -5.21 1.00 3.82 21.07 2.32 0.04 -BGO_Z0_3 18 2 2 -84.15 -5.21 1.01 2.64 19.57 2.62 0.00 -BGO_Z0_3 17 2 2 -74.25 -5.21 1.00 4.13 23.64 2.45 0.00 -BGO_Z0_3 16 2 2 -64.35 -5.21 0.99 4.91 23.08 2.41 0.00 -BGO_Z0_3 15 2 2 -54.45 -5.21 1.00 3.31 23.06 2.44 0.00 -BGO_Z0_3 14 2 2 -44.55 -5.21 1.01 1.45 21.27 2.53 0.00 -BGO_Z0_3 13 2 2 -34.65 -5.21 1.00 2.79 22.38 2.47 0.00 -BGO_Z0_3 12 2 2 -24.75 -5.21 0.99 4.99 22.04 2.44 0.00 -BGO_Z0_3 11 2 2 -14.85 -5.21 0.99 4.34 20.43 2.56 0.00 -BGO_Z0_3 10 2 2 -4.95 -5.21 0.99 4.07 22.58 2.46 0.00 -BGO_Z0_3 9 2 2 4.95 -5.21 0.98 6.53 22.85 2.38 0.00 -BGO_Z0_3 8 2 2 14.85 -5.21 1.00 3.59 21.27 2.53 0.00 -BGO_Z0_3 7 2 2 24.75 -5.21 1.00 2.93 20.72 2.42 0.00 -BGO_Z0_3 6 2 2 34.65 -5.21 0.98 5.76 20.92 2.49 0.00 -BGO_Z0_3 5 2 2 44.55 -5.21 1.00 4.71 22.89 2.38 0.00 -BGO_Z0_3 4 2 2 54.45 -5.21 1.02 2.56 18.83 2.60 0.00 -BGO_Z0_3 3 2 2 64.35 -5.21 1.04 2.31 23.23 2.37 0.04 -BGO_Z0_3 2 2 2 74.25 -5.21 1.04 5.71 21.76 2.69 0.00 -BGO_Z0_3 1 2 2 84.15 -5.21 1.08 4.19 18.85 3.23 0.00 -BGO_Z0_3 0 2 2 94.05 -5.21 1.07 2.68 12.90 3.35 0.26 -BGO_Z0_3 19 3 2 -94.05 5.21 1.00 3.82 21.07 2.32 0.04 -BGO_Z0_3 18 3 2 -84.15 5.21 1.01 2.64 19.57 2.62 0.00 -BGO_Z0_3 17 3 2 -74.25 5.21 1.00 4.13 23.64 2.45 0.00 -BGO_Z0_3 16 3 2 -64.35 5.21 0.99 4.91 23.08 2.41 0.00 -BGO_Z0_3 15 3 2 -54.45 5.21 1.00 3.31 23.06 2.44 0.00 -BGO_Z0_3 14 3 2 -44.55 5.21 1.01 1.45 21.27 2.53 0.00 -BGO_Z0_3 13 3 2 -34.65 5.21 1.00 2.79 22.38 2.47 0.00 -BGO_Z0_3 12 3 2 -24.75 5.21 0.99 4.99 22.04 2.44 0.00 -BGO_Z0_3 11 3 2 -14.85 5.21 0.99 4.34 20.43 2.56 0.00 -BGO_Z0_3 10 3 2 -4.95 5.21 0.99 4.07 22.58 2.46 0.00 -BGO_Z0_3 9 3 2 4.95 5.21 0.98 6.53 22.85 2.38 0.00 -BGO_Z0_3 8 3 2 14.85 5.21 1.00 3.59 21.27 2.53 0.00 -BGO_Z0_3 7 3 2 24.75 5.21 1.00 2.93 20.72 2.42 0.00 -BGO_Z0_3 6 3 2 34.65 5.21 0.98 5.76 20.92 2.49 0.00 -BGO_Z0_3 5 3 2 44.55 5.21 1.00 4.71 22.89 2.38 0.00 -BGO_Z0_3 4 3 2 54.45 5.21 1.02 2.56 18.83 2.60 0.00 -BGO_Z0_3 3 3 2 64.35 5.21 1.04 2.31 23.23 2.37 0.04 -BGO_Z0_3 2 3 2 74.25 5.21 1.04 5.71 21.76 2.69 0.00 -BGO_Z0_3 1 3 2 84.15 5.21 1.08 4.19 18.85 3.23 0.00 -BGO_Z0_3 0 3 2 94.05 5.21 1.07 2.68 12.90 3.35 0.26 -BGO_Z0_3 19 4 2 -94.05 15.64 0.99 4.42 24.52 2.34 0.00 -BGO_Z0_3 18 4 2 -84.15 15.64 0.99 4.83 22.83 2.45 0.00 -BGO_Z0_3 17 4 2 -74.25 15.64 0.99 3.94 24.55 2.31 0.00 -BGO_Z0_3 16 4 2 -64.35 15.64 1.00 3.27 23.09 2.40 0.00 -BGO_Z0_3 15 4 2 -54.45 15.64 1.00 2.87 25.25 2.19 0.04 -BGO_Z0_3 14 4 2 -44.55 15.64 1.00 2.81 24.70 2.16 0.03 -BGO_Z0_3 13 4 2 -34.65 15.64 1.00 3.62 23.87 2.29 0.03 -BGO_Z0_3 12 4 2 -24.75 15.64 1.00 3.60 21.41 2.51 0.00 -BGO_Z0_3 11 4 2 -14.85 15.64 1.00 3.18 21.47 2.52 0.00 -BGO_Z0_3 10 4 2 -4.95 15.64 1.00 3.79 21.51 2.39 0.00 -BGO_Z0_3 9 4 2 4.95 15.64 1.01 1.73 20.66 2.54 0.00 -BGO_Z0_3 8 4 2 14.85 15.64 0.99 4.11 23.12 2.44 0.00 -BGO_Z0_3 7 4 2 24.75 15.64 1.00 3.62 22.89 2.39 0.00 -BGO_Z0_3 6 4 2 34.65 15.64 0.99 4.61 24.85 2.27 0.00 -BGO_Z0_3 5 4 2 44.55 15.64 1.01 1.67 24.41 2.36 0.00 -BGO_Z0_3 4 4 2 54.45 15.64 1.00 3.76 20.49 2.47 0.00 -BGO_Z0_3 3 4 2 64.35 15.64 1.00 3.38 20.60 2.62 0.00 -BGO_Z0_3 2 4 2 74.25 15.64 1.01 2.78 19.05 2.64 0.00 -BGO_Z0_3 1 4 2 84.15 15.64 0.97 4.26 18.30 2.74 0.04 -BGO_Z0_3 0 4 2 94.05 15.64 0.93 4.30 26.83 2.11 0.07 -BGO_Z0_3 19 5 2 -94.05 26.07 0.98 5.18 19.51 2.48 0.00 -BGO_Z0_3 18 5 2 -84.15 26.07 1.01 2.62 22.79 2.42 0.00 -BGO_Z0_3 17 5 2 -74.25 26.07 1.00 3.30 22.09 2.39 0.00 -BGO_Z0_3 16 5 2 -64.35 26.07 0.98 6.39 21.87 2.56 0.00 -BGO_Z0_3 15 5 2 -54.45 26.07 1.00 2.90 21.99 2.47 0.00 -BGO_Z0_3 14 5 2 -44.55 26.07 1.00 4.83 22.96 2.38 0.00 -BGO_Z0_3 13 5 2 -34.65 26.07 1.02 1.64 22.43 2.45 0.00 -BGO_Z0_3 12 5 2 -24.75 26.07 1.00 2.60 21.11 2.49 0.03 -BGO_Z0_3 11 5 2 -14.85 26.07 1.00 2.99 23.66 2.46 0.00 -BGO_Z0_3 10 5 2 -4.95 26.07 0.98 5.49 22.69 2.41 0.00 -BGO_Z0_3 9 5 2 4.95 26.07 1.01 2.74 22.55 2.42 0.02 -BGO_Z0_3 8 5 2 14.85 26.07 1.00 3.26 23.08 2.13 0.04 -BGO_Z0_3 7 5 2 24.75 26.07 0.98 5.45 22.69 2.44 0.00 -BGO_Z0_3 6 5 2 34.65 26.07 1.00 2.84 20.67 2.46 0.00 -BGO_Z0_3 5 5 2 44.55 26.07 0.99 4.03 23.26 2.40 0.00 -BGO_Z0_3 4 5 2 54.45 26.07 0.98 4.18 25.77 2.23 0.00 -BGO_Z0_3 3 5 2 64.35 26.07 0.95 5.66 19.76 2.56 0.00 -BGO_Z0_3 2 5 2 74.25 26.07 0.95 2.68 21.09 2.46 0.00 -BGO_Z0_3 1 5 2 84.15 26.07 0.92 5.37 25.12 2.13 0.05 -BGO_Z0_3 0 5 2 94.05 26.07 0.93 4.54 22.13 2.49 0.00 -BGO_Z0_4 19 0 0 -94.05 -26.07 0.98 5.18 19.51 2.48 0.00 -BGO_Z0_4 18 0 0 -84.15 -26.07 1.01 2.62 22.79 2.42 0.00 -BGO_Z0_4 17 0 0 -74.25 -26.07 1.00 3.30 22.09 2.39 0.00 -BGO_Z0_4 16 0 0 -64.35 -26.07 0.98 6.39 21.87 2.56 0.00 -BGO_Z0_4 15 0 0 -54.45 -26.07 1.00 2.90 21.99 2.47 0.00 -BGO_Z0_4 14 0 0 -44.55 -26.07 1.00 4.83 22.96 2.38 0.00 -BGO_Z0_4 13 0 0 -34.65 -26.07 1.02 1.64 22.43 2.45 0.00 -BGO_Z0_4 12 0 0 -24.75 -26.07 1.00 2.60 21.11 2.49 0.03 -BGO_Z0_4 11 0 0 -14.85 -26.07 1.00 2.99 23.66 2.46 0.00 -BGO_Z0_4 10 0 0 -4.95 -26.07 0.98 5.49 22.69 2.41 0.00 -BGO_Z0_4 9 0 0 4.95 -26.07 1.01 2.74 22.55 2.42 0.02 -BGO_Z0_4 8 0 0 14.85 -26.07 1.00 3.26 23.08 2.13 0.04 -BGO_Z0_4 7 0 0 24.75 -26.07 0.98 5.45 22.69 2.44 0.00 -BGO_Z0_4 6 0 0 34.65 -26.07 1.00 2.84 20.67 2.46 0.00 -BGO_Z0_4 5 0 0 44.55 -26.07 0.99 4.03 23.26 2.40 0.00 -BGO_Z0_4 4 0 0 54.45 -26.07 0.98 4.18 25.77 2.23 0.00 -BGO_Z0_4 3 0 0 64.35 -26.07 0.95 5.66 19.76 2.56 0.00 -BGO_Z0_4 2 0 0 74.25 -26.07 0.95 2.68 21.09 2.46 0.00 -BGO_Z0_4 1 0 0 84.15 -26.07 0.92 5.37 25.12 2.13 0.05 -BGO_Z0_4 0 0 0 94.05 -26.07 0.93 4.54 22.13 2.49 0.00 -BGO_Z0_4 19 1 0 -94.05 -15.64 0.99 4.42 24.52 2.34 0.00 -BGO_Z0_4 18 1 0 -84.15 -15.64 0.99 4.83 22.83 2.45 0.00 -BGO_Z0_4 17 1 0 -74.25 -15.64 0.99 3.94 24.55 2.31 0.00 -BGO_Z0_4 16 1 0 -64.35 -15.64 1.00 3.27 23.09 2.40 0.00 -BGO_Z0_4 15 1 0 -54.45 -15.64 1.00 2.87 25.25 2.19 0.04 -BGO_Z0_4 14 1 0 -44.55 -15.64 1.00 2.81 24.70 2.16 0.03 -BGO_Z0_4 13 1 0 -34.65 -15.64 1.00 3.62 23.87 2.29 0.03 -BGO_Z0_4 12 1 0 -24.75 -15.64 1.00 3.60 21.41 2.51 0.00 -BGO_Z0_4 11 1 0 -14.85 -15.64 1.00 3.18 21.47 2.52 0.00 -BGO_Z0_4 10 1 0 -4.95 -15.64 1.00 3.79 21.51 2.39 0.00 -BGO_Z0_4 9 1 0 4.95 -15.64 1.01 1.73 20.66 2.54 0.00 -BGO_Z0_4 8 1 0 14.85 -15.64 0.99 4.11 23.12 2.44 0.00 -BGO_Z0_4 7 1 0 24.75 -15.64 1.00 3.62 22.89 2.39 0.00 -BGO_Z0_4 6 1 0 34.65 -15.64 0.99 4.61 24.85 2.27 0.00 -BGO_Z0_4 5 1 0 44.55 -15.64 1.01 1.67 24.41 2.36 0.00 -BGO_Z0_4 4 1 0 54.45 -15.64 1.00 3.76 20.49 2.47 0.00 -BGO_Z0_4 3 1 0 64.35 -15.64 1.00 3.38 20.60 2.62 0.00 -BGO_Z0_4 2 1 0 74.25 -15.64 1.01 2.78 19.05 2.64 0.00 -BGO_Z0_4 1 1 0 84.15 -15.64 0.97 4.26 18.30 2.74 0.04 -BGO_Z0_4 0 1 0 94.05 -15.64 0.93 4.30 26.83 2.11 0.07 -BGO_Z0_4 19 2 0 -94.05 -5.21 1.00 3.82 21.07 2.32 0.04 -BGO_Z0_4 18 2 0 -84.15 -5.21 1.01 2.64 19.57 2.62 0.00 -BGO_Z0_4 17 2 0 -74.25 -5.21 1.00 4.13 23.64 2.45 0.00 -BGO_Z0_4 16 2 0 -64.35 -5.21 0.99 4.91 23.08 2.41 0.00 -BGO_Z0_4 15 2 0 -54.45 -5.21 1.00 3.31 23.06 2.44 0.00 -BGO_Z0_4 14 2 0 -44.55 -5.21 1.01 1.45 21.27 2.53 0.00 -BGO_Z0_4 13 2 0 -34.65 -5.21 1.00 2.79 22.38 2.47 0.00 -BGO_Z0_4 12 2 0 -24.75 -5.21 0.99 4.99 22.04 2.44 0.00 -BGO_Z0_4 11 2 0 -14.85 -5.21 0.99 4.34 20.43 2.56 0.00 -BGO_Z0_4 10 2 0 -4.95 -5.21 0.99 4.07 22.58 2.46 0.00 -BGO_Z0_4 9 2 0 4.95 -5.21 0.98 6.53 22.85 2.38 0.00 -BGO_Z0_4 8 2 0 14.85 -5.21 1.00 3.59 21.27 2.53 0.00 -BGO_Z0_4 7 2 0 24.75 -5.21 1.00 2.93 20.72 2.42 0.00 -BGO_Z0_4 6 2 0 34.65 -5.21 0.98 5.76 20.92 2.49 0.00 -BGO_Z0_4 5 2 0 44.55 -5.21 1.00 4.71 22.89 2.38 0.00 -BGO_Z0_4 4 2 0 54.45 -5.21 1.02 2.56 18.83 2.60 0.00 -BGO_Z0_4 3 2 0 64.35 -5.21 1.04 2.31 23.23 2.37 0.04 -BGO_Z0_4 2 2 0 74.25 -5.21 1.04 5.71 21.76 2.69 0.00 -BGO_Z0_4 1 2 0 84.15 -5.21 1.08 4.19 18.85 3.23 0.00 -BGO_Z0_4 0 2 0 94.05 -5.21 1.07 2.68 12.90 3.35 0.26 -BGO_Z0_4 19 3 0 -94.05 5.21 1.00 3.82 21.07 2.32 0.04 -BGO_Z0_4 18 3 0 -84.15 5.21 1.01 2.64 19.57 2.62 0.00 -BGO_Z0_4 17 3 0 -74.25 5.21 1.00 4.13 23.64 2.45 0.00 -BGO_Z0_4 16 3 0 -64.35 5.21 0.99 4.91 23.08 2.41 0.00 -BGO_Z0_4 15 3 0 -54.45 5.21 1.00 3.31 23.06 2.44 0.00 -BGO_Z0_4 14 3 0 -44.55 5.21 1.01 1.45 21.27 2.53 0.00 -BGO_Z0_4 13 3 0 -34.65 5.21 1.00 2.79 22.38 2.47 0.00 -BGO_Z0_4 12 3 0 -24.75 5.21 0.99 4.99 22.04 2.44 0.00 -BGO_Z0_4 11 3 0 -14.85 5.21 0.99 4.34 20.43 2.56 0.00 -BGO_Z0_4 10 3 0 -4.95 5.21 0.99 4.07 22.58 2.46 0.00 -BGO_Z0_4 9 3 0 4.95 5.21 0.98 6.53 22.85 2.38 0.00 -BGO_Z0_4 8 3 0 14.85 5.21 1.00 3.59 21.27 2.53 0.00 -BGO_Z0_4 7 3 0 24.75 5.21 1.00 2.93 20.72 2.42 0.00 -BGO_Z0_4 6 3 0 34.65 5.21 0.98 5.76 20.92 2.49 0.00 -BGO_Z0_4 5 3 0 44.55 5.21 1.00 4.71 22.89 2.38 0.00 -BGO_Z0_4 4 3 0 54.45 5.21 1.02 2.56 18.83 2.60 0.00 -BGO_Z0_4 3 3 0 64.35 5.21 1.04 2.31 23.23 2.37 0.04 -BGO_Z0_4 2 3 0 74.25 5.21 1.04 5.71 21.76 2.69 0.00 -BGO_Z0_4 1 3 0 84.15 5.21 1.08 4.19 18.85 3.23 0.00 -BGO_Z0_4 0 3 0 94.05 5.21 1.07 2.68 12.90 3.35 0.26 -BGO_Z0_4 19 4 0 -94.05 15.64 0.99 4.42 24.52 2.34 0.00 -BGO_Z0_4 18 4 0 -84.15 15.64 0.99 4.83 22.83 2.45 0.00 -BGO_Z0_4 17 4 0 -74.25 15.64 0.99 3.94 24.55 2.31 0.00 -BGO_Z0_4 16 4 0 -64.35 15.64 1.00 3.27 23.09 2.40 0.00 -BGO_Z0_4 15 4 0 -54.45 15.64 1.00 2.87 25.25 2.19 0.04 -BGO_Z0_4 14 4 0 -44.55 15.64 1.00 2.81 24.70 2.16 0.03 -BGO_Z0_4 13 4 0 -34.65 15.64 1.00 3.62 23.87 2.29 0.03 -BGO_Z0_4 12 4 0 -24.75 15.64 1.00 3.60 21.41 2.51 0.00 -BGO_Z0_4 11 4 0 -14.85 15.64 1.00 3.18 21.47 2.52 0.00 -BGO_Z0_4 10 4 0 -4.95 15.64 1.00 3.79 21.51 2.39 0.00 -BGO_Z0_4 9 4 0 4.95 15.64 1.01 1.73 20.66 2.54 0.00 -BGO_Z0_4 8 4 0 14.85 15.64 0.99 4.11 23.12 2.44 0.00 -BGO_Z0_4 7 4 0 24.75 15.64 1.00 3.62 22.89 2.39 0.00 -BGO_Z0_4 6 4 0 34.65 15.64 0.99 4.61 24.85 2.27 0.00 -BGO_Z0_4 5 4 0 44.55 15.64 1.01 1.67 24.41 2.36 0.00 -BGO_Z0_4 4 4 0 54.45 15.64 1.00 3.76 20.49 2.47 0.00 -BGO_Z0_4 3 4 0 64.35 15.64 1.00 3.38 20.60 2.62 0.00 -BGO_Z0_4 2 4 0 74.25 15.64 1.01 2.78 19.05 2.64 0.00 -BGO_Z0_4 1 4 0 84.15 15.64 0.97 4.26 18.30 2.74 0.04 -BGO_Z0_4 0 4 0 94.05 15.64 0.93 4.30 26.83 2.11 0.07 -BGO_Z0_4 19 5 0 -94.05 26.07 0.98 5.18 19.51 2.48 0.00 -BGO_Z0_4 18 5 0 -84.15 26.07 1.01 2.62 22.79 2.42 0.00 -BGO_Z0_4 17 5 0 -74.25 26.07 1.00 3.30 22.09 2.39 0.00 -BGO_Z0_4 16 5 0 -64.35 26.07 0.98 6.39 21.87 2.56 0.00 -BGO_Z0_4 15 5 0 -54.45 26.07 1.00 2.90 21.99 2.47 0.00 -BGO_Z0_4 14 5 0 -44.55 26.07 1.00 4.83 22.96 2.38 0.00 -BGO_Z0_4 13 5 0 -34.65 26.07 1.02 1.64 22.43 2.45 0.00 -BGO_Z0_4 12 5 0 -24.75 26.07 1.00 2.60 21.11 2.49 0.03 -BGO_Z0_4 11 5 0 -14.85 26.07 1.00 2.99 23.66 2.46 0.00 -BGO_Z0_4 10 5 0 -4.95 26.07 0.98 5.49 22.69 2.41 0.00 -BGO_Z0_4 9 5 0 4.95 26.07 1.01 2.74 22.55 2.42 0.02 -BGO_Z0_4 8 5 0 14.85 26.07 1.00 3.26 23.08 2.13 0.04 -BGO_Z0_4 7 5 0 24.75 26.07 0.98 5.45 22.69 2.44 0.00 -BGO_Z0_4 6 5 0 34.65 26.07 1.00 2.84 20.67 2.46 0.00 -BGO_Z0_4 5 5 0 44.55 26.07 0.99 4.03 23.26 2.40 0.00 -BGO_Z0_4 4 5 0 54.45 26.07 0.98 4.18 25.77 2.23 0.00 -BGO_Z0_4 3 5 0 64.35 26.07 0.95 5.66 19.76 2.56 0.00 -BGO_Z0_4 2 5 0 74.25 26.07 0.95 2.68 21.09 2.46 0.00 -BGO_Z0_4 1 5 0 84.15 26.07 0.92 5.37 25.12 2.13 0.05 -BGO_Z0_4 0 5 0 94.05 26.07 0.93 4.54 22.13 2.49 0.00 -BGO_Z0_4 19 0 1 -94.05 -26.07 0.98 5.18 19.51 2.48 0.00 -BGO_Z0_4 18 0 1 -84.15 -26.07 1.01 2.62 22.79 2.42 0.00 -BGO_Z0_4 17 0 1 -74.25 -26.07 1.00 3.30 22.09 2.39 0.00 -BGO_Z0_4 16 0 1 -64.35 -26.07 0.98 6.39 21.87 2.56 0.00 -BGO_Z0_4 15 0 1 -54.45 -26.07 1.00 2.90 21.99 2.47 0.00 -BGO_Z0_4 14 0 1 -44.55 -26.07 1.00 4.83 22.96 2.38 0.00 -BGO_Z0_4 13 0 1 -34.65 -26.07 1.02 1.64 22.43 2.45 0.00 -BGO_Z0_4 12 0 1 -24.75 -26.07 1.00 2.60 21.11 2.49 0.03 -BGO_Z0_4 11 0 1 -14.85 -26.07 1.00 2.99 23.66 2.46 0.00 -BGO_Z0_4 10 0 1 -4.95 -26.07 0.98 5.49 22.69 2.41 0.00 -BGO_Z0_4 9 0 1 4.95 -26.07 1.01 2.74 22.55 2.42 0.02 -BGO_Z0_4 8 0 1 14.85 -26.07 1.00 3.26 23.08 2.13 0.04 -BGO_Z0_4 7 0 1 24.75 -26.07 0.98 5.45 22.69 2.44 0.00 -BGO_Z0_4 6 0 1 34.65 -26.07 1.00 2.84 20.67 2.46 0.00 -BGO_Z0_4 5 0 1 44.55 -26.07 0.99 4.03 23.26 2.40 0.00 -BGO_Z0_4 4 0 1 54.45 -26.07 0.98 4.18 25.77 2.23 0.00 -BGO_Z0_4 3 0 1 64.35 -26.07 0.95 5.66 19.76 2.56 0.00 -BGO_Z0_4 2 0 1 74.25 -26.07 0.95 2.68 21.09 2.46 0.00 -BGO_Z0_4 1 0 1 84.15 -26.07 0.92 5.37 25.12 2.13 0.05 -BGO_Z0_4 0 0 1 94.05 -26.07 0.93 4.54 22.13 2.49 0.00 -BGO_Z0_4 19 1 1 -94.05 -15.64 0.99 4.42 24.52 2.34 0.00 -BGO_Z0_4 18 1 1 -84.15 -15.64 0.99 4.83 22.83 2.45 0.00 -BGO_Z0_4 17 1 1 -74.25 -15.64 0.99 3.94 24.55 2.31 0.00 -BGO_Z0_4 16 1 1 -64.35 -15.64 1.00 3.27 23.09 2.40 0.00 -BGO_Z0_4 15 1 1 -54.45 -15.64 1.00 2.87 25.25 2.19 0.04 -BGO_Z0_4 14 1 1 -44.55 -15.64 1.00 2.81 24.70 2.16 0.03 -BGO_Z0_4 13 1 1 -34.65 -15.64 1.00 3.62 23.87 2.29 0.03 -BGO_Z0_4 12 1 1 -24.75 -15.64 1.00 3.60 21.41 2.51 0.00 -BGO_Z0_4 11 1 1 -14.85 -15.64 1.00 3.18 21.47 2.52 0.00 -BGO_Z0_4 10 1 1 -4.95 -15.64 1.00 3.79 21.51 2.39 0.00 -BGO_Z0_4 9 1 1 4.95 -15.64 1.01 1.73 20.66 2.54 0.00 -BGO_Z0_4 8 1 1 14.85 -15.64 0.99 4.11 23.12 2.44 0.00 -BGO_Z0_4 7 1 1 24.75 -15.64 1.00 3.62 22.89 2.39 0.00 -BGO_Z0_4 6 1 1 34.65 -15.64 0.99 4.61 24.85 2.27 0.00 -BGO_Z0_4 5 1 1 44.55 -15.64 1.01 1.67 24.41 2.36 0.00 -BGO_Z0_4 4 1 1 54.45 -15.64 1.00 3.76 20.49 2.47 0.00 -BGO_Z0_4 3 1 1 64.35 -15.64 1.00 3.38 20.60 2.62 0.00 -BGO_Z0_4 2 1 1 74.25 -15.64 1.01 2.78 19.05 2.64 0.00 -BGO_Z0_4 1 1 1 84.15 -15.64 0.97 4.26 18.30 2.74 0.04 -BGO_Z0_4 0 1 1 94.05 -15.64 0.93 4.30 26.83 2.11 0.07 -BGO_Z0_4 19 2 1 -94.05 -5.21 1.00 3.82 21.07 2.32 0.04 -BGO_Z0_4 18 2 1 -84.15 -5.21 1.01 2.64 19.57 2.62 0.00 -BGO_Z0_4 17 2 1 -74.25 -5.21 1.00 4.13 23.64 2.45 0.00 -BGO_Z0_4 16 2 1 -64.35 -5.21 0.99 4.91 23.08 2.41 0.00 -BGO_Z0_4 15 2 1 -54.45 -5.21 1.00 3.31 23.06 2.44 0.00 -BGO_Z0_4 14 2 1 -44.55 -5.21 1.01 1.45 21.27 2.53 0.00 -BGO_Z0_4 13 2 1 -34.65 -5.21 1.00 2.79 22.38 2.47 0.00 -BGO_Z0_4 12 2 1 -24.75 -5.21 0.99 4.99 22.04 2.44 0.00 -BGO_Z0_4 11 2 1 -14.85 -5.21 0.99 4.34 20.43 2.56 0.00 -BGO_Z0_4 10 2 1 -4.95 -5.21 0.99 4.07 22.58 2.46 0.00 -BGO_Z0_4 9 2 1 4.95 -5.21 0.98 6.53 22.85 2.38 0.00 -BGO_Z0_4 8 2 1 14.85 -5.21 1.00 3.59 21.27 2.53 0.00 -BGO_Z0_4 7 2 1 24.75 -5.21 1.00 2.93 20.72 2.42 0.00 -BGO_Z0_4 6 2 1 34.65 -5.21 0.98 5.76 20.92 2.49 0.00 -BGO_Z0_4 5 2 1 44.55 -5.21 1.00 4.71 22.89 2.38 0.00 -BGO_Z0_4 4 2 1 54.45 -5.21 1.02 2.56 18.83 2.60 0.00 -BGO_Z0_4 3 2 1 64.35 -5.21 1.04 2.31 23.23 2.37 0.04 -BGO_Z0_4 2 2 1 74.25 -5.21 1.04 5.71 21.76 2.69 0.00 -BGO_Z0_4 1 2 1 84.15 -5.21 1.08 4.19 18.85 3.23 0.00 -BGO_Z0_4 0 2 1 94.05 -5.21 1.07 2.68 12.90 3.35 0.26 -BGO_Z0_4 19 3 1 -94.05 5.21 1.00 3.82 21.07 2.32 0.04 -BGO_Z0_4 18 3 1 -84.15 5.21 1.01 2.64 19.57 2.62 0.00 -BGO_Z0_4 17 3 1 -74.25 5.21 1.00 4.13 23.64 2.45 0.00 -BGO_Z0_4 16 3 1 -64.35 5.21 0.99 4.91 23.08 2.41 0.00 -BGO_Z0_4 15 3 1 -54.45 5.21 1.00 3.31 23.06 2.44 0.00 -BGO_Z0_4 14 3 1 -44.55 5.21 1.01 1.45 21.27 2.53 0.00 -BGO_Z0_4 13 3 1 -34.65 5.21 1.00 2.79 22.38 2.47 0.00 -BGO_Z0_4 12 3 1 -24.75 5.21 0.99 4.99 22.04 2.44 0.00 -BGO_Z0_4 11 3 1 -14.85 5.21 0.99 4.34 20.43 2.56 0.00 -BGO_Z0_4 10 3 1 -4.95 5.21 0.99 4.07 22.58 2.46 0.00 -BGO_Z0_4 9 3 1 4.95 5.21 0.98 6.53 22.85 2.38 0.00 -BGO_Z0_4 8 3 1 14.85 5.21 1.00 3.59 21.27 2.53 0.00 -BGO_Z0_4 7 3 1 24.75 5.21 1.00 2.93 20.72 2.42 0.00 -BGO_Z0_4 6 3 1 34.65 5.21 0.98 5.76 20.92 2.49 0.00 -BGO_Z0_4 5 3 1 44.55 5.21 1.00 4.71 22.89 2.38 0.00 -BGO_Z0_4 4 3 1 54.45 5.21 1.02 2.56 18.83 2.60 0.00 -BGO_Z0_4 3 3 1 64.35 5.21 1.04 2.31 23.23 2.37 0.04 -BGO_Z0_4 2 3 1 74.25 5.21 1.04 5.71 21.76 2.69 0.00 -BGO_Z0_4 1 3 1 84.15 5.21 1.08 4.19 18.85 3.23 0.00 -BGO_Z0_4 0 3 1 94.05 5.21 1.07 2.68 12.90 3.35 0.26 -BGO_Z0_4 19 4 1 -94.05 15.64 0.99 4.42 24.52 2.34 0.00 -BGO_Z0_4 18 4 1 -84.15 15.64 0.99 4.83 22.83 2.45 0.00 -BGO_Z0_4 17 4 1 -74.25 15.64 0.99 3.94 24.55 2.31 0.00 -BGO_Z0_4 16 4 1 -64.35 15.64 1.00 3.27 23.09 2.40 0.00 -BGO_Z0_4 15 4 1 -54.45 15.64 1.00 2.87 25.25 2.19 0.04 -BGO_Z0_4 14 4 1 -44.55 15.64 1.00 2.81 24.70 2.16 0.03 -BGO_Z0_4 13 4 1 -34.65 15.64 1.00 3.62 23.87 2.29 0.03 -BGO_Z0_4 12 4 1 -24.75 15.64 1.00 3.60 21.41 2.51 0.00 -BGO_Z0_4 11 4 1 -14.85 15.64 1.00 3.18 21.47 2.52 0.00 -BGO_Z0_4 10 4 1 -4.95 15.64 1.00 3.79 21.51 2.39 0.00 -BGO_Z0_4 9 4 1 4.95 15.64 1.01 1.73 20.66 2.54 0.00 -BGO_Z0_4 8 4 1 14.85 15.64 0.99 4.11 23.12 2.44 0.00 -BGO_Z0_4 7 4 1 24.75 15.64 1.00 3.62 22.89 2.39 0.00 -BGO_Z0_4 6 4 1 34.65 15.64 0.99 4.61 24.85 2.27 0.00 -BGO_Z0_4 5 4 1 44.55 15.64 1.01 1.67 24.41 2.36 0.00 -BGO_Z0_4 4 4 1 54.45 15.64 1.00 3.76 20.49 2.47 0.00 -BGO_Z0_4 3 4 1 64.35 15.64 1.00 3.38 20.60 2.62 0.00 -BGO_Z0_4 2 4 1 74.25 15.64 1.01 2.78 19.05 2.64 0.00 -BGO_Z0_4 1 4 1 84.15 15.64 0.97 4.26 18.30 2.74 0.04 -BGO_Z0_4 0 4 1 94.05 15.64 0.93 4.30 26.83 2.11 0.07 -BGO_Z0_4 19 5 1 -94.05 26.07 0.98 5.18 19.51 2.48 0.00 -BGO_Z0_4 18 5 1 -84.15 26.07 1.01 2.62 22.79 2.42 0.00 -BGO_Z0_4 17 5 1 -74.25 26.07 1.00 3.30 22.09 2.39 0.00 -BGO_Z0_4 16 5 1 -64.35 26.07 0.98 6.39 21.87 2.56 0.00 -BGO_Z0_4 15 5 1 -54.45 26.07 1.00 2.90 21.99 2.47 0.00 -BGO_Z0_4 14 5 1 -44.55 26.07 1.00 4.83 22.96 2.38 0.00 -BGO_Z0_4 13 5 1 -34.65 26.07 1.02 1.64 22.43 2.45 0.00 -BGO_Z0_4 12 5 1 -24.75 26.07 1.00 2.60 21.11 2.49 0.03 -BGO_Z0_4 11 5 1 -14.85 26.07 1.00 2.99 23.66 2.46 0.00 -BGO_Z0_4 10 5 1 -4.95 26.07 0.98 5.49 22.69 2.41 0.00 -BGO_Z0_4 9 5 1 4.95 26.07 1.01 2.74 22.55 2.42 0.02 -BGO_Z0_4 8 5 1 14.85 26.07 1.00 3.26 23.08 2.13 0.04 -BGO_Z0_4 7 5 1 24.75 26.07 0.98 5.45 22.69 2.44 0.00 -BGO_Z0_4 6 5 1 34.65 26.07 1.00 2.84 20.67 2.46 0.00 -BGO_Z0_4 5 5 1 44.55 26.07 0.99 4.03 23.26 2.40 0.00 -BGO_Z0_4 4 5 1 54.45 26.07 0.98 4.18 25.77 2.23 0.00 -BGO_Z0_4 3 5 1 64.35 26.07 0.95 5.66 19.76 2.56 0.00 -BGO_Z0_4 2 5 1 74.25 26.07 0.95 2.68 21.09 2.46 0.00 -BGO_Z0_4 1 5 1 84.15 26.07 0.92 5.37 25.12 2.13 0.05 -BGO_Z0_4 0 5 1 94.05 26.07 0.93 4.54 22.13 2.49 0.00 -BGO_Z0_4 19 0 2 -94.05 -26.07 0.98 5.18 19.51 2.48 0.00 -BGO_Z0_4 18 0 2 -84.15 -26.07 1.01 2.62 22.79 2.42 0.00 -BGO_Z0_4 17 0 2 -74.25 -26.07 1.00 3.30 22.09 2.39 0.00 -BGO_Z0_4 16 0 2 -64.35 -26.07 0.98 6.39 21.87 2.56 0.00 -BGO_Z0_4 15 0 2 -54.45 -26.07 1.00 2.90 21.99 2.47 0.00 -BGO_Z0_4 14 0 2 -44.55 -26.07 1.00 4.83 22.96 2.38 0.00 -BGO_Z0_4 13 0 2 -34.65 -26.07 1.02 1.64 22.43 2.45 0.00 -BGO_Z0_4 12 0 2 -24.75 -26.07 1.00 2.60 21.11 2.49 0.03 -BGO_Z0_4 11 0 2 -14.85 -26.07 1.00 2.99 23.66 2.46 0.00 -BGO_Z0_4 10 0 2 -4.95 -26.07 0.98 5.49 22.69 2.41 0.00 -BGO_Z0_4 9 0 2 4.95 -26.07 1.01 2.74 22.55 2.42 0.02 -BGO_Z0_4 8 0 2 14.85 -26.07 1.00 3.26 23.08 2.13 0.04 -BGO_Z0_4 7 0 2 24.75 -26.07 0.98 5.45 22.69 2.44 0.00 -BGO_Z0_4 6 0 2 34.65 -26.07 1.00 2.84 20.67 2.46 0.00 -BGO_Z0_4 5 0 2 44.55 -26.07 0.99 4.03 23.26 2.40 0.00 -BGO_Z0_4 4 0 2 54.45 -26.07 0.98 4.18 25.77 2.23 0.00 -BGO_Z0_4 3 0 2 64.35 -26.07 0.95 5.66 19.76 2.56 0.00 -BGO_Z0_4 2 0 2 74.25 -26.07 0.95 2.68 21.09 2.46 0.00 -BGO_Z0_4 1 0 2 84.15 -26.07 0.92 5.37 25.12 2.13 0.05 -BGO_Z0_4 0 0 2 94.05 -26.07 0.93 4.54 22.13 2.49 0.00 -BGO_Z0_4 19 1 2 -94.05 -15.64 0.99 4.42 24.52 2.34 0.00 -BGO_Z0_4 18 1 2 -84.15 -15.64 0.99 4.83 22.83 2.45 0.00 -BGO_Z0_4 17 1 2 -74.25 -15.64 0.99 3.94 24.55 2.31 0.00 -BGO_Z0_4 16 1 2 -64.35 -15.64 1.00 3.27 23.09 2.40 0.00 -BGO_Z0_4 15 1 2 -54.45 -15.64 1.00 2.87 25.25 2.19 0.04 -BGO_Z0_4 14 1 2 -44.55 -15.64 1.00 2.81 24.70 2.16 0.03 -BGO_Z0_4 13 1 2 -34.65 -15.64 1.00 3.62 23.87 2.29 0.03 -BGO_Z0_4 12 1 2 -24.75 -15.64 1.00 3.60 21.41 2.51 0.00 -BGO_Z0_4 11 1 2 -14.85 -15.64 1.00 3.18 21.47 2.52 0.00 -BGO_Z0_4 10 1 2 -4.95 -15.64 1.00 3.79 21.51 2.39 0.00 -BGO_Z0_4 9 1 2 4.95 -15.64 1.01 1.73 20.66 2.54 0.00 -BGO_Z0_4 8 1 2 14.85 -15.64 0.99 4.11 23.12 2.44 0.00 -BGO_Z0_4 7 1 2 24.75 -15.64 1.00 3.62 22.89 2.39 0.00 -BGO_Z0_4 6 1 2 34.65 -15.64 0.99 4.61 24.85 2.27 0.00 -BGO_Z0_4 5 1 2 44.55 -15.64 1.01 1.67 24.41 2.36 0.00 -BGO_Z0_4 4 1 2 54.45 -15.64 1.00 3.76 20.49 2.47 0.00 -BGO_Z0_4 3 1 2 64.35 -15.64 1.00 3.38 20.60 2.62 0.00 -BGO_Z0_4 2 1 2 74.25 -15.64 1.01 2.78 19.05 2.64 0.00 -BGO_Z0_4 1 1 2 84.15 -15.64 0.97 4.26 18.30 2.74 0.04 -BGO_Z0_4 0 1 2 94.05 -15.64 0.93 4.30 26.83 2.11 0.07 -BGO_Z0_4 19 2 2 -94.05 -5.21 1.00 3.82 21.07 2.32 0.04 -BGO_Z0_4 18 2 2 -84.15 -5.21 1.01 2.64 19.57 2.62 0.00 -BGO_Z0_4 17 2 2 -74.25 -5.21 1.00 4.13 23.64 2.45 0.00 -BGO_Z0_4 16 2 2 -64.35 -5.21 0.99 4.91 23.08 2.41 0.00 -BGO_Z0_4 15 2 2 -54.45 -5.21 1.00 3.31 23.06 2.44 0.00 -BGO_Z0_4 14 2 2 -44.55 -5.21 1.01 1.45 21.27 2.53 0.00 -BGO_Z0_4 13 2 2 -34.65 -5.21 1.00 2.79 22.38 2.47 0.00 -BGO_Z0_4 12 2 2 -24.75 -5.21 0.99 4.99 22.04 2.44 0.00 -BGO_Z0_4 11 2 2 -14.85 -5.21 0.99 4.34 20.43 2.56 0.00 -BGO_Z0_4 10 2 2 -4.95 -5.21 0.99 4.07 22.58 2.46 0.00 -BGO_Z0_4 9 2 2 4.95 -5.21 0.98 6.53 22.85 2.38 0.00 -BGO_Z0_4 8 2 2 14.85 -5.21 1.00 3.59 21.27 2.53 0.00 -BGO_Z0_4 7 2 2 24.75 -5.21 1.00 2.93 20.72 2.42 0.00 -BGO_Z0_4 6 2 2 34.65 -5.21 0.98 5.76 20.92 2.49 0.00 -BGO_Z0_4 5 2 2 44.55 -5.21 1.00 4.71 22.89 2.38 0.00 -BGO_Z0_4 4 2 2 54.45 -5.21 1.02 2.56 18.83 2.60 0.00 -BGO_Z0_4 3 2 2 64.35 -5.21 1.04 2.31 23.23 2.37 0.04 -BGO_Z0_4 2 2 2 74.25 -5.21 1.04 5.71 21.76 2.69 0.00 -BGO_Z0_4 1 2 2 84.15 -5.21 1.08 4.19 18.85 3.23 0.00 -BGO_Z0_4 0 2 2 94.05 -5.21 1.07 2.68 12.90 3.35 0.26 -BGO_Z0_4 19 3 2 -94.05 5.21 1.00 3.82 21.07 2.32 0.04 -BGO_Z0_4 18 3 2 -84.15 5.21 1.01 2.64 19.57 2.62 0.00 -BGO_Z0_4 17 3 2 -74.25 5.21 1.00 4.13 23.64 2.45 0.00 -BGO_Z0_4 16 3 2 -64.35 5.21 0.99 4.91 23.08 2.41 0.00 -BGO_Z0_4 15 3 2 -54.45 5.21 1.00 3.31 23.06 2.44 0.00 -BGO_Z0_4 14 3 2 -44.55 5.21 1.01 1.45 21.27 2.53 0.00 -BGO_Z0_4 13 3 2 -34.65 5.21 1.00 2.79 22.38 2.47 0.00 -BGO_Z0_4 12 3 2 -24.75 5.21 0.99 4.99 22.04 2.44 0.00 -BGO_Z0_4 11 3 2 -14.85 5.21 0.99 4.34 20.43 2.56 0.00 -BGO_Z0_4 10 3 2 -4.95 5.21 0.99 4.07 22.58 2.46 0.00 -BGO_Z0_4 9 3 2 4.95 5.21 0.98 6.53 22.85 2.38 0.00 -BGO_Z0_4 8 3 2 14.85 5.21 1.00 3.59 21.27 2.53 0.00 -BGO_Z0_4 7 3 2 24.75 5.21 1.00 2.93 20.72 2.42 0.00 -BGO_Z0_4 6 3 2 34.65 5.21 0.98 5.76 20.92 2.49 0.00 -BGO_Z0_4 5 3 2 44.55 5.21 1.00 4.71 22.89 2.38 0.00 -BGO_Z0_4 4 3 2 54.45 5.21 1.02 2.56 18.83 2.60 0.00 -BGO_Z0_4 3 3 2 64.35 5.21 1.04 2.31 23.23 2.37 0.04 -BGO_Z0_4 2 3 2 74.25 5.21 1.04 5.71 21.76 2.69 0.00 -BGO_Z0_4 1 3 2 84.15 5.21 1.08 4.19 18.85 3.23 0.00 -BGO_Z0_4 0 3 2 94.05 5.21 1.07 2.68 12.90 3.35 0.26 -BGO_Z0_4 19 4 2 -94.05 15.64 0.99 4.42 24.52 2.34 0.00 -BGO_Z0_4 18 4 2 -84.15 15.64 0.99 4.83 22.83 2.45 0.00 -BGO_Z0_4 17 4 2 -74.25 15.64 0.99 3.94 24.55 2.31 0.00 -BGO_Z0_4 16 4 2 -64.35 15.64 1.00 3.27 23.09 2.40 0.00 -BGO_Z0_4 15 4 2 -54.45 15.64 1.00 2.87 25.25 2.19 0.04 -BGO_Z0_4 14 4 2 -44.55 15.64 1.00 2.81 24.70 2.16 0.03 -BGO_Z0_4 13 4 2 -34.65 15.64 1.00 3.62 23.87 2.29 0.03 -BGO_Z0_4 12 4 2 -24.75 15.64 1.00 3.60 21.41 2.51 0.00 -BGO_Z0_4 11 4 2 -14.85 15.64 1.00 3.18 21.47 2.52 0.00 -BGO_Z0_4 10 4 2 -4.95 15.64 1.00 3.79 21.51 2.39 0.00 -BGO_Z0_4 9 4 2 4.95 15.64 1.01 1.73 20.66 2.54 0.00 -BGO_Z0_4 8 4 2 14.85 15.64 0.99 4.11 23.12 2.44 0.00 -BGO_Z0_4 7 4 2 24.75 15.64 1.00 3.62 22.89 2.39 0.00 -BGO_Z0_4 6 4 2 34.65 15.64 0.99 4.61 24.85 2.27 0.00 -BGO_Z0_4 5 4 2 44.55 15.64 1.01 1.67 24.41 2.36 0.00 -BGO_Z0_4 4 4 2 54.45 15.64 1.00 3.76 20.49 2.47 0.00 -BGO_Z0_4 3 4 2 64.35 15.64 1.00 3.38 20.60 2.62 0.00 -BGO_Z0_4 2 4 2 74.25 15.64 1.01 2.78 19.05 2.64 0.00 -BGO_Z0_4 1 4 2 84.15 15.64 0.97 4.26 18.30 2.74 0.04 -BGO_Z0_4 0 4 2 94.05 15.64 0.93 4.30 26.83 2.11 0.07 -BGO_Z0_4 19 5 2 -94.05 26.07 0.98 5.18 19.51 2.48 0.00 -BGO_Z0_4 18 5 2 -84.15 26.07 1.01 2.62 22.79 2.42 0.00 -BGO_Z0_4 17 5 2 -74.25 26.07 1.00 3.30 22.09 2.39 0.00 -BGO_Z0_4 16 5 2 -64.35 26.07 0.98 6.39 21.87 2.56 0.00 -BGO_Z0_4 15 5 2 -54.45 26.07 1.00 2.90 21.99 2.47 0.00 -BGO_Z0_4 14 5 2 -44.55 26.07 1.00 4.83 22.96 2.38 0.00 -BGO_Z0_4 13 5 2 -34.65 26.07 1.02 1.64 22.43 2.45 0.00 -BGO_Z0_4 12 5 2 -24.75 26.07 1.00 2.60 21.11 2.49 0.03 -BGO_Z0_4 11 5 2 -14.85 26.07 1.00 2.99 23.66 2.46 0.00 -BGO_Z0_4 10 5 2 -4.95 26.07 0.98 5.49 22.69 2.41 0.00 -BGO_Z0_4 9 5 2 4.95 26.07 1.01 2.74 22.55 2.42 0.02 -BGO_Z0_4 8 5 2 14.85 26.07 1.00 3.26 23.08 2.13 0.04 -BGO_Z0_4 7 5 2 24.75 26.07 0.98 5.45 22.69 2.44 0.00 -BGO_Z0_4 6 5 2 34.65 26.07 1.00 2.84 20.67 2.46 0.00 -BGO_Z0_4 5 5 2 44.55 26.07 0.99 4.03 23.26 2.40 0.00 -BGO_Z0_4 4 5 2 54.45 26.07 0.98 4.18 25.77 2.23 0.00 -BGO_Z0_4 3 5 2 64.35 26.07 0.95 5.66 19.76 2.56 0.00 -BGO_Z0_4 2 5 2 74.25 26.07 0.95 2.68 21.09 2.46 0.00 -BGO_Z0_4 1 5 2 84.15 26.07 0.92 5.37 25.12 2.13 0.05 -BGO_Z0_4 0 5 2 94.05 26.07 0.93 4.54 22.13 2.49 0.00 -BGO_Z1_0 0 0 0 -94.05 -26.07 0.98 6.16 22.23 2.44 0.00 -BGO_Z1_0 1 0 0 -84.15 -26.07 1.01 2.42 19.24 2.60 0.00 -BGO_Z1_0 2 0 0 -74.25 -26.07 1.00 2.43 21.69 2.39 0.00 -BGO_Z1_0 3 0 0 -64.35 -26.07 1.01 2.04 16.47 2.69 0.00 -BGO_Z1_0 4 0 0 -54.45 -26.07 1.00 2.98 23.91 2.41 0.00 -BGO_Z1_0 5 0 0 -44.55 -26.07 1.00 3.98 22.47 2.39 0.00 -BGO_Z1_0 6 0 0 -34.65 -26.07 1.00 3.42 19.40 2.54 0.00 -BGO_Z1_0 7 0 0 -24.75 -26.07 1.01 2.03 21.08 2.47 0.00 -BGO_Z1_0 8 0 0 -14.85 -26.07 0.99 4.32 24.57 2.42 0.00 -BGO_Z1_0 9 0 0 -4.95 -26.07 0.99 4.93 23.19 2.35 0.00 -BGO_Z1_0 10 0 0 4.95 -26.07 1.00 3.46 24.82 2.23 0.04 -BGO_Z1_0 11 0 0 14.85 -26.07 0.99 4.70 19.02 2.51 0.00 -BGO_Z1_0 12 0 0 24.75 -26.07 0.99 4.33 21.71 2.46 0.00 -BGO_Z1_0 13 0 0 34.65 -26.07 0.98 5.67 21.54 2.46 0.00 -BGO_Z1_0 14 0 0 44.55 -26.07 0.99 3.88 24.84 2.34 0.00 -BGO_Z1_0 15 0 0 54.45 -26.07 0.98 5.14 21.17 2.45 0.00 -BGO_Z1_0 16 0 0 64.35 -26.07 0.97 3.39 21.01 2.52 0.00 -BGO_Z1_0 17 0 0 74.25 -26.07 0.94 4.82 21.03 2.54 0.00 -BGO_Z1_0 18 0 0 84.15 -26.07 0.92 5.60 18.30 2.61 0.00 -BGO_Z1_0 19 0 0 94.05 -26.07 0.93 3.87 20.04 2.54 0.00 -BGO_Z1_0 0 1 0 -94.05 -15.64 1.00 3.45 22.22 2.45 0.00 -BGO_Z1_0 1 1 0 -84.15 -15.64 0.99 5.24 19.83 2.53 0.00 -BGO_Z1_0 2 1 0 -74.25 -15.64 0.99 4.22 21.96 2.42 0.00 -BGO_Z1_0 3 1 0 -64.35 -15.64 0.99 4.74 19.69 2.48 0.00 -BGO_Z1_0 4 1 0 -54.45 -15.64 0.99 4.07 20.84 2.49 0.00 -BGO_Z1_0 5 1 0 -44.55 -15.64 1.00 4.19 21.35 2.26 0.03 -BGO_Z1_0 6 1 0 -34.65 -15.64 1.01 2.62 21.41 2.43 0.00 -BGO_Z1_0 7 1 0 -24.75 -15.64 1.01 2.64 23.64 2.29 0.03 -BGO_Z1_0 8 1 0 -14.85 -15.64 1.00 2.74 23.13 2.49 0.00 -BGO_Z1_0 9 1 0 -4.95 -15.64 1.01 2.39 18.67 2.49 0.00 -BGO_Z1_0 10 1 0 4.95 -15.64 1.00 2.53 21.84 2.44 0.00 -BGO_Z1_0 11 1 0 14.85 -15.64 0.99 4.54 23.52 2.39 0.02 -BGO_Z1_0 12 1 0 24.75 -15.64 0.99 4.32 22.24 2.47 0.00 -BGO_Z1_0 13 1 0 34.65 -15.64 0.99 4.39 20.45 2.42 0.00 -BGO_Z1_0 14 1 0 44.55 -15.64 0.99 4.72 17.56 2.58 0.00 -BGO_Z1_0 15 1 0 54.45 -15.64 1.00 3.96 24.90 2.07 0.05 -BGO_Z1_0 16 1 0 64.35 -15.64 1.00 3.05 20.84 2.55 0.00 -BGO_Z1_0 17 1 0 74.25 -15.64 1.00 3.50 20.59 2.59 0.00 -BGO_Z1_0 18 1 0 84.15 -15.64 0.96 5.78 22.17 2.39 0.06 -BGO_Z1_0 19 1 0 94.05 -15.64 0.93 3.48 21.41 2.52 0.04 -BGO_Z1_0 0 2 0 -94.05 -5.21 0.99 3.41 21.38 2.52 0.00 -BGO_Z1_0 1 2 0 -84.15 -5.21 1.00 3.65 22.49 2.49 0.00 -BGO_Z1_0 2 2 0 -74.25 -5.21 0.99 4.64 21.69 2.51 0.00 -BGO_Z1_0 3 2 0 -64.35 -5.21 0.98 6.07 21.69 2.49 0.00 -BGO_Z1_0 4 2 0 -54.45 -5.21 1.00 4.30 21.49 2.47 0.00 -BGO_Z1_0 5 2 0 -44.55 -5.21 1.01 2.07 23.68 2.34 0.01 -BGO_Z1_0 6 2 0 -34.65 -5.21 1.00 2.47 19.85 2.61 0.00 -BGO_Z1_0 7 2 0 -24.75 -5.21 1.00 2.10 22.98 2.39 0.02 -BGO_Z1_0 8 2 0 -14.85 -5.21 1.00 3.37 19.73 2.56 0.00 -BGO_Z1_0 9 2 0 -4.95 -5.21 0.99 4.76 19.98 2.45 0.00 -BGO_Z1_0 10 2 0 4.95 -5.21 0.99 4.56 21.21 2.37 0.00 -BGO_Z1_0 11 2 0 14.85 -5.21 0.99 5.71 22.43 2.44 0.00 -BGO_Z1_0 12 2 0 24.75 -5.21 0.98 5.97 19.81 2.43 0.00 -BGO_Z1_0 13 2 0 34.65 -5.21 0.98 6.00 20.87 2.57 0.00 -BGO_Z1_0 14 2 0 44.55 -5.21 1.01 3.12 21.71 2.47 0.00 -BGO_Z1_0 15 2 0 54.45 -5.21 1.01 4.19 21.19 2.59 0.00 -BGO_Z1_0 16 2 0 64.35 -5.21 1.02 4.19 20.88 2.65 0.00 -BGO_Z1_0 17 2 0 74.25 -5.21 1.05 4.92 21.78 2.71 0.00 -BGO_Z1_0 18 2 0 84.15 -5.21 1.09 3.17 21.18 2.96 0.04 -BGO_Z1_0 19 2 0 94.05 -5.21 1.08 1.30 19.95 2.36 0.30 -BGO_Z1_0 0 3 0 -94.05 5.21 0.99 3.41 21.38 2.52 0.00 -BGO_Z1_0 1 3 0 -84.15 5.21 1.00 3.65 22.49 2.49 0.00 -BGO_Z1_0 2 3 0 -74.25 5.21 0.99 4.64 21.69 2.51 0.00 -BGO_Z1_0 3 3 0 -64.35 5.21 0.98 6.07 21.69 2.49 0.00 -BGO_Z1_0 4 3 0 -54.45 5.21 1.00 4.30 21.49 2.47 0.00 -BGO_Z1_0 5 3 0 -44.55 5.21 1.01 2.07 23.68 2.34 0.01 -BGO_Z1_0 6 3 0 -34.65 5.21 1.00 2.47 19.85 2.61 0.00 -BGO_Z1_0 7 3 0 -24.75 5.21 1.00 2.10 22.98 2.39 0.02 -BGO_Z1_0 8 3 0 -14.85 5.21 1.00 3.37 19.73 2.56 0.00 -BGO_Z1_0 9 3 0 -4.95 5.21 0.99 4.76 19.98 2.45 0.00 -BGO_Z1_0 10 3 0 4.95 5.21 0.99 4.56 21.21 2.37 0.00 -BGO_Z1_0 11 3 0 14.85 5.21 0.99 5.71 22.43 2.44 0.00 -BGO_Z1_0 12 3 0 24.75 5.21 0.98 5.97 19.81 2.43 0.00 -BGO_Z1_0 13 3 0 34.65 5.21 0.98 6.00 20.87 2.57 0.00 -BGO_Z1_0 14 3 0 44.55 5.21 1.01 3.12 21.71 2.47 0.00 -BGO_Z1_0 15 3 0 54.45 5.21 1.01 4.19 21.19 2.59 0.00 -BGO_Z1_0 16 3 0 64.35 5.21 1.02 4.19 20.88 2.65 0.00 -BGO_Z1_0 17 3 0 74.25 5.21 1.05 4.92 21.78 2.71 0.00 -BGO_Z1_0 18 3 0 84.15 5.21 1.09 3.17 21.18 2.96 0.04 -BGO_Z1_0 19 3 0 94.05 5.21 1.08 1.30 19.95 2.36 0.30 -BGO_Z1_0 0 4 0 -94.05 15.64 1.00 3.45 22.22 2.45 0.00 -BGO_Z1_0 1 4 0 -84.15 15.64 0.99 5.24 19.83 2.53 0.00 -BGO_Z1_0 2 4 0 -74.25 15.64 0.99 4.22 21.96 2.42 0.00 -BGO_Z1_0 3 4 0 -64.35 15.64 0.99 4.74 19.69 2.48 0.00 -BGO_Z1_0 4 4 0 -54.45 15.64 0.99 4.07 20.84 2.49 0.00 -BGO_Z1_0 5 4 0 -44.55 15.64 1.00 4.19 21.35 2.26 0.03 -BGO_Z1_0 6 4 0 -34.65 15.64 1.01 2.62 21.41 2.43 0.00 -BGO_Z1_0 7 4 0 -24.75 15.64 1.01 2.64 23.64 2.29 0.03 -BGO_Z1_0 8 4 0 -14.85 15.64 1.00 2.74 23.13 2.49 0.00 -BGO_Z1_0 9 4 0 -4.95 15.64 1.01 2.39 18.67 2.49 0.00 -BGO_Z1_0 10 4 0 4.95 15.64 1.00 2.53 21.84 2.44 0.00 -BGO_Z1_0 11 4 0 14.85 15.64 0.99 4.54 23.52 2.39 0.02 -BGO_Z1_0 12 4 0 24.75 15.64 0.99 4.32 22.24 2.47 0.00 -BGO_Z1_0 13 4 0 34.65 15.64 0.99 4.39 20.45 2.42 0.00 -BGO_Z1_0 14 4 0 44.55 15.64 0.99 4.72 17.56 2.58 0.00 -BGO_Z1_0 15 4 0 54.45 15.64 1.00 3.96 24.90 2.07 0.05 -BGO_Z1_0 16 4 0 64.35 15.64 1.00 3.05 20.84 2.55 0.00 -BGO_Z1_0 17 4 0 74.25 15.64 1.00 3.50 20.59 2.59 0.00 -BGO_Z1_0 18 4 0 84.15 15.64 0.96 5.78 22.17 2.39 0.06 -BGO_Z1_0 19 4 0 94.05 15.64 0.93 3.48 21.41 2.52 0.04 -BGO_Z1_0 0 5 0 -94.05 26.07 0.98 6.16 22.23 2.44 0.00 -BGO_Z1_0 1 5 0 -84.15 26.07 1.01 2.42 19.24 2.60 0.00 -BGO_Z1_0 2 5 0 -74.25 26.07 1.00 2.43 21.69 2.39 0.00 -BGO_Z1_0 3 5 0 -64.35 26.07 1.01 2.04 16.47 2.69 0.00 -BGO_Z1_0 4 5 0 -54.45 26.07 1.00 2.98 23.91 2.41 0.00 -BGO_Z1_0 5 5 0 -44.55 26.07 1.00 3.98 22.47 2.39 0.00 -BGO_Z1_0 6 5 0 -34.65 26.07 1.00 3.42 19.40 2.54 0.00 -BGO_Z1_0 7 5 0 -24.75 26.07 1.01 2.03 21.08 2.47 0.00 -BGO_Z1_0 8 5 0 -14.85 26.07 0.99 4.32 24.57 2.42 0.00 -BGO_Z1_0 9 5 0 -4.95 26.07 0.99 4.93 23.19 2.35 0.00 -BGO_Z1_0 10 5 0 4.95 26.07 1.00 3.46 24.82 2.23 0.04 -BGO_Z1_0 11 5 0 14.85 26.07 0.99 4.70 19.02 2.51 0.00 -BGO_Z1_0 12 5 0 24.75 26.07 0.99 4.33 21.71 2.46 0.00 -BGO_Z1_0 13 5 0 34.65 26.07 0.98 5.67 21.54 2.46 0.00 -BGO_Z1_0 14 5 0 44.55 26.07 0.99 3.88 24.84 2.34 0.00 -BGO_Z1_0 15 5 0 54.45 26.07 0.98 5.14 21.17 2.45 0.00 -BGO_Z1_0 16 5 0 64.35 26.07 0.97 3.39 21.01 2.52 0.00 -BGO_Z1_0 17 5 0 74.25 26.07 0.94 4.82 21.03 2.54 0.00 -BGO_Z1_0 18 5 0 84.15 26.07 0.92 5.60 18.30 2.61 0.00 -BGO_Z1_0 19 5 0 94.05 26.07 0.93 3.87 20.04 2.54 0.00 -BGO_Z1_0 0 0 1 -94.05 -26.07 0.98 6.16 22.23 2.44 0.00 -BGO_Z1_0 1 0 1 -84.15 -26.07 1.01 2.42 19.24 2.60 0.00 -BGO_Z1_0 2 0 1 -74.25 -26.07 1.00 2.43 21.69 2.39 0.00 -BGO_Z1_0 3 0 1 -64.35 -26.07 1.01 2.04 16.47 2.69 0.00 -BGO_Z1_0 4 0 1 -54.45 -26.07 1.00 2.98 23.91 2.41 0.00 -BGO_Z1_0 5 0 1 -44.55 -26.07 1.00 3.98 22.47 2.39 0.00 -BGO_Z1_0 6 0 1 -34.65 -26.07 1.00 3.42 19.40 2.54 0.00 -BGO_Z1_0 7 0 1 -24.75 -26.07 1.01 2.03 21.08 2.47 0.00 -BGO_Z1_0 8 0 1 -14.85 -26.07 0.99 4.32 24.57 2.42 0.00 -BGO_Z1_0 9 0 1 -4.95 -26.07 0.99 4.93 23.19 2.35 0.00 -BGO_Z1_0 10 0 1 4.95 -26.07 1.00 3.46 24.82 2.23 0.04 -BGO_Z1_0 11 0 1 14.85 -26.07 0.99 4.70 19.02 2.51 0.00 -BGO_Z1_0 12 0 1 24.75 -26.07 0.99 4.33 21.71 2.46 0.00 -BGO_Z1_0 13 0 1 34.65 -26.07 0.98 5.67 21.54 2.46 0.00 -BGO_Z1_0 14 0 1 44.55 -26.07 0.99 3.88 24.84 2.34 0.00 -BGO_Z1_0 15 0 1 54.45 -26.07 0.98 5.14 21.17 2.45 0.00 -BGO_Z1_0 16 0 1 64.35 -26.07 0.97 3.39 21.01 2.52 0.00 -BGO_Z1_0 17 0 1 74.25 -26.07 0.94 4.82 21.03 2.54 0.00 -BGO_Z1_0 18 0 1 84.15 -26.07 0.92 5.60 18.30 2.61 0.00 -BGO_Z1_0 19 0 1 94.05 -26.07 0.93 3.87 20.04 2.54 0.00 -BGO_Z1_0 0 1 1 -94.05 -15.64 1.00 3.45 22.22 2.45 0.00 -BGO_Z1_0 1 1 1 -84.15 -15.64 0.99 5.24 19.83 2.53 0.00 -BGO_Z1_0 2 1 1 -74.25 -15.64 0.99 4.22 21.96 2.42 0.00 -BGO_Z1_0 3 1 1 -64.35 -15.64 0.99 4.74 19.69 2.48 0.00 -BGO_Z1_0 4 1 1 -54.45 -15.64 0.99 4.07 20.84 2.49 0.00 -BGO_Z1_0 5 1 1 -44.55 -15.64 1.00 4.19 21.35 2.26 0.03 -BGO_Z1_0 6 1 1 -34.65 -15.64 1.01 2.62 21.41 2.43 0.00 -BGO_Z1_0 7 1 1 -24.75 -15.64 1.01 2.64 23.64 2.29 0.03 -BGO_Z1_0 8 1 1 -14.85 -15.64 1.00 2.74 23.13 2.49 0.00 -BGO_Z1_0 9 1 1 -4.95 -15.64 1.01 2.39 18.67 2.49 0.00 -BGO_Z1_0 10 1 1 4.95 -15.64 1.00 2.53 21.84 2.44 0.00 -BGO_Z1_0 11 1 1 14.85 -15.64 0.99 4.54 23.52 2.39 0.02 -BGO_Z1_0 12 1 1 24.75 -15.64 0.99 4.32 22.24 2.47 0.00 -BGO_Z1_0 13 1 1 34.65 -15.64 0.99 4.39 20.45 2.42 0.00 -BGO_Z1_0 14 1 1 44.55 -15.64 0.99 4.72 17.56 2.58 0.00 -BGO_Z1_0 15 1 1 54.45 -15.64 1.00 3.96 24.90 2.07 0.05 -BGO_Z1_0 16 1 1 64.35 -15.64 1.00 3.05 20.84 2.55 0.00 -BGO_Z1_0 17 1 1 74.25 -15.64 1.00 3.50 20.59 2.59 0.00 -BGO_Z1_0 18 1 1 84.15 -15.64 0.96 5.78 22.17 2.39 0.06 -BGO_Z1_0 19 1 1 94.05 -15.64 0.93 3.48 21.41 2.52 0.04 -BGO_Z1_0 0 2 1 -94.05 -5.21 0.99 3.41 21.38 2.52 0.00 -BGO_Z1_0 1 2 1 -84.15 -5.21 1.00 3.65 22.49 2.49 0.00 -BGO_Z1_0 2 2 1 -74.25 -5.21 0.99 4.64 21.69 2.51 0.00 -BGO_Z1_0 3 2 1 -64.35 -5.21 0.98 6.07 21.69 2.49 0.00 -BGO_Z1_0 4 2 1 -54.45 -5.21 1.00 4.30 21.49 2.47 0.00 -BGO_Z1_0 5 2 1 -44.55 -5.21 1.01 2.07 23.68 2.34 0.01 -BGO_Z1_0 6 2 1 -34.65 -5.21 1.00 2.47 19.85 2.61 0.00 -BGO_Z1_0 7 2 1 -24.75 -5.21 1.00 2.10 22.98 2.39 0.02 -BGO_Z1_0 8 2 1 -14.85 -5.21 1.00 3.37 19.73 2.56 0.00 -BGO_Z1_0 9 2 1 -4.95 -5.21 0.99 4.76 19.98 2.45 0.00 -BGO_Z1_0 10 2 1 4.95 -5.21 0.99 4.56 21.21 2.37 0.00 -BGO_Z1_0 11 2 1 14.85 -5.21 0.99 5.71 22.43 2.44 0.00 -BGO_Z1_0 12 2 1 24.75 -5.21 0.98 5.97 19.81 2.43 0.00 -BGO_Z1_0 13 2 1 34.65 -5.21 0.98 6.00 20.87 2.57 0.00 -BGO_Z1_0 14 2 1 44.55 -5.21 1.01 3.12 21.71 2.47 0.00 -BGO_Z1_0 15 2 1 54.45 -5.21 1.01 4.19 21.19 2.59 0.00 -BGO_Z1_0 16 2 1 64.35 -5.21 1.02 4.19 20.88 2.65 0.00 -BGO_Z1_0 17 2 1 74.25 -5.21 1.05 4.92 21.78 2.71 0.00 -BGO_Z1_0 18 2 1 84.15 -5.21 1.09 3.17 21.18 2.96 0.04 -BGO_Z1_0 19 2 1 94.05 -5.21 1.08 1.30 19.95 2.36 0.30 -BGO_Z1_0 0 3 1 -94.05 5.21 0.99 3.41 21.38 2.52 0.00 -BGO_Z1_0 1 3 1 -84.15 5.21 1.00 3.65 22.49 2.49 0.00 -BGO_Z1_0 2 3 1 -74.25 5.21 0.99 4.64 21.69 2.51 0.00 -BGO_Z1_0 3 3 1 -64.35 5.21 0.98 6.07 21.69 2.49 0.00 -BGO_Z1_0 4 3 1 -54.45 5.21 1.00 4.30 21.49 2.47 0.00 -BGO_Z1_0 5 3 1 -44.55 5.21 1.01 2.07 23.68 2.34 0.01 -BGO_Z1_0 6 3 1 -34.65 5.21 1.00 2.47 19.85 2.61 0.00 -BGO_Z1_0 7 3 1 -24.75 5.21 1.00 2.10 22.98 2.39 0.02 -BGO_Z1_0 8 3 1 -14.85 5.21 1.00 3.37 19.73 2.56 0.00 -BGO_Z1_0 9 3 1 -4.95 5.21 0.99 4.76 19.98 2.45 0.00 -BGO_Z1_0 10 3 1 4.95 5.21 0.99 4.56 21.21 2.37 0.00 -BGO_Z1_0 11 3 1 14.85 5.21 0.99 5.71 22.43 2.44 0.00 -BGO_Z1_0 12 3 1 24.75 5.21 0.98 5.97 19.81 2.43 0.00 -BGO_Z1_0 13 3 1 34.65 5.21 0.98 6.00 20.87 2.57 0.00 -BGO_Z1_0 14 3 1 44.55 5.21 1.01 3.12 21.71 2.47 0.00 -BGO_Z1_0 15 3 1 54.45 5.21 1.01 4.19 21.19 2.59 0.00 -BGO_Z1_0 16 3 1 64.35 5.21 1.02 4.19 20.88 2.65 0.00 -BGO_Z1_0 17 3 1 74.25 5.21 1.05 4.92 21.78 2.71 0.00 -BGO_Z1_0 18 3 1 84.15 5.21 1.09 3.17 21.18 2.96 0.04 -BGO_Z1_0 19 3 1 94.05 5.21 1.08 1.30 19.95 2.36 0.30 -BGO_Z1_0 0 4 1 -94.05 15.64 1.00 3.45 22.22 2.45 0.00 -BGO_Z1_0 1 4 1 -84.15 15.64 0.99 5.24 19.83 2.53 0.00 -BGO_Z1_0 2 4 1 -74.25 15.64 0.99 4.22 21.96 2.42 0.00 -BGO_Z1_0 3 4 1 -64.35 15.64 0.99 4.74 19.69 2.48 0.00 -BGO_Z1_0 4 4 1 -54.45 15.64 0.99 4.07 20.84 2.49 0.00 -BGO_Z1_0 5 4 1 -44.55 15.64 1.00 4.19 21.35 2.26 0.03 -BGO_Z1_0 6 4 1 -34.65 15.64 1.01 2.62 21.41 2.43 0.00 -BGO_Z1_0 7 4 1 -24.75 15.64 1.01 2.64 23.64 2.29 0.03 -BGO_Z1_0 8 4 1 -14.85 15.64 1.00 2.74 23.13 2.49 0.00 -BGO_Z1_0 9 4 1 -4.95 15.64 1.01 2.39 18.67 2.49 0.00 -BGO_Z1_0 10 4 1 4.95 15.64 1.00 2.53 21.84 2.44 0.00 -BGO_Z1_0 11 4 1 14.85 15.64 0.99 4.54 23.52 2.39 0.02 -BGO_Z1_0 12 4 1 24.75 15.64 0.99 4.32 22.24 2.47 0.00 -BGO_Z1_0 13 4 1 34.65 15.64 0.99 4.39 20.45 2.42 0.00 -BGO_Z1_0 14 4 1 44.55 15.64 0.99 4.72 17.56 2.58 0.00 -BGO_Z1_0 15 4 1 54.45 15.64 1.00 3.96 24.90 2.07 0.05 -BGO_Z1_0 16 4 1 64.35 15.64 1.00 3.05 20.84 2.55 0.00 -BGO_Z1_0 17 4 1 74.25 15.64 1.00 3.50 20.59 2.59 0.00 -BGO_Z1_0 18 4 1 84.15 15.64 0.96 5.78 22.17 2.39 0.06 -BGO_Z1_0 19 4 1 94.05 15.64 0.93 3.48 21.41 2.52 0.04 -BGO_Z1_0 0 5 1 -94.05 26.07 0.98 6.16 22.23 2.44 0.00 -BGO_Z1_0 1 5 1 -84.15 26.07 1.01 2.42 19.24 2.60 0.00 -BGO_Z1_0 2 5 1 -74.25 26.07 1.00 2.43 21.69 2.39 0.00 -BGO_Z1_0 3 5 1 -64.35 26.07 1.01 2.04 16.47 2.69 0.00 -BGO_Z1_0 4 5 1 -54.45 26.07 1.00 2.98 23.91 2.41 0.00 -BGO_Z1_0 5 5 1 -44.55 26.07 1.00 3.98 22.47 2.39 0.00 -BGO_Z1_0 6 5 1 -34.65 26.07 1.00 3.42 19.40 2.54 0.00 -BGO_Z1_0 7 5 1 -24.75 26.07 1.01 2.03 21.08 2.47 0.00 -BGO_Z1_0 8 5 1 -14.85 26.07 0.99 4.32 24.57 2.42 0.00 -BGO_Z1_0 9 5 1 -4.95 26.07 0.99 4.93 23.19 2.35 0.00 -BGO_Z1_0 10 5 1 4.95 26.07 1.00 3.46 24.82 2.23 0.04 -BGO_Z1_0 11 5 1 14.85 26.07 0.99 4.70 19.02 2.51 0.00 -BGO_Z1_0 12 5 1 24.75 26.07 0.99 4.33 21.71 2.46 0.00 -BGO_Z1_0 13 5 1 34.65 26.07 0.98 5.67 21.54 2.46 0.00 -BGO_Z1_0 14 5 1 44.55 26.07 0.99 3.88 24.84 2.34 0.00 -BGO_Z1_0 15 5 1 54.45 26.07 0.98 5.14 21.17 2.45 0.00 -BGO_Z1_0 16 5 1 64.35 26.07 0.97 3.39 21.01 2.52 0.00 -BGO_Z1_0 17 5 1 74.25 26.07 0.94 4.82 21.03 2.54 0.00 -BGO_Z1_0 18 5 1 84.15 26.07 0.92 5.60 18.30 2.61 0.00 -BGO_Z1_0 19 5 1 94.05 26.07 0.93 3.87 20.04 2.54 0.00 -BGO_Z1_0 0 0 2 -94.05 -26.07 0.98 6.16 22.23 2.44 0.00 -BGO_Z1_0 1 0 2 -84.15 -26.07 1.01 2.42 19.24 2.60 0.00 -BGO_Z1_0 2 0 2 -74.25 -26.07 1.00 2.43 21.69 2.39 0.00 -BGO_Z1_0 3 0 2 -64.35 -26.07 1.01 2.04 16.47 2.69 0.00 -BGO_Z1_0 4 0 2 -54.45 -26.07 1.00 2.98 23.91 2.41 0.00 -BGO_Z1_0 5 0 2 -44.55 -26.07 1.00 3.98 22.47 2.39 0.00 -BGO_Z1_0 6 0 2 -34.65 -26.07 1.00 3.42 19.40 2.54 0.00 -BGO_Z1_0 7 0 2 -24.75 -26.07 1.01 2.03 21.08 2.47 0.00 -BGO_Z1_0 8 0 2 -14.85 -26.07 0.99 4.32 24.57 2.42 0.00 -BGO_Z1_0 9 0 2 -4.95 -26.07 0.99 4.93 23.19 2.35 0.00 -BGO_Z1_0 10 0 2 4.95 -26.07 1.00 3.46 24.82 2.23 0.04 -BGO_Z1_0 11 0 2 14.85 -26.07 0.99 4.70 19.02 2.51 0.00 -BGO_Z1_0 12 0 2 24.75 -26.07 0.99 4.33 21.71 2.46 0.00 -BGO_Z1_0 13 0 2 34.65 -26.07 0.98 5.67 21.54 2.46 0.00 -BGO_Z1_0 14 0 2 44.55 -26.07 0.99 3.88 24.84 2.34 0.00 -BGO_Z1_0 15 0 2 54.45 -26.07 0.98 5.14 21.17 2.45 0.00 -BGO_Z1_0 16 0 2 64.35 -26.07 0.97 3.39 21.01 2.52 0.00 -BGO_Z1_0 17 0 2 74.25 -26.07 0.94 4.82 21.03 2.54 0.00 -BGO_Z1_0 18 0 2 84.15 -26.07 0.92 5.60 18.30 2.61 0.00 -BGO_Z1_0 19 0 2 94.05 -26.07 0.93 3.87 20.04 2.54 0.00 -BGO_Z1_0 0 1 2 -94.05 -15.64 1.00 3.45 22.22 2.45 0.00 -BGO_Z1_0 1 1 2 -84.15 -15.64 0.99 5.24 19.83 2.53 0.00 -BGO_Z1_0 2 1 2 -74.25 -15.64 0.99 4.22 21.96 2.42 0.00 -BGO_Z1_0 3 1 2 -64.35 -15.64 0.99 4.74 19.69 2.48 0.00 -BGO_Z1_0 4 1 2 -54.45 -15.64 0.99 4.07 20.84 2.49 0.00 -BGO_Z1_0 5 1 2 -44.55 -15.64 1.00 4.19 21.35 2.26 0.03 -BGO_Z1_0 6 1 2 -34.65 -15.64 1.01 2.62 21.41 2.43 0.00 -BGO_Z1_0 7 1 2 -24.75 -15.64 1.01 2.64 23.64 2.29 0.03 -BGO_Z1_0 8 1 2 -14.85 -15.64 1.00 2.74 23.13 2.49 0.00 -BGO_Z1_0 9 1 2 -4.95 -15.64 1.01 2.39 18.67 2.49 0.00 -BGO_Z1_0 10 1 2 4.95 -15.64 1.00 2.53 21.84 2.44 0.00 -BGO_Z1_0 11 1 2 14.85 -15.64 0.99 4.54 23.52 2.39 0.02 -BGO_Z1_0 12 1 2 24.75 -15.64 0.99 4.32 22.24 2.47 0.00 -BGO_Z1_0 13 1 2 34.65 -15.64 0.99 4.39 20.45 2.42 0.00 -BGO_Z1_0 14 1 2 44.55 -15.64 0.99 4.72 17.56 2.58 0.00 -BGO_Z1_0 15 1 2 54.45 -15.64 1.00 3.96 24.90 2.07 0.05 -BGO_Z1_0 16 1 2 64.35 -15.64 1.00 3.05 20.84 2.55 0.00 -BGO_Z1_0 17 1 2 74.25 -15.64 1.00 3.50 20.59 2.59 0.00 -BGO_Z1_0 18 1 2 84.15 -15.64 0.96 5.78 22.17 2.39 0.06 -BGO_Z1_0 19 1 2 94.05 -15.64 0.93 3.48 21.41 2.52 0.04 -BGO_Z1_0 0 2 2 -94.05 -5.21 0.99 3.41 21.38 2.52 0.00 -BGO_Z1_0 1 2 2 -84.15 -5.21 1.00 3.65 22.49 2.49 0.00 -BGO_Z1_0 2 2 2 -74.25 -5.21 0.99 4.64 21.69 2.51 0.00 -BGO_Z1_0 3 2 2 -64.35 -5.21 0.98 6.07 21.69 2.49 0.00 -BGO_Z1_0 4 2 2 -54.45 -5.21 1.00 4.30 21.49 2.47 0.00 -BGO_Z1_0 5 2 2 -44.55 -5.21 1.01 2.07 23.68 2.34 0.01 -BGO_Z1_0 6 2 2 -34.65 -5.21 1.00 2.47 19.85 2.61 0.00 -BGO_Z1_0 7 2 2 -24.75 -5.21 1.00 2.10 22.98 2.39 0.02 -BGO_Z1_0 8 2 2 -14.85 -5.21 1.00 3.37 19.73 2.56 0.00 -BGO_Z1_0 9 2 2 -4.95 -5.21 0.99 4.76 19.98 2.45 0.00 -BGO_Z1_0 10 2 2 4.95 -5.21 0.99 4.56 21.21 2.37 0.00 -BGO_Z1_0 11 2 2 14.85 -5.21 0.99 5.71 22.43 2.44 0.00 -BGO_Z1_0 12 2 2 24.75 -5.21 0.98 5.97 19.81 2.43 0.00 -BGO_Z1_0 13 2 2 34.65 -5.21 0.98 6.00 20.87 2.57 0.00 -BGO_Z1_0 14 2 2 44.55 -5.21 1.01 3.12 21.71 2.47 0.00 -BGO_Z1_0 15 2 2 54.45 -5.21 1.01 4.19 21.19 2.59 0.00 -BGO_Z1_0 16 2 2 64.35 -5.21 1.02 4.19 20.88 2.65 0.00 -BGO_Z1_0 17 2 2 74.25 -5.21 1.05 4.92 21.78 2.71 0.00 -BGO_Z1_0 18 2 2 84.15 -5.21 1.09 3.17 21.18 2.96 0.04 -BGO_Z1_0 19 2 2 94.05 -5.21 1.08 1.30 19.95 2.36 0.30 -BGO_Z1_0 0 3 2 -94.05 5.21 0.99 3.41 21.38 2.52 0.00 -BGO_Z1_0 1 3 2 -84.15 5.21 1.00 3.65 22.49 2.49 0.00 -BGO_Z1_0 2 3 2 -74.25 5.21 0.99 4.64 21.69 2.51 0.00 -BGO_Z1_0 3 3 2 -64.35 5.21 0.98 6.07 21.69 2.49 0.00 -BGO_Z1_0 4 3 2 -54.45 5.21 1.00 4.30 21.49 2.47 0.00 -BGO_Z1_0 5 3 2 -44.55 5.21 1.01 2.07 23.68 2.34 0.01 -BGO_Z1_0 6 3 2 -34.65 5.21 1.00 2.47 19.85 2.61 0.00 -BGO_Z1_0 7 3 2 -24.75 5.21 1.00 2.10 22.98 2.39 0.02 -BGO_Z1_0 8 3 2 -14.85 5.21 1.00 3.37 19.73 2.56 0.00 -BGO_Z1_0 9 3 2 -4.95 5.21 0.99 4.76 19.98 2.45 0.00 -BGO_Z1_0 10 3 2 4.95 5.21 0.99 4.56 21.21 2.37 0.00 -BGO_Z1_0 11 3 2 14.85 5.21 0.99 5.71 22.43 2.44 0.00 -BGO_Z1_0 12 3 2 24.75 5.21 0.98 5.97 19.81 2.43 0.00 -BGO_Z1_0 13 3 2 34.65 5.21 0.98 6.00 20.87 2.57 0.00 -BGO_Z1_0 14 3 2 44.55 5.21 1.01 3.12 21.71 2.47 0.00 -BGO_Z1_0 15 3 2 54.45 5.21 1.01 4.19 21.19 2.59 0.00 -BGO_Z1_0 16 3 2 64.35 5.21 1.02 4.19 20.88 2.65 0.00 -BGO_Z1_0 17 3 2 74.25 5.21 1.05 4.92 21.78 2.71 0.00 -BGO_Z1_0 18 3 2 84.15 5.21 1.09 3.17 21.18 2.96 0.04 -BGO_Z1_0 19 3 2 94.05 5.21 1.08 1.30 19.95 2.36 0.30 -BGO_Z1_0 0 4 2 -94.05 15.64 1.00 3.45 22.22 2.45 0.00 -BGO_Z1_0 1 4 2 -84.15 15.64 0.99 5.24 19.83 2.53 0.00 -BGO_Z1_0 2 4 2 -74.25 15.64 0.99 4.22 21.96 2.42 0.00 -BGO_Z1_0 3 4 2 -64.35 15.64 0.99 4.74 19.69 2.48 0.00 -BGO_Z1_0 4 4 2 -54.45 15.64 0.99 4.07 20.84 2.49 0.00 -BGO_Z1_0 5 4 2 -44.55 15.64 1.00 4.19 21.35 2.26 0.03 -BGO_Z1_0 6 4 2 -34.65 15.64 1.01 2.62 21.41 2.43 0.00 -BGO_Z1_0 7 4 2 -24.75 15.64 1.01 2.64 23.64 2.29 0.03 -BGO_Z1_0 8 4 2 -14.85 15.64 1.00 2.74 23.13 2.49 0.00 -BGO_Z1_0 9 4 2 -4.95 15.64 1.01 2.39 18.67 2.49 0.00 -BGO_Z1_0 10 4 2 4.95 15.64 1.00 2.53 21.84 2.44 0.00 -BGO_Z1_0 11 4 2 14.85 15.64 0.99 4.54 23.52 2.39 0.02 -BGO_Z1_0 12 4 2 24.75 15.64 0.99 4.32 22.24 2.47 0.00 -BGO_Z1_0 13 4 2 34.65 15.64 0.99 4.39 20.45 2.42 0.00 -BGO_Z1_0 14 4 2 44.55 15.64 0.99 4.72 17.56 2.58 0.00 -BGO_Z1_0 15 4 2 54.45 15.64 1.00 3.96 24.90 2.07 0.05 -BGO_Z1_0 16 4 2 64.35 15.64 1.00 3.05 20.84 2.55 0.00 -BGO_Z1_0 17 4 2 74.25 15.64 1.00 3.50 20.59 2.59 0.00 -BGO_Z1_0 18 4 2 84.15 15.64 0.96 5.78 22.17 2.39 0.06 -BGO_Z1_0 19 4 2 94.05 15.64 0.93 3.48 21.41 2.52 0.04 -BGO_Z1_0 0 5 2 -94.05 26.07 0.98 6.16 22.23 2.44 0.00 -BGO_Z1_0 1 5 2 -84.15 26.07 1.01 2.42 19.24 2.60 0.00 -BGO_Z1_0 2 5 2 -74.25 26.07 1.00 2.43 21.69 2.39 0.00 -BGO_Z1_0 3 5 2 -64.35 26.07 1.01 2.04 16.47 2.69 0.00 -BGO_Z1_0 4 5 2 -54.45 26.07 1.00 2.98 23.91 2.41 0.00 -BGO_Z1_0 5 5 2 -44.55 26.07 1.00 3.98 22.47 2.39 0.00 -BGO_Z1_0 6 5 2 -34.65 26.07 1.00 3.42 19.40 2.54 0.00 -BGO_Z1_0 7 5 2 -24.75 26.07 1.01 2.03 21.08 2.47 0.00 -BGO_Z1_0 8 5 2 -14.85 26.07 0.99 4.32 24.57 2.42 0.00 -BGO_Z1_0 9 5 2 -4.95 26.07 0.99 4.93 23.19 2.35 0.00 -BGO_Z1_0 10 5 2 4.95 26.07 1.00 3.46 24.82 2.23 0.04 -BGO_Z1_0 11 5 2 14.85 26.07 0.99 4.70 19.02 2.51 0.00 -BGO_Z1_0 12 5 2 24.75 26.07 0.99 4.33 21.71 2.46 0.00 -BGO_Z1_0 13 5 2 34.65 26.07 0.98 5.67 21.54 2.46 0.00 -BGO_Z1_0 14 5 2 44.55 26.07 0.99 3.88 24.84 2.34 0.00 -BGO_Z1_0 15 5 2 54.45 26.07 0.98 5.14 21.17 2.45 0.00 -BGO_Z1_0 16 5 2 64.35 26.07 0.97 3.39 21.01 2.52 0.00 -BGO_Z1_0 17 5 2 74.25 26.07 0.94 4.82 21.03 2.54 0.00 -BGO_Z1_0 18 5 2 84.15 26.07 0.92 5.60 18.30 2.61 0.00 -BGO_Z1_0 19 5 2 94.05 26.07 0.93 3.87 20.04 2.54 0.00 -BGO_Z1_1 0 0 0 -94.05 -26.07 0.98 6.16 22.23 2.44 0.00 -BGO_Z1_1 1 0 0 -84.15 -26.07 1.01 2.42 19.24 2.60 0.00 -BGO_Z1_1 2 0 0 -74.25 -26.07 1.00 2.43 21.69 2.39 0.00 -BGO_Z1_1 3 0 0 -64.35 -26.07 1.01 2.04 16.47 2.69 0.00 -BGO_Z1_1 4 0 0 -54.45 -26.07 1.00 2.98 23.91 2.41 0.00 -BGO_Z1_1 5 0 0 -44.55 -26.07 1.00 3.98 22.47 2.39 0.00 -BGO_Z1_1 6 0 0 -34.65 -26.07 1.00 3.42 19.40 2.54 0.00 -BGO_Z1_1 7 0 0 -24.75 -26.07 1.01 2.03 21.08 2.47 0.00 -BGO_Z1_1 8 0 0 -14.85 -26.07 0.99 4.32 24.57 2.42 0.00 -BGO_Z1_1 9 0 0 -4.95 -26.07 0.99 4.93 23.19 2.35 0.00 -BGO_Z1_1 10 0 0 4.95 -26.07 1.00 3.46 24.82 2.23 0.04 -BGO_Z1_1 11 0 0 14.85 -26.07 0.99 4.70 19.02 2.51 0.00 -BGO_Z1_1 12 0 0 24.75 -26.07 0.99 4.33 21.71 2.46 0.00 -BGO_Z1_1 13 0 0 34.65 -26.07 0.98 5.67 21.54 2.46 0.00 -BGO_Z1_1 14 0 0 44.55 -26.07 0.99 3.88 24.84 2.34 0.00 -BGO_Z1_1 15 0 0 54.45 -26.07 0.98 5.14 21.17 2.45 0.00 -BGO_Z1_1 16 0 0 64.35 -26.07 0.97 3.39 21.01 2.52 0.00 -BGO_Z1_1 17 0 0 74.25 -26.07 0.94 4.82 21.03 2.54 0.00 -BGO_Z1_1 18 0 0 84.15 -26.07 0.92 5.60 18.30 2.61 0.00 -BGO_Z1_1 19 0 0 94.05 -26.07 0.93 3.87 20.04 2.54 0.00 -BGO_Z1_1 0 1 0 -94.05 -15.64 1.00 3.45 22.22 2.45 0.00 -BGO_Z1_1 1 1 0 -84.15 -15.64 0.99 5.24 19.83 2.53 0.00 -BGO_Z1_1 2 1 0 -74.25 -15.64 0.99 4.22 21.96 2.42 0.00 -BGO_Z1_1 3 1 0 -64.35 -15.64 0.99 4.74 19.69 2.48 0.00 -BGO_Z1_1 4 1 0 -54.45 -15.64 0.99 4.07 20.84 2.49 0.00 -BGO_Z1_1 5 1 0 -44.55 -15.64 1.00 4.19 21.35 2.26 0.03 -BGO_Z1_1 6 1 0 -34.65 -15.64 1.01 2.62 21.41 2.43 0.00 -BGO_Z1_1 7 1 0 -24.75 -15.64 1.01 2.64 23.64 2.29 0.03 -BGO_Z1_1 8 1 0 -14.85 -15.64 1.00 2.74 23.13 2.49 0.00 -BGO_Z1_1 9 1 0 -4.95 -15.64 1.01 2.39 18.67 2.49 0.00 -BGO_Z1_1 10 1 0 4.95 -15.64 1.00 2.53 21.84 2.44 0.00 -BGO_Z1_1 11 1 0 14.85 -15.64 0.99 4.54 23.52 2.39 0.02 -BGO_Z1_1 12 1 0 24.75 -15.64 0.99 4.32 22.24 2.47 0.00 -BGO_Z1_1 13 1 0 34.65 -15.64 0.99 4.39 20.45 2.42 0.00 -BGO_Z1_1 14 1 0 44.55 -15.64 0.99 4.72 17.56 2.58 0.00 -BGO_Z1_1 15 1 0 54.45 -15.64 1.00 3.96 24.90 2.07 0.05 -BGO_Z1_1 16 1 0 64.35 -15.64 1.00 3.05 20.84 2.55 0.00 -BGO_Z1_1 17 1 0 74.25 -15.64 1.00 3.50 20.59 2.59 0.00 -BGO_Z1_1 18 1 0 84.15 -15.64 0.96 5.78 22.17 2.39 0.06 -BGO_Z1_1 19 1 0 94.05 -15.64 0.93 3.48 21.41 2.52 0.04 -BGO_Z1_1 0 2 0 -94.05 -5.21 0.99 3.41 21.38 2.52 0.00 -BGO_Z1_1 1 2 0 -84.15 -5.21 1.00 3.65 22.49 2.49 0.00 -BGO_Z1_1 2 2 0 -74.25 -5.21 0.99 4.64 21.69 2.51 0.00 -BGO_Z1_1 3 2 0 -64.35 -5.21 0.98 6.07 21.69 2.49 0.00 -BGO_Z1_1 4 2 0 -54.45 -5.21 1.00 4.30 21.49 2.47 0.00 -BGO_Z1_1 5 2 0 -44.55 -5.21 1.01 2.07 23.68 2.34 0.01 -BGO_Z1_1 6 2 0 -34.65 -5.21 1.00 2.47 19.85 2.61 0.00 -BGO_Z1_1 7 2 0 -24.75 -5.21 1.00 2.10 22.98 2.39 0.02 -BGO_Z1_1 8 2 0 -14.85 -5.21 1.00 3.37 19.73 2.56 0.00 -BGO_Z1_1 9 2 0 -4.95 -5.21 0.99 4.76 19.98 2.45 0.00 -BGO_Z1_1 10 2 0 4.95 -5.21 0.99 4.56 21.21 2.37 0.00 -BGO_Z1_1 11 2 0 14.85 -5.21 0.99 5.71 22.43 2.44 0.00 -BGO_Z1_1 12 2 0 24.75 -5.21 0.98 5.97 19.81 2.43 0.00 -BGO_Z1_1 13 2 0 34.65 -5.21 0.98 6.00 20.87 2.57 0.00 -BGO_Z1_1 14 2 0 44.55 -5.21 1.01 3.12 21.71 2.47 0.00 -BGO_Z1_1 15 2 0 54.45 -5.21 1.01 4.19 21.19 2.59 0.00 -BGO_Z1_1 16 2 0 64.35 -5.21 1.02 4.19 20.88 2.65 0.00 -BGO_Z1_1 17 2 0 74.25 -5.21 1.05 4.92 21.78 2.71 0.00 -BGO_Z1_1 18 2 0 84.15 -5.21 1.09 3.17 21.18 2.96 0.04 -BGO_Z1_1 19 2 0 94.05 -5.21 1.08 1.30 19.95 2.36 0.30 -BGO_Z1_1 0 3 0 -94.05 5.21 0.99 3.41 21.38 2.52 0.00 -BGO_Z1_1 1 3 0 -84.15 5.21 1.00 3.65 22.49 2.49 0.00 -BGO_Z1_1 2 3 0 -74.25 5.21 0.99 4.64 21.69 2.51 0.00 -BGO_Z1_1 3 3 0 -64.35 5.21 0.98 6.07 21.69 2.49 0.00 -BGO_Z1_1 4 3 0 -54.45 5.21 1.00 4.30 21.49 2.47 0.00 -BGO_Z1_1 5 3 0 -44.55 5.21 1.01 2.07 23.68 2.34 0.01 -BGO_Z1_1 6 3 0 -34.65 5.21 1.00 2.47 19.85 2.61 0.00 -BGO_Z1_1 7 3 0 -24.75 5.21 1.00 2.10 22.98 2.39 0.02 -BGO_Z1_1 8 3 0 -14.85 5.21 1.00 3.37 19.73 2.56 0.00 -BGO_Z1_1 9 3 0 -4.95 5.21 0.99 4.76 19.98 2.45 0.00 -BGO_Z1_1 10 3 0 4.95 5.21 0.99 4.56 21.21 2.37 0.00 -BGO_Z1_1 11 3 0 14.85 5.21 0.99 5.71 22.43 2.44 0.00 -BGO_Z1_1 12 3 0 24.75 5.21 0.98 5.97 19.81 2.43 0.00 -BGO_Z1_1 13 3 0 34.65 5.21 0.98 6.00 20.87 2.57 0.00 -BGO_Z1_1 14 3 0 44.55 5.21 1.01 3.12 21.71 2.47 0.00 -BGO_Z1_1 15 3 0 54.45 5.21 1.01 4.19 21.19 2.59 0.00 -BGO_Z1_1 16 3 0 64.35 5.21 1.02 4.19 20.88 2.65 0.00 -BGO_Z1_1 17 3 0 74.25 5.21 1.05 4.92 21.78 2.71 0.00 -BGO_Z1_1 18 3 0 84.15 5.21 1.09 3.17 21.18 2.96 0.04 -BGO_Z1_1 19 3 0 94.05 5.21 1.08 1.30 19.95 2.36 0.30 -BGO_Z1_1 0 4 0 -94.05 15.64 1.00 3.45 22.22 2.45 0.00 -BGO_Z1_1 1 4 0 -84.15 15.64 0.99 5.24 19.83 2.53 0.00 -BGO_Z1_1 2 4 0 -74.25 15.64 0.99 4.22 21.96 2.42 0.00 -BGO_Z1_1 3 4 0 -64.35 15.64 0.99 4.74 19.69 2.48 0.00 -BGO_Z1_1 4 4 0 -54.45 15.64 0.99 4.07 20.84 2.49 0.00 -BGO_Z1_1 5 4 0 -44.55 15.64 1.00 4.19 21.35 2.26 0.03 -BGO_Z1_1 6 4 0 -34.65 15.64 1.01 2.62 21.41 2.43 0.00 -BGO_Z1_1 7 4 0 -24.75 15.64 1.01 2.64 23.64 2.29 0.03 -BGO_Z1_1 8 4 0 -14.85 15.64 1.00 2.74 23.13 2.49 0.00 -BGO_Z1_1 9 4 0 -4.95 15.64 1.01 2.39 18.67 2.49 0.00 -BGO_Z1_1 10 4 0 4.95 15.64 1.00 2.53 21.84 2.44 0.00 -BGO_Z1_1 11 4 0 14.85 15.64 0.99 4.54 23.52 2.39 0.02 -BGO_Z1_1 12 4 0 24.75 15.64 0.99 4.32 22.24 2.47 0.00 -BGO_Z1_1 13 4 0 34.65 15.64 0.99 4.39 20.45 2.42 0.00 -BGO_Z1_1 14 4 0 44.55 15.64 0.99 4.72 17.56 2.58 0.00 -BGO_Z1_1 15 4 0 54.45 15.64 1.00 3.96 24.90 2.07 0.05 -BGO_Z1_1 16 4 0 64.35 15.64 1.00 3.05 20.84 2.55 0.00 -BGO_Z1_1 17 4 0 74.25 15.64 1.00 3.50 20.59 2.59 0.00 -BGO_Z1_1 18 4 0 84.15 15.64 0.96 5.78 22.17 2.39 0.06 -BGO_Z1_1 19 4 0 94.05 15.64 0.93 3.48 21.41 2.52 0.04 -BGO_Z1_1 0 5 0 -94.05 26.07 0.98 6.16 22.23 2.44 0.00 -BGO_Z1_1 1 5 0 -84.15 26.07 1.01 2.42 19.24 2.60 0.00 -BGO_Z1_1 2 5 0 -74.25 26.07 1.00 2.43 21.69 2.39 0.00 -BGO_Z1_1 3 5 0 -64.35 26.07 1.01 2.04 16.47 2.69 0.00 -BGO_Z1_1 4 5 0 -54.45 26.07 1.00 2.98 23.91 2.41 0.00 -BGO_Z1_1 5 5 0 -44.55 26.07 1.00 3.98 22.47 2.39 0.00 -BGO_Z1_1 6 5 0 -34.65 26.07 1.00 3.42 19.40 2.54 0.00 -BGO_Z1_1 7 5 0 -24.75 26.07 1.01 2.03 21.08 2.47 0.00 -BGO_Z1_1 8 5 0 -14.85 26.07 0.99 4.32 24.57 2.42 0.00 -BGO_Z1_1 9 5 0 -4.95 26.07 0.99 4.93 23.19 2.35 0.00 -BGO_Z1_1 10 5 0 4.95 26.07 1.00 3.46 24.82 2.23 0.04 -BGO_Z1_1 11 5 0 14.85 26.07 0.99 4.70 19.02 2.51 0.00 -BGO_Z1_1 12 5 0 24.75 26.07 0.99 4.33 21.71 2.46 0.00 -BGO_Z1_1 13 5 0 34.65 26.07 0.98 5.67 21.54 2.46 0.00 -BGO_Z1_1 14 5 0 44.55 26.07 0.99 3.88 24.84 2.34 0.00 -BGO_Z1_1 15 5 0 54.45 26.07 0.98 5.14 21.17 2.45 0.00 -BGO_Z1_1 16 5 0 64.35 26.07 0.97 3.39 21.01 2.52 0.00 -BGO_Z1_1 17 5 0 74.25 26.07 0.94 4.82 21.03 2.54 0.00 -BGO_Z1_1 18 5 0 84.15 26.07 0.92 5.60 18.30 2.61 0.00 -BGO_Z1_1 19 5 0 94.05 26.07 0.93 3.87 20.04 2.54 0.00 -BGO_Z1_1 0 0 1 -94.05 -26.07 0.98 6.16 22.23 2.44 0.00 -BGO_Z1_1 1 0 1 -84.15 -26.07 1.01 2.42 19.24 2.60 0.00 -BGO_Z1_1 2 0 1 -74.25 -26.07 1.00 2.43 21.69 2.39 0.00 -BGO_Z1_1 3 0 1 -64.35 -26.07 1.01 2.04 16.47 2.69 0.00 -BGO_Z1_1 4 0 1 -54.45 -26.07 1.00 2.98 23.91 2.41 0.00 -BGO_Z1_1 5 0 1 -44.55 -26.07 1.00 3.98 22.47 2.39 0.00 -BGO_Z1_1 6 0 1 -34.65 -26.07 1.00 3.42 19.40 2.54 0.00 -BGO_Z1_1 7 0 1 -24.75 -26.07 1.01 2.03 21.08 2.47 0.00 -BGO_Z1_1 8 0 1 -14.85 -26.07 0.99 4.32 24.57 2.42 0.00 -BGO_Z1_1 9 0 1 -4.95 -26.07 0.99 4.93 23.19 2.35 0.00 -BGO_Z1_1 10 0 1 4.95 -26.07 1.00 3.46 24.82 2.23 0.04 -BGO_Z1_1 11 0 1 14.85 -26.07 0.99 4.70 19.02 2.51 0.00 -BGO_Z1_1 12 0 1 24.75 -26.07 0.99 4.33 21.71 2.46 0.00 -BGO_Z1_1 13 0 1 34.65 -26.07 0.98 5.67 21.54 2.46 0.00 -BGO_Z1_1 14 0 1 44.55 -26.07 0.99 3.88 24.84 2.34 0.00 -BGO_Z1_1 15 0 1 54.45 -26.07 0.98 5.14 21.17 2.45 0.00 -BGO_Z1_1 16 0 1 64.35 -26.07 0.97 3.39 21.01 2.52 0.00 -BGO_Z1_1 17 0 1 74.25 -26.07 0.94 4.82 21.03 2.54 0.00 -BGO_Z1_1 18 0 1 84.15 -26.07 0.92 5.60 18.30 2.61 0.00 -BGO_Z1_1 19 0 1 94.05 -26.07 0.93 3.87 20.04 2.54 0.00 -BGO_Z1_1 0 1 1 -94.05 -15.64 1.00 3.45 22.22 2.45 0.00 -BGO_Z1_1 1 1 1 -84.15 -15.64 0.99 5.24 19.83 2.53 0.00 -BGO_Z1_1 2 1 1 -74.25 -15.64 0.99 4.22 21.96 2.42 0.00 -BGO_Z1_1 3 1 1 -64.35 -15.64 0.99 4.74 19.69 2.48 0.00 -BGO_Z1_1 4 1 1 -54.45 -15.64 0.99 4.07 20.84 2.49 0.00 -BGO_Z1_1 5 1 1 -44.55 -15.64 1.00 4.19 21.35 2.26 0.03 -BGO_Z1_1 6 1 1 -34.65 -15.64 1.01 2.62 21.41 2.43 0.00 -BGO_Z1_1 7 1 1 -24.75 -15.64 1.01 2.64 23.64 2.29 0.03 -BGO_Z1_1 8 1 1 -14.85 -15.64 1.00 2.74 23.13 2.49 0.00 -BGO_Z1_1 9 1 1 -4.95 -15.64 1.01 2.39 18.67 2.49 0.00 -BGO_Z1_1 10 1 1 4.95 -15.64 1.00 2.53 21.84 2.44 0.00 -BGO_Z1_1 11 1 1 14.85 -15.64 0.99 4.54 23.52 2.39 0.02 -BGO_Z1_1 12 1 1 24.75 -15.64 0.99 4.32 22.24 2.47 0.00 -BGO_Z1_1 13 1 1 34.65 -15.64 0.99 4.39 20.45 2.42 0.00 -BGO_Z1_1 14 1 1 44.55 -15.64 0.99 4.72 17.56 2.58 0.00 -BGO_Z1_1 15 1 1 54.45 -15.64 1.00 3.96 24.90 2.07 0.05 -BGO_Z1_1 16 1 1 64.35 -15.64 1.00 3.05 20.84 2.55 0.00 -BGO_Z1_1 17 1 1 74.25 -15.64 1.00 3.50 20.59 2.59 0.00 -BGO_Z1_1 18 1 1 84.15 -15.64 0.96 5.78 22.17 2.39 0.06 -BGO_Z1_1 19 1 1 94.05 -15.64 0.93 3.48 21.41 2.52 0.04 -BGO_Z1_1 0 2 1 -94.05 -5.21 0.99 3.41 21.38 2.52 0.00 -BGO_Z1_1 1 2 1 -84.15 -5.21 1.00 3.65 22.49 2.49 0.00 -BGO_Z1_1 2 2 1 -74.25 -5.21 0.99 4.64 21.69 2.51 0.00 -BGO_Z1_1 3 2 1 -64.35 -5.21 0.98 6.07 21.69 2.49 0.00 -BGO_Z1_1 4 2 1 -54.45 -5.21 1.00 4.30 21.49 2.47 0.00 -BGO_Z1_1 5 2 1 -44.55 -5.21 1.01 2.07 23.68 2.34 0.01 -BGO_Z1_1 6 2 1 -34.65 -5.21 1.00 2.47 19.85 2.61 0.00 -BGO_Z1_1 7 2 1 -24.75 -5.21 1.00 2.10 22.98 2.39 0.02 -BGO_Z1_1 8 2 1 -14.85 -5.21 1.00 3.37 19.73 2.56 0.00 -BGO_Z1_1 9 2 1 -4.95 -5.21 0.99 4.76 19.98 2.45 0.00 -BGO_Z1_1 10 2 1 4.95 -5.21 0.99 4.56 21.21 2.37 0.00 -BGO_Z1_1 11 2 1 14.85 -5.21 0.99 5.71 22.43 2.44 0.00 -BGO_Z1_1 12 2 1 24.75 -5.21 0.98 5.97 19.81 2.43 0.00 -BGO_Z1_1 13 2 1 34.65 -5.21 0.98 6.00 20.87 2.57 0.00 -BGO_Z1_1 14 2 1 44.55 -5.21 1.01 3.12 21.71 2.47 0.00 -BGO_Z1_1 15 2 1 54.45 -5.21 1.01 4.19 21.19 2.59 0.00 -BGO_Z1_1 16 2 1 64.35 -5.21 1.02 4.19 20.88 2.65 0.00 -BGO_Z1_1 17 2 1 74.25 -5.21 1.05 4.92 21.78 2.71 0.00 -BGO_Z1_1 18 2 1 84.15 -5.21 1.09 3.17 21.18 2.96 0.04 -BGO_Z1_1 19 2 1 94.05 -5.21 1.08 1.30 19.95 2.36 0.30 -BGO_Z1_1 0 3 1 -94.05 5.21 0.99 3.41 21.38 2.52 0.00 -BGO_Z1_1 1 3 1 -84.15 5.21 1.00 3.65 22.49 2.49 0.00 -BGO_Z1_1 2 3 1 -74.25 5.21 0.99 4.64 21.69 2.51 0.00 -BGO_Z1_1 3 3 1 -64.35 5.21 0.98 6.07 21.69 2.49 0.00 -BGO_Z1_1 4 3 1 -54.45 5.21 1.00 4.30 21.49 2.47 0.00 -BGO_Z1_1 5 3 1 -44.55 5.21 1.01 2.07 23.68 2.34 0.01 -BGO_Z1_1 6 3 1 -34.65 5.21 1.00 2.47 19.85 2.61 0.00 -BGO_Z1_1 7 3 1 -24.75 5.21 1.00 2.10 22.98 2.39 0.02 -BGO_Z1_1 8 3 1 -14.85 5.21 1.00 3.37 19.73 2.56 0.00 -BGO_Z1_1 9 3 1 -4.95 5.21 0.99 4.76 19.98 2.45 0.00 -BGO_Z1_1 10 3 1 4.95 5.21 0.99 4.56 21.21 2.37 0.00 -BGO_Z1_1 11 3 1 14.85 5.21 0.99 5.71 22.43 2.44 0.00 -BGO_Z1_1 12 3 1 24.75 5.21 0.98 5.97 19.81 2.43 0.00 -BGO_Z1_1 13 3 1 34.65 5.21 0.98 6.00 20.87 2.57 0.00 -BGO_Z1_1 14 3 1 44.55 5.21 1.01 3.12 21.71 2.47 0.00 -BGO_Z1_1 15 3 1 54.45 5.21 1.01 4.19 21.19 2.59 0.00 -BGO_Z1_1 16 3 1 64.35 5.21 1.02 4.19 20.88 2.65 0.00 -BGO_Z1_1 17 3 1 74.25 5.21 1.05 4.92 21.78 2.71 0.00 -BGO_Z1_1 18 3 1 84.15 5.21 1.09 3.17 21.18 2.96 0.04 -BGO_Z1_1 19 3 1 94.05 5.21 1.08 1.30 19.95 2.36 0.30 -BGO_Z1_1 0 4 1 -94.05 15.64 1.00 3.45 22.22 2.45 0.00 -BGO_Z1_1 1 4 1 -84.15 15.64 0.99 5.24 19.83 2.53 0.00 -BGO_Z1_1 2 4 1 -74.25 15.64 0.99 4.22 21.96 2.42 0.00 -BGO_Z1_1 3 4 1 -64.35 15.64 0.99 4.74 19.69 2.48 0.00 -BGO_Z1_1 4 4 1 -54.45 15.64 0.99 4.07 20.84 2.49 0.00 -BGO_Z1_1 5 4 1 -44.55 15.64 1.00 4.19 21.35 2.26 0.03 -BGO_Z1_1 6 4 1 -34.65 15.64 1.01 2.62 21.41 2.43 0.00 -BGO_Z1_1 7 4 1 -24.75 15.64 1.01 2.64 23.64 2.29 0.03 -BGO_Z1_1 8 4 1 -14.85 15.64 1.00 2.74 23.13 2.49 0.00 -BGO_Z1_1 9 4 1 -4.95 15.64 1.01 2.39 18.67 2.49 0.00 -BGO_Z1_1 10 4 1 4.95 15.64 1.00 2.53 21.84 2.44 0.00 -BGO_Z1_1 11 4 1 14.85 15.64 0.99 4.54 23.52 2.39 0.02 -BGO_Z1_1 12 4 1 24.75 15.64 0.99 4.32 22.24 2.47 0.00 -BGO_Z1_1 13 4 1 34.65 15.64 0.99 4.39 20.45 2.42 0.00 -BGO_Z1_1 14 4 1 44.55 15.64 0.99 4.72 17.56 2.58 0.00 -BGO_Z1_1 15 4 1 54.45 15.64 1.00 3.96 24.90 2.07 0.05 -BGO_Z1_1 16 4 1 64.35 15.64 1.00 3.05 20.84 2.55 0.00 -BGO_Z1_1 17 4 1 74.25 15.64 1.00 3.50 20.59 2.59 0.00 -BGO_Z1_1 18 4 1 84.15 15.64 0.96 5.78 22.17 2.39 0.06 -BGO_Z1_1 19 4 1 94.05 15.64 0.93 3.48 21.41 2.52 0.04 -BGO_Z1_1 0 5 1 -94.05 26.07 0.98 6.16 22.23 2.44 0.00 -BGO_Z1_1 1 5 1 -84.15 26.07 1.01 2.42 19.24 2.60 0.00 -BGO_Z1_1 2 5 1 -74.25 26.07 1.00 2.43 21.69 2.39 0.00 -BGO_Z1_1 3 5 1 -64.35 26.07 1.01 2.04 16.47 2.69 0.00 -BGO_Z1_1 4 5 1 -54.45 26.07 1.00 2.98 23.91 2.41 0.00 -BGO_Z1_1 5 5 1 -44.55 26.07 1.00 3.98 22.47 2.39 0.00 -BGO_Z1_1 6 5 1 -34.65 26.07 1.00 3.42 19.40 2.54 0.00 -BGO_Z1_1 7 5 1 -24.75 26.07 1.01 2.03 21.08 2.47 0.00 -BGO_Z1_1 8 5 1 -14.85 26.07 0.99 4.32 24.57 2.42 0.00 -BGO_Z1_1 9 5 1 -4.95 26.07 0.99 4.93 23.19 2.35 0.00 -BGO_Z1_1 10 5 1 4.95 26.07 1.00 3.46 24.82 2.23 0.04 -BGO_Z1_1 11 5 1 14.85 26.07 0.99 4.70 19.02 2.51 0.00 -BGO_Z1_1 12 5 1 24.75 26.07 0.99 4.33 21.71 2.46 0.00 -BGO_Z1_1 13 5 1 34.65 26.07 0.98 5.67 21.54 2.46 0.00 -BGO_Z1_1 14 5 1 44.55 26.07 0.99 3.88 24.84 2.34 0.00 -BGO_Z1_1 15 5 1 54.45 26.07 0.98 5.14 21.17 2.45 0.00 -BGO_Z1_1 16 5 1 64.35 26.07 0.97 3.39 21.01 2.52 0.00 -BGO_Z1_1 17 5 1 74.25 26.07 0.94 4.82 21.03 2.54 0.00 -BGO_Z1_1 18 5 1 84.15 26.07 0.92 5.60 18.30 2.61 0.00 -BGO_Z1_1 19 5 1 94.05 26.07 0.93 3.87 20.04 2.54 0.00 -BGO_Z1_1 0 0 2 -94.05 -26.07 0.98 6.16 22.23 2.44 0.00 -BGO_Z1_1 1 0 2 -84.15 -26.07 1.01 2.42 19.24 2.60 0.00 -BGO_Z1_1 2 0 2 -74.25 -26.07 1.00 2.43 21.69 2.39 0.00 -BGO_Z1_1 3 0 2 -64.35 -26.07 1.01 2.04 16.47 2.69 0.00 -BGO_Z1_1 4 0 2 -54.45 -26.07 1.00 2.98 23.91 2.41 0.00 -BGO_Z1_1 5 0 2 -44.55 -26.07 1.00 3.98 22.47 2.39 0.00 -BGO_Z1_1 6 0 2 -34.65 -26.07 1.00 3.42 19.40 2.54 0.00 -BGO_Z1_1 7 0 2 -24.75 -26.07 1.01 2.03 21.08 2.47 0.00 -BGO_Z1_1 8 0 2 -14.85 -26.07 0.99 4.32 24.57 2.42 0.00 -BGO_Z1_1 9 0 2 -4.95 -26.07 0.99 4.93 23.19 2.35 0.00 -BGO_Z1_1 10 0 2 4.95 -26.07 1.00 3.46 24.82 2.23 0.04 -BGO_Z1_1 11 0 2 14.85 -26.07 0.99 4.70 19.02 2.51 0.00 -BGO_Z1_1 12 0 2 24.75 -26.07 0.99 4.33 21.71 2.46 0.00 -BGO_Z1_1 13 0 2 34.65 -26.07 0.98 5.67 21.54 2.46 0.00 -BGO_Z1_1 14 0 2 44.55 -26.07 0.99 3.88 24.84 2.34 0.00 -BGO_Z1_1 15 0 2 54.45 -26.07 0.98 5.14 21.17 2.45 0.00 -BGO_Z1_1 16 0 2 64.35 -26.07 0.97 3.39 21.01 2.52 0.00 -BGO_Z1_1 17 0 2 74.25 -26.07 0.94 4.82 21.03 2.54 0.00 -BGO_Z1_1 18 0 2 84.15 -26.07 0.92 5.60 18.30 2.61 0.00 -BGO_Z1_1 19 0 2 94.05 -26.07 0.93 3.87 20.04 2.54 0.00 -BGO_Z1_1 0 1 2 -94.05 -15.64 1.00 3.45 22.22 2.45 0.00 -BGO_Z1_1 1 1 2 -84.15 -15.64 0.99 5.24 19.83 2.53 0.00 -BGO_Z1_1 2 1 2 -74.25 -15.64 0.99 4.22 21.96 2.42 0.00 -BGO_Z1_1 3 1 2 -64.35 -15.64 0.99 4.74 19.69 2.48 0.00 -BGO_Z1_1 4 1 2 -54.45 -15.64 0.99 4.07 20.84 2.49 0.00 -BGO_Z1_1 5 1 2 -44.55 -15.64 1.00 4.19 21.35 2.26 0.03 -BGO_Z1_1 6 1 2 -34.65 -15.64 1.01 2.62 21.41 2.43 0.00 -BGO_Z1_1 7 1 2 -24.75 -15.64 1.01 2.64 23.64 2.29 0.03 -BGO_Z1_1 8 1 2 -14.85 -15.64 1.00 2.74 23.13 2.49 0.00 -BGO_Z1_1 9 1 2 -4.95 -15.64 1.01 2.39 18.67 2.49 0.00 -BGO_Z1_1 10 1 2 4.95 -15.64 1.00 2.53 21.84 2.44 0.00 -BGO_Z1_1 11 1 2 14.85 -15.64 0.99 4.54 23.52 2.39 0.02 -BGO_Z1_1 12 1 2 24.75 -15.64 0.99 4.32 22.24 2.47 0.00 -BGO_Z1_1 13 1 2 34.65 -15.64 0.99 4.39 20.45 2.42 0.00 -BGO_Z1_1 14 1 2 44.55 -15.64 0.99 4.72 17.56 2.58 0.00 -BGO_Z1_1 15 1 2 54.45 -15.64 1.00 3.96 24.90 2.07 0.05 -BGO_Z1_1 16 1 2 64.35 -15.64 1.00 3.05 20.84 2.55 0.00 -BGO_Z1_1 17 1 2 74.25 -15.64 1.00 3.50 20.59 2.59 0.00 -BGO_Z1_1 18 1 2 84.15 -15.64 0.96 5.78 22.17 2.39 0.06 -BGO_Z1_1 19 1 2 94.05 -15.64 0.93 3.48 21.41 2.52 0.04 -BGO_Z1_1 0 2 2 -94.05 -5.21 0.99 3.41 21.38 2.52 0.00 -BGO_Z1_1 1 2 2 -84.15 -5.21 1.00 3.65 22.49 2.49 0.00 -BGO_Z1_1 2 2 2 -74.25 -5.21 0.99 4.64 21.69 2.51 0.00 -BGO_Z1_1 3 2 2 -64.35 -5.21 0.98 6.07 21.69 2.49 0.00 -BGO_Z1_1 4 2 2 -54.45 -5.21 1.00 4.30 21.49 2.47 0.00 -BGO_Z1_1 5 2 2 -44.55 -5.21 1.01 2.07 23.68 2.34 0.01 -BGO_Z1_1 6 2 2 -34.65 -5.21 1.00 2.47 19.85 2.61 0.00 -BGO_Z1_1 7 2 2 -24.75 -5.21 1.00 2.10 22.98 2.39 0.02 -BGO_Z1_1 8 2 2 -14.85 -5.21 1.00 3.37 19.73 2.56 0.00 -BGO_Z1_1 9 2 2 -4.95 -5.21 0.99 4.76 19.98 2.45 0.00 -BGO_Z1_1 10 2 2 4.95 -5.21 0.99 4.56 21.21 2.37 0.00 -BGO_Z1_1 11 2 2 14.85 -5.21 0.99 5.71 22.43 2.44 0.00 -BGO_Z1_1 12 2 2 24.75 -5.21 0.98 5.97 19.81 2.43 0.00 -BGO_Z1_1 13 2 2 34.65 -5.21 0.98 6.00 20.87 2.57 0.00 -BGO_Z1_1 14 2 2 44.55 -5.21 1.01 3.12 21.71 2.47 0.00 -BGO_Z1_1 15 2 2 54.45 -5.21 1.01 4.19 21.19 2.59 0.00 -BGO_Z1_1 16 2 2 64.35 -5.21 1.02 4.19 20.88 2.65 0.00 -BGO_Z1_1 17 2 2 74.25 -5.21 1.05 4.92 21.78 2.71 0.00 -BGO_Z1_1 18 2 2 84.15 -5.21 1.09 3.17 21.18 2.96 0.04 -BGO_Z1_1 19 2 2 94.05 -5.21 1.08 1.30 19.95 2.36 0.30 -BGO_Z1_1 0 3 2 -94.05 5.21 0.99 3.41 21.38 2.52 0.00 -BGO_Z1_1 1 3 2 -84.15 5.21 1.00 3.65 22.49 2.49 0.00 -BGO_Z1_1 2 3 2 -74.25 5.21 0.99 4.64 21.69 2.51 0.00 -BGO_Z1_1 3 3 2 -64.35 5.21 0.98 6.07 21.69 2.49 0.00 -BGO_Z1_1 4 3 2 -54.45 5.21 1.00 4.30 21.49 2.47 0.00 -BGO_Z1_1 5 3 2 -44.55 5.21 1.01 2.07 23.68 2.34 0.01 -BGO_Z1_1 6 3 2 -34.65 5.21 1.00 2.47 19.85 2.61 0.00 -BGO_Z1_1 7 3 2 -24.75 5.21 1.00 2.10 22.98 2.39 0.02 -BGO_Z1_1 8 3 2 -14.85 5.21 1.00 3.37 19.73 2.56 0.00 -BGO_Z1_1 9 3 2 -4.95 5.21 0.99 4.76 19.98 2.45 0.00 -BGO_Z1_1 10 3 2 4.95 5.21 0.99 4.56 21.21 2.37 0.00 -BGO_Z1_1 11 3 2 14.85 5.21 0.99 5.71 22.43 2.44 0.00 -BGO_Z1_1 12 3 2 24.75 5.21 0.98 5.97 19.81 2.43 0.00 -BGO_Z1_1 13 3 2 34.65 5.21 0.98 6.00 20.87 2.57 0.00 -BGO_Z1_1 14 3 2 44.55 5.21 1.01 3.12 21.71 2.47 0.00 -BGO_Z1_1 15 3 2 54.45 5.21 1.01 4.19 21.19 2.59 0.00 -BGO_Z1_1 16 3 2 64.35 5.21 1.02 4.19 20.88 2.65 0.00 -BGO_Z1_1 17 3 2 74.25 5.21 1.05 4.92 21.78 2.71 0.00 -BGO_Z1_1 18 3 2 84.15 5.21 1.09 3.17 21.18 2.96 0.04 -BGO_Z1_1 19 3 2 94.05 5.21 1.08 1.30 19.95 2.36 0.30 -BGO_Z1_1 0 4 2 -94.05 15.64 1.00 3.45 22.22 2.45 0.00 -BGO_Z1_1 1 4 2 -84.15 15.64 0.99 5.24 19.83 2.53 0.00 -BGO_Z1_1 2 4 2 -74.25 15.64 0.99 4.22 21.96 2.42 0.00 -BGO_Z1_1 3 4 2 -64.35 15.64 0.99 4.74 19.69 2.48 0.00 -BGO_Z1_1 4 4 2 -54.45 15.64 0.99 4.07 20.84 2.49 0.00 -BGO_Z1_1 5 4 2 -44.55 15.64 1.00 4.19 21.35 2.26 0.03 -BGO_Z1_1 6 4 2 -34.65 15.64 1.01 2.62 21.41 2.43 0.00 -BGO_Z1_1 7 4 2 -24.75 15.64 1.01 2.64 23.64 2.29 0.03 -BGO_Z1_1 8 4 2 -14.85 15.64 1.00 2.74 23.13 2.49 0.00 -BGO_Z1_1 9 4 2 -4.95 15.64 1.01 2.39 18.67 2.49 0.00 -BGO_Z1_1 10 4 2 4.95 15.64 1.00 2.53 21.84 2.44 0.00 -BGO_Z1_1 11 4 2 14.85 15.64 0.99 4.54 23.52 2.39 0.02 -BGO_Z1_1 12 4 2 24.75 15.64 0.99 4.32 22.24 2.47 0.00 -BGO_Z1_1 13 4 2 34.65 15.64 0.99 4.39 20.45 2.42 0.00 -BGO_Z1_1 14 4 2 44.55 15.64 0.99 4.72 17.56 2.58 0.00 -BGO_Z1_1 15 4 2 54.45 15.64 1.00 3.96 24.90 2.07 0.05 -BGO_Z1_1 16 4 2 64.35 15.64 1.00 3.05 20.84 2.55 0.00 -BGO_Z1_1 17 4 2 74.25 15.64 1.00 3.50 20.59 2.59 0.00 -BGO_Z1_1 18 4 2 84.15 15.64 0.96 5.78 22.17 2.39 0.06 -BGO_Z1_1 19 4 2 94.05 15.64 0.93 3.48 21.41 2.52 0.04 -BGO_Z1_1 0 5 2 -94.05 26.07 0.98 6.16 22.23 2.44 0.00 -BGO_Z1_1 1 5 2 -84.15 26.07 1.01 2.42 19.24 2.60 0.00 -BGO_Z1_1 2 5 2 -74.25 26.07 1.00 2.43 21.69 2.39 0.00 -BGO_Z1_1 3 5 2 -64.35 26.07 1.01 2.04 16.47 2.69 0.00 -BGO_Z1_1 4 5 2 -54.45 26.07 1.00 2.98 23.91 2.41 0.00 -BGO_Z1_1 5 5 2 -44.55 26.07 1.00 3.98 22.47 2.39 0.00 -BGO_Z1_1 6 5 2 -34.65 26.07 1.00 3.42 19.40 2.54 0.00 -BGO_Z1_1 7 5 2 -24.75 26.07 1.01 2.03 21.08 2.47 0.00 -BGO_Z1_1 8 5 2 -14.85 26.07 0.99 4.32 24.57 2.42 0.00 -BGO_Z1_1 9 5 2 -4.95 26.07 0.99 4.93 23.19 2.35 0.00 -BGO_Z1_1 10 5 2 4.95 26.07 1.00 3.46 24.82 2.23 0.04 -BGO_Z1_1 11 5 2 14.85 26.07 0.99 4.70 19.02 2.51 0.00 -BGO_Z1_1 12 5 2 24.75 26.07 0.99 4.33 21.71 2.46 0.00 -BGO_Z1_1 13 5 2 34.65 26.07 0.98 5.67 21.54 2.46 0.00 -BGO_Z1_1 14 5 2 44.55 26.07 0.99 3.88 24.84 2.34 0.00 -BGO_Z1_1 15 5 2 54.45 26.07 0.98 5.14 21.17 2.45 0.00 -BGO_Z1_1 16 5 2 64.35 26.07 0.97 3.39 21.01 2.52 0.00 -BGO_Z1_1 17 5 2 74.25 26.07 0.94 4.82 21.03 2.54 0.00 -BGO_Z1_1 18 5 2 84.15 26.07 0.92 5.60 18.30 2.61 0.00 -BGO_Z1_1 19 5 2 94.05 26.07 0.93 3.87 20.04 2.54 0.00 -BGO_Z1_2 0 0 0 -80.63 -26.92 1.00 3.01 23.11 2.43 0.02 -BGO_Z1_2 1 0 0 -70.55 -26.92 0.99 4.24 21.16 2.44 0.00 -BGO_Z1_2 2 0 0 -60.47 -26.92 0.99 4.68 19.29 2.49 0.00 -BGO_Z1_2 3 0 0 -50.39 -26.92 1.00 2.62 20.08 2.42 0.00 -BGO_Z1_2 4 0 0 -40.32 -26.92 1.00 2.94 20.04 2.61 0.00 -BGO_Z1_2 5 0 0 -30.24 -26.92 0.99 5.01 22.53 2.32 0.00 -BGO_Z1_2 6 0 0 -20.16 -26.92 0.99 4.38 21.77 2.41 0.00 -BGO_Z1_2 7 0 0 -10.08 -26.92 1.01 1.86 22.40 2.41 0.00 -BGO_Z1_2 8 0 0 -0.00 -26.92 1.01 2.20 18.40 2.56 0.00 -BGO_Z1_2 9 0 0 10.08 -26.92 0.98 4.87 22.74 2.38 0.00 -BGO_Z1_2 10 0 0 20.16 -26.92 0.99 3.58 25.95 2.26 0.03 -BGO_Z1_2 11 0 0 30.24 -26.92 0.99 3.87 20.77 2.37 0.03 -BGO_Z1_2 12 0 0 40.32 -26.92 0.98 4.32 23.09 2.34 0.00 -BGO_Z1_2 13 0 0 50.39 -26.92 0.97 2.24 21.72 2.45 0.00 -BGO_Z1_2 14 0 0 60.47 -26.92 0.93 4.46 18.95 2.52 0.00 -BGO_Z1_2 15 0 0 70.55 -26.92 0.93 4.66 20.39 2.41 0.00 -BGO_Z1_2 16 0 0 80.63 -26.92 0.94 5.10 21.92 2.53 0.00 -BGO_Z1_2 0 1 0 -80.63 -16.15 1.01 1.74 20.75 2.51 0.00 -BGO_Z1_2 1 1 0 -70.55 -16.15 1.01 3.02 24.09 2.28 0.00 -BGO_Z1_2 2 1 0 -60.47 -16.15 0.99 4.18 22.21 2.43 0.00 -BGO_Z1_2 3 1 0 -50.39 -16.15 1.01 1.79 22.03 2.38 0.03 -BGO_Z1_2 4 1 0 -40.32 -16.15 0.99 4.05 20.95 2.43 0.00 -BGO_Z1_2 5 1 0 -30.24 -16.15 1.00 2.91 19.41 2.55 0.00 -BGO_Z1_2 6 1 0 -20.16 -16.15 1.00 2.48 19.46 2.48 0.00 -BGO_Z1_2 7 1 0 -10.08 -16.15 1.00 3.00 22.92 2.41 0.00 -BGO_Z1_2 8 1 0 -0.00 -16.15 1.02 0.94 19.85 2.54 0.00 -BGO_Z1_2 9 1 0 10.08 -16.15 1.00 4.26 22.17 2.23 0.04 -BGO_Z1_2 10 1 0 20.16 -16.15 1.00 2.99 21.04 2.54 0.00 -BGO_Z1_2 11 1 0 30.24 -16.15 1.00 3.44 24.01 2.35 0.00 -BGO_Z1_2 12 1 0 40.32 -16.15 1.00 2.62 21.56 2.45 0.00 -BGO_Z1_2 13 1 0 50.39 -16.15 0.99 3.96 20.08 2.55 0.00 -BGO_Z1_2 14 1 0 60.47 -16.15 1.00 3.67 21.38 2.62 0.00 -BGO_Z1_2 15 1 0 70.55 -16.15 0.97 2.54 24.30 2.44 0.05 -BGO_Z1_2 16 1 0 80.63 -16.15 0.93 2.47 23.48 2.51 0.02 -BGO_Z1_2 0 2 0 -80.63 -5.38 1.01 1.55 21.11 2.49 0.00 -BGO_Z1_2 1 2 0 -70.55 -5.38 1.00 3.01 22.17 2.51 0.00 -BGO_Z1_2 2 2 0 -60.47 -5.38 1.01 2.33 22.36 2.37 0.00 -BGO_Z1_2 3 2 0 -50.39 -5.38 0.98 4.88 22.96 2.40 0.00 -BGO_Z1_2 4 2 0 -40.32 -5.38 1.00 2.52 23.12 2.35 0.00 -BGO_Z1_2 5 2 0 -30.24 -5.38 1.00 3.00 20.22 2.58 0.00 -BGO_Z1_2 6 2 0 -20.16 -5.38 0.98 5.55 22.43 2.40 0.00 -BGO_Z1_2 7 2 0 -10.08 -5.38 1.01 1.93 20.77 2.51 0.00 -BGO_Z1_2 8 2 0 -0.00 -5.38 1.00 2.65 21.35 2.42 0.00 -BGO_Z1_2 9 2 0 10.08 -5.38 1.00 2.62 22.44 2.38 0.00 -BGO_Z1_2 10 2 0 20.16 -5.38 1.00 2.23 22.28 2.41 0.00 -BGO_Z1_2 11 2 0 30.24 -5.38 1.00 3.43 19.15 2.54 0.00 -BGO_Z1_2 12 2 0 40.32 -5.38 1.02 1.93 24.86 2.41 0.00 -BGO_Z1_2 13 2 0 50.39 -5.38 1.04 2.09 20.95 2.59 0.00 -BGO_Z1_2 14 2 0 60.47 -5.38 1.05 3.29 26.37 1.81 0.09 -BGO_Z1_2 15 2 0 70.55 -5.38 1.09 2.19 16.61 3.16 0.04 -BGO_Z1_2 16 2 0 80.63 -5.38 1.07 2.05 20.52 2.86 0.25 -BGO_Z1_2 0 3 0 -80.63 5.38 1.01 1.55 21.11 2.49 0.00 -BGO_Z1_2 1 3 0 -70.55 5.38 1.00 3.01 22.17 2.51 0.00 -BGO_Z1_2 2 3 0 -60.47 5.38 1.01 2.33 22.36 2.37 0.00 -BGO_Z1_2 3 3 0 -50.39 5.38 0.98 4.88 22.96 2.40 0.00 -BGO_Z1_2 4 3 0 -40.32 5.38 1.00 2.52 23.12 2.35 0.00 -BGO_Z1_2 5 3 0 -30.24 5.38 1.00 3.00 20.22 2.58 0.00 -BGO_Z1_2 6 3 0 -20.16 5.38 0.98 5.55 22.43 2.40 0.00 -BGO_Z1_2 7 3 0 -10.08 5.38 1.01 1.93 20.77 2.51 0.00 -BGO_Z1_2 8 3 0 -0.00 5.38 1.00 2.65 21.35 2.42 0.00 -BGO_Z1_2 9 3 0 10.08 5.38 1.00 2.62 22.44 2.38 0.00 -BGO_Z1_2 10 3 0 20.16 5.38 1.00 2.23 22.28 2.41 0.00 -BGO_Z1_2 11 3 0 30.24 5.38 1.00 3.43 19.15 2.54 0.00 -BGO_Z1_2 12 3 0 40.32 5.38 1.02 1.93 24.86 2.41 0.00 -BGO_Z1_2 13 3 0 50.39 5.38 1.04 2.09 20.95 2.59 0.00 -BGO_Z1_2 14 3 0 60.47 5.38 1.05 3.29 26.37 1.81 0.09 -BGO_Z1_2 15 3 0 70.55 5.38 1.09 2.19 16.61 3.16 0.04 -BGO_Z1_2 16 3 0 80.63 5.38 1.07 2.05 20.52 2.86 0.25 -BGO_Z1_2 0 4 0 -80.63 16.15 1.01 1.74 20.75 2.51 0.00 -BGO_Z1_2 1 4 0 -70.55 16.15 1.01 3.02 24.09 2.28 0.00 -BGO_Z1_2 2 4 0 -60.47 16.15 0.99 4.18 22.21 2.43 0.00 -BGO_Z1_2 3 4 0 -50.39 16.15 1.01 1.79 22.03 2.38 0.03 -BGO_Z1_2 4 4 0 -40.32 16.15 0.99 4.05 20.95 2.43 0.00 -BGO_Z1_2 5 4 0 -30.24 16.15 1.00 2.91 19.41 2.55 0.00 -BGO_Z1_2 6 4 0 -20.16 16.15 1.00 2.48 19.46 2.48 0.00 -BGO_Z1_2 7 4 0 -10.08 16.15 1.00 3.00 22.92 2.41 0.00 -BGO_Z1_2 8 4 0 -0.00 16.15 1.02 0.94 19.85 2.54 0.00 -BGO_Z1_2 9 4 0 10.08 16.15 1.00 4.26 22.17 2.23 0.04 -BGO_Z1_2 10 4 0 20.16 16.15 1.00 2.99 21.04 2.54 0.00 -BGO_Z1_2 11 4 0 30.24 16.15 1.00 3.44 24.01 2.35 0.00 -BGO_Z1_2 12 4 0 40.32 16.15 1.00 2.62 21.56 2.45 0.00 -BGO_Z1_2 13 4 0 50.39 16.15 0.99 3.96 20.08 2.55 0.00 -BGO_Z1_2 14 4 0 60.47 16.15 1.00 3.67 21.38 2.62 0.00 -BGO_Z1_2 15 4 0 70.55 16.15 0.97 2.54 24.30 2.44 0.05 -BGO_Z1_2 16 4 0 80.63 16.15 0.93 2.47 23.48 2.51 0.02 -BGO_Z1_2 0 5 0 -80.63 26.92 1.00 3.01 23.11 2.43 0.02 -BGO_Z1_2 1 5 0 -70.55 26.92 0.99 4.24 21.16 2.44 0.00 -BGO_Z1_2 2 5 0 -60.47 26.92 0.99 4.68 19.29 2.49 0.00 -BGO_Z1_2 3 5 0 -50.39 26.92 1.00 2.62 20.08 2.42 0.00 -BGO_Z1_2 4 5 0 -40.32 26.92 1.00 2.94 20.04 2.61 0.00 -BGO_Z1_2 5 5 0 -30.24 26.92 0.99 5.01 22.53 2.32 0.00 -BGO_Z1_2 6 5 0 -20.16 26.92 0.99 4.38 21.77 2.41 0.00 -BGO_Z1_2 7 5 0 -10.08 26.92 1.01 1.86 22.40 2.41 0.00 -BGO_Z1_2 8 5 0 -0.00 26.92 1.01 2.20 18.40 2.56 0.00 -BGO_Z1_2 9 5 0 10.08 26.92 0.98 4.87 22.74 2.38 0.00 -BGO_Z1_2 10 5 0 20.16 26.92 0.99 3.58 25.95 2.26 0.03 -BGO_Z1_2 11 5 0 30.24 26.92 0.99 3.87 20.77 2.37 0.03 -BGO_Z1_2 12 5 0 40.32 26.92 0.98 4.32 23.09 2.34 0.00 -BGO_Z1_2 13 5 0 50.39 26.92 0.97 2.24 21.72 2.45 0.00 -BGO_Z1_2 14 5 0 60.47 26.92 0.93 4.46 18.95 2.52 0.00 -BGO_Z1_2 15 5 0 70.55 26.92 0.93 4.66 20.39 2.41 0.00 -BGO_Z1_2 16 5 0 80.63 26.92 0.94 5.10 21.92 2.53 0.00 -BGO_Z1_2 0 0 1 -80.63 -26.92 1.00 3.01 23.11 2.43 0.02 -BGO_Z1_2 1 0 1 -70.55 -26.92 0.99 4.24 21.16 2.44 0.00 -BGO_Z1_2 2 0 1 -60.47 -26.92 0.99 4.68 19.29 2.49 0.00 -BGO_Z1_2 3 0 1 -50.39 -26.92 1.00 2.62 20.08 2.42 0.00 -BGO_Z1_2 4 0 1 -40.32 -26.92 1.00 2.94 20.04 2.61 0.00 -BGO_Z1_2 5 0 1 -30.24 -26.92 0.99 5.01 22.53 2.32 0.00 -BGO_Z1_2 6 0 1 -20.16 -26.92 0.99 4.38 21.77 2.41 0.00 -BGO_Z1_2 7 0 1 -10.08 -26.92 1.01 1.86 22.40 2.41 0.00 -BGO_Z1_2 8 0 1 -0.00 -26.92 1.01 2.20 18.40 2.56 0.00 -BGO_Z1_2 9 0 1 10.08 -26.92 0.98 4.87 22.74 2.38 0.00 -BGO_Z1_2 10 0 1 20.16 -26.92 0.99 3.58 25.95 2.26 0.03 -BGO_Z1_2 11 0 1 30.24 -26.92 0.99 3.87 20.77 2.37 0.03 -BGO_Z1_2 12 0 1 40.32 -26.92 0.98 4.32 23.09 2.34 0.00 -BGO_Z1_2 13 0 1 50.39 -26.92 0.97 2.24 21.72 2.45 0.00 -BGO_Z1_2 14 0 1 60.47 -26.92 0.93 4.46 18.95 2.52 0.00 -BGO_Z1_2 15 0 1 70.55 -26.92 0.93 4.66 20.39 2.41 0.00 -BGO_Z1_2 16 0 1 80.63 -26.92 0.94 5.10 21.92 2.53 0.00 -BGO_Z1_2 0 1 1 -80.63 -16.15 1.01 1.74 20.75 2.51 0.00 -BGO_Z1_2 1 1 1 -70.55 -16.15 1.01 3.02 24.09 2.28 0.00 -BGO_Z1_2 2 1 1 -60.47 -16.15 0.99 4.18 22.21 2.43 0.00 -BGO_Z1_2 3 1 1 -50.39 -16.15 1.01 1.79 22.03 2.38 0.03 -BGO_Z1_2 4 1 1 -40.32 -16.15 0.99 4.05 20.95 2.43 0.00 -BGO_Z1_2 5 1 1 -30.24 -16.15 1.00 2.91 19.41 2.55 0.00 -BGO_Z1_2 6 1 1 -20.16 -16.15 1.00 2.48 19.46 2.48 0.00 -BGO_Z1_2 7 1 1 -10.08 -16.15 1.00 3.00 22.92 2.41 0.00 -BGO_Z1_2 8 1 1 -0.00 -16.15 1.02 0.94 19.85 2.54 0.00 -BGO_Z1_2 9 1 1 10.08 -16.15 1.00 4.26 22.17 2.23 0.04 -BGO_Z1_2 10 1 1 20.16 -16.15 1.00 2.99 21.04 2.54 0.00 -BGO_Z1_2 11 1 1 30.24 -16.15 1.00 3.44 24.01 2.35 0.00 -BGO_Z1_2 12 1 1 40.32 -16.15 1.00 2.62 21.56 2.45 0.00 -BGO_Z1_2 13 1 1 50.39 -16.15 0.99 3.96 20.08 2.55 0.00 -BGO_Z1_2 14 1 1 60.47 -16.15 1.00 3.67 21.38 2.62 0.00 -BGO_Z1_2 15 1 1 70.55 -16.15 0.97 2.54 24.30 2.44 0.05 -BGO_Z1_2 16 1 1 80.63 -16.15 0.93 2.47 23.48 2.51 0.02 -BGO_Z1_2 0 2 1 -80.63 -5.38 1.01 1.55 21.11 2.49 0.00 -BGO_Z1_2 1 2 1 -70.55 -5.38 1.00 3.01 22.17 2.51 0.00 -BGO_Z1_2 2 2 1 -60.47 -5.38 1.01 2.33 22.36 2.37 0.00 -BGO_Z1_2 3 2 1 -50.39 -5.38 0.98 4.88 22.96 2.40 0.00 -BGO_Z1_2 4 2 1 -40.32 -5.38 1.00 2.52 23.12 2.35 0.00 -BGO_Z1_2 5 2 1 -30.24 -5.38 1.00 3.00 20.22 2.58 0.00 -BGO_Z1_2 6 2 1 -20.16 -5.38 0.98 5.55 22.43 2.40 0.00 -BGO_Z1_2 7 2 1 -10.08 -5.38 1.01 1.93 20.77 2.51 0.00 -BGO_Z1_2 8 2 1 -0.00 -5.38 1.00 2.65 21.35 2.42 0.00 -BGO_Z1_2 9 2 1 10.08 -5.38 1.00 2.62 22.44 2.38 0.00 -BGO_Z1_2 10 2 1 20.16 -5.38 1.00 2.23 22.28 2.41 0.00 -BGO_Z1_2 11 2 1 30.24 -5.38 1.00 3.43 19.15 2.54 0.00 -BGO_Z1_2 12 2 1 40.32 -5.38 1.02 1.93 24.86 2.41 0.00 -BGO_Z1_2 13 2 1 50.39 -5.38 1.04 2.09 20.95 2.59 0.00 -BGO_Z1_2 14 2 1 60.47 -5.38 1.05 3.29 26.37 1.81 0.09 -BGO_Z1_2 15 2 1 70.55 -5.38 1.09 2.19 16.61 3.16 0.04 -BGO_Z1_2 16 2 1 80.63 -5.38 1.07 2.05 20.52 2.86 0.25 -BGO_Z1_2 0 3 1 -80.63 5.38 1.01 1.55 21.11 2.49 0.00 -BGO_Z1_2 1 3 1 -70.55 5.38 1.00 3.01 22.17 2.51 0.00 -BGO_Z1_2 2 3 1 -60.47 5.38 1.01 2.33 22.36 2.37 0.00 -BGO_Z1_2 3 3 1 -50.39 5.38 0.98 4.88 22.96 2.40 0.00 -BGO_Z1_2 4 3 1 -40.32 5.38 1.00 2.52 23.12 2.35 0.00 -BGO_Z1_2 5 3 1 -30.24 5.38 1.00 3.00 20.22 2.58 0.00 -BGO_Z1_2 6 3 1 -20.16 5.38 0.98 5.55 22.43 2.40 0.00 -BGO_Z1_2 7 3 1 -10.08 5.38 1.01 1.93 20.77 2.51 0.00 -BGO_Z1_2 8 3 1 -0.00 5.38 1.00 2.65 21.35 2.42 0.00 -BGO_Z1_2 9 3 1 10.08 5.38 1.00 2.62 22.44 2.38 0.00 -BGO_Z1_2 10 3 1 20.16 5.38 1.00 2.23 22.28 2.41 0.00 -BGO_Z1_2 11 3 1 30.24 5.38 1.00 3.43 19.15 2.54 0.00 -BGO_Z1_2 12 3 1 40.32 5.38 1.02 1.93 24.86 2.41 0.00 -BGO_Z1_2 13 3 1 50.39 5.38 1.04 2.09 20.95 2.59 0.00 -BGO_Z1_2 14 3 1 60.47 5.38 1.05 3.29 26.37 1.81 0.09 -BGO_Z1_2 15 3 1 70.55 5.38 1.09 2.19 16.61 3.16 0.04 -BGO_Z1_2 16 3 1 80.63 5.38 1.07 2.05 20.52 2.86 0.25 -BGO_Z1_2 0 4 1 -80.63 16.15 1.01 1.74 20.75 2.51 0.00 -BGO_Z1_2 1 4 1 -70.55 16.15 1.01 3.02 24.09 2.28 0.00 -BGO_Z1_2 2 4 1 -60.47 16.15 0.99 4.18 22.21 2.43 0.00 -BGO_Z1_2 3 4 1 -50.39 16.15 1.01 1.79 22.03 2.38 0.03 -BGO_Z1_2 4 4 1 -40.32 16.15 0.99 4.05 20.95 2.43 0.00 -BGO_Z1_2 5 4 1 -30.24 16.15 1.00 2.91 19.41 2.55 0.00 -BGO_Z1_2 6 4 1 -20.16 16.15 1.00 2.48 19.46 2.48 0.00 -BGO_Z1_2 7 4 1 -10.08 16.15 1.00 3.00 22.92 2.41 0.00 -BGO_Z1_2 8 4 1 -0.00 16.15 1.02 0.94 19.85 2.54 0.00 -BGO_Z1_2 9 4 1 10.08 16.15 1.00 4.26 22.17 2.23 0.04 -BGO_Z1_2 10 4 1 20.16 16.15 1.00 2.99 21.04 2.54 0.00 -BGO_Z1_2 11 4 1 30.24 16.15 1.00 3.44 24.01 2.35 0.00 -BGO_Z1_2 12 4 1 40.32 16.15 1.00 2.62 21.56 2.45 0.00 -BGO_Z1_2 13 4 1 50.39 16.15 0.99 3.96 20.08 2.55 0.00 -BGO_Z1_2 14 4 1 60.47 16.15 1.00 3.67 21.38 2.62 0.00 -BGO_Z1_2 15 4 1 70.55 16.15 0.97 2.54 24.30 2.44 0.05 -BGO_Z1_2 16 4 1 80.63 16.15 0.93 2.47 23.48 2.51 0.02 -BGO_Z1_2 0 5 1 -80.63 26.92 1.00 3.01 23.11 2.43 0.02 -BGO_Z1_2 1 5 1 -70.55 26.92 0.99 4.24 21.16 2.44 0.00 -BGO_Z1_2 2 5 1 -60.47 26.92 0.99 4.68 19.29 2.49 0.00 -BGO_Z1_2 3 5 1 -50.39 26.92 1.00 2.62 20.08 2.42 0.00 -BGO_Z1_2 4 5 1 -40.32 26.92 1.00 2.94 20.04 2.61 0.00 -BGO_Z1_2 5 5 1 -30.24 26.92 0.99 5.01 22.53 2.32 0.00 -BGO_Z1_2 6 5 1 -20.16 26.92 0.99 4.38 21.77 2.41 0.00 -BGO_Z1_2 7 5 1 -10.08 26.92 1.01 1.86 22.40 2.41 0.00 -BGO_Z1_2 8 5 1 -0.00 26.92 1.01 2.20 18.40 2.56 0.00 -BGO_Z1_2 9 5 1 10.08 26.92 0.98 4.87 22.74 2.38 0.00 -BGO_Z1_2 10 5 1 20.16 26.92 0.99 3.58 25.95 2.26 0.03 -BGO_Z1_2 11 5 1 30.24 26.92 0.99 3.87 20.77 2.37 0.03 -BGO_Z1_2 12 5 1 40.32 26.92 0.98 4.32 23.09 2.34 0.00 -BGO_Z1_2 13 5 1 50.39 26.92 0.97 2.24 21.72 2.45 0.00 -BGO_Z1_2 14 5 1 60.47 26.92 0.93 4.46 18.95 2.52 0.00 -BGO_Z1_2 15 5 1 70.55 26.92 0.93 4.66 20.39 2.41 0.00 -BGO_Z1_2 16 5 1 80.63 26.92 0.94 5.10 21.92 2.53 0.00 -BGO_Z1_2 0 0 2 -80.63 -26.92 1.00 3.01 23.11 2.43 0.02 -BGO_Z1_2 1 0 2 -70.55 -26.92 0.99 4.24 21.16 2.44 0.00 -BGO_Z1_2 2 0 2 -60.47 -26.92 0.99 4.68 19.29 2.49 0.00 -BGO_Z1_2 3 0 2 -50.39 -26.92 1.00 2.62 20.08 2.42 0.00 -BGO_Z1_2 4 0 2 -40.32 -26.92 1.00 2.94 20.04 2.61 0.00 -BGO_Z1_2 5 0 2 -30.24 -26.92 0.99 5.01 22.53 2.32 0.00 -BGO_Z1_2 6 0 2 -20.16 -26.92 0.99 4.38 21.77 2.41 0.00 -BGO_Z1_2 7 0 2 -10.08 -26.92 1.01 1.86 22.40 2.41 0.00 -BGO_Z1_2 8 0 2 -0.00 -26.92 1.01 2.20 18.40 2.56 0.00 -BGO_Z1_2 9 0 2 10.08 -26.92 0.98 4.87 22.74 2.38 0.00 -BGO_Z1_2 10 0 2 20.16 -26.92 0.99 3.58 25.95 2.26 0.03 -BGO_Z1_2 11 0 2 30.24 -26.92 0.99 3.87 20.77 2.37 0.03 -BGO_Z1_2 12 0 2 40.32 -26.92 0.98 4.32 23.09 2.34 0.00 -BGO_Z1_2 13 0 2 50.39 -26.92 0.97 2.24 21.72 2.45 0.00 -BGO_Z1_2 14 0 2 60.47 -26.92 0.93 4.46 18.95 2.52 0.00 -BGO_Z1_2 15 0 2 70.55 -26.92 0.93 4.66 20.39 2.41 0.00 -BGO_Z1_2 16 0 2 80.63 -26.92 0.94 5.10 21.92 2.53 0.00 -BGO_Z1_2 0 1 2 -80.63 -16.15 1.01 1.74 20.75 2.51 0.00 -BGO_Z1_2 1 1 2 -70.55 -16.15 1.01 3.02 24.09 2.28 0.00 -BGO_Z1_2 2 1 2 -60.47 -16.15 0.99 4.18 22.21 2.43 0.00 -BGO_Z1_2 3 1 2 -50.39 -16.15 1.01 1.79 22.03 2.38 0.03 -BGO_Z1_2 4 1 2 -40.32 -16.15 0.99 4.05 20.95 2.43 0.00 -BGO_Z1_2 5 1 2 -30.24 -16.15 1.00 2.91 19.41 2.55 0.00 -BGO_Z1_2 6 1 2 -20.16 -16.15 1.00 2.48 19.46 2.48 0.00 -BGO_Z1_2 7 1 2 -10.08 -16.15 1.00 3.00 22.92 2.41 0.00 -BGO_Z1_2 8 1 2 -0.00 -16.15 1.02 0.94 19.85 2.54 0.00 -BGO_Z1_2 9 1 2 10.08 -16.15 1.00 4.26 22.17 2.23 0.04 -BGO_Z1_2 10 1 2 20.16 -16.15 1.00 2.99 21.04 2.54 0.00 -BGO_Z1_2 11 1 2 30.24 -16.15 1.00 3.44 24.01 2.35 0.00 -BGO_Z1_2 12 1 2 40.32 -16.15 1.00 2.62 21.56 2.45 0.00 -BGO_Z1_2 13 1 2 50.39 -16.15 0.99 3.96 20.08 2.55 0.00 -BGO_Z1_2 14 1 2 60.47 -16.15 1.00 3.67 21.38 2.62 0.00 -BGO_Z1_2 15 1 2 70.55 -16.15 0.97 2.54 24.30 2.44 0.05 -BGO_Z1_2 16 1 2 80.63 -16.15 0.93 2.47 23.48 2.51 0.02 -BGO_Z1_2 0 2 2 -80.63 -5.38 1.01 1.55 21.11 2.49 0.00 -BGO_Z1_2 1 2 2 -70.55 -5.38 1.00 3.01 22.17 2.51 0.00 -BGO_Z1_2 2 2 2 -60.47 -5.38 1.01 2.33 22.36 2.37 0.00 -BGO_Z1_2 3 2 2 -50.39 -5.38 0.98 4.88 22.96 2.40 0.00 -BGO_Z1_2 4 2 2 -40.32 -5.38 1.00 2.52 23.12 2.35 0.00 -BGO_Z1_2 5 2 2 -30.24 -5.38 1.00 3.00 20.22 2.58 0.00 -BGO_Z1_2 6 2 2 -20.16 -5.38 0.98 5.55 22.43 2.40 0.00 -BGO_Z1_2 7 2 2 -10.08 -5.38 1.01 1.93 20.77 2.51 0.00 -BGO_Z1_2 8 2 2 -0.00 -5.38 1.00 2.65 21.35 2.42 0.00 -BGO_Z1_2 9 2 2 10.08 -5.38 1.00 2.62 22.44 2.38 0.00 -BGO_Z1_2 10 2 2 20.16 -5.38 1.00 2.23 22.28 2.41 0.00 -BGO_Z1_2 11 2 2 30.24 -5.38 1.00 3.43 19.15 2.54 0.00 -BGO_Z1_2 12 2 2 40.32 -5.38 1.02 1.93 24.86 2.41 0.00 -BGO_Z1_2 13 2 2 50.39 -5.38 1.04 2.09 20.95 2.59 0.00 -BGO_Z1_2 14 2 2 60.47 -5.38 1.05 3.29 26.37 1.81 0.09 -BGO_Z1_2 15 2 2 70.55 -5.38 1.09 2.19 16.61 3.16 0.04 -BGO_Z1_2 16 2 2 80.63 -5.38 1.07 2.05 20.52 2.86 0.25 -BGO_Z1_2 0 3 2 -80.63 5.38 1.01 1.55 21.11 2.49 0.00 -BGO_Z1_2 1 3 2 -70.55 5.38 1.00 3.01 22.17 2.51 0.00 -BGO_Z1_2 2 3 2 -60.47 5.38 1.01 2.33 22.36 2.37 0.00 -BGO_Z1_2 3 3 2 -50.39 5.38 0.98 4.88 22.96 2.40 0.00 -BGO_Z1_2 4 3 2 -40.32 5.38 1.00 2.52 23.12 2.35 0.00 -BGO_Z1_2 5 3 2 -30.24 5.38 1.00 3.00 20.22 2.58 0.00 -BGO_Z1_2 6 3 2 -20.16 5.38 0.98 5.55 22.43 2.40 0.00 -BGO_Z1_2 7 3 2 -10.08 5.38 1.01 1.93 20.77 2.51 0.00 -BGO_Z1_2 8 3 2 -0.00 5.38 1.00 2.65 21.35 2.42 0.00 -BGO_Z1_2 9 3 2 10.08 5.38 1.00 2.62 22.44 2.38 0.00 -BGO_Z1_2 10 3 2 20.16 5.38 1.00 2.23 22.28 2.41 0.00 -BGO_Z1_2 11 3 2 30.24 5.38 1.00 3.43 19.15 2.54 0.00 -BGO_Z1_2 12 3 2 40.32 5.38 1.02 1.93 24.86 2.41 0.00 -BGO_Z1_2 13 3 2 50.39 5.38 1.04 2.09 20.95 2.59 0.00 -BGO_Z1_2 14 3 2 60.47 5.38 1.05 3.29 26.37 1.81 0.09 -BGO_Z1_2 15 3 2 70.55 5.38 1.09 2.19 16.61 3.16 0.04 -BGO_Z1_2 16 3 2 80.63 5.38 1.07 2.05 20.52 2.86 0.25 -BGO_Z1_2 0 4 2 -80.63 16.15 1.01 1.74 20.75 2.51 0.00 -BGO_Z1_2 1 4 2 -70.55 16.15 1.01 3.02 24.09 2.28 0.00 -BGO_Z1_2 2 4 2 -60.47 16.15 0.99 4.18 22.21 2.43 0.00 -BGO_Z1_2 3 4 2 -50.39 16.15 1.01 1.79 22.03 2.38 0.03 -BGO_Z1_2 4 4 2 -40.32 16.15 0.99 4.05 20.95 2.43 0.00 -BGO_Z1_2 5 4 2 -30.24 16.15 1.00 2.91 19.41 2.55 0.00 -BGO_Z1_2 6 4 2 -20.16 16.15 1.00 2.48 19.46 2.48 0.00 -BGO_Z1_2 7 4 2 -10.08 16.15 1.00 3.00 22.92 2.41 0.00 -BGO_Z1_2 8 4 2 -0.00 16.15 1.02 0.94 19.85 2.54 0.00 -BGO_Z1_2 9 4 2 10.08 16.15 1.00 4.26 22.17 2.23 0.04 -BGO_Z1_2 10 4 2 20.16 16.15 1.00 2.99 21.04 2.54 0.00 -BGO_Z1_2 11 4 2 30.24 16.15 1.00 3.44 24.01 2.35 0.00 -BGO_Z1_2 12 4 2 40.32 16.15 1.00 2.62 21.56 2.45 0.00 -BGO_Z1_2 13 4 2 50.39 16.15 0.99 3.96 20.08 2.55 0.00 -BGO_Z1_2 14 4 2 60.47 16.15 1.00 3.67 21.38 2.62 0.00 -BGO_Z1_2 15 4 2 70.55 16.15 0.97 2.54 24.30 2.44 0.05 -BGO_Z1_2 16 4 2 80.63 16.15 0.93 2.47 23.48 2.51 0.02 -BGO_Z1_2 0 5 2 -80.63 26.92 1.00 3.01 23.11 2.43 0.02 -BGO_Z1_2 1 5 2 -70.55 26.92 0.99 4.24 21.16 2.44 0.00 -BGO_Z1_2 2 5 2 -60.47 26.92 0.99 4.68 19.29 2.49 0.00 -BGO_Z1_2 3 5 2 -50.39 26.92 1.00 2.62 20.08 2.42 0.00 -BGO_Z1_2 4 5 2 -40.32 26.92 1.00 2.94 20.04 2.61 0.00 -BGO_Z1_2 5 5 2 -30.24 26.92 0.99 5.01 22.53 2.32 0.00 -BGO_Z1_2 6 5 2 -20.16 26.92 0.99 4.38 21.77 2.41 0.00 -BGO_Z1_2 7 5 2 -10.08 26.92 1.01 1.86 22.40 2.41 0.00 -BGO_Z1_2 8 5 2 -0.00 26.92 1.01 2.20 18.40 2.56 0.00 -BGO_Z1_2 9 5 2 10.08 26.92 0.98 4.87 22.74 2.38 0.00 -BGO_Z1_2 10 5 2 20.16 26.92 0.99 3.58 25.95 2.26 0.03 -BGO_Z1_2 11 5 2 30.24 26.92 0.99 3.87 20.77 2.37 0.03 -BGO_Z1_2 12 5 2 40.32 26.92 0.98 4.32 23.09 2.34 0.00 -BGO_Z1_2 13 5 2 50.39 26.92 0.97 2.24 21.72 2.45 0.00 -BGO_Z1_2 14 5 2 60.47 26.92 0.93 4.46 18.95 2.52 0.00 -BGO_Z1_2 15 5 2 70.55 26.92 0.93 4.66 20.39 2.41 0.00 -BGO_Z1_2 16 5 2 80.63 26.92 0.94 5.10 21.92 2.53 0.00 -BGO_Z1_3 0 0 0 -80.63 -26.92 1.00 3.01 23.11 2.43 0.02 -BGO_Z1_3 1 0 0 -70.55 -26.92 0.99 4.24 21.16 2.44 0.00 -BGO_Z1_3 2 0 0 -60.47 -26.92 0.99 4.68 19.29 2.49 0.00 -BGO_Z1_3 3 0 0 -50.39 -26.92 1.00 2.62 20.08 2.42 0.00 -BGO_Z1_3 4 0 0 -40.32 -26.92 1.00 2.94 20.04 2.61 0.00 -BGO_Z1_3 5 0 0 -30.24 -26.92 0.99 5.01 22.53 2.32 0.00 -BGO_Z1_3 6 0 0 -20.16 -26.92 0.99 4.38 21.77 2.41 0.00 -BGO_Z1_3 7 0 0 -10.08 -26.92 1.01 1.86 22.40 2.41 0.00 -BGO_Z1_3 8 0 0 -0.00 -26.92 1.01 2.20 18.40 2.56 0.00 -BGO_Z1_3 9 0 0 10.08 -26.92 0.98 4.87 22.74 2.38 0.00 -BGO_Z1_3 10 0 0 20.16 -26.92 0.99 3.58 25.95 2.26 0.03 -BGO_Z1_3 11 0 0 30.24 -26.92 0.99 3.87 20.77 2.37 0.03 -BGO_Z1_3 12 0 0 40.32 -26.92 0.98 4.32 23.09 2.34 0.00 -BGO_Z1_3 13 0 0 50.39 -26.92 0.97 2.24 21.72 2.45 0.00 -BGO_Z1_3 14 0 0 60.47 -26.92 0.93 4.46 18.95 2.52 0.00 -BGO_Z1_3 15 0 0 70.55 -26.92 0.93 4.66 20.39 2.41 0.00 -BGO_Z1_3 16 0 0 80.63 -26.92 0.94 5.10 21.92 2.53 0.00 -BGO_Z1_3 0 1 0 -80.63 -16.15 1.01 1.74 20.75 2.51 0.00 -BGO_Z1_3 1 1 0 -70.55 -16.15 1.01 3.02 24.09 2.28 0.00 -BGO_Z1_3 2 1 0 -60.47 -16.15 0.99 4.18 22.21 2.43 0.00 -BGO_Z1_3 3 1 0 -50.39 -16.15 1.01 1.79 22.03 2.38 0.03 -BGO_Z1_3 4 1 0 -40.32 -16.15 0.99 4.05 20.95 2.43 0.00 -BGO_Z1_3 5 1 0 -30.24 -16.15 1.00 2.91 19.41 2.55 0.00 -BGO_Z1_3 6 1 0 -20.16 -16.15 1.00 2.48 19.46 2.48 0.00 -BGO_Z1_3 7 1 0 -10.08 -16.15 1.00 3.00 22.92 2.41 0.00 -BGO_Z1_3 8 1 0 -0.00 -16.15 1.02 0.94 19.85 2.54 0.00 -BGO_Z1_3 9 1 0 10.08 -16.15 1.00 4.26 22.17 2.23 0.04 -BGO_Z1_3 10 1 0 20.16 -16.15 1.00 2.99 21.04 2.54 0.00 -BGO_Z1_3 11 1 0 30.24 -16.15 1.00 3.44 24.01 2.35 0.00 -BGO_Z1_3 12 1 0 40.32 -16.15 1.00 2.62 21.56 2.45 0.00 -BGO_Z1_3 13 1 0 50.39 -16.15 0.99 3.96 20.08 2.55 0.00 -BGO_Z1_3 14 1 0 60.47 -16.15 1.00 3.67 21.38 2.62 0.00 -BGO_Z1_3 15 1 0 70.55 -16.15 0.97 2.54 24.30 2.44 0.05 -BGO_Z1_3 16 1 0 80.63 -16.15 0.93 2.47 23.48 2.51 0.02 -BGO_Z1_3 0 2 0 -80.63 -5.38 1.01 1.55 21.11 2.49 0.00 -BGO_Z1_3 1 2 0 -70.55 -5.38 1.00 3.01 22.17 2.51 0.00 -BGO_Z1_3 2 2 0 -60.47 -5.38 1.01 2.33 22.36 2.37 0.00 -BGO_Z1_3 3 2 0 -50.39 -5.38 0.98 4.88 22.96 2.40 0.00 -BGO_Z1_3 4 2 0 -40.32 -5.38 1.00 2.52 23.12 2.35 0.00 -BGO_Z1_3 5 2 0 -30.24 -5.38 1.00 3.00 20.22 2.58 0.00 -BGO_Z1_3 6 2 0 -20.16 -5.38 0.98 5.55 22.43 2.40 0.00 -BGO_Z1_3 7 2 0 -10.08 -5.38 1.01 1.93 20.77 2.51 0.00 -BGO_Z1_3 8 2 0 -0.00 -5.38 1.00 2.65 21.35 2.42 0.00 -BGO_Z1_3 9 2 0 10.08 -5.38 1.00 2.62 22.44 2.38 0.00 -BGO_Z1_3 10 2 0 20.16 -5.38 1.00 2.23 22.28 2.41 0.00 -BGO_Z1_3 11 2 0 30.24 -5.38 1.00 3.43 19.15 2.54 0.00 -BGO_Z1_3 12 2 0 40.32 -5.38 1.02 1.93 24.86 2.41 0.00 -BGO_Z1_3 13 2 0 50.39 -5.38 1.04 2.09 20.95 2.59 0.00 -BGO_Z1_3 14 2 0 60.47 -5.38 1.05 3.29 26.37 1.81 0.09 -BGO_Z1_3 15 2 0 70.55 -5.38 1.09 2.19 16.61 3.16 0.04 -BGO_Z1_3 16 2 0 80.63 -5.38 1.07 2.05 20.52 2.86 0.25 -BGO_Z1_3 0 3 0 -80.63 5.38 1.01 1.55 21.11 2.49 0.00 -BGO_Z1_3 1 3 0 -70.55 5.38 1.00 3.01 22.17 2.51 0.00 -BGO_Z1_3 2 3 0 -60.47 5.38 1.01 2.33 22.36 2.37 0.00 -BGO_Z1_3 3 3 0 -50.39 5.38 0.98 4.88 22.96 2.40 0.00 -BGO_Z1_3 4 3 0 -40.32 5.38 1.00 2.52 23.12 2.35 0.00 -BGO_Z1_3 5 3 0 -30.24 5.38 1.00 3.00 20.22 2.58 0.00 -BGO_Z1_3 6 3 0 -20.16 5.38 0.98 5.55 22.43 2.40 0.00 -BGO_Z1_3 7 3 0 -10.08 5.38 1.01 1.93 20.77 2.51 0.00 -BGO_Z1_3 8 3 0 -0.00 5.38 1.00 2.65 21.35 2.42 0.00 -BGO_Z1_3 9 3 0 10.08 5.38 1.00 2.62 22.44 2.38 0.00 -BGO_Z1_3 10 3 0 20.16 5.38 1.00 2.23 22.28 2.41 0.00 -BGO_Z1_3 11 3 0 30.24 5.38 1.00 3.43 19.15 2.54 0.00 -BGO_Z1_3 12 3 0 40.32 5.38 1.02 1.93 24.86 2.41 0.00 -BGO_Z1_3 13 3 0 50.39 5.38 1.04 2.09 20.95 2.59 0.00 -BGO_Z1_3 14 3 0 60.47 5.38 1.05 3.29 26.37 1.81 0.09 -BGO_Z1_3 15 3 0 70.55 5.38 1.09 2.19 16.61 3.16 0.04 -BGO_Z1_3 16 3 0 80.63 5.38 1.07 2.05 20.52 2.86 0.25 -BGO_Z1_3 0 4 0 -80.63 16.15 1.01 1.74 20.75 2.51 0.00 -BGO_Z1_3 1 4 0 -70.55 16.15 1.01 3.02 24.09 2.28 0.00 -BGO_Z1_3 2 4 0 -60.47 16.15 0.99 4.18 22.21 2.43 0.00 -BGO_Z1_3 3 4 0 -50.39 16.15 1.01 1.79 22.03 2.38 0.03 -BGO_Z1_3 4 4 0 -40.32 16.15 0.99 4.05 20.95 2.43 0.00 -BGO_Z1_3 5 4 0 -30.24 16.15 1.00 2.91 19.41 2.55 0.00 -BGO_Z1_3 6 4 0 -20.16 16.15 1.00 2.48 19.46 2.48 0.00 -BGO_Z1_3 7 4 0 -10.08 16.15 1.00 3.00 22.92 2.41 0.00 -BGO_Z1_3 8 4 0 -0.00 16.15 1.02 0.94 19.85 2.54 0.00 -BGO_Z1_3 9 4 0 10.08 16.15 1.00 4.26 22.17 2.23 0.04 -BGO_Z1_3 10 4 0 20.16 16.15 1.00 2.99 21.04 2.54 0.00 -BGO_Z1_3 11 4 0 30.24 16.15 1.00 3.44 24.01 2.35 0.00 -BGO_Z1_3 12 4 0 40.32 16.15 1.00 2.62 21.56 2.45 0.00 -BGO_Z1_3 13 4 0 50.39 16.15 0.99 3.96 20.08 2.55 0.00 -BGO_Z1_3 14 4 0 60.47 16.15 1.00 3.67 21.38 2.62 0.00 -BGO_Z1_3 15 4 0 70.55 16.15 0.97 2.54 24.30 2.44 0.05 -BGO_Z1_3 16 4 0 80.63 16.15 0.93 2.47 23.48 2.51 0.02 -BGO_Z1_3 0 5 0 -80.63 26.92 1.00 3.01 23.11 2.43 0.02 -BGO_Z1_3 1 5 0 -70.55 26.92 0.99 4.24 21.16 2.44 0.00 -BGO_Z1_3 2 5 0 -60.47 26.92 0.99 4.68 19.29 2.49 0.00 -BGO_Z1_3 3 5 0 -50.39 26.92 1.00 2.62 20.08 2.42 0.00 -BGO_Z1_3 4 5 0 -40.32 26.92 1.00 2.94 20.04 2.61 0.00 -BGO_Z1_3 5 5 0 -30.24 26.92 0.99 5.01 22.53 2.32 0.00 -BGO_Z1_3 6 5 0 -20.16 26.92 0.99 4.38 21.77 2.41 0.00 -BGO_Z1_3 7 5 0 -10.08 26.92 1.01 1.86 22.40 2.41 0.00 -BGO_Z1_3 8 5 0 -0.00 26.92 1.01 2.20 18.40 2.56 0.00 -BGO_Z1_3 9 5 0 10.08 26.92 0.98 4.87 22.74 2.38 0.00 -BGO_Z1_3 10 5 0 20.16 26.92 0.99 3.58 25.95 2.26 0.03 -BGO_Z1_3 11 5 0 30.24 26.92 0.99 3.87 20.77 2.37 0.03 -BGO_Z1_3 12 5 0 40.32 26.92 0.98 4.32 23.09 2.34 0.00 -BGO_Z1_3 13 5 0 50.39 26.92 0.97 2.24 21.72 2.45 0.00 -BGO_Z1_3 14 5 0 60.47 26.92 0.93 4.46 18.95 2.52 0.00 -BGO_Z1_3 15 5 0 70.55 26.92 0.93 4.66 20.39 2.41 0.00 -BGO_Z1_3 16 5 0 80.63 26.92 0.94 5.10 21.92 2.53 0.00 -BGO_Z1_3 0 0 1 -80.63 -26.92 1.00 3.01 23.11 2.43 0.02 -BGO_Z1_3 1 0 1 -70.55 -26.92 0.99 4.24 21.16 2.44 0.00 -BGO_Z1_3 2 0 1 -60.47 -26.92 0.99 4.68 19.29 2.49 0.00 -BGO_Z1_3 3 0 1 -50.39 -26.92 1.00 2.62 20.08 2.42 0.00 -BGO_Z1_3 4 0 1 -40.32 -26.92 1.00 2.94 20.04 2.61 0.00 -BGO_Z1_3 5 0 1 -30.24 -26.92 0.99 5.01 22.53 2.32 0.00 -BGO_Z1_3 6 0 1 -20.16 -26.92 0.99 4.38 21.77 2.41 0.00 -BGO_Z1_3 7 0 1 -10.08 -26.92 1.01 1.86 22.40 2.41 0.00 -BGO_Z1_3 8 0 1 -0.00 -26.92 1.01 2.20 18.40 2.56 0.00 -BGO_Z1_3 9 0 1 10.08 -26.92 0.98 4.87 22.74 2.38 0.00 -BGO_Z1_3 10 0 1 20.16 -26.92 0.99 3.58 25.95 2.26 0.03 -BGO_Z1_3 11 0 1 30.24 -26.92 0.99 3.87 20.77 2.37 0.03 -BGO_Z1_3 12 0 1 40.32 -26.92 0.98 4.32 23.09 2.34 0.00 -BGO_Z1_3 13 0 1 50.39 -26.92 0.97 2.24 21.72 2.45 0.00 -BGO_Z1_3 14 0 1 60.47 -26.92 0.93 4.46 18.95 2.52 0.00 -BGO_Z1_3 15 0 1 70.55 -26.92 0.93 4.66 20.39 2.41 0.00 -BGO_Z1_3 16 0 1 80.63 -26.92 0.94 5.10 21.92 2.53 0.00 -BGO_Z1_3 0 1 1 -80.63 -16.15 1.01 1.74 20.75 2.51 0.00 -BGO_Z1_3 1 1 1 -70.55 -16.15 1.01 3.02 24.09 2.28 0.00 -BGO_Z1_3 2 1 1 -60.47 -16.15 0.99 4.18 22.21 2.43 0.00 -BGO_Z1_3 3 1 1 -50.39 -16.15 1.01 1.79 22.03 2.38 0.03 -BGO_Z1_3 4 1 1 -40.32 -16.15 0.99 4.05 20.95 2.43 0.00 -BGO_Z1_3 5 1 1 -30.24 -16.15 1.00 2.91 19.41 2.55 0.00 -BGO_Z1_3 6 1 1 -20.16 -16.15 1.00 2.48 19.46 2.48 0.00 -BGO_Z1_3 7 1 1 -10.08 -16.15 1.00 3.00 22.92 2.41 0.00 -BGO_Z1_3 8 1 1 -0.00 -16.15 1.02 0.94 19.85 2.54 0.00 -BGO_Z1_3 9 1 1 10.08 -16.15 1.00 4.26 22.17 2.23 0.04 -BGO_Z1_3 10 1 1 20.16 -16.15 1.00 2.99 21.04 2.54 0.00 -BGO_Z1_3 11 1 1 30.24 -16.15 1.00 3.44 24.01 2.35 0.00 -BGO_Z1_3 12 1 1 40.32 -16.15 1.00 2.62 21.56 2.45 0.00 -BGO_Z1_3 13 1 1 50.39 -16.15 0.99 3.96 20.08 2.55 0.00 -BGO_Z1_3 14 1 1 60.47 -16.15 1.00 3.67 21.38 2.62 0.00 -BGO_Z1_3 15 1 1 70.55 -16.15 0.97 2.54 24.30 2.44 0.05 -BGO_Z1_3 16 1 1 80.63 -16.15 0.93 2.47 23.48 2.51 0.02 -BGO_Z1_3 0 2 1 -80.63 -5.38 1.01 1.55 21.11 2.49 0.00 -BGO_Z1_3 1 2 1 -70.55 -5.38 1.00 3.01 22.17 2.51 0.00 -BGO_Z1_3 2 2 1 -60.47 -5.38 1.01 2.33 22.36 2.37 0.00 -BGO_Z1_3 3 2 1 -50.39 -5.38 0.98 4.88 22.96 2.40 0.00 -BGO_Z1_3 4 2 1 -40.32 -5.38 1.00 2.52 23.12 2.35 0.00 -BGO_Z1_3 5 2 1 -30.24 -5.38 1.00 3.00 20.22 2.58 0.00 -BGO_Z1_3 6 2 1 -20.16 -5.38 0.98 5.55 22.43 2.40 0.00 -BGO_Z1_3 7 2 1 -10.08 -5.38 1.01 1.93 20.77 2.51 0.00 -BGO_Z1_3 8 2 1 -0.00 -5.38 1.00 2.65 21.35 2.42 0.00 -BGO_Z1_3 9 2 1 10.08 -5.38 1.00 2.62 22.44 2.38 0.00 -BGO_Z1_3 10 2 1 20.16 -5.38 1.00 2.23 22.28 2.41 0.00 -BGO_Z1_3 11 2 1 30.24 -5.38 1.00 3.43 19.15 2.54 0.00 -BGO_Z1_3 12 2 1 40.32 -5.38 1.02 1.93 24.86 2.41 0.00 -BGO_Z1_3 13 2 1 50.39 -5.38 1.04 2.09 20.95 2.59 0.00 -BGO_Z1_3 14 2 1 60.47 -5.38 1.05 3.29 26.37 1.81 0.09 -BGO_Z1_3 15 2 1 70.55 -5.38 1.09 2.19 16.61 3.16 0.04 -BGO_Z1_3 16 2 1 80.63 -5.38 1.07 2.05 20.52 2.86 0.25 -BGO_Z1_3 0 3 1 -80.63 5.38 1.01 1.55 21.11 2.49 0.00 -BGO_Z1_3 1 3 1 -70.55 5.38 1.00 3.01 22.17 2.51 0.00 -BGO_Z1_3 2 3 1 -60.47 5.38 1.01 2.33 22.36 2.37 0.00 -BGO_Z1_3 3 3 1 -50.39 5.38 0.98 4.88 22.96 2.40 0.00 -BGO_Z1_3 4 3 1 -40.32 5.38 1.00 2.52 23.12 2.35 0.00 -BGO_Z1_3 5 3 1 -30.24 5.38 1.00 3.00 20.22 2.58 0.00 -BGO_Z1_3 6 3 1 -20.16 5.38 0.98 5.55 22.43 2.40 0.00 -BGO_Z1_3 7 3 1 -10.08 5.38 1.01 1.93 20.77 2.51 0.00 -BGO_Z1_3 8 3 1 -0.00 5.38 1.00 2.65 21.35 2.42 0.00 -BGO_Z1_3 9 3 1 10.08 5.38 1.00 2.62 22.44 2.38 0.00 -BGO_Z1_3 10 3 1 20.16 5.38 1.00 2.23 22.28 2.41 0.00 -BGO_Z1_3 11 3 1 30.24 5.38 1.00 3.43 19.15 2.54 0.00 -BGO_Z1_3 12 3 1 40.32 5.38 1.02 1.93 24.86 2.41 0.00 -BGO_Z1_3 13 3 1 50.39 5.38 1.04 2.09 20.95 2.59 0.00 -BGO_Z1_3 14 3 1 60.47 5.38 1.05 3.29 26.37 1.81 0.09 -BGO_Z1_3 15 3 1 70.55 5.38 1.09 2.19 16.61 3.16 0.04 -BGO_Z1_3 16 3 1 80.63 5.38 1.07 2.05 20.52 2.86 0.25 -BGO_Z1_3 0 4 1 -80.63 16.15 1.01 1.74 20.75 2.51 0.00 -BGO_Z1_3 1 4 1 -70.55 16.15 1.01 3.02 24.09 2.28 0.00 -BGO_Z1_3 2 4 1 -60.47 16.15 0.99 4.18 22.21 2.43 0.00 -BGO_Z1_3 3 4 1 -50.39 16.15 1.01 1.79 22.03 2.38 0.03 -BGO_Z1_3 4 4 1 -40.32 16.15 0.99 4.05 20.95 2.43 0.00 -BGO_Z1_3 5 4 1 -30.24 16.15 1.00 2.91 19.41 2.55 0.00 -BGO_Z1_3 6 4 1 -20.16 16.15 1.00 2.48 19.46 2.48 0.00 -BGO_Z1_3 7 4 1 -10.08 16.15 1.00 3.00 22.92 2.41 0.00 -BGO_Z1_3 8 4 1 -0.00 16.15 1.02 0.94 19.85 2.54 0.00 -BGO_Z1_3 9 4 1 10.08 16.15 1.00 4.26 22.17 2.23 0.04 -BGO_Z1_3 10 4 1 20.16 16.15 1.00 2.99 21.04 2.54 0.00 -BGO_Z1_3 11 4 1 30.24 16.15 1.00 3.44 24.01 2.35 0.00 -BGO_Z1_3 12 4 1 40.32 16.15 1.00 2.62 21.56 2.45 0.00 -BGO_Z1_3 13 4 1 50.39 16.15 0.99 3.96 20.08 2.55 0.00 -BGO_Z1_3 14 4 1 60.47 16.15 1.00 3.67 21.38 2.62 0.00 -BGO_Z1_3 15 4 1 70.55 16.15 0.97 2.54 24.30 2.44 0.05 -BGO_Z1_3 16 4 1 80.63 16.15 0.93 2.47 23.48 2.51 0.02 -BGO_Z1_3 0 5 1 -80.63 26.92 1.00 3.01 23.11 2.43 0.02 -BGO_Z1_3 1 5 1 -70.55 26.92 0.99 4.24 21.16 2.44 0.00 -BGO_Z1_3 2 5 1 -60.47 26.92 0.99 4.68 19.29 2.49 0.00 -BGO_Z1_3 3 5 1 -50.39 26.92 1.00 2.62 20.08 2.42 0.00 -BGO_Z1_3 4 5 1 -40.32 26.92 1.00 2.94 20.04 2.61 0.00 -BGO_Z1_3 5 5 1 -30.24 26.92 0.99 5.01 22.53 2.32 0.00 -BGO_Z1_3 6 5 1 -20.16 26.92 0.99 4.38 21.77 2.41 0.00 -BGO_Z1_3 7 5 1 -10.08 26.92 1.01 1.86 22.40 2.41 0.00 -BGO_Z1_3 8 5 1 -0.00 26.92 1.01 2.20 18.40 2.56 0.00 -BGO_Z1_3 9 5 1 10.08 26.92 0.98 4.87 22.74 2.38 0.00 -BGO_Z1_3 10 5 1 20.16 26.92 0.99 3.58 25.95 2.26 0.03 -BGO_Z1_3 11 5 1 30.24 26.92 0.99 3.87 20.77 2.37 0.03 -BGO_Z1_3 12 5 1 40.32 26.92 0.98 4.32 23.09 2.34 0.00 -BGO_Z1_3 13 5 1 50.39 26.92 0.97 2.24 21.72 2.45 0.00 -BGO_Z1_3 14 5 1 60.47 26.92 0.93 4.46 18.95 2.52 0.00 -BGO_Z1_3 15 5 1 70.55 26.92 0.93 4.66 20.39 2.41 0.00 -BGO_Z1_3 16 5 1 80.63 26.92 0.94 5.10 21.92 2.53 0.00 -BGO_Z1_3 0 0 2 -80.63 -26.92 1.00 3.01 23.11 2.43 0.02 -BGO_Z1_3 1 0 2 -70.55 -26.92 0.99 4.24 21.16 2.44 0.00 -BGO_Z1_3 2 0 2 -60.47 -26.92 0.99 4.68 19.29 2.49 0.00 -BGO_Z1_3 3 0 2 -50.39 -26.92 1.00 2.62 20.08 2.42 0.00 -BGO_Z1_3 4 0 2 -40.32 -26.92 1.00 2.94 20.04 2.61 0.00 -BGO_Z1_3 5 0 2 -30.24 -26.92 0.99 5.01 22.53 2.32 0.00 -BGO_Z1_3 6 0 2 -20.16 -26.92 0.99 4.38 21.77 2.41 0.00 -BGO_Z1_3 7 0 2 -10.08 -26.92 1.01 1.86 22.40 2.41 0.00 -BGO_Z1_3 8 0 2 -0.00 -26.92 1.01 2.20 18.40 2.56 0.00 -BGO_Z1_3 9 0 2 10.08 -26.92 0.98 4.87 22.74 2.38 0.00 -BGO_Z1_3 10 0 2 20.16 -26.92 0.99 3.58 25.95 2.26 0.03 -BGO_Z1_3 11 0 2 30.24 -26.92 0.99 3.87 20.77 2.37 0.03 -BGO_Z1_3 12 0 2 40.32 -26.92 0.98 4.32 23.09 2.34 0.00 -BGO_Z1_3 13 0 2 50.39 -26.92 0.97 2.24 21.72 2.45 0.00 -BGO_Z1_3 14 0 2 60.47 -26.92 0.93 4.46 18.95 2.52 0.00 -BGO_Z1_3 15 0 2 70.55 -26.92 0.93 4.66 20.39 2.41 0.00 -BGO_Z1_3 16 0 2 80.63 -26.92 0.94 5.10 21.92 2.53 0.00 -BGO_Z1_3 0 1 2 -80.63 -16.15 1.01 1.74 20.75 2.51 0.00 -BGO_Z1_3 1 1 2 -70.55 -16.15 1.01 3.02 24.09 2.28 0.00 -BGO_Z1_3 2 1 2 -60.47 -16.15 0.99 4.18 22.21 2.43 0.00 -BGO_Z1_3 3 1 2 -50.39 -16.15 1.01 1.79 22.03 2.38 0.03 -BGO_Z1_3 4 1 2 -40.32 -16.15 0.99 4.05 20.95 2.43 0.00 -BGO_Z1_3 5 1 2 -30.24 -16.15 1.00 2.91 19.41 2.55 0.00 -BGO_Z1_3 6 1 2 -20.16 -16.15 1.00 2.48 19.46 2.48 0.00 -BGO_Z1_3 7 1 2 -10.08 -16.15 1.00 3.00 22.92 2.41 0.00 -BGO_Z1_3 8 1 2 -0.00 -16.15 1.02 0.94 19.85 2.54 0.00 -BGO_Z1_3 9 1 2 10.08 -16.15 1.00 4.26 22.17 2.23 0.04 -BGO_Z1_3 10 1 2 20.16 -16.15 1.00 2.99 21.04 2.54 0.00 -BGO_Z1_3 11 1 2 30.24 -16.15 1.00 3.44 24.01 2.35 0.00 -BGO_Z1_3 12 1 2 40.32 -16.15 1.00 2.62 21.56 2.45 0.00 -BGO_Z1_3 13 1 2 50.39 -16.15 0.99 3.96 20.08 2.55 0.00 -BGO_Z1_3 14 1 2 60.47 -16.15 1.00 3.67 21.38 2.62 0.00 -BGO_Z1_3 15 1 2 70.55 -16.15 0.97 2.54 24.30 2.44 0.05 -BGO_Z1_3 16 1 2 80.63 -16.15 0.93 2.47 23.48 2.51 0.02 -BGO_Z1_3 0 2 2 -80.63 -5.38 1.01 1.55 21.11 2.49 0.00 -BGO_Z1_3 1 2 2 -70.55 -5.38 1.00 3.01 22.17 2.51 0.00 -BGO_Z1_3 2 2 2 -60.47 -5.38 1.01 2.33 22.36 2.37 0.00 -BGO_Z1_3 3 2 2 -50.39 -5.38 0.98 4.88 22.96 2.40 0.00 -BGO_Z1_3 4 2 2 -40.32 -5.38 1.00 2.52 23.12 2.35 0.00 -BGO_Z1_3 5 2 2 -30.24 -5.38 1.00 3.00 20.22 2.58 0.00 -BGO_Z1_3 6 2 2 -20.16 -5.38 0.98 5.55 22.43 2.40 0.00 -BGO_Z1_3 7 2 2 -10.08 -5.38 1.01 1.93 20.77 2.51 0.00 -BGO_Z1_3 8 2 2 -0.00 -5.38 1.00 2.65 21.35 2.42 0.00 -BGO_Z1_3 9 2 2 10.08 -5.38 1.00 2.62 22.44 2.38 0.00 -BGO_Z1_3 10 2 2 20.16 -5.38 1.00 2.23 22.28 2.41 0.00 -BGO_Z1_3 11 2 2 30.24 -5.38 1.00 3.43 19.15 2.54 0.00 -BGO_Z1_3 12 2 2 40.32 -5.38 1.02 1.93 24.86 2.41 0.00 -BGO_Z1_3 13 2 2 50.39 -5.38 1.04 2.09 20.95 2.59 0.00 -BGO_Z1_3 14 2 2 60.47 -5.38 1.05 3.29 26.37 1.81 0.09 -BGO_Z1_3 15 2 2 70.55 -5.38 1.09 2.19 16.61 3.16 0.04 -BGO_Z1_3 16 2 2 80.63 -5.38 1.07 2.05 20.52 2.86 0.25 -BGO_Z1_3 0 3 2 -80.63 5.38 1.01 1.55 21.11 2.49 0.00 -BGO_Z1_3 1 3 2 -70.55 5.38 1.00 3.01 22.17 2.51 0.00 -BGO_Z1_3 2 3 2 -60.47 5.38 1.01 2.33 22.36 2.37 0.00 -BGO_Z1_3 3 3 2 -50.39 5.38 0.98 4.88 22.96 2.40 0.00 -BGO_Z1_3 4 3 2 -40.32 5.38 1.00 2.52 23.12 2.35 0.00 -BGO_Z1_3 5 3 2 -30.24 5.38 1.00 3.00 20.22 2.58 0.00 -BGO_Z1_3 6 3 2 -20.16 5.38 0.98 5.55 22.43 2.40 0.00 -BGO_Z1_3 7 3 2 -10.08 5.38 1.01 1.93 20.77 2.51 0.00 -BGO_Z1_3 8 3 2 -0.00 5.38 1.00 2.65 21.35 2.42 0.00 -BGO_Z1_3 9 3 2 10.08 5.38 1.00 2.62 22.44 2.38 0.00 -BGO_Z1_3 10 3 2 20.16 5.38 1.00 2.23 22.28 2.41 0.00 -BGO_Z1_3 11 3 2 30.24 5.38 1.00 3.43 19.15 2.54 0.00 -BGO_Z1_3 12 3 2 40.32 5.38 1.02 1.93 24.86 2.41 0.00 -BGO_Z1_3 13 3 2 50.39 5.38 1.04 2.09 20.95 2.59 0.00 -BGO_Z1_3 14 3 2 60.47 5.38 1.05 3.29 26.37 1.81 0.09 -BGO_Z1_3 15 3 2 70.55 5.38 1.09 2.19 16.61 3.16 0.04 -BGO_Z1_3 16 3 2 80.63 5.38 1.07 2.05 20.52 2.86 0.25 -BGO_Z1_3 0 4 2 -80.63 16.15 1.01 1.74 20.75 2.51 0.00 -BGO_Z1_3 1 4 2 -70.55 16.15 1.01 3.02 24.09 2.28 0.00 -BGO_Z1_3 2 4 2 -60.47 16.15 0.99 4.18 22.21 2.43 0.00 -BGO_Z1_3 3 4 2 -50.39 16.15 1.01 1.79 22.03 2.38 0.03 -BGO_Z1_3 4 4 2 -40.32 16.15 0.99 4.05 20.95 2.43 0.00 -BGO_Z1_3 5 4 2 -30.24 16.15 1.00 2.91 19.41 2.55 0.00 -BGO_Z1_3 6 4 2 -20.16 16.15 1.00 2.48 19.46 2.48 0.00 -BGO_Z1_3 7 4 2 -10.08 16.15 1.00 3.00 22.92 2.41 0.00 -BGO_Z1_3 8 4 2 -0.00 16.15 1.02 0.94 19.85 2.54 0.00 -BGO_Z1_3 9 4 2 10.08 16.15 1.00 4.26 22.17 2.23 0.04 -BGO_Z1_3 10 4 2 20.16 16.15 1.00 2.99 21.04 2.54 0.00 -BGO_Z1_3 11 4 2 30.24 16.15 1.00 3.44 24.01 2.35 0.00 -BGO_Z1_3 12 4 2 40.32 16.15 1.00 2.62 21.56 2.45 0.00 -BGO_Z1_3 13 4 2 50.39 16.15 0.99 3.96 20.08 2.55 0.00 -BGO_Z1_3 14 4 2 60.47 16.15 1.00 3.67 21.38 2.62 0.00 -BGO_Z1_3 15 4 2 70.55 16.15 0.97 2.54 24.30 2.44 0.05 -BGO_Z1_3 16 4 2 80.63 16.15 0.93 2.47 23.48 2.51 0.02 -BGO_Z1_3 0 5 2 -80.63 26.92 1.00 3.01 23.11 2.43 0.02 -BGO_Z1_3 1 5 2 -70.55 26.92 0.99 4.24 21.16 2.44 0.00 -BGO_Z1_3 2 5 2 -60.47 26.92 0.99 4.68 19.29 2.49 0.00 -BGO_Z1_3 3 5 2 -50.39 26.92 1.00 2.62 20.08 2.42 0.00 -BGO_Z1_3 4 5 2 -40.32 26.92 1.00 2.94 20.04 2.61 0.00 -BGO_Z1_3 5 5 2 -30.24 26.92 0.99 5.01 22.53 2.32 0.00 -BGO_Z1_3 6 5 2 -20.16 26.92 0.99 4.38 21.77 2.41 0.00 -BGO_Z1_3 7 5 2 -10.08 26.92 1.01 1.86 22.40 2.41 0.00 -BGO_Z1_3 8 5 2 -0.00 26.92 1.01 2.20 18.40 2.56 0.00 -BGO_Z1_3 9 5 2 10.08 26.92 0.98 4.87 22.74 2.38 0.00 -BGO_Z1_3 10 5 2 20.16 26.92 0.99 3.58 25.95 2.26 0.03 -BGO_Z1_3 11 5 2 30.24 26.92 0.99 3.87 20.77 2.37 0.03 -BGO_Z1_3 12 5 2 40.32 26.92 0.98 4.32 23.09 2.34 0.00 -BGO_Z1_3 13 5 2 50.39 26.92 0.97 2.24 21.72 2.45 0.00 -BGO_Z1_3 14 5 2 60.47 26.92 0.93 4.46 18.95 2.52 0.00 -BGO_Z1_3 15 5 2 70.55 26.92 0.93 4.66 20.39 2.41 0.00 -BGO_Z1_3 16 5 2 80.63 26.92 0.94 5.10 21.92 2.53 0.00 -BGO_Z1_4 0 0 0 -94.05 -35.28 0.98 5.24 17.16 2.76 0.00 -BGO_Z1_4 1 0 0 -84.15 -35.28 0.99 4.12 19.97 2.65 0.00 -BGO_Z1_4 2 0 0 -74.25 -35.28 0.99 4.63 23.88 2.37 0.00 -BGO_Z1_4 3 0 0 -64.35 -35.28 0.99 4.98 21.64 2.56 0.00 -BGO_Z1_4 4 0 0 -54.45 -35.28 0.98 5.43 22.82 2.48 0.00 -BGO_Z1_4 5 0 0 -44.55 -35.28 1.01 1.54 24.54 2.30 0.02 -BGO_Z1_4 6 0 0 -34.65 -35.28 0.98 5.99 20.26 2.52 0.00 -BGO_Z1_4 7 0 0 -24.75 -35.28 1.00 3.21 23.04 2.63 0.00 -BGO_Z1_4 8 0 0 -14.85 -35.28 1.00 2.77 26.16 2.34 0.02 -BGO_Z1_4 9 0 0 -4.95 -35.28 1.00 2.89 21.85 2.61 0.00 -BGO_Z1_4 10 0 0 4.95 -35.28 0.99 3.91 21.88 2.65 0.00 -BGO_Z1_4 11 0 0 14.85 -35.28 1.00 3.13 23.78 2.53 0.00 -BGO_Z1_4 12 0 0 24.75 -35.28 1.00 1.93 24.11 2.46 0.00 -BGO_Z1_4 13 0 0 34.65 -35.28 0.98 3.53 22.57 2.49 0.00 -BGO_Z1_4 14 0 0 44.55 -35.28 0.97 4.56 21.41 2.45 0.00 -BGO_Z1_4 15 0 0 54.45 -35.28 0.94 3.85 24.08 2.48 0.00 -BGO_Z1_4 16 0 0 64.35 -35.28 0.93 4.15 17.78 2.62 0.00 -BGO_Z1_4 17 0 0 74.25 -35.28 0.95 1.24 20.31 2.62 0.00 -BGO_Z1_4 18 0 0 84.15 -35.28 0.94 2.53 27.14 2.09 0.05 -BGO_Z1_4 19 0 0 94.05 -35.28 0.95 1.23 24.68 2.47 0.00 -BGO_Z1_4 0 1 0 -94.05 -25.20 1.00 2.25 24.73 2.48 0.00 -BGO_Z1_4 1 1 0 -84.15 -25.20 0.99 3.70 26.01 2.34 0.00 -BGO_Z1_4 2 1 0 -74.25 -25.20 0.99 4.80 24.25 2.30 0.04 -BGO_Z1_4 3 1 0 -64.35 -25.20 0.99 3.87 24.60 2.57 0.00 -BGO_Z1_4 4 1 0 -54.45 -25.20 0.97 6.25 22.81 2.58 0.00 -BGO_Z1_4 5 1 0 -44.55 -25.20 1.02 -0.03 21.27 2.65 0.00 -BGO_Z1_4 6 1 0 -34.65 -25.20 1.01 1.66 23.96 2.50 0.00 -BGO_Z1_4 7 1 0 -24.75 -25.20 1.02 -0.16 21.41 2.62 0.00 -BGO_Z1_4 8 1 0 -14.85 -25.20 1.00 3.89 22.24 2.58 0.00 -BGO_Z1_4 9 1 0 -4.95 -25.20 0.99 3.64 25.43 2.44 0.00 -BGO_Z1_4 10 1 0 4.95 -25.20 1.00 3.59 25.58 2.43 0.00 -BGO_Z1_4 11 1 0 14.85 -25.20 1.02 -0.38 20.17 2.64 0.00 -BGO_Z1_4 12 1 0 24.75 -25.20 0.99 4.60 23.94 2.52 0.00 -BGO_Z1_4 13 1 0 34.65 -25.20 0.98 5.31 23.61 2.47 0.00 -BGO_Z1_4 14 1 0 44.55 -25.20 0.98 4.73 22.35 2.53 0.00 -BGO_Z1_4 15 1 0 54.45 -25.20 0.96 6.64 18.57 2.70 0.00 -BGO_Z1_4 16 1 0 64.35 -25.20 0.97 3.72 22.76 2.56 0.00 -BGO_Z1_4 17 1 0 74.25 -25.20 0.94 4.13 18.02 2.70 0.00 -BGO_Z1_4 18 1 0 84.15 -25.20 0.94 1.42 19.50 2.67 0.00 -BGO_Z1_4 19 1 0 94.05 -25.20 0.94 2.41 22.04 2.55 0.00 -BGO_Z1_4 0 2 0 -94.05 -15.12 1.00 2.48 22.32 2.61 0.00 -BGO_Z1_4 1 2 0 -84.15 -15.12 1.00 2.35 20.95 2.58 0.00 -BGO_Z1_4 2 2 0 -74.25 -15.12 1.00 2.34 19.52 2.64 0.00 -BGO_Z1_4 3 2 0 -64.35 -15.12 1.01 2.26 24.81 2.37 0.02 -BGO_Z1_4 4 2 0 -54.45 -15.12 1.00 2.65 20.27 2.66 0.00 -BGO_Z1_4 5 2 0 -44.55 -15.12 0.99 4.59 24.32 2.42 0.00 -BGO_Z1_4 6 2 0 -34.65 -15.12 1.00 1.40 22.52 2.56 0.00 -BGO_Z1_4 7 2 0 -24.75 -15.12 0.99 4.12 22.70 2.44 0.03 -BGO_Z1_4 8 2 0 -14.85 -15.12 1.00 3.58 25.43 2.48 0.00 -BGO_Z1_4 9 2 0 -4.95 -15.12 1.00 2.73 25.53 2.37 0.02 -BGO_Z1_4 10 2 0 4.95 -15.12 1.00 1.32 20.09 2.58 0.00 -BGO_Z1_4 11 2 0 14.85 -15.12 1.00 1.94 23.15 2.47 0.00 -BGO_Z1_4 12 2 0 24.75 -15.12 1.00 2.92 18.22 2.56 0.00 -BGO_Z1_4 13 2 0 34.65 -15.12 1.02 0.74 22.89 2.46 0.03 -BGO_Z1_4 14 2 0 44.55 -15.12 1.00 2.83 19.98 2.63 0.00 -BGO_Z1_4 15 2 0 54.45 -15.12 1.02 3.14 25.21 2.59 0.00 -BGO_Z1_4 16 2 0 64.35 -15.12 1.01 4.49 16.76 2.97 0.00 -BGO_Z1_4 17 2 0 74.25 -15.12 1.02 2.46 24.19 2.63 0.06 -BGO_Z1_4 18 2 0 84.15 -15.12 0.99 2.54 23.59 2.89 0.04 -BGO_Z1_4 19 2 0 94.05 -15.12 0.92 3.75 24.27 2.46 0.06 -BGO_Z1_4 0 3 0 -94.05 -5.04 0.99 4.19 24.50 2.32 0.05 -BGO_Z1_4 1 3 0 -84.15 -5.04 0.99 4.19 22.08 2.58 0.00 -BGO_Z1_4 2 3 0 -74.25 -5.04 0.99 2.73 24.31 2.51 0.00 -BGO_Z1_4 3 3 0 -64.35 -5.04 1.01 1.31 23.38 2.51 0.00 -BGO_Z1_4 4 3 0 -54.45 -5.04 1.00 1.55 19.60 2.58 0.00 -BGO_Z1_4 5 3 0 -44.55 -5.04 0.99 3.67 23.75 2.55 0.00 -BGO_Z1_4 6 3 0 -34.65 -5.04 1.00 3.13 20.95 2.53 0.00 -BGO_Z1_4 7 3 0 -24.75 -5.04 1.01 1.83 23.59 2.45 0.00 -BGO_Z1_4 8 3 0 -14.85 -5.04 0.98 5.35 24.78 2.31 0.04 -BGO_Z1_4 9 3 0 -4.95 -5.04 0.99 4.01 25.93 2.40 0.00 -BGO_Z1_4 10 3 0 4.95 -5.04 0.99 4.67 23.91 2.50 0.00 -BGO_Z1_4 11 3 0 14.85 -5.04 1.00 2.64 21.65 2.55 0.00 -BGO_Z1_4 12 3 0 24.75 -5.04 1.00 2.64 22.13 2.55 0.00 -BGO_Z1_4 13 3 0 34.65 -5.04 0.99 4.76 21.89 2.53 0.00 -BGO_Z1_4 14 3 0 44.55 -5.04 1.02 4.95 24.33 2.59 0.00 -BGO_Z1_4 15 3 0 54.45 -5.04 1.04 3.18 20.70 2.77 0.00 -BGO_Z1_4 16 3 0 64.35 -5.04 1.05 3.06 20.68 2.79 0.04 -BGO_Z1_4 17 3 0 74.25 -5.04 1.08 3.99 18.38 3.15 0.03 -BGO_Z1_4 18 3 0 84.15 -5.04 1.13 1.46 22.20 3.12 0.10 -BGO_Z1_4 19 3 0 94.05 -5.04 1.11 1.47 13.68 4.06 0.32 -BGO_Z1_4 0 4 0 -94.05 5.04 0.99 4.19 24.50 2.32 0.05 -BGO_Z1_4 1 4 0 -84.15 5.04 0.99 4.19 22.08 2.58 0.00 -BGO_Z1_4 2 4 0 -74.25 5.04 0.99 2.73 24.31 2.51 0.00 -BGO_Z1_4 3 4 0 -64.35 5.04 1.01 1.31 23.38 2.51 0.00 -BGO_Z1_4 4 4 0 -54.45 5.04 1.00 1.55 19.60 2.58 0.00 -BGO_Z1_4 5 4 0 -44.55 5.04 0.99 3.67 23.75 2.55 0.00 -BGO_Z1_4 6 4 0 -34.65 5.04 1.00 3.13 20.95 2.53 0.00 -BGO_Z1_4 7 4 0 -24.75 5.04 1.01 1.83 23.59 2.45 0.00 -BGO_Z1_4 8 4 0 -14.85 5.04 0.98 5.35 24.78 2.31 0.04 -BGO_Z1_4 9 4 0 -4.95 5.04 0.99 4.01 25.93 2.40 0.00 -BGO_Z1_4 10 4 0 4.95 5.04 0.99 4.67 23.91 2.50 0.00 -BGO_Z1_4 11 4 0 14.85 5.04 1.00 2.64 21.65 2.55 0.00 -BGO_Z1_4 12 4 0 24.75 5.04 1.00 2.64 22.13 2.55 0.00 -BGO_Z1_4 13 4 0 34.65 5.04 0.99 4.76 21.89 2.53 0.00 -BGO_Z1_4 14 4 0 44.55 5.04 1.02 4.95 24.33 2.59 0.00 -BGO_Z1_4 15 4 0 54.45 5.04 1.04 3.18 20.70 2.77 0.00 -BGO_Z1_4 16 4 0 64.35 5.04 1.05 3.06 20.68 2.79 0.04 -BGO_Z1_4 17 4 0 74.25 5.04 1.08 3.99 18.38 3.15 0.03 -BGO_Z1_4 18 4 0 84.15 5.04 1.13 1.46 22.20 3.12 0.10 -BGO_Z1_4 19 4 0 94.05 5.04 1.11 1.47 13.68 4.06 0.32 -BGO_Z1_4 0 5 0 -94.05 15.12 1.00 2.48 22.32 2.61 0.00 -BGO_Z1_4 1 5 0 -84.15 15.12 1.00 2.35 20.95 2.58 0.00 -BGO_Z1_4 2 5 0 -74.25 15.12 1.00 2.34 19.52 2.64 0.00 -BGO_Z1_4 3 5 0 -64.35 15.12 1.01 2.26 24.81 2.37 0.02 -BGO_Z1_4 4 5 0 -54.45 15.12 1.00 2.65 20.27 2.66 0.00 -BGO_Z1_4 5 5 0 -44.55 15.12 0.99 4.59 24.32 2.42 0.00 -BGO_Z1_4 6 5 0 -34.65 15.12 1.00 1.40 22.52 2.56 0.00 -BGO_Z1_4 7 5 0 -24.75 15.12 0.99 4.12 22.70 2.44 0.03 -BGO_Z1_4 8 5 0 -14.85 15.12 1.00 3.58 25.43 2.48 0.00 -BGO_Z1_4 9 5 0 -4.95 15.12 1.00 2.73 25.53 2.37 0.02 -BGO_Z1_4 10 5 0 4.95 15.12 1.00 1.32 20.09 2.58 0.00 -BGO_Z1_4 11 5 0 14.85 15.12 1.00 1.94 23.15 2.47 0.00 -BGO_Z1_4 12 5 0 24.75 15.12 1.00 2.92 18.22 2.56 0.00 -BGO_Z1_4 13 5 0 34.65 15.12 1.02 0.74 22.89 2.46 0.03 -BGO_Z1_4 14 5 0 44.55 15.12 1.00 2.83 19.98 2.63 0.00 -BGO_Z1_4 15 5 0 54.45 15.12 1.02 3.14 25.21 2.59 0.00 -BGO_Z1_4 16 5 0 64.35 15.12 1.01 4.49 16.76 2.97 0.00 -BGO_Z1_4 17 5 0 74.25 15.12 1.02 2.46 24.19 2.63 0.06 -BGO_Z1_4 18 5 0 84.15 15.12 0.99 2.54 23.59 2.89 0.04 -BGO_Z1_4 19 5 0 94.05 15.12 0.92 3.75 24.27 2.46 0.06 -BGO_Z1_4 0 6 0 -94.05 25.20 1.00 2.25 24.73 2.48 0.00 -BGO_Z1_4 1 6 0 -84.15 25.20 0.99 3.70 26.01 2.34 0.00 -BGO_Z1_4 2 6 0 -74.25 25.20 0.99 4.80 24.25 2.30 0.04 -BGO_Z1_4 3 6 0 -64.35 25.20 0.99 3.87 24.60 2.57 0.00 -BGO_Z1_4 4 6 0 -54.45 25.20 0.97 6.25 22.81 2.58 0.00 -BGO_Z1_4 5 6 0 -44.55 25.20 1.02 -0.03 21.27 2.65 0.00 -BGO_Z1_4 6 6 0 -34.65 25.20 1.01 1.66 23.96 2.50 0.00 -BGO_Z1_4 7 6 0 -24.75 25.20 1.02 -0.16 21.41 2.62 0.00 -BGO_Z1_4 8 6 0 -14.85 25.20 1.00 3.89 22.24 2.58 0.00 -BGO_Z1_4 9 6 0 -4.95 25.20 0.99 3.64 25.43 2.44 0.00 -BGO_Z1_4 10 6 0 4.95 25.20 1.00 3.59 25.58 2.43 0.00 -BGO_Z1_4 11 6 0 14.85 25.20 1.02 -0.38 20.17 2.64 0.00 -BGO_Z1_4 12 6 0 24.75 25.20 0.99 4.60 23.94 2.52 0.00 -BGO_Z1_4 13 6 0 34.65 25.20 0.98 5.31 23.61 2.47 0.00 -BGO_Z1_4 14 6 0 44.55 25.20 0.98 4.73 22.35 2.53 0.00 -BGO_Z1_4 15 6 0 54.45 25.20 0.96 6.64 18.57 2.70 0.00 -BGO_Z1_4 16 6 0 64.35 25.20 0.97 3.72 22.76 2.56 0.00 -BGO_Z1_4 17 6 0 74.25 25.20 0.94 4.13 18.02 2.70 0.00 -BGO_Z1_4 18 6 0 84.15 25.20 0.94 1.42 19.50 2.67 0.00 -BGO_Z1_4 19 6 0 94.05 25.20 0.94 2.41 22.04 2.55 0.00 -BGO_Z1_4 0 7 0 -94.05 35.28 0.98 5.24 17.16 2.76 0.00 -BGO_Z1_4 1 7 0 -84.15 35.28 0.99 4.12 19.97 2.65 0.00 -BGO_Z1_4 2 7 0 -74.25 35.28 0.99 4.63 23.88 2.37 0.00 -BGO_Z1_4 3 7 0 -64.35 35.28 0.99 4.98 21.64 2.56 0.00 -BGO_Z1_4 4 7 0 -54.45 35.28 0.98 5.43 22.82 2.48 0.00 -BGO_Z1_4 5 7 0 -44.55 35.28 1.01 1.54 24.54 2.30 0.02 -BGO_Z1_4 6 7 0 -34.65 35.28 0.98 5.99 20.26 2.52 0.00 -BGO_Z1_4 7 7 0 -24.75 35.28 1.00 3.21 23.04 2.63 0.00 -BGO_Z1_4 8 7 0 -14.85 35.28 1.00 2.77 26.16 2.34 0.02 -BGO_Z1_4 9 7 0 -4.95 35.28 1.00 2.89 21.85 2.61 0.00 -BGO_Z1_4 10 7 0 4.95 35.28 0.99 3.91 21.88 2.65 0.00 -BGO_Z1_4 11 7 0 14.85 35.28 1.00 3.13 23.78 2.53 0.00 -BGO_Z1_4 12 7 0 24.75 35.28 1.00 1.93 24.11 2.46 0.00 -BGO_Z1_4 13 7 0 34.65 35.28 0.98 3.53 22.57 2.49 0.00 -BGO_Z1_4 14 7 0 44.55 35.28 0.97 4.56 21.41 2.45 0.00 -BGO_Z1_4 15 7 0 54.45 35.28 0.94 3.85 24.08 2.48 0.00 -BGO_Z1_4 16 7 0 64.35 35.28 0.93 4.15 17.78 2.62 0.00 -BGO_Z1_4 17 7 0 74.25 35.28 0.95 1.24 20.31 2.62 0.00 -BGO_Z1_4 18 7 0 84.15 35.28 0.94 2.53 27.14 2.09 0.05 -BGO_Z1_4 19 7 0 94.05 35.28 0.95 1.23 24.68 2.47 0.00 -BGO_Z1_4 0 0 1 -94.05 -35.28 0.98 5.24 17.16 2.76 0.00 -BGO_Z1_4 1 0 1 -84.15 -35.28 0.99 4.12 19.97 2.65 0.00 -BGO_Z1_4 2 0 1 -74.25 -35.28 0.99 4.63 23.88 2.37 0.00 -BGO_Z1_4 3 0 1 -64.35 -35.28 0.99 4.98 21.64 2.56 0.00 -BGO_Z1_4 4 0 1 -54.45 -35.28 0.98 5.43 22.82 2.48 0.00 -BGO_Z1_4 5 0 1 -44.55 -35.28 1.01 1.54 24.54 2.30 0.02 -BGO_Z1_4 6 0 1 -34.65 -35.28 0.98 5.99 20.26 2.52 0.00 -BGO_Z1_4 7 0 1 -24.75 -35.28 1.00 3.21 23.04 2.63 0.00 -BGO_Z1_4 8 0 1 -14.85 -35.28 1.00 2.77 26.16 2.34 0.02 -BGO_Z1_4 9 0 1 -4.95 -35.28 1.00 2.89 21.85 2.61 0.00 -BGO_Z1_4 10 0 1 4.95 -35.28 0.99 3.91 21.88 2.65 0.00 -BGO_Z1_4 11 0 1 14.85 -35.28 1.00 3.13 23.78 2.53 0.00 -BGO_Z1_4 12 0 1 24.75 -35.28 1.00 1.93 24.11 2.46 0.00 -BGO_Z1_4 13 0 1 34.65 -35.28 0.98 3.53 22.57 2.49 0.00 -BGO_Z1_4 14 0 1 44.55 -35.28 0.97 4.56 21.41 2.45 0.00 -BGO_Z1_4 15 0 1 54.45 -35.28 0.94 3.85 24.08 2.48 0.00 -BGO_Z1_4 16 0 1 64.35 -35.28 0.93 4.15 17.78 2.62 0.00 -BGO_Z1_4 17 0 1 74.25 -35.28 0.95 1.24 20.31 2.62 0.00 -BGO_Z1_4 18 0 1 84.15 -35.28 0.94 2.53 27.14 2.09 0.05 -BGO_Z1_4 19 0 1 94.05 -35.28 0.95 1.23 24.68 2.47 0.00 -BGO_Z1_4 0 1 1 -94.05 -25.20 1.00 2.25 24.73 2.48 0.00 -BGO_Z1_4 1 1 1 -84.15 -25.20 0.99 3.70 26.01 2.34 0.00 -BGO_Z1_4 2 1 1 -74.25 -25.20 0.99 4.80 24.25 2.30 0.04 -BGO_Z1_4 3 1 1 -64.35 -25.20 0.99 3.87 24.60 2.57 0.00 -BGO_Z1_4 4 1 1 -54.45 -25.20 0.97 6.25 22.81 2.58 0.00 -BGO_Z1_4 5 1 1 -44.55 -25.20 1.02 -0.03 21.27 2.65 0.00 -BGO_Z1_4 6 1 1 -34.65 -25.20 1.01 1.66 23.96 2.50 0.00 -BGO_Z1_4 7 1 1 -24.75 -25.20 1.02 -0.16 21.41 2.62 0.00 -BGO_Z1_4 8 1 1 -14.85 -25.20 1.00 3.89 22.24 2.58 0.00 -BGO_Z1_4 9 1 1 -4.95 -25.20 0.99 3.64 25.43 2.44 0.00 -BGO_Z1_4 10 1 1 4.95 -25.20 1.00 3.59 25.58 2.43 0.00 -BGO_Z1_4 11 1 1 14.85 -25.20 1.02 -0.38 20.17 2.64 0.00 -BGO_Z1_4 12 1 1 24.75 -25.20 0.99 4.60 23.94 2.52 0.00 -BGO_Z1_4 13 1 1 34.65 -25.20 0.98 5.31 23.61 2.47 0.00 -BGO_Z1_4 14 1 1 44.55 -25.20 0.98 4.73 22.35 2.53 0.00 -BGO_Z1_4 15 1 1 54.45 -25.20 0.96 6.64 18.57 2.70 0.00 -BGO_Z1_4 16 1 1 64.35 -25.20 0.97 3.72 22.76 2.56 0.00 -BGO_Z1_4 17 1 1 74.25 -25.20 0.94 4.13 18.02 2.70 0.00 -BGO_Z1_4 18 1 1 84.15 -25.20 0.94 1.42 19.50 2.67 0.00 -BGO_Z1_4 19 1 1 94.05 -25.20 0.94 2.41 22.04 2.55 0.00 -BGO_Z1_4 0 2 1 -94.05 -15.12 1.00 2.48 22.32 2.61 0.00 -BGO_Z1_4 1 2 1 -84.15 -15.12 1.00 2.35 20.95 2.58 0.00 -BGO_Z1_4 2 2 1 -74.25 -15.12 1.00 2.34 19.52 2.64 0.00 -BGO_Z1_4 3 2 1 -64.35 -15.12 1.01 2.26 24.81 2.37 0.02 -BGO_Z1_4 4 2 1 -54.45 -15.12 1.00 2.65 20.27 2.66 0.00 -BGO_Z1_4 5 2 1 -44.55 -15.12 0.99 4.59 24.32 2.42 0.00 -BGO_Z1_4 6 2 1 -34.65 -15.12 1.00 1.40 22.52 2.56 0.00 -BGO_Z1_4 7 2 1 -24.75 -15.12 0.99 4.12 22.70 2.44 0.03 -BGO_Z1_4 8 2 1 -14.85 -15.12 1.00 3.58 25.43 2.48 0.00 -BGO_Z1_4 9 2 1 -4.95 -15.12 1.00 2.73 25.53 2.37 0.02 -BGO_Z1_4 10 2 1 4.95 -15.12 1.00 1.32 20.09 2.58 0.00 -BGO_Z1_4 11 2 1 14.85 -15.12 1.00 1.94 23.15 2.47 0.00 -BGO_Z1_4 12 2 1 24.75 -15.12 1.00 2.92 18.22 2.56 0.00 -BGO_Z1_4 13 2 1 34.65 -15.12 1.02 0.74 22.89 2.46 0.03 -BGO_Z1_4 14 2 1 44.55 -15.12 1.00 2.83 19.98 2.63 0.00 -BGO_Z1_4 15 2 1 54.45 -15.12 1.02 3.14 25.21 2.59 0.00 -BGO_Z1_4 16 2 1 64.35 -15.12 1.01 4.49 16.76 2.97 0.00 -BGO_Z1_4 17 2 1 74.25 -15.12 1.02 2.46 24.19 2.63 0.06 -BGO_Z1_4 18 2 1 84.15 -15.12 0.99 2.54 23.59 2.89 0.04 -BGO_Z1_4 19 2 1 94.05 -15.12 0.92 3.75 24.27 2.46 0.06 -BGO_Z1_4 0 3 1 -94.05 -5.04 0.99 4.19 24.50 2.32 0.05 -BGO_Z1_4 1 3 1 -84.15 -5.04 0.99 4.19 22.08 2.58 0.00 -BGO_Z1_4 2 3 1 -74.25 -5.04 0.99 2.73 24.31 2.51 0.00 -BGO_Z1_4 3 3 1 -64.35 -5.04 1.01 1.31 23.38 2.51 0.00 -BGO_Z1_4 4 3 1 -54.45 -5.04 1.00 1.55 19.60 2.58 0.00 -BGO_Z1_4 5 3 1 -44.55 -5.04 0.99 3.67 23.75 2.55 0.00 -BGO_Z1_4 6 3 1 -34.65 -5.04 1.00 3.13 20.95 2.53 0.00 -BGO_Z1_4 7 3 1 -24.75 -5.04 1.01 1.83 23.59 2.45 0.00 -BGO_Z1_4 8 3 1 -14.85 -5.04 0.98 5.35 24.78 2.31 0.04 -BGO_Z1_4 9 3 1 -4.95 -5.04 0.99 4.01 25.93 2.40 0.00 -BGO_Z1_4 10 3 1 4.95 -5.04 0.99 4.67 23.91 2.50 0.00 -BGO_Z1_4 11 3 1 14.85 -5.04 1.00 2.64 21.65 2.55 0.00 -BGO_Z1_4 12 3 1 24.75 -5.04 1.00 2.64 22.13 2.55 0.00 -BGO_Z1_4 13 3 1 34.65 -5.04 0.99 4.76 21.89 2.53 0.00 -BGO_Z1_4 14 3 1 44.55 -5.04 1.02 4.95 24.33 2.59 0.00 -BGO_Z1_4 15 3 1 54.45 -5.04 1.04 3.18 20.70 2.77 0.00 -BGO_Z1_4 16 3 1 64.35 -5.04 1.05 3.06 20.68 2.79 0.04 -BGO_Z1_4 17 3 1 74.25 -5.04 1.08 3.99 18.38 3.15 0.03 -BGO_Z1_4 18 3 1 84.15 -5.04 1.13 1.46 22.20 3.12 0.10 -BGO_Z1_4 19 3 1 94.05 -5.04 1.11 1.47 13.68 4.06 0.32 -BGO_Z1_4 0 4 1 -94.05 5.04 0.99 4.19 24.50 2.32 0.05 -BGO_Z1_4 1 4 1 -84.15 5.04 0.99 4.19 22.08 2.58 0.00 -BGO_Z1_4 2 4 1 -74.25 5.04 0.99 2.73 24.31 2.51 0.00 -BGO_Z1_4 3 4 1 -64.35 5.04 1.01 1.31 23.38 2.51 0.00 -BGO_Z1_4 4 4 1 -54.45 5.04 1.00 1.55 19.60 2.58 0.00 -BGO_Z1_4 5 4 1 -44.55 5.04 0.99 3.67 23.75 2.55 0.00 -BGO_Z1_4 6 4 1 -34.65 5.04 1.00 3.13 20.95 2.53 0.00 -BGO_Z1_4 7 4 1 -24.75 5.04 1.01 1.83 23.59 2.45 0.00 -BGO_Z1_4 8 4 1 -14.85 5.04 0.98 5.35 24.78 2.31 0.04 -BGO_Z1_4 9 4 1 -4.95 5.04 0.99 4.01 25.93 2.40 0.00 -BGO_Z1_4 10 4 1 4.95 5.04 0.99 4.67 23.91 2.50 0.00 -BGO_Z1_4 11 4 1 14.85 5.04 1.00 2.64 21.65 2.55 0.00 -BGO_Z1_4 12 4 1 24.75 5.04 1.00 2.64 22.13 2.55 0.00 -BGO_Z1_4 13 4 1 34.65 5.04 0.99 4.76 21.89 2.53 0.00 -BGO_Z1_4 14 4 1 44.55 5.04 1.02 4.95 24.33 2.59 0.00 -BGO_Z1_4 15 4 1 54.45 5.04 1.04 3.18 20.70 2.77 0.00 -BGO_Z1_4 16 4 1 64.35 5.04 1.05 3.06 20.68 2.79 0.04 -BGO_Z1_4 17 4 1 74.25 5.04 1.08 3.99 18.38 3.15 0.03 -BGO_Z1_4 18 4 1 84.15 5.04 1.13 1.46 22.20 3.12 0.10 -BGO_Z1_4 19 4 1 94.05 5.04 1.11 1.47 13.68 4.06 0.32 -BGO_Z1_4 0 5 1 -94.05 15.12 1.00 2.48 22.32 2.61 0.00 -BGO_Z1_4 1 5 1 -84.15 15.12 1.00 2.35 20.95 2.58 0.00 -BGO_Z1_4 2 5 1 -74.25 15.12 1.00 2.34 19.52 2.64 0.00 -BGO_Z1_4 3 5 1 -64.35 15.12 1.01 2.26 24.81 2.37 0.02 -BGO_Z1_4 4 5 1 -54.45 15.12 1.00 2.65 20.27 2.66 0.00 -BGO_Z1_4 5 5 1 -44.55 15.12 0.99 4.59 24.32 2.42 0.00 -BGO_Z1_4 6 5 1 -34.65 15.12 1.00 1.40 22.52 2.56 0.00 -BGO_Z1_4 7 5 1 -24.75 15.12 0.99 4.12 22.70 2.44 0.03 -BGO_Z1_4 8 5 1 -14.85 15.12 1.00 3.58 25.43 2.48 0.00 -BGO_Z1_4 9 5 1 -4.95 15.12 1.00 2.73 25.53 2.37 0.02 -BGO_Z1_4 10 5 1 4.95 15.12 1.00 1.32 20.09 2.58 0.00 -BGO_Z1_4 11 5 1 14.85 15.12 1.00 1.94 23.15 2.47 0.00 -BGO_Z1_4 12 5 1 24.75 15.12 1.00 2.92 18.22 2.56 0.00 -BGO_Z1_4 13 5 1 34.65 15.12 1.02 0.74 22.89 2.46 0.03 -BGO_Z1_4 14 5 1 44.55 15.12 1.00 2.83 19.98 2.63 0.00 -BGO_Z1_4 15 5 1 54.45 15.12 1.02 3.14 25.21 2.59 0.00 -BGO_Z1_4 16 5 1 64.35 15.12 1.01 4.49 16.76 2.97 0.00 -BGO_Z1_4 17 5 1 74.25 15.12 1.02 2.46 24.19 2.63 0.06 -BGO_Z1_4 18 5 1 84.15 15.12 0.99 2.54 23.59 2.89 0.04 -BGO_Z1_4 19 5 1 94.05 15.12 0.92 3.75 24.27 2.46 0.06 -BGO_Z1_4 0 6 1 -94.05 25.20 1.00 2.25 24.73 2.48 0.00 -BGO_Z1_4 1 6 1 -84.15 25.20 0.99 3.70 26.01 2.34 0.00 -BGO_Z1_4 2 6 1 -74.25 25.20 0.99 4.80 24.25 2.30 0.04 -BGO_Z1_4 3 6 1 -64.35 25.20 0.99 3.87 24.60 2.57 0.00 -BGO_Z1_4 4 6 1 -54.45 25.20 0.97 6.25 22.81 2.58 0.00 -BGO_Z1_4 5 6 1 -44.55 25.20 1.02 -0.03 21.27 2.65 0.00 -BGO_Z1_4 6 6 1 -34.65 25.20 1.01 1.66 23.96 2.50 0.00 -BGO_Z1_4 7 6 1 -24.75 25.20 1.02 -0.16 21.41 2.62 0.00 -BGO_Z1_4 8 6 1 -14.85 25.20 1.00 3.89 22.24 2.58 0.00 -BGO_Z1_4 9 6 1 -4.95 25.20 0.99 3.64 25.43 2.44 0.00 -BGO_Z1_4 10 6 1 4.95 25.20 1.00 3.59 25.58 2.43 0.00 -BGO_Z1_4 11 6 1 14.85 25.20 1.02 -0.38 20.17 2.64 0.00 -BGO_Z1_4 12 6 1 24.75 25.20 0.99 4.60 23.94 2.52 0.00 -BGO_Z1_4 13 6 1 34.65 25.20 0.98 5.31 23.61 2.47 0.00 -BGO_Z1_4 14 6 1 44.55 25.20 0.98 4.73 22.35 2.53 0.00 -BGO_Z1_4 15 6 1 54.45 25.20 0.96 6.64 18.57 2.70 0.00 -BGO_Z1_4 16 6 1 64.35 25.20 0.97 3.72 22.76 2.56 0.00 -BGO_Z1_4 17 6 1 74.25 25.20 0.94 4.13 18.02 2.70 0.00 -BGO_Z1_4 18 6 1 84.15 25.20 0.94 1.42 19.50 2.67 0.00 -BGO_Z1_4 19 6 1 94.05 25.20 0.94 2.41 22.04 2.55 0.00 -BGO_Z1_4 0 7 1 -94.05 35.28 0.98 5.24 17.16 2.76 0.00 -BGO_Z1_4 1 7 1 -84.15 35.28 0.99 4.12 19.97 2.65 0.00 -BGO_Z1_4 2 7 1 -74.25 35.28 0.99 4.63 23.88 2.37 0.00 -BGO_Z1_4 3 7 1 -64.35 35.28 0.99 4.98 21.64 2.56 0.00 -BGO_Z1_4 4 7 1 -54.45 35.28 0.98 5.43 22.82 2.48 0.00 -BGO_Z1_4 5 7 1 -44.55 35.28 1.01 1.54 24.54 2.30 0.02 -BGO_Z1_4 6 7 1 -34.65 35.28 0.98 5.99 20.26 2.52 0.00 -BGO_Z1_4 7 7 1 -24.75 35.28 1.00 3.21 23.04 2.63 0.00 -BGO_Z1_4 8 7 1 -14.85 35.28 1.00 2.77 26.16 2.34 0.02 -BGO_Z1_4 9 7 1 -4.95 35.28 1.00 2.89 21.85 2.61 0.00 -BGO_Z1_4 10 7 1 4.95 35.28 0.99 3.91 21.88 2.65 0.00 -BGO_Z1_4 11 7 1 14.85 35.28 1.00 3.13 23.78 2.53 0.00 -BGO_Z1_4 12 7 1 24.75 35.28 1.00 1.93 24.11 2.46 0.00 -BGO_Z1_4 13 7 1 34.65 35.28 0.98 3.53 22.57 2.49 0.00 -BGO_Z1_4 14 7 1 44.55 35.28 0.97 4.56 21.41 2.45 0.00 -BGO_Z1_4 15 7 1 54.45 35.28 0.94 3.85 24.08 2.48 0.00 -BGO_Z1_4 16 7 1 64.35 35.28 0.93 4.15 17.78 2.62 0.00 -BGO_Z1_4 17 7 1 74.25 35.28 0.95 1.24 20.31 2.62 0.00 -BGO_Z1_4 18 7 1 84.15 35.28 0.94 2.53 27.14 2.09 0.05 -BGO_Z1_4 19 7 1 94.05 35.28 0.95 1.23 24.68 2.47 0.00 -BGO_Z1_4 0 0 2 -94.05 -35.28 0.98 5.24 17.16 2.76 0.00 -BGO_Z1_4 1 0 2 -84.15 -35.28 0.99 4.12 19.97 2.65 0.00 -BGO_Z1_4 2 0 2 -74.25 -35.28 0.99 4.63 23.88 2.37 0.00 -BGO_Z1_4 3 0 2 -64.35 -35.28 0.99 4.98 21.64 2.56 0.00 -BGO_Z1_4 4 0 2 -54.45 -35.28 0.98 5.43 22.82 2.48 0.00 -BGO_Z1_4 5 0 2 -44.55 -35.28 1.01 1.54 24.54 2.30 0.02 -BGO_Z1_4 6 0 2 -34.65 -35.28 0.98 5.99 20.26 2.52 0.00 -BGO_Z1_4 7 0 2 -24.75 -35.28 1.00 3.21 23.04 2.63 0.00 -BGO_Z1_4 8 0 2 -14.85 -35.28 1.00 2.77 26.16 2.34 0.02 -BGO_Z1_4 9 0 2 -4.95 -35.28 1.00 2.89 21.85 2.61 0.00 -BGO_Z1_4 10 0 2 4.95 -35.28 0.99 3.91 21.88 2.65 0.00 -BGO_Z1_4 11 0 2 14.85 -35.28 1.00 3.13 23.78 2.53 0.00 -BGO_Z1_4 12 0 2 24.75 -35.28 1.00 1.93 24.11 2.46 0.00 -BGO_Z1_4 13 0 2 34.65 -35.28 0.98 3.53 22.57 2.49 0.00 -BGO_Z1_4 14 0 2 44.55 -35.28 0.97 4.56 21.41 2.45 0.00 -BGO_Z1_4 15 0 2 54.45 -35.28 0.94 3.85 24.08 2.48 0.00 -BGO_Z1_4 16 0 2 64.35 -35.28 0.93 4.15 17.78 2.62 0.00 -BGO_Z1_4 17 0 2 74.25 -35.28 0.95 1.24 20.31 2.62 0.00 -BGO_Z1_4 18 0 2 84.15 -35.28 0.94 2.53 27.14 2.09 0.05 -BGO_Z1_4 19 0 2 94.05 -35.28 0.95 1.23 24.68 2.47 0.00 -BGO_Z1_4 0 1 2 -94.05 -25.20 1.00 2.25 24.73 2.48 0.00 -BGO_Z1_4 1 1 2 -84.15 -25.20 0.99 3.70 26.01 2.34 0.00 -BGO_Z1_4 2 1 2 -74.25 -25.20 0.99 4.80 24.25 2.30 0.04 -BGO_Z1_4 3 1 2 -64.35 -25.20 0.99 3.87 24.60 2.57 0.00 -BGO_Z1_4 4 1 2 -54.45 -25.20 0.97 6.25 22.81 2.58 0.00 -BGO_Z1_4 5 1 2 -44.55 -25.20 1.02 -0.03 21.27 2.65 0.00 -BGO_Z1_4 6 1 2 -34.65 -25.20 1.01 1.66 23.96 2.50 0.00 -BGO_Z1_4 7 1 2 -24.75 -25.20 1.02 -0.16 21.41 2.62 0.00 -BGO_Z1_4 8 1 2 -14.85 -25.20 1.00 3.89 22.24 2.58 0.00 -BGO_Z1_4 9 1 2 -4.95 -25.20 0.99 3.64 25.43 2.44 0.00 -BGO_Z1_4 10 1 2 4.95 -25.20 1.00 3.59 25.58 2.43 0.00 -BGO_Z1_4 11 1 2 14.85 -25.20 1.02 -0.38 20.17 2.64 0.00 -BGO_Z1_4 12 1 2 24.75 -25.20 0.99 4.60 23.94 2.52 0.00 -BGO_Z1_4 13 1 2 34.65 -25.20 0.98 5.31 23.61 2.47 0.00 -BGO_Z1_4 14 1 2 44.55 -25.20 0.98 4.73 22.35 2.53 0.00 -BGO_Z1_4 15 1 2 54.45 -25.20 0.96 6.64 18.57 2.70 0.00 -BGO_Z1_4 16 1 2 64.35 -25.20 0.97 3.72 22.76 2.56 0.00 -BGO_Z1_4 17 1 2 74.25 -25.20 0.94 4.13 18.02 2.70 0.00 -BGO_Z1_4 18 1 2 84.15 -25.20 0.94 1.42 19.50 2.67 0.00 -BGO_Z1_4 19 1 2 94.05 -25.20 0.94 2.41 22.04 2.55 0.00 -BGO_Z1_4 0 2 2 -94.05 -15.12 1.00 2.48 22.32 2.61 0.00 -BGO_Z1_4 1 2 2 -84.15 -15.12 1.00 2.35 20.95 2.58 0.00 -BGO_Z1_4 2 2 2 -74.25 -15.12 1.00 2.34 19.52 2.64 0.00 -BGO_Z1_4 3 2 2 -64.35 -15.12 1.01 2.26 24.81 2.37 0.02 -BGO_Z1_4 4 2 2 -54.45 -15.12 1.00 2.65 20.27 2.66 0.00 -BGO_Z1_4 5 2 2 -44.55 -15.12 0.99 4.59 24.32 2.42 0.00 -BGO_Z1_4 6 2 2 -34.65 -15.12 1.00 1.40 22.52 2.56 0.00 -BGO_Z1_4 7 2 2 -24.75 -15.12 0.99 4.12 22.70 2.44 0.03 -BGO_Z1_4 8 2 2 -14.85 -15.12 1.00 3.58 25.43 2.48 0.00 -BGO_Z1_4 9 2 2 -4.95 -15.12 1.00 2.73 25.53 2.37 0.02 -BGO_Z1_4 10 2 2 4.95 -15.12 1.00 1.32 20.09 2.58 0.00 -BGO_Z1_4 11 2 2 14.85 -15.12 1.00 1.94 23.15 2.47 0.00 -BGO_Z1_4 12 2 2 24.75 -15.12 1.00 2.92 18.22 2.56 0.00 -BGO_Z1_4 13 2 2 34.65 -15.12 1.02 0.74 22.89 2.46 0.03 -BGO_Z1_4 14 2 2 44.55 -15.12 1.00 2.83 19.98 2.63 0.00 -BGO_Z1_4 15 2 2 54.45 -15.12 1.02 3.14 25.21 2.59 0.00 -BGO_Z1_4 16 2 2 64.35 -15.12 1.01 4.49 16.76 2.97 0.00 -BGO_Z1_4 17 2 2 74.25 -15.12 1.02 2.46 24.19 2.63 0.06 -BGO_Z1_4 18 2 2 84.15 -15.12 0.99 2.54 23.59 2.89 0.04 -BGO_Z1_4 19 2 2 94.05 -15.12 0.92 3.75 24.27 2.46 0.06 -BGO_Z1_4 0 3 2 -94.05 -5.04 0.99 4.19 24.50 2.32 0.05 -BGO_Z1_4 1 3 2 -84.15 -5.04 0.99 4.19 22.08 2.58 0.00 -BGO_Z1_4 2 3 2 -74.25 -5.04 0.99 2.73 24.31 2.51 0.00 -BGO_Z1_4 3 3 2 -64.35 -5.04 1.01 1.31 23.38 2.51 0.00 -BGO_Z1_4 4 3 2 -54.45 -5.04 1.00 1.55 19.60 2.58 0.00 -BGO_Z1_4 5 3 2 -44.55 -5.04 0.99 3.67 23.75 2.55 0.00 -BGO_Z1_4 6 3 2 -34.65 -5.04 1.00 3.13 20.95 2.53 0.00 -BGO_Z1_4 7 3 2 -24.75 -5.04 1.01 1.83 23.59 2.45 0.00 -BGO_Z1_4 8 3 2 -14.85 -5.04 0.98 5.35 24.78 2.31 0.04 -BGO_Z1_4 9 3 2 -4.95 -5.04 0.99 4.01 25.93 2.40 0.00 -BGO_Z1_4 10 3 2 4.95 -5.04 0.99 4.67 23.91 2.50 0.00 -BGO_Z1_4 11 3 2 14.85 -5.04 1.00 2.64 21.65 2.55 0.00 -BGO_Z1_4 12 3 2 24.75 -5.04 1.00 2.64 22.13 2.55 0.00 -BGO_Z1_4 13 3 2 34.65 -5.04 0.99 4.76 21.89 2.53 0.00 -BGO_Z1_4 14 3 2 44.55 -5.04 1.02 4.95 24.33 2.59 0.00 -BGO_Z1_4 15 3 2 54.45 -5.04 1.04 3.18 20.70 2.77 0.00 -BGO_Z1_4 16 3 2 64.35 -5.04 1.05 3.06 20.68 2.79 0.04 -BGO_Z1_4 17 3 2 74.25 -5.04 1.08 3.99 18.38 3.15 0.03 -BGO_Z1_4 18 3 2 84.15 -5.04 1.13 1.46 22.20 3.12 0.10 -BGO_Z1_4 19 3 2 94.05 -5.04 1.11 1.47 13.68 4.06 0.32 -BGO_Z1_4 0 4 2 -94.05 5.04 0.99 4.19 24.50 2.32 0.05 -BGO_Z1_4 1 4 2 -84.15 5.04 0.99 4.19 22.08 2.58 0.00 -BGO_Z1_4 2 4 2 -74.25 5.04 0.99 2.73 24.31 2.51 0.00 -BGO_Z1_4 3 4 2 -64.35 5.04 1.01 1.31 23.38 2.51 0.00 -BGO_Z1_4 4 4 2 -54.45 5.04 1.00 1.55 19.60 2.58 0.00 -BGO_Z1_4 5 4 2 -44.55 5.04 0.99 3.67 23.75 2.55 0.00 -BGO_Z1_4 6 4 2 -34.65 5.04 1.00 3.13 20.95 2.53 0.00 -BGO_Z1_4 7 4 2 -24.75 5.04 1.01 1.83 23.59 2.45 0.00 -BGO_Z1_4 8 4 2 -14.85 5.04 0.98 5.35 24.78 2.31 0.04 -BGO_Z1_4 9 4 2 -4.95 5.04 0.99 4.01 25.93 2.40 0.00 -BGO_Z1_4 10 4 2 4.95 5.04 0.99 4.67 23.91 2.50 0.00 -BGO_Z1_4 11 4 2 14.85 5.04 1.00 2.64 21.65 2.55 0.00 -BGO_Z1_4 12 4 2 24.75 5.04 1.00 2.64 22.13 2.55 0.00 -BGO_Z1_4 13 4 2 34.65 5.04 0.99 4.76 21.89 2.53 0.00 -BGO_Z1_4 14 4 2 44.55 5.04 1.02 4.95 24.33 2.59 0.00 -BGO_Z1_4 15 4 2 54.45 5.04 1.04 3.18 20.70 2.77 0.00 -BGO_Z1_4 16 4 2 64.35 5.04 1.05 3.06 20.68 2.79 0.04 -BGO_Z1_4 17 4 2 74.25 5.04 1.08 3.99 18.38 3.15 0.03 -BGO_Z1_4 18 4 2 84.15 5.04 1.13 1.46 22.20 3.12 0.10 -BGO_Z1_4 19 4 2 94.05 5.04 1.11 1.47 13.68 4.06 0.32 -BGO_Z1_4 0 5 2 -94.05 15.12 1.00 2.48 22.32 2.61 0.00 -BGO_Z1_4 1 5 2 -84.15 15.12 1.00 2.35 20.95 2.58 0.00 -BGO_Z1_4 2 5 2 -74.25 15.12 1.00 2.34 19.52 2.64 0.00 -BGO_Z1_4 3 5 2 -64.35 15.12 1.01 2.26 24.81 2.37 0.02 -BGO_Z1_4 4 5 2 -54.45 15.12 1.00 2.65 20.27 2.66 0.00 -BGO_Z1_4 5 5 2 -44.55 15.12 0.99 4.59 24.32 2.42 0.00 -BGO_Z1_4 6 5 2 -34.65 15.12 1.00 1.40 22.52 2.56 0.00 -BGO_Z1_4 7 5 2 -24.75 15.12 0.99 4.12 22.70 2.44 0.03 -BGO_Z1_4 8 5 2 -14.85 15.12 1.00 3.58 25.43 2.48 0.00 -BGO_Z1_4 9 5 2 -4.95 15.12 1.00 2.73 25.53 2.37 0.02 -BGO_Z1_4 10 5 2 4.95 15.12 1.00 1.32 20.09 2.58 0.00 -BGO_Z1_4 11 5 2 14.85 15.12 1.00 1.94 23.15 2.47 0.00 -BGO_Z1_4 12 5 2 24.75 15.12 1.00 2.92 18.22 2.56 0.00 -BGO_Z1_4 13 5 2 34.65 15.12 1.02 0.74 22.89 2.46 0.03 -BGO_Z1_4 14 5 2 44.55 15.12 1.00 2.83 19.98 2.63 0.00 -BGO_Z1_4 15 5 2 54.45 15.12 1.02 3.14 25.21 2.59 0.00 -BGO_Z1_4 16 5 2 64.35 15.12 1.01 4.49 16.76 2.97 0.00 -BGO_Z1_4 17 5 2 74.25 15.12 1.02 2.46 24.19 2.63 0.06 -BGO_Z1_4 18 5 2 84.15 15.12 0.99 2.54 23.59 2.89 0.04 -BGO_Z1_4 19 5 2 94.05 15.12 0.92 3.75 24.27 2.46 0.06 -BGO_Z1_4 0 6 2 -94.05 25.20 1.00 2.25 24.73 2.48 0.00 -BGO_Z1_4 1 6 2 -84.15 25.20 0.99 3.70 26.01 2.34 0.00 -BGO_Z1_4 2 6 2 -74.25 25.20 0.99 4.80 24.25 2.30 0.04 -BGO_Z1_4 3 6 2 -64.35 25.20 0.99 3.87 24.60 2.57 0.00 -BGO_Z1_4 4 6 2 -54.45 25.20 0.97 6.25 22.81 2.58 0.00 -BGO_Z1_4 5 6 2 -44.55 25.20 1.02 -0.03 21.27 2.65 0.00 -BGO_Z1_4 6 6 2 -34.65 25.20 1.01 1.66 23.96 2.50 0.00 -BGO_Z1_4 7 6 2 -24.75 25.20 1.02 -0.16 21.41 2.62 0.00 -BGO_Z1_4 8 6 2 -14.85 25.20 1.00 3.89 22.24 2.58 0.00 -BGO_Z1_4 9 6 2 -4.95 25.20 0.99 3.64 25.43 2.44 0.00 -BGO_Z1_4 10 6 2 4.95 25.20 1.00 3.59 25.58 2.43 0.00 -BGO_Z1_4 11 6 2 14.85 25.20 1.02 -0.38 20.17 2.64 0.00 -BGO_Z1_4 12 6 2 24.75 25.20 0.99 4.60 23.94 2.52 0.00 -BGO_Z1_4 13 6 2 34.65 25.20 0.98 5.31 23.61 2.47 0.00 -BGO_Z1_4 14 6 2 44.55 25.20 0.98 4.73 22.35 2.53 0.00 -BGO_Z1_4 15 6 2 54.45 25.20 0.96 6.64 18.57 2.70 0.00 -BGO_Z1_4 16 6 2 64.35 25.20 0.97 3.72 22.76 2.56 0.00 -BGO_Z1_4 17 6 2 74.25 25.20 0.94 4.13 18.02 2.70 0.00 -BGO_Z1_4 18 6 2 84.15 25.20 0.94 1.42 19.50 2.67 0.00 -BGO_Z1_4 19 6 2 94.05 25.20 0.94 2.41 22.04 2.55 0.00 -BGO_Z1_4 0 7 2 -94.05 35.28 0.98 5.24 17.16 2.76 0.00 -BGO_Z1_4 1 7 2 -84.15 35.28 0.99 4.12 19.97 2.65 0.00 -BGO_Z1_4 2 7 2 -74.25 35.28 0.99 4.63 23.88 2.37 0.00 -BGO_Z1_4 3 7 2 -64.35 35.28 0.99 4.98 21.64 2.56 0.00 -BGO_Z1_4 4 7 2 -54.45 35.28 0.98 5.43 22.82 2.48 0.00 -BGO_Z1_4 5 7 2 -44.55 35.28 1.01 1.54 24.54 2.30 0.02 -BGO_Z1_4 6 7 2 -34.65 35.28 0.98 5.99 20.26 2.52 0.00 -BGO_Z1_4 7 7 2 -24.75 35.28 1.00 3.21 23.04 2.63 0.00 -BGO_Z1_4 8 7 2 -14.85 35.28 1.00 2.77 26.16 2.34 0.02 -BGO_Z1_4 9 7 2 -4.95 35.28 1.00 2.89 21.85 2.61 0.00 -BGO_Z1_4 10 7 2 4.95 35.28 0.99 3.91 21.88 2.65 0.00 -BGO_Z1_4 11 7 2 14.85 35.28 1.00 3.13 23.78 2.53 0.00 -BGO_Z1_4 12 7 2 24.75 35.28 1.00 1.93 24.11 2.46 0.00 -BGO_Z1_4 13 7 2 34.65 35.28 0.98 3.53 22.57 2.49 0.00 -BGO_Z1_4 14 7 2 44.55 35.28 0.97 4.56 21.41 2.45 0.00 -BGO_Z1_4 15 7 2 54.45 35.28 0.94 3.85 24.08 2.48 0.00 -BGO_Z1_4 16 7 2 64.35 35.28 0.93 4.15 17.78 2.62 0.00 -BGO_Z1_4 17 7 2 74.25 35.28 0.95 1.24 20.31 2.62 0.00 -BGO_Z1_4 18 7 2 84.15 35.28 0.94 2.53 27.14 2.09 0.05 -BGO_Z1_4 19 7 2 94.05 35.28 0.95 1.23 24.68 2.47 0.00 diff --git a/resource/dee/ShieldEnergyCorrection.csv b/resource/calibration/COSI_SingleDet/ShieldEnergyCorrection.csv similarity index 100% rename from resource/dee/ShieldEnergyCorrection.csv rename to resource/calibration/COSI_SingleDet/ShieldEnergyCorrection.csv diff --git a/src/MModuleDEESMEX.cxx b/src/MModuleDEESMEX.cxx index d9d00223..313a723d 100644 --- a/src/MModuleDEESMEX.cxx +++ b/src/MModuleDEESMEX.cxx @@ -121,15 +121,15 @@ bool MModuleDEESMEX::AnalyzeEvent(MReadOutAssembly* Event) // Step (1): // Handle dead times - needs to happen in main DEE class + // Step (2): Fill the MDEEStripHits of the event + m_Intake.Clear(); + m_Intake.AnalyzeEvent(Event); + if (Event->GetTime() < m_DeadTimeEnd) { // Flag event for deletion return true; } - // Step (2): Fill the MDEEStripHits of the event - m_Intake.Clear(); - m_Intake.AnalyzeEvent(Event); - // Step (3): Merge coincident events // Don't know how to handle random coincidences yet diff --git a/src/MSubModuleShieldTrigger.cxx b/src/MSubModuleShieldTrigger.cxx index 47b248c1..f8aa48cc 100644 --- a/src/MSubModuleShieldTrigger.cxx +++ b/src/MSubModuleShieldTrigger.cxx @@ -1,156 +1,3 @@ -// /* -// * MSubModuleShieldTrigger.cxx -// * -// * -// * Copyright (C) by Andreas Zoglauer. -// * All rights reserved. -// * -// * -// * This code implementation is the intellectual property of -// * Andreas Zoglauer. -// * -// * By copying, distributing or modifying the Program (or any work -// * based on the Program) you indicate your acceptance of this statement, -// * and all its terms. -// * -// */ - - -// //////////////////////////////////////////////////////////////////////////////// -// // -// // MSubModuleShieldTrigger -// // -// //////////////////////////////////////////////////////////////////////////////// - - -// // Include the header: -// #include "MSubModuleShieldTrigger.h" - -// // Standard libs: - -// // ROOT libs: - -// // MEGAlib libs: -// #include "MSubModule.h" - - -// //////////////////////////////////////////////////////////////////////////////// - - -// #ifdef ___CLING___ -// ClassImp(MSubModuleShieldTrigger) -// #endif - - -// //////////////////////////////////////////////////////////////////////////////// - - -// MSubModuleShieldTrigger::MSubModuleShieldTrigger() : MSubModule() -// { -// // Construct an instance of MSubModuleShieldTrigger - -// m_Name = "DEE shield trigger module"; - -// m_HasTrigger = false; -// m_HasVeto = false; -// } - - -// //////////////////////////////////////////////////////////////////////////////// - - -// MSubModuleShieldTrigger::~MSubModuleShieldTrigger() -// { -// // Delete this instance of MSubModuleShieldTrigger -// } - - -// //////////////////////////////////////////////////////////////////////////////// - - -// bool MSubModuleShieldTrigger::Initialize() -// { -// // Initialize the module - -// return MSubModule::Initialize(); -// } - - -// //////////////////////////////////////////////////////////////////////////////// - - -// void MSubModuleShieldTrigger::Clear() -// { -// // Clear for the next event - -// m_HasTrigger = false; -// m_HasVeto = false; - -// MSubModule::Clear(); -// } - - -// //////////////////////////////////////////////////////////////////////////////// - - -// bool MSubModuleShieldTrigger::AnalyzeEvent(MReadOutAssembly* Event) -// { -// // Main data analysis routine, which updates the event to a new level - -// m_HasTrigger = false; - -// return true; -// } - - -// //////////////////////////////////////////////////////////////////////////////// - - -// void MSubModuleShieldTrigger::Finalize() -// { -// // Finalize the analysis - do all cleanup, i.e., undo Initialize() - -// MSubModule::Finalize(); -// } - - -// //////////////////////////////////////////////////////////////////////////////// - - -// bool MSubModuleShieldTrigger::ReadXmlConfiguration(MXmlNode* Node) -// { -// //! Read the configuration data from an XML node - -// /* -// MXmlNode* SomeTagNode = Node->GetNode("SomeTag"); -// if (SomeTagNode != 0) { -// m_SomeTagValue = SomeTagNode->GetValue(); -// } -// */ - -// return true; -// } - - -// //////////////////////////////////////////////////////////////////////////////// - - -// MXmlNode* MSubModuleShieldTrigger::CreateXmlConfiguration(MXmlNode* Node) -// { -// //! Create an XML node tree from the configuration - -// /* -// MXmlNode* SomeTagNode = new MXmlNode(Node, "SomeTag", "SomeValue"); -// */ - -// return Node; -// } - - -// // MSubModuleShieldTrigger.cxx: the end... -// //////////////////////////////////////////////////////////////////////////////// - - /* * MSubModuleShieldTrigger.cxx * @@ -181,11 +28,13 @@ // Standard libs: #include +#include // ROOT libs: // MEGAlib libs: #include "MSubModule.h" +#include "MParser.h" //////////////////////////////////////////////////////////////////////////////// @@ -205,7 +54,6 @@ MSubModuleShieldTrigger::MSubModuleShieldTrigger() : MSubModule() m_Name = "DEE shield trigger module"; - m_SimEvent = nullptr; m_EventTime = 0.0; m_HasTrigger = false; m_HasVeto = false; @@ -224,21 +72,25 @@ MSubModuleShieldTrigger::MSubModuleShieldTrigger() : MSubModule() m_ShieldVetoCounter = 0; m_NumBGOHitsErased = 0; + m_FirstTime = std::numeric_limits::max(); + m_LastTime = 0.0; + // Initialize vectors m_ShieldLastHitTime = vector(nShieldPanels, -10.0); m_ShieldDeadtime = vector(nShieldPanels, 0.0); m_TotalShieldDeadtime = vector(nShieldPanels, 0.0); - m_ShieldHitID = vector>(nShieldPanels); + m_ShieldHitCrystalID = vector>(nShieldPanels); m_DetectorsHitForShieldVeto = vector(nDets, 0); - // Initialize shield panel groups + // Initialize shield panel groups (based on detector IDs) + // These map crystal IDs to panel groups m_ShieldPanelGroups = { - { 0, 1, 2, 3 }, - { 4, 5, 6, 7 }, - { 8, 9, 10, 11 }, - { 12, 13, 14, 15 }, - { 16, 17, 18 }, - { 19, 20, 21 } + { 0, 1, 2, 3 }, // Panel 0: Detectors 0-3 + { 4, 5, 6, 7 }, // Panel 1: Detectors 4-7 + { 8, 9, 10, 11 }, // Panel 2: Detectors 8-11 + { 12, 13, 14, 15 }, // Panel 3: Detectors 12-15 + { 16, 17, 18 }, // Panel 4: Detectors 16-18 + { 19, 20, 21 } // Panel 5: Detectors 19-21 }; } @@ -259,6 +111,11 @@ bool MSubModuleShieldTrigger::Initialize() { // Initialize the module + // Read deadtime parameters from file if provided + if (m_DeadtimeFileName != "" && ParseDeadtimeFile() == false) { + return false; + } + return MSubModule::Initialize(); } @@ -273,11 +130,12 @@ void MSubModuleShieldTrigger::Clear() m_HasTrigger = false; m_HasVeto = false; m_IsShieldDead = false; + m_DeadTimeEnd = MTime(0.0); - // Clear per-event data - for (int i = 0; i < nShieldPanels; i++) { - m_ShieldHitID[i].clear(); - } + // // Clear per-event data + // for (int i = 0; i < nShieldPanels; i++) { + // m_ShieldHitCrystalID[i].clear(); + // } m_DetectorsHitForShieldVeto = vector(nDets, 0); @@ -288,23 +146,23 @@ void MSubModuleShieldTrigger::Clear() //////////////////////////////////////////////////////////////////////////////// -double MSubModuleShieldTrigger::dTimeASICs(vector ASICChannels) +double MSubModuleShieldTrigger::CalculateASICDeadtime(vector CrystalIDs) { // Calculate deadtime for shield ASICs double deadtime = 0; int countUnique = 0; - if (ASICChannels.empty()) { + if (CrystalIDs.empty()) { return 0.0; } - unordered_set BGOChannelsSet; - for (int ID : ASICChannels) { - BGOChannelsSet.insert(ID); + unordered_set BGOCrystalsSet; + for (int ID : CrystalIDs) { + BGOCrystalsSet.insert(ID); } // Count the number of unique channels read out (2 for each hit in the BGO) - countUnique = BGOChannelsSet.size() * 2; + countUnique = BGOCrystalsSet.size() * 2; deadtime = m_ShieldDelayBefore + (m_ASICDeadTimePerChannel * countUnique) + m_ShieldDelayAfter; if (deadtime < m_ShieldPulseDuration) { @@ -318,89 +176,87 @@ double MSubModuleShieldTrigger::dTimeASICs(vector ASICChannels) //////////////////////////////////////////////////////////////////////////////// -bool MSubModuleShieldTrigger::AnalyzeEvent(MReadOutAssembly* Event) +bool MSubModuleShieldTrigger::ProcessShieldHits(MReadOutAssembly* Event) { - // Main data analysis routine for shield trigger and veto + // Process shield crystal hits to determine veto status - m_HasTrigger = false; - m_HasVeto = false; - m_IsShieldDead = false; + m_EventTime = Event->GetTime().GetAsSeconds(); - if (m_SimEvent == nullptr) { - return true; + // Track which GeD detectors got hit (for later deadtime update) + list& LVHits = Event->GetDEEStripHitLVListReference(); + for (const MDEEStripHit& Hit : LVHits) { + int DetID = Hit.m_ROE.GetDetectorID(); + if (DetID >= 0 && DetID < nDets) { + m_DetectorsHitForShieldVeto[DetID] = 1; + } } - int ShieldDetNum = 0; - double energy = 0; - int ShieldDetGroup; - - // Process shield hits - for (unsigned int h = 0; h < m_SimEvent->GetNHTs(); h++) { - MSimHT* HT = m_SimEvent->GetHTAt(h); - - if (HT->GetDetectorType() == 8) { // Shield hit - m_NumShieldHitCounts += 1; - - MDVolumeSequence* VS = HT->GetVolumeSequence(); - MDDetector* Detector = VS->GetDetector(); - MString FullDetName = Detector->GetName(); - MString DetName = FullDetName; - - // Parse detector number - DetName.RemoveAllInPlace("BGO_X0_"); - ShieldDetNum = DetName.ToInt(); - ShieldDetNum = ShieldDetNum - 1; + // Process shield crystal hits + list& CrystalHits = Event->GetDEECrystalHitListReference(); + + for (MDEECrystalHit& CHit : CrystalHits) { + m_NumShieldHitCounts += 1; + + int DetectorID = CHit.m_DetectorID; + int CrystalID = CHit.m_CrystalID; + double energy = CHit.m_Energy; + + if (energy > m_ShieldThreshold) { + // Find which panel group this detector belongs to + int ShieldDetGroup = -1; + bool found = false; - energy = HT->GetOriginalEnergy(); - HT->SetEnergy(energy); - - ShieldDetGroup = 0; - - if (energy > m_ShieldThreshold) { - // Find which panel group this detector belongs to - bool found = false; - for (size_t i = 0; i < m_ShieldPanelGroups.size(); ++i) { - for (size_t j = 0; j < m_ShieldPanelGroups[i].size(); ++j) { - if (m_ShieldPanelGroups[i][j] == ShieldDetNum) { - ShieldDetGroup = i; - found = true; - break; - } + for (size_t i = 0; i < m_ShieldPanelGroups.size(); ++i) { + for (size_t j = 0; j < m_ShieldPanelGroups[i].size(); ++j) { + if (m_ShieldPanelGroups[i][j] == DetectorID) { + ShieldDetGroup = i; + found = true; + break; } - if (found) break; } + if (found) break; + } - // Check deadtime conditions - if (m_ShieldLastHitTime[ShieldDetGroup] + m_ShieldDeadtime[ShieldDetGroup] < m_EventTime) { - // Event occurred after deadtime - for (int group = 0; group < nShieldPanels; group++) { - m_ShieldHitID[group].clear(); - } - m_ShieldLastHitTime[ShieldDetGroup] = m_EventTime; - m_ShieldVetoTime = m_EventTime; - m_ShieldHitID[ShieldDetGroup].push_back(ShieldDetNum); - m_HasVeto = true; - m_TotalShieldDeadtime[ShieldDetGroup] += m_ShieldDeadtime[ShieldDetGroup]; - } - else if (m_ShieldLastHitTime[ShieldDetGroup] + m_ShieldDelayBefore > m_EventTime) { - // Event occurred within coincidence window - m_ShieldVetoTime = m_EventTime; - m_ShieldHitID[ShieldDetGroup].push_back(ShieldDetNum); - m_HasVeto = true; - } - else if (m_ShieldLastHitTime[ShieldDetGroup] + m_ShieldDeadtime[ShieldDetGroup] > m_EventTime) { - // Event occurred within deadtime - m_IsShieldDead = true; - m_NumBGOHitsErased += 1; + if (ShieldDetGroup < 0) { + if (g_Verbosity >= c_Warning) { + cout << m_Name << ": Warning - shield detector " << DetectorID + << " not found in any panel group" << endl; } + continue; + } + + // Check deadtime conditions + if (m_ShieldLastHitTime[ShieldDetGroup] + m_ShieldDeadtime[ShieldDetGroup] < m_EventTime) { + // Event occurred after deadtime - start new veto window + // for (int group = 0; group < nShieldPanels; group++) { + // m_ShieldHitCrystalID[group].clear(); + // } + m_ShieldHitCrystalID[ShieldDetGroup].clear(); + m_ShieldLastHitTime[ShieldDetGroup] = m_EventTime; + m_ShieldVetoTime = m_EventTime; + m_ShieldHitCrystalID[ShieldDetGroup].push_back(CrystalID); + m_HasVeto = true; + m_TotalShieldDeadtime[ShieldDetGroup] += m_ShieldDeadtime[ShieldDetGroup]; + } + else if (m_ShieldLastHitTime[ShieldDetGroup] + m_ShieldDelayBefore > m_EventTime) { + // Event occurred within coincidence window - add to existing veto + m_ShieldVetoTime = m_EventTime; + m_ShieldHitCrystalID[ShieldDetGroup].push_back(CrystalID); + m_HasVeto = true; + } + else if (m_ShieldLastHitTime[ShieldDetGroup] + m_ShieldDeadtime[ShieldDetGroup] > m_EventTime) { + // Event occurred within deadtime + m_IsShieldDead = true; + m_NumBGOHitsErased += 1; } } } - // Calculate deadtime for each panel group + // Calculate deadtime for each panel group after processing all hits for (int group = 0; group < nShieldPanels; group++) { if (!m_IsShieldDead) { - m_ShieldDeadtime[group] = dTimeASICs(m_ShieldHitID[group]); + m_ShieldDeadtime[group] = CalculateASICDeadtime(m_ShieldHitCrystalID[group]); + // cout << "m_ShieldDeadtime[group]" << m_ShieldDeadtime[group] << endl; } } @@ -408,7 +264,75 @@ bool MSubModuleShieldTrigger::AnalyzeEvent(MReadOutAssembly* Event) if (((m_ShieldVetoTime + m_ShieldVetoWindowSize) >= m_EventTime) && (m_EventTime >= m_ShieldVetoTime)) { m_HasVeto = true; - m_ShieldVetoCounter += m_SimEvent->GetNHTs(); + if (Event->GetSimulatedEvent() != nullptr) { + m_ShieldVetoCounter += Event->GetSimulatedEvent()->GetNHTs(); + } + } + + return true; +} + + +//////////////////////////////////////////////////////////////////////////////// + + +bool MSubModuleShieldTrigger::ParseDeadtimeFile() +{ + // Read in deadtime parameters file + // Format: StripCoincidenceWindow ASICDeadTimePerChannel StripDelayAfter1 StripDelayAfter2 + + MParser Parser; + if (Parser.Open(m_DeadtimeFileName) == false) { + cout << m_Name << ": Unable to open deadtime parameters file: " << m_DeadtimeFileName << endl; + return false; + } + + if (Parser.GetNLines() < 2) { + cout << m_Name << ": Deadtime file does not have enough data" << endl; + return false; + } + + // We only need the ASICDeadTimePerChannel (second value) for shield + m_ASICDeadTimePerChannel = Parser.GetTokenizerAt(1)->GetTokenAtAsDouble(1); + + return true; +} + + +//////////////////////////////////////////////////////////////////////////////// + + +bool MSubModuleShieldTrigger::AnalyzeEvent(MReadOutAssembly* Event) +{ + // Main data analysis routine for shield trigger and veto + + m_HasTrigger = false; + m_HasVeto = false; + m_IsShieldDead = false; + + // Process shield hits and check for veto conditions + ProcessShieldHits(Event); + + // Update time tracking for statistics + double eventTime = Event->GetTime().GetAsSeconds(); + if (eventTime < m_FirstTime) { + m_FirstTime = eventTime; + } + if (eventTime > m_LastTime) { + m_LastTime = eventTime; + } + + // If vetoed, set the dead time end + if (m_HasVeto) { + // Calculate the maximum deadtime end across all panels + double maxDeadTimeEnd = 0.0; + for (int i = 0; i < nShieldPanels; i++) { + double thisEnd = m_ShieldLastHitTime[i] + m_ShieldDeadtime[i]; + if (thisEnd > maxDeadTimeEnd) { + maxDeadTimeEnd = thisEnd; + } + } + m_DeadTimeEnd = MTime(maxDeadTimeEnd); } return true; @@ -425,14 +349,29 @@ void MSubModuleShieldTrigger::Finalize() cout << "###################" << endl << "SHIELD TRIGGER MODULE STATISTICS" << endl << "###################" << endl; + + double simTime = m_LastTime - m_FirstTime; + if (simTime > 0) { + cout << "Simulation time: " << simTime << " seconds" << endl; + } + cout << "Total BGO hits before BGO deadtime: " << m_NumShieldHitCounts << endl; for (int i = 0; i < nShieldPanels; i++) { - cout << "Shield Panel " << i << " dead time: " << m_TotalShieldDeadtime[i] << endl; + cout << "Shield Panel " << i << " dead time: " << m_TotalShieldDeadtime[i] << " seconds" << endl; + if (simTime > 0) { + double liveFraction = 1.0 - (m_TotalShieldDeadtime[i] / simTime); + cout << " Livetime fraction: " << liveFraction << endl; + } } cout << "BGO hits erased due to BGO being dead: " << m_NumBGOHitsErased << endl; cout << "Shield vetoes: " << m_ShieldVetoCounter << endl; + + if (simTime > 0) { + double rateAfterDT = (m_NumShieldHitCounts - m_NumBGOHitsErased) / simTime; + cout << "Shield rate after deadtime: " << rateAfterDT << " cps" << endl; + } MSubModule::Finalize(); } @@ -445,6 +384,11 @@ bool MSubModuleShieldTrigger::ReadXmlConfiguration(MXmlNode* Node) { //! Read the configuration data from an XML node + MXmlNode* DeadtimeFileNode = Node->GetNode("DeadtimeFileName"); + if (DeadtimeFileNode != 0) { + m_DeadtimeFileName = DeadtimeFileNode->GetValue(); + } + return true; } @@ -455,6 +399,8 @@ bool MSubModuleShieldTrigger::ReadXmlConfiguration(MXmlNode* Node) MXmlNode* MSubModuleShieldTrigger::CreateXmlConfiguration(MXmlNode* Node) { //! Create an XML node tree from the configuration + + new MXmlNode(Node, "DeadtimeFileName", m_DeadtimeFileName); return Node; } diff --git a/src/MSubModuleStripTrigger.cxx b/src/MSubModuleStripTrigger.cxx index a0f8f2e5..999d4daf 100644 --- a/src/MSubModuleStripTrigger.cxx +++ b/src/MSubModuleStripTrigger.cxx @@ -1,156 +1,3 @@ -// /* -// * MSubModuleStripTrigger.cxx -// * -// * -// * Copyright (C) by Andreas Zoglauer. -// * All rights reserved. -// * -// * -// * This code implementation is the intellectual property of -// * Andreas Zoglauer. -// * -// * By copying, distributing or modifying the Program (or any work -// * based on the Program) you indicate your acceptance of this statement, -// * and all its terms. -// * -// */ - - -// //////////////////////////////////////////////////////////////////////////////// -// // -// // MSubModuleStripTrigger -// // -// //////////////////////////////////////////////////////////////////////////////// - - -// // Include the header: -// #include "MSubModuleStripTrigger.h" - -// // Standard libs: - -// // ROOT libs: - -// // MEGAlib libs: -// #include "MSubModule.h" - - -// //////////////////////////////////////////////////////////////////////////////// - - -// #ifdef ___CLING___ -// ClassImp(MSubModuleStripTrigger) -// #endif - - -// //////////////////////////////////////////////////////////////////////////////// - - -// MSubModuleStripTrigger::MSubModuleStripTrigger() : MSubModule() -// { -// // Construct an instance of MSubModuleStripTrigger - -// m_Name = "DEE strip trigger module"; - -// m_HasTrigger = false; -// m_HasVeto = false; -// } - - -// //////////////////////////////////////////////////////////////////////////////// - - -// MSubModuleStripTrigger::~MSubModuleStripTrigger() -// { -// // Delete this instance of MSubModuleStripTrigger -// } - - -// //////////////////////////////////////////////////////////////////////////////// - - -// bool MSubModuleStripTrigger::Initialize() -// { -// // Initialize the module - -// return MSubModule::Initialize(); -// } - - -// //////////////////////////////////////////////////////////////////////////////// - - -// void MSubModuleStripTrigger::Clear() -// { -// // Clear for the next event - -// m_HasTrigger = false; -// m_HasVeto = false; - -// MSubModule::Clear(); -// } - - -// //////////////////////////////////////////////////////////////////////////////// - - -// bool MSubModuleStripTrigger::AnalyzeEvent(MReadOutAssembly* Event) -// { -// // Main data analysis routine, which updates the event to a new level - -// m_HasTrigger = true; - -// return true; -// } - - -// //////////////////////////////////////////////////////////////////////////////// - - -// void MSubModuleStripTrigger::Finalize() -// { -// // Finalize the analysis - do all cleanup, i.e., undo Initialize() - -// MSubModule::Finalize(); -// } - - -// //////////////////////////////////////////////////////////////////////////////// - - -// bool MSubModuleStripTrigger::ReadXmlConfiguration(MXmlNode* Node) -// { -// //! Read the configuration data from an XML node - -// /* -// MXmlNode* SomeTagNode = Node->GetNode("SomeTag"); -// if (SomeTagNode != 0) { -// m_SomeTagValue = SomeTagNode->GetValue(); -// } -// */ - -// return true; -// } - - -// //////////////////////////////////////////////////////////////////////////////// - - -// MXmlNode* MSubModuleStripTrigger::CreateXmlConfiguration(MXmlNode* Node) -// { -// //! Create an XML node tree from the configuration - -// /* -// MXmlNode* SomeTagNode = new MXmlNode(Node, "SomeTag", "SomeValue"); -// */ - -// return Node; -// } - - -// // MSubModuleStripTrigger.cxx: the end... -// //////////////////////////////////////////////////////////////////////////////// - - /* * MSubModuleStripTrigger.cxx * @@ -181,6 +28,7 @@ // Standard libs: #include +#include // ROOT libs: @@ -222,6 +70,10 @@ MSubModuleStripTrigger::MSubModuleStripTrigger() : MSubModule() m_ASICLastHitTime = -10.0; m_StripsTotalDeadtime = 0.0; m_StripHitsErased = 0; + m_TotalStripHitsCounter = 0; + + m_FirstTime = std::numeric_limits::max(); + m_LastTime = 0.0; // Initialize vectors m_ASICDeadTime = vector>(nDets, vector(nASICs, 0.0)); @@ -273,6 +125,7 @@ void MSubModuleStripTrigger::Clear() m_HasTrigger = false; m_HasVeto = false; + m_DeadTimeEnd = MTime(0.0); MSubModule::Clear(); } @@ -281,9 +134,9 @@ void MSubModuleStripTrigger::Clear() //////////////////////////////////////////////////////////////////////////////// -double MSubModuleStripTrigger::dTimeASICs(vector ASICChannels) +double MSubModuleStripTrigger::CalculateASICDeadtime(vector ASICChannels) { - // Calculate deadtime for GeD ASICs + // Calculate deadtime for GeD ASICs including nearest neighbor readout double deadtime = 0; int countUnique = 0; @@ -296,10 +149,12 @@ double MSubModuleStripTrigger::dTimeASICs(vector ASICChannels) // Sort ASICChannels to process channels in ascending order sort(ASICChannels.begin(), ASICChannels.end()); - // Loop through each channel ID in the sorted list + // Loop through each channel ID and add nearest neighbors for (int ID : ASICChannels) { if (ID == 64) { - cout << "Strip ID is 64; should not happen" << endl; + if (g_Verbosity >= c_Warning) { + cout << m_Name << ": Warning - Strip ID is 64; should not happen" << endl; + } continue; } else if (ID == 0 || ID == 32) { // Edge case: If ID is 0 or 32, add the channel and the next channel @@ -350,7 +205,9 @@ bool MSubModuleStripTrigger::CountRate(vector ASICChannels, vector int temp_size = ASICChannelsSet.size(); if (ID == 64) { - cout << "Strip ID is 64; should not happen" << endl; + if (g_Verbosity >= c_Warning) { + cout << m_Name << ": Warning - Strip ID is 64; should not happen" << endl; + } continue; } else if (ID == 0 || ID == 32) { ASICChannelsSet.insert(ID); @@ -384,44 +241,173 @@ bool MSubModuleStripTrigger::CountRate(vector ASICChannels, vector //////////////////////////////////////////////////////////////////////////////// -void MSubModuleStripTrigger::UpdateDeadtime(int det, int ASIC, vector stripIDs, bool isFirstHitAfterDead) +bool MSubModuleStripTrigger::CheckTriggerConditions(MReadOutAssembly* Event) { - // Update deadtime tracking for a detector/ASIC - - if (det < 0 || det >= nDets || ASIC < 0 || ASIC >= nASICs) { - return; + // Check if at least one strip exists on each side of each detector + // If not, remove remaining strips because they won't trigger detector + + vector xExists(nDets, 0); + vector yExists(nDets, 0); + + // Check LV strips (x-direction) + list& LVHits = Event->GetDEEStripHitLVListReference(); + for (const MDEEStripHit& Hit : LVHits) { + if (!Hit.m_IsGuardRing) { + int DetID = Hit.m_ROE.GetDetectorID(); + if (DetID >= 0 && DetID < nDets) { + xExists[DetID] = 1; + } + } } - if (isFirstHitAfterDead) { - // Clear the lists after deadtime period - for (int d = 0; d < nDets; d++) { - for (int a = 0; a < nASICs; a++) { - CountRate(m_ASICHitStripID[d][a], m_TempEvtTimes[d][a]); - m_ASICHitStripID_noDT[d][a].clear(); - m_ASICHitStripID[d][a].clear(); - m_TempEvtTimes[d][a].clear(); + // Check HV strips (y-direction) + list& HVHits = Event->GetDEEStripHitHVListReference(); + for (const MDEEStripHit& Hit : HVHits) { + if (!Hit.m_IsGuardRing) { + int DetID = Hit.m_ROE.GetDetectorID(); + if (DetID >= 0 && DetID < nDets) { + yExists[DetID] = 1; } } - - m_StripsTotalDeadtime += m_StripsCurrentDeadtime; - m_StripsCurrentDeadtime = 0.0; - m_ASICLastHitTime = m_EventTime; } - // Add strip IDs to tracking vectors - for (int stripID : stripIDs) { - m_ASICHitStripID[det][ASIC].push_back(stripID); - m_ASICHitStripID_noDT[det][ASIC].push_back(stripID); - m_TempEvtTimes[det][ASIC].push_back(m_EventTime); + // Remove hits that won't trigger detector + auto LVIter = LVHits.begin(); + while (LVIter != LVHits.end()) { + int DetID = LVIter->m_ROE.GetDetectorID(); + if (DetID >= 0 && DetID < nDets && (xExists[DetID] == 0 || yExists[DetID] == 0)) { + LVIter = LVHits.erase(LVIter); + } else { + ++LVIter; + } + } + + auto HVIter = HVHits.begin(); + while (HVIter != HVHits.end()) { + int DetID = HVIter->m_ROE.GetDetectorID(); + if (DetID >= 0 && DetID < nDets && (xExists[DetID] == 0 || yExists[DetID] == 0)) { + HVIter = HVHits.erase(HVIter); + } else { + ++HVIter; + } + } + + // Check if any valid hits remain + return (!LVHits.empty() || !HVHits.empty()); +} + + +//////////////////////////////////////////////////////////////////////////////// + + +bool MSubModuleStripTrigger::ProcessStripHits(MReadOutAssembly* Event) +{ + // Process strip hits for deadtime calculation and trigger determination + + m_EventTime = Event->GetTime().GetAsSeconds(); + bool ASICFirstHitAfterDead = false; + m_IsGeDDead = false; + + // Get merged strip hits from the event + list& LVHits = Event->GetDEEStripHitLVListReference(); + list& HVHits = Event->GetDEEStripHitHVListReference(); + + // Process all hits and track deadtime + auto ProcessHits = [&](list& Hits) { + auto HitIter = Hits.begin(); + while (HitIter != Hits.end()) { + m_TotalStripHitsCounter++; + + int det = HitIter->m_ROE.GetDetectorID(); + if (det < 0 || det >= nDets) { + ++HitIter; + continue; + } + + // Determine which ASIC this strip belongs to + int ASICofDet = -1; + int StripID = HitIter->m_ROE.GetStripID(); + bool IsLV = HitIter->m_ROE.IsLowVoltageStrip(); + + if (IsLV && StripID >= 0 && StripID <= 31) { + ASICofDet = 0; + } else if (IsLV && StripID >= 32 && StripID <= 63) { + ASICofDet = 1; + } else if (!IsLV && StripID >= 0 && StripID <= 31) { + ASICofDet = 2; + } else if (!IsLV && StripID >= 32 && StripID <= 63) { + ASICofDet = 3; + } else { + if (g_Verbosity >= c_Warning) { + cout << m_Name << ": Warning - Strip not associated with any ASIC" << endl; + } + ++HitIter; + continue; + } + + // Check deadtime status + if (m_ASICLastHitTime + m_StripsCurrentDeadtime < m_EventTime) { + // Event occurred after deadtime - clear old data + if (!ASICFirstHitAfterDead) { + for (int d = 0; d < nDets; d++) { + for (int a = 0; a < nASICs; a++) { + CountRate(m_ASICHitStripID[d][a], m_TempEvtTimes[d][a]); + m_ASICHitStripID_noDT[d][a].clear(); + m_ASICHitStripID[d][a].clear(); + m_TempEvtTimes[d][a].clear(); + } + } + ASICFirstHitAfterDead = true; + m_ASICLastHitTime = m_EventTime; + } + + m_ASICHitStripID[det][ASICofDet].push_back(StripID); + m_ASICHitStripID_noDT[det][ASICofDet].push_back(StripID); + m_TempEvtTimes[det][ASICofDet].push_back(m_EventTime); + } + else if (m_ASICLastHitTime + m_StripCoincidenceWindow > m_EventTime) { + // Event occurred within coincidence window + m_ASICHitStripID[det][ASICofDet].push_back(StripID); + m_ASICHitStripID_noDT[det][ASICofDet].push_back(StripID); + m_TempEvtTimes[det][ASICofDet].push_back(m_EventTime); + } + else if (m_ASICLastHitTime + m_StripsCurrentDeadtime > m_EventTime) { + // Event occurred within deadtime - erase hit + m_ASICHitStripID_noDT[det][ASICofDet].push_back(StripID); + m_TempEvtTimes[det][ASICofDet].push_back(m_EventTime); + m_IsGeDDead = true; + m_StripHitsErased++; + HitIter = Hits.erase(HitIter); + continue; + } + + ++HitIter; + } + }; + + // Process both LV and HV hits + ProcessHits(LVHits); + ProcessHits(HVHits); + + // Update total deadtime if this was first hit after dead period + if (ASICFirstHitAfterDead) { + m_StripsTotalDeadtime += m_StripsCurrentDeadtime; + m_StripsCurrentDeadtime = 0.0; } - // Calculate new deadtime - if (!m_IsGeDDead) { - double newDeadtime = dTimeASICs(m_ASICHitStripID[det][ASIC]); - if (newDeadtime > m_StripsCurrentDeadtime) { - m_StripsCurrentDeadtime = newDeadtime; + // Calculate new deadtime for each ASIC + for (int det = 0; det < nDets; det++) { + for (int ASIC = 0; ASIC < nASICs; ASIC++) { + if (!m_IsGeDDead && !m_ASICHitStripID[det][ASIC].empty()) { + m_ASICDeadTime[det][ASIC] = CalculateASICDeadtime(m_ASICHitStripID[det][ASIC]); + if (m_ASICDeadTime[det][ASIC] > m_StripsCurrentDeadtime) { + m_StripsCurrentDeadtime = m_ASICDeadTime[det][ASIC]; + } + } } } + + return true; } @@ -431,11 +417,51 @@ void MSubModuleStripTrigger::UpdateDeadtime(int det, int ASIC, vector strip bool MSubModuleStripTrigger::AnalyzeEvent(MReadOutAssembly* Event) { // Main data analysis routine for strip trigger - - // For now, we just set the trigger flag to true - // More complex logic will be implemented when integrating with DEE + + m_HasTrigger = false; + m_HasVeto = false; + + // Process strip hits and calculate deadtime + ProcessStripHits(Event); + + // Check if we have valid trigger conditions (at least one strip on each side) + if (!CheckTriggerConditions(Event)) { + // No valid trigger - all strips removed + return true; + } + + // Update trigger rates + set detectorsHit; + list& LVHits = Event->GetDEEStripHitLVListReference(); + for (const MDEEStripHit& Hit : LVHits) { + if (!Hit.m_IsGuardRing) { + int DetID = Hit.m_ROE.GetDetectorID(); + if (DetID >= 0 && DetID < nDets) { + detectorsHit.insert(DetID); + } + } + } + + for (int detID : detectorsHit) { + m_TriggerRates[detID]++; + } + + // We have a valid trigger m_HasTrigger = true; + // Update time tracking + if (m_EventTime < m_FirstTime) { + m_FirstTime = m_EventTime; + } + if (m_EventTime > m_LastTime) { + m_LastTime = m_EventTime; + } + + // Set dead time end + if (m_StripsCurrentDeadtime > 0) { + m_DeadTimeEnd = MTime(m_ASICLastHitTime + m_StripsCurrentDeadtime); + } + return true; } @@ -451,16 +477,32 @@ void MSubModuleStripTrigger::Finalize() << "STRIP TRIGGER MODULE STATISTICS" << endl << "###################" << endl; - cout << "Total dead time of the instrument: " << m_StripsTotalDeadtime << endl; + double simTime = m_LastTime - m_FirstTime; + if (simTime > 0) { + cout << "Simulation time: " << simTime << " seconds" << endl; + } + + cout << "Total strip hits after charge sharing (before deadtime): " << m_TotalStripHitsCounter << endl; + cout << "Total dead time of the instrument: " << m_StripsTotalDeadtime << " seconds" << endl; + + if (simTime > 0) { + double liveFraction = 1.0 - (m_StripsTotalDeadtime / simTime); + cout << "Livetime fraction: " << liveFraction << endl; + } + cout << "Hits erased due to detector being dead: " << m_StripHitsErased << endl; - if (m_StripsTotalDeadtime > 0) { - cout << "Avg deadtime per strip hit: " << m_StripsTotalDeadtime << endl; + if (m_TotalStripHitsCounter > 0) { + cout << "Avg deadtime per strip hit: " << m_StripsTotalDeadtime / m_TotalStripHitsCounter << " seconds" << endl; } cout << "Trigger rates (events per detector):" << endl; for (int i = 0; i < nDets; i++) { - cout << " Detector " << i << ": " << m_TriggerRates[i] << endl; + cout << " Detector " << i << ": " << m_TriggerRates[i] << " events"; + if (simTime > 0) { + cout << " (" << (m_TriggerRates[i] / simTime) << " Hz)"; + } + cout << endl; } MSubModule::Finalize(); @@ -476,12 +518,12 @@ bool MSubModuleStripTrigger::ParseDeadtimeFile() MParser Parser; if (Parser.Open(m_DeadtimeFileName) == false) { - cout << "Unable to open deadtime parameters file: " << m_DeadtimeFileName << endl; + cout << m_Name << ": Unable to open deadtime parameters file: " << m_DeadtimeFileName << endl; return false; } if (Parser.GetNLines() < 2) { - cout << "Deadtime file does not have enough data" << endl; + cout << m_Name << ": Deadtime file does not have enough data" << endl; return false; } @@ -517,9 +559,9 @@ MXmlNode* MSubModuleStripTrigger::CreateXmlConfiguration(MXmlNode* Node) { //! Create an XML node tree from the configuration - MXmlNode* DeadtimeFileNode = new MXmlNode(Node, "DeadtimeFileName", m_DeadtimeFileName); + new MXmlNode(Node, "DeadtimeFileName", m_DeadtimeFileName); + return Node; - } From 64bd32a2d4263a4e0ce7c117975d2921b4012c4b Mon Sep 17 00:00:00 2001 From: parshadkp <111451184+parshadkp@users.noreply.github.com> Date: Tue, 23 Dec 2025 12:14:11 -0500 Subject: [PATCH 07/10] Updated BGO detector names Updated BGO detector names from 1 back to 0. --- .../COSI_SingleDet/ShieldEnergyCorrection.csv | 2736 ++++++++--------- 1 file changed, 1368 insertions(+), 1368 deletions(-) diff --git a/resource/calibration/COSI_SingleDet/ShieldEnergyCorrection.csv b/resource/calibration/COSI_SingleDet/ShieldEnergyCorrection.csv index 1d9563d2..1d5716f1 100644 --- a/resource/calibration/COSI_SingleDet/ShieldEnergyCorrection.csv +++ b/resource/calibration/COSI_SingleDet/ShieldEnergyCorrection.csv @@ -1,1369 +1,1369 @@ # shield_ID crystal_ID voxel_X voxel_Y voxel_Z x[mm] y[mm] m q a b c -1 1 0 0 18 -91.89 -54.08 1.00 2.17 27.47 2.19 0.07 -1 1 0 0 17 -81.68 -54.08 1.00 2.43 16.38 2.72 0.00 -1 1 0 0 16 -71.47 -54.08 0.99 3.87 19.87 2.78 0.00 -1 1 0 0 15 -61.26 -54.08 1.06 -5.15 37.47 0.00 0.11 -1 1 0 0 14 -51.05 -54.08 1.00 3.13 23.31 2.61 0.00 -1 1 0 0 13 -40.84 -54.08 0.99 4.25 21.20 2.78 0.00 -1 1 0 0 12 -30.63 -54.08 1.00 1.58 24.37 2.13 0.08 -1 1 0 0 11 -20.42 -54.08 1.00 2.07 22.98 2.86 0.00 -1 1 0 0 10 -10.21 -54.08 0.97 4.57 18.89 2.88 0.00 -1 1 0 0 9 0.00 -54.08 1.00 1.55 27.46 2.48 0.00 -1 1 0 0 8 10.21 -54.08 0.98 3.14 22.61 2.63 0.00 -1 1 0 0 7 20.42 -54.08 0.95 3.81 16.63 2.72 0.00 -1 1 0 0 6 30.63 -54.08 0.95 3.41 24.89 2.66 0.00 -1 1 0 0 5 40.84 -54.08 0.94 2.12 24.16 2.35 0.05 -1 1 0 0 4 51.05 -54.08 0.95 1.83 25.30 2.42 0.04 -1 1 0 0 3 61.26 -54.08 0.95 1.71 23.72 2.65 0.00 -1 1 0 0 2 71.47 -54.08 0.95 1.80 19.55 2.81 0.00 -1 1 0 0 1 81.68 -54.08 0.93 4.14 24.07 2.46 0.05 -1 1 0 0 0 91.89 -54.08 0.95 2.60 16.28 2.91 0.00 -1 1 0 1 18 -91.89 -44.25 1.00 3.96 24.36 2.67 0.00 -1 1 0 1 17 -81.68 -44.25 1.00 2.32 25.39 2.47 0.00 -1 1 0 1 16 -71.47 -44.25 1.01 1.80 19.19 2.95 0.00 -1 1 0 1 15 -61.26 -44.25 1.00 2.25 18.34 2.85 0.00 -1 1 0 1 14 -51.05 -44.25 0.99 4.80 22.42 2.65 0.00 -1 1 0 1 13 -40.84 -44.25 1.02 -0.80 16.27 3.01 0.00 -1 1 0 1 12 -30.63 -44.25 1.01 0.79 22.96 2.64 0.00 -1 1 0 1 11 -20.42 -44.25 1.00 1.24 22.01 2.73 0.00 -1 1 0 1 10 -10.21 -44.25 0.99 3.14 25.39 2.47 0.04 -1 1 0 1 9 0.00 -44.25 0.97 5.67 21.98 2.65 0.00 -1 1 0 1 8 10.21 -44.25 0.96 5.35 23.22 2.67 0.02 -1 1 0 1 7 20.42 -44.25 0.99 -0.82 22.29 2.71 0.00 -1 1 0 1 6 30.63 -44.25 0.95 5.61 21.18 2.67 0.00 -1 1 0 1 5 40.84 -44.25 0.97 2.23 20.13 2.70 0.00 -1 1 0 1 4 51.05 -44.25 0.95 1.44 24.43 2.70 0.00 -1 1 0 1 3 61.26 -44.25 0.93 4.34 22.98 2.72 0.00 -1 1 0 1 2 71.47 -44.25 0.95 2.44 23.97 2.77 0.00 -1 1 0 1 1 81.68 -44.25 0.95 3.32 24.00 2.68 0.00 -1 1 0 1 0 91.89 -44.25 0.94 3.13 17.71 2.88 0.00 -1 1 0 2 18 -91.89 -34.42 0.98 6.64 35.87 0.32 0.10 -1 1 0 2 17 -81.68 -34.42 1.00 3.27 22.93 2.72 0.00 -1 1 0 2 16 -71.47 -34.42 0.99 1.43 25.31 2.67 0.00 -1 1 0 2 15 -61.26 -34.42 1.00 1.98 21.92 2.72 0.00 -1 1 0 2 14 -51.05 -34.42 0.99 2.49 25.38 2.67 0.00 -1 1 0 2 13 -40.84 -34.42 1.00 2.67 20.17 2.59 0.04 -1 1 0 2 12 -30.63 -34.42 0.99 3.94 20.80 2.69 0.01 -1 1 0 2 11 -20.42 -34.42 1.00 1.79 23.08 2.64 0.00 -1 1 0 2 10 -10.21 -34.42 0.99 3.54 21.15 2.69 0.00 -1 1 0 2 9 0.00 -34.42 1.00 2.97 19.56 2.68 0.00 -1 1 0 2 8 10.21 -34.42 0.99 0.82 27.75 2.49 0.02 -1 1 0 2 7 20.42 -34.42 0.99 1.90 18.79 2.83 0.00 -1 1 0 2 6 30.63 -34.42 1.00 0.78 21.49 2.65 0.00 -1 1 0 2 5 40.84 -34.42 0.98 3.88 23.63 2.40 0.04 -1 1 0 2 4 51.05 -34.42 0.98 2.10 19.91 2.95 0.00 -1 1 0 2 3 61.26 -34.42 0.94 3.20 22.43 2.66 0.00 -1 1 0 2 2 71.47 -34.42 0.95 0.86 23.01 2.56 0.00 -1 1 0 2 1 81.68 -34.42 0.96 -0.52 27.31 2.40 0.04 -1 1 0 2 0 91.89 -34.42 0.95 1.97 23.15 2.75 0.00 -1 1 0 3 18 -91.89 -24.58 1.02 -0.68 27.00 2.76 0.00 -1 1 0 3 17 -81.68 -24.58 0.99 3.81 21.49 2.75 0.00 -1 1 0 3 16 -71.47 -24.58 1.01 1.51 14.78 3.04 0.00 -1 1 0 3 15 -61.26 -24.58 1.00 2.77 21.24 2.65 0.00 -1 1 0 3 14 -51.05 -24.58 0.98 4.55 26.29 2.26 0.08 -1 1 0 3 13 -40.84 -24.58 0.99 3.99 16.66 3.01 0.00 -1 1 0 3 12 -30.63 -24.58 1.00 2.71 22.63 2.78 0.00 -1 1 0 3 11 -20.42 -24.58 1.01 1.60 22.53 2.65 0.00 -1 1 0 3 10 -10.21 -24.58 1.00 2.54 21.92 2.61 0.00 -1 1 0 3 9 0.00 -24.58 0.98 4.18 19.75 2.89 0.00 -1 1 0 3 8 10.21 -24.58 0.99 5.25 26.22 2.31 0.05 -1 1 0 3 7 20.42 -24.58 1.02 1.31 26.61 2.68 0.00 -1 1 0 3 6 30.63 -24.58 1.01 4.77 25.72 2.59 0.00 -1 1 0 3 5 40.84 -24.58 1.02 2.53 22.06 2.74 0.00 -1 1 0 3 4 51.05 -24.58 1.02 1.18 22.70 2.60 0.02 -1 1 0 3 3 61.26 -24.58 1.03 -1.14 28.64 2.18 0.07 -1 1 0 3 2 71.47 -24.58 0.96 3.86 18.73 2.98 0.00 -1 1 0 3 1 81.68 -24.58 0.95 -1.23 25.46 2.70 0.00 -1 1 0 3 0 91.89 -24.58 0.92 4.73 18.40 2.71 0.00 -1 1 0 4 18 -91.89 -14.75 0.99 3.62 19.21 2.89 0.00 -1 1 0 4 17 -81.68 -14.75 1.00 1.70 25.76 2.58 0.03 -1 1 0 4 16 -71.47 -14.75 1.01 1.47 29.56 2.07 0.06 -1 1 0 4 15 -61.26 -14.75 1.00 2.12 19.68 2.88 0.00 -1 1 0 4 14 -51.05 -14.75 1.00 2.88 28.98 2.22 0.04 -1 1 0 4 13 -40.84 -14.75 1.02 -0.16 23.89 2.62 0.00 -1 1 0 4 12 -30.63 -14.75 1.00 3.10 25.43 2.53 0.00 -1 1 0 4 11 -20.42 -14.75 0.98 5.12 23.40 2.79 0.00 -1 1 0 4 10 -10.21 -14.75 1.01 2.53 24.41 2.76 0.00 -1 1 0 4 9 0.00 -14.75 1.01 2.76 22.34 2.77 0.03 -1 1 0 4 8 10.21 -14.75 1.00 4.37 23.43 2.96 0.00 -1 1 0 4 7 20.42 -14.75 1.03 1.41 20.35 2.84 0.00 -1 1 0 4 6 30.63 -14.75 1.03 2.30 19.85 2.89 0.00 -1 1 0 4 5 40.84 -14.75 1.06 0.17 26.75 2.30 0.08 -1 1 0 4 4 51.05 -14.75 1.05 3.29 16.88 3.21 0.00 -1 1 0 4 3 61.26 -14.75 1.07 0.87 26.14 2.16 0.11 -1 1 0 4 2 71.47 -14.75 1.06 2.16 17.18 3.45 0.06 -1 1 0 4 1 81.68 -14.75 1.02 2.63 23.16 3.76 0.05 -1 1 0 4 0 91.89 -14.75 0.93 3.35 15.87 3.21 0.00 -1 1 0 5 18 -91.89 -4.92 0.99 2.76 22.78 2.68 0.00 -1 1 0 5 17 -81.68 -4.92 1.00 2.38 24.10 2.49 0.03 -1 1 0 5 16 -71.47 -4.92 0.98 3.99 23.95 2.65 0.00 -1 1 0 5 15 -61.26 -4.92 0.99 3.74 25.25 2.23 0.05 -1 1 0 5 14 -51.05 -4.92 1.01 0.91 20.65 2.78 0.00 -1 1 0 5 13 -40.84 -4.92 0.99 3.65 22.16 2.65 0.00 -1 1 0 5 12 -30.63 -4.92 1.01 0.08 24.77 2.69 0.00 -1 1 0 5 11 -20.42 -4.92 1.01 0.74 18.36 2.85 0.00 -1 1 0 5 10 -10.21 -4.92 0.99 5.34 23.36 2.70 0.00 -1 1 0 5 9 0.00 -4.92 1.01 2.99 20.83 2.82 0.00 -1 1 0 5 8 10.21 -4.92 1.01 4.86 20.78 2.93 0.00 -1 1 0 5 7 20.42 -4.92 1.03 4.37 27.58 2.23 0.07 -1 1 0 5 6 30.63 -4.92 1.04 3.11 22.64 2.90 0.00 -1 1 0 5 5 40.84 -4.92 1.06 2.64 23.39 2.85 0.00 -1 1 0 5 4 51.05 -4.92 1.09 2.42 15.99 3.16 0.00 -1 1 0 5 3 61.26 -4.92 1.10 2.91 19.07 3.30 0.07 -1 1 0 5 2 71.47 -4.92 1.17 -0.86 26.47 2.09 0.15 -1 1 0 5 1 81.68 -4.92 1.22 1.14 31.73 1.85 0.19 -1 1 0 5 0 91.89 -4.92 1.21 1.22 27.15 3.88 0.42 -1 1 0 6 18 -91.89 4.92 0.99 2.76 22.78 2.68 0.00 -1 1 0 6 17 -81.68 4.92 1.00 2.38 24.10 2.49 0.03 -1 1 0 6 16 -71.47 4.92 0.98 3.99 23.95 2.65 0.00 -1 1 0 6 15 -61.26 4.92 0.99 3.74 25.25 2.23 0.05 -1 1 0 6 14 -51.05 4.92 1.01 0.91 20.65 2.78 0.00 -1 1 0 6 13 -40.84 4.92 0.99 3.65 22.16 2.65 0.00 -1 1 0 6 12 -30.63 4.92 1.01 0.08 24.77 2.69 0.00 -1 1 0 6 11 -20.42 4.92 1.01 0.74 18.36 2.85 0.00 -1 1 0 6 10 -10.21 4.92 0.99 5.34 23.36 2.70 0.00 -1 1 0 6 9 0.00 4.92 1.01 2.99 20.83 2.82 0.00 -1 1 0 6 8 10.21 4.92 1.01 4.86 20.78 2.93 0.00 -1 1 0 6 7 20.42 4.92 1.03 4.37 27.58 2.23 0.07 -1 1 0 6 6 30.63 4.92 1.04 3.11 22.64 2.90 0.00 -1 1 0 6 5 40.84 4.92 1.06 2.64 23.39 2.85 0.00 -1 1 0 6 4 51.05 4.92 1.09 2.42 15.99 3.16 0.00 -1 1 0 6 3 61.26 4.92 1.10 2.91 19.07 3.30 0.07 -1 1 0 6 2 71.47 4.92 1.17 -0.86 26.47 2.09 0.15 -1 1 0 6 1 81.68 4.92 1.22 1.14 31.73 1.85 0.19 -1 1 0 6 0 91.89 4.92 1.21 1.22 27.15 3.88 0.42 -1 1 0 7 18 -91.89 14.75 0.99 3.62 19.21 2.89 0.00 -1 1 0 7 17 -81.68 14.75 1.00 1.70 25.76 2.58 0.03 -1 1 0 7 16 -71.47 14.75 1.01 1.47 29.56 2.07 0.06 -1 1 0 7 15 -61.26 14.75 1.00 2.12 19.68 2.88 0.00 -1 1 0 7 14 -51.05 14.75 1.00 2.88 28.98 2.22 0.04 -1 1 0 7 13 -40.84 14.75 1.02 -0.16 23.89 2.62 0.00 -1 1 0 7 12 -30.63 14.75 1.00 3.10 25.43 2.53 0.00 -1 1 0 7 11 -20.42 14.75 0.98 5.12 23.40 2.79 0.00 -1 1 0 7 10 -10.21 14.75 1.01 2.53 24.41 2.76 0.00 -1 1 0 7 9 0.00 14.75 1.01 2.76 22.34 2.77 0.03 -1 1 0 7 8 10.21 14.75 1.00 4.37 23.43 2.96 0.00 -1 1 0 7 7 20.42 14.75 1.03 1.41 20.35 2.84 0.00 -1 1 0 7 6 30.63 14.75 1.03 2.30 19.85 2.89 0.00 -1 1 0 7 5 40.84 14.75 1.06 0.17 26.75 2.30 0.08 -1 1 0 7 4 51.05 14.75 1.05 3.29 16.88 3.21 0.00 -1 1 0 7 3 61.26 14.75 1.07 0.87 26.14 2.16 0.11 -1 1 0 7 2 71.47 14.75 1.06 2.16 17.18 3.45 0.06 -1 1 0 7 1 81.68 14.75 1.02 2.63 23.16 3.76 0.05 -1 1 0 7 0 91.89 14.75 0.93 3.35 15.87 3.21 0.00 -1 1 0 8 18 -91.89 24.58 1.02 -0.68 27.00 2.76 0.00 -1 1 0 8 17 -81.68 24.58 0.99 3.81 21.49 2.75 0.00 -1 1 0 8 16 -71.47 24.58 1.01 1.51 14.78 3.04 0.00 -1 1 0 8 15 -61.26 24.58 1.00 2.77 21.24 2.65 0.00 -1 1 0 8 14 -51.05 24.58 0.98 4.55 26.29 2.26 0.08 -1 1 0 8 13 -40.84 24.58 0.99 3.99 16.66 3.01 0.00 -1 1 0 8 12 -30.63 24.58 1.00 2.71 22.63 2.78 0.00 -1 1 0 8 11 -20.42 24.58 1.01 1.60 22.53 2.65 0.00 -1 1 0 8 10 -10.21 24.58 1.00 2.54 21.92 2.61 0.00 -1 1 0 8 9 0.00 24.58 0.98 4.18 19.75 2.89 0.00 -1 1 0 8 8 10.21 24.58 0.99 5.25 26.22 2.31 0.05 -1 1 0 8 7 20.42 24.58 1.02 1.31 26.61 2.68 0.00 -1 1 0 8 6 30.63 24.58 1.01 4.77 25.72 2.59 0.00 -1 1 0 8 5 40.84 24.58 1.02 2.53 22.06 2.74 0.00 -1 1 0 8 4 51.05 24.58 1.02 1.18 22.70 2.60 0.02 -1 1 0 8 3 61.26 24.58 1.03 -1.14 28.64 2.18 0.07 -1 1 0 8 2 71.47 24.58 0.96 3.86 18.73 2.98 0.00 -1 1 0 8 1 81.68 24.58 0.95 -1.23 25.46 2.70 0.00 -1 1 0 8 0 91.89 24.58 0.92 4.73 18.40 2.71 0.00 -1 1 0 9 18 -91.89 34.42 0.98 6.64 35.87 0.32 0.10 -1 1 0 9 17 -81.68 34.42 1.00 3.27 22.93 2.72 0.00 -1 1 0 9 16 -71.47 34.42 0.99 1.43 25.31 2.67 0.00 -1 1 0 9 15 -61.26 34.42 1.00 1.98 21.92 2.72 0.00 -1 1 0 9 14 -51.05 34.42 0.99 2.49 25.38 2.67 0.00 -1 1 0 9 13 -40.84 34.42 1.00 2.67 20.17 2.59 0.04 -1 1 0 9 12 -30.63 34.42 0.99 3.94 20.80 2.69 0.01 -1 1 0 9 11 -20.42 34.42 1.00 1.79 23.08 2.64 0.00 -1 1 0 9 10 -10.21 34.42 0.99 3.54 21.15 2.69 0.00 -1 1 0 9 9 0.00 34.42 1.00 2.97 19.56 2.68 0.00 -1 1 0 9 8 10.21 34.42 0.99 0.82 27.75 2.49 0.02 -1 1 0 9 7 20.42 34.42 0.99 1.90 18.79 2.83 0.00 -1 1 0 9 6 30.63 34.42 1.00 0.78 21.49 2.65 0.00 -1 1 0 9 5 40.84 34.42 0.98 3.88 23.63 2.40 0.04 -1 1 0 9 4 51.05 34.42 0.98 2.10 19.91 2.95 0.00 -1 1 0 9 3 61.26 34.42 0.94 3.20 22.43 2.66 0.00 -1 1 0 9 2 71.47 34.42 0.95 0.86 23.01 2.56 0.00 -1 1 0 9 1 81.68 34.42 0.96 -0.52 27.31 2.40 0.04 -1 1 0 9 0 91.89 34.42 0.95 1.97 23.15 2.75 0.00 -1 1 0 10 18 -91.89 44.25 1.00 3.96 24.36 2.67 0.00 -1 1 0 10 17 -81.68 44.25 1.00 2.32 25.39 2.47 0.00 -1 1 0 10 16 -71.47 44.25 1.01 1.80 19.19 2.95 0.00 -1 1 0 10 15 -61.26 44.25 1.00 2.25 18.34 2.85 0.00 -1 1 0 10 14 -51.05 44.25 0.99 4.80 22.42 2.65 0.00 -1 1 0 10 13 -40.84 44.25 1.02 -0.80 16.27 3.01 0.00 -1 1 0 10 12 -30.63 44.25 1.01 0.79 22.96 2.64 0.00 -1 1 0 10 11 -20.42 44.25 1.00 1.24 22.01 2.73 0.00 -1 1 0 10 10 -10.21 44.25 0.99 3.14 25.39 2.47 0.04 -1 1 0 10 9 0.00 44.25 0.97 5.67 21.98 2.65 0.00 -1 1 0 10 8 10.21 44.25 0.96 5.35 23.22 2.67 0.02 -1 1 0 10 7 20.42 44.25 0.99 -0.82 22.29 2.71 0.00 -1 1 0 10 6 30.63 44.25 0.95 5.61 21.18 2.67 0.00 -1 1 0 10 5 40.84 44.25 0.97 2.23 20.13 2.70 0.00 -1 1 0 10 4 51.05 44.25 0.95 1.44 24.43 2.70 0.00 -1 1 0 10 3 61.26 44.25 0.93 4.34 22.98 2.72 0.00 -1 1 0 10 2 71.47 44.25 0.95 2.44 23.97 2.77 0.00 -1 1 0 10 1 81.68 44.25 0.95 3.32 24.00 2.68 0.00 -1 1 0 10 0 91.89 44.25 0.94 3.13 17.71 2.88 0.00 -1 1 0 11 18 -91.89 54.08 1.00 2.17 27.47 2.19 0.07 -1 1 0 11 17 -81.68 54.08 1.00 2.43 16.38 2.72 0.00 -1 1 0 11 16 -71.47 54.08 0.99 3.87 19.87 2.78 0.00 -1 1 0 11 15 -61.26 54.08 1.06 -5.15 37.47 0.00 0.11 -1 1 0 11 14 -51.05 54.08 1.00 3.13 23.31 2.61 0.00 -1 1 0 11 13 -40.84 54.08 0.99 4.25 21.20 2.78 0.00 -1 1 0 11 12 -30.63 54.08 1.00 1.58 24.37 2.13 0.08 -1 1 0 11 11 -20.42 54.08 1.00 2.07 22.98 2.86 0.00 -1 1 0 11 10 -10.21 54.08 0.97 4.57 18.89 2.88 0.00 -1 1 0 11 9 0.00 54.08 1.00 1.55 27.46 2.48 0.00 -1 1 0 11 8 10.21 54.08 0.98 3.14 22.61 2.63 0.00 -1 1 0 11 7 20.42 54.08 0.95 3.81 16.63 2.72 0.00 -1 1 0 11 6 30.63 54.08 0.95 3.41 24.89 2.66 0.00 -1 1 0 11 5 40.84 54.08 0.94 2.12 24.16 2.35 0.05 -1 1 0 11 4 51.05 54.08 0.95 1.83 25.30 2.42 0.04 -1 1 0 11 3 61.26 54.08 0.95 1.71 23.72 2.65 0.00 -1 1 0 11 2 71.47 54.08 0.95 1.80 19.55 2.81 0.00 -1 1 0 11 1 81.68 54.08 0.93 4.14 24.07 2.46 0.05 -1 1 0 11 0 91.89 54.08 0.95 2.60 16.28 2.91 0.00 -1 1 1 0 18 -91.89 -54.08 1.00 2.17 27.47 2.19 0.07 -1 1 1 0 17 -81.68 -54.08 1.00 2.43 16.38 2.72 0.00 -1 1 1 0 16 -71.47 -54.08 0.99 3.87 19.87 2.78 0.00 -1 1 1 0 15 -61.26 -54.08 1.06 -5.15 37.47 0.00 0.11 -1 1 1 0 14 -51.05 -54.08 1.00 3.13 23.31 2.61 0.00 -1 1 1 0 13 -40.84 -54.08 0.99 4.25 21.20 2.78 0.00 -1 1 1 0 12 -30.63 -54.08 1.00 1.58 24.37 2.13 0.08 -1 1 1 0 11 -20.42 -54.08 1.00 2.07 22.98 2.86 0.00 -1 1 1 0 10 -10.21 -54.08 0.97 4.57 18.89 2.88 0.00 -1 1 1 0 9 0.00 -54.08 1.00 1.55 27.46 2.48 0.00 -1 1 1 0 8 10.21 -54.08 0.98 3.14 22.61 2.63 0.00 -1 1 1 0 7 20.42 -54.08 0.95 3.81 16.63 2.72 0.00 -1 1 1 0 6 30.63 -54.08 0.95 3.41 24.89 2.66 0.00 -1 1 1 0 5 40.84 -54.08 0.94 2.12 24.16 2.35 0.05 -1 1 1 0 4 51.05 -54.08 0.95 1.83 25.30 2.42 0.04 -1 1 1 0 3 61.26 -54.08 0.95 1.71 23.72 2.65 0.00 -1 1 1 0 2 71.47 -54.08 0.95 1.80 19.55 2.81 0.00 -1 1 1 0 1 81.68 -54.08 0.93 4.14 24.07 2.46 0.05 -1 1 1 0 0 91.89 -54.08 0.95 2.60 16.28 2.91 0.00 -1 1 1 1 18 -91.89 -44.25 1.00 3.96 24.36 2.67 0.00 -1 1 1 1 17 -81.68 -44.25 1.00 2.32 25.39 2.47 0.00 -1 1 1 1 16 -71.47 -44.25 1.01 1.80 19.19 2.95 0.00 -1 1 1 1 15 -61.26 -44.25 1.00 2.25 18.34 2.85 0.00 -1 1 1 1 14 -51.05 -44.25 0.99 4.80 22.42 2.65 0.00 -1 1 1 1 13 -40.84 -44.25 1.02 -0.80 16.27 3.01 0.00 -1 1 1 1 12 -30.63 -44.25 1.01 0.79 22.96 2.64 0.00 -1 1 1 1 11 -20.42 -44.25 1.00 1.24 22.01 2.73 0.00 -1 1 1 1 10 -10.21 -44.25 0.99 3.14 25.39 2.47 0.04 -1 1 1 1 9 0.00 -44.25 0.97 5.67 21.98 2.65 0.00 -1 1 1 1 8 10.21 -44.25 0.96 5.35 23.22 2.67 0.02 -1 1 1 1 7 20.42 -44.25 0.99 -0.82 22.29 2.71 0.00 -1 1 1 1 6 30.63 -44.25 0.95 5.61 21.18 2.67 0.00 -1 1 1 1 5 40.84 -44.25 0.97 2.23 20.13 2.70 0.00 -1 1 1 1 4 51.05 -44.25 0.95 1.44 24.43 2.70 0.00 -1 1 1 1 3 61.26 -44.25 0.93 4.34 22.98 2.72 0.00 -1 1 1 1 2 71.47 -44.25 0.95 2.44 23.97 2.77 0.00 -1 1 1 1 1 81.68 -44.25 0.95 3.32 24.00 2.68 0.00 -1 1 1 1 0 91.89 -44.25 0.94 3.13 17.71 2.88 0.00 -1 1 1 2 18 -91.89 -34.42 0.98 6.64 35.87 0.32 0.10 -1 1 1 2 17 -81.68 -34.42 1.00 3.27 22.93 2.72 0.00 -1 1 1 2 16 -71.47 -34.42 0.99 1.43 25.31 2.67 0.00 -1 1 1 2 15 -61.26 -34.42 1.00 1.98 21.92 2.72 0.00 -1 1 1 2 14 -51.05 -34.42 0.99 2.49 25.38 2.67 0.00 -1 1 1 2 13 -40.84 -34.42 1.00 2.67 20.17 2.59 0.04 -1 1 1 2 12 -30.63 -34.42 0.99 3.94 20.80 2.69 0.01 -1 1 1 2 11 -20.42 -34.42 1.00 1.79 23.08 2.64 0.00 -1 1 1 2 10 -10.21 -34.42 0.99 3.54 21.15 2.69 0.00 -1 1 1 2 9 0.00 -34.42 1.00 2.97 19.56 2.68 0.00 -1 1 1 2 8 10.21 -34.42 0.99 0.82 27.75 2.49 0.02 -1 1 1 2 7 20.42 -34.42 0.99 1.90 18.79 2.83 0.00 -1 1 1 2 6 30.63 -34.42 1.00 0.78 21.49 2.65 0.00 -1 1 1 2 5 40.84 -34.42 0.98 3.88 23.63 2.40 0.04 -1 1 1 2 4 51.05 -34.42 0.98 2.10 19.91 2.95 0.00 -1 1 1 2 3 61.26 -34.42 0.94 3.20 22.43 2.66 0.00 -1 1 1 2 2 71.47 -34.42 0.95 0.86 23.01 2.56 0.00 -1 1 1 2 1 81.68 -34.42 0.96 -0.52 27.31 2.40 0.04 -1 1 1 2 0 91.89 -34.42 0.95 1.97 23.15 2.75 0.00 -1 1 1 3 18 -91.89 -24.58 1.02 -0.68 27.00 2.76 0.00 -1 1 1 3 17 -81.68 -24.58 0.99 3.81 21.49 2.75 0.00 -1 1 1 3 16 -71.47 -24.58 1.01 1.51 14.78 3.04 0.00 -1 1 1 3 15 -61.26 -24.58 1.00 2.77 21.24 2.65 0.00 -1 1 1 3 14 -51.05 -24.58 0.98 4.55 26.29 2.26 0.08 -1 1 1 3 13 -40.84 -24.58 0.99 3.99 16.66 3.01 0.00 -1 1 1 3 12 -30.63 -24.58 1.00 2.71 22.63 2.78 0.00 -1 1 1 3 11 -20.42 -24.58 1.01 1.60 22.53 2.65 0.00 -1 1 1 3 10 -10.21 -24.58 1.00 2.54 21.92 2.61 0.00 -1 1 1 3 9 0.00 -24.58 0.98 4.18 19.75 2.89 0.00 -1 1 1 3 8 10.21 -24.58 0.99 5.25 26.22 2.31 0.05 -1 1 1 3 7 20.42 -24.58 1.02 1.31 26.61 2.68 0.00 -1 1 1 3 6 30.63 -24.58 1.01 4.77 25.72 2.59 0.00 -1 1 1 3 5 40.84 -24.58 1.02 2.53 22.06 2.74 0.00 -1 1 1 3 4 51.05 -24.58 1.02 1.18 22.70 2.60 0.02 -1 1 1 3 3 61.26 -24.58 1.03 -1.14 28.64 2.18 0.07 -1 1 1 3 2 71.47 -24.58 0.96 3.86 18.73 2.98 0.00 -1 1 1 3 1 81.68 -24.58 0.95 -1.23 25.46 2.70 0.00 -1 1 1 3 0 91.89 -24.58 0.92 4.73 18.40 2.71 0.00 -1 1 1 4 18 -91.89 -14.75 0.99 3.62 19.21 2.89 0.00 -1 1 1 4 17 -81.68 -14.75 1.00 1.70 25.76 2.58 0.03 -1 1 1 4 16 -71.47 -14.75 1.01 1.47 29.56 2.07 0.06 -1 1 1 4 15 -61.26 -14.75 1.00 2.12 19.68 2.88 0.00 -1 1 1 4 14 -51.05 -14.75 1.00 2.88 28.98 2.22 0.04 -1 1 1 4 13 -40.84 -14.75 1.02 -0.16 23.89 2.62 0.00 -1 1 1 4 12 -30.63 -14.75 1.00 3.10 25.43 2.53 0.00 -1 1 1 4 11 -20.42 -14.75 0.98 5.12 23.40 2.79 0.00 -1 1 1 4 10 -10.21 -14.75 1.01 2.53 24.41 2.76 0.00 -1 1 1 4 9 0.00 -14.75 1.01 2.76 22.34 2.77 0.03 -1 1 1 4 8 10.21 -14.75 1.00 4.37 23.43 2.96 0.00 -1 1 1 4 7 20.42 -14.75 1.03 1.41 20.35 2.84 0.00 -1 1 1 4 6 30.63 -14.75 1.03 2.30 19.85 2.89 0.00 -1 1 1 4 5 40.84 -14.75 1.06 0.17 26.75 2.30 0.08 -1 1 1 4 4 51.05 -14.75 1.05 3.29 16.88 3.21 0.00 -1 1 1 4 3 61.26 -14.75 1.07 0.87 26.14 2.16 0.11 -1 1 1 4 2 71.47 -14.75 1.06 2.16 17.18 3.45 0.06 -1 1 1 4 1 81.68 -14.75 1.02 2.63 23.16 3.76 0.05 -1 1 1 4 0 91.89 -14.75 0.93 3.35 15.87 3.21 0.00 -1 1 1 5 18 -91.89 -4.92 0.99 2.76 22.78 2.68 0.00 -1 1 1 5 17 -81.68 -4.92 1.00 2.38 24.10 2.49 0.03 -1 1 1 5 16 -71.47 -4.92 0.98 3.99 23.95 2.65 0.00 -1 1 1 5 15 -61.26 -4.92 0.99 3.74 25.25 2.23 0.05 -1 1 1 5 14 -51.05 -4.92 1.01 0.91 20.65 2.78 0.00 -1 1 1 5 13 -40.84 -4.92 0.99 3.65 22.16 2.65 0.00 -1 1 1 5 12 -30.63 -4.92 1.01 0.08 24.77 2.69 0.00 -1 1 1 5 11 -20.42 -4.92 1.01 0.74 18.36 2.85 0.00 -1 1 1 5 10 -10.21 -4.92 0.99 5.34 23.36 2.70 0.00 -1 1 1 5 9 0.00 -4.92 1.01 2.99 20.83 2.82 0.00 -1 1 1 5 8 10.21 -4.92 1.01 4.86 20.78 2.93 0.00 -1 1 1 5 7 20.42 -4.92 1.03 4.37 27.58 2.23 0.07 -1 1 1 5 6 30.63 -4.92 1.04 3.11 22.64 2.90 0.00 -1 1 1 5 5 40.84 -4.92 1.06 2.64 23.39 2.85 0.00 -1 1 1 5 4 51.05 -4.92 1.09 2.42 15.99 3.16 0.00 -1 1 1 5 3 61.26 -4.92 1.10 2.91 19.07 3.30 0.07 -1 1 1 5 2 71.47 -4.92 1.17 -0.86 26.47 2.09 0.15 -1 1 1 5 1 81.68 -4.92 1.22 1.14 31.73 1.85 0.19 -1 1 1 5 0 91.89 -4.92 1.21 1.22 27.15 3.88 0.42 -1 1 1 6 18 -91.89 4.92 0.99 2.76 22.78 2.68 0.00 -1 1 1 6 17 -81.68 4.92 1.00 2.38 24.10 2.49 0.03 -1 1 1 6 16 -71.47 4.92 0.98 3.99 23.95 2.65 0.00 -1 1 1 6 15 -61.26 4.92 0.99 3.74 25.25 2.23 0.05 -1 1 1 6 14 -51.05 4.92 1.01 0.91 20.65 2.78 0.00 -1 1 1 6 13 -40.84 4.92 0.99 3.65 22.16 2.65 0.00 -1 1 1 6 12 -30.63 4.92 1.01 0.08 24.77 2.69 0.00 -1 1 1 6 11 -20.42 4.92 1.01 0.74 18.36 2.85 0.00 -1 1 1 6 10 -10.21 4.92 0.99 5.34 23.36 2.70 0.00 -1 1 1 6 9 0.00 4.92 1.01 2.99 20.83 2.82 0.00 -1 1 1 6 8 10.21 4.92 1.01 4.86 20.78 2.93 0.00 -1 1 1 6 7 20.42 4.92 1.03 4.37 27.58 2.23 0.07 -1 1 1 6 6 30.63 4.92 1.04 3.11 22.64 2.90 0.00 -1 1 1 6 5 40.84 4.92 1.06 2.64 23.39 2.85 0.00 -1 1 1 6 4 51.05 4.92 1.09 2.42 15.99 3.16 0.00 -1 1 1 6 3 61.26 4.92 1.10 2.91 19.07 3.30 0.07 -1 1 1 6 2 71.47 4.92 1.17 -0.86 26.47 2.09 0.15 -1 1 1 6 1 81.68 4.92 1.22 1.14 31.73 1.85 0.19 -1 1 1 6 0 91.89 4.92 1.21 1.22 27.15 3.88 0.42 -1 1 1 7 18 -91.89 14.75 0.99 3.62 19.21 2.89 0.00 -1 1 1 7 17 -81.68 14.75 1.00 1.70 25.76 2.58 0.03 -1 1 1 7 16 -71.47 14.75 1.01 1.47 29.56 2.07 0.06 -1 1 1 7 15 -61.26 14.75 1.00 2.12 19.68 2.88 0.00 -1 1 1 7 14 -51.05 14.75 1.00 2.88 28.98 2.22 0.04 -1 1 1 7 13 -40.84 14.75 1.02 -0.16 23.89 2.62 0.00 -1 1 1 7 12 -30.63 14.75 1.00 3.10 25.43 2.53 0.00 -1 1 1 7 11 -20.42 14.75 0.98 5.12 23.40 2.79 0.00 -1 1 1 7 10 -10.21 14.75 1.01 2.53 24.41 2.76 0.00 -1 1 1 7 9 0.00 14.75 1.01 2.76 22.34 2.77 0.03 -1 1 1 7 8 10.21 14.75 1.00 4.37 23.43 2.96 0.00 -1 1 1 7 7 20.42 14.75 1.03 1.41 20.35 2.84 0.00 -1 1 1 7 6 30.63 14.75 1.03 2.30 19.85 2.89 0.00 -1 1 1 7 5 40.84 14.75 1.06 0.17 26.75 2.30 0.08 -1 1 1 7 4 51.05 14.75 1.05 3.29 16.88 3.21 0.00 -1 1 1 7 3 61.26 14.75 1.07 0.87 26.14 2.16 0.11 -1 1 1 7 2 71.47 14.75 1.06 2.16 17.18 3.45 0.06 -1 1 1 7 1 81.68 14.75 1.02 2.63 23.16 3.76 0.05 -1 1 1 7 0 91.89 14.75 0.93 3.35 15.87 3.21 0.00 -1 1 1 8 18 -91.89 24.58 1.02 -0.68 27.00 2.76 0.00 -1 1 1 8 17 -81.68 24.58 0.99 3.81 21.49 2.75 0.00 -1 1 1 8 16 -71.47 24.58 1.01 1.51 14.78 3.04 0.00 -1 1 1 8 15 -61.26 24.58 1.00 2.77 21.24 2.65 0.00 -1 1 1 8 14 -51.05 24.58 0.98 4.55 26.29 2.26 0.08 -1 1 1 8 13 -40.84 24.58 0.99 3.99 16.66 3.01 0.00 -1 1 1 8 12 -30.63 24.58 1.00 2.71 22.63 2.78 0.00 -1 1 1 8 11 -20.42 24.58 1.01 1.60 22.53 2.65 0.00 -1 1 1 8 10 -10.21 24.58 1.00 2.54 21.92 2.61 0.00 -1 1 1 8 9 0.00 24.58 0.98 4.18 19.75 2.89 0.00 -1 1 1 8 8 10.21 24.58 0.99 5.25 26.22 2.31 0.05 -1 1 1 8 7 20.42 24.58 1.02 1.31 26.61 2.68 0.00 -1 1 1 8 6 30.63 24.58 1.01 4.77 25.72 2.59 0.00 -1 1 1 8 5 40.84 24.58 1.02 2.53 22.06 2.74 0.00 -1 1 1 8 4 51.05 24.58 1.02 1.18 22.70 2.60 0.02 -1 1 1 8 3 61.26 24.58 1.03 -1.14 28.64 2.18 0.07 -1 1 1 8 2 71.47 24.58 0.96 3.86 18.73 2.98 0.00 -1 1 1 8 1 81.68 24.58 0.95 -1.23 25.46 2.70 0.00 -1 1 1 8 0 91.89 24.58 0.92 4.73 18.40 2.71 0.00 -1 1 1 9 18 -91.89 34.42 0.98 6.64 35.87 0.32 0.10 -1 1 1 9 17 -81.68 34.42 1.00 3.27 22.93 2.72 0.00 -1 1 1 9 16 -71.47 34.42 0.99 1.43 25.31 2.67 0.00 -1 1 1 9 15 -61.26 34.42 1.00 1.98 21.92 2.72 0.00 -1 1 1 9 14 -51.05 34.42 0.99 2.49 25.38 2.67 0.00 -1 1 1 9 13 -40.84 34.42 1.00 2.67 20.17 2.59 0.04 -1 1 1 9 12 -30.63 34.42 0.99 3.94 20.80 2.69 0.01 -1 1 1 9 11 -20.42 34.42 1.00 1.79 23.08 2.64 0.00 -1 1 1 9 10 -10.21 34.42 0.99 3.54 21.15 2.69 0.00 -1 1 1 9 9 0.00 34.42 1.00 2.97 19.56 2.68 0.00 -1 1 1 9 8 10.21 34.42 0.99 0.82 27.75 2.49 0.02 -1 1 1 9 7 20.42 34.42 0.99 1.90 18.79 2.83 0.00 -1 1 1 9 6 30.63 34.42 1.00 0.78 21.49 2.65 0.00 -1 1 1 9 5 40.84 34.42 0.98 3.88 23.63 2.40 0.04 -1 1 1 9 4 51.05 34.42 0.98 2.10 19.91 2.95 0.00 -1 1 1 9 3 61.26 34.42 0.94 3.20 22.43 2.66 0.00 -1 1 1 9 2 71.47 34.42 0.95 0.86 23.01 2.56 0.00 -1 1 1 9 1 81.68 34.42 0.96 -0.52 27.31 2.40 0.04 -1 1 1 9 0 91.89 34.42 0.95 1.97 23.15 2.75 0.00 -1 1 1 10 18 -91.89 44.25 1.00 3.96 24.36 2.67 0.00 -1 1 1 10 17 -81.68 44.25 1.00 2.32 25.39 2.47 0.00 -1 1 1 10 16 -71.47 44.25 1.01 1.80 19.19 2.95 0.00 -1 1 1 10 15 -61.26 44.25 1.00 2.25 18.34 2.85 0.00 -1 1 1 10 14 -51.05 44.25 0.99 4.80 22.42 2.65 0.00 -1 1 1 10 13 -40.84 44.25 1.02 -0.80 16.27 3.01 0.00 -1 1 1 10 12 -30.63 44.25 1.01 0.79 22.96 2.64 0.00 -1 1 1 10 11 -20.42 44.25 1.00 1.24 22.01 2.73 0.00 -1 1 1 10 10 -10.21 44.25 0.99 3.14 25.39 2.47 0.04 -1 1 1 10 9 0.00 44.25 0.97 5.67 21.98 2.65 0.00 -1 1 1 10 8 10.21 44.25 0.96 5.35 23.22 2.67 0.02 -1 1 1 10 7 20.42 44.25 0.99 -0.82 22.29 2.71 0.00 -1 1 1 10 6 30.63 44.25 0.95 5.61 21.18 2.67 0.00 -1 1 1 10 5 40.84 44.25 0.97 2.23 20.13 2.70 0.00 -1 1 1 10 4 51.05 44.25 0.95 1.44 24.43 2.70 0.00 -1 1 1 10 3 61.26 44.25 0.93 4.34 22.98 2.72 0.00 -1 1 1 10 2 71.47 44.25 0.95 2.44 23.97 2.77 0.00 -1 1 1 10 1 81.68 44.25 0.95 3.32 24.00 2.68 0.00 -1 1 1 10 0 91.89 44.25 0.94 3.13 17.71 2.88 0.00 -1 1 1 11 18 -91.89 54.08 1.00 2.17 27.47 2.19 0.07 -1 1 1 11 17 -81.68 54.08 1.00 2.43 16.38 2.72 0.00 -1 1 1 11 16 -71.47 54.08 0.99 3.87 19.87 2.78 0.00 -1 1 1 11 15 -61.26 54.08 1.06 -5.15 37.47 0.00 0.11 -1 1 1 11 14 -51.05 54.08 1.00 3.13 23.31 2.61 0.00 -1 1 1 11 13 -40.84 54.08 0.99 4.25 21.20 2.78 0.00 -1 1 1 11 12 -30.63 54.08 1.00 1.58 24.37 2.13 0.08 -1 1 1 11 11 -20.42 54.08 1.00 2.07 22.98 2.86 0.00 -1 1 1 11 10 -10.21 54.08 0.97 4.57 18.89 2.88 0.00 -1 1 1 11 9 0.00 54.08 1.00 1.55 27.46 2.48 0.00 -1 1 1 11 8 10.21 54.08 0.98 3.14 22.61 2.63 0.00 -1 1 1 11 7 20.42 54.08 0.95 3.81 16.63 2.72 0.00 -1 1 1 11 6 30.63 54.08 0.95 3.41 24.89 2.66 0.00 -1 1 1 11 5 40.84 54.08 0.94 2.12 24.16 2.35 0.05 -1 1 1 11 4 51.05 54.08 0.95 1.83 25.30 2.42 0.04 -1 1 1 11 3 61.26 54.08 0.95 1.71 23.72 2.65 0.00 -1 1 1 11 2 71.47 54.08 0.95 1.80 19.55 2.81 0.00 -1 1 1 11 1 81.68 54.08 0.93 4.14 24.07 2.46 0.05 -1 1 1 11 0 91.89 54.08 0.95 2.60 16.28 2.91 0.00 -1 2 0 0 18 -91.89 -54.08 1.00 2.17 27.47 2.19 0.07 -1 2 0 0 17 -81.68 -54.08 1.00 2.43 16.38 2.72 0.00 -1 2 0 0 16 -71.47 -54.08 0.99 3.87 19.87 2.78 0.00 -1 2 0 0 15 -61.26 -54.08 1.06 -5.15 37.47 0.00 0.11 -1 2 0 0 14 -51.05 -54.08 1.00 3.13 23.31 2.61 0.00 -1 2 0 0 13 -40.84 -54.08 0.99 4.25 21.20 2.78 0.00 -1 2 0 0 12 -30.63 -54.08 1.00 1.58 24.37 2.13 0.08 -1 2 0 0 11 -20.42 -54.08 1.00 2.07 22.98 2.86 0.00 -1 2 0 0 10 -10.21 -54.08 0.97 4.57 18.89 2.88 0.00 -1 2 0 0 9 0.00 -54.08 1.00 1.55 27.46 2.48 0.00 -1 2 0 0 8 10.21 -54.08 0.98 3.14 22.61 2.63 0.00 -1 2 0 0 7 20.42 -54.08 0.95 3.81 16.63 2.72 0.00 -1 2 0 0 6 30.63 -54.08 0.95 3.41 24.89 2.66 0.00 -1 2 0 0 5 40.84 -54.08 0.94 2.12 24.16 2.35 0.05 -1 2 0 0 4 51.05 -54.08 0.95 1.83 25.30 2.42 0.04 -1 2 0 0 3 61.26 -54.08 0.95 1.71 23.72 2.65 0.00 -1 2 0 0 2 71.47 -54.08 0.95 1.80 19.55 2.81 0.00 -1 2 0 0 1 81.68 -54.08 0.93 4.14 24.07 2.46 0.05 -1 2 0 0 0 91.89 -54.08 0.95 2.60 16.28 2.91 0.00 -1 2 0 1 18 -91.89 -44.25 1.00 3.96 24.36 2.67 0.00 -1 2 0 1 17 -81.68 -44.25 1.00 2.32 25.39 2.47 0.00 -1 2 0 1 16 -71.47 -44.25 1.01 1.80 19.19 2.95 0.00 -1 2 0 1 15 -61.26 -44.25 1.00 2.25 18.34 2.85 0.00 -1 2 0 1 14 -51.05 -44.25 0.99 4.80 22.42 2.65 0.00 -1 2 0 1 13 -40.84 -44.25 1.02 -0.80 16.27 3.01 0.00 -1 2 0 1 12 -30.63 -44.25 1.01 0.79 22.96 2.64 0.00 -1 2 0 1 11 -20.42 -44.25 1.00 1.24 22.01 2.73 0.00 -1 2 0 1 10 -10.21 -44.25 0.99 3.14 25.39 2.47 0.04 -1 2 0 1 9 0.00 -44.25 0.97 5.67 21.98 2.65 0.00 -1 2 0 1 8 10.21 -44.25 0.96 5.35 23.22 2.67 0.02 -1 2 0 1 7 20.42 -44.25 0.99 -0.82 22.29 2.71 0.00 -1 2 0 1 6 30.63 -44.25 0.95 5.61 21.18 2.67 0.00 -1 2 0 1 5 40.84 -44.25 0.97 2.23 20.13 2.70 0.00 -1 2 0 1 4 51.05 -44.25 0.95 1.44 24.43 2.70 0.00 -1 2 0 1 3 61.26 -44.25 0.93 4.34 22.98 2.72 0.00 -1 2 0 1 2 71.47 -44.25 0.95 2.44 23.97 2.77 0.00 -1 2 0 1 1 81.68 -44.25 0.95 3.32 24.00 2.68 0.00 -1 2 0 1 0 91.89 -44.25 0.94 3.13 17.71 2.88 0.00 -1 2 0 2 18 -91.89 -34.42 0.98 6.64 35.87 0.32 0.10 -1 2 0 2 17 -81.68 -34.42 1.00 3.27 22.93 2.72 0.00 -1 2 0 2 16 -71.47 -34.42 0.99 1.43 25.31 2.67 0.00 -1 2 0 2 15 -61.26 -34.42 1.00 1.98 21.92 2.72 0.00 -1 2 0 2 14 -51.05 -34.42 0.99 2.49 25.38 2.67 0.00 -1 2 0 2 13 -40.84 -34.42 1.00 2.67 20.17 2.59 0.04 -1 2 0 2 12 -30.63 -34.42 0.99 3.94 20.80 2.69 0.01 -1 2 0 2 11 -20.42 -34.42 1.00 1.79 23.08 2.64 0.00 -1 2 0 2 10 -10.21 -34.42 0.99 3.54 21.15 2.69 0.00 -1 2 0 2 9 0.00 -34.42 1.00 2.97 19.56 2.68 0.00 -1 2 0 2 8 10.21 -34.42 0.99 0.82 27.75 2.49 0.02 -1 2 0 2 7 20.42 -34.42 0.99 1.90 18.79 2.83 0.00 -1 2 0 2 6 30.63 -34.42 1.00 0.78 21.49 2.65 0.00 -1 2 0 2 5 40.84 -34.42 0.98 3.88 23.63 2.40 0.04 -1 2 0 2 4 51.05 -34.42 0.98 2.10 19.91 2.95 0.00 -1 2 0 2 3 61.26 -34.42 0.94 3.20 22.43 2.66 0.00 -1 2 0 2 2 71.47 -34.42 0.95 0.86 23.01 2.56 0.00 -1 2 0 2 1 81.68 -34.42 0.96 -0.52 27.31 2.40 0.04 -1 2 0 2 0 91.89 -34.42 0.95 1.97 23.15 2.75 0.00 -1 2 0 3 18 -91.89 -24.58 1.02 -0.68 27.00 2.76 0.00 -1 2 0 3 17 -81.68 -24.58 0.99 3.81 21.49 2.75 0.00 -1 2 0 3 16 -71.47 -24.58 1.01 1.51 14.78 3.04 0.00 -1 2 0 3 15 -61.26 -24.58 1.00 2.77 21.24 2.65 0.00 -1 2 0 3 14 -51.05 -24.58 0.98 4.55 26.29 2.26 0.08 -1 2 0 3 13 -40.84 -24.58 0.99 3.99 16.66 3.01 0.00 -1 2 0 3 12 -30.63 -24.58 1.00 2.71 22.63 2.78 0.00 -1 2 0 3 11 -20.42 -24.58 1.01 1.60 22.53 2.65 0.00 -1 2 0 3 10 -10.21 -24.58 1.00 2.54 21.92 2.61 0.00 -1 2 0 3 9 0.00 -24.58 0.98 4.18 19.75 2.89 0.00 -1 2 0 3 8 10.21 -24.58 0.99 5.25 26.22 2.31 0.05 -1 2 0 3 7 20.42 -24.58 1.02 1.31 26.61 2.68 0.00 -1 2 0 3 6 30.63 -24.58 1.01 4.77 25.72 2.59 0.00 -1 2 0 3 5 40.84 -24.58 1.02 2.53 22.06 2.74 0.00 -1 2 0 3 4 51.05 -24.58 1.02 1.18 22.70 2.60 0.02 -1 2 0 3 3 61.26 -24.58 1.03 -1.14 28.64 2.18 0.07 -1 2 0 3 2 71.47 -24.58 0.96 3.86 18.73 2.98 0.00 -1 2 0 3 1 81.68 -24.58 0.95 -1.23 25.46 2.70 0.00 -1 2 0 3 0 91.89 -24.58 0.92 4.73 18.40 2.71 0.00 -1 2 0 4 18 -91.89 -14.75 0.99 3.62 19.21 2.89 0.00 -1 2 0 4 17 -81.68 -14.75 1.00 1.70 25.76 2.58 0.03 -1 2 0 4 16 -71.47 -14.75 1.01 1.47 29.56 2.07 0.06 -1 2 0 4 15 -61.26 -14.75 1.00 2.12 19.68 2.88 0.00 -1 2 0 4 14 -51.05 -14.75 1.00 2.88 28.98 2.22 0.04 -1 2 0 4 13 -40.84 -14.75 1.02 -0.16 23.89 2.62 0.00 -1 2 0 4 12 -30.63 -14.75 1.00 3.10 25.43 2.53 0.00 -1 2 0 4 11 -20.42 -14.75 0.98 5.12 23.40 2.79 0.00 -1 2 0 4 10 -10.21 -14.75 1.01 2.53 24.41 2.76 0.00 -1 2 0 4 9 0.00 -14.75 1.01 2.76 22.34 2.77 0.03 -1 2 0 4 8 10.21 -14.75 1.00 4.37 23.43 2.96 0.00 -1 2 0 4 7 20.42 -14.75 1.03 1.41 20.35 2.84 0.00 -1 2 0 4 6 30.63 -14.75 1.03 2.30 19.85 2.89 0.00 -1 2 0 4 5 40.84 -14.75 1.06 0.17 26.75 2.30 0.08 -1 2 0 4 4 51.05 -14.75 1.05 3.29 16.88 3.21 0.00 -1 2 0 4 3 61.26 -14.75 1.07 0.87 26.14 2.16 0.11 -1 2 0 4 2 71.47 -14.75 1.06 2.16 17.18 3.45 0.06 -1 2 0 4 1 81.68 -14.75 1.02 2.63 23.16 3.76 0.05 -1 2 0 4 0 91.89 -14.75 0.93 3.35 15.87 3.21 0.00 -1 2 0 5 18 -91.89 -4.92 0.99 2.76 22.78 2.68 0.00 -1 2 0 5 17 -81.68 -4.92 1.00 2.38 24.10 2.49 0.03 -1 2 0 5 16 -71.47 -4.92 0.98 3.99 23.95 2.65 0.00 -1 2 0 5 15 -61.26 -4.92 0.99 3.74 25.25 2.23 0.05 -1 2 0 5 14 -51.05 -4.92 1.01 0.91 20.65 2.78 0.00 -1 2 0 5 13 -40.84 -4.92 0.99 3.65 22.16 2.65 0.00 -1 2 0 5 12 -30.63 -4.92 1.01 0.08 24.77 2.69 0.00 -1 2 0 5 11 -20.42 -4.92 1.01 0.74 18.36 2.85 0.00 -1 2 0 5 10 -10.21 -4.92 0.99 5.34 23.36 2.70 0.00 -1 2 0 5 9 0.00 -4.92 1.01 2.99 20.83 2.82 0.00 -1 2 0 5 8 10.21 -4.92 1.01 4.86 20.78 2.93 0.00 -1 2 0 5 7 20.42 -4.92 1.03 4.37 27.58 2.23 0.07 -1 2 0 5 6 30.63 -4.92 1.04 3.11 22.64 2.90 0.00 -1 2 0 5 5 40.84 -4.92 1.06 2.64 23.39 2.85 0.00 -1 2 0 5 4 51.05 -4.92 1.09 2.42 15.99 3.16 0.00 -1 2 0 5 3 61.26 -4.92 1.10 2.91 19.07 3.30 0.07 -1 2 0 5 2 71.47 -4.92 1.17 -0.86 26.47 2.09 0.15 -1 2 0 5 1 81.68 -4.92 1.22 1.14 31.73 1.85 0.19 -1 2 0 5 0 91.89 -4.92 1.21 1.22 27.15 3.88 0.42 -1 2 0 6 18 -91.89 4.92 0.99 2.76 22.78 2.68 0.00 -1 2 0 6 17 -81.68 4.92 1.00 2.38 24.10 2.49 0.03 -1 2 0 6 16 -71.47 4.92 0.98 3.99 23.95 2.65 0.00 -1 2 0 6 15 -61.26 4.92 0.99 3.74 25.25 2.23 0.05 -1 2 0 6 14 -51.05 4.92 1.01 0.91 20.65 2.78 0.00 -1 2 0 6 13 -40.84 4.92 0.99 3.65 22.16 2.65 0.00 -1 2 0 6 12 -30.63 4.92 1.01 0.08 24.77 2.69 0.00 -1 2 0 6 11 -20.42 4.92 1.01 0.74 18.36 2.85 0.00 -1 2 0 6 10 -10.21 4.92 0.99 5.34 23.36 2.70 0.00 -1 2 0 6 9 0.00 4.92 1.01 2.99 20.83 2.82 0.00 -1 2 0 6 8 10.21 4.92 1.01 4.86 20.78 2.93 0.00 -1 2 0 6 7 20.42 4.92 1.03 4.37 27.58 2.23 0.07 -1 2 0 6 6 30.63 4.92 1.04 3.11 22.64 2.90 0.00 -1 2 0 6 5 40.84 4.92 1.06 2.64 23.39 2.85 0.00 -1 2 0 6 4 51.05 4.92 1.09 2.42 15.99 3.16 0.00 -1 2 0 6 3 61.26 4.92 1.10 2.91 19.07 3.30 0.07 -1 2 0 6 2 71.47 4.92 1.17 -0.86 26.47 2.09 0.15 -1 2 0 6 1 81.68 4.92 1.22 1.14 31.73 1.85 0.19 -1 2 0 6 0 91.89 4.92 1.21 1.22 27.15 3.88 0.42 -1 2 0 7 18 -91.89 14.75 0.99 3.62 19.21 2.89 0.00 -1 2 0 7 17 -81.68 14.75 1.00 1.70 25.76 2.58 0.03 -1 2 0 7 16 -71.47 14.75 1.01 1.47 29.56 2.07 0.06 -1 2 0 7 15 -61.26 14.75 1.00 2.12 19.68 2.88 0.00 -1 2 0 7 14 -51.05 14.75 1.00 2.88 28.98 2.22 0.04 -1 2 0 7 13 -40.84 14.75 1.02 -0.16 23.89 2.62 0.00 -1 2 0 7 12 -30.63 14.75 1.00 3.10 25.43 2.53 0.00 -1 2 0 7 11 -20.42 14.75 0.98 5.12 23.40 2.79 0.00 -1 2 0 7 10 -10.21 14.75 1.01 2.53 24.41 2.76 0.00 -1 2 0 7 9 0.00 14.75 1.01 2.76 22.34 2.77 0.03 -1 2 0 7 8 10.21 14.75 1.00 4.37 23.43 2.96 0.00 -1 2 0 7 7 20.42 14.75 1.03 1.41 20.35 2.84 0.00 -1 2 0 7 6 30.63 14.75 1.03 2.30 19.85 2.89 0.00 -1 2 0 7 5 40.84 14.75 1.06 0.17 26.75 2.30 0.08 -1 2 0 7 4 51.05 14.75 1.05 3.29 16.88 3.21 0.00 -1 2 0 7 3 61.26 14.75 1.07 0.87 26.14 2.16 0.11 -1 2 0 7 2 71.47 14.75 1.06 2.16 17.18 3.45 0.06 -1 2 0 7 1 81.68 14.75 1.02 2.63 23.16 3.76 0.05 -1 2 0 7 0 91.89 14.75 0.93 3.35 15.87 3.21 0.00 -1 2 0 8 18 -91.89 24.58 1.02 -0.68 27.00 2.76 0.00 -1 2 0 8 17 -81.68 24.58 0.99 3.81 21.49 2.75 0.00 -1 2 0 8 16 -71.47 24.58 1.01 1.51 14.78 3.04 0.00 -1 2 0 8 15 -61.26 24.58 1.00 2.77 21.24 2.65 0.00 -1 2 0 8 14 -51.05 24.58 0.98 4.55 26.29 2.26 0.08 -1 2 0 8 13 -40.84 24.58 0.99 3.99 16.66 3.01 0.00 -1 2 0 8 12 -30.63 24.58 1.00 2.71 22.63 2.78 0.00 -1 2 0 8 11 -20.42 24.58 1.01 1.60 22.53 2.65 0.00 -1 2 0 8 10 -10.21 24.58 1.00 2.54 21.92 2.61 0.00 -1 2 0 8 9 0.00 24.58 0.98 4.18 19.75 2.89 0.00 -1 2 0 8 8 10.21 24.58 0.99 5.25 26.22 2.31 0.05 -1 2 0 8 7 20.42 24.58 1.02 1.31 26.61 2.68 0.00 -1 2 0 8 6 30.63 24.58 1.01 4.77 25.72 2.59 0.00 -1 2 0 8 5 40.84 24.58 1.02 2.53 22.06 2.74 0.00 -1 2 0 8 4 51.05 24.58 1.02 1.18 22.70 2.60 0.02 -1 2 0 8 3 61.26 24.58 1.03 -1.14 28.64 2.18 0.07 -1 2 0 8 2 71.47 24.58 0.96 3.86 18.73 2.98 0.00 -1 2 0 8 1 81.68 24.58 0.95 -1.23 25.46 2.70 0.00 -1 2 0 8 0 91.89 24.58 0.92 4.73 18.40 2.71 0.00 -1 2 0 9 18 -91.89 34.42 0.98 6.64 35.87 0.32 0.10 -1 2 0 9 17 -81.68 34.42 1.00 3.27 22.93 2.72 0.00 -1 2 0 9 16 -71.47 34.42 0.99 1.43 25.31 2.67 0.00 -1 2 0 9 15 -61.26 34.42 1.00 1.98 21.92 2.72 0.00 -1 2 0 9 14 -51.05 34.42 0.99 2.49 25.38 2.67 0.00 -1 2 0 9 13 -40.84 34.42 1.00 2.67 20.17 2.59 0.04 -1 2 0 9 12 -30.63 34.42 0.99 3.94 20.80 2.69 0.01 -1 2 0 9 11 -20.42 34.42 1.00 1.79 23.08 2.64 0.00 -1 2 0 9 10 -10.21 34.42 0.99 3.54 21.15 2.69 0.00 -1 2 0 9 9 0.00 34.42 1.00 2.97 19.56 2.68 0.00 -1 2 0 9 8 10.21 34.42 0.99 0.82 27.75 2.49 0.02 -1 2 0 9 7 20.42 34.42 0.99 1.90 18.79 2.83 0.00 -1 2 0 9 6 30.63 34.42 1.00 0.78 21.49 2.65 0.00 -1 2 0 9 5 40.84 34.42 0.98 3.88 23.63 2.40 0.04 -1 2 0 9 4 51.05 34.42 0.98 2.10 19.91 2.95 0.00 -1 2 0 9 3 61.26 34.42 0.94 3.20 22.43 2.66 0.00 -1 2 0 9 2 71.47 34.42 0.95 0.86 23.01 2.56 0.00 -1 2 0 9 1 81.68 34.42 0.96 -0.52 27.31 2.40 0.04 -1 2 0 9 0 91.89 34.42 0.95 1.97 23.15 2.75 0.00 -1 2 0 10 18 -91.89 44.25 1.00 3.96 24.36 2.67 0.00 -1 2 0 10 17 -81.68 44.25 1.00 2.32 25.39 2.47 0.00 -1 2 0 10 16 -71.47 44.25 1.01 1.80 19.19 2.95 0.00 -1 2 0 10 15 -61.26 44.25 1.00 2.25 18.34 2.85 0.00 -1 2 0 10 14 -51.05 44.25 0.99 4.80 22.42 2.65 0.00 -1 2 0 10 13 -40.84 44.25 1.02 -0.80 16.27 3.01 0.00 -1 2 0 10 12 -30.63 44.25 1.01 0.79 22.96 2.64 0.00 -1 2 0 10 11 -20.42 44.25 1.00 1.24 22.01 2.73 0.00 -1 2 0 10 10 -10.21 44.25 0.99 3.14 25.39 2.47 0.04 -1 2 0 10 9 0.00 44.25 0.97 5.67 21.98 2.65 0.00 -1 2 0 10 8 10.21 44.25 0.96 5.35 23.22 2.67 0.02 -1 2 0 10 7 20.42 44.25 0.99 -0.82 22.29 2.71 0.00 -1 2 0 10 6 30.63 44.25 0.95 5.61 21.18 2.67 0.00 -1 2 0 10 5 40.84 44.25 0.97 2.23 20.13 2.70 0.00 -1 2 0 10 4 51.05 44.25 0.95 1.44 24.43 2.70 0.00 -1 2 0 10 3 61.26 44.25 0.93 4.34 22.98 2.72 0.00 -1 2 0 10 2 71.47 44.25 0.95 2.44 23.97 2.77 0.00 -1 2 0 10 1 81.68 44.25 0.95 3.32 24.00 2.68 0.00 -1 2 0 10 0 91.89 44.25 0.94 3.13 17.71 2.88 0.00 -1 2 0 11 18 -91.89 54.08 1.00 2.17 27.47 2.19 0.07 -1 2 0 11 17 -81.68 54.08 1.00 2.43 16.38 2.72 0.00 -1 2 0 11 16 -71.47 54.08 0.99 3.87 19.87 2.78 0.00 -1 2 0 11 15 -61.26 54.08 1.06 -5.15 37.47 0.00 0.11 -1 2 0 11 14 -51.05 54.08 1.00 3.13 23.31 2.61 0.00 -1 2 0 11 13 -40.84 54.08 0.99 4.25 21.20 2.78 0.00 -1 2 0 11 12 -30.63 54.08 1.00 1.58 24.37 2.13 0.08 -1 2 0 11 11 -20.42 54.08 1.00 2.07 22.98 2.86 0.00 -1 2 0 11 10 -10.21 54.08 0.97 4.57 18.89 2.88 0.00 -1 2 0 11 9 0.00 54.08 1.00 1.55 27.46 2.48 0.00 -1 2 0 11 8 10.21 54.08 0.98 3.14 22.61 2.63 0.00 -1 2 0 11 7 20.42 54.08 0.95 3.81 16.63 2.72 0.00 -1 2 0 11 6 30.63 54.08 0.95 3.41 24.89 2.66 0.00 -1 2 0 11 5 40.84 54.08 0.94 2.12 24.16 2.35 0.05 -1 2 0 11 4 51.05 54.08 0.95 1.83 25.30 2.42 0.04 -1 2 0 11 3 61.26 54.08 0.95 1.71 23.72 2.65 0.00 -1 2 0 11 2 71.47 54.08 0.95 1.80 19.55 2.81 0.00 -1 2 0 11 1 81.68 54.08 0.93 4.14 24.07 2.46 0.05 -1 2 0 11 0 91.89 54.08 0.95 2.60 16.28 2.91 0.00 -1 2 1 0 18 -91.89 -54.08 1.00 2.17 27.47 2.19 0.07 -1 2 1 0 17 -81.68 -54.08 1.00 2.43 16.38 2.72 0.00 -1 2 1 0 16 -71.47 -54.08 0.99 3.87 19.87 2.78 0.00 -1 2 1 0 15 -61.26 -54.08 1.06 -5.15 37.47 0.00 0.11 -1 2 1 0 14 -51.05 -54.08 1.00 3.13 23.31 2.61 0.00 -1 2 1 0 13 -40.84 -54.08 0.99 4.25 21.20 2.78 0.00 -1 2 1 0 12 -30.63 -54.08 1.00 1.58 24.37 2.13 0.08 -1 2 1 0 11 -20.42 -54.08 1.00 2.07 22.98 2.86 0.00 -1 2 1 0 10 -10.21 -54.08 0.97 4.57 18.89 2.88 0.00 -1 2 1 0 9 0.00 -54.08 1.00 1.55 27.46 2.48 0.00 -1 2 1 0 8 10.21 -54.08 0.98 3.14 22.61 2.63 0.00 -1 2 1 0 7 20.42 -54.08 0.95 3.81 16.63 2.72 0.00 -1 2 1 0 6 30.63 -54.08 0.95 3.41 24.89 2.66 0.00 -1 2 1 0 5 40.84 -54.08 0.94 2.12 24.16 2.35 0.05 -1 2 1 0 4 51.05 -54.08 0.95 1.83 25.30 2.42 0.04 -1 2 1 0 3 61.26 -54.08 0.95 1.71 23.72 2.65 0.00 -1 2 1 0 2 71.47 -54.08 0.95 1.80 19.55 2.81 0.00 -1 2 1 0 1 81.68 -54.08 0.93 4.14 24.07 2.46 0.05 -1 2 1 0 0 91.89 -54.08 0.95 2.60 16.28 2.91 0.00 -1 2 1 1 18 -91.89 -44.25 1.00 3.96 24.36 2.67 0.00 -1 2 1 1 17 -81.68 -44.25 1.00 2.32 25.39 2.47 0.00 -1 2 1 1 16 -71.47 -44.25 1.01 1.80 19.19 2.95 0.00 -1 2 1 1 15 -61.26 -44.25 1.00 2.25 18.34 2.85 0.00 -1 2 1 1 14 -51.05 -44.25 0.99 4.80 22.42 2.65 0.00 -1 2 1 1 13 -40.84 -44.25 1.02 -0.80 16.27 3.01 0.00 -1 2 1 1 12 -30.63 -44.25 1.01 0.79 22.96 2.64 0.00 -1 2 1 1 11 -20.42 -44.25 1.00 1.24 22.01 2.73 0.00 -1 2 1 1 10 -10.21 -44.25 0.99 3.14 25.39 2.47 0.04 -1 2 1 1 9 0.00 -44.25 0.97 5.67 21.98 2.65 0.00 -1 2 1 1 8 10.21 -44.25 0.96 5.35 23.22 2.67 0.02 -1 2 1 1 7 20.42 -44.25 0.99 -0.82 22.29 2.71 0.00 -1 2 1 1 6 30.63 -44.25 0.95 5.61 21.18 2.67 0.00 -1 2 1 1 5 40.84 -44.25 0.97 2.23 20.13 2.70 0.00 -1 2 1 1 4 51.05 -44.25 0.95 1.44 24.43 2.70 0.00 -1 2 1 1 3 61.26 -44.25 0.93 4.34 22.98 2.72 0.00 -1 2 1 1 2 71.47 -44.25 0.95 2.44 23.97 2.77 0.00 -1 2 1 1 1 81.68 -44.25 0.95 3.32 24.00 2.68 0.00 -1 2 1 1 0 91.89 -44.25 0.94 3.13 17.71 2.88 0.00 -1 2 1 2 18 -91.89 -34.42 0.98 6.64 35.87 0.32 0.10 -1 2 1 2 17 -81.68 -34.42 1.00 3.27 22.93 2.72 0.00 -1 2 1 2 16 -71.47 -34.42 0.99 1.43 25.31 2.67 0.00 -1 2 1 2 15 -61.26 -34.42 1.00 1.98 21.92 2.72 0.00 -1 2 1 2 14 -51.05 -34.42 0.99 2.49 25.38 2.67 0.00 -1 2 1 2 13 -40.84 -34.42 1.00 2.67 20.17 2.59 0.04 -1 2 1 2 12 -30.63 -34.42 0.99 3.94 20.80 2.69 0.01 -1 2 1 2 11 -20.42 -34.42 1.00 1.79 23.08 2.64 0.00 -1 2 1 2 10 -10.21 -34.42 0.99 3.54 21.15 2.69 0.00 -1 2 1 2 9 0.00 -34.42 1.00 2.97 19.56 2.68 0.00 -1 2 1 2 8 10.21 -34.42 0.99 0.82 27.75 2.49 0.02 -1 2 1 2 7 20.42 -34.42 0.99 1.90 18.79 2.83 0.00 -1 2 1 2 6 30.63 -34.42 1.00 0.78 21.49 2.65 0.00 -1 2 1 2 5 40.84 -34.42 0.98 3.88 23.63 2.40 0.04 -1 2 1 2 4 51.05 -34.42 0.98 2.10 19.91 2.95 0.00 -1 2 1 2 3 61.26 -34.42 0.94 3.20 22.43 2.66 0.00 -1 2 1 2 2 71.47 -34.42 0.95 0.86 23.01 2.56 0.00 -1 2 1 2 1 81.68 -34.42 0.96 -0.52 27.31 2.40 0.04 -1 2 1 2 0 91.89 -34.42 0.95 1.97 23.15 2.75 0.00 -1 2 1 3 18 -91.89 -24.58 1.02 -0.68 27.00 2.76 0.00 -1 2 1 3 17 -81.68 -24.58 0.99 3.81 21.49 2.75 0.00 -1 2 1 3 16 -71.47 -24.58 1.01 1.51 14.78 3.04 0.00 -1 2 1 3 15 -61.26 -24.58 1.00 2.77 21.24 2.65 0.00 -1 2 1 3 14 -51.05 -24.58 0.98 4.55 26.29 2.26 0.08 -1 2 1 3 13 -40.84 -24.58 0.99 3.99 16.66 3.01 0.00 -1 2 1 3 12 -30.63 -24.58 1.00 2.71 22.63 2.78 0.00 -1 2 1 3 11 -20.42 -24.58 1.01 1.60 22.53 2.65 0.00 -1 2 1 3 10 -10.21 -24.58 1.00 2.54 21.92 2.61 0.00 -1 2 1 3 9 0.00 -24.58 0.98 4.18 19.75 2.89 0.00 -1 2 1 3 8 10.21 -24.58 0.99 5.25 26.22 2.31 0.05 -1 2 1 3 7 20.42 -24.58 1.02 1.31 26.61 2.68 0.00 -1 2 1 3 6 30.63 -24.58 1.01 4.77 25.72 2.59 0.00 -1 2 1 3 5 40.84 -24.58 1.02 2.53 22.06 2.74 0.00 -1 2 1 3 4 51.05 -24.58 1.02 1.18 22.70 2.60 0.02 -1 2 1 3 3 61.26 -24.58 1.03 -1.14 28.64 2.18 0.07 -1 2 1 3 2 71.47 -24.58 0.96 3.86 18.73 2.98 0.00 -1 2 1 3 1 81.68 -24.58 0.95 -1.23 25.46 2.70 0.00 -1 2 1 3 0 91.89 -24.58 0.92 4.73 18.40 2.71 0.00 -1 2 1 4 18 -91.89 -14.75 0.99 3.62 19.21 2.89 0.00 -1 2 1 4 17 -81.68 -14.75 1.00 1.70 25.76 2.58 0.03 -1 2 1 4 16 -71.47 -14.75 1.01 1.47 29.56 2.07 0.06 -1 2 1 4 15 -61.26 -14.75 1.00 2.12 19.68 2.88 0.00 -1 2 1 4 14 -51.05 -14.75 1.00 2.88 28.98 2.22 0.04 -1 2 1 4 13 -40.84 -14.75 1.02 -0.16 23.89 2.62 0.00 -1 2 1 4 12 -30.63 -14.75 1.00 3.10 25.43 2.53 0.00 -1 2 1 4 11 -20.42 -14.75 0.98 5.12 23.40 2.79 0.00 -1 2 1 4 10 -10.21 -14.75 1.01 2.53 24.41 2.76 0.00 -1 2 1 4 9 0.00 -14.75 1.01 2.76 22.34 2.77 0.03 -1 2 1 4 8 10.21 -14.75 1.00 4.37 23.43 2.96 0.00 -1 2 1 4 7 20.42 -14.75 1.03 1.41 20.35 2.84 0.00 -1 2 1 4 6 30.63 -14.75 1.03 2.30 19.85 2.89 0.00 -1 2 1 4 5 40.84 -14.75 1.06 0.17 26.75 2.30 0.08 -1 2 1 4 4 51.05 -14.75 1.05 3.29 16.88 3.21 0.00 -1 2 1 4 3 61.26 -14.75 1.07 0.87 26.14 2.16 0.11 -1 2 1 4 2 71.47 -14.75 1.06 2.16 17.18 3.45 0.06 -1 2 1 4 1 81.68 -14.75 1.02 2.63 23.16 3.76 0.05 -1 2 1 4 0 91.89 -14.75 0.93 3.35 15.87 3.21 0.00 -1 2 1 5 18 -91.89 -4.92 0.99 2.76 22.78 2.68 0.00 -1 2 1 5 17 -81.68 -4.92 1.00 2.38 24.10 2.49 0.03 -1 2 1 5 16 -71.47 -4.92 0.98 3.99 23.95 2.65 0.00 -1 2 1 5 15 -61.26 -4.92 0.99 3.74 25.25 2.23 0.05 -1 2 1 5 14 -51.05 -4.92 1.01 0.91 20.65 2.78 0.00 -1 2 1 5 13 -40.84 -4.92 0.99 3.65 22.16 2.65 0.00 -1 2 1 5 12 -30.63 -4.92 1.01 0.08 24.77 2.69 0.00 -1 2 1 5 11 -20.42 -4.92 1.01 0.74 18.36 2.85 0.00 -1 2 1 5 10 -10.21 -4.92 0.99 5.34 23.36 2.70 0.00 -1 2 1 5 9 0.00 -4.92 1.01 2.99 20.83 2.82 0.00 -1 2 1 5 8 10.21 -4.92 1.01 4.86 20.78 2.93 0.00 -1 2 1 5 7 20.42 -4.92 1.03 4.37 27.58 2.23 0.07 -1 2 1 5 6 30.63 -4.92 1.04 3.11 22.64 2.90 0.00 -1 2 1 5 5 40.84 -4.92 1.06 2.64 23.39 2.85 0.00 -1 2 1 5 4 51.05 -4.92 1.09 2.42 15.99 3.16 0.00 -1 2 1 5 3 61.26 -4.92 1.10 2.91 19.07 3.30 0.07 -1 2 1 5 2 71.47 -4.92 1.17 -0.86 26.47 2.09 0.15 -1 2 1 5 1 81.68 -4.92 1.22 1.14 31.73 1.85 0.19 -1 2 1 5 0 91.89 -4.92 1.21 1.22 27.15 3.88 0.42 -1 2 1 6 18 -91.89 4.92 0.99 2.76 22.78 2.68 0.00 -1 2 1 6 17 -81.68 4.92 1.00 2.38 24.10 2.49 0.03 -1 2 1 6 16 -71.47 4.92 0.98 3.99 23.95 2.65 0.00 -1 2 1 6 15 -61.26 4.92 0.99 3.74 25.25 2.23 0.05 -1 2 1 6 14 -51.05 4.92 1.01 0.91 20.65 2.78 0.00 -1 2 1 6 13 -40.84 4.92 0.99 3.65 22.16 2.65 0.00 -1 2 1 6 12 -30.63 4.92 1.01 0.08 24.77 2.69 0.00 -1 2 1 6 11 -20.42 4.92 1.01 0.74 18.36 2.85 0.00 -1 2 1 6 10 -10.21 4.92 0.99 5.34 23.36 2.70 0.00 -1 2 1 6 9 0.00 4.92 1.01 2.99 20.83 2.82 0.00 -1 2 1 6 8 10.21 4.92 1.01 4.86 20.78 2.93 0.00 -1 2 1 6 7 20.42 4.92 1.03 4.37 27.58 2.23 0.07 -1 2 1 6 6 30.63 4.92 1.04 3.11 22.64 2.90 0.00 -1 2 1 6 5 40.84 4.92 1.06 2.64 23.39 2.85 0.00 -1 2 1 6 4 51.05 4.92 1.09 2.42 15.99 3.16 0.00 -1 2 1 6 3 61.26 4.92 1.10 2.91 19.07 3.30 0.07 -1 2 1 6 2 71.47 4.92 1.17 -0.86 26.47 2.09 0.15 -1 2 1 6 1 81.68 4.92 1.22 1.14 31.73 1.85 0.19 -1 2 1 6 0 91.89 4.92 1.21 1.22 27.15 3.88 0.42 -1 2 1 7 18 -91.89 14.75 0.99 3.62 19.21 2.89 0.00 -1 2 1 7 17 -81.68 14.75 1.00 1.70 25.76 2.58 0.03 -1 2 1 7 16 -71.47 14.75 1.01 1.47 29.56 2.07 0.06 -1 2 1 7 15 -61.26 14.75 1.00 2.12 19.68 2.88 0.00 -1 2 1 7 14 -51.05 14.75 1.00 2.88 28.98 2.22 0.04 -1 2 1 7 13 -40.84 14.75 1.02 -0.16 23.89 2.62 0.00 -1 2 1 7 12 -30.63 14.75 1.00 3.10 25.43 2.53 0.00 -1 2 1 7 11 -20.42 14.75 0.98 5.12 23.40 2.79 0.00 -1 2 1 7 10 -10.21 14.75 1.01 2.53 24.41 2.76 0.00 -1 2 1 7 9 0.00 14.75 1.01 2.76 22.34 2.77 0.03 -1 2 1 7 8 10.21 14.75 1.00 4.37 23.43 2.96 0.00 -1 2 1 7 7 20.42 14.75 1.03 1.41 20.35 2.84 0.00 -1 2 1 7 6 30.63 14.75 1.03 2.30 19.85 2.89 0.00 -1 2 1 7 5 40.84 14.75 1.06 0.17 26.75 2.30 0.08 -1 2 1 7 4 51.05 14.75 1.05 3.29 16.88 3.21 0.00 -1 2 1 7 3 61.26 14.75 1.07 0.87 26.14 2.16 0.11 -1 2 1 7 2 71.47 14.75 1.06 2.16 17.18 3.45 0.06 -1 2 1 7 1 81.68 14.75 1.02 2.63 23.16 3.76 0.05 -1 2 1 7 0 91.89 14.75 0.93 3.35 15.87 3.21 0.00 -1 2 1 8 18 -91.89 24.58 1.02 -0.68 27.00 2.76 0.00 -1 2 1 8 17 -81.68 24.58 0.99 3.81 21.49 2.75 0.00 -1 2 1 8 16 -71.47 24.58 1.01 1.51 14.78 3.04 0.00 -1 2 1 8 15 -61.26 24.58 1.00 2.77 21.24 2.65 0.00 -1 2 1 8 14 -51.05 24.58 0.98 4.55 26.29 2.26 0.08 -1 2 1 8 13 -40.84 24.58 0.99 3.99 16.66 3.01 0.00 -1 2 1 8 12 -30.63 24.58 1.00 2.71 22.63 2.78 0.00 -1 2 1 8 11 -20.42 24.58 1.01 1.60 22.53 2.65 0.00 -1 2 1 8 10 -10.21 24.58 1.00 2.54 21.92 2.61 0.00 -1 2 1 8 9 0.00 24.58 0.98 4.18 19.75 2.89 0.00 -1 2 1 8 8 10.21 24.58 0.99 5.25 26.22 2.31 0.05 -1 2 1 8 7 20.42 24.58 1.02 1.31 26.61 2.68 0.00 -1 2 1 8 6 30.63 24.58 1.01 4.77 25.72 2.59 0.00 -1 2 1 8 5 40.84 24.58 1.02 2.53 22.06 2.74 0.00 -1 2 1 8 4 51.05 24.58 1.02 1.18 22.70 2.60 0.02 -1 2 1 8 3 61.26 24.58 1.03 -1.14 28.64 2.18 0.07 -1 2 1 8 2 71.47 24.58 0.96 3.86 18.73 2.98 0.00 -1 2 1 8 1 81.68 24.58 0.95 -1.23 25.46 2.70 0.00 -1 2 1 8 0 91.89 24.58 0.92 4.73 18.40 2.71 0.00 -1 2 1 9 18 -91.89 34.42 0.98 6.64 35.87 0.32 0.10 -1 2 1 9 17 -81.68 34.42 1.00 3.27 22.93 2.72 0.00 -1 2 1 9 16 -71.47 34.42 0.99 1.43 25.31 2.67 0.00 -1 2 1 9 15 -61.26 34.42 1.00 1.98 21.92 2.72 0.00 -1 2 1 9 14 -51.05 34.42 0.99 2.49 25.38 2.67 0.00 -1 2 1 9 13 -40.84 34.42 1.00 2.67 20.17 2.59 0.04 -1 2 1 9 12 -30.63 34.42 0.99 3.94 20.80 2.69 0.01 -1 2 1 9 11 -20.42 34.42 1.00 1.79 23.08 2.64 0.00 -1 2 1 9 10 -10.21 34.42 0.99 3.54 21.15 2.69 0.00 -1 2 1 9 9 0.00 34.42 1.00 2.97 19.56 2.68 0.00 -1 2 1 9 8 10.21 34.42 0.99 0.82 27.75 2.49 0.02 -1 2 1 9 7 20.42 34.42 0.99 1.90 18.79 2.83 0.00 -1 2 1 9 6 30.63 34.42 1.00 0.78 21.49 2.65 0.00 -1 2 1 9 5 40.84 34.42 0.98 3.88 23.63 2.40 0.04 -1 2 1 9 4 51.05 34.42 0.98 2.10 19.91 2.95 0.00 -1 2 1 9 3 61.26 34.42 0.94 3.20 22.43 2.66 0.00 -1 2 1 9 2 71.47 34.42 0.95 0.86 23.01 2.56 0.00 -1 2 1 9 1 81.68 34.42 0.96 -0.52 27.31 2.40 0.04 -1 2 1 9 0 91.89 34.42 0.95 1.97 23.15 2.75 0.00 -1 2 1 10 18 -91.89 44.25 1.00 3.96 24.36 2.67 0.00 -1 2 1 10 17 -81.68 44.25 1.00 2.32 25.39 2.47 0.00 -1 2 1 10 16 -71.47 44.25 1.01 1.80 19.19 2.95 0.00 -1 2 1 10 15 -61.26 44.25 1.00 2.25 18.34 2.85 0.00 -1 2 1 10 14 -51.05 44.25 0.99 4.80 22.42 2.65 0.00 -1 2 1 10 13 -40.84 44.25 1.02 -0.80 16.27 3.01 0.00 -1 2 1 10 12 -30.63 44.25 1.01 0.79 22.96 2.64 0.00 -1 2 1 10 11 -20.42 44.25 1.00 1.24 22.01 2.73 0.00 -1 2 1 10 10 -10.21 44.25 0.99 3.14 25.39 2.47 0.04 -1 2 1 10 9 0.00 44.25 0.97 5.67 21.98 2.65 0.00 -1 2 1 10 8 10.21 44.25 0.96 5.35 23.22 2.67 0.02 -1 2 1 10 7 20.42 44.25 0.99 -0.82 22.29 2.71 0.00 -1 2 1 10 6 30.63 44.25 0.95 5.61 21.18 2.67 0.00 -1 2 1 10 5 40.84 44.25 0.97 2.23 20.13 2.70 0.00 -1 2 1 10 4 51.05 44.25 0.95 1.44 24.43 2.70 0.00 -1 2 1 10 3 61.26 44.25 0.93 4.34 22.98 2.72 0.00 -1 2 1 10 2 71.47 44.25 0.95 2.44 23.97 2.77 0.00 -1 2 1 10 1 81.68 44.25 0.95 3.32 24.00 2.68 0.00 -1 2 1 10 0 91.89 44.25 0.94 3.13 17.71 2.88 0.00 -1 2 1 11 18 -91.89 54.08 1.00 2.17 27.47 2.19 0.07 -1 2 1 11 17 -81.68 54.08 1.00 2.43 16.38 2.72 0.00 -1 2 1 11 16 -71.47 54.08 0.99 3.87 19.87 2.78 0.00 -1 2 1 11 15 -61.26 54.08 1.06 -5.15 37.47 0.00 0.11 -1 2 1 11 14 -51.05 54.08 1.00 3.13 23.31 2.61 0.00 -1 2 1 11 13 -40.84 54.08 0.99 4.25 21.20 2.78 0.00 -1 2 1 11 12 -30.63 54.08 1.00 1.58 24.37 2.13 0.08 -1 2 1 11 11 -20.42 54.08 1.00 2.07 22.98 2.86 0.00 -1 2 1 11 10 -10.21 54.08 0.97 4.57 18.89 2.88 0.00 -1 2 1 11 9 0.00 54.08 1.00 1.55 27.46 2.48 0.00 -1 2 1 11 8 10.21 54.08 0.98 3.14 22.61 2.63 0.00 -1 2 1 11 7 20.42 54.08 0.95 3.81 16.63 2.72 0.00 -1 2 1 11 6 30.63 54.08 0.95 3.41 24.89 2.66 0.00 -1 2 1 11 5 40.84 54.08 0.94 2.12 24.16 2.35 0.05 -1 2 1 11 4 51.05 54.08 0.95 1.83 25.30 2.42 0.04 -1 2 1 11 3 61.26 54.08 0.95 1.71 23.72 2.65 0.00 -1 2 1 11 2 71.47 54.08 0.95 1.80 19.55 2.81 0.00 -1 2 1 11 1 81.68 54.08 0.93 4.14 24.07 2.46 0.05 -1 2 1 11 0 91.89 54.08 0.95 2.60 16.28 2.91 0.00 -1 3 0 0 18 -91.89 -54.08 1.00 2.17 27.47 2.19 0.07 -1 3 0 0 17 -81.68 -54.08 1.00 2.43 16.38 2.72 0.00 -1 3 0 0 16 -71.47 -54.08 0.99 3.87 19.87 2.78 0.00 -1 3 0 0 15 -61.26 -54.08 1.06 -5.15 37.47 0.00 0.11 -1 3 0 0 14 -51.05 -54.08 1.00 3.13 23.31 2.61 0.00 -1 3 0 0 13 -40.84 -54.08 0.99 4.25 21.20 2.78 0.00 -1 3 0 0 12 -30.63 -54.08 1.00 1.58 24.37 2.13 0.08 -1 3 0 0 11 -20.42 -54.08 1.00 2.07 22.98 2.86 0.00 -1 3 0 0 10 -10.21 -54.08 0.97 4.57 18.89 2.88 0.00 -1 3 0 0 9 0.00 -54.08 1.00 1.55 27.46 2.48 0.00 -1 3 0 0 8 10.21 -54.08 0.98 3.14 22.61 2.63 0.00 -1 3 0 0 7 20.42 -54.08 0.95 3.81 16.63 2.72 0.00 -1 3 0 0 6 30.63 -54.08 0.95 3.41 24.89 2.66 0.00 -1 3 0 0 5 40.84 -54.08 0.94 2.12 24.16 2.35 0.05 -1 3 0 0 4 51.05 -54.08 0.95 1.83 25.30 2.42 0.04 -1 3 0 0 3 61.26 -54.08 0.95 1.71 23.72 2.65 0.00 -1 3 0 0 2 71.47 -54.08 0.95 1.80 19.55 2.81 0.00 -1 3 0 0 1 81.68 -54.08 0.93 4.14 24.07 2.46 0.05 -1 3 0 0 0 91.89 -54.08 0.95 2.60 16.28 2.91 0.00 -1 3 0 1 18 -91.89 -44.25 1.00 3.96 24.36 2.67 0.00 -1 3 0 1 17 -81.68 -44.25 1.00 2.32 25.39 2.47 0.00 -1 3 0 1 16 -71.47 -44.25 1.01 1.80 19.19 2.95 0.00 -1 3 0 1 15 -61.26 -44.25 1.00 2.25 18.34 2.85 0.00 -1 3 0 1 14 -51.05 -44.25 0.99 4.80 22.42 2.65 0.00 -1 3 0 1 13 -40.84 -44.25 1.02 -0.80 16.27 3.01 0.00 -1 3 0 1 12 -30.63 -44.25 1.01 0.79 22.96 2.64 0.00 -1 3 0 1 11 -20.42 -44.25 1.00 1.24 22.01 2.73 0.00 -1 3 0 1 10 -10.21 -44.25 0.99 3.14 25.39 2.47 0.04 -1 3 0 1 9 0.00 -44.25 0.97 5.67 21.98 2.65 0.00 -1 3 0 1 8 10.21 -44.25 0.96 5.35 23.22 2.67 0.02 -1 3 0 1 7 20.42 -44.25 0.99 -0.82 22.29 2.71 0.00 -1 3 0 1 6 30.63 -44.25 0.95 5.61 21.18 2.67 0.00 -1 3 0 1 5 40.84 -44.25 0.97 2.23 20.13 2.70 0.00 -1 3 0 1 4 51.05 -44.25 0.95 1.44 24.43 2.70 0.00 -1 3 0 1 3 61.26 -44.25 0.93 4.34 22.98 2.72 0.00 -1 3 0 1 2 71.47 -44.25 0.95 2.44 23.97 2.77 0.00 -1 3 0 1 1 81.68 -44.25 0.95 3.32 24.00 2.68 0.00 -1 3 0 1 0 91.89 -44.25 0.94 3.13 17.71 2.88 0.00 -1 3 0 2 18 -91.89 -34.42 0.98 6.64 35.87 0.32 0.10 -1 3 0 2 17 -81.68 -34.42 1.00 3.27 22.93 2.72 0.00 -1 3 0 2 16 -71.47 -34.42 0.99 1.43 25.31 2.67 0.00 -1 3 0 2 15 -61.26 -34.42 1.00 1.98 21.92 2.72 0.00 -1 3 0 2 14 -51.05 -34.42 0.99 2.49 25.38 2.67 0.00 -1 3 0 2 13 -40.84 -34.42 1.00 2.67 20.17 2.59 0.04 -1 3 0 2 12 -30.63 -34.42 0.99 3.94 20.80 2.69 0.01 -1 3 0 2 11 -20.42 -34.42 1.00 1.79 23.08 2.64 0.00 -1 3 0 2 10 -10.21 -34.42 0.99 3.54 21.15 2.69 0.00 -1 3 0 2 9 0.00 -34.42 1.00 2.97 19.56 2.68 0.00 -1 3 0 2 8 10.21 -34.42 0.99 0.82 27.75 2.49 0.02 -1 3 0 2 7 20.42 -34.42 0.99 1.90 18.79 2.83 0.00 -1 3 0 2 6 30.63 -34.42 1.00 0.78 21.49 2.65 0.00 -1 3 0 2 5 40.84 -34.42 0.98 3.88 23.63 2.40 0.04 -1 3 0 2 4 51.05 -34.42 0.98 2.10 19.91 2.95 0.00 -1 3 0 2 3 61.26 -34.42 0.94 3.20 22.43 2.66 0.00 -1 3 0 2 2 71.47 -34.42 0.95 0.86 23.01 2.56 0.00 -1 3 0 2 1 81.68 -34.42 0.96 -0.52 27.31 2.40 0.04 -1 3 0 2 0 91.89 -34.42 0.95 1.97 23.15 2.75 0.00 -1 3 0 3 18 -91.89 -24.58 1.02 -0.68 27.00 2.76 0.00 -1 3 0 3 17 -81.68 -24.58 0.99 3.81 21.49 2.75 0.00 -1 3 0 3 16 -71.47 -24.58 1.01 1.51 14.78 3.04 0.00 -1 3 0 3 15 -61.26 -24.58 1.00 2.77 21.24 2.65 0.00 -1 3 0 3 14 -51.05 -24.58 0.98 4.55 26.29 2.26 0.08 -1 3 0 3 13 -40.84 -24.58 0.99 3.99 16.66 3.01 0.00 -1 3 0 3 12 -30.63 -24.58 1.00 2.71 22.63 2.78 0.00 -1 3 0 3 11 -20.42 -24.58 1.01 1.60 22.53 2.65 0.00 -1 3 0 3 10 -10.21 -24.58 1.00 2.54 21.92 2.61 0.00 -1 3 0 3 9 0.00 -24.58 0.98 4.18 19.75 2.89 0.00 -1 3 0 3 8 10.21 -24.58 0.99 5.25 26.22 2.31 0.05 -1 3 0 3 7 20.42 -24.58 1.02 1.31 26.61 2.68 0.00 -1 3 0 3 6 30.63 -24.58 1.01 4.77 25.72 2.59 0.00 -1 3 0 3 5 40.84 -24.58 1.02 2.53 22.06 2.74 0.00 -1 3 0 3 4 51.05 -24.58 1.02 1.18 22.70 2.60 0.02 -1 3 0 3 3 61.26 -24.58 1.03 -1.14 28.64 2.18 0.07 -1 3 0 3 2 71.47 -24.58 0.96 3.86 18.73 2.98 0.00 -1 3 0 3 1 81.68 -24.58 0.95 -1.23 25.46 2.70 0.00 -1 3 0 3 0 91.89 -24.58 0.92 4.73 18.40 2.71 0.00 -1 3 0 4 18 -91.89 -14.75 0.99 3.62 19.21 2.89 0.00 -1 3 0 4 17 -81.68 -14.75 1.00 1.70 25.76 2.58 0.03 -1 3 0 4 16 -71.47 -14.75 1.01 1.47 29.56 2.07 0.06 -1 3 0 4 15 -61.26 -14.75 1.00 2.12 19.68 2.88 0.00 -1 3 0 4 14 -51.05 -14.75 1.00 2.88 28.98 2.22 0.04 -1 3 0 4 13 -40.84 -14.75 1.02 -0.16 23.89 2.62 0.00 -1 3 0 4 12 -30.63 -14.75 1.00 3.10 25.43 2.53 0.00 -1 3 0 4 11 -20.42 -14.75 0.98 5.12 23.40 2.79 0.00 -1 3 0 4 10 -10.21 -14.75 1.01 2.53 24.41 2.76 0.00 -1 3 0 4 9 0.00 -14.75 1.01 2.76 22.34 2.77 0.03 -1 3 0 4 8 10.21 -14.75 1.00 4.37 23.43 2.96 0.00 -1 3 0 4 7 20.42 -14.75 1.03 1.41 20.35 2.84 0.00 -1 3 0 4 6 30.63 -14.75 1.03 2.30 19.85 2.89 0.00 -1 3 0 4 5 40.84 -14.75 1.06 0.17 26.75 2.30 0.08 -1 3 0 4 4 51.05 -14.75 1.05 3.29 16.88 3.21 0.00 -1 3 0 4 3 61.26 -14.75 1.07 0.87 26.14 2.16 0.11 -1 3 0 4 2 71.47 -14.75 1.06 2.16 17.18 3.45 0.06 -1 3 0 4 1 81.68 -14.75 1.02 2.63 23.16 3.76 0.05 -1 3 0 4 0 91.89 -14.75 0.93 3.35 15.87 3.21 0.00 -1 3 0 5 18 -91.89 -4.92 0.99 2.76 22.78 2.68 0.00 -1 3 0 5 17 -81.68 -4.92 1.00 2.38 24.10 2.49 0.03 -1 3 0 5 16 -71.47 -4.92 0.98 3.99 23.95 2.65 0.00 -1 3 0 5 15 -61.26 -4.92 0.99 3.74 25.25 2.23 0.05 -1 3 0 5 14 -51.05 -4.92 1.01 0.91 20.65 2.78 0.00 -1 3 0 5 13 -40.84 -4.92 0.99 3.65 22.16 2.65 0.00 -1 3 0 5 12 -30.63 -4.92 1.01 0.08 24.77 2.69 0.00 -1 3 0 5 11 -20.42 -4.92 1.01 0.74 18.36 2.85 0.00 -1 3 0 5 10 -10.21 -4.92 0.99 5.34 23.36 2.70 0.00 -1 3 0 5 9 0.00 -4.92 1.01 2.99 20.83 2.82 0.00 -1 3 0 5 8 10.21 -4.92 1.01 4.86 20.78 2.93 0.00 -1 3 0 5 7 20.42 -4.92 1.03 4.37 27.58 2.23 0.07 -1 3 0 5 6 30.63 -4.92 1.04 3.11 22.64 2.90 0.00 -1 3 0 5 5 40.84 -4.92 1.06 2.64 23.39 2.85 0.00 -1 3 0 5 4 51.05 -4.92 1.09 2.42 15.99 3.16 0.00 -1 3 0 5 3 61.26 -4.92 1.10 2.91 19.07 3.30 0.07 -1 3 0 5 2 71.47 -4.92 1.17 -0.86 26.47 2.09 0.15 -1 3 0 5 1 81.68 -4.92 1.22 1.14 31.73 1.85 0.19 -1 3 0 5 0 91.89 -4.92 1.21 1.22 27.15 3.88 0.42 -1 3 0 6 18 -91.89 4.92 0.99 2.76 22.78 2.68 0.00 -1 3 0 6 17 -81.68 4.92 1.00 2.38 24.10 2.49 0.03 -1 3 0 6 16 -71.47 4.92 0.98 3.99 23.95 2.65 0.00 -1 3 0 6 15 -61.26 4.92 0.99 3.74 25.25 2.23 0.05 -1 3 0 6 14 -51.05 4.92 1.01 0.91 20.65 2.78 0.00 -1 3 0 6 13 -40.84 4.92 0.99 3.65 22.16 2.65 0.00 -1 3 0 6 12 -30.63 4.92 1.01 0.08 24.77 2.69 0.00 -1 3 0 6 11 -20.42 4.92 1.01 0.74 18.36 2.85 0.00 -1 3 0 6 10 -10.21 4.92 0.99 5.34 23.36 2.70 0.00 -1 3 0 6 9 0.00 4.92 1.01 2.99 20.83 2.82 0.00 -1 3 0 6 8 10.21 4.92 1.01 4.86 20.78 2.93 0.00 -1 3 0 6 7 20.42 4.92 1.03 4.37 27.58 2.23 0.07 -1 3 0 6 6 30.63 4.92 1.04 3.11 22.64 2.90 0.00 -1 3 0 6 5 40.84 4.92 1.06 2.64 23.39 2.85 0.00 -1 3 0 6 4 51.05 4.92 1.09 2.42 15.99 3.16 0.00 -1 3 0 6 3 61.26 4.92 1.10 2.91 19.07 3.30 0.07 -1 3 0 6 2 71.47 4.92 1.17 -0.86 26.47 2.09 0.15 -1 3 0 6 1 81.68 4.92 1.22 1.14 31.73 1.85 0.19 -1 3 0 6 0 91.89 4.92 1.21 1.22 27.15 3.88 0.42 -1 3 0 7 18 -91.89 14.75 0.99 3.62 19.21 2.89 0.00 -1 3 0 7 17 -81.68 14.75 1.00 1.70 25.76 2.58 0.03 -1 3 0 7 16 -71.47 14.75 1.01 1.47 29.56 2.07 0.06 -1 3 0 7 15 -61.26 14.75 1.00 2.12 19.68 2.88 0.00 -1 3 0 7 14 -51.05 14.75 1.00 2.88 28.98 2.22 0.04 -1 3 0 7 13 -40.84 14.75 1.02 -0.16 23.89 2.62 0.00 -1 3 0 7 12 -30.63 14.75 1.00 3.10 25.43 2.53 0.00 -1 3 0 7 11 -20.42 14.75 0.98 5.12 23.40 2.79 0.00 -1 3 0 7 10 -10.21 14.75 1.01 2.53 24.41 2.76 0.00 -1 3 0 7 9 0.00 14.75 1.01 2.76 22.34 2.77 0.03 -1 3 0 7 8 10.21 14.75 1.00 4.37 23.43 2.96 0.00 -1 3 0 7 7 20.42 14.75 1.03 1.41 20.35 2.84 0.00 -1 3 0 7 6 30.63 14.75 1.03 2.30 19.85 2.89 0.00 -1 3 0 7 5 40.84 14.75 1.06 0.17 26.75 2.30 0.08 -1 3 0 7 4 51.05 14.75 1.05 3.29 16.88 3.21 0.00 -1 3 0 7 3 61.26 14.75 1.07 0.87 26.14 2.16 0.11 -1 3 0 7 2 71.47 14.75 1.06 2.16 17.18 3.45 0.06 -1 3 0 7 1 81.68 14.75 1.02 2.63 23.16 3.76 0.05 -1 3 0 7 0 91.89 14.75 0.93 3.35 15.87 3.21 0.00 -1 3 0 8 18 -91.89 24.58 1.02 -0.68 27.00 2.76 0.00 -1 3 0 8 17 -81.68 24.58 0.99 3.81 21.49 2.75 0.00 -1 3 0 8 16 -71.47 24.58 1.01 1.51 14.78 3.04 0.00 -1 3 0 8 15 -61.26 24.58 1.00 2.77 21.24 2.65 0.00 -1 3 0 8 14 -51.05 24.58 0.98 4.55 26.29 2.26 0.08 -1 3 0 8 13 -40.84 24.58 0.99 3.99 16.66 3.01 0.00 -1 3 0 8 12 -30.63 24.58 1.00 2.71 22.63 2.78 0.00 -1 3 0 8 11 -20.42 24.58 1.01 1.60 22.53 2.65 0.00 -1 3 0 8 10 -10.21 24.58 1.00 2.54 21.92 2.61 0.00 -1 3 0 8 9 0.00 24.58 0.98 4.18 19.75 2.89 0.00 -1 3 0 8 8 10.21 24.58 0.99 5.25 26.22 2.31 0.05 -1 3 0 8 7 20.42 24.58 1.02 1.31 26.61 2.68 0.00 -1 3 0 8 6 30.63 24.58 1.01 4.77 25.72 2.59 0.00 -1 3 0 8 5 40.84 24.58 1.02 2.53 22.06 2.74 0.00 -1 3 0 8 4 51.05 24.58 1.02 1.18 22.70 2.60 0.02 -1 3 0 8 3 61.26 24.58 1.03 -1.14 28.64 2.18 0.07 -1 3 0 8 2 71.47 24.58 0.96 3.86 18.73 2.98 0.00 -1 3 0 8 1 81.68 24.58 0.95 -1.23 25.46 2.70 0.00 -1 3 0 8 0 91.89 24.58 0.92 4.73 18.40 2.71 0.00 -1 3 0 9 18 -91.89 34.42 0.98 6.64 35.87 0.32 0.10 -1 3 0 9 17 -81.68 34.42 1.00 3.27 22.93 2.72 0.00 -1 3 0 9 16 -71.47 34.42 0.99 1.43 25.31 2.67 0.00 -1 3 0 9 15 -61.26 34.42 1.00 1.98 21.92 2.72 0.00 -1 3 0 9 14 -51.05 34.42 0.99 2.49 25.38 2.67 0.00 -1 3 0 9 13 -40.84 34.42 1.00 2.67 20.17 2.59 0.04 -1 3 0 9 12 -30.63 34.42 0.99 3.94 20.80 2.69 0.01 -1 3 0 9 11 -20.42 34.42 1.00 1.79 23.08 2.64 0.00 -1 3 0 9 10 -10.21 34.42 0.99 3.54 21.15 2.69 0.00 -1 3 0 9 9 0.00 34.42 1.00 2.97 19.56 2.68 0.00 -1 3 0 9 8 10.21 34.42 0.99 0.82 27.75 2.49 0.02 -1 3 0 9 7 20.42 34.42 0.99 1.90 18.79 2.83 0.00 -1 3 0 9 6 30.63 34.42 1.00 0.78 21.49 2.65 0.00 -1 3 0 9 5 40.84 34.42 0.98 3.88 23.63 2.40 0.04 -1 3 0 9 4 51.05 34.42 0.98 2.10 19.91 2.95 0.00 -1 3 0 9 3 61.26 34.42 0.94 3.20 22.43 2.66 0.00 -1 3 0 9 2 71.47 34.42 0.95 0.86 23.01 2.56 0.00 -1 3 0 9 1 81.68 34.42 0.96 -0.52 27.31 2.40 0.04 -1 3 0 9 0 91.89 34.42 0.95 1.97 23.15 2.75 0.00 -1 3 0 10 18 -91.89 44.25 1.00 3.96 24.36 2.67 0.00 -1 3 0 10 17 -81.68 44.25 1.00 2.32 25.39 2.47 0.00 -1 3 0 10 16 -71.47 44.25 1.01 1.80 19.19 2.95 0.00 -1 3 0 10 15 -61.26 44.25 1.00 2.25 18.34 2.85 0.00 -1 3 0 10 14 -51.05 44.25 0.99 4.80 22.42 2.65 0.00 -1 3 0 10 13 -40.84 44.25 1.02 -0.80 16.27 3.01 0.00 -1 3 0 10 12 -30.63 44.25 1.01 0.79 22.96 2.64 0.00 -1 3 0 10 11 -20.42 44.25 1.00 1.24 22.01 2.73 0.00 -1 3 0 10 10 -10.21 44.25 0.99 3.14 25.39 2.47 0.04 -1 3 0 10 9 0.00 44.25 0.97 5.67 21.98 2.65 0.00 -1 3 0 10 8 10.21 44.25 0.96 5.35 23.22 2.67 0.02 -1 3 0 10 7 20.42 44.25 0.99 -0.82 22.29 2.71 0.00 -1 3 0 10 6 30.63 44.25 0.95 5.61 21.18 2.67 0.00 -1 3 0 10 5 40.84 44.25 0.97 2.23 20.13 2.70 0.00 -1 3 0 10 4 51.05 44.25 0.95 1.44 24.43 2.70 0.00 -1 3 0 10 3 61.26 44.25 0.93 4.34 22.98 2.72 0.00 -1 3 0 10 2 71.47 44.25 0.95 2.44 23.97 2.77 0.00 -1 3 0 10 1 81.68 44.25 0.95 3.32 24.00 2.68 0.00 -1 3 0 10 0 91.89 44.25 0.94 3.13 17.71 2.88 0.00 -1 3 0 11 18 -91.89 54.08 1.00 2.17 27.47 2.19 0.07 -1 3 0 11 17 -81.68 54.08 1.00 2.43 16.38 2.72 0.00 -1 3 0 11 16 -71.47 54.08 0.99 3.87 19.87 2.78 0.00 -1 3 0 11 15 -61.26 54.08 1.06 -5.15 37.47 0.00 0.11 -1 3 0 11 14 -51.05 54.08 1.00 3.13 23.31 2.61 0.00 -1 3 0 11 13 -40.84 54.08 0.99 4.25 21.20 2.78 0.00 -1 3 0 11 12 -30.63 54.08 1.00 1.58 24.37 2.13 0.08 -1 3 0 11 11 -20.42 54.08 1.00 2.07 22.98 2.86 0.00 -1 3 0 11 10 -10.21 54.08 0.97 4.57 18.89 2.88 0.00 -1 3 0 11 9 0.00 54.08 1.00 1.55 27.46 2.48 0.00 -1 3 0 11 8 10.21 54.08 0.98 3.14 22.61 2.63 0.00 -1 3 0 11 7 20.42 54.08 0.95 3.81 16.63 2.72 0.00 -1 3 0 11 6 30.63 54.08 0.95 3.41 24.89 2.66 0.00 -1 3 0 11 5 40.84 54.08 0.94 2.12 24.16 2.35 0.05 -1 3 0 11 4 51.05 54.08 0.95 1.83 25.30 2.42 0.04 -1 3 0 11 3 61.26 54.08 0.95 1.71 23.72 2.65 0.00 -1 3 0 11 2 71.47 54.08 0.95 1.80 19.55 2.81 0.00 -1 3 0 11 1 81.68 54.08 0.93 4.14 24.07 2.46 0.05 -1 3 0 11 0 91.89 54.08 0.95 2.60 16.28 2.91 0.00 -1 3 1 0 18 -91.89 -54.08 1.00 2.17 27.47 2.19 0.07 -1 3 1 0 17 -81.68 -54.08 1.00 2.43 16.38 2.72 0.00 -1 3 1 0 16 -71.47 -54.08 0.99 3.87 19.87 2.78 0.00 -1 3 1 0 15 -61.26 -54.08 1.06 -5.15 37.47 0.00 0.11 -1 3 1 0 14 -51.05 -54.08 1.00 3.13 23.31 2.61 0.00 -1 3 1 0 13 -40.84 -54.08 0.99 4.25 21.20 2.78 0.00 -1 3 1 0 12 -30.63 -54.08 1.00 1.58 24.37 2.13 0.08 -1 3 1 0 11 -20.42 -54.08 1.00 2.07 22.98 2.86 0.00 -1 3 1 0 10 -10.21 -54.08 0.97 4.57 18.89 2.88 0.00 -1 3 1 0 9 0.00 -54.08 1.00 1.55 27.46 2.48 0.00 -1 3 1 0 8 10.21 -54.08 0.98 3.14 22.61 2.63 0.00 -1 3 1 0 7 20.42 -54.08 0.95 3.81 16.63 2.72 0.00 -1 3 1 0 6 30.63 -54.08 0.95 3.41 24.89 2.66 0.00 -1 3 1 0 5 40.84 -54.08 0.94 2.12 24.16 2.35 0.05 -1 3 1 0 4 51.05 -54.08 0.95 1.83 25.30 2.42 0.04 -1 3 1 0 3 61.26 -54.08 0.95 1.71 23.72 2.65 0.00 -1 3 1 0 2 71.47 -54.08 0.95 1.80 19.55 2.81 0.00 -1 3 1 0 1 81.68 -54.08 0.93 4.14 24.07 2.46 0.05 -1 3 1 0 0 91.89 -54.08 0.95 2.60 16.28 2.91 0.00 -1 3 1 1 18 -91.89 -44.25 1.00 3.96 24.36 2.67 0.00 -1 3 1 1 17 -81.68 -44.25 1.00 2.32 25.39 2.47 0.00 -1 3 1 1 16 -71.47 -44.25 1.01 1.80 19.19 2.95 0.00 -1 3 1 1 15 -61.26 -44.25 1.00 2.25 18.34 2.85 0.00 -1 3 1 1 14 -51.05 -44.25 0.99 4.80 22.42 2.65 0.00 -1 3 1 1 13 -40.84 -44.25 1.02 -0.80 16.27 3.01 0.00 -1 3 1 1 12 -30.63 -44.25 1.01 0.79 22.96 2.64 0.00 -1 3 1 1 11 -20.42 -44.25 1.00 1.24 22.01 2.73 0.00 -1 3 1 1 10 -10.21 -44.25 0.99 3.14 25.39 2.47 0.04 -1 3 1 1 9 0.00 -44.25 0.97 5.67 21.98 2.65 0.00 -1 3 1 1 8 10.21 -44.25 0.96 5.35 23.22 2.67 0.02 -1 3 1 1 7 20.42 -44.25 0.99 -0.82 22.29 2.71 0.00 -1 3 1 1 6 30.63 -44.25 0.95 5.61 21.18 2.67 0.00 -1 3 1 1 5 40.84 -44.25 0.97 2.23 20.13 2.70 0.00 -1 3 1 1 4 51.05 -44.25 0.95 1.44 24.43 2.70 0.00 -1 3 1 1 3 61.26 -44.25 0.93 4.34 22.98 2.72 0.00 -1 3 1 1 2 71.47 -44.25 0.95 2.44 23.97 2.77 0.00 -1 3 1 1 1 81.68 -44.25 0.95 3.32 24.00 2.68 0.00 -1 3 1 1 0 91.89 -44.25 0.94 3.13 17.71 2.88 0.00 -1 3 1 2 18 -91.89 -34.42 0.98 6.64 35.87 0.32 0.10 -1 3 1 2 17 -81.68 -34.42 1.00 3.27 22.93 2.72 0.00 -1 3 1 2 16 -71.47 -34.42 0.99 1.43 25.31 2.67 0.00 -1 3 1 2 15 -61.26 -34.42 1.00 1.98 21.92 2.72 0.00 -1 3 1 2 14 -51.05 -34.42 0.99 2.49 25.38 2.67 0.00 -1 3 1 2 13 -40.84 -34.42 1.00 2.67 20.17 2.59 0.04 -1 3 1 2 12 -30.63 -34.42 0.99 3.94 20.80 2.69 0.01 -1 3 1 2 11 -20.42 -34.42 1.00 1.79 23.08 2.64 0.00 -1 3 1 2 10 -10.21 -34.42 0.99 3.54 21.15 2.69 0.00 -1 3 1 2 9 0.00 -34.42 1.00 2.97 19.56 2.68 0.00 -1 3 1 2 8 10.21 -34.42 0.99 0.82 27.75 2.49 0.02 -1 3 1 2 7 20.42 -34.42 0.99 1.90 18.79 2.83 0.00 -1 3 1 2 6 30.63 -34.42 1.00 0.78 21.49 2.65 0.00 -1 3 1 2 5 40.84 -34.42 0.98 3.88 23.63 2.40 0.04 -1 3 1 2 4 51.05 -34.42 0.98 2.10 19.91 2.95 0.00 -1 3 1 2 3 61.26 -34.42 0.94 3.20 22.43 2.66 0.00 -1 3 1 2 2 71.47 -34.42 0.95 0.86 23.01 2.56 0.00 -1 3 1 2 1 81.68 -34.42 0.96 -0.52 27.31 2.40 0.04 -1 3 1 2 0 91.89 -34.42 0.95 1.97 23.15 2.75 0.00 -1 3 1 3 18 -91.89 -24.58 1.02 -0.68 27.00 2.76 0.00 -1 3 1 3 17 -81.68 -24.58 0.99 3.81 21.49 2.75 0.00 -1 3 1 3 16 -71.47 -24.58 1.01 1.51 14.78 3.04 0.00 -1 3 1 3 15 -61.26 -24.58 1.00 2.77 21.24 2.65 0.00 -1 3 1 3 14 -51.05 -24.58 0.98 4.55 26.29 2.26 0.08 -1 3 1 3 13 -40.84 -24.58 0.99 3.99 16.66 3.01 0.00 -1 3 1 3 12 -30.63 -24.58 1.00 2.71 22.63 2.78 0.00 -1 3 1 3 11 -20.42 -24.58 1.01 1.60 22.53 2.65 0.00 -1 3 1 3 10 -10.21 -24.58 1.00 2.54 21.92 2.61 0.00 -1 3 1 3 9 0.00 -24.58 0.98 4.18 19.75 2.89 0.00 -1 3 1 3 8 10.21 -24.58 0.99 5.25 26.22 2.31 0.05 -1 3 1 3 7 20.42 -24.58 1.02 1.31 26.61 2.68 0.00 -1 3 1 3 6 30.63 -24.58 1.01 4.77 25.72 2.59 0.00 -1 3 1 3 5 40.84 -24.58 1.02 2.53 22.06 2.74 0.00 -1 3 1 3 4 51.05 -24.58 1.02 1.18 22.70 2.60 0.02 -1 3 1 3 3 61.26 -24.58 1.03 -1.14 28.64 2.18 0.07 -1 3 1 3 2 71.47 -24.58 0.96 3.86 18.73 2.98 0.00 -1 3 1 3 1 81.68 -24.58 0.95 -1.23 25.46 2.70 0.00 -1 3 1 3 0 91.89 -24.58 0.92 4.73 18.40 2.71 0.00 -1 3 1 4 18 -91.89 -14.75 0.99 3.62 19.21 2.89 0.00 -1 3 1 4 17 -81.68 -14.75 1.00 1.70 25.76 2.58 0.03 -1 3 1 4 16 -71.47 -14.75 1.01 1.47 29.56 2.07 0.06 -1 3 1 4 15 -61.26 -14.75 1.00 2.12 19.68 2.88 0.00 -1 3 1 4 14 -51.05 -14.75 1.00 2.88 28.98 2.22 0.04 -1 3 1 4 13 -40.84 -14.75 1.02 -0.16 23.89 2.62 0.00 -1 3 1 4 12 -30.63 -14.75 1.00 3.10 25.43 2.53 0.00 -1 3 1 4 11 -20.42 -14.75 0.98 5.12 23.40 2.79 0.00 -1 3 1 4 10 -10.21 -14.75 1.01 2.53 24.41 2.76 0.00 -1 3 1 4 9 0.00 -14.75 1.01 2.76 22.34 2.77 0.03 -1 3 1 4 8 10.21 -14.75 1.00 4.37 23.43 2.96 0.00 -1 3 1 4 7 20.42 -14.75 1.03 1.41 20.35 2.84 0.00 -1 3 1 4 6 30.63 -14.75 1.03 2.30 19.85 2.89 0.00 -1 3 1 4 5 40.84 -14.75 1.06 0.17 26.75 2.30 0.08 -1 3 1 4 4 51.05 -14.75 1.05 3.29 16.88 3.21 0.00 -1 3 1 4 3 61.26 -14.75 1.07 0.87 26.14 2.16 0.11 -1 3 1 4 2 71.47 -14.75 1.06 2.16 17.18 3.45 0.06 -1 3 1 4 1 81.68 -14.75 1.02 2.63 23.16 3.76 0.05 -1 3 1 4 0 91.89 -14.75 0.93 3.35 15.87 3.21 0.00 -1 3 1 5 18 -91.89 -4.92 0.99 2.76 22.78 2.68 0.00 -1 3 1 5 17 -81.68 -4.92 1.00 2.38 24.10 2.49 0.03 -1 3 1 5 16 -71.47 -4.92 0.98 3.99 23.95 2.65 0.00 -1 3 1 5 15 -61.26 -4.92 0.99 3.74 25.25 2.23 0.05 -1 3 1 5 14 -51.05 -4.92 1.01 0.91 20.65 2.78 0.00 -1 3 1 5 13 -40.84 -4.92 0.99 3.65 22.16 2.65 0.00 -1 3 1 5 12 -30.63 -4.92 1.01 0.08 24.77 2.69 0.00 -1 3 1 5 11 -20.42 -4.92 1.01 0.74 18.36 2.85 0.00 -1 3 1 5 10 -10.21 -4.92 0.99 5.34 23.36 2.70 0.00 -1 3 1 5 9 0.00 -4.92 1.01 2.99 20.83 2.82 0.00 -1 3 1 5 8 10.21 -4.92 1.01 4.86 20.78 2.93 0.00 -1 3 1 5 7 20.42 -4.92 1.03 4.37 27.58 2.23 0.07 -1 3 1 5 6 30.63 -4.92 1.04 3.11 22.64 2.90 0.00 -1 3 1 5 5 40.84 -4.92 1.06 2.64 23.39 2.85 0.00 -1 3 1 5 4 51.05 -4.92 1.09 2.42 15.99 3.16 0.00 -1 3 1 5 3 61.26 -4.92 1.10 2.91 19.07 3.30 0.07 -1 3 1 5 2 71.47 -4.92 1.17 -0.86 26.47 2.09 0.15 -1 3 1 5 1 81.68 -4.92 1.22 1.14 31.73 1.85 0.19 -1 3 1 5 0 91.89 -4.92 1.21 1.22 27.15 3.88 0.42 -1 3 1 6 18 -91.89 4.92 0.99 2.76 22.78 2.68 0.00 -1 3 1 6 17 -81.68 4.92 1.00 2.38 24.10 2.49 0.03 -1 3 1 6 16 -71.47 4.92 0.98 3.99 23.95 2.65 0.00 -1 3 1 6 15 -61.26 4.92 0.99 3.74 25.25 2.23 0.05 -1 3 1 6 14 -51.05 4.92 1.01 0.91 20.65 2.78 0.00 -1 3 1 6 13 -40.84 4.92 0.99 3.65 22.16 2.65 0.00 -1 3 1 6 12 -30.63 4.92 1.01 0.08 24.77 2.69 0.00 -1 3 1 6 11 -20.42 4.92 1.01 0.74 18.36 2.85 0.00 -1 3 1 6 10 -10.21 4.92 0.99 5.34 23.36 2.70 0.00 -1 3 1 6 9 0.00 4.92 1.01 2.99 20.83 2.82 0.00 -1 3 1 6 8 10.21 4.92 1.01 4.86 20.78 2.93 0.00 -1 3 1 6 7 20.42 4.92 1.03 4.37 27.58 2.23 0.07 -1 3 1 6 6 30.63 4.92 1.04 3.11 22.64 2.90 0.00 -1 3 1 6 5 40.84 4.92 1.06 2.64 23.39 2.85 0.00 -1 3 1 6 4 51.05 4.92 1.09 2.42 15.99 3.16 0.00 -1 3 1 6 3 61.26 4.92 1.10 2.91 19.07 3.30 0.07 -1 3 1 6 2 71.47 4.92 1.17 -0.86 26.47 2.09 0.15 -1 3 1 6 1 81.68 4.92 1.22 1.14 31.73 1.85 0.19 -1 3 1 6 0 91.89 4.92 1.21 1.22 27.15 3.88 0.42 -1 3 1 7 18 -91.89 14.75 0.99 3.62 19.21 2.89 0.00 -1 3 1 7 17 -81.68 14.75 1.00 1.70 25.76 2.58 0.03 -1 3 1 7 16 -71.47 14.75 1.01 1.47 29.56 2.07 0.06 -1 3 1 7 15 -61.26 14.75 1.00 2.12 19.68 2.88 0.00 -1 3 1 7 14 -51.05 14.75 1.00 2.88 28.98 2.22 0.04 -1 3 1 7 13 -40.84 14.75 1.02 -0.16 23.89 2.62 0.00 -1 3 1 7 12 -30.63 14.75 1.00 3.10 25.43 2.53 0.00 -1 3 1 7 11 -20.42 14.75 0.98 5.12 23.40 2.79 0.00 -1 3 1 7 10 -10.21 14.75 1.01 2.53 24.41 2.76 0.00 -1 3 1 7 9 0.00 14.75 1.01 2.76 22.34 2.77 0.03 -1 3 1 7 8 10.21 14.75 1.00 4.37 23.43 2.96 0.00 -1 3 1 7 7 20.42 14.75 1.03 1.41 20.35 2.84 0.00 -1 3 1 7 6 30.63 14.75 1.03 2.30 19.85 2.89 0.00 -1 3 1 7 5 40.84 14.75 1.06 0.17 26.75 2.30 0.08 -1 3 1 7 4 51.05 14.75 1.05 3.29 16.88 3.21 0.00 -1 3 1 7 3 61.26 14.75 1.07 0.87 26.14 2.16 0.11 -1 3 1 7 2 71.47 14.75 1.06 2.16 17.18 3.45 0.06 -1 3 1 7 1 81.68 14.75 1.02 2.63 23.16 3.76 0.05 -1 3 1 7 0 91.89 14.75 0.93 3.35 15.87 3.21 0.00 -1 3 1 8 18 -91.89 24.58 1.02 -0.68 27.00 2.76 0.00 -1 3 1 8 17 -81.68 24.58 0.99 3.81 21.49 2.75 0.00 -1 3 1 8 16 -71.47 24.58 1.01 1.51 14.78 3.04 0.00 -1 3 1 8 15 -61.26 24.58 1.00 2.77 21.24 2.65 0.00 -1 3 1 8 14 -51.05 24.58 0.98 4.55 26.29 2.26 0.08 -1 3 1 8 13 -40.84 24.58 0.99 3.99 16.66 3.01 0.00 -1 3 1 8 12 -30.63 24.58 1.00 2.71 22.63 2.78 0.00 -1 3 1 8 11 -20.42 24.58 1.01 1.60 22.53 2.65 0.00 -1 3 1 8 10 -10.21 24.58 1.00 2.54 21.92 2.61 0.00 -1 3 1 8 9 0.00 24.58 0.98 4.18 19.75 2.89 0.00 -1 3 1 8 8 10.21 24.58 0.99 5.25 26.22 2.31 0.05 -1 3 1 8 7 20.42 24.58 1.02 1.31 26.61 2.68 0.00 -1 3 1 8 6 30.63 24.58 1.01 4.77 25.72 2.59 0.00 -1 3 1 8 5 40.84 24.58 1.02 2.53 22.06 2.74 0.00 -1 3 1 8 4 51.05 24.58 1.02 1.18 22.70 2.60 0.02 -1 3 1 8 3 61.26 24.58 1.03 -1.14 28.64 2.18 0.07 -1 3 1 8 2 71.47 24.58 0.96 3.86 18.73 2.98 0.00 -1 3 1 8 1 81.68 24.58 0.95 -1.23 25.46 2.70 0.00 -1 3 1 8 0 91.89 24.58 0.92 4.73 18.40 2.71 0.00 -1 3 1 9 18 -91.89 34.42 0.98 6.64 35.87 0.32 0.10 -1 3 1 9 17 -81.68 34.42 1.00 3.27 22.93 2.72 0.00 -1 3 1 9 16 -71.47 34.42 0.99 1.43 25.31 2.67 0.00 -1 3 1 9 15 -61.26 34.42 1.00 1.98 21.92 2.72 0.00 -1 3 1 9 14 -51.05 34.42 0.99 2.49 25.38 2.67 0.00 -1 3 1 9 13 -40.84 34.42 1.00 2.67 20.17 2.59 0.04 -1 3 1 9 12 -30.63 34.42 0.99 3.94 20.80 2.69 0.01 -1 3 1 9 11 -20.42 34.42 1.00 1.79 23.08 2.64 0.00 -1 3 1 9 10 -10.21 34.42 0.99 3.54 21.15 2.69 0.00 -1 3 1 9 9 0.00 34.42 1.00 2.97 19.56 2.68 0.00 -1 3 1 9 8 10.21 34.42 0.99 0.82 27.75 2.49 0.02 -1 3 1 9 7 20.42 34.42 0.99 1.90 18.79 2.83 0.00 -1 3 1 9 6 30.63 34.42 1.00 0.78 21.49 2.65 0.00 -1 3 1 9 5 40.84 34.42 0.98 3.88 23.63 2.40 0.04 -1 3 1 9 4 51.05 34.42 0.98 2.10 19.91 2.95 0.00 -1 3 1 9 3 61.26 34.42 0.94 3.20 22.43 2.66 0.00 -1 3 1 9 2 71.47 34.42 0.95 0.86 23.01 2.56 0.00 -1 3 1 9 1 81.68 34.42 0.96 -0.52 27.31 2.40 0.04 -1 3 1 9 0 91.89 34.42 0.95 1.97 23.15 2.75 0.00 -1 3 1 10 18 -91.89 44.25 1.00 3.96 24.36 2.67 0.00 -1 3 1 10 17 -81.68 44.25 1.00 2.32 25.39 2.47 0.00 -1 3 1 10 16 -71.47 44.25 1.01 1.80 19.19 2.95 0.00 -1 3 1 10 15 -61.26 44.25 1.00 2.25 18.34 2.85 0.00 -1 3 1 10 14 -51.05 44.25 0.99 4.80 22.42 2.65 0.00 -1 3 1 10 13 -40.84 44.25 1.02 -0.80 16.27 3.01 0.00 -1 3 1 10 12 -30.63 44.25 1.01 0.79 22.96 2.64 0.00 -1 3 1 10 11 -20.42 44.25 1.00 1.24 22.01 2.73 0.00 -1 3 1 10 10 -10.21 44.25 0.99 3.14 25.39 2.47 0.04 -1 3 1 10 9 0.00 44.25 0.97 5.67 21.98 2.65 0.00 -1 3 1 10 8 10.21 44.25 0.96 5.35 23.22 2.67 0.02 -1 3 1 10 7 20.42 44.25 0.99 -0.82 22.29 2.71 0.00 -1 3 1 10 6 30.63 44.25 0.95 5.61 21.18 2.67 0.00 -1 3 1 10 5 40.84 44.25 0.97 2.23 20.13 2.70 0.00 -1 3 1 10 4 51.05 44.25 0.95 1.44 24.43 2.70 0.00 -1 3 1 10 3 61.26 44.25 0.93 4.34 22.98 2.72 0.00 -1 3 1 10 2 71.47 44.25 0.95 2.44 23.97 2.77 0.00 -1 3 1 10 1 81.68 44.25 0.95 3.32 24.00 2.68 0.00 -1 3 1 10 0 91.89 44.25 0.94 3.13 17.71 2.88 0.00 -1 3 1 11 18 -91.89 54.08 1.00 2.17 27.47 2.19 0.07 -1 3 1 11 17 -81.68 54.08 1.00 2.43 16.38 2.72 0.00 -1 3 1 11 16 -71.47 54.08 0.99 3.87 19.87 2.78 0.00 -1 3 1 11 15 -61.26 54.08 1.06 -5.15 37.47 0.00 0.11 -1 3 1 11 14 -51.05 54.08 1.00 3.13 23.31 2.61 0.00 -1 3 1 11 13 -40.84 54.08 0.99 4.25 21.20 2.78 0.00 -1 3 1 11 12 -30.63 54.08 1.00 1.58 24.37 2.13 0.08 -1 3 1 11 11 -20.42 54.08 1.00 2.07 22.98 2.86 0.00 -1 3 1 11 10 -10.21 54.08 0.97 4.57 18.89 2.88 0.00 -1 3 1 11 9 0.00 54.08 1.00 1.55 27.46 2.48 0.00 -1 3 1 11 8 10.21 54.08 0.98 3.14 22.61 2.63 0.00 -1 3 1 11 7 20.42 54.08 0.95 3.81 16.63 2.72 0.00 -1 3 1 11 6 30.63 54.08 0.95 3.41 24.89 2.66 0.00 -1 3 1 11 5 40.84 54.08 0.94 2.12 24.16 2.35 0.05 -1 3 1 11 4 51.05 54.08 0.95 1.83 25.30 2.42 0.04 -1 3 1 11 3 61.26 54.08 0.95 1.71 23.72 2.65 0.00 -1 3 1 11 2 71.47 54.08 0.95 1.80 19.55 2.81 0.00 -1 3 1 11 1 81.68 54.08 0.93 4.14 24.07 2.46 0.05 -1 3 1 11 0 91.89 54.08 0.95 2.60 16.28 2.91 0.00 +0 0 0 0 18 -91.89 -54.08 1.00 2.17 27.47 2.19 0.07 +0 0 0 0 17 -81.68 -54.08 1.00 2.43 16.38 2.72 0.00 +0 0 0 0 16 -71.47 -54.08 0.99 3.87 19.87 2.78 0.00 +0 0 0 0 15 -61.26 -54.08 1.06 -5.15 37.47 0.00 0.11 +0 0 0 0 14 -51.05 -54.08 1.00 3.13 23.31 2.61 0.00 +0 0 0 0 13 -40.84 -54.08 0.99 4.25 21.20 2.78 0.00 +0 0 0 0 12 -30.63 -54.08 1.00 1.58 24.37 2.13 0.08 +0 0 0 0 11 -20.42 -54.08 1.00 2.07 22.98 2.86 0.00 +0 0 0 0 10 -10.21 -54.08 0.97 4.57 18.89 2.88 0.00 +0 0 0 0 9 0.00 -54.08 1.00 1.55 27.46 2.48 0.00 +0 0 0 0 8 10.21 -54.08 0.98 3.14 22.61 2.63 0.00 +0 0 0 0 7 20.42 -54.08 0.95 3.81 16.63 2.72 0.00 +0 0 0 0 6 30.63 -54.08 0.95 3.41 24.89 2.66 0.00 +0 0 0 0 5 40.84 -54.08 0.94 2.12 24.16 2.35 0.05 +0 0 0 0 4 51.05 -54.08 0.95 1.83 25.30 2.42 0.04 +0 0 0 0 3 61.26 -54.08 0.95 1.71 23.72 2.65 0.00 +0 0 0 0 2 71.47 -54.08 0.95 1.80 19.55 2.81 0.00 +0 0 0 0 1 81.68 -54.08 0.93 4.14 24.07 2.46 0.05 +0 0 0 0 0 91.89 -54.08 0.95 2.60 16.28 2.91 0.00 +0 0 0 1 18 -91.89 -44.25 1.00 3.96 24.36 2.67 0.00 +0 0 0 1 17 -81.68 -44.25 1.00 2.32 25.39 2.47 0.00 +0 0 0 1 16 -71.47 -44.25 1.01 1.80 19.19 2.95 0.00 +0 0 0 1 15 -61.26 -44.25 1.00 2.25 18.34 2.85 0.00 +0 0 0 1 14 -51.05 -44.25 0.99 4.80 22.42 2.65 0.00 +0 0 0 1 13 -40.84 -44.25 1.02 -0.80 16.27 3.01 0.00 +0 0 0 1 12 -30.63 -44.25 1.01 0.79 22.96 2.64 0.00 +0 0 0 1 11 -20.42 -44.25 1.00 1.24 22.01 2.73 0.00 +0 0 0 1 10 -10.21 -44.25 0.99 3.14 25.39 2.47 0.04 +0 0 0 1 9 0.00 -44.25 0.97 5.67 21.98 2.65 0.00 +0 0 0 1 8 10.21 -44.25 0.96 5.35 23.22 2.67 0.02 +0 0 0 1 7 20.42 -44.25 0.99 -0.82 22.29 2.71 0.00 +0 0 0 1 6 30.63 -44.25 0.95 5.61 21.18 2.67 0.00 +0 0 0 1 5 40.84 -44.25 0.97 2.23 20.13 2.70 0.00 +0 0 0 1 4 51.05 -44.25 0.95 1.44 24.43 2.70 0.00 +0 0 0 1 3 61.26 -44.25 0.93 4.34 22.98 2.72 0.00 +0 0 0 1 2 71.47 -44.25 0.95 2.44 23.97 2.77 0.00 +0 0 0 1 1 81.68 -44.25 0.95 3.32 24.00 2.68 0.00 +0 0 0 1 0 91.89 -44.25 0.94 3.13 17.71 2.88 0.00 +0 0 0 2 18 -91.89 -34.42 0.98 6.64 35.87 0.32 0.10 +0 0 0 2 17 -81.68 -34.42 1.00 3.27 22.93 2.72 0.00 +0 0 0 2 16 -71.47 -34.42 0.99 1.43 25.31 2.67 0.00 +0 0 0 2 15 -61.26 -34.42 1.00 1.98 21.92 2.72 0.00 +0 0 0 2 14 -51.05 -34.42 0.99 2.49 25.38 2.67 0.00 +0 0 0 2 13 -40.84 -34.42 1.00 2.67 20.17 2.59 0.04 +0 0 0 2 12 -30.63 -34.42 0.99 3.94 20.80 2.69 0.01 +0 0 0 2 11 -20.42 -34.42 1.00 1.79 23.08 2.64 0.00 +0 0 0 2 10 -10.21 -34.42 0.99 3.54 21.15 2.69 0.00 +0 0 0 2 9 0.00 -34.42 1.00 2.97 19.56 2.68 0.00 +0 0 0 2 8 10.21 -34.42 0.99 0.82 27.75 2.49 0.02 +0 0 0 2 7 20.42 -34.42 0.99 1.90 18.79 2.83 0.00 +0 0 0 2 6 30.63 -34.42 1.00 0.78 21.49 2.65 0.00 +0 0 0 2 5 40.84 -34.42 0.98 3.88 23.63 2.40 0.04 +0 0 0 2 4 51.05 -34.42 0.98 2.10 19.91 2.95 0.00 +0 0 0 2 3 61.26 -34.42 0.94 3.20 22.43 2.66 0.00 +0 0 0 2 2 71.47 -34.42 0.95 0.86 23.01 2.56 0.00 +0 0 0 2 1 81.68 -34.42 0.96 -0.52 27.31 2.40 0.04 +0 0 0 2 0 91.89 -34.42 0.95 1.97 23.15 2.75 0.00 +0 0 0 3 18 -91.89 -24.58 1.02 -0.68 27.00 2.76 0.00 +0 0 0 3 17 -81.68 -24.58 0.99 3.81 21.49 2.75 0.00 +0 0 0 3 16 -71.47 -24.58 1.01 1.51 14.78 3.04 0.00 +0 0 0 3 15 -61.26 -24.58 1.00 2.77 21.24 2.65 0.00 +0 0 0 3 14 -51.05 -24.58 0.98 4.55 26.29 2.26 0.08 +0 0 0 3 13 -40.84 -24.58 0.99 3.99 16.66 3.01 0.00 +0 0 0 3 12 -30.63 -24.58 1.00 2.71 22.63 2.78 0.00 +0 0 0 3 11 -20.42 -24.58 1.01 1.60 22.53 2.65 0.00 +0 0 0 3 10 -10.21 -24.58 1.00 2.54 21.92 2.61 0.00 +0 0 0 3 9 0.00 -24.58 0.98 4.18 19.75 2.89 0.00 +0 0 0 3 8 10.21 -24.58 0.99 5.25 26.22 2.31 0.05 +0 0 0 3 7 20.42 -24.58 1.02 1.31 26.61 2.68 0.00 +0 0 0 3 6 30.63 -24.58 1.01 4.77 25.72 2.59 0.00 +0 0 0 3 5 40.84 -24.58 1.02 2.53 22.06 2.74 0.00 +0 0 0 3 4 51.05 -24.58 1.02 1.18 22.70 2.60 0.02 +0 0 0 3 3 61.26 -24.58 1.03 -1.14 28.64 2.18 0.07 +0 0 0 3 2 71.47 -24.58 0.96 3.86 18.73 2.98 0.00 +0 0 0 3 1 81.68 -24.58 0.95 -1.23 25.46 2.70 0.00 +0 0 0 3 0 91.89 -24.58 0.92 4.73 18.40 2.71 0.00 +0 0 0 4 18 -91.89 -14.75 0.99 3.62 19.21 2.89 0.00 +0 0 0 4 17 -81.68 -14.75 1.00 1.70 25.76 2.58 0.03 +0 0 0 4 16 -71.47 -14.75 1.01 1.47 29.56 2.07 0.06 +0 0 0 4 15 -61.26 -14.75 1.00 2.12 19.68 2.88 0.00 +0 0 0 4 14 -51.05 -14.75 1.00 2.88 28.98 2.22 0.04 +0 0 0 4 13 -40.84 -14.75 1.02 -0.16 23.89 2.62 0.00 +0 0 0 4 12 -30.63 -14.75 1.00 3.10 25.43 2.53 0.00 +0 0 0 4 11 -20.42 -14.75 0.98 5.12 23.40 2.79 0.00 +0 0 0 4 10 -10.21 -14.75 1.01 2.53 24.41 2.76 0.00 +0 0 0 4 9 0.00 -14.75 1.01 2.76 22.34 2.77 0.03 +0 0 0 4 8 10.21 -14.75 1.00 4.37 23.43 2.96 0.00 +0 0 0 4 7 20.42 -14.75 1.03 1.41 20.35 2.84 0.00 +0 0 0 4 6 30.63 -14.75 1.03 2.30 19.85 2.89 0.00 +0 0 0 4 5 40.84 -14.75 1.06 0.17 26.75 2.30 0.08 +0 0 0 4 4 51.05 -14.75 1.05 3.29 16.88 3.21 0.00 +0 0 0 4 3 61.26 -14.75 1.07 0.87 26.14 2.16 0.11 +0 0 0 4 2 71.47 -14.75 1.06 2.16 17.18 3.45 0.06 +0 0 0 4 1 81.68 -14.75 1.02 2.63 23.16 3.76 0.05 +0 0 0 4 0 91.89 -14.75 0.93 3.35 15.87 3.21 0.00 +0 0 0 5 18 -91.89 -4.92 0.99 2.76 22.78 2.68 0.00 +0 0 0 5 17 -81.68 -4.92 1.00 2.38 24.10 2.49 0.03 +0 0 0 5 16 -71.47 -4.92 0.98 3.99 23.95 2.65 0.00 +0 0 0 5 15 -61.26 -4.92 0.99 3.74 25.25 2.23 0.05 +0 0 0 5 14 -51.05 -4.92 1.01 0.91 20.65 2.78 0.00 +0 0 0 5 13 -40.84 -4.92 0.99 3.65 22.16 2.65 0.00 +0 0 0 5 12 -30.63 -4.92 1.01 0.08 24.77 2.69 0.00 +0 0 0 5 11 -20.42 -4.92 1.01 0.74 18.36 2.85 0.00 +0 0 0 5 10 -10.21 -4.92 0.99 5.34 23.36 2.70 0.00 +0 0 0 5 9 0.00 -4.92 1.01 2.99 20.83 2.82 0.00 +0 0 0 5 8 10.21 -4.92 1.01 4.86 20.78 2.93 0.00 +0 0 0 5 7 20.42 -4.92 1.03 4.37 27.58 2.23 0.07 +0 0 0 5 6 30.63 -4.92 1.04 3.11 22.64 2.90 0.00 +0 0 0 5 5 40.84 -4.92 1.06 2.64 23.39 2.85 0.00 +0 0 0 5 4 51.05 -4.92 1.09 2.42 15.99 3.16 0.00 +0 0 0 5 3 61.26 -4.92 1.10 2.91 19.07 3.30 0.07 +0 0 0 5 2 71.47 -4.92 1.17 -0.86 26.47 2.09 0.15 +0 0 0 5 1 81.68 -4.92 1.22 1.14 31.73 1.85 0.19 +0 0 0 5 0 91.89 -4.92 1.21 1.22 27.15 3.88 0.42 +0 0 0 6 18 -91.89 4.92 0.99 2.76 22.78 2.68 0.00 +0 0 0 6 17 -81.68 4.92 1.00 2.38 24.10 2.49 0.03 +0 0 0 6 16 -71.47 4.92 0.98 3.99 23.95 2.65 0.00 +0 0 0 6 15 -61.26 4.92 0.99 3.74 25.25 2.23 0.05 +0 0 0 6 14 -51.05 4.92 1.01 0.91 20.65 2.78 0.00 +0 0 0 6 13 -40.84 4.92 0.99 3.65 22.16 2.65 0.00 +0 0 0 6 12 -30.63 4.92 1.01 0.08 24.77 2.69 0.00 +0 0 0 6 11 -20.42 4.92 1.01 0.74 18.36 2.85 0.00 +0 0 0 6 10 -10.21 4.92 0.99 5.34 23.36 2.70 0.00 +0 0 0 6 9 0.00 4.92 1.01 2.99 20.83 2.82 0.00 +0 0 0 6 8 10.21 4.92 1.01 4.86 20.78 2.93 0.00 +0 0 0 6 7 20.42 4.92 1.03 4.37 27.58 2.23 0.07 +0 0 0 6 6 30.63 4.92 1.04 3.11 22.64 2.90 0.00 +0 0 0 6 5 40.84 4.92 1.06 2.64 23.39 2.85 0.00 +0 0 0 6 4 51.05 4.92 1.09 2.42 15.99 3.16 0.00 +0 0 0 6 3 61.26 4.92 1.10 2.91 19.07 3.30 0.07 +0 0 0 6 2 71.47 4.92 1.17 -0.86 26.47 2.09 0.15 +0 0 0 6 1 81.68 4.92 1.22 1.14 31.73 1.85 0.19 +0 0 0 6 0 91.89 4.92 1.21 1.22 27.15 3.88 0.42 +0 0 0 7 18 -91.89 14.75 0.99 3.62 19.21 2.89 0.00 +0 0 0 7 17 -81.68 14.75 1.00 1.70 25.76 2.58 0.03 +0 0 0 7 16 -71.47 14.75 1.01 1.47 29.56 2.07 0.06 +0 0 0 7 15 -61.26 14.75 1.00 2.12 19.68 2.88 0.00 +0 0 0 7 14 -51.05 14.75 1.00 2.88 28.98 2.22 0.04 +0 0 0 7 13 -40.84 14.75 1.02 -0.16 23.89 2.62 0.00 +0 0 0 7 12 -30.63 14.75 1.00 3.10 25.43 2.53 0.00 +0 0 0 7 11 -20.42 14.75 0.98 5.12 23.40 2.79 0.00 +0 0 0 7 10 -10.21 14.75 1.01 2.53 24.41 2.76 0.00 +0 0 0 7 9 0.00 14.75 1.01 2.76 22.34 2.77 0.03 +0 0 0 7 8 10.21 14.75 1.00 4.37 23.43 2.96 0.00 +0 0 0 7 7 20.42 14.75 1.03 1.41 20.35 2.84 0.00 +0 0 0 7 6 30.63 14.75 1.03 2.30 19.85 2.89 0.00 +0 0 0 7 5 40.84 14.75 1.06 0.17 26.75 2.30 0.08 +0 0 0 7 4 51.05 14.75 1.05 3.29 16.88 3.21 0.00 +0 0 0 7 3 61.26 14.75 1.07 0.87 26.14 2.16 0.11 +0 0 0 7 2 71.47 14.75 1.06 2.16 17.18 3.45 0.06 +0 0 0 7 1 81.68 14.75 1.02 2.63 23.16 3.76 0.05 +0 0 0 7 0 91.89 14.75 0.93 3.35 15.87 3.21 0.00 +0 0 0 8 18 -91.89 24.58 1.02 -0.68 27.00 2.76 0.00 +0 0 0 8 17 -81.68 24.58 0.99 3.81 21.49 2.75 0.00 +0 0 0 8 16 -71.47 24.58 1.01 1.51 14.78 3.04 0.00 +0 0 0 8 15 -61.26 24.58 1.00 2.77 21.24 2.65 0.00 +0 0 0 8 14 -51.05 24.58 0.98 4.55 26.29 2.26 0.08 +0 0 0 8 13 -40.84 24.58 0.99 3.99 16.66 3.01 0.00 +0 0 0 8 12 -30.63 24.58 1.00 2.71 22.63 2.78 0.00 +0 0 0 8 11 -20.42 24.58 1.01 1.60 22.53 2.65 0.00 +0 0 0 8 10 -10.21 24.58 1.00 2.54 21.92 2.61 0.00 +0 0 0 8 9 0.00 24.58 0.98 4.18 19.75 2.89 0.00 +0 0 0 8 8 10.21 24.58 0.99 5.25 26.22 2.31 0.05 +0 0 0 8 7 20.42 24.58 1.02 1.31 26.61 2.68 0.00 +0 0 0 8 6 30.63 24.58 1.01 4.77 25.72 2.59 0.00 +0 0 0 8 5 40.84 24.58 1.02 2.53 22.06 2.74 0.00 +0 0 0 8 4 51.05 24.58 1.02 1.18 22.70 2.60 0.02 +0 0 0 8 3 61.26 24.58 1.03 -1.14 28.64 2.18 0.07 +0 0 0 8 2 71.47 24.58 0.96 3.86 18.73 2.98 0.00 +0 0 0 8 1 81.68 24.58 0.95 -1.23 25.46 2.70 0.00 +0 0 0 8 0 91.89 24.58 0.92 4.73 18.40 2.71 0.00 +0 0 0 9 18 -91.89 34.42 0.98 6.64 35.87 0.32 0.10 +0 0 0 9 17 -81.68 34.42 1.00 3.27 22.93 2.72 0.00 +0 0 0 9 16 -71.47 34.42 0.99 1.43 25.31 2.67 0.00 +0 0 0 9 15 -61.26 34.42 1.00 1.98 21.92 2.72 0.00 +0 0 0 9 14 -51.05 34.42 0.99 2.49 25.38 2.67 0.00 +0 0 0 9 13 -40.84 34.42 1.00 2.67 20.17 2.59 0.04 +0 0 0 9 12 -30.63 34.42 0.99 3.94 20.80 2.69 0.01 +0 0 0 9 11 -20.42 34.42 1.00 1.79 23.08 2.64 0.00 +0 0 0 9 10 -10.21 34.42 0.99 3.54 21.15 2.69 0.00 +0 0 0 9 9 0.00 34.42 1.00 2.97 19.56 2.68 0.00 +0 0 0 9 8 10.21 34.42 0.99 0.82 27.75 2.49 0.02 +0 0 0 9 7 20.42 34.42 0.99 1.90 18.79 2.83 0.00 +0 0 0 9 6 30.63 34.42 1.00 0.78 21.49 2.65 0.00 +0 0 0 9 5 40.84 34.42 0.98 3.88 23.63 2.40 0.04 +0 0 0 9 4 51.05 34.42 0.98 2.10 19.91 2.95 0.00 +0 0 0 9 3 61.26 34.42 0.94 3.20 22.43 2.66 0.00 +0 0 0 9 2 71.47 34.42 0.95 0.86 23.01 2.56 0.00 +0 0 0 9 1 81.68 34.42 0.96 -0.52 27.31 2.40 0.04 +0 0 0 9 0 91.89 34.42 0.95 1.97 23.15 2.75 0.00 +0 0 0 10 18 -91.89 44.25 1.00 3.96 24.36 2.67 0.00 +0 0 0 10 17 -81.68 44.25 1.00 2.32 25.39 2.47 0.00 +0 0 0 10 16 -71.47 44.25 1.01 1.80 19.19 2.95 0.00 +0 0 0 10 15 -61.26 44.25 1.00 2.25 18.34 2.85 0.00 +0 0 0 10 14 -51.05 44.25 0.99 4.80 22.42 2.65 0.00 +0 0 0 10 13 -40.84 44.25 1.02 -0.80 16.27 3.01 0.00 +0 0 0 10 12 -30.63 44.25 1.01 0.79 22.96 2.64 0.00 +0 0 0 10 11 -20.42 44.25 1.00 1.24 22.01 2.73 0.00 +0 0 0 10 10 -10.21 44.25 0.99 3.14 25.39 2.47 0.04 +0 0 0 10 9 0.00 44.25 0.97 5.67 21.98 2.65 0.00 +0 0 0 10 8 10.21 44.25 0.96 5.35 23.22 2.67 0.02 +0 0 0 10 7 20.42 44.25 0.99 -0.82 22.29 2.71 0.00 +0 0 0 10 6 30.63 44.25 0.95 5.61 21.18 2.67 0.00 +0 0 0 10 5 40.84 44.25 0.97 2.23 20.13 2.70 0.00 +0 0 0 10 4 51.05 44.25 0.95 1.44 24.43 2.70 0.00 +0 0 0 10 3 61.26 44.25 0.93 4.34 22.98 2.72 0.00 +0 0 0 10 2 71.47 44.25 0.95 2.44 23.97 2.77 0.00 +0 0 0 10 1 81.68 44.25 0.95 3.32 24.00 2.68 0.00 +0 0 0 10 0 91.89 44.25 0.94 3.13 17.71 2.88 0.00 +0 0 0 11 18 -91.89 54.08 1.00 2.17 27.47 2.19 0.07 +0 0 0 11 17 -81.68 54.08 1.00 2.43 16.38 2.72 0.00 +0 0 0 11 16 -71.47 54.08 0.99 3.87 19.87 2.78 0.00 +0 0 0 11 15 -61.26 54.08 1.06 -5.15 37.47 0.00 0.11 +0 0 0 11 14 -51.05 54.08 1.00 3.13 23.31 2.61 0.00 +0 0 0 11 13 -40.84 54.08 0.99 4.25 21.20 2.78 0.00 +0 0 0 11 12 -30.63 54.08 1.00 1.58 24.37 2.13 0.08 +0 0 0 11 11 -20.42 54.08 1.00 2.07 22.98 2.86 0.00 +0 0 0 11 10 -10.21 54.08 0.97 4.57 18.89 2.88 0.00 +0 0 0 11 9 0.00 54.08 1.00 1.55 27.46 2.48 0.00 +0 0 0 11 8 10.21 54.08 0.98 3.14 22.61 2.63 0.00 +0 0 0 11 7 20.42 54.08 0.95 3.81 16.63 2.72 0.00 +0 0 0 11 6 30.63 54.08 0.95 3.41 24.89 2.66 0.00 +0 0 0 11 5 40.84 54.08 0.94 2.12 24.16 2.35 0.05 +0 0 0 11 4 51.05 54.08 0.95 1.83 25.30 2.42 0.04 +0 0 0 11 3 61.26 54.08 0.95 1.71 23.72 2.65 0.00 +0 0 0 11 2 71.47 54.08 0.95 1.80 19.55 2.81 0.00 +0 0 0 11 1 81.68 54.08 0.93 4.14 24.07 2.46 0.05 +0 0 0 11 0 91.89 54.08 0.95 2.60 16.28 2.91 0.00 +0 0 1 0 18 -91.89 -54.08 1.00 2.17 27.47 2.19 0.07 +0 0 1 0 17 -81.68 -54.08 1.00 2.43 16.38 2.72 0.00 +0 0 1 0 16 -71.47 -54.08 0.99 3.87 19.87 2.78 0.00 +0 0 1 0 15 -61.26 -54.08 1.06 -5.15 37.47 0.00 0.11 +0 0 1 0 14 -51.05 -54.08 1.00 3.13 23.31 2.61 0.00 +0 0 1 0 13 -40.84 -54.08 0.99 4.25 21.20 2.78 0.00 +0 0 1 0 12 -30.63 -54.08 1.00 1.58 24.37 2.13 0.08 +0 0 1 0 11 -20.42 -54.08 1.00 2.07 22.98 2.86 0.00 +0 0 1 0 10 -10.21 -54.08 0.97 4.57 18.89 2.88 0.00 +0 0 1 0 9 0.00 -54.08 1.00 1.55 27.46 2.48 0.00 +0 0 1 0 8 10.21 -54.08 0.98 3.14 22.61 2.63 0.00 +0 0 1 0 7 20.42 -54.08 0.95 3.81 16.63 2.72 0.00 +0 0 1 0 6 30.63 -54.08 0.95 3.41 24.89 2.66 0.00 +0 0 1 0 5 40.84 -54.08 0.94 2.12 24.16 2.35 0.05 +0 0 1 0 4 51.05 -54.08 0.95 1.83 25.30 2.42 0.04 +0 0 1 0 3 61.26 -54.08 0.95 1.71 23.72 2.65 0.00 +0 0 1 0 2 71.47 -54.08 0.95 1.80 19.55 2.81 0.00 +0 0 1 0 1 81.68 -54.08 0.93 4.14 24.07 2.46 0.05 +0 0 1 0 0 91.89 -54.08 0.95 2.60 16.28 2.91 0.00 +0 0 1 1 18 -91.89 -44.25 1.00 3.96 24.36 2.67 0.00 +0 0 1 1 17 -81.68 -44.25 1.00 2.32 25.39 2.47 0.00 +0 0 1 1 16 -71.47 -44.25 1.01 1.80 19.19 2.95 0.00 +0 0 1 1 15 -61.26 -44.25 1.00 2.25 18.34 2.85 0.00 +0 0 1 1 14 -51.05 -44.25 0.99 4.80 22.42 2.65 0.00 +0 0 1 1 13 -40.84 -44.25 1.02 -0.80 16.27 3.01 0.00 +0 0 1 1 12 -30.63 -44.25 1.01 0.79 22.96 2.64 0.00 +0 0 1 1 11 -20.42 -44.25 1.00 1.24 22.01 2.73 0.00 +0 0 1 1 10 -10.21 -44.25 0.99 3.14 25.39 2.47 0.04 +0 0 1 1 9 0.00 -44.25 0.97 5.67 21.98 2.65 0.00 +0 0 1 1 8 10.21 -44.25 0.96 5.35 23.22 2.67 0.02 +0 0 1 1 7 20.42 -44.25 0.99 -0.82 22.29 2.71 0.00 +0 0 1 1 6 30.63 -44.25 0.95 5.61 21.18 2.67 0.00 +0 0 1 1 5 40.84 -44.25 0.97 2.23 20.13 2.70 0.00 +0 0 1 1 4 51.05 -44.25 0.95 1.44 24.43 2.70 0.00 +0 0 1 1 3 61.26 -44.25 0.93 4.34 22.98 2.72 0.00 +0 0 1 1 2 71.47 -44.25 0.95 2.44 23.97 2.77 0.00 +0 0 1 1 1 81.68 -44.25 0.95 3.32 24.00 2.68 0.00 +0 0 1 1 0 91.89 -44.25 0.94 3.13 17.71 2.88 0.00 +0 0 1 2 18 -91.89 -34.42 0.98 6.64 35.87 0.32 0.10 +0 0 1 2 17 -81.68 -34.42 1.00 3.27 22.93 2.72 0.00 +0 0 1 2 16 -71.47 -34.42 0.99 1.43 25.31 2.67 0.00 +0 0 1 2 15 -61.26 -34.42 1.00 1.98 21.92 2.72 0.00 +0 0 1 2 14 -51.05 -34.42 0.99 2.49 25.38 2.67 0.00 +0 0 1 2 13 -40.84 -34.42 1.00 2.67 20.17 2.59 0.04 +0 0 1 2 12 -30.63 -34.42 0.99 3.94 20.80 2.69 0.01 +0 0 1 2 11 -20.42 -34.42 1.00 1.79 23.08 2.64 0.00 +0 0 1 2 10 -10.21 -34.42 0.99 3.54 21.15 2.69 0.00 +0 0 1 2 9 0.00 -34.42 1.00 2.97 19.56 2.68 0.00 +0 0 1 2 8 10.21 -34.42 0.99 0.82 27.75 2.49 0.02 +0 0 1 2 7 20.42 -34.42 0.99 1.90 18.79 2.83 0.00 +0 0 1 2 6 30.63 -34.42 1.00 0.78 21.49 2.65 0.00 +0 0 1 2 5 40.84 -34.42 0.98 3.88 23.63 2.40 0.04 +0 0 1 2 4 51.05 -34.42 0.98 2.10 19.91 2.95 0.00 +0 0 1 2 3 61.26 -34.42 0.94 3.20 22.43 2.66 0.00 +0 0 1 2 2 71.47 -34.42 0.95 0.86 23.01 2.56 0.00 +0 0 1 2 1 81.68 -34.42 0.96 -0.52 27.31 2.40 0.04 +0 0 1 2 0 91.89 -34.42 0.95 1.97 23.15 2.75 0.00 +0 0 1 3 18 -91.89 -24.58 1.02 -0.68 27.00 2.76 0.00 +0 0 1 3 17 -81.68 -24.58 0.99 3.81 21.49 2.75 0.00 +0 0 1 3 16 -71.47 -24.58 1.01 1.51 14.78 3.04 0.00 +0 0 1 3 15 -61.26 -24.58 1.00 2.77 21.24 2.65 0.00 +0 0 1 3 14 -51.05 -24.58 0.98 4.55 26.29 2.26 0.08 +0 0 1 3 13 -40.84 -24.58 0.99 3.99 16.66 3.01 0.00 +0 0 1 3 12 -30.63 -24.58 1.00 2.71 22.63 2.78 0.00 +0 0 1 3 11 -20.42 -24.58 1.01 1.60 22.53 2.65 0.00 +0 0 1 3 10 -10.21 -24.58 1.00 2.54 21.92 2.61 0.00 +0 0 1 3 9 0.00 -24.58 0.98 4.18 19.75 2.89 0.00 +0 0 1 3 8 10.21 -24.58 0.99 5.25 26.22 2.31 0.05 +0 0 1 3 7 20.42 -24.58 1.02 1.31 26.61 2.68 0.00 +0 0 1 3 6 30.63 -24.58 1.01 4.77 25.72 2.59 0.00 +0 0 1 3 5 40.84 -24.58 1.02 2.53 22.06 2.74 0.00 +0 0 1 3 4 51.05 -24.58 1.02 1.18 22.70 2.60 0.02 +0 0 1 3 3 61.26 -24.58 1.03 -1.14 28.64 2.18 0.07 +0 0 1 3 2 71.47 -24.58 0.96 3.86 18.73 2.98 0.00 +0 0 1 3 1 81.68 -24.58 0.95 -1.23 25.46 2.70 0.00 +0 0 1 3 0 91.89 -24.58 0.92 4.73 18.40 2.71 0.00 +0 0 1 4 18 -91.89 -14.75 0.99 3.62 19.21 2.89 0.00 +0 0 1 4 17 -81.68 -14.75 1.00 1.70 25.76 2.58 0.03 +0 0 1 4 16 -71.47 -14.75 1.01 1.47 29.56 2.07 0.06 +0 0 1 4 15 -61.26 -14.75 1.00 2.12 19.68 2.88 0.00 +0 0 1 4 14 -51.05 -14.75 1.00 2.88 28.98 2.22 0.04 +0 0 1 4 13 -40.84 -14.75 1.02 -0.16 23.89 2.62 0.00 +0 0 1 4 12 -30.63 -14.75 1.00 3.10 25.43 2.53 0.00 +0 0 1 4 11 -20.42 -14.75 0.98 5.12 23.40 2.79 0.00 +0 0 1 4 10 -10.21 -14.75 1.01 2.53 24.41 2.76 0.00 +0 0 1 4 9 0.00 -14.75 1.01 2.76 22.34 2.77 0.03 +0 0 1 4 8 10.21 -14.75 1.00 4.37 23.43 2.96 0.00 +0 0 1 4 7 20.42 -14.75 1.03 1.41 20.35 2.84 0.00 +0 0 1 4 6 30.63 -14.75 1.03 2.30 19.85 2.89 0.00 +0 0 1 4 5 40.84 -14.75 1.06 0.17 26.75 2.30 0.08 +0 0 1 4 4 51.05 -14.75 1.05 3.29 16.88 3.21 0.00 +0 0 1 4 3 61.26 -14.75 1.07 0.87 26.14 2.16 0.11 +0 0 1 4 2 71.47 -14.75 1.06 2.16 17.18 3.45 0.06 +0 0 1 4 1 81.68 -14.75 1.02 2.63 23.16 3.76 0.05 +0 0 1 4 0 91.89 -14.75 0.93 3.35 15.87 3.21 0.00 +0 0 1 5 18 -91.89 -4.92 0.99 2.76 22.78 2.68 0.00 +0 0 1 5 17 -81.68 -4.92 1.00 2.38 24.10 2.49 0.03 +0 0 1 5 16 -71.47 -4.92 0.98 3.99 23.95 2.65 0.00 +0 0 1 5 15 -61.26 -4.92 0.99 3.74 25.25 2.23 0.05 +0 0 1 5 14 -51.05 -4.92 1.01 0.91 20.65 2.78 0.00 +0 0 1 5 13 -40.84 -4.92 0.99 3.65 22.16 2.65 0.00 +0 0 1 5 12 -30.63 -4.92 1.01 0.08 24.77 2.69 0.00 +0 0 1 5 11 -20.42 -4.92 1.01 0.74 18.36 2.85 0.00 +0 0 1 5 10 -10.21 -4.92 0.99 5.34 23.36 2.70 0.00 +0 0 1 5 9 0.00 -4.92 1.01 2.99 20.83 2.82 0.00 +0 0 1 5 8 10.21 -4.92 1.01 4.86 20.78 2.93 0.00 +0 0 1 5 7 20.42 -4.92 1.03 4.37 27.58 2.23 0.07 +0 0 1 5 6 30.63 -4.92 1.04 3.11 22.64 2.90 0.00 +0 0 1 5 5 40.84 -4.92 1.06 2.64 23.39 2.85 0.00 +0 0 1 5 4 51.05 -4.92 1.09 2.42 15.99 3.16 0.00 +0 0 1 5 3 61.26 -4.92 1.10 2.91 19.07 3.30 0.07 +0 0 1 5 2 71.47 -4.92 1.17 -0.86 26.47 2.09 0.15 +0 0 1 5 1 81.68 -4.92 1.22 1.14 31.73 1.85 0.19 +0 0 1 5 0 91.89 -4.92 1.21 1.22 27.15 3.88 0.42 +0 0 1 6 18 -91.89 4.92 0.99 2.76 22.78 2.68 0.00 +0 0 1 6 17 -81.68 4.92 1.00 2.38 24.10 2.49 0.03 +0 0 1 6 16 -71.47 4.92 0.98 3.99 23.95 2.65 0.00 +0 0 1 6 15 -61.26 4.92 0.99 3.74 25.25 2.23 0.05 +0 0 1 6 14 -51.05 4.92 1.01 0.91 20.65 2.78 0.00 +0 0 1 6 13 -40.84 4.92 0.99 3.65 22.16 2.65 0.00 +0 0 1 6 12 -30.63 4.92 1.01 0.08 24.77 2.69 0.00 +0 0 1 6 11 -20.42 4.92 1.01 0.74 18.36 2.85 0.00 +0 0 1 6 10 -10.21 4.92 0.99 5.34 23.36 2.70 0.00 +0 0 1 6 9 0.00 4.92 1.01 2.99 20.83 2.82 0.00 +0 0 1 6 8 10.21 4.92 1.01 4.86 20.78 2.93 0.00 +0 0 1 6 7 20.42 4.92 1.03 4.37 27.58 2.23 0.07 +0 0 1 6 6 30.63 4.92 1.04 3.11 22.64 2.90 0.00 +0 0 1 6 5 40.84 4.92 1.06 2.64 23.39 2.85 0.00 +0 0 1 6 4 51.05 4.92 1.09 2.42 15.99 3.16 0.00 +0 0 1 6 3 61.26 4.92 1.10 2.91 19.07 3.30 0.07 +0 0 1 6 2 71.47 4.92 1.17 -0.86 26.47 2.09 0.15 +0 0 1 6 1 81.68 4.92 1.22 1.14 31.73 1.85 0.19 +0 0 1 6 0 91.89 4.92 1.21 1.22 27.15 3.88 0.42 +0 0 1 7 18 -91.89 14.75 0.99 3.62 19.21 2.89 0.00 +0 0 1 7 17 -81.68 14.75 1.00 1.70 25.76 2.58 0.03 +0 0 1 7 16 -71.47 14.75 1.01 1.47 29.56 2.07 0.06 +0 0 1 7 15 -61.26 14.75 1.00 2.12 19.68 2.88 0.00 +0 0 1 7 14 -51.05 14.75 1.00 2.88 28.98 2.22 0.04 +0 0 1 7 13 -40.84 14.75 1.02 -0.16 23.89 2.62 0.00 +0 0 1 7 12 -30.63 14.75 1.00 3.10 25.43 2.53 0.00 +0 0 1 7 11 -20.42 14.75 0.98 5.12 23.40 2.79 0.00 +0 0 1 7 10 -10.21 14.75 1.01 2.53 24.41 2.76 0.00 +0 0 1 7 9 0.00 14.75 1.01 2.76 22.34 2.77 0.03 +0 0 1 7 8 10.21 14.75 1.00 4.37 23.43 2.96 0.00 +0 0 1 7 7 20.42 14.75 1.03 1.41 20.35 2.84 0.00 +0 0 1 7 6 30.63 14.75 1.03 2.30 19.85 2.89 0.00 +0 0 1 7 5 40.84 14.75 1.06 0.17 26.75 2.30 0.08 +0 0 1 7 4 51.05 14.75 1.05 3.29 16.88 3.21 0.00 +0 0 1 7 3 61.26 14.75 1.07 0.87 26.14 2.16 0.11 +0 0 1 7 2 71.47 14.75 1.06 2.16 17.18 3.45 0.06 +0 0 1 7 1 81.68 14.75 1.02 2.63 23.16 3.76 0.05 +0 0 1 7 0 91.89 14.75 0.93 3.35 15.87 3.21 0.00 +0 0 1 8 18 -91.89 24.58 1.02 -0.68 27.00 2.76 0.00 +0 0 1 8 17 -81.68 24.58 0.99 3.81 21.49 2.75 0.00 +0 0 1 8 16 -71.47 24.58 1.01 1.51 14.78 3.04 0.00 +0 0 1 8 15 -61.26 24.58 1.00 2.77 21.24 2.65 0.00 +0 0 1 8 14 -51.05 24.58 0.98 4.55 26.29 2.26 0.08 +0 0 1 8 13 -40.84 24.58 0.99 3.99 16.66 3.01 0.00 +0 0 1 8 12 -30.63 24.58 1.00 2.71 22.63 2.78 0.00 +0 0 1 8 11 -20.42 24.58 1.01 1.60 22.53 2.65 0.00 +0 0 1 8 10 -10.21 24.58 1.00 2.54 21.92 2.61 0.00 +0 0 1 8 9 0.00 24.58 0.98 4.18 19.75 2.89 0.00 +0 0 1 8 8 10.21 24.58 0.99 5.25 26.22 2.31 0.05 +0 0 1 8 7 20.42 24.58 1.02 1.31 26.61 2.68 0.00 +0 0 1 8 6 30.63 24.58 1.01 4.77 25.72 2.59 0.00 +0 0 1 8 5 40.84 24.58 1.02 2.53 22.06 2.74 0.00 +0 0 1 8 4 51.05 24.58 1.02 1.18 22.70 2.60 0.02 +0 0 1 8 3 61.26 24.58 1.03 -1.14 28.64 2.18 0.07 +0 0 1 8 2 71.47 24.58 0.96 3.86 18.73 2.98 0.00 +0 0 1 8 1 81.68 24.58 0.95 -1.23 25.46 2.70 0.00 +0 0 1 8 0 91.89 24.58 0.92 4.73 18.40 2.71 0.00 +0 0 1 9 18 -91.89 34.42 0.98 6.64 35.87 0.32 0.10 +0 0 1 9 17 -81.68 34.42 1.00 3.27 22.93 2.72 0.00 +0 0 1 9 16 -71.47 34.42 0.99 1.43 25.31 2.67 0.00 +0 0 1 9 15 -61.26 34.42 1.00 1.98 21.92 2.72 0.00 +0 0 1 9 14 -51.05 34.42 0.99 2.49 25.38 2.67 0.00 +0 0 1 9 13 -40.84 34.42 1.00 2.67 20.17 2.59 0.04 +0 0 1 9 12 -30.63 34.42 0.99 3.94 20.80 2.69 0.01 +0 0 1 9 11 -20.42 34.42 1.00 1.79 23.08 2.64 0.00 +0 0 1 9 10 -10.21 34.42 0.99 3.54 21.15 2.69 0.00 +0 0 1 9 9 0.00 34.42 1.00 2.97 19.56 2.68 0.00 +0 0 1 9 8 10.21 34.42 0.99 0.82 27.75 2.49 0.02 +0 0 1 9 7 20.42 34.42 0.99 1.90 18.79 2.83 0.00 +0 0 1 9 6 30.63 34.42 1.00 0.78 21.49 2.65 0.00 +0 0 1 9 5 40.84 34.42 0.98 3.88 23.63 2.40 0.04 +0 0 1 9 4 51.05 34.42 0.98 2.10 19.91 2.95 0.00 +0 0 1 9 3 61.26 34.42 0.94 3.20 22.43 2.66 0.00 +0 0 1 9 2 71.47 34.42 0.95 0.86 23.01 2.56 0.00 +0 0 1 9 1 81.68 34.42 0.96 -0.52 27.31 2.40 0.04 +0 0 1 9 0 91.89 34.42 0.95 1.97 23.15 2.75 0.00 +0 0 1 10 18 -91.89 44.25 1.00 3.96 24.36 2.67 0.00 +0 0 1 10 17 -81.68 44.25 1.00 2.32 25.39 2.47 0.00 +0 0 1 10 16 -71.47 44.25 1.01 1.80 19.19 2.95 0.00 +0 0 1 10 15 -61.26 44.25 1.00 2.25 18.34 2.85 0.00 +0 0 1 10 14 -51.05 44.25 0.99 4.80 22.42 2.65 0.00 +0 0 1 10 13 -40.84 44.25 1.02 -0.80 16.27 3.01 0.00 +0 0 1 10 12 -30.63 44.25 1.01 0.79 22.96 2.64 0.00 +0 0 1 10 11 -20.42 44.25 1.00 1.24 22.01 2.73 0.00 +0 0 1 10 10 -10.21 44.25 0.99 3.14 25.39 2.47 0.04 +0 0 1 10 9 0.00 44.25 0.97 5.67 21.98 2.65 0.00 +0 0 1 10 8 10.21 44.25 0.96 5.35 23.22 2.67 0.02 +0 0 1 10 7 20.42 44.25 0.99 -0.82 22.29 2.71 0.00 +0 0 1 10 6 30.63 44.25 0.95 5.61 21.18 2.67 0.00 +0 0 1 10 5 40.84 44.25 0.97 2.23 20.13 2.70 0.00 +0 0 1 10 4 51.05 44.25 0.95 1.44 24.43 2.70 0.00 +0 0 1 10 3 61.26 44.25 0.93 4.34 22.98 2.72 0.00 +0 0 1 10 2 71.47 44.25 0.95 2.44 23.97 2.77 0.00 +0 0 1 10 1 81.68 44.25 0.95 3.32 24.00 2.68 0.00 +0 0 1 10 0 91.89 44.25 0.94 3.13 17.71 2.88 0.00 +0 0 1 11 18 -91.89 54.08 1.00 2.17 27.47 2.19 0.07 +0 0 1 11 17 -81.68 54.08 1.00 2.43 16.38 2.72 0.00 +0 0 1 11 16 -71.47 54.08 0.99 3.87 19.87 2.78 0.00 +0 0 1 11 15 -61.26 54.08 1.06 -5.15 37.47 0.00 0.11 +0 0 1 11 14 -51.05 54.08 1.00 3.13 23.31 2.61 0.00 +0 0 1 11 13 -40.84 54.08 0.99 4.25 21.20 2.78 0.00 +0 0 1 11 12 -30.63 54.08 1.00 1.58 24.37 2.13 0.08 +0 0 1 11 11 -20.42 54.08 1.00 2.07 22.98 2.86 0.00 +0 0 1 11 10 -10.21 54.08 0.97 4.57 18.89 2.88 0.00 +0 0 1 11 9 0.00 54.08 1.00 1.55 27.46 2.48 0.00 +0 0 1 11 8 10.21 54.08 0.98 3.14 22.61 2.63 0.00 +0 0 1 11 7 20.42 54.08 0.95 3.81 16.63 2.72 0.00 +0 0 1 11 6 30.63 54.08 0.95 3.41 24.89 2.66 0.00 +0 0 1 11 5 40.84 54.08 0.94 2.12 24.16 2.35 0.05 +0 0 1 11 4 51.05 54.08 0.95 1.83 25.30 2.42 0.04 +0 0 1 11 3 61.26 54.08 0.95 1.71 23.72 2.65 0.00 +0 0 1 11 2 71.47 54.08 0.95 1.80 19.55 2.81 0.00 +0 0 1 11 1 81.68 54.08 0.93 4.14 24.07 2.46 0.05 +0 0 1 11 0 91.89 54.08 0.95 2.60 16.28 2.91 0.00 +0 1 0 0 18 -91.89 -54.08 1.00 2.17 27.47 2.19 0.07 +0 1 0 0 17 -81.68 -54.08 1.00 2.43 16.38 2.72 0.00 +0 1 0 0 16 -71.47 -54.08 0.99 3.87 19.87 2.78 0.00 +0 1 0 0 15 -61.26 -54.08 1.06 -5.15 37.47 0.00 0.11 +0 1 0 0 14 -51.05 -54.08 1.00 3.13 23.31 2.61 0.00 +0 1 0 0 13 -40.84 -54.08 0.99 4.25 21.20 2.78 0.00 +0 1 0 0 12 -30.63 -54.08 1.00 1.58 24.37 2.13 0.08 +0 1 0 0 11 -20.42 -54.08 1.00 2.07 22.98 2.86 0.00 +0 1 0 0 10 -10.21 -54.08 0.97 4.57 18.89 2.88 0.00 +0 1 0 0 9 0.00 -54.08 1.00 1.55 27.46 2.48 0.00 +0 1 0 0 8 10.21 -54.08 0.98 3.14 22.61 2.63 0.00 +0 1 0 0 7 20.42 -54.08 0.95 3.81 16.63 2.72 0.00 +0 1 0 0 6 30.63 -54.08 0.95 3.41 24.89 2.66 0.00 +0 1 0 0 5 40.84 -54.08 0.94 2.12 24.16 2.35 0.05 +0 1 0 0 4 51.05 -54.08 0.95 1.83 25.30 2.42 0.04 +0 1 0 0 3 61.26 -54.08 0.95 1.71 23.72 2.65 0.00 +0 1 0 0 2 71.47 -54.08 0.95 1.80 19.55 2.81 0.00 +0 1 0 0 1 81.68 -54.08 0.93 4.14 24.07 2.46 0.05 +0 1 0 0 0 91.89 -54.08 0.95 2.60 16.28 2.91 0.00 +0 1 0 1 18 -91.89 -44.25 1.00 3.96 24.36 2.67 0.00 +0 1 0 1 17 -81.68 -44.25 1.00 2.32 25.39 2.47 0.00 +0 1 0 1 16 -71.47 -44.25 1.01 1.80 19.19 2.95 0.00 +0 1 0 1 15 -61.26 -44.25 1.00 2.25 18.34 2.85 0.00 +0 1 0 1 14 -51.05 -44.25 0.99 4.80 22.42 2.65 0.00 +0 1 0 1 13 -40.84 -44.25 1.02 -0.80 16.27 3.01 0.00 +0 1 0 1 12 -30.63 -44.25 1.01 0.79 22.96 2.64 0.00 +0 1 0 1 11 -20.42 -44.25 1.00 1.24 22.01 2.73 0.00 +0 1 0 1 10 -10.21 -44.25 0.99 3.14 25.39 2.47 0.04 +0 1 0 1 9 0.00 -44.25 0.97 5.67 21.98 2.65 0.00 +0 1 0 1 8 10.21 -44.25 0.96 5.35 23.22 2.67 0.02 +0 1 0 1 7 20.42 -44.25 0.99 -0.82 22.29 2.71 0.00 +0 1 0 1 6 30.63 -44.25 0.95 5.61 21.18 2.67 0.00 +0 1 0 1 5 40.84 -44.25 0.97 2.23 20.13 2.70 0.00 +0 1 0 1 4 51.05 -44.25 0.95 1.44 24.43 2.70 0.00 +0 1 0 1 3 61.26 -44.25 0.93 4.34 22.98 2.72 0.00 +0 1 0 1 2 71.47 -44.25 0.95 2.44 23.97 2.77 0.00 +0 1 0 1 1 81.68 -44.25 0.95 3.32 24.00 2.68 0.00 +0 1 0 1 0 91.89 -44.25 0.94 3.13 17.71 2.88 0.00 +0 1 0 2 18 -91.89 -34.42 0.98 6.64 35.87 0.32 0.10 +0 1 0 2 17 -81.68 -34.42 1.00 3.27 22.93 2.72 0.00 +0 1 0 2 16 -71.47 -34.42 0.99 1.43 25.31 2.67 0.00 +0 1 0 2 15 -61.26 -34.42 1.00 1.98 21.92 2.72 0.00 +0 1 0 2 14 -51.05 -34.42 0.99 2.49 25.38 2.67 0.00 +0 1 0 2 13 -40.84 -34.42 1.00 2.67 20.17 2.59 0.04 +0 1 0 2 12 -30.63 -34.42 0.99 3.94 20.80 2.69 0.01 +0 1 0 2 11 -20.42 -34.42 1.00 1.79 23.08 2.64 0.00 +0 1 0 2 10 -10.21 -34.42 0.99 3.54 21.15 2.69 0.00 +0 1 0 2 9 0.00 -34.42 1.00 2.97 19.56 2.68 0.00 +0 1 0 2 8 10.21 -34.42 0.99 0.82 27.75 2.49 0.02 +0 1 0 2 7 20.42 -34.42 0.99 1.90 18.79 2.83 0.00 +0 1 0 2 6 30.63 -34.42 1.00 0.78 21.49 2.65 0.00 +0 1 0 2 5 40.84 -34.42 0.98 3.88 23.63 2.40 0.04 +0 1 0 2 4 51.05 -34.42 0.98 2.10 19.91 2.95 0.00 +0 1 0 2 3 61.26 -34.42 0.94 3.20 22.43 2.66 0.00 +0 1 0 2 2 71.47 -34.42 0.95 0.86 23.01 2.56 0.00 +0 1 0 2 1 81.68 -34.42 0.96 -0.52 27.31 2.40 0.04 +0 1 0 2 0 91.89 -34.42 0.95 1.97 23.15 2.75 0.00 +0 1 0 3 18 -91.89 -24.58 1.02 -0.68 27.00 2.76 0.00 +0 1 0 3 17 -81.68 -24.58 0.99 3.81 21.49 2.75 0.00 +0 1 0 3 16 -71.47 -24.58 1.01 1.51 14.78 3.04 0.00 +0 1 0 3 15 -61.26 -24.58 1.00 2.77 21.24 2.65 0.00 +0 1 0 3 14 -51.05 -24.58 0.98 4.55 26.29 2.26 0.08 +0 1 0 3 13 -40.84 -24.58 0.99 3.99 16.66 3.01 0.00 +0 1 0 3 12 -30.63 -24.58 1.00 2.71 22.63 2.78 0.00 +0 1 0 3 11 -20.42 -24.58 1.01 1.60 22.53 2.65 0.00 +0 1 0 3 10 -10.21 -24.58 1.00 2.54 21.92 2.61 0.00 +0 1 0 3 9 0.00 -24.58 0.98 4.18 19.75 2.89 0.00 +0 1 0 3 8 10.21 -24.58 0.99 5.25 26.22 2.31 0.05 +0 1 0 3 7 20.42 -24.58 1.02 1.31 26.61 2.68 0.00 +0 1 0 3 6 30.63 -24.58 1.01 4.77 25.72 2.59 0.00 +0 1 0 3 5 40.84 -24.58 1.02 2.53 22.06 2.74 0.00 +0 1 0 3 4 51.05 -24.58 1.02 1.18 22.70 2.60 0.02 +0 1 0 3 3 61.26 -24.58 1.03 -1.14 28.64 2.18 0.07 +0 1 0 3 2 71.47 -24.58 0.96 3.86 18.73 2.98 0.00 +0 1 0 3 1 81.68 -24.58 0.95 -1.23 25.46 2.70 0.00 +0 1 0 3 0 91.89 -24.58 0.92 4.73 18.40 2.71 0.00 +0 1 0 4 18 -91.89 -14.75 0.99 3.62 19.21 2.89 0.00 +0 1 0 4 17 -81.68 -14.75 1.00 1.70 25.76 2.58 0.03 +0 1 0 4 16 -71.47 -14.75 1.01 1.47 29.56 2.07 0.06 +0 1 0 4 15 -61.26 -14.75 1.00 2.12 19.68 2.88 0.00 +0 1 0 4 14 -51.05 -14.75 1.00 2.88 28.98 2.22 0.04 +0 1 0 4 13 -40.84 -14.75 1.02 -0.16 23.89 2.62 0.00 +0 1 0 4 12 -30.63 -14.75 1.00 3.10 25.43 2.53 0.00 +0 1 0 4 11 -20.42 -14.75 0.98 5.12 23.40 2.79 0.00 +0 1 0 4 10 -10.21 -14.75 1.01 2.53 24.41 2.76 0.00 +0 1 0 4 9 0.00 -14.75 1.01 2.76 22.34 2.77 0.03 +0 1 0 4 8 10.21 -14.75 1.00 4.37 23.43 2.96 0.00 +0 1 0 4 7 20.42 -14.75 1.03 1.41 20.35 2.84 0.00 +0 1 0 4 6 30.63 -14.75 1.03 2.30 19.85 2.89 0.00 +0 1 0 4 5 40.84 -14.75 1.06 0.17 26.75 2.30 0.08 +0 1 0 4 4 51.05 -14.75 1.05 3.29 16.88 3.21 0.00 +0 1 0 4 3 61.26 -14.75 1.07 0.87 26.14 2.16 0.11 +0 1 0 4 2 71.47 -14.75 1.06 2.16 17.18 3.45 0.06 +0 1 0 4 1 81.68 -14.75 1.02 2.63 23.16 3.76 0.05 +0 1 0 4 0 91.89 -14.75 0.93 3.35 15.87 3.21 0.00 +0 1 0 5 18 -91.89 -4.92 0.99 2.76 22.78 2.68 0.00 +0 1 0 5 17 -81.68 -4.92 1.00 2.38 24.10 2.49 0.03 +0 1 0 5 16 -71.47 -4.92 0.98 3.99 23.95 2.65 0.00 +0 1 0 5 15 -61.26 -4.92 0.99 3.74 25.25 2.23 0.05 +0 1 0 5 14 -51.05 -4.92 1.01 0.91 20.65 2.78 0.00 +0 1 0 5 13 -40.84 -4.92 0.99 3.65 22.16 2.65 0.00 +0 1 0 5 12 -30.63 -4.92 1.01 0.08 24.77 2.69 0.00 +0 1 0 5 11 -20.42 -4.92 1.01 0.74 18.36 2.85 0.00 +0 1 0 5 10 -10.21 -4.92 0.99 5.34 23.36 2.70 0.00 +0 1 0 5 9 0.00 -4.92 1.01 2.99 20.83 2.82 0.00 +0 1 0 5 8 10.21 -4.92 1.01 4.86 20.78 2.93 0.00 +0 1 0 5 7 20.42 -4.92 1.03 4.37 27.58 2.23 0.07 +0 1 0 5 6 30.63 -4.92 1.04 3.11 22.64 2.90 0.00 +0 1 0 5 5 40.84 -4.92 1.06 2.64 23.39 2.85 0.00 +0 1 0 5 4 51.05 -4.92 1.09 2.42 15.99 3.16 0.00 +0 1 0 5 3 61.26 -4.92 1.10 2.91 19.07 3.30 0.07 +0 1 0 5 2 71.47 -4.92 1.17 -0.86 26.47 2.09 0.15 +0 1 0 5 1 81.68 -4.92 1.22 1.14 31.73 1.85 0.19 +0 1 0 5 0 91.89 -4.92 1.21 1.22 27.15 3.88 0.42 +0 1 0 6 18 -91.89 4.92 0.99 2.76 22.78 2.68 0.00 +0 1 0 6 17 -81.68 4.92 1.00 2.38 24.10 2.49 0.03 +0 1 0 6 16 -71.47 4.92 0.98 3.99 23.95 2.65 0.00 +0 1 0 6 15 -61.26 4.92 0.99 3.74 25.25 2.23 0.05 +0 1 0 6 14 -51.05 4.92 1.01 0.91 20.65 2.78 0.00 +0 1 0 6 13 -40.84 4.92 0.99 3.65 22.16 2.65 0.00 +0 1 0 6 12 -30.63 4.92 1.01 0.08 24.77 2.69 0.00 +0 1 0 6 11 -20.42 4.92 1.01 0.74 18.36 2.85 0.00 +0 1 0 6 10 -10.21 4.92 0.99 5.34 23.36 2.70 0.00 +0 1 0 6 9 0.00 4.92 1.01 2.99 20.83 2.82 0.00 +0 1 0 6 8 10.21 4.92 1.01 4.86 20.78 2.93 0.00 +0 1 0 6 7 20.42 4.92 1.03 4.37 27.58 2.23 0.07 +0 1 0 6 6 30.63 4.92 1.04 3.11 22.64 2.90 0.00 +0 1 0 6 5 40.84 4.92 1.06 2.64 23.39 2.85 0.00 +0 1 0 6 4 51.05 4.92 1.09 2.42 15.99 3.16 0.00 +0 1 0 6 3 61.26 4.92 1.10 2.91 19.07 3.30 0.07 +0 1 0 6 2 71.47 4.92 1.17 -0.86 26.47 2.09 0.15 +0 1 0 6 1 81.68 4.92 1.22 1.14 31.73 1.85 0.19 +0 1 0 6 0 91.89 4.92 1.21 1.22 27.15 3.88 0.42 +0 1 0 7 18 -91.89 14.75 0.99 3.62 19.21 2.89 0.00 +0 1 0 7 17 -81.68 14.75 1.00 1.70 25.76 2.58 0.03 +0 1 0 7 16 -71.47 14.75 1.01 1.47 29.56 2.07 0.06 +0 1 0 7 15 -61.26 14.75 1.00 2.12 19.68 2.88 0.00 +0 1 0 7 14 -51.05 14.75 1.00 2.88 28.98 2.22 0.04 +0 1 0 7 13 -40.84 14.75 1.02 -0.16 23.89 2.62 0.00 +0 1 0 7 12 -30.63 14.75 1.00 3.10 25.43 2.53 0.00 +0 1 0 7 11 -20.42 14.75 0.98 5.12 23.40 2.79 0.00 +0 1 0 7 10 -10.21 14.75 1.01 2.53 24.41 2.76 0.00 +0 1 0 7 9 0.00 14.75 1.01 2.76 22.34 2.77 0.03 +0 1 0 7 8 10.21 14.75 1.00 4.37 23.43 2.96 0.00 +0 1 0 7 7 20.42 14.75 1.03 1.41 20.35 2.84 0.00 +0 1 0 7 6 30.63 14.75 1.03 2.30 19.85 2.89 0.00 +0 1 0 7 5 40.84 14.75 1.06 0.17 26.75 2.30 0.08 +0 1 0 7 4 51.05 14.75 1.05 3.29 16.88 3.21 0.00 +0 1 0 7 3 61.26 14.75 1.07 0.87 26.14 2.16 0.11 +0 1 0 7 2 71.47 14.75 1.06 2.16 17.18 3.45 0.06 +0 1 0 7 1 81.68 14.75 1.02 2.63 23.16 3.76 0.05 +0 1 0 7 0 91.89 14.75 0.93 3.35 15.87 3.21 0.00 +0 1 0 8 18 -91.89 24.58 1.02 -0.68 27.00 2.76 0.00 +0 1 0 8 17 -81.68 24.58 0.99 3.81 21.49 2.75 0.00 +0 1 0 8 16 -71.47 24.58 1.01 1.51 14.78 3.04 0.00 +0 1 0 8 15 -61.26 24.58 1.00 2.77 21.24 2.65 0.00 +0 1 0 8 14 -51.05 24.58 0.98 4.55 26.29 2.26 0.08 +0 1 0 8 13 -40.84 24.58 0.99 3.99 16.66 3.01 0.00 +0 1 0 8 12 -30.63 24.58 1.00 2.71 22.63 2.78 0.00 +0 1 0 8 11 -20.42 24.58 1.01 1.60 22.53 2.65 0.00 +0 1 0 8 10 -10.21 24.58 1.00 2.54 21.92 2.61 0.00 +0 1 0 8 9 0.00 24.58 0.98 4.18 19.75 2.89 0.00 +0 1 0 8 8 10.21 24.58 0.99 5.25 26.22 2.31 0.05 +0 1 0 8 7 20.42 24.58 1.02 1.31 26.61 2.68 0.00 +0 1 0 8 6 30.63 24.58 1.01 4.77 25.72 2.59 0.00 +0 1 0 8 5 40.84 24.58 1.02 2.53 22.06 2.74 0.00 +0 1 0 8 4 51.05 24.58 1.02 1.18 22.70 2.60 0.02 +0 1 0 8 3 61.26 24.58 1.03 -1.14 28.64 2.18 0.07 +0 1 0 8 2 71.47 24.58 0.96 3.86 18.73 2.98 0.00 +0 1 0 8 1 81.68 24.58 0.95 -1.23 25.46 2.70 0.00 +0 1 0 8 0 91.89 24.58 0.92 4.73 18.40 2.71 0.00 +0 1 0 9 18 -91.89 34.42 0.98 6.64 35.87 0.32 0.10 +0 1 0 9 17 -81.68 34.42 1.00 3.27 22.93 2.72 0.00 +0 1 0 9 16 -71.47 34.42 0.99 1.43 25.31 2.67 0.00 +0 1 0 9 15 -61.26 34.42 1.00 1.98 21.92 2.72 0.00 +0 1 0 9 14 -51.05 34.42 0.99 2.49 25.38 2.67 0.00 +0 1 0 9 13 -40.84 34.42 1.00 2.67 20.17 2.59 0.04 +0 1 0 9 12 -30.63 34.42 0.99 3.94 20.80 2.69 0.01 +0 1 0 9 11 -20.42 34.42 1.00 1.79 23.08 2.64 0.00 +0 1 0 9 10 -10.21 34.42 0.99 3.54 21.15 2.69 0.00 +0 1 0 9 9 0.00 34.42 1.00 2.97 19.56 2.68 0.00 +0 1 0 9 8 10.21 34.42 0.99 0.82 27.75 2.49 0.02 +0 1 0 9 7 20.42 34.42 0.99 1.90 18.79 2.83 0.00 +0 1 0 9 6 30.63 34.42 1.00 0.78 21.49 2.65 0.00 +0 1 0 9 5 40.84 34.42 0.98 3.88 23.63 2.40 0.04 +0 1 0 9 4 51.05 34.42 0.98 2.10 19.91 2.95 0.00 +0 1 0 9 3 61.26 34.42 0.94 3.20 22.43 2.66 0.00 +0 1 0 9 2 71.47 34.42 0.95 0.86 23.01 2.56 0.00 +0 1 0 9 1 81.68 34.42 0.96 -0.52 27.31 2.40 0.04 +0 1 0 9 0 91.89 34.42 0.95 1.97 23.15 2.75 0.00 +0 1 0 10 18 -91.89 44.25 1.00 3.96 24.36 2.67 0.00 +0 1 0 10 17 -81.68 44.25 1.00 2.32 25.39 2.47 0.00 +0 1 0 10 16 -71.47 44.25 1.01 1.80 19.19 2.95 0.00 +0 1 0 10 15 -61.26 44.25 1.00 2.25 18.34 2.85 0.00 +0 1 0 10 14 -51.05 44.25 0.99 4.80 22.42 2.65 0.00 +0 1 0 10 13 -40.84 44.25 1.02 -0.80 16.27 3.01 0.00 +0 1 0 10 12 -30.63 44.25 1.01 0.79 22.96 2.64 0.00 +0 1 0 10 11 -20.42 44.25 1.00 1.24 22.01 2.73 0.00 +0 1 0 10 10 -10.21 44.25 0.99 3.14 25.39 2.47 0.04 +0 1 0 10 9 0.00 44.25 0.97 5.67 21.98 2.65 0.00 +0 1 0 10 8 10.21 44.25 0.96 5.35 23.22 2.67 0.02 +0 1 0 10 7 20.42 44.25 0.99 -0.82 22.29 2.71 0.00 +0 1 0 10 6 30.63 44.25 0.95 5.61 21.18 2.67 0.00 +0 1 0 10 5 40.84 44.25 0.97 2.23 20.13 2.70 0.00 +0 1 0 10 4 51.05 44.25 0.95 1.44 24.43 2.70 0.00 +0 1 0 10 3 61.26 44.25 0.93 4.34 22.98 2.72 0.00 +0 1 0 10 2 71.47 44.25 0.95 2.44 23.97 2.77 0.00 +0 1 0 10 1 81.68 44.25 0.95 3.32 24.00 2.68 0.00 +0 1 0 10 0 91.89 44.25 0.94 3.13 17.71 2.88 0.00 +0 1 0 11 18 -91.89 54.08 1.00 2.17 27.47 2.19 0.07 +0 1 0 11 17 -81.68 54.08 1.00 2.43 16.38 2.72 0.00 +0 1 0 11 16 -71.47 54.08 0.99 3.87 19.87 2.78 0.00 +0 1 0 11 15 -61.26 54.08 1.06 -5.15 37.47 0.00 0.11 +0 1 0 11 14 -51.05 54.08 1.00 3.13 23.31 2.61 0.00 +0 1 0 11 13 -40.84 54.08 0.99 4.25 21.20 2.78 0.00 +0 1 0 11 12 -30.63 54.08 1.00 1.58 24.37 2.13 0.08 +0 1 0 11 11 -20.42 54.08 1.00 2.07 22.98 2.86 0.00 +0 1 0 11 10 -10.21 54.08 0.97 4.57 18.89 2.88 0.00 +0 1 0 11 9 0.00 54.08 1.00 1.55 27.46 2.48 0.00 +0 1 0 11 8 10.21 54.08 0.98 3.14 22.61 2.63 0.00 +0 1 0 11 7 20.42 54.08 0.95 3.81 16.63 2.72 0.00 +0 1 0 11 6 30.63 54.08 0.95 3.41 24.89 2.66 0.00 +0 1 0 11 5 40.84 54.08 0.94 2.12 24.16 2.35 0.05 +0 1 0 11 4 51.05 54.08 0.95 1.83 25.30 2.42 0.04 +0 1 0 11 3 61.26 54.08 0.95 1.71 23.72 2.65 0.00 +0 1 0 11 2 71.47 54.08 0.95 1.80 19.55 2.81 0.00 +0 1 0 11 1 81.68 54.08 0.93 4.14 24.07 2.46 0.05 +0 1 0 11 0 91.89 54.08 0.95 2.60 16.28 2.91 0.00 +0 1 1 0 18 -91.89 -54.08 1.00 2.17 27.47 2.19 0.07 +0 1 1 0 17 -81.68 -54.08 1.00 2.43 16.38 2.72 0.00 +0 1 1 0 16 -71.47 -54.08 0.99 3.87 19.87 2.78 0.00 +0 1 1 0 15 -61.26 -54.08 1.06 -5.15 37.47 0.00 0.11 +0 1 1 0 14 -51.05 -54.08 1.00 3.13 23.31 2.61 0.00 +0 1 1 0 13 -40.84 -54.08 0.99 4.25 21.20 2.78 0.00 +0 1 1 0 12 -30.63 -54.08 1.00 1.58 24.37 2.13 0.08 +0 1 1 0 11 -20.42 -54.08 1.00 2.07 22.98 2.86 0.00 +0 1 1 0 10 -10.21 -54.08 0.97 4.57 18.89 2.88 0.00 +0 1 1 0 9 0.00 -54.08 1.00 1.55 27.46 2.48 0.00 +0 1 1 0 8 10.21 -54.08 0.98 3.14 22.61 2.63 0.00 +0 1 1 0 7 20.42 -54.08 0.95 3.81 16.63 2.72 0.00 +0 1 1 0 6 30.63 -54.08 0.95 3.41 24.89 2.66 0.00 +0 1 1 0 5 40.84 -54.08 0.94 2.12 24.16 2.35 0.05 +0 1 1 0 4 51.05 -54.08 0.95 1.83 25.30 2.42 0.04 +0 1 1 0 3 61.26 -54.08 0.95 1.71 23.72 2.65 0.00 +0 1 1 0 2 71.47 -54.08 0.95 1.80 19.55 2.81 0.00 +0 1 1 0 1 81.68 -54.08 0.93 4.14 24.07 2.46 0.05 +0 1 1 0 0 91.89 -54.08 0.95 2.60 16.28 2.91 0.00 +0 1 1 1 18 -91.89 -44.25 1.00 3.96 24.36 2.67 0.00 +0 1 1 1 17 -81.68 -44.25 1.00 2.32 25.39 2.47 0.00 +0 1 1 1 16 -71.47 -44.25 1.01 1.80 19.19 2.95 0.00 +0 1 1 1 15 -61.26 -44.25 1.00 2.25 18.34 2.85 0.00 +0 1 1 1 14 -51.05 -44.25 0.99 4.80 22.42 2.65 0.00 +0 1 1 1 13 -40.84 -44.25 1.02 -0.80 16.27 3.01 0.00 +0 1 1 1 12 -30.63 -44.25 1.01 0.79 22.96 2.64 0.00 +0 1 1 1 11 -20.42 -44.25 1.00 1.24 22.01 2.73 0.00 +0 1 1 1 10 -10.21 -44.25 0.99 3.14 25.39 2.47 0.04 +0 1 1 1 9 0.00 -44.25 0.97 5.67 21.98 2.65 0.00 +0 1 1 1 8 10.21 -44.25 0.96 5.35 23.22 2.67 0.02 +0 1 1 1 7 20.42 -44.25 0.99 -0.82 22.29 2.71 0.00 +0 1 1 1 6 30.63 -44.25 0.95 5.61 21.18 2.67 0.00 +0 1 1 1 5 40.84 -44.25 0.97 2.23 20.13 2.70 0.00 +0 1 1 1 4 51.05 -44.25 0.95 1.44 24.43 2.70 0.00 +0 1 1 1 3 61.26 -44.25 0.93 4.34 22.98 2.72 0.00 +0 1 1 1 2 71.47 -44.25 0.95 2.44 23.97 2.77 0.00 +0 1 1 1 1 81.68 -44.25 0.95 3.32 24.00 2.68 0.00 +0 1 1 1 0 91.89 -44.25 0.94 3.13 17.71 2.88 0.00 +0 1 1 2 18 -91.89 -34.42 0.98 6.64 35.87 0.32 0.10 +0 1 1 2 17 -81.68 -34.42 1.00 3.27 22.93 2.72 0.00 +0 1 1 2 16 -71.47 -34.42 0.99 1.43 25.31 2.67 0.00 +0 1 1 2 15 -61.26 -34.42 1.00 1.98 21.92 2.72 0.00 +0 1 1 2 14 -51.05 -34.42 0.99 2.49 25.38 2.67 0.00 +0 1 1 2 13 -40.84 -34.42 1.00 2.67 20.17 2.59 0.04 +0 1 1 2 12 -30.63 -34.42 0.99 3.94 20.80 2.69 0.01 +0 1 1 2 11 -20.42 -34.42 1.00 1.79 23.08 2.64 0.00 +0 1 1 2 10 -10.21 -34.42 0.99 3.54 21.15 2.69 0.00 +0 1 1 2 9 0.00 -34.42 1.00 2.97 19.56 2.68 0.00 +0 1 1 2 8 10.21 -34.42 0.99 0.82 27.75 2.49 0.02 +0 1 1 2 7 20.42 -34.42 0.99 1.90 18.79 2.83 0.00 +0 1 1 2 6 30.63 -34.42 1.00 0.78 21.49 2.65 0.00 +0 1 1 2 5 40.84 -34.42 0.98 3.88 23.63 2.40 0.04 +0 1 1 2 4 51.05 -34.42 0.98 2.10 19.91 2.95 0.00 +0 1 1 2 3 61.26 -34.42 0.94 3.20 22.43 2.66 0.00 +0 1 1 2 2 71.47 -34.42 0.95 0.86 23.01 2.56 0.00 +0 1 1 2 1 81.68 -34.42 0.96 -0.52 27.31 2.40 0.04 +0 1 1 2 0 91.89 -34.42 0.95 1.97 23.15 2.75 0.00 +0 1 1 3 18 -91.89 -24.58 1.02 -0.68 27.00 2.76 0.00 +0 1 1 3 17 -81.68 -24.58 0.99 3.81 21.49 2.75 0.00 +0 1 1 3 16 -71.47 -24.58 1.01 1.51 14.78 3.04 0.00 +0 1 1 3 15 -61.26 -24.58 1.00 2.77 21.24 2.65 0.00 +0 1 1 3 14 -51.05 -24.58 0.98 4.55 26.29 2.26 0.08 +0 1 1 3 13 -40.84 -24.58 0.99 3.99 16.66 3.01 0.00 +0 1 1 3 12 -30.63 -24.58 1.00 2.71 22.63 2.78 0.00 +0 1 1 3 11 -20.42 -24.58 1.01 1.60 22.53 2.65 0.00 +0 1 1 3 10 -10.21 -24.58 1.00 2.54 21.92 2.61 0.00 +0 1 1 3 9 0.00 -24.58 0.98 4.18 19.75 2.89 0.00 +0 1 1 3 8 10.21 -24.58 0.99 5.25 26.22 2.31 0.05 +0 1 1 3 7 20.42 -24.58 1.02 1.31 26.61 2.68 0.00 +0 1 1 3 6 30.63 -24.58 1.01 4.77 25.72 2.59 0.00 +0 1 1 3 5 40.84 -24.58 1.02 2.53 22.06 2.74 0.00 +0 1 1 3 4 51.05 -24.58 1.02 1.18 22.70 2.60 0.02 +0 1 1 3 3 61.26 -24.58 1.03 -1.14 28.64 2.18 0.07 +0 1 1 3 2 71.47 -24.58 0.96 3.86 18.73 2.98 0.00 +0 1 1 3 1 81.68 -24.58 0.95 -1.23 25.46 2.70 0.00 +0 1 1 3 0 91.89 -24.58 0.92 4.73 18.40 2.71 0.00 +0 1 1 4 18 -91.89 -14.75 0.99 3.62 19.21 2.89 0.00 +0 1 1 4 17 -81.68 -14.75 1.00 1.70 25.76 2.58 0.03 +0 1 1 4 16 -71.47 -14.75 1.01 1.47 29.56 2.07 0.06 +0 1 1 4 15 -61.26 -14.75 1.00 2.12 19.68 2.88 0.00 +0 1 1 4 14 -51.05 -14.75 1.00 2.88 28.98 2.22 0.04 +0 1 1 4 13 -40.84 -14.75 1.02 -0.16 23.89 2.62 0.00 +0 1 1 4 12 -30.63 -14.75 1.00 3.10 25.43 2.53 0.00 +0 1 1 4 11 -20.42 -14.75 0.98 5.12 23.40 2.79 0.00 +0 1 1 4 10 -10.21 -14.75 1.01 2.53 24.41 2.76 0.00 +0 1 1 4 9 0.00 -14.75 1.01 2.76 22.34 2.77 0.03 +0 1 1 4 8 10.21 -14.75 1.00 4.37 23.43 2.96 0.00 +0 1 1 4 7 20.42 -14.75 1.03 1.41 20.35 2.84 0.00 +0 1 1 4 6 30.63 -14.75 1.03 2.30 19.85 2.89 0.00 +0 1 1 4 5 40.84 -14.75 1.06 0.17 26.75 2.30 0.08 +0 1 1 4 4 51.05 -14.75 1.05 3.29 16.88 3.21 0.00 +0 1 1 4 3 61.26 -14.75 1.07 0.87 26.14 2.16 0.11 +0 1 1 4 2 71.47 -14.75 1.06 2.16 17.18 3.45 0.06 +0 1 1 4 1 81.68 -14.75 1.02 2.63 23.16 3.76 0.05 +0 1 1 4 0 91.89 -14.75 0.93 3.35 15.87 3.21 0.00 +0 1 1 5 18 -91.89 -4.92 0.99 2.76 22.78 2.68 0.00 +0 1 1 5 17 -81.68 -4.92 1.00 2.38 24.10 2.49 0.03 +0 1 1 5 16 -71.47 -4.92 0.98 3.99 23.95 2.65 0.00 +0 1 1 5 15 -61.26 -4.92 0.99 3.74 25.25 2.23 0.05 +0 1 1 5 14 -51.05 -4.92 1.01 0.91 20.65 2.78 0.00 +0 1 1 5 13 -40.84 -4.92 0.99 3.65 22.16 2.65 0.00 +0 1 1 5 12 -30.63 -4.92 1.01 0.08 24.77 2.69 0.00 +0 1 1 5 11 -20.42 -4.92 1.01 0.74 18.36 2.85 0.00 +0 1 1 5 10 -10.21 -4.92 0.99 5.34 23.36 2.70 0.00 +0 1 1 5 9 0.00 -4.92 1.01 2.99 20.83 2.82 0.00 +0 1 1 5 8 10.21 -4.92 1.01 4.86 20.78 2.93 0.00 +0 1 1 5 7 20.42 -4.92 1.03 4.37 27.58 2.23 0.07 +0 1 1 5 6 30.63 -4.92 1.04 3.11 22.64 2.90 0.00 +0 1 1 5 5 40.84 -4.92 1.06 2.64 23.39 2.85 0.00 +0 1 1 5 4 51.05 -4.92 1.09 2.42 15.99 3.16 0.00 +0 1 1 5 3 61.26 -4.92 1.10 2.91 19.07 3.30 0.07 +0 1 1 5 2 71.47 -4.92 1.17 -0.86 26.47 2.09 0.15 +0 1 1 5 1 81.68 -4.92 1.22 1.14 31.73 1.85 0.19 +0 1 1 5 0 91.89 -4.92 1.21 1.22 27.15 3.88 0.42 +0 1 1 6 18 -91.89 4.92 0.99 2.76 22.78 2.68 0.00 +0 1 1 6 17 -81.68 4.92 1.00 2.38 24.10 2.49 0.03 +0 1 1 6 16 -71.47 4.92 0.98 3.99 23.95 2.65 0.00 +0 1 1 6 15 -61.26 4.92 0.99 3.74 25.25 2.23 0.05 +0 1 1 6 14 -51.05 4.92 1.01 0.91 20.65 2.78 0.00 +0 1 1 6 13 -40.84 4.92 0.99 3.65 22.16 2.65 0.00 +0 1 1 6 12 -30.63 4.92 1.01 0.08 24.77 2.69 0.00 +0 1 1 6 11 -20.42 4.92 1.01 0.74 18.36 2.85 0.00 +0 1 1 6 10 -10.21 4.92 0.99 5.34 23.36 2.70 0.00 +0 1 1 6 9 0.00 4.92 1.01 2.99 20.83 2.82 0.00 +0 1 1 6 8 10.21 4.92 1.01 4.86 20.78 2.93 0.00 +0 1 1 6 7 20.42 4.92 1.03 4.37 27.58 2.23 0.07 +0 1 1 6 6 30.63 4.92 1.04 3.11 22.64 2.90 0.00 +0 1 1 6 5 40.84 4.92 1.06 2.64 23.39 2.85 0.00 +0 1 1 6 4 51.05 4.92 1.09 2.42 15.99 3.16 0.00 +0 1 1 6 3 61.26 4.92 1.10 2.91 19.07 3.30 0.07 +0 1 1 6 2 71.47 4.92 1.17 -0.86 26.47 2.09 0.15 +0 1 1 6 1 81.68 4.92 1.22 1.14 31.73 1.85 0.19 +0 1 1 6 0 91.89 4.92 1.21 1.22 27.15 3.88 0.42 +0 1 1 7 18 -91.89 14.75 0.99 3.62 19.21 2.89 0.00 +0 1 1 7 17 -81.68 14.75 1.00 1.70 25.76 2.58 0.03 +0 1 1 7 16 -71.47 14.75 1.01 1.47 29.56 2.07 0.06 +0 1 1 7 15 -61.26 14.75 1.00 2.12 19.68 2.88 0.00 +0 1 1 7 14 -51.05 14.75 1.00 2.88 28.98 2.22 0.04 +0 1 1 7 13 -40.84 14.75 1.02 -0.16 23.89 2.62 0.00 +0 1 1 7 12 -30.63 14.75 1.00 3.10 25.43 2.53 0.00 +0 1 1 7 11 -20.42 14.75 0.98 5.12 23.40 2.79 0.00 +0 1 1 7 10 -10.21 14.75 1.01 2.53 24.41 2.76 0.00 +0 1 1 7 9 0.00 14.75 1.01 2.76 22.34 2.77 0.03 +0 1 1 7 8 10.21 14.75 1.00 4.37 23.43 2.96 0.00 +0 1 1 7 7 20.42 14.75 1.03 1.41 20.35 2.84 0.00 +0 1 1 7 6 30.63 14.75 1.03 2.30 19.85 2.89 0.00 +0 1 1 7 5 40.84 14.75 1.06 0.17 26.75 2.30 0.08 +0 1 1 7 4 51.05 14.75 1.05 3.29 16.88 3.21 0.00 +0 1 1 7 3 61.26 14.75 1.07 0.87 26.14 2.16 0.11 +0 1 1 7 2 71.47 14.75 1.06 2.16 17.18 3.45 0.06 +0 1 1 7 1 81.68 14.75 1.02 2.63 23.16 3.76 0.05 +0 1 1 7 0 91.89 14.75 0.93 3.35 15.87 3.21 0.00 +0 1 1 8 18 -91.89 24.58 1.02 -0.68 27.00 2.76 0.00 +0 1 1 8 17 -81.68 24.58 0.99 3.81 21.49 2.75 0.00 +0 1 1 8 16 -71.47 24.58 1.01 1.51 14.78 3.04 0.00 +0 1 1 8 15 -61.26 24.58 1.00 2.77 21.24 2.65 0.00 +0 1 1 8 14 -51.05 24.58 0.98 4.55 26.29 2.26 0.08 +0 1 1 8 13 -40.84 24.58 0.99 3.99 16.66 3.01 0.00 +0 1 1 8 12 -30.63 24.58 1.00 2.71 22.63 2.78 0.00 +0 1 1 8 11 -20.42 24.58 1.01 1.60 22.53 2.65 0.00 +0 1 1 8 10 -10.21 24.58 1.00 2.54 21.92 2.61 0.00 +0 1 1 8 9 0.00 24.58 0.98 4.18 19.75 2.89 0.00 +0 1 1 8 8 10.21 24.58 0.99 5.25 26.22 2.31 0.05 +0 1 1 8 7 20.42 24.58 1.02 1.31 26.61 2.68 0.00 +0 1 1 8 6 30.63 24.58 1.01 4.77 25.72 2.59 0.00 +0 1 1 8 5 40.84 24.58 1.02 2.53 22.06 2.74 0.00 +0 1 1 8 4 51.05 24.58 1.02 1.18 22.70 2.60 0.02 +0 1 1 8 3 61.26 24.58 1.03 -1.14 28.64 2.18 0.07 +0 1 1 8 2 71.47 24.58 0.96 3.86 18.73 2.98 0.00 +0 1 1 8 1 81.68 24.58 0.95 -1.23 25.46 2.70 0.00 +0 1 1 8 0 91.89 24.58 0.92 4.73 18.40 2.71 0.00 +0 1 1 9 18 -91.89 34.42 0.98 6.64 35.87 0.32 0.10 +0 1 1 9 17 -81.68 34.42 1.00 3.27 22.93 2.72 0.00 +0 1 1 9 16 -71.47 34.42 0.99 1.43 25.31 2.67 0.00 +0 1 1 9 15 -61.26 34.42 1.00 1.98 21.92 2.72 0.00 +0 1 1 9 14 -51.05 34.42 0.99 2.49 25.38 2.67 0.00 +0 1 1 9 13 -40.84 34.42 1.00 2.67 20.17 2.59 0.04 +0 1 1 9 12 -30.63 34.42 0.99 3.94 20.80 2.69 0.01 +0 1 1 9 11 -20.42 34.42 1.00 1.79 23.08 2.64 0.00 +0 1 1 9 10 -10.21 34.42 0.99 3.54 21.15 2.69 0.00 +0 1 1 9 9 0.00 34.42 1.00 2.97 19.56 2.68 0.00 +0 1 1 9 8 10.21 34.42 0.99 0.82 27.75 2.49 0.02 +0 1 1 9 7 20.42 34.42 0.99 1.90 18.79 2.83 0.00 +0 1 1 9 6 30.63 34.42 1.00 0.78 21.49 2.65 0.00 +0 1 1 9 5 40.84 34.42 0.98 3.88 23.63 2.40 0.04 +0 1 1 9 4 51.05 34.42 0.98 2.10 19.91 2.95 0.00 +0 1 1 9 3 61.26 34.42 0.94 3.20 22.43 2.66 0.00 +0 1 1 9 2 71.47 34.42 0.95 0.86 23.01 2.56 0.00 +0 1 1 9 1 81.68 34.42 0.96 -0.52 27.31 2.40 0.04 +0 1 1 9 0 91.89 34.42 0.95 1.97 23.15 2.75 0.00 +0 1 1 10 18 -91.89 44.25 1.00 3.96 24.36 2.67 0.00 +0 1 1 10 17 -81.68 44.25 1.00 2.32 25.39 2.47 0.00 +0 1 1 10 16 -71.47 44.25 1.01 1.80 19.19 2.95 0.00 +0 1 1 10 15 -61.26 44.25 1.00 2.25 18.34 2.85 0.00 +0 1 1 10 14 -51.05 44.25 0.99 4.80 22.42 2.65 0.00 +0 1 1 10 13 -40.84 44.25 1.02 -0.80 16.27 3.01 0.00 +0 1 1 10 12 -30.63 44.25 1.01 0.79 22.96 2.64 0.00 +0 1 1 10 11 -20.42 44.25 1.00 1.24 22.01 2.73 0.00 +0 1 1 10 10 -10.21 44.25 0.99 3.14 25.39 2.47 0.04 +0 1 1 10 9 0.00 44.25 0.97 5.67 21.98 2.65 0.00 +0 1 1 10 8 10.21 44.25 0.96 5.35 23.22 2.67 0.02 +0 1 1 10 7 20.42 44.25 0.99 -0.82 22.29 2.71 0.00 +0 1 1 10 6 30.63 44.25 0.95 5.61 21.18 2.67 0.00 +0 1 1 10 5 40.84 44.25 0.97 2.23 20.13 2.70 0.00 +0 1 1 10 4 51.05 44.25 0.95 1.44 24.43 2.70 0.00 +0 1 1 10 3 61.26 44.25 0.93 4.34 22.98 2.72 0.00 +0 1 1 10 2 71.47 44.25 0.95 2.44 23.97 2.77 0.00 +0 1 1 10 1 81.68 44.25 0.95 3.32 24.00 2.68 0.00 +0 1 1 10 0 91.89 44.25 0.94 3.13 17.71 2.88 0.00 +0 1 1 11 18 -91.89 54.08 1.00 2.17 27.47 2.19 0.07 +0 1 1 11 17 -81.68 54.08 1.00 2.43 16.38 2.72 0.00 +0 1 1 11 16 -71.47 54.08 0.99 3.87 19.87 2.78 0.00 +0 1 1 11 15 -61.26 54.08 1.06 -5.15 37.47 0.00 0.11 +0 1 1 11 14 -51.05 54.08 1.00 3.13 23.31 2.61 0.00 +0 1 1 11 13 -40.84 54.08 0.99 4.25 21.20 2.78 0.00 +0 1 1 11 12 -30.63 54.08 1.00 1.58 24.37 2.13 0.08 +0 1 1 11 11 -20.42 54.08 1.00 2.07 22.98 2.86 0.00 +0 1 1 11 10 -10.21 54.08 0.97 4.57 18.89 2.88 0.00 +0 1 1 11 9 0.00 54.08 1.00 1.55 27.46 2.48 0.00 +0 1 1 11 8 10.21 54.08 0.98 3.14 22.61 2.63 0.00 +0 1 1 11 7 20.42 54.08 0.95 3.81 16.63 2.72 0.00 +0 1 1 11 6 30.63 54.08 0.95 3.41 24.89 2.66 0.00 +0 1 1 11 5 40.84 54.08 0.94 2.12 24.16 2.35 0.05 +0 1 1 11 4 51.05 54.08 0.95 1.83 25.30 2.42 0.04 +0 1 1 11 3 61.26 54.08 0.95 1.71 23.72 2.65 0.00 +0 1 1 11 2 71.47 54.08 0.95 1.80 19.55 2.81 0.00 +0 1 1 11 1 81.68 54.08 0.93 4.14 24.07 2.46 0.05 +0 1 1 11 0 91.89 54.08 0.95 2.60 16.28 2.91 0.00 +0 2 0 0 18 -91.89 -54.08 1.00 2.17 27.47 2.19 0.07 +0 2 0 0 17 -81.68 -54.08 1.00 2.43 16.38 2.72 0.00 +0 2 0 0 16 -71.47 -54.08 0.99 3.87 19.87 2.78 0.00 +0 2 0 0 15 -61.26 -54.08 1.06 -5.15 37.47 0.00 0.11 +0 2 0 0 14 -51.05 -54.08 1.00 3.13 23.31 2.61 0.00 +0 2 0 0 13 -40.84 -54.08 0.99 4.25 21.20 2.78 0.00 +0 2 0 0 12 -30.63 -54.08 1.00 1.58 24.37 2.13 0.08 +0 2 0 0 11 -20.42 -54.08 1.00 2.07 22.98 2.86 0.00 +0 2 0 0 10 -10.21 -54.08 0.97 4.57 18.89 2.88 0.00 +0 2 0 0 9 0.00 -54.08 1.00 1.55 27.46 2.48 0.00 +0 2 0 0 8 10.21 -54.08 0.98 3.14 22.61 2.63 0.00 +0 2 0 0 7 20.42 -54.08 0.95 3.81 16.63 2.72 0.00 +0 2 0 0 6 30.63 -54.08 0.95 3.41 24.89 2.66 0.00 +0 2 0 0 5 40.84 -54.08 0.94 2.12 24.16 2.35 0.05 +0 2 0 0 4 51.05 -54.08 0.95 1.83 25.30 2.42 0.04 +0 2 0 0 3 61.26 -54.08 0.95 1.71 23.72 2.65 0.00 +0 2 0 0 2 71.47 -54.08 0.95 1.80 19.55 2.81 0.00 +0 2 0 0 1 81.68 -54.08 0.93 4.14 24.07 2.46 0.05 +0 2 0 0 0 91.89 -54.08 0.95 2.60 16.28 2.91 0.00 +0 2 0 1 18 -91.89 -44.25 1.00 3.96 24.36 2.67 0.00 +0 2 0 1 17 -81.68 -44.25 1.00 2.32 25.39 2.47 0.00 +0 2 0 1 16 -71.47 -44.25 1.01 1.80 19.19 2.95 0.00 +0 2 0 1 15 -61.26 -44.25 1.00 2.25 18.34 2.85 0.00 +0 2 0 1 14 -51.05 -44.25 0.99 4.80 22.42 2.65 0.00 +0 2 0 1 13 -40.84 -44.25 1.02 -0.80 16.27 3.01 0.00 +0 2 0 1 12 -30.63 -44.25 1.01 0.79 22.96 2.64 0.00 +0 2 0 1 11 -20.42 -44.25 1.00 1.24 22.01 2.73 0.00 +0 2 0 1 10 -10.21 -44.25 0.99 3.14 25.39 2.47 0.04 +0 2 0 1 9 0.00 -44.25 0.97 5.67 21.98 2.65 0.00 +0 2 0 1 8 10.21 -44.25 0.96 5.35 23.22 2.67 0.02 +0 2 0 1 7 20.42 -44.25 0.99 -0.82 22.29 2.71 0.00 +0 2 0 1 6 30.63 -44.25 0.95 5.61 21.18 2.67 0.00 +0 2 0 1 5 40.84 -44.25 0.97 2.23 20.13 2.70 0.00 +0 2 0 1 4 51.05 -44.25 0.95 1.44 24.43 2.70 0.00 +0 2 0 1 3 61.26 -44.25 0.93 4.34 22.98 2.72 0.00 +0 2 0 1 2 71.47 -44.25 0.95 2.44 23.97 2.77 0.00 +0 2 0 1 1 81.68 -44.25 0.95 3.32 24.00 2.68 0.00 +0 2 0 1 0 91.89 -44.25 0.94 3.13 17.71 2.88 0.00 +0 2 0 2 18 -91.89 -34.42 0.98 6.64 35.87 0.32 0.10 +0 2 0 2 17 -81.68 -34.42 1.00 3.27 22.93 2.72 0.00 +0 2 0 2 16 -71.47 -34.42 0.99 1.43 25.31 2.67 0.00 +0 2 0 2 15 -61.26 -34.42 1.00 1.98 21.92 2.72 0.00 +0 2 0 2 14 -51.05 -34.42 0.99 2.49 25.38 2.67 0.00 +0 2 0 2 13 -40.84 -34.42 1.00 2.67 20.17 2.59 0.04 +0 2 0 2 12 -30.63 -34.42 0.99 3.94 20.80 2.69 0.01 +0 2 0 2 11 -20.42 -34.42 1.00 1.79 23.08 2.64 0.00 +0 2 0 2 10 -10.21 -34.42 0.99 3.54 21.15 2.69 0.00 +0 2 0 2 9 0.00 -34.42 1.00 2.97 19.56 2.68 0.00 +0 2 0 2 8 10.21 -34.42 0.99 0.82 27.75 2.49 0.02 +0 2 0 2 7 20.42 -34.42 0.99 1.90 18.79 2.83 0.00 +0 2 0 2 6 30.63 -34.42 1.00 0.78 21.49 2.65 0.00 +0 2 0 2 5 40.84 -34.42 0.98 3.88 23.63 2.40 0.04 +0 2 0 2 4 51.05 -34.42 0.98 2.10 19.91 2.95 0.00 +0 2 0 2 3 61.26 -34.42 0.94 3.20 22.43 2.66 0.00 +0 2 0 2 2 71.47 -34.42 0.95 0.86 23.01 2.56 0.00 +0 2 0 2 1 81.68 -34.42 0.96 -0.52 27.31 2.40 0.04 +0 2 0 2 0 91.89 -34.42 0.95 1.97 23.15 2.75 0.00 +0 2 0 3 18 -91.89 -24.58 1.02 -0.68 27.00 2.76 0.00 +0 2 0 3 17 -81.68 -24.58 0.99 3.81 21.49 2.75 0.00 +0 2 0 3 16 -71.47 -24.58 1.01 1.51 14.78 3.04 0.00 +0 2 0 3 15 -61.26 -24.58 1.00 2.77 21.24 2.65 0.00 +0 2 0 3 14 -51.05 -24.58 0.98 4.55 26.29 2.26 0.08 +0 2 0 3 13 -40.84 -24.58 0.99 3.99 16.66 3.01 0.00 +0 2 0 3 12 -30.63 -24.58 1.00 2.71 22.63 2.78 0.00 +0 2 0 3 11 -20.42 -24.58 1.01 1.60 22.53 2.65 0.00 +0 2 0 3 10 -10.21 -24.58 1.00 2.54 21.92 2.61 0.00 +0 2 0 3 9 0.00 -24.58 0.98 4.18 19.75 2.89 0.00 +0 2 0 3 8 10.21 -24.58 0.99 5.25 26.22 2.31 0.05 +0 2 0 3 7 20.42 -24.58 1.02 1.31 26.61 2.68 0.00 +0 2 0 3 6 30.63 -24.58 1.01 4.77 25.72 2.59 0.00 +0 2 0 3 5 40.84 -24.58 1.02 2.53 22.06 2.74 0.00 +0 2 0 3 4 51.05 -24.58 1.02 1.18 22.70 2.60 0.02 +0 2 0 3 3 61.26 -24.58 1.03 -1.14 28.64 2.18 0.07 +0 2 0 3 2 71.47 -24.58 0.96 3.86 18.73 2.98 0.00 +0 2 0 3 1 81.68 -24.58 0.95 -1.23 25.46 2.70 0.00 +0 2 0 3 0 91.89 -24.58 0.92 4.73 18.40 2.71 0.00 +0 2 0 4 18 -91.89 -14.75 0.99 3.62 19.21 2.89 0.00 +0 2 0 4 17 -81.68 -14.75 1.00 1.70 25.76 2.58 0.03 +0 2 0 4 16 -71.47 -14.75 1.01 1.47 29.56 2.07 0.06 +0 2 0 4 15 -61.26 -14.75 1.00 2.12 19.68 2.88 0.00 +0 2 0 4 14 -51.05 -14.75 1.00 2.88 28.98 2.22 0.04 +0 2 0 4 13 -40.84 -14.75 1.02 -0.16 23.89 2.62 0.00 +0 2 0 4 12 -30.63 -14.75 1.00 3.10 25.43 2.53 0.00 +0 2 0 4 11 -20.42 -14.75 0.98 5.12 23.40 2.79 0.00 +0 2 0 4 10 -10.21 -14.75 1.01 2.53 24.41 2.76 0.00 +0 2 0 4 9 0.00 -14.75 1.01 2.76 22.34 2.77 0.03 +0 2 0 4 8 10.21 -14.75 1.00 4.37 23.43 2.96 0.00 +0 2 0 4 7 20.42 -14.75 1.03 1.41 20.35 2.84 0.00 +0 2 0 4 6 30.63 -14.75 1.03 2.30 19.85 2.89 0.00 +0 2 0 4 5 40.84 -14.75 1.06 0.17 26.75 2.30 0.08 +0 2 0 4 4 51.05 -14.75 1.05 3.29 16.88 3.21 0.00 +0 2 0 4 3 61.26 -14.75 1.07 0.87 26.14 2.16 0.11 +0 2 0 4 2 71.47 -14.75 1.06 2.16 17.18 3.45 0.06 +0 2 0 4 1 81.68 -14.75 1.02 2.63 23.16 3.76 0.05 +0 2 0 4 0 91.89 -14.75 0.93 3.35 15.87 3.21 0.00 +0 2 0 5 18 -91.89 -4.92 0.99 2.76 22.78 2.68 0.00 +0 2 0 5 17 -81.68 -4.92 1.00 2.38 24.10 2.49 0.03 +0 2 0 5 16 -71.47 -4.92 0.98 3.99 23.95 2.65 0.00 +0 2 0 5 15 -61.26 -4.92 0.99 3.74 25.25 2.23 0.05 +0 2 0 5 14 -51.05 -4.92 1.01 0.91 20.65 2.78 0.00 +0 2 0 5 13 -40.84 -4.92 0.99 3.65 22.16 2.65 0.00 +0 2 0 5 12 -30.63 -4.92 1.01 0.08 24.77 2.69 0.00 +0 2 0 5 11 -20.42 -4.92 1.01 0.74 18.36 2.85 0.00 +0 2 0 5 10 -10.21 -4.92 0.99 5.34 23.36 2.70 0.00 +0 2 0 5 9 0.00 -4.92 1.01 2.99 20.83 2.82 0.00 +0 2 0 5 8 10.21 -4.92 1.01 4.86 20.78 2.93 0.00 +0 2 0 5 7 20.42 -4.92 1.03 4.37 27.58 2.23 0.07 +0 2 0 5 6 30.63 -4.92 1.04 3.11 22.64 2.90 0.00 +0 2 0 5 5 40.84 -4.92 1.06 2.64 23.39 2.85 0.00 +0 2 0 5 4 51.05 -4.92 1.09 2.42 15.99 3.16 0.00 +0 2 0 5 3 61.26 -4.92 1.10 2.91 19.07 3.30 0.07 +0 2 0 5 2 71.47 -4.92 1.17 -0.86 26.47 2.09 0.15 +0 2 0 5 1 81.68 -4.92 1.22 1.14 31.73 1.85 0.19 +0 2 0 5 0 91.89 -4.92 1.21 1.22 27.15 3.88 0.42 +0 2 0 6 18 -91.89 4.92 0.99 2.76 22.78 2.68 0.00 +0 2 0 6 17 -81.68 4.92 1.00 2.38 24.10 2.49 0.03 +0 2 0 6 16 -71.47 4.92 0.98 3.99 23.95 2.65 0.00 +0 2 0 6 15 -61.26 4.92 0.99 3.74 25.25 2.23 0.05 +0 2 0 6 14 -51.05 4.92 1.01 0.91 20.65 2.78 0.00 +0 2 0 6 13 -40.84 4.92 0.99 3.65 22.16 2.65 0.00 +0 2 0 6 12 -30.63 4.92 1.01 0.08 24.77 2.69 0.00 +0 2 0 6 11 -20.42 4.92 1.01 0.74 18.36 2.85 0.00 +0 2 0 6 10 -10.21 4.92 0.99 5.34 23.36 2.70 0.00 +0 2 0 6 9 0.00 4.92 1.01 2.99 20.83 2.82 0.00 +0 2 0 6 8 10.21 4.92 1.01 4.86 20.78 2.93 0.00 +0 2 0 6 7 20.42 4.92 1.03 4.37 27.58 2.23 0.07 +0 2 0 6 6 30.63 4.92 1.04 3.11 22.64 2.90 0.00 +0 2 0 6 5 40.84 4.92 1.06 2.64 23.39 2.85 0.00 +0 2 0 6 4 51.05 4.92 1.09 2.42 15.99 3.16 0.00 +0 2 0 6 3 61.26 4.92 1.10 2.91 19.07 3.30 0.07 +0 2 0 6 2 71.47 4.92 1.17 -0.86 26.47 2.09 0.15 +0 2 0 6 1 81.68 4.92 1.22 1.14 31.73 1.85 0.19 +0 2 0 6 0 91.89 4.92 1.21 1.22 27.15 3.88 0.42 +0 2 0 7 18 -91.89 14.75 0.99 3.62 19.21 2.89 0.00 +0 2 0 7 17 -81.68 14.75 1.00 1.70 25.76 2.58 0.03 +0 2 0 7 16 -71.47 14.75 1.01 1.47 29.56 2.07 0.06 +0 2 0 7 15 -61.26 14.75 1.00 2.12 19.68 2.88 0.00 +0 2 0 7 14 -51.05 14.75 1.00 2.88 28.98 2.22 0.04 +0 2 0 7 13 -40.84 14.75 1.02 -0.16 23.89 2.62 0.00 +0 2 0 7 12 -30.63 14.75 1.00 3.10 25.43 2.53 0.00 +0 2 0 7 11 -20.42 14.75 0.98 5.12 23.40 2.79 0.00 +0 2 0 7 10 -10.21 14.75 1.01 2.53 24.41 2.76 0.00 +0 2 0 7 9 0.00 14.75 1.01 2.76 22.34 2.77 0.03 +0 2 0 7 8 10.21 14.75 1.00 4.37 23.43 2.96 0.00 +0 2 0 7 7 20.42 14.75 1.03 1.41 20.35 2.84 0.00 +0 2 0 7 6 30.63 14.75 1.03 2.30 19.85 2.89 0.00 +0 2 0 7 5 40.84 14.75 1.06 0.17 26.75 2.30 0.08 +0 2 0 7 4 51.05 14.75 1.05 3.29 16.88 3.21 0.00 +0 2 0 7 3 61.26 14.75 1.07 0.87 26.14 2.16 0.11 +0 2 0 7 2 71.47 14.75 1.06 2.16 17.18 3.45 0.06 +0 2 0 7 1 81.68 14.75 1.02 2.63 23.16 3.76 0.05 +0 2 0 7 0 91.89 14.75 0.93 3.35 15.87 3.21 0.00 +0 2 0 8 18 -91.89 24.58 1.02 -0.68 27.00 2.76 0.00 +0 2 0 8 17 -81.68 24.58 0.99 3.81 21.49 2.75 0.00 +0 2 0 8 16 -71.47 24.58 1.01 1.51 14.78 3.04 0.00 +0 2 0 8 15 -61.26 24.58 1.00 2.77 21.24 2.65 0.00 +0 2 0 8 14 -51.05 24.58 0.98 4.55 26.29 2.26 0.08 +0 2 0 8 13 -40.84 24.58 0.99 3.99 16.66 3.01 0.00 +0 2 0 8 12 -30.63 24.58 1.00 2.71 22.63 2.78 0.00 +0 2 0 8 11 -20.42 24.58 1.01 1.60 22.53 2.65 0.00 +0 2 0 8 10 -10.21 24.58 1.00 2.54 21.92 2.61 0.00 +0 2 0 8 9 0.00 24.58 0.98 4.18 19.75 2.89 0.00 +0 2 0 8 8 10.21 24.58 0.99 5.25 26.22 2.31 0.05 +0 2 0 8 7 20.42 24.58 1.02 1.31 26.61 2.68 0.00 +0 2 0 8 6 30.63 24.58 1.01 4.77 25.72 2.59 0.00 +0 2 0 8 5 40.84 24.58 1.02 2.53 22.06 2.74 0.00 +0 2 0 8 4 51.05 24.58 1.02 1.18 22.70 2.60 0.02 +0 2 0 8 3 61.26 24.58 1.03 -1.14 28.64 2.18 0.07 +0 2 0 8 2 71.47 24.58 0.96 3.86 18.73 2.98 0.00 +0 2 0 8 1 81.68 24.58 0.95 -1.23 25.46 2.70 0.00 +0 2 0 8 0 91.89 24.58 0.92 4.73 18.40 2.71 0.00 +0 2 0 9 18 -91.89 34.42 0.98 6.64 35.87 0.32 0.10 +0 2 0 9 17 -81.68 34.42 1.00 3.27 22.93 2.72 0.00 +0 2 0 9 16 -71.47 34.42 0.99 1.43 25.31 2.67 0.00 +0 2 0 9 15 -61.26 34.42 1.00 1.98 21.92 2.72 0.00 +0 2 0 9 14 -51.05 34.42 0.99 2.49 25.38 2.67 0.00 +0 2 0 9 13 -40.84 34.42 1.00 2.67 20.17 2.59 0.04 +0 2 0 9 12 -30.63 34.42 0.99 3.94 20.80 2.69 0.01 +0 2 0 9 11 -20.42 34.42 1.00 1.79 23.08 2.64 0.00 +0 2 0 9 10 -10.21 34.42 0.99 3.54 21.15 2.69 0.00 +0 2 0 9 9 0.00 34.42 1.00 2.97 19.56 2.68 0.00 +0 2 0 9 8 10.21 34.42 0.99 0.82 27.75 2.49 0.02 +0 2 0 9 7 20.42 34.42 0.99 1.90 18.79 2.83 0.00 +0 2 0 9 6 30.63 34.42 1.00 0.78 21.49 2.65 0.00 +0 2 0 9 5 40.84 34.42 0.98 3.88 23.63 2.40 0.04 +0 2 0 9 4 51.05 34.42 0.98 2.10 19.91 2.95 0.00 +0 2 0 9 3 61.26 34.42 0.94 3.20 22.43 2.66 0.00 +0 2 0 9 2 71.47 34.42 0.95 0.86 23.01 2.56 0.00 +0 2 0 9 1 81.68 34.42 0.96 -0.52 27.31 2.40 0.04 +0 2 0 9 0 91.89 34.42 0.95 1.97 23.15 2.75 0.00 +0 2 0 10 18 -91.89 44.25 1.00 3.96 24.36 2.67 0.00 +0 2 0 10 17 -81.68 44.25 1.00 2.32 25.39 2.47 0.00 +0 2 0 10 16 -71.47 44.25 1.01 1.80 19.19 2.95 0.00 +0 2 0 10 15 -61.26 44.25 1.00 2.25 18.34 2.85 0.00 +0 2 0 10 14 -51.05 44.25 0.99 4.80 22.42 2.65 0.00 +0 2 0 10 13 -40.84 44.25 1.02 -0.80 16.27 3.01 0.00 +0 2 0 10 12 -30.63 44.25 1.01 0.79 22.96 2.64 0.00 +0 2 0 10 11 -20.42 44.25 1.00 1.24 22.01 2.73 0.00 +0 2 0 10 10 -10.21 44.25 0.99 3.14 25.39 2.47 0.04 +0 2 0 10 9 0.00 44.25 0.97 5.67 21.98 2.65 0.00 +0 2 0 10 8 10.21 44.25 0.96 5.35 23.22 2.67 0.02 +0 2 0 10 7 20.42 44.25 0.99 -0.82 22.29 2.71 0.00 +0 2 0 10 6 30.63 44.25 0.95 5.61 21.18 2.67 0.00 +0 2 0 10 5 40.84 44.25 0.97 2.23 20.13 2.70 0.00 +0 2 0 10 4 51.05 44.25 0.95 1.44 24.43 2.70 0.00 +0 2 0 10 3 61.26 44.25 0.93 4.34 22.98 2.72 0.00 +0 2 0 10 2 71.47 44.25 0.95 2.44 23.97 2.77 0.00 +0 2 0 10 1 81.68 44.25 0.95 3.32 24.00 2.68 0.00 +0 2 0 10 0 91.89 44.25 0.94 3.13 17.71 2.88 0.00 +0 2 0 11 18 -91.89 54.08 1.00 2.17 27.47 2.19 0.07 +0 2 0 11 17 -81.68 54.08 1.00 2.43 16.38 2.72 0.00 +0 2 0 11 16 -71.47 54.08 0.99 3.87 19.87 2.78 0.00 +0 2 0 11 15 -61.26 54.08 1.06 -5.15 37.47 0.00 0.11 +0 2 0 11 14 -51.05 54.08 1.00 3.13 23.31 2.61 0.00 +0 2 0 11 13 -40.84 54.08 0.99 4.25 21.20 2.78 0.00 +0 2 0 11 12 -30.63 54.08 1.00 1.58 24.37 2.13 0.08 +0 2 0 11 11 -20.42 54.08 1.00 2.07 22.98 2.86 0.00 +0 2 0 11 10 -10.21 54.08 0.97 4.57 18.89 2.88 0.00 +0 2 0 11 9 0.00 54.08 1.00 1.55 27.46 2.48 0.00 +0 2 0 11 8 10.21 54.08 0.98 3.14 22.61 2.63 0.00 +0 2 0 11 7 20.42 54.08 0.95 3.81 16.63 2.72 0.00 +0 2 0 11 6 30.63 54.08 0.95 3.41 24.89 2.66 0.00 +0 2 0 11 5 40.84 54.08 0.94 2.12 24.16 2.35 0.05 +0 2 0 11 4 51.05 54.08 0.95 1.83 25.30 2.42 0.04 +0 2 0 11 3 61.26 54.08 0.95 1.71 23.72 2.65 0.00 +0 2 0 11 2 71.47 54.08 0.95 1.80 19.55 2.81 0.00 +0 2 0 11 1 81.68 54.08 0.93 4.14 24.07 2.46 0.05 +0 2 0 11 0 91.89 54.08 0.95 2.60 16.28 2.91 0.00 +0 2 1 0 18 -91.89 -54.08 1.00 2.17 27.47 2.19 0.07 +0 2 1 0 17 -81.68 -54.08 1.00 2.43 16.38 2.72 0.00 +0 2 1 0 16 -71.47 -54.08 0.99 3.87 19.87 2.78 0.00 +0 2 1 0 15 -61.26 -54.08 1.06 -5.15 37.47 0.00 0.11 +0 2 1 0 14 -51.05 -54.08 1.00 3.13 23.31 2.61 0.00 +0 2 1 0 13 -40.84 -54.08 0.99 4.25 21.20 2.78 0.00 +0 2 1 0 12 -30.63 -54.08 1.00 1.58 24.37 2.13 0.08 +0 2 1 0 11 -20.42 -54.08 1.00 2.07 22.98 2.86 0.00 +0 2 1 0 10 -10.21 -54.08 0.97 4.57 18.89 2.88 0.00 +0 2 1 0 9 0.00 -54.08 1.00 1.55 27.46 2.48 0.00 +0 2 1 0 8 10.21 -54.08 0.98 3.14 22.61 2.63 0.00 +0 2 1 0 7 20.42 -54.08 0.95 3.81 16.63 2.72 0.00 +0 2 1 0 6 30.63 -54.08 0.95 3.41 24.89 2.66 0.00 +0 2 1 0 5 40.84 -54.08 0.94 2.12 24.16 2.35 0.05 +0 2 1 0 4 51.05 -54.08 0.95 1.83 25.30 2.42 0.04 +0 2 1 0 3 61.26 -54.08 0.95 1.71 23.72 2.65 0.00 +0 2 1 0 2 71.47 -54.08 0.95 1.80 19.55 2.81 0.00 +0 2 1 0 1 81.68 -54.08 0.93 4.14 24.07 2.46 0.05 +0 2 1 0 0 91.89 -54.08 0.95 2.60 16.28 2.91 0.00 +0 2 1 1 18 -91.89 -44.25 1.00 3.96 24.36 2.67 0.00 +0 2 1 1 17 -81.68 -44.25 1.00 2.32 25.39 2.47 0.00 +0 2 1 1 16 -71.47 -44.25 1.01 1.80 19.19 2.95 0.00 +0 2 1 1 15 -61.26 -44.25 1.00 2.25 18.34 2.85 0.00 +0 2 1 1 14 -51.05 -44.25 0.99 4.80 22.42 2.65 0.00 +0 2 1 1 13 -40.84 -44.25 1.02 -0.80 16.27 3.01 0.00 +0 2 1 1 12 -30.63 -44.25 1.01 0.79 22.96 2.64 0.00 +0 2 1 1 11 -20.42 -44.25 1.00 1.24 22.01 2.73 0.00 +0 2 1 1 10 -10.21 -44.25 0.99 3.14 25.39 2.47 0.04 +0 2 1 1 9 0.00 -44.25 0.97 5.67 21.98 2.65 0.00 +0 2 1 1 8 10.21 -44.25 0.96 5.35 23.22 2.67 0.02 +0 2 1 1 7 20.42 -44.25 0.99 -0.82 22.29 2.71 0.00 +0 2 1 1 6 30.63 -44.25 0.95 5.61 21.18 2.67 0.00 +0 2 1 1 5 40.84 -44.25 0.97 2.23 20.13 2.70 0.00 +0 2 1 1 4 51.05 -44.25 0.95 1.44 24.43 2.70 0.00 +0 2 1 1 3 61.26 -44.25 0.93 4.34 22.98 2.72 0.00 +0 2 1 1 2 71.47 -44.25 0.95 2.44 23.97 2.77 0.00 +0 2 1 1 1 81.68 -44.25 0.95 3.32 24.00 2.68 0.00 +0 2 1 1 0 91.89 -44.25 0.94 3.13 17.71 2.88 0.00 +0 2 1 2 18 -91.89 -34.42 0.98 6.64 35.87 0.32 0.10 +0 2 1 2 17 -81.68 -34.42 1.00 3.27 22.93 2.72 0.00 +0 2 1 2 16 -71.47 -34.42 0.99 1.43 25.31 2.67 0.00 +0 2 1 2 15 -61.26 -34.42 1.00 1.98 21.92 2.72 0.00 +0 2 1 2 14 -51.05 -34.42 0.99 2.49 25.38 2.67 0.00 +0 2 1 2 13 -40.84 -34.42 1.00 2.67 20.17 2.59 0.04 +0 2 1 2 12 -30.63 -34.42 0.99 3.94 20.80 2.69 0.01 +0 2 1 2 11 -20.42 -34.42 1.00 1.79 23.08 2.64 0.00 +0 2 1 2 10 -10.21 -34.42 0.99 3.54 21.15 2.69 0.00 +0 2 1 2 9 0.00 -34.42 1.00 2.97 19.56 2.68 0.00 +0 2 1 2 8 10.21 -34.42 0.99 0.82 27.75 2.49 0.02 +0 2 1 2 7 20.42 -34.42 0.99 1.90 18.79 2.83 0.00 +0 2 1 2 6 30.63 -34.42 1.00 0.78 21.49 2.65 0.00 +0 2 1 2 5 40.84 -34.42 0.98 3.88 23.63 2.40 0.04 +0 2 1 2 4 51.05 -34.42 0.98 2.10 19.91 2.95 0.00 +0 2 1 2 3 61.26 -34.42 0.94 3.20 22.43 2.66 0.00 +0 2 1 2 2 71.47 -34.42 0.95 0.86 23.01 2.56 0.00 +0 2 1 2 1 81.68 -34.42 0.96 -0.52 27.31 2.40 0.04 +0 2 1 2 0 91.89 -34.42 0.95 1.97 23.15 2.75 0.00 +0 2 1 3 18 -91.89 -24.58 1.02 -0.68 27.00 2.76 0.00 +0 2 1 3 17 -81.68 -24.58 0.99 3.81 21.49 2.75 0.00 +0 2 1 3 16 -71.47 -24.58 1.01 1.51 14.78 3.04 0.00 +0 2 1 3 15 -61.26 -24.58 1.00 2.77 21.24 2.65 0.00 +0 2 1 3 14 -51.05 -24.58 0.98 4.55 26.29 2.26 0.08 +0 2 1 3 13 -40.84 -24.58 0.99 3.99 16.66 3.01 0.00 +0 2 1 3 12 -30.63 -24.58 1.00 2.71 22.63 2.78 0.00 +0 2 1 3 11 -20.42 -24.58 1.01 1.60 22.53 2.65 0.00 +0 2 1 3 10 -10.21 -24.58 1.00 2.54 21.92 2.61 0.00 +0 2 1 3 9 0.00 -24.58 0.98 4.18 19.75 2.89 0.00 +0 2 1 3 8 10.21 -24.58 0.99 5.25 26.22 2.31 0.05 +0 2 1 3 7 20.42 -24.58 1.02 1.31 26.61 2.68 0.00 +0 2 1 3 6 30.63 -24.58 1.01 4.77 25.72 2.59 0.00 +0 2 1 3 5 40.84 -24.58 1.02 2.53 22.06 2.74 0.00 +0 2 1 3 4 51.05 -24.58 1.02 1.18 22.70 2.60 0.02 +0 2 1 3 3 61.26 -24.58 1.03 -1.14 28.64 2.18 0.07 +0 2 1 3 2 71.47 -24.58 0.96 3.86 18.73 2.98 0.00 +0 2 1 3 1 81.68 -24.58 0.95 -1.23 25.46 2.70 0.00 +0 2 1 3 0 91.89 -24.58 0.92 4.73 18.40 2.71 0.00 +0 2 1 4 18 -91.89 -14.75 0.99 3.62 19.21 2.89 0.00 +0 2 1 4 17 -81.68 -14.75 1.00 1.70 25.76 2.58 0.03 +0 2 1 4 16 -71.47 -14.75 1.01 1.47 29.56 2.07 0.06 +0 2 1 4 15 -61.26 -14.75 1.00 2.12 19.68 2.88 0.00 +0 2 1 4 14 -51.05 -14.75 1.00 2.88 28.98 2.22 0.04 +0 2 1 4 13 -40.84 -14.75 1.02 -0.16 23.89 2.62 0.00 +0 2 1 4 12 -30.63 -14.75 1.00 3.10 25.43 2.53 0.00 +0 2 1 4 11 -20.42 -14.75 0.98 5.12 23.40 2.79 0.00 +0 2 1 4 10 -10.21 -14.75 1.01 2.53 24.41 2.76 0.00 +0 2 1 4 9 0.00 -14.75 1.01 2.76 22.34 2.77 0.03 +0 2 1 4 8 10.21 -14.75 1.00 4.37 23.43 2.96 0.00 +0 2 1 4 7 20.42 -14.75 1.03 1.41 20.35 2.84 0.00 +0 2 1 4 6 30.63 -14.75 1.03 2.30 19.85 2.89 0.00 +0 2 1 4 5 40.84 -14.75 1.06 0.17 26.75 2.30 0.08 +0 2 1 4 4 51.05 -14.75 1.05 3.29 16.88 3.21 0.00 +0 2 1 4 3 61.26 -14.75 1.07 0.87 26.14 2.16 0.11 +0 2 1 4 2 71.47 -14.75 1.06 2.16 17.18 3.45 0.06 +0 2 1 4 1 81.68 -14.75 1.02 2.63 23.16 3.76 0.05 +0 2 1 4 0 91.89 -14.75 0.93 3.35 15.87 3.21 0.00 +0 2 1 5 18 -91.89 -4.92 0.99 2.76 22.78 2.68 0.00 +0 2 1 5 17 -81.68 -4.92 1.00 2.38 24.10 2.49 0.03 +0 2 1 5 16 -71.47 -4.92 0.98 3.99 23.95 2.65 0.00 +0 2 1 5 15 -61.26 -4.92 0.99 3.74 25.25 2.23 0.05 +0 2 1 5 14 -51.05 -4.92 1.01 0.91 20.65 2.78 0.00 +0 2 1 5 13 -40.84 -4.92 0.99 3.65 22.16 2.65 0.00 +0 2 1 5 12 -30.63 -4.92 1.01 0.08 24.77 2.69 0.00 +0 2 1 5 11 -20.42 -4.92 1.01 0.74 18.36 2.85 0.00 +0 2 1 5 10 -10.21 -4.92 0.99 5.34 23.36 2.70 0.00 +0 2 1 5 9 0.00 -4.92 1.01 2.99 20.83 2.82 0.00 +0 2 1 5 8 10.21 -4.92 1.01 4.86 20.78 2.93 0.00 +0 2 1 5 7 20.42 -4.92 1.03 4.37 27.58 2.23 0.07 +0 2 1 5 6 30.63 -4.92 1.04 3.11 22.64 2.90 0.00 +0 2 1 5 5 40.84 -4.92 1.06 2.64 23.39 2.85 0.00 +0 2 1 5 4 51.05 -4.92 1.09 2.42 15.99 3.16 0.00 +0 2 1 5 3 61.26 -4.92 1.10 2.91 19.07 3.30 0.07 +0 2 1 5 2 71.47 -4.92 1.17 -0.86 26.47 2.09 0.15 +0 2 1 5 1 81.68 -4.92 1.22 1.14 31.73 1.85 0.19 +0 2 1 5 0 91.89 -4.92 1.21 1.22 27.15 3.88 0.42 +0 2 1 6 18 -91.89 4.92 0.99 2.76 22.78 2.68 0.00 +0 2 1 6 17 -81.68 4.92 1.00 2.38 24.10 2.49 0.03 +0 2 1 6 16 -71.47 4.92 0.98 3.99 23.95 2.65 0.00 +0 2 1 6 15 -61.26 4.92 0.99 3.74 25.25 2.23 0.05 +0 2 1 6 14 -51.05 4.92 1.01 0.91 20.65 2.78 0.00 +0 2 1 6 13 -40.84 4.92 0.99 3.65 22.16 2.65 0.00 +0 2 1 6 12 -30.63 4.92 1.01 0.08 24.77 2.69 0.00 +0 2 1 6 11 -20.42 4.92 1.01 0.74 18.36 2.85 0.00 +0 2 1 6 10 -10.21 4.92 0.99 5.34 23.36 2.70 0.00 +0 2 1 6 9 0.00 4.92 1.01 2.99 20.83 2.82 0.00 +0 2 1 6 8 10.21 4.92 1.01 4.86 20.78 2.93 0.00 +0 2 1 6 7 20.42 4.92 1.03 4.37 27.58 2.23 0.07 +0 2 1 6 6 30.63 4.92 1.04 3.11 22.64 2.90 0.00 +0 2 1 6 5 40.84 4.92 1.06 2.64 23.39 2.85 0.00 +0 2 1 6 4 51.05 4.92 1.09 2.42 15.99 3.16 0.00 +0 2 1 6 3 61.26 4.92 1.10 2.91 19.07 3.30 0.07 +0 2 1 6 2 71.47 4.92 1.17 -0.86 26.47 2.09 0.15 +0 2 1 6 1 81.68 4.92 1.22 1.14 31.73 1.85 0.19 +0 2 1 6 0 91.89 4.92 1.21 1.22 27.15 3.88 0.42 +0 2 1 7 18 -91.89 14.75 0.99 3.62 19.21 2.89 0.00 +0 2 1 7 17 -81.68 14.75 1.00 1.70 25.76 2.58 0.03 +0 2 1 7 16 -71.47 14.75 1.01 1.47 29.56 2.07 0.06 +0 2 1 7 15 -61.26 14.75 1.00 2.12 19.68 2.88 0.00 +0 2 1 7 14 -51.05 14.75 1.00 2.88 28.98 2.22 0.04 +0 2 1 7 13 -40.84 14.75 1.02 -0.16 23.89 2.62 0.00 +0 2 1 7 12 -30.63 14.75 1.00 3.10 25.43 2.53 0.00 +0 2 1 7 11 -20.42 14.75 0.98 5.12 23.40 2.79 0.00 +0 2 1 7 10 -10.21 14.75 1.01 2.53 24.41 2.76 0.00 +0 2 1 7 9 0.00 14.75 1.01 2.76 22.34 2.77 0.03 +0 2 1 7 8 10.21 14.75 1.00 4.37 23.43 2.96 0.00 +0 2 1 7 7 20.42 14.75 1.03 1.41 20.35 2.84 0.00 +0 2 1 7 6 30.63 14.75 1.03 2.30 19.85 2.89 0.00 +0 2 1 7 5 40.84 14.75 1.06 0.17 26.75 2.30 0.08 +0 2 1 7 4 51.05 14.75 1.05 3.29 16.88 3.21 0.00 +0 2 1 7 3 61.26 14.75 1.07 0.87 26.14 2.16 0.11 +0 2 1 7 2 71.47 14.75 1.06 2.16 17.18 3.45 0.06 +0 2 1 7 1 81.68 14.75 1.02 2.63 23.16 3.76 0.05 +0 2 1 7 0 91.89 14.75 0.93 3.35 15.87 3.21 0.00 +0 2 1 8 18 -91.89 24.58 1.02 -0.68 27.00 2.76 0.00 +0 2 1 8 17 -81.68 24.58 0.99 3.81 21.49 2.75 0.00 +0 2 1 8 16 -71.47 24.58 1.01 1.51 14.78 3.04 0.00 +0 2 1 8 15 -61.26 24.58 1.00 2.77 21.24 2.65 0.00 +0 2 1 8 14 -51.05 24.58 0.98 4.55 26.29 2.26 0.08 +0 2 1 8 13 -40.84 24.58 0.99 3.99 16.66 3.01 0.00 +0 2 1 8 12 -30.63 24.58 1.00 2.71 22.63 2.78 0.00 +0 2 1 8 11 -20.42 24.58 1.01 1.60 22.53 2.65 0.00 +0 2 1 8 10 -10.21 24.58 1.00 2.54 21.92 2.61 0.00 +0 2 1 8 9 0.00 24.58 0.98 4.18 19.75 2.89 0.00 +0 2 1 8 8 10.21 24.58 0.99 5.25 26.22 2.31 0.05 +0 2 1 8 7 20.42 24.58 1.02 1.31 26.61 2.68 0.00 +0 2 1 8 6 30.63 24.58 1.01 4.77 25.72 2.59 0.00 +0 2 1 8 5 40.84 24.58 1.02 2.53 22.06 2.74 0.00 +0 2 1 8 4 51.05 24.58 1.02 1.18 22.70 2.60 0.02 +0 2 1 8 3 61.26 24.58 1.03 -1.14 28.64 2.18 0.07 +0 2 1 8 2 71.47 24.58 0.96 3.86 18.73 2.98 0.00 +0 2 1 8 1 81.68 24.58 0.95 -1.23 25.46 2.70 0.00 +0 2 1 8 0 91.89 24.58 0.92 4.73 18.40 2.71 0.00 +0 2 1 9 18 -91.89 34.42 0.98 6.64 35.87 0.32 0.10 +0 2 1 9 17 -81.68 34.42 1.00 3.27 22.93 2.72 0.00 +0 2 1 9 16 -71.47 34.42 0.99 1.43 25.31 2.67 0.00 +0 2 1 9 15 -61.26 34.42 1.00 1.98 21.92 2.72 0.00 +0 2 1 9 14 -51.05 34.42 0.99 2.49 25.38 2.67 0.00 +0 2 1 9 13 -40.84 34.42 1.00 2.67 20.17 2.59 0.04 +0 2 1 9 12 -30.63 34.42 0.99 3.94 20.80 2.69 0.01 +0 2 1 9 11 -20.42 34.42 1.00 1.79 23.08 2.64 0.00 +0 2 1 9 10 -10.21 34.42 0.99 3.54 21.15 2.69 0.00 +0 2 1 9 9 0.00 34.42 1.00 2.97 19.56 2.68 0.00 +0 2 1 9 8 10.21 34.42 0.99 0.82 27.75 2.49 0.02 +0 2 1 9 7 20.42 34.42 0.99 1.90 18.79 2.83 0.00 +0 2 1 9 6 30.63 34.42 1.00 0.78 21.49 2.65 0.00 +0 2 1 9 5 40.84 34.42 0.98 3.88 23.63 2.40 0.04 +0 2 1 9 4 51.05 34.42 0.98 2.10 19.91 2.95 0.00 +0 2 1 9 3 61.26 34.42 0.94 3.20 22.43 2.66 0.00 +0 2 1 9 2 71.47 34.42 0.95 0.86 23.01 2.56 0.00 +0 2 1 9 1 81.68 34.42 0.96 -0.52 27.31 2.40 0.04 +0 2 1 9 0 91.89 34.42 0.95 1.97 23.15 2.75 0.00 +0 2 1 10 18 -91.89 44.25 1.00 3.96 24.36 2.67 0.00 +0 2 1 10 17 -81.68 44.25 1.00 2.32 25.39 2.47 0.00 +0 2 1 10 16 -71.47 44.25 1.01 1.80 19.19 2.95 0.00 +0 2 1 10 15 -61.26 44.25 1.00 2.25 18.34 2.85 0.00 +0 2 1 10 14 -51.05 44.25 0.99 4.80 22.42 2.65 0.00 +0 2 1 10 13 -40.84 44.25 1.02 -0.80 16.27 3.01 0.00 +0 2 1 10 12 -30.63 44.25 1.01 0.79 22.96 2.64 0.00 +0 2 1 10 11 -20.42 44.25 1.00 1.24 22.01 2.73 0.00 +0 2 1 10 10 -10.21 44.25 0.99 3.14 25.39 2.47 0.04 +0 2 1 10 9 0.00 44.25 0.97 5.67 21.98 2.65 0.00 +0 2 1 10 8 10.21 44.25 0.96 5.35 23.22 2.67 0.02 +0 2 1 10 7 20.42 44.25 0.99 -0.82 22.29 2.71 0.00 +0 2 1 10 6 30.63 44.25 0.95 5.61 21.18 2.67 0.00 +0 2 1 10 5 40.84 44.25 0.97 2.23 20.13 2.70 0.00 +0 2 1 10 4 51.05 44.25 0.95 1.44 24.43 2.70 0.00 +0 2 1 10 3 61.26 44.25 0.93 4.34 22.98 2.72 0.00 +0 2 1 10 2 71.47 44.25 0.95 2.44 23.97 2.77 0.00 +0 2 1 10 1 81.68 44.25 0.95 3.32 24.00 2.68 0.00 +0 2 1 10 0 91.89 44.25 0.94 3.13 17.71 2.88 0.00 +0 2 1 11 18 -91.89 54.08 1.00 2.17 27.47 2.19 0.07 +0 2 1 11 17 -81.68 54.08 1.00 2.43 16.38 2.72 0.00 +0 2 1 11 16 -71.47 54.08 0.99 3.87 19.87 2.78 0.00 +0 2 1 11 15 -61.26 54.08 1.06 -5.15 37.47 0.00 0.11 +0 2 1 11 14 -51.05 54.08 1.00 3.13 23.31 2.61 0.00 +0 2 1 11 13 -40.84 54.08 0.99 4.25 21.20 2.78 0.00 +0 2 1 11 12 -30.63 54.08 1.00 1.58 24.37 2.13 0.08 +0 2 1 11 11 -20.42 54.08 1.00 2.07 22.98 2.86 0.00 +0 2 1 11 10 -10.21 54.08 0.97 4.57 18.89 2.88 0.00 +0 2 1 11 9 0.00 54.08 1.00 1.55 27.46 2.48 0.00 +0 2 1 11 8 10.21 54.08 0.98 3.14 22.61 2.63 0.00 +0 2 1 11 7 20.42 54.08 0.95 3.81 16.63 2.72 0.00 +0 2 1 11 6 30.63 54.08 0.95 3.41 24.89 2.66 0.00 +0 2 1 11 5 40.84 54.08 0.94 2.12 24.16 2.35 0.05 +0 2 1 11 4 51.05 54.08 0.95 1.83 25.30 2.42 0.04 +0 2 1 11 3 61.26 54.08 0.95 1.71 23.72 2.65 0.00 +0 2 1 11 2 71.47 54.08 0.95 1.80 19.55 2.81 0.00 +0 2 1 11 1 81.68 54.08 0.93 4.14 24.07 2.46 0.05 +0 2 1 11 0 91.89 54.08 0.95 2.60 16.28 2.91 0.00 From a6c86d138623d684092d3bb3ce1a6b0a82e6b547 Mon Sep 17 00:00:00 2001 From: parshadkp <111451184+parshadkp@users.noreply.github.com> Date: Thu, 15 Jan 2026 22:46:13 -0500 Subject: [PATCH 08/10] Updates to change the detector naming schemes - ACS detectors now ACS_X0_0, ACS_X0_1, ACS_X1_0, etc. - GeD detectors now GeD_0, GeD_2 etc. --- Config/Nuclearizer_EM_DEE.cfg | 2 +- include/MCrystalHit.h | 16 +++--- include/MDEECrystalHit.h | 9 ++-- include/MReadOutElementVoxel3D.h | 10 ++-- include/MSubModuleDEEIntake.h | 2 +- include/MSubModuleShieldTrigger.h | 2 +- include/MSubModuleStripTrigger.h | 2 +- src/MCrystalHit.cxx | 4 +- src/MReadOutAssembly.cxx | 14 +++-- src/MReadOutElementVoxel3D.cxx | 12 ++--- src/MSubModuleDEEIntake.cxx | 34 ++++++++++-- src/MSubModuleShieldEnergyCorrection.cxx | 66 ++++++++++++------------ src/MSubModuleShieldTrigger.cxx | 56 +++++++++++--------- src/MSubModuleStripTrigger.cxx | 2 +- 14 files changed, 134 insertions(+), 97 deletions(-) diff --git a/Config/Nuclearizer_EM_DEE.cfg b/Config/Nuclearizer_EM_DEE.cfg index eb87220d..dafb0983 100644 --- a/Config/Nuclearizer_EM_DEE.cfg +++ b/Config/Nuclearizer_EM_DEE.cfg @@ -39,7 +39,7 @@ 10000000 - /Users/parshadkp/Software/Nuclearizer_files/SingleDetBGO-GeD/Cosima/Cs137_singleDetBGO-GeD_sourceHolderPos_1166700Flux_10s_0050_Fluore.inc1.id1.sim.gz + /Users/parshadkp/Software/Nuclearizer_files/SingleDetBGO-GeD/Cosima/Cs137_singleDetBGO-GeD_sourceHolderPos_1166700Flux_10s_0050_Fluore_.inc1.id1.sim.gz $(NUCLEARIZER)/../Data/roas/asic_gse_240412194613.hdf.roa diff --git a/include/MCrystalHit.h b/include/MCrystalHit.h index 28e20b44..0e8fe462 100644 --- a/include/MCrystalHit.h +++ b/include/MCrystalHit.h @@ -24,7 +24,7 @@ #include "MGlobal.h" // Nuclearizer libs -#include "MReadOutElement.h" +#include "MReadOutElementVoxel3D.h" // Forward declarations: @@ -45,17 +45,17 @@ class MCrystalHit void Clear(); //! Get the read-out element - MReadOutElement* GetReadOutElement() const { return m_ReadOutElement; } + MReadOutElementVoxel3D* GetReadOutElement() const { return m_ReadOutElement; } //! Set the Crystal ID - void SetCrystalID(int StripID) { m_ReadOutElement->SetDetectorID(StripID); } + void SetCrystalID(unsigned int CrystalID) { m_ReadOutElement->SetCrystalID(CrystalID); } //! Return the Crystal ID - int GetCrystalID() const { return m_ReadOutElement->GetDetectorID(); } + unsigned int GetCrystalID() const { return m_ReadOutElement->GetCrystalID(); } //! Set the Detector ID - this derived from the crystal ID - void SetDetectorID(int DetectorID) { m_ReadOutElement->SetDetectorID(DetectorID); } + void SetDetectorID(MString DetectorID) { m_ReadOutElement->SetDetectorID(DetectorID); } //! Return the Detector ID- this derived from the crystal ID - int GetDetectorID() const { return m_ReadOutElement->GetDetectorID(); } + MString GetDetectorID() const { return m_ReadOutElement->GetDetectorID(); } //! Set whether the crystal has triggered void HasTriggered(bool HasTriggered) { m_HasTriggered = HasTriggered; } @@ -115,7 +115,7 @@ class MCrystalHit // private members: private: //! The read-out element with a single ID (representing the crystal ID) - MReadOutElement* m_ReadOutElement; + MReadOutElementVoxel3D* m_ReadOutElement; //! Crystal has triggered bool m_HasTriggered; //! Crystal has vetoed @@ -142,4 +142,4 @@ class MCrystalHit #endif -//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// \ No newline at end of file diff --git a/include/MDEECrystalHit.h b/include/MDEECrystalHit.h index 90e31ef0..1cba582d 100644 --- a/include/MDEECrystalHit.h +++ b/include/MDEECrystalHit.h @@ -26,7 +26,8 @@ using namespace std; // MEGAlib libs: #include "MGlobal.h" #include "MCrystalHit.h" -#include "MReadOutElement.h" +// #include "MReadOutElement.h" +#include "MReadOutElementVoxel3D.h" // Forward declarations: @@ -55,8 +56,8 @@ struct MDEECrystalHit { MVector m_SimulatedPosition; // original: Position //! The simulated position in the detector MVector m_SimulatedPositionInDetector; - //! Detector ID (1: -X, 2:+X, 3: -Y, 4:+Y, 5:Z ) - unsigned int m_DetectorID; + //! Detector ID (X0, X1, Y0, Y1, Z0, Z1) + MString m_DetectorID; //! Crystal ID unsigned int m_CrystalID; //! The simulated voxel (X, Y, Z) IDs @@ -71,7 +72,7 @@ struct MDEECrystalHit { // The shield data - which can be in process of being created //! The read-out element - MReadOutElement m_ROE; + MReadOutElementVoxel3D m_ROE; //! A unique lookup ID of the crystal hit unsigned int m_ID; diff --git a/include/MReadOutElementVoxel3D.h b/include/MReadOutElementVoxel3D.h index 398a7804..5f471709 100644 --- a/include/MReadOutElementVoxel3D.h +++ b/include/MReadOutElementVoxel3D.h @@ -2,7 +2,7 @@ * MReadOutElementVoxel3D.h * * - * Copyright (C) by Andreas Zoglauer, Valentina Fioretti. + * Copyright (C) by Andreas Zoglauer, Valentina Fioretti, Parshad Patel. * All rights reserved. * * Please see the source-file for the copyright-notice. @@ -39,7 +39,7 @@ class MReadOutElementVoxel3D : public MReadOutElement MReadOutElementVoxel3D(); //! full constructor - Read out element of a voxel 3D - MReadOutElementVoxel3D(unsigned int m_DetectorID, unsigned int m_CrystalID, unsigned int m_VoxelXID, unsigned int m_VoxelYID, unsigned int m_VoxelZID); + MReadOutElementVoxel3D(MString m_DetectorID, unsigned int m_CrystalID, unsigned int m_VoxelXID, unsigned int m_VoxelYID, unsigned int m_VoxelZID); //! Simple default destructor virtual ~MReadOutElementVoxel3D(); @@ -61,11 +61,11 @@ class MReadOutElementVoxel3D : public MReadOutElement virtual MString GetType() const; //! Setters and getters - void SetDetectorID(unsigned int DetectorID) + void SetDetectorID(MString DetectorID) { m_DetectorID = DetectorID; } - unsigned int GetDetectorID() const + MString GetDetectorID() const { return m_DetectorID; } @@ -123,7 +123,7 @@ class MReadOutElementVoxel3D : public MReadOutElement private: // protected members: protected: - unsigned int m_DetectorID; //!< Detector ID + MString m_DetectorID; //!< Detector ID unsigned int m_CrystalID; //!< Crystal ID unsigned int m_VoxelXID; //!< Voxel index X diff --git a/include/MSubModuleDEEIntake.h b/include/MSubModuleDEEIntake.h index 0b5e1a10..5503c5d6 100644 --- a/include/MSubModuleDEEIntake.h +++ b/include/MSubModuleDEEIntake.h @@ -1,7 +1,7 @@ /* * MSubModuleDEEIntake.h * - * Copyright (C) by Andreas Zoglauer. + * Copyright (C) by Andreas Zoglauer, Parshad Patel. * All rights reserved. * * Please see the source-file for the copyright-notice. diff --git a/include/MSubModuleShieldTrigger.h b/include/MSubModuleShieldTrigger.h index 6f33f5c8..f41df662 100644 --- a/include/MSubModuleShieldTrigger.h +++ b/include/MSubModuleShieldTrigger.h @@ -1,7 +1,7 @@ /* * MSubModuleShieldTrigger.h * - * Copyright (C) by Andreas Zoglauer. + * Copyright (C) by Andreas Zoglauer, Parshad Patel. * All rights reserved. * * Please see the source-file for the copyright-notice. diff --git a/include/MSubModuleStripTrigger.h b/include/MSubModuleStripTrigger.h index 697d323a..0f9bde0b 100644 --- a/include/MSubModuleStripTrigger.h +++ b/include/MSubModuleStripTrigger.h @@ -1,7 +1,7 @@ /* * MSubModuleStripTrigger.h * - * Copyright (C) by Andreas Zoglauer. + * Copyright (C) by Andreas Zoglauer, Parshad Patel. * All rights reserved. * * Please see the source-file for the copyright-notice. diff --git a/src/MCrystalHit.cxx b/src/MCrystalHit.cxx index 43918f73..faa920b8 100644 --- a/src/MCrystalHit.cxx +++ b/src/MCrystalHit.cxx @@ -51,7 +51,7 @@ MCrystalHit::MCrystalHit() { // Construct an instance of MCrystalHit - m_ReadOutElement = new MReadOutElement(); + m_ReadOutElement = new MReadOutElementVoxel3D(); Clear(); } @@ -208,4 +208,4 @@ void MCrystalHit::ParseFlags(unsigned int Flags) // MCrystalHit.cxx: the end... -//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// \ No newline at end of file diff --git a/src/MReadOutAssembly.cxx b/src/MReadOutAssembly.cxx index 0c6a9fa2..48622757 100644 --- a/src/MReadOutAssembly.cxx +++ b/src/MReadOutAssembly.cxx @@ -59,6 +59,9 @@ MReadOutAssembly::MReadOutAssembly() : MReadOutSequence(), m_EventTimeUTC(0) } +// MReadOutAssembly.cxx: the end... +//////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// @@ -358,11 +361,12 @@ MCrystalHit* MReadOutAssembly::GetCrystalHit(unsigned int i) void MReadOutAssembly::AddCrystalHit(MCrystalHit* CrystalHit) { - //! Add a strip hit - int DetectorID = CrystalHit->GetDetectorID(); - if ( (DetectorID>=0) && (DetectorID<=11) ) { - m_InDetector[DetectorID]=true; - } + //! Add a crystal hit + // Note: For ACS detectors, DetectorID is a string (e.g., "X0", "X1", "Y0", "Y1", "Z0", "Z1") + // so we can't use it with m_InDetector array which expects numeric indices 0-11. + // The m_InDetector tracking is primarily for GeD detectors which have numeric IDs. + // We skip the m_InDetector tracking for crystal hits. + m_CrystalHits.push_back(CrystalHit); } diff --git a/src/MReadOutElementVoxel3D.cxx b/src/MReadOutElementVoxel3D.cxx index 7e8d5a41..c14fe233 100644 --- a/src/MReadOutElementVoxel3D.cxx +++ b/src/MReadOutElementVoxel3D.cxx @@ -1,7 +1,7 @@ /* * MReadOutElementVoxel3D.cxx * - * Copyright (C) by Andreas Zoglauer, Valentina Fioretti. + * Copyright (C) by Andreas Zoglauer, Valentina Fioretti, Parshad Patel. * All rights reserved. * * @@ -47,7 +47,7 @@ ClassImp(MReadOutElementVoxel3D) //! Default constructor MReadOutElementVoxel3D::MReadOutElementVoxel3D() : MReadOutElement(), - m_DetectorID(0), + m_DetectorID(""), m_CrystalID(0), m_VoxelXID(g_UnsignedIntNotDefined), m_VoxelYID(g_UnsignedIntNotDefined), @@ -61,7 +61,7 @@ MReadOutElementVoxel3D::MReadOutElementVoxel3D() //! Parameterized constructor MReadOutElementVoxel3D::MReadOutElementVoxel3D( - unsigned int DetectorID, + MString DetectorID, unsigned int CrystalID, unsigned int VoxelXID, unsigned int VoxelYID, @@ -105,7 +105,7 @@ MReadOutElementVoxel3D* MReadOutElementVoxel3D::Clone() const void MReadOutElementVoxel3D::Clear() { MReadOutElement::Clear(); - m_DetectorID = g_UnsignedIntNotDefined; + m_DetectorID = ""; m_CrystalID = g_UnsignedIntNotDefined; m_VoxelXID = g_UnsignedIntNotDefined; m_VoxelYID = g_UnsignedIntNotDefined; @@ -219,7 +219,7 @@ bool MReadOutElementVoxel3D::Parse(const MTokenizer& T, unsigned int StartElemen return false; } - m_DetectorID = T.GetTokenAtAsUnsignedIntFast(StartElement); + m_DetectorID = T.GetTokenAtAsString(StartElement); m_CrystalID = T.GetTokenAtAsUnsignedIntFast(StartElement + 1); m_VoxelXID = T.GetTokenAtAsUnsignedIntFast(StartElement + 2); m_VoxelYID = T.GetTokenAtAsUnsignedIntFast(StartElement + 3); @@ -274,4 +274,4 @@ ostream& operator<<(ostream& os, const MReadOutElementVoxel3D& R) // MReadOutElementVoxel3D.cxx: the end... -//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// \ No newline at end of file diff --git a/src/MSubModuleDEEIntake.cxx b/src/MSubModuleDEEIntake.cxx index 5c3f3ea0..571b32b8 100644 --- a/src/MSubModuleDEEIntake.cxx +++ b/src/MSubModuleDEEIntake.cxx @@ -2,7 +2,7 @@ * MSubModuleDEEIntake.cxx * * - * Copyright (C) by Andreas Zoglauer. + * Copyright (C) by Andreas Zoglauer, Parshad Patel. * All rights reserved. * * @@ -189,16 +189,40 @@ bool MSubModuleDEEIntake::AnalyzeEvent(MReadOutAssembly* Event) Event->AddDEEStripHitLV(LVHit); Event->AddDEEStripHitHV(HVHit); - } else if (DetectorName.BeginsWith("ACS_Crystal_") == true) { + } else if (DetectorName.BeginsWith("ACS_") == true) { vector Tokens = DetectorName.Tokenize("_"); - if (Tokens.size() != 4) { + if (Tokens.size() != 3) { cerr << "ERROR: Unexpected detector name format for the Shield" << DetectorName << endl; return false; } - int DetectorID = Tokens[2].ToInt(); - int CrystalID = Tokens[3].ToInt(); + + // int DetectorID = -1; + // if (Tokens[1] == "X0") { + // DetectorID = 0; + // } + // else if (Tokens[1] == "X1") { + // DetectorID = 1; + // } + // else if (Tokens[1] == "Y0") { + // DetectorID = 2; + // } + // else if (Tokens[1] == "Y1") { + // DetectorID = 3; + // } + // else if (Tokens[1] == "Z0") { + // DetectorID = 4; + // } + // else if (Tokens[1] == "Z1") { + // DetectorID = 5; + // } + // else { + // cerr << "ERROR: Detector name does not correspond to any panel " << Tokens[1] << endl; + // return false; + // } + MString DetectorID = Tokens[1]; + int CrystalID = Tokens[2].ToInt(); MDGridPoint P = VS->GetGridPoint(); MVector Voxel_ID; diff --git a/src/MSubModuleShieldEnergyCorrection.cxx b/src/MSubModuleShieldEnergyCorrection.cxx index 229fe024..ee58d88e 100644 --- a/src/MSubModuleShieldEnergyCorrection.cxx +++ b/src/MSubModuleShieldEnergyCorrection.cxx @@ -96,39 +96,39 @@ void MSubModuleShieldEnergyCorrection::Clear() bool MSubModuleShieldEnergyCorrection::AnalyzeEvent(MReadOutAssembly* Event) { - // Main data analysis routine, which updates the event to a new level - - // Set the energy - list& Hits = Event->GetDEECrystalHitListReference(); - for (MDEECrystalHit& CH : Hits) { - - double true_energy = CH.m_SimulatedEnergy; - int det_id = CH.m_DetectorID; - int crystal_id = CH.m_CrystalID; - - MVector voxel_id = CH.m_VoxelInDetector; - - double shield_corrected_centroid = NoiseShieldEnergyCentroid(true_energy, det_id, crystal_id, voxel_id[0], voxel_id[1], voxel_id[2]); - double shield_FWHM_value = NoiseShieldEnergyFWHM(true_energy, det_id, crystal_id, voxel_id[0], voxel_id[1], voxel_id[2]); - - double shield_sigma = shield_FWHM_value / 2.35; - double corrected_energy = m_Random.Gaus(shield_corrected_centroid, shield_sigma); - - CH.m_Energy = corrected_energy; - } - - // Merge hits: - for (auto IterLV1 = Hits.begin(); IterLV1 != Hits.end(); ++IterLV1) { - auto IterLV2 = std::next(IterLV1); - while (IterLV2 != Hits.end()) { - if (IterLV1->m_ROE == IterLV2->m_ROE) { - IterLV1->m_Energy += IterLV2->m_Energy; - IterLV2 = Hits.erase(IterLV2); - } else { - ++IterLV2; - } - } - } + // // Main data analysis routine, which updates the event to a new level + + // // Set the energy + // list& Hits = Event->GetDEECrystalHitListReference(); + // for (MDEECrystalHit& CH : Hits) { + + // double true_energy = CH.m_SimulatedEnergy; + // int det_id = CH.m_DetectorID; + // int crystal_id = CH.m_CrystalID; + + // MVector voxel_id = CH.m_VoxelInDetector; + + // double shield_corrected_centroid = NoiseShieldEnergyCentroid(true_energy, det_id, crystal_id, voxel_id[0], voxel_id[1], voxel_id[2]); + // double shield_FWHM_value = NoiseShieldEnergyFWHM(true_energy, det_id, crystal_id, voxel_id[0], voxel_id[1], voxel_id[2]); + + // double shield_sigma = shield_FWHM_value / 2.35; + // double corrected_energy = m_Random.Gaus(shield_corrected_centroid, shield_sigma); + + // CH.m_Energy = corrected_energy; + // } + + // // Merge hits: + // for (auto IterLV1 = Hits.begin(); IterLV1 != Hits.end(); ++IterLV1) { + // auto IterLV2 = std::next(IterLV1); + // while (IterLV2 != Hits.end()) { + // if (IterLV1->m_ROE == IterLV2->m_ROE) { + // IterLV1->m_Energy += IterLV2->m_Energy; + // IterLV2 = Hits.erase(IterLV2); + // } else { + // ++IterLV2; + // } + // } + // } return true; } diff --git a/src/MSubModuleShieldTrigger.cxx b/src/MSubModuleShieldTrigger.cxx index f8aa48cc..7c3ed9e1 100644 --- a/src/MSubModuleShieldTrigger.cxx +++ b/src/MSubModuleShieldTrigger.cxx @@ -2,7 +2,7 @@ * MSubModuleShieldTrigger.cxx * * - * Copyright (C) by Andreas Zoglauer. + * Copyright (C) by Andreas Zoglauer, Parshad Patel. * All rights reserved. * * @@ -60,7 +60,7 @@ MSubModuleShieldTrigger::MSubModuleShieldTrigger() : MSubModule() m_IsShieldDead = false; // Initialize shield parameters with default values - m_ShieldThreshold = 80.0; + m_ShieldThreshold = -1.0; // Need to change this value at some point m_ShieldPulseDuration = 1.7e-6; m_ShieldDelayBefore = 0.1e-6; m_ShieldDelayAfter = 0.4e-6; @@ -85,12 +85,12 @@ MSubModuleShieldTrigger::MSubModuleShieldTrigger() : MSubModule() // Initialize shield panel groups (based on detector IDs) // These map crystal IDs to panel groups m_ShieldPanelGroups = { - { 0, 1, 2, 3 }, // Panel 0: Detectors 0-3 - { 4, 5, 6, 7 }, // Panel 1: Detectors 4-7 - { 8, 9, 10, 11 }, // Panel 2: Detectors 8-11 - { 12, 13, 14, 15 }, // Panel 3: Detectors 12-15 - { 16, 17, 18 }, // Panel 4: Detectors 16-18 - { 19, 20, 21 } // Panel 5: Detectors 19-21 + { 0, 1, 2}, // Panel 0: Detectors 0-3 + { 0, 1, 2}, // Panel 1: Detectors 4-7 + { 0, 1, 2, 4 }, // Panel 2: Detectors 8-11 + { 0, 1, 2, 4 }, // Panel 3: Detectors 12-15 + { 0, 1, 2, 3 }, // Panel 4: Detectors 16-18 + { 0, 1, 2, 3 } // Panel 5: Detectors 19-21 }; } @@ -197,32 +197,40 @@ bool MSubModuleShieldTrigger::ProcessShieldHits(MReadOutAssembly* Event) for (MDEECrystalHit& CHit : CrystalHits) { m_NumShieldHitCounts += 1; - int DetectorID = CHit.m_DetectorID; + MString DetectorID = CHit.m_DetectorID; int CrystalID = CHit.m_CrystalID; double energy = CHit.m_Energy; + cout << energy << endl; + if (energy > m_ShieldThreshold) { // Find which panel group this detector belongs to int ShieldDetGroup = -1; - bool found = false; - - for (size_t i = 0; i < m_ShieldPanelGroups.size(); ++i) { - for (size_t j = 0; j < m_ShieldPanelGroups[i].size(); ++j) { - if (m_ShieldPanelGroups[i][j] == DetectorID) { - ShieldDetGroup = i; - found = true; - break; - } - } - if (found) break; - } - if (ShieldDetGroup < 0) { + if (DetectorID == "Z0" && CrystalID == 4) { + ShieldDetGroup = 2; + } + else if (DetectorID == "Z1" && CrystalID == 4) { + ShieldDetGroup = 3; + } + else if (DetectorID == "X0") { + ShieldDetGroup = 0; + } + else if(DetectorID == "X1") { + ShieldDetGroup = 1; + } + else if (DetectorID == "Y0") { + ShieldDetGroup = 2; + } + else if(DetectorID == "Y1") { + ShieldDetGroup = 3; + } + else { if (g_Verbosity >= c_Warning) { cout << m_Name << ": Warning - shield detector " << DetectorID - << " not found in any panel group" << endl; + << " not found in any panel group" << endl; } - continue; + continue; } // Check deadtime conditions diff --git a/src/MSubModuleStripTrigger.cxx b/src/MSubModuleStripTrigger.cxx index 999d4daf..7cb75a9f 100644 --- a/src/MSubModuleStripTrigger.cxx +++ b/src/MSubModuleStripTrigger.cxx @@ -2,7 +2,7 @@ * MSubModuleStripTrigger.cxx * * - * Copyright (C) by Andreas Zoglauer. + * Copyright (C) by Andreas Zoglauer, Parshad Patel. * All rights reserved. * * From 41cd6cd4987df9f20ba3a66b24db4374bc57a785 Mon Sep 17 00:00:00 2001 From: parshadkp <111451184+parshadkp@users.noreply.github.com> Date: Sun, 18 Jan 2026 11:52:09 -0500 Subject: [PATCH 09/10] Code cleanup --- .DS_Store | Bin 8196 -> 0 bytes resource/.DS_Store | Bin 6148 -> 0 bytes resource/calibration/.DS_Store | Bin 8196 -> 0 bytes src/MSubModuleShieldTrigger.cxx | 3 --- 4 files changed, 3 deletions(-) delete mode 100644 .DS_Store delete mode 100644 resource/.DS_Store delete mode 100644 resource/calibration/.DS_Store diff --git a/.DS_Store b/.DS_Store deleted file mode 100644 index 2705689e8a65a924aa1fd3d9f5af49d49ac497fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8196 zcmeHM&2JM&6n_)Dc$bv22@VZak*xZHL^0H0VV;!!YrgSip2p*)QdcnMzm!dB|(2!in#AZ+{0&Q2yG080mFb{z%XDKFbsSM z4B(k9lJ$ynU)7q@Fkl$?C>ap@Lj|*tbuIf!%B=$nc?CdOM6*n&%b)%zE5d-Xu4P|I zv|u926{T_|`iepH&4DO)tgmZ)UrFT-MD~pB=$?tbp%8uXAQcG*QdiQHh5^ICFazT5 zUIZ69_?P7F@0YOd%zrXT#{zf|0?VQP$f3$G4;%u4gtpWf>;T256m1-30%u?wg8l7~ zleu;dY2QusYUi-Oz7Fg4l8*ig@yP2$VUkWyKP4lD;wOhnCA&0Qy4AePd(G5MyGg^1 zZ-}Qg&LeN2yWX{s_F7JPp0m^q8I7ew7*K@VydJWE_Zqy*f<*c@RfTO^cFURE-L1{d zPE}@Vb9+;j-EV8tQ0??Hm72GiDKI zZL|xY0`kkj&$03k)@0|aB}(-g%u(b_&QOqTV+rwc0nhLgr@Pk`q0e(BIMPoje(=_rDxR zuXxKoJo@R8&yG4{? z>nZ&?6-vt)&*4^SaQmfc?Oq2l<(CH8)^{_$5dgXPW5gr@5meWT?ZP5hWg(F#w( zG~{gKW`dj0QcAa%*e1swcW?t*?ue@78jTZ_Lq6-bBG;qQGHdWO<=Y!>9J{Pd8}|fK zw1xv&iK%Ew_TB8be#qL@i_bAAFjea-1Lc%b9H=TqRHlDQ-6{`ES`vGWaYpTG{ff3& za2l8NWoW`(=)nVc2*1N4cnr_rZ}^uK$#L=(IZbBC1#*#mPp*RR@dL<^>O{vp7e|B`oe{wo?j*7AQd C%t{sj diff --git a/resource/.DS_Store b/resource/.DS_Store deleted file mode 100644 index 2ccb623d3dfb50c511f1f2c925bd5bf4b32a8e05..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHK&x_MQ6n@iow~0k4qOcbs;C0cut_$KN*7e}kh#pjG(i9D*nUbVdD21H$kMZhX z;{W1FzxQSq`ojeeB2wnToA1rc`=*(1nwbm{so^}mOVlSK56;-Rg5o#E{p>r|vMt=H zWQ;M@Pjfv^a-HmCy9TF#Q{aD7fZyFiim9R*O=$D|_E>9Gu)g zTO9|>2PcS6@13nyzIWr+orljxAM$CTKg+C1VSf|5YViWTAh<-6k5O6Vx_E~SX16JY z!jny<)J^oP>w8VIYO@wlw#2%`qVyDP++I?(H3mP!`WPOvK7lm_H%Gjk|6?ov0Bbnr zRou>O@w2awjH-xV*UVN zPGB*#*ce0)Oc^TBP?f!6C__hkVDmzYjX^^vWiKDf{<5++6eYio@dHUG6&iG=zNGN*|T+La(vbX@V9U_&T9+`1%*A1CE%m@ c2rh=cfCFG?u`!4inEMbA8C>BM_@@f|0*2C{wEzGB diff --git a/resource/calibration/.DS_Store b/resource/calibration/.DS_Store deleted file mode 100644 index f84d309b3386511d3aac8e7e2d5ed7cf93121d18..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8196 zcmeHMO-~a+7=EXGbwyzL6pSVtdoh7%K_nq+SPMqcM353J0j%40C@afMv%94tA?aBY ze}F&0t5^PjN3R~d_y;_A)r-EfGv%WQ(TkBdZ!+_|JM+A=Gtchq_T2&iNtFx30Q~?E z$0E>d#p)L(`b9ZnG1X!q5{w5JhS6z{=W`y<9bxMRt$JVl0KW!m7k56vvd=15u$w zr5HqpW4|Tnh_=G2L>Uf5h67P&CMrWA(b+N1is(RWiMrMbXa$ZcAaeI+n1mTf!*pH# zF1FG;ELVO+76l*VjvdJLkxMR~z#XsSzB-mW0?9h=w>ob7-h8t-YZn+4!2=3YSi-}x zaQjbUbCsZ^zFq9*N}d~p$>c{8YiMk0ZfP-ET3c4qYrK*Uov<9F9Dhk1&2#SMYQB?O zaA_rL_DpgXIxeGr6yO#pQkEaPtiUTNUS@?LicQN7!-yMMvwwSgG?^T-My`+T3|ZUb zBj}G_8{642;=PHhH|DbI-Uj0@aXn~6JqDpo9`Dsc*Aw+|^P6goDV-!06nt_C#B9Pk&jW=D|sx#!LDzzto_7MBAQ zembNZ(`=RF88=b%nUd%V7N{Q}9*N1UcutObGc3i!kZ&wHzVEOiO>GIL7!4OP>r*jO zbnbM?$-AtWnD{ECP1v(F=dyH6NJs}DVc(Q)yrpE zO#95^tcW}@MiV^5Z8Q%_sN0$`!PwjKmZIAVs}iGGV5Q&xsE0PKz-d&VK~B0~ m_ShieldThreshold) { // Find which panel group this detector belongs to int ShieldDetGroup = -1; @@ -264,7 +262,6 @@ bool MSubModuleShieldTrigger::ProcessShieldHits(MReadOutAssembly* Event) for (int group = 0; group < nShieldPanels; group++) { if (!m_IsShieldDead) { m_ShieldDeadtime[group] = CalculateASICDeadtime(m_ShieldHitCrystalID[group]); - // cout << "m_ShieldDeadtime[group]" << m_ShieldDeadtime[group] << endl; } } From ed6f78be11af8856f80b09e87c16f1984bfc31bd Mon Sep 17 00:00:00 2001 From: parshadkp <111451184+parshadkp@users.noreply.github.com> Date: Sun, 18 Jan 2026 12:04:36 -0500 Subject: [PATCH 10/10] Removed unused config files. --- Config/Nuclearizer_SMEX_DEE.cfg | 97 ------------------- Config/Nuclearizer_singleDet_DEE.cfg | 133 --------------------------- 2 files changed, 230 deletions(-) delete mode 100644 Config/Nuclearizer_SMEX_DEE.cfg delete mode 100644 Config/Nuclearizer_singleDet_DEE.cfg diff --git a/Config/Nuclearizer_SMEX_DEE.cfg b/Config/Nuclearizer_SMEX_DEE.cfg deleted file mode 100644 index 128dfa29..00000000 --- a/Config/Nuclearizer_SMEX_DEE.cfg +++ /dev/null @@ -1,97 +0,0 @@ - - 1 - - XmlTagLoaderSimulations - XmlTagDEESMEX - - $(NUCLEARIZER)/../massmodel-cosi-dc3/COSISMEX.analysis_BGOreading.geo.setup - - - - - - - - - - - - - true - false - 10000000 - - - - - /Users/parshadkp/Software/Nuclearizer_files/SMEX/Cs137_SMEX_sourceHolder_1166700Flux_10s_Fluore.inc1.id1.sim.gz - - - $(NUCLEARIZER)/../Data/roas/asic_gse_240412194613.hdf.roa - - - - false - - - - - 0 - 10000 - - - $(NUCLEARIZER)/resource/calibration/COSI_SingleDet/20240819_Am241_Cs137_Co57_LV.ecal - - 0 - - - 0 - - - - - - - - - - - $(NUCLEARIZER)/resource/calibration/COSI_SingleDet/stretch_offset.csv - $(NUCLEARIZER)/resource/calibration/COSI_SingleDet/ctd_depth_122.0keV.reformat.csv - 0 - - - /Users/parshadkp/Library/CloudStorage/OneDrive-ClemsonUniversity/COSI/nuclearizer_files/nuclearizer_outputs/STTC/STTC_DEE_Cs137.evta - 2 - false - true - false - false - 600 - true - true - false - false - false - false - true - - - localhost - 12354 - - - 0 - Response - - - - - $(NUCLEARIZER)/resource/calibration/COSI_SingleDet/taccal_240225_channelsmapped.csv - $(NUCLEARIZER)/resource/calibration/COSI_SingleDet/tac_cut_params_fldelay_coinc400.csv - - - - - - diff --git a/Config/Nuclearizer_singleDet_DEE.cfg b/Config/Nuclearizer_singleDet_DEE.cfg deleted file mode 100644 index ec8cbfe6..00000000 --- a/Config/Nuclearizer_singleDet_DEE.cfg +++ /dev/null @@ -1,133 +0,0 @@ - - 1 - - XmlTagLoaderSimulationsSingleDet - XmlTagTACcut - EnergyCalibrationUniversal - XmlTagStripPairingChiSquare - DepthCalibration2024 - XmlTagEventSaver - - $(NUCLEARIZER)/../STTC_geo/COSI_STTC.geo.setup - - - - - - - - - - - - - true - false - 10000000 - - - /Users/parshadkp/Library/CloudStorage/OneDrive-ClemsonUniversity/COSI/nuclearizer_files/nuclearizer_outputs/STTC/Cs137_STTC_sourceHolderPos_1166700Flux_10s_0050_Fluore.inc1.id1.sim.gz - $(NUCLEARIZER)/resource/calibration/COSI_SingleDet/deadtimeParameters.txt - $(NUCLEARIZER)/resource/calibration/COSI_SingleDet/20240819_Am241_Cs137_Co57_LV.ecal - $(NUCLEARIZER)/resource/calibration/COSI_SingleDet/DeadStripList.txt - $(NUCLEARIZER)/resource/calibration/COSI_SingleDet/thresholds_fake.dat - $(NUCLEARIZER)/resource/calibration/COSI_SingleDet/GuardRingThresholds_190726.dat - $(NUCLEARIZER)/resource/calibration/COSI_SingleDet/ChargeSharingFactors_190311.txt - $(NUCLEARIZER)/resource/calibration/COSI_SingleDet/CrossTalkCorrection_Results_190726.txt - $(NUCLEARIZER)/resource/calibration/COSI_SingleDet/ChargeLossCoeffs_190311.log - $(NUCLEARIZER)/resource/calibration/COSI_SingleDet/stretch_offset.csv - $(NUCLEARIZER)/resource/calibration/COSI_SingleDet/taccal_240225_channelsmapped.csv - $(NUCLEARIZER)/resource/calibration/COSI_SingleDet/ctd_depth_122.0keV_AnodeCathode.csv - $(NUCLEARIZER)/resource/calibration/COSI_SingleDet/ACS_correction_file.txt - true - false - 10000000 - - - $(NUCLEARIZER)/../Data/roas/asic_gse_240412194613.hdf.roa - - - - false - - - - 128.32.13.133 - 215261 - OP - 128.32.13.133 - 21530 - 2 - 0 - - - - - 2 - 0 - 1 - - - 0 - 10000 - - - $(NUCLEARIZER)/resource/calibration/COSI_SingleDet/20240819_Am241_Cs137_Co57_LV.ecal - - 0 - - - 0 - - - - - - - - - - - - $(NUCLEARIZER)/resource/calibration/COSI_SingleDet/stretch_offset.csv - $(NUCLEARIZER)/resource/calibration/COSI_SingleDet/ctd_depth_122.0keV.reformat.csv - 0 - - - $(NUCLEARIZER)/resource/calibration/COSI_SingleDet/CrossTalkCorrection_Results_190726.txt - - - /Users/parshadkp/Library/CloudStorage/OneDrive-ClemsonUniversity/COSI/nuclearizer_files/nuclearizer_outputs/STTC/STTC_DEE_Cs137.evta - 2 - false - true - false - false - 600 - true - true - false - false - false - false - true - - - localhost - 12354 - - - 0 - Response - - - - - $(NUCLEARIZER)/resource/calibration/COSI_SingleDet/taccal_240225_channelsmapped.csv - $(NUCLEARIZER)/resource/calibration/COSI_SingleDet/tac_cut_params_fldelay_coinc400.csv - - - - - -